diff --git a/.patch-version b/.patch-version index 0cfbf0888..00750edc0 100644 --- a/.patch-version +++ b/.patch-version @@ -1 +1 @@ -2 +3 diff --git a/dist/11.58cedc04083d3a8f14c7.css.map b/dist/11.58cedc04083d3a8f14c7.css.map deleted file mode 100644 index 012f676e5..000000000 --- a/dist/11.58cedc04083d3a8f14c7.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"11.58cedc04083d3a8f14c7.css","mappings":"AAAA,YACE,kBAEA,cACE,WACA,YACA,wCACA,gCAEA,oCACE,kBACA,MACA,OAGF,kEACE,wBAKJ,kCACE,2BAMF,4DAEE,eACA,0FAEE,+BAGF,gFACE,kBACA,yBACA,MACA,OACA,6CACA,mBAKF,sBACE,2BAIA,kCACE,4CAGF,gCACE,2CAMJ,gCACE,4BAIA,4CACE,qDAGF,0CACE,sDAOJ,0BACE,4BAIA,sCACE,4CAGF,oCACE,2CAKF,oCACE,2BAIA,gDACE,qDAGF,8CACE,sDAWN,2BACE,wCAGF,6BACE,4BAIA,yCACE,gCAGF,uCACE,+BAMJ,uCACE,6BAIA,mDACE,yCAGF,iDACE,0CASJ,6BACE,sBACA,wBACA,UAGF,2BACE,sBACA,6BACA,UAIA,uCACE,+FAGF,qCACE,6FAMJ,uCACE,wBACA,UAGF,qCACE,8BACA,UAIA,iDACE,iHAGF,+CACE,mHASJ,4BACE,wBACA,mBACA,UAGF,0BACE,wBACA,UAMA,sCACE,qCAGF,oCACE,gEAMJ,sCACE,mBAGF,oCACE,sBAIA,gDACE,mFAGF,8CACE,sFASJ,uBACE,UAGF,qBACE,UAIA,iCACE,qCAGF,+BACE,oCASN,yBACE,4CACA,gBAEA,6BACE,mCAGF,6BACE,2BAIA,yCACE,mDAGF,uCACE,2CAMJ,uCACE,2BACA,YAIA,mDACE,qDAGF,iDACE,6DAUJ,2BACE,mCAGF,6BACE,wBACA,mBACA,UAEA,4CACE,uCAEA,qEACE,wCAKN,2BACE,2BAIA,uCACE,mCAGF,qCACE,uCAMJ,qCACE,qBAIA,iDACE,iDAGF,+CACE,6CASJ,uBACE,gEAIA,iCACE,kCAMJ,mCACE,0DAGF,iCACE,sCAIA,6CACE,6CAGF,2CACE,eASR,2BACE,GACE,UAEF,KACE,WAIJ,4BACE,GACE,UAEF,KACE,WAIJ,qCACE,GACE,UAEF,KACE,WAIJ,sCACE,GACE,UAEF,KACE,WAOJ,oBACE,GACE,2BAEF,KACE,yBAIJ,qBACE,GACE,wBAEF,KACE,6BAIJ,8BACE,GACE,wBAEF,KACE,4BAIJ,+BACE,GACE,4BAEF,KACE,yBAOJ,uBACE,GACE,4BAEF,KACE,yBAIJ,wBACE,GACE,wBAEF,KACE,8BAIJ,iCACE,GACE,wBAEF,KACE,6BAIJ,kCACE,GACE,6BAEF,KACE,yBAOJ,8BACE,GACE,6BAEF,KACE,yBAIJ,+BACE,GACE,wBAEF,KACE,+BAIJ,wCACE,GACE,wBAEF,KACE,8BAIJ,yCACE,GACE,8BAEF,KACE,yBAOJ,6BACE,GACE,qBAEF,KACE,oBAIJ,uCACE,GACE,mBAEF,KACE,sBAIJ,wCACE,GACE,sBAEF,KACE,oBAOJ,4BACE,GACE,wBACA,UAEF,KACE,2BACA,iDAIJ,sCACE,GACE,2BACA,gDAEF,KACE,wBACA,WAQJ,oBACE,GACE,mBACA,UAEF,KACE,qBACA,WAIJ,8BACE,GACE,qBACA,UAEF,KACE,mBACA,WAOJ,wBACE,GACE,2BAEF,KACE,yBAIJ,kCACE,GACE,wBAEF,KACE,4BAOJ,qBACE,GACE,gEAEF,KACE,2DAOJ,+BACE,GACE,0DAEF,KACE,iE;AC3qBJ,iBACE,kBACA,UACA,eACA,gBACA,qFACA,kBACA,eAEA,0BACE,kCACA,oBAGF,wBACE,sBAEA,+BACE,WACA,kBACA,eACA,gBACA,sBACA,sBACA,SACA,QACA,qCAIJ,gDACE,WACA,YACA,iFAEA,8DACE,sBACA,aACA,cAIJ,yBACE,cACA,eAEA,6BACE,WACA,YACA,eAGF,gCACE,iBAIJ,6BACE,wCAGF,qBACE,cACA,yBACA,yBACA,yDAGF,wBACE,iCAIJ,oCACE,KACE,uBAEF,GACE,0+B;AC9EJ,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,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,oBACE,iBAGF,mBACE,kCACA,mBACA,gBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;ACtKJ,UACE,kBAGE,oGACE,WACA,kBACA,SACA,YACA,QACA,iBACA,iCAGF,oFACE,cAGF,8EACE,OAMF,oDACE,gBACA,uBAIJ,2BACE,WACA,yCACA,uBACA,2BACA,wBACA,aACA,aACA,kBACA,gBACA,mBACA,mBACA,wBACA,2CACA,mCAEA,6BACE,iBACA,kBACA,kCAIJ,oFACE,mBACA,uBAIA,uCACE,kBACA,WAIJ,mBACE,oBAEA,oCACE,WAKF,0DACE,eAEA,gFACE,4BAGF,qBACE,gIACE,6CAIJ,yBACE,iEACE,6CAMR,yBAGI,4HACE,yDAKN,yCACE,4CAGF,iBACE,qBAEA,kCACE,mBAIJ,mBACE,oBAGF,gBACE,4CAIA,uCACE,yBAEA,yCACE,cAKN,uBACE,kBAEA,+BACE,WAEA,gDACE,6BACA,8BAKN,8BACE,iBAEA,sFAEE,0DAGF,+CACE,iBAGF,sCACE,cACA,mBAGF,oCACE,YACA,gBAGF,6EACE,gBACA,aACA,2BACA,mBAGF,gKACE,eACA,sBACA,SACA,gBACA,mBACA,uBACA,mBAIA,wCACE,gBAGF,mDACE,cACA,eACA,mBAGF,4CACE,2BACA,wBACA,cAIJ,6FAEE,kBACA,oBACA,kCAGF,wCACE,aACA,mBACA,YACA,gBAEA,uGACE,kBACA,oBACA,kCACA,qBAEA,qHACE,2BAGF,oPAEE,mBACA,WAGF,gTAEE,kBAKN,6PAGE,mBACA,uBAMA,4UAEE,mBAKF,wDACE,4CAGF,+CACE,kBACA,eAGF,qDACE,WAMJ,uCACE,qBAGF,mCACE,cAGF,6EACE,eACA,mBACA,gBACA,mBACA,uBACA,gBAGF,iDACE,iBACA,eAGF,0CACE,kCACA,kBAEA,mEACE,wBACA,mBACA,qBACA,kBAKF,0DACE,cACA,kBAGF,mDACE,eACA,cAKN,2BACE,SAEA,4CACE,eACA,aACA,mBAGF,mCACE,WACA,YAGF,qCACE,cACA,cACA,SACA,kBAIA,8CACE,eACA,mBAKN,0BACE,YACA,oBACA,gBAEA,qEACE,cACA,mBAGF,iCACE,oBACA,gBACA,uBACA,mBAGF,oCACE,kBACA,mBACA,kCAEA,8CACE,oBAGF,0CACE,wBAMJ,sCACE,iBACA,e;ACjYN,cACE,qBACA,cACA,aACA,cACA,yDACA,4BACA,qBACA,gC;ACRF,2BACE,qBACA,oCAGE,WACE,kCACA,0BAIJ,YACE,WACA,gBACA,iCAEA,aACE,uDACA,6FAEA,mCAEE,6BAMR,KACE,2BACE,kCAIJ,KACE,0BACE,E;ACpCJ,wBACE,kBACA,YACA,gBACA,mBACA,8BAEA,0BAPF,wBAQI,8CAGF,sCACE,mBAEA,wDACE,oBAKN,cACE,4FACA,uBACA,2CACA,4CACA,WACA,eAEA,6GAGE,sBACA,0BAGF,uBACE,iBACA,sBACA,+e;ACtCJ,OACE,cACA,kBACA,oBACA,gBACA,qBACA,mBACA,eAEA,gBACE,oBACA,WAGF,qBACE,eAEE,iFACE,kBAKN,aACE,kBACA,uBACA,UAIA,qDACE,WACA,cACA,kBACA,eACA,QACA,cACA,eACA,2BAGF,2BACE,4CACA,kBACA,yCACA,UACA,kDAGF,0BACE,cACA,cACA,eACA,kBACA,gCACA,UACA,4BAGF,0BACE,cACA,sBACA,uBACA,gBAGF,6BACE,cACA,kBACA,iBACA,kCACA,uBAKF,yCACE,kCAGF,wCACE,UAKF,qEAEE,qBAGF,wBACE,kBACA,eACA,QACA,2BACA,UACA,oCACA,wBAIJ,gBACE,eACA,qBAEA,4BACE,iBAEA,oCACE,UACA,gBAGF,mCACE,UACA,eAIJ,iDAEE,iBAGA,iCACA,UACA,gBAKN,mBACE,KACE,UAEF,GACE,W;ACzIJ,qBACE,WACA,c;ACFF,KACE,aACA,uBACA,cACA,6DACA,gBACA,WACA,SACA,YACA,uBACA,gBACA,kCACA,eACA,2DACA,4DAEA,4BAGE,aAGF,aACE,eACA,2BAEA,eACE,qBAIJ,qBACE,6BACE,mDAIJ,yBACE,8BACE,mDAIJ,UACE,kBACA,aACA,mBACA,mBAGF,YACE,kBACA,eACA,0BACA,6BACA,qBACA,mBACA,WACA,kBACA,sBACA,gBACA,kBACA,cAEA,kDAEE,oBAIJ,oBACE,2CAGF,OACE,kBACA,4BACA,OACA,UACA,sCACA,gBACA,WACA,oCACA,oBACA,uBACA,sBAEA,eACE,6CAEA,sCACE,2B;AC3FR,SACE,gBACA,MACA,cACA,aACA,8BACA,qBACA,kBACA,iBACA,+CACA,yCACA,gBACA,kBAEA,qBACA,8BAEA,aACE,eACA,kCAGF,4BACE,SAGF,kCACE,+BAEA,yC;AC5BF,+BACE,gBAGF,+BACE,2BAGF,+CACE,oBAGF,gCACE,sBAGF,wCACE,uB;AClBJ,aACE,kBACA,WACA,iDACA,yCACA,yCACA,uBACA,kCAEA,8BACE,aAEA,2CACE,aAGF,oCACE,mBAIA,6CACE,oBACA,eAKN,uBACE,kCACA,iCACA,yCAGE,+BACE,2BAKN,mBACE,cACA,gBACA,uBACA,uBACA,wCACA,2BACA,0JAEA,gCACE,gCAIJ,eACE,kBACA,UACA,YACA,mBAGF,sBACE,kBACA,UACA,YACA,cAEA,+BACE,uBAIJ,qBACE,kBACA,YACA,cACA,eAGF,yBACE,mBACE,cACA,sBACA,kDAGF,eACE,WAKF,4BACE,cAGF,wBACE,UACA,aAGF,+BACE,WACA,WAGF,8BACE,aACA,W;AC5GN,oBACE,aACA,mBACA,mCACA,YACA,eACA,kBACA,oBACA,mBACA,mBACA,eACA,kBACA,gBACA,cACA,sCAEA,6BAEA,8BACE,gBAGF,0BACE,0CAGF,oCACE,oDAEA,iDACE,UAGF,2FACE,UAKF,6CACE,gCAGF,sCACE,mCAGF,2CACE,kBAIJ,iCACE,cACA,kBACA,WACA,eAEA,kCAGF,2DACE,WACA,YACA,UACA,cACA,6BAEA,+DACE,eAIJ,+BACE,aACA,mBACA,uBACA,gBACA,kBACA,sCACA,WAEA,iCACE,kBACA,kBACA,SAIJ,+BACE,kBACA,mBACA,gBACA,uBAEA,kDACE,eACA,gBACA,yBACA,oBAIJ,iCACE,kBACA,OACA,MACA,WACA,YACA,kBACA,aACA,mBACA,uBACA,oCACA,iBACA,WACA,UACA,6BAGF,6BACE,kBACA,gBAEA,uCACE,gBACA,eAGF,0CACE,UACA,gBAGF,wCACE,cACA,mBAGF,0CACE,UACA,Q;AC7IN,UACE,oBACA,mBACA,kBACA,SAEA,mBACE,oBACA,WAGF,mBACE,oBAKA,8JAEE,2BAGF,kGACE,eAIJ,gBACE,SACA,QACA,kBACA,kBACA,uBACA,UAGF,kBACE,eACA,mBACA,eACA,eACA,6BACA,qBACA,oBACA,kBACA,kCAGF,wBACE,WACA,kBACA,cACA,OACA,eACA,gBACA,mCACA,qBACA,wBACA,uCAGF,gCACE,gCAGF,sCACE,2BACA,6CACA,kCAGF,+BACE,c;ACxEJ,uBACE,cACA,eACA,gBACA,qBACA,cACA,oBAEA,yBACE,mCAGF,+CACE,oBAGF,mCACE,WACA,Y;AClBJ,iBACE,mBACA,uBACA,cACA,iBACA,cACA,aACA,mBAEA,wCACE,qCACA,mBACA,kBAEA,oDACE,wBAIJ,uBACE,6BACA,oB;ACrBJ,kBACE,UACA,2DAEA,6BACE,mBACA,UAGF,8BACE,aAGF,0BACE,uDAIJ,eACE,aAEA,sBACE,0BAIJ,OACE,iBACA,cACA,6BACA,qBACA,mBACA,WACA,kBACA,sBACA,gBACA,kBACA,cAEA,qBACE,mBAGF,mBACE,qBACA,mBACA,gBACA,kBAGF,yCACE,8BACA,yBAGF,2BACE,0BACA,uBACA,aACA,UAEA,6BACE,iBAIJ,eACE,aACA,eAEA,iBACE,eACA,qBAGF,2BACE,eACA,eAEA,6BACE,kB;AC/ER,qCACE,0BACA,6BACA,2BACA,0BACA,2BACA,6BACA,2BACA,6BACA,6BAGF,qCACE,uBACA,6BACA,2BACA,6BACA,wBACA,6BACA,2BACA,6BACA,0BAIF,gBACE,kBACA,UACA,SACA,WACA,YACA,kBACA,yBACA,yCACA,gBAEA,2BACE,WACA,YACA,aACA,mBACA,uBACA,kBACA,+BACE,UACA,WACA,mCACA,kBACA,WACA,sBACA,wBAEF,8CACE,sBAEF,+CACE,uBAIJ,yBACE,oCACA,sCACA,wCACE,0CAKF,qDACE,yDAGF,sDACE,yD;AC3EN,MACE,4CAOA,kBACA,MACA,OACA,SACA,WATA,sCAEE,gDASF,sBACE,oBACA,gCAGF,wBACE,sBACA,kCAIA,qFACE,qCAIJ,yBACE,eACE,uDAEA,qCACE,sCAKN,yBACE,oCAEE,wDAEA,gFACE,iDACA,8BAGF,sEACE,wDACA,iCACA,8CACA,sCACA,2CACA,kCACA,mCAGF,4DACE,oCAGF,4EACE,8BACA,gCAKN,yBACE,uBACE,4BAIJ,cACE,kBACA,cAIA,sBACE,qBAGF,eACE,WACA,cAGF,wBACE,kBACA,mBACA,sBACA,cAEA,oCACE,aACA,mBAIJ,6BACE,iBAEA,yCACE,kBACA,eAIJ,qDACE,qBACA,YACA,kCACA,uBAEA,uEACE,gBAGF,+EACE,wBAGF,mEACE,yBAMA,wCACE,aAIJ,iCACE,yBAGF,8BACE,cACA,eACA,iBACA,sBACA,wBACA,yBAEA,0CACE,eACA,gBACA,0BAGF,oCACE,sBAIJ,uCACE,WACA,YACA,yBAGF,qCACE,kBACA,qBACA,iBACA,WACA,6BACA,wBACA,gBAEA,iDACE,8BACA,SAQJ,sCACE,cACA,kBAGF,2DACE,oBACA,gBAGF,iCACE,cACA,oBAGF,uEACE,mBACA,gBACA,iBACA,uB;AC9MR,eACE,qBAEA,mBACE,kBACA,WACA,YAGF,sCACE,qB;ACVJ,aACE,WACA,WACA,aACA,mBACA,uBACA,sBAEA,0BARF,aASI,aAGF,sBACE,YACA,uBAGF,oBACE,kBACA,sBAGF,0BACE,kBACA,kCAEA,8EAEE,wCAIJ,0BACE,mBACA,gBACA,4BACA,uBAEA,4BACE,0BACA,iB;ACxCN,cACE,aACA,mBACA,uBACA,6BAEA,+BACE,sBAGF,+BACE,cAGF,2BACE,kCACA,kBACA,kBACA,gBACA,uB;ACnBJ,OACE,SACA,oBACA,gBACA,kBACA,eAEA,uBACE,kBACA,YACA,WACA,2BACA,WACA,iBACA,mBACA,uBACA,qBAGF,WACE,kBACA,OACA,MACA,WACA,YACA,iB;ACzBJ,SACE,gBACA,2BACA,kBACA,qBACA,kBAEA,kBACE,kBAGF,+BACE,2BACA,WACA,YACA,kBACA,OACA,MACA,yDACA,WACA,aACA,mBACA,uBACA,kDACA,yBACA,gBACA,iBAGF,gBACE,kBACA,OACA,MACA,WACA,YACA,0BACA,gCACA,6DAGF,oEAGE,sBACA,mBAGF,oBACE,cACA,yBACA,gBACA,mBACA,gBACA,uBAGF,qBACE,eACA,gBACA,uBACA,sBAGF,iDAEE,gBACA,kCACA,qBACA,mBACA,oBACA,qBACA,4BACA,gBAGF,sBACE,kBAGF,kCACE,sBACA,uBAGF,kBACE,2BAEA,iEAEE,UACA,QAGF,2BACE,iB;AC9FN,oDACE,aAaA,mBACA,oBAZA,0CACE,sBAGF,eACE,0BACA,qBAFF,eAGI,6BAOJ,iBACE,2DAGF,cAGE,gBACA,yBACA,kDACA,gCACA,aACA,mBACA,uBACA,sBAGF,iBACE,MACA,OACA,kBAGF,yBACE,qBACA,cACA,kBACA,WACA,4BAEA,cACE,gBACA,wBACA,yBAGF,UACE,cACA,kBACA,MACA,QACA,iCACA,2BACA,qFACA,mCACA,mBACA,qCACA,qBAIJ,sBACE,gBACA,qEAEA,yBAEE,kDACA,yBAGF,gBACE,oBAIJ,UACE,iBACA,kBACA,MACA,QACA,eACA,gBACA,aACA,mBACA,uBACA,UACA,wBACA,wCAGF,cACE,gEAGE,cACE,2DAGF,SACE,kEAEA,SACE,wDAIJ,SACE,kBAKN,mBACE,qBACA,mBACA,gBACA,YACA,wBAEA,gBACE,kCACA,kBACA,mBACA,mBAIJ,cACE,mBACA,gBACA,gBACA,uBACA,0BAEA,mBACE,sBAIJ,iBACE,qBACA,6BACA,eACA,gBACA,uBACA,wCAGE,aACE,eAKN,2CACE,yCACA,8GAEA,UAIE,YACA,0BAGF,sBACE,iCAEA,0BACE,0BAIJ,oBACE,2BAGF,eACE,8BAGF,gBACE,2KAMF,kBAGE,eACA,qDAGF,gBACE,iEAEA,cACE,mBACA,yDAIJ,SACE,QACA,+CAQJ,mCACE,qDAGF,qCACE,mDAGF,wCACE,C;ACxOJ,OACE,aACA,uBACA,kBAEA,sBACE,kBACA,oBAEA,kCACE,mBAIJ,WACE,4CACA,oDACA,qEACA,qEAEA,uBACE,sCACA,uCAGF,mBACE,yCACA,0CACA,wDACA,2CAEA,+BACE,4BACA,mCAKN,oBACE,wBAEA,sCACE,2BAGF,4BACE,WACA,YACA,yBAEA,8BACE,mBAEA,yCACE,oBAKN,sBACE,kBAEA,gCACE,qBACA,yBAFF,gCAGI,qBAKN,+DACE,UACA,mBACA,uEAGF,yJAIE,UACA,qBAIJ,wBACE,kBACA,2BACA,4BACA,UACA,eACA,cACA,6CACA,UAEA,0BACE,mBAIJ,+BACE,UACA,SACA,6CAGF,gBACE,kBACA,YACA,YACA,mBAGF,oBACE,aACA,8BAGF,cACE,gBACA,SACA,iBACA,mBACA,gBACA,uBAGF,cACE,YAGF,uBACE,kBACA,kBACA,kCACA,kCACA,aACA,qBAEA,qCACE,WACA,kBACA,0BACA,eACA,gBACA,kBACA,qCAKF,iDACE,uBAIJ,sCACE,2BAGF,iBACE,eACA,gBACA,kBAGF,4CAGE,kBACA,kCACA,SACA,gBACA,mBACA,uBACA,uBAGF,iBACE,kBACA,kCACA,mBACA,gBACA,uBACA,cACA,kCAGF,aACE,aACA,mBACA,mBACA,yBAEA,kBACE,YACA,mBACA,gBACA,uBAGF,wBACE,cAGF,qCACE,0BAGF,qBACE,gBACA,cAIJ,iBACE,YACA,eACA,kBACA,QACA,eACA,kBAEA,yBACE,WACA,kBACA,WACA,QACA,WACA,mDACA,kBAIJ,kEACE,kBACA,WACA,kBACA,gBACA,WACA,QAEA,sEACE,kBACA,WACA,iDACA,WACA,kBACA,WAIJ,qCACE,8DAGF,uBACE,kBACA,WACA,QACA,OAEA,yBACE,oBACA,kBACA,WACA,WAEA,gCACE,WACA,kBACA,SACA,WACA,WACA,YACA,kBACA,2CAMJ,qBACE,mBACA,gBACA,uBACA,gBACA,mBAGF,oBACE,eAGF,6CAEE,sBAGF,wBACE,iBAGF,6BACE,aACA,cAIA,sCACE,qBACA,QAKN,mCACE,cACA,eAIA,2BACE,sBAGF,6BACE,kBACA,eAEA,qCACE,mBACA,eAIJ,6CACE,4BAGF,mDAEE,iBAGF,iCACE,UACA,WAKN,6BACE,uB;ACjWF,cACE,WACA,YACA,eACA,kBAEA,8BACE,WACA,iBAGF,iCACE,kBACA,OACA,MACA,WAGF,+BACE,WACA,YAGF,mJAKE,aACA,mBACA,uBACA,yBACA,wEACA,eAGF,uBACE,gBAGF,6FAGE,gB;AC3CJ,aACE,iBACA,kBAEA,kCACE,qBACE,WACA,iBACA,WAGF,oBACE,cACA,WACA,YAIJ,4BACE,WACA,kBACA,OACA,MACA,SAEA,wCACE,WACA,YAIJ,2BACE,kBACA,WACA,eACA,kBACA,UAEA,aACA,UACA,OAGF,yBACE,cACA,oCACA,YACA,sBACA,iBAEA,iCACE,YAIJ,yBACE,kBACA,MACA,SACA,UACA,YACA,UACA,SACA,6DACA,iCACA,wBACA,YACA,wBACA,aACA,eACA,UAEA,sEACE,UAGF,8BACE,OACA,yDACA,gCAGF,8BACE,QACA,yDACA,6CAIJ,mBACE,kBACA,SACA,OACA,WACA,iBACA,uBACA,+EACA,yBACA,aACA,sBACA,yBACA,oBAGE,oCACE,iBACA,uBAKF,oCACE,iBACA,uBAKN,oBACE,aACA,mBAEA,uBACE,gBACA,kBACA,qBACA,qBACA,sBACA,qBAGF,kCACE,mBACA,qBAGF,2BACE,aACA,cACA,uBAIJ,qBACE,kBACA,WAIA,uCACE,UACA,QACA,qBAGF,uCACE,OACA,WACA,qBAIJ,kBACE,wBACA,gBAEA,wBACE,SAGF,qCACE,UAGF,wBACE,sBAGF,0BACE,+C;ACnLN,YACE,2CACA,mCACA,gBACA,cACA,WACA,mBACA,iBACA,kBACA,uBACA,aACA,cACA,iDAEA,0BAdF,YAeI,gBAGF,oCACE,2BACA,mDAGF,wBACE,oBAGF,uBACE,gBAGF,4BACE,oBACA,2CACA,oBACA,cACA,aACA,sBACA,mBACA,uBACA,oCAGF,kBACE,kBACA,sBACA,sBAEA,0BALF,kBAMI,kBACA,mBACA,oBAGF,0BAXF,kBAYI,eACA,iBACA,oBACA,mBAIJ,mBACE,oBACA,gBACA,uBAEA,0BALF,mBAMI,gBAIJ,yBACE,eACA,oBAEA,0BAJF,yBAKI,mB;AC7EN,sBACE,kBACA,WACA,YACA,yEACA,4DAEA,6CACE,2BAGF,+BACE,yE;ACKJ,aACE,qCAEA,mBAEA,sBACE,oBACA,4CAGF,6BACE,aACA,8BACA,sBAEA,oCACE,cACA,iBACA,kCAIA,6CACE,cACA,kBAKN,0BACE,kBACA,UAEA,kCACE,WACA,kBACA,WACA,OACA,aACA,eACA,sCACA,sBACA,WACA,WAIJ,gCACE,kBACA,WACA,OACA,aACA,eACA,qCACA,sBACA,oBCvDF,+BACE,wBACA,cACA,WACA,cACA,oBACA,uBAEA,qCACE,aAGF,0CACE,WACA,eAEA,uBACA,yBACA,kBAGF,qDACE,wBAGF,kDACE,qBAGF,8DACE,eAGF,qGACE,eD+BF,qDA/EF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,oFAEA,2DACE,qBAyEA,iDAnFF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,iFAEA,uDACE,qBA6EA,0CAvFF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,gFAEA,gDACE,qBAkFF,6BACE,aACA,wBACA,sBACA,sBAGF,4BACE,kBACA,kBACA,eACA,kCACA,0BAEA,qEACE,wBAGF,mCACE,gBAGF,wCACE,gBAGF,uCACE,iB;AE1HN,UACE,kBACA,MACA,QACA,OACA,aACA,2BACA,uBAEA,aACA,sBAEA,kCACE,iD;ACbJ,eACE,qBACA,WACA,YACA,aACA,kDACA,wCACA,wBACA,kEACA,kBAEA,2BACE,eAEA,iCACE,wDAEA,wDACE,UAMN,yBAxBF,eAyBI,eAGF,0BACE,yBACA,eACA,eAGF,qBACE,YACA,aACA,SAGF,mDACE,kBACA,MACA,OACA,WACA,YAGF,mBACE,mBAGF,sCACE,kBACA,YACA,cACA,cACA,eACA,gBAMA,UAJA,wCACE,e;AC7DN,eACE,oCAEA,2CACE,kBACA,mCACA,4CACA,sBACA,iDAGF,4BACE,OACA,MACA,UACA,oBACA,4BAEA,mCACE,eAGF,yBAXF,4BAYI,2DAGF,kCACE,uBACA,wBACA,WACA,wBACA,yCAIJ,uDACE,aACA,iBACA,mBAGF,uBACE,UACA,eACA,gBACA,sCAGF,sCACE,YACA,kBACA,eAEA,yBALF,sCAMI,gBAGF,2FACE,WACA,cACA,kBACA,MACA,SACA,WACA,UACA,UACA,4BAGF,8CACE,OACA,wFAGF,6CACE,QACA,uFAIA,wDACE,UAKF,wDACE,UAKN,gCACE,cACA,UACA,4BAEA,sCACE,UAKF,8DACE,UACA,mBAIJ,uBACE,WACA,YACA,eACA,iBACA,iBACA,kDACA,cACA,eAEA,8BACE,iDACA,WAGF,gCACE,WACA,oB;AC9HN,QACE,YACA,aACA,sBACA,gBAEA,uBACE,6BACA,6CACA,aACA,mBACA,cAEA,gBACA,iBAEA,oCACE,oBACA,kBACA,YAGF,qCACE,YACA,YACA,gBACA,UACA,gBAIJ,qBACE,YACA,gBACA,kBACA,cAEA,yBANF,qBAOI,0BACA,4BAIJ,oBACE,YACA,SACA,kBACA,aACA,mBACA,uBACA,kC","sources":["webpack://telegram-t/./src/components/ui/Transition.scss","webpack://telegram-t/./src/components/ui/ProgressSpinner.scss","webpack://telegram-t/./src/components/common/Avatar.scss","webpack://telegram-t/./src/components/ui/Modal.scss","webpack://telegram-t/./src/components/ui/ListItem.scss","webpack://telegram-t/./src/components/common/VerifiedIcon.scss","webpack://telegram-t/./src/components/common/TypingStatus.scss","webpack://telegram-t/./src/components/ui/Notification.scss","webpack://telegram-t/./src/components/ui/Radio.scss","webpack://telegram-t/./src/components/common/ReactionStaticEmoji.scss","webpack://telegram-t/./src/components/ui/Tab.scss","webpack://telegram-t/./src/components/ui/TabList.scss","webpack://telegram-t/./src/components/common/DeleteChatModal.scss","webpack://telegram-t/./src/components/ui/SearchInput.scss","webpack://telegram-t/./src/components/common/PickerSelectedItem.scss","webpack://telegram-t/./src/components/ui/Switcher.scss","webpack://telegram-t/./src/components/common/MessageOutgoingStatus.scss","webpack://telegram-t/./src/components/common/LastMessageMeta.scss","webpack://telegram-t/./src/components/left/main/Badge.scss","webpack://telegram-t/./src/components/left/main/ChatCallStatus.scss","webpack://telegram-t/./src/components/left/main/Chat.scss","webpack://telegram-t/./src/components/common/AnimatedEmoji.scss","webpack://telegram-t/./src/components/left/main/EmptyFolder.scss","webpack://telegram-t/./src/components/common/NothingFound.scss","webpack://telegram-t/./src/components/common/Media.scss","webpack://telegram-t/./src/components/common/WebLink.scss","webpack://telegram-t/./src/components/common/File.scss","webpack://telegram-t/./src/components/common/Audio.scss","webpack://telegram-t/./src/components/common/ProfilePhoto.scss","webpack://telegram-t/./src/components/common/ProfileInfo.scss","webpack://telegram-t/./src/components/middle/composer/DropTarget.scss","webpack://telegram-t/./src/components/ui/FloatingActionButton.scss","webpack://telegram-t/./src/components/ui/RangeSlider.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/middle/composer/DropArea.scss","webpack://telegram-t/./src/components/common/StickerButton.scss","webpack://telegram-t/./src/components/middle/composer/TextFormatter.scss","webpack://telegram-t/./src/components/common/Picker.scss"],"sourcesContent":[".Transition {\n position: relative;\n\n > * {\n width: 100%;\n height: 100%;\n animation-fill-mode: forwards !important;\n transition: background-color .2s;\n\n &.from, &.to {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n &:not(.Transition__slide--active):not(.from):not(.to) {\n display: none !important; // Best performance when animating container\n //transform: scale(0); // Shortest initial delay\n }\n }\n\n &.skip-slide-transition {\n transition: none !important;\n }\n\n /*\n * slide\n */\n &.slide-optimized,\n &.slide-optimized-rtl {\n contain: strict;\n body.is-safari & {\n // Create a new composite layer to reduce the page repaint area when switching a tab (as `contain` is not supported in Safari)\n transform: translate3d(0, 0, 0);\n }\n\n #root & > div {\n position: absolute;\n display: block !important;\n top: 0;\n left: 0;\n transition: transform var(--slide-transition);\n transform: scale(0);\n }\n }\n\n &.slide {\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-out var(--slide-transition);\n }\n\n > .to {\n animation: slide-in var(--slide-transition);\n }\n }\n }\n\n &.slide.backwards {\n > .to {\n transform: translateX(-100%);\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--slide-transition);\n }\n\n > .to {\n animation: slide-out-backwards var(--slide-transition);\n }\n }\n }\n\n\n &.slide-rtl {\n > .to {\n transform: translateX(-100%);\n }\n\n &.animating {\n > .from {\n animation: slide-out var(--slide-transition);\n }\n\n > .to {\n animation: slide-in var(--slide-transition);\n }\n }\n\n &.backwards {\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--slide-transition);\n }\n\n > .to {\n animation: slide-out-backwards var(--slide-transition);\n }\n }\n }\n }\n\n /*\n * mv-slide\n */\n\n &.mv-slide {\n > * > div {\n animation-fill-mode: forwards !important;\n }\n\n > .to > div {\n transform: translateX(100vw);\n }\n\n &.animating {\n > .from > div {\n animation: mv-slide-out .4s ease;\n }\n\n > .to > div {\n animation: mv-slide-in .4s ease;\n }\n }\n }\n\n &.mv-slide.backwards {\n > .to > div {\n transform: translateX(-100vw);\n }\n\n &.animating {\n > .from > div {\n animation: mv-slide-in-backwards .4s ease;\n }\n\n > .to > div {\n animation: mv-slide-out-backwards .4s ease;\n }\n }\n }\n\n /*\n * slide-fade\n */\n &.slide-fade {\n > .from {\n transform-origin: left;\n transform: translateX(0);\n opacity: 1;\n }\n\n > .to {\n transform-origin: left;\n transform: translateX(1.5rem);\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity var(--slide-transition), slide-fade-out-move var(--slide-transition);\n }\n\n > .to {\n animation: fade-in-opacity var(--slide-transition), slide-fade-in-move var(--slide-transition);\n }\n }\n }\n\n &.slide-fade.backwards {\n > .from {\n transform: translateX(0);\n opacity: 1;\n }\n\n > .to {\n transform: translateX(-1.5rem);\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-in-backwards-opacity var(--slide-transition), slide-fade-in-backwards-move var(--slide-transition);\n }\n\n > .to {\n animation: fade-out-backwards-opacity var(--slide-transition), slide-fade-out-backwards-move var(--slide-transition);\n }\n }\n }\n\n /*\n * zoom-fade\n */\n &.zoom-fade {\n > .from {\n transform-origin: center;\n transform: scale(1);\n opacity: 1;\n }\n\n > .to {\n transform-origin: center;\n opacity: 0;\n // We can omit `transform: scale(1.1);` here because `opacity` is 0.\n // We need to for proper position calculation in `InfiniteScroll`.\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity .15s ease;\n }\n\n > .to {\n animation: fade-in-opacity .15s ease, zoom-fade-in-move .15s ease;\n }\n }\n }\n\n &.zoom-fade.backwards {\n > .from {\n transform: scale(1);\n }\n\n > .to {\n transform: scale(0.95);\n }\n\n &.animating {\n > .from {\n animation: fade-in-backwards-opacity .1s ease, zoom-fade-in-backwards-move .15s ease;\n }\n\n > .to {\n animation: fade-out-backwards-opacity .15s ease, zoom-fade-out-backwards-move .15s ease;\n }\n }\n }\n\n /*\n * fade\n */\n &.fade {\n > .from {\n opacity: 1;\n }\n\n > .to {\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity .15s ease;\n }\n\n > .to {\n animation: fade-in-opacity .15s ease;\n }\n }\n }\n\n /*\n * slide-layers\n */\n\n &.slide-layers {\n --background-color: var(--color-background);\n background: black;\n\n > div {\n background: var(--background-color);\n }\n\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-layers-out var(--layer-transition);\n }\n\n > .to {\n animation: slide-in var(--layer-transition);\n }\n }\n }\n\n &.slide-layers.backwards {\n > .to {\n transform: translateX(-20%);\n opacity: 0.75;\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--layer-transition);\n }\n\n > .to {\n animation: slide-layers-out-backwards var(--layer-transition);\n }\n }\n }\n\n /*\n * push-slide\n */\n\n &.push-slide {\n > div {\n background: var(--color-background);\n }\n\n > .from {\n transform-origin: center;\n transform: scale(1);\n opacity: 1;\n\n .custom-scroll {\n scrollbar-color: transparent !important;\n\n &::-webkit-scrollbar-thumb {\n background-color: transparent !important;\n }\n }\n }\n\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: push-out .3s ease-in-out;\n }\n\n > .to {\n animation: slide-in-200 .3s ease-in-out;\n }\n }\n }\n\n &.push-slide.backwards {\n > .to {\n transform: scale(0.7);\n }\n\n &.animating {\n > .from {\n animation: slide-in-200-backwards .3s ease-in-out;\n }\n\n > .to {\n animation: push-out-backwards .3s ease-in-out;\n }\n }\n }\n\n /*\n * slide-fade\n */\n &.reveal {\n > .to {\n clip-path: inset(0 100% 0 0);\n }\n\n &.animating {\n > .to {\n animation: reveal-in 350ms ease-in;\n }\n }\n }\n\n &.reveal.backwards {\n > .from {\n clip-path: inset(0 0 0 0);\n }\n\n > .to {\n clip-path: none;\n }\n\n &.animating {\n > .from {\n animation: reveal-in-backwards 350ms ease-out;\n }\n\n > .to {\n animation: none;\n }\n }\n }\n}\n\n/*\n * common\n */\n@keyframes fade-in-opacity {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes fade-out-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes fade-in-backwards-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes fade-out-backwards-opacity {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n/*\n * slide\n */\n@keyframes slide-in {\n 0% {\n transform: translateX(100%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-out {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100%);\n }\n}\n\n@keyframes slide-in-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(100%);\n }\n}\n\n@keyframes slide-out-backwards {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * mv-slide\n */\n@keyframes mv-slide-in {\n 0% {\n transform: translateX(100vw);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes mv-slide-out {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100vw);\n }\n}\n\n@keyframes mv-slide-in-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(100vw);\n }\n}\n\n@keyframes mv-slide-out-backwards {\n 0% {\n transform: translateX(-100vw);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * slide-fade\n */\n@keyframes slide-fade-in-move {\n 0% {\n transform: translateX(1.5rem);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-fade-out-move {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-1.5rem);\n }\n}\n\n@keyframes slide-fade-in-backwards-move {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(1.5rem);\n }\n}\n\n@keyframes slide-fade-out-backwards-move {\n 0% {\n transform: translateX(-1.5rem);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * zoom-fade\n */\n@keyframes zoom-fade-in-move {\n 0% {\n transform: scale(1.1);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes zoom-fade-in-backwards-move {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1.1);\n }\n}\n\n@keyframes zoom-fade-out-backwards-move {\n 0% {\n transform: scale(0.95);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n/*\n * slide-layers\n */\n@keyframes slide-layers-out {\n 0% {\n transform: translateX(0);\n opacity: 1;\n }\n 100% {\n transform: translateX(-20%);\n opacity: calc(1 - var(--layer-blackout-opacity));\n }\n}\n\n@keyframes slide-layers-out-backwards {\n 0% {\n transform: translateX(-20%);\n opacity: calc(1 - var(--layer-blackout-opacity));\n }\n 100% {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n/*\n * push-slide\n */\n\n@keyframes push-out {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n transform: scale(0.7);\n opacity: 0;\n }\n}\n\n@keyframes push-out-backwards {\n 0% {\n transform: scale(0.7);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n/*\n * slide\n */\n@keyframes slide-in-200 {\n 0% {\n transform: translateX(200%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-in-200-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(200%);\n }\n}\n\n/*\n * slide\n */\n@keyframes reveal-in {\n 0% {\n clip-path: inset(0 100% 0 0);\n }\n 100% {\n clip-path: inset(0 0 0 0);\n }\n}\n\n/*\n * slide\n */\n@keyframes reveal-in-backwards {\n 0% {\n clip-path: inset(0 0 0 0);\n }\n 100% {\n clip-path: inset(0 100% 0 0);\n }\n}\n",".ProgressSpinner {\n position: relative;\n z-index: 1;\n width: 3.375rem;\n height: 3.375rem;\n background: rgba(0, 0, 0, .25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii43NSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%;\n border-radius: 50%;\n cursor: pointer;\n\n &.no-cross {\n background: transparent !important;\n pointer-events: none;\n }\n\n &.square {\n background-image: none;\n\n &::after {\n content: '';\n position: absolute;\n width: .8125rem;\n height: .8125rem;\n border-radius: .125rem;\n background-color: #fff;\n left: 50%;\n top: 50%;\n transform: translate3d(-50%, -50%, 0);\n }\n }\n\n &.size-s, &.size-m {\n width: auto;\n height: auto;\n background: transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+) no-repeat 49% 49%;\n\n &.square {\n background-image: none;\n width: .75rem;\n height: .75rem;\n }\n }\n\n &.size-xl {\n width: 3.25rem;\n height: 3.25rem;\n\n svg {\n width: 3rem;\n height: 3rem;\n margin: .125rem;\n }\n\n circle {\n stroke-width: 3px;\n }\n }\n\n &.transparent {\n background-color: transparent !important;\n }\n\n svg {\n display: block;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n animation: 4s linear 0s infinite ProgressSpinnerAnimation;\n }\n\n circle {\n transition: stroke-dashoffset .5s;\n }\n}\n\n@keyframes ProgressSpinnerAnimation {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n",".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",".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 .modal-about {\n font-weight: bold;\n }\n\n .modal-help {\n color: var(--color-text-secondary);\n font-size: 0.9375rem;\n line-height: 1.3;\n }\n\n .dialog-buttons {\n display: flex;\n align-items: flex-end;\n\n .confirm-dialog-button + .confirm-dialog-button {\n margin-left: 1rem;\n }\n }\n\n .confirm-dialog-button {\n width: auto;\n height: auto;\n margin-left: auto;\n text-align: right;\n font-weight: 500;\n white-space: pre-wrap;\n }\n}\n",".ListItem {\n position: relative;\n\n body.is-ios &, body.is-android & {\n &:not(:last-of-type)::after {\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 4.5rem;\n right: 0;\n height: 0.03125rem;\n background: var(--color-dividers);\n }\n\n &.small-icon::after {\n left: 3.875rem;\n }\n\n &.no-icon::after {\n left: 0;\n }\n }\n\n // Using half-pixel height is efficient on iOS but not supported on Android, so `transform` is used instead\n body.is-android & {\n &:not(:last-of-type)::after {\n height: 0.0625rem;\n transform: scaleY(0.25);\n }\n }\n\n .ListItem-button {\n width: 100%;\n background-color: var(--background-color);\n border: none !important;\n box-shadow: none !important;\n outline: none !important;\n display: flex;\n padding: 1rem;\n position: relative;\n overflow: hidden;\n line-height: 1.5rem;\n white-space: nowrap;\n color: var(--color-text);\n border-radius: var(--border-radius-default);\n --ripple-color: rgba(0, 0, 0, .08);\n\n > i {\n font-size: 1.5rem;\n margin-right: 2rem;\n color: var(--color-text-secondary);\n }\n }\n\n .user-status, .group-status, .title, .subtitle {\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n &.multiline {\n .ListItem-button > i {\n position: relative;\n top: .25rem;\n }\n }\n\n &.disabled {\n pointer-events: none;\n\n .ListItem-button {\n opacity: 0.5;\n }\n }\n\n &:not(.disabled):not(.is-static) {\n .ListItem-button {\n cursor: pointer;\n\n body.cursor-ew-resize & {\n cursor: ew-resize !important;\n }\n\n @media (hover: hover) {\n &:hover, &:focus {\n --background-color: var(--color-chat-hover);\n }\n }\n\n @media (max-width: 600px) {\n &.active {\n --background-color: var(--color-chat-hover);\n }\n }\n }\n }\n\n @media (min-width: 600px) {\n &:not(.has-ripple):not(.is-static),\n body.animation-level-0 & {\n .ListItem-button:active {\n --background-color: var(--color-item-active) !important;\n }\n }\n }\n\n &.has-menu-open .ListItem-button {\n --background-color: var(--color-chat-hover);\n }\n\n &.narrow {\n margin-bottom: 0.75rem;\n\n .ListItem-button {\n padding: 0.5rem 1rem;\n }\n }\n\n &.inactive {\n pointer-events: none;\n }\n\n &.focus {\n --background-color: var(--color-chat-hover);\n }\n\n &.destructive {\n .ListItem-button {\n color: var(--color-error);\n\n i {\n color: inherit;\n }\n }\n }\n\n &-context-menu {\n position: absolute;\n\n .bubble {\n width: auto;\n\n .MenuItem button {\n padding-left: 1rem !important;\n padding-right: 2rem !important;\n }\n }\n }\n\n &.chat-item-clickable {\n margin: 0 -0.5rem;\n\n body.is-ios &,\n body.is-macos & {\n --color-text-secondary: var(--color-text-secondary-apple);\n }\n\n .ListItem-button {\n padding: .5625rem;\n }\n\n .Avatar {\n flex-shrink: 0;\n margin-right: 0.5rem;\n }\n\n .info {\n flex-grow: 1;\n overflow: hidden;\n }\n\n .title, .subtitle {\n overflow: hidden;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n }\n\n h3, .last-message, .status, .typing-status {\n font-size: 1rem;\n line-height: 1.6875rem;\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: initial;\n }\n\n .title {\n h3 {\n font-weight: 500;\n }\n\n .VerifiedIcon {\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 0.25rem;\n }\n\n .emoji {\n vertical-align: text-bottom;\n background-position: 0 0;\n flex-shrink: 0;\n }\n }\n\n .contact-phone,\n .contact-username {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: var(--color-text-secondary);\n }\n\n .ChatInfo {\n display: flex;\n align-items: center;\n flex-grow: 1;\n overflow: hidden;\n\n .status, .typing-status {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: var(--color-text-secondary);\n display: inline-block;\n\n &.online {\n color: var(--color-primary);\n }\n\n &[dir=rtl],\n &[dir=auto] {\n text-align: initial;\n width: 100%;\n }\n\n .group-status:only-child,\n .user-status:only-child {\n display: flow-root;\n }\n }\n }\n\n .contact-phone,\n .contact-username,\n h3, .last-message, .status, .typing-status {\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n .last-message,\n .status,\n .typing-status {\n body.is-ios &,\n body.is-macos & {\n font-size: .9375rem;\n }\n }\n\n &[dir=rtl] {\n .ListItem-button {\n padding: .5625rem .5625rem .5625rem .6975rem;\n }\n\n .Avatar {\n margin-left: 0.5rem;\n margin-right: 0;\n }\n\n .info > .status {\n width: 100%;\n }\n }\n }\n\n &.search-result-message {\n .title {\n padding-right: .15rem;\n }\n\n h3 {\n max-width: 80%;\n }\n\n h3, .subtitle {\n font-size: 1rem;\n line-height: 1.5rem;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: left;\n }\n\n .LastMessageMeta {\n margin-left: auto;\n margin-right: 0;\n }\n\n .subtitle {\n color: var(--color-text-secondary);\n margin-right: 2rem;\n\n .matching-text-highlight {\n color: var(--color-text);\n background: #CAE3F7;\n border-radius: 0.25rem;\n padding: 0 0.125rem;\n }\n }\n\n &[dir=rtl] {\n .LastMessageMeta {\n margin-left: 0;\n margin-right: auto;\n }\n\n .subtitle {\n margin-right: 0;\n display: block;\n }\n }\n }\n\n &.picker-list-item {\n margin: 0;\n\n .ListItem-button {\n padding-left: 0;\n display: flex;\n align-items: center;\n }\n\n .Avatar {\n width: 3rem;\n height: 3rem;\n }\n\n .Checkbox {\n flex-shrink: 0;\n height: 1.5rem;\n margin: 0;\n padding-left: 4rem;\n }\n\n &[dir=rtl] {\n .Checkbox {\n padding-left: 0;\n padding-right: 4rem;\n }\n }\n }\n\n .multiline-item {\n flex-grow: 1;\n white-space: initial;\n overflow: hidden;\n\n .title, .subtitle {\n display: block;\n text-align: initial;\n }\n\n .title {\n line-height: 1.25rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .subtitle {\n font-size: 0.875rem;\n line-height: 1.5rem;\n color: var(--color-text-secondary);\n\n & + .subtitle {\n margin-top: -0.25rem;\n }\n\n &.black {\n color: var(--color-text);\n }\n }\n }\n\n &[dir=rtl] {\n .ListItem-button > i {\n margin-left: 2rem;\n margin-right: 0;\n }\n }\n}\n",".VerifiedIcon {\n display: inline-block;\n flex-shrink: 0;\n width: 1.5rem;\n height: 1.5rem;\n background-image: url('../../assets/icon-verified.svg');\n background-repeat: no-repeat;\n background-size: 100%;\n background-position: center;\n}\n",".typing-status {\n display: flex;\n align-items: baseline;\n\n .sender-name {\n &::after {\n content: '\\00a0';\n color: var(--color-text-secondary);\n }\n }\n\n .ellipsis {\n display: flex;\n width: 1rem;\n overflow: hidden;\n\n &::after {\n content: '...';\n animation: typing-animation 1s steps(4, start) infinite;\n\n html[lang=ar] &,\n html[lang=fa] & {\n animation-name: typing-animation-rtl;\n }\n }\n }\n}\n\n@keyframes typing-animation {\n from {\n transform: translateX(-1rem);\n }\n}\n\n@keyframes typing-animation-rtl {\n from {\n transform: translateX(1rem);\n }\n}\n",".Notification-container {\n position: relative;\n width: 24rem;\n max-width: 100vw;\n margin: .25rem auto;\n z-index: var(--z-notification);\n\n @media (min-width: 1276px) {\n transition: transform var(--layer-transition);\n }\n\n &:first-of-type {\n margin-top: 4.25rem;\n\n .has-header-tools & {\n margin-top: 7.375rem;\n }\n }\n}\n\n.Notification {\n background: rgba(32, 32, 32, .8) url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+\") no-repeat .9375rem 50%;\n background-size: 1.5rem;\n border-radius: var(--border-radius-default);\n padding: .9375rem .9375rem .9375rem 3.375rem;\n color: #fff;\n margin: 0 .5rem;\n\n .text-entity-link,\n .text-entity-link:hover,\n .text-entity-link:active {\n color: #fff !important;\n text-decoration: underline;\n }\n\n .content {\n line-height: 1.25;\n word-break: break-word;\n font-size: .9375rem;\n }\n}\n",".Radio {\n display: block;\n position: relative;\n padding-left: 4.5rem;\n text-align: left;\n margin-bottom: 1.5rem;\n line-height: 1.5rem;\n cursor: pointer;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n &.hidden-widget {\n cursor: default;\n .Radio-main {\n &::before, &::after {\n visibility: hidden;\n }\n }\n }\n\n > input {\n position: absolute;\n z-index: var(--z-below);\n opacity: 0;\n }\n\n .Radio-main {\n &::before, &::after {\n content: '';\n display: block;\n position: absolute;\n left: 1.0625rem;\n top: 50%;\n width: 1.25rem;\n height: 1.25rem;\n transform: translateY(-50%);\n }\n\n &::before {\n border: 2px solid var(--color-borders-input);\n border-radius: 50%;\n background-color: var(--color-background);\n opacity: 1;\n transition: border-color .1s ease, opacity .1s ease;\n }\n\n &::after {\n left: 1.375rem;\n width: 0.625rem;\n height: 0.625rem;\n border-radius: 50%;\n background: var(--color-primary);\n opacity: 0;\n transition: opacity .1s ease;\n }\n\n .label {\n display: block;\n word-break: break-word;\n unicode-bidi: plaintext;\n text-align: left;\n }\n\n .subLabel {\n display: block;\n font-size: 0.875rem;\n line-height: 1rem;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n }\n }\n\n input:checked ~ .Radio-main {\n &::before {\n border-color: var(--color-primary);\n }\n\n &::after {\n opacity: 1;\n }\n }\n\n &.loading {\n .Radio-main::before,\n .Radio-main::after {\n opacity: 0 !important;\n }\n\n .Spinner {\n position: absolute;\n left: 1.0625rem;\n top: 50%;\n transform: translateY(-50%);\n opacity: 0;\n animation: fade-in .2s ease forwards;\n --spinner-size: 1.25rem;\n }\n }\n\n &[dir=rtl] {\n padding-left: 0;\n padding-right: 4.5rem;\n\n .Radio-main {\n text-align: right;\n\n &::before {\n left: auto;\n right: 1.0625rem;\n }\n\n &::after {\n left: auto;\n right: 1.375rem;\n }\n }\n\n .label,\n .subLabel {\n text-align: right;\n }\n\n &.loading .Spinner {\n left: auto;\n right: 1.0625rem;\n }\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n",".ReactionStaticEmoji {\n width: 1rem;\n display: block;\n}\n",".Tab {\n display: flex;\n justify-content: center;\n flex: 1 1 auto;\n appearance: none;\n background: none;\n width: auto;\n margin: 0;\n border: none;\n padding: .625rem .25rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n cursor: pointer;\n border-top-left-radius: var(--border-radius-messages-small);\n border-top-right-radius: var(--border-radius-messages-small);\n\n &,\n &:active,\n &:focus {\n outline: none;\n }\n\n &--active {\n cursor: default;\n color: var(--color-primary);\n\n i {\n opacity: 1 !important;\n }\n }\n\n @media (hover:hover) {\n &:not(&--active):hover {\n background: var(--color-interactive-element-hover);\n }\n }\n\n @media (max-width: 600px) {\n &:not(&--active):active {\n background: var(--color-interactive-element-hover);\n }\n }\n\n > span {\n position: relative;\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n\n .badge {\n min-width: 1.25rem;\n height: 1.25rem;\n margin-inline-start: 0.5rem;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .3125rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.3125rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n\n body.is-ios &,\n body.is-macos & {\n line-height: 1.25rem;\n }\n }\n\n &__badge--active {\n background: var(--color-primary) !important;\n }\n\n i {\n position: absolute;\n bottom: calc(-.625rem - 1px);\n left: 0;\n opacity: 0;\n background-color: var(--color-primary);\n height: .1875rem;\n width: 100%;\n border-radius: .1875rem .1875rem 0 0;\n pointer-events: none;\n box-sizing: content-box;\n transform-origin: left;\n\n &.animate {\n transition: transform var(--slide-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n }\n}\n",".TabList {\n position: sticky;\n top: 0;\n flex-shrink: 0;\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n font-size: .875rem;\n flex-wrap: nowrap;\n box-shadow: 0 2px 2px var(--color-light-shadow);\n background-color: var(--color-background);\n overflow-x: auto;\n overflow-y: hidden;\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &.big {\n font-size: 1rem;\n --border-radius-messages-small: 0;\n }\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n // `box-shadow` prevents repaint on macOS when hovering out of scrollable container\n box-shadow: 0 0 1px rgba(255, 255, 255, .01);\n }\n}\n",".DeleteChatModal {\n .modal-dialog {\n max-width: 20rem;\n }\n\n .modal-header {\n padding: 1.125rem 1.25rem 0;\n }\n\n .modal-title:not(:only-child) {\n margin: 0 0 0 .75rem;\n }\n\n .modal-content {\n padding: .5rem 1.25rem;\n }\n\n .confirm-dialog-button {\n margin-right: -.625rem;\n }\n}\n",".SearchInput {\n position: relative;\n width: 100%;\n color: rgba(var(--color-text-secondary-rgb), 0.5);\n background-color: var(--color-chat-hover);\n border: 2px solid var(--color-chat-hover);\n border-radius: 1.375rem;\n transition: border-color 0.15s ease;\n\n &.with-picker-item {\n display: flex;\n\n .icon-search {\n display: none;\n }\n\n input {\n padding-left: .5rem;\n }\n\n &[dir=rtl] {\n input {\n padding-right: .5rem;\n padding-left: 0;\n }\n }\n }\n\n &.has-focus {\n border-color: var(--color-primary);\n caret-color: var(--color-primary);\n background-color: var(--color-background);\n\n input {\n & + i {\n color: var(--color-primary);\n }\n }\n }\n\n input {\n height: 2.5rem;\n margin-bottom: 0;\n border: none !important;\n border-radius: 1.375rem;\n background-color: transparent !important;\n box-shadow: none !important;\n padding: calc(0.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(0.5rem - var(--border-width)) calc(2.75rem - var(--border-width));\n\n &::placeholder {\n color: var(--color-placeholders);\n }\n }\n\n > i {\n position: absolute;\n top: .5rem;\n left: .75rem;\n font-size: 1.375rem;\n }\n\n .Loading {\n position: absolute;\n top: .5rem;\n right: .5rem;\n height: 1.5rem;\n\n .Spinner {\n --spinner-size: 1.5rem;\n }\n }\n\n .Button {\n position: absolute;\n top: .125rem;\n right: .125rem;\n font-size: 1rem;\n }\n\n @media (max-width: 600px) {\n input {\n height: 2.5rem;\n border-radius: 1.25rem;\n padding-left: calc(2.625rem - var(--border-width));\n }\n\n i {\n top: 0.5rem;\n }\n }\n\n &[dir=rtl] {\n input {\n direction: rtl;\n }\n\n > i {\n left: auto;\n right: .75rem;\n }\n\n .Loading {\n left: .5rem;\n right: auto;\n }\n\n .Button {\n left: .125rem;\n right: auto;\n }\n }\n}\n",".PickerSelectedItem {\n display: flex;\n align-items: center;\n background: var(--color-chat-hover);\n height: 2rem;\n min-width: 2rem;\n margin-left: 0.5rem;\n margin-bottom: 0.5rem;\n padding-right: 1rem;\n border-radius: 1rem;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n flex-shrink: 1;\n transition: background-color .15s ease;\n\n max-width: calc(50% - 0.5rem);\n\n &.minimized {\n padding-right: 0;\n }\n\n &:hover {\n background-color: var(--color-item-active);\n }\n\n &.closeable:hover {\n background-color: rgba(var(--color-error-rgb), 0.16);\n\n .item-remove {\n opacity: 1;\n }\n\n .Avatar, .item-icon {\n opacity: 0;\n }\n }\n\n &.search-date {\n .item-remove {\n background: var(--color-primary);\n }\n\n &:hover {\n background: var(--color-chat-hover);\n }\n\n .item-name {\n font-size: 0.875rem;\n }\n }\n\n .SearchInput & {\n flex: 1 0 auto;\n position: relative;\n top: .25rem;\n left: -.125rem;\n\n color: var(--color-text-secondary);\n }\n\n .Avatar, .item-icon {\n width: 2rem;\n height: 2rem;\n opacity: 1;\n flex-shrink: 0;\n transition: opacity .15s ease;\n\n i {\n font-size: 2rem;\n }\n }\n\n .item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.375rem;\n border-radius: 50%;\n background-color: var(--color-primary);\n color: white;\n\n i {\n font-size: 1.25rem;\n position: relative;\n top: -1px;\n }\n }\n\n .item-name {\n margin-left: 0.5rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji.emoji-small {\n width: 1.125rem;\n height: 1.125rem;\n background-size: 1.125rem;\n vertical-align: -2px;\n }\n }\n\n .item-remove {\n position: absolute;\n left: 0;\n top: 0;\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--color-error);\n font-size: 1.5rem;\n color: white;\n opacity: 0;\n transition: opacity .15s ease;\n }\n\n &[dir=rtl] {\n padding-left: 1rem;\n padding-right: 0;\n\n &.minimized {\n padding-right: 0;\n padding-left: 0;\n }\n\n .SearchInput & {\n left: auto;\n right: -.125rem;\n }\n\n .item-name {\n margin-left: 0;\n margin-right: 0.5rem;\n }\n\n .item-remove {\n left: auto;\n right: 0;\n }\n }\n}\n",".Switcher {\n display: inline-flex;\n align-items: center;\n position: relative;\n margin: 0;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n &.inactive {\n pointer-events: none;\n }\n\n body.animation-level-0 &,\n &.no-animation {\n .widget,\n .widget::after {\n transition: none !important;\n }\n\n .widget:active:after {\n width: 1.125rem;\n }\n }\n\n input {\n height: 0;\n width: 0;\n visibility: hidden;\n position: absolute;\n z-index: var(--z-below);\n opacity: 0;\n }\n\n .widget {\n cursor: pointer;\n text-indent: -999px;\n width: 2.125rem;\n height: 0.875rem;\n background: var(--color-gray);\n display: inline-block;\n border-radius: .5rem;\n position: relative;\n transition: background .2s ease-in;\n }\n\n .widget:after {\n content: '';\n position: absolute;\n top: -.125rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n background: var(--color-background);\n border-radius: .75rem;\n transition: 0.2s ease-out;\n border: .125rem solid var(--color-gray);\n }\n\n input:checked + .widget {\n background: var(--color-primary);\n }\n\n input:checked + .widget:after {\n left: calc(100% - 1.125rem);\n transform: translateX(calc(-100% + 1.125rem));\n border-color: var(--color-primary);\n }\n\n .widget:active:after {\n width: 1.25rem;\n }\n}\n",".MessageOutgoingStatus {\n width: 1.19rem;\n height: 1.19rem;\n overflow: hidden;\n display: inline-block;\n line-height: 1;\n font-size: 1.1875rem;\n\n i {\n background: var(--background-color);\n }\n\n .icon-message-succeeded {\n padding-left: 0.13rem;\n }\n\n .Transition {\n width: 100%;\n height: 100%;\n }\n}\n",".LastMessageMeta {\n margin-right: .2rem;\n padding: .3rem 0 .15rem;\n flex-shrink: 0;\n font-size: 0.75rem;\n line-height: 1;\n display: flex;\n align-items: center;\n\n .MessageOutgoingStatus {\n color: var(--color-text-meta-colored);\n margin-right: 0.1rem;\n font-size: 1.15rem;\n\n body.is-ios & {\n margin-bottom: -.125rem;\n }\n }\n\n .time {\n color: var(--color-text-meta);\n line-height: 1.15rem;\n }\n}\n",".Badge-transition {\n opacity: 1;\n transition: transform .3s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n &:not(.open) {\n transform: scale(0);\n opacity: 0;\n }\n\n &:not(.shown) {\n display: none;\n }\n\n &.closing {\n transition: transform .2s ease-out, opacity .2s ease-out;\n }\n}\n\n.Badge-wrapper {\n display: flex;\n\n .Badge {\n margin-inline-start: .5rem;\n }\n}\n\n.Badge {\n min-width: 1.5rem;\n height: 1.5rem;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .4375rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.5625rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n\n body.is-macos & {\n line-height: 1.5rem;\n }\n\n body.is-ios & {\n line-height: 1.375rem;\n min-width: 1.375rem;\n height: 1.375rem;\n padding: 0 .375rem;\n }\n\n &.mention, &.unread:not(.muted) {\n background: var(--color-green);\n color: var(--color-white);\n }\n\n &.pinned:not(.unread) {\n color: var(--color-pinned);\n background: transparent;\n width: 1.5rem;\n padding: 0;\n\n i {\n font-size: 1.5rem;\n }\n }\n\n &.mention {\n width: 1.5rem;\n padding: 0.25rem;\n\n i {\n font-size: 1rem;\n vertical-align: super;\n }\n\n body.is-ios & {\n width: 1.375rem;\n padding: 0.25rem;\n\n i {\n font-size: .875rem;\n }\n }\n }\n}\n\n\n","\n@keyframes bar-animation-transform-1 {\n 0% { transform: scaleY(0.33); }\n 12.5% { transform: scaleY(1.66); }\n 25% { transform: scaleY(0.33); }\n 37.5% { transform: scaleY(1); }\n 50% { transform: scaleY(0.33); }\n 62.5% { transform: scaleY(1.66); }\n 75% { transform: scaleY(0.33); }\n 87.5% { transform: scaleY(1.66); }\n 100% { transform: scaleY(0.33); }\n}\n\n@keyframes bar-animation-transform-2 {\n 0% { transform: scaleY(1); }\n 12.5% { transform: scaleY(0.33); }\n 25% { transform: scaleY(1.66); }\n 37.5% { transform: scaleY(0.33); }\n 50% { transform: scaleY(1); }\n 62.5% { transform: scaleY(0.33); }\n 75% { transform: scaleY(1.66); }\n 87.5% { transform: scaleY(0.33); }\n 100% { transform: scaleY(1); }\n}\n\n\n.ChatCallStatus {\n position: absolute;\n right: 6px;\n bottom: 0;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background-color: #0ac630;\n border: 2px solid var(--color-background);\n overflow: hidden;\n\n .indicator {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n & > div {\n width: 2px;\n height: 6px;\n background: var(--color-background);\n border-radius: 1px;\n margin: 1px;\n will-change: transform;\n transform: translateZ(0);\n }\n & > div:nth-child(odd) {\n transform: scaleY(0.8);\n }\n & > div:nth-child(even) {\n transform: scaleY(1.33);\n }\n }\n\n &.selected {\n background-color: var(--color-white);\n border-color: var(--color-chat-active);\n .indicator div{\n background-color: var(--color-chat-active);\n }\n }\n\n &.active .indicator {\n div:nth-child(odd) {\n animation: bar-animation-transform-2 3.2s normal infinite;\n }\n\n div:nth-child(even) {\n animation: bar-animation-transform-1 3.2s normal infinite;\n }\n }\n\n}\n",".Chat {\n --background-color: var(--color-background);\n\n body.is-ios &,\n body.is-macos & {\n --color-text-meta: var(--color-text-meta-apple);\n }\n\n position: absolute;\n top: 0;\n left: 0;\n margin: 0;\n width: 100%;\n\n &.animate-opacity {\n will-change: opacity;\n transition: opacity .2s ease-out;\n }\n\n &.animate-transform {\n will-change: transform;\n transition: transform .2s ease-out;\n }\n\n &:hover, &.ListItem.has-menu-open {\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n\n @media (max-width: 600px) {\n &.selected {\n --background-color: var(--color-chat-hover) !important;\n\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n }\n\n @media (min-width: 600px) {\n &.selected,\n &.selected:hover {\n --background-color: var(--color-chat-active) !important;\n\n .Avatar.online::after {\n border-color: var(--color-chat-active) !important;\n background: var(--color-white);\n }\n\n .ListItem-button {\n --background-color: var(--color-chat-active) !important;\n --color-text: var(--color-white);\n --color-text-meta-colored: var(--color-white);\n --color-text-meta: var(--color-white);\n --color-text-secondary: var(--color-white);\n --color-error: var(--color-white);\n --color-pinned: var(--color-white);\n }\n\n .icon-muted {\n color: var(--color-white) !important;\n }\n\n .Badge:not(.pinned) {\n background: var(--color-white);\n color: var(--color-chat-active);\n }\n }\n }\n\n @media (max-width: 600px) {\n .ListItem-button {\n border-radius: 0 !important;\n }\n }\n\n .status {\n position: relative;\n flex-shrink: 0;\n }\n\n .info {\n .subtitle {\n margin-top: -.125rem;\n }\n\n h3 {\n width: auto;\n max-width: 80%;\n }\n\n .icon-muted {\n font-size: 1.25rem;\n margin-left: 0.25rem;\n margin-top: -.0625rem;\n color: #C6C8CA;\n\n body.is-ios & {\n margin-top: 0;\n margin-right: .5rem;\n }\n }\n\n .LastMessageMeta {\n margin-left: auto;\n\n body.is-ios & {\n font-size: .875rem;\n margin-right: 0;\n }\n }\n\n .last-message, .typing-status {\n padding-right: 0.25rem;\n flex-grow: 1;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n\n &[dir=ltr] {\n text-align: left;\n }\n\n .sender-name {\n color: var(--color-text);\n }\n\n .draft {\n color: var(--color-error);\n }\n }\n\n .last-message {\n .draft {\n &::after {\n content: ': ';\n }\n }\n\n .colon {\n margin-inline-end: .25rem;\n }\n\n img {\n width: 1.25rem;\n height: 1.25rem;\n object-fit: cover;\n border-radius: .125rem;\n vertical-align: -.25rem;\n margin-inline-end: .25rem;\n\n body.is-ios & {\n width: 1.125rem;\n height: 1.125rem;\n vertical-align: -.1875rem;\n }\n\n &.round {\n border-radius: .625rem;\n }\n }\n\n .emoji-small {\n width: 1rem;\n height: 1rem;\n vertical-align: -.125rem;\n }\n\n .icon-play {\n position: relative;\n display: inline-block;\n font-size: .75rem;\n color: #fff;\n margin-inline-start: -1.25rem;\n margin-inline-end: 0.5rem;\n bottom: 0.0625rem;\n\n body.is-ios & {\n margin-inline-start: -1.125rem;\n bottom: 0;\n }\n }\n }\n }\n\n &[dir=rtl] {\n .info {\n .LastMessageMeta {\n margin-left: 0;\n margin-right: auto;\n }\n\n .title, .subtitle {\n padding-left: .15rem;\n padding-right: 0;\n }\n\n .icon-muted {\n margin-left: 0;\n margin-right: 0.25rem;\n }\n\n .last-message, .typing-status {\n padding-left: 0.5rem;\n padding-right: 0;\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n }\n}\n",".AnimatedEmoji {\n margin-bottom: 0.75rem;\n\n img {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.like-sticker-thumb img {\n transform: scale(0.8);\n }\n}\n",".EmptyFolder {\n width: 100%;\n height: 80%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n @media (max-height: 480px) {\n height: 100%;\n }\n\n .sticker {\n height: 8rem;\n margin-bottom: 1.875rem;\n }\n\n .title {\n font-size: 1.25rem;\n margin-bottom: .125rem;\n }\n\n .description {\n font-size: .875rem;\n color: var(--color-text-secondary);\n\n body.is-ios &,\n body.is-macos & {\n color: var(--color-text-secondary-apple);\n }\n }\n\n .Button.pill {\n margin-top: .625rem;\n font-weight: 500;\n padding-inline-start: .75rem;\n unicode-bidi: plaintext;\n\n i {\n margin-inline-end: .625rem;\n font-size: 1.5rem;\n }\n }\n}\n",".NothingFound {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-meta);\n\n &.with-description {\n flex-direction: column;\n }\n\n .AnimatedSticker {\n margin: 0 auto;\n }\n\n .description {\n color: var(--color-text-secondary);\n font-size: .875rem;\n text-align: center;\n margin: 1rem 0 0;\n unicode-bidi: plaintext;\n }\n}\n",".Media {\n height: 0;\n padding-bottom: 100%;\n overflow: hidden;\n position: relative;\n cursor: pointer;\n\n .video-duration {\n position: absolute;\n left: .25rem;\n top: .25rem;\n background: rgba(0, 0, 0, .25);\n color: #fff;\n font-size: .75rem;\n padding: 0 .3125rem;\n border-radius: .1875rem;\n line-height: 1.125rem;\n }\n\n img {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n",".WebLink {\n min-height: 3rem;\n padding: .25rem 0 0 3.75rem;\n font-size: 0.875rem;\n line-height: 1.125rem;\n position: relative;\n\n & + & {\n margin-top: 1.5rem;\n }\n\n &.without-media::before {\n content: attr(data-initial);\n width: 3rem;\n height: 3rem;\n position: absolute;\n left: 0;\n top: 0;\n background-color: var(--color-webpage-initial-background);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--border-radius-messages-small);\n text-transform: uppercase;\n font-weight: 500;\n font-size: 1.5rem;\n }\n\n .Media {\n position: absolute;\n left: 0;\n top: 0;\n width: 3rem;\n height: 3rem;\n cursor: default !important;\n padding-bottom: unset !important;\n border-radius: var(--border-radius-messages-small) !important;\n }\n\n .site-name,\n .site-description,\n .site-title {\n word-break: break-word;\n text-align: initial;\n }\n\n .site-name {\n display: block;\n color: var(--color-links);\n font-weight: 400;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .site-title {\n font-size: 1rem;\n font-weight: 400;\n margin-bottom: .0625rem;\n line-height: 1.3125rem;\n }\n\n .sender-name,\n .site-description {\n margin-bottom: 0;\n color: var(--color-text-secondary);\n line-height: 1.125rem;\n max-height: 2.25rem;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .sender-name {\n margin-top: .25rem;\n }\n\n .site-description .emoji {\n width: 1rem !important;\n height: 1rem !important;\n }\n\n &[dir=rtl] {\n padding: .25rem 3.75rem 0 0;\n\n .Media,\n &.without-media::before {\n left: auto;\n right: 0;\n }\n\n .content {\n text-align: right;\n }\n }\n}\n",".File {\n --secondary-color: var(--color-text-secondary);\n\n .Message.own & {\n --secondary-color: var(--color-text-green);\n }\n\n .content-inner & {\n min-width: 14rem;\n @media (max-width: 340px) {\n min-width: 11rem;\n }\n }\n\n display: flex;\n align-items: center;\n\n .file-icon-container {\n position: relative;\n }\n\n .file-progress,\n .file-icon,\n .file-preview {\n width: 3.375rem;\n height: 3.375rem;\n margin-inline-end: .75rem;\n border-radius: var(--border-radius-messages-small);\n background: var(--color-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .file-progress {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n .file-icon {\n padding: 1rem .75rem .5rem;\n align-items: flex-end;\n flex-shrink: 0;\n position: relative;\n color: white;\n\n .file-ext {\n font-size: 1rem;\n font-weight: 500;\n transition: opacity .15s;\n }\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n border-bottom-left-radius: 0.25rem;\n background: rgba(black, 0.25);\n border-color: transparent var(--background-color) transparent var(--background-color);\n border-width: 0 1.125rem 1.125rem 0;\n border-style: solid;\n transition: border-width .15s ease-in;\n }\n }\n\n .file-preview {\n background: transparent;\n overflow: hidden;\n\n & + .action-icon,\n & + .file-progress {\n background: rgba(black, 0.5);\n border-radius: var(--border-radius-messages-small);\n }\n\n img {\n object-fit: cover;\n }\n }\n\n .action-icon {\n color: #fff;\n font-size: 1.5rem;\n position: absolute;\n top: 0;\n start: 0;\n width: 3.375rem;\n height: 3.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity .25s;\n }\n\n &.interactive .file-icon-container {\n cursor: pointer;\n\n &:hover {\n .file-icon::after {\n border-width: 0;\n }\n\n .action-icon {\n opacity: 1;\n\n &.hidden {\n opacity: 0;\n }\n }\n\n .file-ext {\n opacity: 0;\n }\n }\n }\n\n .file-info {\n margin-top: .1875rem;\n margin-right: .125rem;\n white-space: nowrap;\n overflow: hidden;\n flex-grow: 1;\n\n & + .Link {\n font-size: .75rem;\n color: var(--color-text-secondary);\n padding-left: 1rem;\n white-space: nowrap;\n }\n }\n\n .file-title {\n font-size: 1rem;\n line-height: 1.5rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji {\n vertical-align: -4px;\n }\n }\n\n .file-subtitle {\n font-size: .875rem;\n line-height: .9375rem;\n color: var(--secondary-color);\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n\n span + span {\n &::before {\n content: '\\00a0\\2022\\00a0';\n }\n }\n }\n\n &.smaller {\n --background-color: var(--color-background);\n --border-radius-messages-small: .3125rem;\n\n .action-icon,\n .file-progress,\n .file-icon,\n .file-preview {\n width: 3rem;\n height: 3rem;\n }\n\n .file-icon {\n padding-bottom: .375rem;\n\n &::after {\n border-width: 0 1rem 1rem 0;\n }\n }\n\n .file-info {\n margin-top: -.125rem;\n }\n\n .file-title {\n font-weight: 400;\n }\n\n .file-subtitle {\n line-height: 1rem;\n }\n }\n\n &:dir(rtl),\n &[dir=rtl] {\n .file-progress,\n .file-icon,\n .file-preview {\n margin-left: .75rem;\n margin-right: 0;\n }\n\n .file-info {\n text-align: right;\n\n & + .Link {\n padding-left: 0;\n padding-right: 1rem;\n }\n }\n\n .action-icon {\n left: auto;\n right: 0;\n }\n }\n}\n\n// Document extension colors\n.File .file-progress,\n.File .file-icon {\n &.red {\n background-color: var(--color-error);\n }\n\n &.orange {\n background-color: var(--color-warning);\n }\n\n &.green {\n background-color: var(--color-text-green);\n }\n}\n",".Audio {\n display: flex;\n align-items: flex-start;\n position: relative;\n\n .media-loading {\n position: absolute;\n pointer-events: none;\n\n &.interactive {\n pointer-events: all;\n }\n }\n\n &.own {\n --color-text-secondary: var(--accent-color);\n --color-interactive-active: var(--color-text-green);\n --color-interactive-inactive: rgba(var(--color-text-green-rgb), 0.4);\n --color-interactive-buffered: rgba(var(--color-text-green-rgb), 0.4); // Overlays underlying inactive color\n\n .theme-dark & {\n --color-text-green-rgb: 255, 255, 255;\n --color-text-green: var(--color-white);\n }\n\n .Button {\n --color-primary: var(--color-text-green);\n --color-primary-shade: var(--color-green);\n --color-primary-shade-darker: var(--color-green-darker);\n --color-white: var(--color-background-own);\n\n .theme-dark & {\n --color-primary-shade: #fff;\n --color-primary-shade-darker: #fff;\n }\n }\n }\n\n .toggle-play {\n margin-inline-end: .5rem;\n\n &.translucent-white {\n color: rgba(255, 255, 255, 0.8);\n }\n\n &.smaller {\n width: 3rem;\n height: 3rem;\n margin-inline-end: .75rem;\n\n i {\n font-size: 1.625rem;\n\n &.icon-pause {\n font-size: 1.5625rem;\n }\n }\n }\n\n i {\n position: absolute;\n\n &.icon-play {\n margin-left: .1875rem;\n @media (max-width: 600px) {\n margin-left: .125rem;\n }\n }\n }\n\n .icon-play, .icon-pause {\n opacity: 1;\n transform: scale(1);\n transition: opacity .4s, transform .6s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n &.play .icon-pause,\n &.pause .icon-play,\n &.loading .icon-play,\n &.loading .icon-pause {\n opacity: 0;\n transform: scale(.5);\n }\n }\n\n .download-button {\n position: absolute;\n width: 1.1875rem !important;\n height: 1.1875rem !important;\n padding: 0;\n left: 1.9375rem;\n top: 1.9375rem;\n border: .125rem solid var(--background-color);\n z-index: 1;\n\n i {\n font-size: 0.8125rem;\n }\n }\n\n &.bigger .download-button {\n left: 2rem;\n top: 2rem;\n border: .125rem solid var(--color-background);\n }\n\n .content {\n align-self: center;\n min-width: 0;\n flex-grow: 1;\n text-align: initial;\n }\n\n .content-row {\n display: flex;\n justify-content: space-between;\n }\n\n .title {\n font-weight: 500;\n margin: 0;\n line-height: 1.25;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n canvas {\n height: 23px;\n }\n\n .voice-duration {\n margin: .25rem 0 0;\n font-size: .875rem;\n color: var(--color-text-secondary);\n font-variant-numeric: tabular-nums;\n display: flex;\n align-items: flex-end;\n\n &.unread::after {\n content: '';\n position: relative;\n margin: 0 0 .375rem .25rem;\n width: 0.4375rem;\n height: 0.4375rem;\n border-radius: 50%;\n background-color: var(--accent-color);\n }\n }\n\n body.is-ios & {\n .voice-duration.unread::after {\n margin-bottom: .4375rem;\n }\n }\n\n &:not(.own) .voice-duration span {\n color: var(--color-primary);\n }\n\n .waveform {\n cursor: pointer;\n margin-left: 1px;\n touch-action: none;\n }\n\n .meta,\n .performer,\n .date {\n font-size: .875rem;\n color: var(--color-text-secondary);\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n unicode-bidi: plaintext;\n }\n\n .duration {\n font-size: .875rem;\n color: var(--color-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n font-variant-numeric: tabular-nums;\n }\n\n .meta {\n display: flex;\n align-items: center;\n margin-top: 0.125rem;\n padding-inline-end: 0.5rem;\n\n & > span {\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .performer {\n flex-shrink: 0;\n }\n\n .duration.with-seekline {\n margin-inline-end: 0.625rem;\n }\n\n .bullet {\n margin: 0 0.25rem;\n flex-shrink: 0;\n }\n }\n\n .seekline {\n flex-grow: 1;\n height: 1.25rem;\n position: relative;\n top: 3px;\n cursor: pointer;\n touch-action: none;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n top: 6px;\n height: 2px;\n background-color: var(--color-interactive-inactive);\n border-radius: 2px;\n }\n }\n\n .seekline-buffered-progress, .seekline-play-progress {\n position: absolute;\n height: 2px;\n border-radius: 2px;\n overflow: hidden;\n width: 100%;\n top: 6px;\n\n i {\n position: absolute;\n width: 100%;\n background-color: var(--color-interactive-active);\n height: 2px;\n border-radius: 2px;\n right: 100%;\n }\n }\n\n .seekline-buffered-progress i {\n background-color: var(--color-interactive-buffered) !important;\n }\n\n .seekline-thumb {\n position: absolute;\n width: 100%;\n top: 7px;\n left: 0;\n\n i {\n pointer-events: none;\n position: absolute;\n width: 100%;\n right: 100%;\n\n &::after {\n content: '';\n position: absolute;\n top: -6px;\n right: -6px;\n width: 12px;\n height: 12px;\n border-radius: 6px;\n background: var(--color-interactive-active);\n }\n }\n }\n\n &.bigger {\n .title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 400;\n line-height: 1.5rem;\n }\n\n .meta {\n height: 1.25rem;\n }\n\n .performer,\n .date {\n line-height: 1.0625rem;\n }\n\n .duration {\n line-height: 1rem;\n }\n\n .media-loading {\n top: 0.1875rem;\n left: 0.1875rem;\n }\n\n &[dir=rtl] {\n .media-loading {\n left: auto !important;\n right: 0;\n }\n }\n }\n\n .ProgressSpinner.size-s svg {\n width: 2.25rem;\n height: 2.25rem;\n }\n\n &[dir=rtl] {\n &:last-child {\n margin-bottom: 0.625rem;\n }\n\n .toggle-play {\n margin-left: .5rem;\n margin-right: 0;\n\n &.smaller {\n margin-left: .75rem;\n margin-right: 0;\n }\n }\n\n .meta.duration.with-seekline {\n margin-inline-start: 0.625rem;\n }\n\n .content,\n .duration {\n text-align: right;\n }\n\n .download-button {\n left: auto;\n right: 2rem;\n }\n }\n}\n\n.has-replies .Audio[dir=rtl] {\n margin-bottom: 1.625rem;\n}\n",".ProfilePhoto {\n width: 100%;\n height: 100%;\n cursor: pointer;\n position: relative;\n\n img:not(.emoji) {\n width: 100%;\n object-fit: cover;\n }\n\n .prev-avatar-media {\n position: absolute;\n left: 0;\n top: 0;\n z-index: -1;\n }\n\n .spinner-wrapper {\n width: 100%;\n height: 100%;\n }\n\n .spinner-wrapper,\n &.deleted-account,\n &.replies-bot-account,\n &.no-photo,\n &.saved-messages {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-white);\n background: linear-gradient(var(--color-white) -125%, var(--color-user));\n cursor: default;\n }\n\n &.no-photo {\n font-size: 14rem;\n }\n\n &.replies-bot-account,\n &.deleted-account,\n &.saved-messages {\n font-size: 20rem;\n }\n}\n",".ProfileInfo {\n aspect-ratio: 1 / 1;\n position: relative;\n\n @supports not (aspect-ratio: 1 / 1) {\n &::before {\n float: left;\n padding-top: 100%;\n content: \"\";\n }\n\n &::after {\n display: block;\n content: \"\";\n clear: both;\n }\n }\n\n .photo-wrapper {\n width: 100%;\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n\n > .Transition {\n width: 100%;\n height: 100%;\n }\n }\n\n .photo-dashes {\n position: absolute;\n width: 100%;\n height: .125rem;\n padding: 0 .375rem;\n z-index: 1;\n\n display: flex;\n top: .5rem;\n left: 0;\n }\n\n .photo-dash {\n flex: 1 1 auto;\n background-color: var(--color-white);\n opacity: .25;\n border-radius: .125rem;\n margin: 0 .125rem;\n\n &.current {\n opacity: .75;\n }\n }\n\n .navigation {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 25%;\n border: none;\n padding: 0;\n margin: 0;\n appearance: none;\n background: transparent no-repeat;\n background-size: 1.25rem;\n opacity: .25;\n transition: opacity .15s;\n outline: none;\n cursor: pointer;\n z-index: 1;\n\n &:hover, .is-touch-env & {\n opacity: 1;\n }\n\n &.prev {\n left: 0;\n background-image: url(\"../../assets/media_navigation_previous.svg\");\n background-position: 1.25rem 50%;\n }\n\n &.next {\n right: 0;\n background-image: url(\"../../assets/media_navigation_next.svg\");\n background-position: calc(100% - 1.25rem) 50%;\n }\n }\n\n .info {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n min-height: 100px;\n padding: 0 1.5rem .5rem;\n background: linear-gradient(0deg, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%);\n color: var(--color-white);\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n pointer-events: none;\n\n &:dir(rtl) {\n .status {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n\n &[dir=rtl] {\n .status {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n }\n\n .title {\n display: flex;\n align-items: center;\n\n h3 {\n font-weight: 500;\n font-size: 1.25rem;\n line-height: 1.375rem;\n white-space: pre-wrap;\n word-break: break-word;\n margin-bottom: .25rem;\n }\n\n .VerifiedIcon {\n margin-left: 0.25rem;\n margin-top: -0.125rem;\n }\n\n .emoji {\n width: 1.5rem;\n height: 1.5rem;\n background-size: 1.5rem;\n }\n }\n\n .status {\n font-size: 0.875rem;\n opacity: .5;\n }\n\n &[dir=rtl] {\n .navigation.prev {\n left: auto;\n right: 0;\n transform: scaleX(-1);\n }\n\n .navigation.next {\n left: 0;\n right: auto;\n transform: scaleX(-1);\n }\n }\n\n &.self {\n margin: 0 -.5rem .75rem;\n overflow: hidden;\n\n &.ghost {\n margin: 0;\n }\n\n .prev-avatar-media {\n z-index: 0;\n }\n\n .info {\n padding-bottom: .75rem;\n }\n\n .status {\n line-height: 1rem;\n }\n }\n}\n",".DropTarget {\n border-radius: var(--border-radius-default);\n background: var(--color-background);\n padding: 1.25rem;\n flex: 1 1 auto;\n width: 100%;\n max-width: 43.75rem;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: .3125rem;\n display: flex;\n color: #A4ACB3;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n @media (max-height: 350px) {\n padding: .75rem;\n }\n\n &.hovered .target-content {\n color: var(--color-primary);\n background-image: var(--drag-target-border-hovered);\n }\n\n & + & {\n margin-top: .3125rem;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .target-content {\n pointer-events: none;\n background-image: var(--drag-target-border);\n border-radius: .5rem;\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n transition: .2s color, .2s background;\n }\n\n .icon {\n font-size: 6.25rem;\n line-height: 4.6875rem;\n margin-bottom: 2.25rem;\n\n @media (max-height: 520px) {\n font-size: 4.25rem;\n line-height: 3.5rem;\n margin-bottom: 1rem;\n }\n\n @media (max-height: 450px) {\n font-size: 2rem;\n line-height: 1rem;\n margin-bottom: .5rem;\n margin-top: .25rem;\n }\n }\n\n .title {\n font-size: 1.3125rem;\n font-weight: 500;\n letter-spacing: -.18px;\n\n @media (max-height: 450px) {\n font-size: 1rem;\n }\n }\n\n .description {\n font-size: 1rem;\n letter-spacing: .3px;\n\n @media (max-height: 450px) {\n font-size: .875rem;\n }\n }\n}\n",".FloatingActionButton {\n position: absolute;\n right: 1rem;\n bottom: 1rem;\n transform: translateY(calc(5rem - var(--group-call-header-height, 0rem)));\n transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n &.revealed {\n transform: translateY(calc(0rem - var(--group-call-header-height, 0rem)));\n }\n}\n","@import '../../styles/mixins';\n\n@mixin thumb-styles() {\n background: var(--slider-color);\n border: none;\n height: 0.75rem;\n width: 0.75rem;\n border-radius: 50%;\n cursor: pointer;\n transform: scale(1);\n transition: transform .25s ease-in-out;\n\n &:hover {\n transform: scale(1.2);\n }\n}\n\n.RangeSlider {\n --slider-color: var(--color-primary);\n\n margin-bottom: 1rem;\n\n &.disabled {\n pointer-events: none;\n --slider-color: var(--color-text-secondary);\n }\n\n .slider-top-row {\n display: flex;\n justify-content: space-between;\n margin-bottom: 0.625rem;\n\n .value {\n flex-shrink: 0;\n margin-left: 1rem;\n color: var(--color-text-secondary);\n }\n\n &[dir=rtl] {\n .value {\n margin-left: 0;\n margin-right: 1rem;\n }\n }\n }\n\n .slider-main {\n position: relative;\n z-index: 1;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n left: 0;\n top: 0.3125rem;\n height: 0.125rem;\n background-color: var(--color-borders);\n border-radius: 0.125rem;\n opacity: 0.5;\n z-index: -1;\n }\n }\n\n .slider-fill-track {\n position: absolute;\n width: 100%;\n left: 0;\n top: 0.3125rem;\n height: 0.125rem;\n background-color: var(--slider-color);\n border-radius: 0.125rem;\n pointer-events: none;\n }\n\n // Reset range input browser styles\n @include reset-range();\n\n // Apply custom styles\n input[type=\"range\"] {\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n\n .slider-options {\n display: grid;\n grid-template-rows: auto;\n grid-auto-columns: 1fr;\n grid-auto-flow: column;\n }\n\n .slider-option {\n font-size: 0.825rem;\n text-align: center;\n cursor: pointer;\n color: var(--color-text-secondary);\n transition: color .2s ease;\n\n &:hover, &.active {\n color: var(--color-text);\n }\n\n &.active {\n font-weight: 500;\n }\n\n &:first-child {\n text-align: left;\n }\n\n &:last-child {\n text-align: right;\n }\n }\n}\n","// @optimization\n@mixin while-transition() {\n .Transition > div:not(.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",".DropArea {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n height: 100vh;\n z-index: var(--z-drop-area);\n padding: 80px 20px 20px;\n\n display: flex;\n flex-direction: column;\n\n #Main.right-column-open & {\n max-width: calc(100% - var(--right-column-width));\n }\n}\n",".StickerButton {\n display: inline-block;\n width: 4rem;\n height: 4rem;\n margin: 0.5rem;\n border-radius: var(--border-radius-messages-small);\n background: transparent no-repeat center;\n background-size: contain;\n transition: background-color .15s ease, opacity .3s ease !important;\n position: relative;\n\n &.interactive {\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n\n .sticker-unfave-button {\n opacity: 1;\n }\n }\n\n }\n\n @media (max-width: 600px) {\n margin: 0.25rem;\n }\n\n &.set-button {\n width: 2.75rem !important;\n height: 2.75rem;\n margin: 0 0.5rem;\n }\n\n &.large {\n width: 10rem;\n height: 10rem;\n margin: 0;\n }\n\n .AnimatedSticker, img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n img {\n object-fit: contain;\n }\n\n .sticker-unfave-button {\n position: absolute;\n top: -0.5rem;\n right: -0.5rem;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0.125rem;\n\n i {\n font-size: 1rem;\n }\n\n opacity: 0;\n }\n}\n",".TextFormatter {\n transform: translate(-50%, -3.25rem);\n\n &, &-link-control {\n position: absolute;\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n padding: 0.5rem 0.375rem;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n &-link-control {\n left: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n transition: opacity .3s ease;\n\n .Modal & {\n max-width: 100%;\n }\n\n @media (max-width: 600px) {\n max-width: calc(100vw - var(--text-formatter-left) + 3rem);\n }\n\n input {\n border: none !important;\n outline: none !important;\n width: 100%;\n color: var(--color-text);\n background-color: var(--color-background);\n }\n }\n\n &-buttons, &-link-url-confirm {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n }\n\n &-divider {\n width: 1px;\n height: 1.75rem;\n margin: 0 0.25rem;\n background-color: var(--color-borders);\n }\n\n &-link-url-input-wrapper {\n width: 20rem;\n position: relative;\n max-width: 100%;\n\n @media (max-width: 600px) {\n max-width: 90vw;\n }\n\n &::before, &::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 1rem;\n z-index: 2;\n opacity: 0;\n transition: opacity .2s ease;\n }\n\n &::before {\n left: 0;\n background: linear-gradient(to right, var(--color-background) .25rem, transparent 1rem)\n }\n\n &::after {\n right: 0;\n background: linear-gradient(to left, var(--color-background) .25rem, transparent 1rem)\n }\n\n &.mask-left {\n &::before {\n opacity: 1;\n }\n }\n\n &.mask-right {\n &::after {\n opacity: 1;\n }\n }\n }\n\n &-link-url-confirm {\n flex-shrink: 0;\n opacity: 0;\n transition: opacity .3s ease;\n\n &.shown {\n opacity: 1;\n }\n }\n\n &.link-control-shown {\n .TextFormatter-link-control {\n opacity: 1;\n pointer-events: all;\n }\n }\n\n .Button {\n width: 2rem;\n height: 2rem;\n padding: 0.25rem;\n font-size: 1.5rem;\n margin: 0 0.125rem;\n border-radius: var(--border-radius-messages-small);\n flex-shrink: 0;\n cursor: pointer;\n\n &.active {\n background-color: var(--color-primary) !important;\n color: white;\n }\n\n &.disabled {\n opacity: .5;\n pointer-events: none;\n }\n }\n}\n",".Picker {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .picker-header {\n padding: 0 1rem 0.25rem 0.75rem;\n border-bottom: 1px solid var(--color-borders);\n display: flex;\n flex-flow: row wrap;\n flex-shrink: 0;\n\n overflow-y: auto;\n max-height: 20rem;\n\n .input-group {\n margin-bottom: 0.5rem;\n margin-left: 0.5rem;\n flex-grow: 1;\n }\n\n .form-control {\n height: 2rem;\n border: none;\n border-radius: 0;\n padding: 0;\n box-shadow: none;\n }\n }\n\n .picker-list {\n flex-grow: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0.5rem;\n\n @media (max-width: 600px) {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n }\n\n .no-results {\n height: 100%;\n margin: 0;\n padding: 1rem 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/11.58cedc04083d3a8f14c7.js b/dist/11.58cedc04083d3a8f14c7.js deleted file mode 100644 index fe83af7fe..000000000 --- a/dist/11.58cedc04083d3a8f14c7.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[11],{7854:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),r=n(6137),s=n(6752),i=n(3657),o=n(6202),c=n(692),l=n(5296),d=n(4399),u=n(7799);const m=(0,a.X$)((({sticker:e,effect:t,isOwn:n,soundId:m,size:h="medium",observeIntersection:f,lastSyncTime:v,forceLoadPreview:p,messageId:g,chatId:Z,activeEmojiInteraction:E})=>{var P;const{markAnimationLoaded:y,isAnimationLoaded:C,ref:b,width:N,style:w,handleClick:k,playKey:I}=(0,l.Z)(h,Z,g,m,E,n,void 0,null==t?void 0:t.emoji),T=`sticker${e.id}`,M=(0,i.Op)(b,f),S=null===(P=e.thumbnail)||void 0===P?void 0:P.dataUri,x=(0,o.Z)(`${T}?size=m`,!M&&!p,r.IU.BlobUrl,v),L=(0,c.Z)(x),$=(0,o.Z)(T,!M,r.IU.Lottie,v),A=Boolean($);return a.ZP.createElement("div",{ref:b,className:(0,s.Z)("AnimatedEmoji media-inner",e.id===d.wB&&"like-sticker-thumb"),style:w,onClick:k},!C&&S&&a.ZP.createElement("img",{src:S,alt:""}),!C&&x&&a.ZP.createElement("img",{src:x,className:L,alt:""}),A&&T&&a.ZP.createElement(u.Z,{key:T,id:T,animationData:$,size:N,quality:1,play:M&&I,noLoop:!0,onLoad:y}))}))},4752:(e,t,n)=>{n.d(t,{Z:()=>T});var a=n(4050),r=n(5116),s=n(6137),i=n(1713),o=n(7361),c=n(790),l=n(2858),d=n(6752),u=n(2340),m=n(5376),h=n(2566),f=n(1212),v=n(2019),p=n(3186),g=n(9107),Z=n(1174),E=n(6202),P=n(396),y=n(663),C=n(231),b=n(9196),N=n(8033);const w=o.wB?20:25,k=o.wB?50:75;function I(e,t,n){return a.ZP.createElement("div",{className:"seekline no-selection",ref:n},a.ZP.createElement("span",{className:"seekline-buffered-progress"},a.ZP.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.ZP.createElement("span",{className:"seekline-play-progress"},a.ZP.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.ZP.createElement("span",{className:"seekline-thumb"},a.ZP.createElement("i",{style:`transform: translateX(${100*e}%)`})))}const T=(0,a.X$)((({theme:e,message:t,senderTitle:n,uploadProgress:T,origin:M,date:S,lastSyncTime:x,className:L,isSelectable:$,isSelected:A,isDownloading:F,onPlay:O,onReadMedia:R,onCancelUpload:D,onDateClick:U})=>{const{content:{audio:B,voice:V,video:X},isMediaUnread:j}=t,z=Boolean(V||X),K=(0,a.sO)(!1),Y=(0,a.sO)(!1),H=(0,a.sO)(null),q=(0,g.Z)(),{isRtl:W}=q,_=(0,r.uC)(),[J,G]=(0,a.eJ)(!1),Q=x,ee=(0,l.Ti)(t,"pictogram"),te=(0,E.Z)(ee,!1,s.IU.BlobUrl),ne=(0,E.Z)((0,l.Ti)(t,"inline"),!Q,(0,l.kG)(t,"inline")),{loadProgress:ae}=(0,h.Z)((0,l.Ti)(t,"download"),!F),re=(0,a.I4)((()=>{G(!0),O(t.id,t.chatId)}),[t,O]),se=(0,a.I4)((()=>{G(!1)}),[]),{isBuffered:ie,bufferedProgress:oe,bufferingHandlers:ce,checkBuffering:le}=(0,v.Z)(),{isPlaying:de,playProgress:ue,playPause:me,play:he,pause:fe,setCurrentTime:ve,duration:pe}=(0,p.Z)((0,P.An)(t),(0,l.XV)(t),z?"voice":"audio",ne,ce,void 0,le,J,re,se,(0,l.CI)(t)),ge=(0,l.B4)(t),Ze=function(e,t,n=0,r=!1){const s=(0,a.sO)(null),{data:i,peak:o}=(0,a.Ye)((()=>{if(!t)return;const{waveform:e,duration:n}=t;if(!e)return{data:new Array(Math.min(n,30)).fill(0),peak:0};const a=Math.min(n/10,1),r=Math.round(w+(k-w)*a);return function(e,t){let n=0;const a=new Array(t),r=e.length/t,s=e[0],i=e[e.length-1];for(let d=0;d>n&31}const s=Math.floor(5*(n-1)/8),i=Math.floor(5*(n-1)%8),o=r[s]+(r[s+1]<<8);return a[n-1]=o>>i&31,a}(new Uint8Array(e)),r)}),[t])||{};return(0,a.bt)((()=>{const t=s.current;t&&i&&void 0!==o&&function(e,t,n,{peak:a,fillStyle:r,progressFillStyle:s}){const i=4*t.length;e.width=2*i,e.height=46,e.style.width=`${i}px`,e.style.height="23px";const o=e.getContext("2d");o.scale(2,2),t.forEach(((e,i)=>{o.globalAlpha=i/t.length>=n?.5:1,o.fillStyle=n>i/t.length?s:r;const c=Math.max(2,e/Math.max(1,a)*23);!function(e,t,n,a,r,s){2<2*s&&(s=1),r<2*s&&(s=r/2),e.beginPath(),e.moveTo(t+s,n),e.arcTo(t+2,n,t+2,n-r,s),e.arcTo(t+2,n-r,t,n-r,s),e.arcTo(t,n-r,t,n,s),e.arcTo(t,n,t+2,n,s),e.closePath()}(o,4*i,23,0,c,1),o.fill()}))}(t,i,n,{peak:o,fillStyle:r?"dark"===e?"#B7ABED":"#AEDFA4":"dark"===e?"#494A78":"#ADD3F7",progressFillStyle:r?"dark"===e?"#FFFFFF":"#4FAE4E":"dark"===e?"#8774E1":"#3390EC"})}),[r,o,n,i,e]),s}(e,V,j&&!ge?1:ue,ge),Ee=de||ue>0&&ue<1;(0,a.d4)((()=>{G(de)}),[de]);const Pe=J&&!ie,{isUploading:ye,isTransferring:Ce,transferProgress:be}=(0,l.Sc)(t,T||ae,Pe||F),{shouldRender:Ne,transitionClassNames:we}=(0,f.Z)(Ce),ke=Ne&&(Pe||ye),Ie=(0,a.I4)((()=>{ye?null==D||D():(de||O(t.id,t.chatId),(0,r.uC)().setAudioPlayerOrigin({origin:M}),G(!J),me())}),[ye,de,J,me,D,O,t.id,t.chatId,M]);(0,a.d4)((()=>{R&&j&&(de||F)&&R()}),[de,j,R,F]);const Te=(0,a.I4)((()=>{F?_.cancelMessageMediaDownload({message:t}):_.downloadMessageMedia({message:t})}),[_,F,t]),Me=(0,a.I4)((e=>{if(K.current&&H.current){const{width:t,left:n}=H.current.getBoundingClientRect(),a=e instanceof MouseEvent?e.clientX:e.targetTouches[0].clientX;e.stopPropagation(),ve(Math.max(Math.min(pe*((a-n)/t),pe-.1),.001))}}),[pe,ve]),Se=(0,a.I4)((e=>{e instanceof MouseEvent&&2===e.button||(K.current=!0,Y.current=de,fe(),Me(e))}),[Me,fe,de]),xe=(0,a.I4)((()=>{K.current=!1,Y.current&&he()}),[he]),Le=(0,a.I4)((()=>{U(t.id,t.chatId)}),[U,t.id,t.chatId]);function $e(){if(z)return n||"Voice";const{title:e,fileName:t}=B;return e||t}(0,a.d4)((()=>{if(H.current&&Ee)return(0,Z.s)(H.current,{onCapture:Se,onRelease:xe,onClick:xe,onDrag:Me})}),[Ee,Se,Me,xe]);const Ae=(0,d.Z)("Audio",L,ge&&M===i.Cr.Inline&&"own",(M===i.Cr.Search||M===i.Cr.SharedMedia)&&"bigger",A&&"audio-is-selected"),Fe=["toggle-play"];ke?Fe.push("loading"):de?Fe.push("pause"):de||Fe.push("play");const Oe=(0,d.Z)("content",Ee&&"with-seekline");function Re(){return a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:Oe},a.ZP.createElement("div",{className:"content-row"},a.ZP.createElement("p",{className:"title",dir:"auto",title:$e()},(0,u.Z)($e())),a.ZP.createElement("div",{className:"message-date"},S&&a.ZP.createElement(N.Z,{className:"date",onClick:Le},(0,c.VX)(q,1e3*S)))),Ee&&a.ZP.createElement("div",{className:"meta search-result",dir:W?"rtl":void 0},a.ZP.createElement("span",{className:"duration with-seekline",dir:"auto"},ue<1&&`${(0,c.k9)(pe*ue,pe)}`),I(ue,oe,H)),!Ee&&function(){if(z)return a.ZP.createElement("div",{className:"meta",dir:W?"rtl":void 0},(0,c.k9)((V||X).duration));const{performer:e}=B;return a.ZP.createElement("div",{className:"meta",dir:W?"rtl":void 0},(0,c.k9)(pe),a.ZP.createElement("span",{className:"bullet"},"•"),e&&a.ZP.createElement("span",{className:"performer",title:e},(0,u.Z)(e)),e&&n&&a.ZP.createElement("span",{className:"bullet"},"•"),n&&a.ZP.createElement("span",{title:n},(0,u.Z)(n)))}()))}return a.ZP.createElement("div",{className:Ae,dir:q.isRtl?"rtl":"ltr"},$&&a.ZP.createElement("div",{className:"message-select-control"},A&&a.ZP.createElement("i",{className:"icon-select"})),a.ZP.createElement(C.Z,{round:!0,ripple:!o.wB,size:"smaller",color:te?"translucent-white":"primary",className:Fe.join(" "),ariaLabel:de?"Pause audio":"Play audio",onClick:Ie,isRtl:q.isRtl,backgroundImage:te},a.ZP.createElement("i",{className:"icon-play"}),a.ZP.createElement("i",{className:"icon-pause"})),Ne&&a.ZP.createElement("div",{className:(0,d.Z)("media-loading",we,ke&&"interactive")},a.ZP.createElement(b.Z,{progress:be,transparent:!0,size:"m",onClick:ke?Ie:void 0,noCross:!ke})),B&&!ye&&a.ZP.createElement(C.Z,{round:!0,size:"tiny",className:"download-button",ariaLabel:F?"Cancel download":"Download",onClick:Te},a.ZP.createElement("i",{className:F?"icon-close":"icon-arrow-down"})),M===i.Cr.Search&&Re(),M!==i.Cr.Search&&B&&function(e,t,n,r,s,i,o,l,d,h,f){const{title:v,performer:p,fileName:g}=t,Z=r||s>0&&s<1,{isRtl:E}=y.i0;return a.ZP.createElement("div",{className:"content"},a.ZP.createElement("p",{className:"title",dir:"auto",title:v},(0,u.Z)(v||g)),Z&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},a.ZP.createElement("span",{className:"duration with-seekline",dir:"auto"},(0,c.k9)(n*s,n)),I(s,i,o)),!Z&&l&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},h?`${(0,m.yW)(t.size*h)} / `:void 0,(0,m.yW)(t.size)),!Z&&!l&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},a.ZP.createElement("span",{className:"duration",dir:"auto"},(0,c.k9)(n)),a.ZP.createElement("span",{className:"bullet"},"•"),a.ZP.createElement("span",{className:"performer",dir:"auto",title:p},(0,u.Z)(p||"Unknown")),d&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"bullet"},"•"),a.ZP.createElement(N.Z,{className:"date",onClick:f},(0,c.ZK)(e,1e3*d,!0)))))}(q,B,pe,de,ue,oe,H,F||ye,S,be,U?Le:void 0),M===i.Cr.SharedMedia&&(V||X)&&Re(),M===i.Cr.Inline&&V&&function(e,t,n,r,s){return a.ZP.createElement("div",{className:"content"},a.ZP.createElement("div",{className:"waveform",draggable:!1,ref:t},a.ZP.createElement("canvas",{ref:n})),a.ZP.createElement("p",{className:(0,d.Z)("voice-duration",s&&"unread"),dir:"auto"},0===r?(0,c.k9)(e.duration):(0,c.k9)(e.duration*r)))}(V,H,Ze,ue,j))}))},2531:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"CalendarModal",!t);return n?a.ZP.createElement(n,e):void 0}))},180:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),c=n(4319),l=n(6272),d=n(9107),u=n(1876),m=n(3321);const h=(0,a.X$)((0,r.c$)(((e,{chatOrUserId:t})=>{const{lastSyncTime:n,countryList:{phoneCodes:a}}=e,r=t?(0,s.Z1)(e,t):void 0,o=(0,i.YC)(t)?(0,s.dy)(e,t):void 0,c=r&&(0,i.i4)(r,(0,s.dZ)(e),(0,s.NJ)(e));return{lastSyncTime:n,phoneCodeList:a,chat:r,user:o,canInviteUsers:r&&!o&&(!(0,i.eA)(r)&&!(0,i.Mg)(r,"inviteUsers")||(0,i.VE)(r,"inviteUsers")),isMuted:c}}))((({lastSyncTime:e,user:t,chat:n,forceShowSelf:s,canInviteUsers:h,isMuted:f,phoneCodeList:v})=>{const{loadFullUser:p,showNotification:g,updateChatMutedState:Z}=(0,r.uC)(),{id:E,fullInfo:P,username:y,phoneNumber:C,isSelf:b}=t||{},{id:N}=n||{},w=(0,d.Z)();(0,a.d4)((()=>{e&&E&&p({userId:E})}),[p,E,e]);const k=(0,a.I4)((()=>{Z({chatId:N,isMuted:!f})}),[N,f,Z]);if(!n||n.isRestricted||b&&!s)return;function I(e,t){(0,c.TE)(e),g({message:`${t} was copied`})}const T=C&&(0,l.WZ)(v,C),M=(0,i.hu)(n),S=(null==P?void 0:P.bio)||(0,i.GM)(n);return a.ZP.createElement("div",{className:"ChatExtra"},T&&!!T.length&&a.ZP.createElement(u.Z,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(T,w("Phone"))},a.ZP.createElement("span",{className:"title",dir:"auto"},T),a.ZP.createElement("span",{className:"subtitle"},w("Phone"))),y&&a.ZP.createElement(u.Z,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(`@${y}`,w("Username"))},a.ZP.createElement("span",{className:"title",dir:"auto"},(0,o.Z)(y)),a.ZP.createElement("span",{className:"subtitle"},w("Username"))),S&&!!S.length&&a.ZP.createElement(u.Z,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},a.ZP.createElement("span",{className:"title",dir:"auto"},(0,o.Z)(S,["br","links","emoji"])),a.ZP.createElement("span",{className:"subtitle"},w(E?"UserBio":"Info"))),(h||!y)&&M&&a.ZP.createElement(u.Z,{icon:n.username?"mention":"link",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(M,w("SetUrlPlaceholder"))},a.ZP.createElement("div",{className:"title"},M),a.ZP.createElement("span",{className:"subtitle"},w("SetUrlPlaceholder"))),!s&&a.ZP.createElement(u.Z,{icon:"unmute",ripple:!0,onClick:k},a.ZP.createElement("span",null,w("Notifications")),a.ZP.createElement(m.Z,{id:"group-notifications",label:E?"Toggle User Notifications":"Toggle Chat Notifications",checked:!f,inactive:!0})))})))},329:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(9107),c=n(2340),l=n(172),d=n(3103),u=n(231);const m=(0,a.X$)((0,r.c$)(((e,{chat:t})=>{const n=(0,i.YC)(t.id),a=(0,s.FM)(e,t.id),r=n&&(0,s.dy)(e,(0,i.zX)(t)),o=r&&(0,i.cS)(r)&&!t.isSupport,c=n&&!a&&!o,l=n?(0,i.Vl)((0,s.dy)(e,(0,i.zX)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isBot:o,isChannel:(0,i.eA)(t),isBasicGroup:(0,i.G9)(t),isSuperGroup:(0,i.ZV)(t),currentUserId:e.currentUserId,canDeleteForAll:c,contactName:l}}))((({isOpen:e,chat:t,isChannel:n,isPrivateChat:s,isChatWithSelf:m,isBot:h,isBasicGroup:f,isSuperGroup:v,currentUserId:p,canDeleteForAll:g,contactName:Z,onClose:E,onCloseAnimationEnd:P})=>{const{leaveChannel:y,deleteHistory:C,deleteChannel:b,deleteChatUser:N,blockContact:w}=(0,r.uC)(),k=(0,o.Z)(),I=(0,i.U)(k,t),T=(0,a.I4)((()=>{C({chatId:t.id,shouldDeleteForAll:!0}),E()}),[C,t.id,E]),M=(0,a.I4)((()=>{C({chatId:t.id,shouldDeleteForAll:!0}),w({contactId:t.id,accessHash:t.accessHash}),E()}),[C,t.id,t.accessHash,w,E]),S=(0,a.I4)((()=>{s?C({chatId:t.id,shouldDeleteForAll:!1}):f?(N({chatId:t.id,userId:p}),C({chatId:t.id,shouldDeleteForAll:!1})):!n&&!v||t.isCreator?(n||v)&&t.isCreator&&b({chatId:t.id}):y({chatId:t.id}),E()}),[s,f,n,v,p,t.isCreator,t.id,E,C,N,y,b]);return a.ZP.createElement(d.Z,{isOpen:e,className:"DeleteChatModal",header:a.ZP.createElement("div",{className:"modal-header",dir:k.isRtl?"rtl":void 0},a.ZP.createElement(l.Z,{size:"tiny",chat:t,isSavedMessages:m}),a.ZP.createElement("h3",{className:"modal-title"},k(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":f||v?"Group.LeaveGroup":"DeleteChatUser"))),onClose:E,onCloseAnimationEnd:P},n&&t.isCreator?a.ZP.createElement("p",null,(0,c.Z)(k("ChatList.DeleteAndLeaveGroupConfirmation",I),["simple_markdown"])):n&&!t.isCreator||f||v?a.ZP.createElement("p",null,(0,c.Z)(k("ChannelLeaveAlertWithName",I),["simple_markdown"])):a.ZP.createElement("p",null,(0,c.Z)(k("ChatList.DeleteChatConfirmation",Z),["simple_markdown"])),h&&a.ZP.createElement(u.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:M},k("DeleteAndStop")),g&&a.ZP.createElement(u.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:T},Z?(0,c.Z)(k("ChatList.DeleteForEveryone",Z)):k("DeleteForAll")),a.ZP.createElement(u.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:S},k(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":f||v?"Group.LeaveGroup":g?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(u.Z,{className:"confirm-dialog-button",isText:!0,onClick:E},k("Cancel")))})))},2535:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),r=n(5116),s=n(5376),i=n(2858),o=n(3657),c=n(2566),l=n(6202),d=n(706),u=n(7002);const m=(0,a.X$)((({message:e,observeIntersection:t,smaller:n,canAutoLoad:m,autoLoadFileMaxSizeMb:h,uploadProgress:f,withDate:v,datetime:p,className:g,sender:Z,isSelected:E,isSelectable:P,onCancelUpload:y,onMediaClick:C,onDateClick:b,isDownloading:N})=>{const w=(0,r.uC)(),k=(0,a.sO)(null),I=e.content.document,{fileName:T,size:M,timestamp:S}=I,x=(0,s.K2)(I)||"",L=(0,o.Op)(k,t),[$,A]=(0,d.Z)();(0,a.d4)((()=>{L&&A()}),[L,A]);const[F,O]=(0,a.eJ)(m&&(!h||M<=1048576*h)),R=Boolean(N||F&&$),D=(0,i.Ti)(e,"download"),{loadProgress:U,mediaData:B}=(0,c.Z)(D,!R,void 0,void 0,void 0,!0),V=Boolean(B),{isUploading:X,isTransferring:j,transferProgress:z}=(0,i.Sc)(e,f||U,R&&!V),K=(0,s.v6)(I),Y=K?(0,i.DH)(e):void 0,H=K?I.previewBlobUrl:void 0,q=(0,l.Z)((0,i.Ti)(e,"pictogram"),!L),W=C&&Boolean(I.mediaType),_=(0,a.I4)((()=>{X?y&&y():N?w.cancelMessageMediaDownload({message:e}):j?O(!1):W?C():w.downloadMessageMedia({message:e})}),[X,N,j,W,y,w,e,C]),J=(0,a.I4)((()=>{b(e.id,e.chatId)}),[b,e.id,e.chatId]);return a.ZP.createElement(u.Z,{ref:k,name:T,extension:x,size:M,timestamp:v?p||S:void 0,thumbnailDataUri:Y,previewData:H||q,smaller:n,isTransferring:j,isUploading:X,transferProgress:z,className:g,sender:Z,isSelectable:P,isSelected:E,actionIcon:W?(0,i.hC)(e)?"icon-play":"icon-eye":"icon-download",onClick:_,onDateClick:b?J:void 0})}))},7002:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(1212),s=n(692),i=n(6752),o=n(790),c=n(5376),l=n(4399),d=n(2340),u=n(9107),m=n(9196),h=n(8033);const f=(0,a.X$)((({ref:e,name:t,size:n,extension:f="",timestamp:v,sender:p,thumbnailDataUri:g,previewData:Z,className:E,smaller:P,isTransferring:y,isUploading:C,isSelectable:b,isSelected:N,transferProgress:w,actionIcon:k,onClick:I,onDateClick:T})=>{const M=(0,u.Z)();let S=(0,a.sO)(null);e&&(S=e);const x=(0,s.Z)(Z),{shouldRender:L,transitionClassNames:$}=(0,r.Z)(y,void 0,!0),A=(0,c.Oh)(f),F=(0,c.yW)(n),{width:O,height:R}=(0,l.lE)(P),D=(0,i.Z)("File",E,P&&"smaller",I&&!C&&"interactive",N&&"file-is-selected");return a.ZP.createElement("div",{ref:S,className:D,dir:M.isRtl?"rtl":void 0},b&&a.ZP.createElement("div",{className:"message-select-control"},N&&a.ZP.createElement("i",{className:"icon-select"})),a.ZP.createElement("div",{className:"file-icon-container",onClick:C?void 0:I},g||Z?a.ZP.createElement("div",{className:"file-preview media-inner"},a.ZP.createElement("img",{src:g,width:O,height:R,className:"thumbnail",alt:""}),a.ZP.createElement("img",{src:Z,className:(0,i.Z)("full-media",x),width:O,height:R,alt:""})):a.ZP.createElement("div",{className:`file-icon ${A}`},f.length<=4&&a.ZP.createElement("span",{className:"file-ext",dir:"auto"},f)),L&&a.ZP.createElement("div",{className:(0,i.Z)("file-progress",A,$)},a.ZP.createElement(m.Z,{progress:w,size:P?"s":"m",onClick:C?I:void 0})),I&&a.ZP.createElement("i",{className:(0,i.Z)("action-icon",k||"icon-download",L&&"hidden")})),a.ZP.createElement("div",{className:"file-info"},a.ZP.createElement("div",{className:"file-title",dir:"auto"},(0,d.Z)(t)),a.ZP.createElement("div",{className:"file-subtitle",dir:"auto"},a.ZP.createElement("span",null,y&&w?`${Math.round(100*w)}%`:F),p&&a.ZP.createElement("span",{className:"file-sender"},(0,d.Z)(p)),!p&&v&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"bullet"}),a.ZP.createElement(h.Z,{onClick:T},(0,o.ZK)(M,1e3*v,!0))))),p&&v&&a.ZP.createElement(h.Z,{onClick:T},(0,o.VX)(M,1e3*v)))}))},8799:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(5116),s=n(1713),i=n(2858),o=n(1638),c=n(2340),l=n(9107),d=n(172),u=n(9411),m=n(8729);const h=(0,a.X$)((0,r.c$)(((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=(0,o.Z1)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?(0,o.YK)(e,a):void 0,areMessagesLoaded:Boolean((0,o.Zw)(e,t))}}))((({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:o,withFullInfo:h,withUpdatingStatus:f,withChatType:v,noRtl:p,chat:g,onlineCount:Z,areMessagesLoaded:E,lastSyncTime:P})=>{const{loadFullChat:y,openMediaViewer:C}=(0,r.uC)(),b=g&&(0,i.ZV)(g),{id:N,isMin:w,isRestricted:k}=g||{};(0,a.d4)((()=>{N&&!w&&h&&P&&y({chatId:N})}),[N,w,P,h,y,b]);const I=(0,a.I4)(((e,n)=>{g&&n&&(e.stopPropagation(),C({avatarOwnerId:g.id,origin:"jumbo"===t?s.bZ.ProfileAvatar:s.bZ.MiddleHeaderAvatar}))}),[g,t,C]),T=(0,l.Z)();if(g)return a.ZP.createElement("div",{className:"ChatInfo",dir:!p&&T.isRtl?"rtl":void 0},a.ZP.createElement(d.Z,{key:g.id,size:t,chat:g,onClick:n?I:void 0}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},(0,c.Z)((0,i.U)(T,g))),g.isVerified&&a.ZP.createElement(u.Z,null)),function(){if(f&&!E&&!k)return a.ZP.createElement("span",{className:"status",dir:"auto"},T("Updating"));if(!g)return;if(e)return a.ZP.createElement(m.Z,{typingStatus:e});if(v)return a.ZP.createElement("div",{className:"status",dir:"auto"},T((0,i.l6)(g)));const t=o?g.username:void 0,n=function(e,t){const n=e((0,i.l6)(t)),{membersCount:a}=t;return t.isRestricted?"Channel"===n?"channel is inaccessible":"group is inaccessible":a?e("Channel"===n?"Subscribers":"Members",a,"i"):n}(T,g),r=Z?`, ${T("OnlineCount",Z,"i")}`:void 0;return a.ZP.createElement("div",{className:"status"},t&&a.ZP.createElement("span",{className:"handle"},t),a.ZP.createElement("span",{className:"group-status"},n),r&&a.ZP.createElement("span",{className:"online-status"},r))}()))})))},6844:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(790),s=n(9107),i=n(8018);const o=(0,a.X$)((({message:e,outgoingStatus:t})=>{const n=(0,s.Z)();return a.ZP.createElement("div",{className:"LastMessageMeta"},t&&a.ZP.createElement(i.Z,{status:t}),a.ZP.createElement("span",{className:"time"},(0,r.VX)(n,1e3*e.date)))}))},3709:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(790),s=n(3227),i=n(2858),o=n(6752),c=n(6202),l=n(692);const d=(0,a.X$)((({message:e,idPrefix:t="shared-media",isProtected:n,onClick:d})=>{const u=(0,a.I4)((()=>{d(e.id,e.chatId)}),[e.id,e.chatId,d]),m=(0,i.DH)(e),h=(0,c.Z)((0,i.Ti)(e,"pictogram")),f=(0,l.Z)(h),v=(0,i.b7)(e);return a.ZP.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:d?u:void 0},a.ZP.createElement("img",{src:m,alt:"",draggable:!n,onContextMenu:n?s.Z:void 0}),a.ZP.createElement("img",{src:h,className:(0,o.Z)("full-media",f),alt:"",draggable:!n,onContextMenu:n?s.Z:void 0}),v&&a.ZP.createElement("span",{className:"video-duration"},v.isGif?"GIF":(0,r.k9)(v.duration)),n&&a.ZP.createElement("span",{className:"protector"}))}))},8018:(e,t,n)=>{n.d(t,{Z:()=>i});var a,r=n(4050),s=n(2255);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));const i=(0,r.X$)((({status:e})=>r.ZP.createElement("div",{className:"MessageOutgoingStatus"},r.ZP.createElement(s.Z,{name:"reveal",activeKey:a[e]},(()=>r.ZP.createElement("i",{className:`icon-message-${e}`}))))))},7262:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(6752),s=n(1212),i=n(2340),o=n(9107);const c=(0,a.X$)((({text:e="Nothing found.",description:t})=>{const n=(0,o.Z)(),{transitionClassNames:c}=(0,s.Z)(!0);return a.ZP.createElement("div",{className:(0,r.Z)("NothingFound",c,t&&"with-description")},e,t&&a.ZP.createElement("p",{className:"description"},(0,i.Z)(n(t),["br"])))}))},1820:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(2858),s=n(1273),i=n(4605),o=n(7687),c=n(1876),l=n(6058),d=n(8799),u=n(9187),m=n(7407),h=n(9107),f=n(4288);const v=(0,a.X$)((({itemIds:e,selectedIds:t,filterValue:n,filterPlaceholder:v,notFoundText:p,searchInputId:g,isLoading:Z,noScrollRestore:E,onSelectedIdsChange:P,onFilterChange:y,onLoadMore:C})=>{const b=(0,a.sO)(null),N=t.length>10;(0,a.d4)((()=>{setTimeout((()=>{requestAnimationFrame((()=>{b.current.focus()}))}),500)}),[]);const w=(0,a.I4)((e=>{const n=[...t];n.includes(e)?n.splice(n.indexOf(e),1):n.push(e),P(n),y("")}),[t,P,y]),k=(0,a.I4)((e=>{const{value:t}=e.currentTarget;y(t)}),[y]),[I,T]=(0,m.Z)(C,e,Boolean(n)),M=(0,h.Z)();return a.ZP.createElement("div",{className:"Picker"},a.ZP.createElement("div",{className:"picker-header custom-scroll",dir:M.isRtl?"rtl":void 0},t.map(((e,n)=>a.ZP.createElement(u.Z,{chatOrUserId:e,isMinimized:N&&na.ZP.createElement(c.Z,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>w(e),ripple:!0},a.ZP.createElement(i.Z,{label:"",checked:t.includes(e)}),(0,r.YC)(e)?a.ZP.createElement(l.Z,{userId:e}):a.ZP.createElement(d.Z,{chatId:e}))))):Z||!I||I.length?a.ZP.createElement(f.Z,null):a.ZP.createElement("p",{className:"no-results"},p||"Sorry, nothing found."))}))},9187:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),c=n(6752),l=n(9107),d=n(172);const u=(0,a.X$)((0,r.c$)(((e,{chatOrUserId:t})=>t?{chat:t?(0,s.Z1)(e,t):void 0,user:(0,i.YC)(t)?(0,s.dy)(e,t):void 0}:{}))((({icon:e,title:t,isMinimized:n,canClose:r,onClick:s,clickArg:u,chat:m,user:h,className:f})=>{const v=(0,l.Z)();let p,g;if(e&&t)p=a.ZP.createElement("div",{className:"item-icon"},a.ZP.createElement("i",{className:`icon-${e}`})),g=t;else if(m||h){p=a.ZP.createElement(d.Z,{chat:m,user:h,size:"small",isSavedMessages:null==h?void 0:h.isSelf});const e=!m||h&&!h.isSelf?(0,i.Vl)(h):(0,i.U)(v,m,h);g=e?(0,o.Z)(e):void 0}const Z=(0,c.Z)("PickerSelectedItem",f,n&&"minimized",r&&"closeable");return a.ZP.createElement("div",{className:Z,onClick:()=>s(u),title:n?g:void 0,dir:v.isRtl?"rtl":void 0},p,!n&&a.ZP.createElement("div",{className:"item-name",dir:"auto"},g),r&&a.ZP.createElement("div",{className:"item-remove"},a.ZP.createElement("i",{className:"icon-close"})))})))},6058:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(5116),s=n(1713),i=n(1638),o=n(2858),c=n(2340),l=n(9107),d=n(172),u=n(9411),m=n(8729);const h=(0,a.X$)((0,r.c$)(((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a,serverTimeOffset:r}=e,s=(0,i.dy)(e,t);return{lastSyncTime:a,user:s,userStatus:(0,i.ss)(e,t),isSavedMessages:!n&&s&&s.isSelf,areMessagesLoaded:Boolean((0,i.Zw)(e,t)),serverTimeOffset:r}}))((({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:i,withUsername:h,withFullInfo:f,withUpdatingStatus:v,noStatusOrTyping:p,noRtl:g,user:Z,userStatus:E,isSavedMessages:P,areMessagesLoaded:y,lastSyncTime:C,serverTimeOffset:b})=>{const{loadFullUser:N,openMediaViewer:w}=(0,r.uC)(),{id:k}=Z||{},I=(0,o.Js)(Z);(0,a.d4)((()=>{f&&C&&k&&N({userId:k})}),[k,N,C,f]);const T=(0,a.I4)(((e,n)=>{Z&&n&&(e.stopPropagation(),w({avatarOwnerId:Z.id,origin:"jumbo"===t?s.bZ.ProfileAvatar:s.bZ.MiddleHeaderAvatar}))}),[Z,t,w]),M=(0,l.Z)();if(Z)return a.ZP.createElement("div",{className:"ChatInfo",dir:!g&&M.isRtl?"rtl":void 0},a.ZP.createElement(d.Z,{key:Z.id,size:t,user:Z,isSavedMessages:P,onClick:i?T:void 0}),a.ZP.createElement("div",{className:"info"},P?a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",null,M("SavedMessages"))):a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},I&&(0,c.Z)(I)),(null==Z?void 0:Z.isVerified)&&a.ZP.createElement(u.Z,null)),(n||!P&&!p)&&(n?a.ZP.createElement("span",{className:"status",dir:"auto"},n):v&&!y?a.ZP.createElement("span",{className:"status",dir:"auto"},M("Updating")):Z?e?a.ZP.createElement(m.Z,{typingStatus:e}):a.ZP.createElement("div",{className:"status "+((0,o.kM)(Z,E)?"online":"")},h&&Z.username&&a.ZP.createElement("span",{className:"handle"},Z.username),a.ZP.createElement("span",{className:"user-status",dir:"auto"},(0,o.Tq)(M,Z,E,b))):void 0)))})))},787:(e,t,n)=>{n.d(t,{Z:()=>b});var a=n(4050),r=n(5116),s=n(1713),i=n(7361),o=n(1638),c=n(2858),l=n(2340),d=n(1174),u=n(6752),m=n(6137),h=n(647),f=n(9107),v=n(9411),p=n(2155),g=n(6202),Z=n(2937),E=n(7204),P=n(9204);const y=(0,a.X$)((({chat:e,user:t,photo:n,isFirstPhoto:r,isSavedMessages:s,lastSyncTime:i,onClick:o})=>{const d=(0,f.Z)(),h=t&&(0,c.NB)(t),v=e&&(0,c.pK)(e.id);function y(a,r){if(n&&!r)return`photo${n.id}?size=c`;let i;return s||h||v||(t?i=(0,c.RT)(t,a):e&&(i=(0,c.RT)(e,a))),i}const C=(0,g.Z)(y("big"),!1,m.IU.BlobUrl,i),b=r&&!C?y("normal",!0):void 0,N=(0,g.Z)(b,!1,m.IU.BlobUrl,i),w=(0,Z.Z)(!C&&n&&n.thumbnail&&n.thumbnail.dataUri),k=C||N||w,I=(0,E.Z)(k);let T="";if(s)T=a.ZP.createElement("i",{className:"icon-avatar-saved-messages"});else if(h)T=a.ZP.createElement("i",{className:"icon-avatar-deleted-account"});else if(v)T=a.ZP.createElement("i",{className:"icon-reply-filled"});else if(k)T=a.ZP.createElement("img",{src:k,className:"avatar-media",alt:"",decoding:"async"});else if(!k&&t){const e=(0,c.Js)(t);T=e?(0,p.Xv)(e,2):void 0}else if(!k&&e){const t=(0,c.U)(d,e);T=t&&(0,p.Xv)(t,(0,c.YC)(e.id)?2:1)}else T=a.ZP.createElement("div",{className:"spinner-wrapper"},a.ZP.createElement(P.Z,{color:"white"}));const M=(0,u.Z)("ProfilePhoto",`color-bg-${(0,c.Rs)(t||e)}`,s&&"saved-messages",h&&"deleted-account",v&&"replies-bot-account",!s&&!k&&"no-photo");return a.ZP.createElement("div",{className:M,onClick:k?o:void 0},I&&k&&I!==k&&a.ZP.createElement("img",{src:I,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof T?(0,l.Z)(T,["hq_emoji"]):T)}));var C=n(2255);const b=(0,a.X$)((0,r.c$)(((e,{userId:t,forceShowSelf:n})=>{const{connectionState:a,serverTimeOffset:r}=e,s=(0,o.dy)(e,t),i=(0,o.ss)(e,t),c=(0,o.Z1)(e,t),l=!n&&s&&s.isSelf,{animationLevel:d}=e.settings.byKey;return{connectionState:a,user:s,userStatus:i,chat:c,isSavedMessages:l,animationLevel:d,serverTimeOffset:r}}))((({forceShowSelf:e,user:t,userStatus:n,chat:o,isSavedMessages:p,connectionState:g,animationLevel:Z,serverTimeOffset:E})=>{var P;const{loadFullUser:b,openMediaViewer:N}=(0,r.uC)(),w=(0,f.Z)(),{id:k}=t||{},{id:I}=o||{},T=t?(0,c.Js)(t):o?o.title:"",M=(null==t?void 0:t.photos)||(null==o?void 0:o.photos)||[],S=Z>=1?w.isRtl?"slide-optimized-rtl":"slide-optimized":"none",[x,L]=(0,a.eJ)(0),$=p||M.length<=1||0===x,A=p||M.length<=1||x===M.length-1;(0,a.d4)((()=>{x>M.length&&L(Math.max(0,M.length-1))}),[x,M.length]),(0,a.d4)((()=>{"connectionStateReady"===g&&k&&!e&&b({userId:k})}),[k,b,g,e]),function(e,t,n){(0,a.d4)((()=>{t.slice(n,n+4).forEach((e=>{h.UV(`photo${e.id}?size=c`)||h.he(`photo${e.id}?size=c`,m.IU.BlobUrl)}))}),[n,t])}(0,M,x);const F=(0,a.I4)((()=>{N({avatarOwnerId:k||I,profilePhotoIndex:x,origin:e?s.bZ.SettingsAvatar:s.bZ.ProfileAvatar})}),[N,k,I,x,e]),O=(0,a.I4)((()=>{$||L(x-1)}),[x,$]),R=(0,a.I4)((()=>{A||L(x+1)}),[x,A]);if((0,a.d4)((()=>{const e=document.querySelector(".photo-wrapper");if(e)return(0,d.s)(e,{selectorToPreventScroll:".Profile, .settings-content",onSwipe:i.$b?(e,t)=>t===d.e.Right?(O(),!0):t===d.e.Left&&(R(),!0):void 0})}),[R,O]),!t&&!o)return;function D(){const e=!p&&M&&M.length>0?M[x]:void 0;return a.ZP.createElement(y,{key:x,user:t,chat:o,photo:e,isSavedMessages:p,isFirstPhoto:$,onClick:F})}const U=null===(P=t||o)||void 0===P?void 0:P.isVerified;return a.ZP.createElement("div",{className:(0,u.Z)("ProfileInfo",e&&"self"),dir:w.isRtl?"rtl":void 0},a.ZP.createElement("div",{className:"photo-wrapper"},function(){if(!(p||!M||M.length<=1))return a.ZP.createElement("div",{className:"photo-dashes"},M.map(((e,t)=>a.ZP.createElement("span",{className:"photo-dash "+(t===x?"current":"")}))))}(),a.ZP.createElement(C.Z,{activeKey:x,name:S,className:"profile-slide-container"},D),!$&&a.ZP.createElement("button",{type:"button",className:"navigation prev","aria-label":w("AccDescrPrevious"),onClick:O}),!A&&a.ZP.createElement("button",{type:"button",className:"navigation next","aria-label":w("Next"),onClick:R})),a.ZP.createElement("div",{className:"info",dir:w.isRtl?"rtl":"auto"},p?a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},w("SavedMessages"))):a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},T&&(0,l.Z)(T)),U&&a.ZP.createElement(v.Z,null)),!p&&(t?a.ZP.createElement("div",{className:"status "+((0,c.kM)(t,n)?"online":"")},a.ZP.createElement("span",{className:"user-status",dir:"auto"},(0,c.Tq)(w,t,n,E))):a.ZP.createElement("span",{className:"status",dir:"auto"},(0,c.eA)(o)?w("Subscribers",null!==(B=o.membersCount)&&void 0!==B?B:0,"i"):w("Members",null!==(V=o.membersCount)&&void 0!==V?V:0,"i")))));var B,V})))},8198:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(5116),s=n(6137),i=n(6202),o=n(6752);const c=(0,a.X$)((({reaction:e,ref:t,className:n})=>{var c,l,d;const u=null===(c=(0,r.Rd)().availableReactions)||void 0===c||null===(l=c.find((t=>t.reaction===e)))||void 0===l||null===(d=l.staticIcon)||void 0===d?void 0:d.id,m=(0,i.Z)(`document${u}`,!u,s.IU.BlobUrl);return a.ZP.createElement("img",{className:(0,o.Z)("ReactionStaticEmoji",n),ref:t,src:m,alt:""})}))},3547:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(6137),s=n(3657),i=n(6202),o=n(1212),c=n(706),l=n(6752),d=n(386),u=n(7799),m=n(231);const h=(0,a.X$)((({sticker:e,size:t,observeIntersection:n,noAnimate:h,title:f,className:v,onClick:p,clickArg:g,onUnfaveClick:Z})=>{const E=(0,a.sO)(null),P=`sticker${e.id}`,y=`sticker-button-${e.id}`,C=(0,s.Op)(E,n),b=e.thumbnail?e.thumbnail.dataUri:void 0,N=(0,i.Z)(`${P}?size=m`,!C,r.IU.BlobUrl),w=C&&!h,k=(0,i.Z)(e.isAnimated&&P,!w,r.IU.Lottie),[I,T,M]=(0,c.Z)(Boolean(k)),S=I&&w,{transitionClassNames:x}=(0,o.Z)(Boolean(N||S),void 0,void 0,"slow");(0,a.d4)((()=>{w||M()}),[M,w]);const L=(0,l.Z)("StickerButton",p&&"interactive",e.isAnimated&&"animated",y,v),$=b&&!S?`background-image: url('${b}');`:"";return a.ZP.createElement("div",{ref:E,className:L,title:f||(null==e?void 0:e.emoji),style:$,"data-sticker-id":e.id,onMouseDown:d.b,onClick:function(){p&&p(g)}},!S&&a.ZP.createElement("img",{src:N,className:x}),w&&k&&a.ZP.createElement(u.Z,{id:P,animationData:k,play:!0,size:t,isLowPriority:!0,onLoad:T}),Z&&a.ZP.createElement(m.Z,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),Z(e)}},a.ZP.createElement("i",{className:"icon-close"})))}))},4851:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"StickerSetModal",!t);return n?a.ZP.createElement(n,e):void 0}))},8729:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),c=n(9107);const l=(0,a.X$)((0,r.c$)(((e,{typingStatus:t})=>t.userId?{typingUser:(0,s.dy)(e,t.userId)}:{}))((({typingStatus:e,typingUser:t})=>{const n=(0,c.Z)(),r=t&&!t.isSelf&&(0,i.Vl)(t);return a.ZP.createElement("p",{className:"typing-status",dir:n.isRtl?"rtl":"auto"},r&&a.ZP.createElement("span",{className:"sender-name",dir:"auto"},(0,o.Z)(r)),n(e.action).replace("{user}","").replace("{emoji}",e.emoji).trim(),a.ZP.createElement("span",{className:"ellipsis"}))})))},9411:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=()=>a.ZP.createElement("span",{className:"VerifiedIcon"})},5418:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(2858),s=n(6752),i=n(8035),o=n(2340),c=n(790),l=n(9107),d=n(3709),u=n(8033),m=n(88);const h=(0,a.X$)((({message:e,senderTitle:t,isProtected:n,onMessageClick:h})=>{const f=(0,l.Z)();let v=(0,r.s1)(e);if(!v){const t=(0,r.T7)(e);if(t){const{url:n,domain:a}=t,s=(0,r.MK)(f,e);v={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?`mailto:${n}`:`http://${n}`,description:s!==n?s:void 0}}}const p=(0,a.I4)((()=>{h(e.id,e.chatId)}),[h,e.id,e.chatId]);if(!v)return;const{siteName:g,url:Z,displayUrl:E,title:P,description:y,photo:C,video:b}=v,N=!t&&(0,i.Z)(y,170),w=(0,s.Z)("WebLink scroll-item",!C&&!b&&"without-media");return a.ZP.createElement("div",{className:w,"data-initial":(g||E)[0],dir:f.isRtl?"rtl":void 0},C&&a.ZP.createElement(d.Z,{message:e,isProtected:n}),a.ZP.createElement("div",{className:"content"},a.ZP.createElement(u.Z,{isRtl:f.isRtl,className:"site-title",onClick:p},(0,o.Z)(P||g||E)),N&&a.ZP.createElement(u.Z,{isRtl:f.isRtl,className:"site-description",onClick:p},(0,o.Z)(N)),a.ZP.createElement(m.Z,{url:Z,className:"site-name",text:"",isRtl:f.isRtl},Z.replace("mailto:","")||E),t&&a.ZP.createElement("div",{className:"sender-name"},(0,o.Z)(t))),t&&a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(u.Z,{className:"date",onClick:p,isRtl:f.isRtl},(0,c.VX)(f,1e3*e.date))))}))},4399:(e,t,n)=>{n.d(t,{L6:()=>o,Gw:()=>c,Rj:()=>l,vY:()=>d,wB:()=>u,kc:()=>p,fM:()=>Z,Eh:()=>E,GC:()=>P,W7:()=>y,lE:()=>C,Wr:()=>b,PA:()=>N,jg:()=>w});var a=n(3716),r=n(7361),s=n(3858),i=n(2858);const o="(max-height: 640px)",c=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=240,d={width:640,height:640},u="4986041492570112461",m={width:100,height:100};let h,f,v;function p(e,t,n,a){const i=t||n?1.625:0;return(function(e,t){const n=e?30:29;if(!r.wB)return n;const{width:a}=s.Z.get();return h||(h=Math.min(30,a/c-4.5)),f||(f=Math.min(29,a/c-7)),v||(v=Math.min(29,a/c-4.5)),e?h:t?v:f}(e,a)-i)*c}function g({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:s,noAvatars:i}){const o=t/e,l=p(n,a,r,i),d=function(e,t){return e&&t&&t>=.75&&t<=1.25?20*c:27*c}(s,o),u=s?Math.max(300,e):e;return w(l,d,u,s?t*(u/e):t)}function Z(e,t){const n=window.matchMedia(o),{width:a,height:r}=s.Z.get();let i=t&&n.matches?10:8.25;return e&&(i=n.matches?10:15),{width:a,height:r-i*c}}function E(e,t,n,a,r){const{width:s,height:o}=(0,i.HV)(e)||m;return g({width:s,height:o,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:a,noAvatars:r})}function P(e,t,n,a){const{width:r,height:s}=(0,i.jC)(e)||m;return g({width:r,height:s,fromOwnMessage:t,isForwarded:n,isGif:e.isGif,noAvatars:a})}function y(){return{width:2*c,height:2*c}}function C(e){return e?{width:3*c,height:3*c}:{width:3.375*c,height:3.375*c}}function b(e){const{width:t}=e;let{height:n}=e;e.id===u&&(n=t);const s=n&&t&&n/t,i=c*(r.wB?a.w7:a.K7),o=s?i*s:i;return s&&o>i?{width:Math.round(i/s),height:i}:{width:i,height:o}}function N({width:e,height:t},n,a=!1){const{width:r,height:s}=Z(n,a);return w(r,s,e,t)}function w(e,t,n,a){const r=a/n,s=Math.min(n,e);return Math.round(s*r)>t?{width:Math.round(t/r),height:t}:{width:s,height:Math.round(s*r)}}},935:(e,t,n)=>{n.d(t,{X:()=>d,H:()=>h});var a=n(4050),r=n(5116),s=n(6137),i=n(2858),o=n(2340),c=n(7373),l=n(88);function d(e,t,n){const a=e.content.text;if(!a||!a.text){const t=(0,i.UD)(e);return t?[t]:void 0}const{text:r,entities:s}=a;return h(r,s,t,n)}function u(e,t,n,a){const{offset:r,length:s}=e,i=new Set([t]);if(a.has(t))return;const o=[];return n.filter(((e,n)=>n>t&&e.offset>=r&&e.offsetu(e,n.indexOf(e),n,a))).filter(Boolean).forEach((e=>{let t=!1;e.organizedIndexes.forEach((e=>{t||i.has(e)||(t=!0),i.add(e)})),t&&o.push(e)})),{entity:e,organizedIndexes:i,nestedEntities:o}}function m(e){const t=new Set,n=[];return e.forEach(((a,r)=>{if(t.has(r))return;const s=u(a,r,e,t);s&&(s.organizedIndexes.forEach((e=>{t.add(e)})),n.push(s))})),n}function h(e,t,n,r,i){if(!t||!t.length)return f(e,n,r,i);const d=[];let u=!1;const h=m(t);function Z(t,d,m,h){const E=[],{entity:P,nestedEntities:y}=m,{offset:C,length:b,type:N}=P;let w=e.substring(t,C);const k=w.length;w&&(u&&w.length>0&&"\n"===w[0]&&(w=w.substr(1),u=!1),w&&E.push(...f(w,n,r,i)));const I=t+k,T=I+b;let M=e.substring(C,C+b);const S=[];if(u&&M.length>0&&"\n"===M[0]&&(M=M.substr(1),u=!1),N===s.Vv.Pre&&(u=!0),y.length){let e=I;y.forEach(((t,n)=>{const{renderResult:a,entityEndIndex:r}=Z(e,T,t,n===y.length-1);S.push(...a),e=r}))}const x=i?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):(0,o.Z)(t,["escape_html","emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case s.Vv.Bold:return`${r}`;case s.Vv.Italic:return`${r}`;case s.Vv.Underline:return`${r}`;case s.Vv.Code:return`${r}`;case s.Vv.Pre:return`\`\`\`
${r}
\`\`\``;case s.Vv.Strike:return`${r}`;case s.Vv.MentionName:return`${r}`;case s.Vv.Url:case s.Vv.TextUrl:return`${r}`;default:return r}}(P,M,S):function(e,t,n){const r="string"==typeof t&&t,i=n.length?n:t;if(!r)return f(i);switch(e.type){case s.Vv.Bold:return a.ZP.createElement("strong",null,f(i));case s.Vv.Blockquote:return a.ZP.createElement("blockquote",null,f(i));case s.Vv.BotCommand:return a.ZP.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Hashtag:case s.Vv.Cashtag:return a.ZP.createElement("a",{onClick:g,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Code:return a.ZP.createElement("code",{className:"text-entity-code"},f(i));case s.Vv.Email:return a.ZP.createElement("a",{href:`mailto:${r}`,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Italic:return a.ZP.createElement("em",null,f(i));case s.Vv.MentionName:return a.ZP.createElement(c.Z,{userId:e.userId},f(i));case s.Vv.Mention:return a.ZP.createElement(c.Z,{username:r},f(i));case s.Vv.Phone:return a.ZP.createElement("a",{href:`tel:${r}`,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Pre:return a.ZP.createElement("pre",{className:"text-entity-pre"},f(i));case s.Vv.Strike:return a.ZP.createElement("del",null,f(i));case s.Vv.TextUrl:case s.Vv.Url:return a.ZP.createElement(l.Z,{url:v(r,e),text:r},f(i));case s.Vv.Underline:return a.ZP.createElement("ins",null,f(i));default:return f(i)}}(P,M,S);if(Array.isArray(x)?E.push(...x):E.push(x),h&&T0&&"\n"===t[0]&&(t=t.substring(1)),t&&E.push(...f(t,n,r,i))}return{renderResult:E,entityEndIndex:T}}let E=0;return h.forEach(((t,n)=>{const{renderResult:a,entityEndIndex:r}=Z(E,e.length,t,n===h.length-1);d.push(...a),E=r})),d}function f(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach((e=>{r.push(...f(e,t,n,a))})),r}if(a)return(0,o.Z)(e,["escape_html","emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?(0,o.Z)(e,[r,"br","highlight"],{highlight:t}):(0,o.Z)(e,[r,"br"])}function v(e,t){const{type:n,url:a}=t;return n===s.Vv.TextUrl&&a?a:e}function p(e){(0,r.uC)().sendBotCommand({command:e.currentTarget.innerText})}function g(e){(0,r.uC)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),(0,r.uC)().searchTextMessagesLocal()}},5296:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(4753),s=n(5116),i=n(6202),o=n(706),c=n(1638);const l={large:160,medium:128,small:104};function d(e,t,n,d,u,m,h,f){const{interactWithAnimatedEmoji:v,sendEmojiInteraction:p,sendWatchingEmojiInteraction:g}=(0,s.uC)(),Z=h||f,[E,P]=(0,o.Z)(),y=(0,a.sO)(null),C=(0,a.sO)(null),b=(0,i.Z)(d?`document${d}`:void 0,!d),N=l[e],w=`width: ${N}px; height: ${N}px;`,[k,I]=(0,a.eJ)(String(Math.random())),T=(0,a.sO)(void 0),M=(0,a.sO)(void 0),S=(0,a.I4)((()=>{y.current&&(p({chatId:t,messageId:n,localEffect:h,emoji:f,interactions:T.current}),M.current=void 0,T.current=void 0)}),[p,t,n,h,f]),x=(0,a.I4)((()=>{I(String(Math.random()));const e=C.current;b&&(e&&(e.pause(),e.remove()),C.current=new Audio,C.current.src=b,(0,r.Z)(C.current),C.current.addEventListener("ended",(()=>{C.current=void 0}),{once:!0}))}),[b]),L=(0,a.I4)((()=>{x();const e=y.current;if(!(Z&&e&&n&&t))return;const{x:a,y:r}=e.getBoundingClientRect();v({localEffect:h,emoji:f,x:a,y:r,startSize:N,isReversed:!m}),T.current||(T.current=[],M.current=performance.now(),setTimeout(S,1e3)),T.current.push(M.current?(performance.now()-M.current)/1e3:0)}),[t,f,Z,v,m,h,n,x,S,N]);return(0,a.d4)((()=>{const e=y.current;if(!e||!u)return;const{messageId:a,endX:r,endY:s}=u;if(!r&&!s&&a===n){const{x:n,y:a}=e.getBoundingClientRect();g({chatId:t,emoticon:h?(0,c.ji)(h):f,startSize:N,x:n,y:a,isReversed:!m}),x()}}),[u,t,f,m,h,n,x,g,N]),{playKey:k,ref:y,style:w,width:N,handleClick:L,markAnimationLoaded:P,isAnimationLoaded:E}}},742:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"ChatFolderModal",!t);return n?a.ZP.createElement(n,e):void 0}))},1080:(e,t,n)=>{n.d(t,{Z:()=>X});var a=n(4050),r=n(5116),s=n(3716),i=n(7361),o=n(7204),c=n(782),l=n(2858),d=n(1638),u=n(7407);let m;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(m||(m={}));var h=n(1273),f=n(4288),v=n(9107),p=n(6137),g=n(8005),Z=n(2340),E=n(9118),P=n(6752),y=n(5790),C=n(1470),b=n(706),N=n(6202),w=n(172),k=n(9411),I=n(8729),T=n(6844),M=n(329),S=n(1876),x=n(2155),L=n(126);const $=(0,a.X$)((({chat:e,isPinned:t,isMuted:n})=>{const r=Boolean(e.unreadCount||e.hasUnreadMark||t),s=(0,P.Z)("Badge",n&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function i(){return e.unreadCount?e.unreadMentionsCount?a.ZP.createElement("div",{className:"Badge-wrapper"},a.ZP.createElement("div",{className:"Badge mention"},a.ZP.createElement("i",{className:"icon-mention"})),a.ZP.createElement("div",{className:s},(0,x.bi)(e.unreadCount))):a.ZP.createElement("div",{className:s},(0,x.bi)(e.unreadCount)):e.hasUnreadMark?a.ZP.createElement("div",{className:s}):t?a.ZP.createElement("div",{className:s},a.ZP.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.ZP.createElement(L.Z,{isCustom:!0,className:"Badge-transition",isOpen:r},i)}));var A=n(742);const F=(0,a.X$)((({isSelected:e,isActive:t})=>a.ZP.createElement("div",{className:(0,P.Z)("ChatCallStatus",t&&"active",e&&!i.wB&&"selected")},a.ZP.createElement("div",{className:"indicator"},a.ZP.createElement("div",null),a.ZP.createElement("div",null),a.ZP.createElement("div",null))))),O=(0,a.X$)((0,r.c$)(((e,{chatId:t})=>{var n;const a=(0,d.Z1)(e,t);if(!a||!a.lastMessage)return{};const{senderId:r,replyToMessageId:s,isOutgoing:i}=a.lastMessage,o=r?(0,d.dy)(e,r):void 0,c=(0,l.N5)(a.lastMessage),u=c&&s?(0,d.hj)(e,a.id,s):void 0,{targetUserIds:m,targetChatId:h}=c||{},f=(0,l.zX)(a),{byId:v}=e.users,{chatId:g,threadId:Z,type:E}=(0,d.Bt)(e)||{},P=t===g&&Z===p._f;return{chat:a,isMuted:(0,l.i4)(a,(0,d.dZ)(e),(0,d.NJ)(e)),lastMessageSender:o,actionTargetUserIds:m,actionTargetChatId:h,actionTargetMessage:u,draft:(0,d.Ms)(e,t,p._f),animationLevel:e.settings.byKey.animationLevel,isSelected:P,canScrollDown:P&&"thread"===E,canChangeFolder:Boolean(null===(n=e.chatFolders.orderedIds)||void 0===n?void 0:n.length),lastSyncTime:e.lastSyncTime,...i&&{lastMessageOutgoingStatus:(0,d.dT)(e,a.lastMessage)},...f&&{user:(0,d.dy)(e,f),userStatus:(0,d.ss)(e,f)},...m&&{usersById:v}}}))((({style:e,chatId:t,folderId:n,orderDiff:o,animationType:c,isPinned:d,chat:u,isMuted:h,user:f,userStatus:p,actionTargetUserIds:x,usersById:L,lastMessageSender:O,lastMessageOutgoingStatus:R,actionTargetMessage:D,actionTargetChatId:U,draft:B,animationLevel:V,isSelected:X,canScrollDown:j,canChangeFolder:z,lastSyncTime:K})=>{const{openChat:Y,focusLastMessage:H}=(0,r.uC)(),q=(0,a.sO)(null),[W,_,J]=(0,b.Z)(),[G,Q,ee]=(0,b.Z)(),[te,ne,ae]=(0,b.Z)(),[re,se,ie]=(0,b.Z)(),{lastMessage:oe,typingStatus:ce}=u||{},le=oe&&(0,l.Lo)(oe);(0,y.Z)(t,le?oe.replyToMessageId:void 0,D);const de=oe&&!(0,l.bf)(oe)?(0,l.DH)(oe):void 0,ue=(0,N.Z)(oe?(0,l.Ti)(oe,"micro"):void 0),me=Boolean(oe&&(0,l.Y5)(oe)),he=(0,a.Ye)((()=>x?x.map((e=>null==L?void 0:L[e])).filter(Boolean):void 0),[x,L]);(0,a.bt)((()=>{const e=q.current;if(0!==V&&e){if(c===m.Opacity)e.style.opacity="0",(0,E.T2)((()=>{e.classList.add("animate-opacity"),e.style.opacity="1"}));else{if(c!==m.Move)return;e.style.transform=`translate3d(0, ${100*-o}%, 0)`,(0,E.T2)((()=>{e.classList.add("animate-transform"),e.style.transform=""}))}setTimeout((()=>{(0,E.T2)((()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""}))}),200+s.fK)}}),[V,o,c]);const fe=(0,a.I4)((()=>{Y({id:t,shouldReplaceHistory:!0}),X&&j&&H()}),[X,j,Y,t,H]),ve=(0,C.Z)({chat:u,user:f,handleDelete:function(){ne(),_()},handleChatFolderChange:function(){se(),Q()},folderId:n,isPinned:d,isMuted:h,canChangeFolder:z}),pe=(0,v.Z)();if(!u)return;const ge=(0,P.Z)("Chat chat-item-clickable",(0,l.YC)(t)?"private":"group",X&&"selected");return a.ZP.createElement(S.Z,{ref:q,className:ge,style:e,ripple:!i.wB,contextActions:ve,onClick:fe},a.ZP.createElement("div",{className:"status"},a.ZP.createElement(w.Z,{chat:u,user:f,userStatus:p,isSavedMessages:null==f?void 0:f.isSelf,lastSyncTime:K}),u.isCallActive&&u.isCallNotEmpty&&a.ZP.createElement(F,{isSelected:X,isActive:0!==V})),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",null,(0,Z.Z)((0,l.U)(pe,u,f))),u.isVerified&&a.ZP.createElement(k.Z,null),h&&a.ZP.createElement("i",{className:"icon-muted"}),u.lastMessage&&a.ZP.createElement(T.Z,{message:u.lastMessage,outgoingStatus:R})),a.ZP.createElement("div",{className:"subtitle"},function(){if(ce&&oe&&ce.timestamp>1e3*oe.date)return a.ZP.createElement(I.Z,{typingStatus:ce});if(null!=B&&B.text.length)return a.ZP.createElement("p",{className:"last-message",dir:pe.isRtl?"auto":"ltr"},a.ZP.createElement("span",{className:"draft"},pe("Draft")),(0,Z.Z)(B.text));if(!oe)return;if(le){const e=u&&((0,l.eA)(u)||oe.senderId===oe.chatId)?u:O;return a.ZP.createElement("p",{className:"last-message",dir:pe.isRtl?"auto":"ltr"},(0,Z.Z)((0,g.D)(pe,oe,e,he,D,U,{asPlain:!0})))}const e=(0,l.zF)(pe,t,O);return a.ZP.createElement("p",{className:"last-message",dir:pe.isRtl?"auto":"ltr"},e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"sender-name"},(0,Z.Z)(e)),a.ZP.createElement("span",{className:"colon"},":")),function(e,t,n,r){return n?a.ZP.createElement("span",{className:"media-preview"},a.ZP.createElement("img",{src:n,alt:"",className:r?"round":void 0}),(0,l.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,Z.Z)((0,l.MK)(e,t,!0))):(0,Z.Z)((0,l.MK)(e,t))}(pe,oe,ue||de,me))}(),a.ZP.createElement($,{chat:u,isPinned:d,isMuted:h}))),te&&a.ZP.createElement(M.Z,{isOpen:W,onClose:J,onCloseAnimationEnd:ae,chat:u}),re&&a.ZP.createElement(A.Z,{isOpen:G,onClose:ee,onCloseAnimationEnd:ie,chatId:t}))})));var R=n(1713),D=n(231),U=n(7854);const B=(0,a.X$)((0,r.c$)(((e,{folderId:t,folderType:n})=>({chatFolder:t&&"folder"===n?(0,d.Mw)(e,t):void 0,animatedEmoji:(0,d.zB)(e,"📂")})))((({chatFolder:e,animatedEmoji:t,foldersDispatch:n,onScreenSelect:r})=>{const s=(0,v.Z)(),o=(0,a.I4)((()=>{n({type:"editFolder",payload:e}),r(R.MT.FoldersEditFolderFromChatList)}),[e,n,r]);return a.ZP.createElement("div",{className:"EmptyFolder"},a.ZP.createElement("div",{className:"sticker"},t&&a.ZP.createElement(U.Z,{sticker:t})),a.ZP.createElement("h3",{className:"title",dir:"auto"},s("FilterNoChatsToDisplay")),a.ZP.createElement("p",{className:"description",dir:"auto"},s(e?"ChatList.EmptyChatListFilterText":"Chat.EmptyChat")),e&&n&&r&&a.ZP.createElement(D.Z,{ripple:!i.wB,fluid:!0,pill:!0,onClick:o,size:"smaller",isRtl:s.isRtl},a.ZP.createElement("i",{className:"icon-settings"}),s("ChatList.EmptyChatListEditFilter")))})));var V;!function(e){e.all="active",e.archived="archived"}(V||(V={}));const X=(0,a.X$)((0,r.c$)(((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:s},users:{byId:i},lastSyncTime:o}=e,c="folder"!==t?V[t]:void 0,l=n?(0,d.Mw)(e,n):void 0;return{allListIds:a,chatsById:r,usersById:i,lastSyncTime:o,notifySettings:(0,d.dZ)(e),notifyExceptions:(0,d.NJ)(e),...c?{listIds:a[c],orderedPinnedIds:s[c]}:{chatFolder:l}}}))((({folderType:e,folderId:t,isActive:n,allListIds:d,chatsById:v,usersById:p,listIds:g,orderedPinnedIds:Z,chatFolder:E,lastSyncTime:P,notifySettings:y,notifyExceptions:C,foldersDispatch:b,onScreenSelect:N})=>{const{loadMoreChats:w,preloadTopChatMessages:k,preloadArchivedChats:I,openChat:T,openNextChat:M}=(0,r.uC)(),[S,x]=(0,a.Ye)((()=>"folder"===e&&E?(0,l.P4)(d,v,p,E,y,C):[g,Z]),[e,E,d,v,p,y,C,g,Z]),[L,$,A]=(0,a.Ye)((()=>{if(!S||"folder"===e&&!E)return[];const t=(0,l.O)(v,S,x,e),n=[].concat(t.pinnedChats,t.otherChats),a=n.map((({id:e})=>e));return[n.reduce(((e,t,n)=>(e[t.id]=n,e)),{}),a,t]}),[S,x,e,E,v]),F=(0,o.Z)(L),R=(0,a.Ye)((()=>L&&F?(0,c.Q8)(L,((e,t)=>void 0!==F[t]?e-F[t]:-1/0)):{}),[L,F]),D=(0,a.I4)((()=>{w({listType:"archived"===e?"archived":"active"})}),[w,e]),[U,V]=(0,u.Z)(P?D:void 0,$,void 0,s.t_,"all"===e&&!s.NM),X=(0,a.Ye)((()=>{if(U&&A)return(0,l.wG)(A,U)}),[A,U]);(0,a.d4)((()=>{P&&"all"===e&&(k(),I())}),[P,e,k,I]),(0,a.d4)((()=>{if(n&&$)return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)};function e(e){if(i.fl&&(i.jm&&e.metaKey||!i.jm&&e.ctrlKey)&&e.code.startsWith("Digit")){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;const n=Number(t)-1;if(n>$.length-1)return;T({id:$[n],shouldReplaceHistory:!0})}if(e.altKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(!t)return;e.preventDefault(),M({targetIndexDelta:t,orderedIds:$})}}}),[n,T,M,$]);const j=function(e){return(0,a.Ye)((()=>{const t=Object.values(e),n=t.filter((e=>e<0)).length,a=t.filter((e=>e>0)).length;return t=>{const r=e[t];return 0===r?m.None:r===1/0||r===-1/0||n<=a&&r<0||a0?m.Opacity:m.Move}}),[e])}(R);return a.ZP.createElement(h.Z,{className:"chat-list custom-scroll",items:U,onLoadMore:V,preloadBackwards:s.t_,noFastList:!0,noScrollRestore:!0},null!=U&&U.length&&X?function(){const e=$.indexOf(U[0]),n=e+X.pinnedChats.length;return a.ZP.createElement("div",{className:"scroll-container",style:i.wZ?`height: ${$.length*s.rS}px`:void 0,teactFastList:!0},X.pinnedChats.map((({id:n},r)=>a.ZP.createElement(O,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,animationType:j(n),orderDiff:R[n],style:`top: ${(e+r)*s.rS}px;`}))),X.otherChats.map(((e,r)=>a.ZP.createElement(O,{key:e.id,teactOrderKey:(0,l.OE)(e),chatId:e.id,folderId:t,animationType:j(e.id),orderDiff:R[e.id],style:`top: ${(n+r)*s.rS}px;`}))))}():U&&!U.length?a.ZP.createElement(B,{folderId:t,folderType:e,foldersDispatch:b,onScreenSelect:N}):a.ZP.createElement(f.Z,{key:"loading"}))})))},91:(e,t,n)=>{n.d(t,{F:()=>r});var a=n(2858);function r(e,t,n,r){const{senderId:s}=t;if(!s)return;const i=(0,a.YC)(s)?r[s]:n[s];let o=(0,a.OU)(e,i);const c=n[t.chatId];return c&&((0,a.YC)(s)&&i.isSelf?o=`${e("FromYou")} → ${(0,a.U)(e,c)}`:(0,a.Bf)(c)&&(o+=` → ${(0,a.U)(e,c)}`)),o}},2420:(e,t,n)=>{n.d(t,{t:()=>d,Z:()=>u});var a=n(4050),r=n(1212),s=n(6752),i=n(3989),o=n(7204),c=n(706);const l=(0,a.X$)((({isQuick:e,onFileSelect:t})=>{const[n,r,i]=(0,c.Z)(),o=(0,s.Z)("DropTarget",n&&"hovered");return a.ZP.createElement("div",{className:o,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),i()}},a.ZP.createElement("div",{className:"target-content"},a.ZP.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.ZP.createElement("div",{className:"title"},"Drop files here to send them"),a.ZP.createElement("div",{className:"description"},e?"in a quick way":"without compression")))}));let d;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(d||(d={}));const u=(0,a.X$)((({isOpen:e,withQuick:t,onHide:n,onFileSelect:c})=>{const d=(0,a.sO)(null),u=(0,o.Z)(t),{shouldRender:m,transitionClassNames:h}=(0,r.Z)(e);(0,a.d4)((()=>e?(0,i.Z)(n):void 0),[e,n]);const f=(0,a.I4)((e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),c(Array.from(t.files),!1))}),[c,n]),v=(0,a.I4)((e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),c(Array.from(t.files),!0))}),[c,n]),p=(0,a.I4)((e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(d.current=window.setTimeout((()=>{n()}),150))}),[n]);if(!m)return;const g=(0,s.Z)("DropArea",h);return a.ZP.createElement("div",{className:g,onDragLeave:p,onDragOver:()=>{d.current&&window.clearTimeout(d.current)},onDrop:n},a.ZP.createElement(l,{onFileSelect:f}),(t||u)&&a.ZP.createElement(l,{onFileSelect:v,isQuick:!0}))}))},9830:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"EmojiTooltip",!t);return n?a.ZP.createElement(n,e):void 0}))},3616:(e,t,n)=>{n.d(t,{Z:()=>C});var a=n(4050),r=n(5116),s=n(3716),i=n(1638),o=n(9118),c=n(5723),l=n(6752),d=n(7361),u=n(517),m=n(2645),h=n(706),f=n(8674),v=n(6389),p=n(9107),g=n(4784),Z=n(6391),E=n(2340),P=n(3283);const y=d.wB?256:416,C=(0,a.X$)((0,r.c$)(((e,{chatId:t,threadId:n})=>{const{messageSendKeyCombo:a}=e.settings.byKey;return{messageSendKeyCombo:a,replyingToId:t&&n?(0,i.Yy)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}}))((({id:e,chatId:t,threadId:n,isAttachmentModalInput:i,editableInputId:C,html:b,placeholder:N,forcedPlaceholder:w,canAutoFocus:k,shouldSuppressFocus:I,shouldSuppressTextFormatter:T,replyingToId:M,noTabCapture:S,messageSendKeyCombo:x,onUpdate:L,onSuppressedFocus:$,onSend:A})=>{const{editLastMessage:F,replyToNextMessage:O}=(0,r.uC)(),R=(0,a.sO)(null),D=(0,a.sO)(null),U=(0,p.Z)(),B=(0,a.sO)(!1),[V,X,j]=(0,h.Z)(),[z,K]=(0,a.eJ)(),[Y,H]=(0,a.eJ)(),q=(0,v.Z)(t,n);(0,a.d4)((()=>{i&&Q(!1)}),[i]),(0,m.Z)((([e])=>{b!==R.current.innerHTML&&(R.current.innerHTML=b),b!==D.current.innerHTML&&(D.current.innerHTML=b),void 0!==e&&e!==b&&Q(!b.length)}),[b]),(0,a.sO)(t).current=t;const W=(0,a.I4)((()=>{(0,f.zG)()?setTimeout(W,350):(0,c.Z)(R.current)}),[]),_=(0,a.I4)((()=>{j(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()}),[j]);function J(){if(d.cj)return!1;const e=window.getSelection();if(!e||!e.rangeCount||B.current)return j(),!1;const t=e.getRangeAt(0),n=t.toString().trim();return!(T||!(0,Z.R)(t,C||s.R2)||!n||(0,g.Z)(n)||!t.START_TO_END)||(j(),!1)}function G(){if(!J())return;const e=window.getSelection().getRangeAt(0),t=e.getBoundingClientRect(),n=R.current.getBoundingClientRect();let a=t.left+t.width/2-n.left;a<90?a=90:a>n.width-90&&(a=n.width-90),K({x:a,y:t.top-n.top}),H(e),X()}function Q(e=!1){const t=R.current,n=D.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,y);if(r===a)return;const s=Math.round(50*Math.log(Math.abs(r-a))),i=()=>{t.style.height=`${r}px`,t.style.transitionDuration=`${s}ms`,t.classList.toggle("overflown",n.scrollHeight>y)};e?requestAnimationFrame(i):i()}(0,a.d4)((()=>{d.$b||k&&W()}),[t,W,M,k]),(0,a.d4)((()=>{if(S)return;const e=(0,o.Ds)((e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(W))}),2e3,!0,!1);return(0,u.Z)({onTab:e})}),[W,S]),(0,a.d4)((()=>{const e=R.current;function t(){e.blur()}return I&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}}),[I]);const ee=(0,l.Z)("form-control custom-scroll",b.length>0&&"touched",I&&"focus-disabled");return a.ZP.createElement("div",{id:e,onClick:I?$:void 0,dir:U.isRtl?"rtl":void 0},a.ZP.createElement("div",{ref:R,id:C||s.R2,className:ee,contentEditable:!0,dir:"auto",onClick:W,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(L("
"===t?"":t),q({type:"typing"}),!d.$b&&(!n||!n.length)&&(d.op||!t.includes("emoji-small"))){const e=window.getSelection();e&&(R.current.blur(),e.removeAllRanges(),(0,c.Z)(R.current,!0))}},onKeyDown:function(e){if(!b.length&&(e.metaKey||e.ctrlKey)){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(t)return e.preventDefault(),void O({targetIndexDelta:t})}"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||b.length||e.metaKey||e.ctrlKey||e.altKey?e.target.addEventListener("keyup",(function t(){G(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),F()):d.cj||d.wZ||!("enter"===x&&!e.shiftKey||"ctrl-enter"===x&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),j(),A())},onMouseDown:function(e){2===e.button?!0!==B.current&&(B.current=!0,document.addEventListener("mousedown",(function e(){setTimeout((()=>{B.current=!1}),100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout((()=>{B.current=!1}),100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){G(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:d.wZ?function(e){J()&&(e.preventDefault(),e.stopPropagation())}:void 0,onTouchCancel:d.wZ?G:void 0}),a.ZP.createElement("div",{ref:D,className:(0,l.Z)(ee,"clone"),dir:"auto"}),!w&&a.ZP.createElement("span",{className:"placeholder-text",dir:"auto"},N),a.ZP.createElement(P.Z,{isOpen:V,anchorPosition:z,selectedRange:Y,setSelectedRange:H,onClose:_}),w&&a.ZP.createElement("span",{className:"forced-placeholder"},(0,E.Z)(w)))})))},3283:(e,t,n)=>{n.d(t,{Z:()=>p});var a=n(4050),r=n(3716),s=n(6752),i=n(1396),o=n(3989),c=n(7529),l=n(1212),d=n(8758),u=n(706),m=n(9107),h=n(231);const f={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"},v=document.createElement("div"),p=(0,a.X$)((({isOpen:e,anchorPosition:t,selectedRange:n,setSelectedRange:p,onClose:g})=>{const Z=(0,a.sO)(null),E=(0,a.sO)(null),{shouldRender:P,transitionClassNames:y}=(0,l.Z)(e),[C,b,N]=(0,u.Z)(),[w,k]=(0,a.eJ)(""),[I,T]=(0,a.eJ)(!1),[M,S]=(0,a.eJ)(),[x,L]=(0,a.eJ)({});(0,a.d4)((()=>e?(0,o.Z)(g):void 0),[e,g]),(0,d.Z)(e,Z,g),(0,a.d4)((()=>{C?E.current.focus():(k(""),T(!1))}),[C]),(0,a.d4)((()=>{P||(N(),L({}),S(void 0))}),[N,P]),(0,a.d4)((()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.R2;){const e=f[a.tagName];e&&(t[e]=!0),a=a.parentElement}L(t)}),[e,n,b]);const $=(0,a.I4)((()=>{const e=window.getSelection();e&&p(e.getRangeAt(0))}),[p]),A=(0,a.I4)((()=>{if(n)return v.innerText=n.toString(),v.innerHTML}),[n]),F=(0,a.I4)((()=>{if(n)return n.commonAncestorContainer.parentElement}),[n]);function O(){const e=E.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void S(void 0);let r="";a0&&(r+=" mask-left"),S(r)}function R(e){if(x[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(x).some((t=>t!==e&&!!x[t])))return"disabled"}else if(x.monospace||x.strikethrough)return"disabled"}const D=(0,a.I4)((()=>{L((e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach((t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)})),$(),{...e,bold:!e.bold})))}),[$]),U=(0,a.I4)((()=>{document.execCommand("italic"),$(),L((e=>({...e,italic:!e.italic})))}),[$]),B=(0,a.I4)((()=>{document.execCommand("underline"),$(),L((e=>({...e,underline:!e.underline})))}),[$]),V=(0,a.I4)((()=>{if(x.strikethrough){const e=F();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void L((e=>({...e,strikethrough:!1})))}const e=A();document.execCommand("insertHTML",!1,`${e}`),g()}),[F,A,g,n,x.strikethrough]),X=(0,a.I4)((()=>{if(x.monospace){const e=F();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void L((e=>({...e,monospace:!1})))}const e=A();document.execCommand("insertHTML",!1,`${e}`),g()}),[F,A,g,n,x.monospace]);function j(){const e=encodeURI((0,i.X)(w)||"");if(I){const t=F();if(!t||"A"!==t.tagName)return;return t.href=e,void g()}const t=A();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),g()}const z=(0,a.I4)((e=>{const t={k:b,b:D,u:B,i:U,m:X,s:V}[(0,c.Z)(e)];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())}),[D,U,B,X,V,b]);(0,a.d4)((()=>(e&&document.addEventListener("keydown",z),()=>document.removeEventListener("keydown",z))),[e,z]);const K=(0,m.Z)();if(!P)return;const Y=(0,s.Z)("TextFormatter",y,C&&"link-control-shown"),H=(0,s.Z)("TextFormatter-link-url-confirm",!!w.length&&"shown"),q=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.ZP.createElement("div",{ref:Z,className:Y,style:q,onKeyDown:function(e){"Enter"===e.key&&C&&(j(),e.preventDefault())}},a.ZP.createElement("div",{className:"TextFormatter-buttons"},a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Bold text",className:R("bold"),onClick:D},a.ZP.createElement("i",{className:"icon-bold"})),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Italic text",className:R("italic"),onClick:U},a.ZP.createElement("i",{className:"icon-italic"})),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Underlined text",className:R("underline"),onClick:B},a.ZP.createElement("i",{className:"icon-underlined"})),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Strikethrough text",className:R("strikethrough"),onClick:V},a.ZP.createElement("i",{className:"icon-strikethrough"})),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Monospace text",className:R("monospace"),onClick:X},a.ZP.createElement("i",{className:"icon-monospace"})),a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:K("TextFormat.AddLinkTitle"),onClick:b},a.ZP.createElement("i",{className:"icon-link"}))),a.ZP.createElement("div",{className:"TextFormatter-link-control"},a.ZP.createElement("div",{className:"TextFormatter-buttons"},a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:K("Cancel"),onClick:N},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement("div",{className:(0,s.Z)("TextFormatter-link-url-input-wrapper",M)},a.ZP.createElement("input",{ref:E,className:"TextFormatter-link-url-input",type:"text",value:w,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",dir:"auto",onChange:function(e){k(e.target.value),O()},onScroll:O})),a.ZP.createElement("div",{className:H},a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:K("Save"),className:"color-primary",onClick:j},a.ZP.createElement("i",{className:"icon-check"}))))))}))},2400:(e,t,n)=>{n.d(t,{_:()=>o});const a=/(
|)/g,r=/( |\u00A0)/g,s=/(
|<\/div>)/gi,i=/\n$/i;function o(e){return e.replace(r," ").replace(a,"\n").replace(s,"").replace(i,"")}},6391:(e,t,n)=>{function a(e,t){const{commonAncestorContainer:n}=e;let a=n,r=1;for(;a&&a.id!==t&&r<5;)a=a.parentElement,r++;return Boolean(a&&a.id===t)}n.d(t,{R:()=>a})},3575:(e,t,n)=>{n.d(t,{Z:()=>P});var a=n(4050),r=n(3716),s=n(735),i=n(2400),o=n(4284),c=n(5723),l=n(782);const d=new WeakMap;function u(e){return(...t)=>{const n=d.get(e);if(n&&(0,l.et)(n.lastArgs,t))return n.lastResult;const a=e(...t);return d.set(e,{lastArgs:t,lastResult:a}),a}}var m=n(706);let h,f,v,p;const g=u((function(e,t,n){return e&&t.length?Object.values((0,l.q0)(e,t)).slice(0,n):s.D})),Z=u((function(e,t,n){const a=Object.values(e),r=(0,l.ee)(a,"native"),s=t?(0,l.Q8)(t,(e=>Object.values((0,l.q0)(r,e)))):{},i=n?(0,l.Q8)(n,(e=>Object.values((0,l.q0)(r,e)))):{},o={...s,...i},c=[].concat(Object.keys(s),Object.keys(i)),d=a.reduce(((e,t)=>(t.names.forEach((n=>{e[n]||(e[n]=[]),e[n].push(t)})),e)),{});return{byKeyword:o,keywords:c,byName:d,names:Object.keys(d)}})),E=u((function(e,t,n){const{byKeyword:a,keywords:r,byName:i,names:o}=e;let c=s.D;const d=r.filter((e=>e.startsWith(t))).sort();c=c.concat((0,l.xH)(Object.values((0,l.q0)(a,d))));const u=o.filter((e=>e.startsWith(t)));return c=c.concat((0,l.xH)(Object.values((0,l.q0)(i,u)))),c=(0,l.Tw)(c),c.slice(0,n)}));try{p=new RegExp("(^|\\s):[-+_:\\p{L}\\p{N}]*$","gui")}catch(e){p=new RegExp("(^|\\s):[-+_:\\d\\wа-яё]*$","gi")}function P(e,t,l,d=r.R2,u,P,y,C=!1){const[b,N,w]=(0,m.Z)(),[k,I]=(0,a.eJ)(),[T,M]=(0,a.eJ)(!1),[S,x]=(0,a.eJ)(s.D);(0,a.d4)((()=>{if(C)return;const e=()=>{I(v.emojis)};v?e():async function(){return h||(h=n.e(501).then(n.t.bind(n,7501,19)),f=(await h).default,v=(0,o.NM)(f)),h}().then(e)}),[C]),(0,a.d4)((()=>{if(!e||!t||!k||C)return void w();const n=t.includes(":")&&function(e){const t=(0,i._)(e).match(p);return t?t[0].trim():void 0}(t);if(!n)return x(s.D),void w();const a=n.length>2&&n.endsWith(":"),r=n.substr(1,a?n.length-2:void 0);let o=s.D;if(M(a),r){if(r.length>=2){const e=Z(k,P,y);o=E(e,r,36)}}else o=g(k,l,36);o.length?(a||N(),x(o)):w()}),[k,t,e,N,l,w,M,C,P,y]);const L=(0,a.I4)(((e,n)=>{const a=t.lastIndexOf(":",n?t.lastIndexOf(":")-1:void 0);if(-1!==a){u(`${t.substr(0,a)}${e}`);const n=document.getElementById(d);requestAnimationFrame((()=>{(0,c.Z)(n,!0)}))}w()}),[t,d,u,w]);return(0,a.d4)((()=>{b&&T&&S.length&&L(S[0].native,!0)}),[S,L,b,T]),{isEmojiTooltipOpen:b,closeEmojiTooltip:w,filteredEmojis:S,insertEmoji:L}}},9295:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(5116),s=n(6137),i=n(3716),o=n(2858),c=n(2400),l=n(5723),d=n(706),u=n(782);const m=(0,n(9118).P2)((e=>e()),500,!0);let h;try{h=new RegExp("(^|\\s)@[-_\\p{L}\\p{M}\\p{N}]*$","gui")}catch(e){h=new RegExp("(^|\\s)@[-_\\d\\wа-яё]*$","gi")}function f(e,t,n,f=i.R2,v,p,g){const[Z,E,P]=(0,d.Z)(),[y,C]=(0,a.eJ)(),b=(0,a.I4)(((e,t)=>{const n=(0,r.Rd)().users.byId;(v||p)&&n?m((()=>{const a=null==v?void 0:v.reduce(((e,t)=>(t.userId!==g&&e.push(t.userId),e)),[]),r=(0,o.kK)((0,u.Tw)([...t&&p||[],...a||[]]),n,e);C(Object.values((0,u.q0)(n,r)))})):C(void 0)}),[g,v,p]);(0,a.d4)((()=>{if(!e||!t.length)return void P();const n=t.includes("@")&&function(e){const t=(0,c._)(e).match(h);return t?t[0].trim():void 0}(t);if(n){const e=n?n.substr(1):"";b(e,function(e){return e.startsWith("@")}(t))}else P()}),[e,t,b,E,P]),(0,a.d4)((()=>{null!=y&&y.length?E():P()}),[E,P,y]);const N=(0,a.I4)(((e,a=!1)=>{if(!e.username&&!(0,o.Vl)(e))return;const r=e.username?`@${e.username}`:`${(0,o.Vl)(e)}`,i=t.lastIndexOf("@");if(-1!==i){n(`${t.substr(0,i)}${r} `);const e=document.getElementById(f);requestAnimationFrame((()=>{(0,l.Z)(e,a)}))}P()}),[t,f,n,P]);return{isMentionTooltipOpen:Z,closeMentionTooltip:P,insertMention:N,mentionFilteredUsers:y}}},7891:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9290),s=n(5326);function i(e,t){const n=void 0===t,i=(0,a.sO)(n),o=(0,a.sO)(),c=(0,s.Z)();return(0,r.Z)((()=>{n||(i.current=!1,o.current&&(clearTimeout(o.current),o.current=void 0))}),e),(0,a.d4)((()=>{if(n||i.current)return;const e=()=>{i.current=!0,c()};t>0?o.current=window.setTimeout(e,t):e()}),e),i.current}},1218:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(4605);const s=(0,a.X$)((({id:e,options:t,selected:n=[],disabled:s,round:i,loadingOptions:o,onChange:c})=>{const[l,d]=(0,a.eJ)(n||[]),u=(0,a.I4)((e=>{const{value:t,checked:n}=e.currentTarget;let a;a=n?[...l,t]:l.filter((e=>e!==t)),d(a),c(a)}),[c,l]);return a.ZP.createElement("div",{id:e,className:"radio-group"},t.map((e=>a.ZP.createElement(r.Z,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==n.indexOf(e.value),disabled:s,round:i,isLoading:o?-1!==o.indexOf(e.value):void 0,onChange:u}))))}))},1151:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752),s=n(231);const i=({isShown:e,className:t,color:n="primary",ariaLabel:i,disabled:o,onClick:c,children:l})=>{const d=(0,r.Z)("FloatingActionButton",e&&"revealed",t);return a.ZP.createElement(s.Z,{className:d,color:n,round:!0,disabled:o,onClick:e&&!o?c:void 0,ariaLabel:i,tabIndex:-1},l)}},1876:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(7361),s=n(9118),i=n(6752),o=n(7240),c=n(3394),l=n(706),d=n(9107),u=n(8512),m=n(2328),h=n(8964),f=n(231);const v=e=>{const{ref:t,buttonRef:n,icon:v,secondaryIcon:p,className:g,style:Z,children:E,disabled:P,ripple:y,narrow:C,inactive:b,focus:N,destructive:w,multiline:k,isStatic:I,contextActions:T,onMouseDown:M,onClick:S,onSecondaryIconClick:x}=e;let L=(0,a.sO)(null);t&&(L=t);const[$,A,F]=(0,l.Z)(),{isContextMenuOpen:O,contextMenuPosition:R,handleBeforeContextMenu:D,handleContextMenu:U,handleContextMenuClose:B,handleContextMenuHide:V}=(0,o.Z)(L,!T),X=(0,a.I4)((()=>L.current),[]),j=(0,a.I4)((()=>L.current.closest(".custom-scroll")),[]),z=(0,a.I4)((()=>L.current.querySelector(".ListItem-context-menu .bubble")),[]),{positionX:K,positionY:Y,style:H}=(0,c.Z)(R,X,j,z),q=(0,a.I4)((e=>{!P&&S&&(S(e),r.$b&&!y&&(A(),(0,s.T2)(F)))}),[P,A,S,y,F]),W=(0,a.I4)((e=>{b||r.$b||(!T||2!==e.button&&S||D(e),0===e.button&&(S?q(e):U(e)))}),[b,T,S,D,U,q]),_=(0,d.Z)(),J=(0,i.Z)("ListItem",g,!I&&"no-selection",y&&"has-ripple",C&&"narrow",P&&"disabled",b&&"inactive",R&&"has-menu-open",N&&"focus",w&&"destructive",k&&"multiline",I&&"is-static");return a.ZP.createElement("div",{ref:L,className:J,dir:_.isRtl?"rtl":void 0,style:Z,onMouseDown:M},a.ZP.createElement("div",{className:(0,i.Z)("ListItem-button",$&&"active"),role:"button",ref:n,tabIndex:0,onClick:!b&&r.$b?q:void 0,onMouseDown:W,onContextMenu:!b&&T?U:void 0},v&&a.ZP.createElement("i",{className:`icon-${v}`}),k&&a.ZP.createElement("div",{className:"multiline-item"},E),!k&&E,!P&&!b&&y&&a.ZP.createElement(u.Z,null),p&&a.ZP.createElement(f.Z,{className:"secondary-icon",round:!0,color:"translucent",size:"smaller",onMouseDown:e=>{P||0!==e.button||!x&&!T||(e.stopPropagation(),x?x(e):U(e))}},a.ZP.createElement("i",{className:`icon-${p}`}))),T&&void 0!==R&&a.ZP.createElement(m.Z,{isOpen:O,positionX:K,positionY:Y,style:H,className:"ListItem-context-menu",autoClose:!0,onClose:B,onCloseAnimationEnd:V},T.map((e=>a.ZP.createElement(h.Z,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title)))))}},6937:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(3716),s=n(1212),i=n(6752),o=n(3989),c=n(2898);const l=({message:e,duration:t=3e3,containerId:n,onDismiss:l})=>{const[d,u]=(0,a.eJ)(!0),m=(0,a.sO)(null),{transitionClassNames:h}=(0,s.Z)(d),f=(0,a.I4)((()=>{u(!1),setTimeout(l,150+r.fK)}),[l]);(0,a.d4)((()=>d?(0,o.Z)(f):void 0),[d,f]),(0,a.d4)((()=>(m.current=window.setTimeout(f,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)})),[t,f]);const v=(0,a.I4)((()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[]),p=(0,a.I4)((()=>{m.current=window.setTimeout(f,t)}),[t,f]);return a.ZP.createElement(c.Z,{className:"Notification-container",containerId:n},a.ZP.createElement("div",{className:(0,i.Z)("Notification",h),onClick:f,onMouseEnter:v,onMouseLeave:p},a.ZP.createElement("div",{className:"content"},e)))}},9196:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752);const s={s:22,m:25,l:28,xl:20},i=(0,a.X$)((({progress:e=0,size:t="l",square:n,transparent:i,noCross:o,onClick:c})=>{const l=s[t],d=l-4,u=l-1,m=2*d*Math.PI,h=(0,a.sO)(null);(0,a.d4)((()=>{if(!h.current)return;const t=h.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):h.current.innerHTML=`\n \n `}),[h,m,u,d,e]);const f=(0,r.Z)(`ProgressSpinner size-${t}`,i&&"transparent",n&&"square",o&&"no-cross");return a.ZP.createElement("div",{ref:h,className:f,onClick:c})}))},4434:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(6752),s=n(9107),i=n(9204);const o=(0,a.X$)((({id:e,label:t,subLabel:n,value:o,name:c,checked:l,disabled:d,hidden:u,isLoading:m,onChange:h})=>{const f=(0,s.Z)(),v=(0,r.Z)("Radio",d&&"disabled",u&&"hidden-widget",m&&"loading");return a.ZP.createElement("label",{className:v,dir:f.isRtl?"rtl":void 0},a.ZP.createElement("input",{type:"radio",name:c,value:o,id:e,checked:l,onChange:h,disabled:d||u}),a.ZP.createElement("div",{className:"Radio-main"},a.ZP.createElement("span",{className:"label",dir:f.isRtl?"auto":void 0},t),n&&a.ZP.createElement("span",{className:"subLabel",dir:f.isRtl?"auto":void 0},n)),m&&a.ZP.createElement(i.Z,null))})),c=(0,a.X$)((({id:e,name:t,options:n,selected:r,disabled:s,loadingOption:i,onChange:c})=>{const l=(0,a.I4)((e=>{const{value:t}=e.currentTarget;c(t)}),[c]);return a.ZP.createElement("div",{id:e,className:"radio-group"},n.map((e=>a.ZP.createElement(o,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:s,isLoading:i?i===e.value:void 0,onChange:l}))))}))},8051:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752),s=n(9107);const i=(0,a.X$)((({options:e,min:t=0,max:n=(e?e.length-1:100),step:i=1,label:o,value:c,renderValue:l,disabled:d,onChange:u})=>{const m=(0,s.Z)(),h=(0,a.I4)((e=>{u(Number(e.currentTarget.value))}),[u]),f=(0,r.Z)("RangeSlider",d&&"disabled"),v=(0,a.Ye)((()=>e?c/(e.length-1)*100:(c-t)/((n-t)/i)*100),[e,c,n,t,i]);return a.ZP.createElement("div",{className:f},o&&a.ZP.createElement("div",{className:"slider-top-row",dir:m.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"label",dir:"auto"},o),!e&&a.ZP.createElement("span",{className:"value",dir:"auto"},l?l(c):c)),a.ZP.createElement("div",{className:"slider-main"},a.ZP.createElement("div",{className:"slider-fill-track",style:`width: ${v}%`}),a.ZP.createElement("input",{min:t,max:n,value:c,step:i,type:"range",onChange:h}),e&&a.ZP.createElement("div",{className:"slider-options"},e.map(((e,t)=>a.ZP.createElement("div",{className:(0,r.Z)("slider-option no-selection",t===c&&"active"),onClick:()=>u(t)},e))))))}))},9589:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(6752),s=n(706),i=n(9107),o=n(2515),c=n(4288),l=n(231);const d=(0,a.X$)((({ref:e,children:t,parentContainerClassName:n,value:d,inputId:u,className:m,focused:h,isLoading:f,placeholder:v,disabled:p,autoComplete:g,canClose:Z,autoFocusSearch:E,onChange:P,onReset:y,onFocus:C,onBlur:b})=>{let N=(0,a.sO)(null);e&&(N=e);const[w,k,I]=(0,s.Z)(h);(0,o.Z)(N,E,I),(0,a.d4)((()=>{N.current&&(h?N.current.focus():N.current.blur())}),[h,v]);const T=(0,i.Z)(),M=(0,a.I4)((e=>{if("ArrowDown"===e.key||"Enter"===e.key){const e=document.querySelector(`.${n} .ListItem-button`);e&&e.focus()}}),[n]);return a.ZP.createElement("div",{className:(0,r.Z)("SearchInput",m,w&&"has-focus"),dir:T.isRtl?"rtl":void 0},t,a.ZP.createElement("input",{ref:N,id:u,type:"text",dir:"auto",placeholder:v||T("Search"),className:"form-control",value:d,disabled:p,autoComplete:g,onChange:function(e){const{currentTarget:t}=e;P(t.value)},onFocus:function(){k(),C&&C()},onBlur:function(){I(),b&&b()},onKeyDown:M}),a.ZP.createElement("i",{className:"icon-search"}),f&&a.ZP.createElement(c.Z,null),!f&&(d||Z)&&y&&a.ZP.createElement(l.Z,{round:!0,size:"tiny",color:"translucent",onClick:y},a.ZP.createElement("span",{className:"icon-close"})))}))},126:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(1212),s=n(7204),i=n(6752);const o=({isOpen:e,isCustom:t,id:n,className:o,onClick:c,children:l})=>{const{shouldRender:d,transitionClassNames:u}=(0,r.Z)(e,void 0,void 0,!t&&void 0),m=(0,s.Z)(e),h=(0,s.Z)(l),f=(0,a.sO)();return m&&!e&&(f.current=h),d&&a.ZP.createElement("div",{id:n,className:(0,i.Z)(o,u),onClick:c},e?l():f.current())}},3321:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(6752);const s=(0,a.X$)((({id:e,name:t,value:n,label:s,checked:i=!1,disabled:o,inactive:c,noAnimation:l,onChange:d,onCheck:u})=>{const m=(0,a.I4)((e=>{d&&d(e),u&&u(e.currentTarget.checked)}),[d,u]),h=(0,r.Z)("Switcher",o&&"disabled",c&&"inactive",l&&"no-animation");return a.ZP.createElement("label",{className:h,title:s},a.ZP.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:i,disabled:o,onChange:m}),a.ZP.createElement("span",{className:"widget"}))}))},3133:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(7361),s=n(1367),i=n(7204),o=n(8781),c=n(9107),l=n(6752),d=n(2972),u=n(2340);const m="Tab--active",h=(0,a.X$)((({className:e,title:t,isActive:n,badgeCount:r,isBadgeActive:s,previousActiveTab:i,onClick:o,clickArg:c})=>{const h=(0,a.sO)(null);return(0,a.d4)((()=>{if(n&&void 0===i&&h.current&&h.current.classList.add(m),!n||void 0===i)return;const e=h.current,t=e.parentElement.children[i];if(!t)return;const a=e.querySelector("i"),r=t.querySelector("i"),s=r.parentElement.offsetLeft-a.parentElement.offsetLeft,o=r.clientWidth/a.clientWidth;r.classList.remove("animate"),a.classList.remove("animate"),a.style.transform=`translate3d(${s}px, 0, 0) scale3d(${o}, 1, 1)`,(0,d.Z)(a),a.classList.add("animate"),a.style.transform="none",t.classList.remove(m),e.classList.add(m)}),[n,i]),a.ZP.createElement("div",{className:(0,l.Z)("Tab",e),onClick:()=>o(c),ref:h},a.ZP.createElement("span",null,(0,u.Z)(t),!!r&&a.ZP.createElement("span",{className:(0,l.Z)("badge",s&&"Tab__badge--active")},r),a.ZP.createElement("i",null)))})),f=r.cj?450:r.wZ?400:300,v=(0,a.X$)((({tabs:e,activeTab:t,big:n,onSwitchTab:r})=>{const l=(0,a.sO)(null),d=(0,i.Z)(t);(0,o.Z)(l.current),(0,a.d4)((()=>{const e=l.current,{scrollWidth:n,offsetWidth:a,scrollLeft:r}=e;if(n<=a)return;const i=e.childNodes[t];if(!i)return;const{offsetLeft:o,offsetWidth:c}=i,d=o-a/2+c/2;Math.abs(d-r)<16||(0,s.Z)(e,d,f)}),[t]);const u=(0,c.Z)();return a.ZP.createElement("div",{className:"TabList no-selection no-scrollbar "+(n?"big":""),ref:l,dir:u.isRtl?"rtl":void 0},e.map(((e,n)=>a.ZP.createElement(h,{key:e.title,title:u(e.title),isActive:n===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:d,onClick:r,clickArg:n}))))}))},2255:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(5116),s=n(3716),i=n(6752),o=n(2972),c=n(1279),l=n(5326),d=n(7204),u=n(8674);const m=Symbol("CLEANED_UP"),h="Transition__slide--active",f=({ref:e,activeKey:t,name:n,direction:f="auto",renderCount:v,shouldRestoreHeight:p,shouldCleanup:g,cleanupExceptionKey:Z,id:E,className:P,onStart:y,onStop:C,children:b})=>{const{animationLevel:N}=(0,r.Rd)().settings.byKey,w=(0,a.sO)();let k=(0,a.sO)(null);e&&(k=e);const I=(0,a.sO)({}),T=(0,d.Z)(t),M=(0,l.Z)(),S=void 0!==T&&t!==T;!v&&S&&(I.current={[T]:I.current[T]}),I.current[t]=b,(0,a.bt)((()=>{function e(){!g||void 0!==Z&&Z===T||(I.current={[T]:m},M())}const a=k.current,r=a.children;if(1===r.length&&!S)return n.startsWith("slide-optimized")&&(r[0].style.transition="none",r[0].style.transform="translate3d(0, 0, 0)"),void r[0].classList.add(h);const i=Array.from(a.childNodes);if(!S||!i.length)return;w.current=t;const l=-1===f||"auto"===f&&T>t||"inverse"===f&&T{null==m||m(),p.style.transition="none",p.style.transform="translate3d(0, 0, 0)",v.style.transition="none",v.style.transform=`translate3d(${n?"-":""}100%, 0, 0)`,(0,o.Z)(v),p.style.transition="",p.style.transform=`translate3d(${n?"":"-"}100%, 0, 0)`,v.style.transition="",v.style.transform="translate3d(0, 0, 0)",p.classList.remove(h),v.classList.add(h),(0,c.L)(p,(()=>{r===i.current&&(p.style.transition="none",p.style.transform="",d&&(v.style.height="auto",l.style.height=`${v.clientHeight}px`),null==f||f(),g(),a())}))}))}(N,n,l,e,t,w,a,p,y,C,i[P],i[E]);if(a.classList.remove("animating"),a.classList.toggle("backwards",l),"none"===n||N===s.oB)return i.forEach(((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle(h,t===P))})),void e();i.forEach(((e,t)=>{e instanceof HTMLElement&&(e.classList.remove(h),e.classList.toggle("from",t===E),e.classList.toggle("through",t>E&&tP),e.classList.toggle("to",t===P))}));const b=(0,u.YW)();requestAnimationFrame((()=>{var r;function s(){requestAnimationFrame((()=>{if(t===w.current){if(a.classList.remove("animating","backwards"),i.forEach(((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle(h,t===P))})),p){const e=a.querySelector(`.${h}`);e&&(e.style.height="auto",a.style.height=`${e.clientHeight}px`)}null==C||C(),b(),e()}}))}a.classList.add("animating"),null==y||y();const o="mv-slide"===n?null===(r=i[P])||void 0===r?void 0:r.firstChild:"reveal"===n&&l?i[E]:i[P];o?(0,c.f)(o,s):s()}))}),[t,T,S,f,n,y,C,v,p,g,Z,N,M]),(0,a.bt)((()=>{if(p){const e=k.current,t=e.querySelector(`.${h}`)||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=`${t.clientHeight}px`,e.style.flexBasis=`${t.clientHeight}px`)}}),[p,b]);const x=I.current,L=Object.keys(v?new Array(v).fill(void 0):x).map(Number).map((e=>{const n=x[e];return"function"==typeof n?a.ZP.createElement("div",{key:e,teactOrderKey:e},n(e===t,e===T,t)):void 0}));return a.ZP.createElement("div",{ref:k,id:E,className:(0,i.Z)("Transition",P,n),teactFastList:!v&&!g},L)}},3455:(e,t,n)=>{n.d(t,{fi:()=>s,Yy:()=>i,vb:()=>l,ZP:()=>h});var a=n(1090),r=n(782);const s=[{icon:"user",title:"FilterContacts",key:"contacts"},{icon:"non-contacts",title:"FilterNonContacts",key:"nonContacts"},{icon:"group",title:"FilterGroups",key:"groups"},{icon:"channel",title:"FilterChannels",key:"channels"},{icon:"bots",title:"FilterBots",key:"bots"}],i=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],o=["includedChatIds","bots","channels","groups","contacts","nonContacts"],c=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function l(e,t,n){let a=[],s=[];if("included"===t){const{includedChatIds:t,...i}=n?e.includeFilters||{}:(0,r.ei)(e.folder,o);a=t||[],s=Object.keys(i).filter((e=>Boolean(i[e])))}else{const{excludedChatIds:t,...i}=n?e.excludeFilters||{}:(0,r.ei)(e.folder,c);a=t||[],s=Object.keys(i).filter((e=>Boolean(i[e])))}return{selectedChatIds:a,selectedChatTypes:s}}function d(e){if(e){const{includedChatIds:t,...n}=e;if(Object.values(n).filter(Boolean).length>1||null!=t&&t.length)return"";if(n.bots)return"Bots";if(n.groups)return"Groups";if(n.channels)return"Channels";if(n.contacts)return"Contacts";if(n.nonContacts)return"Non-Contacts"}return""}const u={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},m=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:(0,r.ei)(e.folder,o)};case"editExcludeFilters":return{...e,excludeFilters:(0,r.ei)(e.folder,c)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...(0,r.CE)(e.folder,o),title:e.folder.title?e.folder.title:d(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...(0,r.CE)(e.folder,c),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:n,...a}=t.payload;return{mode:"edit",folderId:e,folder:a,chatFilter:""}}case"setChatFilter":return{...e,chatFilter:t.payload};case"setIsLoading":return{...e,isLoading:t.payload};case"setError":return{...e,error:t.payload};case"reset":return u;default:return e}},h=()=>(0,a.Z)(m,u)},3186:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(5116),s=n(396),i=n(274),o=n(5266),c=n(9290),l=n(4532);const d=(e,t,n,d,u,m,h,f=!1,v,p,g=!1,Z=!1)=>{const E=(0,a.sO)(null),[P,y]=(0,a.eJ)(!1);let C=P;const[b,N]=(0,a.eJ)(0),w=(0,a.I4)((()=>{y(!1),p&&p()}),[p]);(0,c.Z)((()=>{E.current=(0,s.z2)(e,n,((e,a)=>{var s;switch(e){case"onPlay":{const{setVolume:e,setPlaybackRate:t,toggleMuted:a,proxy:s}=E.current;y(!0),(0,l.N)(m,function(e){let t={};if(e&&e.current){const{play:n,pause:a,setCurrentTime:s,proxy:i,requestNextTrack:o,requestPreviousTrack:c,isFirst:l,isLast:d}=e.current;t={play:()=>{n(i.src)},pause:()=>{a()},stop:()=>{a(),s(0),(0,r.uC)().closeAudioPlayer()},seekbackward:e=>{const t=e.seekOffset||10;s(Math.max(i.currentTime-t,0))},seekforward:e=>{const t=e.seekOffset||10;s(Math.min(i.currentTime+t,i.duration))},seekTo:e=>{e.seekTime&&s(e.seekTime)}},d()||(t.nexttrack=()=>{o()}),l()||(t.previoustrack=()=>{c()})}return t}(E)),(0,l.pC)("playing"),e((0,r.Rd)().audioPlayer.volume),a(!!(0,r.Rd)().audioPlayer.isMuted),"voice"===n&&t((0,r.Rd)().audioPlayer.playbackRate),(0,l.NS)({duration:s.duration||0,playbackRate:s.playbackRate,position:s.currentTime});break}case"onRateChange":{const{proxy:e}=E.current;(0,l.NS)({duration:e.duration||0,playbackRate:e.playbackRate,position:e.currentTime});break}case"onPause":y(!1),(0,l.pC)("paused");break;case"onTimeUpdate":{const{proxy:e}=E.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;Z||N(e.currentTime/n);break}case"onEnded":(0,l.pC)("paused")}null==u||null===(s=u[e])||void 0===s||s.call(u,a)}),v,w);const{proxy:a}=E.current;P||a.paused||(y(!0),C=!0),h&&h(a)}),[e]),(0,a.d4)((()=>{P&&m&&(0,l.Ym)(m)}),[m,P]);const{play:k,pause:I,setCurrentTime:T,proxy:M,destroy:S,setVolume:x,stop:L,isFirst:$,isLast:A,requestNextTrack:F,requestPreviousTrack:O,setPlaybackRate:R,toggleMuted:D}=E.current,U=M.duration&&Number.isFinite(M.duration)?M.duration:t;(0,a.d4)((()=>{!U||(0,o.z)(M)||Z||N(M.currentTime/U)}),[U,b,M,Z]),(0,a.d4)((()=>()=>{S(g)}),[S,g]),(0,i.Z)((([e,t])=>{e===f&&d===t||M.src&&M.paused||f&&d&&!P&&k(d)}),[f,d,P,k,M.src,M.paused]);const B=(0,a.I4)((()=>{d&&k(d)}),[d,k]),V=(0,a.I4)((()=>{P?I():B()}),[I,B,P]),X=(0,a.I4)((e=>{T(e),U&&N(M.currentTime/U)}),[U,M,T]);return{isPlaying:C,playProgress:b,playPause:V,pause:I,play:B,stop:L,setCurrentTime:X,setVolume:x,audioProxy:M,duration:U,requestNextTrack:F,requestPreviousTrack:O,isFirst:$,isLast:A,setPlaybackRate:R,toggleMuted:D}}},2937:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(6264),s=n(9290),i=n(1394),o=n(5326);const c=new Map;function l(e){const t=(0,a.sO)();let n=!1;(0,s.Z)((()=>{if(n=!0,t.current=void 0,!e)return;const a=new Image;if(a.src=e,!a.width)return;const s=(0,i.ao)(a);(0,r.Z)(s.getContext("2d"),0,0,s.width,s.height,2,2),t.current=s.toDataURL()}),[e]);const l=function(e,t=!1,n){const s=(0,a.sO)(e?c.get(e):void 0),l=(0,a.sO)(),d=(0,o.Z)();return l.current&&t&&(clearTimeout(l.current),l.current=void 0),(0,a.d4)((()=>{if(!e||s.current||t)return;const a=new Image;a.onload=()=>{const t=(0,i.ao)(a);(0,r.Z)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();s.current=n,d(),c.size>=1e3&&c.clear(),c.set(e,n)},n?l.current=window.setTimeout((()=>{a.src=e}),n):a.src=e}),[e,n,d,t]),s.current}(e||void 0,Boolean(t.current));return t.current||!n&&l||e||void 0}},2019:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9118),s=n(5266);const i=(e=!1)=>{const[t,n]=(0,a.eJ)(!e),[i,o]=(0,a.eJ)(0),c=(0,a.Ye)((()=>(0,r.Ds)(n,200,!1,!0)),[]),l=(0,a.I4)((e=>{const t=e.currentTarget;(0,s.z)(t)||(t.buffered.length&&o(t.buffered.end(0)/t.duration),c(t.readyState>=3||t.currentTime>0))}),[c]);return{isBuffered:t,bufferedProgress:i,bufferingHandlers:{onLoadedData:l,onPlaying:l,onLoadStart:l,onPause:l,onTimeUpdate:l,onProgress:l},checkBuffering(e){c(e.readyState>=3)}}}},5866:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(6264),s=n(5326),i=n(7361);function o(e,t=!1,n){const o=(0,a.sO)(null),c=(0,s.Z)();return(0,a.d4)((()=>{const a=o.current;if(!e||!a||t)return;const s=new Image,c=()=>{a.width=s.width,a.height=s.height;const e=a.getContext("2d",{alpha:!1});i.vX&&(e.filter="blur(2px)"),e.drawImage(s,-4,-4,a.width+8,a.height+8),i.vX||(0,r.Z)(e,0,0,a.width,a.height,2,2)};s.onload=()=>{n?requestAnimationFrame(c):c()},s.src=e}),[o,e,c,t,n]),o}},1470:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(5116),s=n(2858),i=n(782),o=n(9107);const c=({chat:e,user:t,handleDelete:n,handleChatFolderChange:c,folderId:l,isPinned:d,isMuted:u,canChangeFolder:m},h=!1)=>{const f=(0,o.Z)(),{isSelf:v}=t||{};return(0,a.Ye)((()=>{if(!e)return;const{toggleChatPinned:t,updateChatMutedState:a,toggleChatArchived:o,toggleChatUnread:p}=(0,r.uC)(),g=m?{title:f("ChatList.Filter.AddToFolder"),icon:"folder",handler:c}:void 0,Z=d?{title:f("UnpinFromTop"),icon:"unpin",handler:()=>t({id:e.id,folderId:l})}:{title:f("PinToTop"),icon:"pin",handler:()=>t({id:e.id,folderId:l})};if(h)return(0,i.oA)([Z,g]);const E=e.unreadCount||e.hasUnreadMark?{title:f("MarkAsRead"),icon:"readchats",handler:()=>p({id:e.id})}:{title:f("MarkAsUnread"),icon:"unread",handler:()=>p({id:e.id})},P=u?{title:f("ChatList.Unmute"),icon:"unmute",handler:()=>a({chatId:e.id,isMuted:!1})}:{title:f("ChatList.Mute"),icon:"mute",handler:()=>a({chatId:e.id,isMuted:!0})},y=(0,s.pE)(e)?{title:f("Unarchive"),icon:"unarchive",handler:()=>o({id:e.id})}:{title:f("Archive"),icon:"archive",handler:()=>o({id:e.id})},C={title:(0,s.YC)(e.id)?f("Delete"):f((0,s.cc)(e)?"DeleteChat":(0,s.eA)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n},b=void 0!==l;return(0,i.oA)([g,E,Z,!v&&P,!v&&!b&&y,C])}),[e,m,f,c,d,h,u,n,l,v])}},7240:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(7361);function s(e){e.stopImmediatePropagation(),e.preventDefault(),e.stopPropagation()}const i=(e,t,n,i)=>{const[o,c]=(0,a.eJ)(!1),[l,d]=(0,a.eJ)(void 0),u=(0,a.I4)((e=>{t||2!==e.button||e.target.classList.add("no-selection")}),[t]),m=(0,a.I4)((e=>{e.target.classList.remove("no-selection"),t||n&&e.target.matches("a[href]")||(e.preventDefault(),l||(c(!0),d({x:e.clientX,y:e.clientY})))}),[t,n,l]),h=(0,a.I4)((()=>{c(!1)}),[]),f=(0,a.I4)((()=>{d(void 0),document.body.classList.remove("no-selection")}),[]);return(0,a.d4)((()=>{if(t||!r.$b||i)return;const a=e.current;if(!a)return;let o;const u=()=>{o&&(clearTimeout(o),o=void 0)},m=e=>{t||r.wB&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(u(),o=window.setTimeout((()=>(e=>{u();const{clientX:t,clientY:i,target:o}=e.touches[0];l||n&&o.matches("a[href]")||(a.addEventListener("touchend",(function e(t){a.removeEventListener("touchend",e,!0),s(t)}),!0),r.fl&&r.cj&&a.addEventListener("mousedown",(function e(t){a.removeEventListener("mousedown",e,!0),s(t)}),!0),document.body.classList.add("no-selection"),c(!0),d({x:t,y:i}))})(e)),200))};return a.addEventListener("touchstart",m,{passive:!0}),a.addEventListener("touchcancel",u,!0),a.addEventListener("touchend",u,!0),a.addEventListener("touchmove",u,{passive:!0}),()=>{u(),a.removeEventListener("touchstart",m),a.removeEventListener("touchcancel",u,!0),a.removeEventListener("touchend",u,!0),a.removeEventListener("touchmove",u)}}),[l,t,i,e,n]),{isContextMenuOpen:o,contextMenuPosition:l,handleBeforeContextMenu:u,handleContextMenu:m,handleContextMenuClose:h,handleContextMenuHide:f}}},3394:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=(e,t,n,r,s=0,i=0,o=0,c=0)=>{const[l,d]=(0,a.eJ)("right"),[u,m]=(0,a.eJ)("bottom"),[h,f]=(0,a.eJ)(!1),[v,p]=(0,a.eJ)(""),[g,Z]=(0,a.eJ)("");return(0,a.bt)((()=>{const a=t();if(!e||!a)return;let{x:l,y:u}=e;const h={width:0,left:0,height:0,top:0},v=r(),g=n(),E=a.getBoundingClientRect(),P=v?parseInt(getComputedStyle(v).marginTop,10)+c:void 0,y=v?{width:v.offsetWidth,height:v.offsetHeight+P}:h,C=g?g.getBoundingClientRect():h;let b;l+y.width+s0?(b="right",l-=3):(b="left",l=16),d(b),o&&"right"===b&&l+s+o>=C.width+C.left&&(l-=o),o&&"left"===b&&(l+s+o+y.width>=C.width+C.left?l-=o:l-o<=0&&(l+=o)),u+y.height{n.d(t,{Z:()=>s});var a=n(4050),r=n(9118);function s(e,t,n){return(0,a.Ye)((()=>(0,r.Ds)((e=>e()),e,!t,!n)),[e,t,n])}},5790:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(5116),s=n(9118);const i=(e,t,n,i)=>{const{loadMessage:o}=(0,r.uC)(),c=(0,a.Ye)((()=>{const n=(0,s.P2)(o,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:i})}}),[o,e,t,i]);(0,a.d4)((()=>{t&&!n&&c()}))}},8781:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=(e,t)=>{(0,a.d4)((()=>{if(e&&!t)return e.addEventListener("wheel",n,{passive:!0}),()=>{e.removeEventListener("wheel",n)};function n(t){t.deltaX||(e.scrollLeft+=t.deltaY/4)}}),[e,t])}},2515:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(7361);function s(e,t,n){(0,a.d4)((()=>{t?r.wB||setTimeout((()=>{requestAnimationFrame((()=>{e.current&&e.current.focus()}))}),500):(e.current&&e.current.blur(),n&&setTimeout(n,300))}),[e,t,n])}},3657:(e,t,n)=>{n.d(t,{S1:()=>i,_N:()=>o,Op:()=>c});var a=n(4050),r=n(9118),s=n(8674);function i({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:i,margin:o,threshold:c,isDisabled:l},d){const u=(0,a.sO)(),m=(0,a.sO)(),h=(0,a.sO)(0),f=(0,a.sO)();m.current=d;const v=(0,a.I4)((()=>{h.current++}),[]),p=(0,a.I4)((()=>{h.current&&(h.current--,!h.current&&f.current&&(f.current(),f.current=void 0))}),[]);return(0,s.ZP)(v,p),(0,a.d4)((()=>{if(!l)return()=>{u.current&&(u.current.observer.disconnect(),u.current.callbacks.clear(),u.current=void 0)}}),[l]),{observe:(0,a.I4)(((a,s)=>{u.current||function(){const a=new Map,s=new Map,l=()=>{const e=Array.from(s.values());e.forEach((t=>{const n=a.get(t.target);n&&n(t,e)})),m.current&&m.current(e),s.clear()},d=t?r.P2:n?r.Ds:void 0,v=d?d(l,t||n,!i):l,p=new IntersectionObserver((e=>{e.forEach((e=>{s.set(e.target,e)})),h.current?f.current=()=>{v()}:v()}),{root:e.current,rootMargin:o?`${o}px`:void 0,threshold:c});u.current={observer:p,callbacks:a}}();const l=u.current;return l.observer.observe(a),s&&l.callbacks.set(a,s),()=>{s&&l.callbacks.delete(a),l.observer.unobserve(a)}}),[l]),freeze:v,unfreeze:p}}function o(e,t,n){(0,a.d4)((()=>t?t(e.current,n):void 0),[])}function c(e,t,n){const[r,s]=(0,a.eJ)(!t);return o(e,t,(e=>{s(e.isIntersecting),n&&n(e)})),r}},2357:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=function(e,t,n=!1){const r=(0,a.sO)(e);(0,a.bt)((()=>{r.current=e}),[e]),(0,a.d4)((()=>{if(void 0===t)return;const e=setInterval((()=>r.current()),t);return n||r.current(),()=>clearInterval(e)}),[t,n])}},2645:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(7204);const s=(e,t,n)=>{const s=(0,r.Z)(t);return(0,a.bt)((()=>e(s||[])),t,n)}},692:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(1212);function r(e){const t=Boolean(e),{transitionClassNames:n}=(0,a.Z)(t,void 0,t,"slow");return n}},2566:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),r=n(7361),s=n(6137),i=n(9118),o=n(647),c=n(5326),l=n(6926);const d={};function u(e,t=!1,n=s.IU.BlobUrl,u,m,h=!1){const f=e?o.UV(e):void 0,v=n===s.IU.Stream||r.I_&&n===s.IU.Progressive,p=(0,c.Z)(),g=(()=>{const e=(0,a.sO)();return e.current||(e.current=(0,l.Z)(d),d[e.current]=!0),e.current})(),[Z,E]=(0,a.eJ)(f&&!v?1:0),P=(0,a.sO)(),y=(0,a.Ye)((()=>(0,i.P2)((e=>{P.current&&(!m||Date.now()-P.current>m)&&E(e)}),500,!0)),[m]);return(0,a.d4)((()=>{!t&&e&&(f?v&&setTimeout((()=>{E(.75)}),1500):(E(0),P.current&&o.cC(y),P.current=Date.now(),o.he(e,n,h,y,g).then((()=>{const e=Date.now()-P.current;P.current=void 0,!m||e>=m?p():setTimeout(p,m-e)}))))}),[t,e,f,n,u,p,v,m,y,h,g]),(0,a.d4)((()=>{t&&P.current&&(o.cC(y),E(0),P.current=void 0)}),[y,t]),(0,a.d4)((()=>()=>{e&&o.Iq(e,g)}),[g,e]),{mediaData:f,loadProgress:Z}}},6503:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(7361);let s;function i(e,t,n=250,i=!1){const o=(0,a.sO)(!1),c=(0,a.I4)((()=>{o.current=!0}),[]);return(0,a.d4)((()=>{s&&(clearTimeout(s),s=void 0),!e||r.$b||i||(s=window.setTimeout((()=>{o.current||t()}),2*n))}),[i,e,n,t]),[(0,a.I4)((()=>{o.current=!0}),[]),(0,a.I4)((()=>{o.current=!1,s&&(clearTimeout(s),s=void 0),s=window.setTimeout((()=>{o.current||t()}),n)}),[n,t]),c]}},2678:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(7204),s=n(5326),i=n(9290);function o(e,t){const n=(0,r.Z)(e,!0),o=(0,a.sO)(),c=(0,s.Z)(),l=null!=e,d=null!=n;return l&&o.current&&(clearTimeout(o.current),o.current=void 0),(0,i.Z)((()=>{t&&!l&&d&&!o.current&&(o.current=window.setTimeout((()=>{o.current=void 0,c()}),t))}),[e]),o.current&&t&&!l?n:e}},1090:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);function r(e,t){const n=(0,a.sO)(e),[r,s]=(0,a.eJ)(t);return[r,(0,a.I4)((e=>{s((t=>n.current(t,e)))}),[])]}},6389:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(5116),s=n(3716),i=n(9118);const o=(e,t)=>(0,a.Ye)((()=>(0,i.P2)((n=>{(0,r.uC)().sendMessageAction({chatId:e,threadId:t,action:n})}),s.o_)),[e,t])},6898:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(9118);function s(e,t){(0,a.d4)((()=>{const t=e.current;return()=>{t&&(0,r.T2)((()=>{t.pause(),t.src="",t.load()}))}}),t)}},6264:(e,t,n)=>{n.d(t,{Z:()=>s});const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],r=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function s(e,t,n,s,i,o,c){if(Number.isNaN(o)||o<1)return;o|=0,Number.isNaN(c)&&(c=1),(c|=0)>3&&(c=3),c<1&&(c=1);const l=e.getImageData(t,n,s,i),d=l.data;let u,m,h,f,v,p,g,Z,E,P,y,C,b=s-1,N=i-1,w=o+1,k=[],I=[],T=[],M=a[o],S=r[o],x=[],L=[];for(;c-- >0;){for(C=y=0,v=0;vb?b:p)<<2),u+=d[g++],m+=d[g++],h+=d[g++];for(f=0;f0?g<<2:0),Z=C+x[f],E=C+L[f],u+=d[Z++]-d[E++],m+=d[Z++]-d[E++],h+=d[Z++]-d[E++],y++;C+=s<<2}for(f=0;fN?0:s,u+=k[P],m+=I[P],h+=T[P];for(y=f<<2,v=0;v>>S,d[y+1]=m*M>>>S,d[y+2]=h*M>>>S,0==f&&(x[v]=((g=v+w)0?g*s:0),Z=f+x[v],E=f+L[v],u+=k[Z]-k[E],m+=I[Z]-I[E],h+=T[Z]-T[E],y+=s<<2}}e.putImageData(l,t,n)}},396:(e,t,n)=>{n.d(t,{Es:()=>p,z2:()=>g,An:()=>E});var a=n(5116),r=n(1713),s=n(7361),i=n(4753),o=n(5266),c=n(2858),l=n(9118),d=n(1638);const u=new Map;let m,h=[],f=[];function v(e,t){const n=m&&u.get(m);n&&(n.audio.pause(),n.audio.currentTime=0,n.onTrackChange&&n.onTrackChange());const s=Z(e,(0,a.Rd)().audioPlayer.origin||r.Cr.Inline,t);if(!s)return;if(!u.has(s))return void(0,a.uC)().openAudioPlayer((0,c.Ak)(P(s).messageKey));const o=u.get(s);o.onForcePlay&&o.onForcePlay(),m=s,o.audio.src&&(0,i.Z)(o.audio)}function p(){const e=m&&u.get(m);e&&e.audio.pause()}function g(e,t,n,p,g){if(!u.has(e)){const n=function(e,t,n,a){const r=new Audio;function s(t){return n=>{u.has(e)&&((0,o.z)(r)||u.get(e).handlers.forEach((e=>{e(t,n)})))}}return r.addEventListener("timeupdate",s("onTimeUpdate")),r.addEventListener("play",s("onPlay")),r.addEventListener("pause",s("onPause")),r.addEventListener("loadstart",s("onLoadStart")),r.addEventListener("loadeddata",s("onLoadedData")),r.addEventListener("playing",s("onPlaying")),r.addEventListener("ended",(()=>{u.has(e)&&((0,o.z)(r)||v(e))})),{audio:r,type:t,proxy:new Proxy(r,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:n,onTrackChange:a}}(e,t,p,g);u.set(e,n),function(e,t){"audio"!==e.type||f.includes(t)||(f.push(t),f.sort(y)),"voice"!==e.type||h.includes(t)||(h.push(t),h.sort(y))}(n,e)}const{audio:E,proxy:C,handlers:b}=u.get(e);return b.push(n),{play(n){if(!E.paused)return;const l=m&&u.get(m);l&&m!==e&&(l.audio.pause(),l.audio.currentTime=0,(0,o.z)(l.audio)&&(l.audio.dataset.preventPlayAfterPatch="true"),l.onTrackChange&&l.onTrackChange()),m=e,E.src||(E.src=n,E.preload="auto",n.includes("/progressive/")&&s.s$&&(delete E.dataset.preventPlayAfterPatch,(0,o.B)(E))),(0,i.Z)(E),function(e,t){var n;if((0,a.Rd)().globalSearch.currentContent===r.nJ.Music)return;const{chatId:s}=(0,c.Ak)(P(t).messageKey),i=null===(n=(0,d.Bt)((0,a.Rd)()))||void 0===n?void 0:n.chatId,o=e=>e.startsWith(`msg${s}`)||i&&e.startsWith(`msg${i}`);"audio"===e&&(f=f.filter(o)),"voice"===e&&(h=h.filter(o))}(t,e)},pause(){m===e&&E.pause()},stop(){if(m===e){const e=E.src;E.pause(),(0,l.T2)((()=>{E.src="",E.src=e}))}},setCurrentTime(t){m===e&&(E.fastSeek?E.fastSeek(t):E.currentTime=t)},setVolume(t){m===e&&(E.volume=t,E.muted=!1)},setPlaybackRate(t){m===e&&(E.playbackRate=t)},toggleMuted(e){E.muted=void 0===e?!E.muted:e},proxy:C,requestNextTrack(){v(e)},isLast:()=>!Z(e,(0,a.Rd)().audioPlayer.origin),isFirst:()=>!Z(e,(0,a.Rd)().audioPlayer.origin,!0),requestPreviousTrack(){v(e,!0)},destroy(t=!1){const a=u.get(e);a&&(a.handlers=a.handlers.filter((e=>e!==n)),a.handlers.length||(a.audio.pause(),u.delete(e),t&&function(e,t){const n=e=>e!==t;"audio"===e.type&&(f=f.filter(n)),"voice"===e.type&&(h=h.filter(n))}(a,e),e===m&&(m=void 0)))}}}function Z(e,t=r.Cr.Inline,n){const a=function(e){switch(e.type){case"audio":return f;case"voice":return h;default:return}}(u.get(e));if(!a)return;if(t===r.Cr.Search){const t=a.indexOf(e);if(t<0)return;return a[t+(n?-1:1)]}const{chatId:s}=(0,c.Ak)(P(e).messageKey),i=a.filter((e=>e.startsWith(`msg${s}`))),o=i.indexOf(e);if(o<0)return;let l=t===r.Cr.Inline?-1:1;return n&&(l*=-1),i[o+l]}function E(e){return`${(0,c.Tp)(e)}-${e.date}`}function P(e){return{messageKey:e.match(/^msg(-?\d+)-(\d+)/)[0],date:Number(e.split("-").pop())}}function y(e,t){if(!e||!t)return 0;const{date:n,messageKey:a}=P(e),{date:r,messageKey:s}=P(t),i=r-n;return 0===i?s.localeCompare(a):i}},1174:(e,t,n)=>{n.d(t,{e:()=>r,s:()=>c});var a=n(7361);let r;function s(e,t){return t?Math.sqrt((t.pageX-e.pageX)**2+(t.pageY-e.pageY)**2):0}function i(e,t){return{x:(e.pageX+t.pageX)/2,y:(e.pageY+t.pageY)/2}}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(r||(r={}));let o=0;function c(e,t){let n,c,l=!1,d=!1,u=0,m={x:window.innerWidth/2,y:window.innerHeight/2};function h(e){if(!t.excludedClosestSelector||!e.target.matches(t.excludedClosestSelector)&&!e.target.closest(t.excludedClosestSelector)){if(n=e,"mousedown"===e.type)document.addEventListener("mousemove",v),document.addEventListener("mouseup",f),t.onDoubleClick&&Date.now()-o<300&&t.onDoubleClick(e,{centerX:e.pageX,centerY:e.pageY}),o=Date.now();else if("touchstart"===e.type){const t=e.target;t.addEventListener("touchmove",v,{passive:!0}),t.addEventListener("touchend",f),t.addEventListener("touchcancel",f),"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY),2===e.touches.length&&(u=s(e.touches[0],e.touches[1]),m=i(e.touches[0],e.touches[1])))}document.body.classList.add("no-selection"),t.withCursor&&document.body.classList.add("cursor-grabbing"),t.onCapture&&t.onCapture(e)}}function f(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",f),document.removeEventListener("mousemove",v),n.target.removeEventListener("touchcancel",f),n.target.removeEventListener("touchend",f),n.target.removeEventListener("touchmove",v),n=void 0,a.cj&&t.selectorToPreventScroll&&Array.from(document.querySelectorAll(t.selectorToPreventScroll)).forEach((e=>{e.style.overflow=""})),l?t.onRelease&&t.onRelease(e):!t.onClick||"button"in e&&0!==e.button||t.onClick(e)),l=!1,d=!1,u=0,c=void 0,m={x:window.innerWidth/2,y:window.innerHeight/2}}function v(e){if(n){if("touchmove"===e.type&&"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY),t.onZoom&&u>0&&2===e.touches.length)){const n=s(e.touches[0],e.touches[1]),a=i(e.touches[0],e.touches[1]),r=a.x-m.x,o=a.y-m.y,c=n/u;t.onZoom(e,{zoomFactor:c,initialCenterX:m.x,initialCenterY:m.y,dragOffsetX:r,dragOffsetY:o,currentCenterX:a.x,currentCenterY:a.y}),1!==c&&(l=!0)}const o=e.pageX-n.pageX,h=e.pageY-n.pageY;(Math.abs(o)>=15||Math.abs(h)>=15)&&(l=!0);let f=!1;t.onDrag&&(t.onDrag(e,n,{dragOffsetX:o,dragOffsetY:h}),f=!0),t.onSwipe&&!d&&(d=function(e,n,s){if(a.cj){const t=e.touches[0].pageX;if(t<=20||t>=window.innerWidth-20)return!1}const i=Math.abs(n),o=Math.abs(s);if(n&&s&&Math.max(i,o)/Math.min(i,o)<2)return!1;let l;if(i>=50?l="x":o>=50&&(l="y"),!l)return!1;if(c){if(c!==l)return!1}else c=l;return function(e,t,n,a,s){return"x"===t?s(e,n<0?r.Left:r.Right):"y"===t&&s(e,a<0?r.Up:r.Down)}(e,l,n,s,t.onSwipe)}(e,o,h),f=d),a.cj&&f&&t.selectorToPreventScroll&&Array.from(document.querySelectorAll(t.selectorToPreventScroll)).forEach((e=>{e.style.overflow="hidden"}))}}return e.addEventListener("mousedown",h),e.addEventListener("touchstart",h,{passive:!t.isNotPassive}),()=>{e.removeEventListener("mousedown",h),e.removeEventListener("touchstart",h)}}},1279:(e,t,n)=>{function a(e,t,n){s("transitionend",e,t,n)}function r(e,t,n){s("animationend",e,t,n)}function s(e,t,n,a){let r=!1;t.addEventListener(e,(function s(i){r||i.target!==i.currentTarget||a&&(i instanceof TransitionEvent&&i.propertyName===a||i instanceof AnimationEvent&&i.animationName===a)||(r=!0,t.removeEventListener(e,s),setTimeout((()=>{n()}),50))}))}n.d(t,{L:()=>a,f:()=>r})},3570:(e,t,n)=>{function a(e,t){return t-Math.floor(t/e)*e}n.d(t,{Z:()=>a})},539:(e,t,n)=>{n.d(t,{Z:()=>d,N:()=>u});var a=n(5116),r=n(1713),s=n(3716),i=n(7361),o=n(8674),c=n(9933);let l=!1;function d(e,t,n,i=0,o=s.V$,c,l,d){const u=function(e,t,n=s.V$,a){const{offsetTop:i}=t,{scrollTop:o}=e;if(void 0===a){const t=i-e.scrollTop;if(t<-n)return o+(t+n);if(t>n)return o+(t-n)}else{if(a===r.fo.Up)return i+n;if(a===r.fo.Down)return Math.max(0,i-n)}return o}(e,t,o,c);c!==r.fo.Static?((0,a.Rd)().settings.byKey.animationLevel===s.oB&&(l=0),m(e,t,u,n,i,l,d)):m(e,t,u,n,i,0)}function u(){return l}function m(e,t,n,a,r=0,d,u){const{offsetTop:m,offsetHeight:v}=t,{scrollTop:p,offsetHeight:g,scrollHeight:Z}=e,E=u&&e.dataset.normalHeight?Number(e.dataset.normalHeight):g;let P;switch(p!==n&&(e.scrollTop=n),a){case"start":P=m-r-n+(i.wZ?1:0);break;case"end":P=m+v+r-(n+E);break;case"nearest":case"center":case"centerOrTop":P=v0){const e=Z-(n+E);P=Math.min(P,e)}if(0===P)return;const y=n+P;if(0===d)return void(e.scrollTop=y);l=!0;const C=Math.abs(P),b=C{const t=Math.min((Date.now()-w)/N,1),n=P*(1-b(t));return e.scrollTop=Math.round(y-n),l=t<1,l||k(),l}))}function h(e){return 1-(1-e)**5}function f(e){return 1-(1-e)**3.5}},1367:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(5116),r=n(3716),s=n(9933);function i(e,t,n=300){(0,a.Rd)().settings.byKey.animationLevel===r.oB&&(n=0),function(e,t,n){const a="rtl"===e.getAttribute("dir"),{scrollLeft:r,offsetWidth:i,scrollWidth:o}=e;let c=t-r;if(c<0){const e=-r*(a?-1:1);c=Math.max(c,e)}else if(c>0){const e=o-(r+i);c=Math.min(c,e)}if(0===c)return;const l=r+c;if(0===n)return void(e.scrollLeft=l);const d=Date.now();(0,s.jt)((()=>{const t=Math.min((Date.now()-d)/n,1),a=c*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(l-a),t<1}))}(e,t,n)}},5723:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(7361);function r(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),r=document.createRange(),s=e.lastChild||e;a.$b||s&&s.nodeValue?(r.selectNodeContents(s),r.collapse(!1),n.removeAllRanges(),n.addRange(r)):e.focus()}},7529:(e,t,n)=>{function a(e){const t="key"in e?e.key:e.code;return t.startsWith("Key")?t.slice(3).toLowerCase():t}n.d(t,{Z:()=>a})},4532:(e,t,n)=>{n.d(t,{N:()=>r,Ym:()=>s,Ay:()=>o,pC:()=>c,NS:()=>l,Of:()=>d});const a={play:void 0,pause:void 0,seekbackward:void 0,seekforward:void 0,previoustrack:void 0,nexttrack:void 0,stop:void 0,seekTo:void 0};function r(e,t){const{mediaSession:n}=window.navigator;n?(e&&s(e),t&&i(t)):console.warn("MediaSession API not supported in this browser")}function s(e){const{mediaSession:t}=window.navigator;t&&(t.metadata=null!=e?e:null)}function i(e){const{mediaSession:t}=window.navigator;t&&Object.entries({...a,...e}).forEach((([e,n])=>{try{t.setActionHandler(e,n)}catch(e){}}))}function o(){const{mediaSession:e}=window.navigator;var t;e&&(e.metadata=null,i(a),e.playbackState&&(e.playbackState="none"),null===(t=e.setPositionState)||void 0===t||t.call(e))}function c(e="none"){const{mediaSession:t}=window.navigator;t&&t.playbackState&&(t.playbackState=e)}function l(e){var t;if(!e||void 0===e.position||void 0===e.duration)return;e.position=Math.min(e.position,e.duration);const{mediaSession:n}=window.navigator;null==n||null===(t=n.setPositionState)||void 0===t||t.call(n,e)}function d({title:e,artist:t,album:n,artwork:a}){if("MediaMetadata"in window)return new window.MediaMetadata({title:e,artist:t,album:n,artwork:a})}},3099:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(6137),r=n(7361);const s={B:a.Vv.Bold,STRONG:a.Vv.Bold,I:a.Vv.Italic,EM:a.Vv.Italic,U:a.Vv.Underline,S:a.Vv.Strike,STRIKE:a.Vv.Strike,DEL:a.Vv.Strike,CODE:a.Vv.Code,PRE:a.Vv.Pre,BLOCKQUOTE:a.Vv.Blockquote};function i(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);return r.op||(t=t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1")),t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/
]*)?><\/div>/g,"\n"),t=t.replace(/]*)?>/g,"\n"),t=t.replace(/<\/div>(\s*)
/g,"\n"),t=t.replace(/
/g,"\n"),t=t.replace(/<\/div>/g,""),t=t.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm,"
$1
"),t=t.replace(/[`]{3}([^`]+)[`]{3}/g,"
$1
"),t=t.replace(/[`]{1}([^`\n]+)[`]{1}/g,"$1"),t=t.replace(/(^|\s)(?!)(\s|$)/g,"$1$2$3"),t=t.replace(/(^|\s)(?!)(\s|$)/g,"$1$2$3"),t=t.replace(/(^|\s)(?!)(\s|$)/g,"$1$2$3"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"");let i=0,o=0;const c=[];function l(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(s[e.nodeName])return s[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.Vv.MentionName?a.Vv.MentionName:t.dataset.entityType===a.Vv.Url?a.Vv.Url:t.href.startsWith("mailto:")?a.Vv.Email:t.href.startsWith("tel:")?a.Vv.Phone:t.href!==t.textContent?a.Vv.TextUrl:a.Vv.Url}return"SPAN"===e.nodeName?e.dataset.entityType:void 0}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const i=t.indexOf(e.textContent,n),o=i>=0?i:n,c=t.substring(0,o).length,{length:l}=t.substring(o,o+e.textContent.length);let d,u;return r===a.Vv.TextUrl&&(d=e.href),r===a.Vv.MentionName&&(u=e.dataset.userId),{index:o,entity:{type:r,offset:c,length:l,...d&&{url:d},...u&&{userId:u}}}}(e,n,i);r?(i=t,c.push(r)):e.textContent&&(i+=e.textContent.length),e.hasChildNodes()&&o<=3&&(o+=1,Array.from(e.childNodes).forEach(l))}return Array.from(t.childNodes).forEach((e=>{o=1,l(e)})),{text:n,entities:c.length?c:void 0}}},5266:(e,t,n)=>{function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",(()=>{const t=e.currentTime;e.dataset.patchForSafariInProgress="true",e.addEventListener("progress",(function n(){e.buffered.length&&(e.currentTime=e.duration-1,e.addEventListener("progress",(()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&!e.dataset.preventPlayAfterPatch&&e.play()}),{once:!0}),e.removeEventListener("progress",n))}))}),{once:!0}),e.dataset.patchedForSafari="true")}function r(e){return Boolean(e.dataset.patchForSafariInProgress)}n.d(t,{B:()=>a,z:()=>r})},3227:(e,t,n)=>{n.d(t,{Z:()=>a});const a=e=>{e.stopPropagation(),e.preventDefault()}}}]); -//# sourceMappingURL=11.58cedc04083d3a8f14c7.js.map \ No newline at end of file diff --git a/dist/11.58cedc04083d3a8f14c7.js.map b/dist/11.58cedc04083d3a8f14c7.js.map deleted file mode 100644 index a38d45104..000000000 --- a/dist/11.58cedc04083d3a8f14c7.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"11.58cedc04083d3a8f14c7.js","mappings":"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,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,G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","sources":["webpack://telegram-t/./src/components/common/AnimatedEmoji.tsx","webpack://telegram-t/./src/components/common/Audio.tsx","webpack://telegram-t/./src/components/common/helpers/waveform.ts","webpack://telegram-t/./src/util/waveform.ts","webpack://telegram-t/./src/components/common/CalendarModal.async.tsx","webpack://telegram-t/./src/components/common/ChatExtra.tsx","webpack://telegram-t/./src/components/common/DeleteChatModal.tsx","webpack://telegram-t/./src/components/common/Document.tsx","webpack://telegram-t/./src/components/common/File.tsx","webpack://telegram-t/./src/components/common/GroupChatInfo.tsx","webpack://telegram-t/./src/components/common/LastMessageMeta.tsx","webpack://telegram-t/./src/components/common/Media.tsx","webpack://telegram-t/./src/components/common/MessageOutgoingStatus.tsx","webpack://telegram-t/./src/components/common/NothingFound.tsx","webpack://telegram-t/./src/components/common/Picker.tsx","webpack://telegram-t/./src/components/common/PickerSelectedItem.tsx","webpack://telegram-t/./src/components/common/PrivateChatInfo.tsx","webpack://telegram-t/./src/components/common/ProfilePhoto.tsx","webpack://telegram-t/./src/components/common/ProfileInfo.tsx","webpack://telegram-t/./src/components/common/hooks/usePhotosPreload.ts","webpack://telegram-t/./src/components/common/ReactionStaticEmoji.tsx","webpack://telegram-t/./src/components/common/StickerButton.tsx","webpack://telegram-t/./src/components/common/StickerSetModal.async.tsx","webpack://telegram-t/./src/components/common/TypingStatus.tsx","webpack://telegram-t/./src/components/common/VerifiedIcon.tsx","webpack://telegram-t/./src/components/common/WebLink.tsx","webpack://telegram-t/./src/components/common/helpers/mediaDimensions.ts","webpack://telegram-t/./src/components/common/helpers/renderMessageText.tsx","webpack://telegram-t/./src/components/common/hooks/useAnimatedEmoji.ts","webpack://telegram-t/./src/components/left/ChatFolderModal.async.tsx","webpack://telegram-t/./src/components/left/main/hooks/useChatAnimationType.ts","webpack://telegram-t/./src/components/left/main/Badge.tsx","webpack://telegram-t/./src/components/left/main/ChatCallStatus.tsx","webpack://telegram-t/./src/components/left/main/Chat.tsx","webpack://telegram-t/./src/components/left/main/EmptyFolder.tsx","webpack://telegram-t/./src/components/left/main/ChatList.tsx","webpack://telegram-t/./src/components/left/search/helpers/getSenderName.ts","webpack://telegram-t/./src/components/middle/composer/DropTarget.tsx","webpack://telegram-t/./src/components/middle/composer/DropArea.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/MessageInput.tsx","webpack://telegram-t/./src/components/middle/composer/TextFormatter.tsx","webpack://telegram-t/./src/components/middle/composer/helpers/prepareForRegExp.ts","webpack://telegram-t/./src/components/middle/composer/helpers/selection.ts","webpack://telegram-t/./src/util/memoized.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useEmojiTooltip.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useMentionTooltip.ts","webpack://telegram-t/./src/components/right/hooks/useAsyncRendering.ts","webpack://telegram-t/./src/components/ui/CheckboxGroup.tsx","webpack://telegram-t/./src/components/ui/FloatingActionButton.tsx","webpack://telegram-t/./src/components/ui/ListItem.tsx","webpack://telegram-t/./src/components/ui/Notification.tsx","webpack://telegram-t/./src/components/ui/ProgressSpinner.tsx","webpack://telegram-t/./src/components/ui/Radio.tsx","webpack://telegram-t/./src/components/ui/RadioGroup.tsx","webpack://telegram-t/./src/components/ui/RangeSlider.tsx","webpack://telegram-t/./src/components/ui/SearchInput.tsx","webpack://telegram-t/./src/components/ui/ShowTransition.tsx","webpack://telegram-t/./src/components/ui/Switcher.tsx","webpack://telegram-t/./src/components/ui/Tab.tsx","webpack://telegram-t/./src/components/ui/TabList.tsx","webpack://telegram-t/./src/components/ui/Transition.tsx","webpack://telegram-t/./src/hooks/reducers/useFoldersReducer.ts","webpack://telegram-t/./src/hooks/useAudioPlayer.ts","webpack://telegram-t/./src/hooks/useBlur.ts","webpack://telegram-t/./src/hooks/useBlurSync.ts","webpack://telegram-t/./src/hooks/useBuffering.ts","webpack://telegram-t/./src/hooks/useCanvasBlur.ts","webpack://telegram-t/./src/hooks/useChatContextActions.ts","webpack://telegram-t/./src/hooks/useContextMenuHandlers.ts","webpack://telegram-t/./src/hooks/useContextMenuPosition.ts","webpack://telegram-t/./src/hooks/useDebounce.ts","webpack://telegram-t/./src/hooks/useEnsureMessage.ts","webpack://telegram-t/./src/hooks/useHorizontalScroll.ts","webpack://telegram-t/./src/hooks/useInputFocusOnOpen.ts","webpack://telegram-t/./src/hooks/useIntersectionObserver.ts","webpack://telegram-t/./src/hooks/useInterval.ts","webpack://telegram-t/./src/hooks/useLayoutEffectWithPrevDeps.ts","webpack://telegram-t/./src/hooks/useMediaTransition.ts","webpack://telegram-t/./src/hooks/useUniqueId.ts","webpack://telegram-t/./src/hooks/useMediaWithLoadProgress.ts","webpack://telegram-t/./src/hooks/useMouseInside.ts","webpack://telegram-t/./src/hooks/usePrevDuringAnimation.ts","webpack://telegram-t/./src/hooks/useReducer.ts","webpack://telegram-t/./src/hooks/useSendMessageAction.ts","webpack://telegram-t/./src/hooks/useVideoCleanup.ts","webpack://telegram-t/./src/lib/fastBlur.js","webpack://telegram-t/./src/util/audioPlayer.ts","webpack://telegram-t/./src/util/captureEvents.ts","webpack://telegram-t/./src/util/cssAnimationEndListeners.ts","webpack://telegram-t/./src/util/cycleRestrict.ts","webpack://telegram-t/./src/util/fastSmoothScroll.ts","webpack://telegram-t/./src/util/fastSmoothScrollHorizontal.ts","webpack://telegram-t/./src/util/focusEditableElement.ts","webpack://telegram-t/./src/util/getKeyFromEvent.ts","webpack://telegram-t/./src/util/mediaSession.ts","webpack://telegram-t/./src/util/parseMessageInput.ts","webpack://telegram-t/./src/util/patchSafariProgressiveAudio.ts","webpack://telegram-t/./src/util/stopEvent.ts"],"sourcesContent":["import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\nimport { ActiveEmojiInteraction } from '../../global/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaTransition from '../../hooks/useMediaTransition';\nimport useAnimatedEmoji from './hooks/useAnimatedEmoji';\nimport { LIKE_STICKER_ID } from './helpers/mediaDimensions';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './AnimatedEmoji.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n effect?: ApiSticker;\n isOwn?: boolean;\n soundId?: string;\n observeIntersection?: ObserveFn;\n size?: 'large' | 'medium' | 'small';\n lastSyncTime?: number;\n forceLoadPreview?: boolean;\n messageId?: number;\n chatId?: string;\n activeEmojiInteraction?: ActiveEmojiInteraction;\n};\n\nconst QUALITY = 1;\n\nconst AnimatedEmoji: FC = ({\n sticker,\n effect,\n isOwn,\n soundId,\n size = 'medium',\n observeIntersection,\n lastSyncTime,\n forceLoadPreview,\n messageId,\n chatId,\n activeEmojiInteraction,\n}) => {\n const {\n markAnimationLoaded,\n isAnimationLoaded,\n ref,\n width,\n style,\n handleClick,\n playKey,\n } = useAnimatedEmoji(size, chatId, messageId, soundId, activeEmojiInteraction, isOwn, undefined, effect?.emoji);\n\n const localMediaHash = `sticker${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail?.dataUri;\n const previewBlobUrl = useMedia(\n `${localMediaHash}?size=m`,\n !isIntersecting && !forceLoadPreview,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const transitionClassNames = useMediaTransition(previewBlobUrl);\n\n const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime);\n const isMediaLoaded = Boolean(mediaData);\n\n return (\n \n {!isAnimationLoaded && thumbDataUri && (\n \"\"\n )}\n {!isAnimationLoaded && previewBlobUrl && (\n \"\"\n )}\n {isMediaLoaded && localMediaHash && (\n \n )}\n
\n );\n};\n\nexport default memo(AnimatedEmoji);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { AudioOrigin, ISettings } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n isMessageLocal,\n isOwnMessage,\n} from '../../modules/helpers';\nimport { MAX_EMPTY_WAVEFORM_POINTS, renderWaveform } from './helpers/waveform';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport { getFileSizeString } from './helpers/documentInfo';\nimport { decodeWaveform, interpolateArray } from '../../util/waveform';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport { captureEvents } from '../../util/captureEvents';\nimport useMedia from '../../hooks/useMedia';\nimport { makeTrackId } from '../../util/audioPlayer';\nimport { getTranslation } from '../../util/langProvider';\n\nimport Button from '../ui/Button';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './Audio.scss';\n\ntype OwnProps = {\n theme: ISettings['theme'];\n message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n origin: AudioOrigin;\n date?: number;\n lastSyncTime?: number;\n className?: string;\n isSelectable?: boolean;\n isSelected?: boolean;\n isDownloading: boolean;\n onPlay: (messageId: number, chatId: string) => void;\n onReadMedia?: () => void;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: string) => void;\n};\n\nconst AVG_VOICE_DURATION = 10;\nconst MIN_SPIKES = IS_SINGLE_COLUMN_LAYOUT ? 20 : 25;\nconst MAX_SPIKES = IS_SINGLE_COLUMN_LAYOUT ? 50 : 75;\n// This is needed for browsers requiring user interaction before playing.\nconst PRELOAD = true;\n\nconst Audio: FC = ({\n theme,\n message,\n senderTitle,\n uploadProgress,\n origin,\n date,\n lastSyncTime,\n className,\n isSelectable,\n isSelected,\n isDownloading,\n onPlay,\n onReadMedia,\n onCancelUpload,\n onDateClick,\n}) => {\n const { content: { audio, voice, video }, isMediaUnread } = message;\n const isVoice = Boolean(voice || video);\n const isSeeking = useRef(false);\n const playStateBeforeSeeking = useRef(false);\n // eslint-disable-next-line no-null/no-null\n const seekerRef = useRef(null);\n const lang = useLang();\n const { isRtl } = lang;\n const dispatch = getDispatch();\n\n const [isActivated, setIsActivated] = useState(false);\n const shouldLoad = (isActivated || PRELOAD) && lastSyncTime;\n const coverHash = getMessageMediaHash(message, 'pictogram');\n const coverBlobUrl = useMedia(coverHash, false, ApiMediaFormat.BlobUrl);\n\n const mediaData = useMedia(\n getMessageMediaHash(message, 'inline'),\n !shouldLoad,\n getMessageMediaFormat(message, 'inline'),\n );\n\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'download'),\n !isDownloading,\n );\n\n const handleForcePlay = useCallback(() => {\n setIsActivated(true);\n onPlay(message.id, message.chatId);\n }, [message, onPlay]);\n\n const handleTrackChange = useCallback(() => {\n setIsActivated(false);\n }, []);\n\n const {\n isBuffered, bufferedProgress, bufferingHandlers, checkBuffering,\n } = useBuffering();\n\n const {\n isPlaying, playProgress, playPause, play, pause, setCurrentTime, duration,\n } = useAudioPlayer(\n makeTrackId(message),\n getMediaDuration(message)!,\n isVoice ? 'voice' : 'audio',\n mediaData,\n bufferingHandlers,\n undefined,\n checkBuffering,\n isActivated,\n handleForcePlay,\n handleTrackChange,\n isMessageLocal(message),\n );\n\n const isOwn = isOwnMessage(message);\n const waveformCanvasRef = useWaveformCanvas(theme, voice, (isMediaUnread && !isOwn) ? 1 : playProgress, isOwn);\n\n const withSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n\n useEffect(() => {\n setIsActivated(isPlaying);\n }, [isPlaying]);\n\n const isLoadingForPlaying = isActivated && !isBuffered;\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n isLoadingForPlaying || isDownloading,\n );\n\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring);\n\n const shouldRenderCross = shouldRenderSpinner && (isLoadingForPlaying || isUploading);\n\n const handleButtonClick = useCallback(() => {\n if (isUploading) {\n onCancelUpload?.();\n return;\n }\n\n if (!isPlaying) {\n onPlay(message.id, message.chatId);\n }\n\n getDispatch().setAudioPlayerOrigin({ origin });\n setIsActivated(!isActivated);\n playPause();\n }, [isUploading, isPlaying, isActivated, playPause, onCancelUpload, onPlay, message.id, message.chatId, origin]);\n\n useEffect(() => {\n if (onReadMedia && isMediaUnread && (isPlaying || isDownloading)) {\n onReadMedia();\n }\n }, [isPlaying, isMediaUnread, onReadMedia, isDownloading]);\n\n const handleDownloadClick = useCallback(() => {\n if (isDownloading) {\n dispatch.cancelMessageMediaDownload({ message });\n } else {\n dispatch.downloadMessageMedia({ message });\n }\n }, [dispatch, isDownloading, message]);\n\n const handleSeek = useCallback((e: MouseEvent | TouchEvent) => {\n if (isSeeking.current && seekerRef.current) {\n const { width, left } = seekerRef.current.getBoundingClientRect();\n const clientX = e instanceof MouseEvent ? e.clientX : e.targetTouches[0].clientX;\n e.stopPropagation(); // Prevent Slide-to-Reply activation\n // Prevent track skipping while seeking near end\n setCurrentTime(Math.max(Math.min(duration * ((clientX - left) / width), duration - 0.1), 0.001));\n }\n }, [duration, setCurrentTime]);\n\n const handleStartSeek = useCallback((e: MouseEvent | TouchEvent) => {\n if (e instanceof MouseEvent && e.button === 2) return;\n isSeeking.current = true;\n playStateBeforeSeeking.current = isPlaying;\n pause();\n handleSeek(e);\n }, [handleSeek, pause, isPlaying]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (playStateBeforeSeeking.current) play();\n }, [play]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useEffect(() => {\n if (!seekerRef.current || !withSeekline) return undefined;\n return captureEvents(seekerRef.current, {\n onCapture: handleStartSeek,\n onRelease: handleStopSeek,\n onClick: handleStopSeek,\n onDrag: handleSeek,\n });\n }, [withSeekline, handleStartSeek, handleSeek, handleStopSeek]);\n\n function renderFirstLine() {\n if (isVoice) {\n return senderTitle || 'Voice';\n }\n\n const { title, fileName } = audio!;\n\n return title || fileName;\n }\n\n function renderSecondLine() {\n if (isVoice) {\n return (\n
\n {formatMediaDuration((voice || video)!.duration)}\n
\n );\n }\n\n const { performer } = audio!;\n\n return (\n
\n {formatMediaDuration(duration)}\n \n {performer && {renderText(performer)}}\n {performer && senderTitle && }\n {senderTitle && {renderText(senderTitle)}}\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Audio',\n className,\n isOwn && origin === AudioOrigin.Inline && 'own',\n (origin === AudioOrigin.Search || origin === AudioOrigin.SharedMedia) && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (shouldRenderCross) {\n buttonClassNames.push('loading');\n } else if (isPlaying) {\n buttonClassNames.push('pause');\n } else if (!isPlaying) {\n buttonClassNames.push('play');\n }\n\n const contentClassName = buildClassName('content', withSeekline && 'with-seekline');\n\n function renderWithTitle() {\n return (\n <>\n
\n
\n

{renderText(renderFirstLine())}

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

{renderText(title || fileName)}

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

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

\n
\n );\n}\n\nfunction useWaveformCanvas(\n theme: ISettings['theme'],\n voice?: ApiVoice,\n playProgress = 0,\n isOwn = false,\n) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n\n const { data: spikes, peak } = useMemo(() => {\n if (!voice) {\n return undefined;\n }\n\n const { waveform, duration } = voice;\n if (!waveform) {\n return {\n data: new Array(Math.min(duration, MAX_EMPTY_WAVEFORM_POINTS)).fill(0),\n peak: 0,\n };\n }\n\n const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1);\n const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor);\n const decodedWaveform = decodeWaveform(new Uint8Array(waveform));\n\n return interpolateArray(decodedWaveform, spikesCount);\n }, [voice]) || {};\n\n useLayoutEffect(() => {\n const canvas = canvasRef.current;\n\n if (!canvas || !spikes || peak === undefined) {\n return;\n }\n\n const fillColor = theme === 'dark' ? '#494A78' : '#ADD3F7';\n const fillOwnColor = theme === 'dark' ? '#B7ABED' : '#AEDFA4';\n const progressFillColor = theme === 'dark' ? '#8774E1' : '#3390EC';\n const progressFillOwnColor = theme === 'dark' ? '#FFFFFF' : '#4FAE4E';\n\n renderWaveform(canvas, spikes, playProgress, {\n peak,\n fillStyle: isOwn ? fillOwnColor : fillColor,\n progressFillStyle: isOwn ? progressFillOwnColor : progressFillColor,\n });\n }, [isOwn, peak, playProgress, spikes, theme]);\n\n return canvasRef;\n}\n\nfunction renderSeekline(\n playProgress: number,\n bufferedProgress: number,\n seekerRef: React.Ref,\n) {\n return (\n }\n >\n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default memo(Audio);\n","type IWaveformProps = {\n peak: number;\n fillStyle: string;\n progressFillStyle: string;\n};\n\nexport const MAX_EMPTY_WAVEFORM_POINTS = 30;\nconst SPIKE_WIDTH = 2;\nconst SPIKE_STEP = 4;\nconst SPIKE_RADIUS = 1;\nconst HEIGHT = 23;\n\nexport function renderWaveform(\n canvas: HTMLCanvasElement,\n spikes: number[],\n progress: number,\n {\n peak, fillStyle, progressFillStyle,\n }: IWaveformProps,\n) {\n const width = spikes.length * SPIKE_STEP;\n const height = HEIGHT;\n\n canvas.width = width * 2;\n canvas.height = height * 2;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext('2d')!;\n ctx.scale(2, 2);\n\n spikes.forEach((item, i) => {\n ctx.globalAlpha = (i / spikes.length >= progress) ? 0.5 : 1;\n ctx.fillStyle = progress > i / spikes.length ? progressFillStyle : fillStyle;\n const spikeHeight = Math.max(2, HEIGHT * (item / Math.max(1, peak)));\n roundedRectangle(ctx, i * SPIKE_STEP, height, SPIKE_WIDTH, spikeHeight, SPIKE_RADIUS);\n ctx.fill();\n });\n}\n\nfunction roundedRectangle(\n ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number,\n) {\n if (width < 2 * radius) {\n radius = width / 2;\n }\n if (height < 2 * radius) {\n radius = height / 2;\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + width, y, x + width, y - height, radius);\n ctx.arcTo(x + width, y - height, x, y - height, radius);\n ctx.arcTo(x, y - height, x, y, radius);\n ctx.arcTo(x, y, x + width, y, radius);\n ctx.closePath();\n}\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\n// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018\nexport function decodeWaveform(encoded5bit: Uint8Array) {\n const bitsCount = encoded5bit.length * 8;\n const valuesCount = Math.floor(bitsCount / 5);\n if (!valuesCount) {\n return [];\n }\n\n // Read each 5 bit of encoded5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries in a general way except the last one.\n const result = Array(valuesCount);\n const bitsData = encoded5bit;\n for (let i = 0, l = valuesCount - 1; i !== l; ++i) {\n const byteIndex = Math.floor((i * 5) / 8);\n const bitShift = Math.floor((i * 5) % 8);\n const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8);\n result[i] = ((value >> bitShift) & 0x1F);\n }\n const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8);\n const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8);\n const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8);\n result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F;\n\n return result;\n}\n\nexport function interpolateArray(data: number[], fitCount: number) {\n let peak = 0;\n const newData = new Array(fitCount);\n const springFactor = data.length / fitCount;\n const leftFiller = data[0];\n const rightFiller = data[data.length - 1];\n for (let i = 0; i < fitCount; i++) {\n const idx = Math.floor(i * springFactor);\n const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3;\n newData[i] = val;\n if (peak < val) {\n peak = val;\n }\n }\n return { data: newData, peak };\n}\n","import React, { 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,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\nimport { ApiChat, ApiCountryCode, ApiUser } from '../../api/types';\n\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isUserId, isUserRightBanned, selectIsChatMuted,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { copyTextToClipboard } from '../../util/clipboard';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport useLang from '../../hooks/useLang';\n\nimport ListItem from '../ui/ListItem';\nimport Switcher from '../ui/Switcher';\n\ntype OwnProps = {\n chatOrUserId: string;\n forceShowSelf?: boolean;\n};\n\ntype StateProps =\n {\n user?: ApiUser;\n chat?: ApiChat;\n canInviteUsers?: boolean;\n isMuted?: boolean;\n phoneCodeList: ApiCountryCode[];\n }\n & Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n isMuted,\n phoneCodeList,\n}) => {\n const {\n loadFullUser,\n showNotification,\n updateChatMutedState,\n } = getDispatch();\n\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const { id: chatId } = chat || {};\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const handleNotificationChange = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n }, [chatId, isMuted, updateChatMutedState]);\n\n if (!chat || chat.isRestricted || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n function copy(text: string, entity: string) {\n copyTextToClipboard(text);\n showNotification({ message: `${entity} was copied` });\n }\n\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneCodeList, phoneNumber);\n const link = getChatLink(chat);\n const description = (fullInfo?.bio) || getChatDescription(chat);\n\n return (\n
\n {formattedNumber && !!formattedNumber.length && (\n copy(formattedNumber, lang('Phone'))}>\n {formattedNumber}\n {lang('Phone')}\n \n )}\n {username && (\n copy(`@${username}`, lang('Username'))}\n >\n {renderText(username)}\n {lang('Username')}\n \n )}\n {description && !!description.length && (\n \n \n {renderText(description, ['br', 'links', 'emoji'])}\n \n {lang(userId ? 'UserBio' : 'Info')}\n \n )}\n {(canInviteUsers || !username) && link && (\n copy(link, lang('SetUrlPlaceholder'))}\n >\n
{link}
\n {lang('SetUrlPlaceholder')}\n \n )}\n {!forceShowSelf && (\n \n {lang('Notifications')}\n \n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n const { lastSyncTime, countryList: { phoneCodes: phoneCodeList } } = global;\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isUserId(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n const isMuted = chat && selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n const canInviteUsers = chat && !user && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, phoneCodeList, chat, user, canInviteUsers, isMuted,\n };\n },\n)(ChatExtra));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\n\nimport { selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isUserId,\n isUserBot,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n getChatTitle,\n} from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Avatar from './Avatar';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './DeleteChatModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n chat: ApiChat;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isBot?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\n currentUserId: string | undefined;\n canDeleteForAll?: boolean;\n contactName?: string;\n};\n\nconst DeleteChatModal: FC = ({\n isOpen,\n chat,\n isChannel,\n isPrivateChat,\n isChatWithSelf,\n isBot,\n isBasicGroup,\n isSuperGroup,\n currentUserId,\n canDeleteForAll,\n contactName,\n onClose,\n onCloseAnimationEnd,\n}) => {\n const {\n leaveChannel,\n deleteHistory,\n deleteChannel,\n deleteChatUser,\n blockContact,\n } = getDispatch();\n\n const lang = useLang();\n const chatTitle = getChatTitle(lang, chat);\n\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n\n onClose();\n }, [deleteHistory, chat.id, onClose]);\n\n const handleDeleteAndStop = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n blockContact({ contactId: chat.id, accessHash: chat.accessHash });\n\n onClose();\n }, [deleteHistory, chat.id, chat.accessHash, blockContact, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat) {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if (isBasicGroup) {\n deleteChatUser({ chatId: chat.id, userId: currentUserId });\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if ((isChannel || isSuperGroup) && !chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else if ((isChannel || isSuperGroup) && chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n }\n onClose();\n }, [\n isPrivateChat,\n isBasicGroup,\n isChannel,\n isSuperGroup,\n currentUserId,\n chat.isCreator,\n chat.id,\n onClose,\n deleteHistory,\n deleteChatUser,\n leaveChannel,\n deleteChannel,\n ]);\n\n function renderHeader() {\n return (\n
\n \n

{lang(renderTitle())}

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

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

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

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

;\n }\n\n return

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

;\n }\n\n function renderActionText() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n if (isChannel && chat.isCreator) {\n return 'Chat.Input.Delete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete';\n }\n\n return (\n \n {renderMessage()}\n {isBot && (\n \n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chat }): StateProps => {\n const isPrivateChat = isUserId(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, chat.id);\n const user = isPrivateChat && selectUser(global, getPrivateChatUserId(chat)!);\n const isBot = user && isUserBot(user) && !chat.isSupport;\n const canDeleteForAll = (isPrivateChat && !isChatWithSelf && !isBot);\n const contactName = isPrivateChat\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isBot,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n currentUserId: global.currentUserId,\n canDeleteForAll,\n contactName,\n };\n },\n)(DeleteChatModal));\n","import React, {\n FC, useCallback, memo, useRef, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat, ApiMessage } from '../../api/types';\n\nimport { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo';\nimport {\n getMediaTransferState,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n isMessageDocumentVideo,\n} from '../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport useMedia from '../../hooks/useMedia';\nimport useFlag from '../../hooks/useFlag';\n\nimport File from './File';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n smaller?: boolean;\n isSelected?: boolean;\n isSelectable?: boolean;\n canAutoLoad?: boolean;\n uploadProgress?: number;\n withDate?: boolean;\n datetime?: number;\n className?: string;\n sender?: string;\n autoLoadFileMaxSizeMb?: number;\n isDownloading: boolean;\n onCancelUpload?: () => void;\n onMediaClick?: () => void;\n onDateClick?: (messageId: number, chatId: string) => void;\n};\n\nconst BYTES_PER_MB = 1024 * 1024;\n\nconst Document: FC = ({\n message,\n observeIntersection,\n smaller,\n canAutoLoad,\n autoLoadFileMaxSizeMb,\n uploadProgress,\n withDate,\n datetime,\n className,\n sender,\n isSelected,\n isSelectable,\n onCancelUpload,\n onMediaClick,\n onDateClick,\n isDownloading,\n}) => {\n const dispatch = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const document = message.content.document!;\n const { fileName, size, timestamp } = document;\n const extension = getDocumentExtension(document) || '';\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const [wasIntersected, markIntersected] = useFlag();\n useEffect(() => {\n if (isIntersecting) {\n markIntersected();\n }\n }, [isIntersecting, markIntersected]);\n\n // Auto-loading does not use global download manager because requires additional click to save files locally\n const [isLoadAllowed, setIsLoadAllowed] = useState(\n canAutoLoad && (!autoLoadFileMaxSizeMb || size <= autoLoadFileMaxSizeMb * BYTES_PER_MB),\n );\n\n const shouldDownload = Boolean(isDownloading || (isLoadAllowed && wasIntersected));\n\n const documentHash = getMessageMediaHash(message, 'download');\n const { loadProgress: downloadProgress, mediaData } = useMediaWithLoadProgress(\n documentHash, !shouldDownload, undefined, undefined, undefined, true,\n );\n const isLoaded = Boolean(mediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !isLoaded);\n\n const hasPreview = getDocumentHasPreview(document);\n const thumbDataUri = hasPreview ? getMessageMediaThumbDataUri(message) : undefined;\n const localBlobUrl = hasPreview ? document.previewBlobUrl : undefined;\n const previewData = useMedia(getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n\n const withMediaViewer = onMediaClick && Boolean(document.mediaType);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n return;\n }\n\n if (isDownloading) {\n dispatch.cancelMessageMediaDownload({ message });\n return;\n }\n\n if (isTransferring) {\n setIsLoadAllowed(false);\n return;\n }\n\n if (withMediaViewer) {\n onMediaClick!();\n } else {\n dispatch.downloadMessageMedia({ message });\n }\n }, [\n isUploading, isDownloading, isTransferring, withMediaViewer, onCancelUpload, dispatch, message, onMediaClick,\n ]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n return (\n \n );\n};\n\nexport default memo(Document);\n","import { RefObject } from 'react';\nimport React, { FC, memo, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useMediaTransition from '../../hooks/useMediaTransition';\nimport buildClassName from '../../util/buildClassName';\nimport { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat';\nimport { getColorFromExtension, getFileSizeString } from './helpers/documentInfo';\nimport { getDocumentThumbnailDimensions } from './helpers/mediaDimensions';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './File.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n name: string;\n extension?: string;\n size: number;\n timestamp?: number;\n sender?: string;\n thumbnailDataUri?: string;\n previewData?: string;\n className?: string;\n smaller?: boolean;\n isTransferring?: boolean;\n isUploading?: boolean;\n isSelectable?: boolean;\n isSelected?: boolean;\n transferProgress?: number;\n actionIcon?: string;\n onClick?: () => void;\n onDateClick?: (e: React.MouseEvent) => void;\n};\n\nconst File: FC = ({\n ref,\n name,\n size,\n extension = '',\n timestamp,\n sender,\n thumbnailDataUri,\n previewData,\n className,\n smaller,\n isTransferring,\n isUploading,\n isSelectable,\n isSelected,\n transferProgress,\n actionIcon,\n onClick,\n onDateClick,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const transitionClassNames = useMediaTransition(previewData);\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, true);\n\n const color = getColorFromExtension(extension);\n const sizeString = getFileSizeString(size);\n\n const { width, height } = getDocumentThumbnailDimensions(smaller);\n\n const fullClassName = buildClassName(\n 'File',\n className,\n smaller && 'smaller',\n onClick && !isUploading && 'interactive',\n isSelected && 'file-is-selected',\n );\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n
\n {thumbnailDataUri || previewData ? (\n
\n \n \n
\n ) : (\n
\n {extension.length <= 4 && (\n {extension}\n )}\n
\n )}\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {onClick && (\n \n )}\n
\n
\n
{renderText(name)}
\n
\n \n {isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString}\n \n {sender && {renderText(sender)}}\n {!sender && timestamp && (\n <>\n \n {formatMediaDateTime(lang, timestamp * 1000, true)}\n \n )}\n
\n
\n {sender && timestamp && (\n {formatPastTimeShort(lang, timestamp * 1000)}\n )}\n
\n );\n};\n\nexport default memo(File);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiTypingStatus } from '../../api/types';\nimport { GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport {\n getChatTypeString,\n getChatTitle,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport { selectChat, selectChatMessages, selectChatOnlineCount } from '../../modules/selectors';\nimport renderText from './helpers/renderText';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n chatId: string;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'small' | 'medium' | 'large' | 'jumbo';\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n withChatType?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps =\n {\n chat?: ApiChat;\n onlineCount?: number;\n areMessagesLoaded: boolean;\n }\n & Pick;\n\nconst GroupChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n withChatType,\n noRtl,\n chat,\n onlineCount,\n areMessagesLoaded,\n lastSyncTime,\n}) => {\n const {\n loadFullChat,\n openMediaViewer,\n } = getDispatch();\n\n const isSuperGroup = chat && isChatSuperGroup(chat);\n const { id: chatId, isMin, isRestricted } = chat || {};\n\n useEffect(() => {\n if (chatId && !isMin && withFullInfo && lastSyncTime) {\n loadFullChat({ chatId });\n }\n }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (chat && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: chat.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [chat, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!chat) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n if (withChatType) {\n return (\n
{lang(getChatTypeString(chat))}
\n );\n }\n\n const handle = withUsername ? chat.username : undefined;\n const groupStatus = getGroupStatus(lang, chat);\n const onlineStatus = onlineCount ? `, ${lang('OnlineCount', onlineCount, 'i')}` : undefined;\n\n return (\n
\n {handle && {handle}}\n {groupStatus}\n {onlineStatus && {onlineStatus}}\n
\n );\n }\n\n return (\n
\n \n
\n
\n

{renderText(getChatTitle(lang, chat))}

\n {chat.isVerified && }\n
\n {renderStatusOrTyping()}\n
\n
\n );\n};\n\nfunction getGroupStatus(lang: LangFn, chat: ApiChat) {\n const chatTypeString = lang(getChatTypeString(chat));\n const { membersCount } = chat;\n\n if (chat.isRestricted) {\n return chatTypeString === 'Channel' ? 'channel is inaccessible' : 'group is inaccessible';\n }\n\n if (!membersCount) {\n return chatTypeString;\n }\n\n return chatTypeString === 'Channel'\n ? lang('Subscribers', membersCount, 'i')\n : lang('Members', membersCount, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { lastSyncTime } = global;\n const chat = selectChat(global, chatId);\n const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined;\n const areMessagesLoaded = Boolean(selectChatMessages(global, chatId));\n\n return {\n lastSyncTime, chat, onlineCount, areMessagesLoaded,\n };\n },\n)(GroupChatInfo));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types';\n\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport MessageOutgoingStatus from './MessageOutgoingStatus';\n\nimport './LastMessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n};\n\nconst LastMessageMeta: FC = ({ message, outgoingStatus }) => {\n const lang = useLang();\n return (\n
\n {outgoingStatus && (\n \n )}\n {formatPastTimeShort(lang, message.date * 1000)}\n
\n );\n};\n\nexport default memo(LastMessageMeta);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport stopEvent from '../../util/stopEvent';\nimport {\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaTransition from '../../hooks/useMediaTransition';\n\nimport './Media.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n idPrefix?: string;\n isProtected?: boolean;\n onClick?: (messageId: number, chatId: string) => void;\n};\n\nconst Media: FC = ({\n message,\n idPrefix = 'shared-media',\n isProtected,\n onClick,\n}) => {\n const handleClick = useCallback(() => {\n onClick!(message.id, message.chatId);\n }, [message.id, message.chatId, onClick]);\n\n const thumbDataUri = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n const transitionClassNames = useMediaTransition(mediaBlobUrl);\n\n const video = getMessageVideo(message);\n\n return (\n
\n \"\"\n \n {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}}\n {isProtected && }\n
\n );\n};\n\nexport default memo(Media);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessageOutgoingStatus } from '../../api/types';\n\nimport Transition from '../ui/Transition';\n\nimport './MessageOutgoingStatus.scss';\n\ntype OwnProps = {\n status: ApiMessageOutgoingStatus;\n};\n\nenum Keys {\n failed, pending, succeeded, read,\n}\n\nconst MessageOutgoingStatus: FC = ({ status }) => {\n return (\n
\n \n {() => (\n \n )}\n \n
\n );\n};\n\nexport default memo(MessageOutgoingStatus);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './NothingFound.scss';\n\ninterface OwnProps {\n text?: string;\n description?: string;\n}\n\nconst DEFAULT_TEXT = 'Nothing found.';\n\nconst NothingFound: FC = ({ text = DEFAULT_TEXT, description }) => {\n const lang = useLang();\n const { transitionClassNames } = useShowTransition(true);\n\n return (\n
\n {text}\n {description &&

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

}\n
\n );\n};\n\nexport default memo(NothingFound);\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isUserId } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: string[];\n selectedIds: string[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n noScrollRestore?: boolean;\n onSelectedIdsChange: (ids: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore?: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n noScrollRestore,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: string) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds?.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isUserId(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

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

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport { getChatTitle, getUserFirstOrLastName, isUserId } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\n\nimport './PickerSelectedItem.scss';\n\ntype OwnProps = {\n chatOrUserId?: string;\n icon?: string;\n title?: string;\n isMinimized?: boolean;\n canClose?: boolean;\n onClick: (arg: any) => void;\n clickArg: any;\n className?: string;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n user?: ApiUser;\n};\n\nconst PickerSelectedItem: FC = ({\n icon,\n title,\n isMinimized,\n canClose,\n onClick,\n clickArg,\n chat,\n user,\n className,\n}) => {\n const lang = useLang();\n\n let iconElement: any;\n let titleText: any;\n\n if (icon && title) {\n iconElement = (\n
\n \n
\n );\n\n titleText = title;\n } else if (chat || user) {\n iconElement = (\n \n );\n\n const name = !chat || (user && !user.isSelf)\n ? getUserFirstOrLastName(user)\n : getChatTitle(lang, chat, user);\n\n titleText = name ? renderText(name) : undefined;\n }\n\n const fullClassName = buildClassName(\n 'PickerSelectedItem',\n className,\n isMinimized && 'minimized',\n canClose && 'closeable',\n );\n\n return (\n onClick(clickArg)}\n title={isMinimized ? titleText : undefined}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {iconElement}\n {!isMinimized && (\n
\n {titleText}\n
\n )}\n {canClose && (\n
\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n if (!chatOrUserId) {\n return {};\n }\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isUserId(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n return {\n chat,\n user,\n };\n },\n)(PickerSelectedItem));\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus, ApiUserStatus } from '../../api/types';\nimport { GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { selectChatMessages, selectUser, selectUserStatus } from '../../modules/selectors';\nimport { getUserFullName, getUserStatus, isUserOnline } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n userId: string;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n forceShowSelf?: boolean;\n status?: string;\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n noStatusOrTyping?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps =\n {\n user?: ApiUser;\n userStatus?: ApiUserStatus;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\n serverTimeOffset: number;\n }\n & Pick;\n\nconst PrivateChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n status,\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n noStatusOrTyping,\n noRtl,\n user,\n userStatus,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n serverTimeOffset,\n}) => {\n const {\n loadFullUser,\n openMediaViewer,\n } = getDispatch();\n\n const { id: userId } = user || {};\n const fullName = getUserFullName(user);\n\n useEffect(() => {\n if (withFullInfo && lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime, withFullInfo]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (user && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: user.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [user, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!user) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (status) {\n return (\n {status}\n );\n }\n\n if (withUpdatingStatus && !areMessagesLoaded) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!user) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n return (\n
\n {withUsername && user.username && {user.username}}\n {getUserStatus(lang, user, userStatus, serverTimeOffset)}\n
\n );\n }\n\n return (\n
\n \n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

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

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {isVerifiedIconShown && }\n
\n )}\n {!isSavedMessages && renderStatus()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { connectionState, serverTimeOffset } = global;\n const user = selectUser(global, userId);\n const userStatus = selectUserStatus(global, userId);\n const chat = selectChat(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const { animationLevel } = global.settings.byKey;\n\n return {\n connectionState,\n user,\n userStatus,\n chat,\n isSavedMessages,\n animationLevel,\n serverTimeOffset,\n };\n },\n)(ProfileInfo));\n","import {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser,\n} from '../../../api/types';\nimport { useEffect } from '../../../lib/teact/teact';\nimport * as mediaLoader from '../../../util/mediaLoader';\n\nconst PHOTOS_TO_PRELOAD = 4;\n\nexport default function usePhotosPreload(\n profile: ApiUser | ApiChat | undefined,\n photos: ApiPhoto[],\n currentIndex: number,\n) {\n useEffect(() => {\n photos.slice(currentIndex, currentIndex + PHOTOS_TO_PRELOAD).forEach((photo) => {\n const mediaData = mediaLoader.getFromMemory(`photo${photo.id}?size=c`);\n if (!mediaData) {\n mediaLoader.fetch(`photo${photo.id}?size=c`, ApiMediaFormat.BlobUrl);\n }\n });\n }, [currentIndex, photos]);\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\nimport { getGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\n\nimport useMedia from '../../hooks/useMedia';\nimport buildClassName from '../../util/buildClassName';\n\nimport './ReactionStaticEmoji.scss';\n\ntype OwnProps = {\n reaction: string;\n ref?: RefObject;\n className?: string;\n};\n\nconst ReactionStaticEmoji: FC = ({\n reaction,\n ref,\n className,\n}) => {\n const staticIconId = getGlobal().availableReactions?.find((l) => l.reaction === reaction)?.staticIcon?.id;\n const mediaData = useMedia(`document${staticIconId}`, !staticIconId, ApiMediaFormat.BlobUrl);\n\n return (\n \n );\n};\n\nexport default memo(ReactionStaticEmoji);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(sticker.isAnimated && localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const { transitionClassNames: previewTransitionClassNames } = useShowTransition(\n Boolean(previewBlobUrl || canAnimatedPlay),\n undefined,\n undefined,\n 'slow',\n );\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n onClick && 'interactive',\n sticker.isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = thumbDataUri && !canAnimatedPlay ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {!canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './StickerSetModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst StickerSetModalAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerSetModal = useModuleLoader(Bundles.Extra, 'StickerSetModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSetModal ? : undefined;\n};\n\nexport default memo(StickerSetModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './TypingStatus.scss';\n\ntype OwnProps = {\n typingStatus: ApiTypingStatus;\n};\n\ntype StateProps = {\n typingUser?: ApiUser;\n};\n\nconst TypingStatus: FC = ({ typingStatus, typingUser }) => {\n const lang = useLang();\n const typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {/* fix for translation \"username _is_ typing\" */}\n {lang(typingStatus.action).replace('{user}', '').replace('{emoji}', typingStatus.emoji).trim()}\n \n

\n );\n};\n\nexport default memo(withGlobal(\n (global, { typingStatus }): StateProps => {\n if (!typingStatus.userId) {\n return {};\n }\n\n const typingUser = selectUser(global, typingStatus.userId);\n\n return { typingUser };\n },\n)(TypingStatus));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport './VerifiedIcon.scss';\n\nconst VerifiedIcon: FC = () => {\n return (\n \n );\n};\n\nexport default VerifiedIcon;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiWebPage } from '../../api/types';\n\nimport { getFirstLinkInMessage, getMessageSummaryText, getMessageWebPage } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport trimText from '../../util/trimText';\nimport renderText from './helpers/renderText';\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport Media from './Media';\nimport Link from '../ui/Link';\nimport SafeLink from './SafeLink';\n\nimport './WebLink.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n isProtected?: boolean;\n onMessageClick: (messageId: number, chatId: string) => void;\n};\n\nconst WebLink: FC = ({\n message, senderTitle, isProtected, onMessageClick,\n}) => {\n const lang = useLang();\n\n let linkData: ApiWebPage | undefined = getMessageWebPage(message);\n\n if (!linkData) {\n const link = getFirstLinkInMessage(message);\n if (link) {\n const { url, domain } = link;\n const messageText = getMessageSummaryText(lang, message);\n\n linkData = {\n siteName: domain.replace(/^www./, ''),\n url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`,\n description: messageText !== url ? messageText : undefined,\n } as ApiWebPage;\n }\n }\n\n const handleMessageClick = useCallback(() => {\n onMessageClick(message.id, message.chatId);\n }, [onMessageClick, message.id, message.chatId]);\n\n if (!linkData) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n video,\n } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n (!photo && !video) && 'without-media',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {renderText(title || siteName || displayUrl)}\n \n {truncatedDescription && (\n \n {renderText(truncatedDescription)}\n \n )}\n \n {url.replace('mailto:', '') || displayUrl}\n \n {senderTitle &&
{renderText(senderTitle)}
}\n
\n {senderTitle && (\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n )}\n \n );\n};\n\nexport default memo(WebLink);\n","import {\n ApiPhoto, ApiVideo, ApiSticker, ApiDimensions,\n} from '../../../api/types';\n\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport { getPhotoInlineDimensions, getVideoDimensions } from '../../../modules/helpers';\n\nexport const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)';\nexport const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10);\nexport const ROUND_VIDEO_DIMENSIONS_PX = 240;\nexport const GIF_MIN_WIDTH = 300;\nexport const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 };\nexport const LIKE_STICKER_ID = '4986041492570112461';\n\nconst DEFAULT_MEDIA_DIMENSIONS: ApiDimensions = { width: 100, height: 100 };\nconst MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM = 4.5;\nconst MOBILE_SCREEN_MESSAGE_EXTRA_WIDTH_REM = 7;\nconst MESSAGE_MAX_WIDTH_REM = 29;\nconst MESSAGE_OWN_MAX_WIDTH_REM = 30;\n\nlet cachedMaxWidthOwn: number | undefined;\nlet cachedMaxWidth: number | undefined;\nlet cachedMaxWidthNoAvatar: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean, noAvatars?: boolean) {\n const regularMaxWidth = fromOwnMessage ? MESSAGE_OWN_MAX_WIDTH_REM : MESSAGE_MAX_WIDTH_REM;\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return regularMaxWidth;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidthOwn) {\n cachedMaxWidthOwn = Math.min(\n MESSAGE_OWN_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n MESSAGE_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n if (!cachedMaxWidthNoAvatar) {\n cachedMaxWidthNoAvatar = Math.min(\n MESSAGE_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n\n return fromOwnMessage\n ? cachedMaxWidthOwn\n : (noAvatars ? cachedMaxWidthNoAvatar : cachedMaxWidth);\n}\n\nexport function getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n noAvatars?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage, noAvatars) - extraPaddingRem;\n\n return availableWidthRem * REM;\n}\n\nfunction getAvailableHeight(isGif?: boolean, aspectRatio?: number) {\n if (\n isGif && aspectRatio\n && aspectRatio >= 0.75 && aspectRatio <= 1.25\n ) {\n return 20 * REM;\n }\n\n return 27 * REM;\n}\n\nfunction calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n isGif,\n noAvatars,\n}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n noAvatars?: boolean;\n}): ApiDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto, noAvatars);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n const mediaWidth = isGif ? Math.max(GIF_MIN_WIDTH, width) : width;\n const mediaHeight = isGif ? height * (mediaWidth / width) : height;\n\n return calculateDimensions(availableWidth, availableHeight, mediaWidth, mediaHeight);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): ApiDimensions {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n const { width: windowWidth, height: windowHeight } = windowSize.get();\n let occupiedHeightRem = isVideo && mql.matches ? 10 : 8.25;\n if (withFooter) {\n occupiedHeightRem = mql.matches ? 10 : 15;\n }\n\n return {\n width: windowWidth,\n height: windowHeight - occupiedHeightRem * REM,\n };\n}\n\nexport function calculateInlineImageDimensions(\n photo: ApiPhoto,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n noAvatars?: boolean,\n) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n noAvatars,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n noAvatars?: boolean,\n) {\n const { width, height } = getVideoDimensions(video) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isGif: video.isGif,\n noAvatars,\n });\n}\n\nexport function getPictogramDimensions(): ApiDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): ApiDimensions {\n if (smaller) {\n return {\n width: 3 * REM,\n height: 3 * REM,\n };\n }\n\n return {\n width: 3.375 * REM,\n height: 3.375 * REM,\n };\n}\n\nexport function getStickerDimensions(sticker: ApiSticker): ApiDimensions {\n const { width } = sticker;\n let { height } = sticker;\n\n // For some reason this sticker has some weird `height` value\n if (sticker.id === LIKE_STICKER_ID) {\n height = width;\n }\n\n const aspectRatio = (height && width) && height / width;\n const baseWidth = REM * (\n IS_SINGLE_COLUMN_LAYOUT\n ? STICKER_SIZE_INLINE_MOBILE_FACTOR\n : STICKER_SIZE_INLINE_DESKTOP_FACTOR\n );\n const calculatedHeight = aspectRatio ? baseWidth * aspectRatio : baseWidth;\n\n if (aspectRatio && calculatedHeight > baseWidth) {\n return {\n width: Math.round(baseWidth / aspectRatio),\n height: baseWidth,\n };\n }\n\n return {\n width: baseWidth,\n height: calculatedHeight,\n };\n}\n\nexport function calculateMediaViewerDimensions(\n { width, height }: ApiDimensions, withFooter: boolean, isVideo: boolean = false,\n): ApiDimensions {\n const { width: availableWidth, height: availableHeight } = getMediaViewerAvailableDimensions(withFooter, isVideo);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function calculateDimensions(\n availableWidth: number,\n availableHeight: number,\n mediaWidth: number,\n mediaHeight: number,\n): ApiDimensions {\n const aspectRatio = mediaHeight / mediaWidth;\n const calculatedWidth = Math.min(mediaWidth, availableWidth);\n const calculatedHeight = Math.round(calculatedWidth * aspectRatio);\n\n if (calculatedHeight > availableHeight) {\n return {\n width: Math.round(availableHeight / aspectRatio),\n height: availableHeight,\n };\n }\n\n return {\n width: calculatedWidth,\n height: Math.round(calculatedWidth * aspectRatio),\n };\n}\n","import { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMessageEntity, ApiMessageEntityTypes, ApiMessage } from '../../../api/types';\n\nimport { getMessageText } from '../../../modules/helpers';\nimport renderText from './renderText';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextPart = string | Element;\n\nexport function renderMessageText(message: ApiMessage, highlight?: string, shouldRenderHqEmoji?: boolean) {\n const formattedText = message.content.text;\n\n if (!formattedText || !formattedText.text) {\n const rawText = getMessageText(message);\n return rawText ? [rawText] : undefined;\n }\n const { text, entities } = formattedText;\n\n return renderTextWithEntities(text, entities, highlight, shouldRenderHqEmoji);\n}\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set;\n nestedEntities: IOrganizedEntity[];\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities: IOrganizedEntity[] = [];\n const parsedNestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter(Boolean as any);\n\n parsedNestedEntities.forEach((parsedEntity) => {\n let isChanged = false;\n\n parsedEntity.organizedIndexes.forEach((organizedIndex) => {\n if (!isChanged && !organizedIndexes.has(organizedIndex)) {\n isChanged = true;\n }\n\n organizedIndexes.add(organizedIndex);\n });\n\n if (isChanged) {\n nestedEntities.push(parsedEntity);\n }\n });\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntities = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(entity, entityContent, nestedEntityContent);\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntities.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntities.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n if (!entityText) {\n return renderMessagePart(renderedContent);\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Blockquote:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.BotCommand:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Code:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Email:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Italic:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.MentionName:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Mention:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Phone:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Pre:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.Strike:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Underline:\n return {renderMessagePart(renderedContent)};\n default:\n return renderMessagePart(renderedContent);\n }\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['escape_html', 'emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n if (highlight) {\n return renderText(content, [emojiFilter, 'br', 'highlight'], { highlight });\n } else {\n return renderText(content, [emojiFilter, 'br']);\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent) {\n getDispatch().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent) {\n getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getDispatch().searchTextMessagesLocal();\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' && entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(entityContent, ['escape_html', 'emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Italic:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Underline:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Code:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`
${renderedContent}
\\`\\`\\``;\n case ApiMessageEntityTypes.Strike:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.MentionName:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `${renderedContent}`;\n default:\n return renderedContent;\n }\n}\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport safePlay from '../../../util/safePlay';\nimport { getDispatch } from '../../../lib/teact/teactn';\nimport useMedia from '../../../hooks/useMedia';\nimport { ActiveEmojiInteraction } from '../../../global/types';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectLocalAnimatedEmojiEffectByName } from '../../../modules/selectors';\n\nconst WIDTH = {\n large: 160,\n medium: 128,\n small: 104,\n};\nconst INTERACTION_BUNCH_TIME = 1000;\nconst MS_DIVIDER = 1000;\nconst TIME_DEFAULT = 0;\n\nexport default function useAnimatedEmoji(\n size: 'large' | 'medium' | 'small',\n chatId?: string,\n messageId?: number,\n soundId?: string,\n activeEmojiInteraction?: ActiveEmojiInteraction,\n isOwn?: boolean,\n localEffect?: string,\n emoji?: string,\n) {\n const {\n interactWithAnimatedEmoji, sendEmojiInteraction, sendWatchingEmojiInteraction,\n } = getDispatch();\n\n const hasEffect = localEffect || emoji;\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n // eslint-disable-next-line no-null/no-null\n const audioRef = useRef(null);\n\n const soundMediaData = useMedia(soundId ? `document${soundId}` : undefined, !soundId);\n\n const width = WIDTH[size];\n const style = `width: ${width}px; height: ${width}px;`;\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n const interactions = useRef(undefined);\n const startedInteractions = useRef(undefined);\n const sendInteractionBunch = useCallback(() => {\n const container = ref.current;\n\n if (!container) return;\n\n sendEmojiInteraction({\n chatId,\n messageId,\n localEffect,\n emoji,\n interactions: interactions.current,\n });\n startedInteractions.current = undefined;\n interactions.current = undefined;\n }, [sendEmojiInteraction, chatId, messageId, localEffect, emoji]);\n\n const play = useCallback(() => {\n setPlayKey(String(Math.random()));\n\n const audio = audioRef.current;\n if (soundMediaData) {\n if (audio) {\n audio.pause();\n audio.remove();\n }\n audioRef.current = new Audio();\n audioRef.current.src = soundMediaData;\n safePlay(audioRef.current);\n audioRef.current.addEventListener('ended', () => {\n audioRef.current = undefined;\n }, { once: true });\n }\n }, [soundMediaData]);\n\n const handleClick = useCallback(() => {\n play();\n\n const container = ref.current;\n\n if (!hasEffect || !container || !messageId || !chatId) {\n return;\n }\n\n const { x, y } = container.getBoundingClientRect();\n\n interactWithAnimatedEmoji({\n localEffect,\n emoji,\n x,\n y,\n startSize: width,\n isReversed: !isOwn,\n });\n\n if (!interactions.current) {\n interactions.current = [];\n startedInteractions.current = performance.now();\n setTimeout(sendInteractionBunch, INTERACTION_BUNCH_TIME);\n }\n\n interactions.current.push(startedInteractions.current\n ? (performance.now() - startedInteractions.current) / MS_DIVIDER\n : TIME_DEFAULT);\n }, [\n chatId, emoji, hasEffect, interactWithAnimatedEmoji, isOwn,\n localEffect, messageId, play, sendInteractionBunch, width,\n ]);\n\n // Set an end anchor for remote activated interaction\n useEffect(() => {\n const container = ref.current;\n\n if (!container || !activeEmojiInteraction) return;\n\n const {\n messageId: selectedMessageId, endX, endY,\n } = activeEmojiInteraction;\n\n if (!endX && !endY && selectedMessageId === messageId) {\n const { x, y } = container.getBoundingClientRect();\n\n sendWatchingEmojiInteraction({\n chatId,\n emoticon: localEffect ? selectLocalAnimatedEmojiEffectByName(localEffect) : emoji,\n startSize: width,\n x,\n y,\n isReversed: !isOwn,\n });\n play();\n }\n }, [\n activeEmojiInteraction, chatId, emoji, isOwn, localEffect, messageId, play, sendWatchingEmojiInteraction, width,\n ]);\n\n return {\n playKey,\n ref,\n style,\n width,\n handleClick,\n markAnimationLoaded,\n isAnimationLoaded,\n };\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ChatFolderModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ChatFolderModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ChatFolderModal = useModuleLoader(Bundles.Extra, 'ChatFolderModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ChatFolderModal ? : undefined;\n};\n\nexport default memo(ChatFolderModalAsync);\n","import { useMemo } from '../../../../lib/teact/teact';\n\nexport enum ChatAnimationTypes {\n Move,\n Opacity,\n None,\n}\n\nexport function useChatAnimationType(orderDiffById: Record) {\n return useMemo(() => {\n const orderDiffs = Object.values(orderDiffById);\n const numberOfUp = orderDiffs.filter((diff) => diff < 0).length;\n const numberOfDown = orderDiffs.filter((diff) => diff > 0).length;\n\n return (chatId: string): ChatAnimationTypes => {\n const orderDiff = orderDiffById[chatId];\n if (orderDiff === 0) {\n return ChatAnimationTypes.None;\n }\n\n if (\n orderDiff === Infinity\n || orderDiff === -Infinity\n || (numberOfUp <= numberOfDown && orderDiff < 0)\n || (numberOfDown < numberOfUp && orderDiff > 0)\n ) {\n return ChatAnimationTypes.Opacity;\n }\n\n return ChatAnimationTypes.Move;\n };\n }, [orderDiffById]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ShowTransition from '../../ui/ShowTransition';\n\nimport './Badge.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst Badge: FC = ({ chat, isPinned, isMuted }) => {\n const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned);\n const className = buildClassName(\n 'Badge',\n isMuted && 'muted',\n isPinned && 'pinned',\n Boolean(chat.unreadCount || chat.hasUnreadMark) && 'unread',\n );\n\n function renderContent() {\n if (chat.unreadCount) {\n if (chat.unreadMentionsCount) {\n return (\n
\n
\n \n
\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n
\n );\n }\n\n return (\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n );\n } else if (chat.hasUnreadMark) {\n return (\n
\n );\n } else if (isPinned) {\n return (\n
\n \n
\n );\n }\n\n return undefined;\n }\n\n return (\n \n {renderContent}\n \n );\n};\n\nexport default memo(Badge);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport buildClassName from '../../../util/buildClassName';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\n\nimport './ChatCallStatus.scss';\n\ntype OwnProps = {\n isSelected?: boolean;\n isActive?: boolean;\n};\n\nconst ChatCallStatus: FC = ({\n isSelected,\n isActive,\n}) => {\n return (\n
\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default memo(ChatCallStatus);\n","import React, {\n FC, memo, useCallback, useLayoutEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, ApiFormattedText, MAIN_THREAD_ID, ApiUserStatus,\n} from '../../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n isUserId,\n isActionMessage,\n getPrivateChatUserId,\n getMessageAction,\n getMessageSenderName,\n isChatChannel,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageSticker,\n selectIsChatMuted,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,\n selectNotifySettings, selectNotifyExceptions, selectUserStatus,\n} from '../../../modules/selectors';\nimport { renderActionMessageText } from '../../common/helpers/renderActionMessageText';\nimport renderText from '../../common/helpers/renderText';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport useMedia from '../../../hooks/useMedia';\nimport { ChatAnimationTypes } from './hooks';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport TypingStatus from '../../common/TypingStatus';\nimport LastMessageMeta from '../../common/LastMessageMeta';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport Badge from './Badge';\nimport ChatFolderModal from '../ChatFolderModal.async';\nimport ChatCallStatus from './ChatCallStatus';\n\nimport './Chat.scss';\n\ntype OwnProps = {\n style?: string;\n chatId: string;\n folderId?: number;\n orderDiff: number;\n animationType: ChatAnimationTypes;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isMuted?: boolean;\n user?: ApiUser;\n userStatus?: ApiUserStatus;\n actionTargetUserIds?: string[];\n usersById?: Record;\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: string;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n animationLevel?: number;\n isSelected?: boolean;\n canScrollDown?: boolean;\n canChangeFolder?: boolean;\n lastSyncTime?: number;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Chat: FC = ({\n style,\n chatId,\n folderId,\n orderDiff,\n animationType,\n isPinned,\n chat,\n isMuted,\n user,\n userStatus,\n actionTargetUserIds,\n usersById,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n animationLevel,\n isSelected,\n canScrollDown,\n canChangeFolder,\n lastSyncTime,\n}) => {\n const {\n openChat,\n focusLastMessage,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isChatFolderModalOpen, openChatFolderModal, closeChatFolderModal] = useFlag();\n const [shouldRenderDeleteModal, markRenderDeleteModal, unmarkRenderDeleteModal] = useFlag();\n const [shouldRenderChatFolderModal, markRenderChatFolderModal, unmarkRenderChatFolderModal] = useFlag();\n\n const { lastMessage, typingStatus } = chat || {};\n const isAction = lastMessage && isActionMessage(lastMessage);\n\n useEnsureMessage(chatId, isAction ? lastMessage!.replyToMessageId : undefined, actionTargetMessage);\n\n const mediaThumbnail = lastMessage && !getMessageSticker(lastMessage)\n ? getMessageMediaThumbDataUri(lastMessage)\n : undefined;\n const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined);\n const isRoundVideo = Boolean(lastMessage && getMessageRoundVideo(lastMessage));\n\n const actionTargetUsers = useMemo(() => {\n return actionTargetUserIds\n ? actionTargetUserIds.map((userId) => usersById?.[userId]).filter(Boolean as any)\n : undefined;\n }, [actionTargetUserIds, usersById]);\n\n // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n const element = ref.current;\n\n if (animationLevel === 0 || !element) {\n return;\n }\n\n // TODO Refactor animation: create `useListAnimation` that owns `orderDiff` and `animationType`\n if (animationType === ChatAnimationTypes.Opacity) {\n element.style.opacity = '0';\n\n fastRaf(() => {\n element.classList.add('animate-opacity');\n element.style.opacity = '1';\n });\n } else if (animationType === ChatAnimationTypes.Move) {\n element.style.transform = `translate3d(0, ${-orderDiff * 100}%, 0)`;\n\n fastRaf(() => {\n element.classList.add('animate-transform');\n element.style.transform = '';\n });\n } else {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n element.classList.remove('animate-opacity', 'animate-transform');\n element.style.opacity = '';\n element.style.transform = '';\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [animationLevel, orderDiff, animationType]);\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, shouldReplaceHistory: true });\n\n if (isSelected && canScrollDown) {\n focusLastMessage();\n }\n }, [\n isSelected,\n canScrollDown,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n function handleDelete() {\n markRenderDeleteModal();\n openDeleteModal();\n }\n\n function handleChatFolderChange() {\n markRenderChatFolderModal();\n openChatFolderModal();\n }\n\n const contextActions = useChatContextActions({\n chat,\n user,\n handleDelete,\n handleChatFolderChange,\n folderId,\n isPinned,\n isMuted,\n canChangeFolder,\n });\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderLastMessageOrTyping() {\n if (typingStatus && lastMessage && typingStatus.timestamp > lastMessage.date * 1000) {\n return ;\n }\n\n if (draft?.text.length) {\n return (\n

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

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

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

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

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

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

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

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

{lang('FilterNoChatsToDisplay')}

\n

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

\n {chatFolder && foldersDispatch && onScreenSelect && (\n \n \n {lang('ChatList.EmptyChatListEditFilter')}\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal((global, { folderId, folderType }): StateProps => {\n const chatFolder = folderId && folderType === 'folder' ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatFolder,\n animatedEmoji: selectAnimatedEmoji(global, '📂'),\n };\n})(EmptyFolder));\n","import React, {\n FC, memo, useMemo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiChat, ApiChatFolder, ApiUser,\n} from '../../../api/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID, IS_MAC_OS, IS_PWA } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues } from '../../../util/iteratees';\nimport {\n getChatOrder, prepareChatList, prepareFolderListIds, reduceChatList,\n} from '../../../modules/helpers';\nimport {\n selectChatFolder, selectNotifyExceptions, selectNotifySettings,\n} from '../../../modules/selectors';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport { useChatAnimationType } from './hooks';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Loading from '../../ui/Loading';\nimport Chat from './Chat';\nimport EmptyFolder from './EmptyFolder';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n isActive: boolean;\n onScreenSelect?: (screen: SettingsScreens) => void;\n foldersDispatch?: FolderEditDispatch;\n};\n\ntype StateProps = {\n allListIds: GlobalState['chats']['listIds'];\n chatsById: Record;\n usersById: Record;\n listIds?: string[];\n orderedPinnedIds?: string[];\n chatFolder?: ApiChatFolder;\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\nenum FolderTypeToListType {\n 'all' = 'active',\n 'archived' = 'archived',\n}\n\nconst ChatList: FC = ({\n folderType,\n folderId,\n isActive,\n allListIds,\n chatsById,\n usersById,\n listIds,\n orderedPinnedIds,\n chatFolder,\n lastSyncTime,\n notifySettings,\n notifyExceptions,\n foldersDispatch,\n onScreenSelect,\n}) => {\n const {\n loadMoreChats,\n preloadTopChatMessages,\n preloadArchivedChats,\n openChat,\n openNextChat,\n } = getDispatch();\n\n const [currentListIds, currentPinnedIds] = useMemo(() => {\n return folderType === 'folder' && chatFolder\n ? prepareFolderListIds(allListIds, chatsById, usersById, chatFolder, notifySettings, notifyExceptions)\n : [listIds, orderedPinnedIds];\n }, [\n folderType, chatFolder, allListIds, chatsById, usersById,\n notifySettings, notifyExceptions, listIds, orderedPinnedIds,\n ]);\n\n const [orderById, orderedIds, chatArrays] = useMemo(() => {\n if (!currentListIds || (folderType === 'folder' && !chatFolder)) {\n return [];\n }\n\n const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType);\n const singleList = ([] as ApiChat[]).concat(newChatArrays.pinnedChats, newChatArrays.otherChats);\n const newOrderedIds = singleList.map(({ id }) => id);\n const newOrderById = singleList.reduce((acc, chat, i) => {\n acc[chat.id] = i;\n return acc;\n }, {} as Record);\n\n return [newOrderById, newOrderedIds, newChatArrays];\n }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]);\n\n const prevOrderById = usePrevious(orderById);\n\n const orderDiffById = useMemo(() => {\n if (!orderById || !prevOrderById) {\n return {};\n }\n\n return mapValues(orderById, (order, id) => {\n return prevOrderById[id] !== undefined ? order - prevOrderById[id] : -Infinity;\n });\n }, [orderById, prevOrderById]);\n\n const loadMoreOfType = useCallback(() => {\n loadMoreChats({ listType: folderType === 'archived' ? 'archived' : 'active' });\n }, [loadMoreChats, folderType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? loadMoreOfType : undefined,\n orderedIds,\n undefined,\n CHAT_LIST_SLICE,\n folderType === 'all' && !ALL_CHATS_PRELOAD_DISABLED,\n );\n\n const viewportChatArrays = useMemo(() => {\n if (!viewportIds || !chatArrays) {\n return undefined;\n }\n\n return reduceChatList(chatArrays, viewportIds);\n }, [chatArrays, viewportIds]);\n\n useEffect(() => {\n if (lastSyncTime && folderType === 'all') {\n preloadTopChatMessages();\n preloadArchivedChats();\n }\n }, [lastSyncTime, folderType, preloadTopChatMessages, preloadArchivedChats]);\n\n // Support + and + to navigate between chats\n useEffect(() => {\n if (!isActive || !orderedIds) {\n return undefined;\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (IS_PWA && ((IS_MAC_OS && e.metaKey) || (!IS_MAC_OS && e.ctrlKey)) && e.code.startsWith('Digit')) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n const position = Number(digit) - 1;\n if (position > orderedIds!.length - 1) return;\n\n openChat({ id: orderedIds![position], shouldReplaceHistory: true });\n }\n\n if (e.altKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (!targetIndexDelta) return;\n\n e.preventDefault();\n openNextChat({ targetIndexDelta, orderedIds });\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isActive, openChat, openNextChat, orderedIds]);\n\n const getAnimationType = useChatAnimationType(orderDiffById);\n\n function renderChats() {\n const viewportOffset = orderedIds!.indexOf(viewportIds![0]);\n const pinnedOffset = viewportOffset + viewportChatArrays!.pinnedChats.length;\n\n return (\n \n {viewportChatArrays!.pinnedChats.map(({ id }, i) => (\n \n ))}\n {viewportChatArrays!.otherChats.map((chat, i) => (\n \n ))}\n
\n );\n }\n\n return (\n \n {viewportIds?.length && viewportChatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n (\n \n )\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { folderType, folderId }): StateProps => {\n const {\n chats: {\n listIds,\n byId: chatsById,\n orderedPinnedIds,\n },\n users: { byId: usersById },\n lastSyncTime,\n } = global;\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n allListIds: listIds,\n chatsById,\n usersById,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n };\n },\n)(ChatList));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isUserId,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isUserId(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isUserId(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport './DropTarget.scss';\n\nexport type OwnProps = {\n isQuick?: boolean;\n onFileSelect: (e: React.DragEvent) => void;\n};\n\nconst DropTarget: FC = ({ isQuick, onFileSelect }) => {\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n\n const handleDragEnter = () => { markHovered(); };\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget } = e;\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const className = buildClassName(\n 'DropTarget',\n isHovered && 'hovered',\n );\n\n return (\n \n
\n
\n
Drop files here to send them
\n
{isQuick ? 'in a quick way' : 'without compression'}
\n
\n
\n );\n};\n\nexport default memo(DropTarget);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport DropTarget from './DropTarget';\n\nimport './DropArea.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withQuick?: boolean;\n onHide: NoneToVoidFunction;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n};\n\nexport enum DropAreaState {\n None = 'none',\n Document = 'document',\n QuickFile = 'quick_file',\n}\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst DropArea: FC = ({\n isOpen, withQuick, onHide, onFileSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevWithQuick = usePrevious(withQuick);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onHide) : undefined), [isOpen, onHide]);\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), false);\n }\n }, [onFileSelect, onHide]);\n\n const handleQuickFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), true);\n }\n }, [onFileSelect, onHide]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.stopPropagation();\n\n const { target: fromTarget, relatedTarget: toTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.DropTarget, .DropArea') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(() => {\n onHide();\n }, DROP_LEAVE_TIMEOUT_MS);\n }\n }, [onHide]);\n\n const handleDragOver = () => {\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n };\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'DropArea',\n transitionClassNames,\n );\n\n return (\n
\n \n {(withQuick || prevWithQuick) && }\n
\n );\n};\n\nexport default memo(DropArea);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './EmojiTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst EmojiTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const EmojiTooltip = useModuleLoader(Bundles.Extra, 'EmojiTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiTooltip ? : undefined;\n};\n\nexport default memo(EmojiTooltipAsync);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useEffect, useRef, memo, useState, useCallback,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { IAnchorPosition, ISettings } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { selectReplyingToId } from '../../../modules/selectors';\nimport { debounce } from '../../../util/schedulers';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport buildClassName from '../../../util/buildClassName';\nimport {\n IS_ANDROID, IS_EMOJI_SUPPORTED, IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport useLayoutEffectWithPrevDeps from '../../../hooks/useLayoutEffectWithPrevDeps';\nimport useFlag from '../../../hooks/useFlag';\nimport { isHeavyAnimating } from '../../../hooks/useHeavyAnimationCheck';\nimport useSendMessageAction from '../../../hooks/useSendMessageAction';\nimport useLang from '../../../hooks/useLang';\nimport parseEmojiOnlyString from '../../common/helpers/parseEmojiOnlyString';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport renderText from '../../common/helpers/renderText';\n\nimport TextFormatter from './TextFormatter';\n\nconst CONTEXT_MENU_CLOSE_DELAY_MS = 100;\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 350;\nconst TRANSITION_DURATION_FACTOR = 50;\n\ntype OwnProps = {\n id: string;\n chatId: string;\n threadId: number;\n isAttachmentModalInput?: boolean;\n editableInputId?: string;\n html: string;\n placeholder: string;\n forcedPlaceholder?: string;\n canAutoFocus: boolean;\n shouldSuppressFocus?: boolean;\n shouldSuppressTextFormatter?: boolean;\n onUpdate: (html: string) => void;\n onSuppressedFocus?: () => void;\n onSend: () => void;\n};\n\ntype StateProps = {\n replyingToId?: number;\n noTabCapture?: boolean;\n messageSendKeyCombo?: ISettings['messageSendKeyCombo'];\n};\n\nconst MAX_INPUT_HEIGHT = IS_SINGLE_COLUMN_LAYOUT ? 256 : 416;\nconst TAB_INDEX_PRIORITY_TIMEOUT = 2000;\nconst TEXT_FORMATTER_SAFE_AREA_PX = 90;\n// For some reason Safari inserts `
` after user removes text from input\nconst SAFARI_BR = '
';\n\nfunction clearSelection() {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n}\n\nconst MessageInput: FC = ({\n id,\n chatId,\n threadId,\n isAttachmentModalInput,\n editableInputId,\n html,\n placeholder,\n forcedPlaceholder,\n canAutoFocus,\n shouldSuppressFocus,\n shouldSuppressTextFormatter,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n onUpdate,\n onSuppressedFocus,\n onSend,\n}) => {\n const {\n editLastMessage,\n replyToNextMessage,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const cloneRef = useRef(null);\n\n const lang = useLang();\n const isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n const sendMessageAction = useSendMessageAction(chatId, threadId);\n\n useEffect(() => {\n if (!isAttachmentModalInput) return;\n updateInputHeight(false);\n }, [isAttachmentModalInput]);\n\n useLayoutEffectWithPrevDeps(([prevHtml]) => {\n if (html !== inputRef.current!.innerHTML) {\n inputRef.current!.innerHTML = html;\n }\n\n if (html !== cloneRef.current!.innerHTML) {\n cloneRef.current!.innerHTML = html;\n }\n\n if (prevHtml !== undefined && prevHtml !== html) {\n updateInputHeight(!html.length);\n }\n }, [html]);\n\n const chatIdRef = useRef(chatId);\n chatIdRef.current = chatId;\n const focusInput = useCallback(() => {\n if (isHeavyAnimating()) {\n setTimeout(focusInput, FOCUS_DELAY_MS);\n return;\n }\n\n focusEditableElement(inputRef.current!);\n }, []);\n\n const handleCloseTextFormatter = useCallback(() => {\n closeTextFormatter();\n clearSelection();\n }, [closeTextFormatter]);\n\n function checkSelection() {\n // Disable the formatter on iOS devices for now.\n if (IS_IOS) {\n return false;\n }\n\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) {\n closeTextFormatter();\n return false;\n }\n\n const selectionRange = selection.getRangeAt(0);\n const selectedText = selectionRange.toString().trim();\n if (\n shouldSuppressTextFormatter\n || !isSelectionInsideInput(selectionRange, editableInputId || EDITABLE_INPUT_ID)\n || !selectedText\n || parseEmojiOnlyString(selectedText)\n || !selectionRange.START_TO_END\n ) {\n closeTextFormatter();\n return false;\n }\n\n return true;\n }\n\n function processSelection() {\n if (!checkSelection()) {\n return;\n }\n\n const selectionRange = window.getSelection()!.getRangeAt(0);\n const selectionRect = selectionRange.getBoundingClientRect();\n const inputRect = inputRef.current!.getBoundingClientRect();\n\n let x = (selectionRect.left + selectionRect.width / 2) - inputRect.left;\n\n if (x < TEXT_FORMATTER_SAFE_AREA_PX) {\n x = TEXT_FORMATTER_SAFE_AREA_PX;\n } else if (x > inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX) {\n x = inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX;\n }\n\n setTextFormatterAnchorPosition({\n x,\n y: selectionRect.top - inputRect.top,\n });\n\n setSelectedRange(selectionRange);\n openTextFormatter();\n }\n\n function handleMouseDown(event: React.MouseEvent) {\n function handleMouseUp() {\n processSelection();\n\n event.target.removeEventListener('mouseup', handleMouseUp);\n }\n\n if (event.button !== 2) {\n event.target.addEventListener('mouseup', handleMouseUp);\n return;\n }\n\n if (isContextMenuOpenRef.current === true) {\n return;\n }\n\n isContextMenuOpenRef.current = true;\n\n function closeContextMenuMouseListener() {\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('mouseup', closeContextMenuMouseListener);\n }\n\n function closeContextMenuKeyListener(e: KeyboardEvent) {\n if (e.key !== 'Esc' && e.key !== 'Escape') {\n return;\n }\n\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('keydown', closeContextMenuKeyListener);\n }\n\n document.addEventListener('mousedown', closeContextMenuMouseListener);\n document.addEventListener('keydown', closeContextMenuKeyListener);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n function handleKeyUp() {\n processSelection();\n\n e.target.removeEventListener('keyup', handleKeyUp);\n }\n\n if (!html.length && (e.metaKey || e.ctrlKey)) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (targetIndexDelta) {\n e.preventDefault();\n\n replyToNextMessage({ targetIndexDelta });\n return;\n }\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n if (\n !(IS_IOS || IS_ANDROID)\n && (\n (messageSendKeyCombo === 'enter' && !e.shiftKey)\n || (messageSendKeyCombo === 'ctrl-enter' && (e.ctrlKey || e.metaKey))\n )\n ) {\n e.preventDefault();\n\n closeTextFormatter();\n onSend();\n }\n } else if (e.key === 'ArrowUp' && !html.length && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault();\n editLastMessage();\n } else {\n e.target.addEventListener('keyup', handleKeyUp);\n }\n }\n\n function handleChange(e: ChangeEvent) {\n const { innerHTML, textContent } = e.currentTarget;\n\n onUpdate(innerHTML === SAFARI_BR ? '' : innerHTML);\n sendMessageAction({ type: 'typing' });\n\n // Reset focus on the input to remove any active styling when input is cleared\n if (\n !IS_TOUCH_ENV\n && (!textContent || !textContent.length)\n // When emojis are not supported, innerHTML contains an emoji img tag that doesn't exist in the textContext\n && !(!IS_EMOJI_SUPPORTED && innerHTML.includes('emoji-small'))\n ) {\n const selection = window.getSelection()!;\n if (selection) {\n inputRef.current!.blur();\n selection.removeAllRanges();\n focusEditableElement(inputRef.current!, true);\n }\n }\n }\n\n function stopEvent(e: React.MouseEvent) {\n if (!checkSelection()) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n function updateInputHeight(willSend = false) {\n const input = inputRef.current!;\n const clone = cloneRef.current!;\n const currentHeight = Number(input.style.height.replace('px', ''));\n const newHeight = Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT);\n if (newHeight === currentHeight) {\n return;\n }\n\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\n );\n\n const exec = () => {\n input.style.height = `${newHeight}px`;\n input.style.transitionDuration = `${transitionDuration}ms`;\n input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT);\n };\n\n if (willSend) {\n // Sync with sending animation\n requestAnimationFrame(exec);\n } else {\n exec();\n }\n }\n\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n if (canAutoFocus) {\n focusInput();\n }\n }, [chatId, focusInput, replyingToId, canAutoFocus]);\n\n useEffect(() => {\n if (noTabCapture) {\n return undefined;\n }\n\n const captureFirstTab = debounce((e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n requestAnimationFrame(focusInput);\n }\n }, TAB_INDEX_PRIORITY_TIMEOUT, true, false);\n\n return captureKeyboardListeners({ onTab: captureFirstTab });\n }, [focusInput, noTabCapture]);\n\n useEffect(() => {\n const input = inputRef.current!;\n\n function suppressFocus() {\n input.blur();\n }\n\n if (shouldSuppressFocus) {\n input.addEventListener('focus', suppressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', suppressFocus);\n };\n }, [shouldSuppressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSuppressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {!forcedPlaceholder && {placeholder}}\n \n {forcedPlaceholder && {renderText(forcedPlaceholder!)}}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId }: OwnProps): StateProps => {\n const { messageSendKeyCombo } = global.settings.byKey;\n\n return {\n messageSendKeyCombo,\n replyingToId: chatId && threadId ? selectReplyingToId(global, chatId, threadId) : undefined,\n noTabCapture: global.isPollModalOpen || global.payment.isPaymentModalOpen,\n };\n },\n)(MessageInput));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IAnchorPosition } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport { ensureProtocol } from '../../../util/ensureProtocol';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport getKeyFromEvent from '../../../util/getKeyFromEvent';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useVirtualBackdrop from '../../../hooks/useVirtualBackdrop';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\nimport './TextFormatter.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n anchorPosition?: IAnchorPosition;\n selectedRange?: Range;\n setSelectedRange: (range: Range) => void;\n onClose: () => void;\n};\n\ninterface ISelectedTextFormats {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n monospace?: boolean;\n}\n\nconst TEXT_FORMAT_BY_TAG_NAME: Record = {\n B: 'bold',\n STRONG: 'bold',\n I: 'italic',\n EM: 'italic',\n U: 'underline',\n DEL: 'strikethrough',\n CODE: 'monospace',\n};\nconst fragmentEl = document.createElement('div');\n\nconst TextFormatter: FC = ({\n isOpen,\n anchorPosition,\n selectedRange,\n setSelectedRange,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const linkUrlInputRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n const [isLinkControlOpen, openLinkControl, closeLinkControl] = useFlag();\n const [linkUrl, setLinkUrl] = useState('');\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [inputClassName, setInputClassName] = useState();\n const [selectedTextFormats, setSelectedTextFormats] = useState({});\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n useVirtualBackdrop(\n isOpen,\n containerRef,\n onClose,\n );\n\n useEffect(() => {\n if (isLinkControlOpen) {\n linkUrlInputRef.current!.focus();\n } else {\n setLinkUrl('');\n setIsEditingLink(false);\n }\n }, [isLinkControlOpen]);\n\n useEffect(() => {\n if (!shouldRender) {\n closeLinkControl();\n setSelectedTextFormats({});\n setInputClassName(undefined);\n }\n }, [closeLinkControl, shouldRender]);\n\n useEffect(() => {\n if (!isOpen || !selectedRange) {\n return;\n }\n\n const selectedFormats: ISelectedTextFormats = {};\n let { parentElement } = selectedRange.commonAncestorContainer;\n while (parentElement && parentElement.id !== EDITABLE_INPUT_ID) {\n const textFormat = TEXT_FORMAT_BY_TAG_NAME[parentElement.tagName];\n if (textFormat) {\n selectedFormats[textFormat] = true;\n }\n\n parentElement = parentElement.parentElement;\n }\n\n setSelectedTextFormats(selectedFormats);\n }, [isOpen, selectedRange, openLinkControl]);\n\n function restoreSelection() {\n if (!selectedRange) {\n return;\n }\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(selectedRange);\n }\n }\n\n const updateSelectedRange = useCallback(() => {\n const selection = window.getSelection();\n if (selection) {\n setSelectedRange(selection.getRangeAt(0));\n }\n }, [setSelectedRange]);\n\n const getSelectedText = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n fragmentEl.innerText = selectedRange.toString();\n\n return fragmentEl.innerHTML;\n }, [selectedRange]);\n\n const getSelectedElement = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.commonAncestorContainer.parentElement;\n }, [selectedRange]);\n\n function updateInputStyles() {\n const input = linkUrlInputRef.current;\n if (!input) {\n return;\n }\n\n const { offsetWidth, scrollWidth, scrollLeft } = input;\n if (scrollWidth <= offsetWidth) {\n setInputClassName(undefined);\n return;\n }\n\n let className = '';\n if (scrollLeft < scrollWidth - offsetWidth) {\n className = 'mask-right';\n }\n if (scrollLeft > 0) {\n className += ' mask-left';\n }\n\n setInputClassName(className);\n }\n\n function handleLinkUrlChange(e: React.ChangeEvent) {\n setLinkUrl(e.target.value);\n updateInputStyles();\n }\n\n function getFormatButtonClassName(key: keyof ISelectedTextFormats) {\n if (selectedTextFormats[key]) {\n return 'active';\n }\n\n if (key === 'monospace' || key === 'strikethrough') {\n if (Object.keys(selectedTextFormats).some(\n (fKey) => fKey !== key && !!selectedTextFormats[fKey as keyof ISelectedTextFormats],\n )) {\n return 'disabled';\n }\n } else if (selectedTextFormats.monospace || selectedTextFormats.strikethrough) {\n return 'disabled';\n }\n\n return undefined;\n }\n\n const handleBoldText = useCallback(() => {\n setSelectedTextFormats((selectedFormats) => {\n // Somehow re-applying 'bold' command to already bold text doesn't work\n document.execCommand(selectedFormats.bold ? 'removeFormat' : 'bold');\n Object.keys(selectedFormats).forEach((key) => {\n if ((key === 'italic' || key === 'underline') && !!selectedFormats[key]) {\n document.execCommand(key);\n }\n });\n\n updateSelectedRange();\n return {\n ...selectedFormats,\n bold: !selectedFormats.bold,\n };\n });\n }, [updateSelectedRange]);\n\n const handleItalicText = useCallback(() => {\n document.execCommand('italic');\n updateSelectedRange();\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n italic: !selectedFormats.italic,\n }));\n }, [updateSelectedRange]);\n\n const handleUnderlineText = useCallback(() => {\n document.execCommand('underline');\n updateSelectedRange();\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n underline: !selectedFormats.underline,\n }));\n }, [updateSelectedRange]);\n\n const handleStrikethroughText = useCallback(() => {\n if (selectedTextFormats.strikethrough) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'DEL'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n strikethrough: false,\n }));\n\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.strikethrough,\n ]);\n\n const handleMonospaceText = useCallback(() => {\n if (selectedTextFormats.monospace) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'CODE'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n monospace: false,\n }));\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.monospace,\n ]);\n\n function handleLinkUrlConfirm() {\n const formattedLinkUrl = encodeURI(ensureProtocol(linkUrl) || '');\n\n if (isEditingLink) {\n const element = getSelectedElement();\n if (!element || element.tagName !== 'A') {\n return;\n }\n\n (element as HTMLAnchorElement).href = formattedLinkUrl;\n\n onClose();\n return;\n }\n\n const text = getSelectedText();\n restoreSelection();\n document.execCommand(\n 'insertHTML',\n false,\n `${text}`,\n );\n onClose();\n }\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n const HANDLERS_BY_KEY: Record = {\n k: openLinkControl,\n b: handleBoldText,\n u: handleUnderlineText,\n i: handleItalicText,\n m: handleMonospaceText,\n s: handleStrikethroughText,\n };\n\n const handler = HANDLERS_BY_KEY[getKeyFromEvent(e)];\n\n if (\n e.altKey\n || !(e.ctrlKey || e.metaKey)\n || !handler\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n handler();\n }, [\n handleBoldText, handleItalicText, handleUnderlineText,\n handleMonospaceText, handleStrikethroughText,\n openLinkControl,\n ]);\n\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleKeyDown]);\n\n const lang = useLang();\n\n function handleContainerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' && isLinkControlOpen) {\n handleLinkUrlConfirm();\n e.preventDefault();\n }\n }\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'TextFormatter',\n transitionClassNames,\n isLinkControlOpen && 'link-control-shown',\n );\n\n const linkUrlConfirmClassName = buildClassName(\n 'TextFormatter-link-url-confirm',\n !!linkUrl.length && 'shown',\n );\n\n const style = anchorPosition\n ? `left: ${anchorPosition.x}px; top: ${anchorPosition.y}px;--text-formatter-left: ${anchorPosition.x}px;`\n : '';\n\n return (\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n\n
\n
\n \n
\n\n \n \n
\n\n
\n
\n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default memo(TextFormatter);\n","const RE_BR = /(
|)/g;\nconst RE_SPACE = /( |\\u00A0)/g;\nconst RE_CLEAN_HTML = /(
|<\\/div>)/gi;\nconst RE_EXTRA_NEW_LINE = /\\n$/i;\n\nexport function prepareForRegExp(html: string) {\n return html\n .replace(RE_SPACE, ' ')\n .replace(RE_BR, '\\n')\n .replace(RE_CLEAN_HTML, '')\n .replace(RE_EXTRA_NEW_LINE, '');\n}\n","const MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range, inputId: string) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== inputId && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === inputId);\n}\n","import { areSortedArraysEqual } from './iteratees';\n\nconst cache = new WeakMap();\n\nexport default function memoized(fn: T) {\n return (...args: Parameters): ReturnType => {\n const cached = cache.get(fn);\n if (cached && areSortedArraysEqual(cached.lastArgs, args)) {\n return cached.lastResult;\n }\n\n const result = fn(...args);\n cache.set(fn, { lastArgs: args, lastResult: result });\n return result;\n };\n}\n","import {\n useCallback, useEffect, useState,\n} from '../../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../../util/memo';\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\nimport {\n EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,\n} from '../../../../util/emoji';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport {\n buildCollectionByKey, flatten, mapValues, pickTruthy, unique,\n} from '../../../../util/iteratees';\nimport memoized from '../../../../util/memoized';\nimport useFlag from '../../../../hooks/useFlag';\n\ninterface Library {\n keywords: string[];\n byKeyword: Record;\n names: string[];\n byName: Record;\n}\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nlet RE_EMOJI_SEARCH: RegExp;\nconst EMOJIS_LIMIT = 36;\nconst FILTER_MIN_LENGTH = 2;\n\nconst prepareRecentEmojisMemo = memoized(prepareRecentEmojis);\nconst prepareLibraryMemo = memoized(prepareLibrary);\nconst searchInLibraryMemo = memoized(searchInLibrary);\n\ntry {\n RE_EMOJI_SEARCH = new RegExp('(^|\\\\s):[-+_:\\\\p{L}\\\\p{N}]*$', 'gui');\n} catch (e) {\n // Support for older versions of firefox\n RE_EMOJI_SEARCH = new RegExp('(^|\\\\s):[-+_:\\\\d\\\\wа-яё]*$', 'gi');\n}\n\nexport default function useEmojiTooltip(\n isAllowed: boolean,\n html: string,\n recentEmojiIds: string[],\n inputId = EDITABLE_INPUT_ID,\n onUpdateHtml: (html: string) => void,\n baseEmojiKeywords?: Record,\n emojiKeywords?: Record,\n isDisabled = false,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [byId, setById] = useState | undefined>();\n const [shouldForceInsertEmoji, setShouldForceInsertEmoji] = useState(false);\n const [filteredEmojis, setFilteredEmojis] = useState(MEMO_EMPTY_ARRAY);\n\n // Initialize data on first render.\n useEffect(() => {\n if (isDisabled) return;\n const exec = () => {\n setById(emojiData.emojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, [isDisabled]);\n\n useEffect(() => {\n if (!isAllowed || !html || !byId || isDisabled) {\n unmarkIsOpen();\n return;\n }\n\n const code = html.includes(':') && getEmojiCode(html);\n if (!code) {\n setFilteredEmojis(MEMO_EMPTY_ARRAY);\n unmarkIsOpen();\n return;\n }\n\n const forceSend = code.length > 2 && code.endsWith(':');\n const filter = code.substr(1, forceSend ? code.length - 2 : undefined);\n let matched: Emoji[] = MEMO_EMPTY_ARRAY;\n\n setShouldForceInsertEmoji(forceSend);\n\n if (!filter) {\n matched = prepareRecentEmojisMemo(byId, recentEmojiIds, EMOJIS_LIMIT);\n } else if (filter.length >= FILTER_MIN_LENGTH) {\n const library = prepareLibraryMemo(byId, baseEmojiKeywords, emojiKeywords);\n matched = searchInLibraryMemo(library, filter, EMOJIS_LIMIT);\n }\n\n if (matched.length) {\n if (!forceSend) {\n markIsOpen();\n }\n setFilteredEmojis(matched);\n } else {\n unmarkIsOpen();\n }\n }, [\n byId, html, isAllowed, markIsOpen, recentEmojiIds, unmarkIsOpen, setShouldForceInsertEmoji,\n isDisabled, baseEmojiKeywords, emojiKeywords,\n ]);\n\n const insertEmoji = useCallback((textEmoji: string, isForce?: boolean) => {\n const atIndex = html.lastIndexOf(':', isForce ? html.lastIndexOf(':') - 1 : undefined);\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${textEmoji}`);\n const messageInput = document.getElementById(inputId)!;\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, true);\n });\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n useEffect(() => {\n if (isOpen && shouldForceInsertEmoji && filteredEmojis.length) {\n insertEmoji(filteredEmojis[0].native, true);\n }\n }, [filteredEmojis, insertEmoji, isOpen, shouldForceInsertEmoji]);\n\n return {\n isEmojiTooltipOpen: isOpen,\n closeEmojiTooltip: unmarkIsOpen,\n filteredEmojis,\n insertEmoji,\n };\n}\n\nfunction getEmojiCode(html: string) {\n const emojis = prepareForRegExp(html).match(RE_EMOJI_SEARCH);\n\n return emojis ? emojis[0].trim() : undefined;\n}\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nfunction prepareRecentEmojis(byId: Record, recentEmojiIds: string[], limit: number) {\n if (!byId || !recentEmojiIds.length) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return Object.values(pickTruthy(byId, recentEmojiIds)).slice(0, limit);\n}\n\nfunction prepareLibrary(\n byId: Record,\n baseEmojiKeywords?: Record,\n emojiKeywords?: Record,\n): Library {\n const emojis = Object.values(byId);\n\n const byNative = buildCollectionByKey(emojis, 'native');\n const baseEmojisByKeyword = baseEmojiKeywords\n ? mapValues(baseEmojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n })\n : {};\n const emojisByKeyword = emojiKeywords\n ? mapValues(emojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n })\n : {};\n\n const byKeyword = { ...baseEmojisByKeyword, ...emojisByKeyword };\n const keywords = ([] as string[]).concat(Object.keys(baseEmojisByKeyword), Object.keys(emojisByKeyword));\n\n const byName = emojis.reduce((result, emoji) => {\n emoji.names.forEach((name) => {\n if (!result[name]) {\n result[name] = [];\n }\n\n result[name].push(emoji);\n });\n\n return result;\n }, {} as Record);\n\n const names = Object.keys(byName);\n\n return {\n byKeyword,\n keywords,\n byName,\n names,\n };\n}\n\nfunction searchInLibrary(library: Library, filter: string, limit: number) {\n const {\n byKeyword, keywords, byName, names,\n } = library;\n\n let matched: Emoji[] = MEMO_EMPTY_ARRAY;\n\n const matchedKeywords = keywords.filter((keyword) => keyword.startsWith(filter)).sort();\n matched = matched.concat(flatten(Object.values(pickTruthy(byKeyword!, matchedKeywords))));\n\n // Also search by names, which is useful for non-English languages\n const matchedNames = names.filter((name) => name.startsWith(filter));\n matched = matched.concat(flatten(Object.values(pickTruthy(byName, matchedNames))));\n\n matched = unique(matched);\n\n return matched.slice(0, limit);\n}\n","import {\n useCallback, useEffect, useState,\n} from '../../../../lib/teact/teact';\nimport { getGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/types';\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { filterUsersByName, getUserFirstOrLastName } from '../../../../modules/helpers';\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\nimport { pickTruthy, unique } from '../../../../util/iteratees';\nimport { throttle } from '../../../../util/schedulers';\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\nlet RE_USERNAME_SEARCH: RegExp;\n\ntry {\n RE_USERNAME_SEARCH = new RegExp('(^|\\\\s)@[-_\\\\p{L}\\\\p{M}\\\\p{N}]*$', 'gui');\n} catch (e) {\n // Support for older versions of firefox\n RE_USERNAME_SEARCH = new RegExp('(^|\\\\s)@[-_\\\\d\\\\wа-яё]*$', 'gi');\n}\n\nexport default function useMentionTooltip(\n canSuggestMembers: boolean | undefined,\n html: string,\n onUpdateHtml: (html: string) => void,\n inputId: string = EDITABLE_INPUT_ID,\n groupChatMembers?: ApiChatMember[],\n topInlineBotIds?: string[],\n currentUserId?: string,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [usersToMention, setUsersToMention] = useState();\n\n const updateFilteredUsers = useCallback((filter, withInlineBots: boolean) => {\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n if (!(groupChatMembers || topInlineBotIds) || !usersById) {\n setUsersToMention(undefined);\n\n return;\n }\n\n runThrottled(() => {\n const memberIds = groupChatMembers?.reduce((acc: string[], member) => {\n if (member.userId !== currentUserId) {\n acc.push(member.userId);\n }\n\n return acc;\n }, []);\n\n const filteredIds = filterUsersByName(unique([\n ...((withInlineBots && topInlineBotIds) || []),\n ...(memberIds || []),\n ]), usersById, filter);\n\n setUsersToMention(Object.values(pickTruthy(usersById, filteredIds)));\n });\n }, [currentUserId, groupChatMembers, topInlineBotIds]);\n\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = html.includes('@') && getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n updateFilteredUsers(filter, canSuggestInlineBots(html));\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, html, updateFilteredUsers, markIsOpen, unmarkIsOpen]);\n\n useEffect(() => {\n if (usersToMention?.length) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [markIsOpen, unmarkIsOpen, usersToMention]);\n\n const insertMention = useCallback((user: ApiUser, forceFocus = false) => {\n if (!user.username && !getUserFirstOrLastName(user)) {\n return;\n }\n\n const insertedHtml = user.username\n ? `@${user.username}`\n : `${getUserFirstOrLastName(user)}`;\n\n const atIndex = html.lastIndexOf('@');\n if (atIndex !== -1) {\n onUpdateHtml(`${html.substr(0, atIndex)}${insertedHtml} `);\n const messageInput = document.getElementById(inputId)!;\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\n }\n\n unmarkIsOpen();\n }, [html, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isMentionTooltipOpen: isOpen,\n closeMentionTooltip: unmarkIsOpen,\n insertMention,\n mentionFilteredUsers: usersToMention,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const username = prepareForRegExp(html).match(RE_USERNAME_SEARCH);\n\n return username ? username[0].trim() : undefined;\n}\n\nfunction canSuggestInlineBots(html: string) {\n return html.startsWith('@');\n}\n","import { useEffect, useRef } from '../../../lib/teact/teact';\n\nimport useOnChange from '../../../hooks/useOnChange';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\n\nexport default function useAsyncRendering(dependencies: T, delay?: number) {\n const isDisabled = delay === undefined;\n const shouldRenderRef = useRef(isDisabled);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n if (isDisabled) {\n return;\n }\n\n shouldRenderRef.current = false;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, dependencies);\n\n useEffect(() => {\n if (isDisabled || shouldRenderRef.current) {\n return;\n }\n\n const exec = () => {\n shouldRenderRef.current = true;\n forceUpdate();\n };\n\n if (delay! > 0) {\n timeoutRef.current = window.setTimeout(exec, delay);\n } else {\n exec();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return shouldRenderRef.current;\n}\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, memo, useState,\n} from '../../lib/teact/teact';\n\nimport Checkbox from './Checkbox';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n};\n\ntype OwnProps = {\n id?: string;\n options: IRadioOption[];\n selected?: string[];\n disabled?: boolean;\n round?: boolean;\n loadingOptions?: string[];\n onChange: (value: string[]) => void;\n};\n\nconst CheckboxGroup: FC = ({\n id,\n options,\n selected = [],\n disabled,\n round,\n loadingOptions,\n onChange,\n}) => {\n const [values, setValues] = useState(selected || []);\n\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value, checked } = event.currentTarget;\n let newValues: string[];\n if (checked) {\n newValues = [...values, value];\n } else {\n newValues = values.filter((v) => v !== value);\n }\n\n setValues(newValues);\n onChange(newValues);\n }, [onChange, values]);\n\n return (\n
\n {options.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default memo(CheckboxGroup);\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\n","import { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from './RippleEffect';\nimport Menu from './Menu';\nimport MenuItem from './MenuItem';\nimport Button from './Button';\n\nimport './ListItem.scss';\n\ninterface MenuItemContextAction {\n title: string;\n icon: string;\n destructive?: boolean;\n handler?: () => void;\n}\n\ninterface OwnProps {\n ref?: RefObject;\n buttonRef?: RefObject;\n icon?: string;\n secondaryIcon?: string;\n className?: string;\n style?: string;\n children: any;\n disabled?: boolean;\n ripple?: boolean;\n narrow?: boolean;\n inactive?: boolean;\n focus?: boolean;\n destructive?: boolean;\n multiline?: boolean;\n isStatic?: boolean;\n contextActions?: MenuItemContextAction[];\n onMouseDown?: (e: React.MouseEvent) => void;\n onClick?: (e: React.MouseEvent) => void;\n onSecondaryIconClick?: (e: React.MouseEvent) => void;\n}\n\nconst ListItem: FC = (props) => {\n const {\n ref,\n buttonRef,\n icon,\n secondaryIcon,\n className,\n style,\n children,\n disabled,\n ripple,\n narrow,\n inactive,\n focus,\n destructive,\n multiline,\n isStatic,\n contextActions,\n onMouseDown,\n onClick,\n onSecondaryIconClick,\n } = props;\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n const [isTouched, markIsTouched, unmarkIsTouched] = useFlag();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(containerRef, !contextActions);\n\n const getTriggerElement = useCallback(() => containerRef.current, []);\n\n const getRootElement = useCallback(\n () => containerRef.current!.closest('.custom-scroll'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => containerRef.current!.querySelector('.ListItem-context-menu .bubble'),\n [],\n );\n\n const { positionX, positionY, style: menuStyle } = useContextMenuPosition(\n contextMenuPosition,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n return;\n }\n onClick(e);\n\n if (IS_TOUCH_ENV && !ripple) {\n markIsTouched();\n fastRaf(unmarkIsTouched);\n }\n }, [disabled, markIsTouched, onClick, ripple, unmarkIsTouched]);\n\n const handleSecondaryIconClick = (e: React.MouseEvent) => {\n if (disabled || e.button !== 0 || (!onSecondaryIconClick && !contextActions)) return;\n\n e.stopPropagation();\n if (onSecondaryIconClick) {\n onSecondaryIconClick(e);\n } else {\n handleContextMenu(e);\n }\n };\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (inactive || IS_TOUCH_ENV) {\n return;\n }\n if (contextActions && (e.button === 2 || !onClick)) {\n handleBeforeContextMenu(e);\n }\n if (e.button === 0) {\n if (!onClick) {\n handleContextMenu(e);\n } else {\n handleClick(e);\n }\n }\n }, [inactive, contextActions, onClick, handleBeforeContextMenu, handleContextMenu, handleClick]);\n\n const lang = useLang();\n\n const fullClassName = buildClassName(\n 'ListItem',\n className,\n !isStatic && 'no-selection',\n ripple && 'has-ripple',\n narrow && 'narrow',\n disabled && 'disabled',\n inactive && 'inactive',\n contextMenuPosition && 'has-menu-open',\n focus && 'focus',\n destructive && 'destructive',\n multiline && 'multiline',\n isStatic && 'is-static',\n );\n\n return (\n \n \n {icon && (\n \n )}\n {multiline && (
{children}
)}\n {!multiline && children}\n {!disabled && !inactive && ripple && (\n \n )}\n {secondaryIcon && (\n \n \n \n )}\n
\n {contextActions && contextMenuPosition !== undefined && (\n \n {contextActions.map((action) => (\n \n {action.title}\n \n ))}\n \n )}\n
\n );\n};\n\nexport default ListItem;\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\n\nimport Portal from './Portal';\n\nimport './Notification.scss';\n\ntype OwnProps = {\n containerId?: string;\n message: TextPart[];\n duration?: number;\n onDismiss: () => void;\n};\n\nconst DEFAULT_DURATION = 3000;\nconst ANIMATION_DURATION = 150;\n\nconst Notification: FC = ({\n message, duration = DEFAULT_DURATION, containerId, onDismiss,\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n // eslint-disable-next-line no-null/no-null\n const timerRef = useRef(null);\n\n const { transitionClassNames } = useShowTransition(isOpen);\n\n const closeAndDismiss = useCallback(() => {\n setIsOpen(false);\n setTimeout(onDismiss, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [onDismiss]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(closeAndDismiss) : undefined), [isOpen, closeAndDismiss]);\n\n useEffect(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n }, [duration, closeAndDismiss]);\n\n const handleMouseEnter = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n }, [duration, closeAndDismiss]);\n\n return (\n \n \n
\n {message}\n
\n
\n \n );\n};\n\nexport default Notification;\n","import React, {\n FC, useEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './ProgressSpinner.scss';\n\nconst RADIUSES = {\n s: 22, m: 25, l: 28, xl: 20,\n};\nconst STROKE_WIDTH = 2;\nconst MIN_PROGRESS = 0.05;\nconst MAX_PROGRESS = 1;\n\nconst ProgressSpinner: FC<{\n progress?: number;\n size?: 's' | 'm' | 'l' | 'xl';\n square?: boolean;\n transparent?: boolean;\n noCross?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}> = ({\n progress = 0,\n size = 'l',\n square,\n transparent,\n noCross,\n onClick,\n}) => {\n const radius = RADIUSES[size];\n const circleRadius = radius - STROKE_WIDTH * 2;\n const borderRadius = radius - 1;\n const circumference = circleRadius * 2 * Math.PI;\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n\n useEffect(() => {\n if (!container.current) {\n return;\n }\n\n const svg = container.current.firstElementChild;\n const strokeDashOffset = circumference - Math.min(Math.max(MIN_PROGRESS, progress), MAX_PROGRESS) * circumference;\n\n if (!svg) {\n container.current.innerHTML = `\n \n `;\n } else {\n (svg.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n }, [container, circumference, borderRadius, circleRadius, progress]);\n\n const className = buildClassName(\n `ProgressSpinner size-${size}`,\n transparent && 'transparent',\n square && 'square',\n noCross && 'no-cross',\n );\n\n return (\n \n );\n};\n\nexport default memo(ProgressSpinner);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from './Spinner';\n\nimport './Radio.scss';\n\ntype OwnProps = {\n id?: string;\n name: string;\n label: string;\n subLabel?: string;\n value: string;\n checked: boolean;\n disabled?: boolean;\n hidden?: boolean;\n isLoading?: boolean;\n onChange: (e: ChangeEvent) => void;\n};\n\nconst Radio: FC = ({\n id,\n label,\n subLabel,\n value,\n name,\n checked,\n disabled,\n hidden,\n isLoading,\n onChange,\n}) => {\n const lang = useLang();\n const className = buildClassName(\n 'Radio',\n disabled && 'disabled',\n hidden && 'hidden-widget',\n isLoading && 'loading',\n );\n\n return (\n \n );\n};\n\nexport default memo(Radio);\n","import { ChangeEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport Radio from './Radio';\n\nexport type IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n hidden?: boolean;\n};\n\ntype OwnProps = {\n id?: string;\n name: string;\n options: IRadioOption[];\n selected?: string;\n disabled?: boolean;\n loadingOption?: string;\n onChange: (value: string) => void;\n};\n\nconst RadioGroup: FC = ({\n id,\n name,\n options,\n selected,\n disabled,\n loadingOption,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value } = event.currentTarget;\n onChange(value);\n }, [onChange]);\n\n return (\n
\n {options.map((option) => (\n
\n );\n};\n\nexport default memo(RadioGroup);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n value: number;\n renderValue?: (value: number) => string;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n min = 0,\n max = options ? options.length - 1 : 100,\n step = 1,\n label,\n value,\n renderValue,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else {\n const possibleValuesLength = (max - min) / step;\n return ((value - min) / possibleValuesLength) * 100;\n }\n }, [options, value, max, min, step]);\n\n return (\n
\n {label && (\n
\n {label}\n {!options && (\n {renderValue ? renderValue(value) : value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\nimport useInputFocusOnOpen from '../../hooks/useInputFocusOnOpen';\n\nimport Loading from './Loading';\nimport Button from './Button';\n\nimport './SearchInput.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n children?: any;\n parentContainerClassName?: string;\n className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\n autoComplete?: string;\n canClose?: boolean;\n autoFocusSearch?: boolean;\n onChange: (value: string) => void;\n onReset?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n onBlur?: NoneToVoidFunction;\n};\n\nconst SearchInput: FC = ({\n ref,\n children,\n parentContainerClassName,\n value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\n autoComplete,\n canClose,\n autoFocusSearch,\n onChange,\n onReset,\n onFocus,\n onBlur,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let inputRef = useRef(null);\n if (ref) {\n inputRef = ref;\n }\n\n const [isInputFocused, markInputFocused, unmarkInputFocused] = useFlag(focused);\n\n useInputFocusOnOpen(inputRef, autoFocusSearch, unmarkInputFocused);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (focused) {\n inputRef.current.focus();\n } else {\n inputRef.current.blur();\n }\n }, [focused, placeholder]); // Trick for setting focus when selecting a contact to search for\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n onChange(currentTarget.value);\n }\n\n function handleFocus() {\n markInputFocused();\n if (onFocus) {\n onFocus();\n }\n }\n\n function handleBlur() {\n unmarkInputFocused();\n if (onBlur) {\n onBlur();\n }\n }\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter') {\n const element = document.querySelector(`.${parentContainerClassName} .ListItem-button`) as HTMLElement;\n if (element) {\n element.focus();\n }\n }\n }, [parentContainerClassName]);\n\n return (\n \n {children}\n \n \n {isLoading && (\n \n )}\n {!isLoading && (value || canClose) && onReset && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SearchInput);\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\n\ntype ChildrenFn = () => any;\n\ntype OwnProps = {\n isOpen: boolean;\n isCustom?: boolean;\n id?: string;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n children: ChildrenFn;\n};\n\nconst ShowTransition: FC = ({\n isOpen, isCustom, id, className, onClick, children,\n}) => {\n const { shouldRender, transitionClassNames } = useShowTransition(\n isOpen, undefined, undefined, isCustom ? false : undefined,\n );\n const prevIsOpen = usePrevious(isOpen);\n const prevChildren = usePrevious(children);\n const fromChildrenRef = useRef();\n\n if (prevIsOpen && !isOpen) {\n fromChildrenRef.current = prevChildren;\n }\n\n return (\n shouldRender && (\n
\n {isOpen ? children() : fromChildrenRef.current!()}\n
\n )\n );\n};\n\nexport default ShowTransition;\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Switcher.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n checked?: boolean;\n disabled?: boolean;\n inactive?: boolean;\n noAnimation?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Switcher: FC = ({\n id,\n name,\n value,\n label,\n checked = false,\n disabled,\n inactive,\n noAnimation,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((e: ChangeEvent) => {\n if (onChange) {\n onChange(e);\n }\n\n if (onCheck) {\n onCheck(e.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n inactive && 'inactive',\n noAnimation && 'no-animation',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useRef, memo, useEffect,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport forceReflow from '../../util/forceReflow';\nimport renderText from '../common/helpers/renderText';\n\nimport './Tab.scss';\n\ntype OwnProps = {\n className?: string;\n title: string;\n isActive?: boolean;\n badgeCount?: number;\n isBadgeActive?: boolean;\n previousActiveTab?: number;\n onClick: (arg: number) => void;\n clickArg: number;\n};\n\nconst classNames = {\n active: 'Tab--active',\n badgeActive: 'Tab__badge--active',\n};\n\nconst Tab: FC = ({\n className,\n title,\n isActive,\n badgeCount,\n isBadgeActive,\n previousActiveTab,\n onClick,\n clickArg,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const tabRef = useRef(null);\n\n useEffect(() => {\n // Set initial active state\n if (isActive && previousActiveTab === undefined && tabRef.current) {\n tabRef.current.classList.add(classNames.active);\n }\n\n if (!isActive || previousActiveTab === undefined) {\n return;\n }\n\n const tabEl = tabRef.current!;\n const prevTabEl = tabEl.parentElement!.children[previousActiveTab];\n if (!prevTabEl) {\n return;\n }\n\n const platformEl = tabEl.querySelector('i')!;\n const prevPlatformEl = prevTabEl.querySelector('i')!;\n\n // We move and resize the platform, so it repeats the position and size of the previous one\n const shiftLeft = prevPlatformEl.parentElement!.offsetLeft - platformEl.parentElement!.offsetLeft;\n const scaleFactor = prevPlatformEl.clientWidth / platformEl.clientWidth;\n\n prevPlatformEl.classList.remove('animate');\n platformEl.classList.remove('animate');\n platformEl.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n forceReflow(platformEl);\n platformEl.classList.add('animate');\n platformEl.style.transform = 'none';\n\n prevTabEl.classList.remove(classNames.active);\n tabEl.classList.add(classNames.active);\n }, [isActive, previousActiveTab]);\n\n return (\n onClick(clickArg)}\n ref={tabRef}\n >\n \n {renderText(title)}\n {!!badgeCount && (\n {badgeCount}\n )}\n \n \n
\n );\n};\n\nexport default memo(Tab);\n","import React, {\n FC, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { IS_ANDROID, IS_IOS } from '../../util/environment';\nimport fastSmoothScrollHorizontal from '../../util/fastSmoothScrollHorizontal';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHorizontalScroll from '../../hooks/useHorizontalScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Tab from './Tab';\n\nimport './TabList.scss';\n\nexport type TabWithProperties = {\n title: string;\n badgeCount?: number;\n isBadgeActive?: boolean;\n};\n\ntype OwnProps = {\n tabs: readonly TabWithProperties[];\n activeTab: number;\n big?: boolean;\n onSwitchTab: (index: number) => void;\n};\n\nconst TAB_SCROLL_THRESHOLD_PX = 16;\n// Should match duration from `--slide-transition` CSS variable\nconst SCROLL_DURATION = IS_IOS ? 450 : IS_ANDROID ? 400 : 300;\n\nconst TabList: FC = ({\n tabs, activeTab, big, onSwitchTab,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const previousActiveTab = usePrevious(activeTab);\n\n useHorizontalScroll(containerRef.current);\n\n // Scroll container to place active tab in the center\n useEffect(() => {\n const container = containerRef.current!;\n const { scrollWidth, offsetWidth, scrollLeft } = container;\n if (scrollWidth <= offsetWidth) {\n return;\n }\n\n const activeTabElement = container.childNodes[activeTab] as HTMLElement | null;\n if (!activeTabElement) {\n return;\n }\n\n const { offsetLeft: activeTabOffsetLeft, offsetWidth: activeTabOffsetWidth } = activeTabElement;\n const newLeft = activeTabOffsetLeft - (offsetWidth / 2) + (activeTabOffsetWidth / 2);\n\n // Prevent scrolling by only a couple of pixels, which doesn't look smooth\n if (Math.abs(newLeft - scrollLeft) < TAB_SCROLL_THRESHOLD_PX) {\n return;\n }\n\n fastSmoothScrollHorizontal(container, newLeft, SCROLL_DURATION);\n }, [activeTab]);\n\n const lang = useLang();\n\n return (\n \n {tabs.map((tab, i) => (\n \n ))}\n \n );\n};\n\nexport default memo(TabList);\n","import { RefObject } from 'react';\nimport React, {\n FC, useLayoutEffect, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal } from '../../lib/teact/teactn';\nimport { GlobalState } from '../../global/types';\n\nimport { ANIMATION_LEVEL_MIN } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport forceReflow from '../../util/forceReflow';\nimport { waitForAnimationEnd, waitForTransitionEnd } from '../../util/cssAnimationEndListeners';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean, currentKey: number) => any;\nexport type TransitionProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-rtl' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal' | 'slide-optimized' | 'slide-optimized-rtl'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n cleanupExceptionKey?: number;\n isDisabled?: boolean;\n id?: string;\n className?: string;\n onStart?: NoneToVoidFunction;\n onStop?: NoneToVoidFunction;\n children: ChildrenFn;\n};\n\nconst CLEANED_UP = Symbol('CLEANED_UP');\n\nconst classNames = {\n active: 'Transition__slide--active',\n};\n\nconst Transition: FC = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n id,\n className,\n onStart,\n onStop,\n children,\n}) => {\n // No need for a container to update on change\n const { animationLevel } = getGlobal().settings.byKey;\n const currentKeyRef = useRef();\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef>({});\n const prevActiveKey = usePrevious(activeKey);\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup || (cleanupExceptionKey !== undefined && cleanupExceptionKey === prevActiveKey)) {\n return;\n }\n\n rendersRef.current = { [prevActiveKey]: CLEANED_UP };\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n if (name.startsWith('slide-optimized')) {\n (childElements[0] as HTMLElement).style.transition = 'none';\n (childElements[0] as HTMLElement).style.transform = 'translate3d(0, 0, 0)';\n }\n\n childElements[0].classList.add(classNames.active);\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n currentKeyRef.current = activeKey;\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'slide-optimized' || name === 'slide-optimized-rtl') {\n performSlideOptimized(\n animationLevel,\n name,\n isBackwards,\n cleanup,\n activeKey,\n currentKeyRef,\n container,\n shouldRestoreHeight,\n onStart,\n onStop,\n childNodes[activeIndex] as HTMLElement,\n childNodes[prevActiveIndex] as HTMLElement,\n );\n\n return;\n }\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n if (name === 'none' || animationLevel === ANIMATION_LEVEL_MIN) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle(classNames.active, i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove(classNames.active);\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n onStart?.();\n\n function onAnimationEnd() {\n requestAnimationFrame(() => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle(classNames.active, i === activeIndex);\n }\n });\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector(`.${classNames.active}`);\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n onStop?.();\n dispatchHeavyAnimationStop();\n cleanup();\n });\n }\n\n const watchedNode = name === 'mv-slide'\n ? childNodes[activeIndex]?.firstChild\n : name === 'reveal' && isBackwards\n ? childNodes[prevActiveIndex]\n : childNodes[activeIndex];\n\n if (watchedNode) {\n waitForAnimationEnd(watchedNode, onAnimationEnd);\n } else {\n onAnimationEnd();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector(`.${classNames.active}`)\n || container.querySelector('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n container.style.flexBasis = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const collection = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n\n const contents = collection.map((key) => {\n const render = renders[key];\n\n return (\n typeof render === 'function' ? (\n
{render(key === activeKey, key === prevActiveKey, activeKey)}
\n ) : undefined\n );\n });\n\n return (\n \n {contents}\n \n );\n};\n\nexport default Transition;\n\nfunction performSlideOptimized(\n animationLevel: GlobalState['settings']['byKey']['animationLevel'],\n name: 'slide-optimized' | 'slide-optimized-rtl',\n isBackwards: boolean,\n cleanup: NoneToVoidFunction,\n activeKey: number,\n currentKeyRef: { current: number | undefined },\n container: HTMLElement,\n shouldRestoreHeight?: boolean,\n onStart?: NoneToVoidFunction,\n onStop?: NoneToVoidFunction,\n toSlide?: HTMLElement,\n fromSlide?: HTMLElement,\n) {\n if (!fromSlide || !toSlide) {\n return;\n }\n\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = '';\n fromSlide.classList.remove(classNames.active);\n\n toSlide.style.transition = 'none';\n toSlide.style.transform = 'translate3d(0, 0, 0)';\n toSlide.classList.add(classNames.active);\n\n cleanup();\n\n return;\n }\n\n if (name === 'slide-optimized-rtl') {\n isBackwards = !isBackwards;\n }\n\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n requestAnimationFrame(() => {\n onStart?.();\n\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = 'translate3d(0, 0, 0)';\n\n toSlide.style.transition = 'none';\n toSlide.style.transform = `translate3d(${isBackwards ? '-' : ''}100%, 0, 0)`;\n\n forceReflow(toSlide);\n\n fromSlide.style.transition = '';\n fromSlide.style.transform = `translate3d(${isBackwards ? '' : '-'}100%, 0, 0)`;\n\n toSlide.style.transition = '';\n toSlide.style.transform = 'translate3d(0, 0, 0)';\n\n fromSlide.classList.remove(classNames.active);\n toSlide.classList.add(classNames.active);\n\n waitForTransitionEnd(fromSlide, () => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = '';\n\n if (shouldRestoreHeight) {\n toSlide.style.height = 'auto';\n container.style.height = `${toSlide.clientHeight}px`;\n }\n\n onStop?.();\n dispatchHeavyAnimationStop();\n cleanup();\n });\n });\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: string[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds?.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../lib/teact/teact';\nimport { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { register, Track, TrackId } from '../util/audioPlayer';\nimport useEffectWithPrevDeps from './useEffectWithPrevDeps';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\nimport useOnChange from './useOnChange';\nimport {\n MediaSessionHandlers, registerMediaSession, setPlaybackState, setPositionState, updateMetadata,\n} from '../util/mediaSession';\n\ntype Handler = (e: Event) => void;\n\nconst DEFAULT_SKIP_TIME = 10;\n\nexport default (\n trackId: TrackId,\n originalDuration: number, // Sometimes incorrect for voice messages\n trackType: Track['type'],\n src?: string,\n handlers?: Record,\n metadata?: MediaMetadata,\n onInit?: (element: HTMLAudioElement) => void,\n shouldPlay = false,\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n noPlaylist = false,\n noProgressUpdates = false,\n) => {\n // eslint-disable-next-line no-null/no-null\n const controllerRef = useRef>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n let isPlayingSync = isPlaying;\n\n const [playProgress, setPlayProgress] = useState(0);\n\n const handleTrackChange = useCallback(() => {\n setIsPlaying(false);\n if (onTrackChange) onTrackChange();\n }, [onTrackChange]);\n\n useOnChange(() => {\n controllerRef.current = register(trackId, trackType, (eventName, e) => {\n switch (eventName) {\n case 'onPlay': {\n const {\n setVolume, setPlaybackRate, toggleMuted, proxy,\n } = controllerRef.current!;\n setIsPlaying(true);\n\n registerMediaSession(metadata, makeMediaHandlers(controllerRef));\n setPlaybackState('playing');\n setVolume(getGlobal().audioPlayer.volume);\n toggleMuted(!!getGlobal().audioPlayer.isMuted);\n if (trackType === 'voice') {\n setPlaybackRate(getGlobal().audioPlayer.playbackRate);\n }\n\n setPositionState({\n duration: proxy.duration || 0,\n playbackRate: proxy.playbackRate,\n position: proxy.currentTime,\n });\n break;\n }\n case 'onRateChange': {\n const { proxy } = controllerRef.current!;\n setPositionState({\n duration: proxy.duration || 0,\n playbackRate: proxy.playbackRate,\n position: proxy.currentTime,\n });\n break;\n }\n case 'onPause':\n setIsPlaying(false);\n setPlaybackState('paused');\n break;\n case 'onTimeUpdate': {\n const { proxy } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n if (!noProgressUpdates) setPlayProgress(proxy.currentTime / duration);\n break;\n }\n case 'onEnded': {\n setPlaybackState('paused');\n break;\n }\n }\n\n handlers?.[eventName]?.(e);\n }, onForcePlay, handleTrackChange);\n\n const { proxy } = controllerRef.current!;\n\n if (!isPlaying && !proxy.paused) {\n setIsPlaying(true);\n isPlayingSync = true;\n }\n\n if (onInit) {\n onInit(proxy);\n }\n }, [trackId]);\n\n useEffect(() => {\n if (isPlaying && metadata) updateMetadata(metadata);\n }, [metadata, isPlaying]);\n\n const {\n play,\n pause,\n setCurrentTime,\n proxy,\n destroy,\n setVolume,\n stop,\n isFirst,\n isLast,\n requestNextTrack,\n requestPreviousTrack,\n setPlaybackRate,\n toggleMuted,\n } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n\n // RAF progress\n useEffect(() => {\n if (duration && !isSafariPatchInProgress(proxy) && !noProgressUpdates) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, playProgress, proxy, noProgressUpdates]);\n\n // Cleanup\n useEffect(() => () => {\n destroy(noPlaylist);\n }, [destroy, noPlaylist]);\n\n // Autoplay once `src` is present\n useEffectWithPrevDeps(([prevShouldPlay, prevSrc]) => {\n if (prevShouldPlay === shouldPlay && src === prevSrc) {\n return;\n }\n\n // When paused by another player\n if (proxy.src && proxy.paused) {\n return;\n }\n\n if (shouldPlay && src && !isPlaying) {\n play(src);\n }\n }, [shouldPlay, src, isPlaying, play, proxy.src, proxy.paused]);\n\n const playIfPresent = useCallback(() => {\n if (src) {\n play(src);\n }\n }, [src, play]);\n\n const playPause = useCallback(() => {\n if (isPlaying) {\n pause();\n } else {\n playIfPresent();\n }\n }, [pause, playIfPresent, isPlaying]);\n\n const setTime = useCallback((time: number) => {\n setCurrentTime(time);\n if (duration) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, proxy, setCurrentTime]);\n\n return {\n isPlaying: isPlayingSync,\n playProgress,\n playPause,\n pause,\n play: playIfPresent,\n stop,\n setCurrentTime: setTime,\n setVolume,\n audioProxy: proxy,\n duration,\n requestNextTrack,\n requestPreviousTrack,\n isFirst,\n isLast,\n setPlaybackRate,\n toggleMuted,\n };\n};\n\nfunction makeMediaHandlers(controllerRef: React.RefObject>) {\n let mediaHandlers: MediaSessionHandlers = {};\n if (controllerRef && controllerRef.current) {\n const {\n play, pause, setCurrentTime, proxy, requestNextTrack, requestPreviousTrack, isFirst, isLast,\n } = controllerRef.current;\n mediaHandlers = {\n play: () => {\n play(proxy.src);\n },\n pause: () => {\n pause();\n },\n stop: () => {\n pause();\n setCurrentTime(0);\n getDispatch().closeAudioPlayer();\n },\n seekbackward: (event) => {\n const skipTime = event.seekOffset || DEFAULT_SKIP_TIME;\n setCurrentTime(Math.max(proxy.currentTime - skipTime, 0));\n },\n seekforward: (event) => {\n const skipTime = event.seekOffset || DEFAULT_SKIP_TIME;\n setCurrentTime(Math.min(proxy.currentTime + skipTime, proxy.duration));\n },\n seekTo: (event) => {\n if (event.seekTime) {\n setCurrentTime(event.seekTime);\n }\n },\n };\n\n if (!isLast()) {\n mediaHandlers.nexttrack = () => {\n requestNextTrack();\n };\n }\n if (!isFirst()) {\n mediaHandlers.previoustrack = () => {\n requestPreviousTrack();\n };\n }\n }\n return mediaHandlers;\n}\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport { imgToCanvas } from '../util/files';\nimport useForceUpdate from './useForceUpdate';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\nconst MAX_CACHE_SIZE = 1000;\n\nconst cache = new Map();\n\nexport default function useBlur(dataUri?: string, isDisabled = false, delay?: number) {\n const blurredRef = useRef(dataUri ? cache.get(dataUri) : undefined);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n if (timeoutRef.current && isDisabled) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useEffect(() => {\n if (!dataUri || blurredRef.current || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n img.onload = () => {\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n const blurredDataUri = canvas.toDataURL();\n\n blurredRef.current = blurredDataUri;\n forceUpdate();\n\n if (cache.size >= MAX_CACHE_SIZE) {\n cache.clear();\n }\n cache.set(dataUri, blurredDataUri);\n };\n\n if (delay) {\n timeoutRef.current = window.setTimeout(() => {\n img.src = dataUri;\n }, delay);\n } else {\n img.src = dataUri;\n }\n }, [dataUri, delay, forceUpdate, isDisabled]);\n\n return blurredRef.current;\n}\n","import { useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useOnChange from './useOnChange';\nimport useBlur from './useBlur';\nimport { imgToCanvas } from '../util/files';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useBlurSync(dataUri: string | false | undefined) {\n const blurredRef = useRef();\n\n let isChanged = false;\n\n useOnChange(() => {\n isChanged = true;\n\n blurredRef.current = undefined;\n\n if (!dataUri) {\n return;\n }\n\n const img = new Image();\n img.src = dataUri;\n if (!img.width) {\n return;\n }\n\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n\n blurredRef.current = canvas.toDataURL();\n }, [dataUri]);\n\n // Sometimes `Image` do not manage to load synchronously,\n // so we fall back the non-blurred variant and prepare the async one at least for the next time\n const blurredAsync = useBlur(dataUri || undefined, Boolean(blurredRef.current));\n\n return blurredRef.current || (!isChanged && blurredAsync) || dataUri || undefined;\n}\n","import React, { useCallback, useMemo, useState } from '../lib/teact/teact';\nimport { debounce } from '../util/schedulers';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\n\ntype BufferingEvent = (e: Event | React.SyntheticEvent) => void;\n\nconst MIN_READY_STATE = 3;\n// Avoid flickering when re-mounting previously buffered video\nconst DEBOUNCE = 200;\n\nexport default (noInitiallyBuffered = false) => {\n const [isBuffered, setIsBuffered] = useState(!noInitiallyBuffered);\n const [bufferedProgress, setBufferedProgress] = useState(0);\n\n const setIsBufferedDebounced = useMemo(() => {\n return debounce(setIsBuffered, DEBOUNCE, false, true);\n }, []);\n\n const handleBuffering = useCallback((e) => {\n const media = e.currentTarget as HTMLMediaElement;\n\n if (!isSafariPatchInProgress(media)) {\n if (media.buffered.length) {\n setBufferedProgress(media.buffered.end(0) / media.duration);\n }\n\n setIsBufferedDebounced(media.readyState >= MIN_READY_STATE || media.currentTime > 0);\n }\n }, [setIsBufferedDebounced]);\n\n const bufferingHandlers = {\n onLoadedData: handleBuffering,\n onPlaying: handleBuffering,\n onLoadStart: handleBuffering, // Needed for Safari to start\n onPause: handleBuffering, // Needed for Chrome when seeking\n onTimeUpdate: handleBuffering, // Needed for audio buffering progress\n onProgress: handleBuffering, // Needed for video buffering progress\n };\n\n return {\n isBuffered,\n bufferedProgress,\n bufferingHandlers,\n checkBuffering(element: HTMLMediaElement) {\n setIsBufferedDebounced(element.readyState >= MIN_READY_STATE);\n },\n };\n};\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useForceUpdate from './useForceUpdate';\nimport { IS_CANVAS_FILTER_SUPPORTED } from '../util/environment';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useCanvasBlur(dataUri?: string, isDisabled = false, withRaf?: boolean) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n\n if (!dataUri || !canvas || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n const processBlur = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', { alpha: false })!;\n\n if (IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${RADIUS}px)`;\n }\n\n ctx.drawImage(img, -RADIUS * 2, -RADIUS * 2, canvas.width + RADIUS * 4, canvas.height + RADIUS * 4);\n\n if (!IS_CANVAS_FILTER_SUPPORTED) {\n fastBlur(ctx, 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n }\n };\n\n img.onload = () => {\n if (withRaf) {\n requestAnimationFrame(processBlur);\n } else {\n processBlur();\n }\n };\n\n img.src = dataUri;\n }, [canvasRef, dataUri, forceUpdate, isDisabled, withRaf]);\n\n return canvasRef;\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../api/types';\n\nimport {\n isChatArchived, getCanDeleteChat, isUserId, isChatChannel,\n} from '../modules/helpers';\nimport { compact } from '../util/iteratees';\nimport useLang from './useLang';\n\nexport default ({\n chat,\n user,\n handleDelete,\n handleChatFolderChange,\n folderId,\n isPinned,\n isMuted,\n canChangeFolder,\n}: {\n chat: ApiChat | undefined;\n user: ApiUser | undefined;\n handleDelete: () => void;\n handleChatFolderChange: () => void;\n folderId?: number;\n isPinned?: boolean;\n isMuted?: boolean;\n canChangeFolder?: boolean;\n}, isInSearch = false) => {\n const lang = useLang();\n\n const { isSelf } = user || {};\n\n return useMemo(() => {\n if (!chat) {\n return undefined;\n }\n\n const {\n toggleChatPinned,\n updateChatMutedState,\n toggleChatArchived,\n toggleChatUnread,\n } = getDispatch();\n\n const actionAddToFolder = canChangeFolder ? {\n title: lang('ChatList.Filter.AddToFolder'),\n icon: 'folder',\n handler: handleChatFolderChange,\n } : undefined;\n\n const actionPin = isPinned\n ? {\n title: lang('UnpinFromTop'),\n icon: 'unpin',\n handler: () => toggleChatPinned({ id: chat.id, folderId }),\n }\n : { title: lang('PinToTop'), icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) };\n\n if (isInSearch) {\n return compact([actionPin, actionAddToFolder]);\n }\n\n const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark\n ? { title: lang('MarkAsRead'), icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) }\n : { title: lang('MarkAsUnread'), icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) };\n\n const actionMute = isMuted\n ? {\n title: lang('ChatList.Unmute'),\n icon: 'unmute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }),\n }\n : {\n title: lang('ChatList.Mute'),\n icon: 'mute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }),\n };\n\n const actionArchive = isChatArchived(chat)\n ? { title: lang('Unarchive'), icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) }\n : { title: lang('Archive'), icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) };\n\n const actionDelete = {\n title: isUserId(chat.id)\n ? lang('Delete')\n : lang(getCanDeleteChat(chat)\n ? 'DeleteChat'\n : (isChatChannel(chat) ? 'LeaveChannel' : 'Group.LeaveGroup')),\n icon: 'delete',\n destructive: true,\n handler: handleDelete,\n };\n\n const isInFolder = folderId !== undefined;\n\n return compact([\n actionAddToFolder,\n actionUnreadMark,\n actionPin,\n !isSelf && actionMute,\n !isSelf && !isInFolder && actionArchive,\n actionDelete,\n ]);\n }, [\n chat, canChangeFolder, lang, handleChatFolderChange, isPinned, isInSearch, isMuted, handleDelete, folderId, isSelf,\n ]);\n};\n","import { RefObject } from 'react';\nimport { useState, useEffect, useCallback } from '../lib/teact/teact';\n\nimport { IAnchorPosition } from '../types';\nimport {\n IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT, IS_PWA, IS_IOS,\n} from '../util/environment';\n\nconst LONG_TAP_DURATION_MS = 200;\n\nfunction checkIsDisabledForMobile() {\n return IS_SINGLE_COLUMN_LAYOUT\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nfunction stopEvent(e: Event) {\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n shouldDisableOnLink?: boolean,\n shouldDisableOnLongTap?: boolean,\n) => {\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuPosition, setContextMenuPosition] = useState(undefined);\n\n const handleBeforeContextMenu = useCallback((e: React.MouseEvent) => {\n if (!isMenuDisabled && e.button === 2) {\n (e.target as HTMLElement).classList.add('no-selection');\n }\n }, [isMenuDisabled]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n (e.target as HTMLElement).classList.remove('no-selection');\n\n if (isMenuDisabled || (shouldDisableOnLink && (e.target as HTMLElement).matches('a[href]'))) {\n return;\n }\n e.preventDefault();\n\n if (contextMenuPosition) {\n return;\n }\n\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n }, [isMenuDisabled, shouldDisableOnLink, contextMenuPosition]);\n\n const handleContextMenuClose = useCallback(() => {\n setIsContextMenuOpen(false);\n }, []);\n\n const handleContextMenuHide = useCallback(() => {\n setContextMenuPosition(undefined);\n document.body.classList.remove('no-selection');\n }, []);\n\n // Support context menu on touch-devices\n useEffect(() => {\n if (isMenuDisabled || !IS_TOUCH_ENV || shouldDisableOnLongTap) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (!element) {\n return undefined;\n }\n\n let timer: number | undefined;\n\n const clearLongPressTimer = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const emulateContextMenuEvent = (originalEvent: TouchEvent) => {\n clearLongPressTimer();\n\n const { clientX, clientY, target } = originalEvent.touches[0];\n\n if (contextMenuPosition || (shouldDisableOnLink && (target as HTMLElement).matches('a[href]'))) {\n return;\n }\n\n // Temporarily intercept and clear the next click\n element.addEventListener('touchend', function cancelClickOnce(e) {\n element.removeEventListener('touchend', cancelClickOnce, true);\n stopEvent(e);\n }, true);\n\n // On iOS15, in PWA mode, the context menu immediately closes after opening\n if (IS_PWA && IS_IOS) {\n element.addEventListener('mousedown', function cancelClickOnce(e) {\n element.removeEventListener('mousedown', cancelClickOnce, true);\n stopEvent(e);\n }, true);\n }\n\n document.body.classList.add('no-selection');\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: clientX, y: clientY });\n };\n\n const startLongPressTimer = (e: TouchEvent) => {\n if (isMenuDisabled || checkIsDisabledForMobile()) {\n return;\n }\n clearLongPressTimer();\n\n timer = window.setTimeout(() => emulateContextMenuEvent(e), LONG_TAP_DURATION_MS);\n };\n\n // @perf Consider event delegation\n element.addEventListener('touchstart', startLongPressTimer, { passive: true });\n element.addEventListener('touchcancel', clearLongPressTimer, true);\n element.addEventListener('touchend', clearLongPressTimer, true);\n element.addEventListener('touchmove', clearLongPressTimer, { passive: true });\n\n return () => {\n clearLongPressTimer();\n element.removeEventListener('touchstart', startLongPressTimer);\n element.removeEventListener('touchcancel', clearLongPressTimer, true);\n element.removeEventListener('touchend', clearLongPressTimer, true);\n element.removeEventListener('touchmove', clearLongPressTimer);\n };\n }, [contextMenuPosition, isMenuDisabled, shouldDisableOnLongTap, elementRef, shouldDisableOnLink]);\n\n return {\n isContextMenuOpen,\n contextMenuPosition,\n handleBeforeContextMenu,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n };\n};\n","import { useState, useLayoutEffect } from '../lib/teact/teact';\nimport { IAnchorPosition } from '../types';\n\nconst MENU_POSITION_VISUAL_COMFORT_SPACE_PX = 16;\nconst MENU_POSITION_BOTTOM_MARGIN = 12;\n\nexport default (\n anchor: IAnchorPosition | undefined,\n getTriggerElement: () => HTMLElement | null,\n getRootElement: () => HTMLElement | null,\n getMenuElement: () => HTMLElement | null,\n extraPaddingX = 0,\n extraTopPadding = 0,\n marginSides = 0,\n extraMarginTop = 0,\n) => {\n const [positionX, setPositionX] = useState<'right' | 'left'>('right');\n const [positionY, setPositionY] = useState<'top' | 'bottom'>('bottom');\n const [withScroll, setWithScroll] = useState(false);\n const [style, setStyle] = useState('');\n const [menuStyle, setMenuStyle] = useState('');\n\n useLayoutEffect(() => {\n const triggerEl = getTriggerElement();\n if (!anchor || !triggerEl) {\n return;\n }\n\n let { x, y } = anchor;\n const emptyRect = {\n width: 0, left: 0, height: 0, top: 0,\n };\n\n const menuEl = getMenuElement();\n const rootEl = getRootElement();\n\n const triggerRect = triggerEl.getBoundingClientRect();\n\n const marginTop = menuEl ? parseInt(getComputedStyle(menuEl).marginTop, 10) + extraMarginTop : undefined;\n\n const menuRect = menuEl ? {\n width: menuEl.offsetWidth,\n height: menuEl.offsetHeight + marginTop!,\n } : emptyRect;\n\n const rootRect = rootEl ? rootEl.getBoundingClientRect() : emptyRect;\n\n let horizontalPostition: 'left' | 'right';\n if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n x += 3;\n horizontalPostition = 'left';\n } else if (x - menuRect.width > 0) {\n horizontalPostition = 'right';\n x -= 3;\n } else {\n horizontalPostition = 'left';\n x = 16;\n }\n setPositionX(horizontalPostition);\n\n if (marginSides\n && horizontalPostition === 'right' && (x + extraPaddingX + marginSides >= rootRect.width + rootRect.left)) {\n x -= marginSides;\n }\n\n if (marginSides && horizontalPostition === 'left') {\n if (x + extraPaddingX + marginSides + menuRect.width >= rootRect.width + rootRect.left) {\n x -= marginSides;\n } else if (x - marginSides <= 0) {\n x += marginSides;\n }\n }\n\n if (y + menuRect.height < rootRect.height + rootRect.top) {\n setPositionY('top');\n } else {\n setPositionY('bottom');\n\n if (y - menuRect.height < rootRect.top + extraTopPadding) {\n y = rootRect.top + rootRect.height;\n }\n }\n\n const left = horizontalPostition === 'left'\n ? Math.min(x - triggerRect.left, rootRect.width - menuRect.width - MENU_POSITION_VISUAL_COMFORT_SPACE_PX)\n : Math.max((x - triggerRect.left), menuRect.width + MENU_POSITION_VISUAL_COMFORT_SPACE_PX);\n const top = Math.min(\n rootRect.height - triggerRect.top + triggerRect.height - MENU_POSITION_BOTTOM_MARGIN + (marginTop || 0),\n y - triggerRect.top,\n );\n const menuMaxHeight = rootRect.height - MENU_POSITION_BOTTOM_MARGIN - (marginTop || 0);\n\n setWithScroll(menuMaxHeight < menuRect.height);\n setMenuStyle(`max-height: ${menuMaxHeight}px;`);\n setStyle(`left: ${left}px; top: ${top}px`);\n }, [\n anchor, extraPaddingX, extraTopPadding, extraMarginTop,\n getMenuElement, getRootElement, getTriggerElement, marginSides,\n ]);\n\n return {\n positionX,\n positionY,\n style,\n menuStyle,\n withScroll,\n };\n};\n","import { useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebounce(ms: number, noFirst?: boolean, noLast?: boolean) {\n return useMemo(() => {\n return debounce((cb) => cb(), ms, !noFirst, !noLast);\n }, [ms, noFirst, noLast]);\n}\n","import { useEffect, useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiMessage } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (\n chatId: string,\n messageId?: number,\n message?: ApiMessage,\n replyOriginForId?: number,\n) => {\n const { loadMessage } = getDispatch();\n const loadMessageThrottled = useMemo(() => {\n const throttled = throttle(loadMessage, 500, true);\n return () => {\n throttled({ chatId, messageId, replyOriginForId });\n };\n }, [loadMessage, chatId, messageId, replyOriginForId]);\n\n useEffect(() => {\n if (messageId && !message) {\n loadMessageThrottled();\n }\n });\n};\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (container: HTMLElement | null, isDisabled?: boolean) => {\n useEffect(() => {\n if (!container || isDisabled) {\n return undefined;\n }\n\n function handleScroll(e: WheelEvent) {\n // Ignore horizontal scroll and let it work natively (e.g. on touchpad)\n if (!e.deltaX) {\n container!.scrollLeft += e.deltaY / 4;\n }\n }\n\n container.addEventListener('wheel', handleScroll, { passive: true });\n\n return () => {\n container.removeEventListener('wheel', handleScroll);\n };\n }, [container, isDisabled]);\n};\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nexport default function useInputFocusOnOpen(\n inputRef: RefObject,\n isOpen?: boolean,\n onClose?: NoneToVoidFunction,\n) {\n useEffect(() => {\n if (isOpen) {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n if (onClose) {\n setTimeout(onClose, MODAL_HIDE_DELAY_MS);\n }\n }\n }, [inputRef, isOpen, onClose]);\n}\n","import { RefObject } from 'react';\nimport {\n useEffect, useRef, useCallback, useState,\n} from '../lib/teact/teact';\n\nimport { throttle, debounce } from '../util/schedulers';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\n\ntype TargetCallback = (entry: IntersectionObserverEntry) => void;\ntype RootCallback = (entries: IntersectionObserverEntry[]) => void;\ntype ObserveCleanup = NoneToVoidFunction;\nexport type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup;\n\ninterface IntersectionController {\n observer: IntersectionObserver;\n callbacks: Map;\n}\n\ninterface Response {\n observe: ObserveFn;\n freeze: NoneToVoidFunction;\n unfreeze: NoneToVoidFunction;\n}\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n}: {\n rootRef: RefObject;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef();\n const rootCallbackRef = useRef();\n const freezeFlagsRef = useRef(0);\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n freezeFlagsRef.current++;\n }, []);\n\n const unfreeze = useCallback(() => {\n if (!freezeFlagsRef.current) {\n return;\n }\n\n freezeFlagsRef.current--;\n\n if (!freezeFlagsRef.current && onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n return () => {\n if (controllerRef.current) {\n controllerRef.current.observer.disconnect();\n controllerRef.current.callbacks.clear();\n controllerRef.current = undefined;\n }\n };\n }, [isDisabled]);\n\n function initController() {\n const callbacks = new Map();\n const entriesAccumulator = new Map();\n const observerCallbackSync = () => {\n const entries = Array.from(entriesAccumulator.values());\n\n entries.forEach((entry: IntersectionObserverEntry) => {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback!(entry, entries);\n }\n });\n\n if (rootCallbackRef.current) {\n rootCallbackRef.current(entries);\n }\n\n entriesAccumulator.clear();\n };\n const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined;\n const observerCallback = scheduler\n ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst)\n : observerCallbackSync;\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n entriesAccumulator.set(entry.target, entry);\n });\n\n if (freezeFlagsRef.current) {\n onUnfreezeRef.current = () => {\n observerCallback();\n };\n } else {\n observerCallback();\n }\n },\n {\n root: rootRef.current,\n rootMargin: margin ? `${margin}px` : undefined,\n threshold,\n },\n );\n\n controllerRef.current = { observer, callbacks };\n }\n\n const observe = useCallback((target, targetCallback) => {\n if (!controllerRef.current) {\n initController();\n }\n\n const controller = controllerRef.current!;\n controller.observer.observe(target);\n\n if (targetCallback) {\n controller.callbacks.set(target, targetCallback);\n }\n\n return () => {\n if (targetCallback) {\n controller.callbacks.delete(target);\n }\n\n controller.observer.unobserve(target);\n };\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled]);\n\n return { observe, freeze, unfreeze };\n}\n\nexport function useOnIntersect(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n useEffect(() => {\n return observe ? observe(targetRef.current!, callback) : undefined;\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport function useIsIntersecting(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n const [isIntersecting, setIsIntersecting] = useState(!observe);\n\n useOnIntersect(targetRef, observe, (entry) => {\n setIsIntersecting(entry.isIntersecting);\n\n if (callback) {\n callback(entry);\n }\n });\n\n return isIntersecting;\n}\n","import { useEffect, useLayoutEffect, useRef } from '../lib/teact/teact';\n\nfunction useInterval(callback: NoneToVoidFunction, delay?: number, noFirst = false) {\n const savedCallback = useRef(callback);\n\n useLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (delay === undefined) {\n return undefined;\n }\n\n const id = setInterval(() => savedCallback.current(), delay);\n if (!noFirst) savedCallback.current();\n\n return () => clearInterval(id);\n }, [delay, noFirst]);\n}\n\nexport default useInterval;\n","import { useLayoutEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n","import useShowTransition from './useShowTransition';\n\nexport default function useMediaTransition(mediaData?: any) {\n const isMediaReady = Boolean(mediaData);\n const { transitionClassNames } = useShowTransition(isMediaReady, undefined, isMediaReady, 'slow');\n\n return transitionClassNames;\n}\n","import { useRef } from '../lib/teact/teact';\nimport generateIdFor from '../util/generateIdFor';\n\nconst store: Record = {};\n\nexport default () => {\n const idRef = useRef();\n\n if (!idRef.current) {\n idRef.current = generateIdFor(store);\n store[idRef.current] = true;\n }\n\n return idRef.current;\n};\n","import {\n useEffect, useMemo, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { IS_PROGRESSIVE_SUPPORTED } from '../util/environment';\nimport { ApiMediaFormat } from '../api/types';\nimport { throttle } from '../util/schedulers';\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\nimport useUniqueId from './useUniqueId';\n\nconst STREAMING_PROGRESS = 0.75;\nconst STREAMING_TIMEOUT = 1500;\nconst PROGRESS_THROTTLE = 500;\n\nexport default function useMediaWithLoadProgress(\n mediaHash: string | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n isHtmlAllowed = false,\n) {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const isStreaming = mediaFormat === ApiMediaFormat.Stream || (\n IS_PROGRESSIVE_SUPPORTED && mediaFormat === ApiMediaFormat.Progressive\n );\n const forceUpdate = useForceUpdate();\n const id = useUniqueId();\n const [loadProgress, setLoadProgress] = useState(mediaData && !isStreaming ? 1 : 0);\n const startedAtRef = useRef();\n\n const handleProgress = useMemo(() => {\n return throttle((progress: number) => {\n if (startedAtRef.current && (!delay || (Date.now() - startedAtRef.current > delay))) {\n setLoadProgress(progress);\n }\n }, PROGRESS_THROTTLE, true);\n }, [delay]);\n\n useEffect(() => {\n if (!noLoad && mediaHash) {\n if (!mediaData) {\n setLoadProgress(0);\n\n if (startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n }\n\n startedAtRef.current = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat, isHtmlAllowed, handleProgress, id).then(() => {\n const spentTime = Date.now() - startedAtRef.current!;\n startedAtRef.current = undefined;\n\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n } else if (isStreaming) {\n setTimeout(() => {\n setLoadProgress(STREAMING_PROGRESS);\n }, STREAMING_TIMEOUT);\n }\n }\n }, [\n noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress,\n isHtmlAllowed, id,\n ]);\n\n useEffect(() => {\n if (noLoad && startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n setLoadProgress(0);\n startedAtRef.current = undefined;\n }\n }, [handleProgress, noLoad]);\n\n useEffect(() => {\n return () => {\n if (mediaHash) {\n mediaLoader.removeCallback(mediaHash, id);\n }\n };\n }, [id, mediaHash]);\n\n return { mediaData, loadProgress };\n}\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT, isDisabled = false,\n) {\n const isMouseInside = useRef(false);\n\n const markMouseInside = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV && !isDisabled) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isDisabled, isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave, markMouseInside];\n}\n","import { useRef } from '../lib/teact/teact';\n\nimport usePrevious from './usePrevious';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport default function usePrevDuringAnimation(current: any, duration?: number) {\n const prev = usePrevious(current, true);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n // eslint-disable-next-line no-null/no-null\n const isCurrentPresent = current !== undefined && current !== null;\n // eslint-disable-next-line no-null/no-null\n const isPrevPresent = prev !== undefined && prev !== null;\n\n if (isCurrentPresent && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useOnChange(() => {\n // When `current` becomes empty\n if (duration && !isCurrentPresent && isPrevPresent && !timeoutRef.current) {\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = undefined;\n forceUpdate();\n }, duration);\n }\n }, [current]);\n\n return !timeoutRef.current || !duration || isCurrentPresent ? current : prev;\n}\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiSendMessageAction } from '../api/types';\n\nimport { SEND_MESSAGE_ACTION_INTERVAL } from '../config';\nimport { throttle } from '../util/schedulers';\n\nexport default (chatId: string, threadId?: number) => {\n return useMemo(() => {\n return throttle((action: ApiSendMessageAction) => {\n getDispatch().sendMessageAction({ chatId, threadId, action });\n }, SEND_MESSAGE_ACTION_INTERVAL);\n }, [chatId, threadId]);\n};\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { fastRaf } from '../util/schedulers';\n\n// Fix for memory leak when unmounting video element\nexport default function useVideoCleanup(videoRef: RefObject, dependencies: any[]) {\n useEffect(() => {\n const videoEl = videoRef.current;\n\n return () => {\n if (videoEl) {\n fastRaf(() => {\n videoEl.pause();\n videoEl.src = '';\n videoEl.load();\n });\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable no-multi-assign */\n/* eslint-disable no-cond-assign */\n/* eslint-disable no-param-reassign */\n/* eslint-disable prefer-const */\n/* eslint-disable eqeqeq */\n\n/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n","import { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { AudioOrigin, GlobalSearchContent } from '../types';\nimport { ApiMessage } from '../api/types';\n\nimport { IS_SAFARI } from './environment';\nimport safePlay from './safePlay';\nimport { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio';\nimport { getMessageKey, MessageKey, parseMessageKey } from '../modules/helpers';\nimport { fastRaf } from './schedulers';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ntype Handler = (eventName: string, e: Event) => void;\nexport type TrackId = `${MessageKey}-${number}`;\n\nexport interface Track {\n audio: HTMLAudioElement;\n proxy: HTMLAudioElement;\n type: 'voice' | 'audio';\n handlers: Handler[];\n onForcePlay?: NoneToVoidFunction;\n onTrackChange?: NoneToVoidFunction;\n}\n\nconst tracks = new Map();\nlet voiceQueue: TrackId[] = [];\nlet musicQueue: TrackId[] = [];\n\nlet currentTrackId: TrackId | undefined;\n\nfunction createAudio(\n trackId: TrackId,\n type: Track['type'],\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n): Track {\n const audio = new Audio();\n\n function handleEvent(eventName: string) {\n return (e: Event) => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n tracks.get(trackId)!.handlers.forEach((handler) => {\n handler(eventName, e);\n });\n };\n }\n\n audio.addEventListener('timeupdate', handleEvent('onTimeUpdate'));\n audio.addEventListener('play', handleEvent('onPlay'));\n audio.addEventListener('pause', handleEvent('onPause'));\n audio.addEventListener('loadstart', handleEvent('onLoadStart'));\n audio.addEventListener('loadeddata', handleEvent('onLoadedData'));\n audio.addEventListener('playing', handleEvent('onPlaying'));\n audio.addEventListener('ended', () => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n playNext(trackId);\n });\n\n return {\n audio,\n type,\n proxy: new Proxy(audio, {\n get: (target, key: keyof HTMLAudioElement) => target[key],\n }),\n handlers: [],\n onForcePlay,\n onTrackChange,\n };\n}\n\nfunction playNext(trackId: TrackId, isReverseOrder?: boolean) {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n currentTrack.audio.currentTime = 0;\n if (currentTrack.onTrackChange) currentTrack.onTrackChange();\n }\n\n const origin = getGlobal().audioPlayer.origin || AudioOrigin.Inline;\n\n const nextTrackId = findNextInQueue(trackId, origin, isReverseOrder);\n if (!nextTrackId) {\n return;\n }\n\n if (!tracks.has(nextTrackId)) {\n // A bit hacky way to continue playlist when switching chat\n getDispatch().openAudioPlayer(parseMessageKey(splitTrackId(nextTrackId).messageKey));\n\n return;\n }\n\n const nextTrack = tracks.get(nextTrackId)!;\n\n if (nextTrack.onForcePlay) {\n nextTrack.onForcePlay();\n }\n\n currentTrackId = nextTrackId;\n\n if (nextTrack.audio.src) {\n safePlay(nextTrack.audio);\n }\n}\n\nexport function stopCurrentAudio() {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n }\n}\n\nexport function register(\n trackId: TrackId,\n trackType: Track['type'],\n handler: Handler,\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n) {\n if (!tracks.has(trackId)) {\n const track = createAudio(trackId, trackType, onForcePlay, onTrackChange);\n tracks.set(trackId, track);\n addTrackToQueue(track, trackId);\n }\n const { audio, proxy, handlers } = tracks.get(trackId)!;\n\n handlers.push(handler);\n\n return {\n play(src: string) {\n if (!audio.paused) return;\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack && currentTrackId !== trackId) {\n currentTrack.audio.pause();\n currentTrack.audio.currentTime = 0;\n if (isSafariPatchInProgress(currentTrack.audio)) {\n currentTrack.audio.dataset.preventPlayAfterPatch = 'true';\n }\n if (currentTrack.onTrackChange) currentTrack.onTrackChange();\n }\n\n currentTrackId = trackId;\n\n if (!audio.src) {\n audio.src = src;\n audio.preload = 'auto';\n\n if (src.includes('/progressive/') && IS_SAFARI) {\n delete audio.dataset.preventPlayAfterPatch;\n patchSafariProgressiveAudio(audio);\n }\n }\n\n safePlay(audio);\n cleanUpQueue(trackType, trackId);\n },\n\n pause() {\n if (currentTrackId === trackId) {\n audio.pause();\n }\n },\n\n stop() {\n if (currentTrackId === trackId) {\n // Hack, reset src to remove default media session notification\n const prevSrc = audio.src;\n audio.pause();\n // onPause not called otherwise, but required to sync UI\n fastRaf(() => {\n audio.src = '';\n audio.src = prevSrc;\n });\n }\n },\n\n setCurrentTime(time: number) {\n if (currentTrackId === trackId) {\n if (audio.fastSeek) {\n audio.fastSeek(time);\n } else {\n audio.currentTime = time;\n }\n }\n },\n\n setVolume(volume: number) {\n if (currentTrackId === trackId) {\n audio.volume = volume;\n audio.muted = false;\n }\n },\n\n setPlaybackRate(rate: number) {\n if (currentTrackId === trackId) {\n audio.playbackRate = rate;\n }\n },\n\n toggleMuted(muted?: boolean) {\n if (muted === undefined) {\n audio.muted = !audio.muted;\n } else {\n audio.muted = muted;\n }\n },\n\n proxy,\n\n requestNextTrack() {\n playNext(trackId);\n },\n\n isLast() {\n return !findNextInQueue(trackId, getGlobal().audioPlayer.origin);\n },\n\n isFirst() {\n return !findNextInQueue(trackId, getGlobal().audioPlayer.origin, true);\n },\n\n requestPreviousTrack() {\n playNext(trackId, true);\n },\n\n destroy(shouldRemoveFromQueue = false) {\n const track = tracks.get(trackId);\n if (!track) {\n return;\n }\n\n track.handlers = track.handlers.filter((h) => h !== handler);\n\n if (!track.handlers.length) {\n track.audio.pause();\n tracks.delete(trackId);\n\n if (shouldRemoveFromQueue) {\n removeFromQueue(track, trackId);\n }\n\n if (trackId === currentTrackId) {\n currentTrackId = undefined;\n }\n }\n },\n };\n}\n\nfunction getTrackQueue(track: Track) {\n switch (track.type) {\n case 'audio': return musicQueue;\n case 'voice': return voiceQueue;\n default: return undefined;\n }\n}\n\nfunction addTrackToQueue(track: Track, trackId: TrackId) {\n if (track.type === 'audio' && !musicQueue.includes(trackId)) {\n musicQueue.push(trackId);\n musicQueue.sort(trackIdComparator);\n }\n\n if (track.type === 'voice' && !voiceQueue.includes(trackId)) {\n voiceQueue.push(trackId);\n voiceQueue.sort(trackIdComparator);\n }\n}\n\nfunction removeFromQueue(track: Track, trackId: TrackId) {\n const trackIdFilter = (el: TrackId) => el !== trackId;\n if (track.type === 'audio') {\n musicQueue = musicQueue.filter(trackIdFilter);\n }\n\n if (track.type === 'voice') {\n voiceQueue = voiceQueue.filter(trackIdFilter);\n }\n}\n\nfunction cleanUpQueue(type: Track['type'], trackId: TrackId) {\n if (getGlobal().globalSearch.currentContent === GlobalSearchContent.Music) return;\n const { chatId } = parseMessageKey(splitTrackId(trackId).messageKey);\n const openedChatId = selectCurrentMessageList(getGlobal())?.chatId;\n const queueFilter = (id: string) => (\n id.startsWith(`msg${chatId}`) || (openedChatId && id.startsWith(`msg${openedChatId}`))\n );\n\n if (type === 'audio') {\n musicQueue = musicQueue.filter(queueFilter);\n }\n\n if (type === 'voice') {\n voiceQueue = voiceQueue.filter(queueFilter);\n }\n}\n\nfunction findNextInQueue(currentId: TrackId, origin = AudioOrigin.Inline, isReverseOrder?: boolean) {\n const track = tracks.get(currentId)!;\n const queue = getTrackQueue(track);\n if (!queue) return undefined;\n\n if (origin === AudioOrigin.Search) {\n const index = queue.indexOf(currentId);\n if (index < 0) return undefined;\n const direction = isReverseOrder ? -1 : 1;\n return queue[index + direction];\n }\n\n const { chatId } = parseMessageKey(splitTrackId(currentId).messageKey);\n const chatAudio = queue.filter((id) => id.startsWith(`msg${chatId}`));\n const index = chatAudio.indexOf(currentId);\n if (index < 0) return undefined;\n let direction = origin === AudioOrigin.Inline ? -1 : 1;\n if (isReverseOrder) direction *= -1;\n return chatAudio[index + direction];\n}\n\nexport function makeTrackId(message: ApiMessage): TrackId {\n return `${getMessageKey(message)}-${message.date}`;\n}\n\nfunction splitTrackId(trackId: TrackId) {\n const messageKey = trackId.match(/^msg(-?\\d+)-(\\d+)/)![0] as MessageKey;\n const date = Number(trackId.split('-').pop());\n return {\n messageKey,\n date,\n };\n}\n\n// Descending order by date\nfunction trackIdComparator(one?: TrackId, two?: TrackId) {\n if (!one || !two) return 0;\n const { date: dateOne, messageKey: keyOne } = splitTrackId(one);\n const { date: dateTwo, messageKey: keyTwo } = splitTrackId(two);\n const diff = dateTwo - dateOne;\n return diff === 0 ? keyTwo.localeCompare(keyOne) : diff;\n}\n","import { IS_IOS } from './environment';\n\nexport enum SwipeDirection {\n Up,\n Down,\n Left,\n Right,\n}\n\ninterface CaptureOptions {\n onCapture?: (e: MouseEvent | TouchEvent) => void;\n onRelease?: (e: MouseEvent | TouchEvent) => void;\n onDrag?: (\n e: MouseEvent | TouchEvent,\n captureEvent: MouseEvent | TouchEvent,\n params: {\n dragOffsetX: number;\n dragOffsetY: number;\n },\n ) => void;\n onSwipe?: (e: Event, direction: SwipeDirection) => boolean;\n onZoom?: (e: TouchEvent, params: {\n // Relative zoom factor\n zoomFactor: number;\n\n // center coordinate of the initial pinch\n initialCenterX: number;\n initialCenterY: number;\n\n // offset of the pinch center (current from initial)\n dragOffsetX: number;\n dragOffsetY: number;\n\n // center coordinate of the current pinch\n currentCenterX: number;\n currentCenterY: number;\n }) => void;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n onDoubleClick?: (e: MouseEvent | RealTouchEvent, params: { centerX: number; centerY: number }) => void;\n excludedClosestSelector?: string;\n selectorToPreventScroll?: string;\n maxZoom?: number;\n minZoom?: number;\n isNotPassive?: boolean;\n withCursor?: boolean;\n}\n\n// https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad\n// Android does not have this value, and iOS has it but as read-only\nexport interface RealTouchEvent extends TouchEvent {\n pageX?: number;\n pageY?: number;\n}\n\ntype TSwipeAxis =\n 'x'\n | 'y'\n | undefined;\n\nconst IOS_SCREEN_EDGE_THRESHOLD = 20;\nconst MOVED_THRESHOLD = 15;\nconst SWIPE_THRESHOLD = 50;\n\nfunction getDistance(a: Touch, b?: Touch) {\n if (!b) return 0;\n return Math.sqrt((b.pageX - a.pageX) ** 2 + (b.pageY - a.pageY) ** 2);\n}\n\nfunction getTouchCenter(a: Touch, b: Touch) {\n return {\n x: (a.pageX + b.pageX) / 2,\n y: (a.pageY + b.pageY) / 2,\n };\n}\n\nlet lastClickTime = 0;\n\nexport function captureEvents(element: HTMLElement, options: CaptureOptions) {\n let captureEvent: MouseEvent | RealTouchEvent | undefined;\n let hasMoved = false;\n let hasSwiped = false;\n let initialDistance = 0;\n let initialTouchCenter = { x: window.innerWidth / 2, y: window.innerHeight / 2 };\n let initialSwipeAxis: TSwipeAxis | undefined;\n\n function onCapture(e: MouseEvent | RealTouchEvent) {\n if (options.excludedClosestSelector && (\n (e.target as HTMLElement).matches(options.excludedClosestSelector)\n || (e.target as HTMLElement).closest(options.excludedClosestSelector)\n )) {\n return;\n }\n\n captureEvent = e;\n\n if (e.type === 'mousedown') {\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onRelease);\n if (options.onDoubleClick && Date.now() - lastClickTime < 300) {\n options.onDoubleClick(e, {\n centerX: e.pageX!,\n centerY: e.pageY!,\n });\n }\n lastClickTime = Date.now();\n } else if (e.type === 'touchstart') {\n // We need to always listen on `touchstart` target:\n // https://stackoverflow.com/questions/33298828/touch-move-event-dont-fire-after-touch-start-target-is-removed\n const target = e.target as HTMLElement;\n target.addEventListener('touchmove', onMove, { passive: true });\n target.addEventListener('touchend', onRelease);\n target.addEventListener('touchcancel', onRelease);\n\n if ('touches' in e) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n\n if (e.touches.length === 2) {\n initialDistance = getDistance(e.touches[0], e.touches[1]);\n initialTouchCenter = getTouchCenter(e.touches[0], e.touches[1]);\n }\n }\n }\n\n document.body.classList.add('no-selection');\n if (options.withCursor) {\n document.body.classList.add('cursor-grabbing');\n }\n\n if (options.onCapture) {\n options.onCapture(e);\n }\n }\n\n function onRelease(e: MouseEvent | TouchEvent) {\n if (captureEvent) {\n if (options.withCursor) {\n document.body.classList.remove('cursor-grabbing');\n }\n document.body.classList.remove('no-selection');\n\n document.removeEventListener('mouseup', onRelease);\n document.removeEventListener('mousemove', onMove);\n (captureEvent.target as HTMLElement).removeEventListener('touchcancel', onRelease);\n (captureEvent.target as HTMLElement).removeEventListener('touchend', onRelease);\n (captureEvent.target as HTMLElement).removeEventListener('touchmove', onMove);\n\n captureEvent = undefined;\n\n if (IS_IOS && options.selectorToPreventScroll) {\n Array.from(document.querySelectorAll(options.selectorToPreventScroll)).forEach((scrollable) => {\n scrollable.style.overflow = '';\n });\n }\n\n if (hasMoved) {\n if (options.onRelease) {\n options.onRelease(e);\n }\n } else if (options.onClick && (!('button' in e) || e.button === 0)) {\n options.onClick(e);\n }\n }\n\n hasMoved = false;\n hasSwiped = false;\n initialDistance = 0;\n initialSwipeAxis = undefined;\n initialTouchCenter = { x: window.innerWidth / 2, y: window.innerHeight / 2 };\n }\n\n function onMove(e: MouseEvent | RealTouchEvent) {\n if (captureEvent) {\n if (e.type === 'touchmove' && ('touches' in e)) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n\n if (options.onZoom && initialDistance > 0 && e.touches.length === 2) {\n const endDistance = getDistance(e.touches[0], e.touches[1]);\n const touchCenter = getTouchCenter(e.touches[0], e.touches[1]);\n const dragOffsetX = touchCenter.x - initialTouchCenter.x;\n const dragOffsetY = touchCenter.y - initialTouchCenter.y;\n const zoomFactor = endDistance / initialDistance;\n options.onZoom(e, {\n zoomFactor,\n initialCenterX: initialTouchCenter.x,\n initialCenterY: initialTouchCenter.y,\n dragOffsetX,\n dragOffsetY,\n currentCenterX: touchCenter.x,\n currentCenterY: touchCenter.y,\n });\n if (zoomFactor !== 1) hasMoved = true;\n }\n }\n\n const dragOffsetX = e.pageX! - captureEvent.pageX!;\n const dragOffsetY = e.pageY! - captureEvent.pageY!;\n\n if (Math.abs(dragOffsetX) >= MOVED_THRESHOLD || Math.abs(dragOffsetY) >= MOVED_THRESHOLD) {\n hasMoved = true;\n }\n\n let shouldPreventScroll = false;\n\n if (options.onDrag) {\n options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY });\n shouldPreventScroll = true;\n }\n\n if (options.onSwipe && !hasSwiped) {\n hasSwiped = onSwipe(e, dragOffsetX, dragOffsetY);\n shouldPreventScroll = hasSwiped;\n }\n\n if (IS_IOS && shouldPreventScroll && options.selectorToPreventScroll) {\n Array.from(document.querySelectorAll(options.selectorToPreventScroll)).forEach((scrollable) => {\n scrollable.style.overflow = 'hidden';\n });\n }\n }\n }\n\n function onSwipe(e: MouseEvent | RealTouchEvent, dragOffsetX: number, dragOffsetY: number) {\n // Avoid conflicts with swipe-to-back gestures\n if (IS_IOS) {\n const x = (e as RealTouchEvent).touches[0].pageX;\n if (x <= IOS_SCREEN_EDGE_THRESHOLD || x >= window.innerWidth - IOS_SCREEN_EDGE_THRESHOLD) {\n return false;\n }\n }\n\n const xAbs = Math.abs(dragOffsetX);\n const yAbs = Math.abs(dragOffsetY);\n\n if (dragOffsetX && dragOffsetY) {\n const ratio = Math.max(xAbs, yAbs) / Math.min(xAbs, yAbs);\n // Diagonal swipe\n if (ratio < 2) {\n return false;\n }\n }\n\n let axis: TSwipeAxis | undefined;\n if (xAbs >= SWIPE_THRESHOLD) {\n axis = 'x';\n } else if (yAbs >= SWIPE_THRESHOLD) {\n axis = 'y';\n }\n\n if (!axis) {\n return false;\n }\n\n if (!initialSwipeAxis) {\n initialSwipeAxis = axis;\n } else if (initialSwipeAxis !== axis) {\n // Prevent horizontal swipe after vertical to prioritize scroll\n return false;\n }\n\n return processSwipe(e, axis, dragOffsetX, dragOffsetY, options.onSwipe!);\n }\n\n element.addEventListener('mousedown', onCapture);\n element.addEventListener('touchstart', onCapture, { passive: !options.isNotPassive });\n\n return () => {\n element.removeEventListener('mousedown', onCapture);\n element.removeEventListener('touchstart', onCapture);\n };\n}\n\nfunction processSwipe(\n e: Event,\n currentSwipeAxis: TSwipeAxis,\n dragOffsetX: number,\n dragOffsetY: number,\n onSwipe: (e: Event, direction: SwipeDirection) => boolean,\n) {\n if (currentSwipeAxis === 'x') {\n if (dragOffsetX < 0) {\n return onSwipe(e, SwipeDirection.Left);\n } else {\n return onSwipe(e, SwipeDirection.Right);\n }\n } else if (currentSwipeAxis === 'y') {\n if (dragOffsetY < 0) {\n return onSwipe(e, SwipeDirection.Up);\n } else {\n return onSwipe(e, SwipeDirection.Down);\n }\n }\n\n return false;\n}\n","// Sometimes event is fired earlier than animation completes\nconst ANIMATION_END_DELAY = 50;\n\nexport function waitForTransitionEnd(node: Node, handler: NoneToVoidFunction, propertyName?: string) {\n waitForEndEvent('transitionend', node, handler, propertyName);\n}\n\nexport function waitForAnimationEnd(node: Node, handler: NoneToVoidFunction, animationName?: string) {\n waitForEndEvent('animationend', node, handler, animationName);\n}\n\nfunction waitForEndEvent(\n eventType: 'transitionend' | 'animationend',\n node: Node,\n handler: NoneToVoidFunction,\n detailedName?: string,\n) {\n let isHandled = false;\n\n node.addEventListener(eventType, function handleAnimationEnd(e: TransitionEvent | AnimationEvent) {\n if (isHandled || e.target !== e.currentTarget) {\n return;\n }\n\n if (detailedName && (\n (e instanceof TransitionEvent && e.propertyName === detailedName)\n || (e instanceof AnimationEvent && e.animationName === detailedName)\n )) {\n return;\n }\n\n isHandled = true;\n\n node.removeEventListener(eventType, handleAnimationEnd as EventListener);\n\n setTimeout(() => {\n handler();\n }, ANIMATION_END_DELAY);\n } as EventListener);\n}\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { FocusDirection } from '../types';\n\nimport {\n ANIMATION_LEVEL_MIN,\n FAST_SMOOTH_MAX_DISTANCE, FAST_SMOOTH_MAX_DURATION, FAST_SMOOTH_MIN_DURATION,\n FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE,\n} from '../config';\nimport { IS_ANDROID } from './environment';\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { animateSingle } from './animation';\n\nlet isAnimating = false;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n) {\n const scrollFrom = calculateScrollFrom(container, element, maxDistance, forceDirection);\n\n if (forceDirection === FocusDirection.Static) {\n scrollWithJs(container, element, scrollFrom, position, margin, 0);\n return;\n }\n\n if (getGlobal().settings.byKey.animationLevel === ANIMATION_LEVEL_MIN) {\n forceDuration = 0;\n }\n\n scrollWithJs(container, element, scrollFrom, position, margin, forceDuration, forceNormalContainerHeight);\n}\n\nexport function isAnimatingScroll() {\n return isAnimating;\n}\n\nfunction calculateScrollFrom(\n container: HTMLElement,\n element: HTMLElement,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n) {\n const { offsetTop: elementTop } = element;\n const { scrollTop } = container;\n\n if (forceDirection === undefined) {\n const offset = elementTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n return scrollTop + (offset + maxDistance);\n } else if (offset > maxDistance) {\n return scrollTop + (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n return elementTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n return Math.max(0, elementTop - maxDistance);\n }\n\n return scrollTop;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n scrollFrom: number,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop: currentScrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n const targetContainerHeight = forceNormalContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n if (currentScrollTop !== scrollFrom) {\n container.scrollTop = scrollFrom;\n }\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollFrom + (IS_ANDROID ? 1 : 0);\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollFrom + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n case 'centerOrTop':\n path = elementHeight < targetContainerHeight\n ? (elementTop + elementHeight / 2) - (scrollFrom + targetContainerHeight / 2)\n : (elementTop - margin) - scrollFrom;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollFrom;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollFrom + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n return;\n }\n\n const target = scrollFrom + path;\n\n if (forceDuration === 0) {\n container.scrollTop = target;\n return;\n }\n\n isAnimating = true;\n\n const absPath = Math.abs(path);\n const transition = absPath < FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\n const duration = forceDuration || (\n FAST_SMOOTH_MIN_DURATION\n + (absPath / FAST_SMOOTH_MAX_DISTANCE) * (FAST_SMOOTH_MAX_DURATION - FAST_SMOOTH_MIN_DURATION)\n );\n const startAt = Date.now();\n const onHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n const currentPath = path * (1 - transition(t));\n\n container.scrollTop = Math.round(target - currentPath);\n\n isAnimating = t < 1;\n\n if (!isAnimating) {\n onHeavyAnimationStop();\n }\n\n return isAnimating;\n });\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MIN } from '../config';\nimport { animate } from './animation';\n\nconst DEFAULT_DURATION = 300;\n\nexport default function fastSmoothScrollHorizontal(container: HTMLElement, left: number, duration = DEFAULT_DURATION) {\n if (getGlobal().settings.byKey.animationLevel === ANIMATION_LEVEL_MIN) {\n duration = 0;\n }\n\n scrollWithJs(container, left, duration);\n}\n\nfunction scrollWithJs(container: HTMLElement, left: number, duration: number) {\n const isRtl = container.getAttribute('dir') === 'rtl';\n const { scrollLeft, offsetWidth: containerWidth, scrollWidth } = container;\n let path = left - scrollLeft;\n\n if (path < 0) {\n const remainingPath = -scrollLeft * (isRtl ? -1 : 1);\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollWidth - (scrollLeft + containerWidth);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n return;\n }\n\n const target = scrollLeft + path;\n\n if (duration === 0) {\n container.scrollLeft = target;\n return;\n }\n\n const startAt = Date.now();\n\n animate(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollLeft = Math.round(target - currentPath);\n\n return t < 1;\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { IS_TOUCH_ENV } from './environment';\n\nexport default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n\n const selection = window.getSelection()!;\n const range = document.createRange();\n const lastChild = element.lastChild || element;\n\n if (!IS_TOUCH_ENV && (!lastChild || !lastChild.nodeValue)) {\n element.focus();\n return;\n }\n\n range.selectNodeContents(lastChild);\n // `false` means collapse to the end rather than the start\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","export default function getKeyFromEvent(e: KeyboardEvent) {\n const key = 'key' in e ? e.key : e.code;\n\n return key.startsWith('Key') ? key.slice(3).toLowerCase() : key;\n}\n","export type MediaSessionHandlers = {\n play?: () => void;\n pause?: () => void;\n stop?: () => void;\n\n previoustrack?: () => void;\n nexttrack?: () => void;\n\n togglemicrophone?: () => void;\n togglecamera?: () => void;\n hangup?: () => void;\n\n seekbackward?: (details: MediaSessionActionDetails) => void;\n seekforward?: (details: MediaSessionActionDetails) => void;\n seekTo?: ((details: MediaSessionActionDetails) => void);\n};\n\ninterface MediaMetadataParameters {\n title?: string;\n artist?: string;\n album?: string;\n artwork?: MediaImage[];\n}\n\nconst DEFAULT_HANDLERS = {\n play: undefined,\n pause: undefined,\n seekbackward: undefined,\n seekforward: undefined,\n previoustrack: undefined,\n nexttrack: undefined,\n stop: undefined,\n seekTo: undefined,\n};\n\nexport function registerMediaSession(metadata?: MediaMetadata, handlers?: MediaSessionHandlers) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n if (metadata) updateMetadata(metadata);\n if (handlers) setMediaSessionHandlers(handlers);\n } else {\n // eslint-disable-next-line no-console\n console.warn('MediaSession API not supported in this browser');\n }\n}\n\nexport function updateMetadata(metadata?: MediaMetadata) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n // eslint-disable-next-line no-null/no-null\n mediaSession.metadata = metadata ?? null;\n }\n}\n\nexport function setMediaSessionHandlers(handlers: MediaSessionHandlers) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n Object.entries({ ...DEFAULT_HANDLERS, ...handlers }).forEach(([key, handler]) => {\n try {\n // @ts-ignore API not standardized yet\n mediaSession.setActionHandler(key, handler);\n } catch (err) {\n // Handler not supported, ignoring\n }\n });\n }\n}\n\nexport function clearMediaSession() {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n // eslint-disable-next-line no-null/no-null\n mediaSession.metadata = null;\n setMediaSessionHandlers(DEFAULT_HANDLERS);\n if (mediaSession.playbackState) mediaSession.playbackState = 'none';\n mediaSession.setPositionState?.();\n }\n}\n\nexport function setPlaybackState(state: 'none' | 'paused' | 'playing' = 'none') {\n const { mediaSession } = window.navigator;\n if (mediaSession && mediaSession.playbackState) {\n mediaSession.playbackState = state;\n }\n}\n\nexport function setPositionState(state?: MediaPositionState) {\n if (!state || state.position === undefined || state.duration === undefined) return;\n state.position = Math.min(state.position, state.duration);\n\n const { mediaSession } = window.navigator;\n mediaSession?.setPositionState?.(state);\n}\n\nexport function setMicrophoneActive(active: boolean) {\n const { mediaSession } = window.navigator;\n // @ts-ignore typings not updated yet\n mediaSession?.setMicrophoneActive?.(active);\n}\n\nexport function setCameraActive(active: boolean) {\n const { mediaSession } = window.navigator;\n // @ts-ignore typings not updated yet\n mediaSession?.setCameraActive?.(active);\n}\n\nexport function buildMediaMetadata({\n title, artist, album, artwork,\n}: MediaMetadataParameters) {\n if ('MediaMetadata' in window) {\n return new window.MediaMetadata({\n title,\n artist,\n album,\n artwork,\n });\n }\n return undefined;\n}\n","import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../api/types';\nimport { IS_EMOJI_SUPPORTED } from './environment';\n\nconst ENTITY_CLASS_BY_NODE_NAME: Record = {\n B: ApiMessageEntityTypes.Bold,\n STRONG: ApiMessageEntityTypes.Bold,\n I: ApiMessageEntityTypes.Italic,\n EM: ApiMessageEntityTypes.Italic,\n U: ApiMessageEntityTypes.Underline,\n S: ApiMessageEntityTypes.Strike,\n STRIKE: ApiMessageEntityTypes.Strike,\n DEL: ApiMessageEntityTypes.Strike,\n CODE: ApiMessageEntityTypes.Code,\n PRE: ApiMessageEntityTypes.Pre,\n BLOCKQUOTE: ApiMessageEntityTypes.Blockquote,\n};\n\nconst MAX_TAG_DEEPNESS = 3;\n\nexport default function parseMessageInput(html: string): ApiFormattedText {\n const fragment = document.createElement('div');\n fragment.innerHTML = parseMarkdown(html);\n const text = fragment.innerText.trim().replace(/\\u200b+/g, '');\n let textIndex = 0;\n let recursionDeepness = 0;\n const entities: ApiMessageEntity[] = [];\n\n function addEntity(node: ChildNode) {\n const { index, entity } = getEntityDataFromNode(node, text, textIndex);\n\n if (entity) {\n textIndex = index;\n entities.push(entity);\n } else if (node.textContent) {\n textIndex += node.textContent.length;\n }\n\n if (node.hasChildNodes() && recursionDeepness <= MAX_TAG_DEEPNESS) {\n recursionDeepness += 1;\n Array.from(node.childNodes).forEach(addEntity);\n }\n }\n\n Array.from(fragment.childNodes).forEach((node) => {\n recursionDeepness = 1;\n addEntity(node);\n });\n\n return {\n text,\n entities: entities.length ? entities : undefined,\n };\n}\n\nfunction parseMarkdown(html: string) {\n let parsedHtml = html.slice(0);\n\n if (!IS_EMOJI_SUPPORTED) {\n // Emojis\n parsedHtml = parsedHtml.replace(/]+alt=\"([^\"]+)\"[^>]*>/gm, '$1');\n }\n\n // Strip redundant tags\n parsedHtml = parsedHtml.replace(/<\\/?span([^>]*)?>/g, '');\n\n // Strip redundant nbsp's\n parsedHtml = parsedHtml.replace(/ /g, ' ');\n\n // Replace

with newline (new line in Safari)\n parsedHtml = parsedHtml.replace(/
]*)?><\\/div>/g, '\\n');\n // Replace
with newline\n parsedHtml = parsedHtml.replace(/]*)?>/g, '\\n');\n\n // Strip redundant
tags\n parsedHtml = parsedHtml.replace(/<\\/div>(\\s*)
/g, '\\n');\n parsedHtml = parsedHtml.replace(/
/g, '\\n');\n parsedHtml = parsedHtml.replace(/<\\/div>/g, '');\n\n // Pre\n parsedHtml = parsedHtml.replace(/^`{3}(.*[\\n\\r][^]*?^)`{3}/gm, '
$1
');\n parsedHtml = parsedHtml.replace(/[`]{3}([^`]+)[`]{3}/g, '
$1
');\n\n // Code\n parsedHtml = parsedHtml.replace(/[`]{1}([^`\\n]+)[`]{1}/g, '$1');\n\n // Other simple markdown\n parsedHtml = parsedHtml.replace(\n /(^|\\s)(?!)(\\s|$)/g,\n '$1$2$3',\n );\n parsedHtml = parsedHtml.replace(\n /(^|\\s)(?!)(\\s|$)/g,\n '$1$2$3',\n );\n parsedHtml = parsedHtml.replace(\n /(^|\\s)(?!)(\\s|$)/g,\n '$1$2$3',\n );\n\n return parsedHtml;\n}\n\nfunction getEntityDataFromNode(\n node: ChildNode,\n rawText: string,\n textIndex: number,\n): { index: number; entity?: ApiMessageEntity } {\n const type = getEntityTypeFromNode(node);\n if (!type || !node.textContent) {\n return {\n index: textIndex,\n entity: undefined,\n };\n }\n\n const rawIndex = rawText.indexOf(node.textContent, textIndex);\n // In some cases, last text entity ends with a newline (which gets trimmed from `rawText`).\n // In this case, `rawIndex` would return `-1`, so we use `textIndex` instead.\n const index = rawIndex >= 0 ? rawIndex : textIndex;\n const offset = rawText.substring(0, index).length;\n const { length } = rawText.substring(index, index + node.textContent.length);\n\n let url: string | undefined;\n let userId: string | undefined;\n if (type === ApiMessageEntityTypes.TextUrl) {\n url = (node as HTMLAnchorElement).href;\n }\n if (type === ApiMessageEntityTypes.MentionName) {\n userId = (node as HTMLAnchorElement).dataset.userId;\n }\n\n return {\n index,\n entity: {\n type,\n offset,\n length,\n ...(url && { url }),\n ...(userId && { userId }),\n },\n };\n}\n\nfunction getEntityTypeFromNode(node: ChildNode) {\n if (ENTITY_CLASS_BY_NODE_NAME[node.nodeName]) {\n return ENTITY_CLASS_BY_NODE_NAME[node.nodeName];\n }\n\n if (node.nodeName === 'A') {\n const anchor = node as HTMLAnchorElement;\n if (anchor.dataset.entityType === ApiMessageEntityTypes.MentionName) {\n return ApiMessageEntityTypes.MentionName;\n }\n if (anchor.dataset.entityType === ApiMessageEntityTypes.Url) {\n return ApiMessageEntityTypes.Url;\n }\n if (anchor.href.startsWith('mailto:')) {\n return ApiMessageEntityTypes.Email;\n }\n if (anchor.href.startsWith('tel:')) {\n return ApiMessageEntityTypes.Phone;\n }\n if (anchor.href !== anchor.textContent) {\n return ApiMessageEntityTypes.TextUrl;\n }\n\n return ApiMessageEntityTypes.Url;\n }\n\n if (node.nodeName === 'SPAN') {\n return (node as HTMLElement).dataset.entityType;\n }\n\n return undefined;\n}\n","/*\n * Thanks to Ace Monkey for this mind-blowing patch.\n */\n\nexport function patchSafariProgressiveAudio(audioEl: HTMLAudioElement) {\n if (audioEl.dataset.patchedForSafari) {\n return;\n }\n\n audioEl.addEventListener('play', () => {\n const t = audioEl.currentTime;\n\n audioEl.dataset.patchForSafariInProgress = 'true';\n function onProgress() {\n if (!audioEl.buffered.length) {\n return;\n }\n audioEl.currentTime = audioEl.duration - 1;\n audioEl.addEventListener('progress', () => {\n delete audioEl.dataset.patchForSafariInProgress;\n audioEl.currentTime = t;\n if (audioEl.paused && !audioEl.dataset.preventPlayAfterPatch) {\n audioEl.play();\n }\n }, { once: true });\n\n audioEl.removeEventListener('progress', onProgress);\n }\n\n audioEl.addEventListener('progress', onProgress);\n }, { once: true });\n\n audioEl.dataset.patchedForSafari = 'true';\n}\n\nexport function isSafariPatchInProgress(audioEl: HTMLAudioElement) {\n return Boolean(audioEl.dataset.patchForSafariInProgress);\n}\n","import React from '../lib/teact/teact';\n\nexport default (e: React.UIEvent | Event) => {\n e.stopPropagation();\n e.preventDefault();\n};\n"],"names":["memo","sticker","effect","isOwn","soundId","size","observeIntersection","lastSyncTime","forceLoadPreview","messageId","chatId","activeEmojiInteraction","markAnimationLoaded","isAnimationLoaded","ref","width","style","handleClick","playKey","useAnimatedEmoji","undefined","emoji","localMediaHash","id","isIntersecting","useIsIntersecting","thumbDataUri","thumbnail","dataUri","previewBlobUrl","useMedia","ApiMediaFormat","transitionClassNames","useMediaTransition","mediaData","isMediaLoaded","Boolean","className","buildClassName","LIKE_STICKER_ID","onClick","src","alt","key","animationData","quality","play","noLoop","onLoad","MIN_SPIKES","IS_SINGLE_COLUMN_LAYOUT","MAX_SPIKES","renderSeekline","playProgress","bufferedProgress","seekerRef","theme","message","senderTitle","uploadProgress","origin","date","isSelectable","isSelected","isDownloading","onPlay","onReadMedia","onCancelUpload","onDateClick","content","audio","voice","video","isMediaUnread","isVoice","isSeeking","useRef","playStateBeforeSeeking","lang","useLang","isRtl","dispatch","getDispatch","isActivated","setIsActivated","useState","shouldLoad","coverHash","getMessageMediaHash","coverBlobUrl","getMessageMediaFormat","loadProgress","downloadProgress","useMediaWithLoadProgress","handleForcePlay","useCallback","handleTrackChange","isBuffered","bufferingHandlers","checkBuffering","useBuffering","isPlaying","playPause","pause","setCurrentTime","duration","useAudioPlayer","makeTrackId","getMediaDuration","isMessageLocal","isOwnMessage","waveformCanvasRef","canvasRef","data","spikes","peak","useMemo","waveform","Array","Math","min","fill","durationFactor","spikesCount","round","fitCount","newData","springFactor","length","leftFiller","rightFiller","i","idx","floor","val","interpolateArray","encoded5bit","bitsCount","valuesCount","result","bitsData","l","byteIndex","bitShift","value","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","useLayoutEffect","canvas","current","progress","fillStyle","progressFillStyle","height","ctx","getContext","scale","forEach","item","globalAlpha","spikeHeight","max","x","y","radius","beginPath","moveTo","arcTo","closePath","roundedRectangle","renderWaveform","useWaveformCanvas","withSeekline","useEffect","isLoadingForPlaying","isUploading","isTransferring","transferProgress","getMediaTransferState","shouldRender","shouldRenderSpinner","spinnerClassNames","useShowTransition","shouldRenderCross","handleButtonClick","setAudioPlayerOrigin","handleDownloadClick","cancelMessageMediaDownload","downloadMessageMedia","handleSeek","e","left","getBoundingClientRect","clientX","MouseEvent","targetTouches","stopPropagation","handleStartSeek","button","handleStopSeek","handleDateClick","renderFirstLine","title","fileName","captureEvents","onCapture","onRelease","onDrag","fullClassName","AudioOrigin","buttonClassNames","push","contentClassName","renderWithTitle","dir","renderText","Link","formatPastTimeShort","formatMediaDuration","performer","renderSecondLine","Button","ripple","color","join","ariaLabel","backgroundImage","ProgressSpinner","transparent","noCross","showProgress","showSeekline","getTranslation","getFileSizeString","formatMediaDateTime","renderAudio","draggable","renderVoice","props","isOpen","CalendarModal","useModuleLoader","Bundles","withGlobal","global","chatOrUserId","countryList","phoneCodes","phoneCodeList","chat","selectChat","user","isUserId","selectUser","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","canInviteUsers","isChatChannel","isUserRightBanned","getHasAdminRight","forceShowSelf","loadFullUser","showNotification","updateChatMutedState","userId","fullInfo","username","phoneNumber","isSelf","handleNotificationChange","isRestricted","copy","text","entity","copyTextToClipboard","formattedNumber","formatPhoneNumberWithCode","link","getChatLink","description","bio","getChatDescription","icon","multiline","narrow","isStatic","label","checked","inactive","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","getPrivateChatUserId","isBot","isUserBot","isSupport","canDeleteForAll","contactName","getUserFirstOrLastName","isChannel","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","currentUserId","onClose","onCloseAnimationEnd","leaveChannel","deleteHistory","deleteChannel","deleteChatUser","blockContact","chatTitle","getChatTitle","handleDeleteMessageForAll","shouldDeleteForAll","handleDeleteAndStop","contactId","accessHash","handleDeleteChat","isCreator","header","isSavedMessages","isText","smaller","canAutoLoad","autoLoadFileMaxSizeMb","withDate","datetime","sender","onMediaClick","document","timestamp","extension","getDocumentExtension","wasIntersected","markIntersected","useFlag","isLoadAllowed","setIsLoadAllowed","shouldDownload","documentHash","isLoaded","hasPreview","getDocumentHasPreview","getMessageMediaThumbDataUri","localBlobUrl","previewData","withMediaViewer","mediaType","name","thumbnailDataUri","actionIcon","isMessageDocumentVideo","elementRef","shouldSpinnerRender","getColorFromExtension","sizeString","getDocumentThumbnailDimensions","onlineCount","selectChatOnlineCount","areMessagesLoaded","selectChatMessages","typingStatus","avatarSize","withUsername","withFullInfo","withUpdatingStatus","withChatType","noRtl","loadFullChat","openMediaViewer","isMin","handleAvatarViewerOpen","hasPhoto","avatarOwnerId","MediaViewerOrigin","isVerified","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","outgoingStatus","status","idPrefix","isProtected","mediaBlobUrl","getMessageVideo","onContextMenu","stopEvent","isGif","Keys","activeKey","itemIds","selectedIds","filterValue","filterPlaceholder","notFoundText","searchInputId","isLoading","noScrollRestore","onSelectedIdsChange","onFilterChange","onLoadMore","inputRef","shouldMinimize","setTimeout","requestAnimationFrame","focus","handleItemClick","newSelectedIds","includes","splice","indexOf","handleFilterChange","currentTarget","viewportIds","getMore","useInfiniteScroll","map","isMinimized","canClose","clickArg","onChange","placeholder","items","iconElement","titleText","serverTimeOffset","userStatus","selectUserStatus","noStatusOrTyping","fullName","getUserFullName","isUserOnline","getUserStatus","photo","isFirstPhoto","isDeleted","isDeletedUser","isRepliesChat","isChatWithRepliesBot","getMediaHash","forceAvatar","hash","getChatAvatarHash","photoBlobUrl","avatarMediaHash","avatarBlobUrl","useBlurSync","imageSrc","prevImageSrc","usePrevious","decoding","userFullName","getFirstLetters","Spinner","getUserColorKey","connectionState","animationLevel","settings","byKey","photos","slideAnimation","currentPhotoIndex","setCurrentPhotoIndex","isFirst","isLast","profile","currentIndex","slice","mediaLoader","usePhotosPreload","handleProfilePhotoClick","profilePhotoIndex","selectPreviousMedia","selectNextMedia","element","querySelector","selectorToPreventScroll","onSwipe","IS_TOUCH_ENV","direction","SwipeDirection","renderPhoto","isVerifiedIconShown","_","renderPhotoTabs","Transition","type","VerifiedIcon","reaction","staticIconId","getGlobal","availableReactions","find","staticIcon","noAnimate","onUnfaveClick","stickerSelector","shouldPlay","lottieData","isAnimated","markLoaded","unmarkLoaded","canAnimatedPlay","previewTransitionClassNames","onMouseDown","preventMessageInputBlurWithBubbling","isLowPriority","preventDefault","StickerSetModal","typingUser","typingUserName","action","replace","trim","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","url","domain","messageText","getMessageSummaryText","siteName","handleMessageClick","displayUrl","truncatedDescription","trimText","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS_PX","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidthOwn","cachedMaxWidth","cachedMaxWidthNoAvatar","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","noAvatars","extraPaddingRem","regularMaxWidth","windowWidth","windowSize","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","aspectRatio","availableWidth","availableHeight","getAvailableHeight","mediaWidth","calculateDimensions","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","window","matchMedia","windowHeight","occupiedHeightRem","matches","calculateInlineImageDimensions","getPhotoInlineDimensions","calculateVideoDimensions","getVideoDimensions","getPictogramDimensions","getStickerDimensions","baseWidth","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_INLINE_DESKTOP_FACTOR","calculatedHeight","calculateMediaViewerDimensions","mediaHeight","calculatedWidth","renderMessageText","highlight","shouldRenderHqEmoji","formattedText","rawText","getMessageText","entities","renderTextWithEntities","organizeEntity","index","organizedEntityIndexes","offset","organizedIndexes","Set","has","nestedEntities","filter","parsedEntity","isChanged","organizedIndex","add","organizeEntities","organizedEntities","organizedEntity","shouldRenderAsHtml","renderMessagePart","deleteLineBreakAfterPre","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","substring","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","ApiMessageEntityTypes","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","getLinkUrl","processEntityAsHtml","entityText","handleBotCommandClick","handleHashtagClick","href","target","rel","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","innerText","setLocalTextSearchQuery","query","searchTextMessagesLocal","WIDTH","large","medium","small","localEffect","interactWithAnimatedEmoji","sendEmojiInteraction","sendWatchingEmojiInteraction","hasEffect","audioRef","soundMediaData","setPlayKey","String","random","interactions","startedInteractions","sendInteractionBunch","remove","Audio","safePlay","addEventListener","once","container","startSize","isReversed","performance","now","selectedMessageId","endX","endY","emoticon","selectLocalAnimatedEmojiEffectByName","ChatFolderModal","ChatAnimationTypes","isPinned","isShown","unreadCount","hasUnreadMark","renderContent","unreadMentionsCount","formatIntegerCompact","ShowTransition","isCustom","isActive","lastMessage","senderId","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserIds","actionTargetUserIds","targetChatId","actionTargetChatId","privateChatUserId","byId","usersById","users","currentChatId","threadId","currentThreadId","messageListType","selectCurrentMessageList","MAIN_THREAD_ID","draft","selectDraft","canScrollDown","canChangeFolder","chatFolders","orderedIds","lastMessageOutgoingStatus","selectOutgoingStatus","folderId","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isChatFolderModalOpen","openChatFolderModal","closeChatFolderModal","shouldRenderDeleteModal","markRenderDeleteModal","unmarkRenderDeleteModal","shouldRenderChatFolderModal","markRenderChatFolderModal","unmarkRenderChatFolderModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","isRoundVideo","getMessageRoundVideo","actionTargetUsers","Opacity","opacity","fastRaf","classList","Move","transform","ANIMATION_END_DELAY","shouldReplaceHistory","contextActions","useChatContextActions","handleDelete","handleChatFolderChange","ListItem","Avatar","isCallActive","isCallNotEmpty","LastMessageMeta","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chatFolder","selectChatFolder","animatedEmoji","selectAnimatedEmoji","foldersDispatch","onScreenSelect","handleEditFolder","payload","SettingsScreens","AnimatedEmoji","fluid","pill","FolderTypeToListType","chats","listIds","chatsById","orderedPinnedIds","listType","allListIds","notifySettings","notifyExceptions","loadMoreChats","preloadTopChatMessages","preloadArchivedChats","openNextChat","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","chatArrays","newChatArrays","prepareChatList","singleList","concat","pinnedChats","otherChats","newOrderedIds","reduce","acc","prevOrderById","orderDiffById","mapValues","order","loadMoreOfType","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","viewportChatArrays","reduceChatList","handleKeyDown","removeEventListener","IS_PWA","IS_MAC_OS","metaKey","ctrlKey","code","startsWith","digit","match","position","Number","altKey","targetIndexDelta","getAnimationType","orderDiffs","Object","values","numberOfUp","diff","numberOfDown","None","Infinity","useChatAnimationType","InfiniteScroll","preloadBackwards","noFastList","viewportOffset","pinnedOffset","IS_ANDROID","CHAT_HEIGHT_PX","teactFastList","teactOrderKey","getChatOrder","renderChats","Loading","getSenderName","getSenderTitle","isChatGroup","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","DropAreaState","withQuick","onHide","hideTimeoutRef","prevWithQuick","captureEscKeyListener","handleFilesDrop","dataTransfer","dt","files","from","handleQuickFilesDrop","handleDragLeave","fromTarget","onDragOver","clearTimeout","EmojiTooltip","MAX_INPUT_HEIGHT","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","isAttachmentModalInput","editableInputId","html","forcedPlaceholder","canAutoFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","onSend","editLastMessage","replyToNextMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","selectedRange","setSelectedRange","sendMessageAction","useSendMessageAction","updateInputHeight","useLayoutEffectWithPrevDeps","prevHtml","innerHTML","focusInput","isHeavyAnimating","focusEditableElement","handleCloseTextFormatter","selection","getSelection","removeAllRanges","empty","clearSelection","checkSelection","IS_IOS","rangeCount","selectionRange","getRangeAt","selectedText","toString","isSelectionInsideInput","EDITABLE_INPUT_ID","parseEmojiOnlyString","START_TO_END","processSelection","selectionRect","inputRect","top","willSend","input","clone","currentHeight","newHeight","scrollHeight","transitionDuration","log","abs","exec","toggle","captureFirstTab","debounce","captureKeyboardListeners","onTab","suppressFocus","blur","contentEditable","textContent","IS_EMOJI_SUPPORTED","onKeyDown","shiftKey","handleKeyUp","event","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","anchorPosition","TEXT_FORMAT_BY_TAG_NAME","B","STRONG","I","EM","U","DEL","CODE","fragmentEl","createElement","containerRef","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","useVirtualBackdrop","selectedFormats","parentElement","commonAncestorContainer","textFormat","tagName","updateSelectedRange","getSelectedText","getSelectedElement","updateInputStyles","offsetWidth","scrollWidth","scrollLeft","getFormatButtonClassName","keys","some","fKey","monospace","strikethrough","handleBoldText","execCommand","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","encodeURI","ensureProtocol","addRange","restoreSelection","handler","k","b","u","m","s","getKeyFromEvent","linkUrlConfirmClassName","autoComplete","inputMode","onScroll","RE_BR","RE_SPACE","RE_CLEAN_HTML","RE_EXTRA_NEW_LINE","prepareForRegExp","inputId","parentNode","iterations","cache","WeakMap","memoized","fn","args","cached","get","areSortedArraysEqual","lastArgs","lastResult","set","emojiDataPromise","emojiRawData","emojiData","RE_EMOJI_SEARCH","prepareRecentEmojisMemo","recentEmojiIds","limit","pickTruthy","MEMO_EMPTY_ARRAY","prepareLibraryMemo","baseEmojiKeywords","emojiKeywords","emojis","byNative","buildCollectionByKey","baseEmojisByKeyword","natives","emojisByKeyword","byKeyword","keywords","byName","names","searchInLibraryMemo","library","matched","matchedKeywords","keyword","sort","flatten","matchedNames","unique","RegExp","useEmojiTooltip","isAllowed","onUpdateHtml","isDisabled","markIsOpen","unmarkIsOpen","setById","shouldForceInsertEmoji","setShouldForceInsertEmoji","filteredEmojis","setFilteredEmojis","async","default","uncompressEmoji","ensureEmojiData","then","getEmojiCode","forceSend","endsWith","insertEmoji","textEmoji","isForce","atIndex","lastIndexOf","messageInput","getElementById","native","isEmojiTooltipOpen","closeEmojiTooltip","runThrottled","throttle","cb","RE_USERNAME_SEARCH","useMentionTooltip","canSuggestMembers","groupChatMembers","topInlineBotIds","usersToMention","setUsersToMention","updateFilteredUsers","withInlineBots","memberIds","member","filteredIds","filterUsersByName","usernameFilter","getUsernameFilter","canSuggestInlineBots","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","closeMentionTooltip","mentionFilteredUsers","useAsyncRendering","dependencies","delay","shouldRenderRef","timeoutRef","forceUpdate","useForceUpdate","useOnChange","options","selected","disabled","loadingOptions","setValues","handleChange","newValues","v","option","subLabel","children","buttonClassName","tabIndex","buttonRef","secondaryIcon","destructive","onSecondaryIconClick","isTouched","markIsTouched","unmarkIsTouched","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","getRootElement","closest","getMenuElement","positionX","positionY","menuStyle","useContextMenuPosition","handleMouseDown","role","autoClose","containerId","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","RADIUSES","xl","square","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","svg","firstElementChild","strokeDashOffset","setAttribute","hidden","loadingOption","step","renderValue","trackWidth","parentContainerClassName","focused","autoFocusSearch","onReset","onFocus","onBlur","isInputFocused","markInputFocused","unmarkInputFocused","useInputFocusOnOpen","prevIsOpen","prevChildren","fromChildrenRef","noAnimation","onCheck","classNames","badgeCount","isBadgeActive","previousActiveTab","tabRef","tabEl","prevTabEl","platformEl","prevPlatformEl","shiftLeft","offsetLeft","scaleFactor","clientWidth","forceReflow","SCROLL_DURATION","tabs","activeTab","big","onSwitchTab","useHorizontalScroll","activeTabElement","childNodes","activeTabOffsetLeft","activeTabOffsetWidth","newLeft","fastSmoothScrollHorizontal","tab","CLEANED_UP","Symbol","renderCount","shouldRestoreHeight","shouldCleanup","cleanupExceptionKey","onStart","onStop","currentKeyRef","rendersRef","prevActiveKey","activeKeyChanged","cleanup","childElements","transition","isBackwards","prevActiveIndex","activeIndex","toSlide","fromSlide","ANIMATION_LEVEL_MIN","dispatchHeavyAnimationStop","dispatchHeavyAnimationEvent","waitForTransitionEnd","clientHeight","performSlideOptimized","node","HTMLElement","onAnimationEnd","activeElement","watchedNode","firstChild","waitForAnimationEnd","flexBasis","renders","contents","render","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","state","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","pick","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","omit","error","useReducer","trackId","originalDuration","trackType","handlers","metadata","onInit","onForcePlay","onTrackChange","noPlaylist","noProgressUpdates","controllerRef","setIsPlaying","isPlayingSync","setPlayProgress","register","eventName","setVolume","setPlaybackRate","toggleMuted","proxy","registerMediaSession","mediaHandlers","requestNextTrack","requestPreviousTrack","stop","closeAudioPlayer","seekbackward","skipTime","seekOffset","currentTime","seekforward","seekTo","seekTime","nexttrack","previoustrack","makeMediaHandlers","setPlaybackState","audioPlayer","volume","playbackRate","setPositionState","isFinite","paused","updateMetadata","destroy","isSafariPatchInProgress","useEffectWithPrevDeps","prevShouldPlay","prevSrc","playIfPresent","setTime","time","audioProxy","Map","blurredRef","img","Image","imgToCanvas","fastBlur","toDataURL","blurredAsync","onload","blurredDataUri","clear","useBlur","noInitiallyBuffered","setIsBuffered","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","buffered","end","readyState","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","useCanvasBlur","withRaf","processBlur","alpha","IS_CANVAS_FILTER_SUPPORTED","drawImage","RADIUS","isInSearch","toggleChatPinned","toggleChatArchived","toggleChatUnread","actionAddToFolder","actionPin","compact","actionUnreadMark","actionMute","actionArchive","isChatArchived","actionDelete","getCanDeleteChat","isInFolder","stopImmediatePropagation","isMenuDisabled","shouldDisableOnLink","shouldDisableOnLongTap","setIsContextMenuOpen","setContextMenuPosition","clientY","body","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","touches","cancelClickOnce","emulateContextMenuEvent","passive","anchor","extraPaddingX","extraTopPadding","marginSides","extraMarginTop","setPositionX","setPositionY","withScroll","setWithScroll","setStyle","setMenuStyle","triggerEl","emptyRect","menuEl","rootEl","triggerRect","marginTop","menuRect","offsetHeight","rootRect","horizontalPostition","menuMaxHeight","useDebounce","ms","noFirst","noLast","replyOriginForId","loadMessage","loadMessageThrottled","throttled","handleScroll","deltaX","deltaY","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","rootCallback","rootCallbackRef","freezeFlagsRef","onUnfreezeRef","freeze","unfreeze","useHeavyAnimationCheck","observer","disconnect","callbacks","observe","targetCallback","entriesAccumulator","observerCallbackSync","entries","entry","callback","scheduler","observerCallback","IntersectionObserver","root","rootMargin","initController","controller","delete","unobserve","useOnIntersect","targetRef","setIsIntersecting","savedCallback","setInterval","clearInterval","debugKey","prevDeps","isMediaReady","store","mediaHash","noLoad","mediaFormat","cacheBuster","isHtmlAllowed","isStreaming","IS_PROGRESSIVE_SUPPORTED","idRef","generateIdFor","useUniqueId","setLoadProgress","startedAtRef","handleProgress","Date","spentTime","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","markMouseInside","usePrevDuringAnimation","prev","isCurrentPresent","isPrevPresent","reducer","initialState","reducerRef","setState","currentState","SEND_MESSAGE_ACTION_INTERVAL","useVideoCleanup","videoRef","videoEl","load","mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","isNaN","imageData","getImageData","pixels","rsum","gsum","bsum","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","mul_sum","shg_sum","vmin","vmax","putImageData","tracks","currentTrackId","voiceQueue","musicQueue","playNext","isReverseOrder","currentTrack","nextTrackId","findNextInQueue","openAudioPlayer","parseMessageKey","splitTrackId","messageKey","nextTrack","stopCurrentAudio","track","handleEvent","Proxy","createAudio","trackIdComparator","addTrackToQueue","dataset","preventPlayAfterPatch","preload","IS_SAFARI","patchSafariProgressiveAudio","globalSearch","currentContent","GlobalSearchContent","openedChatId","queueFilter","cleanUpQueue","fastSeek","muted","rate","shouldRemoveFromQueue","h","trackIdFilter","el","removeFromQueue","currentId","queue","getTrackQueue","chatAudio","getMessageKey","split","pop","one","two","dateOne","keyOne","dateTwo","keyTwo","localeCompare","getDistance","a","sqrt","pageX","pageY","getTouchCenter","lastClickTime","captureEvent","initialSwipeAxis","hasMoved","hasSwiped","initialDistance","initialTouchCenter","innerWidth","innerHeight","excludedClosestSelector","onMove","onDoubleClick","centerX","centerY","withCursor","querySelectorAll","scrollable","overflow","onZoom","endDistance","touchCenter","dragOffsetX","dragOffsetY","zoomFactor","initialCenterX","initialCenterY","currentCenterX","currentCenterY","shouldPreventScroll","xAbs","yAbs","axis","currentSwipeAxis","Left","Right","Up","Down","processSwipe","isNotPassive","propertyName","waitForEndEvent","animationName","eventType","detailedName","isHandled","handleAnimationEnd","TransitionEvent","AnimationEvent","cycleRestrict","isAnimating","fastSmoothScroll","maxDistance","FAST_SMOOTH_MAX_DISTANCE","forceDirection","forceDuration","forceNormalContainerHeight","scrollFrom","offsetTop","elementTop","scrollTop","FocusDirection","calculateScrollFrom","scrollWithJs","isAnimatingScroll","elementHeight","currentScrollTop","containerHeight","targetContainerHeight","normalHeight","path","remainingPath","absPath","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","shortTransition","longTransition","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","startAt","onHeavyAnimationStop","animateSingle","t","currentPath","getAttribute","containerWidth","animate","force","range","createRange","lastChild","nodeValue","selectNodeContents","collapse","toLowerCase","DEFAULT_HANDLERS","mediaSession","navigator","setMediaSessionHandlers","console","warn","setActionHandler","err","clearMediaSession","playbackState","buildMediaMetadata","artist","album","artwork","MediaMetadata","ENTITY_CLASS_BY_NODE_NAME","S","STRIKE","PRE","BLOCKQUOTE","parseMessageInput","fragment","parsedHtml","parseMarkdown","textIndex","recursionDeepness","addEntity","nodeName","entityType","getEntityTypeFromNode","rawIndex","getEntityDataFromNode","hasChildNodes","audioEl","patchedForSafari","patchForSafariInProgress"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/133.672f7d0ddf0d82cbe667.js b/dist/133.672f7d0ddf0d82cbe667.js deleted file mode 100644 index ad9c29cbb..000000000 --- a/dist/133.672f7d0ddf0d82cbe667.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[133],{1133:(e,t,n)=>{n.r(t),n.d(t,{AuthCode:()=>f,AuthPassword:()=>P,AuthRegister:()=>w});var a=n(4050),o=n(5116),r=n(7361),s=n(782),i=n(2340),c=n(6590),l=n(9107),d=n(7687),u=n(4288),m=n(3716),p=n(7324),g=n(7799);const h=r.wB?m.qp:m.z7,Z=(0,a.X$)((({code:e,codeLength:t,trackingDirection:n,isTracking:o,isBig:r})=>{const[s,i]=(0,a.eJ)(),[c,l]=(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)((()=>{c||(0,p.Z)("MonkeyTracking").then(l)}),[c]);const f=(0,a.I4)((()=>u(!0)),[]);return a.ZP.createElement("div",{id:"monkey",className:r?"big":""},!d&&a.ZP.createElement("div",{className:"monkey-preview"}),s&&a.ZP.createElement(g.Z,{id:"idleMonkey",size:r?m.K2:h,className:o?"hidden":void 0,animationData:s,play:!o,onLoad:f}),c&&a.ZP.createElement(g.Z,{id:"trackingMonkey",size:r?m.K2:h,className:o?"shown":"hidden",animationData:c,playSegment:o?function(){const a=e&&e.length>1||n<0?15+Z*(e.length-1):0,o=e.length===t?180:15+Z*e.length;return n<1?[o,a]:[a,o]}():void 0,speed:2,noLoop:!0}))})),f=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"])))((({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:s})=>{const{setAuthCode:m,returnToAuthPhoneNumber:p,clearAuthError:g}=(0,o.uC)(),h=(0,l.Z)(),f=(0,a.sO)(null),[b,v]=(0,a.eJ)(""),[P,E]=(0,a.eJ)(!1),[y,w]=(0,a.eJ)(1);(0,a.d4)((()=>{r.$b||f.current.focus()}),[]),(0,c.ZP)(!0,p);const k=(0,a.I4)((e=>{s&&g();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==b&&(v(t.value),P?t.value.length||E(!1):E(!0),b&&b.length>t.value.length?w(-1):w(1),5===t.value.length&&m({code:t.value}))}),[s,g,b,P,m]);return a.ZP.createElement("div",{id:"auth-code-form",className:"custom-scroll"},a.ZP.createElement("div",{className:"auth-form"},a.ZP.createElement(Z,{code:b,codeLength:5,isTracking:P,trackingDirection:y}),a.ZP.createElement("h2",null,e,a.ZP.createElement("div",{className:"auth-number-edit",onClick:p,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:f,id:"sign-in-code",label:h("Code"),onInput:k,value:b,error:s&&h(s),autoComplete:"one-time-code",inputMode:"numeric"}),n&&a.ZP.createElement(u.Z,null)))})));var b=n(3490),v=n(9364);const P=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authIsLoading","authError","authHint"])))((({authIsLoading:e,authError:t,authHint:n})=>{const{setAuthPassword:r,clearAuthError:s}=(0,o.uC)(),i=(0,l.Z)(),[c,d]=(0,a.eJ)(!1),u=(0,a.I4)((e=>{d(e)}),[]),m=(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(b.Z,{isPasswordVisible:c}),a.ZP.createElement("h2",null,i("Login.Header.Password")),a.ZP.createElement("p",{className:"note"},i("Login.EnterPasswordDescription")),a.ZP.createElement(v.Z,{clearError:s,error:t&&i(t),hint:n,isLoading:e,isPasswordVisible:c,onChangePasswordVisibility:u,onSubmit:m})))})));var E=n(231),y=n(710);const w=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authIsLoading","authError"])))((({authIsLoading:e,authError:t})=>{const{signUp:n,clearAuthError:r,uploadProfilePhoto:s}=(0,o.uC)(),i=(0,l.Z)(),[c,u]=(0,a.eJ)(!1),[m,p]=(0,a.eJ)(),[g,h]=(0,a.eJ)(""),[Z,f]=(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:g,lastName:Z}),m&&s({file:m})}},a.ZP.createElement(y.Z,{onChange:p}),a.ZP.createElement("h2",null,i("YourName")),a.ZP.createElement("p",{className:"note"},i("Login.Register.Desc")),a.ZP.createElement(d.Z,{id:"registration-first-name",label:i("Login.Register.FirstName.Placeholder"),onChange:function(e){t&&r();const{target:n}=e;h(n.value),u(n.value.length>0)},value:g,error:t&&i(t),autoComplete:"given-name"}),a.ZP.createElement(d.Z,{id:"registration-last-name",label:i("Login.Register.LastName.Placeholder"),onChange:function(e){const{target:t}=e;f(t.value)},value:Z,autoComplete:"family-name"}),c&&a.ZP.createElement(E.Z,{type:"submit",ripple:!0,isLoading:e},i("Next")))))})))},7799:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),o=n(9118),r=n(6752),s=n(8674),i=n(5332);let c,l;async function d(){return c||(c=n.e(941).then(n.bind(n,7941)),l=(await c).default),c}setTimeout(d,5e3);const u=(0,a.X$)((({className:e,id:t,animationData:n,play:c,playSegment:u,speed:m,noLoop:p,size:g,quality:h,isLowPriority:Z,onLoad:f,color:b,onEnded:v})=>{const[P,E]=(0,a.eJ)(),y=(0,a.sO)(null),w=(0,a.sO)(!1),k=(0,a.sO)(!1),N=(0,a.sO)(!0),C=(0,a.sO)();C.current=c;const L=(0,a.sO)();L.current=u,(0,a.d4)((()=>{if(P||!n)return;const e=()=>{if(!y.current)return;const e=new l(t,y.current,n,{noLoop:p,size:g,quality:h,isLowPriority:Z},f,b,v);m&&e.setSpeed(m),E(e)};l?e():d().then((()=>{(0,o.T2)((()=>{y.current&&e()}))}))}),[b,P,n,t,Z,p,f,h,g,m,v]),(0,a.d4)((()=>{P&&P.setColor(b)}),[b,P]),(0,a.d4)((()=>()=>{P&&P.destroy()}),[P]);const x=(0,a.I4)(((e=!1)=>{P&&(C.current||L.current)&&(L.current?P.playSegment(L.current):e?P.goToAndPlay(0):P.play())}),[P]),I=(0,a.I4)((()=>{P&&P.pause()}),[P]),A=(0,a.I4)((()=>{k.current=!0,P&&(w.current||(w.current=P.isPlaying()),I())}),[P,I]),M=(0,a.I4)((()=>{w.current&&x(),w.current=!1,k.current=!1}),[x]),S=(0,a.I4)((()=>{(0,o.T2)(M)}),[M]);(0,a.d4)((()=>{P&&(c||u?k.current?w.current=!0:x(p):k.current?w.current=!1:I())}),[P,c,u,p,x,I]),(0,a.d4)((()=>{P&&(N.current?N.current=!1:(P.changeData(n),x()))}),[x,P,n]),(0,s.ZP)(A,M),(0,i.Z)(A,S);const J=(0,r.Z)("AnimatedSticker",e),T=g?`width: ${g}px; height: ${g}px;`:void 0;return a.ZP.createElement("div",{ref:y,className:J,style:T})}))},9364:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),o=n(3716),r=n(7361),s=n(6752),i=n(9107),c=n(231);const l=r.wB?550:400,d=(0,a.X$)((({isLoading:e=!1,isPasswordVisible:t,error:n,hint:d,placeholder:u="Password",submitLabel:m="Next",clearError:p,onChangePasswordVisibility:g,onInputChange:h,onSubmit:Z})=>{const f=(0,a.sO)(null),b=(0,i.Z)(),[v,P]=(0,a.eJ)(""),[E,y]=(0,a.eJ)(!1);return(0,a.d4)((()=>{r.$b||setTimeout((()=>{f.current.focus()}),l)}),[]),(0,a.d4)((()=>{n&&requestAnimationFrame((()=>{f.current.focus(),f.current.select()}))}),[n]),a.ZP.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||E&&Z(v)},autoComplete:"off"},a.ZP.createElement("div",{className:(0,s.Z)("input-group password-input",v&&"touched",n&&"error"),dir:b.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;P(t.value),y(t.value.length>=o.lo),h&&h(t.value)},dir:"auto"}),a.ZP.createElement("label",null,n||d||u),a.ZP.createElement("div",{className:"toggle-password",onClick:function(){g(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},a.ZP.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),E&&a.ZP.createElement(c.Z,{type:"submit",ripple:!0,isLoading:e},m))}))},3490:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),o=n(3716),r=n(7361),s=n(7324),i=n(7799);const c=[0,50],l=[0,20],d=[20,0],u=r.wB?o.qp:o.z7,m=(0,a.X$)((({isPasswordVisible:e,isBig:t})=>{const[n,r]=(0,a.eJ)(),[m,p]=(0,a.eJ)(),[g,h]=(0,a.eJ)(!1),[Z,f]=(0,a.eJ)(!1);(0,a.d4)((()=>{n?setTimeout((()=>f(!0)),2e3):(0,s.Z)("MonkeyClose").then(r)}),[n]),(0,a.d4)((()=>{m||(0,s.Z)("MonkeyPeek").then(p)}),[m]);const b=(0,a.I4)((()=>h(!0)),[]);return a.ZP.createElement("div",{id:"monkey",className:t?"big":""},!g&&a.ZP.createElement("div",{className:"monkey-preview"}),n&&a.ZP.createElement(i.Z,{id:"closeMonkey",size:t?o.K2:u,className:Z?"hidden":"shown",animationData:n,playSegment:c,noLoop:!0,onLoad:b}),m&&a.ZP.createElement(i.Z,{id:"peekMonkey",size:t?o.K2:u,className:Z?"shown":"hidden",animationData:m,playSegment:e?l:d,noLoop:!0}))}))},7324:(e,t,n)=>{n.d(t,{x:()=>r,Z:()=>s});var a=n(6137),o=n(647);const r={MonkeyIdle:n(8760),MonkeyTracking:n(2750),MonkeyClose:n(6257),MonkeyPeek:n(7785),FoldersAll:n(9356),FoldersNew:n(5485),DiscussionGroups:n(6978),CameraFlip:n(5665),HandFilled:n(2456),HandOutline:n(5667),Speaker:n(8763),VoiceAllowTalk:n(401),VoiceMini:n(5106),VoiceMuted:n(487),VoiceOutlined:n(5740),Peach:n(3677),Eggplant:n(5435),Cumshot:n(1879)};function s(e){const t=r[e].replace(window.location.origin,"");return o.he(`file${t}`,a.IU.Lottie)}},710:(e,t,n)=>{n.d(t,{Z:()=>Z});var a=n(4050),o=n(6752),r=n(3716),s=n(1394),i=n(9107),c=n(231),l=n(3103),d=n(4288);const u={type:"blob",quality:1,format:"jpeg",circle:!1,size:{width:1024,height:1024}};let m,p,g;const h=(0,a.X$)((({file:e,onChange:t,onClose:o})=>{const[h,Z]=(0,a.eJ)(!1);(0,a.d4)((()=>{e&&(h?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:a}=t;g=new m(t,{enableZoom:!0,boundary:{width:n,height:a},viewport:{width:n-16,height:a-16,type:"circle"}});const o=await(0,s.YJ)(e);await g.bind({url:o})}catch(e){r.eM&&console.error(e)}}(e):async function(){return p||(p=Promise.all([n.e(99),n.e(472)]).then(n.bind(n,3472)),m=(await p).default),p}().then((()=>Z(!0))))}),[e,h]);const f=(0,i.Z)();return a.ZP.createElement(l.Z,{isOpen:Boolean(e),onClose:o,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},h?a.ZP.createElement("div",{id:"avatar-crop"}):a.ZP.createElement(d.Z,null),a.ZP.createElement(c.Z,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!g)return;const e=await g.result(u),n="string"==typeof e?e:(0,s.hl)(e,"avatar.jpg");t(n)},ariaLabel:f("CropImage")},a.ZP.createElement("i",{className:"icon-check"})))})),Z=(0,a.X$)((({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:r})=>{const[s,i]=(0,a.eJ)(),[c,l]=(0,a.eJ)(n);(0,a.d4)((()=>{l(n)}),[n]);const d=(0,o.Z)(c&&"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"}),c&&a.ZP.createElement("img",{src:c,alt:"Avatar"})),a.ZP.createElement(h,{file:s,onClose:function(){i(void 0)},onChange:function(e){i(void 0),r(e),c&&URL.revokeObjectURL(c),l(URL.createObjectURL(e))}}))}))},3103:(e,t,n)=>{n.d(t,{Z:()=>p});var a=n(4050),o=n(517),r=n(6752),s=n(8674),i=n(1212),c=n(274),l=n(9107),d=n(6590),u=n(231),m=n(2898);const p=({dialogRef:e,title:t,className:n,isOpen:p,header:g,hasCloseButton:h,noBackdrop:Z,children:f,onClose:b,onCloseAnimationEnd:v,onEnter:P,shouldSkipHistoryAnimations:E})=>{const{shouldRender:y,transitionClassNames:w}=(0,i.Z)(p,v,E,void 0,E),k=(0,a.sO)(null);(0,a.d4)((()=>p?(0,o.Z)({onEsc:b,onEnter:P}):void 0),[p,b,P]),(0,a.d4)((()=>p&&k.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const a=n.findIndex((e=>e.isSameNode(document.activeElement)));let o=0;a>=0&&(o=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(k.current):void 0),[p]);const{forceClose:N}=(0,d.ZP)(p,b);(0,a.d4)((()=>()=>{p&&N()}),[]),(0,c.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,l.Z)();if(!y)return;const L=(0,r.Z)("Modal",n,w,Z&&"transparent-backdrop");return a.ZP.createElement(m.Z,null,a.ZP.createElement("div",{ref:k,className:L,tabIndex:-1,role:"dialog"},a.ZP.createElement("div",{className:"modal-container"},a.ZP.createElement("div",{className:"modal-backdrop",onClick:b}),a.ZP.createElement("div",{className:"modal-dialog",ref:e},g||(t?a.ZP.createElement("div",{className:"modal-header"},h&&a.ZP.createElement(u.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:C("Close"),onClick:b},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},t)):void 0),a.ZP.createElement("div",{className:"modal-content custom-scroll"},f)))))}},2898:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050),o=n(2916);const r=({containerId:e,className:t,children:n})=>{const r=(0,a.sO)();return r.current||(r.current=document.createElement("div")),(0,a.bt)((()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=r.current;return t&&a.classList.add(t),n.appendChild(a),()=>{o.Z.render(void 0,a),n.removeChild(a)}}),[t,e]),o.Z.render(n,r.current)}},5332:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050);function o(e,t){(0,a.d4)((()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)})),[e,t])}},1879:(e,t,n)=>{e.exports=n.p+"Cumshot.7a17984a6b80787dab34..tgs"},5435:(e,t,n)=>{e.exports=n.p+"Eggplant.7693d877087b802d04be..tgs"},3677:(e,t,n)=>{e.exports=n.p+"Peach.a289b2c54c563f11208f..tgs"},5665:(e,t,n)=>{e.exports=n.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},2456:(e,t,n)=>{e.exports=n.p+"HandFilled.f87939d160f1dc288586..tgs"},5667:(e,t,n)=>{e.exports=n.p+"HandOutline.f9831751ba60df30c484..tgs"},8763:(e,t,n)=>{e.exports=n.p+"Speaker.04bb3743412b41ff83c5..tgs"},401:(e,t,n)=>{e.exports=n.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},5106:(e,t,n)=>{e.exports=n.p+"VoiceMini.bf00ffdf69625c579569..tgs"},487:(e,t,n)=>{e.exports=n.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},5740:(e,t,n)=>{e.exports=n.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"},6257:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},8760:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},7785:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},2750:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6978:(e,t,n)=>{e.exports=n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},9356:(e,t,n)=>{e.exports=n.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},5485:(e,t,n)=>{e.exports=n.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"}}]); -//# sourceMappingURL=133.672f7d0ddf0d82cbe667.js.map \ No newline at end of file diff --git a/dist/133.672f7d0ddf0d82cbe667.js.map b/dist/133.672f7d0ddf0d82cbe667.js.map deleted file mode 100644 index b2f499ec3..000000000 --- a/dist/133.672f7d0ddf0d82cbe667.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"133.672f7d0ddf0d82cbe667.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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\nimport { GlobalState } 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;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber,\n authIsCodeViaApp,\n authIsLoading,\n authError,\n}) => {\n const {\n setAuthCode,\n returnToAuthPhoneNumber,\n clearAuthError,\n } = getDispatch();\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)(AuthCode));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } 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;\n\nconst AuthPassword: FC = ({\n authIsLoading, authError, authHint,\n}) => {\n const { setAuthPassword, clearAuthError } = getDispatch();\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)(AuthPassword));\n","import { ChangeEvent } from 'react';\nimport React, { FC, useState, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } 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;\n\nconst AuthRegister: FC = ({\n authIsLoading, authError,\n}) => {\n const { signUp, clearAuthError, uploadProfilePhoto } = getDispatch();\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)(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 onEnded?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n color,\n onEnded,\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 onEnded,\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, onEnded]);\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/tgs/monkeys/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/tgs/settings/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/tgs/settings/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/tgs/settings/DiscussionGroupsDucks.tgs';\n// @ts-ignore\nimport CameraFlip from '../../../assets/tgs/calls/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/tgs/calls/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/tgs/calls/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/tgs/calls/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/tgs/calls/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/tgs/calls/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/tgs/calls/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/tgs/calls/VoiceOutlined.tgs';\n// @ts-ignore\nimport Peach from '../../../assets/tgs/animatedEmojis/Peach.tgs';\n// @ts-ignore\nimport Eggplant from '../../../assets/tgs/animatedEmojis/Eggplant.tgs';\n// @ts-ignore\nimport Cumshot from '../../../assets/tgs/animatedEmojis/Cumshot.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 Peach,\n Eggplant,\n Cumshot,\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 size: { width: 1024, height: 1024 },\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","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","getDispatch","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","onEnded","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","Peach","Eggplant","Cumshot","name","path","window","location","origin","mediaLoader","ApiMediaFormat","cropperResultOptions","format","circle","width","height","Croppie","croppiePromise","cropper","onClose","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","document","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","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/133.672f7d0ddf0d82cbe667.css b/dist/133.9dfaaf583ccedfce4e17.css similarity index 99% rename from dist/133.672f7d0ddf0d82cbe667.css rename to dist/133.9dfaaf583ccedfce4e17.css index 111af74b0..842abfcf7 100644 --- a/dist/133.672f7d0ddf0d82cbe667.css +++ b/dist/133.9dfaaf583ccedfce4e17.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(127,127,127,.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.672f7d0ddf0d82cbe667.css.map*/ \ No newline at end of file +/*# sourceMappingURL=133.9dfaaf583ccedfce4e17.css.map*/ \ No newline at end of file diff --git a/dist/133.672f7d0ddf0d82cbe667.css.map b/dist/133.9dfaaf583ccedfce4e17.css.map similarity index 99% rename from dist/133.672f7d0ddf0d82cbe667.css.map rename to dist/133.9dfaaf583ccedfce4e17.css.map index 5a772723c..9010d4a56 100644 --- a/dist/133.672f7d0ddf0d82cbe667.css.map +++ b/dist/133.9dfaaf583ccedfce4e17.css.map @@ -1 +1 @@ -{"version":3,"file":"133.672f7d0ddf0d82cbe667.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,oBACE,iBAGF,mBACE,kCACA,mBACA,gBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC1JF,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 .modal-about {\n font-weight: bold;\n }\n\n .modal-help {\n color: var(--color-text-secondary);\n font-size: 0.9375rem;\n line-height: 1.3;\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(#7f7f7f, 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.9dfaaf583ccedfce4e17.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,oBACE,iBAGF,mBACE,kCACA,mBACA,gBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;AC1JF,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 .modal-about {\n font-weight: bold;\n }\n\n .modal-help {\n color: var(--color-text-secondary);\n font-size: 0.9375rem;\n line-height: 1.3;\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(#7f7f7f, 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.9dfaaf583ccedfce4e17.js b/dist/133.9dfaaf583ccedfce4e17.js new file mode 100644 index 000000000..23226cc36 --- /dev/null +++ b/dist/133.9dfaaf583ccedfce4e17.js @@ -0,0 +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:()=>P,AuthRegister:()=>w});var a=n(4050),o=n(5116),r=n(7361),s=n(782),i=n(2340),c=n(6590),l=n(9107),d=n(7687),u=n(4288),m=n(3716),p=n(7324),g=n(7799);const h=r.wB?m.qp:m.z7,Z=(0,a.X$)((({code:e,codeLength:t,trackingDirection:n,isTracking:o,isBig:r})=>{const[s,i]=(0,a.eJ)(),[c,l]=(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)((()=>{c||(0,p.Z)("MonkeyTracking").then(l)}),[c]);const f=(0,a.I4)((()=>u(!0)),[]);return a.ZP.createElement("div",{id:"monkey",className:r?"big":""},!d&&a.ZP.createElement("div",{className:"monkey-preview"}),s&&a.ZP.createElement(g.Z,{id:"idleMonkey",size:r?m.K2:h,className:o?"hidden":void 0,animationData:s,play:!o,onLoad:f}),c&&a.ZP.createElement(g.Z,{id:"trackingMonkey",size:r?m.K2:h,className:o?"shown":"hidden",animationData:c,playSegment:o?function(){const a=e&&e.length>1||n<0?15+Z*(e.length-1):0,o=e.length===t?180:15+Z*e.length;return n<1?[o,a]:[a,o]}():void 0,speed:2,noLoop:!0}))})),f=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authPhoneNumber","authIsCodeViaApp","authIsLoading","authError"])))((({authPhoneNumber:e,authIsCodeViaApp:t,authIsLoading:n,authError:s})=>{const{setAuthCode:m,returnToAuthPhoneNumber:p,clearAuthError:g}=(0,o.uC)(),h=(0,l.Z)(),f=(0,a.sO)(null),[v,b]=(0,a.eJ)(""),[P,E]=(0,a.eJ)(!1),[y,w]=(0,a.eJ)(1);(0,a.d4)((()=>{r.$b||f.current.focus()}),[]),(0,c.ZP)(!0,p);const k=(0,a.I4)((e=>{s&&g();const{currentTarget:t}=e;t.value=t.value.replace(/[^\d]+/,"").substr(0,5),t.value!==v&&(b(t.value),P?t.value.length||E(!1):E(!0),v&&v.length>t.value.length?w(-1):w(1),5===t.value.length&&m({code:t.value}))}),[s,g,v,P,m]);return a.ZP.createElement("div",{id:"auth-code-form",className:"custom-scroll"},a.ZP.createElement("div",{className:"auth-form"},a.ZP.createElement(Z,{code:v,codeLength:5,isTracking:P,trackingDirection:y}),a.ZP.createElement("h2",null,e,a.ZP.createElement("div",{className:"auth-number-edit",onClick:p,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:f,id:"sign-in-code",label:h("Code"),onInput:k,value:v,error:s&&h(s),autoComplete:"one-time-code",inputMode:"numeric"}),n&&a.ZP.createElement(u.Z,null)))})));var v=n(3490),b=n(9364);const P=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authIsLoading","authError","authHint"])))((({authIsLoading:e,authError:t,authHint:n})=>{const{setAuthPassword:r,clearAuthError:s}=(0,o.uC)(),i=(0,l.Z)(),[c,d]=(0,a.eJ)(!1),u=(0,a.I4)((e=>{d(e)}),[]),m=(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(v.Z,{isPasswordVisible:c}),a.ZP.createElement("h2",null,i("Login.Header.Password")),a.ZP.createElement("p",{className:"note"},i("Login.EnterPasswordDescription")),a.ZP.createElement(b.Z,{clearError:s,error:t&&i(t),hint:n,isLoading:e,isPasswordVisible:c,onChangePasswordVisibility:u,onSubmit:m})))})));var E=n(231),y=n(710);const w=(0,a.X$)((0,o.c$)((e=>(0,s.ei)(e,["authIsLoading","authError"])))((({authIsLoading:e,authError:t})=>{const{signUp:n,clearAuthError:r,uploadProfilePhoto:s}=(0,o.uC)(),i=(0,l.Z)(),[c,u]=(0,a.eJ)(!1),[m,p]=(0,a.eJ)(),[g,h]=(0,a.eJ)(""),[Z,f]=(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:g,lastName:Z}),m&&s({file:m})}},a.ZP.createElement(y.Z,{onChange:p}),a.ZP.createElement("h2",null,i("YourName")),a.ZP.createElement("p",{className:"note"},i("Login.Register.Desc")),a.ZP.createElement(d.Z,{id:"registration-first-name",label:i("Login.Register.FirstName.Placeholder"),onChange:function(e){t&&r();const{target:n}=e;h(n.value),u(n.value.length>0)},value:g,error:t&&i(t),autoComplete:"given-name"}),a.ZP.createElement(d.Z,{id:"registration-last-name",label:i("Login.Register.LastName.Placeholder"),onChange:function(e){const{target:t}=e;f(t.value)},value:Z,autoComplete:"family-name"}),c&&a.ZP.createElement(E.Z,{type:"submit",ripple:!0,isLoading:e},i("Next")))))})))},7799:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),o=n(9118),r=n(6752),s=n(8674),i=n(5332);let c,l;async function d(){return c||(c=n.e(941).then(n.bind(n,7941)),l=(await c).default),c}setTimeout(d,5e3);const u=(0,a.X$)((({className:e,id:t,animationData:n,play:c,playSegment:u,speed:m,noLoop:p,size:g,quality:h,isLowPriority:Z,color:f,forceOnHeavyAnimation:v,onLoad:b,onEnded:P})=>{const[E,y]=(0,a.eJ)(),w=(0,a.sO)(null),k=(0,a.sO)(!1),N=(0,a.sO)(!1),C=(0,a.sO)(!0),L=(0,a.sO)();L.current=c;const x=(0,a.sO)();x.current=u,(0,a.d4)((()=>{if(E||!n)return;const e=()=>{if(!w.current)return;const e=new l(t,w.current,n,{noLoop:p,size:g,quality:h,isLowPriority:Z},b,f,P);m&&e.setSpeed(m),y(e)};l?e():d().then((()=>{(0,o.T2)((()=>{w.current&&e()}))}))}),[f,E,n,t,Z,p,b,h,g,m,P]),(0,a.d4)((()=>{E&&E.setColor(f)}),[f,E]),(0,a.d4)((()=>()=>{E&&E.destroy()}),[E]);const I=(0,a.I4)(((e=!1)=>{E&&(L.current||x.current)&&(x.current?E.playSegment(x.current):e?E.goToAndPlay(0):E.play())}),[E]),A=(0,a.I4)((()=>{E&&E.pause()}),[E]),M=(0,a.I4)((()=>{N.current=!0,E&&(k.current||(k.current=E.isPlaying()),A())}),[E,A]),S=(0,a.I4)((()=>{k.current&&I(),k.current=!1,N.current=!1}),[I]),J=(0,a.I4)((()=>{(0,o.T2)(S)}),[S]);(0,a.d4)((()=>{E&&(c||u?N.current?k.current=!0:I(p):N.current?k.current=!1:A())}),[E,c,u,p,I,A]),(0,a.d4)((()=>{E&&(C.current?C.current=!1:n&&(E.changeData(n),I()))}),[I,E,n]),(0,s.ZP)(M,S,v),(0,i.Z)(M,J);const T=(0,r.Z)("AnimatedSticker",e),O=g?`width: ${g}px; height: ${g}px;`:void 0;return a.ZP.createElement("div",{ref:w,className:T,style:O})}))},9364:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),o=n(3716),r=n(7361),s=n(6752),i=n(9107),c=n(231);const l=r.wB?550:400,d=(0,a.X$)((({isLoading:e=!1,isPasswordVisible:t,error:n,hint:d,placeholder:u="Password",submitLabel:m="Next",clearError:p,onChangePasswordVisibility:g,onInputChange:h,onSubmit:Z})=>{const f=(0,a.sO)(null),v=(0,i.Z)(),[b,P]=(0,a.eJ)(""),[E,y]=(0,a.eJ)(!1);return(0,a.d4)((()=>{r.$b||setTimeout((()=>{f.current.focus()}),l)}),[]),(0,a.d4)((()=>{n&&requestAnimationFrame((()=>{f.current.focus(),f.current.select()}))}),[n]),a.ZP.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||E&&Z(b)},autoComplete:"off"},a.ZP.createElement("div",{className:(0,s.Z)("input-group password-input",b&&"touched",n&&"error"),dir:v.isRtl?"rtl":void 0},a.ZP.createElement("input",{ref:f,className:"form-control",type:t?"text":"password",id:"sign-in-password",value:b||"",autoComplete:"current-password",onChange:function(e){n&&p();const{target:t}=e;P(t.value),y(t.value.length>=o.lo),h&&h(t.value)},dir:"auto"}),a.ZP.createElement("label",null,n||d||u),a.ZP.createElement("div",{className:"toggle-password",onClick:function(){g(!t)},role:"button",tabIndex:0,title:"Toggle password visibility"},a.ZP.createElement("i",{className:t?"icon-eye":"icon-eye-closed"}))),E&&a.ZP.createElement(c.Z,{type:"submit",ripple:!0,isLoading:e},m))}))},3490:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),o=n(3716),r=n(7361),s=n(7324),i=n(7799);const c=[0,50],l=[0,20],d=[20,0],u=r.wB?o.qp:o.z7,m=(0,a.X$)((({isPasswordVisible:e,isBig:t})=>{const[n,r]=(0,a.eJ)(),[m,p]=(0,a.eJ)(),[g,h]=(0,a.eJ)(!1),[Z,f]=(0,a.eJ)(!1);(0,a.d4)((()=>{n?setTimeout((()=>f(!0)),2e3):(0,s.Z)("MonkeyClose").then(r)}),[n]),(0,a.d4)((()=>{m||(0,s.Z)("MonkeyPeek").then(p)}),[m]);const v=(0,a.I4)((()=>h(!0)),[]);return a.ZP.createElement("div",{id:"monkey",className:t?"big":""},!g&&a.ZP.createElement("div",{className:"monkey-preview"}),n&&a.ZP.createElement(i.Z,{id:"closeMonkey",size:t?o.K2:u,className:Z?"hidden":"shown",animationData:n,playSegment:c,noLoop:!0,onLoad:v}),m&&a.ZP.createElement(i.Z,{id:"peekMonkey",size:t?o.K2:u,className:Z?"shown":"hidden",animationData:m,playSegment:e?l:d,noLoop:!0}))}))},7324:(e,t,n)=>{n.d(t,{x:()=>r,Z:()=>s});var a=n(6137),o=n(647);const r={MonkeyIdle:n(8760),MonkeyTracking:n(2750),MonkeyClose:n(6257),MonkeyPeek:n(7785),FoldersAll:n(9356),FoldersNew:n(5485),DiscussionGroups:n(6978),CameraFlip:n(5665),HandFilled:n(2456),HandOutline:n(5667),Speaker:n(8763),VoiceAllowTalk:n(401),VoiceMini:n(5106),VoiceMuted:n(487),VoiceOutlined:n(5740),Peach:n(3677),Eggplant:n(5435),Cumshot:n(1879)};function s(e){const t=r[e].replace(window.location.origin,"");return o.he(`file${t}`,a.IU.Lottie)}},710:(e,t,n)=>{n.d(t,{Z:()=>Z});var a=n(4050),o=n(6752),r=n(3716),s=n(1394),i=n(9107),c=n(231),l=n(3103),d=n(4288);const u={type:"blob",quality:1,format:"jpeg",circle:!1,size:{width:1024,height:1024}};let m,p,g;const h=(0,a.X$)((({file:e,onChange:t,onClose:o})=>{const[h,Z]=(0,a.eJ)(!1);(0,a.d4)((()=>{e&&(h?async function(e){try{const t=document.getElementById("avatar-crop");if(!t)return;const{offsetWidth:n,offsetHeight:a}=t;g=new m(t,{enableZoom:!0,boundary:{width:n,height:a},viewport:{width:n-16,height:a-16,type:"circle"}});const o=await(0,s.YJ)(e);await g.bind({url:o})}catch(e){r.eM&&console.error(e)}}(e):async function(){return p||(p=Promise.all([n.e(99),n.e(472)]).then(n.bind(n,3472)),m=(await p).default),p}().then((()=>Z(!0))))}),[e,h]);const f=(0,i.Z)();return a.ZP.createElement(l.Z,{isOpen:Boolean(e),onClose:o,title:"Drag to reposition",className:"CropModal",hasCloseButton:!0},h?a.ZP.createElement("div",{id:"avatar-crop"}):a.ZP.createElement(d.Z,null),a.ZP.createElement(c.Z,{className:"confirm-button",round:!0,color:"primary",onClick:async function(){if(!g)return;const e=await g.result(u),n="string"==typeof e?e:(0,s.hl)(e,"avatar.jpg");t(n)},ariaLabel:f("CropImage")},a.ZP.createElement("i",{className:"icon-check"})))})),Z=(0,a.X$)((({title:e="Change your profile picture",disabled:t,currentAvatarBlobUrl:n,onChange:r})=>{const[s,i]=(0,a.eJ)(),[c,l]=(0,a.eJ)(n);(0,a.d4)((()=>{l(n)}),[n]);const d=(0,o.Z)(c&&"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"}),c&&a.ZP.createElement("img",{src:c,alt:"Avatar"})),a.ZP.createElement(h,{file:s,onClose:function(){i(void 0)},onChange:function(e){i(void 0),r(e),c&&URL.revokeObjectURL(c),l(URL.createObjectURL(e))}}))}))},3103:(e,t,n)=>{n.d(t,{Z:()=>p});var a=n(4050),o=n(517),r=n(6752),s=n(8674),i=n(1212),c=n(274),l=n(9107),d=n(6590),u=n(231),m=n(2898);const p=({dialogRef:e,title:t,className:n,isOpen:p,header:g,hasCloseButton:h,noBackdrop:Z,children:f,onClose:v,onCloseAnimationEnd:b,onEnter:P,shouldSkipHistoryAnimations:E})=>{const{shouldRender:y,transitionClassNames:w}=(0,i.Z)(p,b,E,void 0,E),k=(0,a.sO)(null);(0,a.d4)((()=>p?(0,o.Z)({onEsc:v,onEnter:P}):void 0),[p,v,P]),(0,a.d4)((()=>p&&k.current?function(e){function t(t){if("Tab"!==t.key)return;t.preventDefault(),t.stopPropagation();const n=Array.from(e.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'));if(!n.length)return;const a=n.findIndex((e=>e.isSameNode(document.activeElement)));let o=0;a>=0&&(o=t.shiftKey?a>0?a-1:n.length-1:a{document.removeEventListener("keydown",t,!1)}}(k.current):void 0),[p]);const{forceClose:N}=(0,d.ZP)(p,v);(0,a.d4)((()=>()=>{p&&N()}),[]),(0,c.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,l.Z)();if(!y)return;const L=(0,r.Z)("Modal",n,w,Z&&"transparent-backdrop");return a.ZP.createElement(m.Z,null,a.ZP.createElement("div",{ref:k,className:L,tabIndex:-1,role:"dialog"},a.ZP.createElement("div",{className:"modal-container"},a.ZP.createElement("div",{className:"modal-backdrop",onClick:v}),a.ZP.createElement("div",{className:"modal-dialog",ref:e},g||(t?a.ZP.createElement("div",{className:"modal-header"},h&&a.ZP.createElement(u.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:C("Close"),onClick:v},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},t)):void 0),a.ZP.createElement("div",{className:"modal-content custom-scroll"},f)))))}},2898:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050),o=n(2916);const r=({containerId:e,className:t,children:n})=>{const r=(0,a.sO)();return r.current||(r.current=document.createElement("div")),(0,a.bt)((()=>{const n=document.querySelector(e||"#portals");if(!n)return;const a=r.current;return t&&a.classList.add(t),n.appendChild(a),()=>{o.Z.render(void 0,a),n.removeChild(a)}}),[t,e]),o.Z.render(n,r.current)}},5332:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050);function o(e,t){(0,a.d4)((()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)})),[e,t])}},1879:(e,t,n)=>{e.exports=n.p+"Cumshot.7a17984a6b80787dab34..tgs"},5435:(e,t,n)=>{e.exports=n.p+"Eggplant.7693d877087b802d04be..tgs"},3677:(e,t,n)=>{e.exports=n.p+"Peach.a289b2c54c563f11208f..tgs"},5665:(e,t,n)=>{e.exports=n.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},2456:(e,t,n)=>{e.exports=n.p+"HandFilled.f87939d160f1dc288586..tgs"},5667:(e,t,n)=>{e.exports=n.p+"HandOutline.f9831751ba60df30c484..tgs"},8763:(e,t,n)=>{e.exports=n.p+"Speaker.04bb3743412b41ff83c5..tgs"},401:(e,t,n)=>{e.exports=n.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},5106:(e,t,n)=>{e.exports=n.p+"VoiceMini.bf00ffdf69625c579569..tgs"},487:(e,t,n)=>{e.exports=n.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},5740:(e,t,n)=>{e.exports=n.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"},6257:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},8760:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},7785:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},2750:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6978:(e,t,n)=>{e.exports=n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},9356:(e,t,n)=>{e.exports=n.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},5485:(e,t,n)=>{e.exports=n.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"}}]); +//# sourceMappingURL=133.9dfaaf583ccedfce4e17.js.map \ No newline at end of file diff --git a/dist/133.9dfaaf583ccedfce4e17.js.map b/dist/133.9dfaaf583ccedfce4e17.js.map new file mode 100644 index 000000000..c3543bfe5 --- /dev/null +++ b/dist/133.9dfaaf583ccedfce4e17.js.map @@ -0,0 +1 @@ +{"version":3,"file":"133.9dfaaf583ccedfce4e17.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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\nimport { GlobalState } 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;\n\nconst CODE_LENGTH = 5;\n\nconst AuthCode: FC = ({\n authPhoneNumber,\n authIsCodeViaApp,\n authIsLoading,\n authError,\n}) => {\n const {\n setAuthCode,\n returnToAuthPhoneNumber,\n clearAuthError,\n } = getDispatch();\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)(AuthCode));\n","import React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } 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;\n\nconst AuthPassword: FC = ({\n authIsLoading, authError, authHint,\n}) => {\n const { setAuthPassword, clearAuthError } = getDispatch();\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)(AuthPassword));\n","import { ChangeEvent } from 'react';\nimport React, { FC, useState, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } 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;\n\nconst AuthRegister: FC = ({\n authIsLoading, authError,\n}) => {\n const { signUp, clearAuthError, uploadProfilePhoto } = getDispatch();\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)(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?: string;\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 forceOnHeavyAnimation?: boolean;\n color?: [number, number, number];\n onEnded?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n color,\n forceOnHeavyAnimation,\n onLoad,\n onEnded,\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 onEnded,\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, onEnded]);\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 if (animationData) {\n animation.changeData(animationData);\n playAnimation();\n }\n }\n }, [playAnimation, animation, animationData]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation, forceOnHeavyAnimation);\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/tgs/monkeys/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/tgs/settings/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/tgs/settings/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/tgs/settings/DiscussionGroupsDucks.tgs';\n// @ts-ignore\nimport CameraFlip from '../../../assets/tgs/calls/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/tgs/calls/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/tgs/calls/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/tgs/calls/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/tgs/calls/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/tgs/calls/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/tgs/calls/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/tgs/calls/VoiceOutlined.tgs';\n// @ts-ignore\nimport Peach from '../../../assets/tgs/animatedEmojis/Peach.tgs';\n// @ts-ignore\nimport Eggplant from '../../../assets/tgs/animatedEmojis/Eggplant.tgs';\n// @ts-ignore\nimport Cumshot from '../../../assets/tgs/animatedEmojis/Cumshot.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 Peach,\n Eggplant,\n Cumshot,\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 size: { width: 1024, height: 1024 },\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","authPhoneNumber","authIsCodeViaApp","authIsLoading","authError","setAuthCode","returnToAuthPhoneNumber","clearAuthError","getDispatch","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","forceOnHeavyAnimation","onEnded","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","Peach","Eggplant","Cumshot","name","path","window","location","origin","mediaLoader","ApiMediaFormat","cropperResultOptions","format","circle","width","height","Croppie","croppiePromise","cropper","onClose","isCroppieReady","setIsCroppieReady","imgFile","cropContainer","document","getElementById","offsetWidth","offsetHeight","enableZoom","boundary","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/700.f057ed004e34fabd3032.css b/dist/163.c69a8648aa1c99ba6248.css similarity index 99% rename from dist/700.f057ed004e34fabd3032.css rename to dist/163.c69a8648aa1c99ba6248.css index 829a473c0..06b696aac 100644 --- a/dist/700.f057ed004e34fabd3032.css +++ b/dist/163.c69a8648aa1c99ba6248.css @@ -37,4 +37,4 @@ #RightColumn{position:absolute;top:0;right:0;width:var(--right-column-width);height:100%;transform:translate3d(var(--right-column-width), 0, 0);background:var(--color-background);border-left:1px solid var(--color-borders);z-index:var(--z-right-column);transition:transform var(--layer-transition)}body.animation-level-0 #RightColumn{transition:none}#RightColumn:not(:hover) .chat-item-clickable:not(.picker-list-item):nth-child(n+18){display:none !important}@media(max-width: 1275px){#RightColumn{box-shadow:0 .25rem .5rem .125rem var(--color-default-shadow);border-left:none}}@media(max-width: 600px){#RightColumn{width:100vw;transform:translate3d(110vw, 0, 0)}}@supports(padding-right: env(safe-area-inset-right)){#RightColumn{padding-right:env(safe-area-inset-right)}}#RightColumn>.Transition{height:calc(100% - var(--header-height));overflow:hidden}#RightColumn .Management .section>.ChatInfo{padding:0 1.5rem;margin:1rem 0;text-align:center}#RightColumn .Management .section>.ChatInfo .Avatar{margin:0 auto .5rem}#RightColumn .Management .section>.ChatInfo .Avatar.no-photo{cursor:default !important}#RightColumn .Management .section>.ChatInfo .title{display:flex;justify-content:center;align-items:center}#RightColumn .Management .section>.ChatInfo .title h3{font-weight:500;font-size:1.25rem;line-height:2rem;white-space:pre-wrap;word-break:break-word}#RightColumn .Management .section>.ChatInfo .title .VerifiedIcon{margin-left:.25rem;margin-bottom:.5rem}#RightColumn .Management .section>.ChatInfo .title .emoji{width:1.5rem;height:1.5rem;background-size:1.5rem}#RightColumn .Management .section>.ChatInfo .status{font-size:.875rem;color:#868e96}#RightColumn-wrapper{position:absolute;top:0;left:0;right:0;bottom:0;z-index:var(--z-right-column);overflow:hidden;visibility:hidden;pointer-events:none}@media(max-width: 1275px){#RightColumn-wrapper{position:fixed}}#RightColumn-wrapper.is-hidden{display:none}#RightColumn-wrapper .overlay-backdrop{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:#000;opacity:0}@media(max-width: 600px){#RightColumn-wrapper .overlay-backdrop{transition:opacity var(--layer-transition)}body.animation-level-0 #RightColumn-wrapper .overlay-backdrop{transition:none}}#Main.right-column-open #RightColumn-wrapper,body.animating-right-column #RightColumn-wrapper{visibility:visible}@media(max-width: 600px){#Main.right-column-open #RightColumn-wrapper .overlay-backdrop{opacity:var(--layer-blackout-opacity)}}#Main.right-column-open #RightColumn-wrapper #RightColumn{pointer-events:auto;transform:translate3d(0, 0, 0)} #Main{height:100%;text-align:left;overflow:hidden}@media(min-width: 1276px){#Main{position:relative}}@media(max-width: 600px){#Main{height:calc(var(--vh, 1vh) * 100)}}@media(min-width: 926px){#Main{display:grid;grid-template-columns:auto 1fr;grid-template-rows:100%}}.has-group-call-header{--group-call-header-height: 2rem}.has-group-call-header #LeftColumn,.has-group-call-header #MiddleColumn,.has-group-call-header #RightColumn-wrapper{height:calc(100% - 2rem);margin-top:2rem}#LeftColumn{min-width:12rem;width:33vw;max-width:26.5rem;height:100%;position:relative}#LeftColumn>div{height:100%;overflow:hidden}@media(max-width: 600px){#LeftColumn{height:calc(var(--vh, 1vh) * 100)}}@media(min-width: 926px){#LeftColumn{max-width:40vw}}@media(min-width: 1276px){#LeftColumn{width:25vw;max-width:33vw}}@media(max-width: 925px){#LeftColumn{position:fixed;left:0;top:0;height:calc(var(--vh, 1vh) * 100);width:26.5rem !important;transform:translate3d(-5rem, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #LeftColumn{transition:none}#LeftColumn::after{content:"";display:block;position:absolute;left:0;top:0;right:0;bottom:0;background:#000;opacity:var(--layer-blackout-opacity);transition:opacity var(--layer-transition);z-index:1}body.animation-level-0 #LeftColumn::after{transition:none}body.is-android #LeftColumn::after{display:none}body.is-android .middle-column-shown #LeftColumn::after{display:block}#Main:not(.middle-column-open) #LeftColumn{transform:translate3d(0, 0, 0)}#Main:not(.middle-column-open) #LeftColumn::after{opacity:0;pointer-events:none}#Main.history-animation-disabled #LeftColumn{transition:none}#Main.history-animation-disabled #LeftColumn:after{transition:none}}@media(max-width: 600px){#LeftColumn{max-width:none;width:100vw !important;transform:translate3d(-20vw, 0, 0)}@supports(left: env(safe-area-inset-left)){#LeftColumn{left:env(safe-area-inset-left) !important;width:calc(100vw - env(safe-area-inset-left))}}}@media(max-width: 600px){#RightColumn{height:calc(var(--vh, 1vh) * 100 + 1px)}}#Main.history-animation-disabled #RightColumn{transition:none}#Main.history-animation-disabled #RightColumn .overlay-backdrop{transition:none}#Main.history-animation-disabled .overlay-backdrop{transition:none}#MiddleColumn{border-left:1px solid var(--color-borders)}@media(max-width: 925px){#MiddleColumn{max-width:none;position:fixed;left:0;top:0;bottom:0;right:0;transform:translate3d(0, 0, 0);transition:transform var(--layer-transition)}body.animation-level-0 #MiddleColumn{transition:none}#Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(26.5rem, 0, 0)}}@media(max-width: 600px){#MiddleColumn{border-left:none}#Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(100vw, 0, 0)}#Main.right-column-open #MiddleColumn{transform:translate3d(-20vw, 0, 0)}}#Main.history-animation-disabled #MiddleColumn{transition:none}#Main.history-animation-disabled #MiddleColumn:after{transition:none}body.is-android.animation-level-1{--layer-transition: 250ms ease-in-out}body.is-android.animation-level-1 #LeftColumn,body.is-android.animation-level-1 #MiddleColumn,body.is-android.animation-level-1 #RightColumn{transition:transform var(--layer-transition),opacity var(--layer-transition)}body.is-android.animation-level-1 #Main:not(.middle-column-shown) #MiddleColumn{display:none}body.is-android.animation-level-1 #Main:not(.middle-column-open) #MiddleColumn{transform:translate3d(10vw, 0, 0);opacity:0}body.is-android.animation-level-1 #Main.middle-column-open #LeftColumn{transform:translate3d(0, 0, 0);opacity:0}body.is-android.animation-level-1 #Main:not(.right-column-shown) #RightColumn{display:none}body.is-android.animation-level-1 #Main:not(.right-column-open) #RightColumn{transform:translate3d(10vw, 0, 0);opacity:0}body.is-android.animation-level-1 #Main.right-column-open #MiddleColumn{transform:translate3d(0, 0, 0);opacity:0} -/*# sourceMappingURL=700.f057ed004e34fabd3032.css.map*/ \ No newline at end of file +/*# sourceMappingURL=163.c69a8648aa1c99ba6248.css.map*/ \ No newline at end of file diff --git a/dist/700.f057ed004e34fabd3032.css.map b/dist/163.c69a8648aa1c99ba6248.css.map similarity index 99% rename from dist/700.f057ed004e34fabd3032.css.map rename to dist/163.c69a8648aa1c99ba6248.css.map index 6b1f9e269..ad42f6720 100644 --- a/dist/700.f057ed004e34fabd3032.css.map +++ b/dist/163.c69a8648aa1c99ba6248.css.map @@ -1 +1 @@ -{"version":3,"file":"700.f057ed004e34fabd3032.css","mappings":"AAEA,gBACE,kBAEA,oCACE,kBAEA,2HACE,eACA,eACA,sBACA,6CACA,0BACA,oBAGF,uFACE,kBACA,OACA,WAGF,4CACE,eAGF,2CACE,aAGF,+CACE,yBAEA,uDACE,qEAGF,sDACE,qEAIJ,iDACE,gBAEA,iHACE,gBAKN,gCACE,iBACA,cACA,iBACA,6BACA,qBACA,iBACA,WACA,kBACA,mBACA,gBACA,kBACA,cAGF,0CACE,cACA,kBAGF,8BACE,gBACA,2CAEA,gBCpEF,+BDgEA,8BC/DE,mBAGA,mBDsEA,wIACE,2B;AEnFN,iBACE,cACA,aACA,mBACA,qBACA,eACA,+BACA,2CAEA,0BACE,wBAGF,6BACE,gCACA,gBACA,iBACA,6BACA,mBAGF,yBACE,6BACE,6B;ACvBN,eACE,kBACA,WACA,YACA,2BAEA,4DAEA,sCACE,0BACA,UAEA,wBAEA,+CACE,UAIJ,wBACE,wBAEA,yBAHF,wBAKI,kCACA,6BAKF,oCACE,WACA,cACA,kBACA,WACA,YACA,YACA,aACA,WAKF,6CACE,kBACA,YACA,aACA,WACA,cAKF,gFAEE,kBAIA,0DACE,iCAGF,gDACE,0CAKF,0CACE,iCAGF,oDACE,0C;AC1ER,iBACE,YACA,kBACA,aACA,sBACA,gBACA,UAEA,2CACE,kBACA,YACA,WAGF,6BACE,OACA,gBACA,gCAEA,uCACE,8BAIJ,8BACE,YACA,aACA,sBACA,gBAEA,gDACE,gBACA,6BAEA,2DACE,SAIJ,uCACE,2BACA,sBACA,mBACA,gBACA,UAGF,mCACE,cACA,qBACA,sBAEA,wCACE,mBACA,oBAIJ,0CACE,OACA,gBAIJ,+FACE,YACA,gBAGF,6BACE,kBACA,YACA,UACA,WACA,c;AC1EJ,SACE,YAGF,aACE,4BACA,oCACA,aACA,mBACA,cACA,yCAEA,gBACE,gBACA,kBACA,gBACA,qBACA,kBAGF,0BACE,oBACA,+BAEA,yBAJF,0BAKI,6BAIJ,yBAzBF,aA0BI,eAGF,6BACE,aACA,cAEA,2CACE,mB;ACtCN,aACE,aACA,iBACA,oBACA,uBAEA,oCACE,2BAGF,qBACE,cACA,eAGF,4BACE,6CACA,2DACA,0CACA,2CAIA,oCACE,WACA,YAEA,sCACE,mBACA,qBAIJ,8BACE,kBACA,oBACA,oBAEA,wCACE,kBAIJ,+EACE,UACA,mBACA,uEAGF,yLAIE,UACA,qBAIJ,4BACE,kBACA,iBAEA,kDACE,kBACA,2BACA,SACA,YACA,WACA,eACA,kBAGF,gHACE,mBAGF,2CACE,UACA,kBAEA,kBACA,mCACA,aACA,2BACA,8DACA,WACA,eACA,oBACA,eACA,iDAEA,wDACE,gBACA,0EACE,gBAKN,yKAGE,UACA,mBAKF,sCACE,6CAGF,qDACE,iCACA,iBACA,iBACA,iBACA,sBACA,sBACA,kCAIJ,qBACE,aACA,uBACA,sBACA,cACA,gBACA,kBACA,gBACA,eACA,kDAEA,2BACE,wDAGF,iDAfF,qBAgBI,iBAGF,yCACE,cACA,gBACA,6BACA,iBACA,mBACA,gBACA,uBAEA,qDACE,8BACA,qBAIJ,+BACE,4BACA,kCACA,mBACA,mBACA,gBACA,uBACA,mBAEA,2CACE,8BACA,qB;ACxKR,kBACE,kBACA,SACA,OACA,QACA,gBACA,gBACA,+CACA,aACA,mBACA,8BACA,mBACA,qCACA,mCACA,WACA,eAEA,0BACE,WACA,cACA,kBACA,eACA,OACA,QACA,eACA,uDAGF,4BACE,aAGF,yBACE,oCACE,2BAIJ,wBACE,aACA,sBAEA,+BACE,kBACA,wBAGF,sCACE,iBACA,kCAIJ,2BACE,aACA,mBACA,mBAEA,mCACE,sBAEA,+CACE,WACA,YAGF,qDACE,cACA,eACA,6CAKN,wBACE,cACA,qBACA,gBACA,kBACA,WAKJ,0BACE,wDACE,8C;ACPJ,cACE,aACA,mBACA,WACA,+CACA,mCACA,oCACA,kBACA,+BAEA,mDAVF,cAWI,oDACA,yDAGF,yBAfF,cAgBI,cACA,kBAEA,mDAnBJ,cAoBM,mDACA,uDAIJ,0BACE,WAGA,YAEA,8BACE,aACA,mBACA,WAIJ,2BACE,oBACA,mBACA,kBAEA,yBALF,2BAMI,eAGF,yCACE,kBACA,eACA,kBACA,sBACA,iBACA,oBACA,gBACA,kBAEA,kBACA,aACA,cAEA,6BACA,WACA,oBAEA,gDACE,gCAKN,iCACE,YACA,gBAGF,kEACE,2BAGF,4BACE,aACA,mBACA,yBACA,iBACA,cAGE,qLAGE,2BAIJ,iDACE,2CACE,+BACA,6CAEA,mEACE,mEAKN,0BA1BF,4BA2BI,+BACA,6CAEA,oDACE,mEP5LN,oIOkMI,oBAIJ,iDACE,8GAEE,UAEA,8JACE,WA3MN,4HAEE,kBACA,SACA,OACA,QACA,gBACA,uDAEA,aACA,2BACA,sBACA,oBACA,mCAEA,4IACE,WACA,cACA,kBACA,eACA,OACA,QACA,eACA,uDAGF,sKACE,gBACA,sBAGF,mDA/BF,4HAgCI,qDACA,uDAIJ,sDACE,mBACA,aACA,qBAEA,8DACE,gBACA,YAGF,8DACE,sBAGF,oEACE,iBAIJ,8DACE,YACA,cACA,iBAEA,sEACE,YACA,eAGF,4EACE,eAIJ,iFACE,aA2IA,0BACE,iEACE,wDAKN,oHAEE,mDAEA,kKACE,eAIJ,iBACE,gBACA,mBACA,qBACA,gBACA,SACA,gBACA,uBACA,uBAEA,4DAEE,oBACA,gBAGF,yBAhBF,iBAiBI,cACA,gBACA,wBAGF,0BACE,yCACE,kDAKN,wBACE,eACA,aACA,mBAEA,8BACE,aACA,sBACA,uBACA,YACA,gBAGF,+BACE,aACA,mBAEA,6CACE,cACA,eACA,mBACA,kBAIJ,gCACE,aACA,uBAGF,qCACE,uBACA,gBACA,uBAEA,0BACE,6DACE,kDAMR,sBACE,qBAEA,wBACA,yBACA,oBAGF,mDACE,kBACA,qBACA,SACA,kCACA,gBACA,mBACA,uBACA,qBAEA,uEACE,oBAGF,iEACE,2BAGF,2EACE,iBAIJ,8BACE,aACA,cAGF,2CACE,aACA,mBACA,iBACA,eACA,2BACA,mCAGE,oFACE,aAIJ,0BAdF,2CAeI,+BACA,+DAEA,mEACE,mEAKJ,gEACE,gBAGF,mDACE,cAGF,sDACE,kBACA,OACA,QACA,SACA,mCACA,oCACA,uDACA,+BACA,+DAEA,8DACE,WACA,cACA,kBACA,eACA,OACA,QACA,eACA,uDAGF,2EACE,aACA,gBACA,OAEA,yFACE,eAIJ,0BAhCF,sDAiCI,+BACA,+DAEA,8EACI,qDAMV,mCACE,aACA,cACA,oBACA,uBACA,eACA,qBACA,kDACA,kBACA,gBACA,eAEA,yCACE,wDAGF,0DACE,kBACA,eACA,iBACA,cACA,kBACA,gBAEA,2FACE,eACA,cACA,uBACA,gCAGF,yFACE,8CACA,kBACA,sBACA,sCAGF,sFACE,kBACA,OACA,MACA,cACA,gCACA,uBACA,sBACA,sCAIJ,iDACE,gBACA,4BACA,mBACA,gBAEA,iDANF,iDAOI,iBAGF,wDACE,gBACA,kBACA,iBACA,YACA,2BACA,sBACA,gBACA,mBAEA,oEACE,mBAIJ,mDACE,kBACA,qBACA,gBACA,mBACA,gBACA,uBACA,SAEA,+DACE,mBAKN,gDACE,WACA,YAGF,uCACE,cACA,eACA,iBACA,qBACA,4BACA,mBACA,cAEA,qDACE,gBAKN,6BACE,cACA,iBACA,aACA,mBACA,yBAGE,8DACE,2BACA,UAMJ,wFACE,mBAEA,kGACE,qBAKN,yBAjiBA,sEAEE,kBACA,SACA,OACA,QACA,gBACA,uDAEA,aACA,2BACA,sBACA,oBACA,mCAEA,sFACE,WACA,cACA,kBACA,eACA,OACA,QACA,eACA,uDAGF,gHACE,gBACA,sBAGF,mDA/BF,sEAgCI,qDACA,uDAIJ,2BACE,mBACA,aACA,qBAEA,mCACE,gBACA,YAGF,mCACE,sBAGF,yCACE,iBAIJ,mCACE,YACA,cACA,iBAEA,2CACE,YACA,eAGF,iDACE,eAIJ,sDACE,cA8dJ,mBACE,KACE,UAEF,GACE,W;AC9iBJ,iBACE,aACA,mBACA,yDACA,qBACA,2BACA,0CACA,kDACA,kBACA,gBACA,eACA,cAGE,0DACE,aAIJ,+BACE,gBACA,cACA,SACA,yCACA,iDAEA,uCACE,aACA,YACA,eAGF,+CACE,0BAGF,wCACE,cAIJ,yBACE,WACA,cACA,kBACA,aACA,gBACA,cACA,UACA,+BACA,kBAGF,uBACE,oCAGF,wBACE,qCAGF,gCACE,yDAGF,+BACE,gBACA,0BACA,aACA,8BAEA,8CACE,mBACA,gBACA,uBACA,sBACA,OACA,cAGF,iCACE,mBACA,gBACA,uBACA,gBACA,gBACA,OAEA,wCACE,aACA,aAIJ,sCACE,8DACA,+DACA,sCAIJ,0CACE,0BACA,YAGF,iCACE,WACA,YACA,iBACA,qBACA,mBACA,cAEA,uCACE,mBAIJ,8BACE,8BACA,gCACA,aACA,+BACA,uBACA,WACA,qCACA,sDAEA,sCACE,gBAGF,8CACE,oBAGF,4CACE,4BAGF,6CACE,gBACA,0B;AC/IN,uBACE,kBACA,aACA,mBACA,uBAEA,oCAEE,wBAEA,eAGF,wCACE,eACA,cACA,eACA,oBAEA,+CACE,YACA,aAGF,mDACE,qBAGF,gDACE,qBAKF,gDACE,eACA,gBAEA,uDACE,eACA,gBAIF,uDACE,kB;AC7CR,aACE,kBACA,eACA,SACA,QACA,aACA,mBACA,gCACA,sBACA,iBACA,WACA,eACA,eACA,gEAEA,oCACE,WACA,YACA,oBAGF,uFAGE,iBACA,mBAGF,2BACE,sBAIA,uCACE,oBAIJ,4BACE,6BAGF,gCACE,gBACA,uBACA,qBAGF,gCACE,oBACA,qBACA,mBACA,kBACA,eAGF,mCACE,6CACA,gBAGF,mEAEE,0BACA,0BACA,sBACA,sBACA,UACA,cACA,aACA,UACA,gBACA,6BAEA,qHACE,uBAIJ,qFAEE,sBACA,YACA,6BAGF,+GAEE,cAGF,4CACE,eACA,eAGF,yBACE,QAGF,gDACE,oCAGF,oCACE,uBACA,oBACA,sBAEA,iDACE,8BAIJ,6DACE,gBAGF,kEACE,iBAIA,qCACE,SAEF,yCACE,QAMJ,6DACE,WACA,aACA,cAGF,6DACE,YAGF,6DACE,YAGF,6DACE,Y;ACnJF,wBACE,eAGF,kBACE,oB;ACNJ,SACE,aACA,mBACA,eAEA,qBACE,eAGF,iBACE,mBAGF,uBACE,cACA,eACA,mBACA,gBAEA,qCACE,eACA,iBACA,qBACA,gBAGF,sCACE,iBACA,6B;AC5BN,YACE,aACA,qBACA,qBAEA,uBACE,gBAGF,8BACE,sBAGF,+BACE,kBACA,mBACA,cACA,wBACA,cACA,gBACA,kBACA,iBAEA,2CACE,oBACA,uBACA,iBAIJ,gCACE,kBACA,QACA,YACA,WACA,YACA,+BACA,8BACA,oBACA,iBACA,kBAEA,sCACE,8BAGF,gDACE,gBAGF,wCACE,UACA,qCACA,qBACA,uBACA,6BAIJ,+BACE,YACA,mBAGF,gCACE,kBAGF,8BACE,kBACA,QACA,cACA,gBACA,sBACA,iBACA,+BAEA,qBACA,yBACA,sBAIF,uBACE,WACA,YACA,kBACA,WACA,YACA,sDACA,oBACA,wBAGF,4BACE,iBACA,qBACA,2BACA,UAIA,qCACE,8BAGF,mCACE,0BAKN,iCACE,aACA,gB;AClHF,MACE,gBACA,mBAEA,yBAJF,MAKI,gBAGF,qBACE,gBACA,oBACA,iBACA,sBAGF,0CAEE,6BACA,kBAGF,iBACE,oBACA,aACA,mBACA,oBAGF,yBACE,2BACA,kBAGF,oBACE,mBACA,oBAGF,6BAEE,qBAEA,mDACE,qBAGF,+CACE,qBACA,mBAKA,gJACE,aACA,yCAEA,gMACE,4CAGF,oMACE,qCAIJ,4IACE,cACA,qCAMF,wMACE,iCAIJ,+CACE,aAMA,sCACE,aACA,sCAEA,mDACE,qCAMR,mBAEE,0CAEA,+BACE,2CAGF,gCAEE,2CACA,4CACE,2CAKN,0BACE,oBACA,mBACA,2BACA,oBACA,mBACA,gBAEA,kCACE,yCACA,eACA,uBAEA,+CACE,6CAGF,oDACE,iBAKN,sBACE,iBACA,iBACA,qBAEA,+BACE,yBAEA,wDACE,0BAIJ,0BACE,oBAIJ,+BACE,4BACA,iBACA,eACA,qBACA,2CAGF,sBACE,kCACA,yCACE,2BAIJ,wCAEE,mBACA,qBAGF,cACE,oBACA,eAEA,2BACE,0BACA,mDAIJ,cACE,sB;AC3LJ,SACE,kBACA,sBACA,qBACA,yDACA,qBACA,gBACA,kBAEA,iBACE,WACA,cACA,kBACA,MACA,SACA,OACA,cACA,+BACA,sBAGF,cACE,aACA,sBACA,uBAGF,sBACE,oBACA,iCAEA,sFACE,6DAGF,mCACE,WACA,YACA,aACA,2BAEA,uCACE,WACA,YAKN,iCACE,4BACA,8BAGF,2BACE,aACA,mBAEA,yCACE,QACA,mBAGF,wCACE,QACA,cAIA,kDACE,wBASF,kMACE,WACA,qBACA,iCACA,cACA,YAKN,oEAGE,sBACA,eAGF,oBACE,0BACA,gBACA,sBAGF,qBACE,gBACA,sBAGF,2BACE,iBACA,gBAEA,uCACE,qBAIJ,kBACE,6BAEA,0BACE,UACA,Q;ACvHJ,gBACE,0BACA,gBAGF,sBACE,kBAGE,+CACE,eACA,aAEA,yBAJF,+CAKI,cAIJ,kDACE,kBACA,MACA,qBACA,cACA,oCACA,kDACA,wBACA,gBAEA,uDACE,kB;AC9BV,OACE,kBACA,gBAEA,mCACE,mCAGF,0BACE,sBAEA,sDACE,oBACA,qCACA,sCAMF,0HACE,oBAKF,uJACE,2BACA,iB;AC5BN,YACE,kBACA,YACA,aACA,eAEA,+BACE,YACA,aACA,kBACA,gBAGF,2BACE,kBACA,OACA,MACA,kBACA,gBAGF,sBACE,kBACA,MACA,OACA,WACA,YACA,oBAGF,6BACE,YACA,iBACA,eACA,mBACA,qBAGF,kKAGE,a;ACzCJ,eACE,aACA,sBAEA,oBACE,aACA,mBAGF,uBACE,OACA,WACA,eACA,gCACA,kDACA,gBACA,oBAEA,+BACE,WACA,oCACA,UAEA,kBACA,MACA,OACA,QACA,SACA,kDACA,uBACA,yBAGF,6BACE,2CAEA,qCACE,WAIJ,qCACE,cAGF,oCACE,eAGF,yBACE,kBACA,kBACA,eACA,aACA,cAEA,0CACE,iBACA,YACA,cACA,yBAKN,0CACE,6BAGF,yCACE,gBAEA,uDACE,wDAGF,sDACE,yD;AC7EN,eACE,4CACA,uCAEA,aACA,WACA,mBACA,yCACA,6BACA,0BACA,mCACA,6DACA,2DACA,mBACA,gBACA,iBACA,0BACA,mBACA,eACA,4CACA,gEAEA,sCACE,2BAGF,8CACE,WACA,cACA,kBACA,kBACA,gBACA,eACA,eACA,gCACA,yDACA,UACA,oCAEA,gEACE,oBAGF,qEACE,2BAIJ,6BACE,kBACA,YACA,cACA,YACA,gBACA,uBACA,gCACA,uBACA,WACA,gCAEA,UACA,4BAEA,wBAfF,6BAgBI,sBAGF,mCACE,iCAGF,4CACE,UAGF,oCACE,uBACA,kBACA,kBACA,OACA,WACA,kBACA,eACA,cAGF,2CACE,eACA,kDACE,aAIJ,oDACE,cACA,iBACA,cAGF,sKAIE,aAIJ,qBACE,8BAEA,oDACE,UAGF,6BACE,2CAIJ,mHAKE,0CAGF,qDACE,iCAGF,sCACE,sBAGF,sCACE,yBAGF,6OAKE,wBAGF,sCACE,aAGF,8BACE,oBACA,iBACA,0BAGF,0BACE,yBACA,iBAGF,gCACE,oBACA,mBACA,wBACA,8BAEA,wCACE,uBACA,yCACA,oBACA,UACA,gBAEA,+CACE,WACA,qBAGF,gDACE,UAEA,wDACE,UAIJ,0DACE,6BAKN,iCACE,kBAEA,wCACE,WACA,qBACA,YACA,aACA,kBACA,+BACA,2BAIJ,wBACE,eACA,q2B;AClNJ,WACE,aACA,mBACA,WACA,eACA,kBACA,iBAEA,mBACE,6CACA,aACA,mBACA,eACA,mBACA,WACA,eACA,gBACA,6BACA,uDACA,sBACA,gBACA,kCACA,oBACA,0BACA,iBAEA,mFACE,eACA,gBACA,oBAGF,4BACE,aAEA,oCACE,sBACA,iDACA,cACA,eAEA,gDACE,SAKN,0BACE,iCAGF,yBACE,mDAGF,iCACE,cAGF,gCACE,eAIJ,sBACE,mBAGF,8BACE,4CACA,WACA,0CACE,0BAGF,qCACE,kBAEA,iDACE,iC;AC9ER,SACE,aACA,qBACA,sBACA,kBAEA,4CACA,wCACA,gDACA,4DACA,0CACA,mBACA,qCACA,iDACA,+CACA,+BACA,8BACA,kCACA,4HACA,6BACA,4BAEA,0BAtBF,SAuBI,gCAGF,mBACE,yCAGF,sBACE,gEAGF,mDAEE,UACA,iCACA,8CAEA,iGACE,2BAIJ,iBACE,kBACA,SACA,OAEA,yBALF,iBAMI,aACA,eAIJ,yBACE,eACA,kBACA,cACA,iBACA,aACA,mBACA,uBACA,mBACA,UACA,uDACA,qBAEA,iCACE,qBAGF,+BACE,uBACA,qBAGF,8CACE,eAIJ,4CACE,4CAGF,6BACE,WACA,aAGF,uBACE,sBAGF,sBAGE,sBAKE,+DACE,wCAIF,2DACE,oBAMJ,6CACE,+DAKF,sDACE,UAIJ,mBACE,oBAEA,gEACE,eAGF,yBAPF,mBAQI,sBAEA,gEACE,qBAKN,aACE,2BACA,gDACA,4CACA,oDACA,gEACA,8CACA,mBACA,wCACA,yCACA,2CACA,oCACA,0CACA,sCACA,8BACA,4BACA,4CAEA,0BAlBF,aAmBI,mBAGF,oDAEE,0DACA,4DACA,8DAGF,yBA7BF,aA8BI,sBAKF,2EAEE,kDACA,UACA,6DACA,wBAIJ,mBACE,mCAGF,oBACE,qCAEA,8BACE,qCAGF,kCACE,qCAEA,4CACE,qCAKN,6BACE,eAEA,yBAHF,6BAII,iEAIA,+GAEE,6BAIJ,mDACE,WACA,kBACA,aACA,gBACA,WACA,YACA,qCAKA,wIACE,qBAIJ,qDACE,UAKF,6CACE,8BAEA,0DACE,uBAEA,sEACE,8BAON,wDACE,8BAIJ,6HAEE,qDAGF,qIAEE,yDAGF,wCACE,eACA,aAIA,kGACE,yDACA,2BACA,qBAEA,yGACE,+BAMN,eACE,kBAEA,uCACE,kBACA,SACA,UACA,UAKF,iDACE,uCAGF,4DACE,kBACA,YACA,cACA,WAGF,kFACE,iEAIA,wEACE,8BAGF,0GACE,6CAOJ,4FACE,8BAGF,wEACE,2BAMA,oEACE,iBAGF,6EACE,gBACA,oCACA,qCAGF,uFACE,YAIJ,2DACE,gBAEA,mEACE,oBAGF,4EACE,uCACA,wCAOA,wPACE,gBAEA,sQACE,WACA,cACA,eACA,sBACA,gBACA,oCACA,kBASA,kSACE,mCACA,qCAEA,gTACE,mCACA,2CAaV,4OACE,4CAIA,4PACE,yDACA,gDAKN,uDACE,iBAGF,+CACE,qDAIA,2DACE,aACA,yBAEA,4EACE,WAMR,oCACE,kBAEA,4DACE,kBACA,UAIJ,iCACE,kBACA,OACA,cACA,aACA,cACA,sBACA,kBACA,wCAEA,aACA,mBACA,uBAEA,WACA,eAEA,UACA,oBACA,4CAEA,8CACE,kBACA,UACA,SACA,mBAGF,6CACE,uBAIJ,iBACE,mBAIA,wDACE,gCAIA,+EACE,gCAKF,gFACE,6BAOR,sKAME,qDACA,uDACA,2DACA,6DAGF,8BACE,kCAGF,aACE,gBAEA,6BACE,2BAIJ,SACE,wDACA,yDACA,2DACA,4DAGE,sDACE,iEAGF,4DACE,8DACA,iEAGF,sDACE,8DAGF,iCACE,iEAEA,+DACE,+BAMJ,gDACE,kEAGF,sDACE,+DACA,kEAGF,gDACE,+DAGF,2BACE,kEAEA,yDACE,gCACA,6BAQF,wNAEE,+BACA,gCAKF,gLAGE,mBAIJ,+QAIE,4BACA,6BAGF,qEACE,qBAIJ,gCACE,kBACA,SACA,WACA,gCAEA,UACA,4BAEA,wBATF,gCAUI,sBAGF,mHAGE,4CAMF,oGACE,UAIJ,oCACE,WAGF,0CACE,YAGF,wBACE,WACA,UACA,kBAIJ,8CACE,cCrpBF,iBACE,kBACA,2BAEA,yBAJF,iBAKI,gCAEA,uEAEE,gCAIF,kDAbJ,iBAcM,sCACA,yCACE,sCAEF,8BACE,uCAIJ,mCACE,6BAEA,2GAEE,+BAIF,iDATF,mCAUI,mCACA,2DACE,qCAEF,gDACE,uCAMR,qBACE,2BACA,yBAGF,+BACE,SACA,sBACA,mBACA,mBACA,kBACA,uBAGF,mCACE,uBAKA,sGACE,kBACA,YACA,uBACA,YACA,iBACA,8CACA,qBACA,qBAEA,4KACE,kDACA,gBAGF,0KACE,WAGF,0KACE,aAGF,oVAEE,UAGF,0KACE,aAKF,wHACE,WACA,qBACA,sBAKN,+CACE,kBACA,YACA,uBACA,YACA,cACA,8CACA,iBACA,qBACA,oBAEA,kFACE,kDACA,gBAGF,iFACE,WAGF,iFACE,aAGF,kKAEE,UAGF,iFACE,aAKF,4CACE,WACA,cACA,WAGF,kDACE,oBACA,0BACA,oBAEA,iEACE,oBAMJ,4DACE,qCAEA,kEACE,gCAKN,oCACE,yCAEA,gDACE,8CAGF,mDACE,YAIJ,0CACE,mBACA,qBACA,kBAGF,gCACE,mBACA,gBACA,uBACA,yDACA,gBACA,oBACA,0BACA,uBACA,aAEA,6CACE,gBACA,uBAGF,yFACE,eAEA,qGACE,YAIJ,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,kEACE,0BAGF,sCACE,kBAGF,qCACE,qBACA,gBAGF,0CACE,oBAGF,6CACE,OACA,iBACA,iBACA,gBACA,iBACA,mBACA,6CAEA,0DACE,0BAKN,4BACE,iDAGF,iGACE,mCAGF,sCACE,+BAEA,yGACE,WACA,qBACA,iCACA,YAIJ,kDACE,wBAGF,+DACE,qBAGF,kDACE,aAGF,+BACE,gBACA,kBACA,kBACA,eACA,gBACA,0BAEA,uCACE,6BAGF,4CACE,gBAGF,kDACE,eAKF,iEACE,wBAMA,2DACE,yBACA,UACA,8BAKN,0BACE,yBAGE,4CACE,kDAIJ,8CACE,oBAMF,8IAEE,sBACA,uBAIJ,uBACE,yBAEA,4CACE,iBAIJ,uBACE,gBACA,wCAEA,yBAJF,uBAKI,iBAGF,4CACE,kBAIA,8DACE,yBAKN,2CACE,qBACA,cACA,wBACA,kBACA,sBACA,2BAEA,sDACE,wDACA,kBAIJ,yDACE,kDACA,mDACA,4DAGF,mCACE,4BACA,6BAGF,yCACE,6BAEA,uEACE,oBACA,kBACA,YACA,4BACA,8BACA,gBACA,yCACA,4CAEA,oFACE,kBAIJ,sDACE,mBAOJ,0DACE,aACA,uBACA,mBAEA,kFACE,eAEA,wGACE,yBAKN,8DACE,sBAGF,gdAME,oBACA,qBAEA,4vBACE,sBAIJ,oEACE,sBAGF,sTAIE,mBACA,wBAEA,8fACE,yBAKJ,4HAEE,sBAEA,gOACE,sBAIJ,8DACE,aACA,mBACA,uBAEA,oFACE,WACA,mBACA,+CAIJ,gIACE,kBACA,aACA,mBACA,uBACA,WACA,WACA,yBAEA,wJACE,UAGF,4JACE,aACA,mBACA,uBACA,eACA,gBACA,kBACA,2BAGF,4MACE,6BAEA,wPACE,UAKN,8DACE,iBAGF,kEACE,iBAGF,sKAEE,2BACA,WACA,iBACA,kBACA,cACA,aACA,UACA,kBACA,qBACA,qBACA,gEAGF,wGACE,0BACA,oBACA,oBAIJ,8BACE,gBACA,gBACA,aACA,eACA,qBAEA,2CACE,mBACA,wBAEA,uDACE,kBAIJ,uCACE,eAGF,6CACE,aACA,uBACA,2BACA,cAEA,+CACE,gBAGF,8DACE,kBACA,4CAEA,yBAJF,8DAKI,8BAGF,yBARF,8DASI,kBACA,UACA,8BAKN,4CACE,mBAGF,2CACE,cACA,eACA,cAEA,uDACE,MACA,OACA,SACA,QAIJ,qCACE,qBACA,kBAEA,gDACE,wDACA,kBAKF,uDACE,gBACA,4EACA,iEACE,+HAGF,oEACE,iBAKN,2CACE,eACA,iBAEA,0DACE,YAGF,yDACE,gBACA,kBAGF,+DACE,gBAGF,kDACE,WACA,YAIJ,2CACE,eACA,iBACA,gBAEA,wDACE,mBAGF,+DACE,gBAGF,kDACE,WACA,YACA,qBAIJ,2CACE,eACA,mBACA,gBAEA,wDACE,kBAGF,+DACE,gBAGF,kDACE,WACA,YACA,qBAIJ,iDACE,wCACA,0CAGF,2CACE,4CACA,8CAEA,0DACE,mBAEA,2EACE,mBAEA,yBAHF,2EAII,cACA,UACA,gCAOV,mBAmCE,8DACA,+DACA,iEACA,kEArCA,+HAIE,oBAGF,uDACE,kBACA,kBACA,qBAEA,+DACE,WACA,cACA,kBACA,MACA,SACA,YACA,UACA,+BACA,kBAGF,gEACE,6BAEA,wEACE,UACA,aAUN,gCACE,oBACA,gCAIJ,qBACE,qBAGF,kBACE,oCACA,gCACA,sBACA,eACA,qBAEA,2EACE,qCAIJ,mCACE,wBACA,gCACA,qBACA,SACA,gBACA,kBACA,uhB;AC/yBF,kBACE,mEACA,sEAEA,mBACA,oBAEA,0BACE,aAGF,oCACE,iBACA,sCACA,gDACA,2B;ACfJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,kBAEA,0BACE,oBACA,sBACA,mBACA,gCACA,cACA,oBACA,qBACA,WAGF,wBACE,gBACA,gBAGF,8BACE,mBACA,gBAGF,0BACE,mBACA,aACA,YACA,eAEA,qCACE,aACA,Y;ACrCN,sBACE,YACA,aACA,mBACA,uBACA,mBAEA,cACE,mBACA,sBAGF,mBACE,sBACA,gCACA,gBACA,oBACA,qBACA,WACA,+BAEA,gBACE,oBAIJ,eACE,eACA,qBACA,kBACA,uBACA,0BAGF,kBACE,SACA,UACA,gBACA,uBACA,8BAGF,kBACE,kBACA,UACA,gBACA,uBACA,gBACA,yCAEA,WACE,wBACA,C;AClDN,aACE,OACA,WACA,oBAEA,gBACA,kBACA,gBAGA,6C3BJA,+B2BNF,a3BOI,mBAGA,mB2BEF,oCACE,2BAGF,iCACE,sIAGF,wBApBF,aAqBI,gEACA,mBAEA,gCACE,gEACA,uBAIJ,uDA9BF,aA+BI,mEACA,mCACE,kBACA,+CAEA,2EACE,4BAKN,yCACE,aAGF,iCACE,WACA,0CACA,gBACA,cACA,aACA,yBACA,sBACA,6BAEA,wDACE,4BAGF,yBAdF,iCAeI,YACA,wBAEA,UAIJ,yBACE,gBAEA,uCACE,mBAIJ,yDACE,gBAEA,qFACE,uBAEA,yBAHF,qFAII,uBAGF,iHACE,uBAKN,yBACE,+BACE,gBACA,6CACE,sBAEA,uDACE,yEACE,4DAOV,kDAEE,kBAEA,UACA,mBACA,+CAEA,wEACE,qBACA,UAKF,wEACE,eAGF,kEACE,WACA,kBACA,eACA,kBACA,WACA,YACA,gBACA,WAEA,UACA,4CAEA,gHACE,2BAKF,0GACE,kBAKF,4GACE,eAIJ,kFAEE,2BAOA,wWACE,WAEA,wcACE,WAMR,oBACE,WACA,YACA,aACA,mBACA,uBAEA,yBACE,cACA,gBAGF,sCACE,yBACA,0BAEA,wFACE,qBAKN,6GAIE,kBACA,gEAEA,iIACE,qBACA,gCACA,WACA,0DACA,gBACA,iBACA,gBACA,4CACA,sBAEA,0WAEE,yDACA,yDAGF,qLACE,2BACA,kDACA,mDACA,4DAKN,0BACE,gBACA,mBACA,6BACA,oBACA,UACA,4BAEA,iEACE,UAEA,sEACE,oBAIJ,iDACE,gBAGF,sCACE,eAGF,+BACE,oBAIJ,sDACE,gBACA,YAGF,0BACE,gBAGF,kDACE,wBAGF,4CACE,uBAGF,+DAEE,iBACA,oBAIA,yCACE,eAEA,+CACE,0BAKN,yCACE,mBAGF,0BAxSF,aAySI,WACA,+BACA,6CAEA,iCACE,6CAGF,oCACE,gBAGF,qCACE,kEAGF,0NAGE,6CAEA,sRACE,YAKN,yBApUF,aAqUI,6CAEA,gDACE,+BAGF,sCACE,wGAKF,+CACE,QAIF,iCANF,4BAOI,uBACA,sB;AC1VN,kBACE,wBAEA,kBACA,8BACA,WACA,UACA,6BACA,6EACA,oCACA,oBAEA,6CAZF,kBAaI,6CAGF,yCACE,0BAEA,wBAGF,yBAtBF,kBAuBI,YACA,cAEA,uDACE,8CACE,oDAKN,wBACE,aACA,sBACA,mBAEA,gCACE,iDACA,mCAEA,kCACE,kBAIJ,0BAdF,wBAeI,wBAEA,6CAEA,+CACE,2BAGF,gDACE,4DAIJ,yBACE,gCACE,eACA,iBAKN,2BACE,wBACA,UACA,mBAEA,8DACE,2BAIJ,gCACE,iBACA,cACA,iBACA,qBACA,kBACA,mBACA,gBACA,kBAEA,kBACA,YACA,cAEA,8BACA,WAEA,oBAEA,yBAnBF,gCAoBI,YACA,YAIJ,yBACE,2CACE,oG;ACzGJ,yBACE,sBACA,gBACA,iDAGF,0BACE,aACA,sBACA,yBACA,gBACA,cAEA,yBAPF,0BAQI,iBAGF,+BACE,aACA,mBAGF,oCACE,mBAGF,kCACE,OACA,WACA,YACA,qBACA,kDACA,sCACA,mCACA,2BACA,gBACA,oBAEA,wCACE,WACA,wCACA,sCAIJ,0CACE,oB;AC/CN,yBACE,gBACA,wDAEA,mEACE,aAGF,oCACE,oBAGF,gDACE,2BAGF,6BACE,aACA,mBACA,sBACA,qBAGF,qCACE,cACA,2BACA,aACA,gBACA,wBACA,UACA,kBAEA,yBATF,qCAUI,gB;ACjCN,gBACE,gBACA,wDAsBA,qCApBA,uCACE,2BAGF,0DACE,aAGF,2BACE,oBAIF,oBACE,aACA,mBACA,sBACA,qBAKF,yCACE,kBAGF,4BACE,cACA,2BACA,aACA,gBACA,wBACA,UACA,kBAEA,yBATF,4BAUI,gBAIJ,yBACE,YACA,mCACA,gCAEA,iCACE,UACA,cAGF,iDACE,aAGF,gFAEE,OACA,eACA,gBAGF,qCACE,mBACA,uBAGF,2CACE,gBACA,mBACA,uB;ACvEN,UACE,qBAEA,oDACE,kBACA,mBACA,SAEA,uDALF,oDAMI,oCAGF,yBATF,oDAUI,oBAGF,4DACE,eAEA,yBAHF,4DAII,YAIJ,kEACE,UAIJ,wBACE,kBAGF,+BACE,KACE,WACA,mBAGF,GACE,aACA,oBAIJ,kBACE,cACA,kBAEA,+BACE,mCAGF,yBARF,kBASI,eACA,iBAGF,mIAIE,kBAIA,2MAGE,2BAIJ,yBACE,kBACA,UAEA,+DACE,mCAIJ,4BACE,kBACA,UACA,0BAIA,kCACE,iCAGF,qHAGE,0CAKF,0CACE,iCAGF,6HAGE,0CAKF,8CACE,iCAGF,iHAGE,0CAKF,mCACE,iCAGF,oHAGE,0CAIJ,8BACE,kCAIA,8bACE,kCAKN,0BACE,UAGF,wEACE,wDAGF,qCACE,eACA,gBACA,kBAEA,mJAGE,kBAGF,8CACE,uBAGF,iDACE,iCAGF,kGACE,0CAGF,iDACE,kCAIA,yDACE,iCAGF,2HACE,0CAKF,gEACE,iCAGF,uHACE,0CAMR,iBACE,YACA,4BACA,mCACA,4CACA,6BACA,iDACA,kBACA,UAEA,+BACE,kBACA,kBACA,gBACA,eACA,eACA,yBACA,0BAEA,uCACE,6BAIJ,yBAxBF,iBAyBI,iCAIJ,uBACE,aAEA,gCACE,kBACA,uBACA,qBAGF,+BACE,cACA,2BACA,aACA,cACA,SACA,UACA,oBAEA,2DACE,mCAGF,uCACE,kBAGF,yBAjBF,+BAkBI,eACA,gBAEA,uCACE,wBAIJ,4CACE,sCAGA,0GACE,yCAIJ,yDACE,WACA,kBACA,WACA,cACA,8CACA,uBACA,YACA,aACA,kBACA,qCACA,mEACA,yBAZF,yDAaI,UACA,aAKN,oCACE,YACA,gBAGF,wCACE,qBACA,kBACA,mBACA,cACA,0BACA,sGAEA,+CACE,WACA,aACA,cACA,8BACA,sBACA,kBACA,QACA,qBACA,gBACA,mDAGF,yBArBF,wCAsBI,gBACA,sBAKN,wCAEE,kBAEA,oEACE,qIACA,gBACA,kBACA,iFACA,uBACA,mBACA,0CAEA,4LAEE,gHAGF,wFACE,gBACA,kBAIA,4OACE,aAIJ,kGACE,oBAIJ,4JAEE,kBACA,gCACA,oBACA,uBACA,mBACA,mBACA,0CACA,kEACA,YACA,mBACA,gBACA,uBACA,eAGF,gFACE,uBACA,OAGF,8FACE,QAGF,4EACE,oCACA,eACA,qBAEA,8QACE,qCAIJ,sDACE,kBACA,MACA,OACA,UACA,oBACA,YACA,uBACA,mBAIJ,oBACE,YAEA,kCACE,gBACA,kCACA,uBACA,2BACA,2BACA,8BACA,kBACA,iBACA,mBACA,wEACA,qBAUA,6BARA,yBAbF,kCAcI,gBACA,oBACA,iBACA,0EACA,eAKF,yDACE,2BAIJ,8EAEE,kEAEA,yBAJF,8EAKI,qEAKF,mDACE,eACA,gBAMF,+KACE,kBAIJ,2BACE,cACA,eACA,kBACA,iBACA,oBAKF,kCACE,eACA,mBACA,iBAGF,sCACE,gBACA,eAIJ,kBACE,kBACA,0BACA,OACA,WACA,mCACA,4CACA,gBACA,iBAEA,kBACA,gBAGA,iDAEA,UACA,6BACA,wBACA,6EhCpfA,+BgCieF,kBhCheI,mBAGA,mBgCkfF,8BACE,aAGF,uBACE,UACA,wBAGF,2BACE,cAIJ,sCACE,KACE,UAEF,GACE,Y;ACjhBJ,kBACE,kBACA,MACA,OACA,SACA,QACA,gBACA,WACA,+CAEA,yBACE,WACA,kBACA,MACA,OACA,SACA,QACA,+CACA,2BACA,4BACA,sBAEA,4DACE,uEAGF,gDACE,gBAGF,sCACE,yDAEA,yBAHF,sCAII,0DAKN,gEACE,UAGF,0CACE,qDACA,YACA,qBAGF,kDACE,kBAGF,sCACE,gDACE,6BACA,gBACA,mBACA,6BACA,6CAGF,4GACE,kCAKF,sCADF,4GAEI,iCAGF,sCALF,4GAMI,kCAKN,cACE,aACA,uBACA,YACA,kBACA,UACA,YAEA,yBARF,cASI,iBAGF,+BACE,wDAEA,aACA,sBACA,mBACA,WACA,YACA,kBACA,gBAEA,2CACE,WACA,YACA,gBAEA,+CACE,aACA,sBACA,mBAMJ,wCACE,WACA,aACA,4CACA,mCACA,kCACA,kBACA,iDAKF,yCACE,kCACA,kGAEA,iDACE,mCACA,8CAIA,wIACE,2BAKN,+EACE,UACA,4CAEA,6HACE,2BAIJ,gCACE,UACA,mBACA,gHAEA,uDACE,2BAIJ,2EACE,oBAIA,6DACE,SAGF,qDACE,6FACA,yDAEA,6DACE,sCAIJ,2DACE,yBAEA,yBAHF,2DAII,0BAIJ,uGACE,UAGF,4CACE,qBACA,qBAKN,kCACE,oBACA,8CAEA,iEACE,UACA,4CAEA,wFACE,2BAIJ,yDACE,2BAGF,8CACE,kDACA,oBAEA,6EACE,UAKN,oCACE,WACA,0CACA,eACA,kBACA,aACA,qBACA,+BAEA,+BACA,uDAEA,2DACE,2BAGF,0BAhBF,oCAiBI,6CAEA,4DACE,mEAIJ,yBAxBF,oCAyBI,gBAEA,6DACE,wGAIJ,uDACE,sDACE,2CACA,MAEA,4EACE,iCAKN,4CACE,WACA,kBACA,eACA,OACA,QACA,WACA,qJACA,UACA,8BAEA,yBAXF,4CAYI,SACA,WAIJ,uDACE,UAGF,4DACE,qJAMN,oDAGE,sBAEA,yBALF,oDAMI,qBAIJ,6FAKE,WACA,aACA,uBACA,kBAOA,6KACE,8DACA,4CAIJ,uCACE,WACA,aACA,uBACA,kBACA,uBAEA,yDACE,0BACA,yBAEA,qBAEI,2EACE,0BAKN,yBAEI,uJACE,0BAKN,qEACE,+BACA,yBACA,kCACA,iBACA,sBAIJ,uHAEE,cACA,oBACA,+EAEA,2MACE,gBACA,4CAGF,yBAXF,uHAYI,eAIJ,yBApDF,uCAqDI,sBAEA,uDAvDJ,uCAwDM,4DAIJ,oEACE,sB;ACrYJ,aACE,aACA,mBACA,4BACA,uBACA,oBAEA,yBAPF,aAQI,eAGF,2BACE,cAGF,yBACE,OACA,YAEA,6BACE,aACA,mBAIJ,gBACE,gBACA,kBACA,gBACA,qBAGF,oBACE,aACA,iBAGF,0BACE,iBAEA,yBAHF,0BAII,mBAIJ,2BACE,iB;AC5CJ,SACE,YACA,aACA,sBAEA,kBACA,iDANF,SnCOI,mBAGA,mBmCDF,iCACE,oBAEA,gDACE,2BAIJ,kCACE,4BACA,2EACA,8DAEA,0CACE,gBAGF,yDACE,uCACA,oCAGF,4CACE,iBAGA,sDACE,cACA,kBAKN,+BACE,UAIJ,cACE,aACA,8BAEA,uBACE,mCACA,SACA,UAEA,4BACE,oBAEA,iCACE,mBAGF,8BACE,aAKN,0BACE,OAIA,kCACE,YACA,iBACA,aACA,uBACA,uBAEA,2CACE,wBAIJ,kCACE,aACA,qCACA,mBACA,kBAGF,sCACE,gBAEA,kDACE,mBAIJ,kCACE,gBAEA,gHAEE,aAIJ,oEAEE,gBAGE,gHACE,MACA,OACA,aACA,mBACA,uBAGF,gGACE,qBAKN,4EAEE,mBAEA,yBAJF,4EAKI,gBACA,wIACE,U;AC1IV,gBACE,YACA,gBACA,kBAEA,sBACE,YACA,gB;ACPJ,aACE,kBACA,MACA,QACA,gCACA,YACA,uDACA,mCACA,2CACA,8BAEA,6CAEA,oCACE,gBAKA,qFACE,wBAIJ,0BAxBF,aAyBI,8DACA,kBAGF,yBA7BF,aA8BI,YACA,oCAGF,qDAlCF,aAmCI,0CAGF,yBACE,yCACA,gBAGF,4CACE,iBACA,cACA,kBAEA,oDACE,oBAEA,6DACE,0BAIJ,mDACE,aACA,uBACA,mBAEA,sDACE,gBACA,kBACA,iBACA,qBACA,sBAGF,iEACE,mBACA,oBAGF,0DACE,aACA,cACA,uBAIJ,oDACE,kBACA,cAKN,qBACE,kBACA,MACA,OACA,QACA,SACA,8BACA,gBACA,kBACA,oBAEA,0BAXF,qBAYI,gBAGF,+BACE,aAGF,uCACE,kBACA,MACA,QACA,SACA,OACA,WACA,gBACA,UAEA,yBAVF,uCAWI,2CAEA,8DACE,iBAKN,8FACE,mBAIA,yBACE,+DACE,uCAIJ,0DACE,oBACA,+B;AC3IN,MACE,YACA,gBACA,gBAEA,0BALF,MAMI,mBAGF,yBATF,MAUI,mCAGF,yBAbF,MAcI,aACA,+BACA,yBAIJ,uBACE,iCACA,oHACE,yBACA,gBAIJ,YACE,gBACA,WACA,kBACA,YACA,kBAEA,gBACE,YACA,gBAGF,yBAZF,YAaI,mCAGF,yBAhBF,YAiBI,gBAGF,0BApBF,YAqBI,WACA,gBAGF,yBAzBF,YA0BI,eACA,OACA,MACA,kCACA,yBAEA,mCACA,6CAEA,mCACE,gBAGF,mBACE,WACA,cACA,kBACA,OACA,MACA,QACA,SACA,gBACA,sCACA,2CACA,UAEA,0CACE,gBAIF,mCACE,aAGF,wDACE,cAIJ,2CACE,+BAEA,kDACE,UACA,oBAIJ,6CACE,gBAEA,mDACE,iBAKN,yBApFF,YAqFI,eACA,uBACA,mCAEA,2CAzFJ,YA0FM,0CACA,gDAMJ,yBADF,aAEI,yCAGF,8CACE,gBAEA,gEACE,gBAKN,mDACE,gBAGF,cACE,2CAEA,yBAHF,cAII,eACA,eACA,OACA,MACA,SACA,QAEA,+BACA,6CAEA,qCACE,gBAGF,6CACE,sCAIJ,yBAvBF,cAwBI,iBAEA,6CACE,mCAGF,sCACE,oCAIJ,+CACE,gBAEA,qDACE,gBAKN,kCACE,sCAEA,6IACE,6EAIA,gFACE,aAKF,+EACE,kCACA,UAKF,uEACE,+BACA,UAKF,8EACE,aAKF,6EACE,kCACA,UAKF,wEACE,+BACA,U","sources":["webpack://telegram-t/./src/components/left/main/LeftMainHeader.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/left/ConnectionState.scss","webpack://telegram-t/./src/components/left/NewChatButton.scss","webpack://telegram-t/./src/components/left/main/LeftMain.scss","webpack://telegram-t/./src/components/left/LeftColumn.scss","webpack://telegram-t/./src/components/middle/AudioPlayer.scss","webpack://telegram-t/./src/components/calls/group/GroupCallTopPane.scss","webpack://telegram-t/./src/components/middle/MiddleHeader.scss","webpack://telegram-t/./src/components/common/EmbeddedMessage.scss","webpack://telegram-t/./src/components/middle/message/ReactionAnimatedEmoji.scss","webpack://telegram-t/./src/components/middle/message/MessageMeta.scss","webpack://telegram-t/./src/components/middle/message/Sticker.scss","webpack://telegram-t/./src/components/middle/message/Contact.scss","webpack://telegram-t/./src/components/middle/message/PollOption.scss","webpack://telegram-t/./src/components/middle/message/Poll.scss","webpack://telegram-t/./src/components/middle/message/WebPage.scss","webpack://telegram-t/./src/components/middle/message/Invoice.scss","webpack://telegram-t/./src/components/middle/message/Album.scss","webpack://telegram-t/./src/components/middle/message/RoundVideo.scss","webpack://telegram-t/./src/components/middle/message/InlineButtons.scss","webpack://telegram-t/./src/components/middle/message/CommentButton.scss","webpack://telegram-t/./src/components/middle/message/Reactions.scss","webpack://telegram-t/./src/components/middle/message/Message.scss","webpack://telegram-t/./src/components/middle/message/_message-content.scss","webpack://telegram-t/./src/components/middle/message/SponsoredMessage.scss","webpack://telegram-t/./src/components/middle/ContactGreeting.scss","webpack://telegram-t/./src/components/middle/NoMessages.scss","webpack://telegram-t/./src/components/middle/MessageList.scss","webpack://telegram-t/./src/components/middle/ScrollDownButton.scss","webpack://telegram-t/./src/components/middle/composer/BotKeyboardMenu.scss","webpack://telegram-t/./src/components/middle/composer/ComposerEmbeddedMessage.scss","webpack://telegram-t/./src/components/middle/composer/WebPagePreview.scss","webpack://telegram-t/./src/components/middle/composer/Composer.scss","webpack://telegram-t/./src/components/middle/MiddleColumn.scss","webpack://telegram-t/./src/components/right/RightHeader.scss","webpack://telegram-t/./src/components/right/Profile.scss","webpack://telegram-t/./src/components/right/AddChatMembers.scss","webpack://telegram-t/./src/components/right/RightColumn.scss","webpack://telegram-t/./src/components/main/Main.scss"],"sourcesContent":["@import '../../../styles/mixins';\n\n#LeftMainHeader {\n position: relative;\n\n .animated-menu-icon {\n position: absolute;\n\n &, &::before, &::after {\n width: 1.125rem;\n height: 0.125rem;\n border-radius: 0.125rem;\n background-color: var(--color-text-secondary);\n transition: transform .25s;\n transform: rotate(0);\n }\n\n &::before, &::after {\n position: absolute;\n left: 0;\n content: '';\n }\n\n &::before {\n top: -0.3125rem;\n }\n\n &::after {\n top: 0.3125rem;\n }\n\n &.state-back {\n transform: rotate(180deg);\n\n &::before {\n transform: rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem);\n }\n\n &::after {\n transform: rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem);\n }\n }\n\n &.no-animation {\n transition: none;\n\n &::before, &::after {\n transition: none;\n }\n }\n }\n\n .archived-badge {\n min-width: 1.5rem;\n height: 1.5rem;\n margin-left: auto;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .45rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.5rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n }\n\n [dir=rtl] .archived-badge {\n margin-left: 0;\n margin-right: auto;\n }\n\n .Menu .bubble {\n min-width: 17rem;\n max-height: calc(100 * var(--vh) - 3.75rem);\n\n overflow-y: auto;\n @include overflow-y-overlay();\n }\n\n // @optimization\n @include while-transition() {\n .Menu .bubble {\n transition: none !important;\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","#ConnectionState {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n margin: 0 0.5rem 0.5rem;\n padding: 0.75rem;\n background: var(--color-yellow);\n border-radius: var(--border-radius-default);\n\n > .Spinner {\n --spinner-size: 1.75rem;\n }\n\n > .state-text {\n color: var(--color-text-lighter);\n font-weight: 500;\n line-height: 2rem;\n margin-inline-start: 1.875rem;\n white-space: nowrap;\n }\n\n @media (max-width: 950px) {\n > .state-text {\n margin-inline-start: 1.25rem;\n }\n }\n}\n",".NewChatButton {\n position: absolute;\n right: 1rem;\n bottom: 1rem;\n transform: translateY(5rem);\n\n transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n body.animation-level-0 & {\n transform: none !important;\n opacity: 0;\n\n transition: opacity .15s;\n\n &.revealed {\n opacity: 1;\n }\n }\n\n &.revealed {\n transform: translateY(0);\n\n @media (max-width: 600px) {\n // Force rendering in the composite layer to fix the z-index rendering issue\n transform: translate3d(0,0,10px);\n transform-style: preserve-3d;\n }\n }\n\n &.menu-is-open {\n &::before {\n content: '';\n display: block;\n position: absolute;\n top: -13rem;\n left: -11rem;\n right: -1rem;\n bottom: -1rem;\n z-index: -1;\n }\n }\n\n .is-touch-env & {\n .Menu > .backdrop {\n position: absolute;\n left: -100vw;\n right: -100vw;\n top: -100vh;\n bottom: -100vh;\n }\n }\n\n > .Button {\n .icon-new-chat-filled,\n .icon-close {\n position: absolute;\n }\n\n &:not(.active) {\n .icon-new-chat-filled {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-close {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.active {\n .icon-close {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-new-chat-filled {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n }\n}\n","#LeftColumn-main {\n height: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n z-index: 1;\n\n .connection-state-wrapper {\n position: absolute;\n top: 3.75rem;\n width: 100%;\n }\n\n > .Transition {\n flex: 1;\n overflow: hidden;\n transition: transform 300ms ease;\n\n &.pull-down {\n transform: translateY(3.75rem);\n }\n }\n\n .ChatFolders {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .tabs-placeholder {\n height: 2.625rem;\n transition: height 150ms ease;\n\n &:not(.open) {\n height: 0;\n }\n }\n\n .TabList {\n justify-content: flex-start;\n padding-left: .5625rem;\n padding-bottom: 1px;\n border-bottom: 0;\n z-index: 1;\n }\n\n .Tab {\n flex: 0 0 auto;\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n\n > span {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n }\n }\n\n > .Transition {\n flex: 1;\n overflow: hidden;\n }\n }\n\n .RecentContacts, .LeftSearch, .search-content {\n height: 100%;\n overflow-y: auto;\n }\n\n .btn-update {\n position: absolute;\n bottom: 1rem;\n left: 1rem;\n right: 1rem;\n margin: 0 auto;\n }\n}\n","#NewChat {\n height: 100%;\n}\n\n.left-header {\n height: var(--header-height);\n padding: 0.375rem 1rem .5rem 0.8125rem;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n background-color: var(--color-background);\n\n h3 {\n margin-bottom: 0;\n font-size: 1.25rem;\n font-weight: 500;\n margin-left: 1.375rem;\n margin-right: auto;\n }\n\n .SearchInput {\n margin-left: 0.875rem;\n max-width: calc(100% - 3.25rem);\n\n @media (max-width: 600px) {\n max-width: calc(100% - 3rem);\n }\n }\n\n @media (max-width: 600px) {\n padding: 0.5rem;\n }\n\n .Button.smaller {\n width: 2.5rem;\n height: 2.5rem;\n\n + .DropdownMenu {\n margin-left: .25rem;\n }\n }\n}\n",".AudioPlayer {\n display: flex;\n margin-left: auto;\n margin-top: -.25rem;\n margin-bottom: -.25rem;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n > .Button {\n flex-shrink: 0;\n margin: .125rem;\n }\n\n > .player-button {\n --color-text-secondary: var(--color-primary);\n --color-text-secondary-rgb: var(--color-primary-shade-rgb);\n --color-primary-shade: var(--color-green);\n --color-white: var(--color-background-own);\n }\n\n .player-button {\n &.smaller {\n width: 3rem;\n height: 3rem;\n\n i {\n font-size: 1.625rem;\n margin-top: -.025rem;\n }\n }\n\n i {\n position: absolute;\n font-size: 1.9375rem;\n margin-top: -.05rem;\n\n &.icon-play {\n margin-left: .1rem;\n }\n }\n\n .icon-play, .icon-pause {\n opacity: 1;\n transform: scale(1);\n transition: opacity .4s, transform .6s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n &.play .icon-pause,\n &.pause .icon-play,\n &.loading .icon-play,\n &.loading .icon-pause {\n opacity: 0;\n transform: scale(.5);\n }\n }\n\n .volume-button {\n position: relative;\n overflow: visible;\n\n .volume-slider-spacer {\n position: absolute;\n transform: translateY(100%);\n bottom: 0;\n height: 1rem;\n width: 8rem;\n cursor: default;\n visibility: hidden;\n }\n\n &:hover .volume-slider-spacer, .volume-slider-spacer:hover {\n visibility: visible;\n }\n\n .volume-slider {\n opacity: 0;\n visibility: hidden;\n\n position: absolute;\n background: var(--color-background);\n bottom: -1rem;\n transform: translateY(100%);\n transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out;\n width: 8rem;\n padding: 0.75rem;\n border-radius: 0.5rem;\n cursor: default;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n .RangeSlider {\n margin-bottom: 0;\n input[type=range] {\n margin-bottom: 0;\n }\n }\n }\n\n &:hover .volume-slider,\n .volume-slider:hover,\n .volume-slider-spacer:hover + .volume-slider {\n opacity: 1;\n visibility: visible;\n }\n }\n\n .playback-button {\n &.applied {\n --color-text-secondary: var(--color-primary);\n }\n\n .playback-button-inner {\n transition: 0.2s color ease-in-out;\n font-size: 0.75rem;\n font-weight: bold;\n border: 2px solid;\n border-radius: 0.375rem;\n padding: 0.15rem 0.25rem;\n font-variant-numeric: tabular-nums;\n }\n }\n\n &-content {\n display: flex;\n justify-content: center;\n flex-direction: column;\n flex-shrink: 1;\n padding: 0 .5rem;\n position: relative;\n overflow: hidden;\n cursor: pointer;\n border-radius: var(--border-radius-messages-small);\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n }\n\n @media (min-width: 1440px) and (max-width: 1500px) {\n max-width: 14rem;\n }\n\n .AudioPlayer & .title {\n display: block;\n font-weight: 500;\n font-size: 0.875rem !important;\n line-height: 1rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n body.is-ios & {\n font-size: .9375rem !important;\n line-height: 1.125rem;\n }\n }\n\n .subtitle {\n font-size: 0.85rem !important;\n color: var(--color-text-secondary);\n line-height: 0.85rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: .125rem 0 0;\n\n body.is-ios & {\n font-size: .9375rem !important;\n line-height: 1.125rem;\n }\n }\n }\n}\n",".GroupCallTopPane {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n height: 2.875rem;\n overflow: hidden;\n box-shadow: 0 2px 2px var(--color-light-shadow);\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 0.375rem 0.5rem 0.375rem 0.75rem;\n background: var(--color-background);\n z-index: -1;\n cursor: pointer;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n top: -.1875rem;\n left: 0;\n right: 0;\n height: .125rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n }\n\n &.is-hidden {\n display: none;\n }\n\n @media (max-width: 600px) {\n &.has-pinned-offset {\n top: calc(100% + 2.875rem);\n }\n }\n\n .info {\n display: flex;\n flex-direction: column;\n\n .title {\n font-size: 0.875rem;\n color: var(--color-text);\n }\n\n .participants {\n font-size: 0.75rem;\n color: var(--color-text-secondary);\n }\n }\n\n .avatars {\n display: flex;\n flex-direction: row;\n align-items: center;\n\n .Avatar {\n margin: 0 0 0 -0.75rem;\n\n &:first-child {\n width: 2rem;\n height: 2rem;\n }\n\n &:not(:first-child) {\n width: 2.25rem;\n height: 2.25rem;\n border: 0.125rem solid var(--color-background);\n }\n }\n }\n\n .join {\n height: 1.5rem;\n border-radius: 1.5rem;\n font-weight: 500;\n padding: 1rem 1rem;\n width: auto;\n }\n}\n\n\n@media (min-width: 1440px) {\n #Main.right-column-open .MiddleHeader .GroupCallTopPane {\n width: calc(100% - var(--right-column-width));\n }\n}\n","@import '../../styles/mixins';\n\n@mixin mobile-header-styles() {\n .HeaderPinnedMessage-wrapper,\n .AudioPlayer {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n height: 2.875rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n\n display: flex;\n flex-direction: row-reverse;\n padding: 0.375rem 0.5rem;\n padding-left: 0.75rem;\n background: var(--color-background);\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n top: -.1875rem;\n left: 0;\n right: 0;\n height: .125rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n }\n\n .HeaderPinnedMessage {\n max-width: unset;\n margin-top: -0.1875rem;\n }\n\n @supports (padding-left: env(safe-area-inset-left)) {\n padding-left: #{\"max(0.75rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(0.5rem, env(safe-area-inset-right))\"};\n }\n }\n\n .AudioPlayer {\n flex-direction: row;\n margin-top: 0;\n padding: 0.25rem 0.5rem;\n\n &-content {\n padding: 0 0.5rem;\n flex-grow: 1\n }\n\n > .Button {\n margin: -.0625rem 0 0;\n }\n\n > .player-close {\n margin-left: auto;\n }\n }\n\n .HeaderPinnedMessage {\n flex-grow: 1;\n padding-top: 0;\n padding-bottom: 0;\n\n &::before {\n top: 0.125rem;\n bottom: 0.125rem;\n }\n\n .message-text {\n max-width: none;\n }\n }\n\n .HeaderPinnedMessage-wrapper.full-width {\n display: none;\n }\n}\n\n.MiddleHeader {\n display: flex;\n align-items: center;\n width: 100%;\n box-shadow: 0 2px 2px var(--color-light-shadow);\n background: var(--color-background);\n padding: .5rem .8125rem .5rem 1.5rem;\n position: relative;\n z-index: var(--z-middle-header);\n\n @supports (padding-left: env(safe-area-inset-left)) {\n padding-left: #{\"max(1.5rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(.8125rem, env(safe-area-inset-right))\"};\n }\n\n @media (max-width: 600px) {\n padding: 0.5rem;\n position: relative;\n\n @supports (padding-left: env(safe-area-inset-left)) {\n padding-left: #{\"max(.5rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(.5rem, env(safe-area-inset-right))\"};\n }\n }\n\n .Transition {\n width: 100%;\n // https://dfmcphee.com/flex-items-and-min-width-0/\n // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size\n min-width: 0;\n\n > div {\n display: flex;\n align-items: center;\n width: 100%;\n }\n }\n\n .back-button {\n margin-left: -0.5rem;\n margin-right: 0.5rem;\n position: relative;\n\n @media (max-width: 600px) {\n margin-left: 0;\n }\n\n .unread-count {\n min-width: 1.25rem;\n height: 1.25rem;\n padding: 0 0.375rem;\n border-radius: 0.625rem;\n font-size: 0.75rem;\n line-height: 1.25rem;\n font-weight: 500;\n text-align: center;\n\n position: absolute;\n top: -0.25rem;\n right: -0.5rem;\n\n background: var(--color-gray);\n color: white;\n pointer-events: none;\n\n &.active {\n background: var(--color-primary);\n }\n }\n }\n\n .chat-info-wrapper {\n flex-grow: 1;\n overflow: hidden;\n }\n\n body.animation-level-0 & .HeaderPinnedMessage-wrapper {\n transition: none !important;\n }\n\n .header-tools {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n margin-left: auto;\n flex-shrink: 0;\n\n body.animation-level-0 & {\n &,\n .AudioPlayer,\n .HeaderActions {\n transition: none !important;\n }\n }\n\n @media (min-width: 1276px) and (max-width: 1439px) {\n .HeaderActions {\n transform: translate3d(0, 0, 0);\n transition: transform var(--layer-transition);\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) * -1), 0, 0);\n }\n }\n }\n\n @media (min-width: 1440px) {\n transform: translate3d(0, 0, 0);\n transition: transform var(--layer-transition);\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) * -1), 0, 0);\n }\n }\n\n // @optimization\n @include while-transition() {\n pointer-events: none;\n }\n }\n\n @media (min-width: 1276px) and (max-width: 1439px) {\n &:not(.tools-stacked) .HeaderPinnedMessage-wrapper,\n &:not(.tools-stacked) .AudioPlayer {\n opacity: 1;\n\n #Main.right-column-open & {\n opacity: 0;\n }\n }\n }\n\n &.tools-stacked .AudioPlayer {\n @include mobile-header-styles();\n\n @media (min-width: 1150px) {\n #Main.right-column-open & {\n padding-right: calc(0.5rem + var(--right-column-width));\n }\n }\n }\n\n &.tools-stacked.animated .HeaderPinnedMessage-wrapper,\n &.tools-stacked.animated .AudioPlayer {\n animation: fade-in var(--layer-transition) forwards;\n\n body.animation-level-0 & {\n animation: none;\n }\n }\n\n h3 {\n font-weight: 500;\n font-size: 1.125rem;\n line-height: 1.375rem;\n white-space: pre;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n unicode-bidi: plaintext;\n\n body.is-ios &,\n body.is-macos & {\n font-size: 1.0625rem;\n font-weight: 600;\n }\n\n @media (max-width: 600px) {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n @media (min-width: 1275px) {\n #Main.right-column-open & {\n max-width: calc(100% - var(--right-column-width));\n }\n }\n }\n\n .ChatInfo {\n cursor: pointer;\n display: flex;\n align-items: center;\n\n .info {\n display: flex;\n flex-direction: column;\n justify-content: center;\n flex-grow: 1;\n overflow: hidden;\n }\n\n .title {\n display: flex;\n align-items: center;\n\n .VerifiedIcon {\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 0.25rem;\n margin-top: 0.05rem;\n }\n }\n\n .status {\n display: flex;\n unicode-bidi: plaintext;\n }\n\n .user-status {\n unicode-bidi: plaintext;\n overflow: hidden;\n text-overflow: ellipsis;\n\n @media (min-width: 1275px) {\n #Main.right-column-open & {\n max-width: calc(100% - var(--right-column-width));\n }\n }\n }\n }\n\n .Avatar {\n margin-right: .625rem;\n // TODO For some reason webpack imports `Audio.scss` second time when loading calls bundle\n width: 2.5rem !important;\n height: 2.5rem !important;\n font-size: 1.0625rem;\n }\n\n .status, .typing-status {\n font-size: 0.875rem;\n line-height: 1.125rem;\n margin: 0;\n color: var(--color-text-secondary);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: inline-block;\n\n .ellipsis {\n display: inline-flex;\n }\n\n &.online {\n color: var(--color-primary);\n }\n\n .font-emoji {\n line-height: 1rem;\n }\n }\n\n .Button.smaller {\n width: 2.5rem;\n height: 2.5rem;\n }\n\n .HeaderPinnedMessage-wrapper {\n display: flex;\n align-items: center;\n margin-left: auto;\n cursor: default;\n flex-direction: row-reverse;\n background: var(--color-background);\n\n body.animation-level-1 & {\n .ripple-container {\n display: none;\n }\n }\n\n @media (min-width: 1276px) {\n transform: translate3d(0, 0, 0);\n transition: opacity 0.15s ease, transform var(--layer-transition);\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) * -1), 0, 0);\n }\n }\n\n\n .HeaderPinnedMessage {\n min-width: 16rem;\n }\n\n > .Button {\n flex-shrink: 0;\n }\n\n &.full-width {\n position: absolute;\n left: 0;\n right: 0;\n top: 100%;\n background: var(--color-background);\n padding: .25rem .8125rem .25rem 1rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n transform: translate3d(0, 0, 0);\n transition: opacity 0.15s ease, transform var(--layer-transition);\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n top: -.1875rem;\n left: 0;\n right: 0;\n height: .125rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n }\n\n .HeaderPinnedMessage {\n margin-top: 0;\n margin-bottom: 0;\n flex: 1;\n\n .message-text {\n max-width: none;\n }\n }\n\n @media (min-width: 1276px) {\n transform: translate3d(0, 0, 0);\n transition: opacity 0.15s ease, transform var(--layer-transition);\n\n #Main.right-column-open & {\n padding-left: calc(var(--right-column-width) + 1rem);\n }\n }\n }\n }\n\n .HeaderPinnedMessage {\n display: flex;\n flex-shrink: 1;\n margin-top: -0.25rem;\n margin-bottom: -0.25rem;\n padding: 0.25rem;\n padding-left: 0.375rem;\n border-radius: var(--border-radius-messages-small);\n position: relative;\n overflow: hidden;\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n }\n\n .pinned-message-border {\n position: relative;\n height: 2.25rem;\n margin: 0.125rem 0;\n width: 0.125rem;\n min-width: 0.125rem;\n overflow: hidden;\n\n .pinned-message-border-wrapper-1 {\n height: 2.25rem;\n width: 0.125rem;\n border-radius: 0.0625rem;\n background: var(--color-primary);\n }\n\n .pinned-message-border-wrapper {\n background-color: var(--color-primary-opacity);\n position: relative;\n will-change: transform;\n transition: transform .25s ease-in-out;\n }\n\n .pinned-message-border-mark {\n position: absolute;\n left: 0;\n top: 0;\n width: 0.125rem;\n background: var(--color-primary);\n border-radius: 0.0625rem;\n will-change: transform;\n transition: transform .25s ease-in-out;\n }\n }\n\n .message-text {\n overflow: hidden;\n margin-inline-start: 0.375rem;\n margin-top: 0.125rem;\n max-width: 15rem;\n\n @media (min-width: 1440px) and (max-width: 1500px) {\n max-width: 14rem;\n }\n\n .title {\n font-weight: 500;\n font-size: 0.875rem;\n line-height: 1rem;\n height: 1rem;\n color: var(--color-primary);\n margin-bottom: 0.125rem;\n white-space: pre;\n text-align: initial;\n\n body.is-ios & {\n font-size: .9375rem;\n }\n }\n\n p {\n font-size: 0.875rem;\n line-height: 1.125rem;\n height: 1.125rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n\n body.is-ios & {\n font-size: .9375rem;\n }\n }\n }\n\n .emoji-small {\n width: 1rem;\n height: 1rem;\n }\n\n & > img {\n width: 2.25rem;\n height: 2.25rem;\n object-fit: cover;\n border-radius: 0.25rem;\n margin-inline-start: 0.375rem;\n margin-top: 0.125rem;\n flex-shrink: 0;\n\n & + .message-text {\n max-width: 12rem;\n }\n }\n }\n\n .HeaderActions {\n flex-shrink: 0;\n margin-left: auto;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n .toggle-right-pane-button {\n &.active {\n color: var(--color-primary);\n opacity: 1;\n }\n }\n }\n\n .HeaderPinnedMessage-wrapper, .HeaderActions {\n .Button {\n margin-left: 0.25rem;\n\n &.tiny {\n margin-right: .625rem;\n }\n }\n }\n\n @media (max-width: 600px) {\n @include mobile-header-styles();\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n",".EmbeddedMessage {\n display: flex;\n align-items: center;\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n line-height: 1.125rem;\n margin: 0 -0.25rem .0625rem;\n padding: .1875rem 0.25rem .1875rem .4375rem;\n border-radius: var(--border-radius-messages-small);\n position: relative;\n overflow: hidden;\n cursor: pointer;\n direction: ltr;\n\n body.animation-level-1 & {\n .ripple-container {\n display: none;\n }\n }\n\n .custom-shape & {\n max-width: 15rem;\n padding: 0.5rem;\n margin: 0;\n background-color: var(--background-color);\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n &::before {\n left: .625rem;\n top: .625rem;\n bottom: .625rem;\n }\n\n img:not(.emoji) {\n margin-inline-start: .5rem;\n }\n\n &:dir(rtl) {\n padding: 0.5rem;\n }\n }\n\n &::before {\n content: '';\n display: block;\n position: absolute;\n top: .3125rem;\n bottom: .3125rem;\n left: .3125rem;\n width: 2px;\n background: var(--accent-color);\n border-radius: 2px;\n }\n\n &:hover {\n background-color: var(--hover-color);\n }\n\n &:active {\n background-color: var(--active-color);\n }\n\n .message-title {\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n }\n\n .message-text {\n overflow: hidden;\n margin-inline-start: 0.5rem;\n display: flex;\n flex-direction: column-reverse;\n\n .message-title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 0.125rem;\n flex: 1;\n display: block;\n }\n\n p {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n height: 1.125rem;\n margin-bottom: 0;\n flex: 1;\n\n &::after {\n content: none;\n display: none;\n }\n }\n\n .emoji {\n width: calc(1.125 * var(--message-text-size, 1rem)) !important;\n height: calc(1.125 * var(--message-text-size, 1rem)) !important;\n vertical-align: text-bottom !important;\n }\n }\n\n .embedded-action-message {\n color: var(--accent-color);\n opacity: 0.75;\n }\n\n img:not(.emoji) {\n width: 2rem;\n height: 2rem;\n object-fit: cover;\n border-radius: .25rem;\n margin-left: .25rem;\n flex-shrink: 0;\n\n &.round {\n border-radius: 1rem;\n }\n }\n\n &.inside-input {\n padding-inline-start: 0.5625rem;\n margin: 0 0 -.125rem -0.1875rem;\n display: grid;\n grid-template-columns: auto 1fr;\n grid-template-rows: 1fr;\n width: 100%;\n --accent-color: var(--color-primary);\n --hover-color: var(--color-interactive-element-hover);\n\n &::before {\n bottom: .3125rem;\n }\n\n img:not(.emoji) {\n margin-left: .125rem;\n }\n\n .message-text {\n margin-inline-start: .375rem;\n }\n\n .message-title {\n font-weight: 500;\n color: var(--accent-color);\n }\n }\n}\n",".ReactionAnimatedEmoji {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &.is-animating {\n // Fix for redundant scroll on iOS\n transform: translateZ(0);\n // Fix for redundant scroll in Firefox\n contain: layout;\n }\n\n .AnimatedSticker {\n position: fixed;\n top: -0.375rem;\n left: -0.375rem;\n pointer-events: none;\n\n &.effect {\n top: -2.5rem;\n left: -2.5rem;\n }\n\n &:not(.open) {\n opacity: 1 !important;\n }\n\n &.closing {\n opacity: 0 !important;\n }\n }\n\n &.in-meta {\n .AnimatedSticker {\n top: -0.4375rem;\n left: -0.4375rem;\n\n &.effect {\n top: -2.5625rem;\n left: -2.5625rem;\n }\n\n // Fix for weird positioning in Chrome\n canvas {\n position: absolute;\n }\n }\n }\n}\n",".MessageMeta {\n position: absolute;\n height: 1.25rem;\n bottom: 0;\n right: 0;\n display: flex;\n align-items: center;\n background: rgba(#999999, 0.6);\n border-radius: .625rem;\n padding: 0 .25rem;\n color: white;\n cursor: pointer;\n max-width: 100%;\n user-select: none;\n\n .ReactionAnimatedEmoji {\n width: 1rem;\n height: 1rem;\n margin-right: 0.25rem;\n }\n\n .message-time,\n .message-signature,\n .message-views {\n font-size: .75rem;\n white-space: nowrap;\n }\n\n .message-time {\n margin-right: .1875rem;\n }\n\n body.is-ios & {\n .message-time {\n margin-right: .25rem;\n }\n }\n\n .message-views {\n margin-inline-start: .1875rem;\n }\n\n .message-signature {\n overflow: hidden;\n text-overflow: ellipsis;\n margin-right: 0.375rem;\n }\n\n .icon-channelviews {\n margin-left: 0.125rem;\n margin-right: 0.375rem;\n font-size: 1.125rem;\n position: relative;\n top: -0.0625rem;\n }\n\n .has-solid-background & {\n color: rgba(var(--color-text-meta-rgb), 0.75);\n background: none;\n }\n\n .media:not(.text) &,\n .Message .custom-shape & {\n background: rgba(0, 0, 0, 0.2);\n --color-accent-own: white;\n --color-accent: white;\n color: white !important;\n opacity: 1;\n bottom: .25rem;\n right: .25rem;\n left: auto;\n height: 1.125rem;\n padding: 0 .3125rem 0 .375rem;\n\n .MessageOutgoingStatus i {\n background: transparent;\n }\n }\n\n .media:not(.text):dir(rtl) &,\n .Message .custom-shape:dir(rtl) & {\n right: auto !important;\n left: .25rem;\n padding: 0 .375rem 0 .3125rem;\n }\n\n .is-forwarded.media:not(.text):dir(rtl) &,\n .Message .is-forwarded.custom-shape:dir(rtl) & {\n left: .8125rem;\n }\n\n .is-forwarded.media:not(.text) & {\n bottom: 0.935rem;\n right: 0.8125rem;\n }\n\n .emoji-only & {\n right: 0;\n }\n\n .Message.own .has-solid-background & {\n color: var(--color-message-meta-own);\n }\n\n .MessageOutgoingStatus {\n margin-left: -.1875rem;\n font-size: 1.1875rem;\n border-radius: .625rem;\n\n .Message.own & {\n color: var(--color-accent-own);\n }\n }\n\n .message-content.has-replies:not(.custom-shape) & {\n bottom: 3.375rem;\n }\n\n .message-content.has-replies.text:not(.custom-shape) & {\n bottom: 3.4375rem;\n }\n\n &[dir=\"rtl\"] {\n .message-views {\n order: 10;\n }\n .icon-channelviews {\n order: 9;\n }\n }\n}\n\n.Message:not(.own) {\n .custom-shape .reply-message + .MessageMeta {\n right: auto;\n left: 13.2rem;\n bottom: 0.25rem;\n }\n\n .emoji-only-1 .reply-message + .MessageMeta {\n left: 2.5rem;\n }\n\n .emoji-only-2 .reply-message + .MessageMeta {\n left: 5.5rem;\n }\n\n .emoji-only-3 .reply-message + .MessageMeta {\n left: 6.5rem;\n }\n}\n",".Sticker {\n &:not(.inactive) {\n cursor: pointer;\n }\n\n &.inactive {\n pointer-events: none;\n }\n}\n",".Contact {\n display: flex;\n align-items: center;\n padding: 0.25rem;\n\n &.interactive {\n cursor: pointer;\n }\n\n .Avatar {\n margin-right: 0.8rem;\n }\n\n .contact-info {\n padding: 0.5rem;\n padding-left: 0;\n white-space: nowrap;\n overflow: hidden;\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 line-height: 1rem;\n color: var(--secondary-color);\n }\n }\n}\n\n\n",".PollOption {\n display: flex;\n flex-flow: row nowrap;\n margin-bottom: 0.75rem;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .poll-option-text {\n word-break: break-word;\n }\n\n .poll-option-share {\n position: relative;\n margin-top: .125rem;\n width: 1.75rem;\n margin-inline-end: .5rem;\n flex-shrink: 0;\n font-weight: 500;\n font-size: .875rem;\n text-align: right;\n\n &.limit-width {\n display: inline-flex;\n justify-content: center;\n font-size: .75rem;\n }\n }\n\n .poll-option-chosen {\n position: absolute;\n right: 0;\n bottom: -5px;\n width: 1rem;\n height: 1rem;\n background: var(--accent-color);\n color: var(--background-color);\n border-radius: .5rem;\n font-size: .75rem;\n text-align: center;\n\n &.wrong {\n background: var(--color-error);\n }\n\n .is-forwarded & > i {\n margin-left: 1px;\n }\n\n &.animate {\n opacity: 0;\n animation-name: PollOptionIconAnimate;\n animation-delay: .09s;\n animation-duration: .3s;\n animation-fill-mode: forwards;\n }\n }\n\n .poll-option-right {\n flex-grow: 1;\n line-height: 1.5rem;\n }\n\n .poll-option-answer {\n position: relative;\n }\n\n .poll-option-line {\n position: relative;\n width: 0;\n height: 0.25rem;\n min-width: 0.5rem;\n border-radius: 0.125rem;\n margin-top: 0.5rem;\n background: var(--accent-color);\n\n transform-origin: 0 0;\n transition: transform .3s;\n transition-delay: .09s;\n\n }\n\n .poll-line {\n width: 30px;\n height: 35px;\n position: absolute;\n left: -27px;\n bottom: -5px;\n transition: stroke-dashoffset .3s, stroke-dasharray .3s;\n stroke-dashoffset: 0;\n stroke-dasharray: 0, 200%\n }\n\n .poll-line path {\n stroke-width: 4px;\n stroke-linecap: round;\n stroke: var(--accent-color);\n fill:none\n }\n\n .wrong {\n .poll-option-line {\n background: var(--color-error);\n }\n\n .poll-line path {\n stroke: var(--color-error);\n }\n }\n}\n\n@keyframes PollOptionIconAnimate {\n 0% { opacity: 0 }\n 100% { opacity: 1 }\n}\n",".Poll {\n min-width: 15rem;\n text-align: initial;\n\n @media (max-width: 600px) {\n min-width: 50vw;\n }\n\n .poll-question {\n font-weight: 500;\n line-height: 1.25rem;\n margin: 0.125rem 0;\n word-break: break-word;\n }\n\n .poll-type,\n .poll-voters-count {\n color: var(--secondary-color);\n font-size: 0.875rem;\n }\n\n .poll-type {\n margin-bottom: 0.5rem;\n display: flex;\n align-items: center;\n min-height: 1.375rem;\n }\n\n .poll-voters-count {\n margin: .4375rem 0 1.125rem;\n text-align: center;\n }\n\n .poll-answers {\n padding-top: 0.25rem;\n padding-bottom: 1rem;\n }\n\n .Checkbox,\n .Radio {\n padding-left: 2.25rem;\n\n &:last-child {\n margin-bottom: .75rem;\n }\n\n &.disabled {\n opacity: 1 !important;\n cursor: not-allowed;\n }\n\n .Checkbox-main,\n .Radio-main {\n &::before {\n left: 0.125rem;\n background-color: var(--background-color);\n\n .theme-dark & {\n --color-borders: var(--color-borders-input);\n }\n\n .Message.own & {\n --color-borders: var(--accent-color);\n }\n }\n\n &::after {\n left: 0.4375rem;\n background-color: var(--accent-color);\n }\n }\n\n input:checked ~ .Radio-main,\n input:checked ~ .Checkbox-main {\n &::before {\n border-color: var(--accent-color);\n }\n }\n\n .Spinner {\n left: 0.125rem;\n }\n }\n\n .Checkbox {\n .Checkbox-main {\n &::after {\n left: 0.125rem;\n background-color: var(--color-primary);\n\n .Message.own & {\n background-color: var(--accent-color);\n }\n }\n }\n }\n\n .Spinner > div {\n // gray spinner\n background-image: var(--spinner-gray-data);\n\n .theme-dark & {\n background-image: var(--spinner-white-data);\n }\n\n .Message.own & {\n // green spinner\n background-image: var(--spinner-green-data);\n .theme-dark & {\n background-image: var(--spinner-white-data);\n }\n }\n }\n\n .poll-recent-voters {\n display: inline-flex;\n align-items: center;\n vertical-align: text-bottom;\n margin-left: .875rem;\n margin-right: .5rem;\n margin-top: -2px;\n\n .Avatar {\n border: .0625rem solid var(--color-white);\n margin-right: 0;\n box-sizing: content-box;\n\n .Message.own & {\n border: .0625rem solid var(--secondary-color);\n }\n\n &:not(:first-child) {\n margin-left: -3px;\n }\n }\n }\n\n .poll-countdown {\n margin-left: auto;\n font-size: .75rem;\n transition: color .2s;\n\n &.hurry-up {\n color: var(--color-error);\n\n .poll-countdown-progress {\n stroke: var(--color-error);\n }\n }\n\n svg {\n vertical-align: -3px;\n }\n }\n\n .poll-countdown-progress {\n stroke: var(--color-primary);\n fill: transparent;\n stroke-width: 2;\n stroke-linecap: round;\n transition: stroke-dashoffset 2s, stroke .2s;\n }\n\n .poll-quiz-help {\n margin: -.625rem 0 -.625rem auto;\n .Message:not(.own) & {\n color: var(--color-primary);\n }\n }\n\n .poll-results,\n .poll-answers {\n padding-top: 0.25rem;\n padding-bottom: 0.5rem;\n }\n\n .Button {\n text-transform: none;\n font-size: 1rem;\n\n .Message.own & {\n color: var(--accent-color);\n --color-primary-shade-rgb: var(--color-accent-own);\n }\n }\n\n > .Button {\n margin-bottom: .625rem;\n }\n}\n",".WebPage {\n margin-top: 0.25rem;\n margin-bottom: 0.125rem;\n padding-left: .625rem;\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n line-height: 1.125rem;\n max-width: 29rem;\n position: relative;\n\n &::before {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: .125rem;\n background: var(--accent-color);\n border-radius: .125rem;\n }\n\n &-text {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n }\n\n .media-inner {\n margin: 0 !important;\n margin-bottom: 0.375rem !important;\n\n &, & img, &.small-image img {\n border-radius: var(--border-radius-messages-small) !important;\n }\n\n &.square-image {\n width: 5rem;\n height: 5rem;\n min-height: 0;\n margin-bottom: 0 !important;\n\n img {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n &.with-video .media-inner{\n margin-top: 0.5rem !important;\n margin-bottom: 1rem !important;\n }\n\n &.with-square-photo {\n display: flex;\n margin-bottom: 1rem;\n\n .WebPage-text {\n order: 1;\n padding-right: 1rem;\n }\n\n .media-inner {\n order: 2;\n flex-shrink: 0;\n }\n\n &:dir(rtl) {\n .WebPage-text {\n padding-inline-end: 1rem;\n }\n }\n }\n\n &:not(.with-square-photo) {\n .site-name,\n .site-title,\n .site-description {\n &:last-child::after {\n content: '';\n display: inline-block;\n width: var(--meta-safe-area-size);\n height: 0.75rem;\n float: right;\n }\n }\n }\n\n .site-name,\n .site-description,\n .site-title {\n word-break: break-word;\n max-width: 100%;\n }\n\n .site-name {\n color: var(--accent-color);\n font-weight: 500;\n margin-bottom: 0.125rem;\n }\n\n .site-title {\n font-weight: 500;\n margin-bottom: 0.125rem;\n }\n\n .site-description {\n line-height: 1.25;\n margin-bottom: 0;\n\n body.is-ios & {\n line-height: 1.125rem;\n }\n }\n\n &:dir(rtl) {\n padding-inline-start: .625rem;\n\n &::before {\n left: auto;\n right: 0;\n }\n }\n}\n\n\n",".Invoice {\n .title {\n color: var(--accent-color);\n font-weight: 500;\n }\n\n .description {\n position: relative;\n\n &.has-image {\n .invoice-image {\n max-width: 100%;\n height: 20rem;\n\n @media (max-width: 600px) {\n height: 10rem;\n }\n }\n\n .description-text {\n position: absolute;\n top: 0;\n padding: .25rem .5rem;\n margin: .25rem;\n background-color: rgba(90, 110, 70, 0.6);\n border-radius: var(--border-radius-messages-small);\n color: var(--color-text);\n font-weight: 500;\n\n span {\n margin-left: .5rem;\n }\n }\n }\n\n }\n}\n",".Album {\n position: relative;\n overflow: hidden;\n\n .message-content.media.text & {\n margin: -0.3125rem -0.5rem 0.3125rem;\n }\n\n .forwarded-message & {\n margin-bottom: .125rem;\n\n .message-content.media.text & {\n margin: 0 0 0.3125rem;\n --border-bottom-left-radius: inherit;\n --border-bottom-right-radius: inherit;\n }\n }\n\n &,\n .message-content.media.text & {\n > .album-item-select-wrapper .media-inner {\n margin: 0 !important;\n }\n }\n\n > .album-item-select-wrapper .media-inner {\n &, & img, & video {\n border-radius: 0 !important;\n object-fit: cover;\n }\n }\n}\n",".RoundVideo {\n position: relative;\n width: 15rem;\n height: 15rem;\n cursor: pointer;\n\n .thumbnail-wrapper {\n width: 15rem;\n height: 15rem;\n border-radius: 50%;\n overflow: hidden;\n }\n\n .video-wrapper {\n position: absolute;\n left: 0;\n top: 0;\n border-radius: 50%;\n overflow: hidden;\n }\n\n .progress {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n\n .progress-circle {\n stroke: white;\n fill: transparent;\n stroke-width: 4;\n stroke-opacity: .35;\n stroke-linecap: round;\n }\n\n video::-internal-media-controls-cast-button,\n video::-webkit-media-controls,\n video::-webkit-media-controls-start-playback-button {\n display: none;\n }\n}\n",".InlineButtons {\n display: flex;\n flex-direction: column;\n\n .row {\n display: flex;\n flex-direction: row;\n }\n\n .Button {\n flex: 1;\n width: auto;\n margin: 0.125rem;\n background: var(--pattern-color);\n border-radius: var(--border-radius-messages-small);\n font-weight: 500;\n text-transform: none;\n\n &::before {\n content: '';\n background-color: var(--color-white);\n opacity: 0;\n\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border-radius: var(--border-radius-messages-small);\n z-index: var(--z-below);\n transition: opacity 200ms;\n }\n\n &:hover {\n background: var(--pattern-color) !important;\n\n &::before {\n opacity: .4;\n }\n }\n\n &:first-of-type {\n margin-left: 0;\n }\n\n &:last-of-type {\n margin-right: 0;\n }\n\n i {\n font-size: .875rem;\n position: absolute;\n right: .1875rem;\n top: .1875rem;\n display: block;\n\n &.icon-arrow-right {\n font-size: .75rem;\n top: .125rem;\n right: .125rem;\n transform: rotate(-45deg);\n }\n }\n }\n\n .row:first-of-type .Button {\n margin-top: 0.25rem !important;\n }\n\n .row:last-of-type .Button {\n margin-bottom: 0;\n\n &:first-of-type {\n border-bottom-left-radius: var(--border-radius-messages);\n }\n\n &:last-of-type {\n border-bottom-right-radius: var(--border-radius-messages);\n }\n }\n}\n",".CommentButton {\n --background-color: var(--color-background);\n --hover-color: var(--color-chat-hover);\n\n display: flex;\n width: 100%;\n align-items: center;\n padding: .5625rem .25rem .5625rem .625rem;\n padding-inline-start: .625rem;\n padding-inline-end: .25rem;\n background: var(--background-color);\n border-bottom-right-radius: var(--border-bottom-right-radius);\n border-bottom-left-radius: var(--border-bottom-left-radius);\n font-size: .9375rem;\n font-weight: 500;\n line-height: 2rem;\n color: var(--accent-color);\n white-space: nowrap;\n cursor: pointer;\n transition: background-color .15s, color .15s;\n user-select: none;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n .Message .has-appendix &::before {\n content: '';\n display: block;\n position: absolute;\n bottom: -.1875rem;\n left: -.5625rem;\n width: .5625rem;\n height: 1.25rem;\n background-position: bottom left;\n background-image: url('data:image/svg+xml,%3Csvg width=\"9\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"%3E%3Cdefs%3E%3Cfilter x=\"-50%25\" y=\"-14.7%25\" width=\"200%25\" height=\"141.2%25\" filterUnits=\"objectBoundingBox\" id=\"a\"%3E%3CfeOffset dy=\"1\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\"/%3E%3CfeGaussianBlur stdDeviation=\"1\" in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\"/%3E%3CfeColorMatrix values=\"0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0\" in=\"shadowBlurOuter1\"/%3E%3C/filter%3E%3Cpath d=\"M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z\" id=\"b\"/%3E%3C/defs%3E%3Cg fill=\"none\" fill-rule=\"evenodd\"%3E%3Cuse fill=\"%23000\" filter=\"url(%23a)\" xlink:href=\"%23b\"/%3E%3Cuse fill=\"%23FFF\" xlink:href=\"%23b\"/%3E%3C/g%3E%3C/svg%3E');\n opacity: 0;\n transition: opacity .15s, filter .15s;\n\n .theme-dark #root & {\n filter: invert(.83);\n }\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n .custom-shape & {\n position: absolute;\n right: -3rem;\n width: 2.25rem;\n bottom: 3rem;\n height: 3.375rem;\n border-radius: 1.375rem;\n padding: 0.375rem .3125rem .25rem;\n align-items: flex-start;\n color: white;\n background-color: rgba(0, 0, 0, .2);\n\n opacity: 0;\n transition: opacity .2s ease;\n\n @media (pointer: coarse) {\n opacity: 1 !important;\n }\n\n &:hover {\n background-color: rgba(0, 0, 0, .28);\n }\n\n .Message:hover & {\n opacity: 1;\n }\n\n &::after {\n content: attr(data-cnt);\n position: absolute;\n bottom: -.0625rem;\n left: 0;\n width: 100%;\n text-align: center;\n font-size: 12px;\n display: block;\n }\n\n &[data-cnt=\"0\"] {\n height: 2.25rem;\n &::after {\n display: none;\n }\n }\n\n .icon-comments-sticker {\n display: block;\n font-size: 1.5rem;\n margin: 0 auto;\n }\n\n .recent-repliers,\n .icon-comments,\n .label,\n .icon-next {\n display: none;\n }\n }\n\n &:hover {\n background: var(--hover-color);\n\n .Message .has-appendix &::before {\n opacity: 1;\n }\n\n .Avatar {\n border-color: var(--hover-color) !important;\n }\n }\n\n .is-forwarded &,\n .audio &,\n .voice &,\n .poll &,\n .text & {\n border-top: 1px solid var(--color-borders);\n }\n\n .message-content.has-solid-background & {\n margin: .375rem -.5rem -.375rem;\n }\n\n .message-content.voice & {\n margin-bottom: -.5rem;\n }\n\n .message-content.audio & {\n margin-bottom: -.8125rem;\n }\n\n .message-content.audio &,\n .message-content.voice &,\n .message-content.poll &,\n .message-content.has-solid-background.text &,\n .message-content.has-solid-background.is-forwarded & {\n width: calc(100% + 1rem);\n }\n\n .icon-comments-sticker {\n display: none;\n }\n\n .icon-comments {\n font-size: 1.5625rem;\n line-height: 2rem;\n margin-inline-end: .875rem;\n }\n\n .icon-next {\n margin-inline-start: auto;\n font-size: 1.5rem;\n }\n\n .recent-repliers {\n display: inline-flex;\n align-items: center;\n margin-inline-end: .5rem;\n margin-inline-start: -.125rem;\n\n .Avatar {\n transition: border .15s;\n border: 2px solid var(--color-background);\n margin-inline-end: 0;\n z-index: 3;\n overflow: hidden;\n\n .emoji {\n width: 1rem;\n background-size: 1rem;\n }\n\n + .Avatar {\n z-index: 2;\n\n + .Avatar {\n z-index: 1;\n }\n }\n\n &:not(:first-child) {\n margin-inline-start: -.75rem;\n }\n }\n }\n\n &.has-unread .label {\n position: relative;\n\n &::after {\n content: '';\n display: inline-block;\n width: .5rem;\n height: .5rem;\n border-radius: 50%;\n background: var(--accent-color);\n margin-inline-start: \t.75rem;\n }\n }\n\n &.disabled {\n cursor: default;\n pointer-events: none;\n }\n}\n",".Reactions {\n display: flex;\n flex-direction: row;\n width: 100%;\n flex-wrap: wrap;\n margin-top: 0.25rem;\n overflow: visible;\n\n .Button {\n --reaction-background: var(--color-reaction);\n display: flex;\n flex-direction: row;\n height: 1.75rem;\n white-space: nowrap;\n width: auto;\n margin: 0.125rem;\n padding: 0 0.5rem;\n border: 2px solid transparent;\n background-color: var(--reaction-background) !important;\n border-radius: 1.75rem;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n text-transform: none;\n color: var(--accent-color);\n overflow: visible;\n\n .ReactionAnimatedEmoji, .icon-reaction-filled {\n width: 1.125rem;\n height: 1.125rem;\n margin-right: 0.25rem;\n }\n\n .avatars {\n display: flex;\n\n .Avatar {\n margin: 0 0 0 -0.25rem;\n border: 0.0625rem solid var(--reaction-background);\n width: 1.25rem;\n height: 1.25rem;\n\n &:first-child {\n margin: 0;\n }\n }\n }\n\n &.chosen {\n border-color: var(--accent-color);\n }\n\n &:hover {\n --reaction-background: var(--hover-color-reaction);\n }\n\n &:first-of-type {\n margin-left: 0;\n }\n\n &:last-of-type {\n margin-right: 0;\n }\n }\n\n &.is-outside {\n margin-top: 0.125rem;\n }\n\n &.is-outside .Button {\n --reaction-background: var(--pattern-color);\n color: white;\n .theme-dark & {\n color: var(--accent-color);\n }\n\n &.chosen {\n border-color: white;\n\n .theme-dark & {\n border-color: var(--accent-color);\n }\n }\n }\n}\n","// General styles\n.Message {\n display: flex;\n align-items: flex-end;\n margin-bottom: 0.375rem;\n position: relative;\n\n --background-color: var(--color-background);\n --hover-color: var(--color-reply-hover);\n --color-reaction: var(--color-message-reaction);\n --hover-color-reaction: var(--color-message-reaction-hover);\n --active-color: var(--color-reply-active);\n --max-width: 29rem;\n --accent-color: var(--color-primary);\n --accent-shade-color: var(--color-primary-shade);\n --secondary-color: var(--color-text-secondary);\n --meta-safe-area-base: 2.25rem;\n --meta-safe-author-width: 0px;\n --meta-safe-area-extra-width: 0px;\n --meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + var(--meta-safe-area-extra-width));\n --deleting-translate-x: -50%;\n --select-message-scale: 0.9;\n\n @media (min-width: 1921px) {\n --max-width: calc(30vw - 1rem);\n }\n\n &.is-swiped {\n transform: translateX(-2.5rem) !important;\n }\n\n &.is-protected {\n user-select: none;\n }\n\n > .Avatar,\n > .message-content-wrapper {\n opacity: 1;\n transform: scale(1) translateX(0);\n transition: transform var(--select-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n > .Avatar {\n position: absolute;\n bottom: 0;\n left: 0;\n\n @media (max-width: 600px) {\n width: 2.5rem;\n height: 2.5rem;\n }\n }\n\n .quick-reaction {\n cursor: pointer;\n position: absolute;\n right: -0.5rem;\n bottom: -0.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transform: scale(1);\n opacity: 0;\n transition: transform 0.2s ease-out, opacity 0.2s ease-out;\n transition-delay: 0.2s;\n\n &.visible {\n opacity: 1 !important;\n }\n\n &:hover {\n transition-delay: unset;\n transform: scale(1.4);\n }\n\n .ReactionStaticEmoji {\n width: 1.125rem;\n }\n }\n\n &.last-in-list .quick-reaction:hover {\n transform: translateY(-0.1875rem) scale(1.4);\n }\n\n &.own .quick-reaction {\n right: auto;\n left: -0.5rem;\n }\n\n &.last-in-group {\n margin-bottom: 0.625rem;\n }\n\n &.last-in-list {\n // Forcing extra space which is taken by the appendix and causes incorrect container height calculation.\n // This value is accurately crafted as a minimum possible.\n margin-bottom: 0.375rem;\n }\n\n &.is-in-selection-mode {\n body.is-android & {\n .can-select-text {\n z-index: var(--z-message-select-control);\n }\n\n // Prevent media viewer from opening\n .media-inner {\n pointer-events: none;\n }\n }\n }\n\n &.has-inline-buttons {\n .message-content {\n border-bottom-right-radius: var(--border-radius-messages-small);\n }\n }\n\n &.has-active-reaction {\n .message-content-wrapper {\n z-index: 1;\n }\n }\n\n &:not(.own) {\n padding-left: 2.5rem;\n\n .no-avatars &, &.is-thread-top {\n padding-left: 0;\n }\n\n @media (max-width: 600px) {\n padding-left: 2.875rem;\n\n .no-avatars &, &.is-thread-top {\n padding-left: 0.25rem;\n }\n }\n }\n\n &.own {\n flex-direction: row-reverse;\n --background-color: var(--color-background-own);\n --hover-color: var(--color-reply-own-hover);\n --color-reaction: var(--color-message-reaction-own);\n --hover-color-reaction: var(--color-message-reaction-hover-own);\n --active-color: var(--color-reply-own-active);\n --max-width: 30rem;\n --accent-color: var(--color-accent-own);\n --accent-shade-color: var(--color-green);\n --secondary-color: var(--color-accent-own);\n --color-code: var(--color-code-own);\n --color-code-bg: var(--color-code-own-bg);\n --color-links: var(--color-own-links);\n --meta-safe-area-base: 3.5rem;\n --deleting-translate-x: 50%;\n --color-text-green: var(--color-accent-own);\n\n @media (min-width: 1921px) {\n --max-width: 30vw;\n }\n\n body.is-ios &,\n body.is-macos & {\n --color-background-own: var(--color-background-own-apple);\n --color-reply-own-hover: var(--color-reply-own-hover-apple);\n --color-reply-own-active: var(--color-reply-own-active-apple);\n }\n\n @media (max-width: 600px) {\n padding-right: 0.25rem;\n }\n }\n\n &.is-deleting {\n > .Avatar,\n > .message-content-wrapper {\n transition: opacity .2s ease, transform .2s ease-in;\n opacity: 0;\n transform: scale(0.3) translateX(var(--deleting-translate-x));\n transform-origin: bottom;\n }\n }\n\n &.has-views {\n --meta-safe-area-extra-width: 4rem;\n }\n\n &.was-edited {\n --meta-safe-area-extra-width: 2.5rem;\n\n &.has-views {\n --meta-safe-area-extra-width: 7.5rem;\n }\n\n html[lang=ru] & {\n --meta-safe-area-extra-width: 3.5rem;\n\n &.has-views {\n --meta-safe-area-extra-width: 8.5rem;\n }\n }\n }\n\n .select-mode-active & {\n cursor: pointer;\n\n @media (min-width: 600px) {\n user-select: none;\n }\n\n &:not(.own) {\n > .Avatar,\n > .message-content-wrapper {\n transform: translateX(2.5rem);\n }\n }\n\n &:not(.is-album)::after {\n content: \"\";\n position: absolute;\n top: -0.25rem;\n bottom: -0.25rem;\n left: -4rem;\n right: -4rem;\n z-index: var(--z-message-select-area);\n }\n\n &.is-album,\n &.is-in-document-group {\n .message-select-control {\n pointer-events: unset;\n }\n }\n\n .message-select-control {\n opacity: 1;\n }\n }\n\n &.is-selected {\n .message-select-control {\n background: var(--color-green);\n\n &.group-select {\n background: transparent;\n\n &.is-selected {\n background: var(--color-green);\n }\n }\n }\n }\n\n .File.file-is-selected {\n .message-select-control {\n background: var(--color-green);\n }\n }\n\n &.is-in-document-group .File.file-is-selected .file-icon,\n &.has-menu-open.is-in-document-group .File .file-icon {\n --background-color: var(--color-background-selected);\n }\n\n &.own.is-in-document-group .File.file-is-selected .file-icon,\n &.own.has-menu-open.is-in-document-group .File .file-icon {\n --background-color: var(--color-background-own-selected);\n }\n\n .Audio .message-select-control {\n left: 1.0625rem;\n top: 1.375rem;\n }\n\n html.theme-dark &.own .Audio .toggle-play:not(.with-image) + .media-loading {\n .ProgressSpinner {\n background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjODA3QkQ1IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+);\n background-position: center;\n background-size: 1rem;\n\n circle {\n stroke: var(--background-color);\n }\n }\n }\n\n\n .File {\n position: relative;\n\n .message-select-control {\n position: absolute;\n top: 2rem;\n left: 2rem;\n z-index: 2;\n }\n }\n\n .album-item-select-wrapper {\n .Message.own & {\n background: var(--color-background-own);\n }\n\n .message-select-control {\n position: absolute;\n top: 0.438rem;\n right: 0.438rem;\n left: unset;\n }\n\n img, video {\n transition: transform var(--select-transition), opacity ease 300ms;\n }\n\n &.is-selected {\n .message-select-control {\n background: var(--color-green);\n }\n\n img, video {\n transform: scale(var(--select-message-scale));\n }\n }\n\n }\n\n &.is-selected, &.is-forwarding {\n .message-select-control {\n background: var(--color-green);\n }\n\n .Menu .bubble {\n transition: none !important;\n }\n }\n\n &.is-in-document-group {\n &:not(.first-in-document-group) {\n &::before {\n top: 0 !important;\n }\n\n .message-content {\n box-shadow: none;\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n }\n\n .forwarded-message::before {\n top: -1.5rem;\n }\n }\n\n &:not(.last-in-document-group) {\n margin-bottom: 0;\n\n &::before {\n bottom: 0 !important;\n }\n\n .message-content {\n border-bottom-left-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n }\n }\n\n &.is-in-selection-mode {\n .Audio:not(.audio-is-selected),\n .File:not(.file-is-selected) {\n .message-select-control:not(.group-select) {\n background: white;\n\n &::after {\n content: '';\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 0.688rem;\n background: white;\n border: 0.125rem rgba(0, 0, 0, 0.2) solid;\n position: absolute;\n }\n }\n }\n\n &.own {\n .message-content {\n .Audio:not(.audio-is-selected),\n .File:not(.file-is-selected) {\n .message-select-control:not(.group-select) {\n background: var(--background-color);\n border-color: var(--background-color);\n\n &::after {\n background: var(--background-color);\n border-color: var(--color-message-meta-own);\n }\n }\n }\n }\n }\n\n }\n\n &.focused,\n &.has-menu-open,\n &.is-forwarding,\n &.is-selected {\n .message-content {\n background: var(--color-background-selected);\n }\n\n &.own {\n .message-content {\n --background-color: var(--color-background-own-selected);\n background: var(--color-background-own-selected);\n }\n }\n }\n\n .message-content-wrapper {\n width: 17.1875rem;\n }\n\n .message-content {\n transition: background-color var(--select-transition);\n }\n\n &.own {\n .message-content-wrapper {\n display: flex;\n justify-content: flex-end;\n\n .message-content {\n width: 100%;\n }\n }\n }\n }\n\n .album-item-select-wrapper {\n position: absolute;\n\n .message-select-control {\n position: absolute;\n z-index: 2;\n }\n }\n\n .message-select-control {\n position: absolute;\n left: 0;\n bottom: 0.25rem;\n width: 1.5rem;\n height: 1.5rem;\n border: 2px solid white;\n border-radius: 50%;\n z-index: var(--z-message-select-control);\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n color: white;\n font-size: 1rem;\n\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--select-transition);\n\n .icon-select {\n position: absolute;\n left: -3px;\n top: -3px;\n font-size: 1.625rem;\n }\n\n .theme-dark & {\n border-color: #ffffff80;\n }\n }\n\n .Avatar {\n margin-right: 0.3rem;\n }\n\n &.is-in-document-group {\n .message-content.document {\n padding: .25rem .5rem !important;\n }\n\n &.last-in-document-group {\n .message-content.document {\n padding-bottom: .5rem !important\n }\n }\n\n &.first-in-document-group {\n .message-content.document {\n padding-top: .5rem !important\n }\n }\n }\n}\n\n// Border-radius styles\n.message-content,\n.Album,\n.media-inner,\n.message-content.media .media-inner img,\n.message-content.media .media-inner video,\n.message-content.custom-shape .media-inner img {\n border-top-left-radius: var(--border-top-left-radius);\n border-top-right-radius: var(--border-top-right-radius);\n border-bottom-left-radius: var(--border-bottom-left-radius);\n border-bottom-right-radius: var(--border-bottom-right-radius);\n}\n\n.media-inner video.full-media {\n background: transparent !important;\n}\n\n.media-inner {\n overflow: hidden;\n\n &.small-image img {\n border-radius: 0 !important;\n }\n}\n\n.Message {\n --border-top-left-radius: var(--border-radius-messages);\n --border-top-right-radius: var(--border-radius-messages);\n --border-bottom-left-radius: var(--border-radius-messages);\n --border-bottom-right-radius: var(--border-radius-messages);\n\n &:not(.own) {\n &.first-in-group:not(.last-in-group) {\n --border-bottom-left-radius: var(--border-radius-messages-small);\n }\n\n &:not(.first-in-group):not(.last-in-group) {\n --border-top-left-radius: var(--border-radius-messages-small);\n --border-bottom-left-radius: var(--border-radius-messages-small);\n }\n\n &.last-in-group:not(.first-in-group) {\n --border-top-left-radius: var(--border-radius-messages-small);\n }\n\n &.last-in-group {\n --border-bottom-left-radius: var(--border-radius-messages-small);\n\n .message-content.has-appendix {\n --border-bottom-left-radius: 0;\n }\n }\n }\n\n &.own {\n &.first-in-group:not(.last-in-group) {\n --border-bottom-right-radius: var(--border-radius-messages-small);\n }\n\n &:not(.first-in-group):not(.last-in-group) {\n --border-top-right-radius: var(--border-radius-messages-small);\n --border-bottom-right-radius: var(--border-radius-messages-small);\n }\n\n &.last-in-group:not(.first-in-group) {\n --border-top-right-radius: var(--border-radius-messages-small);\n }\n\n &.last-in-group {\n --border-bottom-right-radius: var(--border-radius-messages-small);\n\n .message-content.has-appendix {\n --border-bottom-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n }\n\n .message-content {\n &.has-replies:not(.custom-shape),\n &.text {\n .media-inner,\n .Album {\n --border-bottom-left-radius: 0;\n --border-bottom-right-radius: 0;\n }\n }\n\n &.is-reply .EmbeddedMessage {\n & + .Album,\n & + .Audio,\n & + .File {\n margin-top: .375rem;\n }\n }\n\n &:not(.custom-shape).is-reply .media-inner,\n &:not(.custom-shape).is-reply .Album,\n &:not(.custom-shape).force-sender-name .Album,\n &:not(.is-forwarded) .message-title ~ .media-inner {\n --border-top-left-radius: 0;\n --border-top-right-radius: 0;\n }\n\n &.is-forwarded .content-inner .message-title {\n margin-bottom: 0.25rem;\n }\n }\n\n .message-action-button {\n position: absolute;\n bottom: 0;\n color: white;\n background-color: rgba(0, 0, 0, .2);\n\n opacity: 0;\n transition: opacity .2s ease;\n\n @media (pointer: coarse) {\n opacity: 1 !important;\n }\n\n &:hover,\n &:active,\n &:focus {\n background-color: rgba(0, 0, 0, .28) !important;\n }\n }\n\n &:hover,\n &[data-is-document-group-hover] {\n .message-action-button {\n opacity: 1;\n }\n }\n\n &.own .message-action-button {\n left: -3rem;\n }\n\n &:not(.own) .message-action-button {\n right: -3rem;\n }\n\n .bottom-marker {\n height: 1px;\n width: 1px;\n visibility: hidden;\n }\n}\n\n.Message .custom-shape .message-action-button {\n bottom: .25rem;\n}\n\n@import 'message-content';\n",".message-content {\n position: relative;\n max-width: var(--max-width);\n\n @media (max-width: 600px) {\n max-width: calc(100vw - 6.25rem);\n\n .Message.own &,\n .MessageList.no-avatars & {\n max-width: calc(100vw - 3.75rem);\n }\n\n // Workaround for sass function override - we should use CSS min() here\n @supports (max-width: #{\"min(29rem, 100vw - 6.25rem)\"}) {\n max-width: #{\"min(29rem, 100vw - 6.25rem)\"};\n .MessageList.no-avatars & {\n max-width: #{\"min(29rem, 100vw - 3.75rem)\"};\n }\n .Message.own & {\n max-width: #{\"min(30rem, 100vw - 3.75rem)\"};\n }\n }\n\n &.has-action-button {\n max-width: calc(100vw - 7rem);\n\n .Message.own &,\n .MessageList.no-avatars & {\n max-width: calc(100vw - 4.5rem);\n }\n\n // Workaround for sass function override - we should use CSS min() here\n @supports (max-width: #{\"min(29rem, 100vw - 5.5rem)\"}) {\n max-width: #{\"min(29rem, 100vw - 7rem)\"};\n .MessageList.no-avatars & {\n max-width: #{\"min(29rem, 100vw - 4.5rem)\"};\n }\n .Message.own & {\n max-width: #{\"min(30rem, 100vw - 4.5rem)\"};\n }\n }\n }\n }\n\n img {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n }\n\n .text-content {\n margin: 0;\n word-break: break-word;\n line-height: 1.3125;\n text-align: initial;\n display: flow-root;\n unicode-bidi: plaintext;\n }\n\n .text-entity-link {\n unicode-bidi: plaintext;\n }\n\n &:not(.custom-shape) .text-content,\n &.document {\n & > .MessageMeta {\n position: relative;\n top: .375rem;\n bottom: auto !important;\n float: right;\n line-height: 1.35;\n height: calc(var(--message-meta-height, 1rem));\n margin-left: .4375rem;\n margin-right: -.5rem;\n\n .MessageOutgoingStatus .Transition {\n max-height: calc(var(--message-meta-height, 1rem));\n overflow: hidden;\n }\n\n html[data-message-text-size=\"12\"] & {\n top: .25rem;\n }\n\n html[data-message-text-size=\"17\"] & {\n top: .4375rem;\n }\n\n html[data-message-text-size=\"18\"] &,\n html[data-message-text-size=\"19\"] & {\n top: .5rem;\n }\n\n html[data-message-text-size=\"20\"] & {\n top: .5625rem;\n }\n }\n\n &:dir(rtl) {\n & > .MessageMeta {\n float: left;\n margin-left: -.25rem;\n margin-right: .4375rem;\n }\n }\n }\n\n .MessageMeta.reactions-offset {\n position: relative;\n top: .375rem;\n bottom: auto !important;\n float: right;\n line-height: 1;\n height: calc(var(--message-meta-height, 1rem));\n margin-left: auto;\n margin-right: -.5rem;\n align-self: flex-end;\n\n .MessageOutgoingStatus .Transition {\n max-height: calc(var(--message-meta-height, 1rem));\n overflow: hidden;\n }\n\n html[data-message-text-size=\"12\"] & {\n top: .25rem;\n }\n\n html[data-message-text-size=\"17\"] & {\n top: .4375rem;\n }\n\n html[data-message-text-size=\"18\"] &,\n html[data-message-text-size=\"19\"] & {\n top: .5rem;\n }\n\n html[data-message-text-size=\"20\"] & {\n top: .5625rem;\n }\n }\n\n &.document:not(.text) {\n &::after {\n content: \"\";\n display: block;\n clear: both;\n }\n\n & > .MessageMeta {\n top: auto !important;\n bottom: -.5rem !important;\n margin-top: -.25rem;\n\n &:not([dir=rtl]) {\n margin-top: -1.25rem;\n }\n }\n }\n\n .theme-dark .Message.own & {\n .text-entity-link {\n text-decoration: underline !important;\n\n &:hover {\n text-decoration: none !important;\n }\n }\n }\n\n &:not(.custom-shape) {\n font-size: var(--message-text-size, 1rem);\n\n body.is-ios & {\n font-size: var(--message-text-size, 1.0625rem);\n }\n\n & > .content-inner {\n min-width: 0;\n }\n }\n\n .matching-text-highlight {\n background: #CAE3F7;\n border-radius: 0.25rem;\n padding: 0 0.125rem;\n }\n\n .message-title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n font-weight: 500;\n line-height: 1.25rem;\n color: var(--accent-color);\n unicode-bidi: plaintext;\n display: flex;\n\n & > .interactive {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &.interactive, & > .interactive {\n cursor: pointer;\n\n &:hover {\n opacity: 0.85;\n }\n }\n\n & > .color-1 {\n color: var(--color-user-1);\n }\n\n & > .color-2 {\n color: var(--color-user-2);\n }\n\n & > .color-4 {\n color: var(--color-user-4);\n }\n\n & > .color-5 {\n color: var(--color-user-5);\n }\n\n & > .color-6 {\n color: var(--color-user-6);\n }\n\n & > .color-7 {\n color: var(--color-user-7);\n }\n\n & > .color-8 {\n color: var(--color-user-8);\n }\n\n .theme-dark .Message.own & > .color-1 {\n color: var(--accent-color);\n }\n\n & + .File {\n margin-top: .25rem;\n }\n\n .via {\n padding-right: .25rem;\n font-weight: 400;\n }\n\n span + .via {\n padding-left: .25rem;\n }\n\n .admin-title {\n flex: 1;\n margin-left: 1rem;\n text-align: right;\n font-weight: 400;\n font-size: 0.75rem;\n margin-top: -0.1rem;\n color: rgba(var(--color-text-meta-rgb), 0.75);\n\n .Message.own & {\n color: var(--accent-color);\n }\n }\n }\n\n &.has-shadow {\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n &.has-solid-background, &.has-background, .is-album & {\n background: var(--background-color);\n }\n\n &.has-solid-background {\n padding: .3125rem .5rem .375rem;\n\n .forwarded-message > .text-content:not(.with-meta):last-child::after {\n content: '';\n display: inline-block;\n width: var(--meta-safe-area-size);\n height: 1rem;\n }\n }\n\n body.is-ios &.has-solid-background {\n padding-bottom: 0.4375rem;\n }\n\n body.is-ios .Message.own &.has-solid-background {\n padding-left: 0.625rem;\n }\n\n &:not(.has-appendix) .svg-appendix {\n display: none;\n }\n\n .svg-appendix {\n overflow: hidden;\n position: absolute;\n bottom: -.0625rem;\n width: .5625rem;\n height: 1.125rem;\n font-size: 1rem !important;\n\n .corner {\n fill: var(--background-color);\n }\n\n .Message.own & {\n right: -.551rem; // This value is correct. Safari fix\n }\n\n .Message:not(.own) & {\n left: -.562rem; // This value is correct. Safari fix\n }\n }\n\n &[data-has-custom-appendix] {\n .svg-appendix .corner {\n fill: var(--appendix-bg);\n }\n }\n\n &.has-appendix-thumb {\n .Message & {\n .svg-appendix {\n --background-color: #ccc;\n opacity: 1;\n transition: opacity 500ms ease;\n }\n }\n }\n\n &.document {\n padding: .5rem !important;\n\n .File {\n .theme-dark & {\n --color-primary: var(--color-selection-highlight);\n }\n }\n\n .File + .text-content {\n margin-top: .3125rem;\n }\n }\n\n &.voice,\n &.audio {\n .message-title,\n .Embedded {\n margin-top: -.1875rem;\n margin-bottom: .1875rem;\n }\n }\n\n &.voice {\n padding: .5rem !important;\n\n .Voice + .text-content {\n margin-top: .5rem;\n }\n }\n\n &.audio {\n min-width: 20rem;\n padding: .5rem .5rem .8125rem !important;\n\n @media (max-width: 600px) {\n min-width: 17rem;\n }\n\n .Audio + .text-content {\n margin-top: .25rem;\n }\n\n &:not(.has-replies) {\n .Audio + .text-content {\n margin-bottom: -0.4375rem;\n }\n }\n }\n\n &:not(.custom-shape) .emoji {\n display: inline-block;\n width: 1.25rem;\n background-size: 1.25rem;\n color: transparent;\n margin-inline-end: 1px;\n vertical-align: text-bottom;\n\n &::selection {\n background-color: var(--color-selection-highlight-emoji);\n color: transparent;\n }\n }\n\n &:not(.custom-shape) .text-content .emoji {\n width: calc(1.25 * var(--message-text-size, 1rem));\n height: calc(1.25 * var(--message-text-size, 1rem));\n background-size: calc(1.25 * var(--message-text-size, 1rem));\n }\n\n .no-media-corners {\n --border-top-left-radius: 0;\n --border-top-right-radius: 0;\n }\n\n &.custom-shape.is-via-bot {\n font-size: inherit !important;\n\n .content-inner > .message-title {\n display: inline-flex;\n position: relative;\n top: .125rem;\n max-width: calc(100% - 3rem);\n margin-left: calc(100% - 3rem);\n padding: 0 .5rem;\n background-color: var(--background-color);\n border-radius: var(--border-radius-messages);\n\n .Message.own & {\n margin-left: -3rem;\n }\n }\n\n .media-inner {\n margin-top: 0.375rem;\n }\n }\n\n}\n\n.message-content.media, .WebPage {\n .media-inner {\n display: flex;\n justify-content: center;\n align-items: center;\n\n &.interactive {\n cursor: pointer;\n\n &.dark video {\n background-color: #232323;\n }\n }\n }\n\n &.round.is-reply {\n width: auto !important;\n }\n\n &.force-sender-name .media-inner,\n &.force-sender-name .Album,\n &.text .media-inner,\n &.is-via-bot .media-inner,\n &.is-reply .media-inner,\n &.is-reply .Album {\n margin-left: -0.5rem;\n margin-right: -0.5rem;\n\n body.is-ios .Message.own & {\n margin-left: -0.625rem;\n }\n }\n\n &.text .media-inner {\n margin-top: -0.3125rem;\n }\n\n &.is-reply .media-inner,\n &.force-sender-name .Album,\n &.is-reply .Album,\n .message-title ~ .media-inner {\n margin-top: 0.375rem;\n margin-bottom: -0.375rem;\n\n body.is-ios .Message.own & {\n margin-bottom: -0.4375rem;\n }\n }\n\n // Moved below .is-reply to overwrite its styles\n &.text .media-inner,\n &.text .Album {\n margin-bottom: 0.375rem;\n\n body.is-ios .Message.own & {\n margin-bottom: 0.375rem;\n }\n }\n\n .media-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n\n &:not(.open) {\n opacity: 0.5;\n transform: scale(0);\n transition: opacity .3s ease, transform .3s ease;\n }\n }\n\n .icon-large-play, .icon-download {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0.7;\n transition: opacity 150ms;\n\n &:hover {\n opacity: 1;\n }\n\n &:before {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3.375rem;\n height: 3.375rem;\n border-radius: 50%;\n background: rgba(black, 0.25);\n }\n\n &.opacity-transition {\n transition: opacity .15s ease;\n\n &:not(.open) {\n opacity: 0;\n }\n }\n }\n\n .icon-download {\n font-size: 1.5rem;\n }\n\n .icon-large-play {\n font-size: 2.5rem;\n }\n\n .message-media-duration,\n .message-transfer-progress {\n background: rgba(0, 0, 0, .25);\n color: #fff;\n font-size: 0.75rem;\n position: absolute;\n left: .1875rem;\n top: .1875rem;\n z-index: 1;\n padding: 0 .375rem;\n border-radius: .75rem;\n line-height: 1.125rem;\n user-select: none;\n }\n\n .message-media-duration .icon-muted {\n vertical-align: -.1875rem;\n margin-left: .375rem;\n font-size: 1.0625rem;\n }\n}\n\n.message-content.custom-shape {\n line-height: 1.2;\n font-size: 10rem;\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n\n &.has-comments {\n min-height: 5.25rem;\n margin-top: 0 !important;\n\n &.has-replies {\n min-height: 6.5rem;\n }\n }\n\n &.is-reply {\n max-width: 100%;\n }\n\n .reply-message {\n display: flex;\n align-items: flex-start;\n flex-direction: row-reverse;\n direction: ltr;\n\n > p {\n margin-bottom: 0;\n }\n\n .EmbeddedMessage {\n margin-left: 0.5rem;\n border-radius: var(--border-radius-messages);\n\n @media (max-width: 600px) {\n max-width: calc(90vw - 13rem);\n }\n\n @media (max-width: 340px) {\n margin-left: -1rem;\n z-index: 1;\n max-width: calc(90vw - 12rem);\n }\n }\n }\n\n .text-content {\n margin-bottom: 1rem;\n }\n\n .media-inner {\n line-height: 1;\n font-size: 1rem;\n flex-shrink: 0;\n\n .full-media {\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n }\n }\n\n .emoji {\n display: inline-block;\n color: transparent;\n\n &::selection {\n background-color: var(--color-selection-highlight-emoji);\n color: transparent;\n }\n }\n\n &.emoji-only {\n .text-content {\n margin-bottom: 0;\n text-shadow: 1px 1px 0 white, -1px -1px 0 white, -1px 1px 0 white, 1px -1px 0 white;\n img.emoji {\n filter: drop-shadow(1px 1px 0 white) drop-shadow(-1px 1px 0 white) drop-shadow(1px -1px 0 white) drop-shadow(-1px -1px 0 white);\n }\n\n .MessageMeta {\n text-shadow: none;\n }\n }\n }\n\n &.emoji-only-1 {\n min-width: 8rem;\n font-size: 4.5rem;\n\n .content-inner {\n height: 7rem;\n }\n\n .text-content {\n line-height: 1.5;\n text-align: center;\n }\n\n .Message.was-edited & {\n min-width: 10rem;\n }\n\n .emoji {\n width: 5rem;\n height: 5rem;\n }\n }\n\n &.emoji-only-2 {\n font-size: 4rem;\n margin-top: .5rem;\n min-width: 10rem;\n\n &.has-comments {\n margin-top: 1.25rem;\n }\n\n .Message.was-edited & {\n min-width: 12rem;\n }\n\n .emoji {\n width: 4rem;\n height: 4rem;\n margin-right: 0.375rem;\n }\n }\n\n &.emoji-only-3 {\n font-size: 3rem;\n margin-top: 1.75rem;\n min-width: 12rem;\n\n &.has-comments {\n margin-top: 2.5rem;\n }\n\n .Message.was-edited & {\n min-width: 14rem;\n }\n\n .emoji {\n width: 3rem;\n height: 3rem;\n margin-right: 0.375rem;\n }\n }\n\n .Message:not(.own) & {\n --hover-color: var(--color-reply-hover);\n --active-color: var(--color-reply-active);\n }\n\n .Message.own & {\n --hover-color: var(--color-reply-own-hover);\n --active-color: var(--color-reply-own-active);\n\n .reply-message {\n flex-direction: row;\n\n .EmbeddedMessage {\n margin-right: 0.5rem;\n\n @media (max-width: 340px) {\n margin-left: 0;\n z-index: 1;\n max-width: calc(90vw - 11.5rem);\n }\n }\n }\n }\n}\n\n.forwarded-message {\n .message-content.contact &,\n .message-content.voice &,\n .message-content.poll & {\n // MessageOutgoingStatus's icon needs more space\n margin-bottom: 0.5rem;\n }\n\n .message-content:not(.custom-shape) & {\n position: relative;\n margin-top: 0.25rem;\n padding-left: 0.625rem;\n\n &::before {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0.05rem;\n width: 2px;\n background: var(--accent-color);\n border-radius: 2px;\n }\n\n &:dir(rtl) {\n padding-inline-start: 0.625rem;\n\n &::before {\n left: auto;\n right: 0.05rem;\n }\n }\n }\n\n --border-top-left-radius: var(--border-radius-messages-small);\n --border-top-right-radius: var(--border-radius-messages-small);\n --border-bottom-left-radius: var(--border-radius-messages-small);\n --border-bottom-right-radius: var(--border-radius-messages-small);\n\n > .media-inner {\n margin: 0 !important;\n margin-bottom: 0.25rem !important;\n }\n}\n\n.long-word-break-all {\n word-break: break-all;\n}\n\n.text-entity-link {\n color: var(--color-links) !important;\n text-decoration: none !important;\n word-break: break-word;\n cursor: pointer;\n unicode-bidi: initial;\n\n &:hover, &:active, &:visited {\n text-decoration: underline !important;\n }\n}\n\n.text-entity-code, .text-entity-pre {\n color: var(--color-code);\n background: var(--color-code-bg);\n white-space: pre-wrap;\n margin: 0;\n padding: 1px 2px;\n border-radius: 4px;\n font-size: calc(var(--message-text-size, 1rem) - 0.0625rem);\n}\n",".SponsoredMessage {\n --border-top-left-radius: var(--border-radius-messages) !important;\n --border-bottom-left-radius: var(--border-radius-messages) !important;\n\n margin-top: -.5rem;\n margin-bottom: .5rem;\n\n &::before {\n display: none;\n }\n\n &__button.secondary {\n margin-top: .5rem;\n border: 1px solid var(--color-primary);\n border-radius: var(--border-radius-default-tiny);\n color: var(--color-primary);\n }\n}\n",".ContactGreeting {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n\n .wrapper {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n background: var(--pattern-color);\n width: 14.5rem;\n padding: .75rem 1rem;\n border-radius: 1.5rem;\n color: #fff;\n }\n\n .title {\n font-weight: 500;\n margin-bottom: 0;\n }\n\n .description {\n font-size: .9375rem;\n margin-bottom: 0;\n }\n\n .sticker {\n margin: 2rem 0 1rem;\n height: 10rem;\n width: 10rem;\n cursor: pointer;\n\n .thumbnail {\n height: 10rem;\n width: 10rem;\n }\n }\n}\n",".NoMessages {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .icon {\n font-size: 5rem;\n margin: 0 auto 1rem;\n }\n\n .wrapper {\n display: inline-flex;\n flex-direction: column;\n background: var(--pattern-color);\n max-width: 20rem;\n padding: .75rem 1rem;\n border-radius: 1.5rem;\n color: #fff;\n\n &[dir=rtl] {\n text-align: right;\n }\n }\n\n .title {\n font-weight: 500;\n font-size: 1rem;\n margin-bottom: .25rem;\n text-align: center;\n unicode-bidi: plaintext;\n }\n\n .description {\n font-size: .9375rem;\n margin: 0;\n padding: 0;\n list-style: none;\n unicode-bidi: plaintext;\n }\n\n .list-checkmarks {\n font-size: .9375rem;\n margin: .25rem 0 0;\n padding: 0;\n list-style: none;\n unicode-bidi: plaintext;\n line-height: 1.8;\n\n li::before {\n content: '✓';\n margin-inline-end: .5rem;\n }\n }\n}\n","@import '../../styles/mixins';\n\n.MessageList {\n flex: 1;\n width: 100%;\n margin-bottom: .5rem;\n\n overflow: scroll;\n overflow-x: hidden;\n overflow-y: auto;\n @include overflow-y-overlay();\n\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n .mask-image-enabled & {\n mask-image: linear-gradient(to top, transparent 0, #000 0.5rem);\n }\n\n @media (pointer: coarse) {\n user-select: none;\n touch-callout: none;\n\n &.select-mode-active {\n user-select: auto;\n touch-callout: default;\n }\n }\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n transition: bottom 150ms ease-out, transform var(--layer-transition);\n body.keyboard-visible & {\n position: relative;\n bottom: calc(0px - env(safe-area-inset-bottom));\n\n body.keyboard-visible.animation-level-0 & {\n transition: none !important;\n }\n }\n }\n\n &.no-avatars .Message > .Avatar {\n display: none;\n }\n\n .messages-container {\n width: 100%;\n max-width: var(--messages-container-width);\n min-height: 100%;\n margin: 0 auto;\n display: flex;\n justify-content: flex-end;\n flex-direction: column;\n padding: 1rem 1rem 0 1.125rem;\n\n .force-messages-scroll & {\n margin-top: 100vh !important;\n }\n\n @media (max-width: 600px) {\n width: 100vw;\n padding: 2.75rem 0.5rem 0;\n // Patch for an issue on Android when rotating device\n margin: 0;\n }\n }\n\n &.no-composer {\n margin-bottom: 0;\n\n .last-in-list {\n margin-bottom: 1rem;\n }\n }\n\n &.select-mode-active, &.type-pinned {\n margin-bottom: 0;\n\n .last-in-list {\n margin-bottom: 5.625rem;\n\n @media (max-width: 600px) {\n margin-bottom: 4.25rem;\n }\n\n &.ActionMessage {\n padding-bottom: 0.125rem;\n }\n }\n }\n\n @media (max-width: 600px) {\n &.with-bottom-shift {\n margin-bottom: 0;\n .last-in-list {\n margin-bottom: 4.25rem;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n body:not(.keyboard-visible) & {\n margin-bottom: calc(4.25rem + env(safe-area-inset-bottom));\n }\n }\n }\n }\n }\n\n .Message,\n .ActionMessage {\n position: relative;\n\n opacity: 1;\n transform: scale(1);\n transition: opacity .2s ease, transform .2s ease;\n\n &:not(.open) {\n transform: scale(0.8);\n opacity: 0;\n }\n\n // Restore stacking context\n // https://developer.mozilla.org/ru/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\n &.open.shown {\n transform: none;\n }\n\n &::before {\n content: \"\";\n position: absolute;\n top: -0.1875rem;\n bottom: -0.1875rem;\n left: -50vw;\n right: -50vw;\n background: black;\n z-index: -1;\n\n opacity: 0;\n transition: opacity var(--select-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n &:not(.last-in-group) {\n &::before {\n bottom: -0.1875rem;\n }\n }\n\n &:not(.first-in-group) {\n &::before {\n top: -0.1875rem;\n }\n }\n\n &.focused::before {\n // @optimization\n transition: none !important;\n }\n\n &.focused,\n &.is-forwarding,\n &.is-selected,\n &.has-menu-open {\n &::before {\n opacity: 0.1;\n\n .theme-dark & {\n opacity: .6;\n }\n }\n }\n }\n\n > .empty {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n & > span {\n max-width: 80%;\n text-align: left;\n }\n\n .text-entity-link {\n color: inherit !important;\n text-decoration: underline;\n\n &:hover, &:focus {\n text-decoration: none;\n }\n }\n }\n\n .sticky-date,\n .local-action-message,\n .ActionMessage,\n .empty {\n text-align: center;\n user-select: none;\n\n > span {\n display: inline-block;\n background: var(--pattern-color);\n color: white;\n font-size: calc(var(--message-text-size, 1rem) - .0625rem);\n font-weight: 500;\n line-height: 1.75;\n padding: 0 .5rem;\n border-radius: var(--border-radius-messages);\n word-break: break-word;\n\n body.is-ios &,\n body.is-macos & {\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n line-height: calc(var(--message-text-size, 1rem) + .5rem);\n }\n\n .emoji-small {\n vertical-align: text-bottom;\n width: calc(1.25 * var(--message-text-size, 1rem));\n height: calc(1.25 * var(--message-text-size, 1rem));\n background-size: calc(1.25 * var(--message-text-size, 1rem));\n }\n }\n }\n\n .sticky-date {\n margin-top: 1rem;\n margin-bottom: 1rem;\n z-index: var(--z-sticky-date);\n pointer-events: none;\n opacity: 1;\n transition: opacity .3s ease;\n\n body:not(.is-scrolling-messages) &.stuck {\n opacity: 0;\n\n span {\n pointer-events: none;\n }\n }\n\n body.animation-level-0 & {\n transition: none;\n }\n\n &.interactive {\n cursor: pointer;\n }\n\n span {\n pointer-events: auto;\n }\n }\n\n &.scrolled:not(.is-animating) .sticky-date {\n position: sticky;\n top: 0.625rem;\n }\n\n &.is-animating {\n overflow: hidden;\n }\n\n &.is-animating .message-select-control {\n display: none !important;\n }\n\n .has-header-tools & .sticky-date {\n top: 3.75rem !important;\n }\n\n .local-action-message,\n .ActionMessage {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n }\n\n .ActionMessage {\n .action-link {\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n .sticky-date + .ActionMessage {\n margin-top: -0.5rem;\n }\n\n @media (min-width: 1276px) {\n width: 100%;\n transform: translate3d(0, 0, 0);\n transition: transform var(--layer-transition);\n\n .messages-container {\n width: calc(100% - var(--right-column-width));\n }\n\n body.animation-level-0 & {\n transition: none;\n }\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) / -2), 0, 0);\n }\n\n body:not(.animating-right-column) #Main.right-column-open &.select-mode-active,\n #Main.right-column-open &:not(.select-mode-active),\n body.animating-right-column &:not(.select-mode-active) {\n width: calc(100% - var(--right-column-width));\n\n .messages-container {\n width: 100%;\n }\n }\n }\n\n @media (max-width: 600px) {\n transition: transform var(--layer-transition);\n\n body.enable-symbol-menu-transforms & {\n transform: translate3d(0, 0, 0);\n }\n\n body.is-symbol-menu-open & {\n transform: translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0);\n }\n }\n\n .animating > div > & {\n &::-webkit-scrollbar {\n width: 0;\n }\n\n /* Styles for Firefox */\n @supports (scrollbar-width: none) {\n padding-right: .6875rem;\n scrollbar-width: none;\n }\n }\n}\n",".ScrollDownButton {\n --base-bottom-pos: 6rem;\n\n position: absolute;\n bottom: var(--base-bottom-pos);\n right: 1rem;\n opacity: 0;\n transform: translateY(4.5rem);\n transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1), opacity .2s ease;\n z-index: var(--z-scroll-down-button);\n pointer-events: none;\n\n @supports (right: env(safe-area-inset-right)) {\n right: #{\"max(1rem, env(safe-area-inset-right))\"};\n }\n\n body.animation-level-0 & {\n transform: none !important;\n\n transition: opacity .15s;\n }\n\n @media (max-width: 600px) {\n right: 0.5rem;\n bottom: 4.5rem;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n body:not(.keyboard-visible) & {\n bottom: calc(4.5rem + env(safe-area-inset-bottom));\n }\n }\n }\n\n &-inner {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n > .Button {\n box-shadow: 0 1px 2px var(--color-default-shadow);\n color: var(--color-composer-button);\n\n i {\n font-size: 1.75rem;\n }\n }\n\n @media (min-width: 1276px) {\n transform: translateX(0);\n\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n #Main.right-column-open & {\n transform: translateX(calc(-1 * var(--right-column-width)));\n }\n }\n\n @media (max-width: 600px) {\n > .Button {\n width: 2.875rem;\n height: 2.875rem;\n }\n }\n }\n\n &.revealed {\n transform: translateY(0);\n opacity: 1;\n pointer-events: all;\n\n &.no-composer:not(.with-extra-shift) {\n transform: translateY(4rem);\n }\n }\n\n .unread-count {\n min-width: 1.5rem;\n height: 1.5rem;\n padding: 0 .45rem;\n border-radius: 0.75rem;\n font-size: 0.875rem;\n line-height: 1.5rem;\n font-weight: 500;\n text-align: center;\n\n position: absolute;\n top: -0.3rem;\n right: -0.3rem;\n\n background: var(--color-green);\n color: white;\n\n pointer-events: none;\n\n @media (max-width: 600px) {\n top: -0.7rem;\n right: auto;\n }\n }\n\n @media (max-width: 600px) {\n body.is-symbol-menu-open & {\n bottom: calc(var(--base-bottom-pos) + var(--symbol-menu-height) + var(--symbol-menu-footer-height));\n }\n }\n}\n",".BotKeyboardMenu {\n .bubble {\n width: 100% !important;\n max-width: 27rem;\n border-radius: var(--border-radius-default-small);\n }\n\n .content {\n display: flex;\n flex-direction: column;\n padding: .1875rem .625rem;\n max-height: 80vh;\n overflow: auto;\n\n @media (max-width: 600px) {\n max-height: 75vh;\n }\n\n .row {\n display: flex;\n flex-direction: row;\n }\n\n .row + .row {\n margin-top: .375rem;\n }\n\n .Button {\n flex: 1;\n width: auto;\n height: auto;\n min-height: 3.0625rem;\n border-radius: var(--border-radius-messages-small);\n border: 2px solid var(--color-primary);\n background: var(--color-background);\n color: var(--color-primary);\n font-weight: 500;\n text-transform: none;\n\n &:hover {\n color: #fff;\n border-color: var(--color-primary-shade);\n background: var(--color-primary-shade);\n }\n }\n\n .Button + .Button {\n margin-left: .375rem;\n }\n }\n}\n",".ComposerEmbeddedMessage {\n height: 2.625rem;\n transition: height 150ms ease-out, opacity 150ms ease-out;\n\n .select-mode-active + .middle-column-footer & {\n display: none;\n }\n\n &:not(.open) {\n height: 0 !important;\n }\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n & > div {\n display: flex;\n align-items: center;\n padding-right: 0.625rem;\n padding-top: 0.1875rem;\n }\n\n & > div > .Button {\n flex-shrink: 0;\n background: none !important;\n width: 3.5rem;\n height: 2.875rem;\n margin: 0 -0.0625rem 0 0;\n padding: 0;\n align-self: center;\n\n @media (max-width: 600px) {\n width: 2.875rem;\n }\n }\n}\n",".WebPagePreview {\n height: 2.625rem;\n transition: height 150ms ease-out, opacity 150ms ease-out;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n .select-mode-active + .middle-column-footer & {\n display: none;\n }\n\n &:not(.open) {\n height: 0 !important;\n }\n\n // TODO Remove duplication with `.ComposerEmbeddedMessage`\n & > div {\n display: flex;\n align-items: center;\n padding-right: 0.625rem;\n padding-top: 0.1875rem;\n }\n\n --accent-color: var(--color-primary);\n\n .ComposerEmbeddedMessage + & {\n margin-top: 0.75rem;\n }\n\n & > div > .Button {\n flex-shrink: 0;\n background: none !important;\n width: 3.5rem;\n height: 2.875rem;\n margin: 0 -0.0625rem 0 0;\n padding: 0;\n align-self: center;\n\n @media (max-width: 600px) {\n width: 2.875rem;\n }\n }\n\n .WebPage {\n flex-grow: 1;\n margin: 0.1875rem 0 0.1875rem 0.125rem;\n max-width: calc(100% - 3.375rem);\n\n &::before {\n top: .1rem;\n bottom: .05rem;\n }\n\n &.with-video .media-inner { // TODO add support for video in previews in composer\n display: none;\n }\n\n .site-title,\n .site-description {\n flex: 1;\n max-width: 100%;\n max-height: 1rem;\n }\n\n .site-title {\n margin-top: .125rem;\n margin-bottom: 0.1875rem;\n }\n\n .site-description {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n}\n","@import '../../../styles/mixins';\n\n.Composer {\n align-items: flex-end;\n\n .select-mode-active + .middle-column-footer & {\n position: absolute;\n padding-right: 2rem;\n bottom: 0;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n bottom: env(safe-area-inset-bottom);\n }\n\n @media (max-width: 600px) {\n padding-right: 1rem;\n }\n\n &::before {\n right: 2.125rem;\n\n @media (max-width: 600px) {\n right: 1rem;\n }\n }\n\n .svg-appendix {\n opacity: 0;\n }\n }\n\n .form-control {\n --border-width: 0;\n }\n\n @keyframes show-send-as-button {\n from {\n width: 1rem;\n transform: scale(0);\n }\n\n to {\n width: 3.5rem;\n transform: scale(1);\n }\n }\n\n > .Button {\n flex-shrink: 0;\n margin-left: .5rem;\n\n &:not(.danger) {\n color: var(--color-composer-button);\n }\n\n @media (max-width: 600px) {\n width: 2.875rem;\n height: 2.875rem;\n }\n\n .icon-send,\n .icon-schedule,\n .icon-microphone-alt,\n .icon-check {\n position: absolute;\n }\n\n &:not(:active):not(:focus):not(:hover) {\n .icon-send,\n .icon-schedule,\n .icon-check {\n color: var(--color-primary);\n }\n }\n\n &.cancel {\n position: relative;\n z-index: 1;\n\n &:hover, &.active {\n background: var(--color-chat-hover);\n }\n }\n\n &.recording {\n position: relative;\n z-index: 0;\n transition: box-shadow .1s;\n }\n\n &.send {\n .icon-send {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-microphone-alt,\n .icon-check,\n .icon-schedule {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.schedule {\n .icon-schedule {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-microphone-alt,\n .icon-check,\n .icon-send {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.record {\n .icon-microphone-alt {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-send,\n .icon-check,\n .icon-schedule {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.edit {\n .icon-check {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-send,\n .icon-microphone-alt,\n .icon-schedule {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.not-ready > i {\n animation-duration: 0ms !important;\n }\n\n body.animation-level-0 &, body.animation-level-1 & {\n .icon-send, .icon-microphone-alt, .icon-check, .icon-schedule {\n animation-duration: 0ms !important;\n }\n }\n }\n\n .send-as-button {\n z-index: 1;\n }\n\n body:not(.animation-level-0) & .send-as-button.appear-animation {\n animation: 0.25s ease-in-out forwards show-send-as-button;\n }\n\n .mobile-symbol-menu-button {\n width: 2.875rem;\n height: 2.875rem;\n position: relative;\n\n .icon-smile,\n .icon-keyboard,\n .Spinner {\n position: absolute;\n }\n\n .Spinner {\n --spinner-size: 1.5rem;\n }\n\n .icon-smile {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-keyboard, .Spinner {\n animation: hide-icon .4s forwards ease-out;\n }\n\n &.not-ready > i {\n animation-duration: 0ms !important;\n }\n\n &.is-loading {\n .Spinner {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-keyboard, .icon-smile {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.menu-opened {\n .icon-keyboard {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-smile, .Spinner {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n }\n}\n\n#message-compose {\n flex-grow: 1;\n max-width: calc(100% - 4rem);\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n border-bottom-right-radius: 0;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n position: relative;\n z-index: 1;\n\n .svg-appendix {\n position: absolute;\n bottom: -.1875rem;\n right: -.551rem; // This value is correct. Safari fix\n width: .5625rem;\n height: 1.25rem;\n transition: opacity 200ms;\n font-size: 1rem !important;\n\n .corner {\n fill: var(--color-background);\n }\n }\n\n @media (max-width: 600px) {\n max-width: calc(100% - 3.375rem);\n }\n}\n\n.message-input-wrapper {\n display: flex;\n\n > .Spinner {\n align-self: center;\n --spinner-size: 1.5rem;\n margin-right: -.5rem;\n }\n\n > .Button {\n flex-shrink: 0;\n background: none !important;\n width: 3.5rem;\n height: 3.5rem;\n margin: 0;\n padding: 0;\n align-self: flex-end;\n\n &:not(.faded):not(.activated) {\n color: var(--color-composer-button);\n }\n\n + .Button {\n margin-left: -1rem;\n }\n\n @media (max-width: 600px) {\n width: 2.875rem;\n height: 2.875rem;\n\n + .Button {\n margin-left: -0.6875rem;\n }\n }\n\n &.bot-commands {\n color: var(--color-primary) !important;\n\n // SymbolMenu button should be accessible if BotCommandsMenu opened\n body.is-touch-env &.activated + .Button.mobile-symbol-menu-button {\n z-index: calc(var(--z-menu-backdrop) + 1);\n }\n }\n\n &.scheduled-button i::after {\n content: '';\n position: absolute;\n top: .75rem;\n right: .875rem;\n border: .1875rem solid var(--color-background);\n box-sizing: content-box;\n width: .5rem;\n height: .5rem;\n border-radius: 50%;\n background: var(--color-green-darker);\n box-shadow: -.375rem -.25rem 0 -.1875rem var(--color-background);\n @media (max-width: 600px) {\n top: .5rem;\n right: .5rem;\n }\n }\n }\n\n > .input-group {\n flex-grow: 1;\n margin-bottom: 0;\n }\n\n .recording-state {\n display: inline-block;\n position: relative;\n line-height: 3.5rem;\n height: 3.5rem;\n padding: 0 3.125rem 0 1rem;\n font-family: \"Roboto\", -apple-system, BlinkMacSystemFont, \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif;\n\n &::after {\n content: '';\n width: .75rem;\n height: .75rem;\n background: var(--color-error);\n border-radius: .375rem;\n position: absolute;\n top: 50%;\n margin-top: -.375rem;\n right: 1.3125rem;\n animation: recording-blink-like-macos 1.5s infinite;\n }\n\n @media (max-width: 600px) {\n height: 2.875rem;\n line-height: 2.875rem;\n }\n }\n}\n\n#message-input-text,\n#caption-input-text {\n position: relative;\n\n .form-control {\n padding: calc((3.25rem - var(--composer-text-size, 1rem) * 1.375) / 2 - var(--border-width, 0) * 2) calc(.9rem - var(--border-width));\n overflow: hidden;\n line-height: 1.375;\n font-family: Roboto, -apple-system, \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif;\n unicode-bidi: plaintext;\n text-align: initial;\n font-size: var(--composer-text-size, 1rem);\n\n body.is-ios &,\n body.is-macos & {\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif;\n }\n\n &.overflown {\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n &.touched, &:focus {\n & + .placeholder-text {\n display: none;\n }\n }\n\n &.focus-disabled {\n pointer-events: none;\n }\n }\n\n .forced-placeholder,\n .placeholder-text {\n position: absolute;\n color: var(--color-placeholders);\n pointer-events: none;\n unicode-bidi: plaintext;\n text-align: initial;\n line-height: 1.3125;\n font-size: var(--composer-text-size, 1rem);\n top: calc((3.25rem - var(--composer-text-size, 1rem) * 1.375) / 2);\n bottom: auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n .forced-placeholder {\n z-index: var(--z-below);\n left: 0;\n }\n\n &[dir=rtl] .placeholder-text {\n right: 0;\n }\n\n .text-entity-link {\n color: var(--color-links) !important;\n cursor: default;\n text-decoration: none;\n\n &:hover, &:active, &:visited {\n text-decoration: underline !important;\n }\n }\n\n .clone {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n z-index: -10;\n unicode-bidi: plaintext;\n text-align: initial;\n }\n}\n\n#message-input-text {\n flex-grow: 1;\n\n .form-control {\n margin-bottom: 0;\n background: transparent !important;\n border: none !important;\n border-radius: 0 !important;\n box-shadow: none !important;\n caret-color: var(--color-text);\n min-height: 3.5rem;\n max-height: 26rem;\n line-height: 1.3125;\n padding: calc((3.5rem - var(--composer-text-size, 1rem) * 1.3125) / 2) 0;\n white-space: pre-wrap;\n\n @media (max-width: 600px) {\n height: 2.875rem;\n min-height: 2.875rem;\n max-height: 16rem;\n padding: calc((2.875rem - var(--composer-text-size, 1rem) * 1.3125) / 2) 0;\n overflow: auto;\n }\n\n transition: height 100ms ease;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n .forced-placeholder,\n .placeholder-text {\n top: calc((3.5rem - var(--composer-text-size, 1rem) * 1.3125) / 2);\n\n @media (max-width: 600px) {\n top: calc((2.875rem - var(--composer-text-size, 1rem) * 1.3125) / 2);\n }\n }\n\n &:not(:only-child) {\n .form-control {\n padding-left: 0;\n padding-right: 0;\n }\n }\n\n .ComposerEmbeddedMessage + .message-input-wrapper &,\n .WebPagePreview + .message-input-wrapper & {\n .form-control.overflown {\n margin-top: 0.75rem;\n }\n }\n\n .emoji {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0 1px -5px;\n vertical-align: 0;\n pointer-events: none;\n }\n}\n\n#caption-input-text {\n .form-control {\n height: 3.25rem;\n min-height: 3.25rem;\n max-height: 15rem;\n }\n\n .placeholder-text {\n bottom: .8125rem;\n left: .90625rem;\n }\n}\n\n.composer-tooltip {\n position: absolute;\n bottom: calc(100% + .5rem);\n left: 0;\n width: 100%;\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n padding: 0.5rem 0;\n max-height: 15rem;\n\n overflow-x: hidden;\n overflow-y: auto;\n @include overflow-y-overlay();\n\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n opacity: 0;\n transform: translateY(1.5rem);\n transform-origin: bottom;\n transition: opacity var(--layer-transition), transform var(--layer-transition);\n\n &:not(.shown) {\n display: none;\n }\n\n &.open {\n opacity: 1;\n transform: translateY(0);\n }\n\n .Loading {\n margin: 1rem 0;\n }\n}\n\n@keyframes recording-blink-like-macos {\n from {\n opacity: 1;\n }\n to {\n opacity: .3;\n }\n}\n","#middle-column-bg {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n overflow: hidden;\n z-index: -1;\n background-color: var(--theme-background-color);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background-color: var(--theme-background-color);\n background-position: center;\n background-repeat: no-repeat;\n background-size: cover;\n\n body:not(.animation-level-0) #root & {\n transition: transform var(--layer-transition), background .2s !important;\n }\n\n body.animation-level-0 & {\n transition: none;\n }\n\n .theme-light & {\n background-image: url('../../assets/chat-bg.jpg');\n\n @media (max-width: 600px) {\n background-image: url('../../assets/chat-bg-mobile.jpg');\n }\n }\n }\n\n .custom-bg-color:not(.custom-bg-image) &::after {\n opacity: 0;\n }\n\n .custom-bg-image &::after {\n background-image: var(--custom-background) !important;\n filter: none;\n transform: scale(1.1);\n }\n\n .custom-bg-image.blurred &::after {\n filter: blur(12px);\n }\n\n @media screen and (min-width: 1276px) {\n body.animation-level-2 &::after {\n margin: -16rem -5rem -20rem 0;\n overflow: hidden;\n transform: scale(1);\n transform-origin: left center;\n transition: transform var(--layer-transition);\n }\n\n body.animation-level-2 #Main.right-column-open #MiddleColumn:not(.custom-bg-image) &::after {\n transform: scale(0.67) !important;\n }\n }\n\n body.animation-level-2 #Main.right-column-open #MiddleColumn:not(.custom-bg-image) &::after {\n @media screen and (min-width: 1921px) {\n transform: scale(0.8) !important;\n }\n\n @media screen and (min-width: 2600px) {\n transform: scale(0.95) !important;\n }\n }\n}\n\n#MiddleColumn {\n display: flex;\n justify-content: center;\n height: 100%;\n position: relative;\n z-index: 1;\n min-width: 0;\n\n @media (max-width: 600px) {\n overflow: hidden;\n }\n\n .messages-layout {\n --slide-transition: 450ms cubic-bezier(0.25, 1, 0.5, 1);\n\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n\n > .Transition {\n width: 100%;\n height: 100%;\n overflow: hidden;\n\n > div {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n }\n }\n\n .messaging-disabled {\n &-inner {\n width: 100%;\n padding: 1rem;\n border-radius: var(--border-radius-messages);\n background: var(--color-background);\n color: var(--color-text-secondary);\n text-align: center;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n }\n\n .Composer {\n #message-compose {\n transform: scaleX(1) translateX(0);\n transition: transform var(--select-transition), border-bottom-right-radius var(--select-transition);\n\n &::before {\n transform: scaleX(-1) translateX(0);\n transition: transform var(--select-transition);\n }\n\n body.animation-level-0 & {\n &, &::before {\n transition: none !important;\n }\n }\n }\n\n .message-input-wrapper, &::before {\n opacity: 1;\n transition: opacity var(--select-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n > .Button {\n opacity: 1;\n transform: scale(1);\n transition: opacity var(--select-transition), transform var(--select-transition), background-color 0.15s, color 0.15s;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n &.hover-disabled, &:not(.shown) {\n pointer-events: none;\n }\n\n &:not(.shown) {\n .ComposerEmbeddedMessage {\n height: 0;\n }\n\n #message-compose {\n transform: scaleX(var(--composer-hidden-scale, 1)) translateX(var(--composer-translate-x, 0));\n border-bottom-right-radius: var(--border-radius-messages);\n\n &::before {\n transform: scaleX(-1) translateX(200%);\n }\n }\n\n #editable-message-text {\n height: 3.5rem !important;\n\n @media (max-width: 600px) {\n height: 2.5rem !important;\n }\n }\n\n .message-input-wrapper, &::before {\n opacity: 0;\n }\n\n > .Button {\n opacity: 0 !important;\n transform: scale(0.5);\n }\n }\n }\n\n .messaging-disabled {\n transform: scaleX(1);\n transition: transform var(--select-transition);\n\n .messaging-disabled-inner span {\n opacity: 1;\n transition: opacity var(--select-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n &:not(.shown) {\n transform: scaleX(var(--composer-hidden-scale, 1));\n pointer-events: none;\n\n .messaging-disabled-inner span {\n opacity: 0;\n }\n }\n }\n\n .middle-column-footer {\n width: 100%;\n max-width: var(--messages-container-width);\n padding: 0 1rem;\n position: relative;\n display: flex;\n align-items: flex-end;\n z-index: var(--z-middle-footer);\n\n transform: translate3d(0, 0, 0);\n transition: top 200ms, transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n @media (min-width: 1276px) {\n width: calc(100% - var(--right-column-width));\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) / -2), 0, 0);\n }\n }\n\n @media (max-width: 600px) {\n padding: 0 0.5rem;\n\n body.is-symbol-menu-open & {\n transform: translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0);\n }\n }\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n &:not(.no-composer) {\n padding-bottom: env(safe-area-inset-bottom);\n top: 0;\n\n body.keyboard-visible & {\n top: env(safe-area-inset-bottom);\n }\n }\n }\n\n &::before {\n content: \"\";\n position: absolute;\n top: -.5625rem;\n left: 0;\n right: 0;\n height: 1px;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.4) 2%, rgba(255, 255, 255, 0.4) 98%, rgba(255, 255, 255, 0) 100%);\n opacity: 0;\n transition: opacity 350ms ease;\n\n @media (max-width: 600px) {\n left: -2%;\n right: -2%;\n }\n }\n\n &.with-notch::before {\n opacity: 1;\n }\n\n html.theme-dark &::before {\n background: linear-gradient(90deg, rgba(127, 127, 127, 0) 0%, rgba(127, 127, 127, 0.4) 2%, rgba(127, 127, 127, 0.4) 98%, rgba(127, 127, 127, 0) 100%);\n }\n }\n}\n\n/* Common styles for message list fade-out shadow */\n.Composer,\n.MessageSelectToolbar,\n.messaging-disabled {\n margin-bottom: 1.25rem;\n\n @media (max-width: 600px) {\n margin-bottom: 0.5rem;\n }\n}\n\n.Composer,\n.MessageSelectToolbar,\n.unpin-all-button,\n.join-subscribe-button,\n.messaging-disabled {\n width: 100%;\n display: flex;\n justify-content: center;\n position: relative;\n}\n\n.MessageSelectToolbar-inner,\n.unpin-all-button,\n.join-subscribe-button,\n.messaging-disabled {\n .mask-image-disabled & {\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-radius: var(--border-radius-messages);\n }\n}\n\n.middle-column-footer-button-container {\n width: 100%;\n display: flex;\n justify-content: center;\n position: absolute;\n padding-bottom: 1.25rem;\n\n .unpin-all-button {\n text-transform: capitalize;\n color: var(--color-black);\n\n @media (hover: hover) {\n &:hover {\n .icon-unpin {\n color: var(--color-white);\n }\n }\n }\n\n @media (max-width: 600px) {\n &:active, &:focus {\n .icon-unpin {\n color: var(--color-white);\n }\n }\n }\n\n .icon-unpin {\n margin-inline-start: -0.4375rem;\n margin-inline-end: .75rem;\n color: var(--color-text-secondary);\n font-size: 1.5rem;\n transition: color .15s\n }\n }\n\n .join-subscribe-button,\n .unpin-all-button {\n height: 3.5rem;\n transform: scaleX(1);\n transition: transform var(--select-transition), background-color .15s, color .15s;\n\n .select-mode-active + .middle-column-footer & {\n box-shadow: none;\n transform: scaleX(var(--unpin-hidden-scale));\n }\n\n @media (max-width: 600px) {\n height: 2.5rem;\n }\n }\n\n @media (max-width: 600px) {\n padding-bottom: 0.75rem;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n padding-bottom: calc(.75rem + env(safe-area-inset-bottom));\n }\n }\n\n .mask-image-disabled &::before {\n background: unset;\n }\n}\n",".RightHeader {\n display: flex;\n align-items: center;\n height: var(--header-height);\n padding: 0.5rem .8125rem;\n pointer-events: auto;\n\n @media (max-width: 600px) {\n padding: 0.5rem;\n }\n\n .close-button {\n flex-shrink: 0;\n }\n\n > .Transition {\n flex: 1;\n height: 100%;\n\n > div {\n display: flex;\n align-items: center;\n }\n }\n\n h3 {\n margin-bottom: 0;\n font-size: 1.25rem;\n font-weight: 500;\n margin-left: 1.375rem;\n }\n\n .tools {\n display: flex;\n margin-left: auto;\n }\n\n .SearchInput {\n margin-left: 1rem;\n\n @media (min-width: 600px) {\n margin-right: 1rem;\n }\n }\n\n .DropdownMenu {\n margin-left: auto;\n }\n}\n","@import '../../styles/mixins';\n\n.Profile {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n overflow-x: hidden;\n overflow-y: scroll;\n @include overflow-y-overlay();\n\n > .profile-info > .ChatInfo {\n grid-area: chat_info;\n\n .status.online {\n color: var(--color-primary);\n }\n }\n\n > .profile-info > .ChatExtra {\n padding: .875rem .5rem .5rem;\n box-shadow: inset 0 -.0625rem 0 0 var(--color-background-secondary-accent);\n border-bottom: .625rem solid var(--color-background-secondary);\n\n .narrow {\n margin-bottom: 0;\n }\n\n .inactive.no-selection {\n user-select: auto;\n -webkit-user-select: auto !important;\n }\n\n .Switcher {\n margin-left: auto;\n }\n [dir=rtl] {\n .Switcher {\n margin-left: 0;\n margin-right: auto;\n }\n }\n }\n\n .FloatingActionButton {\n z-index: 1;\n }\n}\n\n.shared-media {\n display: flex;\n flex-direction: column-reverse;\n\n .TabList {\n background: var(--color-background);\n top: -1px;\n z-index: 1;\n\n .Tab {\n padding: 1rem .75rem;\n\n span {\n white-space: nowrap;\n }\n\n i {\n bottom: -1rem;\n }\n }\n }\n\n .Transition {\n flex: 1;\n }\n\n .content {\n &.empty-list {\n height: 100%;\n padding-top: 5rem;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n\n .Spinner {\n --spinner-size: 2.75rem;\n }\n }\n\n &.media-list {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n grid-gap: .0625rem;\n }\n\n &.documents-list {\n padding: 1.25rem;\n\n & .File + .File {\n margin-top: 1.25rem;\n }\n }\n\n &.links-list {\n padding: 1.25rem;\n\n .ProgressSpinner,\n .message-transfer-progress {\n display: none;\n }\n }\n\n &.audio-list,\n &.voice-list {\n padding: 1.25rem;\n\n & .Audio {\n .media-loading {\n top: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n & + .Audio {\n margin-top: 1.6875rem;\n }\n }\n }\n\n &.commonChats-list,\n &.members-list {\n padding: 0.5rem 1rem;\n\n @media (max-width: 600px) {\n padding: .5rem 0;\n .ListItem.chat-item-clickable {\n margin: 0;\n }\n }\n }\n }\n}\n",".AddChatMembers {\n height: 100%;\n overflow: hidden;\n position: relative;\n\n &-inner {\n height: 100%;\n overflow: hidden;\n }\n}\n","#RightColumn {\n position: absolute;\n top: 0;\n right: 0;\n width: var(--right-column-width);\n height: 100%;\n transform: translate3d(var(--right-column-width), 0, 0);\n background: var(--color-background);\n border-left: 1px solid var(--color-borders);\n z-index: var(--z-right-column);\n\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none;\n }\n\n // @optimization\n &:not(:hover) {\n .chat-item-clickable:not(.picker-list-item):nth-child(n + 18) {\n display: none !important;\n }\n }\n\n @media (max-width: 1275px) {\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-left: none;\n }\n\n @media (max-width: 600px) {\n width: 100vw;\n transform: translate3d(110vw, 0, 0);\n }\n\n @supports (padding-right: env(safe-area-inset-right)) {\n padding-right: env(safe-area-inset-right);\n }\n\n > .Transition {\n height: calc(100% - var(--header-height));\n overflow: hidden;\n }\n\n .Management .section > .ChatInfo {\n padding: 0 1.5rem;\n margin: 1rem 0;\n text-align: center;\n\n .Avatar {\n margin: 0 auto .5rem;\n\n &.no-photo {\n cursor: default !important;\n }\n }\n\n .title {\n display: flex;\n justify-content: center;\n align-items: center;\n\n h3 {\n font-weight: 500;\n font-size: 1.25rem;\n line-height: 2rem;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .VerifiedIcon {\n margin-left: 0.25rem;\n margin-bottom: .5rem;\n }\n\n .emoji {\n width: 1.5rem;\n height: 1.5rem;\n background-size: 1.5rem;\n }\n }\n\n .status {\n font-size: 0.875rem;\n color: #868e96;\n }\n }\n}\n\n#RightColumn-wrapper {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--z-right-column);\n overflow: hidden;\n visibility: hidden;\n pointer-events: none;\n\n @media (max-width: 1275px) {\n position: fixed;\n }\n\n &.is-hidden {\n display: none;\n }\n\n .overlay-backdrop {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n background: black;\n opacity: 0;\n\n @media (max-width: 600px) {\n transition: opacity var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none;\n }\n }\n }\n\n #Main.right-column-open &, body.animating-right-column & {\n visibility: visible;\n }\n\n #Main.right-column-open & {\n @media (max-width: 600px) {\n .overlay-backdrop {\n opacity: var(--layer-blackout-opacity);\n }\n }\n\n #RightColumn {\n pointer-events: auto;\n transform: translate3d(0, 0, 0);\n }\n }\n}\n","#Main {\n height: 100%;\n text-align: left;\n overflow: hidden;\n\n @media (min-width: 1276px) {\n position: relative;\n }\n\n @media (max-width: 600px) {\n height: calc(var(--vh, 1vh) * 100);\n }\n\n @media (min-width: 926px) {\n display: grid;\n grid-template-columns: auto 1fr;\n grid-template-rows: 100%;\n }\n}\n\n.has-group-call-header {\n --group-call-header-height: 2rem;\n #LeftColumn, #MiddleColumn, #RightColumn-wrapper {\n height: calc(100% - 2rem);\n margin-top: 2rem;\n }\n}\n\n#LeftColumn {\n min-width: 12rem;\n width: 33vw;\n max-width: 26.5rem;\n height: 100%;\n position: relative;\n\n & > div {\n height: 100%;\n overflow: hidden;\n }\n\n @media (max-width: 600px) {\n height: calc(var(--vh, 1vh) * 100);\n }\n\n @media (min-width: 926px) {\n max-width: 40vw;\n }\n\n @media (min-width: 1276px) {\n width: 25vw;\n max-width: 33vw;\n }\n\n @media (max-width: 925px) {\n position: fixed;\n left: 0;\n top: 0;\n height: calc(var(--vh, 1vh) * 100);\n width: 26.5rem !important;\n\n transform: translate3d(-5rem, 0, 0);\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none;\n }\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background: black;\n opacity: var(--layer-blackout-opacity);\n transition: opacity var(--layer-transition);\n z-index: 1;\n\n body.animation-level-0 & {\n transition: none;\n }\n\n // @optimization\n body.is-android & {\n display: none;\n }\n\n body.is-android .middle-column-shown & {\n display: block;\n }\n }\n\n #Main:not(.middle-column-open) & {\n transform: translate3d(0, 0, 0);\n\n &::after {\n opacity: 0;\n pointer-events: none;\n }\n }\n\n #Main.history-animation-disabled & {\n transition: none;\n\n &:after {\n transition: none;\n }\n }\n }\n\n @media (max-width: 600px) {\n max-width: none;\n width: 100vw !important;\n transform: translate3d(-20vw, 0, 0);\n\n @supports (left: env(safe-area-inset-left)) {\n left: env(safe-area-inset-left) !important;\n width: calc(100vw - env(safe-area-inset-left));\n }\n }\n}\n\n#RightColumn {\n @media (max-width: 600px) {\n height: calc(var(--vh, 1vh) * 100 + 1px);\n }\n\n #Main.history-animation-disabled & {\n transition: none;\n\n .overlay-backdrop {\n transition: none;\n }\n }\n}\n\n#Main.history-animation-disabled .overlay-backdrop {\n transition: none;\n}\n\n#MiddleColumn {\n border-left: 1px solid var(--color-borders);\n\n @media (max-width: 925px) {\n max-width: none;\n position: fixed;\n left: 0;\n top: 0;\n bottom: 0;\n right: 0;\n\n transform: translate3d(0, 0, 0);\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none;\n }\n\n #Main:not(.middle-column-open) & {\n transform: translate3d(26.5rem, 0, 0);\n }\n }\n\n @media (max-width: 600px) {\n border-left: none;\n\n #Main:not(.middle-column-open) & {\n transform: translate3d(100vw, 0, 0);\n }\n\n #Main.right-column-open & {\n transform: translate3d(-20vw, 0, 0);\n }\n }\n\n #Main.history-animation-disabled & {\n transition: none;\n\n &:after {\n transition: none;\n }\n }\n}\n\nbody.is-android.animation-level-1 {\n --layer-transition: 250ms ease-in-out;\n\n #LeftColumn, #MiddleColumn, #RightColumn {\n transition: transform var(--layer-transition), opacity var(--layer-transition);\n }\n\n #Main:not(.middle-column-shown) {\n #MiddleColumn {\n display: none;\n }\n }\n\n #Main:not(.middle-column-open) {\n #MiddleColumn {\n transform: translate3d(10vw, 0, 0);\n opacity: 0;\n }\n }\n\n #Main.middle-column-open {\n #LeftColumn {\n transform: translate3d(0, 0, 0);\n opacity: 0;\n }\n }\n\n #Main:not(.right-column-shown) {\n #RightColumn {\n display: none;\n }\n }\n\n #Main:not(.right-column-open) {\n #RightColumn {\n transform: translate3d(10vw, 0, 0);\n opacity: 0;\n }\n }\n\n #Main.right-column-open {\n #MiddleColumn {\n transform: translate3d(0, 0, 0);\n opacity: 0;\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"163.c69a8648aa1c99ba6248.css","mappings":"AAEA,gBACE,kBAEA,oCACE,kBAEA,2HACE,eACA,eACA,sBACA,6CACA,0BACA,oBAGF,uFACE,kBACA,OACA,WAGF,4CACE,eAGF,2CACE,aAGF,+CACE,yBAEA,uDACE,qEAGF,sDACE,qEAIJ,iDACE,gBAEA,iHACE,gBAKN,gCACE,iBACA,cACA,iBACA,6BACA,qBACA,iBACA,WACA,kBACA,mBACA,gBACA,kBACA,cAGF,0CACE,cACA,kBAGF,8BACE,gBACA,2CAEA,gBCpEF,+BDgEA,8BC/DE,mBAGA,mBDsEA,wIACE,2B;AEnFN,iBACE,cACA,aACA,mBACA,qBACA,eACA,+BACA,2CAEA,0BACE,wBAGF,6BACE,gCACA,gBACA,iBACA,6BACA,mBAGF,yBACE,6BACE,6B;ACvBN,eACE,kBACA,WACA,YACA,2BAEA,4DAEA,sCACE,0BACA,UAEA,wBAEA,+CACE,UAIJ,wBACE,wBAEA,yBAHF,wBAKI,kCACA,6BAKF,oCACE,WACA,cACA,kBACA,WACA,YACA,YACA,aACA,WAKF,6CACE,kBACA,YACA,aACA,WACA,cAKF,gFAEE,kBAIA,0DACE,iCAGF,gDACE,0CAKF,0CACE,iCAGF,oDACE,0C;AC1ER,iBACE,YACA,kBACA,aACA,sBACA,gBACA,UAEA,2CACE,kBACA,YACA,WAGF,6BACE,OACA,gBACA,gCAEA,uCACE,8BAIJ,8BACE,YACA,aACA,sBACA,gBAEA,gDACE,gBACA,6BAEA,2DACE,SAIJ,uCACE,2BACA,sBACA,mBACA,gBACA,UAGF,mCACE,cACA,qBACA,sBAEA,wCACE,mBACA,oBAIJ,0CACE,OACA,gBAIJ,+FACE,YACA,gBAGF,6BACE,kBACA,YACA,UACA,WACA,c;AC1EJ,SACE,YAGF,aACE,4BACA,oCACA,aACA,mBACA,cACA,yCAEA,gBACE,gBACA,kBACA,gBACA,qBACA,kBAGF,0BACE,oBACA,+BAEA,yBAJF,0BAKI,6BAIJ,yBAzBF,aA0BI,eAGF,6BACE,aACA,cAEA,2CACE,mB;ACtCN,aACE,aACA,iBACA,oBACA,uBAEA,oCACE,2BAGF,qBACE,cACA,eAGF,4BACE,6CACA,2DACA,0CACA,2CAIA,oCACE,WACA,YAEA,sCACE,mBACA,qBAIJ,8BACE,kBACA,oBACA,oBAEA,wCACE,kBAIJ,+EACE,UACA,mBACA,uEAGF,yLAIE,UACA,qBAIJ,4BACE,kBACA,iBAEA,kDACE,kBACA,2BACA,SACA,YACA,WACA,eACA,kBAGF,gHACE,mBAGF,2CACE,UACA,kBAEA,kBACA,mCACA,aACA,2BACA,8DACA,WACA,eACA,oBACA,eACA,iDAEA,wDACE,gBACA,0EACE,gBAKN,yKAGE,UACA,mBAKF,sCACE,6CAGF,qDACE,iCACA,iBACA,iBACA,iBACA,sBACA,sBACA,kCAIJ,qBACE,aACA,uBACA,sBACA,cACA,gBACA,kBACA,gBACA,eACA,kDAEA,2BACE,wDAGF,iDAfF,qBAgBI,iBAGF,yCACE,cACA,gBACA,6BACA,iBACA,mBACA,gBACA,uBAEA,qDACE,8BACA,qBAIJ,+BACE,4BACA,kCACA,mBACA,mBACA,gBACA,uBACA,mBAEA,2CACE,8BACA,qB;ACxKR,kBACE,kBACA,SACA,OACA,QACA,gBACA,gBACA,+CACA,aACA,mBACA,8BACA,mBACA,qCACA,mCACA,WACA,eAEA,0BACE,WACA,cACA,kBACA,eACA,OACA,QACA,eACA,uDAGF,4BACE,aAGF,yBACE,oCACE,2BAIJ,wBACE,aACA,sBAEA,+BACE,kBACA,wBAGF,sCACE,iBACA,kCAIJ,2BACE,aACA,mBACA,mBAEA,mCACE,sBAEA,+CACE,WACA,YAGF,qDACE,cACA,eACA,6CAKN,wBACE,cACA,qBACA,gBACA,kBACA,WAKJ,0BACE,wDACE,8C;ACPJ,cACE,aACA,mBACA,WACA,+CACA,mCACA,oCACA,kBACA,+BAEA,mDAVF,cAWI,oDACA,yDAGF,yBAfF,cAgBI,cACA,kBAEA,mDAnBJ,cAoBM,mDACA,uDAIJ,0BACE,WAGA,YAEA,8BACE,aACA,mBACA,WAIJ,2BACE,oBACA,mBACA,kBAEA,yBALF,2BAMI,eAGF,yCACE,kBACA,eACA,kBACA,sBACA,iBACA,oBACA,gBACA,kBAEA,kBACA,aACA,cAEA,6BACA,WACA,oBAEA,gDACE,gCAKN,iCACE,YACA,gBAGF,kEACE,2BAGF,4BACE,aACA,mBACA,yBACA,iBACA,cAGE,qLAGE,2BAIJ,iDACE,2CACE,+BACA,6CAEA,mEACE,mEAKN,0BA1BF,4BA2BI,+BACA,6CAEA,oDACE,mEP5LN,oIOkMI,oBAIJ,iDACE,8GAEE,UAEA,8JACE,WA3MN,4HAEE,kBACA,SACA,OACA,QACA,gBACA,uDAEA,aACA,2BACA,sBACA,oBACA,mCAEA,4IACE,WACA,cACA,kBACA,eACA,OACA,QACA,eACA,uDAGF,sKACE,gBACA,sBAGF,mDA/BF,4HAgCI,qDACA,uDAIJ,sDACE,mBACA,aACA,qBAEA,8DACE,gBACA,YAGF,8DACE,sBAGF,oEACE,iBAIJ,8DACE,YACA,cACA,iBAEA,sEACE,YACA,eAGF,4EACE,eAIJ,iFACE,aA2IA,0BACE,iEACE,wDAKN,oHAEE,mDAEA,kKACE,eAIJ,iBACE,gBACA,mBACA,qBACA,gBACA,SACA,gBACA,uBACA,uBAEA,4DAEE,oBACA,gBAGF,yBAhBF,iBAiBI,cACA,gBACA,wBAGF,0BACE,yCACE,kDAKN,wBACE,eACA,aACA,mBAEA,8BACE,aACA,sBACA,uBACA,YACA,gBAGF,+BACE,aACA,mBAEA,6CACE,cACA,eACA,mBACA,kBAIJ,gCACE,aACA,uBAGF,qCACE,uBACA,gBACA,uBAEA,0BACE,6DACE,kDAMR,sBACE,qBAEA,wBACA,yBACA,oBAGF,mDACE,kBACA,qBACA,SACA,kCACA,gBACA,mBACA,uBACA,qBAEA,uEACE,oBAGF,iEACE,2BAGF,2EACE,iBAIJ,8BACE,aACA,cAGF,2CACE,aACA,mBACA,iBACA,eACA,2BACA,mCAGE,oFACE,aAIJ,0BAdF,2CAeI,+BACA,+DAEA,mEACE,mEAKJ,gEACE,gBAGF,mDACE,cAGF,sDACE,kBACA,OACA,QACA,SACA,mCACA,oCACA,uDACA,+BACA,+DAEA,8DACE,WACA,cACA,kBACA,eACA,OACA,QACA,eACA,uDAGF,2EACE,aACA,gBACA,OAEA,yFACE,eAIJ,0BAhCF,sDAiCI,+BACA,+DAEA,8EACI,qDAMV,mCACE,aACA,cACA,oBACA,uBACA,eACA,qBACA,kDACA,kBACA,gBACA,eAEA,yCACE,wDAGF,0DACE,kBACA,eACA,iBACA,cACA,kBACA,gBAEA,2FACE,eACA,cACA,uBACA,gCAGF,yFACE,8CACA,kBACA,sBACA,sCAGF,sFACE,kBACA,OACA,MACA,cACA,gCACA,uBACA,sBACA,sCAIJ,iDACE,gBACA,4BACA,mBACA,gBAEA,iDANF,iDAOI,iBAGF,wDACE,gBACA,kBACA,iBACA,YACA,2BACA,sBACA,gBACA,mBAEA,oEACE,mBAIJ,mDACE,kBACA,qBACA,gBACA,mBACA,gBACA,uBACA,SAEA,+DACE,mBAKN,gDACE,WACA,YAGF,uCACE,cACA,eACA,iBACA,qBACA,4BACA,mBACA,cAEA,qDACE,gBAKN,6BACE,cACA,iBACA,aACA,mBACA,yBAGE,8DACE,2BACA,UAMJ,wFACE,mBAEA,kGACE,qBAKN,yBAjiBA,sEAEE,kBACA,SACA,OACA,QACA,gBACA,uDAEA,aACA,2BACA,sBACA,oBACA,mCAEA,sFACE,WACA,cACA,kBACA,eACA,OACA,QACA,eACA,uDAGF,gHACE,gBACA,sBAGF,mDA/BF,sEAgCI,qDACA,uDAIJ,2BACE,mBACA,aACA,qBAEA,mCACE,gBACA,YAGF,mCACE,sBAGF,yCACE,iBAIJ,mCACE,YACA,cACA,iBAEA,2CACE,YACA,eAGF,iDACE,eAIJ,sDACE,cA8dJ,mBACE,KACE,UAEF,GACE,W;AC9iBJ,iBACE,aACA,mBACA,yDACA,qBACA,2BACA,0CACA,kDACA,kBACA,gBACA,eACA,cAGE,0DACE,aAIJ,+BACE,gBACA,cACA,SACA,yCACA,iDAEA,uCACE,aACA,YACA,eAGF,+CACE,0BAGF,wCACE,cAIJ,yBACE,WACA,cACA,kBACA,aACA,gBACA,cACA,UACA,+BACA,kBAGF,uBACE,oCAGF,wBACE,qCAGF,gCACE,yDAGF,+BACE,gBACA,0BACA,aACA,8BAEA,8CACE,mBACA,gBACA,uBACA,sBACA,OACA,cAGF,iCACE,mBACA,gBACA,uBACA,gBACA,gBACA,OAEA,wCACE,aACA,aAIJ,sCACE,8DACA,+DACA,sCAIJ,0CACE,0BACA,YAGF,iCACE,WACA,YACA,iBACA,qBACA,mBACA,cAEA,uCACE,mBAIJ,8BACE,8BACA,gCACA,aACA,+BACA,uBACA,WACA,qCACA,sDAEA,sCACE,gBAGF,8CACE,oBAGF,4CACE,4BAGF,6CACE,gBACA,0B;AC/IN,uBACE,kBACA,aACA,mBACA,uBAEA,oCAEE,wBAEA,eAGF,wCACE,eACA,cACA,eACA,oBAEA,+CACE,YACA,aAGF,mDACE,qBAGF,gDACE,qBAKF,gDACE,eACA,gBAEA,uDACE,eACA,gBAIF,uDACE,kB;AC7CR,aACE,kBACA,eACA,SACA,QACA,aACA,mBACA,gCACA,sBACA,iBACA,WACA,eACA,eACA,gEAEA,oCACE,WACA,YACA,oBAGF,uFAGE,iBACA,mBAGF,2BACE,sBAIA,uCACE,oBAIJ,4BACE,6BAGF,gCACE,gBACA,uBACA,qBAGF,gCACE,oBACA,qBACA,mBACA,kBACA,eAGF,mCACE,6CACA,gBAGF,mEAEE,0BACA,0BACA,sBACA,sBACA,UACA,cACA,aACA,UACA,gBACA,6BAEA,qHACE,uBAIJ,qFAEE,sBACA,YACA,6BAGF,+GAEE,cAGF,4CACE,eACA,eAGF,yBACE,QAGF,gDACE,oCAGF,oCACE,uBACA,oBACA,sBAEA,iDACE,8BAIJ,6DACE,gBAGF,kEACE,iBAIA,qCACE,SAEF,yCACE,QAMJ,6DACE,WACA,aACA,cAGF,6DACE,YAGF,6DACE,YAGF,6DACE,Y;ACnJF,wBACE,eAGF,kBACE,oB;ACNJ,SACE,aACA,mBACA,eAEA,qBACE,eAGF,iBACE,mBAGF,uBACE,cACA,eACA,mBACA,gBAEA,qCACE,eACA,iBACA,qBACA,gBAGF,sCACE,iBACA,6B;AC5BN,YACE,aACA,qBACA,qBAEA,uBACE,gBAGF,8BACE,sBAGF,+BACE,kBACA,mBACA,cACA,wBACA,cACA,gBACA,kBACA,iBAEA,2CACE,oBACA,uBACA,iBAIJ,gCACE,kBACA,QACA,YACA,WACA,YACA,+BACA,8BACA,oBACA,iBACA,kBAEA,sCACE,8BAGF,gDACE,gBAGF,wCACE,UACA,qCACA,qBACA,uBACA,6BAIJ,+BACE,YACA,mBAGF,gCACE,kBAGF,8BACE,kBACA,QACA,cACA,gBACA,sBACA,iBACA,+BAEA,qBACA,yBACA,sBAIF,uBACE,WACA,YACA,kBACA,WACA,YACA,sDACA,oBACA,wBAGF,4BACE,iBACA,qBACA,2BACA,UAIA,qCACE,8BAGF,mCACE,0BAKN,iCACE,aACA,gB;AClHF,MACE,gBACA,mBAEA,yBAJF,MAKI,gBAGF,qBACE,gBACA,oBACA,iBACA,sBAGF,0CAEE,6BACA,kBAGF,iBACE,oBACA,aACA,mBACA,oBAGF,yBACE,2BACA,kBAGF,oBACE,mBACA,oBAGF,6BAEE,qBAEA,mDACE,qBAGF,+CACE,qBACA,mBAKA,gJACE,aACA,yCAEA,gMACE,4CAGF,oMACE,qCAIJ,4IACE,cACA,qCAMF,wMACE,iCAIJ,+CACE,aAMA,sCACE,aACA,sCAEA,mDACE,qCAMR,mBAEE,0CAEA,+BACE,2CAGF,gCAEE,2CACA,4CACE,2CAKN,0BACE,oBACA,mBACA,2BACA,oBACA,mBACA,gBAEA,kCACE,yCACA,eACA,uBAEA,+CACE,6CAGF,oDACE,iBAKN,sBACE,iBACA,iBACA,qBAEA,+BACE,yBAEA,wDACE,0BAIJ,0BACE,oBAIJ,+BACE,4BACA,iBACA,eACA,qBACA,2CAGF,sBACE,kCACA,yCACE,2BAIJ,wCAEE,mBACA,qBAGF,cACE,oBACA,eAEA,2BACE,0BACA,mDAIJ,cACE,sB;AC3LJ,SACE,kBACA,sBACA,qBACA,yDACA,qBACA,gBACA,kBAEA,iBACE,WACA,cACA,kBACA,MACA,SACA,OACA,cACA,+BACA,sBAGF,cACE,aACA,sBACA,uBAGF,sBACE,oBACA,iCAEA,sFACE,6DAGF,mCACE,WACA,YACA,aACA,2BAEA,uCACE,WACA,YAKN,iCACE,4BACA,8BAGF,2BACE,aACA,mBAEA,yCACE,QACA,mBAGF,wCACE,QACA,cAIA,kDACE,wBASF,kMACE,WACA,qBACA,iCACA,cACA,YAKN,oEAGE,sBACA,eAGF,oBACE,0BACA,gBACA,sBAGF,qBACE,gBACA,sBAGF,2BACE,iBACA,gBAEA,uCACE,qBAIJ,kBACE,6BAEA,0BACE,UACA,Q;ACvHJ,gBACE,0BACA,gBAGF,sBACE,kBAGE,+CACE,eACA,aAEA,yBAJF,+CAKI,cAIJ,kDACE,kBACA,MACA,qBACA,cACA,oCACA,kDACA,wBACA,gBAEA,uDACE,kB;AC9BV,OACE,kBACA,gBAEA,mCACE,mCAGF,0BACE,sBAEA,sDACE,oBACA,qCACA,sCAMF,0HACE,oBAKF,uJACE,2BACA,iB;AC5BN,YACE,kBACA,YACA,aACA,eAEA,+BACE,YACA,aACA,kBACA,gBAGF,2BACE,kBACA,OACA,MACA,kBACA,gBAGF,sBACE,kBACA,MACA,OACA,WACA,YACA,oBAGF,6BACE,YACA,iBACA,eACA,mBACA,qBAGF,kKAGE,a;ACzCJ,eACE,aACA,sBAEA,oBACE,aACA,mBAGF,uBACE,OACA,WACA,eACA,gCACA,kDACA,gBACA,oBAEA,+BACE,WACA,oCACA,UAEA,kBACA,MACA,OACA,QACA,SACA,kDACA,uBACA,yBAGF,6BACE,2CAEA,qCACE,WAIJ,qCACE,cAGF,oCACE,eAGF,yBACE,kBACA,kBACA,eACA,aACA,cAEA,0CACE,iBACA,YACA,cACA,yBAKN,0CACE,6BAGF,yCACE,gBAEA,uDACE,wDAGF,sDACE,yD;AC7EN,eACE,4CACA,uCAEA,aACA,WACA,mBACA,yCACA,6BACA,0BACA,mCACA,6DACA,2DACA,mBACA,gBACA,iBACA,0BACA,mBACA,eACA,4CACA,gEAEA,sCACE,2BAGF,8CACE,WACA,cACA,kBACA,kBACA,gBACA,eACA,eACA,gCACA,yDACA,UACA,oCAEA,gEACE,oBAGF,qEACE,2BAIJ,6BACE,kBACA,YACA,cACA,YACA,gBACA,uBACA,gCACA,uBACA,WACA,gCAEA,UACA,4BAEA,wBAfF,6BAgBI,sBAGF,mCACE,iCAGF,4CACE,UAGF,oCACE,uBACA,kBACA,kBACA,OACA,WACA,kBACA,eACA,cAGF,2CACE,eACA,kDACE,aAIJ,oDACE,cACA,iBACA,cAGF,sKAIE,aAIJ,qBACE,8BAEA,oDACE,UAGF,6BACE,2CAIJ,mHAKE,0CAGF,qDACE,iCAGF,sCACE,sBAGF,sCACE,yBAGF,6OAKE,wBAGF,sCACE,aAGF,8BACE,oBACA,iBACA,0BAGF,0BACE,yBACA,iBAGF,gCACE,oBACA,mBACA,wBACA,8BAEA,wCACE,uBACA,yCACA,oBACA,UACA,gBAEA,+CACE,WACA,qBAGF,gDACE,UAEA,wDACE,UAIJ,0DACE,6BAKN,iCACE,kBAEA,wCACE,WACA,qBACA,YACA,aACA,kBACA,+BACA,2BAIJ,wBACE,eACA,q2B;AClNJ,WACE,aACA,mBACA,WACA,eACA,kBACA,iBAEA,mBACE,6CACA,aACA,mBACA,eACA,mBACA,WACA,eACA,gBACA,6BACA,uDACA,sBACA,gBACA,kCACA,oBACA,0BACA,iBAEA,mFACE,eACA,gBACA,oBAGF,4BACE,aAEA,oCACE,sBACA,iDACA,cACA,eAEA,gDACE,SAKN,0BACE,iCAGF,yBACE,mDAGF,iCACE,cAGF,gCACE,eAIJ,sBACE,mBAGF,8BACE,4CACA,WACA,0CACE,0BAGF,qCACE,kBAEA,iDACE,iC;AC9ER,SACE,aACA,qBACA,sBACA,kBAEA,4CACA,wCACA,gDACA,4DACA,0CACA,mBACA,qCACA,iDACA,+CACA,+BACA,8BACA,kCACA,4HACA,6BACA,4BAEA,0BAtBF,SAuBI,gCAGF,mBACE,yCAGF,sBACE,gEAGF,mDAEE,UACA,iCACA,8CAEA,iGACE,2BAIJ,iBACE,kBACA,SACA,OAEA,yBALF,iBAMI,aACA,eAIJ,yBACE,eACA,kBACA,cACA,iBACA,aACA,mBACA,uBACA,mBACA,UACA,uDACA,qBAEA,iCACE,qBAGF,+BACE,uBACA,qBAGF,8CACE,eAIJ,4CACE,4CAGF,6BACE,WACA,aAGF,uBACE,sBAGF,sBAGE,sBAKE,+DACE,wCAIF,2DACE,oBAMJ,6CACE,+DAKF,sDACE,UAIJ,mBACE,oBAEA,gEACE,eAGF,yBAPF,mBAQI,sBAEA,gEACE,qBAKN,aACE,2BACA,gDACA,4CACA,oDACA,gEACA,8CACA,mBACA,wCACA,yCACA,2CACA,oCACA,0CACA,sCACA,8BACA,4BACA,4CAEA,0BAlBF,aAmBI,mBAGF,oDAEE,0DACA,4DACA,8DAGF,yBA7BF,aA8BI,sBAKF,2EAEE,kDACA,UACA,6DACA,wBAIJ,mBACE,mCAGF,oBACE,qCAEA,8BACE,qCAGF,kCACE,qCAEA,4CACE,qCAKN,6BACE,eAEA,yBAHF,6BAII,iEAIA,+GAEE,6BAIJ,mDACE,WACA,kBACA,aACA,gBACA,WACA,YACA,qCAKA,wIACE,qBAIJ,qDACE,UAKF,6CACE,8BAEA,0DACE,uBAEA,sEACE,8BAON,wDACE,8BAIJ,6HAEE,qDAGF,qIAEE,yDAGF,wCACE,eACA,aAIA,kGACE,yDACA,2BACA,qBAEA,yGACE,+BAMN,eACE,kBAEA,uCACE,kBACA,SACA,UACA,UAKF,iDACE,uCAGF,4DACE,kBACA,YACA,cACA,WAGF,kFACE,iEAIA,wEACE,8BAGF,0GACE,6CAOJ,4FACE,8BAGF,wEACE,2BAMA,oEACE,iBAGF,6EACE,gBACA,oCACA,qCAGF,uFACE,YAIJ,2DACE,gBAEA,mEACE,oBAGF,4EACE,uCACA,wCAOA,wPACE,gBAEA,sQACE,WACA,cACA,eACA,sBACA,gBACA,oCACA,kBASA,kSACE,mCACA,qCAEA,gTACE,mCACA,2CAaV,4OACE,4CAIA,4PACE,yDACA,gDAKN,uDACE,iBAGF,+CACE,qDAIA,2DACE,aACA,yBAEA,4EACE,WAMR,oCACE,kBAEA,4DACE,kBACA,UAIJ,iCACE,kBACA,OACA,cACA,aACA,cACA,sBACA,kBACA,wCAEA,aACA,mBACA,uBAEA,WACA,eAEA,UACA,oBACA,4CAEA,8CACE,kBACA,UACA,SACA,mBAGF,6CACE,uBAIJ,iBACE,mBAIA,wDACE,gCAIA,+EACE,gCAKF,gFACE,6BAOR,sKAME,qDACA,uDACA,2DACA,6DAGF,8BACE,kCAGF,aACE,gBAEA,6BACE,2BAIJ,SACE,wDACA,yDACA,2DACA,4DAGE,sDACE,iEAGF,4DACE,8DACA,iEAGF,sDACE,8DAGF,iCACE,iEAEA,+DACE,+BAMJ,gDACE,kEAGF,sDACE,+DACA,kEAGF,gDACE,+DAGF,2BACE,kEAEA,yDACE,gCACA,6BAQF,wNAEE,+BACA,gCAKF,gLAGE,mBAIJ,+QAIE,4BACA,6BAGF,qEACE,qBAIJ,gCACE,kBACA,SACA,WACA,gCAEA,UACA,4BAEA,wBATF,gCAUI,sBAGF,mHAGE,4CAMF,oGACE,UAIJ,oCACE,WAGF,0CACE,YAGF,wBACE,WACA,UACA,kBAIJ,8CACE,cCrpBF,iBACE,kBACA,2BAEA,yBAJF,iBAKI,gCAEA,uEAEE,gCAIF,kDAbJ,iBAcM,sCACA,yCACE,sCAEF,8BACE,uCAIJ,mCACE,6BAEA,2GAEE,+BAIF,iDATF,mCAUI,mCACA,2DACE,qCAEF,gDACE,uCAMR,qBACE,2BACA,yBAGF,+BACE,SACA,sBACA,mBACA,mBACA,kBACA,uBAGF,mCACE,uBAKA,sGACE,kBACA,YACA,uBACA,YACA,iBACA,8CACA,qBACA,qBAEA,4KACE,kDACA,gBAGF,0KACE,WAGF,0KACE,aAGF,oVAEE,UAGF,0KACE,aAKF,wHACE,WACA,qBACA,sBAKN,+CACE,kBACA,YACA,uBACA,YACA,cACA,8CACA,iBACA,qBACA,oBAEA,kFACE,kDACA,gBAGF,iFACE,WAGF,iFACE,aAGF,kKAEE,UAGF,iFACE,aAKF,4CACE,WACA,cACA,WAGF,kDACE,oBACA,0BACA,oBAEA,iEACE,oBAMJ,4DACE,qCAEA,kEACE,gCAKN,oCACE,yCAEA,gDACE,8CAGF,mDACE,YAIJ,0CACE,mBACA,qBACA,kBAGF,gCACE,mBACA,gBACA,uBACA,yDACA,gBACA,oBACA,0BACA,uBACA,aAEA,6CACE,gBACA,uBAGF,yFACE,eAEA,qGACE,YAIJ,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,yCACE,0BAGF,kEACE,0BAGF,sCACE,kBAGF,qCACE,qBACA,gBAGF,0CACE,oBAGF,6CACE,OACA,iBACA,iBACA,gBACA,iBACA,mBACA,6CAEA,0DACE,0BAKN,4BACE,iDAGF,iGACE,mCAGF,sCACE,+BAEA,yGACE,WACA,qBACA,iCACA,YAIJ,kDACE,wBAGF,+DACE,qBAGF,kDACE,aAGF,+BACE,gBACA,kBACA,kBACA,eACA,gBACA,0BAEA,uCACE,6BAGF,4CACE,gBAGF,kDACE,eAKF,iEACE,wBAMA,2DACE,yBACA,UACA,8BAKN,0BACE,yBAGE,4CACE,kDAIJ,8CACE,oBAMF,8IAEE,sBACA,uBAIJ,uBACE,yBAEA,4CACE,iBAIJ,uBACE,gBACA,wCAEA,yBAJF,uBAKI,iBAGF,4CACE,kBAIA,8DACE,yBAKN,2CACE,qBACA,cACA,wBACA,kBACA,sBACA,2BAEA,sDACE,wDACA,kBAIJ,yDACE,kDACA,mDACA,4DAGF,mCACE,4BACA,6BAGF,yCACE,6BAEA,uEACE,oBACA,kBACA,YACA,4BACA,8BACA,gBACA,yCACA,4CAEA,oFACE,kBAIJ,sDACE,mBAOJ,0DACE,aACA,uBACA,mBAEA,kFACE,eAEA,wGACE,yBAKN,8DACE,sBAGF,gdAME,oBACA,qBAEA,4vBACE,sBAIJ,oEACE,sBAGF,sTAIE,mBACA,wBAEA,8fACE,yBAKJ,4HAEE,sBAEA,gOACE,sBAIJ,8DACE,aACA,mBACA,uBAEA,oFACE,WACA,mBACA,+CAIJ,gIACE,kBACA,aACA,mBACA,uBACA,WACA,WACA,yBAEA,wJACE,UAGF,4JACE,aACA,mBACA,uBACA,eACA,gBACA,kBACA,2BAGF,4MACE,6BAEA,wPACE,UAKN,8DACE,iBAGF,kEACE,iBAGF,sKAEE,2BACA,WACA,iBACA,kBACA,cACA,aACA,UACA,kBACA,qBACA,qBACA,gEAGF,wGACE,0BACA,oBACA,oBAIJ,8BACE,gBACA,gBACA,aACA,eACA,qBAEA,2CACE,mBACA,wBAEA,uDACE,kBAIJ,uCACE,eAGF,6CACE,aACA,uBACA,2BACA,cAEA,+CACE,gBAGF,8DACE,kBACA,4CAEA,yBAJF,8DAKI,8BAGF,yBARF,8DASI,kBACA,UACA,8BAKN,4CACE,mBAGF,2CACE,cACA,eACA,cAEA,uDACE,MACA,OACA,SACA,QAIJ,qCACE,qBACA,kBAEA,gDACE,wDACA,kBAKF,uDACE,gBACA,4EACA,iEACE,+HAGF,oEACE,iBAKN,2CACE,eACA,iBAEA,0DACE,YAGF,yDACE,gBACA,kBAGF,+DACE,gBAGF,kDACE,WACA,YAIJ,2CACE,eACA,iBACA,gBAEA,wDACE,mBAGF,+DACE,gBAGF,kDACE,WACA,YACA,qBAIJ,2CACE,eACA,mBACA,gBAEA,wDACE,kBAGF,+DACE,gBAGF,kDACE,WACA,YACA,qBAIJ,iDACE,wCACA,0CAGF,2CACE,4CACA,8CAEA,0DACE,mBAEA,2EACE,mBAEA,yBAHF,2EAII,cACA,UACA,gCAOV,mBAmCE,8DACA,+DACA,iEACA,kEArCA,+HAIE,oBAGF,uDACE,kBACA,kBACA,qBAEA,+DACE,WACA,cACA,kBACA,MACA,SACA,YACA,UACA,+BACA,kBAGF,gEACE,6BAEA,wEACE,UACA,aAUN,gCACE,oBACA,gCAIJ,qBACE,qBAGF,kBACE,oCACA,gCACA,sBACA,eACA,qBAEA,2EACE,qCAIJ,mCACE,wBACA,gCACA,qBACA,SACA,gBACA,kBACA,uhB;AC/yBF,kBACE,mEACA,sEAEA,mBACA,oBAEA,0BACE,aAGF,oCACE,iBACA,sCACA,gDACA,2B;ACfJ,iBACE,WACA,YACA,aACA,mBACA,uBACA,kBAEA,0BACE,oBACA,sBACA,mBACA,gCACA,cACA,oBACA,qBACA,WAGF,wBACE,gBACA,gBAGF,8BACE,mBACA,gBAGF,0BACE,mBACA,aACA,YACA,eAEA,qCACE,aACA,Y;ACrCN,sBACE,YACA,aACA,mBACA,uBACA,mBAEA,cACE,mBACA,sBAGF,mBACE,sBACA,gCACA,gBACA,oBACA,qBACA,WACA,+BAEA,gBACE,oBAIJ,eACE,eACA,qBACA,kBACA,uBACA,0BAGF,kBACE,SACA,UACA,gBACA,uBACA,8BAGF,kBACE,kBACA,UACA,gBACA,uBACA,gBACA,yCAEA,WACE,wBACA,C;AClDN,aACE,OACA,WACA,oBAEA,gBACA,kBACA,gBAGA,6C3BJA,+B2BNF,a3BOI,mBAGA,mB2BEF,oCACE,2BAGF,iCACE,sIAGF,wBApBF,aAqBI,gEACA,mBAEA,gCACE,gEACA,uBAIJ,uDA9BF,aA+BI,mEACA,mCACE,kBACA,+CAEA,2EACE,4BAKN,yCACE,aAGF,iCACE,WACA,0CACA,gBACA,cACA,aACA,yBACA,sBACA,6BAEA,wDACE,4BAGF,yBAdF,iCAeI,YACA,wBAEA,UAIJ,yBACE,gBAEA,uCACE,mBAIJ,yDACE,gBAEA,qFACE,uBAEA,yBAHF,qFAII,uBAGF,iHACE,uBAKN,yBACE,+BACE,gBACA,6CACE,sBAEA,uDACE,yEACE,4DAOV,kDAEE,kBAEA,UACA,mBACA,+CAEA,wEACE,qBACA,UAKF,wEACE,eAGF,kEACE,WACA,kBACA,eACA,kBACA,WACA,YACA,gBACA,WAEA,UACA,4CAEA,gHACE,2BAKF,0GACE,kBAKF,4GACE,eAIJ,kFAEE,2BAOA,wWACE,WAEA,wcACE,WAMR,oBACE,WACA,YACA,aACA,mBACA,uBAEA,yBACE,cACA,gBAGF,sCACE,yBACA,0BAEA,wFACE,qBAKN,6GAIE,kBACA,gEAEA,iIACE,qBACA,gCACA,WACA,0DACA,gBACA,iBACA,gBACA,4CACA,sBAEA,0WAEE,yDACA,yDAGF,qLACE,2BACA,kDACA,mDACA,4DAKN,0BACE,gBACA,mBACA,6BACA,oBACA,UACA,4BAEA,iEACE,UAEA,sEACE,oBAIJ,iDACE,gBAGF,sCACE,eAGF,+BACE,oBAIJ,sDACE,gBACA,YAGF,0BACE,gBAGF,kDACE,wBAGF,4CACE,uBAGF,+DAEE,iBACA,oBAIA,yCACE,eAEA,+CACE,0BAKN,yCACE,mBAGF,0BAxSF,aAySI,WACA,+BACA,6CAEA,iCACE,6CAGF,oCACE,gBAGF,qCACE,kEAGF,0NAGE,6CAEA,sRACE,YAKN,yBApUF,aAqUI,6CAEA,gDACE,+BAGF,sCACE,wGAKF,+CACE,QAIF,iCANF,4BAOI,uBACA,sB;AC1VN,kBACE,wBAEA,kBACA,8BACA,WACA,UACA,6BACA,6EACA,oCACA,oBAEA,6CAZF,kBAaI,6CAGF,yCACE,0BAEA,wBAGF,yBAtBF,kBAuBI,YACA,cAEA,uDACE,8CACE,oDAKN,wBACE,aACA,sBACA,mBAEA,gCACE,iDACA,mCAEA,kCACE,kBAIJ,0BAdF,wBAeI,wBAEA,6CAEA,+CACE,2BAGF,gDACE,4DAIJ,yBACE,gCACE,eACA,iBAKN,2BACE,wBACA,UACA,mBAEA,8DACE,2BAIJ,gCACE,iBACA,cACA,iBACA,qBACA,kBACA,mBACA,gBACA,kBAEA,kBACA,YACA,cAEA,8BACA,WAEA,oBAEA,yBAnBF,gCAoBI,YACA,YAIJ,yBACE,2CACE,oG;ACzGJ,yBACE,sBACA,gBACA,iDAGF,0BACE,aACA,sBACA,yBACA,gBACA,cAEA,yBAPF,0BAQI,iBAGF,+BACE,aACA,mBAGF,oCACE,mBAGF,kCACE,OACA,WACA,YACA,qBACA,kDACA,sCACA,mCACA,2BACA,gBACA,oBAEA,wCACE,WACA,wCACA,sCAIJ,0CACE,oB;AC/CN,yBACE,gBACA,wDAEA,mEACE,aAGF,oCACE,oBAGF,gDACE,2BAGF,6BACE,aACA,mBACA,sBACA,qBAGF,qCACE,cACA,2BACA,aACA,gBACA,wBACA,UACA,kBAEA,yBATF,qCAUI,gB;ACjCN,gBACE,gBACA,wDAsBA,qCApBA,uCACE,2BAGF,0DACE,aAGF,2BACE,oBAIF,oBACE,aACA,mBACA,sBACA,qBAKF,yCACE,kBAGF,4BACE,cACA,2BACA,aACA,gBACA,wBACA,UACA,kBAEA,yBATF,4BAUI,gBAIJ,yBACE,YACA,mCACA,gCAEA,iCACE,UACA,cAGF,iDACE,aAGF,gFAEE,OACA,eACA,gBAGF,qCACE,mBACA,uBAGF,2CACE,gBACA,mBACA,uB;ACvEN,UACE,qBAEA,oDACE,kBACA,mBACA,SAEA,uDALF,oDAMI,oCAGF,yBATF,oDAUI,oBAGF,4DACE,eAEA,yBAHF,4DAII,YAIJ,kEACE,UAIJ,wBACE,kBAGF,+BACE,KACE,WACA,mBAGF,GACE,aACA,oBAIJ,kBACE,cACA,kBAEA,+BACE,mCAGF,yBARF,kBASI,eACA,iBAGF,mIAIE,kBAIA,2MAGE,2BAIJ,yBACE,kBACA,UAEA,+DACE,mCAIJ,4BACE,kBACA,UACA,0BAIA,kCACE,iCAGF,qHAGE,0CAKF,0CACE,iCAGF,6HAGE,0CAKF,8CACE,iCAGF,iHAGE,0CAKF,mCACE,iCAGF,oHAGE,0CAIJ,8BACE,kCAIA,8bACE,kCAKN,0BACE,UAGF,wEACE,wDAGF,qCACE,eACA,gBACA,kBAEA,mJAGE,kBAGF,8CACE,uBAGF,iDACE,iCAGF,kGACE,0CAGF,iDACE,kCAIA,yDACE,iCAGF,2HACE,0CAKF,gEACE,iCAGF,uHACE,0CAMR,iBACE,YACA,4BACA,mCACA,4CACA,6BACA,iDACA,kBACA,UAEA,+BACE,kBACA,kBACA,gBACA,eACA,eACA,yBACA,0BAEA,uCACE,6BAIJ,yBAxBF,iBAyBI,iCAIJ,uBACE,aAEA,gCACE,kBACA,uBACA,qBAGF,+BACE,cACA,2BACA,aACA,cACA,SACA,UACA,oBAEA,2DACE,mCAGF,uCACE,kBAGF,yBAjBF,+BAkBI,eACA,gBAEA,uCACE,wBAIJ,4CACE,sCAGA,0GACE,yCAIJ,yDACE,WACA,kBACA,WACA,cACA,8CACA,uBACA,YACA,aACA,kBACA,qCACA,mEACA,yBAZF,yDAaI,UACA,aAKN,oCACE,YACA,gBAGF,wCACE,qBACA,kBACA,mBACA,cACA,0BACA,sGAEA,+CACE,WACA,aACA,cACA,8BACA,sBACA,kBACA,QACA,qBACA,gBACA,mDAGF,yBArBF,wCAsBI,gBACA,sBAKN,wCAEE,kBAEA,oEACE,qIACA,gBACA,kBACA,iFACA,uBACA,mBACA,0CAEA,4LAEE,gHAGF,wFACE,gBACA,kBAIA,4OACE,aAIJ,kGACE,oBAIJ,4JAEE,kBACA,gCACA,oBACA,uBACA,mBACA,mBACA,0CACA,kEACA,YACA,mBACA,gBACA,uBACA,eAGF,gFACE,uBACA,OAGF,8FACE,QAGF,4EACE,oCACA,eACA,qBAEA,8QACE,qCAIJ,sDACE,kBACA,MACA,OACA,UACA,oBACA,YACA,uBACA,mBAIJ,oBACE,YAEA,kCACE,gBACA,kCACA,uBACA,2BACA,2BACA,8BACA,kBACA,iBACA,mBACA,wEACA,qBAUA,6BARA,yBAbF,kCAcI,gBACA,oBACA,iBACA,0EACA,eAKF,yDACE,2BAIJ,8EAEE,kEAEA,yBAJF,8EAKI,qEAKF,mDACE,eACA,gBAMF,+KACE,kBAIJ,2BACE,cACA,eACA,kBACA,iBACA,oBAKF,kCACE,eACA,mBACA,iBAGF,sCACE,gBACA,eAIJ,kBACE,kBACA,0BACA,OACA,WACA,mCACA,4CACA,gBACA,iBAEA,kBACA,gBAGA,iDAEA,UACA,6BACA,wBACA,6EhCpfA,+BgCieF,kBhCheI,mBAGA,mBgCkfF,8BACE,aAGF,uBACE,UACA,wBAGF,2BACE,cAIJ,sCACE,KACE,UAEF,GACE,Y;ACjhBJ,kBACE,kBACA,MACA,OACA,SACA,QACA,gBACA,WACA,+CAEA,yBACE,WACA,kBACA,MACA,OACA,SACA,QACA,+CACA,2BACA,4BACA,sBAEA,4DACE,uEAGF,gDACE,gBAGF,sCACE,yDAEA,yBAHF,sCAII,0DAKN,gEACE,UAGF,0CACE,qDACA,YACA,qBAGF,kDACE,kBAGF,sCACE,gDACE,6BACA,gBACA,mBACA,6BACA,6CAGF,4GACE,kCAKF,sCADF,4GAEI,iCAGF,sCALF,4GAMI,kCAKN,cACE,aACA,uBACA,YACA,kBACA,UACA,YAEA,yBARF,cASI,iBAGF,+BACE,wDAEA,aACA,sBACA,mBACA,WACA,YACA,kBACA,gBAEA,2CACE,WACA,YACA,gBAEA,+CACE,aACA,sBACA,mBAMJ,wCACE,WACA,aACA,4CACA,mCACA,kCACA,kBACA,iDAKF,yCACE,kCACA,kGAEA,iDACE,mCACA,8CAIA,wIACE,2BAKN,+EACE,UACA,4CAEA,6HACE,2BAIJ,gCACE,UACA,mBACA,gHAEA,uDACE,2BAIJ,2EACE,oBAIA,6DACE,SAGF,qDACE,6FACA,yDAEA,6DACE,sCAIJ,2DACE,yBAEA,yBAHF,2DAII,0BAIJ,uGACE,UAGF,4CACE,qBACA,qBAKN,kCACE,oBACA,8CAEA,iEACE,UACA,4CAEA,wFACE,2BAIJ,yDACE,2BAGF,8CACE,kDACA,oBAEA,6EACE,UAKN,oCACE,WACA,0CACA,eACA,kBACA,aACA,qBACA,+BAEA,+BACA,uDAEA,2DACE,2BAGF,0BAhBF,oCAiBI,6CAEA,4DACE,mEAIJ,yBAxBF,oCAyBI,gBAEA,6DACE,wGAIJ,uDACE,sDACE,2CACA,MAEA,4EACE,iCAKN,4CACE,WACA,kBACA,eACA,OACA,QACA,WACA,qJACA,UACA,8BAEA,yBAXF,4CAYI,SACA,WAIJ,uDACE,UAGF,4DACE,qJAMN,oDAGE,sBAEA,yBALF,oDAMI,qBAIJ,6FAKE,WACA,aACA,uBACA,kBAOA,6KACE,8DACA,4CAIJ,uCACE,WACA,aACA,uBACA,kBACA,uBAEA,yDACE,0BACA,yBAEA,qBAEI,2EACE,0BAKN,yBAEI,uJACE,0BAKN,qEACE,+BACA,yBACA,kCACA,iBACA,sBAIJ,uHAEE,cACA,oBACA,+EAEA,2MACE,gBACA,4CAGF,yBAXF,uHAYI,eAIJ,yBApDF,uCAqDI,sBAEA,uDAvDJ,uCAwDM,4DAIJ,oEACE,sB;ACrYJ,aACE,aACA,mBACA,4BACA,uBACA,oBAEA,yBAPF,aAQI,eAGF,2BACE,cAGF,yBACE,OACA,YAEA,6BACE,aACA,mBAIJ,gBACE,gBACA,kBACA,gBACA,qBAGF,oBACE,aACA,iBAGF,0BACE,iBAEA,yBAHF,0BAII,mBAIJ,2BACE,iB;AC5CJ,SACE,YACA,aACA,sBAEA,kBACA,iDANF,SnCOI,mBAGA,mBmCDF,iCACE,oBAEA,gDACE,2BAIJ,kCACE,4BACA,2EACA,8DAEA,0CACE,gBAGF,yDACE,uCACA,oCAGF,4CACE,iBAGA,sDACE,cACA,kBAKN,+BACE,UAIJ,cACE,aACA,8BAEA,uBACE,mCACA,SACA,UAEA,4BACE,oBAEA,iCACE,mBAGF,8BACE,aAKN,0BACE,OAIA,kCACE,YACA,iBACA,aACA,uBACA,uBAEA,2CACE,wBAIJ,kCACE,aACA,qCACA,mBACA,kBAGF,sCACE,gBAEA,kDACE,mBAIJ,kCACE,gBAEA,gHAEE,aAIJ,oEAEE,gBAGE,gHACE,MACA,OACA,aACA,mBACA,uBAGF,gGACE,qBAKN,4EAEE,mBAEA,yBAJF,4EAKI,gBACA,wIACE,U;AC1IV,gBACE,YACA,gBACA,kBAEA,sBACE,YACA,gB;ACPJ,aACE,kBACA,MACA,QACA,gCACA,YACA,uDACA,mCACA,2CACA,8BAEA,6CAEA,oCACE,gBAKA,qFACE,wBAIJ,0BAxBF,aAyBI,8DACA,kBAGF,yBA7BF,aA8BI,YACA,oCAGF,qDAlCF,aAmCI,0CAGF,yBACE,yCACA,gBAGF,4CACE,iBACA,cACA,kBAEA,oDACE,oBAEA,6DACE,0BAIJ,mDACE,aACA,uBACA,mBAEA,sDACE,gBACA,kBACA,iBACA,qBACA,sBAGF,iEACE,mBACA,oBAGF,0DACE,aACA,cACA,uBAIJ,oDACE,kBACA,cAKN,qBACE,kBACA,MACA,OACA,QACA,SACA,8BACA,gBACA,kBACA,oBAEA,0BAXF,qBAYI,gBAGF,+BACE,aAGF,uCACE,kBACA,MACA,QACA,SACA,OACA,WACA,gBACA,UAEA,yBAVF,uCAWI,2CAEA,8DACE,iBAKN,8FACE,mBAIA,yBACE,+DACE,uCAIJ,0DACE,oBACA,+B;AC3IN,MACE,YACA,gBACA,gBAEA,0BALF,MAMI,mBAGF,yBATF,MAUI,mCAGF,yBAbF,MAcI,aACA,+BACA,yBAIJ,uBACE,iCACA,oHACE,yBACA,gBAIJ,YACE,gBACA,WACA,kBACA,YACA,kBAEA,gBACE,YACA,gBAGF,yBAZF,YAaI,mCAGF,yBAhBF,YAiBI,gBAGF,0BApBF,YAqBI,WACA,gBAGF,yBAzBF,YA0BI,eACA,OACA,MACA,kCACA,yBAEA,mCACA,6CAEA,mCACE,gBAGF,mBACE,WACA,cACA,kBACA,OACA,MACA,QACA,SACA,gBACA,sCACA,2CACA,UAEA,0CACE,gBAIF,mCACE,aAGF,wDACE,cAIJ,2CACE,+BAEA,kDACE,UACA,oBAIJ,6CACE,gBAEA,mDACE,iBAKN,yBApFF,YAqFI,eACA,uBACA,mCAEA,2CAzFJ,YA0FM,0CACA,gDAMJ,yBADF,aAEI,yCAGF,8CACE,gBAEA,gEACE,gBAKN,mDACE,gBAGF,cACE,2CAEA,yBAHF,cAII,eACA,eACA,OACA,MACA,SACA,QAEA,+BACA,6CAEA,qCACE,gBAGF,6CACE,sCAIJ,yBAvBF,cAwBI,iBAEA,6CACE,mCAGF,sCACE,oCAIJ,+CACE,gBAEA,qDACE,gBAKN,kCACE,sCAEA,6IACE,6EAIA,gFACE,aAKF,+EACE,kCACA,UAKF,uEACE,+BACA,UAKF,8EACE,aAKF,6EACE,kCACA,UAKF,wEACE,+BACA,U","sources":["webpack://telegram-t/./src/components/left/main/LeftMainHeader.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/left/ConnectionState.scss","webpack://telegram-t/./src/components/left/NewChatButton.scss","webpack://telegram-t/./src/components/left/main/LeftMain.scss","webpack://telegram-t/./src/components/left/LeftColumn.scss","webpack://telegram-t/./src/components/middle/AudioPlayer.scss","webpack://telegram-t/./src/components/calls/group/GroupCallTopPane.scss","webpack://telegram-t/./src/components/middle/MiddleHeader.scss","webpack://telegram-t/./src/components/common/EmbeddedMessage.scss","webpack://telegram-t/./src/components/middle/message/ReactionAnimatedEmoji.scss","webpack://telegram-t/./src/components/middle/message/MessageMeta.scss","webpack://telegram-t/./src/components/middle/message/Sticker.scss","webpack://telegram-t/./src/components/middle/message/Contact.scss","webpack://telegram-t/./src/components/middle/message/PollOption.scss","webpack://telegram-t/./src/components/middle/message/Poll.scss","webpack://telegram-t/./src/components/middle/message/WebPage.scss","webpack://telegram-t/./src/components/middle/message/Invoice.scss","webpack://telegram-t/./src/components/middle/message/Album.scss","webpack://telegram-t/./src/components/middle/message/RoundVideo.scss","webpack://telegram-t/./src/components/middle/message/InlineButtons.scss","webpack://telegram-t/./src/components/middle/message/CommentButton.scss","webpack://telegram-t/./src/components/middle/message/Reactions.scss","webpack://telegram-t/./src/components/middle/message/Message.scss","webpack://telegram-t/./src/components/middle/message/_message-content.scss","webpack://telegram-t/./src/components/middle/message/SponsoredMessage.scss","webpack://telegram-t/./src/components/middle/ContactGreeting.scss","webpack://telegram-t/./src/components/middle/NoMessages.scss","webpack://telegram-t/./src/components/middle/MessageList.scss","webpack://telegram-t/./src/components/middle/ScrollDownButton.scss","webpack://telegram-t/./src/components/middle/composer/BotKeyboardMenu.scss","webpack://telegram-t/./src/components/middle/composer/ComposerEmbeddedMessage.scss","webpack://telegram-t/./src/components/middle/composer/WebPagePreview.scss","webpack://telegram-t/./src/components/middle/composer/Composer.scss","webpack://telegram-t/./src/components/middle/MiddleColumn.scss","webpack://telegram-t/./src/components/right/RightHeader.scss","webpack://telegram-t/./src/components/right/Profile.scss","webpack://telegram-t/./src/components/right/AddChatMembers.scss","webpack://telegram-t/./src/components/right/RightColumn.scss","webpack://telegram-t/./src/components/main/Main.scss"],"sourcesContent":["@import '../../../styles/mixins';\n\n#LeftMainHeader {\n position: relative;\n\n .animated-menu-icon {\n position: absolute;\n\n &, &::before, &::after {\n width: 1.125rem;\n height: 0.125rem;\n border-radius: 0.125rem;\n background-color: var(--color-text-secondary);\n transition: transform .25s;\n transform: rotate(0);\n }\n\n &::before, &::after {\n position: absolute;\n left: 0;\n content: '';\n }\n\n &::before {\n top: -0.3125rem;\n }\n\n &::after {\n top: 0.3125rem;\n }\n\n &.state-back {\n transform: rotate(180deg);\n\n &::before {\n transform: rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem);\n }\n\n &::after {\n transform: rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem);\n }\n }\n\n &.no-animation {\n transition: none;\n\n &::before, &::after {\n transition: none;\n }\n }\n }\n\n .archived-badge {\n min-width: 1.5rem;\n height: 1.5rem;\n margin-left: auto;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .45rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.5rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n }\n\n [dir=rtl] .archived-badge {\n margin-left: 0;\n margin-right: auto;\n }\n\n .Menu .bubble {\n min-width: 17rem;\n max-height: calc(100 * var(--vh) - 3.75rem);\n\n overflow-y: auto;\n @include overflow-y-overlay();\n }\n\n // @optimization\n @include while-transition() {\n .Menu .bubble {\n transition: none !important;\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","#ConnectionState {\n flex: 0 0 auto;\n display: flex;\n align-items: center;\n margin: 0 0.5rem 0.5rem;\n padding: 0.75rem;\n background: var(--color-yellow);\n border-radius: var(--border-radius-default);\n\n > .Spinner {\n --spinner-size: 1.75rem;\n }\n\n > .state-text {\n color: var(--color-text-lighter);\n font-weight: 500;\n line-height: 2rem;\n margin-inline-start: 1.875rem;\n white-space: nowrap;\n }\n\n @media (max-width: 950px) {\n > .state-text {\n margin-inline-start: 1.25rem;\n }\n }\n}\n",".NewChatButton {\n position: absolute;\n right: 1rem;\n bottom: 1rem;\n transform: translateY(5rem);\n\n transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n body.animation-level-0 & {\n transform: none !important;\n opacity: 0;\n\n transition: opacity .15s;\n\n &.revealed {\n opacity: 1;\n }\n }\n\n &.revealed {\n transform: translateY(0);\n\n @media (max-width: 600px) {\n // Force rendering in the composite layer to fix the z-index rendering issue\n transform: translate3d(0,0,10px);\n transform-style: preserve-3d;\n }\n }\n\n &.menu-is-open {\n &::before {\n content: '';\n display: block;\n position: absolute;\n top: -13rem;\n left: -11rem;\n right: -1rem;\n bottom: -1rem;\n z-index: -1;\n }\n }\n\n .is-touch-env & {\n .Menu > .backdrop {\n position: absolute;\n left: -100vw;\n right: -100vw;\n top: -100vh;\n bottom: -100vh;\n }\n }\n\n > .Button {\n .icon-new-chat-filled,\n .icon-close {\n position: absolute;\n }\n\n &:not(.active) {\n .icon-new-chat-filled {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-close {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.active {\n .icon-close {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-new-chat-filled {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n }\n}\n","#LeftColumn-main {\n height: 100%;\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n z-index: 1;\n\n .connection-state-wrapper {\n position: absolute;\n top: 3.75rem;\n width: 100%;\n }\n\n > .Transition {\n flex: 1;\n overflow: hidden;\n transition: transform 300ms ease;\n\n &.pull-down {\n transform: translateY(3.75rem);\n }\n }\n\n .ChatFolders {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .tabs-placeholder {\n height: 2.625rem;\n transition: height 150ms ease;\n\n &:not(.open) {\n height: 0;\n }\n }\n\n .TabList {\n justify-content: flex-start;\n padding-left: .5625rem;\n padding-bottom: 1px;\n border-bottom: 0;\n z-index: 1;\n }\n\n .Tab {\n flex: 0 0 auto;\n padding-left: 0.625rem;\n padding-right: 0.625rem;\n\n > span {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n }\n }\n\n > .Transition {\n flex: 1;\n overflow: hidden;\n }\n }\n\n .RecentContacts, .LeftSearch, .search-content {\n height: 100%;\n overflow-y: auto;\n }\n\n .btn-update {\n position: absolute;\n bottom: 1rem;\n left: 1rem;\n right: 1rem;\n margin: 0 auto;\n }\n}\n","#NewChat {\n height: 100%;\n}\n\n.left-header {\n height: var(--header-height);\n padding: 0.375rem 1rem .5rem 0.8125rem;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n background-color: var(--color-background);\n\n h3 {\n margin-bottom: 0;\n font-size: 1.25rem;\n font-weight: 500;\n margin-left: 1.375rem;\n margin-right: auto;\n }\n\n .SearchInput {\n margin-left: 0.875rem;\n max-width: calc(100% - 3.25rem);\n\n @media (max-width: 600px) {\n max-width: calc(100% - 3rem);\n }\n }\n\n @media (max-width: 600px) {\n padding: 0.5rem;\n }\n\n .Button.smaller {\n width: 2.5rem;\n height: 2.5rem;\n\n + .DropdownMenu {\n margin-left: .25rem;\n }\n }\n}\n",".AudioPlayer {\n display: flex;\n margin-left: auto;\n margin-top: -.25rem;\n margin-bottom: -.25rem;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n > .Button {\n flex-shrink: 0;\n margin: .125rem;\n }\n\n > .player-button {\n --color-text-secondary: var(--color-primary);\n --color-text-secondary-rgb: var(--color-primary-shade-rgb);\n --color-primary-shade: var(--color-green);\n --color-white: var(--color-background-own);\n }\n\n .player-button {\n &.smaller {\n width: 3rem;\n height: 3rem;\n\n i {\n font-size: 1.625rem;\n margin-top: -.025rem;\n }\n }\n\n i {\n position: absolute;\n font-size: 1.9375rem;\n margin-top: -.05rem;\n\n &.icon-play {\n margin-left: .1rem;\n }\n }\n\n .icon-play, .icon-pause {\n opacity: 1;\n transform: scale(1);\n transition: opacity .4s, transform .6s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n &.play .icon-pause,\n &.pause .icon-play,\n &.loading .icon-play,\n &.loading .icon-pause {\n opacity: 0;\n transform: scale(.5);\n }\n }\n\n .volume-button {\n position: relative;\n overflow: visible;\n\n .volume-slider-spacer {\n position: absolute;\n transform: translateY(100%);\n bottom: 0;\n height: 1rem;\n width: 8rem;\n cursor: default;\n visibility: hidden;\n }\n\n &:hover .volume-slider-spacer, .volume-slider-spacer:hover {\n visibility: visible;\n }\n\n .volume-slider {\n opacity: 0;\n visibility: hidden;\n\n position: absolute;\n background: var(--color-background);\n bottom: -1rem;\n transform: translateY(100%);\n transition: opacity 0.2s ease-in-out, visibility 0.2s ease-in-out;\n width: 8rem;\n padding: 0.75rem;\n border-radius: 0.5rem;\n cursor: default;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n .RangeSlider {\n margin-bottom: 0;\n input[type=range] {\n margin-bottom: 0;\n }\n }\n }\n\n &:hover .volume-slider,\n .volume-slider:hover,\n .volume-slider-spacer:hover + .volume-slider {\n opacity: 1;\n visibility: visible;\n }\n }\n\n .playback-button {\n &.applied {\n --color-text-secondary: var(--color-primary);\n }\n\n .playback-button-inner {\n transition: 0.2s color ease-in-out;\n font-size: 0.75rem;\n font-weight: bold;\n border: 2px solid;\n border-radius: 0.375rem;\n padding: 0.15rem 0.25rem;\n font-variant-numeric: tabular-nums;\n }\n }\n\n &-content {\n display: flex;\n justify-content: center;\n flex-direction: column;\n flex-shrink: 1;\n padding: 0 .5rem;\n position: relative;\n overflow: hidden;\n cursor: pointer;\n border-radius: var(--border-radius-messages-small);\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n }\n\n @media (min-width: 1440px) and (max-width: 1500px) {\n max-width: 14rem;\n }\n\n .AudioPlayer & .title {\n display: block;\n font-weight: 500;\n font-size: 0.875rem !important;\n line-height: 1rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n body.is-ios & {\n font-size: .9375rem !important;\n line-height: 1.125rem;\n }\n }\n\n .subtitle {\n font-size: 0.85rem !important;\n color: var(--color-text-secondary);\n line-height: 0.85rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: .125rem 0 0;\n\n body.is-ios & {\n font-size: .9375rem !important;\n line-height: 1.125rem;\n }\n }\n }\n}\n",".GroupCallTopPane {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n height: 2.875rem;\n overflow: hidden;\n box-shadow: 0 2px 2px var(--color-light-shadow);\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n padding: 0.375rem 0.5rem 0.375rem 0.75rem;\n background: var(--color-background);\n z-index: -1;\n cursor: pointer;\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n top: -.1875rem;\n left: 0;\n right: 0;\n height: .125rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n }\n\n &.is-hidden {\n display: none;\n }\n\n @media (max-width: 600px) {\n &.has-pinned-offset {\n top: calc(100% + 2.875rem);\n }\n }\n\n .info {\n display: flex;\n flex-direction: column;\n\n .title {\n font-size: 0.875rem;\n color: var(--color-text);\n }\n\n .participants {\n font-size: 0.75rem;\n color: var(--color-text-secondary);\n }\n }\n\n .avatars {\n display: flex;\n flex-direction: row;\n align-items: center;\n\n .Avatar {\n margin: 0 0 0 -0.75rem;\n\n &:first-child {\n width: 2rem;\n height: 2rem;\n }\n\n &:not(:first-child) {\n width: 2.25rem;\n height: 2.25rem;\n border: 0.125rem solid var(--color-background);\n }\n }\n }\n\n .join {\n height: 1.5rem;\n border-radius: 1.5rem;\n font-weight: 500;\n padding: 1rem 1rem;\n width: auto;\n }\n}\n\n\n@media (min-width: 1440px) {\n #Main.right-column-open .MiddleHeader .GroupCallTopPane {\n width: calc(100% - var(--right-column-width));\n }\n}\n","@import '../../styles/mixins';\n\n@mixin mobile-header-styles() {\n .HeaderPinnedMessage-wrapper,\n .AudioPlayer {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n height: 2.875rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n\n display: flex;\n flex-direction: row-reverse;\n padding: 0.375rem 0.5rem;\n padding-left: 0.75rem;\n background: var(--color-background);\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n top: -.1875rem;\n left: 0;\n right: 0;\n height: .125rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n }\n\n .HeaderPinnedMessage {\n max-width: unset;\n margin-top: -0.1875rem;\n }\n\n @supports (padding-left: env(safe-area-inset-left)) {\n padding-left: #{\"max(0.75rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(0.5rem, env(safe-area-inset-right))\"};\n }\n }\n\n .AudioPlayer {\n flex-direction: row;\n margin-top: 0;\n padding: 0.25rem 0.5rem;\n\n &-content {\n padding: 0 0.5rem;\n flex-grow: 1\n }\n\n > .Button {\n margin: -.0625rem 0 0;\n }\n\n > .player-close {\n margin-left: auto;\n }\n }\n\n .HeaderPinnedMessage {\n flex-grow: 1;\n padding-top: 0;\n padding-bottom: 0;\n\n &::before {\n top: 0.125rem;\n bottom: 0.125rem;\n }\n\n .message-text {\n max-width: none;\n }\n }\n\n .HeaderPinnedMessage-wrapper.full-width {\n display: none;\n }\n}\n\n.MiddleHeader {\n display: flex;\n align-items: center;\n width: 100%;\n box-shadow: 0 2px 2px var(--color-light-shadow);\n background: var(--color-background);\n padding: .5rem .8125rem .5rem 1.5rem;\n position: relative;\n z-index: var(--z-middle-header);\n\n @supports (padding-left: env(safe-area-inset-left)) {\n padding-left: #{\"max(1.5rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(.8125rem, env(safe-area-inset-right))\"};\n }\n\n @media (max-width: 600px) {\n padding: 0.5rem;\n position: relative;\n\n @supports (padding-left: env(safe-area-inset-left)) {\n padding-left: #{\"max(.5rem, env(safe-area-inset-left))\"};\n padding-right: #{\"max(.5rem, env(safe-area-inset-right))\"};\n }\n }\n\n .Transition {\n width: 100%;\n // https://dfmcphee.com/flex-items-and-min-width-0/\n // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size\n min-width: 0;\n\n > div {\n display: flex;\n align-items: center;\n width: 100%;\n }\n }\n\n .back-button {\n margin-left: -0.5rem;\n margin-right: 0.5rem;\n position: relative;\n\n @media (max-width: 600px) {\n margin-left: 0;\n }\n\n .unread-count {\n min-width: 1.25rem;\n height: 1.25rem;\n padding: 0 0.375rem;\n border-radius: 0.625rem;\n font-size: 0.75rem;\n line-height: 1.25rem;\n font-weight: 500;\n text-align: center;\n\n position: absolute;\n top: -0.25rem;\n right: -0.5rem;\n\n background: var(--color-gray);\n color: white;\n pointer-events: none;\n\n &.active {\n background: var(--color-primary);\n }\n }\n }\n\n .chat-info-wrapper {\n flex-grow: 1;\n overflow: hidden;\n }\n\n body.animation-level-0 & .HeaderPinnedMessage-wrapper {\n transition: none !important;\n }\n\n .header-tools {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n margin-left: auto;\n flex-shrink: 0;\n\n body.animation-level-0 & {\n &,\n .AudioPlayer,\n .HeaderActions {\n transition: none !important;\n }\n }\n\n @media (min-width: 1276px) and (max-width: 1439px) {\n .HeaderActions {\n transform: translate3d(0, 0, 0);\n transition: transform var(--layer-transition);\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) * -1), 0, 0);\n }\n }\n }\n\n @media (min-width: 1440px) {\n transform: translate3d(0, 0, 0);\n transition: transform var(--layer-transition);\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) * -1), 0, 0);\n }\n }\n\n // @optimization\n @include while-transition() {\n pointer-events: none;\n }\n }\n\n @media (min-width: 1276px) and (max-width: 1439px) {\n &:not(.tools-stacked) .HeaderPinnedMessage-wrapper,\n &:not(.tools-stacked) .AudioPlayer {\n opacity: 1;\n\n #Main.right-column-open & {\n opacity: 0;\n }\n }\n }\n\n &.tools-stacked .AudioPlayer {\n @include mobile-header-styles();\n\n @media (min-width: 1150px) {\n #Main.right-column-open & {\n padding-right: calc(0.5rem + var(--right-column-width));\n }\n }\n }\n\n &.tools-stacked.animated .HeaderPinnedMessage-wrapper,\n &.tools-stacked.animated .AudioPlayer {\n animation: fade-in var(--layer-transition) forwards;\n\n body.animation-level-0 & {\n animation: none;\n }\n }\n\n h3 {\n font-weight: 500;\n font-size: 1.125rem;\n line-height: 1.375rem;\n white-space: pre;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n unicode-bidi: plaintext;\n\n body.is-ios &,\n body.is-macos & {\n font-size: 1.0625rem;\n font-weight: 600;\n }\n\n @media (max-width: 600px) {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n @media (min-width: 1275px) {\n #Main.right-column-open & {\n max-width: calc(100% - var(--right-column-width));\n }\n }\n }\n\n .ChatInfo {\n cursor: pointer;\n display: flex;\n align-items: center;\n\n .info {\n display: flex;\n flex-direction: column;\n justify-content: center;\n flex-grow: 1;\n overflow: hidden;\n }\n\n .title {\n display: flex;\n align-items: center;\n\n .VerifiedIcon {\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 0.25rem;\n margin-top: 0.05rem;\n }\n }\n\n .status {\n display: flex;\n unicode-bidi: plaintext;\n }\n\n .user-status {\n unicode-bidi: plaintext;\n overflow: hidden;\n text-overflow: ellipsis;\n\n @media (min-width: 1275px) {\n #Main.right-column-open & {\n max-width: calc(100% - var(--right-column-width));\n }\n }\n }\n }\n\n .Avatar {\n margin-right: .625rem;\n // TODO For some reason webpack imports `Audio.scss` second time when loading calls bundle\n width: 2.5rem !important;\n height: 2.5rem !important;\n font-size: 1.0625rem;\n }\n\n .status, .typing-status {\n font-size: 0.875rem;\n line-height: 1.125rem;\n margin: 0;\n color: var(--color-text-secondary);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: inline-block;\n\n .ellipsis {\n display: inline-flex;\n }\n\n &.online {\n color: var(--color-primary);\n }\n\n .font-emoji {\n line-height: 1rem;\n }\n }\n\n .Button.smaller {\n width: 2.5rem;\n height: 2.5rem;\n }\n\n .HeaderPinnedMessage-wrapper {\n display: flex;\n align-items: center;\n margin-left: auto;\n cursor: default;\n flex-direction: row-reverse;\n background: var(--color-background);\n\n body.animation-level-1 & {\n .ripple-container {\n display: none;\n }\n }\n\n @media (min-width: 1276px) {\n transform: translate3d(0, 0, 0);\n transition: opacity 0.15s ease, transform var(--layer-transition);\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) * -1), 0, 0);\n }\n }\n\n\n .HeaderPinnedMessage {\n min-width: 16rem;\n }\n\n > .Button {\n flex-shrink: 0;\n }\n\n &.full-width {\n position: absolute;\n left: 0;\n right: 0;\n top: 100%;\n background: var(--color-background);\n padding: .25rem .8125rem .25rem 1rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n transform: translate3d(0, 0, 0);\n transition: opacity 0.15s ease, transform var(--layer-transition);\n\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n top: -.1875rem;\n left: 0;\n right: 0;\n height: .125rem;\n box-shadow: 0 .125rem .125rem var(--color-light-shadow);\n }\n\n .HeaderPinnedMessage {\n margin-top: 0;\n margin-bottom: 0;\n flex: 1;\n\n .message-text {\n max-width: none;\n }\n }\n\n @media (min-width: 1276px) {\n transform: translate3d(0, 0, 0);\n transition: opacity 0.15s ease, transform var(--layer-transition);\n\n #Main.right-column-open & {\n padding-left: calc(var(--right-column-width) + 1rem);\n }\n }\n }\n }\n\n .HeaderPinnedMessage {\n display: flex;\n flex-shrink: 1;\n margin-top: -0.25rem;\n margin-bottom: -0.25rem;\n padding: 0.25rem;\n padding-left: 0.375rem;\n border-radius: var(--border-radius-messages-small);\n position: relative;\n overflow: hidden;\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n }\n\n .pinned-message-border {\n position: relative;\n height: 2.25rem;\n margin: 0.125rem 0;\n width: 0.125rem;\n min-width: 0.125rem;\n overflow: hidden;\n\n .pinned-message-border-wrapper-1 {\n height: 2.25rem;\n width: 0.125rem;\n border-radius: 0.0625rem;\n background: var(--color-primary);\n }\n\n .pinned-message-border-wrapper {\n background-color: var(--color-primary-opacity);\n position: relative;\n will-change: transform;\n transition: transform .25s ease-in-out;\n }\n\n .pinned-message-border-mark {\n position: absolute;\n left: 0;\n top: 0;\n width: 0.125rem;\n background: var(--color-primary);\n border-radius: 0.0625rem;\n will-change: transform;\n transition: transform .25s ease-in-out;\n }\n }\n\n .message-text {\n overflow: hidden;\n margin-inline-start: 0.375rem;\n margin-top: 0.125rem;\n max-width: 15rem;\n\n @media (min-width: 1440px) and (max-width: 1500px) {\n max-width: 14rem;\n }\n\n .title {\n font-weight: 500;\n font-size: 0.875rem;\n line-height: 1rem;\n height: 1rem;\n color: var(--color-primary);\n margin-bottom: 0.125rem;\n white-space: pre;\n text-align: initial;\n\n body.is-ios & {\n font-size: .9375rem;\n }\n }\n\n p {\n font-size: 0.875rem;\n line-height: 1.125rem;\n height: 1.125rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0;\n\n body.is-ios & {\n font-size: .9375rem;\n }\n }\n }\n\n .emoji-small {\n width: 1rem;\n height: 1rem;\n }\n\n & > img {\n width: 2.25rem;\n height: 2.25rem;\n object-fit: cover;\n border-radius: 0.25rem;\n margin-inline-start: 0.375rem;\n margin-top: 0.125rem;\n flex-shrink: 0;\n\n & + .message-text {\n max-width: 12rem;\n }\n }\n }\n\n .HeaderActions {\n flex-shrink: 0;\n margin-left: auto;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n\n .toggle-right-pane-button {\n &.active {\n color: var(--color-primary);\n opacity: 1;\n }\n }\n }\n\n .HeaderPinnedMessage-wrapper, .HeaderActions {\n .Button {\n margin-left: 0.25rem;\n\n &.tiny {\n margin-right: .625rem;\n }\n }\n }\n\n @media (max-width: 600px) {\n @include mobile-header-styles();\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n",".EmbeddedMessage {\n display: flex;\n align-items: center;\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n line-height: 1.125rem;\n margin: 0 -0.25rem .0625rem;\n padding: .1875rem 0.25rem .1875rem .4375rem;\n border-radius: var(--border-radius-messages-small);\n position: relative;\n overflow: hidden;\n cursor: pointer;\n direction: ltr;\n\n body.animation-level-1 & {\n .ripple-container {\n display: none;\n }\n }\n\n .custom-shape & {\n max-width: 15rem;\n padding: 0.5rem;\n margin: 0;\n background-color: var(--background-color);\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n &::before {\n left: .625rem;\n top: .625rem;\n bottom: .625rem;\n }\n\n img:not(.emoji) {\n margin-inline-start: .5rem;\n }\n\n &:dir(rtl) {\n padding: 0.5rem;\n }\n }\n\n &::before {\n content: '';\n display: block;\n position: absolute;\n top: .3125rem;\n bottom: .3125rem;\n left: .3125rem;\n width: 2px;\n background: var(--accent-color);\n border-radius: 2px;\n }\n\n &:hover {\n background-color: var(--hover-color);\n }\n\n &:active {\n background-color: var(--active-color);\n }\n\n .message-title {\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n }\n\n .message-text {\n overflow: hidden;\n margin-inline-start: 0.5rem;\n display: flex;\n flex-direction: column-reverse;\n\n .message-title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-bottom: 0.125rem;\n flex: 1;\n display: block;\n }\n\n p {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n height: 1.125rem;\n margin-bottom: 0;\n flex: 1;\n\n &::after {\n content: none;\n display: none;\n }\n }\n\n .emoji {\n width: calc(1.125 * var(--message-text-size, 1rem)) !important;\n height: calc(1.125 * var(--message-text-size, 1rem)) !important;\n vertical-align: text-bottom !important;\n }\n }\n\n .embedded-action-message {\n color: var(--accent-color);\n opacity: 0.75;\n }\n\n img:not(.emoji) {\n width: 2rem;\n height: 2rem;\n object-fit: cover;\n border-radius: .25rem;\n margin-left: .25rem;\n flex-shrink: 0;\n\n &.round {\n border-radius: 1rem;\n }\n }\n\n &.inside-input {\n padding-inline-start: 0.5625rem;\n margin: 0 0 -.125rem -0.1875rem;\n display: grid;\n grid-template-columns: auto 1fr;\n grid-template-rows: 1fr;\n width: 100%;\n --accent-color: var(--color-primary);\n --hover-color: var(--color-interactive-element-hover);\n\n &::before {\n bottom: .3125rem;\n }\n\n img:not(.emoji) {\n margin-left: .125rem;\n }\n\n .message-text {\n margin-inline-start: .375rem;\n }\n\n .message-title {\n font-weight: 500;\n color: var(--accent-color);\n }\n }\n}\n",".ReactionAnimatedEmoji {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n\n &.is-animating {\n // Fix for redundant scroll on iOS\n transform: translateZ(0);\n // Fix for redundant scroll in Firefox\n contain: layout;\n }\n\n .AnimatedSticker {\n position: fixed;\n top: -0.375rem;\n left: -0.375rem;\n pointer-events: none;\n\n &.effect {\n top: -2.5rem;\n left: -2.5rem;\n }\n\n &:not(.open) {\n opacity: 1 !important;\n }\n\n &.closing {\n opacity: 0 !important;\n }\n }\n\n &.in-meta {\n .AnimatedSticker {\n top: -0.4375rem;\n left: -0.4375rem;\n\n &.effect {\n top: -2.5625rem;\n left: -2.5625rem;\n }\n\n // Fix for weird positioning in Chrome\n canvas {\n position: absolute;\n }\n }\n }\n}\n",".MessageMeta {\n position: absolute;\n height: 1.25rem;\n bottom: 0;\n right: 0;\n display: flex;\n align-items: center;\n background: rgba(#999999, 0.6);\n border-radius: .625rem;\n padding: 0 .25rem;\n color: white;\n cursor: pointer;\n max-width: 100%;\n user-select: none;\n\n .ReactionAnimatedEmoji {\n width: 1rem;\n height: 1rem;\n margin-right: 0.25rem;\n }\n\n .message-time,\n .message-signature,\n .message-views {\n font-size: .75rem;\n white-space: nowrap;\n }\n\n .message-time {\n margin-right: .1875rem;\n }\n\n body.is-ios & {\n .message-time {\n margin-right: .25rem;\n }\n }\n\n .message-views {\n margin-inline-start: .1875rem;\n }\n\n .message-signature {\n overflow: hidden;\n text-overflow: ellipsis;\n margin-right: 0.375rem;\n }\n\n .icon-channelviews {\n margin-left: 0.125rem;\n margin-right: 0.375rem;\n font-size: 1.125rem;\n position: relative;\n top: -0.0625rem;\n }\n\n .has-solid-background & {\n color: rgba(var(--color-text-meta-rgb), 0.75);\n background: none;\n }\n\n .media:not(.text) &,\n .Message .custom-shape & {\n background: rgba(0, 0, 0, 0.2);\n --color-accent-own: white;\n --color-accent: white;\n color: white !important;\n opacity: 1;\n bottom: .25rem;\n right: .25rem;\n left: auto;\n height: 1.125rem;\n padding: 0 .3125rem 0 .375rem;\n\n .MessageOutgoingStatus i {\n background: transparent;\n }\n }\n\n .media:not(.text):dir(rtl) &,\n .Message .custom-shape:dir(rtl) & {\n right: auto !important;\n left: .25rem;\n padding: 0 .375rem 0 .3125rem;\n }\n\n .is-forwarded.media:not(.text):dir(rtl) &,\n .Message .is-forwarded.custom-shape:dir(rtl) & {\n left: .8125rem;\n }\n\n .is-forwarded.media:not(.text) & {\n bottom: 0.935rem;\n right: 0.8125rem;\n }\n\n .emoji-only & {\n right: 0;\n }\n\n .Message.own .has-solid-background & {\n color: var(--color-message-meta-own);\n }\n\n .MessageOutgoingStatus {\n margin-left: -.1875rem;\n font-size: 1.1875rem;\n border-radius: .625rem;\n\n .Message.own & {\n color: var(--color-accent-own);\n }\n }\n\n .message-content.has-replies:not(.custom-shape) & {\n bottom: 3.375rem;\n }\n\n .message-content.has-replies.text:not(.custom-shape) & {\n bottom: 3.4375rem;\n }\n\n &[dir=\"rtl\"] {\n .message-views {\n order: 10;\n }\n .icon-channelviews {\n order: 9;\n }\n }\n}\n\n.Message:not(.own) {\n .custom-shape .reply-message + .MessageMeta {\n right: auto;\n left: 13.2rem;\n bottom: 0.25rem;\n }\n\n .emoji-only-1 .reply-message + .MessageMeta {\n left: 2.5rem;\n }\n\n .emoji-only-2 .reply-message + .MessageMeta {\n left: 5.5rem;\n }\n\n .emoji-only-3 .reply-message + .MessageMeta {\n left: 6.5rem;\n }\n}\n",".Sticker {\n &:not(.inactive) {\n cursor: pointer;\n }\n\n &.inactive {\n pointer-events: none;\n }\n}\n",".Contact {\n display: flex;\n align-items: center;\n padding: 0.25rem;\n\n &.interactive {\n cursor: pointer;\n }\n\n .Avatar {\n margin-right: 0.8rem;\n }\n\n .contact-info {\n padding: 0.5rem;\n padding-left: 0;\n white-space: nowrap;\n overflow: hidden;\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 line-height: 1rem;\n color: var(--secondary-color);\n }\n }\n}\n\n\n",".PollOption {\n display: flex;\n flex-flow: row nowrap;\n margin-bottom: 0.75rem;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .poll-option-text {\n word-break: break-word;\n }\n\n .poll-option-share {\n position: relative;\n margin-top: .125rem;\n width: 1.75rem;\n margin-inline-end: .5rem;\n flex-shrink: 0;\n font-weight: 500;\n font-size: .875rem;\n text-align: right;\n\n &.limit-width {\n display: inline-flex;\n justify-content: center;\n font-size: .75rem;\n }\n }\n\n .poll-option-chosen {\n position: absolute;\n right: 0;\n bottom: -5px;\n width: 1rem;\n height: 1rem;\n background: var(--accent-color);\n color: var(--background-color);\n border-radius: .5rem;\n font-size: .75rem;\n text-align: center;\n\n &.wrong {\n background: var(--color-error);\n }\n\n .is-forwarded & > i {\n margin-left: 1px;\n }\n\n &.animate {\n opacity: 0;\n animation-name: PollOptionIconAnimate;\n animation-delay: .09s;\n animation-duration: .3s;\n animation-fill-mode: forwards;\n }\n }\n\n .poll-option-right {\n flex-grow: 1;\n line-height: 1.5rem;\n }\n\n .poll-option-answer {\n position: relative;\n }\n\n .poll-option-line {\n position: relative;\n width: 0;\n height: 0.25rem;\n min-width: 0.5rem;\n border-radius: 0.125rem;\n margin-top: 0.5rem;\n background: var(--accent-color);\n\n transform-origin: 0 0;\n transition: transform .3s;\n transition-delay: .09s;\n\n }\n\n .poll-line {\n width: 30px;\n height: 35px;\n position: absolute;\n left: -27px;\n bottom: -5px;\n transition: stroke-dashoffset .3s, stroke-dasharray .3s;\n stroke-dashoffset: 0;\n stroke-dasharray: 0, 200%\n }\n\n .poll-line path {\n stroke-width: 4px;\n stroke-linecap: round;\n stroke: var(--accent-color);\n fill:none\n }\n\n .wrong {\n .poll-option-line {\n background: var(--color-error);\n }\n\n .poll-line path {\n stroke: var(--color-error);\n }\n }\n}\n\n@keyframes PollOptionIconAnimate {\n 0% { opacity: 0 }\n 100% { opacity: 1 }\n}\n",".Poll {\n min-width: 15rem;\n text-align: initial;\n\n @media (max-width: 600px) {\n min-width: 50vw;\n }\n\n .poll-question {\n font-weight: 500;\n line-height: 1.25rem;\n margin: 0.125rem 0;\n word-break: break-word;\n }\n\n .poll-type,\n .poll-voters-count {\n color: var(--secondary-color);\n font-size: 0.875rem;\n }\n\n .poll-type {\n margin-bottom: 0.5rem;\n display: flex;\n align-items: center;\n min-height: 1.375rem;\n }\n\n .poll-voters-count {\n margin: .4375rem 0 1.125rem;\n text-align: center;\n }\n\n .poll-answers {\n padding-top: 0.25rem;\n padding-bottom: 1rem;\n }\n\n .Checkbox,\n .Radio {\n padding-left: 2.25rem;\n\n &:last-child {\n margin-bottom: .75rem;\n }\n\n &.disabled {\n opacity: 1 !important;\n cursor: not-allowed;\n }\n\n .Checkbox-main,\n .Radio-main {\n &::before {\n left: 0.125rem;\n background-color: var(--background-color);\n\n .theme-dark & {\n --color-borders: var(--color-borders-input);\n }\n\n .Message.own & {\n --color-borders: var(--accent-color);\n }\n }\n\n &::after {\n left: 0.4375rem;\n background-color: var(--accent-color);\n }\n }\n\n input:checked ~ .Radio-main,\n input:checked ~ .Checkbox-main {\n &::before {\n border-color: var(--accent-color);\n }\n }\n\n .Spinner {\n left: 0.125rem;\n }\n }\n\n .Checkbox {\n .Checkbox-main {\n &::after {\n left: 0.125rem;\n background-color: var(--color-primary);\n\n .Message.own & {\n background-color: var(--accent-color);\n }\n }\n }\n }\n\n .Spinner > div {\n // gray spinner\n background-image: var(--spinner-gray-data);\n\n .theme-dark & {\n background-image: var(--spinner-white-data);\n }\n\n .Message.own & {\n // green spinner\n background-image: var(--spinner-green-data);\n .theme-dark & {\n background-image: var(--spinner-white-data);\n }\n }\n }\n\n .poll-recent-voters {\n display: inline-flex;\n align-items: center;\n vertical-align: text-bottom;\n margin-left: .875rem;\n margin-right: .5rem;\n margin-top: -2px;\n\n .Avatar {\n border: .0625rem solid var(--color-white);\n margin-right: 0;\n box-sizing: content-box;\n\n .Message.own & {\n border: .0625rem solid var(--secondary-color);\n }\n\n &:not(:first-child) {\n margin-left: -3px;\n }\n }\n }\n\n .poll-countdown {\n margin-left: auto;\n font-size: .75rem;\n transition: color .2s;\n\n &.hurry-up {\n color: var(--color-error);\n\n .poll-countdown-progress {\n stroke: var(--color-error);\n }\n }\n\n svg {\n vertical-align: -3px;\n }\n }\n\n .poll-countdown-progress {\n stroke: var(--color-primary);\n fill: transparent;\n stroke-width: 2;\n stroke-linecap: round;\n transition: stroke-dashoffset 2s, stroke .2s;\n }\n\n .poll-quiz-help {\n margin: -.625rem 0 -.625rem auto;\n .Message:not(.own) & {\n color: var(--color-primary);\n }\n }\n\n .poll-results,\n .poll-answers {\n padding-top: 0.25rem;\n padding-bottom: 0.5rem;\n }\n\n .Button {\n text-transform: none;\n font-size: 1rem;\n\n .Message.own & {\n color: var(--accent-color);\n --color-primary-shade-rgb: var(--color-accent-own);\n }\n }\n\n > .Button {\n margin-bottom: .625rem;\n }\n}\n",".WebPage {\n margin-top: 0.25rem;\n margin-bottom: 0.125rem;\n padding-left: .625rem;\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n line-height: 1.125rem;\n max-width: 29rem;\n position: relative;\n\n &::before {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: .125rem;\n background: var(--accent-color);\n border-radius: .125rem;\n }\n\n &-text {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n }\n\n .media-inner {\n margin: 0 !important;\n margin-bottom: 0.375rem !important;\n\n &, & img, &.small-image img {\n border-radius: var(--border-radius-messages-small) !important;\n }\n\n &.square-image {\n width: 5rem;\n height: 5rem;\n min-height: 0;\n margin-bottom: 0 !important;\n\n img {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n &.with-video .media-inner{\n margin-top: 0.5rem !important;\n margin-bottom: 1rem !important;\n }\n\n &.with-square-photo {\n display: flex;\n margin-bottom: 1rem;\n\n .WebPage-text {\n order: 1;\n padding-right: 1rem;\n }\n\n .media-inner {\n order: 2;\n flex-shrink: 0;\n }\n\n &:dir(rtl) {\n .WebPage-text {\n padding-inline-end: 1rem;\n }\n }\n }\n\n &:not(.with-square-photo) {\n .site-name,\n .site-title,\n .site-description {\n &:last-child::after {\n content: '';\n display: inline-block;\n width: var(--meta-safe-area-size);\n height: 0.75rem;\n float: right;\n }\n }\n }\n\n .site-name,\n .site-description,\n .site-title {\n word-break: break-word;\n max-width: 100%;\n }\n\n .site-name {\n color: var(--accent-color);\n font-weight: 500;\n margin-bottom: 0.125rem;\n }\n\n .site-title {\n font-weight: 500;\n margin-bottom: 0.125rem;\n }\n\n .site-description {\n line-height: 1.25;\n margin-bottom: 0;\n\n body.is-ios & {\n line-height: 1.125rem;\n }\n }\n\n &:dir(rtl) {\n padding-inline-start: .625rem;\n\n &::before {\n left: auto;\n right: 0;\n }\n }\n}\n\n\n",".Invoice {\n .title {\n color: var(--accent-color);\n font-weight: 500;\n }\n\n .description {\n position: relative;\n\n &.has-image {\n .invoice-image {\n max-width: 100%;\n height: 20rem;\n\n @media (max-width: 600px) {\n height: 10rem;\n }\n }\n\n .description-text {\n position: absolute;\n top: 0;\n padding: .25rem .5rem;\n margin: .25rem;\n background-color: rgba(90, 110, 70, 0.6);\n border-radius: var(--border-radius-messages-small);\n color: var(--color-text);\n font-weight: 500;\n\n span {\n margin-left: .5rem;\n }\n }\n }\n\n }\n}\n",".Album {\n position: relative;\n overflow: hidden;\n\n .message-content.media.text & {\n margin: -0.3125rem -0.5rem 0.3125rem;\n }\n\n .forwarded-message & {\n margin-bottom: .125rem;\n\n .message-content.media.text & {\n margin: 0 0 0.3125rem;\n --border-bottom-left-radius: inherit;\n --border-bottom-right-radius: inherit;\n }\n }\n\n &,\n .message-content.media.text & {\n > .album-item-select-wrapper .media-inner {\n margin: 0 !important;\n }\n }\n\n > .album-item-select-wrapper .media-inner {\n &, & img, & video {\n border-radius: 0 !important;\n object-fit: cover;\n }\n }\n}\n",".RoundVideo {\n position: relative;\n width: 15rem;\n height: 15rem;\n cursor: pointer;\n\n .thumbnail-wrapper {\n width: 15rem;\n height: 15rem;\n border-radius: 50%;\n overflow: hidden;\n }\n\n .video-wrapper {\n position: absolute;\n left: 0;\n top: 0;\n border-radius: 50%;\n overflow: hidden;\n }\n\n .progress {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n\n .progress-circle {\n stroke: white;\n fill: transparent;\n stroke-width: 4;\n stroke-opacity: .35;\n stroke-linecap: round;\n }\n\n video::-internal-media-controls-cast-button,\n video::-webkit-media-controls,\n video::-webkit-media-controls-start-playback-button {\n display: none;\n }\n}\n",".InlineButtons {\n display: flex;\n flex-direction: column;\n\n .row {\n display: flex;\n flex-direction: row;\n }\n\n .Button {\n flex: 1;\n width: auto;\n margin: 0.125rem;\n background: var(--pattern-color);\n border-radius: var(--border-radius-messages-small);\n font-weight: 500;\n text-transform: none;\n\n &::before {\n content: '';\n background-color: var(--color-white);\n opacity: 0;\n\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n border-radius: var(--border-radius-messages-small);\n z-index: var(--z-below);\n transition: opacity 200ms;\n }\n\n &:hover {\n background: var(--pattern-color) !important;\n\n &::before {\n opacity: .4;\n }\n }\n\n &:first-of-type {\n margin-left: 0;\n }\n\n &:last-of-type {\n margin-right: 0;\n }\n\n i {\n font-size: .875rem;\n position: absolute;\n right: .1875rem;\n top: .1875rem;\n display: block;\n\n &.icon-arrow-right {\n font-size: .75rem;\n top: .125rem;\n right: .125rem;\n transform: rotate(-45deg);\n }\n }\n }\n\n .row:first-of-type .Button {\n margin-top: 0.25rem !important;\n }\n\n .row:last-of-type .Button {\n margin-bottom: 0;\n\n &:first-of-type {\n border-bottom-left-radius: var(--border-radius-messages);\n }\n\n &:last-of-type {\n border-bottom-right-radius: var(--border-radius-messages);\n }\n }\n}\n",".CommentButton {\n --background-color: var(--color-background);\n --hover-color: var(--color-chat-hover);\n\n display: flex;\n width: 100%;\n align-items: center;\n padding: .5625rem .25rem .5625rem .625rem;\n padding-inline-start: .625rem;\n padding-inline-end: .25rem;\n background: var(--background-color);\n border-bottom-right-radius: var(--border-bottom-right-radius);\n border-bottom-left-radius: var(--border-bottom-left-radius);\n font-size: .9375rem;\n font-weight: 500;\n line-height: 2rem;\n color: var(--accent-color);\n white-space: nowrap;\n cursor: pointer;\n transition: background-color .15s, color .15s;\n user-select: none;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n .Message .has-appendix &::before {\n content: '';\n display: block;\n position: absolute;\n bottom: -.1875rem;\n left: -.5625rem;\n width: .5625rem;\n height: 1.25rem;\n background-position: bottom left;\n background-image: url('data:image/svg+xml,%3Csvg width=\"9\" height=\"20\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"%3E%3Cdefs%3E%3Cfilter x=\"-50%25\" y=\"-14.7%25\" width=\"200%25\" height=\"141.2%25\" filterUnits=\"objectBoundingBox\" id=\"a\"%3E%3CfeOffset dy=\"1\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\"/%3E%3CfeGaussianBlur stdDeviation=\"1\" in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\"/%3E%3CfeColorMatrix values=\"0 0 0 0 0.0621962482 0 0 0 0 0.138574144 0 0 0 0 0.185037364 0 0 0 0.15 0\" in=\"shadowBlurOuter1\"/%3E%3C/filter%3E%3Cpath d=\"M3 17h6V0c-.193 2.84-.876 5.767-2.05 8.782-.904 2.325-2.446 4.485-4.625 6.48A1 1 0 003 17z\" id=\"b\"/%3E%3C/defs%3E%3Cg fill=\"none\" fill-rule=\"evenodd\"%3E%3Cuse fill=\"%23000\" filter=\"url(%23a)\" xlink:href=\"%23b\"/%3E%3Cuse fill=\"%23FFF\" xlink:href=\"%23b\"/%3E%3C/g%3E%3C/svg%3E');\n opacity: 0;\n transition: opacity .15s, filter .15s;\n\n .theme-dark #root & {\n filter: invert(.83);\n }\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n .custom-shape & {\n position: absolute;\n right: -3rem;\n width: 2.25rem;\n bottom: 3rem;\n height: 3.375rem;\n border-radius: 1.375rem;\n padding: 0.375rem .3125rem .25rem;\n align-items: flex-start;\n color: white;\n background-color: rgba(0, 0, 0, .2);\n\n opacity: 0;\n transition: opacity .2s ease;\n\n @media (pointer: coarse) {\n opacity: 1 !important;\n }\n\n &:hover {\n background-color: rgba(0, 0, 0, .28);\n }\n\n .Message:hover & {\n opacity: 1;\n }\n\n &::after {\n content: attr(data-cnt);\n position: absolute;\n bottom: -.0625rem;\n left: 0;\n width: 100%;\n text-align: center;\n font-size: 12px;\n display: block;\n }\n\n &[data-cnt=\"0\"] {\n height: 2.25rem;\n &::after {\n display: none;\n }\n }\n\n .icon-comments-sticker {\n display: block;\n font-size: 1.5rem;\n margin: 0 auto;\n }\n\n .recent-repliers,\n .icon-comments,\n .label,\n .icon-next {\n display: none;\n }\n }\n\n &:hover {\n background: var(--hover-color);\n\n .Message .has-appendix &::before {\n opacity: 1;\n }\n\n .Avatar {\n border-color: var(--hover-color) !important;\n }\n }\n\n .is-forwarded &,\n .audio &,\n .voice &,\n .poll &,\n .text & {\n border-top: 1px solid var(--color-borders);\n }\n\n .message-content.has-solid-background & {\n margin: .375rem -.5rem -.375rem;\n }\n\n .message-content.voice & {\n margin-bottom: -.5rem;\n }\n\n .message-content.audio & {\n margin-bottom: -.8125rem;\n }\n\n .message-content.audio &,\n .message-content.voice &,\n .message-content.poll &,\n .message-content.has-solid-background.text &,\n .message-content.has-solid-background.is-forwarded & {\n width: calc(100% + 1rem);\n }\n\n .icon-comments-sticker {\n display: none;\n }\n\n .icon-comments {\n font-size: 1.5625rem;\n line-height: 2rem;\n margin-inline-end: .875rem;\n }\n\n .icon-next {\n margin-inline-start: auto;\n font-size: 1.5rem;\n }\n\n .recent-repliers {\n display: inline-flex;\n align-items: center;\n margin-inline-end: .5rem;\n margin-inline-start: -.125rem;\n\n .Avatar {\n transition: border .15s;\n border: 2px solid var(--color-background);\n margin-inline-end: 0;\n z-index: 3;\n overflow: hidden;\n\n .emoji {\n width: 1rem;\n background-size: 1rem;\n }\n\n + .Avatar {\n z-index: 2;\n\n + .Avatar {\n z-index: 1;\n }\n }\n\n &:not(:first-child) {\n margin-inline-start: -.75rem;\n }\n }\n }\n\n &.has-unread .label {\n position: relative;\n\n &::after {\n content: '';\n display: inline-block;\n width: .5rem;\n height: .5rem;\n border-radius: 50%;\n background: var(--accent-color);\n margin-inline-start: \t.75rem;\n }\n }\n\n &.disabled {\n cursor: default;\n pointer-events: none;\n }\n}\n",".Reactions {\n display: flex;\n flex-direction: row;\n width: 100%;\n flex-wrap: wrap;\n margin-top: 0.25rem;\n overflow: visible;\n\n .Button {\n --reaction-background: var(--color-reaction);\n display: flex;\n flex-direction: row;\n height: 1.75rem;\n white-space: nowrap;\n width: auto;\n margin: 0.125rem;\n padding: 0 0.5rem;\n border: 2px solid transparent;\n background-color: var(--reaction-background) !important;\n border-radius: 1.75rem;\n font-weight: 500;\n font-variant-numeric: tabular-nums;\n text-transform: none;\n color: var(--accent-color);\n overflow: visible;\n\n .ReactionAnimatedEmoji, .icon-reaction-filled {\n width: 1.125rem;\n height: 1.125rem;\n margin-right: 0.25rem;\n }\n\n .avatars {\n display: flex;\n\n .Avatar {\n margin: 0 0 0 -0.25rem;\n border: 0.0625rem solid var(--reaction-background);\n width: 1.25rem;\n height: 1.25rem;\n\n &:first-child {\n margin: 0;\n }\n }\n }\n\n &.chosen {\n border-color: var(--accent-color);\n }\n\n &:hover {\n --reaction-background: var(--hover-color-reaction);\n }\n\n &:first-of-type {\n margin-left: 0;\n }\n\n &:last-of-type {\n margin-right: 0;\n }\n }\n\n &.is-outside {\n margin-top: 0.125rem;\n }\n\n &.is-outside .Button {\n --reaction-background: var(--pattern-color);\n color: white;\n .theme-dark & {\n color: var(--accent-color);\n }\n\n &.chosen {\n border-color: white;\n\n .theme-dark & {\n border-color: var(--accent-color);\n }\n }\n }\n}\n","// General styles\n.Message {\n display: flex;\n align-items: flex-end;\n margin-bottom: 0.375rem;\n position: relative;\n\n --background-color: var(--color-background);\n --hover-color: var(--color-reply-hover);\n --color-reaction: var(--color-message-reaction);\n --hover-color-reaction: var(--color-message-reaction-hover);\n --active-color: var(--color-reply-active);\n --max-width: 29rem;\n --accent-color: var(--color-primary);\n --accent-shade-color: var(--color-primary-shade);\n --secondary-color: var(--color-text-secondary);\n --meta-safe-area-base: 2.25rem;\n --meta-safe-author-width: 0px;\n --meta-safe-area-extra-width: 0px;\n --meta-safe-area-size: calc(var(--meta-safe-area-base) + var(--meta-safe-author-width) + var(--meta-safe-area-extra-width));\n --deleting-translate-x: -50%;\n --select-message-scale: 0.9;\n\n @media (min-width: 1921px) {\n --max-width: calc(30vw - 1rem);\n }\n\n &.is-swiped {\n transform: translateX(-2.5rem) !important;\n }\n\n &.is-protected {\n user-select: none;\n }\n\n > .Avatar,\n > .message-content-wrapper {\n opacity: 1;\n transform: scale(1) translateX(0);\n transition: transform var(--select-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n > .Avatar {\n position: absolute;\n bottom: 0;\n left: 0;\n\n @media (max-width: 600px) {\n width: 2.5rem;\n height: 2.5rem;\n }\n }\n\n .quick-reaction {\n cursor: pointer;\n position: absolute;\n right: -0.5rem;\n bottom: -0.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n transform: scale(1);\n opacity: 0;\n transition: transform 0.2s ease-out, opacity 0.2s ease-out;\n transition-delay: 0.2s;\n\n &.visible {\n opacity: 1 !important;\n }\n\n &:hover {\n transition-delay: unset;\n transform: scale(1.4);\n }\n\n .ReactionStaticEmoji {\n width: 1.125rem;\n }\n }\n\n &.last-in-list .quick-reaction:hover {\n transform: translateY(-0.1875rem) scale(1.4);\n }\n\n &.own .quick-reaction {\n right: auto;\n left: -0.5rem;\n }\n\n &.last-in-group {\n margin-bottom: 0.625rem;\n }\n\n &.last-in-list {\n // Forcing extra space which is taken by the appendix and causes incorrect container height calculation.\n // This value is accurately crafted as a minimum possible.\n margin-bottom: 0.375rem;\n }\n\n &.is-in-selection-mode {\n body.is-android & {\n .can-select-text {\n z-index: var(--z-message-select-control);\n }\n\n // Prevent media viewer from opening\n .media-inner {\n pointer-events: none;\n }\n }\n }\n\n &.has-inline-buttons {\n .message-content {\n border-bottom-right-radius: var(--border-radius-messages-small);\n }\n }\n\n &.has-active-reaction {\n .message-content-wrapper {\n z-index: 1;\n }\n }\n\n &:not(.own) {\n padding-left: 2.5rem;\n\n .no-avatars &, &.is-thread-top {\n padding-left: 0;\n }\n\n @media (max-width: 600px) {\n padding-left: 2.875rem;\n\n .no-avatars &, &.is-thread-top {\n padding-left: 0.25rem;\n }\n }\n }\n\n &.own {\n flex-direction: row-reverse;\n --background-color: var(--color-background-own);\n --hover-color: var(--color-reply-own-hover);\n --color-reaction: var(--color-message-reaction-own);\n --hover-color-reaction: var(--color-message-reaction-hover-own);\n --active-color: var(--color-reply-own-active);\n --max-width: 30rem;\n --accent-color: var(--color-accent-own);\n --accent-shade-color: var(--color-green);\n --secondary-color: var(--color-accent-own);\n --color-code: var(--color-code-own);\n --color-code-bg: var(--color-code-own-bg);\n --color-links: var(--color-own-links);\n --meta-safe-area-base: 3.5rem;\n --deleting-translate-x: 50%;\n --color-text-green: var(--color-accent-own);\n\n @media (min-width: 1921px) {\n --max-width: 30vw;\n }\n\n body.is-ios &,\n body.is-macos & {\n --color-background-own: var(--color-background-own-apple);\n --color-reply-own-hover: var(--color-reply-own-hover-apple);\n --color-reply-own-active: var(--color-reply-own-active-apple);\n }\n\n @media (max-width: 600px) {\n padding-right: 0.25rem;\n }\n }\n\n &.is-deleting {\n > .Avatar,\n > .message-content-wrapper {\n transition: opacity .2s ease, transform .2s ease-in;\n opacity: 0;\n transform: scale(0.3) translateX(var(--deleting-translate-x));\n transform-origin: bottom;\n }\n }\n\n &.has-views {\n --meta-safe-area-extra-width: 4rem;\n }\n\n &.was-edited {\n --meta-safe-area-extra-width: 2.5rem;\n\n &.has-views {\n --meta-safe-area-extra-width: 7.5rem;\n }\n\n html[lang=ru] & {\n --meta-safe-area-extra-width: 3.5rem;\n\n &.has-views {\n --meta-safe-area-extra-width: 8.5rem;\n }\n }\n }\n\n .select-mode-active & {\n cursor: pointer;\n\n @media (min-width: 600px) {\n user-select: none;\n }\n\n &:not(.own) {\n > .Avatar,\n > .message-content-wrapper {\n transform: translateX(2.5rem);\n }\n }\n\n &:not(.is-album)::after {\n content: \"\";\n position: absolute;\n top: -0.25rem;\n bottom: -0.25rem;\n left: -4rem;\n right: -4rem;\n z-index: var(--z-message-select-area);\n }\n\n &.is-album,\n &.is-in-document-group {\n .message-select-control {\n pointer-events: unset;\n }\n }\n\n .message-select-control {\n opacity: 1;\n }\n }\n\n &.is-selected {\n .message-select-control {\n background: var(--color-green);\n\n &.group-select {\n background: transparent;\n\n &.is-selected {\n background: var(--color-green);\n }\n }\n }\n }\n\n .File.file-is-selected {\n .message-select-control {\n background: var(--color-green);\n }\n }\n\n &.is-in-document-group .File.file-is-selected .file-icon,\n &.has-menu-open.is-in-document-group .File .file-icon {\n --background-color: var(--color-background-selected);\n }\n\n &.own.is-in-document-group .File.file-is-selected .file-icon,\n &.own.has-menu-open.is-in-document-group .File .file-icon {\n --background-color: var(--color-background-own-selected);\n }\n\n .Audio .message-select-control {\n left: 1.0625rem;\n top: 1.375rem;\n }\n\n html.theme-dark &.own .Audio .toggle-play:not(.with-image) + .media-loading {\n .ProgressSpinner {\n background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjODA3QkQ1IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+);\n background-position: center;\n background-size: 1rem;\n\n circle {\n stroke: var(--background-color);\n }\n }\n }\n\n\n .File {\n position: relative;\n\n .message-select-control {\n position: absolute;\n top: 2rem;\n left: 2rem;\n z-index: 2;\n }\n }\n\n .album-item-select-wrapper {\n .Message.own & {\n background: var(--color-background-own);\n }\n\n .message-select-control {\n position: absolute;\n top: 0.438rem;\n right: 0.438rem;\n left: unset;\n }\n\n img, video {\n transition: transform var(--select-transition), opacity ease 300ms;\n }\n\n &.is-selected {\n .message-select-control {\n background: var(--color-green);\n }\n\n img, video {\n transform: scale(var(--select-message-scale));\n }\n }\n\n }\n\n &.is-selected, &.is-forwarding {\n .message-select-control {\n background: var(--color-green);\n }\n\n .Menu .bubble {\n transition: none !important;\n }\n }\n\n &.is-in-document-group {\n &:not(.first-in-document-group) {\n &::before {\n top: 0 !important;\n }\n\n .message-content {\n box-shadow: none;\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n }\n\n .forwarded-message::before {\n top: -1.5rem;\n }\n }\n\n &:not(.last-in-document-group) {\n margin-bottom: 0;\n\n &::before {\n bottom: 0 !important;\n }\n\n .message-content {\n border-bottom-left-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n }\n }\n\n &.is-in-selection-mode {\n .Audio:not(.audio-is-selected),\n .File:not(.file-is-selected) {\n .message-select-control:not(.group-select) {\n background: white;\n\n &::after {\n content: '';\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 0.688rem;\n background: white;\n border: 0.125rem rgba(0, 0, 0, 0.2) solid;\n position: absolute;\n }\n }\n }\n\n &.own {\n .message-content {\n .Audio:not(.audio-is-selected),\n .File:not(.file-is-selected) {\n .message-select-control:not(.group-select) {\n background: var(--background-color);\n border-color: var(--background-color);\n\n &::after {\n background: var(--background-color);\n border-color: var(--color-message-meta-own);\n }\n }\n }\n }\n }\n\n }\n\n &.focused,\n &.has-menu-open,\n &.is-forwarding,\n &.is-selected {\n .message-content {\n background: var(--color-background-selected);\n }\n\n &.own {\n .message-content {\n --background-color: var(--color-background-own-selected);\n background: var(--color-background-own-selected);\n }\n }\n }\n\n .message-content-wrapper {\n width: 17.1875rem;\n }\n\n .message-content {\n transition: background-color var(--select-transition);\n }\n\n &.own {\n .message-content-wrapper {\n display: flex;\n justify-content: flex-end;\n\n .message-content {\n width: 100%;\n }\n }\n }\n }\n\n .album-item-select-wrapper {\n position: absolute;\n\n .message-select-control {\n position: absolute;\n z-index: 2;\n }\n }\n\n .message-select-control {\n position: absolute;\n left: 0;\n bottom: 0.25rem;\n width: 1.5rem;\n height: 1.5rem;\n border: 2px solid white;\n border-radius: 50%;\n z-index: var(--z-message-select-control);\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n color: white;\n font-size: 1rem;\n\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--select-transition);\n\n .icon-select {\n position: absolute;\n left: -3px;\n top: -3px;\n font-size: 1.625rem;\n }\n\n .theme-dark & {\n border-color: #ffffff80;\n }\n }\n\n .Avatar {\n margin-right: 0.3rem;\n }\n\n &.is-in-document-group {\n .message-content.document {\n padding: .25rem .5rem !important;\n }\n\n &.last-in-document-group {\n .message-content.document {\n padding-bottom: .5rem !important\n }\n }\n\n &.first-in-document-group {\n .message-content.document {\n padding-top: .5rem !important\n }\n }\n }\n}\n\n// Border-radius styles\n.message-content,\n.Album,\n.media-inner,\n.message-content.media .media-inner img,\n.message-content.media .media-inner video,\n.message-content.custom-shape .media-inner img {\n border-top-left-radius: var(--border-top-left-radius);\n border-top-right-radius: var(--border-top-right-radius);\n border-bottom-left-radius: var(--border-bottom-left-radius);\n border-bottom-right-radius: var(--border-bottom-right-radius);\n}\n\n.media-inner video.full-media {\n background: transparent !important;\n}\n\n.media-inner {\n overflow: hidden;\n\n &.small-image img {\n border-radius: 0 !important;\n }\n}\n\n.Message {\n --border-top-left-radius: var(--border-radius-messages);\n --border-top-right-radius: var(--border-radius-messages);\n --border-bottom-left-radius: var(--border-radius-messages);\n --border-bottom-right-radius: var(--border-radius-messages);\n\n &:not(.own) {\n &.first-in-group:not(.last-in-group) {\n --border-bottom-left-radius: var(--border-radius-messages-small);\n }\n\n &:not(.first-in-group):not(.last-in-group) {\n --border-top-left-radius: var(--border-radius-messages-small);\n --border-bottom-left-radius: var(--border-radius-messages-small);\n }\n\n &.last-in-group:not(.first-in-group) {\n --border-top-left-radius: var(--border-radius-messages-small);\n }\n\n &.last-in-group {\n --border-bottom-left-radius: var(--border-radius-messages-small);\n\n .message-content.has-appendix {\n --border-bottom-left-radius: 0;\n }\n }\n }\n\n &.own {\n &.first-in-group:not(.last-in-group) {\n --border-bottom-right-radius: var(--border-radius-messages-small);\n }\n\n &:not(.first-in-group):not(.last-in-group) {\n --border-top-right-radius: var(--border-radius-messages-small);\n --border-bottom-right-radius: var(--border-radius-messages-small);\n }\n\n &.last-in-group:not(.first-in-group) {\n --border-top-right-radius: var(--border-radius-messages-small);\n }\n\n &.last-in-group {\n --border-bottom-right-radius: var(--border-radius-messages-small);\n\n .message-content.has-appendix {\n --border-bottom-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n }\n\n .message-content {\n &.has-replies:not(.custom-shape),\n &.text {\n .media-inner,\n .Album {\n --border-bottom-left-radius: 0;\n --border-bottom-right-radius: 0;\n }\n }\n\n &.is-reply .EmbeddedMessage {\n & + .Album,\n & + .Audio,\n & + .File {\n margin-top: .375rem;\n }\n }\n\n &:not(.custom-shape).is-reply .media-inner,\n &:not(.custom-shape).is-reply .Album,\n &:not(.custom-shape).force-sender-name .Album,\n &:not(.is-forwarded) .message-title ~ .media-inner {\n --border-top-left-radius: 0;\n --border-top-right-radius: 0;\n }\n\n &.is-forwarded .content-inner .message-title {\n margin-bottom: 0.25rem;\n }\n }\n\n .message-action-button {\n position: absolute;\n bottom: 0;\n color: white;\n background-color: rgba(0, 0, 0, .2);\n\n opacity: 0;\n transition: opacity .2s ease;\n\n @media (pointer: coarse) {\n opacity: 1 !important;\n }\n\n &:hover,\n &:active,\n &:focus {\n background-color: rgba(0, 0, 0, .28) !important;\n }\n }\n\n &:hover,\n &[data-is-document-group-hover] {\n .message-action-button {\n opacity: 1;\n }\n }\n\n &.own .message-action-button {\n left: -3rem;\n }\n\n &:not(.own) .message-action-button {\n right: -3rem;\n }\n\n .bottom-marker {\n height: 1px;\n width: 1px;\n visibility: hidden;\n }\n}\n\n.Message .custom-shape .message-action-button {\n bottom: .25rem;\n}\n\n@import 'message-content';\n",".message-content {\n position: relative;\n max-width: var(--max-width);\n\n @media (max-width: 600px) {\n max-width: calc(100vw - 6.25rem);\n\n .Message.own &,\n .MessageList.no-avatars & {\n max-width: calc(100vw - 3.75rem);\n }\n\n // Workaround for sass function override - we should use CSS min() here\n @supports (max-width: #{\"min(29rem, 100vw - 6.25rem)\"}) {\n max-width: #{\"min(29rem, 100vw - 6.25rem)\"};\n .MessageList.no-avatars & {\n max-width: #{\"min(29rem, 100vw - 3.75rem)\"};\n }\n .Message.own & {\n max-width: #{\"min(30rem, 100vw - 3.75rem)\"};\n }\n }\n\n &.has-action-button {\n max-width: calc(100vw - 7rem);\n\n .Message.own &,\n .MessageList.no-avatars & {\n max-width: calc(100vw - 4.5rem);\n }\n\n // Workaround for sass function override - we should use CSS min() here\n @supports (max-width: #{\"min(29rem, 100vw - 5.5rem)\"}) {\n max-width: #{\"min(29rem, 100vw - 7rem)\"};\n .MessageList.no-avatars & {\n max-width: #{\"min(29rem, 100vw - 4.5rem)\"};\n }\n .Message.own & {\n max-width: #{\"min(30rem, 100vw - 4.5rem)\"};\n }\n }\n }\n }\n\n img {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n }\n\n .text-content {\n margin: 0;\n word-break: break-word;\n line-height: 1.3125;\n text-align: initial;\n display: flow-root;\n unicode-bidi: plaintext;\n }\n\n .text-entity-link {\n unicode-bidi: plaintext;\n }\n\n &:not(.custom-shape) .text-content,\n &.document {\n & > .MessageMeta {\n position: relative;\n top: .375rem;\n bottom: auto !important;\n float: right;\n line-height: 1.35;\n height: calc(var(--message-meta-height, 1rem));\n margin-left: .4375rem;\n margin-right: -.5rem;\n\n .MessageOutgoingStatus .Transition {\n max-height: calc(var(--message-meta-height, 1rem));\n overflow: hidden;\n }\n\n html[data-message-text-size=\"12\"] & {\n top: .25rem;\n }\n\n html[data-message-text-size=\"17\"] & {\n top: .4375rem;\n }\n\n html[data-message-text-size=\"18\"] &,\n html[data-message-text-size=\"19\"] & {\n top: .5rem;\n }\n\n html[data-message-text-size=\"20\"] & {\n top: .5625rem;\n }\n }\n\n &:dir(rtl) {\n & > .MessageMeta {\n float: left;\n margin-left: -.25rem;\n margin-right: .4375rem;\n }\n }\n }\n\n .MessageMeta.reactions-offset {\n position: relative;\n top: .375rem;\n bottom: auto !important;\n float: right;\n line-height: 1;\n height: calc(var(--message-meta-height, 1rem));\n margin-left: auto;\n margin-right: -.5rem;\n align-self: flex-end;\n\n .MessageOutgoingStatus .Transition {\n max-height: calc(var(--message-meta-height, 1rem));\n overflow: hidden;\n }\n\n html[data-message-text-size=\"12\"] & {\n top: .25rem;\n }\n\n html[data-message-text-size=\"17\"] & {\n top: .4375rem;\n }\n\n html[data-message-text-size=\"18\"] &,\n html[data-message-text-size=\"19\"] & {\n top: .5rem;\n }\n\n html[data-message-text-size=\"20\"] & {\n top: .5625rem;\n }\n }\n\n &.document:not(.text) {\n &::after {\n content: \"\";\n display: block;\n clear: both;\n }\n\n & > .MessageMeta {\n top: auto !important;\n bottom: -.5rem !important;\n margin-top: -.25rem;\n\n &:not([dir=rtl]) {\n margin-top: -1.25rem;\n }\n }\n }\n\n .theme-dark .Message.own & {\n .text-entity-link {\n text-decoration: underline !important;\n\n &:hover {\n text-decoration: none !important;\n }\n }\n }\n\n &:not(.custom-shape) {\n font-size: var(--message-text-size, 1rem);\n\n body.is-ios & {\n font-size: var(--message-text-size, 1.0625rem);\n }\n\n & > .content-inner {\n min-width: 0;\n }\n }\n\n .matching-text-highlight {\n background: #CAE3F7;\n border-radius: 0.25rem;\n padding: 0 0.125rem;\n }\n\n .message-title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n font-weight: 500;\n line-height: 1.25rem;\n color: var(--accent-color);\n unicode-bidi: plaintext;\n display: flex;\n\n & > .interactive {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n &.interactive, & > .interactive {\n cursor: pointer;\n\n &:hover {\n opacity: 0.85;\n }\n }\n\n & > .color-1 {\n color: var(--color-user-1);\n }\n\n & > .color-2 {\n color: var(--color-user-2);\n }\n\n & > .color-4 {\n color: var(--color-user-4);\n }\n\n & > .color-5 {\n color: var(--color-user-5);\n }\n\n & > .color-6 {\n color: var(--color-user-6);\n }\n\n & > .color-7 {\n color: var(--color-user-7);\n }\n\n & > .color-8 {\n color: var(--color-user-8);\n }\n\n .theme-dark .Message.own & > .color-1 {\n color: var(--accent-color);\n }\n\n & + .File {\n margin-top: .25rem;\n }\n\n .via {\n padding-right: .25rem;\n font-weight: 400;\n }\n\n span + .via {\n padding-left: .25rem;\n }\n\n .admin-title {\n flex: 1;\n margin-left: 1rem;\n text-align: right;\n font-weight: 400;\n font-size: 0.75rem;\n margin-top: -0.1rem;\n color: rgba(var(--color-text-meta-rgb), 0.75);\n\n .Message.own & {\n color: var(--accent-color);\n }\n }\n }\n\n &.has-shadow {\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n &.has-solid-background, &.has-background, .is-album & {\n background: var(--background-color);\n }\n\n &.has-solid-background {\n padding: .3125rem .5rem .375rem;\n\n .forwarded-message > .text-content:not(.with-meta):last-child::after {\n content: '';\n display: inline-block;\n width: var(--meta-safe-area-size);\n height: 1rem;\n }\n }\n\n body.is-ios &.has-solid-background {\n padding-bottom: 0.4375rem;\n }\n\n body.is-ios .Message.own &.has-solid-background {\n padding-left: 0.625rem;\n }\n\n &:not(.has-appendix) .svg-appendix {\n display: none;\n }\n\n .svg-appendix {\n overflow: hidden;\n position: absolute;\n bottom: -.0625rem;\n width: .5625rem;\n height: 1.125rem;\n font-size: 1rem !important;\n\n .corner {\n fill: var(--background-color);\n }\n\n .Message.own & {\n right: -.551rem; // This value is correct. Safari fix\n }\n\n .Message:not(.own) & {\n left: -.562rem; // This value is correct. Safari fix\n }\n }\n\n &[data-has-custom-appendix] {\n .svg-appendix .corner {\n fill: var(--appendix-bg);\n }\n }\n\n &.has-appendix-thumb {\n .Message & {\n .svg-appendix {\n --background-color: #ccc;\n opacity: 1;\n transition: opacity 500ms ease;\n }\n }\n }\n\n &.document {\n padding: .5rem !important;\n\n .File {\n .theme-dark & {\n --color-primary: var(--color-selection-highlight);\n }\n }\n\n .File + .text-content {\n margin-top: .3125rem;\n }\n }\n\n &.voice,\n &.audio {\n .message-title,\n .Embedded {\n margin-top: -.1875rem;\n margin-bottom: .1875rem;\n }\n }\n\n &.voice {\n padding: .5rem !important;\n\n .Voice + .text-content {\n margin-top: .5rem;\n }\n }\n\n &.audio {\n min-width: 20rem;\n padding: .5rem .5rem .8125rem !important;\n\n @media (max-width: 600px) {\n min-width: 17rem;\n }\n\n .Audio + .text-content {\n margin-top: .25rem;\n }\n\n &:not(.has-replies) {\n .Audio + .text-content {\n margin-bottom: -0.4375rem;\n }\n }\n }\n\n &:not(.custom-shape) .emoji {\n display: inline-block;\n width: 1.25rem;\n background-size: 1.25rem;\n color: transparent;\n margin-inline-end: 1px;\n vertical-align: text-bottom;\n\n &::selection {\n background-color: var(--color-selection-highlight-emoji);\n color: transparent;\n }\n }\n\n &:not(.custom-shape) .text-content .emoji {\n width: calc(1.25 * var(--message-text-size, 1rem));\n height: calc(1.25 * var(--message-text-size, 1rem));\n background-size: calc(1.25 * var(--message-text-size, 1rem));\n }\n\n .no-media-corners {\n --border-top-left-radius: 0;\n --border-top-right-radius: 0;\n }\n\n &.custom-shape.is-via-bot {\n font-size: inherit !important;\n\n .content-inner > .message-title {\n display: inline-flex;\n position: relative;\n top: .125rem;\n max-width: calc(100% - 3rem);\n margin-left: calc(100% - 3rem);\n padding: 0 .5rem;\n background-color: var(--background-color);\n border-radius: var(--border-radius-messages);\n\n .Message.own & {\n margin-left: -3rem;\n }\n }\n\n .media-inner {\n margin-top: 0.375rem;\n }\n }\n\n}\n\n.message-content.media, .WebPage {\n .media-inner {\n display: flex;\n justify-content: center;\n align-items: center;\n\n &.interactive {\n cursor: pointer;\n\n &.dark video {\n background-color: #232323;\n }\n }\n }\n\n &.round.is-reply {\n width: auto !important;\n }\n\n &.force-sender-name .media-inner,\n &.force-sender-name .Album,\n &.text .media-inner,\n &.is-via-bot .media-inner,\n &.is-reply .media-inner,\n &.is-reply .Album {\n margin-left: -0.5rem;\n margin-right: -0.5rem;\n\n body.is-ios .Message.own & {\n margin-left: -0.625rem;\n }\n }\n\n &.text .media-inner {\n margin-top: -0.3125rem;\n }\n\n &.is-reply .media-inner,\n &.force-sender-name .Album,\n &.is-reply .Album,\n .message-title ~ .media-inner {\n margin-top: 0.375rem;\n margin-bottom: -0.375rem;\n\n body.is-ios .Message.own & {\n margin-bottom: -0.4375rem;\n }\n }\n\n // Moved below .is-reply to overwrite its styles\n &.text .media-inner,\n &.text .Album {\n margin-bottom: 0.375rem;\n\n body.is-ios .Message.own & {\n margin-bottom: 0.375rem;\n }\n }\n\n .media-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n\n &:not(.open) {\n opacity: 0.5;\n transform: scale(0);\n transition: opacity .3s ease, transform .3s ease;\n }\n }\n\n .icon-large-play, .icon-download {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n opacity: 0.7;\n transition: opacity 150ms;\n\n &:hover {\n opacity: 1;\n }\n\n &:before {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 3.375rem;\n height: 3.375rem;\n border-radius: 50%;\n background: rgba(black, 0.25);\n }\n\n &.opacity-transition {\n transition: opacity .15s ease;\n\n &:not(.open) {\n opacity: 0;\n }\n }\n }\n\n .icon-download {\n font-size: 1.5rem;\n }\n\n .icon-large-play {\n font-size: 2.5rem;\n }\n\n .message-media-duration,\n .message-transfer-progress {\n background: rgba(0, 0, 0, .25);\n color: #fff;\n font-size: 0.75rem;\n position: absolute;\n left: .1875rem;\n top: .1875rem;\n z-index: 1;\n padding: 0 .375rem;\n border-radius: .75rem;\n line-height: 1.125rem;\n user-select: none;\n }\n\n .message-media-duration .icon-muted {\n vertical-align: -.1875rem;\n margin-left: .375rem;\n font-size: 1.0625rem;\n }\n}\n\n.message-content.custom-shape {\n line-height: 1.2;\n font-size: 10rem;\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n\n &.has-comments {\n min-height: 5.25rem;\n margin-top: 0 !important;\n\n &.has-replies {\n min-height: 6.5rem;\n }\n }\n\n &.is-reply {\n max-width: 100%;\n }\n\n .reply-message {\n display: flex;\n align-items: flex-start;\n flex-direction: row-reverse;\n direction: ltr;\n\n > p {\n margin-bottom: 0;\n }\n\n .EmbeddedMessage {\n margin-left: 0.5rem;\n border-radius: var(--border-radius-messages);\n\n @media (max-width: 600px) {\n max-width: calc(90vw - 13rem);\n }\n\n @media (max-width: 340px) {\n margin-left: -1rem;\n z-index: 1;\n max-width: calc(90vw - 12rem);\n }\n }\n }\n\n .text-content {\n margin-bottom: 1rem;\n }\n\n .media-inner {\n line-height: 1;\n font-size: 1rem;\n flex-shrink: 0;\n\n .full-media {\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n }\n }\n\n .emoji {\n display: inline-block;\n color: transparent;\n\n &::selection {\n background-color: var(--color-selection-highlight-emoji);\n color: transparent;\n }\n }\n\n &.emoji-only {\n .text-content {\n margin-bottom: 0;\n text-shadow: 1px 1px 0 white, -1px -1px 0 white, -1px 1px 0 white, 1px -1px 0 white;\n img.emoji {\n filter: drop-shadow(1px 1px 0 white) drop-shadow(-1px 1px 0 white) drop-shadow(1px -1px 0 white) drop-shadow(-1px -1px 0 white);\n }\n\n .MessageMeta {\n text-shadow: none;\n }\n }\n }\n\n &.emoji-only-1 {\n min-width: 8rem;\n font-size: 4.5rem;\n\n .content-inner {\n height: 7rem;\n }\n\n .text-content {\n line-height: 1.5;\n text-align: center;\n }\n\n .Message.was-edited & {\n min-width: 10rem;\n }\n\n .emoji {\n width: 5rem;\n height: 5rem;\n }\n }\n\n &.emoji-only-2 {\n font-size: 4rem;\n margin-top: .5rem;\n min-width: 10rem;\n\n &.has-comments {\n margin-top: 1.25rem;\n }\n\n .Message.was-edited & {\n min-width: 12rem;\n }\n\n .emoji {\n width: 4rem;\n height: 4rem;\n margin-right: 0.375rem;\n }\n }\n\n &.emoji-only-3 {\n font-size: 3rem;\n margin-top: 1.75rem;\n min-width: 12rem;\n\n &.has-comments {\n margin-top: 2.5rem;\n }\n\n .Message.was-edited & {\n min-width: 14rem;\n }\n\n .emoji {\n width: 3rem;\n height: 3rem;\n margin-right: 0.375rem;\n }\n }\n\n .Message:not(.own) & {\n --hover-color: var(--color-reply-hover);\n --active-color: var(--color-reply-active);\n }\n\n .Message.own & {\n --hover-color: var(--color-reply-own-hover);\n --active-color: var(--color-reply-own-active);\n\n .reply-message {\n flex-direction: row;\n\n .EmbeddedMessage {\n margin-right: 0.5rem;\n\n @media (max-width: 340px) {\n margin-left: 0;\n z-index: 1;\n max-width: calc(90vw - 11.5rem);\n }\n }\n }\n }\n}\n\n.forwarded-message {\n .message-content.contact &,\n .message-content.voice &,\n .message-content.poll & {\n // MessageOutgoingStatus's icon needs more space\n margin-bottom: 0.5rem;\n }\n\n .message-content:not(.custom-shape) & {\n position: relative;\n margin-top: 0.25rem;\n padding-left: 0.625rem;\n\n &::before {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0.05rem;\n width: 2px;\n background: var(--accent-color);\n border-radius: 2px;\n }\n\n &:dir(rtl) {\n padding-inline-start: 0.625rem;\n\n &::before {\n left: auto;\n right: 0.05rem;\n }\n }\n }\n\n --border-top-left-radius: var(--border-radius-messages-small);\n --border-top-right-radius: var(--border-radius-messages-small);\n --border-bottom-left-radius: var(--border-radius-messages-small);\n --border-bottom-right-radius: var(--border-radius-messages-small);\n\n > .media-inner {\n margin: 0 !important;\n margin-bottom: 0.25rem !important;\n }\n}\n\n.long-word-break-all {\n word-break: break-all;\n}\n\n.text-entity-link {\n color: var(--color-links) !important;\n text-decoration: none !important;\n word-break: break-word;\n cursor: pointer;\n unicode-bidi: initial;\n\n &:hover, &:active, &:visited {\n text-decoration: underline !important;\n }\n}\n\n.text-entity-code, .text-entity-pre {\n color: var(--color-code);\n background: var(--color-code-bg);\n white-space: pre-wrap;\n margin: 0;\n padding: 1px 2px;\n border-radius: 4px;\n font-size: calc(var(--message-text-size, 1rem) - 0.0625rem);\n}\n",".SponsoredMessage {\n --border-top-left-radius: var(--border-radius-messages) !important;\n --border-bottom-left-radius: var(--border-radius-messages) !important;\n\n margin-top: -.5rem;\n margin-bottom: .5rem;\n\n &::before {\n display: none;\n }\n\n &__button.secondary {\n margin-top: .5rem;\n border: 1px solid var(--color-primary);\n border-radius: var(--border-radius-default-tiny);\n color: var(--color-primary);\n }\n}\n",".ContactGreeting {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n\n .wrapper {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n background: var(--pattern-color);\n width: 14.5rem;\n padding: .75rem 1rem;\n border-radius: 1.5rem;\n color: #fff;\n }\n\n .title {\n font-weight: 500;\n margin-bottom: 0;\n }\n\n .description {\n font-size: .9375rem;\n margin-bottom: 0;\n }\n\n .sticker {\n margin: 2rem 0 1rem;\n height: 10rem;\n width: 10rem;\n cursor: pointer;\n\n .thumbnail {\n height: 10rem;\n width: 10rem;\n }\n }\n}\n",".NoMessages {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n .icon {\n font-size: 5rem;\n margin: 0 auto 1rem;\n }\n\n .wrapper {\n display: inline-flex;\n flex-direction: column;\n background: var(--pattern-color);\n max-width: 20rem;\n padding: .75rem 1rem;\n border-radius: 1.5rem;\n color: #fff;\n\n &[dir=rtl] {\n text-align: right;\n }\n }\n\n .title {\n font-weight: 500;\n font-size: 1rem;\n margin-bottom: .25rem;\n text-align: center;\n unicode-bidi: plaintext;\n }\n\n .description {\n font-size: .9375rem;\n margin: 0;\n padding: 0;\n list-style: none;\n unicode-bidi: plaintext;\n }\n\n .list-checkmarks {\n font-size: .9375rem;\n margin: .25rem 0 0;\n padding: 0;\n list-style: none;\n unicode-bidi: plaintext;\n line-height: 1.8;\n\n li::before {\n content: '✓';\n margin-inline-end: .5rem;\n }\n }\n}\n","@import '../../styles/mixins';\n\n.MessageList {\n flex: 1;\n width: 100%;\n margin-bottom: .5rem;\n\n overflow: scroll;\n overflow-x: hidden;\n overflow-y: auto;\n @include overflow-y-overlay();\n\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n .mask-image-enabled & {\n mask-image: linear-gradient(to top, transparent 0, #000 0.5rem);\n }\n\n @media (pointer: coarse) {\n user-select: none;\n touch-callout: none;\n\n &.select-mode-active {\n user-select: auto;\n touch-callout: default;\n }\n }\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n transition: bottom 150ms ease-out, transform var(--layer-transition);\n body.keyboard-visible & {\n position: relative;\n bottom: calc(0px - env(safe-area-inset-bottom));\n\n body.keyboard-visible.animation-level-0 & {\n transition: none !important;\n }\n }\n }\n\n &.no-avatars .Message > .Avatar {\n display: none;\n }\n\n .messages-container {\n width: 100%;\n max-width: var(--messages-container-width);\n min-height: 100%;\n margin: 0 auto;\n display: flex;\n justify-content: flex-end;\n flex-direction: column;\n padding: 1rem 1rem 0 1.125rem;\n\n .force-messages-scroll & {\n margin-top: 100vh !important;\n }\n\n @media (max-width: 600px) {\n width: 100vw;\n padding: 2.75rem 0.5rem 0;\n // Patch for an issue on Android when rotating device\n margin: 0;\n }\n }\n\n &.no-composer {\n margin-bottom: 0;\n\n .last-in-list {\n margin-bottom: 1rem;\n }\n }\n\n &.select-mode-active, &.type-pinned {\n margin-bottom: 0;\n\n .last-in-list {\n margin-bottom: 5.625rem;\n\n @media (max-width: 600px) {\n margin-bottom: 4.25rem;\n }\n\n &.ActionMessage {\n padding-bottom: 0.125rem;\n }\n }\n }\n\n @media (max-width: 600px) {\n &.with-bottom-shift {\n margin-bottom: 0;\n .last-in-list {\n margin-bottom: 4.25rem;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n body:not(.keyboard-visible) & {\n margin-bottom: calc(4.25rem + env(safe-area-inset-bottom));\n }\n }\n }\n }\n }\n\n .Message,\n .ActionMessage {\n position: relative;\n\n opacity: 1;\n transform: scale(1);\n transition: opacity .2s ease, transform .2s ease;\n\n &:not(.open) {\n transform: scale(0.8);\n opacity: 0;\n }\n\n // Restore stacking context\n // https://developer.mozilla.org/ru/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context\n &.open.shown {\n transform: none;\n }\n\n &::before {\n content: \"\";\n position: absolute;\n top: -0.1875rem;\n bottom: -0.1875rem;\n left: -50vw;\n right: -50vw;\n background: black;\n z-index: -1;\n\n opacity: 0;\n transition: opacity var(--select-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n &:not(.last-in-group) {\n &::before {\n bottom: -0.1875rem;\n }\n }\n\n &:not(.first-in-group) {\n &::before {\n top: -0.1875rem;\n }\n }\n\n &.focused::before {\n // @optimization\n transition: none !important;\n }\n\n &.focused,\n &.is-forwarding,\n &.is-selected,\n &.has-menu-open {\n &::before {\n opacity: 0.1;\n\n .theme-dark & {\n opacity: .6;\n }\n }\n }\n }\n\n > .empty {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n\n & > span {\n max-width: 80%;\n text-align: left;\n }\n\n .text-entity-link {\n color: inherit !important;\n text-decoration: underline;\n\n &:hover, &:focus {\n text-decoration: none;\n }\n }\n }\n\n .sticky-date,\n .local-action-message,\n .ActionMessage,\n .empty {\n text-align: center;\n user-select: none;\n\n > span {\n display: inline-block;\n background: var(--pattern-color);\n color: white;\n font-size: calc(var(--message-text-size, 1rem) - .0625rem);\n font-weight: 500;\n line-height: 1.75;\n padding: 0 .5rem;\n border-radius: var(--border-radius-messages);\n word-break: break-word;\n\n body.is-ios &,\n body.is-macos & {\n font-size: calc(var(--message-text-size, 1rem) - .125rem);\n line-height: calc(var(--message-text-size, 1rem) + .5rem);\n }\n\n .emoji-small {\n vertical-align: text-bottom;\n width: calc(1.25 * var(--message-text-size, 1rem));\n height: calc(1.25 * var(--message-text-size, 1rem));\n background-size: calc(1.25 * var(--message-text-size, 1rem));\n }\n }\n }\n\n .sticky-date {\n margin-top: 1rem;\n margin-bottom: 1rem;\n z-index: var(--z-sticky-date);\n pointer-events: none;\n opacity: 1;\n transition: opacity .3s ease;\n\n body:not(.is-scrolling-messages) &.stuck {\n opacity: 0;\n\n span {\n pointer-events: none;\n }\n }\n\n body.animation-level-0 & {\n transition: none;\n }\n\n &.interactive {\n cursor: pointer;\n }\n\n span {\n pointer-events: auto;\n }\n }\n\n &.scrolled:not(.is-animating) .sticky-date {\n position: sticky;\n top: 0.625rem;\n }\n\n &.is-animating {\n overflow: hidden;\n }\n\n &.is-animating .message-select-control {\n display: none !important;\n }\n\n .has-header-tools & .sticky-date {\n top: 3.75rem !important;\n }\n\n .local-action-message,\n .ActionMessage {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n }\n\n .ActionMessage {\n .action-link {\n cursor: pointer;\n\n &:hover {\n text-decoration: underline;\n }\n }\n }\n\n .sticky-date + .ActionMessage {\n margin-top: -0.5rem;\n }\n\n @media (min-width: 1276px) {\n width: 100%;\n transform: translate3d(0, 0, 0);\n transition: transform var(--layer-transition);\n\n .messages-container {\n width: calc(100% - var(--right-column-width));\n }\n\n body.animation-level-0 & {\n transition: none;\n }\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) / -2), 0, 0);\n }\n\n body:not(.animating-right-column) #Main.right-column-open &.select-mode-active,\n #Main.right-column-open &:not(.select-mode-active),\n body.animating-right-column &:not(.select-mode-active) {\n width: calc(100% - var(--right-column-width));\n\n .messages-container {\n width: 100%;\n }\n }\n }\n\n @media (max-width: 600px) {\n transition: transform var(--layer-transition);\n\n body.enable-symbol-menu-transforms & {\n transform: translate3d(0, 0, 0);\n }\n\n body.is-symbol-menu-open & {\n transform: translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0);\n }\n }\n\n .animating > div > & {\n &::-webkit-scrollbar {\n width: 0;\n }\n\n /* Styles for Firefox */\n @supports (scrollbar-width: none) {\n padding-right: .6875rem;\n scrollbar-width: none;\n }\n }\n}\n",".ScrollDownButton {\n --base-bottom-pos: 6rem;\n\n position: absolute;\n bottom: var(--base-bottom-pos);\n right: 1rem;\n opacity: 0;\n transform: translateY(4.5rem);\n transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1), opacity .2s ease;\n z-index: var(--z-scroll-down-button);\n pointer-events: none;\n\n @supports (right: env(safe-area-inset-right)) {\n right: #{\"max(1rem, env(safe-area-inset-right))\"};\n }\n\n body.animation-level-0 & {\n transform: none !important;\n\n transition: opacity .15s;\n }\n\n @media (max-width: 600px) {\n right: 0.5rem;\n bottom: 4.5rem;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n body:not(.keyboard-visible) & {\n bottom: calc(4.5rem + env(safe-area-inset-bottom));\n }\n }\n }\n\n &-inner {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n > .Button {\n box-shadow: 0 1px 2px var(--color-default-shadow);\n color: var(--color-composer-button);\n\n i {\n font-size: 1.75rem;\n }\n }\n\n @media (min-width: 1276px) {\n transform: translateX(0);\n\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n #Main.right-column-open & {\n transform: translateX(calc(-1 * var(--right-column-width)));\n }\n }\n\n @media (max-width: 600px) {\n > .Button {\n width: 2.875rem;\n height: 2.875rem;\n }\n }\n }\n\n &.revealed {\n transform: translateY(0);\n opacity: 1;\n pointer-events: all;\n\n &.no-composer:not(.with-extra-shift) {\n transform: translateY(4rem);\n }\n }\n\n .unread-count {\n min-width: 1.5rem;\n height: 1.5rem;\n padding: 0 .45rem;\n border-radius: 0.75rem;\n font-size: 0.875rem;\n line-height: 1.5rem;\n font-weight: 500;\n text-align: center;\n\n position: absolute;\n top: -0.3rem;\n right: -0.3rem;\n\n background: var(--color-green);\n color: white;\n\n pointer-events: none;\n\n @media (max-width: 600px) {\n top: -0.7rem;\n right: auto;\n }\n }\n\n @media (max-width: 600px) {\n body.is-symbol-menu-open & {\n bottom: calc(var(--base-bottom-pos) + var(--symbol-menu-height) + var(--symbol-menu-footer-height));\n }\n }\n}\n",".BotKeyboardMenu {\n .bubble {\n width: 100% !important;\n max-width: 27rem;\n border-radius: var(--border-radius-default-small);\n }\n\n .content {\n display: flex;\n flex-direction: column;\n padding: .1875rem .625rem;\n max-height: 80vh;\n overflow: auto;\n\n @media (max-width: 600px) {\n max-height: 75vh;\n }\n\n .row {\n display: flex;\n flex-direction: row;\n }\n\n .row + .row {\n margin-top: .375rem;\n }\n\n .Button {\n flex: 1;\n width: auto;\n height: auto;\n min-height: 3.0625rem;\n border-radius: var(--border-radius-messages-small);\n border: 2px solid var(--color-primary);\n background: var(--color-background);\n color: var(--color-primary);\n font-weight: 500;\n text-transform: none;\n\n &:hover {\n color: #fff;\n border-color: var(--color-primary-shade);\n background: var(--color-primary-shade);\n }\n }\n\n .Button + .Button {\n margin-left: .375rem;\n }\n }\n}\n",".ComposerEmbeddedMessage {\n height: 2.625rem;\n transition: height 150ms ease-out, opacity 150ms ease-out;\n\n .select-mode-active + .middle-column-footer & {\n display: none;\n }\n\n &:not(.open) {\n height: 0 !important;\n }\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n & > div {\n display: flex;\n align-items: center;\n padding-right: 0.625rem;\n padding-top: 0.1875rem;\n }\n\n & > div > .Button {\n flex-shrink: 0;\n background: none !important;\n width: 3.5rem;\n height: 2.875rem;\n margin: 0 -0.0625rem 0 0;\n padding: 0;\n align-self: center;\n\n @media (max-width: 600px) {\n width: 2.875rem;\n }\n }\n}\n",".WebPagePreview {\n height: 2.625rem;\n transition: height 150ms ease-out, opacity 150ms ease-out;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n .select-mode-active + .middle-column-footer & {\n display: none;\n }\n\n &:not(.open) {\n height: 0 !important;\n }\n\n // TODO Remove duplication with `.ComposerEmbeddedMessage`\n & > div {\n display: flex;\n align-items: center;\n padding-right: 0.625rem;\n padding-top: 0.1875rem;\n }\n\n --accent-color: var(--color-primary);\n\n .ComposerEmbeddedMessage + & {\n margin-top: 0.75rem;\n }\n\n & > div > .Button {\n flex-shrink: 0;\n background: none !important;\n width: 3.5rem;\n height: 2.875rem;\n margin: 0 -0.0625rem 0 0;\n padding: 0;\n align-self: center;\n\n @media (max-width: 600px) {\n width: 2.875rem;\n }\n }\n\n .WebPage {\n flex-grow: 1;\n margin: 0.1875rem 0 0.1875rem 0.125rem;\n max-width: calc(100% - 3.375rem);\n\n &::before {\n top: .1rem;\n bottom: .05rem;\n }\n\n &.with-video .media-inner { // TODO add support for video in previews in composer\n display: none;\n }\n\n .site-title,\n .site-description {\n flex: 1;\n max-width: 100%;\n max-height: 1rem;\n }\n\n .site-title {\n margin-top: .125rem;\n margin-bottom: 0.1875rem;\n }\n\n .site-description {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n}\n","@import '../../../styles/mixins';\n\n.Composer {\n align-items: flex-end;\n\n .select-mode-active + .middle-column-footer & {\n position: absolute;\n padding-right: 2rem;\n bottom: 0;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n bottom: env(safe-area-inset-bottom);\n }\n\n @media (max-width: 600px) {\n padding-right: 1rem;\n }\n\n &::before {\n right: 2.125rem;\n\n @media (max-width: 600px) {\n right: 1rem;\n }\n }\n\n .svg-appendix {\n opacity: 0;\n }\n }\n\n .form-control {\n --border-width: 0;\n }\n\n @keyframes show-send-as-button {\n from {\n width: 1rem;\n transform: scale(0);\n }\n\n to {\n width: 3.5rem;\n transform: scale(1);\n }\n }\n\n > .Button {\n flex-shrink: 0;\n margin-left: .5rem;\n\n &:not(.danger) {\n color: var(--color-composer-button);\n }\n\n @media (max-width: 600px) {\n width: 2.875rem;\n height: 2.875rem;\n }\n\n .icon-send,\n .icon-schedule,\n .icon-microphone-alt,\n .icon-check {\n position: absolute;\n }\n\n &:not(:active):not(:focus):not(:hover) {\n .icon-send,\n .icon-schedule,\n .icon-check {\n color: var(--color-primary);\n }\n }\n\n &.cancel {\n position: relative;\n z-index: 1;\n\n &:hover, &.active {\n background: var(--color-chat-hover);\n }\n }\n\n &.recording {\n position: relative;\n z-index: 0;\n transition: box-shadow .1s;\n }\n\n &.send {\n .icon-send {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-microphone-alt,\n .icon-check,\n .icon-schedule {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.schedule {\n .icon-schedule {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-microphone-alt,\n .icon-check,\n .icon-send {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.record {\n .icon-microphone-alt {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-send,\n .icon-check,\n .icon-schedule {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.edit {\n .icon-check {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-send,\n .icon-microphone-alt,\n .icon-schedule {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.not-ready > i {\n animation-duration: 0ms !important;\n }\n\n body.animation-level-0 &, body.animation-level-1 & {\n .icon-send, .icon-microphone-alt, .icon-check, .icon-schedule {\n animation-duration: 0ms !important;\n }\n }\n }\n\n .send-as-button {\n z-index: 1;\n }\n\n body:not(.animation-level-0) & .send-as-button.appear-animation {\n animation: 0.25s ease-in-out forwards show-send-as-button;\n }\n\n .mobile-symbol-menu-button {\n width: 2.875rem;\n height: 2.875rem;\n position: relative;\n\n .icon-smile,\n .icon-keyboard,\n .Spinner {\n position: absolute;\n }\n\n .Spinner {\n --spinner-size: 1.5rem;\n }\n\n .icon-smile {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-keyboard, .Spinner {\n animation: hide-icon .4s forwards ease-out;\n }\n\n &.not-ready > i {\n animation-duration: 0ms !important;\n }\n\n &.is-loading {\n .Spinner {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-keyboard, .icon-smile {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n\n &.menu-opened {\n .icon-keyboard {\n animation: grow-icon .4s ease-out;\n }\n\n .icon-smile, .Spinner {\n animation: hide-icon .4s forwards ease-out;\n }\n }\n }\n}\n\n#message-compose {\n flex-grow: 1;\n max-width: calc(100% - 4rem);\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n border-bottom-right-radius: 0;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n position: relative;\n z-index: 1;\n\n .svg-appendix {\n position: absolute;\n bottom: -.1875rem;\n right: -.551rem; // This value is correct. Safari fix\n width: .5625rem;\n height: 1.25rem;\n transition: opacity 200ms;\n font-size: 1rem !important;\n\n .corner {\n fill: var(--color-background);\n }\n }\n\n @media (max-width: 600px) {\n max-width: calc(100% - 3.375rem);\n }\n}\n\n.message-input-wrapper {\n display: flex;\n\n > .Spinner {\n align-self: center;\n --spinner-size: 1.5rem;\n margin-right: -.5rem;\n }\n\n > .Button {\n flex-shrink: 0;\n background: none !important;\n width: 3.5rem;\n height: 3.5rem;\n margin: 0;\n padding: 0;\n align-self: flex-end;\n\n &:not(.faded):not(.activated) {\n color: var(--color-composer-button);\n }\n\n + .Button {\n margin-left: -1rem;\n }\n\n @media (max-width: 600px) {\n width: 2.875rem;\n height: 2.875rem;\n\n + .Button {\n margin-left: -0.6875rem;\n }\n }\n\n &.bot-commands {\n color: var(--color-primary) !important;\n\n // SymbolMenu button should be accessible if BotCommandsMenu opened\n body.is-touch-env &.activated + .Button.mobile-symbol-menu-button {\n z-index: calc(var(--z-menu-backdrop) + 1);\n }\n }\n\n &.scheduled-button i::after {\n content: '';\n position: absolute;\n top: .75rem;\n right: .875rem;\n border: .1875rem solid var(--color-background);\n box-sizing: content-box;\n width: .5rem;\n height: .5rem;\n border-radius: 50%;\n background: var(--color-green-darker);\n box-shadow: -.375rem -.25rem 0 -.1875rem var(--color-background);\n @media (max-width: 600px) {\n top: .5rem;\n right: .5rem;\n }\n }\n }\n\n > .input-group {\n flex-grow: 1;\n margin-bottom: 0;\n }\n\n .recording-state {\n display: inline-block;\n position: relative;\n line-height: 3.5rem;\n height: 3.5rem;\n padding: 0 3.125rem 0 1rem;\n font-family: \"Roboto\", -apple-system, BlinkMacSystemFont, \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif;\n\n &::after {\n content: '';\n width: .75rem;\n height: .75rem;\n background: var(--color-error);\n border-radius: .375rem;\n position: absolute;\n top: 50%;\n margin-top: -.375rem;\n right: 1.3125rem;\n animation: recording-blink-like-macos 1.5s infinite;\n }\n\n @media (max-width: 600px) {\n height: 2.875rem;\n line-height: 2.875rem;\n }\n }\n}\n\n#message-input-text,\n#caption-input-text {\n position: relative;\n\n .form-control {\n padding: calc((3.25rem - var(--composer-text-size, 1rem) * 1.375) / 2 - var(--border-width, 0) * 2) calc(.9rem - var(--border-width));\n overflow: hidden;\n line-height: 1.375;\n font-family: Roboto, -apple-system, \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif;\n unicode-bidi: plaintext;\n text-align: initial;\n font-size: var(--composer-text-size, 1rem);\n\n body.is-ios &,\n body.is-macos & {\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif;\n }\n\n &.overflown {\n overflow-y: auto;\n overflow-x: hidden;\n }\n\n &.touched, &:focus {\n & + .placeholder-text {\n display: none;\n }\n }\n\n &.focus-disabled {\n pointer-events: none;\n }\n }\n\n .forced-placeholder,\n .placeholder-text {\n position: absolute;\n color: var(--color-placeholders);\n pointer-events: none;\n unicode-bidi: plaintext;\n text-align: initial;\n line-height: 1.3125;\n font-size: var(--composer-text-size, 1rem);\n top: calc((3.25rem - var(--composer-text-size, 1rem) * 1.375) / 2);\n bottom: auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n }\n\n .forced-placeholder {\n z-index: var(--z-below);\n left: 0;\n }\n\n &[dir=rtl] .placeholder-text {\n right: 0;\n }\n\n .text-entity-link {\n color: var(--color-links) !important;\n cursor: default;\n text-decoration: none;\n\n &:hover, &:active, &:visited {\n text-decoration: underline !important;\n }\n }\n\n .clone {\n position: absolute;\n top: 0;\n left: 0;\n opacity: 0;\n pointer-events: none;\n z-index: -10;\n unicode-bidi: plaintext;\n text-align: initial;\n }\n}\n\n#message-input-text {\n flex-grow: 1;\n\n .form-control {\n margin-bottom: 0;\n background: transparent !important;\n border: none !important;\n border-radius: 0 !important;\n box-shadow: none !important;\n caret-color: var(--color-text);\n min-height: 3.5rem;\n max-height: 26rem;\n line-height: 1.3125;\n padding: calc((3.5rem - var(--composer-text-size, 1rem) * 1.3125) / 2) 0;\n white-space: pre-wrap;\n\n @media (max-width: 600px) {\n height: 2.875rem;\n min-height: 2.875rem;\n max-height: 16rem;\n padding: calc((2.875rem - var(--composer-text-size, 1rem) * 1.3125) / 2) 0;\n overflow: auto;\n }\n\n transition: height 100ms ease;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n .forced-placeholder,\n .placeholder-text {\n top: calc((3.5rem - var(--composer-text-size, 1rem) * 1.3125) / 2);\n\n @media (max-width: 600px) {\n top: calc((2.875rem - var(--composer-text-size, 1rem) * 1.3125) / 2);\n }\n }\n\n &:not(:only-child) {\n .form-control {\n padding-left: 0;\n padding-right: 0;\n }\n }\n\n .ComposerEmbeddedMessage + .message-input-wrapper &,\n .WebPagePreview + .message-input-wrapper & {\n .form-control.overflown {\n margin-top: 0.75rem;\n }\n }\n\n .emoji {\n width: 1.25rem;\n height: 1.25rem;\n margin: 0 1px -5px;\n vertical-align: 0;\n pointer-events: none;\n }\n}\n\n#caption-input-text {\n .form-control {\n height: 3.25rem;\n min-height: 3.25rem;\n max-height: 15rem;\n }\n\n .placeholder-text {\n bottom: .8125rem;\n left: .90625rem;\n }\n}\n\n.composer-tooltip {\n position: absolute;\n bottom: calc(100% + .5rem);\n left: 0;\n width: 100%;\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n padding: 0.5rem 0;\n max-height: 15rem;\n\n overflow-x: hidden;\n overflow-y: auto;\n @include overflow-y-overlay();\n\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n opacity: 0;\n transform: translateY(1.5rem);\n transform-origin: bottom;\n transition: opacity var(--layer-transition), transform var(--layer-transition);\n\n &:not(.shown) {\n display: none;\n }\n\n &.open {\n opacity: 1;\n transform: translateY(0);\n }\n\n .Loading {\n margin: 1rem 0;\n }\n}\n\n@keyframes recording-blink-like-macos {\n from {\n opacity: 1;\n }\n to {\n opacity: .3;\n }\n}\n","#middle-column-bg {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n overflow: hidden;\n z-index: -1;\n background-color: var(--theme-background-color);\n\n &::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background-color: var(--theme-background-color);\n background-position: center;\n background-repeat: no-repeat;\n background-size: cover;\n\n body:not(.animation-level-0) #root & {\n transition: transform var(--layer-transition), background .2s !important;\n }\n\n body.animation-level-0 & {\n transition: none;\n }\n\n .theme-light & {\n background-image: url('../../assets/chat-bg.jpg');\n\n @media (max-width: 600px) {\n background-image: url('../../assets/chat-bg-mobile.jpg');\n }\n }\n }\n\n .custom-bg-color:not(.custom-bg-image) &::after {\n opacity: 0;\n }\n\n .custom-bg-image &::after {\n background-image: var(--custom-background) !important;\n filter: none;\n transform: scale(1.1);\n }\n\n .custom-bg-image.blurred &::after {\n filter: blur(12px);\n }\n\n @media screen and (min-width: 1276px) {\n body.animation-level-2 &::after {\n margin: -16rem -5rem -20rem 0;\n overflow: hidden;\n transform: scale(1);\n transform-origin: left center;\n transition: transform var(--layer-transition);\n }\n\n body.animation-level-2 #Main.right-column-open #MiddleColumn:not(.custom-bg-image) &::after {\n transform: scale(0.67) !important;\n }\n }\n\n body.animation-level-2 #Main.right-column-open #MiddleColumn:not(.custom-bg-image) &::after {\n @media screen and (min-width: 1921px) {\n transform: scale(0.8) !important;\n }\n\n @media screen and (min-width: 2600px) {\n transform: scale(0.95) !important;\n }\n }\n}\n\n#MiddleColumn {\n display: flex;\n justify-content: center;\n height: 100%;\n position: relative;\n z-index: 1;\n min-width: 0;\n\n @media (max-width: 600px) {\n overflow: hidden;\n }\n\n .messages-layout {\n --slide-transition: 450ms cubic-bezier(0.25, 1, 0.5, 1);\n\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n\n > .Transition {\n width: 100%;\n height: 100%;\n overflow: hidden;\n\n > div {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n }\n }\n\n .messaging-disabled {\n &-inner {\n width: 100%;\n padding: 1rem;\n border-radius: var(--border-radius-messages);\n background: var(--color-background);\n color: var(--color-text-secondary);\n text-align: center;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n }\n\n .Composer {\n #message-compose {\n transform: scaleX(1) translateX(0);\n transition: transform var(--select-transition), border-bottom-right-radius var(--select-transition);\n\n &::before {\n transform: scaleX(-1) translateX(0);\n transition: transform var(--select-transition);\n }\n\n body.animation-level-0 & {\n &, &::before {\n transition: none !important;\n }\n }\n }\n\n .message-input-wrapper, &::before {\n opacity: 1;\n transition: opacity var(--select-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n > .Button {\n opacity: 1;\n transform: scale(1);\n transition: opacity var(--select-transition), transform var(--select-transition), background-color 0.15s, color 0.15s;\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n &.hover-disabled, &:not(.shown) {\n pointer-events: none;\n }\n\n &:not(.shown) {\n .ComposerEmbeddedMessage {\n height: 0;\n }\n\n #message-compose {\n transform: scaleX(var(--composer-hidden-scale, 1)) translateX(var(--composer-translate-x, 0));\n border-bottom-right-radius: var(--border-radius-messages);\n\n &::before {\n transform: scaleX(-1) translateX(200%);\n }\n }\n\n #editable-message-text {\n height: 3.5rem !important;\n\n @media (max-width: 600px) {\n height: 2.5rem !important;\n }\n }\n\n .message-input-wrapper, &::before {\n opacity: 0;\n }\n\n > .Button {\n opacity: 0 !important;\n transform: scale(0.5);\n }\n }\n }\n\n .messaging-disabled {\n transform: scaleX(1);\n transition: transform var(--select-transition);\n\n .messaging-disabled-inner span {\n opacity: 1;\n transition: opacity var(--select-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n &:not(.shown) {\n transform: scaleX(var(--composer-hidden-scale, 1));\n pointer-events: none;\n\n .messaging-disabled-inner span {\n opacity: 0;\n }\n }\n }\n\n .middle-column-footer {\n width: 100%;\n max-width: var(--messages-container-width);\n padding: 0 1rem;\n position: relative;\n display: flex;\n align-items: flex-end;\n z-index: var(--z-middle-footer);\n\n transform: translate3d(0, 0, 0);\n transition: top 200ms, transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n @media (min-width: 1276px) {\n width: calc(100% - var(--right-column-width));\n\n #Main.right-column-open & {\n transform: translate3d(calc(var(--right-column-width) / -2), 0, 0);\n }\n }\n\n @media (max-width: 600px) {\n padding: 0 0.5rem;\n\n body.is-symbol-menu-open & {\n transform: translate3d(0, calc(-1 * (var(--symbol-menu-height) + var(--symbol-menu-footer-height))), 0);\n }\n }\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n &:not(.no-composer) {\n padding-bottom: env(safe-area-inset-bottom);\n top: 0;\n\n body.keyboard-visible & {\n top: env(safe-area-inset-bottom);\n }\n }\n }\n\n &::before {\n content: \"\";\n position: absolute;\n top: -.5625rem;\n left: 0;\n right: 0;\n height: 1px;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.4) 2%, rgba(255, 255, 255, 0.4) 98%, rgba(255, 255, 255, 0) 100%);\n opacity: 0;\n transition: opacity 350ms ease;\n\n @media (max-width: 600px) {\n left: -2%;\n right: -2%;\n }\n }\n\n &.with-notch::before {\n opacity: 1;\n }\n\n html.theme-dark &::before {\n background: linear-gradient(90deg, rgba(127, 127, 127, 0) 0%, rgba(127, 127, 127, 0.4) 2%, rgba(127, 127, 127, 0.4) 98%, rgba(127, 127, 127, 0) 100%);\n }\n }\n}\n\n/* Common styles for message list fade-out shadow */\n.Composer,\n.MessageSelectToolbar,\n.messaging-disabled {\n margin-bottom: 1.25rem;\n\n @media (max-width: 600px) {\n margin-bottom: 0.5rem;\n }\n}\n\n.Composer,\n.MessageSelectToolbar,\n.unpin-all-button,\n.join-subscribe-button,\n.messaging-disabled {\n width: 100%;\n display: flex;\n justify-content: center;\n position: relative;\n}\n\n.MessageSelectToolbar-inner,\n.unpin-all-button,\n.join-subscribe-button,\n.messaging-disabled {\n .mask-image-disabled & {\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-radius: var(--border-radius-messages);\n }\n}\n\n.middle-column-footer-button-container {\n width: 100%;\n display: flex;\n justify-content: center;\n position: absolute;\n padding-bottom: 1.25rem;\n\n .unpin-all-button {\n text-transform: capitalize;\n color: var(--color-black);\n\n @media (hover: hover) {\n &:hover {\n .icon-unpin {\n color: var(--color-white);\n }\n }\n }\n\n @media (max-width: 600px) {\n &:active, &:focus {\n .icon-unpin {\n color: var(--color-white);\n }\n }\n }\n\n .icon-unpin {\n margin-inline-start: -0.4375rem;\n margin-inline-end: .75rem;\n color: var(--color-text-secondary);\n font-size: 1.5rem;\n transition: color .15s\n }\n }\n\n .join-subscribe-button,\n .unpin-all-button {\n height: 3.5rem;\n transform: scaleX(1);\n transition: transform var(--select-transition), background-color .15s, color .15s;\n\n .select-mode-active + .middle-column-footer & {\n box-shadow: none;\n transform: scaleX(var(--unpin-hidden-scale));\n }\n\n @media (max-width: 600px) {\n height: 2.5rem;\n }\n }\n\n @media (max-width: 600px) {\n padding-bottom: 0.75rem;\n\n @supports (padding-bottom: env(safe-area-inset-bottom)) {\n padding-bottom: calc(.75rem + env(safe-area-inset-bottom));\n }\n }\n\n .mask-image-disabled &::before {\n background: unset;\n }\n}\n",".RightHeader {\n display: flex;\n align-items: center;\n height: var(--header-height);\n padding: 0.5rem .8125rem;\n pointer-events: auto;\n\n @media (max-width: 600px) {\n padding: 0.5rem;\n }\n\n .close-button {\n flex-shrink: 0;\n }\n\n > .Transition {\n flex: 1;\n height: 100%;\n\n > div {\n display: flex;\n align-items: center;\n }\n }\n\n h3 {\n margin-bottom: 0;\n font-size: 1.25rem;\n font-weight: 500;\n margin-left: 1.375rem;\n }\n\n .tools {\n display: flex;\n margin-left: auto;\n }\n\n .SearchInput {\n margin-left: 1rem;\n\n @media (min-width: 600px) {\n margin-right: 1rem;\n }\n }\n\n .DropdownMenu {\n margin-left: auto;\n }\n}\n","@import '../../styles/mixins';\n\n.Profile {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n overflow-x: hidden;\n overflow-y: scroll;\n @include overflow-y-overlay();\n\n > .profile-info > .ChatInfo {\n grid-area: chat_info;\n\n .status.online {\n color: var(--color-primary);\n }\n }\n\n > .profile-info > .ChatExtra {\n padding: .875rem .5rem .5rem;\n box-shadow: inset 0 -.0625rem 0 0 var(--color-background-secondary-accent);\n border-bottom: .625rem solid var(--color-background-secondary);\n\n .narrow {\n margin-bottom: 0;\n }\n\n .inactive.no-selection {\n user-select: auto;\n -webkit-user-select: auto !important;\n }\n\n .Switcher {\n margin-left: auto;\n }\n [dir=rtl] {\n .Switcher {\n margin-left: 0;\n margin-right: auto;\n }\n }\n }\n\n .FloatingActionButton {\n z-index: 1;\n }\n}\n\n.shared-media {\n display: flex;\n flex-direction: column-reverse;\n\n .TabList {\n background: var(--color-background);\n top: -1px;\n z-index: 1;\n\n .Tab {\n padding: 1rem .75rem;\n\n span {\n white-space: nowrap;\n }\n\n i {\n bottom: -1rem;\n }\n }\n }\n\n .Transition {\n flex: 1;\n }\n\n .content {\n &.empty-list {\n height: 100%;\n padding-top: 5rem;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n\n .Spinner {\n --spinner-size: 2.75rem;\n }\n }\n\n &.media-list {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-auto-rows: 1fr;\n grid-gap: .0625rem;\n }\n\n &.documents-list {\n padding: 1.25rem;\n\n & .File + .File {\n margin-top: 1.25rem;\n }\n }\n\n &.links-list {\n padding: 1.25rem;\n\n .ProgressSpinner,\n .message-transfer-progress {\n display: none;\n }\n }\n\n &.audio-list,\n &.voice-list {\n padding: 1.25rem;\n\n & .Audio {\n .media-loading {\n top: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n & + .Audio {\n margin-top: 1.6875rem;\n }\n }\n }\n\n &.commonChats-list,\n &.members-list {\n padding: 0.5rem 1rem;\n\n @media (max-width: 600px) {\n padding: .5rem 0;\n .ListItem.chat-item-clickable {\n margin: 0;\n }\n }\n }\n }\n}\n",".AddChatMembers {\n height: 100%;\n overflow: hidden;\n position: relative;\n\n &-inner {\n height: 100%;\n overflow: hidden;\n }\n}\n","#RightColumn {\n position: absolute;\n top: 0;\n right: 0;\n width: var(--right-column-width);\n height: 100%;\n transform: translate3d(var(--right-column-width), 0, 0);\n background: var(--color-background);\n border-left: 1px solid var(--color-borders);\n z-index: var(--z-right-column);\n\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none;\n }\n\n // @optimization\n &:not(:hover) {\n .chat-item-clickable:not(.picker-list-item):nth-child(n + 18) {\n display: none !important;\n }\n }\n\n @media (max-width: 1275px) {\n box-shadow: 0 .25rem .5rem .125rem var(--color-default-shadow);\n border-left: none;\n }\n\n @media (max-width: 600px) {\n width: 100vw;\n transform: translate3d(110vw, 0, 0);\n }\n\n @supports (padding-right: env(safe-area-inset-right)) {\n padding-right: env(safe-area-inset-right);\n }\n\n > .Transition {\n height: calc(100% - var(--header-height));\n overflow: hidden;\n }\n\n .Management .section > .ChatInfo {\n padding: 0 1.5rem;\n margin: 1rem 0;\n text-align: center;\n\n .Avatar {\n margin: 0 auto .5rem;\n\n &.no-photo {\n cursor: default !important;\n }\n }\n\n .title {\n display: flex;\n justify-content: center;\n align-items: center;\n\n h3 {\n font-weight: 500;\n font-size: 1.25rem;\n line-height: 2rem;\n white-space: pre-wrap;\n word-break: break-word;\n }\n\n .VerifiedIcon {\n margin-left: 0.25rem;\n margin-bottom: .5rem;\n }\n\n .emoji {\n width: 1.5rem;\n height: 1.5rem;\n background-size: 1.5rem;\n }\n }\n\n .status {\n font-size: 0.875rem;\n color: #868e96;\n }\n }\n}\n\n#RightColumn-wrapper {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--z-right-column);\n overflow: hidden;\n visibility: hidden;\n pointer-events: none;\n\n @media (max-width: 1275px) {\n position: fixed;\n }\n\n &.is-hidden {\n display: none;\n }\n\n .overlay-backdrop {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n background: black;\n opacity: 0;\n\n @media (max-width: 600px) {\n transition: opacity var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none;\n }\n }\n }\n\n #Main.right-column-open &, body.animating-right-column & {\n visibility: visible;\n }\n\n #Main.right-column-open & {\n @media (max-width: 600px) {\n .overlay-backdrop {\n opacity: var(--layer-blackout-opacity);\n }\n }\n\n #RightColumn {\n pointer-events: auto;\n transform: translate3d(0, 0, 0);\n }\n }\n}\n","#Main {\n height: 100%;\n text-align: left;\n overflow: hidden;\n\n @media (min-width: 1276px) {\n position: relative;\n }\n\n @media (max-width: 600px) {\n height: calc(var(--vh, 1vh) * 100);\n }\n\n @media (min-width: 926px) {\n display: grid;\n grid-template-columns: auto 1fr;\n grid-template-rows: 100%;\n }\n}\n\n.has-group-call-header {\n --group-call-header-height: 2rem;\n #LeftColumn, #MiddleColumn, #RightColumn-wrapper {\n height: calc(100% - 2rem);\n margin-top: 2rem;\n }\n}\n\n#LeftColumn {\n min-width: 12rem;\n width: 33vw;\n max-width: 26.5rem;\n height: 100%;\n position: relative;\n\n & > div {\n height: 100%;\n overflow: hidden;\n }\n\n @media (max-width: 600px) {\n height: calc(var(--vh, 1vh) * 100);\n }\n\n @media (min-width: 926px) {\n max-width: 40vw;\n }\n\n @media (min-width: 1276px) {\n width: 25vw;\n max-width: 33vw;\n }\n\n @media (max-width: 925px) {\n position: fixed;\n left: 0;\n top: 0;\n height: calc(var(--vh, 1vh) * 100);\n width: 26.5rem !important;\n\n transform: translate3d(-5rem, 0, 0);\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none;\n }\n\n &::after {\n content: '';\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background: black;\n opacity: var(--layer-blackout-opacity);\n transition: opacity var(--layer-transition);\n z-index: 1;\n\n body.animation-level-0 & {\n transition: none;\n }\n\n // @optimization\n body.is-android & {\n display: none;\n }\n\n body.is-android .middle-column-shown & {\n display: block;\n }\n }\n\n #Main:not(.middle-column-open) & {\n transform: translate3d(0, 0, 0);\n\n &::after {\n opacity: 0;\n pointer-events: none;\n }\n }\n\n #Main.history-animation-disabled & {\n transition: none;\n\n &:after {\n transition: none;\n }\n }\n }\n\n @media (max-width: 600px) {\n max-width: none;\n width: 100vw !important;\n transform: translate3d(-20vw, 0, 0);\n\n @supports (left: env(safe-area-inset-left)) {\n left: env(safe-area-inset-left) !important;\n width: calc(100vw - env(safe-area-inset-left));\n }\n }\n}\n\n#RightColumn {\n @media (max-width: 600px) {\n height: calc(var(--vh, 1vh) * 100 + 1px);\n }\n\n #Main.history-animation-disabled & {\n transition: none;\n\n .overlay-backdrop {\n transition: none;\n }\n }\n}\n\n#Main.history-animation-disabled .overlay-backdrop {\n transition: none;\n}\n\n#MiddleColumn {\n border-left: 1px solid var(--color-borders);\n\n @media (max-width: 925px) {\n max-width: none;\n position: fixed;\n left: 0;\n top: 0;\n bottom: 0;\n right: 0;\n\n transform: translate3d(0, 0, 0);\n transition: transform var(--layer-transition);\n\n body.animation-level-0 & {\n transition: none;\n }\n\n #Main:not(.middle-column-open) & {\n transform: translate3d(26.5rem, 0, 0);\n }\n }\n\n @media (max-width: 600px) {\n border-left: none;\n\n #Main:not(.middle-column-open) & {\n transform: translate3d(100vw, 0, 0);\n }\n\n #Main.right-column-open & {\n transform: translate3d(-20vw, 0, 0);\n }\n }\n\n #Main.history-animation-disabled & {\n transition: none;\n\n &:after {\n transition: none;\n }\n }\n}\n\nbody.is-android.animation-level-1 {\n --layer-transition: 250ms ease-in-out;\n\n #LeftColumn, #MiddleColumn, #RightColumn {\n transition: transform var(--layer-transition), opacity var(--layer-transition);\n }\n\n #Main:not(.middle-column-shown) {\n #MiddleColumn {\n display: none;\n }\n }\n\n #Main:not(.middle-column-open) {\n #MiddleColumn {\n transform: translate3d(10vw, 0, 0);\n opacity: 0;\n }\n }\n\n #Main.middle-column-open {\n #LeftColumn {\n transform: translate3d(0, 0, 0);\n opacity: 0;\n }\n }\n\n #Main:not(.right-column-shown) {\n #RightColumn {\n display: none;\n }\n }\n\n #Main:not(.right-column-open) {\n #RightColumn {\n transform: translate3d(10vw, 0, 0);\n opacity: 0;\n }\n }\n\n #Main.right-column-open {\n #MiddleColumn {\n transform: translate3d(0, 0, 0);\n opacity: 0;\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/163.c69a8648aa1c99ba6248.js b/dist/163.c69a8648aa1c99ba6248.js new file mode 100644 index 000000000..ade2f6df8 --- /dev/null +++ b/dist/163.c69a8648aa1c99ba6248.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[163],{4163:(e,t,n)=>{n.r(t),n.d(t,{Main:()=>ei});var a=n(5116),s=n(3716),o=n(4050),i=(n(7895),n(9959)),r=n(1638),c=n(735),d=n(2858);function l(e){const{chatId:t,threadId:n}=(0,r.Bt)(e)||{};return t&&n?(e=(0,i.qr)(e,t,n,!1),e=(0,i.Pb)(e,t,n,void 0)):e}(0,a.Q6)("openLocalTextSearch",(e=>{const{chatId:t,threadId:n}=(0,r.Bt)(e)||{};if(t&&n)return(0,i.qr)(e,t,n,!0)})),(0,a.Q6)("closeLocalTextSearch",l),(0,a.Q6)("setLocalTextSearchQuery",((e,t,n)=>{const{chatId:a,threadId:s}=(0,r.Bt)(e)||{};if(!a||!s)return;const{query:o}=n,l=(0,d.uw)(a,s),{query:u}=e.localTextSearch.byChatThreadKey[l]||{};return o!==u&&(e=(0,i.Pb)(e,a,s,c.D)),(0,i.qr)(e,a,s,!0,o)})),(0,a.Q6)("setLocalMediaSearchType",((e,t,n)=>{const{chatId:a}=(0,r.Bt)(e)||{};if(!a)return;const{mediaType:s}=n;return(0,i.z5)(e,a,s)})),(0,a.Q6)("openChat",((e,t,n)=>{const{id:s,threadId:o=-1,type:c="thread",shouldReplaceHistory:d=!1}=n,u=(0,r.Bt)(e);return u&&u.chatId===s&&u.threadId===o&&u.type===c||(e=(0,i.pf)(e,s,o,"replyStack",[]),e=l(e=(0,i.i9)(e)),e={...e,messages:{...e.messages,contentToBeScheduled:void 0},...s!==e.forwardMessages.toChatId&&{forwardMessages:{}}},(0,a.R3)(e)),(0,i.Wy)(e,s,o,c,d)})),(0,a.Q6)("openPreviousChat",(e=>(0,i.Wy)(e,void 0))),(0,a.Q6)("openChatWithInfo",((e,t,n)=>{(0,a.R3)({...e,isChatInfoShown:!0}),t.openChat(n)})),(0,a.Q6)("resetChatCreation",(e=>({...e,chatCreation:void 0}))),(0,a.Q6)("setNewChatMembersDialogState",((e,t,n)=>({...e,newChatMembersProgress:n}))),(0,a.Q6)("openNextChat",((e,t,n)=>{const{targetIndexDelta:a,orderedIds:s}=n,{chatId:o}=(0,r.Bt)(e)||{};if(!o)return void t.openChat({id:s[0]});const i=s.indexOf(o);if(-1===i)return;const c=s[i+a];t.openChat({id:c,shouldReplaceHistory:!0})}));var u=n(6137),m=n(1713),h=n(7361),g=n(782),p=n(2267),f=n(3099);const v=s.ck+s.fK;let I;(0,a.Q6)("setScrollOffset",((e,t,n)=>{const{chatId:a,threadId:s,scrollOffset:o}=n;return(0,i.pf)(e,a,s,"scrollOffset",o)})),(0,a.Q6)("setReplyingToId",((e,t,n)=>{const{messageId:a}=n,s=(0,r.Bt)(e);if(!s)return;const{chatId:o,threadId:c}=s;return(0,i.pf)(e,o,c,"replyingToId",a)})),(0,a.Q6)("setEditingId",((e,t,n)=>{const{messageId:a}=n,s=(0,r.Bt)(e);if(!s)return;const{chatId:o,threadId:c,type:d}=s,l="scheduled"===d?"editingScheduledId":"editingId";return(0,i.pf)(e,o,c,l,a)})),(0,a.Q6)("editLastMessage",(e=>{const{chatId:t,threadId:n}=(0,r.Bt)(e)||{};if(!t||!n)return;const a=(0,r.Zw)(e,t),s=(0,r.Cb)(e,t,n);if(!a||!s)return;const o=(0,g.dF)(s,(t=>Boolean(a[t]&&(0,r._k)(e,a[t],n).canEdit)));return o?(0,i.pf)(e,t,n,"editingId",o):void 0})),(0,a.Q6)("replyToNextMessage",((e,t,n)=>{const{targetIndexDelta:a}=n,{chatId:s,threadId:o}=(0,r.Bt)(e)||{};if(!s||!o)return;const i=(0,r.Zw)(e,s),c=(0,r.Cb)(e,s,o);if(!i||!c)return;const d=(0,r.Yy)(e,s,o);let l;if((0,r.b9)(e,s,o)&&d){const e=Object.keys(i),t=e.indexOf(d.toString())+a;l=t<=e.length+1&&t>=0?Number(e[t]):void 0}else if(o===u._f){var m;const t=(0,r.Z1)(e,s);l=null==t||null===(m=t.lastMessage)||void 0===m?void 0:m.id}else{const t=(0,r.tZ)(e,s,o);l=null==t?void 0:t.lastMessageId}t.setReplyingToId({messageId:l}),t.focusMessage({chatId:s,threadId:o,messageId:l})})),(0,a.Q6)("openMediaViewer",((e,t,n)=>{const{chatId:a,threadId:s,messageId:o,avatarOwnerId:i,profilePhotoIndex:r,origin:c}=n;return{...e,mediaViewer:{chatId:a,threadId:s,messageId:o,avatarOwnerId:i,profilePhotoIndex:r,origin:c},forwardMessages:{}}})),(0,a.Q6)("closeMediaViewer",(e=>({...e,mediaViewer:{}}))),(0,a.Q6)("openAudioPlayer",((e,t,n)=>{const{chatId:a,threadId:s,messageId:o,origin:i,volume:r,playbackRate:c,isMuted:d}=n;return{...e,audioPlayer:{chatId:a,threadId:s,messageId:o,origin:null!=i?i:e.audioPlayer.origin,volume:null!=r?r:e.audioPlayer.volume,playbackRate:c||e.audioPlayer.playbackRate,isMuted:d||e.audioPlayer.isMuted}}})),(0,a.Q6)("setAudioPlayerVolume",((e,t,n)=>{const{volume:a}=n;return{...e,audioPlayer:{...e.audioPlayer,volume:a}}})),(0,a.Q6)("setAudioPlayerPlaybackRate",((e,t,n)=>{const{playbackRate:a}=n;return{...e,audioPlayer:{...e.audioPlayer,playbackRate:a}}})),(0,a.Q6)("setAudioPlayerMuted",((e,t,n)=>{const{isMuted:a}=n;return{...e,audioPlayer:{...e.audioPlayer,isMuted:a}}})),(0,a.Q6)("setAudioPlayerOrigin",((e,t,n)=>{const{origin:a}=n;return{...e,audioPlayer:{...e.audioPlayer,origin:a}}})),(0,a.Q6)("closeAudioPlayer",(e=>({...e,audioPlayer:{volume:e.audioPlayer.volume,playbackRate:e.audioPlayer.playbackRate,isMuted:e.audioPlayer.isMuted}}))),(0,a.Q6)("openPollResults",((e,t,n)=>{const{chatId:s,messageId:o}=n;(0,r.Jf)(e)?s===e.pollResults.chatId&&o===e.pollResults.messageId||(0,a.R3)({...e,pollResults:{chatId:s,messageId:o,voters:{}}}):window.setTimeout((()=>{const e=(0,a.Rd)();(0,a.R3)({...e,pollResults:{chatId:s,messageId:o,voters:{}}})}),450)})),(0,a.Q6)("closePollResults",(e=>{(0,a.R3)({...e,pollResults:{}})})),(0,a.Q6)("focusLastMessage",((e,t)=>{const n=(0,r.Bt)(e);if(!n)return;const{chatId:a,threadId:s}=n;let o;if(s===u._f){var i;const t=(0,r.Z1)(e,a);o=null==t||null===(i=t.lastMessage)||void 0===i?void 0:i.id}else{const t=(0,r.tZ)(e,a,s);o=null==t?void 0:t.lastMessageId}o&&t.focusMessage({chatId:a,threadId:s,messageId:o,noHighlight:!0})})),(0,a.Q6)("focusNextReply",((e,t)=>{const n=(0,r.Bt)(e);if(!n)return;const{chatId:s,threadId:o}=n,c=(0,r.p9)(e,s,o);if(c&&0!==c.length){const n=c.pop();e=(0,i.pf)(e,s,o,"replyStack",[...c]),(0,a.R3)(e),t.focusMessage({chatId:s,threadId:o,messageId:n})}else t.focusLastMessage()})),(0,a.Q6)("focusMessage",((e,t,n)=>{const{chatId:s,threadId:o=u._f,messageListType:c="thread",noHighlight:d,groupedId:l,groupedChatId:h,replyMessageId:g,isResizingContainer:p}=n;let{messageId:f}=n;if(void 0!==l){const t=(0,r.y8)(e,h,l);null!=t&&t.length&&([f]=t)}const y=(0,r.Bt)(e),Z=!y||s!==y.chatId||o!==y.threadId||c!==y.type;if(I&&(clearTimeout(I),I=void 0),I=window.setTimeout((()=>{let e=(0,a.Rd)();e=(0,i.cq)(e),e=(0,i.wV)(e),(0,a.R3)(e)}),d?v:1500),e=(0,i.cq)(e,s,f,d,p),e=(0,i.wV)(e,void 0),g){const t=(0,r.p9)(e,s,o)||[];e=(0,i.pf)(e,s,o,"replyStack",[...t,g])}Z&&(e=(0,i.wV)(e,m.fo.Static));const P=(0,r.Cb)(e,s,o);if(P&&P.includes(f))return(0,a.R3)(e),void t.openChat({id:s,threadId:o});if(Z&&(e=(0,i.pf)(e,s,o,"viewportIds",void 0)),e=(0,i.pf)(e,s,o,"outlyingIds",void 0),P&&!Z){const t=f>P[0]?m.fo.Down:m.fo.Up;e=(0,i.wV)(e,t)}(0,a.R3)(e),t.openChat({id:s,threadId:o}),t.loadViewportMessages()})),(0,a.Q6)("openForwardMenu",((e,t,n)=>{const{fromChatId:a,messageIds:s,groupedId:o}=n;let i;return o&&(i=(0,r.xH)(e,a,o)),{...e,forwardMessages:{fromChatId:a,messageIds:i||s,isModalShown:!0}}})),(0,a.Q6)("exitForwardMode",(e=>{(0,a.R3)({...e,forwardMessages:{}})})),(0,a.Q6)("setForwardChatId",((e,t,n)=>{const{id:s}=n;(0,a.R3)({...e,forwardMessages:{...e.forwardMessages,toChatId:s,isModalShown:!1}}),t.openChat({id:s}),t.closeMediaViewer(),t.exitMessageSelectMode()})),(0,a.Q6)("openForwardMenuForSelectedMessages",((e,t)=>{if(!e.selectedMessages)return;const{chatId:n,messageIds:a}=e.selectedMessages;t.openForwardMenu({fromChatId:n,messageIds:a})})),(0,a.Q6)("cancelMessageMediaDownload",((e,t,n)=>{const{message:s}=n,o=e.activeDownloads.byChatId[s.chatId];o&&o.length&&(0,a.R3)({...e,activeDownloads:{byChatId:{...e.activeDownloads.byChatId,[s.chatId]:o.filter((e=>e!==s.id))}}})})),(0,a.Q6)("downloadMessageMedia",((e,t,n)=>{const{message:s}=n;s&&(0,a.R3)({...e,activeDownloads:{byChatId:{...e.activeDownloads.byChatId,[s.chatId]:[...e.activeDownloads.byChatId[s.chatId]||[],s.id]}}})})),(0,a.Q6)("downloadSelectedMessages",((e,t)=>{if(!e.selectedMessages)return;const{chatId:n,messageIds:a}=e.selectedMessages,{threadId:s}=(0,r.Bt)(e)||{},o=(0,r.Zw)(e,n);o&&s&&a.map((e=>o[e])).filter((t=>(0,r._k)(e,t,s).canDownload)).forEach((e=>t.downloadMessageMedia({message:e})))})),(0,a.Q6)("enterMessageSelectMode",((e,t,n)=>{const{messageId:a}=n||{},s=(0,r.jr)(e);return s?(0,i.M6)(e,s.id,a):e})),(0,a.Q6)("toggleMessageSelection",((e,t,n)=>{const{messageId:s,groupedId:o,childMessageIds:c,withShift:d}=n,l=(0,r.Bt)(e);if(!l)return;const{chatId:u,threadId:m,type:g}=l;e=(0,i.Ob)(e,u,m,g,s,o,c,d),(0,a.R3)(e),e.shouldShowContextMenuHint&&(t.disableContextMenuHint(),t.showNotification({message:`To **edit** or **reply**, close this menu. Then ${h.$b?"long tap":"right click"} on a message.`}))})),(0,a.Q6)("disableContextMenuHint",(e=>{if(e.shouldShowContextMenuHint)return{...e,shouldShowContextMenuHint:!1}})),(0,a.Q6)("exitMessageSelectMode",i.i9),(0,a.Q6)("openPollModal",(e=>({...e,isPollModalOpen:!0}))),(0,a.Q6)("closePollModal",(e=>({...e,isPollModalOpen:!1}))),(0,a.Q6)("checkVersionNotification",((e,t)=>{const n=s.Ji.split(".").slice(0,2).join("."),{serviceNotifications:a}=e;if(a.find((({version:e})=>e===n)))return;const o={chatId:s.aw,date:(0,p.b)(e.serverTimeOffset),content:{text:(0,f.Z)("**Telegram Web Z was updated to version 1.30**\n\n👏 **Harder**\n• Meet Message Reactions:\n - React to a message with ❤️🔥🎉😁😱🤩😢👎💩🤮 in the context menu.\n - Send a quick 👍 reaction by hovering over the bottom corner of a message.\n - You can change your default reaction to another emoji in Settings > General.\n - Group and Channel admins can enable and control reactions via their chat's Info Page > Edit > Reactions.\n\n• Interactive Emoji:\n - Added support for all interactive emoji, including fullscreen animations and sound effects. Try 🔥, 🍆, 🍑 and more.\n - Animations play simultaneously when both users have the chat open.\n – The “is watching…” status will appear when your chat partner is also seeing the animations.\n\n• Manage invite links for Groups and Channels:\n – Enable admin approval or limited duration and users.\n\n🤩 **Better**\n• Better quality for uploaded profile pictures.\n• Various UI improvements.\n\n🚀 **Faster**\n• Several optimizations for older devices – no more freezing while typing.\n\n💪 **Stronger**\n• Saved Messages now correctly renders in search results.\n• Fixed missing icons for muted chats in the chat list.\n• The context menu no longer flickers on older devices.\n• Fix re-scheduling messages to a previous date.\n")},isOutgoing:!1};t.createServiceNotification({message:o,version:n})})),(0,a.Q6)("createServiceNotification",((e,t,n)=>{var o;const{message:i,version:c}=n,{serviceNotifications:d}=e,l=(0,r.Z1)(e,s.aw),u=Math.max((null===(o=l.lastMessage)||void 0===o?void 0:o.id)||0,...d.map((({id:e})=>e))),m=(d.length+1)/1e3,h=Math.floor(u)+m;i.id=h;const g={id:h,message:i,version:c,isUnread:!0};(0,a.R3)({...e,serviceNotifications:[...d.slice(-1e3),g]}),t.apiUpdate({"@type":"newMessage",id:i.id,chatId:i.chatId,message:i})})),(0,a.Q6)("openReactorListModal",((e,t,n)=>{const{chatId:a,messageId:s}=n;return{...e,reactorModal:{chatId:a,messageId:s}}})),(0,a.Q6)("closeReactorListModal",(e=>({...e,reactorModal:void 0}))),(0,a.Q6)("openSeenByModal",((e,t,n)=>{const{chatId:a,messageId:s}=n;return{...e,seenByModal:{chatId:a,messageId:s}}})),(0,a.Q6)("closeSeenByModal",(e=>({...e,seenByModal:void 0}))),(0,a.Q6)("setGlobalSearchQuery",((e,t,n)=>{const{query:a}=n,{chatId:s}=e.globalSearch;return(0,i.No)(e,{globalResults:{},localResults:{},resultsByType:void 0,...a?{fetchingStatus:{chats:!s,messages:!0}}:{fetchingStatus:void 0},query:a})})),(0,a.Q6)("addRecentlyFoundChatId",((e,t,n)=>{const{id:a}=n,{recentlyFoundChatIds:s}=e.globalSearch;if(!s)return(0,i.No)(e,{recentlyFoundChatIds:[a]});const o=s.filter((e=>e!==a));return o.unshift(a),o.length>10&&o.pop(),(0,i.No)(e,{recentlyFoundChatIds:o})})),(0,a.Q6)("clearRecentlyFoundChats",(e=>(0,i.No)(e,{recentlyFoundChatIds:void 0}))),(0,a.Q6)("setGlobalSearchContent",((e,t,n)=>{const{content:a}=n;return(0,i.Og)(e,a)})),(0,a.Q6)("setGlobalSearchChatId",((e,t,n)=>{const{id:a}=n;return(0,i.No)(e,{chatId:a,query:void 0,resultsByType:void 0})})),(0,a.Q6)("setStickerSearchQuery",((e,t,n)=>{const{query:a}=n;return{...e,stickers:{...e.stickers,search:{query:a,resultIds:void 0}}}})),(0,a.Q6)("setGifSearchQuery",((e,t,n)=>{const{query:a}=n;return{...e,gifs:{...e.gifs,search:{query:a,offsetId:void 0,results:void 0}}}})),(0,a.Q6)("openUserInfo",((e,t,n)=>{const{id:a}=n;t.openChat({id:a})})),(0,a.Q6)("openChat",(e=>(0,i.x1)(e,void 0))),(0,a.Q6)("setUserSearchQuery",((e,t,n)=>{const{query:a}=n;return(0,i.Lm)(e,{globalUserIds:void 0,localUserIds:void 0,fetchingStatus:Boolean(a),query:a})})),n(3781);var y=n(1947),Z=n(6926);(0,a.Q6)("toggleChatInfo",(e=>({...e,isChatInfoShown:!e.isChatInfoShown}))),(0,a.Q6)("setLeftColumnWidth",((e,t,n)=>({...e,leftColumnWidth:n}))),(0,a.Q6)("resetLeftColumnWidth",(e=>({...e,leftColumnWidth:void 0}))),(0,a.Q6)("toggleManagement",(e=>{const{chatId:t}=(0,r.Bt)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!(e.management.byChatId[t]||{}).isActive}}}}})),(0,a.Q6)("closeManagement",(e=>{const{chatId:t}=(0,r.Bt)(e)||{};if(t)return{...e,management:{byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t],isActive:!1}}}}})),(0,a.Q6)("openChat",(e=>{if(h.wB||h.p7)return{...e,isLeftColumnShown:0===e.messages.messageLists.length}})),(0,a.Q6)("toggleLeftColumn",(e=>({...e,isLeftColumnShown:!e.isLeftColumnShown}))),(0,a.Q6)("addRecentEmoji",((e,t,n)=>{const{emoji:a}=n,{recentEmojis:s}=e;if(!s)return{...e,recentEmojis:[a]};const o=s.filter((e=>e!==a));return o.unshift(a),o.length>18&&o.pop(),{...e,recentEmojis:o}})),(0,a.Q6)("addRecentSticker",((e,t,n)=>{const{sticker:a}=n,{recent:s}=e.stickers;if(!s)return{...e,stickers:{...e.stickers,recent:{hash:"0",stickers:[a]}}};const o=s.stickers.filter((e=>e.id!==a.id));return o.unshift(a),{...e,stickers:{...e.stickers,recent:{...s,stickers:o}}}})),(0,a.Q6)("showNotification",((e,t,n)=>{const a=n;a.localId=(0,Z.Z)({});const s=[...e.notifications],o=s.findIndex((e=>e.message===a.message));return-1!==o&&s.splice(o,1),s.push(a),{...e,notifications:s}})),(0,a.Q6)("dismissNotification",((e,t,n)=>{const a=e.notifications.filter((({localId:e})=>e!==n.localId));return{...e,notifications:a}})),(0,a.Q6)("showDialog",((e,t,n)=>{const{data:a}=n;if("message"in a&&a.hasErrorKey&&!(0,y.ZP)(a))return e;const s=[...e.dialogs];if("message"in a){const e=s.findIndex((e=>e.message===a.message));-1!==e&&s.splice(e,1)}return s.push(a),{...e,dialogs:s}})),(0,a.Q6)("dismissDialog",(e=>{const t=[...e.dialogs];return t.pop(),{...e,dialogs:t}})),(0,a.Q6)("toggleSafeLinkModal",((e,t,n)=>{const{url:a}=n;return{...e,safeLinkModalUrl:a}})),(0,a.Q6)("openHistoryCalendar",((e,t,n)=>{const{selectedAt:a}=n;return{...e,historyCalendarSelectedAt:a}})),(0,a.Q6)("closeHistoryCalendar",(e=>({...e,historyCalendarSelectedAt:void 0}))),(0,a.Q6)("openPaymentModal",((e,t,n)=>{const{chatId:a,messageId:s}=n;return{...e,payment:{...e.payment,chatId:a,messageId:s,isPaymentModalOpen:!0}}})),(0,a.Q6)("closePaymentModal",(e=>{const t=(0,i.bp)(e);return(0,i.WY)(t)})),(0,a.Q6)("addPaymentError",((e,t,n)=>{const{error:a}=n;return{...e,payment:{...e.payment,error:a}}})),n(1689),n(1363),n(6204);var P=n(1226),C=n(9118);const w=new Map,b=(0,C.Ds)((e=>e()),500,!1);async function E(e,t,n,o,c=!1,d=!1){const l=e.id;let u;switch(o){case m.Uq.Backwards:u=void 0;break;case m.Uq.Around:u=-(Math.round(s.hT/2)+1);break;case m.Uq.Forwards:u=-(s.hT+1)}const h=await(0,P.t9)("fetchMessages",{chat:(0,r.Cm)((0,a.Rd)(),l,t),offsetId:n,addOffset:u,limit:s.hT,threadId:t});if(!h)return;const{messages:p,users:f,chats:v,threadInfos:I}=h;let y=(0,a.Rd)();const Z=l===s.aw?y.serviceNotifications.map((({message:e})=>e)):[],C=[].concat(p,Z),w=(0,g.ee)(C,"id"),b=Object.keys(w).map(Number);y=(0,i.c_)(y,l,w),y=c?(0,i.ff)(y,l,t,b):(0,i.xj)(y,l,t,b),y=(0,i.Sh)(y,(0,g.ee)(f,"id")),y=(0,i.fZ)(y,(0,g.ee)(v,"id")),y=(0,i.j6)(y,l,I);let E=(0,r.gb)(y,l,t);const S=(0,r.qC)(y,l,t);if(c&&E&&S&&(S.length&&!(0,g.YE)(E,S)||(y=(0,i.xj)(y,l,t,S),E=(0,r.gb)(y,l,t),y=(0,i.pf)(y,l,t,"outlyingIds",void 0),c=!1)),!d){const e=c?S:E,{newViewportIds:a}=M(e,n,o);y=(0,i.y9)(y,l,t,a)}(0,a.R3)(y)}function M(e,t,n){const{length:a}=e,o=t?function(e,t){return te[e.length-1]?e.length-1:e.findIndex(((n,a)=>n===t||nt))}(e,t):-1,i=n===m.Uq.Backwards?o:o+1||a,r=i-s.hT,c=i+s.hT-1,d=e.slice(Math.max(0,r),c+1);let l,u;switch(n){case m.Uq.Backwards:l=i>0,u=r>=0;break;case m.Uq.Forwards:l=i0,u=d.length===s.hT}return{newViewportIds:d,areSomeLocal:l,areAllLocal:u}}async function S(e){let t;const n=e.attachment?(e,s)=>{w.has(s)||(t=s,w.set(s,n));const o=(0,a.Rd)();(0,a.R3)({...o,fileUploads:{byMessageLocalId:{...o.fileUploads.byMessageLocalId,[s]:{progress:e}}}})}:void 0;(e.replyingTo||h.cj)&&await(0,C.Pn)();const s=(0,a.Rd)();e.serverTimeOffset=s.serverTimeOffset;const o=(0,r.Bt)(s);if(!o)return;const{threadId:i}=o;e.replyingTo||i===u._f||(e.replyingTo=(0,r.qS)(s,e.chat.id,i)),await(0,P.t9)("sendMessage",e,n),n&&t&&w.delete(t)}(0,a.Q6)("loadViewportMessages",((e,t,n)=>{const{direction:a=m.Uq.Around,isBudgetPreload:o=!1}=n||{};let{chatId:c,threadId:d}=n||{};if(!c){const t=(0,r.Bt)(e);if(!t)return;c=t.chatId,d=t.threadId}const l=(0,r.Z1)(e,c);if(!l||l.isRestricted)return;const u=(0,r.Cb)(e,c,d),h=(0,r.gb)(e,c,d),g=(0,r.qC)(e,c,d);if(u&&u.length&&a!==m.Uq.Around){const n=a===m.Uq.Backwards?u[0]:u[u.length-1],s=Boolean(g),r=s?g:h,{newViewportIds:p,areSomeLocal:f,areAllLocal:v}=M(r,n,a);if(f&&(e=(0,i.y9)(e,c,d,p)),async function(e,t,n,a,s,o,i,r){t||await E(s,o,r,i,n,a),a||(await Promise.resolve(),e.loadViewportMessages({chatId:s.id,threadId:o,direction:i,isBudgetPreload:!0}))}(t,v,s,o,l,d,a,n),o)return}else{const t=(0,r.G$)(e,c)||(0,r.rd)(e,c,d),n=Boolean(t&&h&&!h.includes(t)),a=(n?g:h)||[],{newViewportIds:u,areSomeLocal:p,areAllLocal:f}=M(a,t,m.Uq.Around);p&&u.length>=s.hT&&(e=(0,i.y9)(e,c,d,u)),f||E(l,d,t,m.Uq.Around,n,o)}return e})),(0,a.Q6)("loadMessage",((e,t,n)=>{const{chatId:s,messageId:o,replyOriginForId:c,threadUpdate:d}=n,l=(0,r.Z1)(e,s);l&&(async()=>{const e=await async function(e,t,n){const s=await(0,P.t9)("fetchMessage",{chat:e,messageId:t});if(!s)return;if(s===u._Q){if(n){let t=(0,a.Rd)();const s=(0,r.hj)(t,e.id,n);t=(0,i.cY)(t,e.id,n,{...s,replyToMessageId:void 0}),(0,a.R3)(t)}return}let o=(0,a.Rd)();return o=(0,i.cY)(o,e.id,t,s.message),o=(0,i.Sh)(o,(0,g.ee)(s.users,"id")),(0,a.R3)(o),s.message}(l,o,c);if(e&&d){const{lastMessageId:t,isDeleting:n}=d;(0,a.R3)((0,i.lG)((0,a.Rd)(),e,s,t,n))}})()})),(0,a.Q6)("sendMessage",((e,t,n)=>{const a=(0,r.Bt)(e);if(!a)return;const{chatId:o,threadId:i,type:c}=a;if("scheduled"===c&&!n.scheduledAt)return{...e,messages:{...e.messages,contentToBeScheduled:n}};const d=(0,r.Z1)(e,o),l={...n,chat:d,replyingTo:(0,r.Yy)(e,o,i),noWebPage:(0,r.tV)(e,o,i),sendAs:(0,r._5)(e,o)};t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:o,threadId:i,value:!1});const u=!n.attachments||n.attachments.length<=1,m=!u&&n.attachments&&n.attachments.length>1;if(u){const{attachments:e,...t}=l;S({...t,attachment:e?e[0]:void 0})}else if(m){const{text:e,entities:t,attachments:n,...a}=l,o=(0,g.Vl)(n,s.DU);for(let n=0;n0?r:void 0}),i.forEach((e=>{S({...a,attachment:e,groupedId:r})}))}}else{const{text:e,entities:t,attachments:n,replyingTo:a,...s}=l;e&&S({...s,text:e,entities:t,replyingTo:a}),n.forEach((e=>{S({...s,attachment:e})}))}})),(0,a.Q6)("editMessage",((e,t,n)=>{const{serverTimeOffset:a}=e,{text:s,entities:o}=n,i=(0,r.Bt)(e);if(!i)return;const{chatId:c,threadId:d,type:l}=i,u=(0,r.Z1)(e,c),m=(0,r.kK)(e,c,d,l);u&&m&&((0,P.t9)("editMessage",{chat:u,message:m,text:s,entities:o,noWebPage:(0,r.tV)(e,c,d),serverTimeOffset:a}),t.setEditingId({messageId:void 0}))})),(0,a.Q6)("cancelSendingMessage",((e,t,n)=>{const{chatId:a,messageId:s}=n,o=(0,r.hj)(e,a,s),i=o&&w.get(o.previousLocalId||o.id);i&&(0,P.u3)(i),t.apiUpdate({"@type":"deleteMessages",ids:[s],chatId:a})})),(0,a.Q6)("saveDraft",((e,t,n)=>{const{chatId:a,threadId:s,draft:o}=n;if(!o)return;const{text:c,entities:d}=o,l=(0,r.Z1)(e,a);return s===u._f&&(0,P.t9)("saveDraft",{chat:l,text:c,entities:d,replyToMsgId:(0,r.Yy)(e,a,s)}),e=(0,i.pf)(e,a,s,"draft",o),(0,i.a4)(e,a,{draftDate:Math.round(Date.now()/1e3)})})),(0,a.Q6)("clearDraft",((e,t,n)=>{const{chatId:a,threadId:s,localOnly:o}=n;if(!(0,r.Ms)(e,a,s))return;const c=(0,r.Z1)(e,a);return o||s!==u._f||(0,P.t9)("clearDraft",c),e=(0,i.pf)(e,a,s,"draft",void 0),(0,i.a4)(e,a,{draftDate:void 0})})),(0,a.Q6)("toggleMessageWebPage",((e,t,n)=>{const{chatId:a,threadId:s,noWebPage:o}=n;return(0,i.pf)(e,a,s,"noWebPage",o)})),(0,a.Q6)("pinMessage",((e,t,n)=>{const a=(0,r.jr)(e);if(!a)return;const{messageId:s,isUnpin:o,isOneSide:i,isSilent:c}=n;(0,P.t9)("pinMessage",{chat:a,messageId:s,isUnpin:o,isOneSide:i,isSilent:c})})),(0,a.Q6)("unpinAllMessages",((e,t,n)=>{const s=(0,r.Z1)(e,n.chatId);s&&async function(e){await(0,P.t9)("unpinAllMessages",{chat:e});let t=(0,a.Rd)();t=(0,i.pf)(t,e.id,u._f,"pinnedIds",[]),(0,a.R3)(t)}(s)})),(0,a.Q6)("deleteMessages",((e,t,n)=>{const{messageIds:a,shouldDeleteForAll:s}=n,o=(0,r.Bt)(e);if(!o)return;const{chatId:i,threadId:c}=o,d=(0,r.Z1)(e,i);(0,P.t9)("deleteMessages",{chat:d,messageIds:a,shouldDeleteForAll:s});const l=(0,r._$)(e,i,c);a.includes(l)&&t.setEditingId({messageId:void 0})})),(0,a.Q6)("deleteScheduledMessages",((e,t,n)=>{const{messageIds:a}=n,s=(0,r.Bt)(e);if(!s)return;const{chatId:o}=s,i=(0,r.Z1)(e,o);(0,P.t9)("deleteScheduledMessages",{chat:i,messageIds:a});const c=(0,r.wU)(e,o);a.includes(c)&&t.setEditingId({messageId:void 0})})),(0,a.Q6)("deleteHistory",((e,t,n)=>{(async()=>{var a;const{chatId:s,shouldDeleteForAll:o}=n,i=(0,r.Z1)(e,s);if(!i)return;const c=null===(a=i.lastMessage)||void 0===a?void 0:a.id;await(0,P.t9)("deleteHistory",{chat:i,shouldDeleteForAll:o,maxId:c});const d=(0,r.Bt)(e);d&&d.chatId===s&&t.openChat({id:void 0})})()})),(0,a.Q6)("reportMessages",((e,t,n)=>{(async()=>{const{messageIds:a,reason:s,description:o}=n,i=(0,r.Bt)(e);if(!i)return;const{chatId:c}=i,d=(0,r.Z1)(e,c),l=await(0,P.t9)("reportMessages",{peer:d,messageIds:a,reason:s,description:o});t.showNotification({message:l?"Thank you! Your report will be reviewed by our team.":"Error occured while submiting report. Please, try again later."})})()})),(0,a.Q6)("sendMessageAction",((e,t,n)=>{(async()=>{const{action:t,chatId:a,threadId:s}=n;if(a===e.currentUserId)return;const o=(0,r.Z1)(e,a);o&&await(0,P.t9)("sendMessageAction",{peer:o,threadId:s,action:t})})()})),(0,a.Q6)("markMessageListRead",((e,t,n)=>{const{serverTimeOffset:a}=e,o=(0,r.Bt)(e);if(!o)return;const{chatId:c,threadId:d}=o,l=(0,r.Cm)(e,c,d);if(!l)return;const{maxId:m}=n;if(b((()=>{(0,P.t9)("markMessageListRead",{serverTimeOffset:a,chat:l,threadId:d,maxId:m})})),d!==u._f)return;c===s.aw&&(e={...e,serviceNotifications:e.serviceNotifications.map((e=>e.isUnread&&e.id<=m?{...e,isUnread:!1}:e))});const h=(0,r.Cb)(e,c,d),g=(0,r.It)(e,c,d);if(!h||!g||!l.unreadCount)return e;const p=function(e,t,n){let a=0;for(let s=0,o=e.length;s=t&&e[s]<=n&&a++,!(e[s]>=n));s++);return a}(h,g,m);return p?(0,i.a4)(e,c,{lastReadInboxMessageId:m,unreadCount:Math.max(0,l.unreadCount-p)}):e})),(0,a.Q6)("markMessagesRead",((e,t,n)=>{const a=(0,r.jr)(e);if(!a)return;const{messageIds:s}=n;(0,P.t9)("markMessagesRead",{chat:a,messageIds:s})})),(0,a.Q6)("loadWebPagePreview",((e,t,n)=>{const{text:s}=n;!async function(e){const t=await(0,P.t9)("fetchWebPagePreview",{message:e});(0,a.R3)({...(0,a.Rd)(),webPagePreview:t})}(s)})),(0,a.Q6)("clearWebPagePreview",(e=>{if(e.webPagePreview)return{...e,webPagePreview:void 0}})),(0,a.Q6)("sendPollVote",((e,t,n)=>{const{chatId:a,messageId:s,options:o}=n,i=(0,r.Z1)(e,a);i&&(0,P.t9)("sendPollVote",{chat:i,messageId:s,options:o})})),(0,a.Q6)("loadPollOptionResults",((e,t,n)=>{const{chat:s,messageId:o,option:r,offset:c,limit:d,shouldResetVoters:l}=n;!async function(e,t,n,s,o,r){const c=await(0,P.t9)("loadPollOptionResults",{chat:e,messageId:t,option:n,offset:s,limit:o});if(!c)return;let d=(0,a.Rd)();d=(0,i.Sh)(d,(0,g.ee)(c.users,"id"));const{voters:l}=d.pollResults;(0,a.R3)({...d,pollResults:{...d.pollResults,voters:{...l,[n]:(0,g.Tw)([...!r&&l&&l[n]?l[n]:[],...c&&c.users.map((e=>e.id))])},offsets:{...d.pollResults.offsets?d.pollResults.offsets:{},[n]:c.nextOffset||""}}})}(s,o,r,c,d,l)})),(0,a.Q6)("forwardMessages",((e,t,n)=>{const{fromChatId:s,messageIds:o,toChatId:i}=e.forwardMessages,c=s?(0,r.Z1)(e,s):void 0,l=i?(0,r.Z1)(e,i):void 0,u=s&&o?o.sort(((e,t)=>e-t)).map((t=>(0,r.hj)(e,s,t))).filter(Boolean):void 0;if(!c||!l||!u)return;const{isSilent:m,scheduledAt:h}=n,g=(0,r._5)(e,i),p=u.filter((e=>!(0,d.jM)(e)));p.length&&(0,P.t9)("forwardMessages",{fromChat:c,toChat:l,messages:p,serverTimeOffset:(0,a.Rd)().serverTimeOffset,isSilent:m,scheduledAt:h,sendAs:g}),u.filter((e=>(0,d.jM)(e))).forEach((e=>{const{text:t,entities:n}=e.content.text||{},{sticker:a,poll:s}=e.content;S({chat:l,text:t,entities:n,sticker:a,poll:s,isSilent:m,scheduledAt:h,sendAs:g})})),(0,a.R3)({...(0,a.Rd)(),forwardMessages:{}})})),(0,a.Q6)("loadScheduledHistory",((e,t,n)=>{const{chatId:s}=n,o=(0,r.Z1)(e,s);o&&async function(e){const t=await(0,P.t9)("fetchScheduledHistory",{chat:e});if(!t)return;const{messages:n}=t,s=(0,g.ee)(n,"id"),o=Object.keys(s).map(Number).sort(((e,t)=>t-e));let r=(0,a.Rd)();r=(0,i.w3)(r,e.id,s),r=(0,i.pf)(r,e.id,u._f,"scheduledIds",o),(0,a.R3)(r)}(o)})),(0,a.Q6)("sendScheduledMessages",((e,t,n)=>{const{chatId:a,id:s}=n,o=(0,r.Z1)(e,a);o&&(0,P.t9)("sendScheduledMessages",{chat:o,ids:[s]})})),(0,a.Q6)("rescheduleMessage",((e,t,n)=>{const{chatId:a,messageId:s,scheduledAt:o}=n,i=(0,r.Z1)(e,a),c=i&&(0,r.Tm)(e,i.id,s);i&&c&&(0,P.t9)("rescheduleMessage",{chat:i,message:c,scheduledAt:o})})),(0,a.Q6)("requestThreadInfoUpdate",((e,t,n)=>{const{chatId:a,threadId:s}=n,o=(0,r.Cm)(e,a,s);o&&(0,P.t9)("requestThreadInfoUpdate",{chat:o,threadId:s})})),(0,a.Q6)("loadPinnedMessages",((e,t,n)=>{const{chatId:s}=n,o=(0,r.Z1)(e,s);o&&async function(e){const t=await(0,P.t9)("fetchPinnedMessages",{chat:e});if(!t)return;const{messages:n,chats:s,users:o}=t,r=(0,g.ee)(n,"id"),c=Object.keys(r).map(Number).sort(((e,t)=>t-e));let d=(0,a.Rd)();d=(0,i.c_)(d,e.id,r),d=(0,i.pf)(d,e.id,u._f,"pinnedIds",c),d=(0,i.Sh)(d,(0,g.ee)(o,"id")),d=(0,i.fZ)(d,(0,g.ee)(s,"id")),(0,a.R3)(d)}(o)})),(0,a.Q6)("loadSeenBy",((e,t,n)=>{const{chatId:s,messageId:o}=n,c=(0,r.Z1)(e,s);c&&(async()=>{const e=await(0,P.t9)("fetchSeenBy",{chat:c,messageId:o});e&&(0,a.R3)((0,i.cY)((0,a.Rd)(),s,o,{seenByUserIds:e}))})()})),(0,a.Q6)("saveDefaultSendAs",((e,t,n)=>{const{chatId:a,sendAsId:s}=n,o=(0,r.Z1)(e,a),c=(0,r.Z1)(e,s)||(0,r.dy)(e,s);if(o&&c)return(0,P.t9)("saveDefaultSendAs",{sendAs:c,chat:o}),(0,i.a4)(e,a,{fullInfo:{...o.fullInfo,sendAsId:s}})})),(0,a.Q6)("loadSendAs",((e,t,n)=>{const{chatId:s}=n,o=(0,r.Z1)(e,s);o&&(async()=>{const t=await(0,P.t9)("fetchSendAs",{chat:o});if(!t)return e=(0,i.a4)(e,s,{sendAsIds:[]}),void(0,a.R3)(e);e=(0,a.Rd)(),e=(0,i.Sh)(e,(0,g.ee)(t.users,"id")),e=(0,i.fZ)(e,(0,g.ee)(t.chats,"id")),e=(0,i.a4)(e,s,{sendAsIds:t.ids}),(0,a.R3)(e)})()})),(0,a.Q6)("loadSponsoredMessages",((e,t,n)=>{const{chatId:s}=n,o=(0,r.Z1)(e,s);o&&(async()=>{const e=await(0,P.t9)("fetchSponsoredMessages",{chat:o});if(!e)return;let t=(0,i.Fn)((0,a.Rd)(),s,e.messages[0]);t=(0,i.Sh)(t,(0,g.ee)(e.users,"id")),t=(0,i.fZ)(t,(0,g.ee)(e.chats,"id")),(0,a.R3)(t)})()})),(0,a.Q6)("viewSponsoredMessage",((e,t,n)=>{const{chatId:a}=n,s=(0,r.Z1)(e,a),o=(0,r.fS)(e,a);s&&o&&(0,P.t9)("viewSponsoredMessage",{chat:s,random:o.randomId})}));var R=n(5765);const k=(0,C.P2)((e=>e()),500,!1);async function T(e,t){const n=await(0,P.t9)("searchGifs",{query:e,offset:t});n&&(0,a.R3)((0,i.rq)((0,a.Rd)(),!t,n.gifs,n.nextOffset))}(0,a.Q6)("loadStickerSets",(e=>{const{hash:t}=e.stickers.added||{};!async function(e){const t=await(0,P.t9)("fetchStickerSets",{hash:e});t&&(0,a.R3)((0,i.z3)((0,a.Rd)(),"added",t.hash,t.sets))}(t)})),(0,a.Q6)("loadAddedStickers",((e,t)=>{const{setIds:n}=e.stickers.added;n&&n.length&&(async()=>{for(let e=0;e0&&await(0,C.wO)(200)})()})),(0,a.Q6)("loadRecentStickers",(e=>{const{hash:t}=e.stickers.recent||{};!async function(e){const t=await(0,P.t9)("fetchRecentStickers",{hash:e});if(!t)return;const n=(0,a.Rd)();(0,a.R3)({...n,stickers:{...n.stickers,recent:t}})}(t)})),(0,a.Q6)("loadFavoriteStickers",(e=>{const{hash:t}=e.stickers.favorite||{};!async function(e){const t=await(0,P.t9)("fetchFavoriteStickers",{hash:e});if(!t)return;const n=(0,a.Rd)();(0,a.R3)({...n,stickers:{...n.stickers,favorite:t}})}(t)})),(0,a.Q6)("loadGreetingStickers",(e=>{const{hash:t}=e.stickers.greeting||{};(async()=>{const e=await(0,P.t9)("fetchStickersForEmoji",{emoji:"👋⭐️",hash:t});if(!e)return;const n=(0,a.Rd)();(0,a.R3)({...n,stickers:{...n.stickers,greeting:{hash:e.hash,stickers:e.stickers.filter((e=>"👋"===e.emoji))}}})})()})),(0,a.Q6)("loadFeaturedStickers",(e=>{const{hash:t}=e.stickers.featured||{};!async function(e){const t=await(0,P.t9)("fetchFeaturedStickers",{hash:e});t&&(0,a.R3)((0,i.z3)((0,a.Rd)(),"featured",t.hash,t.sets))}(t)})),(0,a.Q6)("loadStickers",((e,t,n)=>{const{stickerSetId:s,stickerSetShortName:o}=n;let{stickerSetAccessHash:c}=n;if(!c&&!o){const t=(0,r.Ny)(e,s);if(!t)return;c=t.accessHash}!async function(e,t,n){const s=await(0,P.t9)("fetchStickers",{stickerSetShortName:n,stickerSetId:e,accessHash:t});if(!s)return;const{set:o,stickers:r,packs:c}=s;let d=(0,a.Rd)();d=(0,i.Rg)(d,o.id,{...o,stickers:r,packs:c});const l=d.stickers.forEmoji.emoji;l&&c[l]&&(d=(0,i.vy)(d)),(0,a.R3)(d)}(s,c,o)})),(0,a.Q6)("loadAnimatedEmojis",(()=>{!async function(){const e=await(0,P.t9)("fetchAnimatedEmojis");if(!e)return;const{set:t,stickers:n}=e;(0,a.R3)((0,i.g_)((0,a.Rd)(),{...t,stickers:n}))}(),async function(){const e=await(0,P.t9)("fetchAnimatedEmojiEffects");if(!e)return;const{set:t,stickers:n}=e;(0,a.R3)({...(0,a.Rd)(),animatedEmojiEffects:{...t,stickers:n}})}()})),(0,a.Q6)("loadSavedGifs",(e=>{const{hash:t}=e.gifs.saved;!async function(e){const t=await(0,P.t9)("fetchSavedGifs",{hash:e});if(!t)return;const n=(0,a.Rd)();(0,a.R3)({...n,gifs:{...n.gifs,saved:t}})}(t)})),(0,a.Q6)("faveSticker",((e,t,n)=>{const{sticker:a}=n;a&&(0,P.t9)("faveSticker",{sticker:a})})),(0,a.Q6)("unfaveSticker",((e,t,n)=>{const{sticker:s}=n;s&&function(e){const t=(0,a.Rd)();(0,a.R3)({...t,stickers:{...t.stickers,favorite:{...t.stickers.favorite,stickers:t.stickers.favorite.stickers.filter((({id:t})=>t!==e.id))}}}),(0,P.t9)("faveSticker",{sticker:e,unfave:!0})}(s)})),(0,a.Q6)("toggleStickerSet",((e,t,n)=>{const{stickerSetId:a}=n,s=(0,r.Ny)(e,a);if(!s)return;const{accessHash:o,installedDate:i}=s;(0,P.t9)(i?"uninstallStickerSet":"installStickerSet",{stickerSetId:a,accessHash:o})})),(0,a.Q6)("loadEmojiKeywords",((e,t,n)=>{var s;const{language:o}=n;let i=e.emojiKeywords[o];null!==(s=i)&&void 0!==s&&s.isLoading||((0,a.R3)({...e,emojiKeywords:{...e.emojiKeywords,[o]:{...i,isLoading:!0}}}),(async()=>{var t;const n=await(0,P.t9)("fetchEmojiKeywords",{language:o,fromVersion:i?i.version:0});e=(0,a.Rd)(),i=e.emojiKeywords[o],n?(0,a.R3)({...e,emojiKeywords:{...e.emojiKeywords,[o]:{isLoading:!1,version:n.version,keywords:{...null===(t=i)||void 0===t?void 0:t.keywords,...n.keywords}}}}):(0,a.R3)({...e,emojiKeywords:{...e.emojiKeywords,[o]:{...i,isLoading:!1}}})})())})),(0,a.Q6)("setStickerSearchQuery",((e,t,n)=>{const{query:s}=n;s&&k((()=>{!async function(e,t){const n=await(0,P.t9)("searchStickers",{query:e,hash:void 0});if(!n)return;const s=(0,a.Rd)(),{setsById:o,added:r}=s.stickers,c=n.sets.map((({id:e})=>e));r.setIds&&r.setIds.forEach((t=>{if(!c.includes(t)){const{title:n}=o[t]||{};n&&(0,R.Z)(n,e)&&c.unshift(t)}})),(0,a.R3)((0,i.z3)(s,"search",n.hash,n.sets,c))}(s)}))})),(0,a.Q6)("setGifSearchQuery",((e,t,n)=>{const{query:a}=n;"string"==typeof a&&k((()=>{T(a)}))})),(0,a.Q6)("searchMoreGifs",(e=>{const{query:t,offset:n}=e.gifs.search;"string"==typeof t&&k((()=>{T(t,n)}))})),(0,a.Q6)("loadStickersForEmoji",((e,t,n)=>{const{emoji:s}=n,{hash:o}=e.stickers.forEmoji;k((()=>{!async function(e,t){let n=(0,a.Rd)();(0,a.R3)({...n,stickers:{...n.stickers,forEmoji:{...n.stickers.forEmoji,emoji:e}}});const s=await(0,P.t9)("fetchStickersForEmoji",{emoji:e,hash:t});n=(0,a.Rd)(),s&&n.stickers.forEmoji.emoji===e&&(n=(0,i.IM)(n,e,s.stickers,s.hash),(0,a.R3)(n))}(s,o)}))})),(0,a.Q6)("clearStickersForEmoji",(e=>({...e,stickers:{...e.stickers,forEmoji:{}}}))),(0,a.Q6)("openStickerSetShortName",((e,t,n)=>{const{stickerSetShortName:a}=n;return{...e,openedStickerSetShortName:a}}));var N=n(790);const B=(0,C.P2)((e=>e()),500,!1);async function A(e="",t,n,o,c,d){let l;if(o){const a=await(0,P.t9)("searchMessagesLocal",{chatOrUser:o,query:e,type:t,limit:s.Hk,offsetId:n,minDate:d,maxDate:c});if(a){const{messages:e,users:t,totalCount:n,nextOffsetId:s}=a;l={messages:e,users:t,chats:[],totalCount:n,nextRate:s}}}else l=await(0,P.t9)("searchMessagesGlobal",{query:e,offsetRate:n,limit:s.Hk,type:t,maxDate:c,minDate:d});let u=(0,a.Rd)();const m=(0,r.JX)(u);if(!l||""!==e&&e!==m)return void(0,a.R3)((0,i.xv)(u,{messages:!1}));const{messages:h,users:p,chats:f,totalCount:v,nextRate:I}=l;f.length&&(u=(0,i.fZ)(u,(0,g.ee)(f,"id"))),p.length&&(u=(0,i.Sh)(u,(0,g.ee)(p,"id"))),h.length&&(u=(0,i.m6)(u,h)),u=(0,i.px)(u,h,v,t,I),(0,a.R3)(u)}(0,a.Q6)("setGlobalSearchQuery",((e,t,n)=>{const{chatId:s}=e.globalSearch,{query:o}=n;o&&!s&&B((()=>{!async function(e){const t=await(0,P.t9)("searchChats",{query:e});let n=(0,a.Rd)();const s=(0,r.JX)(n);if(!t||!s||e!==s)return void(0,a.R3)((0,i.xv)(n,{chats:!1}));const{localChats:o,localUsers:c,globalChats:d,globalUsers:l}=t;(o.length||d.length)&&(n=(0,i.fZ)(n,(0,g.ee)([...o,...d],"id"))),(c.length||l.length)&&(n=(0,i.Sh)(n,(0,g.ee)([...c,...l],"id"))),n=(0,i.xv)(n,{chats:!1}),n=(0,i.No)(n,{localResults:{chatIds:o.map((({id:e})=>e)),userIds:c.map((({id:e})=>e))},globalResults:{...n.globalSearch.globalResults,chatIds:d.map((({id:e})=>e)),userIds:l.map((({id:e})=>e))}}),(0,a.R3)(n)}(o)}))})),(0,a.Q6)("setGlobalSearchDate",((e,t,n)=>{const{date:s}=n,o=s?(0,N.IS)(s):s,c=(0,i.No)(e,{date:s,query:"",resultsByType:{...e.globalSearch.resultsByType,text:{totalCount:void 0,foundIds:[],nextOffsetId:0}}});(0,a.R3)(c);const{chatId:d}=e.globalSearch;A("","text",void 0,d?(0,r.Z1)(e,d):void 0,o,s)})),(0,a.Q6)("searchMessagesGlobal",((e,t,n)=>{var a;const{query:s,resultsByType:o,chatId:i,date:c}=e.globalSearch,d=c?(0,N.IS)(c):c,{type:l}=n;A(s,l,null==o||null===(a=o[l])||void 0===a?void 0:a.nextOffsetId,i?(0,r.Z1)(e,i):void 0,d,c)})),(0,a.Q6)("searchTextMessagesLocal",(e=>{const{chatId:t,threadId:n}=(0,r.Bt)(e)||{},o=t?(0,r.Z1)(e,t):void 0,c=(0,r.n5)(e);if(!o||!c||!n)return;const{query:d,results:l}=c,m=null==l?void 0:l.nextOffsetId;let h;if(n!==u._f){const a=(0,r.tZ)(e,t,n);h=null==a?void 0:a.topMessageId}!async function(e,t,n,o,c){const d=await(0,P.t9)("searchMessagesLocal",{chatOrUser:e,type:"text",query:o,topMessageId:n,limit:s.pn,offsetId:c});if(!d)return;const{messages:l,users:u,totalCount:m,nextOffsetId:h}=d,p=(0,g.ee)(l,"id"),f=Object.keys(p).map(Number);let v=(0,a.Rd)();const I=(0,r.n5)(v);!I||o&&o!==I.query||(v=(0,i.c_)(v,e.id,p),v=(0,i.Sh)(v,(0,g.ee)(u,"id")),v=(0,i.dx)(v,e.id,t,f,m,h),(0,a.R3)(v))}(o,n,h,d,m)})),(0,a.Q6)("searchMediaMessagesLocal",(e=>{const t=(0,r.og)(e),n=t?e.users.byId[t]||e.chats.byId[t]:void 0,o=(0,r.we)(e);if(!n||!o)return;const{currentType:c,resultsByType:d}=o,l=c&&d&&d[c],u=null==l?void 0:l.nextOffsetId;c&&async function(e,t,n){const o=await(0,P.t9)("searchMessagesLocal",{chatOrUser:e,type:t,limit:s.EN,offsetId:n});if(!o)return;const{messages:c,users:d,totalCount:l,nextOffsetId:u}=o,m=(0,g.ee)(c,"id"),h=Object.keys(m).map(Number);let p=(0,a.Rd)();(0,r.we)(p)&&(p=(0,i.c_)(p,e.id,m),p=(0,i.Sh)(p,(0,g.ee)(d,"id")),p=(0,i.c1)(p,e.id,t,h,l,u),(0,a.R3)(p))}(n,c,u)})),(0,a.Q6)("searchMessagesByDate",((e,t,n)=>{const{timestamp:s}=n,{chatId:o}=(0,r.Bt)(e)||{};if(!o)return;const i=(0,r.Z1)(e,o);i&&async function(e,t){const n=await(0,P.t9)("findFirstMessageIdAfterDate",{chat:e,timestamp:t});n&&(0,a.uC)().focusMessage({chatId:e.id,messageId:n})}(i,s)})),(0,a.Q6)("checkPublicLink",((e,t,n)=>{const{chatId:s}=(0,r.Bt)(e)||{};if(!s)return;if(e.management.progress===m.wv.InProgress)return;const{username:o}=n;(async()=>{e=(0,i.H9)(e,m.wv.InProgress),e=(0,i.fw)(e,s,{isUsernameAvailable:void 0}),(0,a.R3)(e);const t=await(0,P.t9)("checkChatUsername",{username:o});e=(0,a.Rd)(),e=(0,i.H9)(e,t?m.wv.Complete:m.wv.Error),e=(0,i.fw)(e,s,{isUsernameAvailable:t}),(0,a.R3)(e)})()})),(0,a.Q6)("updatePublicLink",((e,t,n)=>{const{chatId:s}=(0,r.Bt)(e)||{};let o=s&&(0,r.Z1)(e,s);if(!s||!o)return;const{username:c}=n;(async()=>{if(e=(0,i.H9)(e,m.wv.InProgress),(0,a.R3)(e),(0,d.G9)(o)){if(o=await(0,P.t9)("migrateChat",o),!o)return;t.openChat({id:o.id})}const n=await(0,P.t9)("setChatUsername",{chat:o,username:c});e=(0,a.Rd)(),e=(0,i.H9)(e,n?m.wv.Complete:m.wv.Error),e=(0,i.fw)(e,s,{isUsernameAvailable:void 0}),(0,a.R3)(e)})()})),(0,a.Q6)("updatePrivateLink",(e=>{const{chatId:t}=(0,r.Bt)(e)||{},n=t&&(0,r.Z1)(e,t);t&&n&&(0,P.t9)("updatePrivateLink",{chat:n})})),(0,a.Q6)("setEditingExportedInvite",((e,t,n)=>{const{chatId:s,invite:o}=n;(0,a.R3)((0,i.fw)(e,s,{editingInvite:o}))}));var x=n(7358);async function L(){const e=await(0,P.t9)("fetchChats",{limit:s.Ov,archived:!0,withPinned:!0,serverTimeOffset:(0,a.Rd)().serverTimeOffset});if(!e)return;let t=(0,a.Rd)();t=(0,i.eD)(t,(0,g.ee)(e.users,"id")),t=(0,i.zn)(t,e.userStatusesById),t=(0,i.GL)(t,(0,g.ee)(e.chats,"id")),t=(0,i.Mg)(t,"archived",e.chatIds),t=(0,i.vv)(t,"archived",e),(0,a.R3)(t)}async function O(){let e=(0,a.Rd)();const{recentlyFoundChatIds:t}=e.globalSearch,{userIds:n}=e.contactList||{};if(!(n&&n.length||t&&t.length))return;const s=[...t||[],...n||[]].map((t=>(0,r.dy)(e,t))).filter(Boolean),o=await(0,P.t9)("fetchUsers",{users:s});if(!o)return;const{users:c,userStatusesById:d}=o;e=(0,a.Rd)(),e=(0,i.eD)(e,(0,g.ee)(c,"id")),e=(0,i.zn)(e,d),(0,a.R3)(e)}function U(e){return(0,P.t9)("fetchMessages",{chat:e,threadId:u._f,offsetId:e.lastReadInboxMessageId,addOffset:-(Math.round(s.hT/2)+1),limit:s.hT})}(0,a.Q6)("sync",((e,t)=>{!async function(e){s.eM&&console.log(">>> START SYNC"),await(0,P.t9)("fetchCurrentUser");const t=await async function(){var e;let t=(0,a.Rd)();const n=await(0,P.t9)("fetchChats",{limit:s.Ov,withPinned:!0,serverTimeOffset:t.serverTimeOffset,lastLocalServiceMessage:null===(e=(0,r.VF)(t))||void 0===e?void 0:e.message});if(!n)return;t=(0,a.Rd)();const{recentlyFoundChatIds:o}=t.globalSearch,{userIds:c}=t.contactList||{},{currentUserId:l}=t,m=[...o||[],...c||[],...l?[l]:[]],h=m.map((e=>(0,r.dy)(t,e))).filter(Boolean),p=m.map((e=>(0,r.Z1)(t,e))).filter(Boolean),{chatId:f}=(0,r.Bt)(t)||{};if(f){const e=(0,r.Z1)(t,f);if(e&&!m.includes(f)&&p.push(e),(0,d.YC)(f)){const e=(0,r.dy)(t,f);e&&!m.includes(f)&&h.push(e)}}return h.push(...n.users),p.push(...n.chats),t=(0,i.ps)(t,n.userStatusesById),t=(0,i.SL)(t,(0,g.ee)(p,"id")),t=(0,i.Mg)(t,"active",n.chatIds),t=(0,i.vv)(t,"active",n),Object.keys(n.draftsById).forEach((e=>{t=(0,i.pf)(t,e,u._f,"draft",n.draftsById[e])})),Object.keys(n.replyingToById).forEach((e=>{t=(0,i.pf)(t,e,u._f,"replyingToId",n.replyingToById[e])})),(0,a.R3)(t),f&&!t.chats.byId[f]&&(0,a.uC)().openChat({id:void 0}),h}();await async function(e){let t=!1,n=e||[],o=(0,a.Rd)();const{chatId:c,threadId:d}=(0,r.Bt)(o)||{},l=Object.keys(o.messages.byChatId).reduce(((e,t)=>{const n=(0,r.Ms)(o,t,u._f);return n&&(e[t]=n),e}),{});if(c){const e=await U(o.chats.byId[c]);o=(0,a.Rd)();const{chatId:l}=(0,r.Bt)(o)||{},m=d&&(0,r.tZ)(o,c,d);if(e&&l===c){const a=o.messages.byChatId[c],r=c===s.aw?o.serviceNotifications.map((({message:e})=>e)):[],l=[].concat(e.messages,r),h=(0,g.ee)(l,"id"),p=Object.keys(h).map(Number);if(o={...o,messages:{...o.messages,byChatId:{}}},o=(0,i.c_)(o,c,h),o=(0,i.xj)(o,c,u._f,p),o=(0,i.y9)(o,c,u._f,p),d&&m&&m.originChannelId){const{originChannelId:e}=m,t=o.messages.byChatId[e],n=await U(o.chats.byId[e]);if(n){const e=(0,g.ee)(n.messages,"id"),s=Object.keys(e).map(Number);o={...o,messages:{...o.messages,byChatId:{...o.messages.byChatId,[m.originChannelId]:{byId:e,threadsById:{[u._f]:{...null==t?void 0:t.threadsById[u._f],listedIds:s,viewportIds:s,outlyingIds:void 0}}},[c]:{...o.messages.byChatId[c],threadsById:{...o.messages.byChatId[c].threadsById,[d]:{...null==a?void 0:a.threadsById[d],outlyingIds:void 0}}}}}}}}o=(0,i.GL)(o,(0,g.ee)(e.chats,"id")),o=(0,i.j6)(o,c,e.threadInfos),t=!0,n=Array.prototype.concat(n,e.users)}}t||(o={...o,messages:{...o.messages,byChatId:{}}}),Object.keys(l).forEach((e=>{o=(0,i.pf)(o,e,u._f,"draft",l[e])})),e?o=(0,i.s5)(o,(0,g.ee)(n,"id")):n&&(o=(0,i.eD)(o,(0,g.ee)(n,"id"))),(0,a.R3)(o);const{chatId:m,messageId:h}=o.audioPlayer;m&&h&&!(0,r.hj)(o,m,h)&&(0,a.uC)().closeAudioPlayer()}(t),(0,a.R3)({...(0,a.Rd)(),lastSyncTime:Date.now()}),s.eM&&console.log(">>> FINISH SYNC"),e()}(t.afterSync)})),(0,a.Q6)("afterSync",(()=>{!async function(){s.eM&&console.log(">>> START AFTER-SYNC"),await Promise.all([O(),L()]),await(0,P.t9)("fetchCurrentUser"),(0,x.w)((0,r.A1)((0,a.Rd)())),s.eM&&console.log(">>> FINISH AFTER-SYNC")}()}));const F=(0,C.Ds)((e=>e()),500,!1,!0),$=(0,C.P2)((e=>e()),500,!1);function D(e,t,n){return{...e,inlineBots:{...e.inlineBots,byUsername:{...e.inlineBots.byUsername,[t]:n}}}}function j(e,t){return{...e,inlineBots:{...e.inlineBots,isLoading:t}}}(0,a.Q6)("loadFullUser",((e,t,n)=>{const{userId:a}=n,s=(0,r.dy)(e,a);if(!s)return;const{id:o,accessHash:i}=s;F((()=>(0,P.t9)("fetchFullUser",{id:o,accessHash:i})))})),(0,a.Q6)("loadUser",((e,t,n)=>{const{userId:s}=n,o=(0,r.dy)(e,s);o&&(async()=>{const t=await(0,P.t9)("fetchUsers",{users:[o]});if(!t)return;const{users:n,userStatusesById:s}=t;e=(0,a.Rd)(),e=(0,i.eD)(e,(0,g.ee)(n,"id")),(0,a.R3)((0,i.ps)(e,{...e.users.statusesById,...s})),(0,a.R3)(e)})()})),(0,a.Q6)("loadTopUsers",(e=>{const{topPeers:{lastRequestedAt:t}}=e;(!t||(0,p.b)(e.serverTimeOffset)-t>60)&&async function(){const e=await(0,P.t9)("fetchTopUsers");if(!e)return;const{ids:t,users:n}=e;let s=(0,a.Rd)();s=(0,i.Sh)(s,(0,g.ee)(n,"id")),s={...s,topPeers:{...s.topPeers,userIds:t,lastRequestedAt:(0,p.b)(s.serverTimeOffset)}},(0,a.R3)(s)}()})),(0,a.Q6)("loadContactList",(()=>{!async function(){const e=await(0,P.t9)("fetchContactList");if(!e)return;let t=(0,i.Sh)((0,a.Rd)(),(0,g.ee)(e.users,"id"));t=(0,i.fZ)(t,(0,g.ee)(e.chats,"id"));const n=e=>e.lastName||e.firstName||"",s=new Intl.Collator("en-US"),o=e.users.sort(((e,t)=>s.compare(n(e),n(t)))).filter((e=>!e.isSelf));(0,a.R3)({...t,contactList:{userIds:o.map((e=>e.id))}})}()})),(0,a.Q6)("loadCurrentUser",(()=>{(0,P.t9)("fetchCurrentUser")})),(0,a.Q6)("loadCommonChats",(e=>{var t;const{chatId:n}=(0,r.Bt)(e)||{},s=n?(0,r.dy)(e,n):void 0;!s||(0,d.cS)(s)||null!==(t=s.commonChats)&&void 0!==t&&t.isFullyLoaded||(async()=>{var t,n;const o=null===(t=s.commonChats)||void 0===t?void 0:t.maxId,r=await(0,P.t9)("fetchCommonChats",s.id,s.accessHash,o);if(!r)return;const{chats:c,chatIds:d,isFullyLoaded:l}=r;e=(0,a.Rd)(),c.length&&(e=(0,i.fZ)(e,(0,g.ee)(c,"id"))),e=(0,i.Nq)(e,s.id,{commonChats:{maxId:d.length?d[d.length-1]:"0",ids:(0,g.Tw)(((null===(n=s.commonChats)||void 0===n?void 0:n.ids)||[]).concat(d)),isFullyLoaded:l}}),(0,a.R3)(e)})()})),(0,a.Q6)("updateContact",((e,t,n)=>{const{userId:s,isMuted:o,firstName:c,lastName:d}=n;!async function(e,t,n,s){const o=(0,a.Rd)(),c=(0,r.dy)(o,e);if(!c)return;let d;if((0,a.uC)().updateChatMutedState({chatId:e,isMuted:t}),(0,a.R3)((0,i.H9)((0,a.Rd)(),m.wv.InProgress)),c.phoneNumber)d=await(0,P.t9)("updateContact",{phone:c.phoneNumber,firstName:n,lastName:s});else{const{id:e,accessHash:t}=c;d=await(0,P.t9)("addContact",{id:e,accessHash:t,phoneNumber:"",firstName:n,lastName:s})}d&&(0,a.R3)((0,i.Nq)((0,a.Rd)(),c.id,{firstName:n,lastName:s})),(0,a.R3)((0,i.H9)((0,a.Rd)(),m.wv.Complete))}(s,o,c,d)})),(0,a.Q6)("deleteContact",((e,t,n)=>{const{userId:s}=n;!async function(e){const t=(0,a.Rd)(),n=(0,r.dy)(t,e);if(!n)return;const{id:s,accessHash:o}=n;await(0,P.t9)("deleteContact",{id:s,accessHash:o})}(s)})),(0,a.Q6)("loadProfilePhotos",((e,t,n)=>{const{profileId:s}=n,o=(0,d.YC)(s),c=o?(0,r.dy)(e,s):void 0,l=o?void 0:(0,r.Z1)(e,s);(c||l)&&(async()=>{const e=await(0,P.t9)("fetchProfilePhotos",c,l);if(!e||!e.photos)return;let t=(0,a.Rd)();o?t=(0,i.Nq)(t,s,{photos:e.photos}):(t=(0,i.Sh)(t,(0,g.ee)(e.users,"id")),t=(0,i.a4)(t,s,{photos:e.photos})),(0,a.R3)(t)})()})),(0,a.Q6)("setUserSearchQuery",((e,t,n)=>{const{query:s}=n;s&&$((()=>{!async function(e){const t=await(0,P.t9)("searchChats",{query:e});let n=(0,a.Rd)();const s=n.userSearch.query;if(!t||!s||e!==s)return void(0,a.R3)((0,i.Q3)(n,!1));const{localUsers:o,globalUsers:r}=t;let c,d;o.length&&(n=(0,i.Sh)(n,(0,g.ee)(o,"id")),c=o.map((({id:e})=>e))),r.length&&(n=(0,i.Sh)(n,(0,g.ee)(r,"id")),d=r.map((({id:e})=>e))),n=(0,i.Q3)(n,!1),n=(0,i.Lm)(n,{localUserIds:c,globalUserIds:d}),(0,a.R3)(n)}(s)}))})),(0,a.Q6)("addContact",((e,t,n)=>{const{userId:a}=n,s=(0,r.dy)(e,a);s&&(0,P.t9)("addContact",(0,g.ei)(s,["id","accessHash","firstName","lastName","phoneNumber"]))}));const Q=(0,C.Ds)((e=>e()),500,!1);async function q(e,t,n,a,s){await(0,P.t9)("sendMessage",{chat:e,text:n,replyingTo:a,sendAs:s})}(0,a.Q6)("clickInlineButton",((e,t,n)=>{const{button:o}=n;switch(o.type){case"command":t.sendBotCommand({command:o.value});break;case"url":o.value.match(s.FS)||o.value.match(s.g$)?t.openTelegramLink({url:o.value}):t.toggleSafeLinkModal({url:o.value});break;case"callback":{const t=(0,r.jr)(e);if(!t)return;!async function(e,t,n){const s=await(0,P.t9)("answerCallbackButton",{chatId:e.id,accessHash:e.accessHash,messageId:t,data:n});if(!s)return;const{showDialog:o,showNotification:i,toggleSafeLinkModal:r}=(0,a.uC)(),{message:c,alert:d,url:l}=s;d?o({data:{message:c||"Error"}}):c?i({message:c}):l&&r({url:l})}(t,o.messageId,o.value);break}case"requestPoll":t.openPollModal();break;case"requestSelfContact":{const n=e.currentUserId?(0,r.dy)(e,e.currentUserId):void 0;if(!n)return;t.showDialog({data:{phoneNumber:n.phoneNumber,firstName:n.firstName,lastName:n.lastName,userId:n.id}});break}case"buy":{const n=(0,r.jr)(e),{messageId:a,value:s}=o;if(!n)return;s?t.getReceipt({receiptMessageId:s,chatId:n.id,messageId:a}):(t.getPaymentForm({chat:n,messageId:a}),t.setInvoiceMessageInfo((0,r.hj)(e,n.id,a)),t.openPaymentModal({chatId:n.id,messageId:a}));break}}})),(0,a.Q6)("sendBotCommand",((e,t,n)=>{const{command:a,chatId:s}=n,{currentUserId:o}=e,i=s?(0,r.Z1)(e,s):(0,r.jr)(e),c=(0,r.Bt)(e);if(!o||!i||!c)return;const{threadId:d}=c;t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:i.id,threadId:d,value:!1}),q(i,0,a,(0,r.Yy)(e,i.id,d),(0,r._5)(e,s))})),(0,a.Q6)("restartBot",((e,t,n)=>{const{chatId:s}=n,{currentUserId:o}=e,c=(0,r.jr)(e),d=o&&(0,r.IK)(e,s);o&&c&&d&&(async()=>{await(0,P.t9)("unblockContact",d.id,d.accessHash)&&((0,a.R3)((0,i.rB)((0,a.Rd)(),d.id)),q(c,0,"/start",void 0,(0,r._5)(e,s)))})()})),(0,a.Q6)("loadTopInlineBots",(e=>{const{lastRequestedAt:t}=e.topInlineBots;t&&(0,p.b)(e.serverTimeOffset)-t<60||(async()=>{const t=await(0,P.t9)("fetchTopInlineBots");if(!t)return;const{ids:n,users:s}=t;let o=(0,a.Rd)();o=(0,i.Sh)(o,(0,g.ee)(s,"id")),o={...o,topInlineBots:{...o.topInlineBots,userIds:n,lastRequestedAt:(0,p.b)(e.serverTimeOffset)}},(0,a.R3)(o)})()})),(0,a.Q6)("queryInlineBot",((e,t,n)=>{const{chatId:s,username:o,query:c,offset:d}=n;(async()=>{let t=e.inlineBots.byUsername[o];if(!1!==t){if(void 0===t){const{user:n,chat:s}=await(0,P.t9)("fetchInlineBot",{username:o})||{};if(e=(0,a.Rd)(),!n||!s)return void(0,a.R3)(D(e,o,!1));e=(0,i.Sh)(e,{[n.id]:n}),e=(0,i.fZ)(e,{[s.id]:s}),t={id:n.id,query:"",offset:"",switchPm:void 0,canLoadMore:!0,results:[]},e=D(e,o,t),(0,a.R3)(e)}(c!==t.query||t.canLoadMore)&&Q((()=>{!async function({username:e,inlineBotData:t,chatId:n,query:s,offset:o}){let i=(0,a.Rd)();const c=(0,r.dy)(i,t.id),d=(0,r.Z1)(i,n);if(!c||!d)return;const l=t.query!==s;i=j(i,!0),i=D(i,e,{...t,query:s,...l&&{offset:void 0,results:[]}}),(0,a.R3)(i);const u=await(0,P.t9)("fetchInlineBotResults",{bot:c,chat:d,query:s,offset:l?void 0:o}),m=i.inlineBots.byUsername[e];if(i=j((0,a.Rd)(),!1),!u||!m||s!==m.query)return void(0,a.R3)(i);const h=new Set((m.results||[]).map((e=>e.id))),g=u.results.filter((e=>!h.has(e.id)));i=D(i,e,{...m,help:u.help,...g.length&&{isGallery:u.isGallery},...u.switchPm&&{switchPm:u.switchPm},canLoadMore:u.results.length>0&&Boolean(u.nextOffset),results:""===m.offset||m.offset===u.nextOffset?u.results:(m.results||[]).concat(g),offset:g.length?u.nextOffset:""}),(0,a.R3)(i)}({username:o,inlineBotData:t,chatId:s,query:c,offset:d})}))}})()})),(0,a.Q6)("sendInlineBotResult",((e,t,n)=>{const{id:a,queryId:s}=n,o=(0,r.Bt)(e);if(!o||!a)return;const{chatId:i,threadId:c}=o,d=(0,r.Z1)(e,i);t.setReplyingToId({messageId:void 0}),t.clearWebPagePreview({chatId:i,threadId:c,value:!1}),(0,P.t9)("sendInlineBotResult",{chat:d,resultId:a,queryId:s,replyingTo:(0,r.Yy)(e,i,c),sendAs:(0,r._5)(e,i)})})),(0,a.Q6)("resetInlineBot",((e,t,n)=>{const{username:s}=n;let o=e.inlineBots.byUsername[s];o&&(o={id:o.id,query:"",offset:"",switchPm:void 0,canLoadMore:!0,results:[]},(0,a.R3)(D(e,s,o)))})),(0,a.Q6)("startBot",((e,t,n)=>{const{botId:a,param:s}=n,o=(0,r.dy)(e,a);o&&(async()=>{await(0,P.t9)("startBot",{bot:o,startParam:s})})()})),n(9667),(0,a.Q6)("loadPasswordInfo",(()=>{(async()=>{const e=await(0,P.t9)("getPasswordInfo");if(!e)return;let t=(0,a.Rd)();t=(0,i.BI)(t,{hasPassword:e.hasPassword}),t=(0,i.IE)(t,{hint:e.hint}),(0,a.R3)(t)})()})),(0,a.Q6)("checkPassword",((e,t,n)=>{const{currentPassword:s,onSuccess:o}=n;(0,a.R3)((0,i.IE)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await(0,P.t9)("checkPassword",s);(0,a.R3)((0,i.IE)((0,a.Rd)(),{isLoading:!1})),e&&o()})()})),(0,a.Q6)("clearPassword",((e,t,n)=>{const{currentPassword:s,onSuccess:o}=n;(0,a.R3)((0,i.IE)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await(0,P.t9)("clearPassword",s);(0,a.R3)((0,i.IE)((0,a.Rd)(),{isLoading:!1})),e&&o()})()})),(0,a.Q6)("updatePassword",((e,t,n)=>{const{currentPassword:s,password:o,hint:r,email:c,onSuccess:d}=n;(0,a.R3)((0,i.IE)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await(0,P.t9)("updatePassword",s,o,r,c);(0,a.R3)((0,i.IE)((0,a.Rd)(),{isLoading:!1})),e&&d()})()})),(0,a.Q6)("updateRecoveryEmail",((e,t,n)=>{const{currentPassword:s,email:o,onSuccess:r}=n;(0,a.R3)((0,i.IE)(e,{isLoading:!0,error:void 0})),(async()=>{const e=await(0,P.t9)("updateRecoveryEmail",s,o);(0,a.R3)((0,i.IE)((0,a.Rd)(),{isLoading:!1,waitingEmailCodeLength:void 0})),e&&r()})()})),(0,a.Q6)("provideTwoFaEmailCode",((e,t,n)=>{const{code:a}=n;(0,P.t9)("provideRecoveryEmailCode",a)})),(0,a.Q6)("clearTwoFaError",(e=>(0,i.IE)(e,{error:void 0}))),(0,a.Q6)("validateRequestedInfo",((e,t,n)=>{const{requestInfo:s,saveInfo:o}=n,c=(0,r.gx)(e),d=c&&(0,r.Z1)(e,c),l=(0,r.Mz)(e);d&&l&&async function(e,t,n,s){const o=await(0,P.t9)("validateRequestedInfo",{chat:e,messageId:t,requestInfo:n,shouldSave:s});if(!o)return;const{id:r,shippingOptions:c}=o;if(!r)return;let d=(0,i.vT)((0,a.Rd)(),r);c?(d=(0,i.TM)(d,c),d=(0,i.Q$)(d,m.KB.Shipping)):d=(0,i.Q$)(d,m.KB.PaymentInfo),(0,a.R3)(d)}(d,l,s,o)})),(0,a.Q6)("getPaymentForm",((e,t,n)=>{const{chat:s,messageId:o}=n;s&&o&&async function(e,t){const n=await(0,P.t9)("getPaymentForm",{chat:e,messageId:t});if(!n)return;let s=(0,i._7)((0,a.Rd)(),n),o=m.KB.PaymentInfo;s.payment.invoice&&(s.payment.invoice.shippingAddressRequested||s.payment.invoice.nameRequested||s.payment.invoice.phoneRequested||s.payment.invoice.emailRequested)&&(o=m.KB.ShippingInfo),s=(0,i.Q$)(s,o),(0,a.R3)(s)}(s,o)})),(0,a.Q6)("getReceipt",((e,t,n)=>{const{receiptMessageId:s,chatId:o,messageId:c}=n,d=o&&(0,r.Z1)(e,o);c&&s&&d&&async function(e,t,n){const s=await(0,P.t9)("getReceipt",e,n);if(!s)return;let o=(0,a.Rd)();const c=(0,r.hj)(o,e.id,t);o=(0,i.Dq)(o,s,c),(0,a.R3)(o)}(d,c,s)})),(0,a.Q6)("clearPaymentError",(e=>{(0,a.R3)({...e,payment:{...e.payment,error:void 0}})})),(0,a.Q6)("clearReceipt",(e=>{(0,a.R3)({...e,payment:{...e.payment,receipt:void 0}})})),(0,a.Q6)("sendCredentialsInfo",((e,t,n)=>{const s=(0,r.$$)(e);if(!s)return;const{credentials:o}=n,{data:c}=o;!async function(e,t){const n=function(e){const t=Object.keys(e).map((t=>`${t}=${e[t]}`)).join("&");return t.length>0?`?${t}`:""}({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvv,"card[address_zip]":e.zip,"card[address_country]":e.country}),s=await fetch(`https://api.stripe.com/v1/tokens${n}`,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${t}`}}),o=await s.json();if(o.error){const e=(0,d.Ow)(o.error),t=(0,a.Rd)();return void(0,a.R3)({...t,payment:{...t.payment,error:{...e}}})}let r=(0,i.QH)((0,a.Rd)(),{type:o.type,id:o.id});r=(0,i.Q$)(r,m.KB.Checkout),(0,a.R3)(r)}(c,s)})),(0,a.Q6)("sendPaymentForm",((e,t,n)=>{const{shippingOptionId:s,saveCredentials:o}=n,c=(0,r.gx)(e),d=c&&(0,r.Z1)(e,c),l=(0,r.Mz)(e),u=(0,r.eh)(e),m=(0,r.sp)(e),h=(0,r.$$)(e),g=(0,r.i3)(e);d&&l&&h&&u&&async function(e,t,n,s,o,r){if(await(0,P.t9)("sendPaymentForm",{chat:e,messageId:t,formId:n,credentials:s,requestedInfoId:o,shippingOptionId:r})){const e=(0,i.bp)((0,a.Rd)());(0,a.R3)((0,i.WY)(e))}}(d,l,u,{save:o,data:g},m,s)})),(0,a.Q6)("setPaymentStep",((e,t,n={})=>(0,i.Q$)(e,n.step||m.KB.ShippingInfo))),(0,a.Q6)("setInvoiceMessageInfo",((e,t,n)=>(0,i.nA)(e,n)));var G=n(647),H=n(3495);const _=728,z=424,V=288;var Y=n(3858);function X(e,t){return t-(e.isLeftColumnShown&&!h.wB?e.leftColumnWidth||((n=Y.Z.get().width)>s._m?Math.min(Math.max(.25*n,V),.33*n):n>s.ks?Math.min(Math.max(.33*n,V),.4*n):z):0);var n}(0,a.Q6)("loadAvailableReactions",(()=>{(async()=>{const e=await(0,P.t9)("getAvailableReactions");e&&(e.forEach((e=>{e.aroundAnimation&&G.he(`sticker${e.aroundAnimation.id}`,u.IU.Lottie),e.centerIcon&&G.he(`sticker${e.centerIcon.id}`,u.IU.Lottie)})),(0,a.R3)({...(0,a.Rd)(),availableReactions:e}))})()})),(0,a.Q6)("interactWithAnimatedEmoji",((e,t,n)=>{const{emoji:a,x:s,y:o,localEffect:i,startSize:r,isReversed:c}=n;return{...e,activeEmojiInteraction:{animatedEffect:a||i,x:X(e,s),y:o,startSize:r,isReversed:c}}})),(0,a.Q6)("sendEmojiInteraction",((e,t,n)=>{const{messageId:a,chatId:s,emoji:o,interactions:i,localEffect:c,x:d,y:l,startX:u,startY:m,startSize:h}=n,g=(0,r.Z1)(e,s);if(g&&(o||c)&&((0,P.t9)("sendEmojiInteraction",{chat:g,messageId:a,emoticon:o||(0,r.ji)(c),timestamps:i}),e.activeEmojiInteraction))return{...e,activeEmojiInteraction:{...e.activeEmojiInteraction,endX:X(e,d),endY:l,...u&&{x:X(e,u)},...m&&{y:m},...h&&{startSize:h}}}})),(0,a.Q6)("sendDefaultReaction",((e,t,n)=>{const{chatId:a,messageId:s,x:o,y:i}=n,c=(0,r.q6)(e,a);c&&t.sendReaction({chatId:a,messageId:s,reaction:c,x:o,y:i})})),(0,a.Q6)("sendReaction",((e,t,n)=>{var a,o;const{chatId:i,messageId:c}=n;let{reaction:d}=n;const l=(0,r.Z1)(e,i),u=(0,r.hj)(e,i,c);if(!l||!u)return;null!==(a=u.reactions)&&void 0!==a&&null!==(o=a.results)&&void 0!==o&&o.some((e=>e.reaction===d&&e.isChosen))&&(d=void 0),(0,P.t9)("sendReaction",{chat:l,messageId:c,reaction:d});const{animationLevel:m}=e.settings.byKey;return m===s.zy&&(e={...e,activeReactions:{...d?e.activeReactions:(0,g.CE)(e.activeReactions,[c]),...d&&{[c]:{reaction:d,messageId:c}}}}),function(e,t,n,a){const{reactions:s}=(0,r.hj)(e,t,n)||{};if(!s)return e;let o=s.results.map((e=>e.reaction===a?{...e,count:e.isChosen?e.count:e.count+1,isChosen:!0}:e.isChosen?{...e,isChosen:!1,count:e.count-1}:e)).filter((e=>e.count>0)),{recentReactions:i}=s;if(a&&!o.some((e=>e.reaction===a))){const{currentUserId:t}=e;o=[...o,{reaction:a,isChosen:!0,count:1}],s.canSeeList&&(i=[...i||[],{userId:t,reaction:a}])}return(0,H.cY)(e,t,n,{reactions:{...s,results:o,recentReactions:i}})}(e,i,c,d)})),(0,a.Q6)("openChat",(e=>({...e,activeReactions:{}}))),(0,a.Q6)("stopActiveReaction",((e,t,n)=>{var a;const{messageId:s,reaction:o}=n;return(null===(a=e.activeReactions[s])||void 0===a?void 0:a.reaction)!==o?e:{...e,activeReactions:(0,g.CE)(e.activeReactions,[s])}})),(0,a.Q6)("setDefaultReaction",((e,t,n)=>{const{reaction:s}=n;(async()=>{await(0,P.t9)("setDefaultReaction",{reaction:s})&&(e=(0,a.Rd)(),(0,a.R3)({...e,appConfig:{...e.appConfig,defaultReaction:s}}))})()})),(0,a.Q6)("stopActiveEmojiInteraction",(e=>({...e,activeEmojiInteraction:void 0}))),(0,a.Q6)("loadReactors",((e,t,n)=>{var s;const{chatId:o,messageId:c,reaction:d}=n,l=(0,r.Z1)(e,o),u=(0,r.hj)(e,o,c);if(!l||!u)return;const m=null===(s=u.reactors)||void 0===s?void 0:s.nextOffset;(async()=>{var t,n;const s=await(0,P.t9)("fetchMessageReactionsList",{reaction:d,chat:l,messageId:c,offset:m});if(!s)return;e=(0,a.Rd)(),null!==(t=s.users)&&void 0!==t&&t.length&&(e=(0,i.Sh)(e,(0,g.ee)(s.users,"id")));const{nextOffset:r,count:h,reactions:p}=s;(0,a.R3)((0,i.cY)(e,o,c,{reactors:{nextOffset:r,count:h,reactions:[...(null===(n=u.reactors)||void 0===n?void 0:n.reactions)||[],...p]}}))})()})),(0,a.Q6)("loadMessageReactions",((e,t,n)=>{const{ids:a,chatId:s}=n,o=(0,r.Z1)(e,s);o&&(0,P.t9)("fetchMessageReactions",{ids:a,chat:o})})),(0,a.Q6)("sendWatchingEmojiInteraction",((e,t,n)=>{const{chatId:a,emoticon:s,x:o,y:i,startSize:c,isReversed:d}=n,l=(0,r.Z1)(e,a);if(l&&e.activeEmojiInteraction)return(0,P.t9)("sendWatchingEmojiInteraction",{chat:l,emoticon:s}),{...e,activeEmojiInteraction:{...e.activeEmojiInteraction,x:X(e,o),y:i,startSize:c,isReversed:d}}})),n(4907);var W=n(8406);const K=(0,C.P2)((e=>e()),500,!0);function J(e,t){const n=typeof e;if(n!==typeof t)return!1;if("object"!==n)return e===t;const a=Array.isArray(e);if(a!==Array.isArray(t))return!1;if(a){const n=e,a=t;return n.length===a.length&&n.every(((e,t)=>J(e,a[t])))}const s=e,o=e;return Object.keys(s).every((e=>J(s[e],o[e])))}(0,a.Q6)("apiUpdate",((e,t,n)=>{switch(n["@type"]){case"updateChat":{n.noTopChatsRequest||(0,r.N)(e,n.id)||t.loadTopChats();const s=(0,i.a4)(e,n.id,n.chat,n.newProfilePhoto);(0,a.R3)(s),K((()=>(0,x.w)((0,r.A1)((0,a.Rd)())))),n.chat.id&&(0,W.Vr)({chatId:n.chat.id,lastReadInboxMessageId:n.chat.lastReadInboxMessageId});break}case"updateChatJoin":{const s=(0,r.Ek)(e,n.id);if(!s)break;e=(0,i.B1)(e,s,[n.id]),e=(0,i.a4)(e,n.id,{isNotJoined:!1}),(0,a.R3)(e);const o=(0,r.Z1)(e,n.id);o&&t.requestChatUpdate({chatId:o.id});break}case"updateChatLeave":(0,a.R3)((0,i.Dd)(e,n.id));break;case"updateChatInbox":(0,a.R3)((0,i.a4)(e,n.id,n.chat)),K((()=>(0,x.w)((0,r.A1)((0,a.Rd)()))));break;case"updateChatTypingStatus":{const{id:t,typingStatus:s}=n;(0,a.R3)((0,i.a4)(e,t,{typingStatus:s})),setTimeout((()=>{const e=(0,a.Rd)(),n=(0,r.Z1)(e,t);n&&s&&n.typingStatus&&n.typingStatus.timestamp===s.timestamp&&(0,a.R3)((0,i.a4)(e,t,{typingStatus:void 0}))}),6e3);break}case"newMessage":{const{message:s}=n,{chatId:o,threadId:c,type:d}=(0,r.Bt)(e)||{};if(s.senderId===e.currentUserId&&!s.isFromScheduled)return;const l=(0,r.Z1)(e,n.chatId);if(!l)return;"thread"===d&&c===u._f&&n.chatId===o?setTimeout((()=>{t.requestChatUpdate({chatId:n.chatId})}),1500):(0,a.R3)((0,i.a4)(e,n.chatId,{unreadCount:l.unreadCount?l.unreadCount+1:1,...n.message.hasUnreadMention&&{unreadMentionsCount:l.unreadMentionsCount?l.unreadMentionsCount+1:1}})),(0,x.w)((0,r.A1)((0,a.Rd)())),(0,W.zP)({chat:l,message:s});break}case"updateCommonBoxMessages":case"updateChannelMessages":{const{ids:t,messageUpdate:s}=n;if(!1!==s.hasUnreadMention)return;t.forEach((t=>{const a="channelId"in n?n.channelId:(0,r.X5)(e,t),s=(0,r.Z1)(e,a);null!=s&&s.unreadMentionsCount&&(e=(0,i.a4)(e,a,{unreadMentionsCount:s.unreadMentionsCount-1}))})),(0,a.R3)(e);break}case"updateChatFullInfo":{const{fullInfo:t}=n,s=e.chats.byId[n.id];if(!s)return;(0,a.R3)((0,i.a4)(e,n.id,{fullInfo:{...s.fullInfo,...t}}));break}case"updatePinnedChatIds":{const{ids:t,folderId:o}=n,i=o===s.WS?"archived":"active";e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[i]:t.length?t:void 0}}},(0,a.R3)(e);break}case"updateChatPinned":{const{id:t,isPinned:o}=n,i=(0,r.Ek)(e,t);if(i){const{[i]:n}=e.chats.orderedPinnedIds;let a=n||[];if(o){if(!a.includes(t)){if("active"===i&&a.length>=s.EG){const t=e.chats.listIds.active;a=a.filter((e=>t&&t.includes(e)))}a=[t,...a]}}else a=a.filter((e=>e!==t));e={...e,chats:{...e.chats,orderedPinnedIds:{...e.chats.orderedPinnedIds,[i]:a.length?a:void 0}}}}(0,a.R3)(e);break}case"updateChatListType":{const{id:t,folderId:s}=n;(0,a.R3)((0,i.Pi)(e,t,s));break}case"updateChatFolder":{const{id:t,folder:s}=n,{byId:o,orderedIds:i}=e.chatFolders,r=s?{...o,[t]:s}:(0,g.ei)(o,Object.keys(o).map(Number).filter((e=>e!==t))),c=s?i&&i.includes(t)?i:[...i||[],t]:i?i.filter((e=>e!==t)):void 0;(0,a.R3)({...e,chatFolders:{...e.chatFolders,byId:r,orderedIds:c}});break}case"updateChatFoldersOrder":{const{orderedIds:t}=n;(0,a.R3)({...e,chatFolders:{...e.chatFolders,orderedIds:t}});break}case"updateRecommendedChatFolders":{const{folders:t}=n;(0,a.R3)({...e,chatFolders:{...e.chatFolders,recommended:t}});break}case"updateChatMembers":{var o;const t=e.chats.byId[n.id],{replacedMembers:s,addedMember:r,deletedMemberId:c}=n;if(!t)return;let d=!1,l=null!==(o=t.fullInfo)&&void 0!==o&&o.members?[...t.fullInfo.members]:[];if(s)l=s,d=!0;else if(r)l.length&&l.some((e=>e.userId===r.userId))||(l.push(r),d=!0);else if(l.length&&c){const e=l.findIndex((e=>e.userId===c));e>-1&&(l.slice(e,1),d=!0)}if(d){const s=l.filter((({isOwner:e,isAdmin:t})=>e||t));(0,a.R3)((0,i.a4)(e,n.id,{membersCount:l.length,fullInfo:{...t.fullInfo,members:l,adminMembers:s}}))}break}case"deleteProfilePhotos":{const{chatId:t,ids:s}=n,o=e.chats.byId[t];null!=o&&o.photos&&(0,a.R3)((0,i.a4)(e,t,{photos:o.photos.filter((e=>!s.includes(e.id)))}));break}case"draftMessage":{const{chatId:t,formattedText:s,date:o,replyingToId:r}=n;e.chats.byId[t]&&(e=(0,i.pf)(e,t,u._f,"draft",s),e=(0,i.pf)(e,t,u._f,"replyingToId",r),e=(0,i.a4)(e,t,{draftDate:o}),(0,a.R3)(e));break}case"showInvite":{const{data:e}=n;t.showDialog({data:e});break}}}));const ee=350;function te(e,t,n,a,s=!1){const o=s?(0,r.Tm)(e,t,n):(0,r.hj)(e,t,n);if(o&&a.content){const{photo:e,video:t,sticker:n,document:s}=(0,d.qp)(o);e&&a.content.photo?(a.content.photo.blobUrl=e.blobUrl,a.content.photo.thumbnail=e.thumbnail):t&&a.content.video?a.content.video.blobUrl=t.blobUrl:n&&a.content.sticker?a.content.sticker.isPreloadedGlobally=n.isPreloadedGlobally:s&&a.content.document&&(a.content.document.previewBlobUrl=s.previewBlobUrl)}return s?(0,i.P4)(e,t,n,a):(0,i.cY)(e,t,n,a)}function ne(e,t,n,a){const{chatId:s}=n,{threadInfo:o}=(0,r.Db)(e,s,n)||{};if(!o&&n.replyToMessageId){const o=(0,r.hj)(e,s,n.replyToMessageId);o?e=(0,i.lG)(e,o,s,n.id,a):t.loadMessage({chatId:s,messageId:n.replyToMessageId,threadUpdate:{isDeleting:a,lastMessageId:n.id}})}return e}function ae(e,t,n){const{id:a,chatId:s}=n,{threadInfo:o,firstMessageId:c}=(0,r.Db)(e,s,n)||{},l=(0,r.Z1)(e,s),m=(null==l?void 0:l.unreadCount)&&!(0,r.gb)(e,s,u._f);if(e=ne(e,t,n),o&&(!c&&(0,d.CI)(n)||(e=(0,i.xj)(e,s,o.threadId,[a]),(0,r.b9)(e,s,o.threadId)&&(e=(0,i.$S)(e,s,o.threadId,a),c||(e=(0,i.pf)(e,s,o.threadId,"firstMessageId",n.id)))),e=(0,i.pf)(e,s,o.threadId,"threadInfo",{...o,lastMessageId:n.id,messagesCount:o.messagesCount+1})),m)return e;if(e=(0,i.xj)(e,s,u._f,[a]),(0,r.b9)(e,s,u._f)){const t=(0,r.It)(e,s,u._f),n=(0,i.$S)(e,s,u._f,a),o=(0,r.Cb)(n,s,u._f);t&&!o.includes(t)||(e=n)}return e}function se(e,t,n,a=!1){var s;const{chats:o}=e,r=null===(s=o.byId[t])||void 0===s?void 0:s.lastMessage;return!r||a||r.id===n.id||r.id===n.previousLocalId||n.id>r.id?(0,i.a4)(e,t,{lastMessage:n}):e}function oe(e,t){const n=(0,r.Zw)(e,t),a=(0,r.gb)(e,t,u._f);if(!n||!a)return;let s=a.length;for(;s--;){const e=n[a[s]];if(!e.isDeleting)return e}}function ie(e,t,n,s){if(e){t.forEach((t=>{const n=oe(s=(0,i.cY)(s,e,t,{isDeleting:!0}),e);n&&(s=se(s,e,n,!0))})),(0,a.R3)(s),n.requestChatUpdate({chatId:e});const o=[];return t.forEach((t=>{const a=(0,r.hj)(s,e,t);if(!a)return;s=ne(s,n,a,!0);const{threadInfo:i}=(0,r.Db)(s,e,a)||{};i&&o.push(i.threadId)})),(0,a.R3)(s),void setTimeout((()=>{(0,a.R3)((0,i.K4)((0,a.Rd)(),e,t)),(0,g.Tw)(o).forEach((t=>{n.requestThreadInfoUpdate({chatId:e,threadId:t})}))}),ee)}const o=[];t.forEach((e=>{const t=(0,r.X5)(s,e);if(t){o.push(t);const n=oe(s=(0,i.cY)(s,t,e,{isDeleting:!0}),t);n&&(s=se(s,t,n,!0)),setTimeout((()=>{(0,a.R3)((0,i.K4)((0,a.Rd)(),t,[e]))}),ee)}})),(0,a.R3)(s),(0,g.Tw)(o).forEach((e=>{n.requestChatUpdate({chatId:e})}))}(0,a.Q6)("apiUpdate",((e,t,n)=>{switch(n["@type"]){case"newMessage":{const{chatId:o,id:c,message:l,shouldForceReply:m}=n;e=ae(e=te(e,o,c,l),t,l),l.threadInfo&&(e=(0,i.Xg)(e,l.threadInfo.chatId,l.threadInfo.threadId,l.threadInfo)),(0,a.R3)(e);const h=(0,r.hj)(e,o,c);if((0,r.hg)(e,o,l)){var s;if(l.isOutgoing&&(null===(s=l.content)||void 0===s||!s.action)){const n=(0,r.Bt)(e);n&&t.focusMessage({chatId:o,threadId:n.threadId,messageId:l.id,noHighlight:!0,isResizingContainer:!0})}const{threadInfo:n}=(0,r.Db)(e,o,l)||{};n&&t.requestThreadInfoUpdate({chatId:o,threadId:n.threadId}),(0,d.CI)(l)||setTimeout((()=>{let e=(0,a.Rd)();m&&(e=(0,i.pf)(e,o,u._f,"replyingToId",c)),(0,a.R3)(se(e,o,h))}),ee)}else(0,a.R3)(se((0,a.Rd)(),o,h));(0,r.N)(e,o)||t.loadTopChats();break}case"updateStartEmojiInteraction":{const{chatId:t}=(0,r.Bt)(e)||{};if(e.activeEmojiInteraction||t!==n.id)return;const s=(0,r.CP)(e,n.emoji);e={...e,activeEmojiInteraction:{animatedEffect:s?(0,r.cu)(s):n.emoji,messageId:n.messageId}},(0,a.R3)(e);break}case"newScheduledMessage":{const{chatId:t,id:s,message:o}=n;e=te(e,t,s,o,!0);const c=(0,r.qy)(e,t)||[];e=(0,i.pf)(e,t,u._f,"scheduledIds",(0,g.Tw)([...c,s])),(0,a.R3)(e);break}case"updateMessage":{var o,c;const{chatId:s,id:d,message:l}=n;if(!(0,r.hj)(e,s,d))return;e=te(e,s,d,l);const m=(0,r.hj)(e,s,d);l.threadInfo&&(e=(0,i.Xg)(e,l.threadInfo.chatId,l.threadInfo.threadId,l.threadInfo)),e=se(e,s,m),(0,a.R3)(e);const h=(0,r.Z1)(e,s);h&&!l.isOutgoing&&(null===(o=h.lastMessage)||void 0===o?void 0:o.id)===l.id&&(0,r.xo)(e,h)&&(0,r.hg)(e,s,l)&&(0,r.b9)(e,s,(null===(c=l.threadInfo)||void 0===c?void 0:c.threadId)||u._f)&&t.focusLastMessage();break}case"updateScheduledMessage":{const{chatId:t,id:s,message:o}=n;if(!(0,r.Tm)(e,t,s))return;e=te(e,t,s,o,!0);const c=Object.keys((0,r.Fn)(e,t)||{}).map(Number).sort(((e,t)=>t-e));e=(0,i.pf)(e,t,u._f,"scheduledIds",c),(0,a.R3)(e);break}case"updateMessageSendSucceeded":{const{chatId:s,localId:o,message:c}=n;e=ae(e,t,c);const d=(0,r.hj)(e,s,o);e=(0,i.K4)(e,s,[o]),c.isScheduled&&(e=(0,i.bV)(e,s,[o])),e=(0,i.cY)(e,s,c.id,{...d,...c,previousLocalId:o});const l=(0,r.hj)(e,s,c.id);e=se(e,s,l);const u=(0,r.Db)(e,s,c);null!=u&&u.threadInfo&&(t.markMessageListRead({maxId:c.id}),e=(0,i.pf)(e,s,u.threadInfo.threadId,"threadInfo",{...u.threadInfo,lastMessageId:c.id,lastReadInboxMessageId:c.id})),(0,a.R3)(e);break}case"updateScheduledMessageSendSucceeded":{const{chatId:t,localId:s,message:o}=n,c=(0,r.qy)(e,t)||[];e=(0,i.pf)(e,t,u._f,"scheduledIds",[...c,o.id]);const d=(0,r.Tm)(e,t,s);e=(0,i.bV)(e,t,[s]),e=(0,i.P4)(e,t,o.id,{...d,...o,previousLocalId:s}),(0,a.R3)(e);break}case"updatePinnedIds":{const{chatId:t,isPinned:s,messageIds:o}=n,c=(0,r.KB)(e,t)||[],d=s?[...c,...o].sort(((e,t)=>t-e)):c.filter((e=>!o.includes(e)));(0,a.R3)((0,i.pf)(e,t,u._f,"pinnedIds",d));break}case"updateThreadInfo":{const{chatId:t,threadId:s,threadInfo:o,firstMessageId:c}=n,d={...(0,r.tZ)(e,t,s),...o};if(!d.threadId)return;e=(0,i.Xg)(e,t,s,d),c&&(e=(0,i.pf)(e,t,s,"firstMessageId",c)),(0,a.R3)(e);break}case"resetMessages":{const{id:s}=n,o=(0,r.Zw)(e,s);o&&!(0,d.YC)(s)&&(e=(0,i.K4)(e,s,Object.keys(o).map(Number)),(0,a.R3)(e),t.loadFullChat({chatId:s,force:!0}));break}case"deleteMessages":{const{ids:a,chatId:s}=n;ie(s,a,t,e);break}case"deleteScheduledMessages":{const{ids:t,chatId:s}=n;!function(e,t,n,s){e&&(t.forEach((t=>{s=(0,i.P4)(s,e,t,{isDeleting:!0})})),(0,a.R3)(s),setTimeout((()=>{s=(0,i.bV)((0,a.Rd)(),e,t);const n=(0,r.Fn)(s,e);s=(0,i.pf)(s,e,u._f,"scheduledIds",Object.keys(n||{}).map(Number)),(0,a.R3)(s)}),ee))}(s,t,0,e);break}case"deleteHistory":{const{chatId:a}=n,s=e.messages.byChatId[a];s?ie(a,Object.keys(s.byId).map(Number),t,e):t.requestChatUpdate({chatId:a});break}case"updateCommonBoxMessages":{const{ids:t,messageUpdate:s}=n;t.forEach((t=>{const n=(0,r.X5)(e,t);n&&(e=(0,i.cY)(e,n,t,s))})),(0,a.R3)(e);break}case"updateChannelMessages":{const{channelId:t,ids:s,messageUpdate:o}=n;s.forEach((n=>{e=(0,i.cY)(e,t,n,o)})),(0,a.R3)(e);break}case"updateMessagePoll":{const{pollId:t,pollUpdate:s}=n,o=(0,r.ZB)(e,t);if(null!=o&&o.content.poll){const t={...o.content.poll,...s},{results:n}=t.results||{};if(n&&!n.some((e=>e.isChosen))){const{results:e}=o.content.poll.results,a=e&&e.filter((e=>e.isChosen));a&&a.forEach((e=>{const a=n.findIndex((t=>t.option===e.option));a>=0&&(t.results.results[a].isChosen=!0)}))}(0,a.R3)((0,i.cY)(e,o.chatId,o.id,{content:{...o.content,poll:t}}))}break}case"updateMessagePollVote":{const{pollId:t,userId:s,options:o}=n,c=(0,r.ZB)(e,t);if(!c||!c.content.poll||!c.content.poll.results)break;const{poll:d}=c.content,{recentVoterIds:l,totalVoters:u,results:m}=d.results,h=l?[...l]:[],g=u?u+1:1,p=m?[...m]:[];h.push(s),o.forEach((t=>{const n=p.find((e=>e.option===t)),a=p.findIndex((e=>e.option===t)),o=n?{...n}:{option:t,votersCount:0};o.votersCount+=1,s===e.currentUserId&&(o.isChosen=!0),a?p[a]=o:p.push(o)})),(0,a.R3)((0,i.cY)(e,c.chatId,c.id,{content:{...c.content,poll:{...d,results:{...d.results,recentVoterIds:h,totalVoters:g,results:p}}}}));break}case"updateServiceNotification":{const{message:a}=n;(0,r.UW)(e)&&t.createServiceNotification({message:a});break}case"updateMessageReactions":{const{chatId:t,id:s,reactions:o}=n,c=(0,r.hj)(e,t,s),d=null==c?void 0:c.reactions;if(d&&J(o,d))return;(0,a.R3)((0,i.cY)(e,t,s,{reactions:n.reactions}));break}}}));const re=(0,C.P2)((function(){const e=(0,a.Rd)();(0,a.R3)((0,i.ps)(e,{...e.users.statusesById,...ce})),ce={}}),3e3,!0);let ce={};(0,a.Q6)("apiUpdate",((e,t,n)=>{switch(n["@type"]){case"deleteContact":return(0,i.GK)(e,n.id);case"updateUser":return(0,i.Nq)(e,n.id,n.user);case"updateUserStatus":return a=n.userId,s=n.status,ce[a]=s,void re();case"updateUserFullInfo":{const{id:t,fullInfo:a}=n,s=e.users.byId[t];if(!s)return;return(0,i.Nq)(e,t,{fullInfo:{...s.fullInfo,...a}})}}var a,s})),(0,a.Q6)("apiUpdate",((e,t,n)=>{switch(n["@type"]){case"updateStickerSet":return(0,i.Rg)(e,n.id,n.stickerSet)}})),(0,a.Q6)("apiUpdate",((e,t,n)=>{switch(n["@type"]){case"updatePeerBlocked":return n.isBlocked?(0,i.O4)((0,a.Rd)(),n.id):(0,i.rB)((0,a.Rd)(),n.id);case"updateResetContactList":(0,a.R3)({...(0,a.Rd)(),contactList:{userIds:[]}});break;case"updateFavoriteStickers":t.loadFavoriteStickers();break;case"updatePrivacy":e.settings.privacy[n.key]=n.rules}})),(0,a.Q6)("apiUpdate",((e,t,n)=>{switch(n["@type"]){case"updateNotifySettings":return(0,i.HN)(e,n.peerType,n.isSilent,n.shouldShowPreviews);case"updateNotifyExceptions":{const{chatId:t,isMuted:s,isSilent:o,shouldShowPreviews:r}=n;e.chats.byId[t]&&(e=(0,i.a4)(e,t,{isMuted:s})),(0,a.R3)((0,i.aK)(e,t,{isMuted:s,isSilent:o,shouldShowPreviews:r}));break}}})),(0,a.Q6)("apiUpdate",((e,t,n)=>{switch(n["@type"]){case"updateTwoFaStateWaitCode":return{...e,twoFaSettings:{...e.twoFaSettings,isLoading:!1,waitingEmailCodeLength:n.length}};case"updateTwoFaError":return{...e,twoFaSettings:{...e.twoFaSettings,error:n.message}}}}));var de=n(4446);(0,a.Q6)("apiUpdate",((e,t,n)=>{switch(n["@type"]){case"updateGroupCall":return"discarded"===n.call.connectionState?e.groupCalls.activeGroupCallId?void t.leaveGroupCall({shouldRemove:!0}):(0,de.dc)(e,n.call.id):(0,de.AH)(e,n.call.id,(0,g.CE)(n.call,["connectionState"]),void 0,n.call.participantsCount);case"updateGroupCallChatId":{const t=(0,r.Z1)(e,n.chatId);return t&&(e=(0,i.a4)(e,n.chatId,{fullInfo:{...t.fullInfo,groupCallId:n.call.id}})),e}case"updateGroupCallParticipants":{const{groupCallId:t,participants:s,nextOffset:o}=n,{currentUserId:i}=e;return e=(0,a.Rd)(),s.forEach((n=>{n.id&&(e=(0,de.B6)(e,t,n.id,n,!!o||i===n.id))})),o&&(e=(0,de.AH)(e,t,{nextOffset:o})),e}}}));var le=n(8674),ue=n(6752),me=n(1279),he=n(3551),ge=n(3227),pe=n(1212),fe=n(5332);function ve(e){(0,o.d4)((()=>(0,C.Gq)(e)),[e])}var Ie=n(9290);const ye=document.querySelector('meta[name="viewport"]'),Ze=(null==ye?void 0:ye.getAttribute("content"))||"";function Pe(e){e.preventDefault()}var Ce=n(6590),we=n(3989),be=n(7529),Ee=n(3455),Me=n(706),Se=n(2255);function Re(){const[e,t]=(0,o.eJ)(window.navigator.onLine);return(0,o.d4)((()=>{function e(){t(window.navigator.onLine)}return window.addEventListener("online",e),window.addEventListener("offline",e),()=>{window.removeEventListener("offline",e),window.removeEventListener("online",e)}}),[]),e}var ke=n(9107),Te=n(6917),Ne=n(7926),Be=n(1622),Ae=n(3106),xe=n(8964),Le=n(231),Oe=n(9589),Ue=n(9187),Fe=n(3321);const $e=[0,1,2],De=(0,o.X$)((0,a.c$)((e=>{const{query:t,fetchingStatus:n,chatId:a,date:s}=e.globalSearch,{currentUserId:o}=e,{byId:i}=e.chats,{animationLevel:c}=e.settings.byKey;return{searchQuery:t,isLoading:!!n&&Boolean(n.chats||n.messages),currentUserId:o,chatsById:i,globalSearchChatId:a,searchDate:s,theme:(0,r.Pu)(e),animationLevel:c}}))((({content:e,contactsFilter:t,onSearchQuery:n,onSelectSettings:i,onSelectContacts:r,onSelectArchived:c,onReset:l,searchQuery:u,isLoading:g,shouldSkipTransition:p,currentUserId:f,globalSearchChatId:v,searchDate:I,theme:y,animationLevel:Z,chatsById:P})=>{const{openChat:C,openTipsChat:w,setGlobalSearchDate:b,setSettingOption:E,setGlobalSearchChatId:M}=(0,a.uC)(),S=(0,ke.Z)(),R=e===m.du.ChatList,k=(0,o.Ye)((()=>I?(0,N.xH)(new Date(1e3*I)):void 0),[I]),T=(0,o.Ye)((()=>R&&P?Object.values(P).reduce(((e,t)=>(0,d.pE)(t)&&t.unreadCount?e+1:e),0):0),[R,P]),B="web.telegram.org"===window.location.hostname,A=(0,o.Ye)((()=>({onTrigger:e,isOpen:t})=>o.ZP.createElement(Le.Z,{round:!0,ripple:R&&!h.wB,size:"smaller",color:"translucent",className:t?"active":"",onClick:R?e:()=>l(),ariaLabel:R?S("AccDescrOpenMenu2"):"Return to chat list"},o.ZP.createElement("div",{className:(0,ue.Z)("animated-menu-icon",!R&&"state-back",p&&"no-animation")}))),[R,S,l,p]),x=(0,o.I4)((()=>{u||n("")}),[u,n]),L=(0,o.I4)((()=>{C({id:f,shouldReplaceHistory:!0})}),[f,C]),O=(0,o.I4)((e=>{e.stopPropagation();const t="light"===y?"dark":"light";E({theme:t}),E({shouldUseSystemTheme:!1}),(0,Te.Z)(t,Z===s.zy)}),[Z,E,y]),U=(0,o.I4)((e=>{e.stopPropagation();const t=0===Z?2:0;$e.forEach(((e,n)=>{document.body.classList.toggle(`animation-level-${n}`,t===n)})),E({animationLevel:t})}),[Z,E]),F=Boolean(v)||e===m.du.GlobalSearch||e===m.du.Contacts,$=e===m.du.Contacts?S("SearchFriends"):S("Search");return o.ZP.createElement("div",{className:"LeftMainHeader"},o.ZP.createElement("div",{id:"LeftMainHeader",className:"left-header"},o.ZP.createElement(Ae.Z,{trigger:A,footer:`${s.iC} ${s.Ji}`},o.ZP.createElement(xe.Z,{icon:"saved-messages",onClick:L},S("SavedMessages")),o.ZP.createElement(xe.Z,{icon:"archive",onClick:c},o.ZP.createElement("span",{className:"menu-item-name"},S("ArchivedChats")),T>0&&o.ZP.createElement("div",{className:"archived-badge"},T)),o.ZP.createElement(xe.Z,{icon:"user",onClick:r},S("Contacts")),o.ZP.createElement(xe.Z,{icon:"settings",onClick:i},S("Settings")),o.ZP.createElement(xe.Z,{icon:"darkmode",onClick:O},o.ZP.createElement("span",{className:"menu-item-name"},S("lng_menu_night_mode")),o.ZP.createElement(Fe.Z,{id:"darkmode",label:S("dark"===y?"lng_settings_disable_night_theme":"lng_settings_enable_night_theme"),checked:"dark"===y,noAnimation:!0})),o.ZP.createElement(xe.Z,{icon:"animations",onClick:U},o.ZP.createElement("span",{className:"menu-item-name capitalize"},S("Appearance.Animations").toLowerCase()),o.ZP.createElement(Fe.Z,{id:"animations",label:"Toggle Animations",checked:Z>0})),o.ZP.createElement(xe.Z,{icon:"help",onClick:()=>{w({langCode:S.code})}},S("TelegramFeatures")),o.ZP.createElement(xe.Z,{icon:"bug",href:s.mU},"Report Bug"),B&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(xe.Z,{icon:"char-K",href:"https://web.telegram.org/k/",onClick:()=>{(0,Ne.L)("K"),(0,Be.W8)(),(0,Ce.Wv)()}},"Switch to K Version"),o.ZP.createElement(xe.Z,{icon:"char-W",href:"https://web.telegram.org/?legacy=1",onClick:Ce.Wv},"Switch to Old Version"))),o.ZP.createElement(Oe.Z,{inputId:"telegram-search-input",parentContainerClassName:"LeftSearch",className:v||I?"with-picker-item":"",value:t||u,focused:F,isLoading:g,placeholder:$,autoComplete:"off",canClose:Boolean(v||I),onChange:n,onReset:l,onFocus:x},k&&o.ZP.createElement(Ue.Z,{icon:"calendar",title:k,canClose:!0,isMinimized:Boolean(v),className:"search-date",onClick:b,clickArg:{date:void 0}}),v&&o.ZP.createElement(Ue.Z,{chatOrUserId:v,onClick:M,canClose:!0,clickArg:{id:void 0}}))))})));var je=n(9204);const Qe=(0,o.X$)((()=>{const e=(0,ke.Z)();return o.ZP.createElement("div",{id:"ConnectionState",dir:e.isRtl?"rtl":void 0},o.ZP.createElement(je.Z,{color:"black"}),o.ZP.createElement("div",{className:"state-text"},e("WaitingForNetwork")))}));var qe=n(1174),Ge=n(6071),He=n(3133),_e=n(1080);const ze=(0,o.X$)((0,a.c$)((e=>{const{chats:{listIds:t,byId:n},users:{byId:a},chatFolders:{byId:s,orderedIds:o,activeChatFolder:i},currentUserId:c,lastSyncTime:d,shouldSkipHistoryAnimations:l}=e;return{allListIds:t,chatsById:n,usersById:a,chatFoldersById:s,orderedFolderIds:o,lastSyncTime:d,notifySettings:(0,r.dZ)(e),notifyExceptions:(0,r.NJ)(e),activeChatFolder:i,currentUserId:c,shouldSkipHistoryAnimations:l}}))((({allListIds:e,chatsById:t,usersById:n,chatFoldersById:i,notifySettings:r,notifyExceptions:c,orderedFolderIds:l,activeChatFolder:u,currentUserId:m,lastSyncTime:p,shouldSkipHistoryAnimations:f,foldersDispatch:v,onScreenSelect:I})=>{const{loadChatFolders:y,setActiveChatFolder:Z,openChat:P}=(0,a.uC)(),C=(0,o.sO)(null),w=(0,ke.Z)();(0,o.d4)((()=>{p&&y()}),[p,y]);const b=(0,o.Ye)((()=>l?l.map((e=>i[e]||{})).filter(Boolean):void 0),[i,l]),E=function(a,s,i){const l=(0,Ge.Z)(3e3,!0),[u,m]=(0,o.eJ)(),[h,p,f]=(0,Me.Z)();return(0,le.ZP)(p,f),(0,Ie.Z)((()=>{h||l((()=>{m((()=>{if(!b||!b.length)return;const a=b.map((a=>{const{unreadDialogsCount:s,hasActiveDialogs:o}=(0,d.Fu)(e,t,n,a,r,c)||{};return{id:a.id,badgeCount:s,isBadgeActive:o}}));return(0,g.ee)(a,"id")})())}))}),[...i,h]),u}(0,0,[b,e,t,n,r,c]),M=(0,o.Ye)((()=>{if(b&&b.length)return[{title:"en"===w.code?"All":w("FilterAllChats"),id:s.Nf},...b.map((e=>({title:e.title,...null==E?void 0:E[e.id]})))]}),[b,E,w]),S=(0,o.I4)((e=>{Z(e,{forceOnHeavyAnimation:!0})}),[Z]);(0,o.d4)((()=>{M&&M.length&&u>=M.length&&Z(0)}),[u,M,Z]),(0,o.d4)((()=>{if(C.current&&h.$b&&M&&M.length)return(0,qe.s)(C.current,{selectorToPreventScroll:".chat-list",onSwipe:(e,t)=>t===qe.e.Left?(Z(Math.min(u+1,M.length-1),{forceOnHeavyAnimation:!0}),!0):t===qe.e.Right&&(Z(Math.max(0,u-1),{forceOnHeavyAnimation:!0}),!0)})}),[u,M,Z]);const R=(0,o.sO)();R.current=0!==u,(0,o.d4)((()=>R.current?(0,we.Z)((()=>{R.current&&Z(0)})):void 0),[u,Z]),(0,Ce.ZP)(0!==u,(()=>Z(0,{forceOnHeavyAnimation:!0}))),(0,o.d4)((()=>{const e=e=>{if(e.ctrlKey&&e.shiftKey&&e.code.startsWith("Digit")&&M){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;if("0"===t)return void P({id:m,shouldReplaceHistory:!0});const n=Number(t)-1;if(n>M.length-1)return;Z(n,{forceOnHeavyAnimation:!0}),e.preventDefault()}};return document.addEventListener("keydown",e,!0),()=>{document.removeEventListener("keydown",e,!0)}}));const{shouldRender:k,transitionClassNames:T}=(0,pe.Z)(!l,void 0,!0);function N(e){const t=Object.values(i).find((({id:e})=>e===M[u].id));return t&&0!==u?o.ZP.createElement(_e.Z,{folderType:"folder",folderId:t.id,isActive:e,onScreenSelect:I,foldersDispatch:v}):o.ZP.createElement(_e.Z,{folderType:"all",isActive:e,foldersDispatch:v,onScreenSelect:I})}return o.ZP.createElement("div",{className:"ChatFolders"},null!=M&&M.length?o.ZP.createElement(He.Z,{tabs:M,activeTab:u,onSwitchTab:S}):k?o.ZP.createElement("div",{className:(0,ue.Z)("tabs-placeholder",T)}):void 0,o.ZP.createElement(Se.Z,{ref:C,name:f?"none":w.isRtl?"slide-optimized-rtl":"slide-optimized",activeKey:u,renderCount:M?M.length:void 0},N))})));var Ve=n(9203),Ye=n(8778),Xe=n(4288);const We=(0,o.X$)((e=>{const t=(0,Ye.Z)(Ve.gl.Extra,"LeftSearch");return t?o.ZP.createElement(t,e):o.ZP.createElement(Xe.Z,null)})),Ke=(0,o.X$)((e=>{const t=(0,Ye.Z)(Ve.gl.Extra,"ContactList");return t?o.ZP.createElement(t,e):o.ZP.createElement(Xe.Z,null)}));var Je=n(2328);let et;const tt=(0,o.X$)((({isShown:e,onNewPrivateChat:t,onNewChannel:n,onNewGroup:a})=>{const[s,i]=(0,o.eJ)(!1);(0,o.d4)((()=>{e||i(!1)}),[e]);const r=(0,ke.Z)(),c=(0,ue.Z)("NewChatButton",e&&"revealed",s&&"menu-is-open"),d=(0,o.I4)((()=>{et&&(clearTimeout(et),et=void 0)}),[]),l=(0,o.I4)((()=>{et&&(clearTimeout(et),et=void 0),et=window.setTimeout((()=>{i(!1)}),750)}),[]);return o.ZP.createElement("div",{className:c,onMouseEnter:d,onMouseLeave:l},o.ZP.createElement(Le.Z,{round:!0,color:"primary",className:s?"active":"",onClick:()=>{i(!s)},ariaLabel:r(s?"Close":"NewMessageTitle"),tabIndex:-1},o.ZP.createElement("i",{className:"icon-new-chat-filled"}),o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement(Je.Z,{isOpen:s,positionX:"right",positionY:"bottom",autoClose:!0,onClose:()=>{i(!1)}},o.ZP.createElement(xe.Z,{icon:"channel",onClick:n},r("NewChannel")),o.ZP.createElement(xe.Z,{icon:"group",onClick:a},r("NewGroup")),o.ZP.createElement(xe.Z,{icon:"user",onClick:t},r("NewMessageTitle"))))}));var nt=n(126);const at=Object.keys(m.du).length/2;let st;const ot=(0,a.c$)((e=>(0,g.ei)(e,["connectionState"])))((({content:e,searchQuery:t,searchDate:n,contactsFilter:a,shouldSkipTransition:s,foldersDispatch:i,onSearchQuery:r,onContentChange:c,onScreenSelect:d,onReset:l,connectionState:u})=>{const[g,p]=(0,o.eJ)(h.$b),f=!Re()||"connectionStateConnecting"===u,v=(0,o.sO)(!1),I=(0,o.I4)((()=>{c(m.du.Settings)}),[c]),y=(0,o.I4)((()=>{c(m.du.Contacts)}),[c]),Z=(0,o.I4)((()=>{c(m.du.NewChannelStep1)}),[c]),P=(0,o.I4)((()=>{c(m.du.NewGroupStep1)}),[c]),C=(0,o.I4)((()=>{c(m.du.Archived)}),[c]),w=(0,o.I4)((()=>{e===m.du.ChatList&&(v.current=!0,p(!0))}),[e]),b=(0,o.I4)((()=>{v.current=!1,st&&(clearTimeout(st),st=void 0),st=window.setTimeout((()=>{v.current||p(!1)}),250)}),[]);(0,o.d4)((()=>{let t;return e!==m.du.ChatList?t=window.setTimeout((()=>{p(!1)}),250):(v.current||h.$b)&&p(!0),()=>{t&&(clearTimeout(t),t=void 0)}}),[e]);const[E,M,S]=function(){const[e,t]=(0,Me.Z)(!1);(0,o.d4)((()=>{const e=window.setTimeout(t,2592e5);return()=>{clearTimeout(e)}}),[t]);const{shouldRender:n,transitionClassNames:a}=(0,pe.Z)(e);return[n,a,()=>{window.location.reload()}]}(),R=(0,ke.Z)();return o.ZP.createElement("div",{id:"LeftColumn-main",onMouseEnter:h.$b?void 0:w,onMouseLeave:h.$b?void 0:b},o.ZP.createElement(De,{content:e,contactsFilter:a,onSearchQuery:r,onSelectSettings:I,onSelectContacts:y,onSelectArchived:C,onReset:l,shouldSkipTransition:s}),o.ZP.createElement(nt.Z,{isOpen:f,isCustom:!0,className:"connection-state-wrapper opacity-transition slow"},(()=>o.ZP.createElement(Qe,null))),o.ZP.createElement(Se.Z,{name:s?"none":"zoom-fade",renderCount:at,activeKey:e,shouldCleanup:!0,cleanupExceptionKey:m.du.ChatList,className:f?"pull-down":void 0},(s=>{switch(e){case m.du.ChatList:return o.ZP.createElement(ze,{onScreenSelect:d,foldersDispatch:i});case m.du.GlobalSearch:return o.ZP.createElement(We,{searchQuery:t,searchDate:n,isActive:s,onReset:l});case m.du.Contacts:return o.ZP.createElement(Ke,{filter:a,isActive:s,onReset:l});default:return}})),E&&o.ZP.createElement(Le.Z,{fluid:!0,pill:!0,className:(0,ue.Z)("btn-update",M),onClick:S},R("lng_update_telegram")),o.ZP.createElement(tt,{isShown:g,onNewPrivateChat:y,onNewChannel:Z,onNewGroup:P}))})),it=(0,o.X$)((e=>{const t=(0,Ye.Z)(Ve.gl.Extra,"Settings");return t?o.ZP.createElement(t,e):o.ZP.createElement(Xe.Z,null)})),rt=(0,o.X$)((e=>{const t=(0,Ye.Z)(Ve.gl.Extra,"NewChat");return t?o.ZP.createElement(t,e):o.ZP.createElement(Xe.Z,null)})),ct=(0,o.X$)((e=>{const t=(0,Ye.Z)(Ve.gl.Extra,"ArchivedChats");return t?o.ZP.createElement(t,e):o.ZP.createElement(Xe.Z,null)}));var dt;!function(e){e[e.Main=0]="Main",e[e.Settings=1]="Settings",e[e.Archived=2]="Archived",e[e.NewGroup=3]="NewGroup",e[e.NewChannel=4]="NewChannel"}(dt||(dt={}));const lt=Object.keys(dt).length/2,ut=(0,o.X$)((0,a.c$)((e=>{const{globalSearch:{query:t,date:n},chatFolders:{activeChatFolder:a},shouldSkipHistoryAnimations:s,leftColumnWidth:o}=e;return{searchQuery:t,searchDate:n,activeChatFolder:a,shouldSkipHistoryAnimations:s,leftColumnWidth:o}}))((({searchQuery:e,searchDate:t,activeChatFolder:n,shouldSkipHistoryAnimations:s,leftColumnWidth:i})=>{const{setGlobalSearchQuery:r,setGlobalSearchChatId:c,resetChatCreation:d,setGlobalSearchDate:l,loadPasswordInfo:u,clearTwoFaError:g,setLeftColumnWidth:p,resetLeftColumnWidth:f}=(0,a.uC)(),v=(0,o.sO)(null),[I,y]=(0,o.eJ)(m.du.ChatList),[Z,P]=(0,o.eJ)(m.MT.Main),[C,w]=(0,o.eJ)(""),[b,E]=(0,Ee.ZP)(),[M,S]=(0,o.eJ)(0);let R=dt.Main;switch(I){case m.du.Archived:R=dt.Archived;break;case m.du.Settings:R=dt.Settings;break;case m.du.NewChannelStep1:case m.du.NewChannelStep2:R=dt.NewChannel;break;case m.du.NewGroupStep1:case m.du.NewGroupStep2:R=dt.NewGroup}const k=(0,o.I4)((e=>{if(I!==m.du.NewGroupStep2||e)if(I!==m.du.NewChannelStep2||e){if(I===m.du.NewGroupStep1){const e=document.getElementById("new-group-picker-search");e&&e.blur()}if(I===m.du.Settings)switch(Z){case m.MT.EditProfile:case m.MT.Folders:case m.MT.General:case m.MT.Notifications:case m.MT.DataStorage:case m.MT.Privacy:case m.MT.Language:return void P(m.MT.Main);case m.MT.GeneralChatBackground:case m.MT.QuickReaction:return void P(m.MT.General);case m.MT.GeneralChatBackgroundColor:return void P(m.MT.GeneralChatBackground);case m.MT.PrivacyPhoneNumber:case m.MT.PrivacyLastSeen:case m.MT.PrivacyProfilePhoto:case m.MT.PrivacyForwarding:case m.MT.PrivacyGroupChats:case m.MT.PrivacyActiveSessions:case m.MT.PrivacyBlockedUsers:case m.MT.TwoFaDisabled:case m.MT.TwoFaEnabled:case m.MT.TwoFaCongratulations:return void P(m.MT.Privacy);case m.MT.PrivacyPhoneNumberAllowedContacts:case m.MT.PrivacyPhoneNumberDeniedContacts:return void P(m.MT.PrivacyPhoneNumber);case m.MT.PrivacyLastSeenAllowedContacts:case m.MT.PrivacyLastSeenDeniedContacts:return void P(m.MT.PrivacyLastSeen);case m.MT.PrivacyProfilePhotoAllowedContacts:case m.MT.PrivacyProfilePhotoDeniedContacts:return void P(m.MT.PrivacyProfilePhoto);case m.MT.PrivacyForwardingAllowedContacts:case m.MT.PrivacyForwardingDeniedContacts:return void P(m.MT.PrivacyForwarding);case m.MT.PrivacyGroupChatsAllowedContacts:case m.MT.PrivacyGroupChatsDeniedContacts:return void P(m.MT.PrivacyGroupChats);case m.MT.TwoFaNewPassword:return void P(m.MT.TwoFaDisabled);case m.MT.TwoFaNewPasswordConfirm:return void P(m.MT.TwoFaNewPassword);case m.MT.TwoFaNewPasswordHint:return void P(m.MT.TwoFaNewPasswordConfirm);case m.MT.TwoFaNewPasswordEmail:return void P(m.MT.TwoFaNewPasswordHint);case m.MT.TwoFaNewPasswordEmailCode:return void P(m.MT.TwoFaNewPasswordEmail);case m.MT.TwoFaChangePasswordCurrent:case m.MT.TwoFaTurnOff:case m.MT.TwoFaRecoveryEmailCurrentPassword:return void P(m.MT.TwoFaEnabled);case m.MT.TwoFaChangePasswordNew:return void P(m.MT.TwoFaChangePasswordCurrent);case m.MT.TwoFaChangePasswordConfirm:return void P(m.MT.TwoFaChangePasswordNew);case m.MT.TwoFaChangePasswordHint:return void P(m.MT.TwoFaChangePasswordConfirm);case m.MT.TwoFaRecoveryEmail:return void P(m.MT.TwoFaRecoveryEmailCurrentPassword);case m.MT.TwoFaRecoveryEmailCode:return void P(m.MT.TwoFaRecoveryEmail);case m.MT.FoldersCreateFolder:case m.MT.FoldersEditFolder:return void P(m.MT.Folders);case m.MT.FoldersIncludedChatsFromChatList:case m.MT.FoldersExcludedChatsFromChatList:return void P(m.MT.FoldersEditFolderFromChatList);case m.MT.FoldersEditFolderFromChatList:return y(m.du.ChatList),void P(m.MT.Main)}I!==m.du.ChatList||0!==n?(y(m.du.ChatList),w(""),r({query:""}),l({date:void 0}),c({id:void 0}),d(),setTimeout((()=>{S(Date.now())}),250)):y(m.du.GlobalSearch)}else y(m.du.NewChannelStep1);else y(m.du.NewGroupStep1)}),[I,n,Z,r,l,c,d]),T=(0,o.I4)((t=>{I!==m.du.Contacts?(y(m.du.GlobalSearch),t!==e&&r({query:t})):w(t)}),[I,e,r]);(0,o.d4)((()=>I!==m.du.ChatList||0===n?(0,we.Z)((()=>k())):void 0),[n,I,k]),(0,o.d4)((()=>{if(I!==m.du.GlobalSearch)return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)};function e(e){(h.jm&&e.metaKey||!h.jm&&e.ctrlKey)&&e.shiftKey&&"f"===(0,be.Z)(e)&&(e.preventDefault(),y(m.du.GlobalSearch))}}),[I]),(0,o.d4)((()=>{g(),Z===m.MT.Privacy&&u()}),[g,u,Z]);const{initResize:N,resetResize:B,handleMouseUp:A}=((e,t,n,a)=>{const[s,i,r]=(0,Me.Z)(),[c,d]=(0,o.eJ)(),[l,u]=(0,o.eJ)();(0,o.d4)((()=>{e.current&&a&&(e.current.style.width=`${a}px`)}),[e,a]);const m=()=>{document.body.classList.remove("no-selection","cursor-ew-resize")};return(0,o.d4)((()=>{if(!s)return;const n=t=>{const n=Math.ceil(l+t.clientX-c);e.current.style.width=`${n}px`},a=()=>{m(),document.removeEventListener("mousemove",n,!1),document.removeEventListener("mouseup",a,!1),document.removeEventListener("blur",a,!1),t(e.current.offsetWidth),r()};document.addEventListener("mousemove",n,!1),document.addEventListener("mouseup",a,!1),document.addEventListener("blur",a,!1)}),[l,c,e,t,s,r]),{initResize:t=>{document.body.classList.add("no-selection","cursor-ew-resize"),d(t.clientX),u(e.current.offsetWidth),i()},resetResize:t=>{t.preventDefault(),e.current.style.width="",n()},handleMouseUp:m}})(v,p,f,i),x=e=>{y(m.du.Settings),P(e)};return o.ZP.createElement("div",{id:"LeftColumn",ref:v},o.ZP.createElement(Se.Z,{name:s?"none":h.s0,renderCount:lt,activeKey:R,shouldCleanup:!0,cleanupExceptionKey:dt.Main},(n=>{switch(R){case dt.Archived:return o.ZP.createElement(ct,{isActive:n,onReset:k,onContentChange:y});case dt.Settings:return o.ZP.createElement(it,{isActive:n,currentScreen:Z,foldersState:b,foldersDispatch:E,onScreenSelect:x,onReset:k,shouldSkipTransition:s});case dt.NewChannel:return o.ZP.createElement(rt,{key:M,isActive:n,isChannel:!0,content:I,onContentChange:y,onReset:k});case dt.NewGroup:return o.ZP.createElement(rt,{key:M,isActive:n,content:I,onContentChange:y,onReset:k});default:return o.ZP.createElement(ot,{content:I,searchQuery:e,searchDate:t,contactsFilter:C,foldersDispatch:E,onContentChange:y,onSearchQuery:T,onScreenSelect:x,onReset:k,shouldSkipTransition:s})}})),o.ZP.createElement("div",{className:"resize-handle",onMouseDown:N,onMouseUp:A,onDoubleClick:B}))})));var mt=n(2420),ht=n(5780),gt=n(9524),pt=n(1394);const ft=()=>{const[e,t]=(0,o.eJ)(Y.Z.get());return(0,o.d4)((()=>{const e=(0,C.P2)((()=>{t(Y.Z.get())}),250,!1);return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e};var vt=n(2678),It=n(7204),yt=n(5326),Zt=n(3570),Pt=n(5790),Ct=n(8360),wt=n(2155),bt=n(6058),Et=n(8799);const Mt=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"HeaderMenuContainer",!t);return n?o.ZP.createElement(n,e):void 0})),St=(0,o.X$)((0,a.c$)(((e,{chatId:t,threadId:n,messageListType:a})=>{var s;const o=(0,r.Z1)(e,t),i=Boolean(o&&(0,d.eA)(o));if(!o||o.isRestricted||(0,r.CA)(e))return{noMenu:!0};const c=(0,r.IK)(e,t),l=(0,r.FM)(e,t),m="thread"===a&&n===u._f,g="thread"===a&&n!==u._f,p=(0,r.Jf)(e),f=Boolean(c&&(0,r.s4)(e,c.id)),v=!f&&Boolean((0,r.pk)(e,t)),I=Boolean(m&&(i||(0,d.ZV)(o))&&o.isNotJoined);return{noMenu:!1,isChannel:i,isRightColumnShown:p,canStartBot:v,canRestartBot:f,canSubscribe:I,canSearch:m||g,canCall:h.Bi&&(0,d.YC)(o.id)&&!l&&!c,canMute:m&&!l&&!I,canLeave:m&&!I,canEnterVoiceChat:h.Bi&&o.isCallActive,canCreateVoiceChat:h.Bi&&!o.isCallActive&&((null===(s=o.adminRights)||void 0===s?void 0:s.manageCall)||o.isCreator&&(0,d.G9)(o))}}))((({chatId:e,threadId:t,noMenu:n,isChannel:s,canStartBot:i,canRestartBot:r,canSubscribe:c,canSearch:d,canCall:l,canMute:u,canLeave:m,canEnterVoiceChat:g,canCreateVoiceChat:p,isRightColumnShown:f,canExpandActions:v})=>{const{joinChannel:I,sendBotCommand:y,openLocalTextSearch:Z,restartBot:P,openCallFallbackConfirm:C}=(0,a.uC)(),w=(0,o.sO)(null),[b,E]=(0,o.eJ)(!1),[M,S]=(0,o.eJ)(void 0),R=(0,o.I4)((()=>{E(!0);const e=w.current.getBoundingClientRect();S({x:e.right,y:e.bottom})}),[]),k=(0,o.I4)((()=>{E(!1)}),[]),T=(0,o.I4)((()=>{S(void 0)}),[]),N=(0,o.I4)((()=>{I({chatId:e})}),[I,e]),B=(0,o.I4)((()=>{y({command:"/start"})}),[y]),A=(0,o.I4)((()=>{P({chatId:e})}),[e,P]),x=(0,o.I4)((()=>{Z(),h.wB?document.querySelector("#MobileSearch input").focus():setTimeout((()=>{const e=document.querySelector(".RightHeader .SearchInput input");e&&e.focus()}),400)}),[Z]);(0,o.d4)((()=>{if(d)return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)};function e(e){h.fl&&(h.jm&&e.metaKey||!h.jm&&e.ctrlKey)&&!e.shiftKey&&"f"===(0,be.Z)(e)&&(e.preventDefault(),x())}}),[d,x]);const L=(0,ke.Z)();return o.ZP.createElement("div",{className:"HeaderActions"},!h.wB&&o.ZP.createElement(o.ZP.Fragment,null,v&&c&&o.ZP.createElement(Le.Z,{size:"tiny",ripple:!0,fluid:!0,onClick:N},L(s?"ProfileJoinChannel":"ProfileJoinGroup")),v&&i&&o.ZP.createElement(Le.Z,{size:"tiny",ripple:!0,fluid:!0,onClick:B},L("BotStart")),v&&r&&o.ZP.createElement(Le.Z,{size:"tiny",ripple:!0,fluid:!0,onClick:A},L("BotRestart")),d&&o.ZP.createElement(Le.Z,{round:!0,ripple:f,color:"translucent",size:"smaller",onClick:x,ariaLabel:"Search in this chat"},o.ZP.createElement("i",{className:"icon-search"})),l&&o.ZP.createElement(Le.Z,{round:!0,color:"translucent",size:"smaller",onClick:C,ariaLabel:"Call"},o.ZP.createElement("i",{className:"icon-phone"}))),o.ZP.createElement(Le.Z,{ref:w,className:b?"active":"",round:!0,ripple:!h.wB,size:"smaller",color:"translucent",disabled:n,ariaLabel:"More actions",onClick:R},o.ZP.createElement("i",{className:"icon-more"})),M&&o.ZP.createElement(Mt,{chatId:e,threadId:t,isOpen:b,anchor:M,withExtraActions:h.wB||!v,isChannel:s,canStartBot:i,canRestartBot:r,canSubscribe:c,canSearch:d,canCall:l,canMute:u,canLeave:m,canEnterVoiceChat:g,canCreateVoiceChat:p,onSubscribeChannel:N,onSearchClick:x,onClose:k,onCloseAnimationEnd:T}))})));var Rt=n(4399),kt=n(2340),Tt=n(6202),Nt=n(862);function Bt(e){var t;const n=e&&(0,d.DH)(e),a=null==e||null===(t=e.content)||void 0===t?void 0:t.sticker,i=n&&a&&!(0,h.on)()&&n.includes("image/webp"),[r,c]=(0,o.eJ)(Nt.Hu),l=null==e?void 0:e.id;return(0,o.bt)((()=>{i&&(0,Nt.p6)(`b64-${l}`,n).then(c).catch((e=>{s.eM&&console.error(e)}))}),[l,i,n]),i?r:n}var At=n(7551),xt=n(8512);function Lt(e,t,n,a,s){return`M${e},${t+s}a${s},${s},0,0,1,\n ${n},0v${a-2*s}a${s},${s},0,0,1,${-n},0Z`}const Ot=(0,o.X$)((({count:e,index:t})=>{const n=(0,o.sO)(null),a=(0,o.Ye)((()=>function(e,t){const n=e-t-1,a=function(e){let t=8;return 1===e?t=36:2===e?t=17:3===e?t=11:(4===e||e>3)&&(t=7.5),t}(e),s=function(e,t){let n=36;return 1===e?n=36:2===e?n=17:3===e?n=1===t?12:11:(4===e||e>3)&&(n=7.5),n}(e,n),o=function(e,t){return e<=3?36:t*e+2*(e-1)}(e,a),i=`clipPath${e}`;return{markHeight:s,clipPath:function(e,t,n){let a="";if(3===n)a=Lt(0,0,2,t,1)+Lt(0,12,2,t+1,1)+Lt(0,25,2,t,1);else for(let e=0;e\n \n `}(i,a,e),markTranslateY:function(e,t,n){return 1===n?0:2===n?0===e?0:t+2:3===n?0===e?0:1===e?12:25:(t+2)*e}(n,a,e),trackTranslateY:function(e,t,n,a){return t<=4||e<=1?0:e>=t-2?a-36:(n+4)/2+(e-2)*(n+2)}(n,e,a,o),trackHeight:o,clipPathId:i}}(e,t)),[e,t]);if((0,o.d4)((()=>{if(!n.current)return;const{trackHeight:e,trackTranslateY:t,markHeight:s,markTranslateY:o,clipPathId:i,clipPath:r}=a,c=n.current.firstElementChild;if(null!=n&&n.current){const a=n.current,{style:d}=a;d.height=`${e}px`,d.transform=`translateY(-${t}px)`,d.clipPath=`url("#${i}")`;const l=a.querySelector("svg"),u=a.querySelector("div"),m=a.querySelector("defs");l||c&&(c.innerHTML=` ${r} `),m&&(m.innerHTML=r),u&&(u.style.height=`${s}px`,u.style.transform=`translateY(${o}px)`)}}),[a]),1===e)return o.ZP.createElement("div",{className:"pinned-message-border"},o.ZP.createElement("div",{className:"pinned-message-border-wrapper-1",ref:n}));const{trackHeight:s,trackTranslateY:i,markHeight:r,markTranslateY:c,clipPathId:d}=a;return o.ZP.createElement("div",{className:(0,ue.Z)("pinned-message-border",e>4&&"pinned-message-border-mask")},o.ZP.createElement("div",{className:"pinned-message-border-wrapper",ref:n,style:`clip-path: url("#${d}"); width: 2px;\n height: ${s}px; transform: translateY(-${i}px);`},o.ZP.createElement("span",null),o.ZP.createElement("div",{className:"pinned-message-border-mark",style:`height: ${r}px; transform: translateY(${c}px);`})))})),Ut=(0,o.X$)((({message:e,count:t,index:n,customTitle:a,className:s,onUnpinMessage:i,onClick:r,onAllPinnedClick:c})=>{const l=(0,ke.Z)(),u=Bt(e),m=(0,Tt.Z)((0,d.Ti)(e,"pictogram")),h=(0,d.MK)(l,e,Boolean(u)),[g,p,f]=(0,Me.Z)(),v=(0,o.I4)((()=>{f(),i&&i(e.id)}),[f,i,e.id]);return o.ZP.createElement("div",{className:(0,ue.Z)("HeaderPinnedMessage-wrapper",s)},t>1&&o.ZP.createElement(Le.Z,{round:!0,size:"smaller",color:"translucent",className:"pin-list-button",ariaLabel:l("EventLogFilterPinnedMessages"),onClick:c},o.ZP.createElement("i",{className:"icon-pin-list"})),i&&o.ZP.createElement(Le.Z,{round:!0,size:"smaller",color:"translucent",ariaLabel:l("UnpinMessageAlertTitle"),className:"unpin-button",onClick:p},o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement(At.Z,{isOpen:g,onClose:f,text:"Would you like to unpin this message?",confirmLabel:"Unpin",confirmHandler:v}),o.ZP.createElement("div",{className:"HeaderPinnedMessage",onClick:r,dir:l.isRtl?"rtl":void 0},o.ZP.createElement(Ot,{count:t,index:n}),u&&function(e,t){const{width:n,height:a}=(0,Rt.W7)();return o.ZP.createElement("img",{src:t||e,width:n,height:a,alt:""})}(u,m),o.ZP.createElement("div",{className:"message-text"},o.ZP.createElement("div",{className:"title",dir:"auto"},a||`${l("PinnedMessage")} ${n>0?"#"+(t-n):""}`),o.ZP.createElement("p",{dir:"auto"},(0,kt.Z)(h))),o.ZP.createElement(xt.Z,null)))}));var Ft=n(396),$t=n(4532),Dt=n(3186),jt=n(711);function Qt(e,t,n="image/png"){const a=e instanceof Blob?URL.createObjectURL(e):e,s=new Image;return new Promise((o=>{s.onload=()=>{qt(s,s.width*t,s.height*t,n).then((e=>URL.createObjectURL(e))).then(o).finally((()=>{e instanceof Blob&&URL.revokeObjectURL(a)}))},s.src=a}))}async function qt(e,t,n,a="image/png"){if(!("createImageBitmap"in window))return Gt(e,t,n,void 0,a);try{const s=await window.createImageBitmap(e,{resizeWidth:t,resizeHeight:n,resizeQuality:"high"});if(s.height!==n||s.width!==t)throw new Error("Image bitmap resize not supported!");return await new Promise((e=>{const t=document.createElement("canvas");t.width=s.width,t.height=s.height;const n=t.getContext("bitmaprenderer");n?n.transferFromImageBitmap(s):t.getContext("2d").drawImage(s,0,0),t.toBlob(e,a)}))}catch(s){return Gt(e,t,n,void 0,a)}}function Gt(e,t,n,a=.5,s="image/png"){const o=document.createElement("canvas"),i=o.getContext("2d"),r=document.createElement("canvas"),c=r.getContext("2d");if(o.width=t,o.height=n,e.width*a>t){const n=1/a;let s={width:Math.floor(e.width*a),height:Math.floor(e.height*a)};for(r.width=s.width,r.height=s.height,c.drawImage(e,0,0,s.width,s.height);s.width*a>t;)s={width:Math.floor(s.width*a),height:Math.floor(s.height*a)},c.drawImage(r,0,0,s.width*n,s.height*n,0,0,s.width,s.height);i.drawImage(r,0,0,s.width,s.height,0,0,o.width,o.height)}else i.drawImage(e,0,0,o.width,o.height);return new Promise((e=>{o.toBlob(e,s)}))}var Ht=n(4524);const _t={width:200,height:200},zt=115,Vt=(e,t,n)=>{const{audio:a,voice:s}=(0,d.qp)(e),i=a?a.title||a.fileName:s?"Voice message":"",r=a&&a.performer||t&&(0,d.OU)(jt.i0,t),c=n&&(0,d.U)(jt.i0,n)||"Telegram",l=a&&(0,d.MR)(a)&&(0,d.Ti)(e,"pictogram"),u=t&&(0,d.RT)(t,"big"),m=a&&l||s&&u,h=(0,Tt.Z)(m),g=(0,o.Ye)((()=>function(e,t,n){if(!n)return _t;if(e){if(!e.thumbnailSizes||0===e.thumbnailSizes.length)return;return e.thumbnailSizes.find((e=>"m"===e.type))||e.thumbnailSizes[0]}return t?Rt.vY:void 0}(a,s,h)),[a,h,s]),{result:p}=((e,t,n)=>{const[a,s]=(0,o.eJ)(!1),[i,r]=(0,o.eJ)(),[c,d]=(0,o.eJ)(n);return(0,o.d4)((()=>{s(!0);let e=!1;return function(e,t){if(!e)return Promise.resolve(Ht);if(!t)return function(e,t,n,a="image/png"){const s=e instanceof Blob?URL.createObjectURL(e):e,o=new Image;return new Promise((i=>{o.onload=()=>{qt(o,t,n,a).then((e=>URL.createObjectURL(e))).then(i).finally((()=>{e instanceof Blob&&URL.revokeObjectURL(s)}))},o.src=s}))}(e,zt,zt);const n=Math.min(t.width,t.height);return n{e||(s(!1),d(t))}),(t=>{e||(s(!1),r(t))})),()=>{e=!0}}),t),{isLoading:a,error:i,result:c}})(0,[h,g],Ht);return(0,o.Ye)((()=>(0,$t.Of)({title:i,artist:r,album:c,artwork:[{src:p}]})),[c,r,i,p])};var Yt=n(8051);const Xt=(0,a.c$)(((e,{message:t})=>{const n=(0,r.Ur)(e,t),a=(0,r.Z1)(e,t.chatId),{volume:s,playbackRate:o,isMuted:i}=e.audioPlayer;return{sender:n,chat:a,volume:s,playbackRate:o,isMuted:i}}))((({message:e,className:t,noUi:n,sender:s,chat:i,volume:r,playbackRate:c,isMuted:l})=>{const{setAudioPlayerVolume:u,setAudioPlayerPlaybackRate:m,setAudioPlayerMuted:g,focusMessage:p,closeAudioPlayer:f}=(0,a.uC)(),v=(0,ke.Z)(),{audio:I,voice:y,video:Z}=(0,d.qp)(e),P=Boolean(y||Z),C=s?(0,d.OU)(v,s):void 0,w=G.UV((0,d.Ti)(e,"inline")),b=Vt(e,s,i),{playPause:E,stop:M,isPlaying:S,requestNextTrack:R,requestPreviousTrack:k,isFirst:T,isLast:N,setVolume:B,toggleMuted:A,setPlaybackRate:x}=(0,Dt.Z)((0,Ft.An)(e),(0,d.XV)(e),P?"voice":"audio",w,void 0,b,void 0,!0,void 0,void 0,(0,d.CI)(e),!0),L=P&&S;(0,o.d4)((()=>{if(L)return Y.Z.disableRefresh(),()=>{Y.Z.enableRefresh()}}),[L]);const O=(0,o.I4)((()=>{p({chatId:e.chatId,messageId:e.id})}),[p,e.chatId,e.id]),U=(0,o.I4)((()=>{S&&E(),f(),(0,$t.Ay)(),M()}),[f,S,E,M]),F=(0,o.I4)((e=>{u({volume:e/100}),g({isMuted:!1}),B(e/100)}),[g,u,B]),$=(0,o.I4)((()=>{h.$b&&!h.cj||(A(),g({isMuted:!l}))}),[l,g,A]),D=(0,o.I4)((()=>{1===c?(x(1.8),m({playbackRate:1.8})):(x(1),m({playbackRate:1}))}),[c,m,x]),j=(0,o.Ye)((()=>0===r||l?"icon-muted":r<.3?"icon-volume-1":r<.6?"icon-volume-2":"icon-volume-3"),[r,l]);if(!n)return o.ZP.createElement("div",{className:(0,ue.Z)("AudioPlayer",t),dir:v.isRtl?"rtl":void 0},o.ZP.createElement(Le.Z,{round:!0,ripple:!h.wB,color:"translucent",size:"smaller",className:"player-button",disabled:T(),onClick:k,ariaLabel:"Previous track"},o.ZP.createElement("i",{className:"icon-skip-previous"})),o.ZP.createElement(Le.Z,{round:!0,ripple:!h.wB,color:"translucent",size:"smaller",className:(0,ue.Z)("toggle-play","player-button",S?"pause":"play"),onClick:E,ariaLabel:S?"Pause audio":"Play audio"},o.ZP.createElement("i",{className:"icon-play"}),o.ZP.createElement("i",{className:"icon-pause"})),o.ZP.createElement(Le.Z,{round:!0,ripple:!h.wB,color:"translucent",size:"smaller",className:"player-button",disabled:N(),onClick:R,ariaLabel:"Next track"},o.ZP.createElement("i",{className:"icon-skip-next"})),o.ZP.createElement("div",{className:"AudioPlayer-content",onClick:O},I?function(e){const{title:t,performer:n,fileName:a}=e;return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("div",{className:"title",dir:"auto"},(0,kt.Z)(t||a)),n&&o.ZP.createElement("div",{className:"subtitle",dir:"auto"},(0,kt.Z)(n)))}(I):function(e,t){return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("div",{className:"title",dir:"auto"},t&&(0,kt.Z)(t)),o.ZP.createElement("div",{className:"subtitle",dir:"auto"},e))}(v("AttachAudio"),C),o.ZP.createElement(xt.Z,null)),o.ZP.createElement(Le.Z,{round:!0,className:"player-button volume-button",color:"translucent",size:"smaller",ariaLabel:"Volume",withClickPropagation:!0},o.ZP.createElement("i",{className:j,onClick:$}),!h.cj&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("div",{className:"volume-slider-spacer"}),o.ZP.createElement("div",{className:"volume-slider"},o.ZP.createElement(Yt.Z,{value:l?0:100*r,onChange:F})))),P&&o.ZP.createElement(Le.Z,{round:!0,className:(0,ue.Z)("playback-button",1!==c&&"applied"),color:"translucent",size:"smaller",ariaLabel:"Playback Rate",ripple:!h.wB,onClick:D},o.ZP.createElement("span",{className:"playback-button-inner"},"2Х")),o.ZP.createElement(Le.Z,{round:!0,className:"player-close",color:"translucent",size:"smaller",onClick:U,ariaLabel:"Close player"},o.ZP.createElement("i",{className:"icon-close"})))}));var Wt=n(2607),Kt=n(172);const Jt=(0,o.X$)((0,a.c$)(((e,{chatId:t})=>{const n=(0,r.Z1)(e,t),a=(0,Wt.Bj)(e,t);return{groupCall:a,usersById:e.users.byId,chatsById:e.chats.byId,activeGroupCallId:e.groupCalls.activeGroupCallId,isActive:(a?a.participantsCount>0&&a.isLoaded:n&&n.isCallNotEmpty&&n.isCallActive)&&e.groupCalls.activeGroupCallId!==(null==a?void 0:a.id)}}))((({chatId:e,isActive:t,groupCall:n,hasPinnedOffset:s,usersById:i,chatsById:r})=>{const{joinGroupCall:c,subscribeToGroupCallUpdates:d}=(0,a.uC)(),l=(0,ke.Z)(),u=(0,o.I4)((()=>{c({chatId:e})}),[c,e]),m=null==n?void 0:n.participants,h=(0,o.Ye)((()=>m?Object.values(m).filter(((e,t)=>t<3)).map((({id:e,isUser:t})=>{if(t){if(!i[e])return;return{user:i[e]}}if(r[e])return{chat:r[e]}})).filter(Boolean):[]),[r,m,i]);if((0,o.d4)((()=>{if(null!=n&&n.id&&(t||!n.isLoaded))return d({id:n.id,subscribed:!0}),()=>{d({id:n.id,subscribed:!1})}}),[null==n?void 0:n.id,null==n?void 0:n.isLoaded,t,d]),n)return o.ZP.createElement("div",{className:(0,ue.Z)("GroupCallTopPane",s&&"has-pinned-offset",!t&&"is-hidden"),onClick:u},o.ZP.createElement("div",{className:"info"},o.ZP.createElement("span",{className:"title"},l("VoipGroupVoiceChat")),o.ZP.createElement("span",{className:"participants"},l("Participants",n.participantsCount||0,"i"))),o.ZP.createElement("div",{className:"avatars"},h.map((e=>{if(e)return e.user?o.ZP.createElement(Kt.Z,{key:e.user.id,user:e.user}):o.ZP.createElement(Kt.Z,{key:e.chat.id,chat:e.chat})}))),o.ZP.createElement(Le.Z,{round:!0,className:"join"},l("VoipChatJoin")))}))),en=(0,o.X$)((0,a.c$)(((e,{chatId:t,threadId:n,messageListType:a})=>{const{isLeftColumnShown:s,lastSyncTime:o,shouldSkipHistoryAnimations:i}=e,c=(0,r.Z1)(e,t),{typingStatus:d}=c||{},{chatId:l,messageId:m}=e.audioPlayer,h=l&&m?(0,r.hj)(e,l,m):void 0;let g;if("pinned"===a){const n=(0,r.KB)(e,t);g=null==n?void 0:n.length}else if("scheduled"===a){const n=(0,r.qy)(e,t);g=null==n?void 0:n.length}else if("thread"===a&&n!==u._f){const a=(0,r.tZ)(e,t,n);g=(null==a?void 0:a.messagesCount)||0}const p={typingStatus:d,isLeftColumnShown:s,isRightColumnShown:(0,r.Jf)(e),isSelectModeActive:(0,r.CA)(e),audioMessage:h,chat:c,messagesCount:g,isChatWithSelf:(0,r.FM)(e,t),isChatWithBot:c&&(0,r.xo)(e,c),lastSyncTime:o,shouldSkipHistoryAnimations:i,currentTransitionKey:Math.max(0,e.messages.messageLists.length-1),connectionState:e.connectionState},f=(0,r.Zw)(e,t);if("thread"!==a||!f)return p;if(Object.assign(p,{messagesById:f}),n!==u._f){const a=(0,r.qS)(e,t,n),s=a?(0,r.hj)(e,t,a):void 0,o=s?(0,r.cv)(e,s):void 0;return{...p,pinnedMessageIds:a,canUnpin:!1,topMessageSender:o}}const v=(0,r.KB)(e,t);if(null!=v&&v.length){const t=f[v[0]],{canUnpin:a}=t&&(0,r._k)(e,t,n)||{};return{...p,pinnedMessageIds:v,canUnpin:a}}return p}))((({chatId:e,threadId:t,messageListType:n,isReady:i,pinnedMessageIds:c,messagesById:l,canUnpin:m,topMessageSender:g,typingStatus:p,isSelectModeActive:f,isLeftColumnShown:v,isRightColumnShown:I,audioMessage:y,chat:Z,messagesCount:P,isChatWithSelf:C,isChatWithBot:w,lastSyncTime:b,shouldSkipHistoryAnimations:E,currentTransitionKey:M,connectionState:S})=>{const{openChatWithInfo:R,pinMessage:k,focusMessage:T,openChat:N,openPreviousChat:B,loadPinnedMessages:A,toggleLeftColumn:x,exitMessageSelectMode:L}=(0,a.uC)(),O=(0,ke.Z)(),U=(0,o.sO)(!0),[F,$]=(0,o.eJ)(0),D=Array.isArray(c)?c[F]:c,j=l&&D?l[D]:void 0,Q=Array.isArray(c)?c.length:c?1:void 0,q=Z&&(0,d.U)(O,Z).length,G=g?(0,d.OU)(O,g):void 0;(0,o.d4)((()=>{t===u._f&&b&&i&&A({chatId:e})}),[e,A,b,t,i]),(0,o.d4)((()=>{$(0)}),[c]),(0,Pt.Z)(e,D,j);const{width:H}=ft(),_=H<=s.ks,z=h.p7&&v,V=(0,o.sO)(null),Y=(0,o.sO)(!0),X=(0,o.I4)((()=>{R({id:e})}),[R,e]),W=(0,o.I4)((t=>{k({chatId:e,messageId:t,isUnpin:!0})}),[k,e]),K=(0,o.I4)((()=>{if(j){T({chatId:j.chatId,threadId:t,messageId:j.id});const e=(0,Zt.Z)(Q||1,F+1);$(e)}}),[j,T,t,Q,F]),J=(0,o.I4)((()=>{N({id:e,threadId:u._f,type:"pinned"})}),[N,e]),ee=(0,o.I4)((()=>{setTimeout((()=>{U.current=!0}),450)}),[]),te=(0,o.I4)((e=>{if(U.current){if(U.current=!1,h.wB){const e=document.getElementById(s.R2);e&&e.blur()}if(f)return L(),void ee();if(t===u._f&&"thread"===n&&0===M)return h.wB||z?(e.stopPropagation(),N({id:void 0})):x(),void ee();B(),ee()}}),[t,n,M,f,B,z,N,x,L,ee]),ne=(0,o.Ye)((()=>{if(_)return(0,r.A1)((0,a.Rd)())||void 0}),[_]),ae=H>=s.ks&&Hs.l3&&H30),se=ae||H>s._m&&H{const e=V.current;if(e)return se&&fe?void(I||ae?(Y.current&&(e.classList.add("tools-stacked","animated"),Y.current=!1),setTimeout((()=>{e.classList.remove("animated")}),350)):(e.classList.remove("tools-stacked"),Y.current=!0)):(e.classList.remove("tools-stacked","animated"),void(Y.current=!0))}),[se,fe,ae,I]);const ve=(!Re()||"connectionStateConnecting"===S)&&(h.wB||h.p7&&!z);function Ie(){return ve?o.ZP.createElement(o.ZP.Fragment,null,ye(),o.ZP.createElement("h3",null,O("WaitingForNetwork"))):"thread"===n&&t===u._f?o.ZP.createElement(o.ZP.Fragment,null,(_||M>0)&&ye(z,!0),o.ZP.createElement("div",{className:"chat-info-wrapper",onClick:X},(0,d.YC)(e)?o.ZP.createElement(bt.Z,{userId:e,typingStatus:p,withFullInfo:w,withMediaViewer:!0,withUpdatingStatus:!0,noRtl:!0}):o.ZP.createElement(Et.Z,{chatId:e,typingStatus:p,noRtl:!0,withMediaViewer:!0,withFullInfo:!0,withUpdatingStatus:!0}))):"thread"===n?o.ZP.createElement(o.ZP.Fragment,null,ye(),o.ZP.createElement("h3",null,O("CommentsCount",P,"i"))):"pinned"===n?o.ZP.createElement(o.ZP.Fragment,null,ye(),o.ZP.createElement("h3",null,O("PinnedMessagesCount",P,"i"))):"scheduled"===n?o.ZP.createElement(o.ZP.Fragment,null,ye(),o.ZP.createElement("h3",null,C?O("Reminders"):O("messages",P,"i"))):void 0}function ye(e=!1,t=!1){return o.ZP.createElement("div",{className:"back-button"},o.ZP.createElement(Le.Z,{round:!0,size:"smaller",color:"translucent",onClick:te,ariaLabel:O(e?"Close":"Back")},o.ZP.createElement("div",{className:(0,ue.Z)("animated-close-icon",!e&&"state-back")})),t&&ne&&o.ZP.createElement("div",{className:"unread-count active"},(0,wt.bi)(ne)))}const Ze=Boolean(oe&&re);return o.ZP.createElement("div",{className:"MiddleHeader",ref:V},o.ZP.createElement(Se.Z,{name:E?"none":"slide-fade",activeKey:ve?1/0:M},Ie),o.ZP.createElement(Jt,{hasPinnedOffset:ce&&!!le||oe&&!!re,chatId:e}),ce&&le&&o.ZP.createElement(Ut,{key:e,message:le,count:me||0,index:F,customTitle:ge,className:(0,ue.Z)(de,Ze&&"full-width"),onUnpinMessage:he?W:void 0,onClick:K,onAllPinnedClick:J}),o.ZP.createElement("div",{className:"header-tools"},Ze&&o.ZP.createElement(Xt,{key:(0,d.Tp)(re),message:re,className:ie}),o.ZP.createElement(St,{chatId:e,threadId:t,messageListType:n,canExpandActions:!Ze})))})));var tn=n(2645),nn=n(274);function an(e){return"albumId"in e}function sn(e,t){let n,a=[],s={originalDate:e[0].date,datetime:Number((0,N.$Y)(1e3*e[0].date)),senderGroups:[a]};const o=[s];return e.forEach(((i,r)=>{i.isInAlbum?n?(n.messages.push(i),i.content.text&&(n.mainMessage=i)):n={albumId:i.groupedId,messages:[i],mainMessage:i}:a.push(i);const c=e[r+1];if(!n||c&&c.groupedId&&c.groupedId===n.albumId||(a.push(n),n=void 0),c){const e=Number((0,N.$Y)(1e3*c.date));s.datetime!==e?(s={originalDate:c.date,datetime:e,senderGroups:[]},o.push(s),a=[],s.senderGroups.push(a)):(c.id===t||i.senderId!==c.senderId||i.isOutgoing!==c.isOutgoing||(0,d.Lo)(i)||(0,d.Lo)(c)||i.forwardInfo&&c.forwardInfo&&(i.forwardInfo.senderUserId!==c.forwardInfo.senderUserId||i.forwardInfo.fromChatId!==c.forwardInfo.fromChatId||i.forwardInfo.hiddenUserName!==c.forwardInfo.hiddenUserName)||i.inlineButtons||c.inlineButtons||c.date-i.date>600)&&(a=[],s.senderGroups.push(a))}})),o}var on=n(386),rn=n(2202);var cn=n(7675),dn=n(539),ln=n(2357),un=n(3657);const mn=h.wZ?1e3:350,hn=h.wB?300:500;var gn=n(7240),pn=n(935);function fn(e){return"number"==typeof e}function vn(e,t){return e?t?238:175:t?238:100}function In(e,t){const n=(0,d.B4)(e),a=(0,d.MF)(e),s=(0,d.O$)(e)||(0,d.F$)(e),o=(0,d.b7)(e),i=Boolean((0,d.F$)(e)),{width:r,height:c}=s?(0,Rt.Eh)(s,n,a,i,t):(0,Rt.GC)(o,n,a,t),l=vn(Boolean((0,d.UD)(e)));let u=1;re+t),t)}function Zn(e,t,n){return en?n:e}function Pn(e){const t={width:0,height:0};return e.forEach((({dimensions:e,sides:n})=>{2&n&&(t.width=e.width+e.x),4&n&&(t.height=e.height+e.y)})),t}function Cn(e,t,n,a){const s=function(e){return e.map((e=>{const t=In(e);return t.width/t.height}))}(a.messages),o=function(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}(s),i=function(e){return e.reduce(((e,t)=>t+e),1)/e.length}(s),r=s.length,c=s.some((e=>e>2)),d=(0,Rt.kc)(e,t,!1,n)-(t?2.5:0)*Rt.Gw;let l;const u={ratios:s,proportions:o,averageRatio:i,maxWidth:d,minWidth:100,maxHeight:d,spacing:2};return l=r>=5||c?function({ratios:e,averageRatio:t,maxWidth:n,minWidth:a,spacing:s,maxHeight:o=4*n/3}){const i=function(e,t){return e.map((e=>t>1.1?Zn(e,1,2.75):Zn(e,.6667,1)))}(e,t),r=e.length,c=new Array(r),d=[],l=e=>{const t=[];let a=0;e.forEach((e=>{t.push(((e,t)=>{const a=yn(i.slice(e,e+t),0);return(n-(t-1)*s)/a})(a,e)),a+=e})),d.push({lineCounts:e,heights:t})};for(let e=1;e!==r;++e){const t=r-e;e<=3&&t<=3&&l([e,t])}for(let e=1;e!==r-1;++e)for(let n=1;n!==r-e;++n){const a=r-e-n;e<=3&&n<=(t<.85?4:3)&&a<=3&&l([e,n,a])}for(let e=1;e!==r-1;++e)for(let t=1;t!==r-e;++t)for(let n=1;n!==r-e-t;++n){const a=r-e-t-n;e<=3&&t<=3&&n<=3&&a<=4&&l([e,t,n,a])}let u,m=0;for(let e=0;e{for(let e=1;e!==i;++e)if(n[e-1]>n[e])return 1.5;return 1})(),h=Math.abs(r-o)*c*l;(!u||h1.4&&t[1]-t[0]<.2?function(e){const{ratios:t,maxWidth:n,spacing:a,maxHeight:s}=e,o=Math.round(Math.min(n/t[0],Math.min(n/t[1],(s-a)/2)));return[{dimensions:{x:0,y:0,width:n,height:o},sides:11},{dimensions:{x:0,y:o+a,width:n,height:o},sides:14}]}(e):"ww"===n||"qq"===n?function(e){const{ratios:t,maxWidth:n,spacing:a,maxHeight:s}=e,o=(n-a)/2,i=Math.round(Math.min(o/t[0],Math.min(o/t[1],s)));return[{dimensions:{x:0,y:0,width:o,height:i},sides:13},{dimensions:{x:o+a,y:0,width:o,height:i},sides:7}]}(e):function(e){const{ratios:t,minWidth:n,maxWidth:a,spacing:s,maxHeight:o}=e,i=Math.round(1.5*n),r=Math.min(Math.round(Math.max(.4*(a-s),(a-s)/t[0]/(1/t[0]+1/t[1]))),a-s-i),c=a-r-s,d=Math.min(o,Math.round(Math.min(c/t[0],r/t[1])));return[{dimensions:{x:0,y:0,width:c,height:d},sides:13},{dimensions:{x:c+s,y:0,width:r,height:d},sides:7}]}(e)}(u):3===r?function(e){const{proportions:t}=e;return"n"===t[0]?function(e){const{maxHeight:t,spacing:n,ratios:a,maxWidth:s,minWidth:o}=e,i=t,r=Math.round(Math.min((t-n)/2,a[1]*(s-n)/(a[2]+a[1]))),c=i-r-n,d=Math.max(o,Math.round(Math.min((s-n)/2,Math.min(r*a[2],c*a[1])))),l=Math.min(Math.round(i*a[0]),s-n-d);return[{dimensions:{x:0,y:0,width:l,height:i},sides:13},{dimensions:{x:l+n,y:0,width:d,height:c},sides:3},{dimensions:{x:l+n,y:c+n,width:d,height:r},sides:6}]}(e):function(e){const{maxWidth:t,ratios:n,maxHeight:a,spacing:s}=e,o=t,i=Math.round(Math.min(o/n[0],.66*(a-s))),r=(t-s)/2,c=Math.min(a-i-s,Math.round(Math.min(r/n[1],r/n[2])));return[{dimensions:{x:0,y:0,width:o,height:i},sides:11},{dimensions:{x:0,y:i+s,width:r,height:c},sides:12},{dimensions:{x:r+s,y:i+s,width:o-r-s,height:c},sides:6}]}(e)}(u):function(e){const{proportions:t}=e;return"w"===t[0]?function({maxWidth:e,ratios:t,spacing:n,maxHeight:a,minWidth:s}){const o=e,i=Math.round(Math.min(o/t[0],.66*(a-n))),r=Math.round((e-2*n)/(t[1]+t[2]+t[3])),c=Math.max(s,Math.round(Math.min(.4*(e-2*n),r*t[1]))),d=Math.round(Math.max(Math.max(s,.33*(e-2*n)),r*t[3])),l=o-c-d-2*n,u=Math.min(a-i-n,r);return[{dimensions:{x:0,y:0,width:o,height:i},sides:11},{dimensions:{x:0,y:i+n,width:c,height:u},sides:12},{dimensions:{x:c+n,y:i+n,width:l,height:u},sides:4},{dimensions:{x:c+n+l+n,y:i+n,width:d,height:u},sides:6}]}(e):function({maxHeight:e,ratios:t,maxWidth:n,spacing:a,minWidth:s}){const o=e,i=Math.round(Math.min(o*t[0],.6*(n-a))),r=Math.round((e-2*a)/(1/t[1]+1/t[2]+1/t[3])),c=Math.round(r/t[1]),d=Math.round(r/t[2]),l=o-c-d-2*a,u=Math.max(s,Math.min(n-i-a,r));return[{dimensions:{x:0,y:0,width:i,height:o},sides:13},{dimensions:{x:i+a,y:0,width:u,height:c},sides:3},{dimensions:{x:i+a,y:c+a,width:u,height:d},sides:2},{dimensions:{x:i+a,y:c+d+2*a,width:u,height:l},sides:6}]}(e)}(u),{layout:l,containerStyle:Pn(l)}}let wn;function bn(e){return wn||(wn=document.createElement("span"),wn.style.font=h.cj?'400 12px system-ui, -apple-system, BlinkMacSystemFont, "Roboto", "Apple Color Emoji", "Helvetica Neue", sans-serif':'400 12px "Roboto", -apple-system, "Apple Color Emoji", BlinkMacSystemFont, "Helvetica Neue", sans-serif',wn.style.whiteSpace="nowrap",wn.style.position="absolute",wn.style.left="-999px",wn.style.opacity=".01",document.body.appendChild(wn)),wn.innerHTML=e,wn.offsetWidth}function En(e,t,n,a,s,i){(0,o.bt)((()=>{if(n&&e.current){const t=e.current.closest(".MessageList");(0,dn.Z)(t,e.current,s?"end":"centerOrTop",20,void 0!==a?1e3:void 0,a,void 0,i)}}),[e,t,n,a,s,i])}const Mn=3*Rt.Gw,Sn=Number(Rt.Gw),Rn="data-is-document-group-hover";function kn(e,t,n,s,i,r,c,d,l,u,m,g,p,f){const{setReplyingToId:v,sendDefaultReaction:I}=(0,a.uC)(),[y,Z,P]=(0,Me.Z)(),[C,w,b]=(0,Me.Z)(),E=(0,o.sO)();return(0,o.d4)((()=>{if(!h.$b||i||!r||m)return;let e;return(0,qe.s)(t.current,{selectorToPreventScroll:".MessageList",onSwipe:(t,n)=>n===qe.e.Left&&(e||(e=Date.now()),w(),!0),onRelease:()=>{e&&(v({messageId:n}),setTimeout(b,Math.max(0,150-(Date.now()-e))),e=void 0)}})}),[t,i,n,v,w,b,r,m]),{handleMouseDown:i?void 0:function(e){(0,on.q)(e),l(e)},handleClick:function(t){if(i)e(t);else if(h.$b)return E.current?(clearInterval(E.current),E.current=void 0,void function(e){const{pageX:t,pageY:a}=e;I({chatId:u,messageId:n,x:t,y:a})}(t)):void(E.current=setTimeout((()=>{E.current=void 0,function(e){if(h.wZ){const t=e.target;if(!t.classList.contains("text-content")&&!t.classList.contains("Message"))return;Y.Z.getIsKeyboardVisible()?setTimeout((()=>{d(e)}),350):d(e)}}(t)}),200))},handleContextMenu:i?c?ge.Z:void 0:function(t){if(h.wZ){if(t.target.matches("a[href]"))return;t.preventDefault(),e()}else d(t)},handleDoubleClick:i?void 0:function(){h.$b||v({messageId:n})},handleContentDoubleClick:h.$b?void 0:function(e){e.stopPropagation()},handleMouseMove:function(e){const t=g.current;if(!t)return;const{clientX:n,clientY:a}=e,{x:s,width:o,y:i,height:r}=t.getBoundingClientRect(),c=Math.abs(p?n-s:s+o-n){const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"ContextMenuContainer",!t);return n?o.ZP.createElement(n,e):void 0})),xn=(0,o.X$)((0,a.c$)(((e,{message:t})=>{const{byId:n}=e.users,a=t.senderId,{targetUserIds:s,targetChatId:o}=t.content.action||{},i=t.replyToMessageId,c=i?(0,r.hj)(e,t.chatId,i):void 0,l=(0,r._X)(e,t),{direction:u,noHighlight:m}=l&&e.focusedMessage||{},h=(0,r.Z1)(e,t.chatId);return{usersById:n,sender:h&&((0,d.eA)(h)||a===t.chatId)?h:a?(0,r.dy)(e,a):void 0,targetChatId:o,targetUserIds:s,targetMessage:c,isFocused:l,...l&&{focusDirection:u,noFocusHighlight:m}}}))((({message:e,observeIntersection:t,isEmbedded:n,appearanceOrder:a=0,isLastInList:s,usersById:i,sender:r,targetUserIds:c,targetMessage:d,targetChatId:l,isFocused:u,focusDirection:m,noFocusHighlight:h})=>{const g=(0,o.sO)(null);(0,un._N)(g,t),(0,Pt.Z)(e.chatId,e.replyToMessageId,d),En(g,e.chatId,u,m,h);const p=(0,ke.Z)(),f=a<=0,[v,I]=(0,Me.Z)(f);(0,o.d4)((()=>{f||setTimeout(I,10*a)}),[a,I,f]);const{transitionClassNames:y}=(0,pe.Z)(v,void 0,f,!1),Z=(0,o.Ye)((()=>c?c.map((e=>null==i?void 0:i[e])).filter(Boolean):void 0),[c,i]),P=(0,Bn.D)(p,e,r,Z,d,l,n?{isEmbedded:!0,asPlain:!0}:void 0),{isContextMenuOpen:C,contextMenuPosition:w,handleBeforeContextMenu:b,handleContextMenu:E,handleContextMenuClose:M,handleContextMenuHide:S}=(0,gn.Z)(g),R=void 0!==w;if(n)return o.ZP.createElement("span",{className:"embedded-action-message"},(0,kt.Z)(P));const k=(0,ue.Z)("ActionMessage message-list-item",u&&!h&&"focused",R&&"has-menu-open",s&&"last-in-list",y);return o.ZP.createElement("div",{ref:g,id:`message${e.id}`,className:k,"data-message-id":e.id,onMouseDown:e=>{(0,on.q)(e),b(e)},onContextMenu:E},o.ZP.createElement("span",null,P),w&&o.ZP.createElement(An,{isOpen:C,anchor:w,message:e,messageListType:"thread",onClose:M,onCloseAnimationEnd:S}))}))),Ln=({className:e,message:t,sender:n,title:a,customText:s,isProtected:i,observeIntersection:r,onClick:c})=>{const l=(0,o.sO)(null),u=(0,un.Op)(l,r),m=(0,Tt.Z)(t&&(0,d.Ti)(t,"pictogram"),!u),h=t&&`sticker-reply-thumb${t.id}`,g=Bt(t),p=Boolean(t&&(0,d.Y5)(t)),f=(0,ke.Z)(),v=n&&(0,d.OU)(f,n);return o.ZP.createElement("div",{ref:l,className:(0,ue.Z)("EmbeddedMessage",e),onClick:t?c:void 0},g&&function(e,t,n,a,s){const{width:i,height:r}=(0,Rt.W7)();return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("img",{id:e,src:n||t,width:i,height:r,alt:"",className:a?"round":"",draggable:!s}),s&&o.ZP.createElement("span",{className:"protector"}))}(h,g,m,p,i),o.ZP.createElement("div",{className:"message-text"},o.ZP.createElement("p",{dir:"auto"},t?(0,d.Lo)(t)?o.ZP.createElement(xn,{message:t,isEmbedded:!0}):(0,kt.Z)((0,d.MK)(f,t,Boolean(g))):s||" "),o.ZP.createElement("div",{className:"message-title",dir:"auto"},(0,kt.Z)(v||a||" "))))};var On=n(2535),Un=n(4752),Fn=n(8018),$n=n(8198),Dn=n(7799);const jn=(0,o.X$)((({reaction:e,activeReaction:t,isInMeta:n,availableReactions:s})=>{var i,r;const{stopActiveReaction:c}=(0,a.uC)(),d=null==s?void 0:s.find((t=>t.reaction===e)),l=null==d||null===(i=d.centerIcon)||void 0===i?void 0:i.id,m=null==d||null===(r=d.aroundAnimation)||void 0===r?void 0:r.id,h=(0,Tt.Z)(`sticker${l}`,!l,u.IU.Lottie),g=(0,Tt.Z)(`sticker${m}`,!m,u.IU.Lottie),p=Boolean((null==t?void 0:t.reaction)===e&&h&&g),{shouldRender:f,transitionClassNames:v}=(0,pe.Z)(p,void 0,!0,"slow"),I=(0,o.I4)((()=>{c({messageId:null==t?void 0:t.messageId,reaction:e})}),[null==t?void 0:t.messageId,e,c]),[y,Z,P]=(0,Me.Z)(),C=!p||!y,w=(0,ue.Z)("ReactionAnimatedEmoji",n&&"in-meta",f&&"is-animating");return o.ZP.createElement("div",{className:w},C&&o.ZP.createElement($n.Z,{reaction:e}),f&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(Dn.Z,{key:l,id:`reaction_emoji_${l}`,className:v,size:30,animationData:h,play:!0,noLoop:!0,onLoad:Z,onEnded:P}),o.ZP.createElement(Dn.Z,{key:m,id:`reaction_effect_${m}`,className:(0,ue.Z)("effect",v),size:100,animationData:g,play:!0,noLoop:!0,onEnded:I})))})),Qn=(0,o.X$)((({message:e,outgoingStatus:t,signature:n,onClick:a,withReactions:s,activeReaction:i,withReactionOffset:r,availableReactions:c})=>{var d;const l=(0,ke.Z)(),[u,m]=(0,Me.Z)(),h=s&&(null===(d=e.reactions)||void 0===d?void 0:d.results.filter((e=>e.count>0))),g=(0,o.Ye)((()=>{if(!u)return;const t=(0,N.SA)(1e3*e.date,l.code),n=e.isEdited&&(0,N.SA)(1e3*e.editDate,l.code),a=e.forwardInfo&&(0,N.SA)(1e3*e.forwardInfo.date,l.code);let s=t;return n&&(s+="\n",s+=l("lng_edited_date").replace("{date}",n)),a&&(s+="\n",s+=l("lng_forwarded_date").replace("{date}",a)),s}),[u,l,e]);return o.ZP.createElement("span",{className:(0,ue.Z)("MessageMeta",r&&"reactions-offset"),dir:l.isRtl?"rtl":"ltr",onClick:a},h&&h.map((e=>o.ZP.createElement(jn,{activeReaction:i,reaction:e.reaction,isInMeta:!0,availableReactions:c}))),Boolean(e.views)&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("span",{className:"message-views"},(0,wt.bi)(e.views)),o.ZP.createElement("i",{className:"icon-channelviews"})),n&&o.ZP.createElement("span",{className:"message-signature"},(0,kt.Z)(n)),o.ZP.createElement("span",{className:"message-time",title:g,onMouseEnter:m},e.isEdited&&`${l("EditedMessage")} `,(0,N.mr)(l,1e3*e.date)),t&&o.ZP.createElement(Fn.Z,{status:t}))}));var qn=n(692),Gn=n(4851);const Hn=({message:e,observeIntersection:t,observeIntersectionForPlaying:n,shouldLoop:a,lastSyncTime:i})=>{const r=(0,o.sO)(null),[c,l,u]=(0,Me.Z)(),m=e.content.sticker,{isAnimated:h,stickerSetId:g}=m,p=g===s.n,f=(0,un.Op)(r,t),v=(0,un.Op)(r,n),I=m.isPreloadedGlobally?`sticker${m.id}`:(0,d.Ti)(e,"inline"),y=Bt(e),Z=(0,Tt.Z)(I,!f,(0,d.kG)(e,"inline"),i),P=Boolean(Z),[C,w]=(0,Me.Z)(P),b=h?C:P,E=(0,qn.Z)(b),{width:M,height:S}=(0,Rt.Wr)(m),R=(0,ue.Z)("thumbnail",!y&&"empty"),k=(0,ue.Z)("Sticker media-inner",p&&"inactive");return o.ZP.createElement("div",{ref:r,className:k,onClick:p?void 0:l},!b&&o.ZP.createElement("img",{id:`sticker-thumb-${e.id}`,src:y,width:M,height:S,alt:"",className:R}),!h&&o.ZP.createElement("img",{id:`sticker-${e.id}`,src:Z,width:M,height:S,alt:"",className:(0,ue.Z)("full-media",E)}),h&&P&&o.ZP.createElement(Dn.Z,{key:I,className:(0,ue.Z)("full-media",E),id:I,animationData:Z,size:M,play:v,noLoop:!a,onLoad:w}),o.ZP.createElement(Gn.Z,{isOpen:c,fromSticker:m,onClose:u}))};var _n=n(7854),zn=n(2566),Vn=n(5866);function Yn(e,t){return(0,Vn.Z)((0,d.DH)(e),Boolean(t),h.wB&&!h.vX)}const Xn={dark:{outgoing:"rgb(135,116,225)",incoming:"rgb(33,33,33)"},light:{outgoing:"rgb(238,255,222)",incoming:"rgb(255,255,255)"}};var Wn=n(9196);const Kn=({id:e,message:t,observeIntersection:n,noAvatars:a,canAutoLoad:s,isInSelectMode:i,isSelected:r,uploadProgress:c,size:l="inline",dimensions:u,nonInteractive:m,shouldAffectAppendix:h,isDownloading:g,isProtected:p,theme:f,onClick:v,onCancelUpload:I})=>{const y=(0,o.sO)(null),Z=((0,d.O$)(t)||(0,d.F$)(t)).blobUrl,P=(0,un.Op)(y,n),[C,w]=(0,o.eJ)(s),b=C&&P,{mediaData:E,loadProgress:M}=(0,zn.Z)((0,d.Ti)(t,l),!b),S=Z||E,R=Yn(t,S),{loadProgress:k}=(0,zn.Z)((0,d.Ti)(t,"download"),!g),{isUploading:T,isTransferring:N,transferProgress:B}=(0,d.Sc)(t,c||(g?k:M),b&&!S),A=!1===(0,It.Z)(C),x=(0,qn.Z)(S),{shouldRender:L,transitionClassNames:O}=(0,pe.Z)(N,void 0,A,"slow"),{shouldRender:U,transitionClassNames:F}=(0,pe.Z)(!S&&!C),$=(0,o.I4)((()=>{T?I&&I(t):S?v&&v(t.id):w((e=>!e))}),[S,T,t,I,v]),D=(0,d.B4)(t);(0,o.bt)((()=>{if(!h)return;const e=y.current.closest(".message-content");S?function(e,t,n,a,s){return a?Promise.resolve(Xn[s||"light"][t?"outgoing":"incoming"]):async function(e,t){const n=new Image;n.src=e,n.width||await new Promise((e=>{n.onload=e}));const a=document.createElement("canvas"),s=a.getContext("2d");a.width=n.width,a.height=n.height,s.drawImage(n,0,0,n.width,n.height);const o=t?n.width-1:0,i=n.height-1;return`rgba(${Array.from(s.getImageData(o,i,1,1).data).join(",")})`}(e,t)}(S,D,0,r,f).then((t=>{e.style.setProperty("--appendix-bg",t),e.setAttribute("data-has-custom-appendix","")})):e.classList.add("has-appendix-thumb")}),[S,D,h,i,r,f]);const{width:j,height:Q,isSmall:q}=u||In(t,a),G=(0,ue.Z)("media-inner",!T&&!m&&"interactive",q&&"small-image",j===Q&&"square-image"),H=u?`width: ${j}px; height: ${Q}px; left: ${u.x}px; top: ${u.y}px;`:"";return o.ZP.createElement("div",{id:e,ref:y,className:G,style:H,onClick:T?void 0:$},o.ZP.createElement("canvas",{ref:R,className:"thumbnail",style:`width: ${j}px; height: ${Q}px`}),o.ZP.createElement("img",{src:S,className:`full-media ${x}`,width:j,height:Q,alt:"",draggable:!p}),p&&o.ZP.createElement("span",{className:"protector"}),L&&!U&&o.ZP.createElement("div",{className:`media-loading ${O}`},o.ZP.createElement(Wn.Z,{progress:B,onClick:T?$:void 0})),U&&o.ZP.createElement("i",{className:(0,ue.Z)("icon-download",F)}),N&&o.ZP.createElement("span",{className:"message-transfer-progress"},Math.round(100*B),"%"))};var Jn=n(2019),ea=n(6898),ta=n(4753);function na(e,t){var n;const a=(0,o.sO)(null===(n=e.current)||void 0===n?void 0:n.paused),s=(0,o.sO)();s.current=t;const i=(0,o.I4)((()=>{e.current&&(a.current=!e.current.paused,a.current&&e.current.pause())}),[e]),r=(0,o.I4)((()=>{e.current&&a.current&&s.current&&document.body.contains(e.current)&&(0,ta.Z)(e.current)}),[e]),c=(0,o.I4)((()=>{(0,C.T2)(r)}),[r]);(0,fe.Z)(i,c),(0,le.ZP)(i,r)}function aa(){return(aa=Object.assign||function(e){for(var t=1;t{var v;const I=(0,o.sO)(null),y=(0,o.sO)(null),Z=(0,d.b7)(t)||(0,d.Cg)(t),P=Z.blobUrl,C=(0,un.Op)(I,n),[w,b]=(0,o.eJ)(i),E=Boolean(w&&C&&l),[M,S]=(0,o.eJ)(r),R=(0,Tt.Z)((0,d.Ti)(t,"pictogram"),!(C&&l),(0,d.kG)(t,"pictogram"),l),k=(0,qn.Z)(R),{mediaData:T,loadProgress:B}=(0,zn.Z)((0,d.Ti)(t,"inline"),!E,(0,d.kG)(t,"inline"),l),A=P||T,x=Boolean(C&&A),L=Yn(t,R),{loadProgress:O}=(0,zn.Z)((0,d.Ti)(t,"download"),!p,u.IU.BlobUrl,l),{isBuffered:U,bufferingHandlers:F}=(0,Jn.Z)(!i),{isUploading:$,isTransferring:D,transferProgress:j}=(0,d.Sc)(t,c||(p?O:B),E&&!U||p),Q=!1===(0,It.Z)(w),{shouldRender:q,transitionClassNames:G}=(0,pe.Z)(D,void 0,Q),{shouldRender:H,transitionClassNames:_}=(0,pe.Z)(w&&!M&&!q),[z,V]=(0,o.eJ)(0),Y=(0,o.I4)((e=>{V(Math.max(0,e.currentTarget.currentTime-1))}),[]),X=(null===(v=y.current)||void 0===v?void 0:v.duration)||Z.duration||0,W=(0,d.B4)(t),K=(0,d.MF)(t),{width:J,height:ee}=m||(0,Rt.GC)(Z,W,K,s);na(y,x),(0,ea.Z)(y,[x]);const te=(0,o.I4)((()=>{$?g&&g(t):p?(0,a.uC)().cancelMessageMediaDownload({message:t}):A?A&&!M?(S(!0),y.current.play()):h&&h(t.id):b((e=>!e))}),[$,p,A,M,h,g,t]),ne=(0,ue.Z)("media-inner dark",!$&&"interactive"),ae=m?`width: ${J}px; height: ${ee}px; left: ${m.x}px; top: ${m.y}px;`:"";return o.ZP.createElement("div",{ref:I,id:e,className:ne,style:ae,onClick:$?void 0:te},o.ZP.createElement("canvas",{ref:L,className:"thumbnail",style:`width: ${J}px; height: ${ee}px;`}),o.ZP.createElement("img",{src:R,className:(0,ue.Z)("thumbnail",k),style:`width: ${J}px; height: ${ee}px;`,alt:"",draggable:!f}),x&&o.ZP.createElement("video",aa({ref:y,className:"full-media",width:J,height:ee,autoPlay:M,muted:!0,loop:!0,playsInline:!0},F,{draggable:!f,onTimeUpdate:Y}),o.ZP.createElement("source",{src:A})),f&&o.ZP.createElement("span",{className:"protector"}),H&&o.ZP.createElement("i",{className:(0,ue.Z)("icon-large-play",_)}),q&&o.ZP.createElement("div",{className:(0,ue.Z)("media-loading",G)},o.ZP.createElement(Wn.Z,{progress:j,onClick:te})),!w&&o.ZP.createElement("i",{className:"icon-download"}),D?o.ZP.createElement("span",{className:"message-transfer-progress"},$||p?`${Math.round(100*j)}%`:"..."):o.ZP.createElement("div",{className:"message-media-duration"},Z.isGif?"GIF":(0,N.k9)(Math.max(X-z,0))))};var oa=n(6272);const ia=(0,a.c$)(((e,{contact:t})=>{const{countryList:{phoneCodes:n}}=e;return{user:(0,r.dy)(e,t.userId),phoneCodeList:n}}))((({contact:e,user:t,phoneCodeList:n})=>{const{openUserInfo:s}=(0,a.uC)(),{firstName:i,lastName:r,phoneNumber:c,userId:d}=e,l=(0,o.I4)((()=>{s({id:d})}),[s,d]);return o.ZP.createElement("div",{className:(0,ue.Z)("Contact",Boolean(d)&&"interactive"),onClick:d?l:void 0},o.ZP.createElement(Kt.Z,{size:"large",user:t,text:i||r}),o.ZP.createElement("div",{className:"contact-info"},o.ZP.createElement("div",{className:"contact-name"},i," ",r),o.ZP.createElement("div",{className:"contact-phone"},(0,oa.WZ)(n,c))))}));var ra=n(1218),ca=n(4434),da=n(6937);function la(e,t){return t>0?(e/t*100).toFixed():0}const ua=({answer:e,voteResults:t,totalVoters:n,maxVotersCount:a,correctResults:s,shouldAnimate:i})=>{const r=t&&t.find((t=>t.option===e.option)),c=0===s.length||-1!==s.indexOf(e.option),d=s.length>0&&c||(null==r?void 0:r.isChosen),l=r?la(r.votersCount,n||0):0,[u,m]=(0,o.eJ)(i?0:l),h=(0,o.sO)(null),g=r?la(r.votersCount,a||0):0,p=u{i&&m(l)}),[i,l]),(0,o.d4)((()=>{const e=h.current;if(e&&i){const t=e.firstElementChild,n=p?"":"stroke-dasharray: 100% 200%; stroke-dashoffset: -44";t?t.setAttribute("style",n):e.innerHTML=`\n \n \n `}}),[p,i]),!t||!r)return;const f=`width: ${g}%; transform:scaleX(${p?0:1})`;return o.ZP.createElement("div",{className:"PollOption",dir:"ltr"},o.ZP.createElement("div",{className:"poll-option-share "+("100"===l?"limit-width":"")},l,"%",d&&o.ZP.createElement("span",{className:(0,ue.Z)("poll-option-chosen",!c&&"wrong",i&&"animate")},o.ZP.createElement("i",{className:c?"icon-check":"icon-close"}))),o.ZP.createElement("div",{className:"poll-option-right"},o.ZP.createElement("div",{className:"poll-option-text",dir:"auto"},(0,kt.Z)(e.text)),o.ZP.createElement("div",{className:(0,ue.Z)("poll-option-answer",d&&!c&&"wrong")},o.ZP.createElement("div",{className:"poll-option-corner",ref:h}),o.ZP.createElement("div",{className:"poll-option-line",style:f}))))},ma=(0,o.X$)((0,a.c$)(((e,{poll:t})=>{const{recentVoterIds:n}=t.results,{serverTimeOffset:a,users:{byId:s}}=e;return n&&0!==n.length?{recentVoterIds:n,usersById:s,serverTimeOffset:a}:{}}))((({message:e,poll:t,recentVoterIds:n,usersById:s,onSendVote:i,serverTimeOffset:r})=>{const{loadMessage:c,openPollResults:d}=(0,a.uC)(),{id:l,chatId:u}=e,{summary:m,results:h}=t,[g,p]=(0,o.eJ)(!1),[f,v]=(0,o.eJ)([]),[I,y]=(0,o.eJ)(!1),[Z,P]=(0,o.eJ)(!1),[C,w]=(0,o.eJ)(!m.closed&&m.closeDate&&m.closeDate>0?Math.min(m.closeDate-Math.floor(Date.now()/1e3)+r,m.closePeriod):0),b=(0,o.sO)(null),{results:E,totalVoters:M}=h,S=E&&E.some((e=>e.isChosen)),R=!m.closed&&!S,k=!R&&m.isPublic&&Number(h.totalVoters)>0,T=R&&m.multipleChoice,B=E?Math.max(...E.map((e=>e.votersCount))):M,A=E?E.reduce(((e,t)=>(t.isCorrect&&e.push(t.option),e)),[]):[],x=m.answers.map((e=>({label:e.text,value:e.option,hidden:Boolean(m.quiz&&m.closePeriod&&C<=0)})));(0,o.d4)((()=>{g&&t.results.results&&t.results.results.some((e=>e.isChosen))&&p(!1)}),[g,t.results.results]),(0,o.d4)((()=>{C>0&&setTimeout((()=>w(C-1)),1e3);const e=b.current;if(e){const t=12*Math.PI,n=e.lastElementChild,a=e.firstElementChild;if(C<=5&&e.classList.add("hurry-up"),n&&a){const e=(m.closePeriod-C)/m.closePeriod*t;a.textContent=(0,N.k9)(C),n.firstElementChild.setAttribute("stroke-dashoffset",`-${e}`)}else e.innerHTML=`\n ${(0,N.k9)(C)}\n \n \n `}}),[C,m.closePeriod]),(0,o.d4)((()=>{m.quiz&&(C<=0||S&&!m.closed)&&c({chatId:u,messageId:l})}),[u,C,S,c,l,m.closed,m.quiz]),(0,o.d4)((()=>{let e;return m.quiz&&!m.closed&&m.closePeriod&&m.closePeriod>0&&(e=window.setTimeout((()=>{c({chatId:u,messageId:l})}),1e3*m.closePeriod)),()=>{e&&window.clearTimeout(e)}}),[R,u,c,l,m.closePeriod,m.closed,m.quiz]);const L=(0,o.Ye)((()=>n?n.reduce(((e,t)=>{const n=s[t];return n&&e.push(n),e}),[]):[]),[s,n]),O=(0,o.I4)((e=>{v([e]),p(!0),P(!0),i([e])}),[i]),U=(0,o.I4)((e=>{v(e)}),[]),F=(0,o.I4)((()=>{p(!0),P(!0),i(f)}),[i,f]),$=(0,o.I4)((()=>{d({chatId:u,messageId:l})}),[u,l,d]),D=(0,o.I4)((()=>{y(!0)}),[]),j=(0,o.I4)((()=>{y(!1),P(!1)}),[]);(0,o.d4)((()=>{Z&&S&&m.quiz&&h.results&&t.results.solution&&(h.results.find((e=>e.isChosen&&e.isCorrect))||y(!0))}),[S,Z,h.results,m.quiz,t.results.solution]);const Q=(0,ke.Z)();return o.ZP.createElement("div",{className:"Poll",dir:Q.isRtl?"auto":"ltr"},I&&t.results.solution&&o.ZP.createElement(da.Z,{message:(0,pn.H)(t.results.solution,t.results.solutionEntities),duration:5e3,onDismiss:j,containerId:"#middle-column-portals"}),o.ZP.createElement("div",{className:"poll-question"},(0,kt.Z)(m.question,["emoji","br"])),o.ZP.createElement("div",{className:"poll-type"},Q(function(e){return void 0===e.isPublic?" ":e.quiz?e.isPublic?"QuizPoll":"AnonymousQuizPoll":e.closed?"FinalResults":e.isPublic?"PublicPoll":"AnonymousPoll"}(m)),L.length>0&&o.ZP.createElement("div",{className:"poll-recent-voters"},L.map((e=>o.ZP.createElement(Kt.Z,{size:"micro",user:e})))),C>0&&R&&o.ZP.createElement("div",{ref:b,className:"poll-countdown"}),m.quiz&&t.results.solution&&!R&&o.ZP.createElement(Le.Z,{round:!0,size:"tiny",color:"translucent",className:"poll-quiz-help",disabled:I,onClick:D,ariaLabel:"Show Solution"},o.ZP.createElement("i",{className:"icon-lamp"}))),R&&o.ZP.createElement("div",{className:"poll-answers"},T?o.ZP.createElement(ra.Z,{options:x,onChange:U,disabled:e.isScheduled||g,loadingOptions:g?f:void 0,round:!0}):o.ZP.createElement(ca.Z,{name:`poll-${l}`,options:x,onChange:O,disabled:e.isScheduled||g,loadingOption:g?f[0]:void 0})),!R&&o.ZP.createElement("div",{className:"poll-results"},m.answers.map((function(e){return o.ZP.createElement(ua,{key:e.option,shouldAnimate:Z,answer:e,voteResults:E,totalVoters:M,maxVotersCount:B,correctResults:A})}))),!k&&!T&&o.ZP.createElement("div",{className:"poll-voters-count"},function(e,t,n){return n?e(t?"Answer":"Vote",n,"i"):e(t?"Chat.Quiz.TotalVotesEmpty":"Chat.Poll.TotalVotesResultEmpty")}(Q,m.quiz,h.totalVoters)),T&&o.ZP.createElement(Le.Z,{isText:!0,disabled:0===f.length,size:"tiny",onClick:F},Q("PollSubmitVotes")),k&&o.ZP.createElement(Le.Z,{isText:!0,size:"tiny",onClick:$},Q("PollViewResults")))})));var ha=n(8035),ga=n(88);const pa=(0,o.X$)((({message:e,observeIntersection:t,noAvatars:n,canAutoLoad:a,canAutoPlay:s,inPreview:i,lastSyncTime:r,isDownloading:c=!1,isProtected:l,theme:u,onMediaClick:m,onCancelMediaTransfer:h})=>{const g=(0,d.s1)(e);let p=!1;if(null!=g&&g.photo&&!g.video){const{width:t,height:n}=In(e);p=t===n}const f=(0,o.I4)((()=>{m()}),[m]);if(!g)return;const{siteName:v,url:I,displayUrl:y,title:Z,description:P,photo:C,video:w}=g,b=(C||w)&&m&&!p,E=(0,ha.Z)(P,170),M=(0,ue.Z)("WebPage",p&&"with-square-photo",!C&&!w&&!i&&"without-media",w&&"with-video");return o.ZP.createElement("div",{className:M,"data-initial":(v||y)[0],dir:"auto"},C&&!w&&o.ZP.createElement(Kn,{message:e,observeIntersection:t,noAvatars:n,canAutoLoad:a,size:p?"pictogram":"inline",nonInteractive:!b,onClick:b?f:void 0,onCancelUpload:h,isDownloading:c,isProtected:l,theme:u}),o.ZP.createElement("div",{className:"WebPage-text"},o.ZP.createElement(ga.Z,{className:"site-name",url:I,text:v||y}),!i&&Z&&o.ZP.createElement("p",{className:"site-title"},(0,kt.Z)(Z)),E&&o.ZP.createElement("p",{className:"site-description"},(0,kt.Z)(E,["emoji","br"]))),!i&&w&&o.ZP.createElement(sa,{message:e,observeIntersection:t,noAvatars:n,canAutoLoad:a,canAutoPlay:s,lastSyncTime:r,onClick:b?f:void 0,onCancelUpload:h,isDownloading:c,isProtected:l}))}));var fa=n(9937);const va=(0,o.X$)((({message:e})=>{const t=(0,ke.Z)(),n=(0,d.eO)(e),{title:a,text:s,amount:i,currency:r,isTest:c,photoUrl:l}=n;return o.ZP.createElement("div",{className:"Invoice"},a&&o.ZP.createElement("p",{className:"title"},(0,kt.Z)(a)),s&&o.ZP.createElement("p",null,(0,kt.Z)(s,["emoji","br"])),o.ZP.createElement("div",{className:"description "+(l?"has-image":"")},l&&o.ZP.createElement("img",{className:"invoice-image",src:l,alt:""}),o.ZP.createElement("p",{className:"description-text"},(0,fa.x)(i,r,t.code),c&&o.ZP.createElement("span",null,t("PaymentTestInvoice")))))}));function Ia(e){return(0,o.X$)((0,a.c$)(((e,t)=>{const{message:n}=t;return{isInSelectMode:(0,r.CA)(e),isSelected:(0,r.vk)(e,n.id)}}))((t=>{const{isInSelectMode:n,isSelected:s,message:i,dimensions:r}=t,{toggleMessageSelection:c}=(0,a.uC)(),d=(0,o.I4)((e=>{e.stopPropagation(),c({messageId:i.id,withShift:null==e?void 0:e.shiftKey})}),[c,i]),l=(0,o.Ye)((()=>({...t,isInSelectMode:n,isSelected:s,dimensions:{...t.dimensions,x:0,y:0},onClick:n?void 0:t.onClick})),[t,n,s]);return o.ZP.createElement("div",{className:(0,ue.Z)("album-item-select-wrapper",s&&"is-selected"),style:r?`left: ${r.x}px; top: ${r.y}px;`:"",onClick:n?d:void 0},n&&o.ZP.createElement("div",{className:"message-select-control"},s&&o.ZP.createElement("i",{className:"icon-select"})),o.ZP.createElement(e,l))})))}const ya=Ia(Kn),Za=Ia(sa),Pa=(0,a.c$)(((e,{album:t})=>{const{chatId:n}=t.mainMessage,a=(0,r.Pu)(e),s=(0,r.xs)(e,n);return{theme:a,uploadsById:e.fileUploads.byMessageLocalId,activeDownloadIds:s}}))((({album:e,observeIntersection:t,hasCustomAppendix:n,lastSyncTime:s,isOwn:i,isProtected:c,albumLayout:l,onMediaClick:u,uploadsById:m,activeDownloadIds:h,theme:g})=>{const{cancelSendingMessage:p}=(0,a.uC)(),f=e.messages.length,v=(0,o.I4)((e=>{p({chatId:e.chatId,messageId:e.id})}),[p]),{width:I,height:y}=l.containerStyle;return o.ZP.createElement("div",{className:"Album",style:`width: ${I}px; height: ${y}px;`},e.messages.map((function(e,p){const{photo:I,video:y}=(0,d.qp)(e),Z=m[e.previousLocalId||e.id],P=null==Z?void 0:Z.progress,{dimensions:C,sides:w}=l.layout[p],b=(0,r.bH)((0,a.Rd)(),e),E=(0,r.__)((0,a.Rd)(),e);if(I){const a=n&&(i?p===f-1:Boolean(8&w&&4&w));return o.ZP.createElement(ya,{id:`album-media-${e.id}`,message:e,observeIntersection:t,canAutoLoad:b,shouldAffectAppendix:a,uploadProgress:P,dimensions:C,isProtected:c,onClick:u,onCancelUpload:v,isDownloading:h.includes(e.id),theme:g})}if(y)return o.ZP.createElement(Za,{id:`album-media-${e.id}`,message:e,observeIntersection:t,canAutoLoad:b,canAutoPlay:E,uploadProgress:P,lastSyncTime:s,dimensions:C,isProtected:c,onClick:u,onCancelUpload:v,isDownloading:h.includes(e.id),theme:g})})))}));function Ca(){return(Ca=Object.assign||function(e){for(var t=1;t{const r=(0,o.sO)(null),c=(0,o.sO)(null),l=(0,o.sO)(null),m=e.content.video,h=(0,un.Op)(r,t),[g,p]=(0,o.eJ)(n),f=Boolean(g&&h&&s),{mediaData:v,loadProgress:I}=(0,zn.Z)((0,d.Ti)(e,"inline"),!f,(0,d.kG)(e,"inline"),s),{loadProgress:y}=(0,zn.Z)((0,d.Ti)(e,"download"),!i,u.IU.BlobUrl,s),Z=Yn(e,v),{isBuffered:P,bufferingHandlers:w}=(0,Jn.Z)(),b=g&&!P||i,E=!1===(0,It.Z)(g),M=(0,qn.Z)(v),{shouldRender:S,transitionClassNames:R}=(0,pe.Z)(b||!P,void 0,E),[k,T]=(0,o.eJ)(!1),[B,A]=(0,o.eJ)(0);(0,o.d4)((()=>{if(!k)return;const e=Rt.Rj/2,t=2*(e-6)*Math.PI,n=t-B*t,a=l.current,s=c.current,o=s.firstElementChild;o?o.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):s.innerHTML=`\n \n \n `,A(a.currentTime/a.duration)}),[k,B]);const x=Boolean(v&&h),L=()=>{T(!1),A(0),(0,ta.Z)(l.current),(0,C.T2)((()=>{c.current.innerHTML=""}))},O=(U=L,()=>{wa&&wa(),wa=U});var U;(0,o.d4)((()=>{l.current&&(x?(0,ta.Z)(l.current):l.current.pause())}),[x]),na(l,x),(0,ea.Z)(l,[v]);const F=(0,o.I4)((()=>{if(!v)return void p((e=>!e));if(i)return void(0,a.uC)().cancelMessageMediaDownload({message:e});const t=l.current;k?t.paused?((0,ta.Z)(t),(0,Ft.Es)()):t.pause():(O(),t.pause(),t.currentTime=0,(0,ta.Z)(t),(0,Ft.Es)(),T(!0))}),[O,k,i,v,e]),$=(0,o.I4)((e=>{const t=e.currentTarget;A(t.currentTime/t.duration)}),[]),D=(0,ue.Z)("full-media",M);return o.ZP.createElement("div",{ref:r,className:"RoundVideo media-inner",onClick:F},o.ZP.createElement("div",{className:"thumbnail-wrapper"},o.ZP.createElement("canvas",{ref:Z,className:"thumbnail",style:`width: ${Rt.Rj}px; height: ${Rt.Rj}px`})),v&&o.ZP.createElement("div",{className:"video-wrapper"},o.ZP.createElement("video",Ca({ref:l,className:D,width:Rt.Rj,height:Rt.Rj,autoPlay:!0,muted:!k,loop:!k,playsInline:!0,onEnded:k?L:void 0},w,{onTimeUpdate:k?$:void 0}),o.ZP.createElement("source",{src:v}))),o.ZP.createElement("div",{className:"progress",ref:c}),S&&o.ZP.createElement("div",{className:`media-loading ${R}`},o.ZP.createElement(Wn.Z,{progress:i?y:I})),!v&&!g&&o.ZP.createElement("i",{className:"icon-download"}),o.ZP.createElement("div",{className:"message-media-duration"},k?(0,N.k9)(l.current.currentTime):(0,N.k9)(m.duration),(!k||l.current.paused)&&o.ZP.createElement("i",{className:"icon-muted"})))},Ea=({message:e,onClick:t})=>{const n=(0,ke.Z)();return o.ZP.createElement("div",{className:"InlineButtons"},e.inlineButtons.map((e=>o.ZP.createElement("div",{className:"row"},e.map((e=>o.ZP.createElement(Le.Z,{size:"tiny",ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>t({button:e})},(0,kt.Z)(n(e.text)),"buy"===e.type&&o.ZP.createElement("i",{className:"icon-card"}),"url"===e.type&&!e.value.match(s.FS)&&o.ZP.createElement("i",{className:"icon-arrow-right"}))))))))},Ma=(0,o.X$)((({threadInfo:e,disabled:t})=>{const{openChat:n}=(0,a.uC)(),s=(0,ke.Z)(),{threadId:i,chatId:r,messagesCount:c,lastMessageId:l,lastReadInboxMessageId:u,recentReplierIds:m}=e,h=(0,o.I4)((()=>{n({id:r,threadId:i})}),[n,r,i]),g=(0,o.Ye)((()=>{if(null==m||!m.length)return;const{users:{byId:e},chats:{byId:t}}=(0,a.Rd)();return m.map((n=>(0,d.YC)(n)?e[n]:t[n])).filter(Boolean)}),[m]);if(void 0===c)return;const p=Boolean(u&&l&&u0&&o.ZP.createElement("div",{className:"recent-repliers",dir:s.isRtl?"rtl":"ltr"},g.map((e=>o.ZP.createElement(Kt.Z,{key:e.id,size:"small",user:(0,d.YC)(e.id)?e:void 0,chat:(0,d.YC)(e.id)?void 0:e})))),o.ZP.createElement("div",{className:"label",dir:"auto"},c?s("Comments",c,"i"):s("LeaveAComment")),o.ZP.createElement("i",{className:"icon-next"}))})),Sa=(0,o.X$)((({reaction:e,message:t,activeReaction:n,availableReactions:s})=>{const{sendReaction:i}=(0,a.uC)(),{recentReactions:r}=t.reactions,c=(0,o.Ye)((()=>{if(!r||e.count>3)return;const t=(0,a.Rd)().users.byId;return r.filter((t=>t.reaction===e.reaction)).map((e=>t[e.userId])).filter(Boolean)}),[e,r]),d=(0,o.I4)((()=>{i({reaction:e.isChosen?void 0:e.reaction,chatId:t.chatId,messageId:t.id})}),[t,e,i]);return o.ZP.createElement(Le.Z,{className:(0,ue.Z)(e.isChosen&&"chosen"),size:"tiny",onClick:d},o.ZP.createElement(jn,{activeReaction:n,reaction:e.reaction,availableReactions:s}),null!=c&&c.length?o.ZP.createElement("div",{className:"avatars"},c.map((e=>o.ZP.createElement(Kt.Z,{user:e,size:"micro"})))):(0,wt.bi)(e.count))})),Ra=(0,o.X$)((({message:e,isOutside:t,activeReaction:n,availableReactions:a,metaChildren:s})=>o.ZP.createElement("div",{className:(0,ue.Z)("Reactions",t&&"is-outside")},e.reactions.results.map((t=>o.ZP.createElement(Sa,{key:t.reaction,reaction:t,message:e,activeReaction:n,availableReactions:a}))),s)));var ka=n(7324),Ta=n(5296);const Na=(0,o.X$)((({localSticker:e,localEffect:t,isOwn:n,soundId:a,size:s="medium",observeIntersection:i,messageId:r,chatId:c,activeEmojiInteraction:d})=>{const{playKey:l,ref:u,style:m,width:h,handleClick:g,markAnimationLoaded:p}=(0,Ta.Z)(s,c,r,a,d,n,t),f=`local_emoji_${e}`,v=(0,un.Op)(u,i),[I,y]=(0,o.eJ)();return(0,o.d4)((()=>{e&&(0,ka.Z)(e).then((e=>{y(e)}))}),[e]),o.ZP.createElement("div",{ref:u,className:"AnimatedEmoji media-inner",style:m,onClick:g},I&&o.ZP.createElement(Dn.Z,{key:f,id:f,animationData:I,size:h,quality:1,play:v&&l,forceOnHeavyAnimation:!0,noLoop:!0,onLoad:p}))})),Ba={__html:''},Aa={__html:''},xa=(0,o.X$)((0,a.c$)(((e,t)=>{const{focusedMessage:n,forwardMessages:a,lastSyncTime:s}=e,{message:o,album:i,withSenderName:c,withAvatar:l,threadId:u,messageListType:m,isLastInDocumentGroup:h}=t,{id:g,chatId:p,viaBotId:f,replyToChatId:v,replyToMessageId:I,isOutgoing:y,threadInfo:Z}=o,P=(0,r.Z1)(e,p),C=(0,r.FM)(e,p),w=(0,d.pK)(p),b=P&&(0,d.eA)(P),E=null==P?void 0:P.username,M=!C&&(0,d.Ul)(o),S=c||l||M,R=(0,r.Ur)(e,o),k=(0,r.cv)(e,o),T=f?(0,r.dy)(e,f):void 0,N=u?(0,r.qS)(e,p,u):void 0,B=o.id===N,A=I===N,x=I&&!A?(0,r.hj)(e,w&&v?v:p,I):void 0,L=x&&(0,r.Ur)(e,x),O=(0,r.uZ)(e,o),U="thread"===m&&(i?i.messages.some((t=>(0,r._X)(e,t))):(0,r._X)(e,o)),{direction:F,noHighlight:$,isResizingContainer:D}=U&&n||{},j=a.messageIds&&a.messageIds.includes(g),{query:Q}=(0,r.n5)(e)||{},q=(0,d._O)(o);let G;G=null!=i&&i.messages?i.messages.every((({id:t})=>(0,r.vk)(e,t))):(0,r.vk)(e,g);const{canReply:H}="thread"===m&&(0,r._k)(e,o,u)||{},_=(0,r.te)(e,o),z=Z?(0,r.tZ)(e,Z.chatId,Z.threadId)||Z:void 0,V=Boolean(o.groupedId)&&!o.isInAlbum,Y=V?(0,r.xH)(e,p,o.groupedId)[0]:void 0,X=V?h?(0,r.hj)(e,p,Y):void 0:o,W=q?(0,r.CP)(e,q):void 0;return{theme:(0,r.Pu)(e),chatUsername:E,forceSenderName:M,sender:S?R:void 0,originSender:k,botSender:T,shouldHideReply:A,isThreadTop:B,replyMessage:x,replyMessageSender:L,isInDocumentGroup:V,isProtected:(0,r.EV)(e,o),isFocused:U,isForwarding:j,reactionMessage:X,isChatWithSelf:C,isRepliesChat:w,isChannel:b,canReply:H,lastSyncTime:s,highlight:Q,isSingleEmoji:Boolean(q),animatedEmoji:q?(0,r.zB)(e,q):void 0,animatedEmojiEffect:q&&(0,d.YC)(p)?(0,r.tH)(e,q):void 0,animatedEmojiSoundId:q?(0,r.Oh)(e,q):void 0,localSticker:W,localEffect:W&&(0,d.YC)(p)?(0,r.cu)(W):void 0,isInSelectMode:(0,r.CA)(e),isSelected:G,isGroupSelected:!!o.groupedId&&!o.isInAlbum&&(0,r.a6)(e,p,o.groupedId),threadId:u,isDownloading:_,isPinnedList:"pinned"===m,canAutoLoadMedia:(0,r.bH)(e,o),canAutoPlayMedia:(0,r.__)(e,o),autoLoadFileMaxSizeMb:e.settings.byKey.autoLoadFileMaxSizeMb,shouldLoopStickers:(0,r.yB)(e),threadInfo:z,availableReactions:e.availableReactions,defaultReaction:(0,r.q6)(e,p),activeReaction:e.activeReactions[g],activeEmojiInteraction:e.activeEmojiInteraction,...y&&{outgoingStatus:(0,r.dT)(e,o,"scheduled"===m)},..."number"==typeof O&&{uploadProgress:O},...U&&{focusDirection:F,noFocusHighlight:$,isResizingContainer:D}}}))((({message:e,chatUsername:t,observeIntersectionForBottom:n,observeIntersectionForMedia:s,observeIntersectionForAnimatedStickers:i,album:r,noAvatars:c,withAvatar:l,withSenderName:g,areReactionsInMeta:p,noComments:f,appearanceOrder:v,isFirstInGroup:I,isLastInGroup:y,isFirstInDocumentGroup:Z,isLastInDocumentGroup:P,isLastInList:C,theme:w,forceSenderName:b,sender:E,originSender:M,botSender:S,isThreadTop:R,shouldHideReply:k,replyMessage:T,replyMessageSender:N,outgoingStatus:B,uploadProgress:A,isInDocumentGroup:x,isProtected:L,isFocused:O,focusDirection:U,noFocusHighlight:F,isResizingContainer:$,isForwarding:D,isChatWithSelf:j,isRepliesChat:Q,isChannel:q,canReply:G,lastSyncTime:H,highlight:_,animatedEmoji:z,localSticker:V,localEffect:Y,animatedEmojiEffect:X,animatedEmojiSoundId:W,isInSelectMode:K,isSelected:J,isGroupSelected:ee,threadId:te,reactionMessage:ne,availableReactions:ae,defaultReaction:se,activeReaction:oe,activeEmojiInteraction:ie,messageListType:re,isPinnedList:ce,isDownloading:de,canAutoLoadMedia:le,canAutoPlayMedia:me,shouldLoopStickers:he,autoLoadFileMaxSizeMb:ge,threadInfo:fe})=>{const{toggleMessageSelection:ve,clickInlineButton:Ie,disableContextMenuHint:ye}=(0,a.uC)(),Ze=(0,o.sO)(null),Pe=(0,o.sO)(null),Ce=(0,o.sO)(null),we=(0,ke.Z)();(0,un._N)(Pe,n);const{isContextMenuOpen:be,contextMenuPosition:Ee,handleBeforeContextMenu:Se,handleContextMenu:Re,handleContextMenuClose:Te,handleContextMenuHide:Ne}=(0,gn.Z)(Ze,h.$b&&K,!0,h.wZ);(0,o.d4)((()=>{be&&ye()}),[be,ye]);const Be=v<=0,[Ae,xe]=(0,Me.Z)(Be);(0,o.d4)((()=>{Be||setTimeout(xe,10*v)}),[v,xe,Be]);const{transitionClassNames:Oe}=(0,pe.Z)(Ae,void 0,Be,!1),{id:Ue,chatId:Fe,forwardInfo:$e,viaBotId:De}=e,je=(0,d.CI)(e),Qe=(0,d.B4)(e),qe="scheduled"===re||e.isScheduled,Ge=(0,d.ss)(e)&&!k,He=Boolean(fe)&&"thread"===re,_e=(0,d.$D)(e),ze=V||z,Ve=$e&&(!j||qe)&&!Q&&!$e.isLinkedChannelPost&&!_e,Ye=Boolean(r)&&r.messages.length>1,Xe=x&&!Z,We=x&&!P,Ke=void 0!==Ee,Je=!(Ke||K||D||We),et=q&&!qe,tt=Boolean(ce||$e&&($e.isChannelPost||j&&!Qe||Q)&&$e.fromMessageId),nt=fe&&!We&&"thread"===re&&!f,at=!h.$b&&se&&!We,st=(0,o.I4)(((e,t)=>{ve({messageId:Ue,groupedId:t,...(null==e?void 0:e.shiftKey)&&{withShift:!0},...Ye&&{childMessageIds:r.messages.map((({id:e})=>e))}})}),[ve,Ue,Ye,r]),ot=$e&&(j||Q||!E)?M:E,it=$e?M:E,{handleMouseDown:rt,handleClick:ct,handleContextMenu:dt,handleDoubleClick:lt,handleContentDoubleClick:ut,handleMouseMove:mt,handleSendQuickReaction:ht,handleMouseLeave:gt,isSwiped:pt,isQuickReactionVisible:ft,handleDocumentGroupMouseEnter:vt}=kn(st,Ze,Ue,0,Boolean(K),Boolean(G),Boolean(L),Re,Se,Fe,Ke,Ce,Qe,We),{handleAvatarClick:It,handleSenderClick:yt,handleViaBotClick:Zt,handleReplyClick:Ct,handleMediaClick:wt,handleAudioPlay:bt,handleAlbumMediaClick:Et,handleMetaClick:Mt,handleReadMedia:St,handleCancelUpload:Tt,handleVoteSend:Nt,handleGroupForward:Bt,handleForward:At,handleFocus:xt,handleFocusForwarded:Lt,handleDocumentGroupSelectAll:Ot}=function(e,t,n,s,i,r,c,l,h,g,p,f,v){const{openUserInfo:I,openChat:y,showNotification:Z,focusMessage:P,openMediaViewer:C,openAudioPlayer:w,markMessagesRead:b,cancelSendingMessage:E,sendPollVote:M,openForwardMenu:S,focusMessageInComments:R}=(0,a.uC)(),{id:k,forwardInfo:T,replyToMessageId:N,replyToChatId:B,replyToTopMessageId:A,groupedId:x}=n,L=(0,o.I4)((()=>{p&&((0,d.YC)(p.id)?I({id:p.id}):y({id:p.id}))}),[p,I,y]),O=(0,o.I4)((()=>{f?c&&null!=T&&T.channelPostId?P({chatId:f.id,messageId:T.channelPostId}):(0,d.YC)(f.id)?I({id:f.id}):y({id:f.id}):Z({message:e("HidAccount")})}),[c,P,T,e,y,I,f,Z]),U=(0,o.I4)((()=>{v&&I({id:v.id})}),[v,I]),F=(0,o.I4)((()=>{P({chatId:h&&B?B:s,threadId:i,messageId:N,replyMessageId:h&&B?void 0:k})}),[P,h,B,s,i,N,k]),$=(0,o.I4)((()=>{C({chatId:s,threadId:i,messageId:k,origin:l?m.bZ.ScheduledInline:m.bZ.Inline})}),[s,i,k,C,l]),D=(0,o.I4)((()=>{w({chatId:s,messageId:k})}),[s,k,w]),j=(0,o.I4)((e=>{C({chatId:s,threadId:i,messageId:e,origin:l?m.bZ.ScheduledAlbum:m.bZ.Album})}),[s,i,C,l]),Q=(0,o.I4)((()=>{b({messageIds:[k]})}),[k,b]),q=(0,o.I4)((()=>{E({chatId:s,messageId:k})}),[E,s,k]),G=(0,o.I4)((e=>{M({chatId:s,messageId:k,options:e})}),[s,k,M]),H=(0,o.I4)((()=>{S({fromChatId:s,groupedId:x})}),[S,s,x]),_=(0,o.I4)((()=>{if(g&&g.messages){const e=g.messages.map((({id:e})=>e));S({fromChatId:s,messageIds:e})}else S({fromChatId:s,messageIds:[k]})}),[g,S,s,k]),z=(0,o.I4)((()=>{P({chatId:s,threadId:u._f,messageId:k})}),[P,s,k]),V=(0,o.I4)((()=>{r?P({chatId:T.fromChatId,groupedId:x,groupedChatId:s}):h&&B?R({chatId:B,threadId:A,messageId:T.fromMessageId}):P({chatId:T.fromChatId,messageId:T.fromMessageId})}),[r,h,B,P,T,x,s,R,A]),Y=(0,o.I4)((e=>{e.stopPropagation(),t(e,x)}),[t,x]);return{handleAvatarClick:L,handleSenderClick:O,handleViaBotClick:U,handleReplyClick:F,handleMediaClick:$,handleAudioPlay:D,handleAlbumMediaClick:j,handleMetaClick:Y,handleReadMedia:Q,handleCancelUpload:q,handleVoteSend:G,handleGroupForward:H,handleForward:_,handleFocus:z,handleFocusForwarded:V,handleDocumentGroupSelectAll:Y}}(we,st,e,Fe,te,x,Ve,qe,Q,r,ot,it,S),Ut=(0,ue.Z)("Message message-list-item",I&&"first-in-group",L&&"is-protected",y&&"last-in-group",Z&&"first-in-document-group",P&&"last-in-document-group",C&&"last-in-list",Qe&&"own",Boolean(e.views)&&"has-views",e.isEdited&&"was-edited",Ge&&"has-reply",Ke&&"has-menu-open",O&&!F&&"focused",D&&"is-forwarding",e.isDeleting&&"is-deleting",x&&"is-in-document-group",Ye&&"is-album",e.hasUnreadMention&&"has-unread-mention",J&&"is-selected",K&&"is-in-selection-mode",R&&"is-thread-top",Boolean(e.inlineButtons)&&"has-inline-buttons",pt&&"is-swiped",Oe,Boolean(oe)&&"has-active-reaction"),Ft=function(e,{hasReply:t,customShape:n,isLastInGroup:a,asForwarded:s,hasThread:o,forceSenderName:i,hasComments:r,hasActionButton:c}={}){const{text:l,photo:u,video:m,audio:h,voice:g,document:p,poll:f,webPage:v,contact:I}=(0,d.qp)(e),y=["message-content"],Z=u||m,P=Z&&!l,C=Boolean(e.viaBotId);return fn(n)?y.push(`emoji-only emoji-only-${n}`):l&&y.push("text"),c&&y.push("has-action-button"),n&&(y.push("custom-shape"),null!=m&&m.isRound&&y.push("round"),r&&y.push("has-comments")),u||m?y.push("media"):h?y.push("audio"):g?y.push("voice"):p?y.push("document"):I?y.push("contact"):f?y.push("poll"):v&&(y.push("web-page"),(v.photo||v.video)&&y.push("media")),s&&y.push("is-forwarded"),t&&y.push("is-reply"),o&&y.push("has-replies"),C&&y.push("is-via-bot"),i&&y.push("force-sender-name"),n||(y.push("has-shadow"),Z&&r&&y.push("has-background"),(t||s||!P||C||i)&&y.push("has-solid-background"),!a||!u&&P||y.push("has-appendix")),y.join(" ")}(e,{hasReply:Ge,customShape:_e,isLastInGroup:y,asForwarded:Ve,hasThread:He,forceSenderName:b,hasComments:fe&&(null==fe?void 0:fe.messagesCount)>0,hasActionButton:et||tt}),$t=Ft.includes("has-appendix"),Dt=(0,pn.X)(e,_,fn(_e)),{text:jt,photo:Qt,video:qt,audio:Gt,voice:Ht,document:_t,sticker:zt,contact:Vt,poll:Yt,webPage:Xt,invoice:Wt}=(0,d.qp)(e);let Jt,en;Jt=We?"none":!Dt||ze||Xt?"standalone":"in-text",p?en="in-meta":null!=ne&&ne.reactions&&!(0,d.JE)(ne.reactions)?_e||(Qt||qt||ze)&&!Dt?en="outside":Ve?(Jt="standalone",en="inside"):en="inside":en="none",(0,Pt.Z)(Q&&e.replyToChatId?e.replyToChatId:Fe,Ge?e.replyToMessageId:void 0,T,e.id),En(Ze,Fe,O,U,F,$);let tn,nn="",an=!1;const sn=(0,o.Ye)((()=>Ye?Cn(Qe,Boolean(Ve),Boolean(c),r):void 0),[Ye,Qe,Ve,c,r]),on=Ve?28:0;if(Ye||!Qt&&!qt)sn&&(tn=Math.max(vn(Boolean(jt),nt),sn.containerStyle.width),tn-sn.containerStyle.width>18&&(an=!0));else{let t;Qt?t=In(e,c).width:qt&&(t=qt.isRound?Rt.Rj:In(e,c).width),t&&(tn=Math.max(vn(Boolean(jt),nt),t),tn-t>18&&(an=!0))}tn&&(nn=`width: ${tn+on}px`);const rn=q&&e.adminTitle||!Ve&&(null==$e?void 0:$e.adminTitle)||void 0,cn=(0,o.Ye)((()=>rn?bn(rn):void 0),[rn]);function dn(){const t=o.ZP.createElement(Qn,{message:e,outgoingStatus:B,signature:rn,withReactions:"in-meta"===en,withReactionOffset:"inside"===en,availableReactions:ae,activeReaction:oe,onClick:Mt});return"inside"!==en?t:o.ZP.createElement(Ra,{activeReaction:oe,message:ne,metaChildren:t,availableReactions:ae})}return o.ZP.createElement("div",{ref:Ze,id:`message${Ue}`,className:Ut,style:cn?`--meta-safe-author-width: ${cn}px`:void 0,"data-message-id":Ue,onMouseDown:rt,onClick:ct,onContextMenu:dt,onDoubleClick:lt,onMouseEnter:We?vt:void 0,onMouseMove:at?mt:void 0,onMouseLeave:at||We?gt:void 0},o.ZP.createElement("div",{ref:Pe,className:"bottom-marker","data-message-id":Ue,"data-last-message-id":r?r.messages[r.messages.length-1].id:void 0,"data-has-unread-mention":e.hasUnreadMention}),!x&&o.ZP.createElement("div",{className:"message-select-control"},J&&o.ZP.createElement("i",{className:"icon-select"})),P&&o.ZP.createElement("div",{className:(0,ue.Z)("message-select-control group-select",ee&&"is-selected"),onClick:Ot},ee&&o.ZP.createElement("i",{className:"icon-select"})),l&&function(){const e=ot&&(0,d.YC)(ot.id),t=ot&&e?ot:void 0,n=ot&&!e?ot:void 0,a=!ot&&$e?$e.hiddenUserName:void 0;return o.ZP.createElement(Kt.Z,{size:"small",user:t,chat:n,text:a,lastSyncTime:H,onClick:t||n?It:void 0})}(),o.ZP.createElement("div",{className:(0,ue.Z)("message-content-wrapper",Ft.includes("text")&&"can-select-text")},o.ZP.createElement("div",{ref:Ce,className:Ft,style:nn,dir:"auto"},Ve&&!Xe&&o.ZP.createElement("div",{className:"message-title"},we("ForwardedMessage")),function(){const t=(0,ue.Z)("content-inner",Ve&&"forwarded-message",Ge&&"reply-message",an&&"no-media-corners"),n=y&&!Dt&&!Ve&&!He,a=(0,ue.Z)("text-content","in-text"===Jt&&"with-meta",B&&"with-outgoing-icon");return o.ZP.createElement("div",{className:t,onDoubleClick:ut,dir:"auto"},function(){if(_e&&!De||!(g&&!Qt&&!qt||Ve||De||b)||Xe||Ge&&_e)return;let t,n;return!it||_e&&De?null!=$e&&$e.hiddenUserName&&(t=$e.hiddenUserName):(t=(0,d.OU)(we,it),Ve||(n=`color-${(0,d.Rs)(it)}`)),o.ZP.createElement("div",{className:"message-title",dir:"ltr"},t?o.ZP.createElement("span",{className:(0,ue.Z)("interactive",n),onClick:yt,dir:"auto"},(0,kt.Z)(t)):S?void 0:" ",S&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("span",{className:"via"},we("ViaBot")),o.ZP.createElement("span",{className:"interactive",onClick:Zt},(0,kt.Z)(`@${S.username}`))),null!=$e&&$e.isLinkedChannelPost?o.ZP.createElement("span",{className:"admin-title",dir:"auto"},we("DiscussChannel")):e.adminTitle&&!q?o.ZP.createElement("span",{className:"admin-title",dir:"auto"},e.adminTitle):void 0)}(),Ge&&o.ZP.createElement(Ln,{message:T,isProtected:L,sender:N,observeIntersection:s,onClick:Ct}),zt&&o.ZP.createElement(Hn,{message:e,observeIntersection:s,observeIntersectionForPlaying:i,shouldLoop:he,lastSyncTime:H}),z&&o.ZP.createElement(_n.Z,{size:"small",isOwn:Qe,sticker:z,effect:X,soundId:W,observeIntersection:s,lastSyncTime:H,forceLoadPreview:je,messageId:Ue,chatId:Fe,activeEmojiInteraction:ie}),V&&o.ZP.createElement(Na,{size:"small",isOwn:Qe,localSticker:V,localEffect:Y,soundId:W,observeIntersection:s,lastSyncTime:H,forceLoadPreview:je,messageId:Ue,chatId:Fe,activeEmojiInteraction:ie}),Ye&&o.ZP.createElement(Pa,{album:r,albumLayout:sn,observeIntersection:s,isOwn:Qe,isProtected:L,hasCustomAppendix:n,lastSyncTime:H,onMediaClick:Et}),!Ye&&Qt&&o.ZP.createElement(Kn,{message:e,observeIntersection:s,noAvatars:c,canAutoLoad:le,uploadProgress:A,shouldAffectAppendix:n,onClick:wt,onCancelUpload:Tt,isDownloading:de,isProtected:L,theme:w}),!Ye&&qt&&qt.isRound&&o.ZP.createElement(ba,{message:e,observeIntersection:s,canAutoLoad:le,lastSyncTime:H,isDownloading:de}),!Ye&&qt&&!qt.isRound&&o.ZP.createElement(sa,{message:e,observeIntersection:s,noAvatars:c,canAutoLoad:le,canAutoPlay:me,uploadProgress:A,lastSyncTime:H,onClick:wt,onCancelUpload:Tt,isDownloading:de,isProtected:L}),(Gt||Ht)&&o.ZP.createElement(Un.Z,{theme:w,message:e,origin:m.Cr.Inline,uploadProgress:A,lastSyncTime:H,isSelectable:x,isSelected:J,onPlay:bt,onReadMedia:!Ht||Qe&&!j?void 0:St,onCancelUpload:Tt,isDownloading:de}),_t&&o.ZP.createElement(On.Z,{message:e,observeIntersection:s,canAutoLoad:le,autoLoadFileMaxSizeMb:ge,uploadProgress:A,isSelectable:x,isSelected:J,onMediaClick:wt,onCancelUpload:Tt,isDownloading:de}),Vt&&o.ZP.createElement(ia,{contact:Vt}),Yt&&o.ZP.createElement(ma,{message:e,poll:Yt,onSendVote:Nt}),!ze&&Dt&&o.ZP.createElement("p",{className:a,dir:"auto"},Dt,"in-text"===Jt&&dn()),Xt&&o.ZP.createElement(pa,{message:e,observeIntersection:s,noAvatars:c,canAutoLoad:le,canAutoPlay:me,lastSyncTime:H,onMediaClick:wt,onCancelMediaTransfer:Tt,isDownloading:de,isProtected:L,theme:w}),Wt&&o.ZP.createElement(va,{message:e}))}(),!We&&"standalone"===Jt&&dn(),Je&&et?o.ZP.createElement(Le.Z,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:we("lng_context_forward_msg"),onClick:P?Bt:At},o.ZP.createElement("i",{className:"icon-share-filled"})):Je&&tt?o.ZP.createElement(Le.Z,{className:"message-action-button",color:"translucent-white",round:!0,size:"tiny",ariaLabel:"Focus message",onClick:ce?xt:Lt},o.ZP.createElement("i",{className:"icon-arrow-right"})):void 0,nt&&o.ZP.createElement(Ma,{threadInfo:fe,disabled:f}),$t&&o.ZP.createElement("div",{className:"svg-appendix",dangerouslySetInnerHTML:Qe?Ba:Aa}),at&&o.ZP.createElement("div",{className:(0,ue.Z)("quick-reaction",ft&&!oe&&"visible"),onClick:ht},o.ZP.createElement($n.Z,{reaction:se}))),e.inlineButtons&&o.ZP.createElement(Ea,{message:e,onClick:Ie}),"outside"===en&&o.ZP.createElement(Ra,{message:ne,isOutside:!0,activeReaction:oe,availableReactions:ae})),Ee&&o.ZP.createElement(An,{isOpen:be,anchor:Ee,message:e,album:r,chatUsername:t,messageListType:re,onClose:Te,onCloseAnimationEnd:Ne}))}))),La=(0,o.X$)((0,a.c$)(((e,{chatId:t})=>{const n=(0,r.fS)(e,t),{chatId:a,isBot:s}=n||{};return{message:n,bot:a&&s?(0,r.dy)(e,a):void 0,channel:!s&&a?(0,r.Z1)(e,a):void 0}}))((({chatId:e,message:t,containerRef:n,bot:s,channel:i})=>{const{viewSponsoredMessage:r,openChat:c,openChatByInvite:l,startBot:u,focusMessage:m}=(0,a.uC)(),h=(0,ke.Z)(),g=(0,o.sO)(null),p=Boolean(t),{observe:f}=(0,un.S1)({rootRef:n,debounceMs:200,threshold:1});if((0,o.d4)((()=>p?f(g.current,(t=>{t.isIntersecting&&r({chatId:e})})):void 0),[e,p,f,r]),t)return o.ZP.createElement("div",{className:"SponsoredMessage Message open",key:"sponsored-message"},o.ZP.createElement("div",{className:"message-content has-shadow has-solid-background",dir:"auto"},o.ZP.createElement("div",{className:"content-inner",dir:"auto"},o.ZP.createElement("div",{className:"message-title",dir:"ltr"},s&&(0,kt.Z)((0,d.Js)(s)||""),i&&(0,kt.Z)(t.chatInviteTitle||(0,d.U)(h,i,s)||"")),o.ZP.createElement("p",{className:"text-content with-meta",dir:"auto",ref:g},o.ZP.createElement("span",{className:"text-content-inner",dir:"auto"},(0,pn.H)(t.text.text,t.text.entities)),o.ZP.createElement("span",{className:"MessageMeta",dir:"ltr"},o.ZP.createElement("span",{className:"message-signature"},h("SponsoredMessage")))),o.ZP.createElement(Le.Z,{color:"secondary",size:"tiny",ripple:!0,onClick:()=>{t.chatInviteHash?l({hash:t.chatInviteHash}):t.channelPostId?m({chatId:t.chatId,messageId:t.channelPostId}):(c({id:t.chatId}),t.startParam&&u({botId:t.chatId,param:t.startParam}))},className:"SponsoredMessage__button"},h(t.isBot?"Conversation.ViewBot":t.channelPostId?"Conversation.ViewPost":"Conversation.ViewChannel")))))}))),Oa=(0,o.X$)((({chatId:e,messageIds:t,messageGroups:n,isViewportNewest:i,isUnread:r,withUsers:c,areReactionsInMeta:l,noAvatars:u,containerRef:p,anchorIdRef:f,memoUnreadDividerBeforeIdRef:v,memoFirstUnreadIdRef:I,threadId:y,type:Z,isReady:P,isScrollingRef:w,isScrollPatchNeededRef:b,threadTopMessageId:E,hasLinkedChat:M,isSchedule:S,noAppearanceAnimation:R,onFabToggle:k,onNotchToggle:T})=>{const{openHistoryCalendar:B}=(0,a.uC)(),{observeIntersectionForMedia:A,observeIntersectionForReading:x,observeIntersectionForAnimatedStickers:L}=function(e,t,n){const{markMessageListRead:s,markMessagesRead:o}=(0,a.uC)(),{observe:i}=(0,un.S1)({rootRef:t,throttleMs:mn,margin:hn}),{observe:r,freeze:c,unfreeze:d}=(0,un.S1)({rootRef:t,throttleMs:150},(t=>{if("thread"!==e)return;let a=0;const i=[];t.forEach((e=>{const{isIntersecting:t,target:n}=e;if(!t)return;const{dataset:s}=n,o=Number(s.lastMessageId||s.messageId);o>a&&(a=o),s.hasUnreadMention&&i.push(o)})),n.current&&a>=n.current&&s({maxId:a}),i.length&&o({messageIds:i})}));(0,fe.Z)(c,d);const{observe:l}=(0,un.S1)({rootRef:t,throttleMs:mn});return{observeIntersectionForMedia:i,observeIntersectionForReading:r,observeIntersectionForAnimatedStickers:l}}(Z,p,I),{backwardsTriggerRef:O,forwardsTriggerRef:U,fabTriggerRef:F}=function(e,t,n,i,r,c,d,l,u,g){const{loadViewportMessages:p}=(0,a.uC)(),[f,v]=(0,o.Ye)((()=>"thread"===e?[(0,C.Ds)((()=>p({direction:m.Uq.Backwards})),1e3,!0,!1),(0,C.Ds)((()=>p({direction:m.Uq.Forwards})),1e3,!0,!1)]:[]),[p,n]),I=(0,o.sO)(null),y=(0,o.sO)(null),Z=(0,o.sO)(null);function P(){if(!l)return;if(!n||!n.length)return c(!1),void d(!1);if(!i)return c(!0),void d(!0);if(!t.current)return;const{offsetHeight:e,scrollHeight:a,scrollTop:s}=t.current,o=Math.round(a-s-e),u=o<=1;c(r?!u:!(o<=50)),d(!u)}const{observe:w}=(0,un.S1)({rootRef:t,margin:h.gZ},(e=>{if(!v||!f)return;if(n[0]>=s.AE)return;const t=e.find((({isIntersecting:e})=>e));if(!t)return;const{target:a}=t;"backwards-trigger"===a.className?(h.i4&&u.current&&n.length<=s.hT&&(g.current=!0),f()):"forwards-trigger"===a.className&&v()}));(0,un._N)(I,w),(0,un._N)(y,w);const{observe:b,freeze:E,unfreeze:M}=(0,un.S1)({rootRef:t,margin:100},P);(0,un._N)(Z,b);const{observe:S,freeze:R,unfreeze:k}=(0,un.S1)({rootRef:t,margin:1},P);return(0,un._N)(Z,S),(0,Ie.Z)((()=>{l&&P()}),[l]),(0,Ie.Z)((()=>{E(),R(),setTimeout((()=>{k(),M()}),250)}),[n]),{backwardsTriggerRef:I,forwardsTriggerRef:y,fabTriggerRef:Z}}(Z,p,t,i,r,k,T,P,w,b),$=(0,ke.Z)(),D=o.ZP.createElement("div",{className:(0,ue.Z)("unread-divider","local-action-message"),key:"unread-messages"},o.ZP.createElement("span",null,$("UnreadMessages"))),j=R?0:n.reduce(((e,t)=>e+(0,g.xH)(t.senderGroups).length),0);let Q=0;const q=n.map(((e,t,n)=>{const a=e.senderGroups.map(((e,a,s)=>{if(1===e.length&&!an(e[0])&&(0,d.Lo)(e[0])){const i=e[0],r=a===s.length-1&&t===n.length-1;return(0,g.oA)([i.id===v.current&&D,o.ZP.createElement(xn,{key:i.id,message:i,observeIntersection:x,appearanceOrder:j-++Q,isLastInList:r})])}let i;return(0,g.xH)(e.map(((r,m)=>{const h=an(r)?r.mainMessage:r,p=an(r)?r:void 0,I=(0,d.B4)(h),P=an(r),C=e[m+1];h.previousLocalId&&f.current===`message${h.previousLocalId}`&&(f.current=`message${h.id}`);const w=!P&&h.groupedId?h.groupedId:void 0,b=C&&!an(C)?C.groupedId:void 0,S={isFirstInGroup:0===m,isLastInGroup:m===e.length-1,isFirstInDocumentGroup:Boolean(w&&w!==i),isLastInDocumentGroup:Boolean(w&&w!==b),isLastInList:m===e.length-1&&a===s.length-1&&t===n.length-1};i=w;const R=(0,d.KK)(h),k="scheduled"!==Z?R:`${h.date}_${R}`;return(0,g.oA)([h.id===v.current&&D,o.ZP.createElement(xa,{key:k,message:h,observeIntersectionForBottom:x,observeIntersectionForMedia:A,observeIntersectionForAnimatedStickers:L,album:p,noAvatars:u,withAvatar:S.isLastInGroup&&c&&!I&&!(h.id===E),withSenderName:S.isFirstInGroup&&c&&!I,areReactionsInMeta:l,threadId:y,messageListType:Z,noComments:!1===M,appearanceOrder:j-++Q,isFirstInGroup:S.isFirstInGroup,isLastInGroup:S.isLastInGroup,isFirstInDocumentGroup:S.isFirstInDocumentGroup,isLastInDocumentGroup:S.isLastInDocumentGroup,isLastInList:S.isLastInList}),h.id===E&&o.ZP.createElement("div",{className:"local-action-message",key:"discussion-started"},o.ZP.createElement("span",null,$("DiscussionStarted")))])})))}));return o.ZP.createElement("div",{className:"message-date-group",key:e.datetime,onMouseDown:on.q,teactFastList:!0},o.ZP.createElement("div",{className:(0,ue.Z)("sticky-date",!S&&"interactive"),key:"date-header",onMouseDown:on.q,onClick:S?void 0:()=>B({selectedAt:e.datetime})},o.ZP.createElement("span",{dir:"auto"},S&&e.originalDate===s.t4&&$("MessageScheduledUntilOnline"),S&&e.originalDate!==s.t4&&$("MessageScheduledOn",(0,N.j1)($,e.datetime,void 0,!0)),!S&&(0,N.j1)($,e.datetime))),(0,g.xH)(a))}));return o.ZP.createElement("div",{className:"messages-container",teactFastList:!0},o.ZP.createElement("div",{ref:O,key:"backwards-trigger",className:"backwards-trigger"}),(0,g.xH)(q),i&&o.ZP.createElement(La,{key:e,chatId:e,containerRef:p}),o.ZP.createElement("div",{ref:U,key:"forwards-trigger",className:"forwards-trigger"}),o.ZP.createElement("div",{ref:F,key:"fab-trigger",className:"fab-trigger"}))}));var Ua=n(3547);const Fa=(0,o.X$)((0,a.c$)(((e,{userId:t})=>{const{stickers:n}=e.stickers.greeting,a=(0,d.db)(t)+(0,d.db)(e.currentUserId),s=null!=n&&n.length?n[a%n.length]:void 0,o=(0,r.Z1)(e,t);return o?{sticker:s,lastUnreadMessageId:o.lastMessage&&o.lastMessage.id!==o.lastReadInboxMessageId?o.lastMessage.id:void 0,connectionState:e.connectionState}:{}}))((({sticker:e,connectionState:t,lastUnreadMessageId:n})=>{const{loadGreetingStickers:s,sendMessage:i,markMessageListRead:r}=(0,a.uC)(),c=(0,ke.Z)(),d=(0,o.sO)(null),{observe:l}=(0,un.S1)({rootRef:d,debounceMs:200});(0,o.d4)((()=>{e||"connectionStateReady"!==t||s()}),[t,s,e]),(0,o.d4)((()=>{"connectionStateReady"===t&&n&&r({maxId:n})}),[t,r,n]);const u=(0,o.I4)((e=>{e={...e,isPreloadedGlobally:!0},i({sticker:e})}),[i]);return o.ZP.createElement("div",{className:"ContactGreeting",ref:d},o.ZP.createElement("div",{className:"wrapper"},o.ZP.createElement("p",{className:"title",dir:"auto"},c("Conversation.EmptyPlaceholder")),o.ZP.createElement("p",{className:"description",dir:"auto"},c("Conversation.GreetingText")),o.ZP.createElement("div",{className:"sticker"},e&&o.ZP.createElement(Ua.Z,{sticker:e,onClick:u,clickArg:e,observeIntersection:l,size:160,className:"large"}))))}))),$a=(0,o.X$)((({isChatWithSelf:e,type:t,isGroupChatJustCreated:n})=>{const a=(0,ke.Z)();return"scheduled"===t?function(e){return o.ZP.createElement("div",{className:"empty"},o.ZP.createElement("span",null,e("ScheduledMessages.EmptyPlaceholder")))}(a):e?function(e){return o.ZP.createElement("div",{className:"NoMessages"},o.ZP.createElement("div",{className:"wrapper"},o.ZP.createElement("i",{className:"icon icon-cloud-download"}),o.ZP.createElement("h3",{className:"title"},e("Conversation.CloudStorageInfo.Title")),o.ZP.createElement("ul",{className:"description"},o.ZP.createElement("li",null,e("Conversation.ClousStorageInfo.Description1")),o.ZP.createElement("li",null,e("Conversation.ClousStorageInfo.Description2")),o.ZP.createElement("li",null,e("Conversation.ClousStorageInfo.Description3")),o.ZP.createElement("li",null,e("Conversation.ClousStorageInfo.Description4")))))}(a):n?function(e){return o.ZP.createElement("div",{className:"NoMessages"},o.ZP.createElement("div",{className:"wrapper",dir:e.isRtl?"rtl":void 0},o.ZP.createElement("h3",{className:"title"},e("EmptyGroupInfo.Title")),o.ZP.createElement("p",{className:"description"},e("EmptyGroupInfo.Subtitle")),o.ZP.createElement("ul",{className:"list-checkmarks"},o.ZP.createElement("li",null,e("EmptyGroupInfo.Line1")),o.ZP.createElement("li",null,e("EmptyGroupInfo.Line2")),o.ZP.createElement("li",null,e("EmptyGroupInfo.Line3")),o.ZP.createElement("li",null,e("EmptyGroupInfo.Line4")))))}(a):o.ZP.createElement("div",{className:"empty"},o.ZP.createElement("span",null,a("NoMessages")))})),Da=(0,C.Ds)((e=>e()),200,!1),ja=(0,o.X$)((0,a.c$)(((e,{chatId:t,threadId:n,type:a})=>{const s=(0,r.Z1)(e,t);if(!s)return{};const o=(0,r.$W)(e,t,n,a),i="scheduled"===a?(0,r.Fn)(e,t):(0,r.Zw)(e,t),c=(0,r.qS)(e,t,n);if(n!==u._f&&!(i&&c&&i[c]))return{};const{isRestricted:l,restrictionReason:m,lastMessage:h}=s,g=(0,r.G$)(e,t),p=n===u._f&&!o&&!s.unreadCount&&!g&&h&&!h.groupedId,f=(0,r.IK)(e,t);let v;return(0,r.pk)(e,t)&&(v=f.fullInfo?f.fullInfo.botDescription||"NoMessages":"Updating bot info..."),{isChatLoaded:!0,isRestricted:l,restrictionReason:m,isChannelChat:(0,d.eA)(s),isGroupChat:(0,d.Bf)(s),isCreator:s.isCreator,isChatWithSelf:(0,r.FM)(e,t),isRepliesChat:(0,d.pK)(t),isBot:Boolean(f),messageIds:o,messagesById:i,firstUnreadId:(0,r.It)(e,t,n),isViewportNewest:"thread"!==a||(0,r.b9)(e,t,n),threadFirstMessageId:(0,r.yZ)(e,t,n),focusingId:g,isSelectModeActive:(0,r.CA)(e),botDescription:v,threadTopMessageId:c,hasLinkedChat:s.fullInfo&&"linkedChatId"in s.fullInfo?Boolean(s.fullInfo.linkedChatId):void 0,lastSyncTime:e.lastSyncTime,...p&&{lastMessage:h}}}))((({chatId:e,threadId:t,type:n,hasTools:i,onFabToggle:c,onNotchToggle:l,isChatLoaded:u,isChannelChat:h,isGroupChat:p,canPost:f,isReady:v,isChatWithSelf:I,isRepliesChat:y,isCreator:Z,isBot:P,messageIds:w,messagesById:b,firstUnreadId:E,isViewportNewest:M,threadFirstMessageId:S,isRestricted:R,restrictionReason:k,focusingId:T,isSelectModeActive:N,lastMessage:B,botDescription:A,threadTopMessageId:x,hasLinkedChat:L,lastSyncTime:O,withBottomShift:U})=>{var F,$,D,j,Q,q;const{loadViewportMessages:G,setScrollOffset:H,loadSponsoredMessages:_,loadMessageReactions:z}=(0,a.uC)(),V=(0,o.sO)(null),Y=(0,o.sO)("thread"===n&&(0,r.Vt)((0,a.Rd)(),e,t)||0),X=(0,o.sO)(),W=(0,o.sO)(),K=(0,o.sO)(),J=(0,o.sO)(),ee=(0,o.sO)(),te=(0,o.sO)(),ne=(0,o.sO)(!1),ae=(0,o.sO)(Boolean(B)),[se,oe]=(0,o.eJ)(),ie=Boolean(w);(0,Ie.Z)((()=>{ie&&(0,C.R3)((()=>{ae.current=!1}))}),[ie]),(0,Ie.Z)((()=>{J.current=E}),[E]),(0,Ie.Z)((()=>{h&&v&&O&&_({chatId:e})}),[e,v,h,O]),(0,Ie.Z)((()=>{ie&&(ee.current=J.current)}),[ie]),(0,Ie.Z)((()=>{te.current=T}),[T]);const re=(0,o.Ye)((()=>{if(!w||!b)return;const e=!x||w[0]&&S!==w[0]?w:[x,...w];if(!e.length)return;const t=e.map((e=>b[e])).filter(Boolean);return sn((0,g.Xo)(t,["date","id"]),ee.current)}),[w,b,S,x]);(0,ln.Z)((()=>{if(!w||!b)return;const t=w.filter((e=>{var t;return null===(t=b[e])||void 0===t?void 0:t.reactions}));t.length&&z({chatId:e,ids:t})}),15e3);const ce=(0,o.Ye)((()=>{if("thread"===n)return(0,C.Ds)((()=>G({direction:m.Uq.Around})),1e3,!0,!1)}),[G,w]),{isScrolled:de,updateStickyDates:me}=function(){const[e,t]=(0,Me.Z)(!1),n=(0,rn.Z)(1e3,!0);return{isScrolled:e,updateStickyDates:(0,o.I4)(((e,a)=>{t(),document.body.classList.contains("is-scrolling-messages")||(0,C.T2)((()=>{document.body.classList.add("is-scrolling-messages")})),n((()=>{(0,C.T2)((()=>{const t=document.querySelector(".stuck");t&&t.classList.remove("stuck");const n=function(e,t){const n=e.querySelectorAll(".sticky-date"),a=e.scrollTop;return Array.from(n).find((e=>{const{offsetTop:n,offsetHeight:s}=e,o=n-a;return-s<=o&&o<=(t?60:10)}))}(e,a);n&&n.classList.add("stuck"),document.body.classList.remove("is-scrolling-messages")}))}))}),[t,n])}}(),he=(0,o.sO)(),ge=(0,o.sO)(),pe=(0,o.I4)((()=>{if(ne.current)return void(ne.current=!1);he.current=!0;const a=V.current;te.current||me(a,i),Da((()=>{he.current=!1,(0,C.T2)((()=>{a.parentElement&&(Y.current=a.scrollHeight-a.scrollTop,"thread"===n&&H({chatId:e,threadId:t,scrollOffset:Y.current}))}))}))}),[me,i,n,H,e,t]);(0,o.d4)((()=>{if(!("ResizeObserver"in window))return;const e=new ResizeObserver((([e])=>{e.target.offsetParent&&oe(e.contentRect.height)}));return e.observe(V.current),()=>{e.disconnect()}}),[]);const{height:fe}=ft();(0,o.d4)((()=>{V.current.dataset.normalHeight=String(V.current.offsetHeight)}),[fe,f]),(0,o.d4)((()=>{if(!ce||!u||R||T)return;if(w&&w[w.length-1]>=s.AE)return;const e=V.current;(!w||w.length{if(!w||!K.current)return;const e=K.current.filter((e=>w.includes(Number(e.dataset.messageId)))),t=e[1]||e[0];t&&(X.current=t.id,W.current=t.getBoundingClientRect().top)}),[w,M,se,i]),(0,tn.Z)((([e,t,n])=>{const a=V.current;K.current=Array.from(a.querySelectorAll(".message-list-item"));const o=w&&e&&w[w.length-1]!==e[e.length-1],r=(null==w?void 0:w[0])!==(null==e?void 0:e[0])&&(null==w?void 0:w.length)===s.hT/2+1,c=o&&!r,d=w&&te.current===w[w.length-1],l=M&&c&&w&&w.length{a.parentElement&&a.parentElement.classList.remove("force-messages-scroll")}),500));const{scrollTop:u,scrollHeight:m,offsetHeight:h}=a,g=Y.current,p=K.current[K.current.length-1];let f=g-(n||h);c&&(f-=p?p.offsetHeight:0);const v=M&&t&&f<=20;let I;if(c&&v&&!d&&(p&&(0,C.T2)((()=>{(0,dn.Z)(a,p,"end",20)})),I=m-h,Y.current=Math.max(Math.ceil(m-I),h),!l))return;const y=void 0!==n&&n!==se,Z=X.current&&a.querySelector(`#${X.current}`),P=!Z&&ee.current&&a.querySelector(".unread-divider");if(v&&y){if((0,dn.N)())return;I=m-h}else Z?(ge.current&&(ge.current=!1,(0,cn.z)(a)),I=u+(Z.getBoundingClientRect().top-(W.current||0))):I=P?Math.min(P.offsetTop-(i?60:10),m-g):m-g;(0,cn.Z)(a,Math.ceil(I)),te.current||(ne.current=!0,(0,C.T2)((()=>{ne.current=!1}))),Y.current=Math.max(Math.ceil(m-I),h)}),[w,M,se,i]),(0,nn.Z)((([e])=>{void 0!==e&&(0,le.YW)(200+s.fK)}),[N]);const ve=(0,ke.Z)(),ye=Boolean(e&&(0,d.YC)(e)),Ze=Boolean(!ye&&!h||I||y),Pe=Boolean(!Ze||h),Ce=(0,d.YC)(e)&&!I&&!P&&(!re&&!B&&w&&(!K.current||0===K.current.length)||1===(null==w?void 0:w.length)&&"contactSignUp"===(null==b||null===(F=b[w[0]])||void 0===F||null===($=F.content.action)||void 0===$?void 0:$.type)||"contactSignUp"===(null==B||null===(D=B.content)||void 0===D||null===(j=D.action)||void 0===j?void 0:j.type)),we=p&&Z&&1===(null==w?void 0:w.length)&&"chatCreate"===(null==b||null===(Q=b[w[0]])||void 0===Q||null===(q=Q.content.action)||void 0===q?void 0:q.type),be=(0,ue.Z)("MessageList custom-scroll",Pe&&"no-avatars",!f&&"no-composer","pinned"===n&&"type-pinned",U&&"with-bottom-shift",N&&"select-mode-active",de&&"scrolled",!v&&"is-animating");return o.ZP.createElement("div",{ref:V,className:be,onScroll:pe,onMouseDown:on.q},R?o.ZP.createElement("div",{className:"empty"},o.ZP.createElement("span",null,k?k.text:"This is a private "+(h?"channel":"chat"))):A?o.ZP.createElement("div",{className:"empty"},o.ZP.createElement("span",null,(0,kt.Z)(ve(A),["br","emoji","links"]))):Ce?o.ZP.createElement(Fa,{userId:e}):!w||re&&!we?w&&re||B?o.ZP.createElement(Oa,{chatId:e,messageIds:w||[B.id],messageGroups:re||sn([B]),isViewportNewest:Boolean(M),isUnread:Boolean(E),withUsers:Ze,areReactionsInMeta:ye,noAvatars:Pe,containerRef:V,anchorIdRef:X,memoUnreadDividerBeforeIdRef:ee,memoFirstUnreadIdRef:J,threadId:t,type:n,isReady:v,isScrollingRef:he,isScrollPatchNeededRef:ge,threadTopMessageId:x,hasLinkedChat:L,isSchedule:!!re&&"scheduled"===n,noAppearanceAnimation:!re||!ae.current,onFabToggle:c,onNotchToggle:l}):o.ZP.createElement(Xe.Z,{color:"white"}):o.ZP.createElement($a,{chatId:e,type:n,isChatWithSelf:I,isGroupChatJustCreated:we}))}))),Qa=(0,o.X$)((0,a.c$)((e=>{const t=(0,r.Bt)(e);if(!t)return{};const{chatId:n,threadId:a,type:s}=t,o=(0,r.Z1)(e,n);return{messageListType:s,unreadCount:o&&a===u._f&&"thread"===s?o.unreadCount:void 0}}))((({isShown:e,canPost:t,messageListType:n,unreadCount:s,withExtraShift:i})=>{const{focusNextReply:r}=(0,a.uC)(),c=(0,ke.Z)(),d=(0,o.sO)(null),l=(0,o.I4)((()=>{if(e)if("thread"===n)r();else{const e=d.current.parentElement.querySelector(".MessageList"),t=e.querySelectorAll(".message-list-item"),n=t[t.length-1];if(!n)return;(0,dn.Z)(e,n,"end",20)}}),[e,n,r]),u=(0,ue.Z)("ScrollDownButton",e&&"revealed",!t&&"no-composer",i&&"with-extra-shift");return o.ZP.createElement("div",{ref:d,className:u},o.ZP.createElement("div",{className:"ScrollDownButton-inner"},o.ZP.createElement(Le.Z,{color:"secondary",round:!0,onClick:l,ariaLabel:c("AccDescrPageDown")},o.ZP.createElement("i",{className:"icon-arrow-down"})),Boolean(s)&&o.ZP.createElement("div",{className:"unread-count"},(0,wt.bi)(s))))})));var qa=n(5723);const Ga=1280,Ha=/\.[^/.]+$/;async function _a(e,t,n,a){const o=URL.createObjectURL(t),{type:i,size:r}=t;let c,d;if(s.oG.has(i))if(n){const t=await(0,pt.pt)(o),{width:n,height:s}=t;if(n>Ga||s>Ga||"image/jpeg"!==i){const t=await Qt(o,Ga/Math.max(n,s),"image/jpeg");return URL.revokeObjectURL(o),_a(e,await(0,pt.gm)(t),!0,a)}"image/jpeg"===i&&(e=e.replace(Ha,".jpg")),c={width:n,height:s}}else d=o;else if(s.wG.has(i)){const{videoWidth:e,videoHeight:t,duration:n}=await(0,pt.jj)(o);c={width:e,height:t,duration:n},d=await(0,pt.ud)(o)}return{blobUrl:o,filename:e,mimeType:i,size:r,quick:c,previewBlobUrl:d,...a}}var za=n(6391);let Va;function Ya(e){Va.focus(),e.focus()}h.cj&&(Va=document.createElement("input"),Va.classList.add("for-ios-autocapitalization-fix"),document.body.appendChild(Va));var Xa=n(4784),Wa=n(2400),Ka=n(6389),Ja=n(971);const es={encoderPath:n.p+"c0155344d336103c2b6a0b28cc510750.js",reuseWorker:!0},ts={type:"audio/ogg"};let ns,as,ss;async function os(){return ns||(ns=n.e(161).then(n.t.bind(n,1161,23)),as=(await ns).default,ss=new as(es)),ns}async function is(e){await async function(){await os(),await ss.start()}();const t=Date.now();let n;const a=[],s=[];ss.ondataavailable=e=>{a.push(e)};const o=function(t,n){const a=t.sourceNode,o=a.context.createAnalyser();o.fftSize=64,a.connect(o);const i=o.frequencyBinCount,r=new Uint8Array(i);let c=!1;return function t(){if(c)return;o.getByteFrequencyData(r);const n=r.reduce(((e,t)=>e+t),0)/i/255;(t=>{s.push(255*t),e(t)})(n<.1?0:n),requestAnimationFrame(t)}(),()=>{c=!0}}(ss);return{stop:()=>new Promise(((e,i)=>{ss.onstop=()=>{e({blob:new Blob(a,ts),duration:Math.round(((n||Date.now())-t)/1e3),waveform:s})},ss.onerror=i;const r=Math.max(0,t+1e3-Date.now());setTimeout((()=>{ss.stop(),o()}),r)})),pause:()=>{const e=Math.max(0,t+1e3-Date.now());setTimeout((()=>{ss.pause(),n=Date.now(),o()}),e)}}}const rs=["image/png","image/jpeg","image/gif"];function cs(e){const{text:t,entities:n}=e||{};if(!t)return"";const a=(0,pn.H)(t,n,void 0,void 0,!0);return Array.isArray(a)?a.join(""):a}let ds,ls;var us=n(3575),ms=n(9295);function hs(e,t,n){const a=(0,rn.Z)(t,!0),[s,i]=(0,o.eJ)(),[r,c,d]=(0,Me.Z)();return(0,le.ZP)(c,d),(0,Ie.Z)((()=>{r||a((()=>{i(e())}))}),[...n,r]),s}const gs=/^@([a-z0-9_]{1,32})[\u00A0\u0020]+(.*)/i,ps=/^@([a-z0-9_]{1,32})[\u00A0\u0020]+\n{2,}/i,fs={username:"",query:"",canShowHelp:!1,usernameLowered:""},vs=document.createElement("div");const Is=(0,C.P2)((e=>e()),500,!0),ys=/^[\w@]{1,32}\s?/i,Zs=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"DeleteMessageModal",!t);return n?o.ZP.createElement(n,e):void 0}));function Ps(){return(Ps=Object.assign||function(e){for(var t=1;t{const n=(0,o.sO)(!1),a=(0,o.I4)((()=>{if(n.current=!0,ws)return ws=!1,void e();Cs&&(clearTimeout(Cs),Cs=void 0),Cs=window.setTimeout((()=>{n.current&&e()}),200)}),[e]),s=(0,o.I4)((()=>{n.current=!1}),[]);return o.ZP.createElement(Le.Z,Ps({},t,{onMouseEnter:h.$b?void 0:a,onMouseLeave:h.$b?void 0:s,onClick:h.$b?e:void 0}))}));var Es=n(2531);const Ms=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"AttachMenu",!t);return n?o.ZP.createElement(n,e):void 0})),Ss=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"SymbolMenu",!t);return n?o.ZP.createElement(n,e):void 0})),Rs=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"InlineBotTooltip",!t);return n?o.ZP.createElement(n,e):void 0})),ks=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"MentionTooltip",!t);return n?o.ZP.createElement(n,e):void 0})),Ts=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"CustomSendMenu",!t);return n?o.ZP.createElement(n,e):void 0})),Ns=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"StickerTooltip",!t);return n?o.ZP.createElement(n,e):void 0}));var Bs=n(9830);const As=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"BotCommandTooltip",!t);return n?o.ZP.createElement(n,e):void 0}));var xs=n(6503);const Ls=(0,o.X$)((0,a.c$)(((e,{messageId:t})=>{const{chatId:n}=(0,r.Bt)(e)||{};return n?{message:(0,r.hj)(e,n,t)}:{}}))((({isOpen:e,message:t,onClose:n})=>{const{clickInlineButton:s}=(0,a.uC)(),[i,r]=(0,xs.Z)(e,n),{isKeyboardSingleUse:c}=t||{},[d,l,u]=(0,Me.Z)(!0),m=()=>{u(),n()};if((0,o.d4)((()=>{l()}),[l,null==t?void 0:t.keyboardButtons]),t&&t.keyboardButtons)return o.ZP.createElement(Je.Z,{isOpen:e||d,autoClose:c,positionX:"right",positionY:"bottom",onClose:m,className:"BotKeyboardMenu",onCloseAnimationEnd:m,onMouseEnter:h.$b?void 0:i,onMouseLeave:h.$b?void 0:r},o.ZP.createElement("div",{className:"content"},t.keyboardButtons.map((e=>o.ZP.createElement("div",{className:"row"},e.map((e=>o.ZP.createElement(Le.Z,{ripple:!0,disabled:"NOT_SUPPORTED"===e.type,onClick:()=>s({button:e})},e.text))))))))})));var Os=n(3616),Us=n(7891);const Fs=(0,o.X$)((0,a.c$)((e=>{const{chatId:t,threadId:n,type:a}=(0,r.Bt)(e)||{};if(!t||!n||!a)return{};const{currentUserId:s,forwardMessages:{fromChatId:o,toChatId:i,messageIds:c}}=e,l=(0,r.Yy)(e,t,n),u="scheduled"===a?(0,r.wU)(e,t):(0,r._$)(e,t,n),m=e.settings.byKey.animationLevel>=1,h=i===t;let g,p;if(l?g=(0,r.hj)(e,t,l):u?g=(0,r.kK)(e,t,n,a):h&&1===c.length&&(g=(0,r.hj)(e,o,c[0])),l&&g){const{forwardInfo:n}=g,a=t===s;n&&(n.isChannelPost||a)&&(p=(0,r.cv)(e,g)),p||(p=(0,r.Ur)(e,g))}else h&&(p=(0,d.YC)(o)?(0,r.dy)(e,o):(0,r.Z1)(e,o));return{replyingToId:l,editingId:u,message:g,sender:p,shouldAnimate:m,forwardedMessagesCount:h?c.length:void 0}}))((({replyingToId:e,editingId:t,message:n,sender:s,shouldAnimate:i,forwardedMessagesCount:r})=>{const{setReplyingToId:c,setEditingId:d,focusMessage:l,exitForwardMode:u}=(0,a.uC)(),m=Boolean((e||t)&&n||s&&r),h=(0,Us.Z)([r],r?300:void 0),{shouldRender:g,transitionClassNames:p}=(0,pe.Z)(h&&m,void 0,!i,void 0,!i),f=(0,o.I4)((()=>{e?c({messageId:void 0}):t?d({messageId:void 0}):r&&u()}),[e,t,r,c,d,u]);(0,o.d4)((()=>m?(0,we.Z)(f):void 0),[m,f]);const v=(0,o.I4)((()=>{l({chatId:n.chatId,messageId:n.id})}),[l,n]),I=(0,ue.Z)("ComposerEmbeddedMessage",p),y=r&&r>1?`${r} forwarded messages`:void 0;if(g)return o.ZP.createElement("div",{className:I},o.ZP.createElement("div",null,o.ZP.createElement(Le.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:"Cancel replying",onClick:f},o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement(Ln,{className:"inside-input",message:n,sender:s,customText:y,title:t?"Edit Message":void 0,onClick:v})))}))),$s=(0,o.X$)((e=>{const{attachments:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"AttachmentModal",!t.length);return n?o.ZP.createElement(n,e):void 0})),Ds=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"BotCommandMenu",!t);return n?o.ZP.createElement(n,e):void 0})),js=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"PollModal",!t);return n?o.ZP.createElement(n,e):void 0})),Qs=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"DropArea",!t);return n?o.ZP.createElement(n,e):void 0})),qs=new RegExp(s.FM,"i"),Gs=(0,o.X$)((0,a.c$)(((e,{chatId:t,threadId:n})=>{const a=(0,r.tV)(e,t,n);return{theme:(0,r.Pu)(e),webPagePreview:e.webPagePreview,noWebPage:a}}))((({chatId:e,threadId:t,messageText:n,disabled:s,webPagePreview:i,noWebPage:r,theme:c})=>{const{loadWebPagePreview:d,clearWebPagePreview:l,toggleMessageWebPage:m}=(0,a.uC)(),h=hs((()=>{const{text:e,entities:t}=(0,f.Z)(n),a=t&&t.find((({type:e})=>e===u.Vv.TextUrl));if(a)return a.url;const s=e.match(qs);return s?s[0]:void 0}),300,[n]);(0,o.d4)((()=>{h?d({text:h}):(l(),m({chatId:e,threadId:t}))}),[e,m,l,h,d,t]),(0,Ie.Z)((()=>{l(),m({chatId:e,threadId:t})}),[e]);const g=Boolean(i&&n.length&&!r&&!s),{shouldRender:p,transitionClassNames:v}=(0,pe.Z)(g),I=(0,Ct.Z)(i,!0);if(!p||!I)return;const{photo:y,...Z}=I,P={content:{webPage:Z}};return o.ZP.createElement("div",{className:(0,ue.Z)("WebPagePreview",v)},o.ZP.createElement("div",null,o.ZP.createElement(Le.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:"Clear Webpage Preview",onClick:()=>{m({chatId:e,threadId:t,noWebPage:!0})}},o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement(pa,{message:P,inPreview:!0,theme:c})))}))),Hs=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"SendAsMenu",!t);return n?o.ZP.createElement(n,e):void 0}));var _s;!function(e){e.Send="send",e.Record="record",e.Edit="edit",e.Schedule="schedule"}(_s||(_s={}));const zs=(0,o.X$)((0,a.c$)(((e,{chatId:t,threadId:n,messageListType:a})=>{var o,i,c,l;const m=(0,r.Z1)(e,t),h=m&&(0,r.Dg)(e,m),g=t!==s.FV?(0,r.IK)(e,t):void 0,p=Boolean(g),f=(0,r.FM)(e,t),v=p&&(0,r.FT)(e,t),I=(0,r.qy)(e,t),{language:y,shouldSuggestStickers:Z}=e.settings.byKey,P=e.emojiKeywords[s.pR],C=y!==s.pR?e.emojiKeywords[y]:void 0,w=v?v.id:void 0,b=w?(0,r.hj)(e,t,w):void 0,{currentUserId:E}=e,M=null!=m&&m.fullInfo?(null==m||null===(o=m.fullInfo)||void 0===o?void 0:o.sendAsId)||E:void 0,S=M?(0,r.dy)(e,M):void 0,R=!S&&M?(0,r.Z1)(e,M):void 0;return{editingMessage:(0,r.kK)(e,t,n,a),connectionState:e.connectionState,draft:(0,r.Ms)(e,t,n),chat:m,isChatWithBot:p,isChatWithSelf:f,canScheduleUntilOnline:Boolean(!f&&!p&&m&&h&&(0,d.YC)(t)&&(null===(i=(0,r.ss)(e,t))||void 0===i?void 0:i.wasOnline)),isRightColumnShown:(0,r.Jf)(e),isSelectModeActive:(0,r.CA)(e),withScheduledButton:n===u._f&&"thread"===a&&Boolean(null==I?void 0:I.length),shouldSchedule:"scheduled"===a,botKeyboardMessageId:w,botKeyboardPlaceholder:null==b?void 0:b.keyboardPlaceholder,isForwarding:t===e.forwardMessages.toChatId,isPollModalOpen:e.isPollModalOpen,stickersForEmoji:e.stickers.forEmoji.stickers,groupChatMembers:null==m||null===(c=m.fullInfo)||void 0===c?void 0:c.members,topInlineBotIds:null===(l=e.topInlineBots)||void 0===l?void 0:l.userIds,currentUserId:E,lastSyncTime:e.lastSyncTime,contentToBeScheduled:e.messages.contentToBeScheduled,shouldSuggestStickers:Z,recentEmojis:e.recentEmojis,baseEmojiKeywords:null==P?void 0:P.keywords,emojiKeywords:null==C?void 0:C.keywords,serverTimeOffset:e.serverTimeOffset,inlineBots:e.inlineBots.byUsername,isInlineBotLoading:e.inlineBots.isLoading,chatBotCommands:m&&m.fullInfo&&m.fullInfo.botCommands,botCommands:g&&g.fullInfo?g.fullInfo.botCommands||!1:void 0,sendAsUser:S,sendAsChat:R,sendAsId:M}}))((({dropAreaState:e,shouldSchedule:t,canScheduleUntilOnline:n,isReady:i,onDropHide:r,editingMessage:l,chatId:m,threadId:g,messageListType:v,draft:I,chat:y,connectionState:Z,isChatWithBot:P,isChatWithSelf:w,isRightColumnShown:b,isSelectModeActive:E,isForwarding:M,isPollModalOpen:S,botKeyboardMessageId:R,botKeyboardPlaceholder:k,withScheduledButton:T,stickersForEmoji:B,groupChatMembers:A,topInlineBotIds:x,currentUserId:L,lastSyncTime:O,contentToBeScheduled:U,shouldSuggestStickers:F,baseEmojiKeywords:$,emojiKeywords:D,serverTimeOffset:j,recentEmojis:Q,inlineBots:q,isInlineBotLoading:G,botCommands:H,chatBotCommands:_,sendAsUser:z,sendAsChat:V,sendAsId:X})=>{const{sendMessage:W,clearDraft:K,showDialog:J,setStickerSearchQuery:ee,setGifSearchQuery:te,forwardMessages:ne,openPollModal:ae,closePollModal:se,loadScheduledHistory:oe,openChat:ie,addRecentEmoji:re,sendInlineBotResult:ce,loadSendAs:de}=(0,a.uC)(),le=(0,ke.Z)(),me=(0,o.sO)(null),[he,ge]=(0,o.eJ)(""),pe=(0,Ja.Y)(he),ye=(0,o.sO)(),Ze=(0,It.Z)(e),[Pe,Ce,be]=(0,Me.Z)(),[Ee,Se]=(0,o.eJ)(),{width:Re}=Y.Z.get(),Te=null==y?void 0:y.sendAsIds,Ne=(0,Ka.Z)(m,g);(0,o.d4)((()=>{ye.current=void 0}),[m]),(0,o.d4)((()=>{m&&O&&g===u._f&&i&&oe({chatId:m})}),[i,m,oe,O,g]),(0,o.d4)((()=>{m&&y&&O&&!Te&&i&&(0,d.ZV)(y)&&de({chatId:m})}),[y,m,i,O,de,Te]);const Be=(0,o.sO)(!1);(0,Ie.Z)((([e,t])=>{Be.current=Boolean(m===e&&Te&&!t)}),[m,Te]),(0,o.bt)((()=>{me.current&&(me.current.innerHTML='')}),[]),(0,o.d4)((()=>{U&&(Se(U),Ce())}),[U,Ce]);const[Ae,xe]=(0,o.eJ)([]),[Oe,Ue,Fe]=(0,Me.Z)(),[$e,De,Qe]=(0,Me.Z)(),[qe,Ge,He]=(0,Me.Z)(),[_e,ze,Ve]=(0,Me.Z)(),[Ye,Xe,We]=(0,Me.Z)(),[Ke,Je,et]=(0,Me.Z)(),[tt,nt]=(0,Me.Z)(),[at,st,ot]=(0,Me.Z)(),{startRecordingVoice:it,stopRecordingVoice:rt,pauseRecordingVoice:ct,activeVoiceRecording:dt,currentRecordTime:lt,recordButtonRef:ut,startRecordTimeRef:ht}=(()=>{const e=(0,o.sO)(null),[t,n]=(0,o.eJ)(),a=(0,o.sO)(),[s,i]=(0,o.eJ)();(0,o.d4)((()=>{h.s$&&h.mh&&os()}),[]);const r=(0,o.I4)((async()=>{try{const{stop:t,pause:s}=await is((t=>{e.current&&(a.current&&Date.now()%4==0&&(e.current.style.boxShadow=`0 0 0 ${50*(t||0)}px rgba(0,0,0,.15)`),i(Date.now()))}));a.current=Date.now(),i(Date.now()),n({stop:t,pause:s})}catch(e){console.error(e)}}),[]),c=(0,o.I4)((()=>{if(t){e.current&&(e.current.style.boxShadow="none");try{return t.pause()}catch(e){return void console.error(e)}}}),[t]),d=(0,o.I4)((()=>{if(t){n(void 0),a.current=void 0,i(void 0),e.current&&(e.current.style.boxShadow="none");try{return t.stop()}catch(e){return void console.error(e)}}}),[t]);return(0,o.d4)((()=>t?(0,we.Z)(d):void 0),[t,d]),{startRecordingVoice:r,pauseRecordingVoice:c,stopRecordingVoice:d,activeVoiceRecording:t,currentRecordTime:s,recordButtonRef:e,startRecordTimeRef:a}})();(0,ln.Z)((()=>{Ne({type:"recordAudio"})}),dt&&s.o_),(0,o.d4)((()=>{dt||Ne({type:"cancel"})}),[dt,Ne]);const gt=l?_s.Edit:!h.mh||dt||he&&!Ae.length||M?t?_s.Schedule:_s.Send:_s.Record,pt=!t,{isMentionTooltipOpen:ft,closeMentionTooltip:vt,insertMention:yt,mentionFilteredUsers:Zt}=(0,ms.Z)(!Ae.length,pe,ge,void 0,A,x,L),{isOpen:Pt,id:Ct,isGallery:wt,switchPm:bt,results:Et,closeTooltip:Mt,help:St,loadMore:Rt}=function(e,t,n,s){const{queryInlineBot:i,resetInlineBot:r}=(0,a.uC)(),[c,d,l]=(0,Me.Z)(),{username:u,query:m,canShowHelp:h,usernameLowered:g}=hs((()=>function(e){const t=function(e){return vs.innerHTML=e.replace(/
/g,"\n"),vs.innerText}(e),n=t.match(gs);return n?{username:n[1],query:n[2],canShowHelp:""===n[2]&&!t.match(ps),usernameLowered:n[1].toLowerCase()}:fs}(n)),300,[n])||{},p=(0,It.Z)(m),f=(0,It.Z)(u),v=g?null==s?void 0:s[g]:void 0,{id:I,switchPm:y,offset:Z,results:P,isGallery:C,help:w}=v||{};(0,o.d4)((()=>{p!==m&&l()}),[p,m,l]),(0,o.d4)((()=>{e&&g&&t&&i({chatId:t,username:g,query:m})}),[m,e,i,t,g]);const b=(0,o.I4)((()=>{i({chatId:t,username:g,query:m,offset:Z})}),[Z,t,m,i,g]);return(0,o.d4)((()=>{e&&I&&(y||null!=P&&P.length)?d():l()}),[I,e,d,P,y,l]),f!==u&&r({username:f}),{isOpen:c,id:I,isGallery:C,switchPm:y,results:P,closeTooltip:l,help:h&&w?`@${u} ${w}`:void 0,loadMore:b}}(Boolean(!Ae.length&&O),m,he,q),{isOpen:Tt,close:Nt,filteredBotCommands:Bt}=function(e,t,n,a){const[s,i,r]=(0,Me.Z)(),[c,d]=(0,o.eJ)(),l=(0,o.I4)((e=>{n||a?Is((()=>{const t=(n||a||[]).filter((({command:t})=>!e||t.includes(e)));d(t&&t.length?t:void 0)})):d(void 0)}),[n,a]);return(0,o.d4)((()=>{if(e&&t.length)if(t.startsWith("/")){const e=(0,Wa._)(t.substr(1)).match(ys);l(e?e[0]:"")}else r();else r()}),[l,t,e,r]),(0,o.d4)((()=>{c&&c.length?i():r()}),[c,i,r]),{isOpen:s,close:r,filteredBotCommands:c}}(Boolean(H&&H.length||_&&_.length),he,H,_),{isContextMenuOpen:At,handleContextMenu:xt,handleContextMenuClose:Lt,handleContextMenuHide:Ot}=(0,gn.Z)(ut,!(gt===_s.Send&&pt)),{canSendStickers:Ut,canSendGifs:Ft,canAttachMedia:$t,canAttachPolls:Dt,canAttachEmbedLinks:jt}=(0,o.Ye)((()=>(0,d.H5)(y,P)),[y,P]),Qt=y&&(0,d.Nl)(y),qt=(0,d.Hd)(y),{isStickerTooltipOpen:Gt,closeStickerTooltip:Ht}=function(e,t,n,s=!1){const i=(0,o.Ye)((()=>(0,Wa._)(t).trim()),[t]),{loadStickersForEmoji:r,clearStickersForEmoji:c}=(0,a.uC)(),d=h.op&&1===(0,Xa.Z)(i)||!h.op&&Boolean(t.match(/^]*?>$/g)),l=Boolean(n)&&d;return(0,o.d4)((()=>{var t;s||(e&&d?r({emoji:h.op?i:null===(t=i.match(/alt="(.+)"/))||void 0===t?void 0:t[1]}):!l&&d||c())}),[t,d,c,r,e,s]),{isStickerTooltipOpen:l,closeStickerTooltip:c}}(Boolean(F&&Ut&&!Ae.length),he,B,!i),{isEmojiTooltipOpen:_t,closeEmojiTooltip:zt,filteredEmojis:Vt,insertEmoji:Yt}=(0,us.Z)(Boolean(F&&Ut&&!Ae.length),pe,Q,void 0,ge,$,D,!i),Xt=(0,o.I4)(((e,t=s.R2)=>{const n=window.getSelection(),a=document.getElementById(t),o=(0,kt.Z)(e,["escape_html","emoji_html","br_html"]).join("").replace(/\u200b+/g,"​");if(n.rangeCount){const e=n.getRangeAt(0);if((0,za.R)(e,t))return function(e){const t=window.getSelection();if(null!=t&&t.getRangeAt&&t.rangeCount){const n=t.getRangeAt(0);n.deleteContents();const a=n.createContextualFragment(e),s=a.lastChild;n.insertNode(a),s?(n.setStartAfter(s),n.setEndAfter(s)):n.collapse(!1),t.removeAllRanges(),t.addRange(n)}}(o),void a.dispatchEvent(new Event("input",{bubbles:!0}))}ge(`${pe.current}${o}`),requestAnimationFrame((()=>{(0,qa.Z)(a)}))}),[pe]),Wt=(0,o.I4)((()=>{const e=window.getSelection();if(e.rangeCount){const t=e.getRangeAt(0);if((0,za.R)(t,s.R2))return void document.execCommand("delete",!1)}ge(function(e){const t=document.createElement("div");t.contentEditable="true",t.style.position="absolute",t.style.left="-10000px",t.style.top="-10000px",t.innerHTML=e,document.body.appendChild(t);let n=t.lastChild;if(n.lastChild)for(;n.lastChild;)n=n.lastChild;const a=n.textContent.length,s=document.createRange(),o=window.getSelection();s.setStart(n,a),s.setEnd(n,a),o.removeAllRanges(),o.addRange(s),document.execCommand("delete",!1);const i=t.innerHTML;return document.body.removeChild(t),i}(pe.current))}),[pe]),Jt=(0,o.I4)(((e=!1)=>{e||ge(""),xe(c.D),Ht(),be(),Se(void 0),vt(),zt(),h.wB?setTimeout((()=>Ve()),350):Ve()}),[Ht,be,vt,zt,Ve]),en=(0,o.sO)();en.current=rt,(0,o.d4)((()=>()=>{en.current(),Jt()}),[m,Jt,en]);const tn=((e,t,n,i,r)=>{const{editMessage:c}=(0,a.uC)();return(0,o.d4)((()=>{n?(t(cs(n.content.text)),requestAnimationFrame((()=>{const e=document.getElementById(s.R2);(0,qa.Z)(e,!0)}))):t("")}),[n,t]),(0,o.I4)((()=>{const{text:t,entities:a}=(0,f.Z)(e.current);n&&(t||(0,d.u8)(n)?(c({messageId:n.id,text:t,entities:a}),i()):r())}),[c,n,e,r,i])})(pe,ge,l,Jt,Je);((e,t,n,i,r,c)=>{const{saveDraft:d,clearDraft:l}=(0,a.uC)(),u=(0,o.I4)(((e,t)=>{const n=i.current;n.length&&!c?d({chatId:e,threadId:t,draft:(0,f.Z)(n)}):l({chatId:e,threadId:t})}),[l,c,i,d]),m=(0,o.Ye)((()=>(0,C.Ds)((e=>e()),s.r_,!1)),[t]),g=(0,It.Z)(t),p=(0,It.Z)(n);(0,o.d4)((()=>(ds=t,ls=n,()=>{ds=void 0,ls=void 0,u(t,n)})),[t,n,u]),(0,o.d4)((()=>{t===g&&n===p||e&&(r(cs(e)),h.$b||requestAnimationFrame((()=>{const e=document.getElementById(s.R2);(0,qa.Z)(e,!0)})))}),[t,n,e,r,u,g,p]);const v=i.current,I=(0,It.Z)(v);(0,o.d4)((()=>{t&&n&&g===t&&p===n&&I!==v&&(v.length?m((()=>{ds===t&&ls===n&&u(t,n)})):u(t,n))}),[t,v,g,I,p,m,n,u]);const y=(0,o.I4)((()=>{t&&n&&u(t,n)}),[t,n,u]);(0,fe.Z)(y),ve(y)})(I,m,g,pe,ge,l),((e,t,n)=>{(0,o.d4)((()=>{async function a(a){if(!a.clipboardData)return;const o=document.activeElement;if(o&&![s.R2,s.nY].includes(o.id))return;const{items:i}=a.clipboardData,r=Array.from(i).find((e=>rs.includes(e.type)&&"file"===e.kind)),c=r&&r.getAsFile(),d=a.clipboardData.getData("text").substring(0,4096);if(a.preventDefault(),c||d){if(c&&!n){const e=await _a(c.name,c,!0);t((t=>[...t,e]))}d&&e(d,null==o?void 0:o.id)}}return document.addEventListener("paste",a,!1),()=>{document.removeEventListener("paste",a,!1)}}),[e,n,t])})(Xt,xe,l);const nn=(0,o.I4)((async(e,t)=>{xe(await Promise.all(e.map((e=>_a(e.name,e,t)))))}),[]),an=(0,o.I4)((async(e,t)=>{xe([...Ae,...await Promise.all(e.map((e=>_a(e.name,e,t))))])}),[Ae]),sn=(0,o.I4)((()=>{xe(c.D)}),[]),on=(0,o.I4)((async(e=!1,t)=>{if("connectionStateReady"!==Z)return;let n=Ae;if(dt){const e=await rt();if(e){const{blob:t,duration:a,waveform:s}=e;n=[await _a("wonderful-voice-message.ogg",t,!1,{voice:{duration:a,waveform:s}})]}}const{text:a,entities:o}=(0,f.Z)(pe.current);if(!n.length&&!a&&!M)return;const i=n.length?1024:4096;if((null==a?void 0:a.length)>i){const e=a.length-i;return void J({data:{message:"MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS",textParams:{"{EXTRA_CHARS_COUNT}":e,"{PLURAL_S}":e>1?"s":""},hasErrorKey:!0}})}const r=document.getElementById(s.R2);if(n.length||a){if(qt&&!Qt){const e=(0,p.b)(j),t=ye.current&&Math.floor(e-ye.current),n=qt.nextSendDate&&qt.nextSendDate>e;if(t&&t{Jt()}))}),[Z,Ae,dt,M,K,m,j,Jt,rt,J,qt,Qt,W,ne,le,pe]),rn=(0,o.I4)((()=>{Ve(),De()}),[Ve,De]),cn=(0,o.I4)((()=>{Qe(),We(),ze()}),[Qe,We,ze]),dn=(0,o.I4)(((e,n=!1)=>{e={...e,isPreloadedGlobally:!0},t?(Se({sticker:e}),Ce()):(W({sticker:e}),requestAnimationFrame((()=>{Jt(n)})))}),[t,Ce,W,Jt]),un=(0,o.I4)((e=>{t?(Se({gif:e}),Ce()):(W({gif:e}),requestAnimationFrame((()=>{Jt(!0)})))}),[t,Ce,W,Jt]),mn=(0,o.I4)((e=>{if("connectionStateReady"!==Z)return;ce({id:e.id,queryId:e.queryId});const t=document.getElementById(s.R2);h.cj&&t===document.activeElement&&Ya(t),K({chatId:m,localOnly:!0}),requestAnimationFrame((()=>{Jt()}))}),[m,K,Z,Jt,ce]),hn=(0,o.I4)((()=>{K({chatId:m,localOnly:!0}),requestAnimationFrame((()=>{Jt()}))}),[m,K,Jt]),pn=(0,o.I4)((e=>{t?(Se({poll:e}),se(),Ce()):(W({poll:e}),se())}),[se,Ce,W,t]),fn=(0,o.I4)((()=>{t?(Se({isSilent:!0}),Ce()):on(!0)}),[on,Ce,t]),vn=(0,o.I4)(((e,t=!1)=>{const{isSilent:n,...a}=Ee||{},s=Math.round(Math.max(e.getTime(),Date.now()+6e4)/1e3)+(t?0:j);Ee&&0!==Object.keys(a).length?(W({...Ee,scheduledAt:s}),requestAnimationFrame((()=>{Jt()}))):on(!!n,s),be()}),[be,on,Jt,Ee,W,j]),In=(0,o.I4)((()=>{vn(new Date(1e3*s.t4),!0)}),[vn]),yn=(0,o.I4)((()=>{be(),Se(void 0)}),[be]),Zn=(0,o.I4)((e=>{"stickers"===e?(ee({query:""}),te({query:void 0})):(te({query:""}),ee({query:void 0}))}),[ee,te]),Pn=(0,o.I4)((()=>{const e=document.getElementById(s.R2);h.wB&&e===document.activeElement?(e.blur(),setTimeout((()=>{Qe(),ze()}),100)):ze()}),[ze,Qe]),Cn=(0,o.I4)((()=>{const e=document.getElementById(s.R2);if(!h.wB||e!==document.activeElement)return Qe(),Ve(),void Xe();e.blur(),setTimeout((()=>{Qe(),Ve(),Xe()}),100)}),[Qe,Ve,Xe]),wn=(0,o.I4)((()=>{ie({id:m,threadId:g,type:"scheduled"})}),[ie,m,g]);(0,o.d4)((()=>{b&&h.wB&&Ve()}),[b,Ve]),(0,o.d4)((()=>{i&&(E?st():setTimeout((()=>{ot()}),200))}),[E,ot,st,i]);const bn=(0,o.I4)((()=>{switch(gt){case _s.Send:on();break;case _s.Record:it();break;case _s.Edit:tn();break;case _s.Schedule:dt&&ct(),Ce()}}),[gt,on,it,tn,dt,Ce,ct]),En=gt===_s.Record&&!$t,Mn=(0,It.Z)(l,!0),Sn=l||Mn,Rn=new Date;Rn.setSeconds(0),Rn.setMilliseconds(0);const kn=new Date;kn.setFullYear(kn.getFullYear()+1);let Tn="SendMessage";switch(gt){case _s.Edit:Tn="Save edited message";break;case _s.Record:Tn=En?"Conversation.DefaultRestrictedMedia":"AccDescrVoiceMessage"}const Nn=(0,ue.Z)("Composer",!E&&"shown",at&&"hover-disabled"),Bn=(0,ue.Z)("mobile-symbol-menu-button",!i&&"not-ready",tt?_e&&"menu-opened":_e&&"is-loading"),An=gt===_s.Edit?tn:gt===_s.Schedule?Ce:on;return o.ZP.createElement("div",{className:Nn},$t&&i&&o.ZP.createElement(Qs,{isOpen:e!==mt.t.None,withQuick:e===mt.t.QuickFile||Ze===mt.t.QuickFile,onHide:r,onFileSelect:nn}),o.ZP.createElement($s,{chatId:m,threadId:g,attachments:Ae,caption:Ae.length?he:"",groupChatMembers:A,currentUserId:L,recentEmojis:Q,isReady:i,onCaptionUpdate:ge,baseEmojiKeywords:$,emojiKeywords:D,addRecentEmoji:re,onSend:t?Ce:on,onFileAppend:an,onClear:sn}),o.ZP.createElement(js,{isOpen:Boolean(S),onClear:se,onSend:pn}),Sn&&o.ZP.createElement(Zs,{isOpen:Ke,isSchedule:"scheduled"===v,onClose:et,message:Sn}),o.ZP.createElement(Hs,{isOpen:Ye,onClose:We,chatId:m,selectedSendAsId:X,sendAsIds:Te}),o.ZP.createElement(ks,{isOpen:ft,onClose:vt,onInsertUserName:yt,filteredUsers:Zt}),o.ZP.createElement(Rs,{isOpen:Pt,botId:Ct,isGallery:wt,inlineBotResults:Et,switchPm:bt,onSelectResult:mn,loadMore:Rt,onClose:Mt}),o.ZP.createElement(As,{isOpen:Tt,withUsername:Boolean(_),botCommands:Bt,onClick:hn,onClose:Nt}),o.ZP.createElement("div",{id:"message-compose"},o.ZP.createElement("div",{className:"svg-appendix",ref:me}),o.ZP.createElement(Fs,null),o.ZP.createElement(Gs,{chatId:m,threadId:g,messageText:Ae.length?"":he,disabled:!jt}),o.ZP.createElement("div",{className:"message-input-wrapper"},P&&!1!==H&&!dt&&!l&&o.ZP.createElement(bs,{className:(0,ue.Z)("bot-commands",$e&&"activated"),round:!0,disabled:void 0===H,color:"translucent",onActivate:rn,ariaLabel:"Open bot command keyboard"},o.ZP.createElement("i",{className:"icon-bot-commands-filled"})),!(null==Te||!Te.length)&&(z||V)&&o.ZP.createElement(Le.Z,{round:!0,color:"translucent",onClick:Ye?We:Cn,ariaLabel:le("SendMessageAsTitle"),className:(0,ue.Z)("send-as-button",Be.current&&"appear-animation")},o.ZP.createElement(Kt.Z,{user:z,chat:V,size:"tiny"})),h.wB?o.ZP.createElement(Le.Z,{className:Bn,round:!0,color:"translucent",onClick:_e?Ve:Pn,ariaLabel:"Choose emoji, sticker or GIF"},o.ZP.createElement("i",{className:"icon-smile"}),o.ZP.createElement("i",{className:"icon-keyboard"}),_e&&!tt&&o.ZP.createElement(je.Z,{color:"gray"})):o.ZP.createElement(bs,{className:_e?"activated":"",round:!0,color:"translucent",onActivate:cn,ariaLabel:"Choose emoji, sticker or GIF"},o.ZP.createElement("i",{className:"icon-smile"})),o.ZP.createElement(Os.Z,{id:"message-input-text",chatId:m,threadId:g,html:Ae.length?"":he,placeholder:dt&&Re<=600?"":k||le("Message"),forcedPlaceholder:St,canAutoFocus:i&&!Ae.length,shouldSuppressFocus:h.wB&&_e,shouldSuppressTextFormatter:_t||ft||Pt,onUpdate:ge,onSend:An,onSuppressedFocus:Ve}),G&&Boolean(Ct)&&o.ZP.createElement(je.Z,{color:"gray"}),T&&o.ZP.createElement(Le.Z,{round:!0,faded:!0,className:"scheduled-button",color:"translucent",onClick:wn,ariaLabel:"Open scheduled messages"},o.ZP.createElement("i",{className:"icon-schedule"})),R&&!dt&&!l&&o.ZP.createElement(bs,{className:Oe?"activated":"",round:!0,color:"translucent",onActivate:Ue,ariaLabel:"Open bot command keyboard"},o.ZP.createElement("i",{className:"icon-bot-command"})),!dt&&!l&&o.ZP.createElement(bs,{className:qe?"activated":"",round:!0,color:"translucent",onActivate:Ge,ariaLabel:"Add an attachment"},o.ZP.createElement("i",{className:"icon-attach"})),dt&<&&o.ZP.createElement("span",{className:"recording-state"},(0,N.rM)(lt-ht.current)),o.ZP.createElement(Ns,{chatId:m,threadId:g,isOpen:Gt,onStickerSelect:dn}),o.ZP.createElement(Bs.Z,{isOpen:_t,emojis:Vt,onClose:zt,onEmojiSelect:Yt,addRecentEmoji:re}),o.ZP.createElement(Ms,{isOpen:qe,canAttachMedia:$t,canAttachPolls:Dt,onFileSelect:nn,onPollCreate:ae,onClose:He}),R&&o.ZP.createElement(Ls,{messageId:R,isOpen:Oe,onClose:Fe}),H&&o.ZP.createElement(Ds,{isOpen:$e,botCommands:H,onClose:Qe}),o.ZP.createElement(Ss,{chatId:m,threadId:g,isOpen:_e,canSendGifs:Ft,canSendStickers:Ut,onLoad:nt,onClose:Ve,onEmojiSelect:Xt,onStickerSelect:dn,onGifSelect:un,onRemoveSymbol:Wt,onSearchOpen:Zn,addRecentEmoji:re}))),dt&&o.ZP.createElement(Le.Z,{round:!0,color:"danger",className:"cancel",onClick:rt,ariaLabel:"Cancel voice recording"},o.ZP.createElement("i",{className:"icon-delete"})),o.ZP.createElement(Le.Z,{ref:ut,round:!0,color:"secondary",className:(0,ue.Z)(gt,!i&&"not-ready",dt&&"recording"),disabled:En,ariaLabel:le(Tn),onClick:bn,onContextMenu:gt===_s.Send&&pt?xt:void 0},o.ZP.createElement("i",{className:"icon-send"}),o.ZP.createElement("i",{className:"icon-schedule"}),o.ZP.createElement("i",{className:"icon-microphone-alt"}),o.ZP.createElement("i",{className:"icon-check"})),pt&&o.ZP.createElement(Ts,{isOpen:At,onSilentSend:w?void 0:fn,onScheduleSend:t?void 0:Ce,onClose:Lt,onCloseAnimationEnd:Ot}),o.ZP.createElement(Es.Z,{isOpen:Pe,withTimePicker:!0,selectedAt:Rn.getTime(),maxAt:(0,N._F)(kn),isFutureMode:!0,secondButtonLabel:n?le("Schedule.SendWhenOnline"):void 0,onClose:yn,onSubmit:vn,onSecondButtonClick:n?In:void 0}))}))),Vs=(0,o.X$)((e=>{const{isActive:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"MobileSearch",!t,!0);return n?o.ZP.createElement(n,e):void 0})),Ys=(0,o.X$)((e=>{const{isActive:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"MessageSelectToolbar",!t);return n?o.ZP.createElement(n,e):void 0})),Xs=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"UnpinAllMessagesModal",!t);return n?o.ZP.createElement(n,e):void 0})),Ws=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"PaymentModal",!t);return n?o.ZP.createElement(n,e):void 0})),Ks=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"ReceiptModal",!t);return n?o.ZP.createElement(n,e):void 0})),Js=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"SeenByModal",!t);return n?o.ZP.createElement(n,e):void 0})),eo=(0,o.X$)((e=>{const{emojiInteraction:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"EmojiInteractionAnimation",!t);return n?o.ZP.createElement(n,e):void 0})),to=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"ReactorListModal",!t);return n?o.ZP.createElement(n,e):void 0})),no=h.wB?450+s.fK:void 0;function ao(e){return"file"===e.kind&&e.type&&s.oG.has(e.type)}const so=(0,o.X$)((0,a.c$)((e=>{const t=(0,r.Pu)(e),{isBlurred:n,background:a,backgroundColor:s,patternColor:o}=e.settings.themes[t]||{},{messageLists:i}=e.messages,c=(0,r.Bt)(e),{isLeftColumnShown:l,chats:{listIds:m},activeEmojiInteraction:g}=e,p={theme:t,customBackground:a,backgroundColor:s,patternColor:o,isLeftColumnShown:l,isRightColumnShown:(0,r.Jf)(e),isBackgroundBlurred:n,isMobileSearchActive:Boolean(h.wB&&(0,r.n5)(e)),isSelectModeActive:(0,r.CA)(e),isPaymentModalOpen:e.payment.isPaymentModalOpen,isReceiptModalOpen:Boolean(e.payment.receipt),isSeenByModalOpen:Boolean(e.seenByModal),isReactorListModalOpen:Boolean(e.reactorModal),animationLevel:e.settings.byKey.animationLevel,currentTransitionKey:Math.max(0,e.messages.messageLists.length-1),activeEmojiInteraction:g};if(!c||!m.active)return p;const{chatId:f,threadId:v,type:I}=c,y=(0,r.Z1)(e,f),Z=(0,r.IK)(e,f),P=(0,r.KB)(e,f),{chatId:C,messageId:w}=e.audioPlayer,b=y&&(0,d.Qm)(y,v),E=(0,r.pk)(e,f),M="pinned"===I,S="scheduled"===I,R="thread"===I&&v===u._f,k=Boolean(y&&(0,d.eA)(y)),T=Boolean(y&&R&&(k||(0,d.ZV)(y))&&y.isNotJoined),N=Boolean(Z&&(0,r.s4)(e,Z.id)),B=!N&&E;return{...p,chatId:f,threadId:v,messageListType:I,isPrivate:(0,d.YC)(f),canPost:!M&&(!y||b)&&!E,isPinnedMessageList:M,isScheduledMessageList:S,currentUserBannedRights:null==y?void 0:y.currentUserBannedRights,defaultBannedRights:null==y?void 0:y.defaultBannedRights,hasPinnedOrAudioPlayer:v!==u._f||Boolean(!M&&(null==P?void 0:P.length))||Boolean(C&&w),pinnedMessagesCount:P?P.length:0,shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,messageLists:i,isChannel:k,canSubscribe:T,canStartBot:B,canRestartBot:N}}))((({chatId:e,threadId:t,messageListType:n,isPrivate:i,isPinnedMessageList:r,messageLists:c,canPost:l,currentUserBannedRights:u,defaultBannedRights:m,hasPinnedOrAudioPlayer:g,pinnedMessagesCount:p,customBackground:f,theme:v,backgroundColor:I,patternColor:y,isLeftColumnShown:Z,isRightColumnShown:P,isBackgroundBlurred:C,isMobileSearchActive:w,isSelectModeActive:b,isPaymentModalOpen:E,isReceiptModalOpen:M,isSeenByModalOpen:S,isReactorListModalOpen:R,animationLevel:k,shouldSkipHistoryAnimations:T,currentTransitionKey:N,isChannel:B,canSubscribe:A,canStartBot:x,canRestartBot:L,activeEmojiInteraction:O})=>{const{openChat:U,unpinAllMessages:F,loadUser:$,closeLocalTextSearch:D,exitMessageSelectMode:j,closePaymentModal:Q,clearReceipt:q,joinChannel:G,sendBotCommand:H,restartBot:Y}=(0,a.uC)(),{width:X}=ft(),W=(0,ke.Z)(),[K,J]=(0,o.eJ)(mt.t.None),[ee,te]=(0,o.eJ)(),[ne,ae]=(0,o.eJ)(),[se,oe]=(0,o.eJ)(!1),ie=g&&(Xs._m&&X=s.ks&&X{e===s.oB&&r(!0)}),[e]),{isReady:i&&!d,handleOpenEnd:e!==s.oB?function(e){"transform"===e.propertyName&&e.target===e.currentTarget&&r(Boolean(a))}:void 0,handleSlideStop:e!==s.oB?function(){r(!0)}:void 0}}(k,N,ye,e);(0,o.d4)((()=>e?(0,we.Z)((()=>{U({id:void 0})})):void 0),[e,U]),(0,Ie.Z)((()=>{J(mt.t.None),te(void 0),ae(void 0)}),[e]),(0,o.d4)((()=>{const{visualViewport:e}=window;if(!e)return;const t=()=>{window.visualViewport.height!==document.documentElement.clientHeight?document.body.classList.add("keyboard-visible"):document.body.classList.remove("keyboard-visible")};return e.addEventListener("resize",t),()=>{e.removeEventListener("resize",t)}}),[]),(0,o.d4)((()=>{i&&$({userId:e})}),[e,i,$]);const Me=(0,o.I4)((e=>{if(h.$b)return;const{items:t}=e.dataTransfer||{},n=t&&Array.from(t).filter((e=>"text/uri-list"!==e.type)).every(ao);J(n?mt.t.QuickFile:mt.t.Document)}),[]),Re=(0,o.I4)((()=>{J(mt.t.None)}),[]),Te=(0,o.I4)((()=>{oe(!0)}),[]),Ne=(0,o.I4)((()=>{oe(!1)}),[]),Be=(0,o.I4)((()=>{F({chatId:e}),Ne(),U({id:e})}),[F,U,Ne,e]),Ae=(0,o.I4)((()=>{U({id:e})}),[U,e]),xe=(0,o.I4)((()=>{G({chatId:e})}),[G,e]),Oe=(0,o.I4)((()=>{H({command:"/start"})}),[H]),Ue=(0,o.I4)((()=>{Y({chatId:e})}),[e,Y]),Fe=((e,t)=>{const[n,a]=(0,o.eJ)(t);return(0,o.d4)((()=>{t&&(t.startsWith("#")?a(t):gt.fetch(s.fo,e,gt.Type.Blob).then((e=>{const t=URL.createObjectURL(e);(0,pt.pt)(t).then((()=>{a(`url(${t})`)}))})))}),[t,e]),t?n:void 0})(v,f),$e=(0,ue.Z)(pe&&"has-header-tools",f&&"custom-bg-image",I&&"custom-bg-color",f&&C&&"blurred",h.aZ?"mask-image-disabled":"mask-image-enabled"),De=(0,ue.Z)("messaging-disabled",!b&&"shown"),je=(0,d.q8)(W,u,m),{composerHiddenScale:Qe,toolbarHiddenScale:qe,composerTranslateX:Ge,toolbarTranslateX:He,unpinHiddenScale:_e,toolbarForUnpinHiddenScale:ze}=(0,o.Ye)((()=>function(e,t){const n=e<=s.l3?16:32,a=function(e){if(e>s._m){const t=Math.min(Math.max(.25*e,V),z),n=Math.min(.25*e,z);return Math.min(e-t-n,_)}if(e>s.ks){const t=Math.min(Math.max(.4*e,V),z);return Math.min(e-t,_)}return e>_?_:e}(e),o=e<=s.l3?54:64,i=t?a-n-o:a-n,r=e>s.l3?Math.min(a-n,512):a-n,c=r/i,d=i/r;return{composerHiddenScale:c,toolbarHiddenScale:d,composerTranslateX:t?o/2*d:0,toolbarTranslateX:t?o/2*-1*c:0,unpinHiddenScale:r/258,toolbarForUnpinHiddenScale:258/r}}(X,ge)),[ge,X]),Ve=(0,ue.Z)("middle-column-footer",!ge&&"no-composer",ge&&ne&&!b&&"with-notch");(0,Ce.ZP)(re&&ce,(()=>{U({id:void 0},{forceSyncOnIOs:!0})}),void 0,void 0,void 0,(null==c?void 0:c.map(ht.q))||[]),(0,Ce.ZP)(w,D),(0,Ce.ZP)(b,j);const Ye=Boolean(!r&&!ge&&je),Xe=Boolean(he||le||me||r),We=Boolean(Ye||b||r);return o.ZP.createElement("div",{id:"MiddleColumn",className:$e,onTransitionEnd:be,style:`\n --composer-hidden-scale: ${Qe};\n --toolbar-hidden-scale: ${qe};\n --unpin-hidden-scale: ${_e};\n --toolbar-unpin-hidden-scale: ${ze};\n --composer-translate-x: ${Ge}px;\n --toolbar-translate-x: ${He}px;\n --pattern-color: ${y};\n --theme-background-color:\n ${I||("dark"===v?s.It:s.p3)};\n `,onClick:h.p7&&Z?Ae:void 0},o.ZP.createElement("div",{id:"middle-column-bg",style:Fe?`--custom-background: ${Fe}`:void 0}),o.ZP.createElement("div",{id:"middle-column-portals"}),re&&ce&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("div",{className:"messages-layout",onDragEnter:ge?Me:void 0},o.ZP.createElement(en,{chatId:re,threadId:ce,messageListType:de,isReady:Pe}),o.ZP.createElement(Se.Z,{name:T?"none":k===s.zy?"slide":"fade",activeKey:N,shouldCleanup:!0,cleanupExceptionKey:Ze,onStop:Ee},(()=>o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(ja,{key:`${re}-${ce}-${de}`,chatId:re,threadId:ce,type:de,canPost:ge,hasTools:pe,onFabToggle:te,onNotchToggle:ae,isReady:Pe,withBottomShift:Xe}),o.ZP.createElement("div",{className:Ve},ge&&o.ZP.createElement(zs,{chatId:re,threadId:ce,messageListType:de,dropAreaState:K,onDropHide:Re,isReady:Pe}),r&&o.ZP.createElement("div",{className:"middle-column-footer-button-container",dir:W.isRtl?"rtl":void 0},o.ZP.createElement(Le.Z,{size:"tiny",fluid:!0,color:"secondary",className:"unpin-all-button",onClick:Te},o.ZP.createElement("i",{className:"icon-unpin"}),o.ZP.createElement("span",null,W("Chat.Pinned.UnpinAll",p,"i")))),Ye&&o.ZP.createElement("div",{className:De},o.ZP.createElement("div",{className:"messaging-disabled-inner"},o.ZP.createElement("span",null,je))),h.wB&&le&&o.ZP.createElement("div",{className:"middle-column-footer-button-container",dir:W.isRtl?"rtl":void 0},o.ZP.createElement(Le.Z,{size:"tiny",fluid:!0,ripple:!0,className:"join-subscribe-button",onClick:xe},W(ve?"ProfileJoinChannel":"ProfileJoinGroup"))),h.wB&&me&&o.ZP.createElement("div",{className:"middle-column-footer-button-container",dir:W.isRtl?"rtl":void 0},o.ZP.createElement(Le.Z,{size:"tiny",fluid:!0,ripple:!0,className:"join-subscribe-button",onClick:Oe},W("BotStart"))),h.wB&&he&&o.ZP.createElement("div",{className:"middle-column-footer-button-container",dir:W.isRtl?"rtl":void 0},o.ZP.createElement(Le.Z,{size:"tiny",fluid:!0,ripple:!0,className:"join-subscribe-button",onClick:Ue},W("BotRestart"))),o.ZP.createElement(Ys,{messageListType:de,isActive:b,canPost:ge}),o.ZP.createElement(Ws,{isOpen:Boolean(E),onClose:Q}),o.ZP.createElement(Ks,{isOpen:Boolean(M),onClose:q}),o.ZP.createElement(Js,{isOpen:S}),o.ZP.createElement(to,{isOpen:R}))))),o.ZP.createElement(Qa,{isShown:fe,canPost:ge,withExtraShift:We})),h.wB&&o.ZP.createElement(Vs,{isActive:Boolean(w)})),e&&o.ZP.createElement(Xs,{isOpen:se,chatId:e,pinnedMessagesCount:p,onClose:Ne,onUnpin:Be}),O&&o.ZP.createElement(eo,{emojiInteraction:O}))}))),oo=(0,C.Ds)((e=>e()),200,!1);var io;!function(e){e[e.Profile=0]="Profile",e[e.MemberList=1]="MemberList",e[e.SharedMedia=2]="SharedMedia",e[e.Search=3]="Search",e[e.Management=4]="Management",e[e.ManageInitial=5]="ManageInitial",e[e.ManageChannelSubscribers=6]="ManageChannelSubscribers",e[e.ManageChatAdministrators=7]="ManageChatAdministrators",e[e.ManageChatPrivacyType=8]="ManageChatPrivacyType",e[e.ManageDiscussion=9]="ManageDiscussion",e[e.ManageGroupPermissions=10]="ManageGroupPermissions",e[e.ManageGroupRemovedUsers=11]="ManageGroupRemovedUsers",e[e.ManageGroupUserPermissionsCreate=12]="ManageGroupUserPermissionsCreate",e[e.ManageGroupUserPermissions=13]="ManageGroupUserPermissions",e[e.ManageGroupRecentActions=14]="ManageGroupRecentActions",e[e.ManageGroupAdminRights=15]="ManageGroupAdminRights",e[e.ManageGroupNewAdminRights=16]="ManageGroupNewAdminRights",e[e.ManageGroupMembers=17]="ManageGroupMembers",e[e.ManageGroupAddAdmins=18]="ManageGroupAddAdmins",e[e.StickerSearch=19]="StickerSearch",e[e.GifSearch=20]="GifSearch",e[e.PollResults=21]="PollResults",e[e.AddingMembers=22]="AddingMembers",e[e.ManageInvites=23]="ManageInvites",e[e.ManageEditInvite=24]="ManageEditInvite",e[e.ManageReactions=25]="ManageReactions"}(io||(io={}));const ro=(0,o.X$)((0,a.c$)(((e,{chatId:t,isProfile:n,isManagement:a})=>{var s;const{query:o}=(0,r.n5)(e)||{},{query:i}=(0,r.y5)(e)||{},{query:c}=(0,r.yN)(e)||{},l=t?(0,r.Z1)(e,t):void 0,u=l&&(0,d.eA)(l),m=n&&t&&(0,d.YC)(t)?(0,r.dy)(e,t):void 0,h=m&&(0,d.kw)(m),g=Boolean(!a&&n&&!h&&l&&!(0,r.FM)(e,l.id)&&((0,d.YC)(l.id)||((0,d.Nl)(l)||l.isCreator)&&!l.isNotJoined)),p=Boolean(t&&(null===(s=e.management.byChatId[t])||void 0===s?void 0:s.editingInvite));return{canManage:g,canAddContact:h,isChannel:u,userId:null==m?void 0:m.id,messageSearchQuery:o,stickerSearchQuery:i,gifSearchQuery:c,isEditingInvite:p}}))((({isColumnOpen:e,isProfile:t,isSearch:n,isManagement:s,isStickerSearch:i,isGifSearch:r,isPollResults:c,isAddingChatMembers:d,profileState:l,managementScreen:u,canAddContact:g,userId:p,canManage:f,isChannel:v,onClose:I,messageSearchQuery:y,stickerSearchQuery:Z,gifSearchQuery:P,shouldSkipAnimation:C,isEditingInvite:w})=>{var b;const{setLocalTextSearchQuery:E,setStickerSearchQuery:M,setGifSearchQuery:S,searchTextMessagesLocal:R,toggleManagement:k,openHistoryCalendar:T,addContact:B}=(0,a.uC)(),A=(0,o.sO)(null),x=(0,o.I4)((e=>{E({query:e}),e.length&&oo(R)}),[R,E]),L=(0,o.I4)((e=>{M({query:e})}),[M]),O=(0,o.I4)((e=>{S({query:e})}),[S]),U=(0,o.I4)((()=>{B({userId:p})}),[B,p]),[F,$]=(0,o.eJ)(!e);(0,o.d4)((()=>{setTimeout((()=>{$(!e)}),300)}),[e]);const D=(0,ke.Z)(),j=t?l===m.vi.Profile?io.Profile:l===m.vi.SharedMedia?io.SharedMedia:l===m.vi.MemberList?io.MemberList:-1:n?io.Search:c?io.PollResults:i?io.StickerSearch:r?io.GifSearch:d?io.AddingMembers:s?u===m.u1.Initial?io.ManageInitial:u===m.u1.ChatPrivacyType?io.ManageChatPrivacyType:u===m.u1.Discussion?io.ManageDiscussion:u===m.u1.ChannelSubscribers?io.ManageChannelSubscribers:u===m.u1.GroupPermissions?io.ManageGroupPermissions:u===m.u1.ChatAdministrators?io.ManageChatAdministrators:u===m.u1.GroupRemovedUsers?io.ManageGroupRemovedUsers:u===m.u1.GroupUserPermissionsCreate?io.ManageGroupUserPermissionsCreate:u===m.u1.GroupUserPermissions?io.ManageGroupUserPermissions:u===m.u1.GroupRecentActions?io.ManageGroupRecentActions:u===m.u1.ChatAdminRights?io.ManageGroupAdminRights:u===m.u1.ChatNewAdminRights?io.ManageGroupNewAdminRights:u===m.u1.GroupMembers?io.ManageGroupMembers:u===m.u1.Invites?io.ManageInvites:u===m.u1.EditInvite?io.ManageEditInvite:u===m.u1.GroupAddAdmins?io.ManageGroupAddAdmins:u===m.u1.Reactions?io.ManageReactions:void 0:void 0,Q=null!==(b=(0,Ct.Z)(j,!0))&&void 0!==b?b:-1;function q(){if(-1!==Q)switch(Q){case io.PollResults:return o.ZP.createElement("h3",null,D("PollResults"));case io.Search:return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(Oe.Z,{parentContainerClassName:"RightSearch",value:y,onChange:x}),o.ZP.createElement(Le.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>T({selectedAt:(0,N._F)(Date.now())}),ariaLabel:"Search messages by date"},o.ZP.createElement("i",{className:"icon-calendar"})));case io.AddingMembers:return o.ZP.createElement("h3",null,D(v?"ChannelAddSubscribers":"GroupAddMembers"));case io.ManageInitial:return o.ZP.createElement("h3",null,D("Edit"));case io.ManageChatPrivacyType:return o.ZP.createElement("h3",null,D(v?"ChannelTypeHeader":"GroupTypeHeader"));case io.ManageDiscussion:return o.ZP.createElement("h3",null,D("Discussion"));case io.ManageChatAdministrators:return o.ZP.createElement("h3",null,D("ChannelAdministrators"));case io.ManageGroupRecentActions:return o.ZP.createElement("h3",null,D("Group.Info.AdminLog"));case io.ManageGroupAdminRights:return o.ZP.createElement("h3",null,D("EditAdminRights"));case io.ManageGroupNewAdminRights:return o.ZP.createElement("h3",null,D("SetAsAdmin"));case io.ManageGroupPermissions:return o.ZP.createElement("h3",null,D("ChannelPermissions"));case io.ManageGroupRemovedUsers:return o.ZP.createElement("h3",null,D("ChannelBlockedUsers"));case io.ManageGroupUserPermissionsCreate:return o.ZP.createElement("h3",null,D("ChannelAddException"));case io.ManageGroupUserPermissions:return o.ZP.createElement("h3",null,D("UserRestrictions"));case io.ManageInvites:return o.ZP.createElement("h3",null,D("lng_group_invite_title"));case io.ManageEditInvite:return o.ZP.createElement("h3",null,D(w?"EditLink":"NewLink"));case io.ManageGroupAddAdmins:return o.ZP.createElement("h3",null,D("Channel.Management.AddModerator"));case io.StickerSearch:return o.ZP.createElement(Oe.Z,{value:Z,placeholder:D("SearchStickersHint"),autoFocusSearch:!0,onChange:L});case io.GifSearch:return o.ZP.createElement(Oe.Z,{value:P,placeholder:D("SearchGifsTitle"),autoFocusSearch:!0,onChange:O});case io.SharedMedia:return o.ZP.createElement("h3",null,D("SharedMedia"));case io.ManageChannelSubscribers:return o.ZP.createElement("h3",null,D("ChannelSubscribers"));case io.MemberList:case io.ManageGroupMembers:return o.ZP.createElement("h3",null,D("GroupMembers"));case io.ManageReactions:return o.ZP.createElement("h3",null,D("Reactions"));default:return o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement("h3",null,"Profile"),o.ZP.createElement("section",{className:"tools"},g&&o.ZP.createElement(Le.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:D("AddContact"),onClick:U},o.ZP.createElement("i",{className:"icon-add-user"})),f&&o.ZP.createElement(Le.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:D("Edit"),onClick:k},o.ZP.createElement("i",{className:"icon-edit"}))))}}const G=h.wB||j===io.SharedMedia||j===io.MemberList||j===io.AddingMembers||s,H=(0,ue.Z)("animated-close-icon",G&&"state-back",(F||C)&&"no-transition");return o.ZP.createElement("div",{className:"RightHeader"},o.ZP.createElement(Le.Z,{className:"close-button",round:!0,color:"translucent",size:"smaller",onClick:I,ariaLabel:D(G?"Common.Back":"Common.Close")},o.ZP.createElement("div",{ref:A,className:H})),o.ZP.createElement(Se.Z,{name:F||C?"none":"slide-fade",activeKey:Q},q))})));var co=n(91),lo=n(7407);function uo(e,t,n,a){const[o,i]=(0,lo.Z)(n?t:void 0,a,void 0,s.Vk);return[o,i,!(!o||!a||o[0]===a[0])]}function mo(e,t,n,a,i,r){const c=(0,o.sO)();(0,Ie.Z)((()=>{t===e&&i&&r&&(c.current=(0,d.R5)(i,r,e).reverse())}),[i,r,t,e]);const[l,u]=(0,lo.Z)(a?n:void 0,c.current,void 0,"media"===e?s.EN:s.pn);return[l,u,!(!l||!c.current||l[0]===c.current[0])]}const ho=(0,C.P2)((e=>e()),250,!1);let go=!1;var po=n(1273),fo=n(1876),vo=n(787),Io=n(180),yo=n(3709),Zo=n(5418),Po=n(7262),Co=n(1151),wo=n(2275);const bo=[{type:"media",title:"SharedMediaTab2"},{type:"documents",title:"SharedFilesTab2"},{type:"links",title:"SharedLinksTab2"},{type:"audio",title:"SharedMusicTab2"},{type:"voice",title:"SharedVoiceTab2"}];function Eo(e){return[`.shared-media-transition > div:only-child > .${e}-list > .scroll-item`,`.shared-media-transition > .Transition__slide--active > .${e}-list > .scroll-item`].join(", ")}const Mo=(0,o.X$)((0,a.c$)(((e,{chatId:t,userId:n})=>{var a,s;const o=(0,r.Z1)(e,t),i=(0,r.Zw)(e,n||t),{currentType:c,resultsByType:l}=(0,r.we)(e)||{},{foundIds:u}=l&&c&&l[c]||{},{byId:m,statusesById:h}=e.users,{byId:g}=e.chats,p=o&&(0,d.Bf)(o),f=o&&(0,d.eA)(o),v=p||f&&(0,d.Nl)(o),I=null==o||null===(a=o.fullInfo)||void 0===a?void 0:a.members,y=v&&o&&o.fullInfo&&!o.fullInfo.canViewMembers,Z=v&&o&&((0,d.VE)(o,"inviteUsers")||o.isCreator),P=v&&o&&((0,d.VE)(o,"banUsers")||o.isCreator),C=(0,r.xs)(e,t);let w,b,E;return n?b=n:(0,d.YC)(t)&&(b=t),b&&(E=(0,r.dy)(e,b),w=E&&!E.isSelf&&!(0,d.cS)(E)),{theme:(0,r.Pu)(e),isChannel:f,resolvedUserId:b,chatMessages:i,foundIds:u,mediaSearchType:c,hasCommonChatsTab:w,hasMembersTab:v,areMembersHidden:y,canAddMembers:Z,canDeleteMembers:P,currentUserId:e.currentUserId,isRightColumnShown:(0,r.Jf)(e),isRestricted:null==o?void 0:o.isRestricted,lastSyncTime:e.lastSyncTime,serverTimeOffset:e.serverTimeOffset,activeDownloadIds:C,usersById:m,userStatusesById:h,chatsById:g,isChatProtected:null==o?void 0:o.isProtected,...v&&I&&{members:I},...w&&E&&{commonChatIds:null===(s=E.commonChats)||void 0===s?void 0:s.ids}}}))((({chatId:e,profileState:t,onProfileStateChange:n,theme:i,isChannel:r,resolvedUserId:c,currentUserId:l,chatMessages:g,foundIds:p,mediaSearchType:f,hasCommonChatsTab:v,hasMembersTab:I,areMembersHidden:y,canAddMembers:Z,canDeleteMembers:P,commonChatIds:C,members:w,usersById:b,userStatusesById:E,chatsById:M,isRightColumnShown:S,isRestricted:R,lastSyncTime:k,activeDownloadIds:T,serverTimeOffset:N,isChatProtected:B})=>{const{setLocalMediaSearchType:A,loadMoreMembers:x,loadCommonChats:L,openChat:O,searchMediaMessagesLocal:U,openMediaViewer:F,openAudioPlayer:$,openUserInfo:D,focusMessage:j,loadProfilePhotos:Q,setNewChatMembersDialogState:q}=(0,a.uC)(),G=(0,o.sO)(null),H=(0,o.sO)(null),_=(0,ke.Z)(),[z,V]=(0,o.eJ)(0),[Y,X]=(0,o.eJ)(),W=(0,o.Ye)((()=>[...I?[{type:"members",title:r?"ChannelSubscribers":"GroupMembers"}]:[],...bo,...v?[{type:"commonChats",title:"SharedGroupsTab2"}]:[]]),[v,I,r]),K=W[z].type,[J,ee,te,ne]=function(e,t,n,a,s,i,r,c,l,u,m,h,g,p,f,v=0){const I="members"!==s&&i?i:s,y=(0,o.Ye)((()=>{if(r&&l&&u)return(0,d.Z0)(r.map((({userId:e})=>e)),l,u,void 0,v)}),[r,v,l,u]),Z=(0,o.Ye)((()=>{if(c&&m)return(0,d.ih)(c,m,!0)}),[m,c]),[P,C,w]=uo(0,t,f,y),[b,E,M]=mo("media",I,a,f,h,g),[S,R,k]=mo("documents",I,a,f,h,g),[T,N,B]=mo("links",I,a,f,h,g),[A,x,L]=mo("audio",I,a,f,h,g),[O,U,F]=mo("voice",I,a,f,h,g),[$,D,j]=uo(0,n,f,Z);let Q,q,G=!1;switch(I){case"members":Q=P,q=C,G=w;break;case"commonChats":Q=$,q=D,G=j;break;case"media":Q=b,q=E,G=M;break;case"documents":Q=S,q=R,G=k;break;case"links":Q=T,q=N,G=B;break;case"audio":Q=A,q=x,G=L;break;case"voice":Q=O,q=U,G=F}return[I,Q,q,G]}(0,x,L,U,K,f,w,C,b,E,M,g,p,0,k,N),ae=W.findIndex((({type:e})=>e===J)),{handleScroll:se}=function(e,t,n,a){(0,nn.Z)((([n])=>{if(n&&n!==t){const n=e.current,s=n.querySelector(".TabList");n.scrollTop{go=!1}),350))}}),[t,a]),(0,nn.Z)((([t])=>{if(n!==m.vi.Profile||n===t)return;const s=e.current;if(!s)return;const o=s.querySelector(".TabList");!o||o.offsetTop>s.scrollTop||(go=!0,(0,dn.Z)(s,s.firstElementChild,"start",void 0,2*s.offsetHeight),setTimeout((()=>{go=!1}),350),a(n))}),[n]);const s=(0,o.I4)((()=>{const n=e.current;if(!n)return;const s=n.querySelector(".TabList");if(!s)return;let o=m.vi.Profile;n.scrollTop>=s.offsetTop&&(o="members"===t?m.vi.MemberList:m.vi.SharedMedia),a(o)}),[e,a,t]);return(0,o.d4)((()=>{go||s()}),[s,t]),{handleScroll:(0,o.I4)((()=>{go||ho(s)}),[s])}}(G,K,t,n),{applyTransitionFix:oe,releaseTransitionFix:ie}=function(e,t=".Transition.shared-media-transition"){return(0,o.d4)((()=>{function n(){const n=e.current,a=n.querySelector(t),s=n.querySelector(".TabList");a&&s&&(a.style.minHeight=n.offsetHeight-s.offsetHeight+"px")}return n(),window.addEventListener("resize",n,!1),()=>{window.removeEventListener("resize",n,!1)}}),[e,t]),{applyTransitionFix:(0,o.I4)((()=>{const t=e.current;if("hidden"!==t.style.overflowY){const e=t.offsetWidth-t.clientWidth;t.style.overflowY="hidden",t.style.marginRight=`${e}px`}}),[e]),releaseTransitionFix:(0,o.I4)((()=>{const t=e.current;t.style.overflowY="scroll",t.style.marginRight="0"}),[e])}}(G),[re,ce]=(()=>{const[e,t]=(0,o.eJ)(!1);return[e,(0,o.I4)((()=>{t((e=>!e))}),[])]})(),de=(0,o.I4)((()=>{ie(),ce()}),[ie,ce]),le=(0,o.I4)((()=>{q(m.WB.InProgress)}),[q]);(0,o.d4)((()=>{A({mediaType:K})}),[A,K]);const ue=c||e;(0,o.d4)((()=>{k&&Q({profileId:ue})}),[Q,ue,k]);const me=(0,o.I4)((e=>{F({chatId:ue,threadId:u._f,messageId:e,origin:m.bZ.SharedMedia})}),[ue,F]),he=(0,o.I4)((e=>{$({chatId:ue,messageId:e})}),[ue,$]),ge=(0,o.I4)((e=>{D({id:e})}),[D]),pe=(0,o.I4)((e=>{j({chatId:ue,messageId:e})}),[ue,j]),fe=(0,o.I4)((()=>{X(void 0)}),[]);let ve;(0,o.d4)((()=>{if(H.current&&h.$b)return(0,qe.s)(H.current,{selectorToPreventScroll:".Profile",onSwipe:(e,t)=>t===qe.e.Left?(V(Math.min(z+1,W.length-1)),!0):t===qe.e.Right&&(V(Math.max(0,z-1)),!0)})}),[z,W.length]);const Ie="members"===J||!I&&"media"===J;Ie?ve=S?0:1e3:ee||(ve=s.Y);const ye=(0,Us.Z)([e,J],ve);function Ze(){if(!ee||!ye||!g){const e=Ie&&ee&&!ye;return o.ZP.createElement("div",{className:"content empty-list"},!e&&o.ZP.createElement(je.Z,null))}if(!ee.length){let e;switch(J){case"members":e=y?"You have no access to group members list.":"No members found";break;case"commonChats":e=_("NoGroupsInCommon");break;case"documents":e=_("lng_media_file_empty");break;case"links":e=_("lng_media_link_empty");break;case"audio":e=_("lng_media_song_empty");break;case"voice":e=_("lng_media_audio_empty");break;default:e=_("SharedMedia.EmptyTitle")}return o.ZP.createElement("div",{className:"content empty-list"},o.ZP.createElement(Po.Z,{text:e}))}return o.ZP.createElement("div",{className:`content ${J}-list`,dir:_.isRtl&&"media"===J?"rtl":void 0,teactFastList:!0},"media"===J?ee.map((e=>g[e]&&o.ZP.createElement(yo.Z,{key:e,message:g[e],isProtected:B||g[e].isProtected,onClick:me}))):"documents"===J?ee.map((e=>g[e]&&o.ZP.createElement(On.Z,{key:e,message:g[e],withDate:!0,smaller:!0,className:"scroll-item",onDateClick:pe,isDownloading:T.includes(e)}))):"links"===J?ee.map((e=>g[e]&&o.ZP.createElement(Zo.Z,{key:e,message:g[e],isProtected:B||g[e].isProtected,onMessageClick:pe}))):"audio"===J?ee.map((e=>g[e]&&o.ZP.createElement(Un.Z,{key:e,theme:i,message:g[e],origin:m.Cr.SharedMedia,date:g[e].date,lastSyncTime:k,className:"scroll-item",onPlay:he,onDateClick:pe,isDownloading:T.includes(e)}))):"voice"===J?ee.map((e=>g[e]&&o.ZP.createElement(Un.Z,{key:e,theme:i,message:g[e],senderTitle:(0,co.F)(_,g[e],M,b),origin:m.Cr.SharedMedia,date:g[e].date,lastSyncTime:k,className:"scroll-item",onPlay:he,onDateClick:pe,isDownloading:T.includes(e)}))):"members"===J?ee.map(((e,t)=>{return o.ZP.createElement(fo.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item small-icon",onClick:()=>ge(e),contextActions:(n=e,n!==l&&P?[{title:_("lng_context_remove_from_group"),icon:"stop",handler:()=>{X(n)}}]:void 0)},o.ZP.createElement(bt.Z,{userId:e,forceShowSelf:!0}));var n})):"commonChats"===J?ee.map(((e,t)=>o.ZP.createElement(fo.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item small-icon",onClick:()=>O({id:e})},o.ZP.createElement(Et.Z,{chatId:e})))):void 0)}return o.ZP.createElement(po.Z,{ref:G,className:"Profile custom-scroll",itemSelector:Eo(J),items:ye?ee:void 0,cacheBuster:re,sensitiveArea:s.qU,preloadBackwards:ye?"members"===J?s.Vk:s.EN:0,noScrollRestoreOnTop:!0,noFastList:!0,onLoadMore:te,onScroll:se},!ne&&function(e,t){return o.ZP.createElement("div",{className:"profile-info"},o.ZP.createElement(vo.Z,{userId:t||e}),o.ZP.createElement(Io.Z,{chatOrUserId:t||e}))}(e,c),!R&&o.ZP.createElement("div",{className:"shared-media"},o.ZP.createElement(Se.Z,{ref:H,name:_.isRtl?"slide-optimized-rtl":"slide-optimized",activeKey:ae,renderCount:W.length,shouldRestoreHeight:!0,className:"shared-media-transition",onStart:oe,onStop:de},Ze),o.ZP.createElement(He.Z,{big:!0,activeTab:z,tabs:W,onSwitchTab:V})),Z&&o.ZP.createElement(Co.Z,{isShown:"members"===J,onClick:le,ariaLabel:_("lng_channel_add_users")},o.ZP.createElement("i",{className:"icon-add-user-filled"})),P&&o.ZP.createElement(wo.Z,{isOpen:Boolean(Y),userId:Y,onClose:fe}))}))),So=(0,o.X$)((e=>{const t=(0,Ye.Z)(Ve.gl.Extra,"RightSearch");return t?o.ZP.createElement(t,e):o.ZP.createElement(Xe.Z,null)})),Ro=(0,o.X$)((e=>{const t=(0,Ye.Z)(Ve.gl.Extra,"Management");return t?o.ZP.createElement(t,e):o.ZP.createElement(Xe.Z,null)})),ko=(0,o.X$)((()=>{const e=(0,Ye.Z)(Ve.gl.Extra,"StickerSearch");return e?o.ZP.createElement(e,null):o.ZP.createElement(Xe.Z,null)})),To=(0,o.X$)((()=>{const e=(0,Ye.Z)(Ve.gl.Extra,"GifSearch");return e?o.ZP.createElement(e,null):o.ZP.createElement(Xe.Z,null)})),No=(0,o.X$)((()=>{const e=(0,Ye.Z)(Ve.gl.Extra,"PollResults");return e?o.ZP.createElement(e,null):o.ZP.createElement(Xe.Z,null)}));var Bo=n(1820);const Ao=(0,o.X$)((0,a.c$)(((e,{chatId:t})=>{var n;const a=(0,r.Z1)(e,t),{userIds:s}=e.contactList||{},{byId:o}=e.chats,{currentUserId:i,newChatMembersProgress:c,connectionState:l}=e,u=a&&(0,d.eA)(a),{query:h,fetchingStatus:g,globalUserIds:p,localUserIds:f}=e.userSearch;return{isChannel:u,members:null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.members,currentUserId:i,chatsById:o,localContactIds:s,searchQuery:h,isSearching:g,isLoading:c===m.WB.Loading,globalUserIds:p,localUserIds:f,connectionState:l}}))((({isChannel:e,connectionState:t,members:n,onNextStep:s,currentUserId:i,chatsById:r,localContactIds:c,isLoading:l,searchQuery:u,isSearching:m,localUserIds:h,globalUserIds:p,onClose:f,isActive:v})=>{const{setUserSearchQuery:I,loadContactList:y}=(0,a.uC)(),Z=(0,ke.Z)(),[P,C]=(0,o.eJ)([]),w=(0,It.Z)(P)===P;(0,o.d4)((()=>{v&&"connectionStateReady"===t&&y()}),[t,v,y]),(0,Ce.ZP)(v,f);const b=(0,o.Ye)((()=>n?n.map((e=>e.userId)):[]),[n]),E=(0,o.I4)((e=>{I({query:e})}),[I]),M=(0,o.Ye)((()=>{const t=(0,a.Rd)().users.byId,n=c?(0,d.kK)(c,t,u):[];return(0,d.ih)((0,g.Tw)([...n,...h||[],...p||[]]).filter((n=>{const a=t[n];return!b.includes(n)&&n!==i&&(!a||!(0,d.cS)(a)||!e&&a.canBeInvitedToGroup)})),r)}),[c,r,u,h,p,i,b,e]),S=(0,o.I4)((()=>{P.length&&(I({query:""}),s(P))}),[P,I,s]);return o.ZP.createElement("div",{className:"AddChatMembers"},o.ZP.createElement("div",{className:"AddChatMembers-inner"},o.ZP.createElement(Bo.Z,{itemIds:M,selectedIds:P,filterValue:u,filterPlaceholder:Z("lng_channel_add_users"),searchInputId:"new-members-picker-search",isLoading:m,onSelectedIdsChange:C,onFilterChange:E,noScrollRestore:w}),o.ZP.createElement(Co.Z,{isShown:Boolean(P.length),disabled:l,ariaLabel:Z("lng_channel_add_users"),onClick:S},l?o.ZP.createElement(je.Z,{color:"white"}):o.ZP.createElement("i",{className:"icon-arrow-right"}))))}))),xo=Object.keys(m.qt).length/2,Lo=Object.keys(m.u1).length/2;function Oo(){const e=document.querySelector(".RightHeader .SearchInput input");e&&e.blur()}const Uo=(0,o.X$)((0,a.c$)((e=>{const{chatId:t,threadId:n}=(0,r.Bt)(e)||{},a=(0,r.g4)(e);return{contentKey:(0,r.Wq)(e),chatId:t,threadId:n,currentProfileUserId:e.users.selectedId,isChatSelected:Boolean(t&&a),shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations}}))((({contentKey:e,chatId:t,threadId:n,currentProfileUserId:i,isChatSelected:r,shouldSkipHistoryAnimations:c})=>{var d;const{toggleChatInfo:l,toggleManagement:u,openUserInfo:h,closeLocalTextSearch:g,setStickerSearchQuery:p,setGifSearchQuery:f,closePollResults:v,addChatMembers:I,setNewChatMembersDialogState:y,setEditingExportedInvite:Z}=(0,a.uC)(),{width:P}=ft(),[C,w]=(0,o.eJ)(m.vi.Profile),[b,E]=(0,o.eJ)(m.u1.Initial),[M,S]=(0,o.eJ)(),[R,k]=(0,o.eJ)(),T=C!==m.vi.Profile,N=void 0!==e,B=e===m.qt.ChatInfo||e===m.qt.UserInfo,A=e===m.qt.Search,x=e===m.qt.Management,L=e===m.qt.StickerSearch,O=e===m.qt.GifSearch,U=e===m.qt.PollResults,F=e===m.qt.AddingMembers,$=P<=s._m,[D,j]=(0,o.eJ)(!N),Q=null!==(d=(0,Ct.Z)(e,!0,!r))&&void 0!==d?d:-1,q=(0,o.I4)(((n=!0)=>{switch(e){case m.qt.AddingMembers:y(m.WB.Closed);break;case m.qt.ChatInfo:if(T&&n){w(m.vi.Profile);break}l(void 0,{forceSyncOnIOs:!0});break;case m.qt.UserInfo:if(T&&n){w(m.vi.Profile);break}h({id:void 0},{forceSyncOnIOs:!0});break;case m.qt.Management:switch(b){case m.u1.Initial:u();break;case m.u1.ChatPrivacyType:case m.u1.Discussion:case m.u1.GroupPermissions:case m.u1.GroupType:case m.u1.ChatAdministrators:case m.u1.ChannelSubscribers:case m.u1.GroupMembers:case m.u1.Invites:case m.u1.Reactions:E(m.u1.Initial);break;case m.u1.GroupUserPermissionsCreate:case m.u1.GroupRemovedUsers:case m.u1.GroupUserPermissions:E(m.u1.GroupPermissions),S(void 0),k(void 0);break;case m.u1.ChatAdminRights:case m.u1.ChatNewAdminRights:case m.u1.GroupAddAdmins:case m.u1.GroupRecentActions:E(m.u1.ChatAdministrators);break;case m.u1.EditInvite:E(m.u1.Invites),Z({chatId:t,invite:void 0})}break;case m.qt.Search:Oo(),g();break;case m.qt.StickerSearch:Oo(),p({query:void 0});break;case m.qt.GifSearch:Oo(),f({query:void 0});break;case m.qt.PollResults:v()}}),[e,T,l,h,v,y,b,u,g,p,f,Z,t]),G=(0,o.I4)(((e,t)=>{S(e),k(t)}),[]),H=(0,o.I4)((e=>{I({chatId:t,memberIds:e})}),[I,t]);function _(e){if(-1!==Q)switch(Q){case m.qt.AddingMembers:return o.ZP.createElement(Ao,{chatId:t,onNextStep:H,isActive:N&&e,onClose:q});case m.qt.ChatInfo:case m.qt.UserInfo:return o.ZP.createElement(Mo,{key:i||t,chatId:t,userId:i,profileState:C,onProfileStateChange:w});case m.qt.Search:return o.ZP.createElement(So,{chatId:t,threadId:n,onClose:q,isActive:N&&e});case m.qt.Management:return o.ZP.createElement(Ro,{chatId:t,currentScreen:b,isPromotedByCurrentUser:R,selectedChatMemberId:M,onScreenSelect:E,onChatMemberSelect:G,isActive:N&&e,onClose:q});case m.qt.StickerSearch:return o.ZP.createElement(ko,{onClose:q,isActive:N&&e});case m.qt.GifSearch:return o.ZP.createElement(To,{onClose:q,isActive:N&&e});case m.qt.PollResults:return o.ZP.createElement(No,{onClose:q,isActive:N&&e})}}return(0,o.d4)((()=>N?(0,we.Z)(q):void 0),[N,q]),(0,o.d4)((()=>{setTimeout((()=>{j(!N)}),300)}),[N]),(0,o.d4)((()=>{N&&$&&q()}),[$]),(0,tn.Z)((([n,a])=>{(n===m.qt.ChatInfo&&e===m.qt.UserInfo||n===m.qt.UserInfo&&e===m.qt.ChatInfo||a!==t)&&(w(m.vi.Profile),E(m.u1.Initial))}),[e,t]),(0,Ce.ZP)(r&&(e===m.qt.ChatInfo||e===m.qt.UserInfo||e===m.qt.Management||e===m.qt.AddingMembers),(()=>q(!1)),l),o.ZP.createElement("div",{id:"RightColumn-wrapper",className:r?void 0:"is-hidden"},$&&o.ZP.createElement("div",{className:"overlay-backdrop",onClick:q}),o.ZP.createElement("div",{id:"RightColumn"},o.ZP.createElement(ro,{chatId:t,isColumnOpen:N,isProfile:B,isSearch:A,isManagement:x,isStickerSearch:L,isGifSearch:O,isPollResults:U,isAddingChatMembers:F,profileState:C,managementScreen:b,onClose:q,shouldSkipAnimation:D||c}),o.ZP.createElement(Se.Z,{name:D||c?"none":"zoom-fade",renderCount:xo+Lo,activeKey:x?xo+b:Q,shouldCleanup:!0,cleanupExceptionKey:m.qt.ChatInfo},_)))}))),Fo=(0,o.X$)((({isOpen:e})=>{const t=(0,Ye.Z)(Ve.gl.Extra,"MediaViewer",!e);return t?o.ZP.createElement(t,null):void 0}));function $o(e,t){const n=document.createElement("a");n.href=e,n.download=t;try{n.click()}catch(e){console.error(e)}}const Do=new Set,jo=(0,o.X$)((0,a.c$)((e=>({activeDownloads:e.activeDownloads.byChatId,messages:e.messages.byChatId})))((({activeDownloads:e,messages:t})=>{const{cancelMessageMediaDownload:n}=(0,a.uC)();(0,o.d4)((()=>{Object.entries(e).forEach((([e,a])=>{a.map((n=>t[Number(e)].byId[n])).forEach((e=>{const t=(0,d.Ti)(e,"download");if(t){if(!Do.has(t)){const a=G.UV(t);if(a)return Do.delete(t),$o(a,(0,d.w6)(e)),void n({message:e});G.he(t,u.IU.BlobUrl,!0).then((a=>{Do.delete(t),a&&$o(a,(0,d.w6)(e)),n({message:e})})),Do.add(t)}}else n({message:e})}))}))}),[n,t,e])}))),Qo=(0,o.X$)((({isOpen:e})=>{const t=(0,Ye.Z)(Ve.gl.Extra,"Notifications",!e);return t?o.ZP.createElement(t,null):void 0})),qo=(0,o.X$)((({isOpen:e})=>{const t=(0,Ye.Z)(Ve.gl.Extra,"Dialogs",!e);return t?o.ZP.createElement(t,null):void 0})),Go=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"ForwardPicker",!t);return n?o.ZP.createElement(n,e):void 0})),Ho=(0,o.X$)((e=>{const{url:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"SafeLinkModal",!t);return n?o.ZP.createElement(n,e):void 0})),_o=(0,o.X$)((e=>{const{isOpen:t}=e,n=(0,Ye.Z)(Ve.gl.Extra,"HistoryCalendar",!t);return n?o.ZP.createElement(n,e):void 0})),zo=(0,o.X$)((e=>{const{groupCallId:t}=e,n=(0,Ye.Z)(Ve.gl.Calls,"GroupCall",!t);return n?o.ZP.createElement(n,e):void 0})),Vo=(0,o.X$)((e=>{const{groupCallId:t}=e,n=(0,Ye.Z)(Ve.gl.Calls,"ActiveCallHeader",!t);return n?o.ZP.createElement(n,null):void 0})),Yo=(0,o.X$)((({isOpen:e})=>{const t=(0,Ye.Z)(Ve.gl.Calls,"CallFallbackConfirm",!e);return t?o.ZP.createElement(t,{isOpen:e}):void 0}));let Xo,Wo=!1;function Ko(e){document.querySelectorAll('link[rel="icon"], link[rel="alternate icon"]').forEach((t=>{e?t.href.includes("favicon-unread")||(t.href=t.href.replace("favicon","favicon-unread")):t.href=t.href.replace("favicon-unread","favicon")}))}function Jo(e){document.title!==e&&(document.title=e)}const ei=(0,o.X$)((0,a.c$)((e=>{const{settings:{byKey:{animationLevel:t,language:n,wasTimeFormatSetManually:a}}}=e,{chatId:s,messageId:o}=e.audioPlayer,i=s&&o?(0,r.hj)(e,s,o):void 0;return{lastSyncTime:e.lastSyncTime,isLeftColumnShown:e.isLeftColumnShown,isRightColumnShown:(0,r.Jf)(e),isMediaViewerOpen:(0,r.zQ)(e),isForwardModalOpen:(0,r.Ev)(e),hasNotifications:Boolean(e.notifications.length),hasDialogs:Boolean(e.dialogs.length),audioMessage:i,safeLinkModalUrl:e.safeLinkModalUrl,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt),shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,openedStickerSetShortName:e.openedStickerSetShortName,isServiceChatReady:(0,r.UW)(e),activeGroupCallId:e.groupCalls.activeGroupCallId,animationLevel:t,language:n,wasTimeFormatSetManually:a,isCallFallbackConfirmOpen:Boolean(e.groupCalls.isFallbackConfirmOpen),addedSetIds:e.stickers.added.setIds}}))((({lastSyncTime:e,isLeftColumnShown:t,isRightColumnShown:n,isMediaViewerOpen:i,isForwardModalOpen:c,hasNotifications:d,hasDialogs:l,audioMessage:u,activeGroupCallId:m,safeLinkModalUrl:g,isHistoryCalendarOpen:p,shouldSkipHistoryAnimations:f,openedStickerSetShortName:v,isServiceChatReady:I,animationLevel:y,language:Z,wasTimeFormatSetManually:P,isCallFallbackConfirmOpen:w,addedSetIds:b})=>{const{loadAnimatedEmojis:E,loadNotificationSettings:M,loadNotificationExceptions:S,updateIsOnline:R,loadTopInlineBots:k,loadEmojiKeywords:T,loadCountryList:N,loadAvailableReactions:B,loadStickerSets:A,loadAddedStickers:x,loadFavoriteStickers:L,ensureTimeFormat:O,openStickerSetShortName:U,checkVersionNotification:F,loadAppConfig:$}=(0,a.uC)(),D=Boolean(e);s.eM&&!Wo&&(Wo=!0,console.log(">>> RENDER MAIN")),(0,o.d4)((()=>{e&&(R(!0),$(),B(),E(),M(),S(),k(),T({language:s.pR}))}),[e,E,T,S,M,k,R,B,$]),(0,o.d4)((()=>{e&&(Z!==s.pR&&T({language:Z}),N({langCode:Z}))}),[Z,e,N,T]),(0,o.d4)((()=>{D&&(b?x():(A(),L()))}),[D,b,A,L,x]),(0,o.d4)((()=>{e&&I&&F()}),[e,I,F]),(0,o.d4)((()=>{e&&!P&&O()}),[e,P,O]),(0,o.d4)((()=>{e&&Ce.Oy.startsWith("#?tgaddr=")&&(0,he.o)(decodeURIComponent(Ce.Oy.substr("#?tgaddr=".length)))}),[e]),(0,o.d4)((()=>{if(m)return Y.Z.disableRefresh(),()=>{Y.Z.enableRefresh()}}),[m]);const{transitionClassNames:j}=(0,pe.Z)(!t,void 0,!0,void 0,f),{transitionClassNames:Q}=(0,pe.Z)(n,void 0,!0,void 0,f),q=(0,ue.Z)(j.replace(/([\w-]+)/g,"middle-column-$1"),Q.replace(/([\w-]+)/g,"right-column-$1"),f&&"history-animation-disabled");(0,Ie.Z)((([e])=>{if(void 0===e||0===y)return;const t=(0,le.YW)();(0,me.L)(document.getElementById("MiddleColumn"),t)}),[t]),(0,Ie.Z)((([e])=>{if(void 0===e||0===y)return;(0,C.T2)((()=>{document.body.classList.add("animating-right-column")}));const t=(0,le.YW)();(0,me.L)(document.getElementById("RightColumn"),(()=>{t(),(0,C.T2)((()=>{document.body.classList.remove("animating-right-column")}))}))}),[n]);const G=(0,o.I4)((()=>{R(!1);const e=(0,r.A1)((0,a.Rd)());let t=0;clearInterval(Xo),Xo=window.setInterval((()=>{if(document.title.includes(s.ou))Ko(!1);else{if(t%2==0){const t=(0,r.A1)((0,a.Rd)())-e;t>0&&(Jo(`${t} notification${t>1?"s":""}`),Ko(!0))}else Jo(s.Ti),Ko(!1);t++}}),1e3)}),[R]),H=(0,o.I4)((()=>{R(!0),clearInterval(Xo),Xo=void 0,document.title.includes(s.ou)||Jo(s.Ti),Ko(!1)}),[R]),_=(0,o.I4)((()=>{U({stickerSetShortName:void 0})}),[U]);return(0,fe.Z)(G,H),ve(G),function(e=!1){(0,o.d4)((()=>{if(h.$b){if(!e)return null==ye||ye.setAttribute("content",Ze),h.cj&&!h.fl&&document.addEventListener("gesturestart",Pe),()=>{null==ye||ye.setAttribute("content","width=device-width, initial-scale=1, shrink-to-fit=no"),h.cj&&!h.fl&&document.removeEventListener("gesturestart",Pe)};null==ye||ye.setAttribute("content","width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover")}}),[e])}(i),o.ZP.createElement("div",{id:"Main",className:q,onDrop:ge.Z,onDragOver:ge.Z},o.ZP.createElement(ut,null),o.ZP.createElement(so,null),o.ZP.createElement(Uo,null),o.ZP.createElement(Fo,{isOpen:i}),o.ZP.createElement(Go,{isOpen:c}),o.ZP.createElement(Qo,{isOpen:d}),o.ZP.createElement(qo,{isOpen:l}),u&&o.ZP.createElement(Xt,{key:u.id,message:u,noUi:!0}),o.ZP.createElement(Ho,{url:g}),o.ZP.createElement(_o,{isOpen:p}),o.ZP.createElement(Gn.Z,{isOpen:Boolean(v),onClose:_,stickerSetShortName:v}),m&&o.ZP.createElement(o.ZP.Fragment,null,o.ZP.createElement(zo,{groupCallId:m}),o.ZP.createElement(Vo,{groupCallId:m})),o.ZP.createElement(jo,null),o.ZP.createElement(Yo,{isOpen:w}))})));s.eM&&console.log(">>> FINISH LOAD MAIN BUNDLE"),(0,a.Rd)().connectionState||(0,a.uC)().initApi()},4524:(e,t,n)=>{e.exports=n.p+"telegram-logo-filled.67469f6dc5e301e8e0bd..svg"}}]); +//# sourceMappingURL=163.c69a8648aa1c99ba6248.js.map \ No newline at end of file diff --git a/dist/163.c69a8648aa1c99ba6248.js.map b/dist/163.c69a8648aa1c99ba6248.js.map new file mode 100644 index 000000000..108c30c82 --- /dev/null +++ b/dist/163.c69a8648aa1c99ba6248.js.map @@ -0,0 +1 @@ +{"version":3,"file":"163.c69a8648aa1c99ba6248.js","mappings":"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","sources":["webpack://telegram-t/./src/modules/actions/ui/localSearch.ts","webpack://telegram-t/./src/modules/actions/ui/chats.ts","webpack://telegram-t/./src/modules/actions/ui/messages.ts","webpack://telegram-t/./src/versionNotification.txt","webpack://telegram-t/./src/modules/actions/ui/globalSearch.ts","webpack://telegram-t/./src/modules/actions/ui/stickerSearch.ts","webpack://telegram-t/./src/modules/actions/ui/users.ts","webpack://telegram-t/./src/modules/actions/ui/misc.ts","webpack://telegram-t/./src/modules/actions/ui/payments.ts","webpack://telegram-t/./src/modules/actions/api/messages.ts","webpack://telegram-t/./src/modules/actions/api/symbols.ts","webpack://telegram-t/./src/modules/actions/api/globalSearch.ts","webpack://telegram-t/./src/modules/actions/api/localSearch.ts","webpack://telegram-t/./src/modules/actions/api/management.ts","webpack://telegram-t/./src/modules/actions/api/sync.ts","webpack://telegram-t/./src/modules/actions/api/users.ts","webpack://telegram-t/./src/modules/reducers/bots.ts","webpack://telegram-t/./src/modules/actions/api/bots.ts","webpack://telegram-t/./src/modules/actions/api/twoFaSettings.ts","webpack://telegram-t/./src/modules/actions/api/payments.ts","webpack://telegram-t/./src/util/requestQuery.ts","webpack://telegram-t/./src/components/middle/helpers/calculateMiddleFooterTransforms.ts","webpack://telegram-t/./src/modules/reducers/reactions.ts","webpack://telegram-t/./src/modules/actions/api/reactions.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/chats.ts","webpack://telegram-t/./src/util/areDeepEqual.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/messages.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/users.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/symbols.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/misc.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/settings.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/twoFaSettings.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/calls.ts","webpack://telegram-t/./src/hooks/useBeforeUnload.ts","webpack://telegram-t/./src/hooks/usePreventPinchZoomGesture.ts","webpack://telegram-t/./src/hooks/useBrowserOnline.ts","webpack://telegram-t/./src/components/left/main/LeftMainHeader.tsx","webpack://telegram-t/./src/components/left/ConnectionState.tsx","webpack://telegram-t/./src/components/left/main/ChatFolders.tsx","webpack://telegram-t/./src/hooks/useThrottledMemo.ts","webpack://telegram-t/./src/components/left/search/LeftSearch.async.tsx","webpack://telegram-t/./src/components/left/main/ContactList.async.tsx","webpack://telegram-t/./src/components/left/NewChatButton.tsx","webpack://telegram-t/./src/components/left/main/LeftMain.tsx","webpack://telegram-t/./src/components/left/settings/Settings.async.tsx","webpack://telegram-t/./src/components/left/newChat/NewChat.async.tsx","webpack://telegram-t/./src/components/left/ArchivedChats.async.tsx","webpack://telegram-t/./src/components/left/LeftColumn.tsx","webpack://telegram-t/./src/hooks/useResize.ts","webpack://telegram-t/./src/hooks/useCustomBackground.ts","webpack://telegram-t/./src/hooks/useWindowSize.ts","webpack://telegram-t/./src/components/middle/HeaderMenuContainer.async.tsx","webpack://telegram-t/./src/components/middle/HeaderActions.tsx","webpack://telegram-t/./src/hooks/useWebpThumbnail.ts","webpack://telegram-t/./src/components/middle/PinnedMessageNavigation.tsx","webpack://telegram-t/./src/components/middle/HeaderPinnedMessage.tsx","webpack://telegram-t/./src/util/imageResize.ts","webpack://telegram-t/./src/hooks/useMessageMediaMetadata.ts","webpack://telegram-t/./src/hooks/useAsync.ts","webpack://telegram-t/./src/components/middle/AudioPlayer.tsx","webpack://telegram-t/./src/components/calls/group/GroupCallTopPane.tsx","webpack://telegram-t/./src/components/middle/MiddleHeader.tsx","webpack://telegram-t/./src/components/middle/helpers/groupMessages.ts","webpack://telegram-t/./src/components/middle/hooks/useMessageObservers.ts","webpack://telegram-t/./src/components/middle/message/helpers/buildContentClassName.ts","webpack://telegram-t/./src/components/middle/message/helpers/mediaDimensions.ts","webpack://telegram-t/./src/components/middle/message/helpers/calculateAlbumLayout.ts","webpack://telegram-t/./src/components/middle/message/helpers/calculateAuthorWidth.ts","webpack://telegram-t/./src/components/middle/message/hooks/useFocusMessage.ts","webpack://telegram-t/./src/components/middle/message/hooks/useOuterHandlers.ts","webpack://telegram-t/./src/components/middle/message/ContextMenuContainer.async.tsx","webpack://telegram-t/./src/components/middle/ActionMessage.tsx","webpack://telegram-t/./src/components/common/EmbeddedMessage.tsx","webpack://telegram-t/./src/components/middle/message/ReactionAnimatedEmoji.tsx","webpack://telegram-t/./src/components/middle/message/MessageMeta.tsx","webpack://telegram-t/./src/components/middle/message/Sticker.tsx","webpack://telegram-t/./src/components/middle/message/hooks/useBlurredMediaThumbRef.ts","webpack://telegram-t/./src/components/middle/message/helpers/getCustomAppendixBg.ts","webpack://telegram-t/./src/components/middle/message/Photo.tsx","webpack://telegram-t/./src/components/middle/message/hooks/useVideoAutoPause.ts","webpack://telegram-t/./src/components/middle/message/Video.tsx","webpack://telegram-t/./src/components/middle/message/Contact.tsx","webpack://telegram-t/./src/components/middle/message/PollOption.tsx","webpack://telegram-t/./src/components/middle/message/Poll.tsx","webpack://telegram-t/./src/components/middle/message/WebPage.tsx","webpack://telegram-t/./src/components/middle/message/Invoice.tsx","webpack://telegram-t/./src/components/middle/message/hocs/withSelectControl.tsx","webpack://telegram-t/./src/components/middle/message/Album.tsx","webpack://telegram-t/./src/components/middle/message/RoundVideo.tsx","webpack://telegram-t/./src/components/middle/message/InlineButtons.tsx","webpack://telegram-t/./src/components/middle/message/CommentButton.tsx","webpack://telegram-t/./src/components/middle/message/ReactionButton.tsx","webpack://telegram-t/./src/components/middle/message/Reactions.tsx","webpack://telegram-t/./src/components/common/LocalAnimatedEmoji.tsx","webpack://telegram-t/./src/components/middle/message/Message.tsx","webpack://telegram-t/./src/components/middle/message/hooks/useInnerHandlers.ts","webpack://telegram-t/./src/components/middle/message/SponsoredMessage.tsx","webpack://telegram-t/./src/components/middle/MessageListContent.tsx","webpack://telegram-t/./src/components/middle/hooks/useScrollHooks.ts","webpack://telegram-t/./src/components/middle/ContactGreeting.tsx","webpack://telegram-t/./src/components/middle/NoMessages.tsx","webpack://telegram-t/./src/components/middle/MessageList.tsx","webpack://telegram-t/./src/components/middle/hooks/useStickyDates.ts","webpack://telegram-t/./src/components/middle/ScrollDownButton.tsx","webpack://telegram-t/./src/components/middle/composer/helpers/buildAttachment.ts","webpack://telegram-t/./src/components/middle/composer/helpers/applyIosAutoCapitalizationFix.ts","webpack://telegram-t/./node_modules/opus-recorder/dist/encoderWorker.min.js","webpack://telegram-t/./src/util/voiceRecording.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useVoiceRecording.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useClipboardPaste.ts","webpack://telegram-t/./src/components/middle/composer/helpers/getMessageTextAsHtml.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useDraft.ts","webpack://telegram-t/./src/hooks/useDebouncedMemo.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useInlineBotTooltip.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useBotCommandTooltip.ts","webpack://telegram-t/./src/components/common/DeleteMessageModal.async.tsx","webpack://telegram-t/./src/components/ui/ResponsiveHoverButton.tsx","webpack://telegram-t/./src/components/middle/composer/AttachMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/SymbolMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/InlineBotTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/MentionTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/CustomSendMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/StickerTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/BotKeyboardMenu.tsx","webpack://telegram-t/./src/components/middle/composer/ComposerEmbeddedMessage.tsx","webpack://telegram-t/./src/components/middle/composer/AttachmentModal.async.tsx","webpack://telegram-t/./src/components/middle/composer/BotCommandMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/PollModal.async.tsx","webpack://telegram-t/./src/components/middle/composer/DropArea.async.tsx","webpack://telegram-t/./src/components/middle/composer/WebPagePreview.tsx","webpack://telegram-t/./src/components/middle/composer/SendAsMenu.async.tsx","webpack://telegram-t/./src/components/middle/composer/Composer.tsx","webpack://telegram-t/./src/components/middle/composer/hooks/useStickerTooltip.ts","webpack://telegram-t/./src/util/insertHtmlInSelection.ts","webpack://telegram-t/./src/util/deleteLastCharacterOutsideSelection.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useEditing.ts","webpack://telegram-t/./src/components/middle/MobileSearch.async.tsx","webpack://telegram-t/./src/components/middle/MessageSelectToolbar.async.tsx","webpack://telegram-t/./src/components/common/UnpinAllMessagesModal.async.tsx","webpack://telegram-t/./src/components/payment/PaymentModal.async.tsx","webpack://telegram-t/./src/components/payment/ReceiptModal.async.tsx","webpack://telegram-t/./src/components/common/SeenByModal.async.tsx","webpack://telegram-t/./src/components/middle/EmojiInteractionAnimation.async.tsx","webpack://telegram-t/./src/components/middle/ReactorListModal.async.tsx","webpack://telegram-t/./src/components/middle/MiddleColumn.tsx","webpack://telegram-t/./src/components/right/RightHeader.tsx","webpack://telegram-t/./src/components/right/hooks/useProfileViewportIds.ts","webpack://telegram-t/./src/components/right/hooks/useProfileState.ts","webpack://telegram-t/./src/components/right/Profile.tsx","webpack://telegram-t/./src/components/right/hooks/useTransitionFixes.ts","webpack://telegram-t/./src/hooks/useCacheBuster.ts","webpack://telegram-t/./src/components/right/RightSearch.async.tsx","webpack://telegram-t/./src/components/right/management/Management.async.tsx","webpack://telegram-t/./src/components/right/StickerSearch.async.tsx","webpack://telegram-t/./src/components/right/GifSearch.async.tsx","webpack://telegram-t/./src/components/right/PollResults.async.tsx","webpack://telegram-t/./src/components/right/AddChatMembers.tsx","webpack://telegram-t/./src/components/right/RightColumn.tsx","webpack://telegram-t/./src/components/mediaViewer/MediaViewer.async.tsx","webpack://telegram-t/./src/util/download.ts","webpack://telegram-t/./src/components/main/DownloadManager.tsx","webpack://telegram-t/./src/components/main/Notifications.async.tsx","webpack://telegram-t/./src/components/main/Dialogs.async.tsx","webpack://telegram-t/./src/components/main/ForwardPicker.async.tsx","webpack://telegram-t/./src/components/main/SafeLinkModal.async.tsx","webpack://telegram-t/./src/components/main/HistoryCalendar.async.tsx","webpack://telegram-t/./src/components/calls/group/GroupCall.async.tsx","webpack://telegram-t/./src/components/calls/ActiveCallHeader.async.tsx","webpack://telegram-t/./src/components/calls/CallFallbackConfirm.async.tsx","webpack://telegram-t/./src/components/main/Main.tsx","webpack://telegram-t/./src/bundles/main.ts"],"sourcesContent":["import { addReducer } from '../../../lib/teact/teactn';\n\nimport {\n updateLocalTextSearch,\n replaceLocalTextSearchResults,\n updateLocalMediaSearchType,\n} from '../../reducers';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { buildChatThreadKey } from '../../helpers';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('openLocalTextSearch', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n return updateLocalTextSearch(global, chatId, threadId, true);\n});\n\naddReducer('closeLocalTextSearch', closeLocalTextSearch);\n\naddReducer('setLocalTextSearchQuery', (global, actions, payload) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const { query } = payload!;\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { query: currentQuery } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n\n if (query !== currentQuery) {\n global = replaceLocalTextSearchResults(global, chatId, threadId, MEMO_EMPTY_ARRAY);\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, true, query);\n\n return global;\n});\n\naddReducer('setLocalMediaSearchType', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n const { mediaType } = payload!;\n return updateLocalMediaSearchType(global, chatId, mediaType);\n});\n\nexport function closeLocalTextSearch(global: GlobalState): GlobalState {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return global;\n }\n\n global = updateLocalTextSearch(global, chatId, threadId, false);\n global = replaceLocalTextSearchResults(global, chatId, threadId, undefined);\n return global;\n}\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n exitMessageSelectMode, replaceThreadParam, updateCurrentMessageList,\n} from '../../reducers';\nimport { selectCurrentMessageList } from '../../selectors';\nimport { closeLocalTextSearch } from './localSearch';\n\naddReducer('openChat', (global, actions, payload) => {\n const {\n id, threadId = -1, type = 'thread', shouldReplaceHistory = false,\n } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList\n || (\n currentMessageList.chatId !== id\n || currentMessageList.threadId !== threadId\n || currentMessageList.type !== type\n )) {\n global = replaceThreadParam(global, id, threadId, 'replyStack', []);\n global = exitMessageSelectMode(global);\n global = closeLocalTextSearch(global);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: undefined,\n },\n ...(id !== global.forwardMessages.toChatId && {\n forwardMessages: {},\n }),\n };\n\n setGlobal(global);\n }\n\n return updateCurrentMessageList(global, id, threadId, type, shouldReplaceHistory);\n});\n\naddReducer('openPreviousChat', (global) => {\n return updateCurrentMessageList(global, undefined);\n});\n\naddReducer('openChatWithInfo', (global, actions, payload) => {\n setGlobal({\n ...global,\n isChatInfoShown: true,\n });\n\n actions.openChat(payload);\n});\n\naddReducer('resetChatCreation', (global) => {\n return {\n ...global,\n chatCreation: undefined,\n };\n});\n\naddReducer('setNewChatMembersDialogState', (global, actions, payload) => {\n return {\n ...global,\n newChatMembersProgress: payload,\n };\n});\n\naddReducer('openNextChat', (global, actions, payload) => {\n const { targetIndexDelta, orderedIds } = payload;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n actions.openChat({ id: orderedIds[0] });\n return;\n }\n\n const position = orderedIds.indexOf(chatId);\n\n if (position === -1) {\n return;\n }\n const nextId = orderedIds[position + targetIndexDelta];\n\n actions.openChat({ id: nextId, shouldReplaceHistory: true });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage, MAIN_THREAD_ID } from '../../../api/types';\nimport { FocusDirection } from '../../../types';\n\nimport {\n ANIMATION_END_DELAY,\n APP_VERSION,\n FAST_SMOOTH_MAX_DURATION,\n SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../../config';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport {\n enterMessageSelectMode,\n toggleMessageSelection,\n exitMessageSelectMode,\n replaceThreadParam,\n updateFocusDirection,\n updateFocusedMessage,\n} from '../../reducers';\nimport {\n selectCurrentChat,\n selectViewportIds,\n selectIsRightColumnShown,\n selectCurrentMessageList,\n selectChat,\n selectThreadInfo,\n selectChatMessages,\n selectAllowedMessageActions,\n selectMessageIdsByGroupId,\n selectForwardedMessageIdsByGroupId,\n selectIsViewportNewest,\n selectReplyingToId,\n selectReplyStack,\n} from '../../selectors';\nimport { findLast } from '../../../util/iteratees';\nimport { getServerTime } from '../../../util/serverTime';\n\n// @ts-ignore\nimport versionNotification from '../../../versionNotification.txt';\nimport parseMessageInput from '../../../util/parseMessageInput';\n\nconst FOCUS_DURATION = 1500;\nconst FOCUS_NO_HIGHLIGHT_DURATION = FAST_SMOOTH_MAX_DURATION + ANIMATION_END_DELAY;\nconst POLL_RESULT_OPEN_DELAY_MS = 450;\nconst SERVICE_NOTIFICATIONS_MAX_AMOUNT = 1e3;\n\nlet blurTimeout: number | undefined;\n\naddReducer('setScrollOffset', (global, actions, payload) => {\n const { chatId, threadId, scrollOffset } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'scrollOffset', scrollOffset);\n});\n\naddReducer('setReplyingToId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n const { chatId, threadId } = currentMessageList;\n\n return replaceThreadParam(global, chatId, threadId, 'replyingToId', messageId);\n});\n\naddReducer('setEditingId', (global, actions, payload) => {\n const { messageId } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n const paramName = type === 'scheduled' ? 'editingScheduledId' : 'editingId';\n\n return replaceThreadParam(global, chatId, threadId, paramName, messageId);\n});\n\naddReducer('editLastMessage', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const lastOwnEditableMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId).canEdit);\n });\n\n if (!lastOwnEditableMessageId) {\n return undefined;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'editingId', lastOwnEditableMessageId);\n});\n\naddReducer('replyToNextMessage', (global, actions, payload) => {\n const { targetIndexDelta } = payload;\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!chatMessages || !viewportIds) {\n return;\n }\n\n const replyingToId = selectReplyingToId(global, chatId, threadId);\n const isLatest = selectIsViewportNewest(global, chatId, threadId);\n\n let messageId: number | undefined;\n\n if (!isLatest || !replyingToId) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n messageId = chat?.lastMessage?.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n messageId = threadInfo?.lastMessageId;\n }\n } else {\n const chatMessageKeys = Object.keys(chatMessages);\n const indexOfCurrent = chatMessageKeys.indexOf(replyingToId.toString());\n const newIndex = indexOfCurrent + targetIndexDelta;\n messageId = newIndex <= chatMessageKeys.length + 1 && newIndex >= 0\n ? Number(chatMessageKeys[newIndex])\n : undefined;\n }\n actions.setReplyingToId({ messageId });\n actions.focusMessage({\n chatId, threadId, messageId,\n });\n});\n\naddReducer('openMediaViewer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, avatarOwnerId, profilePhotoIndex, origin,\n } = payload!;\n\n return {\n ...global,\n mediaViewer: {\n chatId,\n threadId,\n messageId,\n avatarOwnerId,\n profilePhotoIndex,\n origin,\n },\n forwardMessages: {},\n };\n});\n\naddReducer('closeMediaViewer', (global) => {\n return {\n ...global,\n mediaViewer: {},\n };\n});\n\naddReducer('openAudioPlayer', (global, actions, payload) => {\n const {\n chatId, threadId, messageId, origin, volume, playbackRate, isMuted,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n chatId,\n threadId,\n messageId,\n origin: origin ?? global.audioPlayer.origin,\n volume: volume ?? global.audioPlayer.volume,\n playbackRate: playbackRate || global.audioPlayer.playbackRate,\n isMuted: isMuted || global.audioPlayer.isMuted,\n },\n };\n});\n\naddReducer('setAudioPlayerVolume', (global, actions, payload) => {\n const {\n volume,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n ...global.audioPlayer,\n volume,\n },\n };\n});\n\naddReducer('setAudioPlayerPlaybackRate', (global, actions, payload) => {\n const {\n playbackRate,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n ...global.audioPlayer,\n playbackRate,\n },\n };\n});\n\naddReducer('setAudioPlayerMuted', (global, actions, payload) => {\n const {\n isMuted,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n ...global.audioPlayer,\n isMuted,\n },\n };\n});\n\naddReducer('setAudioPlayerOrigin', (global, actions, payload) => {\n const {\n origin,\n } = payload!;\n\n return {\n ...global,\n audioPlayer: {\n ...global.audioPlayer,\n origin,\n },\n };\n});\n\naddReducer('closeAudioPlayer', (global) => {\n return {\n ...global,\n audioPlayer: {\n volume: global.audioPlayer.volume,\n playbackRate: global.audioPlayer.playbackRate,\n isMuted: global.audioPlayer.isMuted,\n },\n };\n});\n\naddReducer('openPollResults', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n const shouldOpenInstantly = selectIsRightColumnShown(global);\n\n if (!shouldOpenInstantly) {\n window.setTimeout(() => {\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }, POLL_RESULT_OPEN_DELAY_MS);\n } else if (chatId !== global.pollResults.chatId || messageId !== global.pollResults.messageId) {\n setGlobal({\n ...global,\n pollResults: {\n chatId,\n messageId,\n voters: {},\n },\n });\n }\n});\n\naddReducer('closePollResults', (global) => {\n setGlobal({\n ...global,\n pollResults: {},\n });\n});\n\naddReducer('focusLastMessage', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n let lastMessageId: number | undefined;\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n\n lastMessageId = chat?.lastMessage?.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n lastMessageId = threadInfo?.lastMessageId;\n }\n\n if (!lastMessageId) {\n return;\n }\n\n actions.focusMessage({\n chatId, threadId, messageId: lastMessageId, noHighlight: true,\n });\n});\n\naddReducer('focusNextReply', (global, actions) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n const replyStack = selectReplyStack(global, chatId, threadId);\n\n if (!replyStack || replyStack.length === 0) {\n actions.focusLastMessage();\n } else {\n const messageId = replyStack.pop();\n\n global = replaceThreadParam(global, chatId, threadId, 'replyStack', [...replyStack]);\n\n setGlobal(global);\n\n actions.focusMessage({\n chatId,\n threadId,\n messageId,\n });\n }\n\n return undefined;\n});\n\naddReducer('focusMessage', (global, actions, payload) => {\n const {\n chatId, threadId = MAIN_THREAD_ID, messageListType = 'thread', noHighlight, groupedId, groupedChatId,\n replyMessageId, isResizingContainer,\n } = payload!;\n\n let { messageId } = payload!;\n\n if (groupedId !== undefined) {\n const ids = selectForwardedMessageIdsByGroupId(global, groupedChatId, groupedId);\n if (ids?.length) {\n ([messageId] = ids);\n }\n }\n\n const currentMessageList = selectCurrentMessageList(global);\n const shouldSwitchChat = !currentMessageList || (\n chatId !== currentMessageList.chatId\n || threadId !== currentMessageList.threadId\n || messageListType !== currentMessageList.type\n );\n\n if (blurTimeout) {\n clearTimeout(blurTimeout);\n blurTimeout = undefined;\n }\n blurTimeout = window.setTimeout(() => {\n let newGlobal = getGlobal();\n newGlobal = updateFocusedMessage(newGlobal);\n newGlobal = updateFocusDirection(newGlobal);\n setGlobal(newGlobal);\n }, noHighlight ? FOCUS_NO_HIGHLIGHT_DURATION : FOCUS_DURATION);\n\n global = updateFocusedMessage(global, chatId, messageId, noHighlight, isResizingContainer);\n global = updateFocusDirection(global, undefined);\n\n if (replyMessageId) {\n const replyStack = selectReplyStack(global, chatId, threadId) || [];\n global = replaceThreadParam(global, chatId, threadId, 'replyStack', [...replyStack, replyMessageId]);\n }\n\n if (shouldSwitchChat) {\n global = updateFocusDirection(global, FocusDirection.Static);\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (viewportIds && viewportIds.includes(messageId)) {\n setGlobal(global);\n actions.openChat({ id: chatId, threadId });\n return undefined;\n }\n\n if (shouldSwitchChat) {\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', undefined);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n\n if (viewportIds && !shouldSwitchChat) {\n const direction = messageId > viewportIds[0] ? FocusDirection.Down : FocusDirection.Up;\n global = updateFocusDirection(global, direction);\n }\n\n setGlobal(global);\n\n actions.openChat({ id: chatId, threadId });\n actions.loadViewportMessages();\n return undefined;\n});\n\naddReducer('openForwardMenu', (global, actions, payload) => {\n const { fromChatId, messageIds, groupedId } = payload!;\n let groupedMessageIds;\n if (groupedId) {\n groupedMessageIds = selectMessageIdsByGroupId(global, fromChatId, groupedId);\n }\n return {\n ...global,\n forwardMessages: {\n fromChatId,\n messageIds: groupedMessageIds || messageIds,\n isModalShown: true,\n },\n };\n});\n\naddReducer('exitForwardMode', (global) => {\n setGlobal({\n ...global,\n forwardMessages: {},\n });\n});\n\naddReducer('setForwardChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n setGlobal({\n ...global,\n forwardMessages: {\n ...global.forwardMessages,\n toChatId: id,\n isModalShown: false,\n },\n });\n\n actions.openChat({ id });\n actions.closeMediaViewer();\n actions.exitMessageSelectMode();\n});\n\naddReducer('openForwardMenuForSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId: fromChatId, messageIds } = global.selectedMessages;\n\n actions.openForwardMenu({ fromChatId, messageIds });\n});\n\naddReducer('cancelMessageMediaDownload', (global, actions, payload) => {\n const { message } = payload!;\n\n const byChatId = global.activeDownloads.byChatId[message.chatId];\n if (!byChatId || !byChatId.length) return;\n\n setGlobal({\n ...global,\n activeDownloads: {\n byChatId: {\n ...global.activeDownloads.byChatId,\n [message.chatId]: byChatId.filter((id) => id !== message.id),\n },\n },\n });\n});\n\naddReducer('downloadMessageMedia', (global, actions, payload) => {\n const { message } = payload!;\n if (!message) return;\n\n setGlobal({\n ...global,\n activeDownloads: {\n byChatId: {\n ...global.activeDownloads.byChatId,\n [message.chatId]: [...(global.activeDownloads.byChatId[message.chatId] || []), message.id],\n },\n },\n });\n});\n\naddReducer('downloadSelectedMessages', (global, actions) => {\n if (!global.selectedMessages) {\n return;\n }\n\n const { chatId, messageIds } = global.selectedMessages;\n const { threadId } = selectCurrentMessageList(global) || {};\n\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages || !threadId) return;\n const messages = messageIds.map((id) => chatMessages[id])\n .filter((message) => selectAllowedMessageActions(global, message, threadId).canDownload);\n messages.forEach((message) => actions.downloadMessageMedia({ message }));\n});\n\naddReducer('enterMessageSelectMode', (global, actions, payload) => {\n const { messageId } = payload || {};\n const openChat = selectCurrentChat(global);\n if (!openChat) {\n return global;\n }\n\n return enterMessageSelectMode(global, openChat.id, messageId);\n});\n\naddReducer('toggleMessageSelection', (global, actions, payload) => {\n const {\n messageId,\n groupedId,\n childMessageIds,\n withShift,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n\n global = toggleMessageSelection(\n global, chatId, threadId, messageListType, messageId, groupedId, childMessageIds, withShift,\n );\n\n setGlobal(global);\n\n if (global.shouldShowContextMenuHint) {\n actions.disableContextMenuHint();\n actions.showNotification({\n // eslint-disable-next-line max-len\n message: `To **edit** or **reply**, close this menu. Then ${IS_TOUCH_ENV ? 'long tap' : 'right click'} on a message.`,\n });\n }\n});\n\naddReducer('disableContextMenuHint', (global) => {\n if (!global.shouldShowContextMenuHint) {\n return undefined;\n }\n\n return {\n ...global,\n shouldShowContextMenuHint: false,\n };\n});\n\naddReducer('exitMessageSelectMode', exitMessageSelectMode);\n\naddReducer('openPollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: true,\n };\n});\n\naddReducer('closePollModal', (global) => {\n return {\n ...global,\n isPollModalOpen: false,\n };\n});\n\naddReducer('checkVersionNotification', (global, actions) => {\n const currentVersion = APP_VERSION.split('.').slice(0, 2).join('.');\n const { serviceNotifications } = global;\n\n if (serviceNotifications.find(({ version }) => version === currentVersion)) {\n return;\n }\n\n const message: Omit = {\n chatId: SERVICE_NOTIFICATIONS_USER_ID,\n date: getServerTime(global.serverTimeOffset),\n content: {\n text: parseMessageInput(versionNotification),\n },\n isOutgoing: false,\n };\n\n actions.createServiceNotification({\n message,\n version: currentVersion,\n });\n});\n\naddReducer('createServiceNotification', (global, actions, payload) => {\n const { message, version } = payload;\n const { serviceNotifications } = global;\n const serviceChat = selectChat(global, SERVICE_NOTIFICATIONS_USER_ID)!;\n\n const maxId = Math.max(\n serviceChat.lastMessage?.id || 0,\n ...serviceNotifications.map(({ id }) => id),\n );\n const fractionalPart = (serviceNotifications.length + 1) / SERVICE_NOTIFICATIONS_MAX_AMOUNT;\n // The fractional ID is made of the largest integer ID and an incremented fractional part\n const id = Math.floor(maxId) + fractionalPart;\n\n message.id = id;\n\n const serviceNotification = {\n id,\n message,\n version,\n isUnread: true,\n };\n\n setGlobal({\n ...global,\n serviceNotifications: [\n ...serviceNotifications.slice(-SERVICE_NOTIFICATIONS_MAX_AMOUNT),\n serviceNotification,\n ],\n });\n\n actions.apiUpdate({\n '@type': 'newMessage',\n id: message.id,\n chatId: message.chatId,\n message,\n });\n});\n\naddReducer('openReactorListModal', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n return {\n ...global,\n reactorModal: { chatId, messageId },\n };\n});\n\naddReducer('closeReactorListModal', (global) => {\n return {\n ...global,\n reactorModal: undefined,\n };\n});\n\naddReducer('openSeenByModal', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n\n return {\n ...global,\n seenByModal: { chatId, messageId },\n };\n});\n\naddReducer('closeSeenByModal', (global) => {\n return {\n ...global,\n seenByModal: undefined,\n };\n});\n","export default \"**Telegram Web Z was updated to version 1.30**\\n\\n👏 **Harder**\\n• Meet Message Reactions:\\n - React to a message with ❤️🔥🎉😁😱🤩😢👎💩🤮 in the context menu.\\n - Send a quick 👍 reaction by hovering over the bottom corner of a message.\\n - You can change your default reaction to another emoji in Settings > General.\\n - Group and Channel admins can enable and control reactions via their chat's Info Page > Edit > Reactions.\\n\\n• Interactive Emoji:\\n - Added support for all interactive emoji, including fullscreen animations and sound effects. Try 🔥, 🍆, 🍑 and more.\\n - Animations play simultaneously when both users have the chat open.\\n – The “is watching…” status will appear when your chat partner is also seeing the animations.\\n\\n• Manage invite links for Groups and Channels:\\n – Enable admin approval or limited duration and users.\\n\\n🤩 **Better**\\n• Better quality for uploaded profile pictures.\\n• Various UI improvements.\\n\\n🚀 **Faster**\\n• Several optimizations for older devices – no more freezing while typing.\\n\\n💪 **Stronger**\\n• Saved Messages now correctly renders in search results.\\n• Fixed missing icons for muted chats in the chat list.\\n• The context menu no longer flickers on older devices.\\n• Fix re-scheduling messages to a previous date.\\n\";","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { updateGlobalSearch, updateGlobalSearchContent } from '../../reducers';\n\nconst MAX_RECENTLY_FOUND_IDS = 10;\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n const { chatId } = global.globalSearch;\n\n return updateGlobalSearch(global, {\n globalResults: {},\n localResults: {},\n resultsByType: undefined,\n ...(query ? { fetchingStatus: { chats: !chatId, messages: true } } : { fetchingStatus: undefined }),\n query,\n });\n});\n\naddReducer('addRecentlyFoundChatId', (global, actions, payload) => {\n const { id } = payload!;\n const { recentlyFoundChatIds } = global.globalSearch;\n\n if (!recentlyFoundChatIds) {\n return updateGlobalSearch(global, { recentlyFoundChatIds: [id] });\n }\n\n const newRecentIds = recentlyFoundChatIds.filter((chatId) => chatId !== id);\n newRecentIds.unshift(id);\n if (newRecentIds.length > MAX_RECENTLY_FOUND_IDS) {\n newRecentIds.pop();\n }\n\n return updateGlobalSearch(global, { recentlyFoundChatIds: newRecentIds });\n});\n\naddReducer('clearRecentlyFoundChats', (global) => {\n return updateGlobalSearch(global, { recentlyFoundChatIds: undefined });\n});\n\naddReducer('setGlobalSearchContent', (global, actions, payload) => {\n const { content } = payload!;\n\n return updateGlobalSearchContent(global, content);\n});\n\naddReducer('setGlobalSearchChatId', (global, actions, payload) => {\n const { id } = payload!;\n\n return updateGlobalSearch(global, { chatId: id, query: undefined, resultsByType: undefined });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n search: {\n query,\n resultIds: undefined,\n },\n },\n };\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n query,\n offsetId: undefined,\n results: undefined,\n },\n },\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport { updateSelectedUserId, updateUserSearch } from '../../reducers';\n\naddReducer('openUserInfo', (global, actions, payload) => {\n const { id } = payload!;\n\n actions.openChat({ id });\n});\n\nconst clearSelectedUserId = (global: GlobalState) => updateSelectedUserId(global, undefined);\n\naddReducer('openChat', clearSelectedUserId);\n\naddReducer('setUserSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n return updateUserSearch(global, {\n globalUserIds: undefined,\n localUserIds: undefined,\n fetchingStatus: Boolean(query),\n query,\n });\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport { ApiError } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TABLET_COLUMN_LAYOUT } from '../../../util/environment';\nimport getReadableErrorText from '../../../util/getReadableErrorText';\nimport { selectCurrentMessageList } from '../../selectors';\nimport generateIdFor from '../../../util/generateIdFor';\n\nconst MAX_STORED_EMOJIS = 18; // Represents two rows of recent emojis\n\naddReducer('toggleChatInfo', (global) => {\n return {\n ...global,\n isChatInfoShown: !global.isChatInfoShown,\n };\n});\n\naddReducer('setLeftColumnWidth', (global, actions, payload) => {\n const leftColumnWidth = payload;\n\n return {\n ...global,\n leftColumnWidth,\n };\n});\n\naddReducer('resetLeftColumnWidth', (global) => {\n return {\n ...global,\n leftColumnWidth: undefined,\n };\n});\n\naddReducer('toggleManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: !(global.management.byChatId[chatId] || {}).isActive,\n },\n },\n },\n };\n});\n\naddReducer('closeManagement', (global): GlobalState | undefined => {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n if (!chatId) {\n return undefined;\n }\n\n return {\n ...global,\n management: {\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...global.management.byChatId[chatId],\n isActive: false,\n },\n },\n },\n };\n});\n\naddReducer('openChat', (global) => {\n if (!IS_SINGLE_COLUMN_LAYOUT && !IS_TABLET_COLUMN_LAYOUT) {\n return undefined;\n }\n\n return {\n ...global,\n isLeftColumnShown: global.messages.messageLists.length === 0,\n };\n});\n\naddReducer('toggleLeftColumn', (global) => {\n return {\n ...global,\n isLeftColumnShown: !global.isLeftColumnShown,\n };\n});\n\naddReducer('addRecentEmoji', (global, action, payload) => {\n const { emoji } = payload!;\n const { recentEmojis } = global;\n if (!recentEmojis) {\n return {\n ...global,\n recentEmojis: [emoji],\n };\n }\n\n const newEmojis = recentEmojis.filter((e) => e !== emoji);\n newEmojis.unshift(emoji);\n if (newEmojis.length > MAX_STORED_EMOJIS) {\n newEmojis.pop();\n }\n\n return {\n ...global,\n recentEmojis: newEmojis,\n };\n});\n\naddReducer('addRecentSticker', (global, action, payload) => {\n const { sticker } = payload!;\n const { recent } = global.stickers;\n if (!recent) {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n hash: '0',\n stickers: [sticker],\n },\n },\n };\n }\n\n const newStickers = recent.stickers.filter((s) => s.id !== sticker.id);\n newStickers.unshift(sticker);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n recent: {\n ...recent,\n stickers: newStickers,\n },\n },\n };\n});\n\naddReducer('showNotification', (global, actions, payload) => {\n const notification = payload!;\n notification.localId = generateIdFor({});\n\n const newNotifications = [...global.notifications];\n const existingNotificationIndex = newNotifications.findIndex((n) => n.message === notification.message);\n if (existingNotificationIndex !== -1) {\n newNotifications.splice(existingNotificationIndex, 1);\n }\n\n newNotifications.push(notification);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('dismissNotification', (global, actions, payload) => {\n const newNotifications = global.notifications.filter(({ localId }) => localId !== payload.localId);\n\n return {\n ...global,\n notifications: newNotifications,\n };\n});\n\naddReducer('showDialog', (global, actions, payload) => {\n const { data } = payload!;\n\n // Filter out errors that we don't want to show to the user\n if ('message' in data && data.hasErrorKey && !getReadableErrorText(data)) {\n return global;\n }\n\n const newDialogs = [...global.dialogs];\n if ('message' in data) {\n const existingErrorIndex = newDialogs.findIndex((err) => (err as ApiError).message === data.message);\n if (existingErrorIndex !== -1) {\n newDialogs.splice(existingErrorIndex, 1);\n }\n }\n\n newDialogs.push(data);\n\n return {\n ...global,\n dialogs: newDialogs,\n };\n});\n\naddReducer('dismissDialog', (global) => {\n const newDialogs = [...global.dialogs];\n\n newDialogs.pop();\n\n return {\n ...global,\n dialogs: newDialogs,\n };\n});\n\naddReducer('toggleSafeLinkModal', (global, actions, payload) => {\n const { url: safeLinkModalUrl } = payload;\n\n return {\n ...global,\n safeLinkModalUrl,\n };\n});\n\naddReducer('openHistoryCalendar', (global, actions, payload) => {\n const { selectedAt } = payload;\n\n return {\n ...global,\n historyCalendarSelectedAt: selectedAt,\n };\n});\n\naddReducer('closeHistoryCalendar', (global) => {\n return {\n ...global,\n historyCalendarSelectedAt: undefined,\n };\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { clearPayment, closeInvoice } from '../../reducers';\n\naddReducer('openPaymentModal', (global, actions, payload) => {\n const { chatId, messageId } = payload;\n return {\n ...global,\n payment: {\n ...global.payment,\n chatId,\n messageId,\n isPaymentModalOpen: true,\n },\n };\n});\n\naddReducer('closePaymentModal', (global) => {\n const newGlobal = clearPayment(global);\n return closeInvoice(newGlobal);\n});\n\naddReducer('addPaymentError', (global, actions, payload) => {\n const { error } = payload!;\n\n return {\n ...global,\n payment: {\n ...global.payment,\n error,\n },\n };\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalActions } from '../../../global/types';\nimport {\n ApiAttachment,\n ApiChat,\n ApiMessage,\n ApiMessageEntity,\n ApiNewPoll,\n ApiOnProgress,\n ApiSticker,\n ApiUser,\n ApiVideo,\n MAIN_THREAD_ID,\n MESSAGE_DELETED,\n} from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport {\n MAX_MEDIA_FILES_FOR_ALBUM,\n MESSAGE_LIST_SLICE,\n SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../../config';\nimport { IS_IOS } from '../../../util/environment';\nimport { callApi, cancelApiProgress } from '../../../api/gramjs';\nimport {\n areSortedArraysIntersecting, buildCollectionByKey, split, unique,\n} from '../../../util/iteratees';\nimport {\n addUsers,\n addChatMessagesById,\n replaceThreadParam,\n safeReplaceViewportIds,\n updateChatMessage,\n addChats,\n updateListedIds,\n updateOutlyingIds,\n replaceScheduledMessages,\n updateThreadInfos,\n updateChat,\n updateThreadUnreadFromForwardedMessage,\n updateSponsoredMessage,\n} from '../../reducers';\nimport {\n selectChat,\n selectChatMessage,\n selectCurrentMessageList,\n selectFocusedMessageId,\n selectCurrentChat,\n selectListedIds,\n selectOutlyingIds,\n selectViewportIds,\n selectRealLastReadId,\n selectReplyingToId,\n selectEditingId,\n selectDraft,\n selectThreadOriginChat,\n selectThreadTopMessageId,\n selectEditingScheduledId,\n selectEditingMessage,\n selectScheduledMessage,\n selectNoWebPage,\n selectFirstUnreadId,\n selectUser,\n selectSendAs,\n selectSponsoredMessage,\n} from '../../selectors';\nimport { debounce, rafPromise } from '../../../util/schedulers';\nimport { isServiceNotificationMessage } from '../../helpers';\n\nconst uploadProgressCallbacks = new Map();\n\nconst runDebouncedForMarkRead = debounce((cb) => cb(), 500, false);\n\naddReducer('loadViewportMessages', (global, actions, payload) => {\n const {\n direction = LoadMoreDirection.Around,\n isBudgetPreload = false,\n } = payload || {};\n\n let { chatId, threadId } = payload || {};\n\n if (!chatId) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n chatId = currentMessageList.chatId;\n threadId = currentMessageList.threadId;\n }\n\n const chat = selectChat(global, chatId);\n // TODO Revise if `chat.isRestricted` check is needed\n if (!chat || chat.isRestricted) {\n return undefined;\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (!viewportIds || !viewportIds.length || direction === LoadMoreDirection.Around) {\n const offsetId = selectFocusedMessageId(global, chatId) || selectRealLastReadId(global, chatId, threadId);\n const isOutlying = Boolean(offsetId && listedIds && !listedIds.includes(offsetId));\n const historyIds = (isOutlying ? outlyingIds : listedIds) || [];\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, LoadMoreDirection.Around);\n\n if (areSomeLocal && newViewportIds.length >= MESSAGE_LIST_SLICE) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n if (!areAllLocal) {\n void loadViewportMessages(chat, threadId, offsetId, LoadMoreDirection.Around, isOutlying, isBudgetPreload);\n }\n } else {\n const offsetId = direction === LoadMoreDirection.Backwards ? viewportIds[0] : viewportIds[viewportIds.length - 1];\n const isOutlying = Boolean(outlyingIds);\n const historyIds = (isOutlying ? outlyingIds : listedIds)!;\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(historyIds, offsetId, direction);\n\n if (areSomeLocal) {\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds);\n }\n\n void loadWithBudget(actions, areAllLocal, isOutlying, isBudgetPreload, chat, threadId, direction, offsetId);\n\n if (isBudgetPreload) {\n return undefined;\n }\n }\n\n return global;\n});\n\nasync function loadWithBudget(\n actions: GlobalActions,\n areAllLocal: boolean, isOutlying: boolean, isBudgetPreload: boolean,\n chat: ApiChat, threadId: number, direction: LoadMoreDirection, offsetId?: number,\n) {\n if (!areAllLocal) {\n await loadViewportMessages(\n chat, threadId, offsetId, direction, isOutlying, isBudgetPreload,\n );\n }\n\n if (!isBudgetPreload) {\n // Let reducer return and update global\n await Promise.resolve();\n actions.loadViewportMessages({\n chatId: chat.id, threadId, direction, isBudgetPreload: true,\n });\n }\n}\n\naddReducer('loadMessage', (global, actions, payload) => {\n const {\n chatId, messageId, replyOriginForId, threadUpdate,\n } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n const message = await loadMessage(chat, messageId, replyOriginForId);\n if (message && threadUpdate) {\n const { lastMessageId, isDeleting } = threadUpdate;\n\n setGlobal(updateThreadUnreadFromForwardedMessage(\n getGlobal(),\n message,\n chatId,\n lastMessageId,\n isDeleting,\n ));\n }\n })();\n});\n\naddReducer('sendMessage', (global, actions, payload) => {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId, type } = currentMessageList;\n\n if (type === 'scheduled' && !payload.scheduledAt) {\n return {\n ...global,\n messages: {\n ...global.messages,\n contentToBeScheduled: payload,\n },\n };\n }\n\n const chat = selectChat(global, chatId)!;\n\n const params = {\n ...payload,\n chat,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n noWebPage: selectNoWebPage(global, chatId, threadId),\n sendAs: selectSendAs(global, chatId),\n };\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n const isSingle = !payload.attachments || payload.attachments.length <= 1;\n const isGrouped = !isSingle && payload.attachments && payload.attachments.length > 1;\n\n if (isSingle) {\n const { attachments, ...restParams } = params;\n sendMessage({\n ...restParams,\n attachment: attachments ? attachments[0] : undefined,\n });\n } else if (isGrouped) {\n const {\n text, entities, attachments, ...commonParams\n } = params;\n const groupedAttachments = split(attachments, MAX_MEDIA_FILES_FOR_ALBUM);\n for (let i = 0; i < groupedAttachments.length; i++) {\n const [firstAttachment, ...restAttachments] = groupedAttachments[i];\n const groupedId = `${Date.now()}${i}`;\n\n sendMessage({\n ...commonParams,\n text: i === 0 ? text : undefined,\n entities: i === 0 ? entities : undefined,\n attachment: firstAttachment,\n groupedId: restAttachments.length > 0 ? groupedId : undefined,\n });\n\n restAttachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n groupedId,\n });\n });\n }\n } else {\n const {\n text, entities, attachments, replyingTo, ...commonParams\n } = params;\n\n if (text) {\n sendMessage({\n ...commonParams,\n text,\n entities,\n replyingTo,\n });\n }\n\n attachments.forEach((attachment: ApiAttachment) => {\n sendMessage({\n ...commonParams,\n attachment,\n });\n });\n }\n\n return undefined;\n});\n\naddReducer('editMessage', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { text, entities } = payload!;\n\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId, threadId, type: messageListType } = currentMessageList;\n const chat = selectChat(global, chatId);\n const message = selectEditingMessage(global, chatId, threadId, messageListType);\n if (!chat || !message) {\n return;\n }\n\n void callApi('editMessage', {\n chat, message, text, entities, noWebPage: selectNoWebPage(global, chatId, threadId), serverTimeOffset,\n });\n\n actions.setEditingId({ messageId: undefined });\n});\n\naddReducer('cancelSendingMessage', (global, actions, payload) => {\n const { chatId, messageId } = payload!;\n const message = selectChatMessage(global, chatId, messageId);\n const progressCallback = message && uploadProgressCallbacks.get(message.previousLocalId || message.id);\n if (progressCallback) {\n cancelApiProgress(progressCallback);\n }\n\n actions.apiUpdate({\n '@type': 'deleteMessages',\n ids: [messageId],\n chatId,\n });\n});\n\naddReducer('saveDraft', (global, actions, payload) => {\n const { chatId, threadId, draft } = payload!;\n if (!draft) {\n return undefined;\n }\n\n const { text, entities } = draft;\n const chat = selectChat(global, chatId)!;\n\n if (threadId === MAIN_THREAD_ID) {\n void callApi('saveDraft', {\n chat,\n text,\n entities,\n replyToMsgId: selectReplyingToId(global, chatId, threadId),\n });\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'draft', draft);\n global = updateChat(global, chatId, { draftDate: Math.round(Date.now() / 1000) });\n\n return global;\n});\n\naddReducer('clearDraft', (global, actions, payload) => {\n const { chatId, threadId, localOnly } = payload!;\n if (!selectDraft(global, chatId, threadId)) {\n return undefined;\n }\n\n const chat = selectChat(global, chatId)!;\n\n if (!localOnly && threadId === MAIN_THREAD_ID) {\n void callApi('clearDraft', chat);\n }\n\n global = replaceThreadParam(global, chatId, threadId, 'draft', undefined);\n global = updateChat(global, chatId, { draftDate: undefined });\n\n return global;\n});\n\naddReducer('toggleMessageWebPage', (global, actions, payload) => {\n const { chatId, threadId, noWebPage } = payload!;\n\n return replaceThreadParam(global, chatId, threadId, 'noWebPage', noWebPage);\n});\n\naddReducer('pinMessage', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const {\n messageId, isUnpin, isOneSide, isSilent,\n } = payload!;\n\n void callApi('pinMessage', {\n chat, messageId, isUnpin, isOneSide, isSilent,\n });\n});\n\naddReducer('unpinAllMessages', (global, actions, payload) => {\n const chat = selectChat(global, payload.chatId);\n if (!chat) {\n return;\n }\n\n void unpinAllMessages(chat);\n});\n\nasync function unpinAllMessages(chat: ApiChat) {\n await callApi('unpinAllMessages', { chat });\n let global = getGlobal();\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', []);\n setGlobal(global);\n}\n\naddReducer('deleteMessages', (global, actions, payload) => {\n const { messageIds, shouldDeleteForAll } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { chatId, threadId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteMessages', { chat, messageIds, shouldDeleteForAll });\n\n const editingId = selectEditingId(global, chatId, threadId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteScheduledMessages', (global, actions, payload) => {\n const { messageIds } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n void callApi('deleteScheduledMessages', { chat, messageIds });\n\n const editingId = selectEditingScheduledId(global, chatId);\n if (messageIds.includes(editingId)) {\n actions.setEditingId({ messageId: undefined });\n }\n});\n\naddReducer('deleteHistory', (global, actions, payload) => {\n (async () => {\n const { chatId, shouldDeleteForAll } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const maxId = chat.lastMessage?.id;\n\n await callApi('deleteHistory', { chat, shouldDeleteForAll, maxId });\n\n const activeChat = selectCurrentMessageList(global);\n if (activeChat && activeChat.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n })();\n});\n\naddReducer('reportMessages', (global, actions, payload) => {\n (async () => {\n const {\n messageIds, reason, description,\n } = payload!;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n\n const { chatId } = currentMessageList;\n const chat = selectChat(global, chatId)!;\n\n const result = await callApi('reportMessages', {\n peer: chat, messageIds, reason, description,\n });\n\n actions.showNotification({\n message: result\n ? 'Thank you! Your report will be reviewed by our team.'\n : 'Error occured while submiting report. Please, try again later.',\n });\n })();\n});\n\naddReducer('sendMessageAction', (global, actions, payload) => {\n (async () => {\n const { action, chatId, threadId } = payload!;\n if (chatId === global.currentUserId) return; // Message actions are disabled in Saved Messages\n\n const chat = selectChat(global, chatId)!;\n if (!chat) return;\n\n await callApi('sendMessageAction', {\n peer: chat, threadId, action,\n });\n })();\n});\n\naddReducer('markMessageListRead', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return undefined;\n }\n\n const { chatId, threadId } = currentMessageList;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return undefined;\n }\n\n const { maxId } = payload!;\n\n runDebouncedForMarkRead(() => {\n void callApi('markMessageListRead', {\n serverTimeOffset, chat, threadId, maxId,\n });\n });\n\n // TODO Support local marking read for threads\n if (threadId !== MAIN_THREAD_ID) {\n return undefined;\n }\n\n if (chatId === SERVICE_NOTIFICATIONS_USER_ID) {\n global = {\n ...global,\n serviceNotifications: global.serviceNotifications.map((notification) => {\n return notification.isUnread && notification.id <= maxId ? { ...notification, isUnread: false } : notification;\n }),\n };\n }\n\n const viewportIds = selectViewportIds(global, chatId, threadId);\n const minId = selectFirstUnreadId(global, chatId, threadId);\n if (!viewportIds || !minId || !chat.unreadCount) {\n return global;\n }\n\n const readCount = countSortedIds(viewportIds!, minId, maxId);\n if (!readCount) {\n return global;\n }\n\n return updateChat(global, chatId, {\n lastReadInboxMessageId: maxId,\n unreadCount: Math.max(0, chat.unreadCount - readCount),\n });\n});\n\naddReducer('markMessagesRead', (global, actions, payload) => {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n const { messageIds } = payload!;\n\n void callApi('markMessagesRead', { chat, messageIds });\n});\n\naddReducer('loadWebPagePreview', (global, actions, payload) => {\n const { text } = payload!;\n void loadWebPagePreview(text);\n});\n\naddReducer('clearWebPagePreview', (global) => {\n if (!global.webPagePreview) {\n return undefined;\n }\n\n return {\n ...global,\n webPagePreview: undefined,\n };\n});\n\naddReducer('sendPollVote', (global, actions, payload) => {\n const { chatId, messageId, options } = payload!;\n const chat = selectChat(global, chatId);\n\n if (chat) {\n void callApi('sendPollVote', { chat, messageId, options });\n }\n});\n\naddReducer('loadPollOptionResults', (global, actions, payload) => {\n const {\n chat, messageId, option, offset, limit, shouldResetVoters,\n } = payload!;\n\n void loadPollOptionResults(chat, messageId, option, offset, limit, shouldResetVoters);\n});\n\naddReducer('forwardMessages', (global, action, payload) => {\n const { fromChatId, messageIds, toChatId } = global.forwardMessages;\n const fromChat = fromChatId ? selectChat(global, fromChatId) : undefined;\n const toChat = toChatId ? selectChat(global, toChatId) : undefined;\n const messages = fromChatId && messageIds\n ? messageIds\n .sort((a, b) => a - b)\n .map((id) => selectChatMessage(global, fromChatId, id)).filter(Boolean as any)\n : undefined;\n\n if (!fromChat || !toChat || !messages) {\n return;\n }\n\n const { isSilent, scheduledAt } = payload;\n const sendAs = selectSendAs(global, toChatId!);\n\n const realMessages = messages.filter((m) => !isServiceNotificationMessage(m));\n if (realMessages.length) {\n void callApi('forwardMessages', {\n fromChat,\n toChat,\n messages: realMessages,\n serverTimeOffset: getGlobal().serverTimeOffset,\n isSilent,\n scheduledAt,\n sendAs,\n });\n }\n\n messages\n .filter((m) => isServiceNotificationMessage(m))\n .forEach((message) => {\n const { text, entities } = message.content.text || {};\n const { sticker, poll } = message.content;\n\n void sendMessage({\n chat: toChat,\n text,\n entities,\n sticker,\n poll,\n isSilent,\n scheduledAt,\n sendAs,\n });\n });\n\n setGlobal({\n ...getGlobal(),\n forwardMessages: {},\n });\n});\n\naddReducer('loadScheduledHistory', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadScheduledHistory(chat);\n});\n\naddReducer('sendScheduledMessages', (global, actions, payload) => {\n const {\n chatId, id,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('sendScheduledMessages', {\n chat,\n ids: [id],\n });\n});\n\naddReducer('rescheduleMessage', (global, actions, payload) => {\n const {\n chatId, messageId, scheduledAt,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n const message = chat && selectScheduledMessage(global, chat.id, messageId);\n if (!chat || !message) {\n return;\n }\n\n void callApi('rescheduleMessage', {\n chat,\n message,\n scheduledAt,\n });\n});\n\naddReducer('requestThreadInfoUpdate', (global, actions, payload) => {\n const { chatId, threadId } = payload;\n const chat = selectThreadOriginChat(global, chatId, threadId);\n if (!chat) {\n return;\n }\n\n void callApi('requestThreadInfoUpdate', { chat, threadId });\n});\n\nasync function loadWebPagePreview(message: string) {\n const webPagePreview = await callApi('fetchWebPagePreview', { message });\n\n setGlobal({\n ...getGlobal(),\n webPagePreview,\n });\n}\n\nasync function loadViewportMessages(\n chat: ApiChat,\n threadId: number,\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n isOutlying = false,\n isBudgetPreload = false,\n) {\n const chatId = chat.id;\n\n let addOffset: number | undefined;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n addOffset = undefined;\n break;\n case LoadMoreDirection.Around:\n addOffset = -(Math.round(MESSAGE_LIST_SLICE / 2) + 1);\n break;\n case LoadMoreDirection.Forwards:\n addOffset = -(MESSAGE_LIST_SLICE + 1);\n break;\n }\n\n const result = await callApi('fetchMessages', {\n chat: selectThreadOriginChat(getGlobal(), chatId, threadId)!,\n offsetId,\n addOffset,\n limit: MESSAGE_LIST_SLICE,\n threadId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, chats, threadInfos,\n } = result;\n\n let global = getGlobal();\n\n const localMessages = chatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.map(({ message }) => message)\n : [];\n const allMessages = ([] as ApiMessage[]).concat(messages, localMessages);\n const byId = buildCollectionByKey(allMessages, 'id');\n const ids = Object.keys(byId).map(Number);\n\n global = addChatMessagesById(global, chatId, byId);\n global = isOutlying\n ? updateOutlyingIds(global, chatId, threadId, ids)\n : updateListedIds(global, chatId, threadId, ids);\n\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n global = updateThreadInfos(global, chatId, threadInfos);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n\n if (isOutlying && listedIds && outlyingIds) {\n if (!outlyingIds.length || areSortedArraysIntersecting(listedIds, outlyingIds)) {\n global = updateListedIds(global, chatId, threadId, outlyingIds);\n listedIds = selectListedIds(global, chatId, threadId);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', undefined);\n isOutlying = false;\n }\n }\n\n if (!isBudgetPreload) {\n const historyIds = isOutlying ? outlyingIds! : listedIds!;\n const { newViewportIds } = getViewportSlice(historyIds, offsetId, direction);\n global = safeReplaceViewportIds(global, chatId, threadId, newViewportIds!);\n }\n\n setGlobal(global);\n}\n\nasync function loadMessage(chat: ApiChat, messageId: number, replyOriginForId: number) {\n const result = await callApi('fetchMessage', { chat, messageId });\n if (!result) {\n return undefined;\n }\n\n if (result === MESSAGE_DELETED) {\n if (replyOriginForId) {\n let global = getGlobal();\n const replyMessage = selectChatMessage(global, chat.id, replyOriginForId);\n global = updateChatMessage(global, chat.id, replyOriginForId, {\n ...replyMessage,\n replyToMessageId: undefined,\n });\n setGlobal(global);\n }\n\n return undefined;\n }\n\n let global = getGlobal();\n global = updateChatMessage(global, chat.id, messageId, result.message);\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n setGlobal(global);\n\n return result.message;\n}\n\nfunction findClosestIndex(sourceIds: number[], offsetId: number) {\n if (offsetId < sourceIds[0]) {\n return 0;\n }\n\n if (offsetId > sourceIds[sourceIds.length - 1]) {\n return sourceIds.length - 1;\n }\n\n return sourceIds.findIndex((id, i) => (\n id === offsetId\n || (id < offsetId && sourceIds[i + 1] > offsetId)\n ));\n}\n\nfunction getViewportSlice(\n sourceIds: number[],\n offsetId: number | undefined,\n direction: LoadMoreDirection,\n) {\n const { length } = sourceIds;\n const index = offsetId ? findClosestIndex(sourceIds, offsetId) : -1;\n const isBackwards = direction === LoadMoreDirection.Backwards;\n const indexForDirection = isBackwards ? index : (index + 1) || length;\n const from = indexForDirection - MESSAGE_LIST_SLICE;\n const to = indexForDirection + MESSAGE_LIST_SLICE - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n case LoadMoreDirection.Around:\n default:\n areSomeLocal = newViewportIds.length > 0;\n areAllLocal = newViewportIds.length === MESSAGE_LIST_SLICE;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n\nasync function sendMessage(params: {\n chat: ApiChat;\n text?: string;\n entities?: ApiMessageEntity[];\n replyingTo?: number;\n attachment?: ApiAttachment;\n sticker?: ApiSticker;\n gif?: ApiVideo;\n poll?: ApiNewPoll;\n serverTimeOffset?: number;\n isSilent?: boolean;\n scheduledAt?: number;\n sendAs?: ApiChat | ApiUser;\n}) {\n let localId: number | undefined;\n const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {\n if (!uploadProgressCallbacks.has(messageLocalId)) {\n localId = messageLocalId;\n uploadProgressCallbacks.set(messageLocalId, progressCallback!);\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n fileUploads: {\n byMessageLocalId: {\n ...global.fileUploads.byMessageLocalId,\n [messageLocalId]: { progress },\n },\n },\n });\n } : undefined;\n\n // @optimization\n if (params.replyingTo || IS_IOS) {\n await rafPromise();\n }\n\n const global = getGlobal();\n params.serverTimeOffset = global.serverTimeOffset;\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return;\n }\n const { threadId } = currentMessageList;\n\n if (!params.replyingTo && threadId !== MAIN_THREAD_ID) {\n params.replyingTo = selectThreadTopMessageId(global, params.chat.id, threadId)!;\n }\n\n await callApi('sendMessage', params, progressCallback);\n\n if (progressCallback && localId) {\n uploadProgressCallbacks.delete(localId);\n }\n}\n\nasync function loadPollOptionResults(\n chat: ApiChat,\n messageId: number,\n option: string,\n offset?: string,\n limit?: number,\n shouldResetVoters?: boolean,\n) {\n const result = await callApi('loadPollOptionResults', {\n chat, messageId, option, offset, limit,\n });\n\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n const { voters } = global.pollResults;\n\n setGlobal({\n ...global,\n pollResults: {\n ...global.pollResults,\n voters: {\n ...voters,\n [option]: unique([\n ...(!shouldResetVoters && voters && voters[option] ? voters[option] : []),\n ...(result && result.users.map((user) => user.id)),\n ]),\n },\n offsets: {\n ...(global.pollResults.offsets ? global.pollResults.offsets : {}),\n [option]: result.nextOffset || '',\n },\n },\n });\n}\n\naddReducer('loadPinnedMessages', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void loadPinnedMessages(chat);\n});\n\naddReducer('loadSeenBy', (global, actions, payload) => {\n const { chatId, messageId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchSeenBy', { chat, messageId });\n if (!result) {\n return;\n }\n\n setGlobal(updateChatMessage(getGlobal(), chatId, messageId, {\n seenByUserIds: result,\n }));\n })();\n});\n\naddReducer('saveDefaultSendAs', (global, actions, payload) => {\n const { chatId, sendAsId } = payload;\n const chat = selectChat(global, chatId);\n const sendAsChat = selectChat(global, sendAsId) || selectUser(global, sendAsId);\n if (!chat || !sendAsChat) {\n return undefined;\n }\n\n void callApi('saveDefaultSendAs', { sendAs: sendAsChat, chat });\n\n return updateChat(global, chatId, {\n fullInfo: {\n ...chat.fullInfo,\n sendAsId,\n },\n });\n});\n\naddReducer('loadSendAs', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchSendAs', { chat });\n if (!result) {\n global = updateChat(global, chatId, {\n sendAsIds: [],\n });\n setGlobal(global);\n return;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChat(global, chatId, {\n sendAsIds: result.ids,\n });\n setGlobal(global);\n })();\n});\n\nasync function loadPinnedMessages(chat: ApiChat) {\n const result = await callApi('fetchPinnedMessages', { chat });\n if (!result) {\n return;\n }\n\n const { messages, chats, users } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = addChatMessagesById(global, chat.id, byId);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'pinnedIds', ids);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n setGlobal(global);\n}\n\nasync function loadScheduledHistory(chat: ApiChat) {\n const result = await callApi('fetchScheduledHistory', { chat });\n if (!result) {\n return;\n }\n\n const { messages } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const ids = Object.keys(byId).map(Number).sort((a, b) => b - a);\n\n let global = getGlobal();\n global = replaceScheduledMessages(global, chat.id, byId);\n global = replaceThreadParam(global, chat.id, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n}\n\naddReducer('loadSponsoredMessages', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchSponsoredMessages', { chat });\n if (!result) {\n return;\n }\n\n let newGlobal = updateSponsoredMessage(getGlobal(), chatId, result.messages[0]);\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n newGlobal = addChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('viewSponsoredMessage', (global, actions, payload) => {\n const { chatId } = payload;\n const chat = selectChat(global, chatId);\n const message = selectSponsoredMessage(global, chatId);\n if (!chat || !message) {\n return;\n }\n\n void callApi('viewSponsoredMessage', { chat, random: message.randomId });\n});\n\nfunction countSortedIds(ids: number[], from: number, to: number) {\n let count = 0;\n\n for (let i = 0, l = ids.length; i < l; i++) {\n if (ids[i] >= from && ids[i] <= to) {\n count++;\n }\n\n if (ids[i] >= to) {\n break;\n }\n }\n\n return count;\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/types';\nimport { LangCode } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { pause, throttle } from '../../../util/schedulers';\nimport {\n updateStickerSets,\n updateStickerSet,\n replaceAnimatedEmojis,\n updateGifSearch,\n updateStickersForEmoji,\n rebuildStickersForEmoji,\n} from '../../reducers';\nimport searchWords from '../../../util/searchWords';\nimport { selectStickerSet } from '../../selectors';\n\nconst ADDED_SETS_THROTTLE = 200;\nconst ADDED_SETS_THROTTLE_CHUNK = 10;\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('loadStickerSets', (global) => {\n const { hash } = global.stickers.added || {};\n void loadStickerSets(hash);\n});\n\naddReducer('loadAddedStickers', (global, actions) => {\n const { setIds: addedSetIds } = global.stickers.added;\n if (!addedSetIds || !addedSetIds.length) {\n return;\n }\n\n (async () => {\n for (let i = 0; i < addedSetIds.length; i++) {\n actions.loadStickers({ stickerSetId: addedSetIds[i] });\n\n if (i % ADDED_SETS_THROTTLE_CHUNK === 0 && i > 0) {\n await pause(ADDED_SETS_THROTTLE);\n }\n }\n })();\n});\n\naddReducer('loadRecentStickers', (global) => {\n const { hash } = global.stickers.recent || {};\n void loadRecentStickers(hash);\n});\n\naddReducer('loadFavoriteStickers', (global) => {\n const { hash } = global.stickers.favorite || {};\n void loadFavoriteStickers(hash);\n});\n\naddReducer('loadGreetingStickers', (global) => {\n const { hash } = global.stickers.greeting || {};\n\n (async () => {\n const greeting = await callApi('fetchStickersForEmoji', { emoji: '👋⭐️', hash });\n\n if (!greeting) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n stickers: {\n ...newGlobal.stickers,\n greeting: {\n hash: greeting.hash,\n stickers: greeting.stickers.filter((sticker) => sticker.emoji === '👋'),\n },\n },\n });\n })();\n});\n\naddReducer('loadFeaturedStickers', (global) => {\n const { hash } = global.stickers.featured || {};\n void loadFeaturedStickers(hash);\n});\n\naddReducer('loadStickers', (global, actions, payload) => {\n const { stickerSetId, stickerSetShortName } = payload!;\n let { stickerSetAccessHash } = payload!;\n\n if (!stickerSetAccessHash && !stickerSetShortName) {\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n stickerSetAccessHash = stickerSet.accessHash;\n }\n\n void loadStickers(stickerSetId, stickerSetAccessHash, stickerSetShortName);\n});\n\naddReducer('loadAnimatedEmojis', () => {\n void loadAnimatedEmojis();\n void loadAnimatedEmojiEffects();\n});\n\naddReducer('loadSavedGifs', (global) => {\n const { hash } = global.gifs.saved;\n void loadSavedGifs(hash);\n});\n\naddReducer('faveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void callApi('faveSticker', { sticker });\n }\n});\n\naddReducer('unfaveSticker', (global, actions, payload) => {\n const { sticker } = payload!;\n\n if (sticker) {\n void unfaveSticker(sticker);\n }\n});\n\naddReducer('toggleStickerSet', (global, actions, payload) => {\n const { stickerSetId } = payload!;\n const stickerSet = selectStickerSet(global, stickerSetId);\n if (!stickerSet) {\n return;\n }\n\n const { accessHash, installedDate } = stickerSet;\n\n void callApi(!installedDate ? 'installStickerSet' : 'uninstallStickerSet', { stickerSetId, accessHash });\n});\n\naddReducer('loadEmojiKeywords', (global, actions, payload: { language: LangCode }) => {\n const { language } = payload;\n\n let currentEmojiKeywords = global.emojiKeywords[language];\n if (currentEmojiKeywords?.isLoading) {\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: true,\n },\n },\n });\n\n (async () => {\n const emojiKeywords = await callApi('fetchEmojiKeywords', {\n language,\n fromVersion: currentEmojiKeywords ? currentEmojiKeywords.version : 0,\n });\n\n global = getGlobal();\n currentEmojiKeywords = global.emojiKeywords[language];\n\n if (!emojiKeywords) {\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n ...currentEmojiKeywords,\n isLoading: false,\n },\n },\n });\n\n return;\n }\n\n setGlobal({\n ...global,\n emojiKeywords: {\n ...global.emojiKeywords,\n [language]: {\n isLoading: false,\n version: emojiKeywords.version,\n keywords: {\n ...(currentEmojiKeywords?.keywords),\n ...emojiKeywords.keywords,\n },\n },\n },\n });\n })();\n});\n\nasync function loadStickerSets(hash?: string) {\n const addedStickers = await callApi('fetchStickerSets', { hash });\n if (!addedStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'added',\n addedStickers.hash,\n addedStickers.sets,\n ));\n}\n\nasync function loadRecentStickers(hash?: string) {\n const recentStickers = await callApi('fetchRecentStickers', { hash });\n if (!recentStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n recent: recentStickers,\n },\n });\n}\n\nasync function loadFavoriteStickers(hash?: string) {\n const favoriteStickers = await callApi('fetchFavoriteStickers', { hash });\n if (!favoriteStickers) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: favoriteStickers,\n },\n });\n}\n\nasync function loadFeaturedStickers(hash?: string) {\n const featuredStickers = await callApi('fetchFeaturedStickers', { hash });\n if (!featuredStickers) {\n return;\n }\n\n setGlobal(updateStickerSets(\n getGlobal(),\n 'featured',\n featuredStickers.hash,\n featuredStickers.sets,\n ));\n}\n\nasync function loadStickers(stickerSetId: string, accessHash: string, stickerSetShortName?: string) {\n const stickerSet = await callApi(\n 'fetchStickers',\n { stickerSetShortName, stickerSetId, accessHash },\n );\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers, packs } = stickerSet;\n\n let global = getGlobal();\n\n global = updateStickerSet(global, set.id, { ...set, stickers, packs });\n\n const currentEmoji = global.stickers.forEmoji.emoji;\n if (currentEmoji && packs[currentEmoji]) {\n global = rebuildStickersForEmoji(global);\n }\n\n setGlobal(global);\n}\n\nasync function loadAnimatedEmojis() {\n const stickerSet = await callApi('fetchAnimatedEmojis');\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers } = stickerSet;\n\n setGlobal(replaceAnimatedEmojis(getGlobal(), { ...set, stickers }));\n}\n\nasync function loadAnimatedEmojiEffects() {\n const stickerSet = await callApi('fetchAnimatedEmojiEffects');\n if (!stickerSet) {\n return;\n }\n\n const { set, stickers } = stickerSet;\n\n setGlobal({\n ...getGlobal(),\n animatedEmojiEffects: { ...set, stickers },\n });\n}\n\nfunction unfaveSticker(sticker: ApiSticker) {\n const global = getGlobal();\n\n // Remove sticker preemptively to get instant feedback when user removes sticker\n // from favorites while in Sticker Picker\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n favorite: {\n ...global.stickers.favorite,\n stickers: global.stickers.favorite.stickers.filter(({ id }) => id !== sticker.id),\n },\n },\n });\n\n void callApi('faveSticker', { sticker, unfave: true });\n}\n\naddReducer('setStickerSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (query) {\n void searchThrottled(() => {\n searchStickers(query);\n });\n }\n});\n\naddReducer('setGifSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query);\n });\n }\n});\n\naddReducer('searchMoreGifs', (global) => {\n const { query, offset } = global.gifs.search;\n\n if (typeof query === 'string') {\n void searchThrottled(() => {\n searchGifs(query, offset);\n });\n }\n});\n\naddReducer('loadStickersForEmoji', (global, actions, payload) => {\n const { emoji } = payload!;\n const { hash } = global.stickers.forEmoji;\n\n void searchThrottled(() => {\n loadStickersForEmoji(emoji, hash);\n });\n});\n\naddReducer('clearStickersForEmoji', (global) => {\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {},\n },\n };\n});\n\naddReducer('openStickerSetShortName', (global, actions, payload) => {\n const { stickerSetShortName } = payload!;\n return {\n ...global,\n openedStickerSetShortName: stickerSetShortName,\n };\n});\n\nasync function searchStickers(query: string, hash?: string) {\n const result = await callApi('searchStickers', { query, hash });\n\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n const { setsById, added } = global.stickers;\n\n const resultIds = result.sets.map(({ id }) => id);\n\n if (added.setIds) {\n added.setIds.forEach((id) => {\n if (!resultIds.includes(id)) {\n const { title } = setsById[id] || {};\n if (title && searchWords(title, query)) {\n resultIds.unshift(id);\n }\n }\n });\n }\n\n setGlobal(updateStickerSets(\n global,\n 'search',\n result.hash,\n result.sets,\n resultIds,\n ));\n}\n\nasync function searchGifs(query: string, offset?: string) {\n const result = await callApi('searchGifs', { query, offset });\n if (!result) {\n return;\n }\n\n setGlobal(updateGifSearch(getGlobal(), !offset, result.gifs, result.nextOffset));\n}\n\nasync function loadSavedGifs(hash?: string) {\n const savedGifs = await callApi('fetchSavedGifs', { hash });\n if (!savedGifs) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n gifs: {\n ...global.gifs,\n saved: savedGifs,\n },\n });\n}\n\nasync function loadStickersForEmoji(emoji: string, hash?: string) {\n let global = getGlobal();\n setGlobal({\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n ...global.stickers.forEmoji,\n emoji,\n },\n },\n });\n\n const result = await callApi('fetchStickersForEmoji', { emoji, hash });\n\n global = getGlobal();\n\n if (!result || global.stickers.forEmoji.emoji !== emoji) {\n return;\n }\n\n global = updateStickersForEmoji(global, emoji, result.stickers, result.hash);\n\n setGlobal(global);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { ApiChat, ApiGlobalMessageSearchType } from '../../../api/types';\n\nimport {\n addChats,\n addMessages,\n addUsers,\n updateGlobalSearch,\n updateGlobalSearchFetchingStatus,\n updateGlobalSearchResults,\n} from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\nimport { selectChat, selectCurrentGlobalSearchQuery } from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { GLOBAL_SEARCH_SLICE } from '../../../config';\nimport { timestampPlusDay } from '../../../util/dateFormat';\n\nconst searchThrottled = throttle((cb) => cb(), 500, false);\n\naddReducer('setGlobalSearchQuery', (global, actions, payload) => {\n const { chatId } = global.globalSearch;\n const { query } = payload!;\n\n if (query && !chatId) {\n void searchThrottled(() => {\n searchChats(query);\n });\n }\n});\n\naddReducer('setGlobalSearchDate', (global, actions, payload) => {\n const { date } = payload!;\n const maxDate = date ? timestampPlusDay(date) : date;\n const newGlobal = updateGlobalSearch(global, {\n date,\n query: '',\n resultsByType: {\n ...global.globalSearch.resultsByType,\n text: {\n totalCount: undefined,\n foundIds: [],\n nextOffsetId: 0,\n },\n },\n });\n setGlobal(newGlobal);\n const { chatId } = global.globalSearch;\n const chat = chatId ? selectChat(global, chatId) : undefined;\n searchMessagesGlobal('', 'text', undefined, chat, maxDate, date);\n});\n\naddReducer('searchMessagesGlobal', (global, actions, payload) => {\n const {\n query, resultsByType, chatId, date,\n } = global.globalSearch;\n const maxDate = date ? timestampPlusDay(date) : date;\n const { type } = payload;\n const nextOffsetId = (resultsByType?.[type as ApiGlobalMessageSearchType])?.nextOffsetId;\n\n const chat = chatId ? selectChat(global, chatId) : undefined;\n\n searchMessagesGlobal(query, type, nextOffsetId, chat, maxDate, date);\n});\n\nasync function searchChats(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { chats: false }));\n return;\n }\n\n const {\n localChats, localUsers, globalChats, globalUsers,\n } = result;\n\n if (localChats.length || globalChats.length) {\n global = addChats(global, buildCollectionByKey([...localChats, ...globalChats], 'id'));\n }\n\n if (localUsers.length || globalUsers.length) {\n global = addUsers(global, buildCollectionByKey([...localUsers, ...globalUsers], 'id'));\n }\n\n global = updateGlobalSearchFetchingStatus(global, { chats: false });\n global = updateGlobalSearch(global, {\n localResults: {\n chatIds: localChats.map(({ id }) => id),\n userIds: localUsers.map(({ id }) => id),\n },\n globalResults: {\n ...global.globalSearch.globalResults,\n chatIds: globalChats.map(({ id }) => id),\n userIds: globalUsers.map(({ id }) => id),\n },\n });\n\n setGlobal(global);\n}\n\nasync function searchMessagesGlobal(\n query = '', type: ApiGlobalMessageSearchType, offsetRate?: number, chat?: ApiChat, maxDate?: number, minDate?: number,\n) {\n let result;\n\n if (chat) {\n const localResult = await callApi('searchMessagesLocal', {\n chatOrUser: chat,\n query,\n type,\n limit: GLOBAL_SEARCH_SLICE,\n offsetId: offsetRate,\n minDate,\n maxDate,\n });\n\n if (localResult) {\n const {\n messages, users, totalCount, nextOffsetId,\n } = localResult;\n\n result = {\n messages,\n users,\n chats: [],\n totalCount,\n nextRate: nextOffsetId,\n };\n }\n } else {\n result = await callApi('searchMessagesGlobal', {\n query,\n offsetRate,\n limit: GLOBAL_SEARCH_SLICE,\n type,\n maxDate,\n minDate,\n });\n }\n\n let global = getGlobal();\n const currentSearchQuery = selectCurrentGlobalSearchQuery(global);\n if (!result || (query !== '' && query !== currentSearchQuery)) {\n setGlobal(updateGlobalSearchFetchingStatus(global, { messages: false }));\n return;\n }\n\n const {\n messages, users, chats, totalCount, nextRate,\n } = result;\n\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n\n if (users.length) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (messages.length) {\n global = addMessages(global, messages);\n }\n\n global = updateGlobalSearchResults(\n global,\n messages,\n totalCount,\n type,\n nextRate,\n );\n\n setGlobal(global);\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { MESSAGE_SEARCH_SLICE, SHARED_MEDIA_SLICE } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectCurrentTextSearch,\n selectCurrentMediaSearchPeerId,\n selectCurrentMediaSearch, selectCurrentMessageList, selectChat, selectThreadInfo,\n} from '../../selectors';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport {\n addChatMessagesById,\n addUsers,\n updateLocalMediaSearchResults,\n updateLocalTextSearchResults,\n} from '../../reducers';\nimport { SharedMediaType } from '../../../types';\n\naddReducer('searchTextMessagesLocal', (global) => {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n const currentSearch = selectCurrentTextSearch(global);\n if (!chat || !currentSearch || !threadId) {\n return;\n }\n\n const { query, results } = currentSearch;\n const offsetId = results?.nextOffsetId;\n\n let topMessageId: number | undefined;\n if (threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId!, threadId);\n topMessageId = threadInfo?.topMessageId;\n }\n\n void searchTextMessages(chat, threadId, topMessageId, query, offsetId);\n});\n\naddReducer('searchMediaMessagesLocal', (global) => {\n const peerId = selectCurrentMediaSearchPeerId(global);\n const chatOrUser = peerId\n ? global.users.byId[peerId] || global.chats.byId[peerId]\n : undefined;\n const currentSearch = selectCurrentMediaSearch(global);\n\n if (!chatOrUser || !currentSearch) {\n return;\n }\n\n const { currentType: type, resultsByType } = currentSearch;\n const currentResults = type && resultsByType && resultsByType[type];\n const offsetId = currentResults?.nextOffsetId;\n\n if (!type) {\n return;\n }\n\n void searchSharedMedia(chatOrUser, type, offsetId);\n});\n\naddReducer('searchMessagesByDate', (global, actions, payload) => {\n const { timestamp } = payload!;\n\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void searchMessagesByDate(chat, timestamp);\n});\n\nasync function searchTextMessages(\n chatOrUser: ApiChat,\n threadId: number,\n topMessageId?: number,\n query?: string,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type: 'text',\n query,\n topMessageId,\n limit: MESSAGE_SEARCH_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentTextSearch(global);\n if (!currentSearch || (query && query !== currentSearch.query)) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalTextSearchResults(global, chatOrUser.id, threadId, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\nasync function searchSharedMedia(\n chatOrUser: ApiChat | ApiUser,\n type: SharedMediaType,\n offsetId?: number,\n) {\n const result = await callApi('searchMessagesLocal', {\n chatOrUser,\n type,\n limit: SHARED_MEDIA_SLICE,\n offsetId,\n });\n\n if (!result) {\n return;\n }\n\n const {\n messages, users, totalCount, nextOffsetId,\n } = result;\n\n const byId = buildCollectionByKey(messages, 'id');\n const newFoundIds = Object.keys(byId).map(Number);\n\n let global = getGlobal();\n\n const currentSearch = selectCurrentMediaSearch(global);\n if (!currentSearch) {\n return;\n }\n\n global = addChatMessagesById(global, chatOrUser.id, byId);\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateLocalMediaSearchResults(global, chatOrUser.id, type, newFoundIds, totalCount, nextOffsetId);\n setGlobal(global);\n}\n\n/**\n * @param timestamp start of target date in seconds\n */\nasync function searchMessagesByDate(chat: ApiChat, timestamp: number) {\n const messageId = await callApi('findFirstMessageIdAfterDate', {\n chat,\n timestamp,\n });\n\n if (!messageId) {\n return;\n }\n\n getDispatch().focusMessage({\n chatId: chat.id,\n messageId,\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementProgress } from '../../../types';\nimport { callApi } from '../../../api/gramjs';\nimport { updateManagement, updateManagementProgress } from '../../reducers';\nimport { selectChat, selectCurrentMessageList } from '../../selectors';\nimport { isChatBasicGroup } from '../../helpers';\n\naddReducer('checkPublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return;\n }\n\n // No need to check the username if already in progress\n if (global.management.progress === ManagementProgress.InProgress) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n\n const isUsernameAvailable = await callApi('checkChatUsername', { username })!;\n\n global = getGlobal();\n global = updateManagementProgress(\n global, isUsernameAvailable ? ManagementProgress.Complete : ManagementProgress.Error,\n );\n global = updateManagement(global, chatId, { isUsernameAvailable });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePublicLink', (global, actions, payload) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n let chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n const { username } = payload!;\n\n (async () => {\n global = updateManagementProgress(global, ManagementProgress.InProgress);\n setGlobal(global);\n\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n const result = await callApi('setChatUsername', { chat, username });\n\n global = getGlobal();\n global = updateManagementProgress(global, result ? ManagementProgress.Complete : ManagementProgress.Error);\n global = updateManagement(global, chatId, { isUsernameAvailable: undefined });\n setGlobal(global);\n })();\n});\n\naddReducer('updatePrivateLink', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId && selectChat(global, chatId);\n if (!chatId || !chat) {\n return;\n }\n\n callApi('updatePrivateLink', { chat });\n});\n\naddReducer('setEditingExportedInvite', (global, actions, payload) => {\n const { chatId, invite } = payload;\n\n setGlobal(updateManagement(global, chatId, { editingInvite: invite }));\n});\n","import {\n addReducer, getGlobal, setGlobal, getDispatch,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiFormattedText, ApiMessage, ApiUser, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport {\n CHAT_LIST_LOAD_SLICE, DEBUG, MESSAGE_LIST_SLICE, SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n replaceChatListIds,\n replaceChats,\n replaceUsers,\n replaceUserStatuses,\n updateUsers,\n addUserStatuses,\n updateChats,\n updateChatListSecondaryInfo,\n updateThreadInfos,\n replaceThreadParam,\n updateListedIds,\n safeReplaceViewportIds,\n addChatMessagesById,\n} from '../../reducers';\nimport {\n selectUser,\n selectChat,\n selectCurrentMessageList,\n selectDraft,\n selectChatMessage,\n selectThreadInfo,\n selectCountNotMutedUnread,\n selectLastServiceNotification,\n} from '../../selectors';\nimport { isUserId } from '../../helpers';\n\naddReducer('sync', (global, actions) => {\n void sync(actions.afterSync);\n});\n\naddReducer('afterSync', () => {\n void afterSync();\n});\n\nasync function sync(afterSyncCallback: () => void) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START SYNC');\n }\n\n await callApi('fetchCurrentUser');\n\n // This fetches only active chats and clears archived chats, which will be fetched in `afterSync`\n const savedUsers = await loadAndReplaceChats();\n await loadAndReplaceMessages(savedUsers);\n\n setGlobal({\n ...getGlobal(),\n lastSyncTime: Date.now(),\n });\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH SYNC');\n }\n\n afterSyncCallback();\n}\n\nasync function afterSync() {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START AFTER-SYNC');\n }\n\n await Promise.all([\n loadAndUpdateUsers(),\n loadAndReplaceArchivedChats(),\n ]);\n\n await callApi('fetchCurrentUser');\n\n updateAppBadge(selectCountNotMutedUnread(getGlobal()));\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH AFTER-SYNC');\n }\n}\n\nasync function loadAndReplaceChats() {\n let global = getGlobal();\n\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n withPinned: true,\n serverTimeOffset: global.serverTimeOffset,\n lastLocalServiceMessage: selectLastServiceNotification(global)?.message,\n });\n\n if (!result) {\n return undefined;\n }\n\n global = getGlobal();\n\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n const { currentUserId } = global;\n\n const savedPrivateChatIds = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ...(currentUserId ? [currentUserId] : []),\n ];\n\n const savedUsers = savedPrivateChatIds\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n const savedChats = savedPrivateChatIds\n .map((id) => selectChat(global, id))\n .filter(Boolean as any);\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n if (currentChatId) {\n const selectedChat = selectChat(global, currentChatId);\n if (selectedChat && !savedPrivateChatIds.includes(currentChatId)) {\n savedChats.push(selectedChat);\n }\n\n if (isUserId(currentChatId)) {\n const selectedChatUser = selectUser(global, currentChatId);\n if (selectedChatUser && !savedPrivateChatIds.includes(currentChatId)) {\n savedUsers.push(selectedChatUser);\n }\n }\n }\n\n savedUsers.push(...result.users);\n savedChats.push(...result.chats);\n\n global = replaceUserStatuses(global, result.userStatusesById);\n\n global = replaceChats(global, buildCollectionByKey(savedChats, 'id'));\n global = replaceChatListIds(global, 'active', result.chatIds);\n global = updateChatListSecondaryInfo(global, 'active', result);\n\n Object.keys(result.draftsById).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId]);\n });\n\n Object.keys(result.replyingToById).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n setGlobal(global);\n\n if (currentChatId && !global.chats.byId[currentChatId]) {\n getDispatch().openChat({ id: undefined });\n }\n\n return savedUsers;\n}\n\nasync function loadAndReplaceArchivedChats() {\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n archived: true,\n withPinned: true,\n serverTimeOffset: getGlobal().serverTimeOffset,\n });\n\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n\n global = updateUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addUserStatuses(global, result.userStatusesById);\n\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = replaceChatListIds(global, 'archived', result.chatIds);\n global = updateChatListSecondaryInfo(global, 'archived', result);\n\n setGlobal(global);\n}\n\nasync function loadAndReplaceMessages(savedUsers?: ApiUser[]) {\n let areMessagesLoaded = false;\n let users = savedUsers || [];\n\n let global = getGlobal();\n const { chatId: currentChatId, threadId: currentThreadId } = selectCurrentMessageList(global) || {};\n\n // Memoize drafts\n const draftChatIds = Object.keys(global.messages.byChatId);\n const draftsByChatId = draftChatIds.reduce>((acc, chatId) => {\n const draft = selectDraft(global, chatId, MAIN_THREAD_ID);\n if (draft) {\n acc[chatId] = draft;\n }\n\n return acc;\n }, {});\n\n if (currentChatId) {\n const result = await loadTopMessages(global.chats.byId[currentChatId]);\n global = getGlobal();\n const { chatId: newCurrentChatId } = selectCurrentMessageList(global) || {};\n const threadInfo = currentThreadId && selectThreadInfo(global, currentChatId, currentThreadId);\n\n if (result && newCurrentChatId === currentChatId) {\n const currentMessageListInfo = global.messages.byChatId[currentChatId];\n const localMessages = currentChatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.map(({ message }) => message)\n : [];\n const allMessages = ([] as ApiMessage[]).concat(result.messages, localMessages);\n const byId = buildCollectionByKey(allMessages, 'id');\n const listedIds = Object.keys(byId).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n\n global = addChatMessagesById(global, currentChatId, byId);\n global = updateListedIds(global, currentChatId, MAIN_THREAD_ID, listedIds);\n global = safeReplaceViewportIds(global, currentChatId, MAIN_THREAD_ID, listedIds);\n\n if (currentThreadId && threadInfo && threadInfo.originChannelId) {\n const { originChannelId } = threadInfo;\n const currentMessageListInfoOrigin = global.messages.byChatId[originChannelId];\n const resultOrigin = await loadTopMessages(global.chats.byId[originChannelId]);\n if (resultOrigin) {\n const byIdOrigin = buildCollectionByKey(resultOrigin.messages, 'id');\n const listedIdsOrigin = Object.keys(byIdOrigin).map(Number);\n\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [threadInfo.originChannelId]: {\n byId: byIdOrigin,\n threadsById: {\n [MAIN_THREAD_ID]: {\n ...(currentMessageListInfoOrigin?.threadsById[MAIN_THREAD_ID]),\n listedIds: listedIdsOrigin,\n viewportIds: listedIdsOrigin,\n outlyingIds: undefined,\n },\n },\n },\n [currentChatId]: {\n ...global.messages.byChatId[currentChatId],\n threadsById: {\n ...global.messages.byChatId[currentChatId].threadsById,\n [currentThreadId]: {\n ...(currentMessageListInfo?.threadsById[currentThreadId]),\n outlyingIds: undefined,\n },\n },\n },\n },\n },\n };\n }\n }\n\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateThreadInfos(global, currentChatId, result.threadInfos);\n\n areMessagesLoaded = true;\n users = Array.prototype.concat(users, result.users);\n }\n }\n\n if (!areMessagesLoaded) {\n global = {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {},\n },\n };\n }\n\n // Restore drafts\n Object.keys(draftsByChatId).forEach((chatId) => {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', draftsByChatId[chatId]);\n });\n\n if (savedUsers) {\n global = replaceUsers(global, buildCollectionByKey(users, 'id'));\n } else if (users) {\n // If `fetchChats` has failed for some reason, we don't have saved chats, thus we can not replace\n global = updateUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n setGlobal(global);\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n if (audioChatId && audioMessageId && !selectChatMessage(global, audioChatId, audioMessageId)) {\n getDispatch().closeAudioPlayer();\n }\n}\n\nasync function loadAndUpdateUsers() {\n let global = getGlobal();\n const { recentlyFoundChatIds } = global.globalSearch;\n const { userIds: contactIds } = global.contactList || {};\n if (\n (!contactIds || !contactIds.length)\n && (!recentlyFoundChatIds || !recentlyFoundChatIds.length)\n ) {\n return;\n }\n\n const users = [\n ...(recentlyFoundChatIds || []),\n ...(contactIds || []),\n ].map((id) => selectUser(global, id)).filter(Boolean as any);\n\n const result = await callApi('fetchUsers', { users });\n if (!result) {\n return;\n }\n\n const { users: updatedUsers, userStatusesById } = result;\n\n global = getGlobal();\n global = updateUsers(global, buildCollectionByKey(updatedUsers, 'id'));\n global = addUserStatuses(global, userStatusesById);\n setGlobal(global);\n}\n\nfunction loadTopMessages(chat: ApiChat) {\n return callApi('fetchMessages', {\n chat,\n threadId: MAIN_THREAD_ID,\n offsetId: chat.lastReadInboxMessageId,\n addOffset: -(Math.round(MESSAGE_LIST_SLICE / 2) + 1),\n limit: MESSAGE_LIST_SLICE,\n });\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { debounce, throttle } from '../../../util/schedulers';\nimport { buildCollectionByKey, pick, unique } from '../../../util/iteratees';\nimport { isUserBot, isUserId } from '../../helpers';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat, selectCurrentMessageList, selectUser } from '../../selectors';\nimport {\n addChats, addUsers, replaceUserStatuses, updateChat, updateManagementProgress, updateUser, updateUsers,\n updateUserSearch, updateUserSearchFetchingStatus,\n} from '../../reducers';\nimport { getServerTime } from '../../../util/serverTime';\n\nconst runDebouncedForFetchFullUser = debounce((cb) => cb(), 500, false, true);\nconst TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min\nconst runThrottledForSearch = throttle((cb) => cb(), 500, false);\n\naddReducer('loadFullUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n runDebouncedForFetchFullUser(() => callApi('fetchFullUser', { id, accessHash }));\n});\n\naddReducer('loadUser', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchUsers', { users: [user] });\n if (!result) {\n return;\n }\n\n const { users, userStatusesById } = result;\n\n global = getGlobal();\n\n global = updateUsers(global, buildCollectionByKey(users, 'id'));\n setGlobal(replaceUserStatuses(global, {\n ...global.users.statusesById,\n ...userStatusesById,\n }));\n\n setGlobal(global);\n })();\n});\n\naddReducer('loadTopUsers', (global) => {\n const { topPeers: { lastRequestedAt } } = global;\n\n if (!lastRequestedAt || getServerTime(global.serverTimeOffset) - lastRequestedAt > TOP_PEERS_REQUEST_COOLDOWN) {\n void loadTopUsers();\n }\n});\n\naddReducer('loadContactList', () => {\n void loadContactList();\n});\n\naddReducer('loadCurrentUser', () => {\n void callApi('fetchCurrentUser');\n});\n\naddReducer('loadCommonChats', (global) => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const user = chatId ? selectUser(global, chatId) : undefined;\n if (!user || isUserBot(user) || user.commonChats?.isFullyLoaded) {\n return;\n }\n\n (async () => {\n const maxId = user.commonChats?.maxId;\n const result = await callApi('fetchCommonChats', user.id, user.accessHash!, maxId);\n if (!result) {\n return;\n }\n\n const { chats, chatIds, isFullyLoaded } = result;\n\n global = getGlobal();\n if (chats.length) {\n global = addChats(global, buildCollectionByKey(chats, 'id'));\n }\n global = updateUser(global, user.id, {\n commonChats: {\n maxId: chatIds.length ? chatIds[chatIds.length - 1] : '0',\n ids: unique((user.commonChats?.ids || []).concat(chatIds)),\n isFullyLoaded,\n },\n });\n setGlobal(global);\n })();\n});\n\naddReducer('updateContact', (global, actions, payload) => {\n const {\n userId, isMuted, firstName, lastName,\n } = payload!;\n\n void updateContact(userId, isMuted, firstName, lastName);\n});\n\naddReducer('deleteContact', (global, actions, payload) => {\n const { userId } = payload!;\n\n void deleteContact(userId);\n});\n\nasync function loadTopUsers() {\n const result = await callApi('fetchTopUsers');\n if (!result) {\n return;\n }\n\n const { ids, users } = result;\n\n let global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = {\n ...global,\n topPeers: {\n ...global.topPeers,\n userIds: ids,\n lastRequestedAt: getServerTime(global.serverTimeOffset),\n },\n };\n setGlobal(global);\n}\n\nasync function loadContactList() {\n const contactList = await callApi('fetchContactList');\n if (!contactList) {\n return;\n }\n\n let global = addUsers(getGlobal(), buildCollectionByKey(contactList.users, 'id'));\n global = addChats(global, buildCollectionByKey(contactList.chats, 'id'));\n\n // Sort contact list by Last Name (or First Name), with latin names being placed first\n const getCompareString = (user: ApiUser) => (user.lastName || user.firstName || '');\n const collator = new Intl.Collator('en-US');\n\n const sortedUsers = contactList.users.sort((a, b) => (\n collator.compare(getCompareString(a), getCompareString(b))\n )).filter((user) => !user.isSelf);\n\n setGlobal({\n ...global,\n contactList: {\n userIds: sortedUsers.map((user) => user.id),\n },\n });\n}\n\nasync function updateContact(\n userId: string,\n isMuted: boolean,\n firstName: string,\n lastName?: string,\n) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n getDispatch().updateChatMutedState({ chatId: userId, isMuted });\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n let result;\n if (user.phoneNumber) {\n result = await callApi('updateContact', { phone: user.phoneNumber, firstName, lastName });\n } else {\n const { id, accessHash } = user;\n result = await callApi('addContact', {\n id,\n accessHash,\n phoneNumber: '',\n firstName,\n lastName,\n });\n }\n\n if (result) {\n setGlobal(updateUser(\n getGlobal(),\n user.id,\n {\n firstName,\n lastName,\n },\n ));\n }\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n}\n\nasync function deleteContact(userId: string) {\n const global = getGlobal();\n const user = selectUser(global, userId);\n\n if (!user) {\n return;\n }\n\n const { id, accessHash } = user;\n\n await callApi('deleteContact', { id, accessHash });\n}\n\naddReducer('loadProfilePhotos', (global, actions, payload) => {\n const { profileId } = payload!;\n const isPrivate = isUserId(profileId);\n const user = isPrivate ? selectUser(global, profileId) : undefined;\n const chat = !isPrivate ? selectChat(global, profileId) : undefined;\n\n if (!user && !chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchProfilePhotos', user, chat);\n if (!result || !result.photos) {\n return;\n }\n\n let newGlobal = getGlobal();\n if (isPrivate) {\n newGlobal = updateUser(newGlobal, profileId, { photos: result.photos });\n } else {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users!, 'id'));\n newGlobal = updateChat(newGlobal, profileId, { photos: result.photos });\n }\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('setUserSearchQuery', (global, actions, payload) => {\n const { query } = payload!;\n\n if (!query) return;\n\n void runThrottledForSearch(() => {\n searchUsers(query);\n });\n});\n\naddReducer('addContact', (global, actions, payload) => {\n const { userId } = payload!;\n const user = selectUser(global, userId);\n if (!user) {\n return;\n }\n\n void callApi('addContact', pick(user, ['id', 'accessHash', 'firstName', 'lastName', 'phoneNumber']));\n});\n\nasync function searchUsers(query: string) {\n const result = await callApi('searchChats', { query });\n\n let global = getGlobal();\n const currentSearchQuery = global.userSearch.query;\n\n if (!result || !currentSearchQuery || (query !== currentSearchQuery)) {\n setGlobal(updateUserSearchFetchingStatus(global, false));\n return;\n }\n\n const { localUsers, globalUsers } = result;\n\n let localUserIds;\n let globalUserIds;\n if (localUsers.length) {\n global = addUsers(global, buildCollectionByKey(localUsers, 'id'));\n localUserIds = localUsers.map(({ id }) => id);\n }\n if (globalUsers.length) {\n global = addUsers(global, buildCollectionByKey(globalUsers, 'id'));\n globalUserIds = globalUsers.map(({ id }) => id);\n }\n\n global = updateUserSearchFetchingStatus(global, false);\n global = updateUserSearch(global, { localUserIds, globalUserIds });\n\n setGlobal(global);\n}\n","import { GlobalState } from '../../global/types';\nimport { InlineBotSettings } from '../../types';\n\nexport function replaceInlineBotSettings(\n global: GlobalState, username: string, inlineBotSettings: InlineBotSettings | false,\n): GlobalState {\n return {\n ...global,\n inlineBots: {\n ...global.inlineBots,\n byUsername: {\n ...global.inlineBots.byUsername,\n [username]: inlineBotSettings,\n },\n },\n };\n}\n\nexport function replaceInlineBotsIsLoading(global: GlobalState, isLoading: boolean): GlobalState {\n return {\n ...global,\n inlineBots: {\n ...global.inlineBots,\n isLoading,\n },\n };\n}\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiContact, ApiUser } from '../../../api/types';\nimport { InlineBotSettings } from '../../../types';\n\nimport {\n RE_TG_LINK, RE_TME_LINK,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n selectChat, selectChatBot, selectChatMessage, selectCurrentChat, selectCurrentMessageList,\n selectReplyingToId, selectSendAs, selectUser,\n} from '../../selectors';\nimport { addChats, addUsers, removeBlockedContact } from '../../reducers';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { debounce } from '../../../util/schedulers';\nimport { replaceInlineBotSettings, replaceInlineBotsIsLoading } from '../../reducers/bots';\nimport { getServerTime } from '../../../util/serverTime';\n\nconst TOP_PEERS_REQUEST_COOLDOWN = 60; // 1 min\nconst runDebouncedForSearch = debounce((cb) => cb(), 500, false);\n\naddReducer('clickInlineButton', (global, actions, payload) => {\n const { button } = payload;\n\n switch (button.type) {\n case 'command':\n actions.sendBotCommand({ command: button.value });\n break;\n case 'url':\n if (button.value.match(RE_TME_LINK) || button.value.match(RE_TG_LINK)) {\n actions.openTelegramLink({ url: button.value });\n } else {\n actions.toggleSafeLinkModal({ url: button.value });\n }\n break;\n case 'callback': {\n const chat = selectCurrentChat(global);\n if (!chat) {\n return;\n }\n\n void answerCallbackButton(chat, button.messageId, button.value);\n break;\n }\n case 'requestPoll':\n actions.openPollModal();\n break;\n case 'requestSelfContact': {\n const user = global.currentUserId ? selectUser(global, global.currentUserId) : undefined;\n if (!user) {\n return;\n }\n actions.showDialog({\n data: {\n phoneNumber: user.phoneNumber,\n firstName: user.firstName,\n lastName: user.lastName,\n userId: user.id,\n } as ApiContact,\n });\n break;\n }\n case 'buy': {\n const chat = selectCurrentChat(global);\n const { messageId, value } = button;\n if (!chat) {\n return;\n }\n\n if (value) {\n actions.getReceipt({ receiptMessageId: value, chatId: chat.id, messageId });\n } else {\n actions.getPaymentForm({ chat, messageId });\n actions.setInvoiceMessageInfo(selectChatMessage(global, chat.id, messageId));\n actions.openPaymentModal({ chatId: chat.id, messageId });\n }\n break;\n }\n }\n});\n\naddReducer('sendBotCommand', (global, actions, payload) => {\n const { command, chatId } = payload;\n const { currentUserId } = global;\n const chat = chatId ? selectChat(global, chatId) : selectCurrentChat(global);\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentUserId || !chat || !currentMessageList) {\n return;\n }\n\n const { threadId } = currentMessageList;\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId: chat.id, threadId, value: false });\n\n void sendBotCommand(\n chat, currentUserId, command, selectReplyingToId(global, chat.id, threadId), selectSendAs(global, chatId),\n );\n});\n\naddReducer('restartBot', (global, actions, payload) => {\n const { chatId } = payload;\n const { currentUserId } = global;\n const chat = selectCurrentChat(global);\n const bot = currentUserId && selectChatBot(global, chatId);\n if (!currentUserId || !chat || !bot) {\n return;\n }\n\n (async () => {\n const result = await callApi('unblockContact', bot.id, bot.accessHash);\n if (!result) {\n return;\n }\n\n setGlobal(removeBlockedContact(getGlobal(), bot.id));\n void sendBotCommand(chat, currentUserId, '/start', undefined, selectSendAs(global, chatId));\n })();\n});\n\naddReducer('loadTopInlineBots', (global) => {\n const { lastRequestedAt } = global.topInlineBots;\n\n if (lastRequestedAt && getServerTime(global.serverTimeOffset) - lastRequestedAt < TOP_PEERS_REQUEST_COOLDOWN) {\n return;\n }\n\n (async () => {\n const result = await callApi('fetchTopInlineBots');\n if (!result) {\n return;\n }\n\n const { ids, users } = result;\n\n let newGlobal = getGlobal();\n newGlobal = addUsers(newGlobal, buildCollectionByKey(users, 'id'));\n newGlobal = {\n ...newGlobal,\n topInlineBots: {\n ...newGlobal.topInlineBots,\n userIds: ids,\n lastRequestedAt: getServerTime(global.serverTimeOffset),\n },\n };\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('queryInlineBot', ((global, actions, payload) => {\n const {\n chatId, username, query, offset,\n } = payload;\n\n (async () => {\n let inlineBotData = global.inlineBots.byUsername[username];\n\n if (inlineBotData === false) {\n return;\n }\n\n if (inlineBotData === undefined) {\n const { user: inlineBot, chat } = await callApi('fetchInlineBot', { username }) || {};\n global = getGlobal();\n if (!inlineBot || !chat) {\n setGlobal(replaceInlineBotSettings(global, username, false));\n return;\n }\n\n global = addUsers(global, { [inlineBot.id]: inlineBot });\n global = addChats(global, { [chat.id]: chat });\n inlineBotData = {\n id: inlineBot.id,\n query: '',\n offset: '',\n switchPm: undefined,\n canLoadMore: true,\n results: [],\n };\n\n global = replaceInlineBotSettings(global, username, inlineBotData);\n setGlobal(global);\n }\n\n if (query === inlineBotData.query && !inlineBotData.canLoadMore) {\n return;\n }\n\n void runDebouncedForSearch(() => {\n searchInlineBot({\n username,\n inlineBotData: inlineBotData as InlineBotSettings,\n chatId,\n query,\n offset,\n });\n });\n })();\n}));\n\naddReducer('sendInlineBotResult', (global, actions, payload) => {\n const { id, queryId } = payload;\n const currentMessageList = selectCurrentMessageList(global);\n\n if (!currentMessageList || !id) {\n return;\n }\n\n const { chatId, threadId } = currentMessageList;\n\n const chat = selectChat(global, chatId)!;\n\n actions.setReplyingToId({ messageId: undefined });\n actions.clearWebPagePreview({ chatId, threadId, value: false });\n\n void callApi('sendInlineBotResult', {\n chat,\n resultId: id,\n queryId,\n replyingTo: selectReplyingToId(global, chatId, threadId),\n sendAs: selectSendAs(global, chatId),\n });\n});\n\naddReducer('resetInlineBot', (global, actions, payload) => {\n const { username } = payload;\n\n let inlineBotData = global.inlineBots.byUsername[username];\n\n if (!inlineBotData) {\n return;\n }\n\n inlineBotData = {\n id: inlineBotData.id,\n query: '',\n offset: '',\n switchPm: undefined,\n canLoadMore: true,\n results: [],\n };\n\n setGlobal(replaceInlineBotSettings(global, username, inlineBotData));\n});\n\naddReducer('startBot', (global, actions, payload) => {\n const { botId, param } = payload;\n\n const bot = selectUser(global, botId);\n if (!bot) {\n return;\n }\n\n (async () => {\n await callApi('startBot', {\n bot,\n startParam: param,\n });\n })();\n});\n\nasync function searchInlineBot({\n username,\n inlineBotData,\n chatId,\n query,\n offset,\n}: {\n username: string;\n inlineBotData: InlineBotSettings;\n chatId: string;\n query: string;\n offset?: string;\n}) {\n let global = getGlobal();\n const bot = selectUser(global, inlineBotData.id);\n const chat = selectChat(global, chatId);\n if (!bot || !chat) {\n return;\n }\n\n const shouldReplaceSettings = inlineBotData.query !== query;\n global = replaceInlineBotsIsLoading(global, true);\n global = replaceInlineBotSettings(global, username, {\n ...inlineBotData,\n query,\n ...(shouldReplaceSettings && { offset: undefined, results: [] }),\n });\n setGlobal(global);\n\n const result = await callApi('fetchInlineBotResults', {\n bot,\n chat,\n query,\n offset: shouldReplaceSettings ? undefined : offset,\n });\n\n const newInlineBotData = global.inlineBots.byUsername[username];\n global = replaceInlineBotsIsLoading(getGlobal(), false);\n if (!result || !newInlineBotData || query !== newInlineBotData.query) {\n setGlobal(global);\n return;\n }\n\n const currentIds = new Set((newInlineBotData.results || []).map((data) => data.id));\n const newResults = result.results.filter((data) => !currentIds.has(data.id));\n\n global = replaceInlineBotSettings(global, username, {\n ...newInlineBotData,\n help: result.help,\n ...(newResults.length && { isGallery: result.isGallery }),\n ...(result.switchPm && { switchPm: result.switchPm }),\n canLoadMore: result.results.length > 0 && Boolean(result.nextOffset),\n results: newInlineBotData.offset === '' || newInlineBotData.offset === result.nextOffset\n ? result.results\n : (newInlineBotData.results || []).concat(newResults),\n offset: newResults.length ? result.nextOffset : '',\n });\n\n setGlobal(global);\n}\n\nasync function sendBotCommand(\n chat: ApiChat, currentUserId: string, command: string, replyingTo?: number, sendAs?: ApiChat | ApiUser,\n) {\n await callApi('sendMessage', {\n chat,\n text: command,\n replyingTo,\n sendAs,\n });\n}\n\nasync function answerCallbackButton(chat: ApiChat, messageId: number, data: string) {\n const result = await callApi('answerCallbackButton', {\n chatId: chat.id,\n accessHash: chat.accessHash,\n messageId,\n data,\n });\n\n if (!result) {\n return;\n }\n\n const { showDialog, showNotification, toggleSafeLinkModal } = getDispatch();\n const { message, alert: isError, url } = result;\n\n if (isError) {\n showDialog({ data: { message: message || 'Error' } });\n } else if (message) {\n showNotification({ message });\n } else if (url) {\n toggleSafeLinkModal({ url });\n }\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { callApi } from '../../../api/gramjs';\nimport { replaceSettings, updateTwoFaSettings } from '../../reducers';\n\naddReducer('loadPasswordInfo', () => {\n (async () => {\n const result = await callApi('getPasswordInfo');\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n global = replaceSettings(global, { hasPassword: result.hasPassword });\n global = updateTwoFaSettings(global, { hint: result.hint });\n setGlobal(global);\n })();\n});\n\naddReducer('checkPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('checkPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('clearPassword', (global, actions, payload) => {\n const { currentPassword, onSuccess } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('clearPassword', currentPassword);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updatePassword', (global, actions, payload) => {\n const {\n currentPassword, password, hint, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updatePassword', currentPassword, password, hint, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('updateRecoveryEmail', (global, actions, payload) => {\n const {\n currentPassword, email, onSuccess,\n } = payload;\n\n setGlobal(updateTwoFaSettings(global, { isLoading: true, error: undefined }));\n\n (async () => {\n const isSuccess = await callApi('updateRecoveryEmail', currentPassword, email);\n\n setGlobal(updateTwoFaSettings(getGlobal(), { isLoading: false, waitingEmailCodeLength: undefined }));\n\n if (isSuccess) {\n onSuccess();\n }\n })();\n});\n\naddReducer('provideTwoFaEmailCode', (global, actions, payload) => {\n const { code } = payload;\n\n void callApi('provideRecoveryEmailCode', code);\n});\n\naddReducer('clearTwoFaError', (global) => {\n return updateTwoFaSettings(global, { error: undefined });\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { PaymentStep } from '../../../types';\nimport { ApiChat } from '../../../api/types';\n\nimport {\n selectPaymentMessageId,\n selectPaymentRequestId,\n selectProviderPublishableKey,\n selectStripeCredentials,\n selectChatMessage,\n selectPaymentChatId,\n selectChat,\n selectPaymentFormId,\n} from '../../selectors';\nimport { callApi } from '../../../api/gramjs';\nimport { getStripeError } from '../../helpers';\nimport { buildQueryString } from '../../../util/requestQuery';\n\nimport {\n updateShippingOptions,\n setPaymentStep,\n setRequestInfoId,\n setPaymentForm,\n setStripeCardInfo,\n setInvoiceMessageInfo,\n setReceipt,\n clearPayment,\n closeInvoice,\n} from '../../reducers';\n\naddReducer('validateRequestedInfo', (global, actions, payload) => {\n const { requestInfo, saveInfo } = payload;\n const chatId = selectPaymentChatId(global);\n const chat = chatId && selectChat(global, chatId);\n const messageId = selectPaymentMessageId(global);\n if (!chat || !messageId) {\n return;\n }\n void validateRequestedInfo(chat, messageId, requestInfo, saveInfo);\n});\n\nasync function validateRequestedInfo(chat: ApiChat, messageId: number, requestInfo: any, shouldSave?: true) {\n const result = await callApi('validateRequestedInfo', {\n chat, messageId, requestInfo, shouldSave,\n });\n if (!result) {\n return;\n }\n\n const { id, shippingOptions } = result;\n if (!id) {\n return;\n }\n\n let global = setRequestInfoId(getGlobal(), id);\n if (shippingOptions) {\n global = updateShippingOptions(global, shippingOptions);\n global = setPaymentStep(global, PaymentStep.Shipping);\n } else {\n global = setPaymentStep(global, PaymentStep.PaymentInfo);\n }\n setGlobal(global);\n}\n\naddReducer('getPaymentForm', (global, actions, payload) => {\n const { chat, messageId } = payload;\n if (!chat || !messageId) {\n return;\n }\n void getPaymentForm(chat, messageId);\n});\n\nasync function getPaymentForm(chat: ApiChat, messageId: number) {\n const result = await callApi('getPaymentForm', { chat, messageId });\n if (!result) {\n return;\n }\n let global = setPaymentForm(getGlobal(), result);\n let step = PaymentStep.PaymentInfo;\n if (global.payment.invoice\n && (global.payment.invoice.shippingAddressRequested\n || global.payment.invoice.nameRequested\n || global.payment.invoice.phoneRequested\n || global.payment.invoice.emailRequested)) {\n step = PaymentStep.ShippingInfo;\n }\n global = setPaymentStep(global, step);\n setGlobal(global);\n}\n\naddReducer('getReceipt', (global, actions, payload) => {\n const { receiptMessageId, chatId, messageId } = payload;\n const chat = chatId && selectChat(global, chatId);\n if (!messageId || !receiptMessageId || !chat) {\n return;\n }\n\n void getReceipt(chat, messageId, receiptMessageId);\n});\n\nasync function getReceipt(chat: ApiChat, messageId: number, receiptMessageId: number) {\n const result = await callApi('getReceipt', chat, receiptMessageId);\n if (!result) {\n return;\n }\n\n let global = getGlobal();\n const message = selectChatMessage(global, chat.id, messageId);\n global = setReceipt(global, result, message);\n setGlobal(global);\n}\n\naddReducer('clearPaymentError', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: undefined,\n },\n });\n});\n\naddReducer('clearReceipt', (global) => {\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n });\n});\n\naddReducer('sendCredentialsInfo', (global, actions, payload) => {\n const publishableKey = selectProviderPublishableKey(global);\n if (!publishableKey) {\n return;\n }\n const { credentials } = payload;\n const { data } = credentials;\n void sendStripeCredentials(data, publishableKey);\n});\n\naddReducer('sendPaymentForm', (global, actions, payload) => {\n const { shippingOptionId, saveCredentials } = payload;\n const chatId = selectPaymentChatId(global);\n const chat = chatId && selectChat(global, chatId);\n const messageId = selectPaymentMessageId(global);\n const formId = selectPaymentFormId(global);\n const requestInfoId = selectPaymentRequestId(global);\n const publishableKey = selectProviderPublishableKey(global);\n const stripeCredentials = selectStripeCredentials(global);\n if (!chat || !messageId || !publishableKey || !formId) {\n return;\n }\n\n void sendPaymentForm(chat, messageId, formId, {\n save: saveCredentials,\n data: stripeCredentials,\n }, requestInfoId, shippingOptionId);\n});\n\nasync function sendStripeCredentials(\n data: {\n cardNumber: string;\n cardholder?: string;\n expiryMonth: string;\n expiryYear: string;\n cvv: string;\n country: string;\n zip: string;\n },\n publishableKey: string,\n) {\n const query = buildQueryString({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvv,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n });\n\n const response = await fetch(`https://api.stripe.com/v1/tokens${query}`, {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: `Bearer ${publishableKey}`,\n },\n });\n const result = await response.json();\n if (result.error) {\n const error = getStripeError(result.error);\n const global = getGlobal();\n setGlobal({\n ...global,\n payment: {\n ...global.payment,\n error: {\n ...error,\n },\n },\n });\n return;\n }\n let global = setStripeCardInfo(getGlobal(), {\n type: result.type,\n id: result.id,\n });\n global = setPaymentStep(global, PaymentStep.Checkout);\n setGlobal(global);\n}\n\nasync function sendPaymentForm(\n chat: ApiChat,\n messageId: number,\n formId: string,\n credentials: any,\n requestedInfoId?: string,\n shippingOptionId?: string,\n) {\n const result = await callApi('sendPaymentForm', {\n chat, messageId, formId, credentials, requestedInfoId, shippingOptionId,\n });\n if (result) {\n const global = clearPayment(getGlobal());\n setGlobal(closeInvoice(global));\n }\n}\n\naddReducer('setPaymentStep', (global, actions, payload = {}) => {\n return setPaymentStep(global, payload.step || PaymentStep.ShippingInfo);\n});\n\naddReducer('setInvoiceMessageInfo', (global, actions, payload) => {\n return setInvoiceMessageInfo(global, payload);\n});\n","export function buildQueryString(data: Record) {\n const query = Object.keys(data).map((k) => `${k}=${data[k]}`).join('&');\n return query.length > 0 ? `?${query}` : '';\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../../../config';\n\nconst REM = 16; // px\nconst MAX_TOOLBAR_WIDTH = 32 * REM;\nconst MAX_MESSAGES_LIST_WIDTH = 45.5 * REM;\nexport const SIDE_COLUMN_MAX_WIDTH = 26.5 * REM;\nexport const MIN_LEFT_COLUMN_WIDTH = 18 * REM;\nconst UNPIN_BUTTON_WIDTH = 16.125 * REM;\n\nexport default function calculateMiddleFooterTransforms(windowWidth: number, canPost?: boolean) {\n const sidePadding = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? REM\n : 2 * REM;\n const messageListWidth = getMessageListWidth(windowWidth);\n const sendButtonWidth = windowWidth <= MOBILE_SCREEN_MAX_WIDTH\n ? 3.375 * REM\n : 4 * REM;\n\n const composerWidth = canPost\n ? messageListWidth - sidePadding - sendButtonWidth\n : messageListWidth - sidePadding;\n const toolbarWidth = windowWidth > MOBILE_SCREEN_MAX_WIDTH\n ? Math.min(messageListWidth - sidePadding, MAX_TOOLBAR_WIDTH)\n : messageListWidth - sidePadding;\n\n const composerHiddenScale = toolbarWidth / composerWidth;\n const toolbarHiddenScale = composerWidth / toolbarWidth;\n const unpinHiddenScale = toolbarWidth / UNPIN_BUTTON_WIDTH;\n const toolbarForUnpinHiddenScale = UNPIN_BUTTON_WIDTH / toolbarWidth;\n\n const composerTranslateX = canPost\n ? (sendButtonWidth / 2) * toolbarHiddenScale\n : 0;\n\n const toolbarTranslateX = canPost\n ? (sendButtonWidth / 2) * -1 * composerHiddenScale\n : 0;\n\n return {\n composerHiddenScale,\n toolbarHiddenScale,\n composerTranslateX,\n toolbarTranslateX,\n unpinHiddenScale,\n toolbarForUnpinHiddenScale,\n };\n}\n\nfunction getMessageListWidth(windowWidth: number) {\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n const rightColumnWidth = Math.min(\n windowWidth * 0.25,\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth - rightColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) {\n const leftColumnWidth = Math.min(\n Math.max(windowWidth * 0.4, MIN_LEFT_COLUMN_WIDTH),\n SIDE_COLUMN_MAX_WIDTH,\n );\n\n return Math.min(\n windowWidth - leftColumnWidth,\n MAX_MESSAGES_LIST_WIDTH,\n );\n }\n\n if (windowWidth > MAX_MESSAGES_LIST_WIDTH) {\n return MAX_MESSAGES_LIST_WIDTH;\n }\n\n return windowWidth;\n}\n","import { updateChatMessage } from './messages';\nimport { GlobalState } from '../../global/types';\nimport { selectChatMessage } from '../selectors';\nimport { MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN, MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN } from '../../config';\nimport {\n MIN_LEFT_COLUMN_WIDTH,\n SIDE_COLUMN_MAX_WIDTH,\n} from '../../components/middle/helpers/calculateMiddleFooterTransforms';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\n\nfunction getLeftColumnWidth(windowWidth: number) {\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN) {\n return Math.min(\n Math.max(windowWidth * 0.25, MIN_LEFT_COLUMN_WIDTH),\n windowWidth * 0.33,\n );\n }\n\n if (windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN) {\n return Math.min(\n Math.max(windowWidth * 0.33, MIN_LEFT_COLUMN_WIDTH),\n windowWidth * 0.4,\n );\n }\n\n return SIDE_COLUMN_MAX_WIDTH;\n}\n\nexport function subtractXForEmojiInteraction(global: GlobalState, x: number) {\n return x - ((global.isLeftColumnShown && !IS_SINGLE_COLUMN_LAYOUT)\n ? global.leftColumnWidth || getLeftColumnWidth(windowSize.get().width)\n : 0);\n}\n\nexport function addMessageReaction(global: GlobalState, chatId: string, messageId: number, reaction: string) {\n const { reactions } = selectChatMessage(global, chatId, messageId) || {};\n\n if (!reactions) {\n return global;\n }\n\n // Update UI without waiting for server response\n let results = reactions.results.map((l) => (l.reaction === reaction\n ? {\n ...l,\n count: l.isChosen ? l.count : l.count + 1,\n isChosen: true,\n } : (l.isChosen ? {\n ...l,\n isChosen: false,\n count: l.count - 1,\n } : l)))\n .filter((l) => l.count > 0);\n\n let { recentReactions } = reactions;\n\n if (reaction && !results.some((l) => l.reaction === reaction)) {\n const { currentUserId } = global;\n\n results = [...results, {\n reaction,\n isChosen: true,\n count: 1,\n }];\n\n if (reactions.canSeeList) {\n recentReactions = [...(recentReactions || []), {\n userId: currentUserId!,\n reaction,\n }];\n }\n }\n\n return updateChatMessage(global, chatId, messageId, {\n reactions: {\n ...reactions,\n results,\n recentReactions,\n },\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\nimport { callApi } from '../../../api/gramjs';\nimport * as mediaLoader from '../../../util/mediaLoader';\nimport { ApiAppConfig, ApiMediaFormat } from '../../../api/types';\nimport {\n selectChat,\n selectChatMessage,\n selectDefaultReaction,\n selectLocalAnimatedEmojiEffectByName,\n} from '../../selectors';\nimport { addMessageReaction, subtractXForEmojiInteraction } from '../../reducers/reactions';\nimport { addUsers, updateChatMessage } from '../../reducers';\nimport { buildCollectionByKey, omit } from '../../../util/iteratees';\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\n\naddReducer('loadAvailableReactions', () => {\n (async () => {\n const result = await callApi('getAvailableReactions');\n\n if (!result) {\n return;\n }\n\n // Preload animations\n result.forEach((availableReaction) => {\n if (availableReaction.aroundAnimation) {\n mediaLoader.fetch(`sticker${availableReaction.aroundAnimation.id}`, ApiMediaFormat.Lottie);\n }\n if (availableReaction.centerIcon) {\n mediaLoader.fetch(`sticker${availableReaction.centerIcon.id}`, ApiMediaFormat.Lottie);\n }\n });\n\n setGlobal({\n ...getGlobal(),\n availableReactions: result,\n });\n })();\n});\n\naddReducer('interactWithAnimatedEmoji', (global, actions, payload) => {\n const {\n emoji, x, y, localEffect, startSize, isReversed,\n } = payload!;\n\n return {\n ...global,\n activeEmojiInteraction: {\n animatedEffect: emoji || localEffect,\n x: subtractXForEmojiInteraction(global, x),\n y,\n startSize,\n isReversed,\n },\n };\n});\n\naddReducer('sendEmojiInteraction', (global, actions, payload) => {\n const {\n messageId, chatId, emoji, interactions, localEffect,\n x, y, startX, startY, startSize,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n\n if (!chat || (!emoji && !localEffect)) {\n return undefined;\n }\n\n void callApi('sendEmojiInteraction', {\n chat,\n messageId,\n emoticon: emoji || selectLocalAnimatedEmojiEffectByName(localEffect),\n timestamps: interactions,\n });\n\n if (!global.activeEmojiInteraction) return undefined;\n\n return {\n ...global,\n activeEmojiInteraction: {\n ...global.activeEmojiInteraction,\n endX: subtractXForEmojiInteraction(global, x),\n endY: y,\n ...(startX && { x: subtractXForEmojiInteraction(global, startX) }),\n ...(startY && { y: startY }),\n ...(startSize && { startSize }),\n },\n };\n});\n\naddReducer('sendDefaultReaction', (global, actions, payload) => {\n const {\n chatId, messageId, x, y,\n } = payload;\n const reaction = selectDefaultReaction(global, chatId);\n\n if (!reaction) return;\n\n actions.sendReaction({\n chatId,\n messageId,\n reaction,\n x,\n y,\n });\n});\n\naddReducer('sendReaction', (global, actions, payload) => {\n const {\n chatId, messageId,\n }: { messageId: number; chatId: string } = payload;\n\n let { reaction } = payload;\n\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n\n if (!chat || !message) {\n return undefined;\n }\n\n if (message.reactions?.results?.some((l) => l.reaction === reaction && l.isChosen)) {\n reaction = undefined;\n }\n\n void callApi('sendReaction', { chat, messageId, reaction });\n\n const { animationLevel } = global.settings.byKey;\n\n if (animationLevel === ANIMATION_LEVEL_MAX) {\n global = {\n ...global,\n activeReactions: {\n ...(reaction ? global.activeReactions : omit(global.activeReactions, [messageId])),\n ...(reaction && {\n [messageId]: {\n reaction,\n messageId,\n },\n }),\n },\n };\n }\n\n return addMessageReaction(global, chatId, messageId, reaction);\n});\n\naddReducer('openChat', (global) => {\n return {\n ...global,\n activeReactions: {},\n };\n});\n\naddReducer('stopActiveReaction', (global, actions, payload) => {\n const { messageId, reaction } = payload;\n\n if (global.activeReactions[messageId]?.reaction !== reaction) {\n return global;\n }\n\n return {\n ...global,\n activeReactions: omit(global.activeReactions, [messageId]),\n };\n});\n\naddReducer('setDefaultReaction', (global, actions, payload) => {\n const { reaction } = payload;\n\n (async () => {\n const result = await callApi('setDefaultReaction', { reaction });\n\n if (!result) {\n return;\n }\n\n global = getGlobal();\n setGlobal({\n ...global,\n appConfig: {\n ...global.appConfig,\n defaultReaction: reaction,\n } as ApiAppConfig,\n });\n })();\n});\n\naddReducer('stopActiveEmojiInteraction', (global) => {\n return {\n ...global,\n activeEmojiInteraction: undefined,\n };\n});\n\naddReducer('loadReactors', (global, actions, payload) => {\n const { chatId, messageId, reaction } = payload;\n const chat = selectChat(global, chatId);\n const message = selectChatMessage(global, chatId, messageId);\n if (!chat || !message) {\n return;\n }\n\n const offset = message.reactors?.nextOffset;\n\n (async () => {\n const result = await callApi('fetchMessageReactionsList', {\n reaction,\n chat,\n messageId,\n offset,\n });\n\n if (!result) {\n return;\n }\n\n global = getGlobal();\n if (result.users?.length) {\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n }\n\n const { nextOffset, count, reactions } = result;\n\n setGlobal(updateChatMessage(global, chatId, messageId, {\n reactors: {\n nextOffset,\n count,\n reactions: [\n ...(message.reactors?.reactions || []),\n ...reactions,\n ],\n },\n }));\n })();\n});\n\naddReducer('loadMessageReactions', (global, actions, payload) => {\n const { ids, chatId } = payload;\n\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n callApi('fetchMessageReactions', { ids, chat });\n});\n\naddReducer('sendWatchingEmojiInteraction', (global, actions, payload) => {\n const {\n chatId, emoticon, x, y, startSize, isReversed,\n } = payload;\n\n const chat = selectChat(global, chatId);\n\n if (!chat || !global.activeEmojiInteraction) {\n return undefined;\n }\n\n callApi('sendWatchingEmojiInteraction', { chat, emoticon });\n\n return {\n ...global,\n activeEmojiInteraction: {\n ...global.activeEmojiInteraction,\n x: subtractXForEmojiInteraction(global, x),\n y,\n startSize,\n isReversed,\n },\n };\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, MAIN_THREAD_ID } from '../../../api/types';\n\nimport { ARCHIVED_FOLDER_ID, MAX_ACTIVE_PINNED_CHATS } from '../../../config';\nimport { pick } from '../../../util/iteratees';\nimport { closeMessageNotifications, notifyAboutNewMessage } from '../../../util/notifications';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n updateChat,\n updateChatListIds,\n updateChatListType,\n replaceThreadParam,\n leaveChat,\n} from '../../reducers';\nimport {\n selectChat,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectChatListType,\n selectCurrentMessageList,\n selectCountNotMutedUnread,\n} from '../../selectors';\nimport { throttle } from '../../../util/schedulers';\n\nconst TYPING_STATUS_CLEAR_DELAY = 6000; // 6 seconds\n// Enough to animate and mark as read in Message List\nconst CURRENT_CHAT_UNREAD_DELAY = 1500;\n\nconst runThrottledForUpdateAppBadge = throttle((cb) => cb(), 500, true);\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateChat': {\n if (!update.noTopChatsRequest && !selectIsChatListed(global, update.id)) {\n // Chat can appear in dialogs list.\n actions.loadTopChats();\n }\n\n const newGlobal = updateChat(global, update.id, update.chat, update.newProfilePhoto);\n setGlobal(newGlobal);\n\n runThrottledForUpdateAppBadge(() => updateAppBadge(selectCountNotMutedUnread(getGlobal())));\n\n if (update.chat.id) {\n closeMessageNotifications({\n chatId: update.chat.id,\n lastReadInboxMessageId: update.chat.lastReadInboxMessageId,\n });\n }\n break;\n }\n\n case 'updateChatJoin': {\n const listType = selectChatListType(global, update.id);\n if (!listType) {\n break;\n }\n\n global = updateChatListIds(global, listType, [update.id]);\n global = updateChat(global, update.id, { isNotJoined: false });\n setGlobal(global);\n\n const chat = selectChat(global, update.id);\n if (chat) {\n actions.requestChatUpdate({ chatId: chat.id });\n }\n break;\n }\n\n case 'updateChatLeave': {\n setGlobal(leaveChat(global, update.id));\n\n break;\n }\n\n case 'updateChatInbox': {\n setGlobal(updateChat(global, update.id, update.chat));\n\n runThrottledForUpdateAppBadge(() => updateAppBadge(selectCountNotMutedUnread(getGlobal())));\n\n break;\n }\n\n case 'updateChatTypingStatus': {\n const { id, typingStatus } = update;\n setGlobal(updateChat(global, id, { typingStatus }));\n\n setTimeout(() => {\n const newGlobal = getGlobal();\n const chat = selectChat(newGlobal, id);\n if (chat && typingStatus && chat.typingStatus && chat.typingStatus.timestamp === typingStatus.timestamp) {\n setGlobal(updateChat(newGlobal, id, { typingStatus: undefined }));\n }\n }, TYPING_STATUS_CLEAR_DELAY);\n\n break;\n }\n\n case 'newMessage': {\n const { message } = update;\n const { chatId: currentChatId, threadId, type: messageListType } = selectCurrentMessageList(global) || {};\n\n if (message.senderId === global.currentUserId && !message.isFromScheduled) {\n return;\n }\n\n const chat = selectChat(global, update.chatId);\n if (!chat) {\n return;\n }\n\n const isActiveChat = (\n messageListType === 'thread'\n && threadId === MAIN_THREAD_ID\n && update.chatId === currentChatId\n );\n\n if (isActiveChat) {\n setTimeout(() => {\n actions.requestChatUpdate({ chatId: update.chatId });\n }, CURRENT_CHAT_UNREAD_DELAY);\n } else {\n setGlobal(updateChat(global, update.chatId, {\n unreadCount: chat.unreadCount ? chat.unreadCount + 1 : 1,\n ...(update.message.hasUnreadMention && {\n unreadMentionsCount: chat.unreadMentionsCount ? chat.unreadMentionsCount + 1 : 1,\n }),\n }));\n }\n\n updateAppBadge(selectCountNotMutedUnread(getGlobal()));\n notifyAboutNewMessage({\n chat,\n message,\n });\n\n break;\n }\n\n case 'updateCommonBoxMessages':\n case 'updateChannelMessages': {\n const { ids, messageUpdate } = update;\n if (messageUpdate.hasUnreadMention !== false) {\n return;\n }\n\n ids.forEach((id) => {\n const chatId = ('channelId' in update ? update.channelId : selectCommonBoxChatId(global, id))!;\n const chat = selectChat(global, chatId);\n if (chat?.unreadMentionsCount) {\n global = updateChat(global, chatId, {\n unreadMentionsCount: chat.unreadMentionsCount - 1,\n });\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatFullInfo': {\n const { fullInfo } = update;\n const targetChat = global.chats.byId[update.id];\n if (!targetChat) {\n return;\n }\n\n setGlobal(updateChat(global, update.id, {\n fullInfo: {\n ...targetChat.fullInfo,\n ...fullInfo,\n },\n }));\n\n break;\n }\n\n case 'updatePinnedChatIds': {\n const { ids, folderId } = update;\n\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: ids.length ? ids : undefined,\n },\n },\n };\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatPinned': {\n const { id, isPinned } = update;\n const listType = selectChatListType(global, id);\n if (listType) {\n const { [listType]: orderedPinnedIds } = global.chats.orderedPinnedIds;\n\n let newOrderedPinnedIds = orderedPinnedIds || [];\n if (!isPinned) {\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => pinnedId !== id);\n } else if (!newOrderedPinnedIds.includes(id)) {\n // When moving pinned chats to archive, active ordered pinned ids don't get updated\n // (to preserve chat pinned state when it returns from archive)\n // If user already has max pinned chats, we should check for orderedIds\n // that don't point to listed chats\n if (listType === 'active' && newOrderedPinnedIds.length >= MAX_ACTIVE_PINNED_CHATS) {\n const listIds = global.chats.listIds.active;\n newOrderedPinnedIds = newOrderedPinnedIds.filter((pinnedId) => listIds && listIds.includes(pinnedId));\n }\n\n newOrderedPinnedIds = [id, ...newOrderedPinnedIds];\n }\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [listType]: newOrderedPinnedIds.length ? newOrderedPinnedIds : undefined,\n },\n },\n };\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChatListType': {\n const { id, folderId } = update;\n\n setGlobal(updateChatListType(global, id, folderId));\n\n break;\n }\n\n case 'updateChatFolder': {\n const { id, folder } = update;\n const { byId: chatFoldersById, orderedIds } = global.chatFolders;\n\n const newChatFoldersById = folder\n ? { ...chatFoldersById, [id]: folder }\n : pick(\n chatFoldersById,\n Object.keys(chatFoldersById).map(Number).filter((folderId) => folderId !== id),\n );\n\n const newOrderedIds = folder\n ? orderedIds && orderedIds.includes(id) ? orderedIds : [...(orderedIds || []), id]\n : orderedIds ? orderedIds.filter((orderedId) => orderedId !== id) : undefined;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n byId: newChatFoldersById,\n orderedIds: newOrderedIds,\n },\n });\n\n break;\n }\n\n case 'updateChatFoldersOrder': {\n const { orderedIds } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n orderedIds,\n },\n });\n\n break;\n }\n\n case 'updateRecommendedChatFolders': {\n const { folders } = update;\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: folders,\n },\n });\n\n break;\n }\n\n case 'updateChatMembers': {\n const targetChat = global.chats.byId[update.id];\n const { replacedMembers, addedMember, deletedMemberId } = update;\n if (!targetChat) {\n return;\n }\n\n let shouldUpdate = false;\n let members = targetChat.fullInfo?.members\n ? [...targetChat.fullInfo.members]\n : [];\n\n if (replacedMembers) {\n members = replacedMembers;\n shouldUpdate = true;\n } else if (addedMember) {\n if (\n !members.length\n || !members.some((m) => m.userId === addedMember.userId)\n ) {\n members.push(addedMember);\n shouldUpdate = true;\n }\n } else if (members.length && deletedMemberId) {\n const deleteIndex = members.findIndex((m) => m.userId === deletedMemberId);\n if (deleteIndex > -1) {\n members.slice(deleteIndex, 1);\n shouldUpdate = true;\n }\n }\n\n if (shouldUpdate) {\n const adminMembers = members.filter(({ isOwner, isAdmin }) => isOwner || isAdmin);\n // TODO Kicked members?\n\n setGlobal(updateChat(global, update.id, {\n membersCount: members.length,\n fullInfo: {\n ...targetChat.fullInfo,\n members,\n adminMembers,\n },\n }));\n }\n\n break;\n }\n\n case 'deleteProfilePhotos': {\n const { chatId, ids } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat?.photos) {\n setGlobal(updateChat(global, chatId, {\n photos: chat.photos.filter((photo) => !ids.includes(photo.id)),\n }));\n }\n break;\n }\n\n case 'draftMessage': {\n const {\n chatId, formattedText, date, replyingToId,\n } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', formattedText);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'replyingToId', replyingToId);\n global = updateChat(global, chatId, { draftDate: date });\n\n setGlobal(global);\n }\n break;\n }\n\n case 'showInvite': {\n const { data } = update;\n\n actions.showDialog({ data });\n break;\n }\n }\n});\n","export function areDeepEqual(value1: T, value2: T): boolean {\n const type1 = typeof value1;\n const type2 = typeof value2;\n if (type1 !== type2) {\n return false;\n }\n\n if (type1 !== 'object') {\n return value1 === value2;\n }\n\n const isArray1 = Array.isArray(value1);\n const isArray2 = Array.isArray(value2);\n\n if (isArray1 !== isArray2) {\n return false;\n }\n\n if (isArray1) {\n const array1 = value1 as any[];\n const array2 = value2 as any[];\n\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((member1, i) => areDeepEqual(member1, array2[i]));\n }\n\n const object1 = value1 as AnyLiteral;\n const object2 = value1 as AnyLiteral;\n const keys1 = Object.keys(object1);\n\n return keys1.every((key1) => areDeepEqual(object1[key1], object2[key1]));\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiUpdate, ApiMessage, ApiPollResult, ApiThreadInfo, MAIN_THREAD_ID,\n} from '../../../api/types';\n\nimport { unique } from '../../../util/iteratees';\nimport { areDeepEqual } from '../../../util/areDeepEqual';\nimport {\n updateChat,\n deleteChatMessages,\n updateChatMessage,\n updateListedIds,\n addViewportId,\n updateThreadInfo,\n replaceThreadParam,\n updateScheduledMessage,\n deleteChatScheduledMessages,\n updateThreadUnreadFromForwardedMessage,\n} from '../../reducers';\nimport { ActiveEmojiInteraction, GlobalActions, GlobalState } from '../../../global/types';\nimport {\n selectChatMessage,\n selectChatMessages,\n selectIsViewportNewest,\n selectListedIds,\n selectChatMessageByPollId,\n selectCommonBoxChatId,\n selectIsChatListed,\n selectThreadInfo,\n selectThreadByMessage,\n selectPinnedIds,\n selectScheduledMessage,\n selectScheduledMessages,\n isMessageInCurrentMessageList,\n selectScheduledIds,\n selectCurrentMessageList,\n selectViewportIds,\n selectFirstUnreadId,\n selectChat,\n selectIsChatWithBot,\n selectIsServiceChatReady,\n selectLocalAnimatedEmojiEffect,\n selectLocalAnimatedEmoji,\n} from '../../selectors';\nimport { getMessageContent, isUserId, isMessageLocal } from '../../helpers';\n\nconst ANIMATION_DELAY = 350;\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'newMessage': {\n const {\n chatId, id, message, shouldForceReply,\n } = update;\n global = updateWithLocalMedia(global, chatId, id, message);\n global = updateListedAndViewportIds(global, actions, message as ApiMessage);\n\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n\n setGlobal(global);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n\n if (isMessageInCurrentMessageList(global, chatId, message as ApiMessage)) {\n if (message.isOutgoing && !(message.content?.action)) {\n const currentMessageList = selectCurrentMessageList(global);\n if (currentMessageList) {\n // We do not use `actions.focusLastMessage` as it may be set with a delay (see below)\n actions.focusMessage({\n chatId,\n threadId: currentMessageList.threadId,\n messageId: message.id,\n noHighlight: true,\n isResizingContainer: true,\n });\n }\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message as ApiMessage) || {};\n if (threadInfo) {\n actions.requestThreadInfoUpdate({ chatId, threadId: threadInfo.threadId });\n }\n\n // @perf Wait until scroll animation finishes or simply rely on delivery status update (which is itself delayed)\n if (!isMessageLocal(message as ApiMessage)) {\n setTimeout(() => {\n let delayedGlobal = getGlobal();\n if (shouldForceReply) {\n delayedGlobal = replaceThreadParam(delayedGlobal, chatId, MAIN_THREAD_ID, 'replyingToId', id);\n }\n setGlobal(updateChatLastMessage(delayedGlobal, chatId, newMessage));\n }, ANIMATION_DELAY);\n }\n } else {\n setGlobal(updateChatLastMessage(getGlobal(), chatId, newMessage));\n }\n\n // Edge case: New message in an old (not loaded) chat.\n if (!selectIsChatListed(global, chatId)) {\n actions.loadTopChats();\n }\n\n break;\n }\n\n case 'updateStartEmojiInteraction': {\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n if (global.activeEmojiInteraction || currentChatId !== update.id) return;\n\n const localEmoji = selectLocalAnimatedEmoji(global, update.emoji);\n\n global = {\n ...global,\n activeEmojiInteraction: {\n animatedEffect: localEmoji ? selectLocalAnimatedEmojiEffect(localEmoji) : update.emoji,\n messageId: update.messageId,\n } as ActiveEmojiInteraction,\n };\n\n setGlobal(global);\n\n break;\n }\n\n case 'newScheduledMessage': {\n const { chatId, id, message } = update;\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', unique([...scheduledIds, id]));\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectChatMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message);\n\n const newMessage = selectChatMessage(global, chatId, id)!;\n if (message.threadInfo) {\n global = updateThreadInfo(\n global,\n message.threadInfo.chatId,\n message.threadInfo.threadId,\n message.threadInfo,\n );\n }\n global = updateChatLastMessage(global, chatId, newMessage);\n\n setGlobal(global);\n\n // Scroll down if bot message height is changed with an updated inline keyboard.\n // A drawback: this will scroll down even if the previous scroll was not at bottom.\n const chat = selectChat(global, chatId);\n if (\n chat\n && !message.isOutgoing\n && chat.lastMessage?.id === message.id\n && selectIsChatWithBot(global, chat)\n && isMessageInCurrentMessageList(global, chatId, message as ApiMessage)\n && selectIsViewportNewest(global, chatId, message.threadInfo?.threadId || MAIN_THREAD_ID)\n ) {\n actions.focusLastMessage();\n }\n\n break;\n }\n\n case 'updateScheduledMessage': {\n const { chatId, id, message } = update;\n\n const currentMessage = selectScheduledMessage(global, chatId, id);\n if (!currentMessage) {\n return;\n }\n\n global = updateWithLocalMedia(global, chatId, id, message, true);\n const ids = Object.keys(selectScheduledMessages(global, chatId) || {}).map(Number).sort((a, b) => b - a);\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', ids);\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n\n global = updateListedAndViewportIds(global, actions, message as ApiMessage);\n\n const currentMessage = selectChatMessage(global, chatId, localId);\n\n global = deleteChatMessages(global, chatId, [localId]);\n\n // Edge case for \"Send When Online\"\n if (message.isScheduled) {\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n }\n\n global = updateChatMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n const newMessage = selectChatMessage(global, chatId, message.id)!;\n global = updateChatLastMessage(global, chatId, newMessage);\n\n const thread = selectThreadByMessage(global, chatId, message);\n // For some reason Telegram requires to manually mark outgoing thread messages read\n if (thread?.threadInfo) {\n actions.markMessageListRead({ maxId: message.id });\n\n global = replaceThreadParam(global, chatId, thread.threadInfo.threadId, 'threadInfo', {\n ...thread.threadInfo,\n lastMessageId: message.id,\n lastReadInboxMessageId: message.id,\n });\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateScheduledMessageSendSucceeded': {\n const { chatId, localId, message } = update;\n const scheduledIds = selectScheduledIds(global, chatId) || [];\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', [...scheduledIds, message.id]);\n\n const currentMessage = selectScheduledMessage(global, chatId, localId);\n\n global = deleteChatScheduledMessages(global, chatId, [localId]);\n global = updateScheduledMessage(global, chatId, message.id, {\n ...currentMessage,\n ...message,\n previousLocalId: localId,\n });\n\n setGlobal(global);\n break;\n }\n\n case 'updatePinnedIds': {\n const { chatId, isPinned, messageIds } = update;\n\n const currentPinnedIds = selectPinnedIds(global, chatId) || [];\n const newPinnedIds = isPinned\n ? [...currentPinnedIds, ...messageIds].sort((a, b) => b - a)\n : currentPinnedIds.filter((id) => !messageIds.includes(id));\n\n setGlobal(replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds', newPinnedIds));\n\n break;\n }\n\n case 'updateThreadInfo': {\n const {\n chatId, threadId, threadInfo, firstMessageId,\n } = update;\n\n const currentThreadInfo = selectThreadInfo(global, chatId, threadId);\n const newTheadInfo = {\n ...currentThreadInfo,\n ...threadInfo,\n };\n\n if (!newTheadInfo.threadId) {\n return;\n }\n\n global = updateThreadInfo(global, chatId, threadId, newTheadInfo as ApiThreadInfo);\n\n if (firstMessageId) {\n global = replaceThreadParam(global, chatId, threadId, 'firstMessageId', firstMessageId);\n }\n\n setGlobal(global);\n\n break;\n }\n\n case 'resetMessages': {\n const { id: chatId } = update;\n const messagesById = selectChatMessages(global, chatId);\n\n if (messagesById && !isUserId(chatId)) {\n global = deleteChatMessages(global, chatId, Object.keys(messagesById).map(Number));\n setGlobal(global);\n actions.loadFullChat({ chatId, force: true });\n }\n\n break;\n }\n\n case 'deleteMessages': {\n const { ids, chatId } = update;\n\n deleteMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteScheduledMessages': {\n const { ids, chatId } = update;\n\n deleteScheduledMessages(chatId, ids, actions, global);\n break;\n }\n\n case 'deleteHistory': {\n const { chatId } = update;\n const chatMessages = global.messages.byChatId[chatId];\n if (chatMessages) {\n const ids = Object.keys(chatMessages.byId).map(Number);\n deleteMessages(chatId, ids, actions, global);\n } else {\n actions.requestChatUpdate({ chatId });\n }\n\n break;\n }\n\n case 'updateCommonBoxMessages': {\n const { ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n const chatId = selectCommonBoxChatId(global, id);\n if (chatId) {\n global = updateChatMessage(global, chatId, id, messageUpdate);\n }\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateChannelMessages': {\n const { channelId, ids, messageUpdate } = update;\n\n ids.forEach((id) => {\n global = updateChatMessage(global, channelId, id, messageUpdate);\n });\n\n setGlobal(global);\n\n break;\n }\n\n case 'updateMessagePoll': {\n const { pollId, pollUpdate } = update;\n\n const message = selectChatMessageByPollId(global, pollId);\n\n if (message?.content.poll) {\n const updatedPoll = { ...message.content.poll, ...pollUpdate };\n\n // Workaround for poll update bug: `chosen` option gets reset when someone votes after current user\n const { results: updatedResults } = updatedPoll.results || {};\n if (updatedResults && !updatedResults.some(((result) => result.isChosen))) {\n const { results } = message.content.poll.results;\n const chosenAnswers = results && results.filter((result) => result.isChosen);\n if (chosenAnswers) {\n chosenAnswers.forEach((chosenAnswer) => {\n const chosenAnswerIndex = updatedResults.findIndex((result) => result.option === chosenAnswer.option);\n if (chosenAnswerIndex >= 0) {\n updatedPoll.results.results![chosenAnswerIndex].isChosen = true;\n }\n });\n }\n }\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: updatedPoll,\n },\n },\n ));\n }\n break;\n }\n\n case 'updateMessagePollVote': {\n const { pollId, userId, options } = update;\n const message = selectChatMessageByPollId(global, pollId);\n if (!message || !message.content.poll || !message.content.poll.results) {\n break;\n }\n\n const { poll } = message.content;\n\n const { recentVoterIds, totalVoters, results } = poll.results;\n const newRecentVoterIds = recentVoterIds ? [...recentVoterIds] : [];\n const newTotalVoters = totalVoters ? totalVoters + 1 : 1;\n const newResults = results ? [...results] : [];\n\n newRecentVoterIds.push(userId);\n\n options.forEach((option) => {\n const targetOption = newResults.find((result) => result.option === option);\n const targetOptionIndex = newResults.findIndex((result) => result.option === option);\n const updatedOption: ApiPollResult = targetOption ? { ...targetOption } : { option, votersCount: 0 };\n\n updatedOption.votersCount += 1;\n if (userId === global.currentUserId) {\n updatedOption.isChosen = true;\n }\n\n if (targetOptionIndex) {\n newResults[targetOptionIndex] = updatedOption;\n } else {\n newResults.push(updatedOption);\n }\n });\n\n setGlobal(updateChatMessage(\n global,\n message.chatId,\n message.id,\n {\n content: {\n ...message.content,\n poll: {\n ...poll,\n results: {\n ...poll.results,\n recentVoterIds: newRecentVoterIds,\n totalVoters: newTotalVoters,\n results: newResults,\n },\n },\n },\n },\n ));\n\n break;\n }\n\n case 'updateServiceNotification': {\n const { message } = update;\n\n if (selectIsServiceChatReady(global)) {\n actions.createServiceNotification({ message });\n }\n\n break;\n }\n\n case 'updateMessageReactions': {\n const { chatId, id, reactions } = update;\n const message = selectChatMessage(global, chatId, id);\n const currentReactions = message?.reactions;\n\n // `updateMessageReactions` happens with an interval so we try to avoid redundant global state updates\n if (currentReactions && areDeepEqual(reactions, currentReactions)) {\n return;\n }\n\n setGlobal(updateChatMessage(global, chatId, id, { reactions: update.reactions }));\n\n break;\n }\n }\n});\n\nfunction updateWithLocalMedia(\n global: GlobalState, chatId: string, id: number, message: Partial, isScheduled = false,\n) {\n // Preserve locally uploaded media.\n const currentMessage = isScheduled\n ? selectScheduledMessage(global, chatId, id)\n : selectChatMessage(global, chatId, id);\n if (currentMessage && message.content) {\n const {\n photo, video, sticker, document,\n } = getMessageContent(currentMessage);\n if (photo && message.content.photo) {\n message.content.photo.blobUrl = photo.blobUrl;\n message.content.photo.thumbnail = photo.thumbnail;\n } else if (video && message.content.video) {\n message.content.video.blobUrl = video.blobUrl;\n } else if (sticker && message.content.sticker) {\n message.content.sticker.isPreloadedGlobally = sticker.isPreloadedGlobally;\n } else if (document && message.content.document) {\n message.content.document.previewBlobUrl = document.previewBlobUrl;\n }\n }\n\n return isScheduled\n ? updateScheduledMessage(global, chatId, id, message)\n : updateChatMessage(global, chatId, id, message);\n}\n\nfunction updateThreadUnread(global: GlobalState, actions: GlobalActions, message: ApiMessage, isDeleting?: boolean) {\n const { chatId } = message;\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n\n if (!threadInfo && message.replyToMessageId) {\n const originMessage = selectChatMessage(global, chatId, message.replyToMessageId);\n if (originMessage) {\n global = updateThreadUnreadFromForwardedMessage(global, originMessage, chatId, message.id, isDeleting);\n } else {\n actions.loadMessage({\n chatId,\n messageId: message.replyToMessageId,\n threadUpdate: {\n isDeleting,\n lastMessageId: message.id,\n },\n });\n }\n }\n\n return global;\n}\n\nfunction updateListedAndViewportIds(global: GlobalState, actions: GlobalActions, message: ApiMessage) {\n const { id, chatId } = message;\n\n const { threadInfo, firstMessageId } = selectThreadByMessage(global, chatId, message) || {};\n\n const chat = selectChat(global, chatId);\n const isUnreadChatNotLoaded = chat?.unreadCount && !selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n global = updateThreadUnread(global, actions, message);\n\n if (threadInfo) {\n if (firstMessageId || !isMessageLocal(message)) {\n global = updateListedIds(global, chatId, threadInfo.threadId, [id]);\n\n if (selectIsViewportNewest(global, chatId, threadInfo.threadId)) {\n global = addViewportId(global, chatId, threadInfo.threadId, id);\n\n if (!firstMessageId) {\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'firstMessageId', message.id);\n }\n }\n }\n\n global = replaceThreadParam(global, chatId, threadInfo.threadId, 'threadInfo', {\n ...threadInfo,\n lastMessageId: message.id,\n messagesCount: threadInfo.messagesCount + 1,\n });\n }\n\n if (isUnreadChatNotLoaded) {\n return global;\n }\n\n global = updateListedIds(global, chatId, MAIN_THREAD_ID, [id]);\n\n if (selectIsViewportNewest(global, chatId, MAIN_THREAD_ID)) {\n // Always keep the first unread message in the viewport list\n const firstUnreadId = selectFirstUnreadId(global, chatId, MAIN_THREAD_ID);\n const newGlobal = addViewportId(global, chatId, MAIN_THREAD_ID, id);\n const newViewportIds = selectViewportIds(newGlobal, chatId, MAIN_THREAD_ID);\n\n if (!firstUnreadId || newViewportIds!.includes(firstUnreadId)) {\n global = newGlobal;\n }\n }\n\n return global;\n}\n\nfunction updateChatLastMessage(\n global: GlobalState,\n chatId: string,\n message: ApiMessage,\n force = false,\n) {\n const { chats } = global;\n const currentLastMessage = chats.byId[chatId]?.lastMessage;\n\n if (currentLastMessage && !force) {\n const isSameOrNewer = (\n currentLastMessage.id === message.id || currentLastMessage.id === message.previousLocalId\n ) || message.id > currentLastMessage.id;\n\n if (!isSameOrNewer) {\n return global;\n }\n }\n\n return updateChat(global, chatId, { lastMessage: message });\n}\n\nfunction findLastMessage(global: GlobalState, chatId: string) {\n const byId = selectChatMessages(global, chatId);\n const listedIds = selectListedIds(global, chatId, MAIN_THREAD_ID);\n\n if (!byId || !listedIds) {\n return undefined;\n }\n\n let i = listedIds.length;\n while (i--) {\n const message = byId[listedIds[i]];\n if (!message.isDeleting) {\n return message;\n }\n }\n\n return undefined;\n}\n\nfunction deleteMessages(chatId: string | undefined, ids: number[], actions: GlobalActions, global: GlobalState) {\n // Channel update\n\n if (chatId) {\n ids.forEach((id) => {\n global = updateChatMessage(global, chatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, chatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, chatId, newLastMessage, true);\n }\n });\n\n setGlobal(global);\n\n actions.requestChatUpdate({ chatId });\n\n const threadIdsToUpdate: number[] = [];\n\n ids.forEach((id) => {\n const message = selectChatMessage(global, chatId, id);\n if (!message) {\n return;\n }\n\n global = updateThreadUnread(global, actions, message, true);\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n if (threadInfo) {\n threadIdsToUpdate.push(threadInfo.threadId);\n }\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), chatId, ids));\n\n unique(threadIdsToUpdate).forEach((threadId) => {\n actions.requestThreadInfoUpdate({ chatId, threadId });\n });\n }, ANIMATION_DELAY);\n\n return;\n }\n\n // Common box update\n\n const chatsIdsToUpdate: string[] = [];\n\n ids.forEach((id) => {\n const commonBoxChatId = selectCommonBoxChatId(global, id);\n if (commonBoxChatId) {\n chatsIdsToUpdate.push(commonBoxChatId);\n\n global = updateChatMessage(global, commonBoxChatId, id, {\n isDeleting: true,\n });\n\n const newLastMessage = findLastMessage(global, commonBoxChatId);\n if (newLastMessage) {\n global = updateChatLastMessage(global, commonBoxChatId, newLastMessage, true);\n }\n\n setTimeout(() => {\n setGlobal(deleteChatMessages(getGlobal(), commonBoxChatId, [id]));\n }, ANIMATION_DELAY);\n }\n });\n\n setGlobal(global);\n\n unique(chatsIdsToUpdate).forEach((id) => {\n actions.requestChatUpdate({ chatId: id });\n });\n}\n\nfunction deleteScheduledMessages(\n chatId: string | undefined, ids: number[], actions: GlobalActions, global: GlobalState,\n) {\n if (!chatId) {\n return;\n }\n\n ids.forEach((id) => {\n global = updateScheduledMessage(global, chatId, id, {\n isDeleting: true,\n });\n });\n\n setGlobal(global);\n\n setTimeout(() => {\n global = deleteChatScheduledMessages(getGlobal(), chatId, ids);\n const scheduledMessages = selectScheduledMessages(global, chatId);\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'scheduledIds', Object.keys(scheduledMessages || {}).map(Number),\n );\n setGlobal(global);\n }, ANIMATION_DELAY);\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate, ApiUserStatus } from '../../../api/types';\n\nimport { deleteContact, replaceUserStatuses, updateUser } from '../../reducers';\nimport { throttle } from '../../../util/schedulers';\n\nconst STATUS_UPDATE_THROTTLE = 3000;\n\nconst flushStatusUpdatesThrottled = throttle(flushStatusUpdates, STATUS_UPDATE_THROTTLE, true);\n\nlet pendingStatusUpdates: Record = {};\n\nfunction scheduleStatusUpdate(userId: string, statusUpdate: ApiUserStatus) {\n pendingStatusUpdates[userId] = statusUpdate;\n flushStatusUpdatesThrottled();\n}\n\nfunction flushStatusUpdates() {\n const global = getGlobal();\n\n setGlobal(replaceUserStatuses(global, {\n ...global.users.statusesById,\n ...pendingStatusUpdates,\n }));\n\n pendingStatusUpdates = {};\n}\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'deleteContact': {\n return deleteContact(global, update.id);\n }\n\n case 'updateUser': {\n return updateUser(global, update.id, update.user);\n }\n\n case 'updateUserStatus': {\n // Status updates come very often so we throttle them\n scheduleStatusUpdate(update.userId, update.status);\n return undefined;\n }\n\n case 'updateUserFullInfo': {\n const { id, fullInfo } = update;\n const targetUser = global.users.byId[id];\n if (!targetUser) {\n return undefined;\n }\n\n return updateUser(global, id, {\n fullInfo: {\n ...targetUser.fullInfo,\n ...fullInfo,\n },\n });\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\n\nimport { updateStickerSet } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateStickerSet': {\n return updateStickerSet(global, update.id, update.stickerSet);\n }\n }\n\n return undefined;\n});\n","import {\n addReducer, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { ApiPrivacyKey } from '../../../types';\n\nimport { addBlockedContact, removeBlockedContact } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updatePeerBlocked':\n if (update.isBlocked) {\n return addBlockedContact(getGlobal(), update.id);\n } else {\n return removeBlockedContact(getGlobal(), update.id);\n }\n\n case 'updateResetContactList':\n setGlobal({\n ...getGlobal(),\n contactList: {\n userIds: [],\n },\n });\n break;\n\n case 'updateFavoriteStickers':\n actions.loadFavoriteStickers();\n break;\n\n case 'updatePrivacy':\n global.settings.privacy[update.key as ApiPrivacyKey] = update.rules;\n break;\n }\n\n return undefined;\n});\n","import { addReducer, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { addNotifyException, updateChat, updateNotifySettings } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateNotifySettings': {\n return updateNotifySettings(global, update.peerType, update.isSilent, update.shouldShowPreviews);\n }\n\n case 'updateNotifyExceptions': {\n const {\n chatId, isMuted, isSilent, shouldShowPreviews,\n } = update;\n const chat = global.chats.byId[chatId];\n\n if (chat) {\n global = updateChat(global, chatId, { isMuted });\n }\n\n setGlobal(addNotifyException(global, chatId, { isMuted, isSilent, shouldShowPreviews }));\n break;\n }\n }\n\n return undefined;\n});\n","import { addReducer } from '../../../lib/teact/teactn';\n\nimport { ApiUpdate } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate): GlobalState | undefined => {\n switch (update['@type']) {\n case 'updateTwoFaStateWaitCode': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n isLoading: false,\n waitingEmailCodeLength: update.length,\n },\n };\n }\n\n case 'updateTwoFaError': {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n error: update.message,\n },\n };\n }\n }\n\n return undefined;\n});\n","import { addReducer, getGlobal } from '../../../lib/teact/teactn';\nimport { ApiUpdate } from '../../../api/types';\nimport { removeGroupCall, updateGroupCall, updateGroupCallParticipant } from '../../reducers/calls';\nimport { omit } from '../../../util/iteratees';\nimport { selectChat } from '../../selectors';\nimport { updateChat } from '../../reducers';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n switch (update['@type']) {\n case 'updateGroupCall': {\n if (update.call.connectionState === 'discarded') {\n if (global.groupCalls.activeGroupCallId) {\n actions.leaveGroupCall({ shouldRemove: true });\n return undefined;\n } else {\n return removeGroupCall(global, update.call.id);\n }\n }\n\n return updateGroupCall(global,\n update.call.id,\n omit(update.call, ['connectionState']),\n undefined,\n update.call.participantsCount);\n }\n case 'updateGroupCallChatId': {\n const chat = selectChat(global, update.chatId);\n if (chat) {\n global = updateChat(global, update.chatId, {\n fullInfo: {\n ...chat.fullInfo,\n groupCallId: update.call.id,\n },\n });\n }\n return global;\n }\n case 'updateGroupCallParticipants': {\n const { groupCallId, participants, nextOffset } = update;\n const { currentUserId } = global;\n\n // `secret-sauce` should disconnect if the participant is us but from another device\n global = getGlobal();\n participants.forEach((participant) => {\n if (participant.id) {\n global = updateGroupCallParticipant(global, groupCallId, participant.id, participant,\n !!nextOffset || currentUserId === participant.id);\n }\n });\n if (nextOffset) {\n global = updateGroupCall(global, groupCallId, {\n nextOffset,\n });\n }\n return global;\n }\n }\n\n return undefined;\n});\n","import { useEffect } from '../lib/teact/teact';\n\nimport { onBeforeUnload } from '../util/schedulers';\n\nexport default function useBeforeUnload(callback: AnyToVoidFunction) {\n useEffect(() => {\n return onBeforeUnload(callback);\n }, [callback]);\n}\n","import { useEffect } from '../lib/teact/teact';\nimport { IS_IOS, IS_PWA, IS_TOUCH_ENV } from '../util/environment';\n\nconst metaViewport = document.querySelector('meta[name=\"viewport\"]');\nconst defaultViewportContent = metaViewport?.getAttribute('content') || '';\nconst allowedZoomViewportContent = 'width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover';\n\nexport default function usePreventPinchZoomGesture(isDisabled = false) {\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n return undefined;\n }\n\n if (isDisabled) {\n // Clean viewport content from values values that disable the ability to zoom a webpage\n // https://web.dev/meta-viewport/\n metaViewport?.setAttribute('content', allowedZoomViewportContent);\n return undefined;\n }\n\n metaViewport?.setAttribute('content', defaultViewportContent);\n\n // Since iOS 10 `user-scaleable=no` is disabled in Safari for iOS,\n // this is only applicable for the browser and does not apply to the PWA mode.\n // https://newbedev.com/how-do-you-disable-viewport-zooming-on-mobile-safari\n if (IS_IOS && !IS_PWA) {\n document.addEventListener('gesturestart', preventEvent);\n }\n\n return () => {\n metaViewport?.setAttribute('content', 'width=device-width, initial-scale=1, shrink-to-fit=no');\n if (IS_IOS && !IS_PWA) {\n document.removeEventListener('gesturestart', preventEvent);\n }\n };\n }, [isDisabled]);\n}\n\nfunction preventEvent(e: Event) {\n e.preventDefault();\n}\n","import { useEffect, useState } from '../lib/teact/teact';\n\nexport default function useBrowserOnline() {\n const [isOnline, setIsOnline] = useState(window.navigator.onLine);\n\n useEffect(() => {\n function handleChange() {\n setIsOnline(window.navigator.onLine);\n }\n\n window.addEventListener('online', handleChange);\n window.addEventListener('offline', handleChange);\n\n return () => {\n window.removeEventListener('offline', handleChange);\n window.removeEventListener('online', handleChange);\n };\n }, []);\n\n return isOnline;\n}\n","import React, {\n FC, useCallback, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { LeftColumnContent, ISettings } from '../../../types';\nimport { ApiChat } from '../../../api/types';\n\nimport {\n ANIMATION_LEVEL_MAX, APP_NAME, APP_VERSION, FEEDBACK_URL,\n} from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport buildClassName from '../../../util/buildClassName';\nimport { formatDateToString } from '../../../util/dateFormat';\nimport switchTheme from '../../../util/switchTheme';\nimport { setPermanentWebVersion } from '../../../util/permanentWebVersion';\nimport { clearWebsync } from '../../../util/websync';\nimport { selectTheme } from '../../../modules/selectors';\nimport { isChatArchived } from '../../../modules/helpers';\nimport useLang from '../../../hooks/useLang';\nimport { disableHistoryBack } from '../../../hooks/useHistoryBack';\n\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\nimport Button from '../../ui/Button';\nimport SearchInput from '../../ui/SearchInput';\nimport PickerSelectedItem from '../../common/PickerSelectedItem';\nimport Switcher from '../../ui/Switcher';\n\nimport './LeftMainHeader.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n contactsFilter: string;\n shouldSkipTransition?: boolean;\n onSearchQuery: (query: string) => void;\n onSelectSettings: () => void;\n onSelectContacts: () => void;\n onSelectArchived: () => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n searchQuery?: string;\n isLoading: boolean;\n currentUserId?: string;\n globalSearchChatId?: string;\n searchDate?: number;\n theme: ISettings['theme'];\n animationLevel: 0 | 1 | 2;\n chatsById?: Record;\n};\n\nconst ANIMATION_LEVEL_OPTIONS = [0, 1, 2];\n\nconst PRODUCTION_HOSTNAME = 'web.telegram.org';\nconst LEGACY_VERSION_URL = 'https://web.telegram.org/?legacy=1';\nconst WEBK_VERSION_URL = 'https://web.telegram.org/k/';\n\nconst LeftMainHeader: FC = ({\n content,\n contactsFilter,\n onSearchQuery,\n onSelectSettings,\n onSelectContacts,\n onSelectArchived,\n onReset,\n searchQuery,\n isLoading,\n shouldSkipTransition,\n currentUserId,\n globalSearchChatId,\n searchDate,\n theme,\n animationLevel,\n chatsById,\n}) => {\n const {\n openChat,\n openTipsChat,\n setGlobalSearchDate,\n setSettingOption, setGlobalSearchChatId,\n } = getDispatch();\n\n const lang = useLang();\n const hasMenu = content === LeftColumnContent.ChatList;\n const clearedDateSearchParam = { date: undefined };\n const clearedChatSearchParam = { id: undefined };\n const selectedSearchDate = useMemo(() => {\n return searchDate\n ? formatDateToString(new Date(searchDate * 1000))\n : undefined;\n }, [searchDate]);\n const archivedUnreadChatsCount = useMemo(() => {\n if (!hasMenu || !chatsById) {\n return 0;\n }\n\n return Object.values(chatsById).reduce((total, chat) => {\n if (!isChatArchived(chat)) {\n return total;\n }\n\n return chat.unreadCount ? total + 1 : total;\n }, 0);\n }, [hasMenu, chatsById]);\n\n const withOtherVersions = window.location.hostname === PRODUCTION_HOSTNAME;\n\n const MainButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n onReset()}\n ariaLabel={hasMenu ? lang('AccDescrOpenMenu2') : 'Return to chat list'}\n >\n
\n \n );\n }, [hasMenu, lang, onReset, shouldSkipTransition]);\n\n const handleSearchFocus = useCallback(() => {\n if (!searchQuery) {\n onSearchQuery('');\n }\n }, [searchQuery, onSearchQuery]);\n\n const handleSelectSaved = useCallback(() => {\n openChat({ id: currentUserId, shouldReplaceHistory: true });\n }, [currentUserId, openChat]);\n\n const handleDarkModeToggle = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n const newTheme = theme === 'light' ? 'dark' : 'light';\n\n setSettingOption({ theme: newTheme });\n setSettingOption({ shouldUseSystemTheme: false });\n switchTheme(newTheme, animationLevel === ANIMATION_LEVEL_MAX);\n }, [animationLevel, setSettingOption, theme]);\n\n const handleAnimationLevelChange = useCallback((e: React.SyntheticEvent) => {\n e.stopPropagation();\n\n const newLevel = animationLevel === 0 ? 2 : 0;\n ANIMATION_LEVEL_OPTIONS.forEach((_, i) => {\n document.body.classList.toggle(`animation-level-${i}`, newLevel === i);\n });\n\n setSettingOption({ animationLevel: newLevel });\n }, [animationLevel, setSettingOption]);\n\n const handleSwitchToWebK = () => {\n setPermanentWebVersion('K');\n clearWebsync();\n disableHistoryBack();\n };\n\n const handleOpenTipsChat = () => {\n openTipsChat({ langCode: lang.code });\n };\n\n const isSearchFocused = (\n Boolean(globalSearchChatId)\n || content === LeftColumnContent.GlobalSearch\n || content === LeftColumnContent.Contacts\n );\n\n const searchInputPlaceholder = content === LeftColumnContent.Contacts\n ? lang('SearchFriends')\n : lang('Search');\n\n return (\n
\n
\n \n \n {lang('SavedMessages')}\n \n \n {lang('ArchivedChats')}\n {archivedUnreadChatsCount > 0 && (\n
{archivedUnreadChatsCount}
\n )}\n \n \n {lang('Contacts')}\n \n \n {lang('Settings')}\n \n \n {lang('lng_menu_night_mode')}\n \n \n \n {lang('Appearance.Animations').toLowerCase()}\n 0}\n />\n \n \n {lang('TelegramFeatures')}\n \n \n Report Bug\n \n {withOtherVersions && (\n <>\n \n Switch to K Version\n \n \n Switch to Old Version\n \n \n )}\n \n \n {selectedSearchDate && (\n \n )}\n {globalSearchChatId && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n query: searchQuery, fetchingStatus, chatId, date,\n } = global.globalSearch;\n const { currentUserId } = global;\n const { byId: chatsById } = global.chats;\n const { animationLevel } = global.settings.byKey;\n\n return {\n searchQuery,\n isLoading: fetchingStatus ? Boolean(fetchingStatus.chats || fetchingStatus.messages) : false,\n currentUserId,\n chatsById,\n globalSearchChatId: chatId,\n searchDate: date,\n theme: selectTheme(global),\n animationLevel,\n };\n },\n)(LeftMainHeader));\n","import React, { memo, FC } from '../../lib/teact/teact';\n\nimport { GlobalState } from '../../global/types';\n\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from '../ui/Spinner';\n\nimport './ConnectionState.scss';\n\ntype StateProps = Pick;\n\nconst ConnectionState: FC = () => {\n const lang = useLang();\n\n return (\n
\n \n
{lang('WaitingForNetwork')}
\n
\n );\n};\n\nexport default memo(ConnectionState);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatFolder, ApiUser } from '../../../api/types';\nimport { GlobalState } from '../../../global/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { ALL_FOLDER_ID } from '../../../config';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { captureEvents, SwipeDirection } from '../../../util/captureEvents';\nimport { getFolderUnreadDialogs } from '../../../modules/helpers';\nimport { selectNotifyExceptions, selectNotifySettings } from '../../../modules/selectors';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport useThrottledMemo from '../../../hooks/useThrottledMemo';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\n\nimport Transition from '../../ui/Transition';\nimport TabList from '../../ui/TabList';\nimport ChatList from './ChatList';\n\ntype OwnProps = {\n onScreenSelect: (screen: SettingsScreens) => void;\n foldersDispatch: FolderEditDispatch;\n};\n\ntype StateProps = {\n allListIds: GlobalState['chats']['listIds'];\n chatsById: Record;\n usersById: Record;\n chatFoldersById: Record;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n orderedFolderIds?: number[];\n activeChatFolder: number;\n currentUserId?: string;\n lastSyncTime?: number;\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst INFO_THROTTLE = 3000;\nconst SAVED_MESSAGES_HOTKEY = '0';\n\nconst ChatFolders: FC = ({\n allListIds,\n chatsById,\n usersById,\n chatFoldersById,\n notifySettings,\n notifyExceptions,\n orderedFolderIds,\n activeChatFolder,\n currentUserId,\n lastSyncTime,\n shouldSkipHistoryAnimations,\n foldersDispatch,\n onScreenSelect,\n}) => {\n const {\n loadChatFolders,\n setActiveChatFolder,\n openChat,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const transitionRef = useRef(null);\n\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime) {\n loadChatFolders();\n }\n }, [lastSyncTime, loadChatFolders]);\n\n const displayedFolders = useMemo(() => {\n return orderedFolderIds\n ? orderedFolderIds.map((id) => chatFoldersById[id] || {}).filter(Boolean)\n : undefined;\n }, [chatFoldersById, orderedFolderIds]);\n\n const folderCountersById = useThrottledMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n const counters = displayedFolders.map((folder) => {\n const {\n unreadDialogsCount, hasActiveDialogs,\n } = getFolderUnreadDialogs(allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions) || {};\n\n return {\n id: folder.id,\n badgeCount: unreadDialogsCount,\n isBadgeActive: hasActiveDialogs,\n };\n });\n\n return buildCollectionByKey(counters, 'id');\n }, INFO_THROTTLE, [displayedFolders, allListIds, chatsById, usersById, notifySettings, notifyExceptions]);\n\n const folderTabs = useMemo(() => {\n if (!displayedFolders || !displayedFolders.length) {\n return undefined;\n }\n\n return [\n { title: lang.code === 'en' ? 'All' : lang('FilterAllChats'), id: ALL_FOLDER_ID },\n ...displayedFolders.map((folder) => ({\n title: folder.title,\n ...(folderCountersById?.[folder.id]),\n })),\n ];\n }, [displayedFolders, folderCountersById, lang]);\n\n const handleSwitchTab = useCallback((index: number) => {\n setActiveChatFolder(index, { forceOnHeavyAnimation: true });\n }, [setActiveChatFolder]);\n\n // Prevent `activeTab` pointing at non-existing folder after update\n useEffect(() => {\n if (!folderTabs || !folderTabs.length) {\n return;\n }\n\n if (activeChatFolder >= folderTabs.length) {\n setActiveChatFolder(0);\n }\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n useEffect(() => {\n if (!transitionRef.current || !IS_TOUCH_ENV || !folderTabs || !folderTabs.length) {\n return undefined;\n }\n\n return captureEvents(transitionRef.current, {\n selectorToPreventScroll: '.chat-list',\n onSwipe: ((e, direction) => {\n if (direction === SwipeDirection.Left) {\n setActiveChatFolder(Math.min(activeChatFolder + 1, folderTabs.length - 1), { forceOnHeavyAnimation: true });\n return true;\n } else if (direction === SwipeDirection.Right) {\n setActiveChatFolder(Math.max(0, activeChatFolder - 1), { forceOnHeavyAnimation: true });\n return true;\n }\n\n return false;\n }),\n });\n }, [activeChatFolder, folderTabs, setActiveChatFolder]);\n\n const isNotInAllTabRef = useRef();\n isNotInAllTabRef.current = activeChatFolder !== 0;\n useEffect(() => (isNotInAllTabRef.current ? captureEscKeyListener(() => {\n if (isNotInAllTabRef.current) {\n setActiveChatFolder(0);\n }\n }) : undefined), [activeChatFolder, setActiveChatFolder]);\n\n useHistoryBack(activeChatFolder !== 0, () => setActiveChatFolder(0, { forceOnHeavyAnimation: true }));\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.ctrlKey && e.shiftKey && e.code.startsWith('Digit') && folderTabs) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n if (digit === SAVED_MESSAGES_HOTKEY) {\n openChat({ id: currentUserId, shouldReplaceHistory: true });\n return;\n }\n\n const folder = Number(digit) - 1;\n if (folder > folderTabs.length - 1) return;\n\n setActiveChatFolder(folder, { forceOnHeavyAnimation: true });\n e.preventDefault();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n };\n });\n\n const {\n shouldRender: shouldRenderPlaceholder, transitionClassNames,\n } = useShowTransition(!orderedFolderIds, undefined, true);\n\n function renderCurrentTab(isActive: boolean) {\n const activeFolder = Object.values(chatFoldersById)\n .find(({ id }) => id === folderTabs![activeChatFolder].id);\n\n if (!activeFolder || activeChatFolder === 0) {\n return (\n \n );\n }\n\n return (\n \n );\n }\n\n return (\n
\n {folderTabs?.length ? (\n \n ) : shouldRenderPlaceholder ? (\n
\n ) : undefined}\n \n {renderCurrentTab}\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n chats: { listIds: allListIds, byId: chatsById },\n users: { byId: usersById },\n chatFolders: {\n byId: chatFoldersById,\n orderedIds: orderedFolderIds,\n activeChatFolder,\n },\n currentUserId,\n lastSyncTime,\n shouldSkipHistoryAnimations,\n } = global;\n\n return {\n allListIds,\n chatsById,\n usersById,\n chatFoldersById,\n orderedFolderIds,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n activeChatFolder,\n currentUserId,\n shouldSkipHistoryAnimations,\n };\n },\n)(ChatFolders));\n","import { useState } from '../lib/teact/teact';\n\nimport useThrottle from './useThrottle';\nimport useOnChange from './useOnChange';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport useFlag from './useFlag';\n\nexport default function useThrottledMemo(\n resolverFn: () => R, ms: number, dependencies: D,\n): R | undefined {\n const runThrottled = useThrottle(ms, true);\n const [value, setValue] = useState();\n const [isFrozen, freeze, unfreeze] = useFlag();\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useOnChange(() => {\n if (isFrozen) {\n return;\n }\n\n runThrottled(() => {\n setValue(resolverFn());\n });\n }, [...dependencies, isFrozen]);\n\n return value;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './LeftSearch';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst LeftSearchAsync: FC = (props) => {\n const LeftSearch = useModuleLoader(Bundles.Extra, 'LeftSearch');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return LeftSearch ? : ;\n};\n\nexport default memo(LeftSearchAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\nimport { OwnProps } from './ContactList';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst ContactListAsync: FC = (props) => {\n const ContactList = useModuleLoader(Bundles.Extra, 'ContactList');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContactList ? : ;\n};\n\nexport default memo(ContactListAsync);\n","import React, {\n FC, useCallback, useState, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport Menu from '../ui/Menu';\nimport MenuItem from '../ui/MenuItem';\n\nimport './NewChatButton.scss';\n\nconst MENU_CLOSE_DELAY_MS = 750;\nlet closeTimeout: number | undefined;\n\ntype OwnProps = {\n isShown: boolean;\n onNewPrivateChat: () => void;\n onNewChannel: () => void;\n onNewGroup: () => void;\n};\n\nconst NewChatButton: FC = ({\n isShown,\n onNewPrivateChat,\n onNewChannel,\n onNewGroup,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n useEffect(() => {\n if (!isShown) {\n setIsMenuOpen(false);\n }\n }, [isShown]);\n\n const lang = useLang();\n\n const fabClassName = buildClassName(\n 'NewChatButton',\n isShown && 'revealed',\n isMenuOpen && 'menu-is-open',\n );\n\n const toggleIsMenuOpen = () => {\n setIsMenuOpen(!isMenuOpen);\n };\n\n const handleClose = () => {\n setIsMenuOpen(false);\n };\n\n const handleMouseEnter = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n setIsMenuOpen(false);\n }, MENU_CLOSE_DELAY_MS);\n }, []);\n\n return (\n \n \n \n \n \n \n {lang('NewChannel')}\n {lang('NewGroup')}\n {lang('NewMessageTitle')}\n \n
\n );\n};\n\nexport default memo(NewChatButton);\n","import React, {\n FC, useState, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport { LeftColumnContent, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport { pick } from '../../../util/iteratees';\nimport buildClassName from '../../../util/buildClassName';\nimport useBrowserOnline from '../../../hooks/useBrowserOnline';\nimport useFlag from '../../../hooks/useFlag';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useLang from '../../../hooks/useLang';\n\nimport Transition from '../../ui/Transition';\nimport LeftMainHeader from './LeftMainHeader';\nimport ConnectionState from '../ConnectionState';\nimport ChatFolders from './ChatFolders';\nimport LeftSearch from '../search/LeftSearch.async';\nimport ContactList from './ContactList.async';\nimport NewChatButton from '../NewChatButton';\nimport ShowTransition from '../../ui/ShowTransition';\nimport Button from '../../ui/Button';\n\nimport './LeftMain.scss';\n\ntype OwnProps = {\n content: LeftColumnContent;\n searchQuery?: string;\n searchDate?: number;\n contactsFilter: string;\n shouldSkipTransition?: boolean;\n foldersDispatch: FolderEditDispatch;\n onSearchQuery: (query: string) => void;\n onContentChange: (content: LeftColumnContent) => void;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = Pick;\n\nconst TRANSITION_RENDER_COUNT = Object.keys(LeftColumnContent).length / 2;\nconst BUTTON_CLOSE_DELAY_MS = 250;\nconst APP_OUTDATED_TIMEOUT = 3 * 24 * 60 * 60 * 1000; // 3 days\n\nlet closeTimeout: number | undefined;\n\nconst LeftMain: FC = ({\n content,\n searchQuery,\n searchDate,\n contactsFilter,\n shouldSkipTransition,\n foldersDispatch,\n onSearchQuery,\n onContentChange,\n onScreenSelect,\n onReset,\n connectionState,\n}) => {\n const [isNewChatButtonShown, setIsNewChatButtonShown] = useState(IS_TOUCH_ENV);\n\n const isBrowserOnline = useBrowserOnline();\n const isConnecting = !isBrowserOnline || connectionState === 'connectionStateConnecting';\n\n const isMouseInside = useRef(false);\n\n const handleSelectSettings = useCallback(() => {\n onContentChange(LeftColumnContent.Settings);\n }, [onContentChange]);\n\n const handleSelectContacts = useCallback(() => {\n onContentChange(LeftColumnContent.Contacts);\n }, [onContentChange]);\n\n const handleSelectNewChannel = useCallback(() => {\n onContentChange(LeftColumnContent.NewChannelStep1);\n }, [onContentChange]);\n\n const handleSelectNewGroup = useCallback(() => {\n onContentChange(LeftColumnContent.NewGroupStep1);\n }, [onContentChange]);\n\n const handleSelectArchived = useCallback(() => {\n onContentChange(LeftColumnContent.Archived);\n }, [onContentChange]);\n\n const handleMouseEnter = useCallback(() => {\n if (content !== LeftColumnContent.ChatList) {\n return;\n }\n isMouseInside.current = true;\n setIsNewChatButtonShown(true);\n }, [content]);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n setIsNewChatButtonShown(false);\n }\n }, BUTTON_CLOSE_DELAY_MS);\n }, []);\n\n useEffect(() => {\n let autoCloseTimeout: number | undefined;\n if (content !== LeftColumnContent.ChatList) {\n autoCloseTimeout = window.setTimeout(() => {\n setIsNewChatButtonShown(false);\n }, BUTTON_CLOSE_DELAY_MS);\n } else if (isMouseInside.current || IS_TOUCH_ENV) {\n setIsNewChatButtonShown(true);\n }\n\n return () => {\n if (autoCloseTimeout) {\n clearTimeout(autoCloseTimeout);\n autoCloseTimeout = undefined;\n }\n };\n }, [content]);\n\n const [shouldRenderUpdateButton, updateButtonClassNames, handleUpdateClick] = useAppOutdatedCheck();\n\n const lang = useLang();\n\n return (\n \n \n \n {() => }\n \n \n {(isActive) => {\n switch (content) {\n case LeftColumnContent.ChatList:\n return ;\n case LeftColumnContent.GlobalSearch:\n return (\n \n );\n case LeftColumnContent.Contacts:\n return ;\n default:\n return undefined;\n }\n }}\n \n {shouldRenderUpdateButton && (\n \n {lang('lng_update_telegram')}\n \n )}\n \n
\n );\n};\n\nfunction useAppOutdatedCheck() {\n const [isAppOutdated, markIsAppOutdated] = useFlag(false);\n\n useEffect(() => {\n const timeout = window.setTimeout(markIsAppOutdated, APP_OUTDATED_TIMEOUT);\n\n return () => {\n clearTimeout(timeout);\n };\n }, [markIsAppOutdated]);\n\n const { shouldRender, transitionClassNames } = useShowTransition(isAppOutdated);\n\n const handleUpdateClick = () => {\n window.location.reload();\n };\n\n return [shouldRender, transitionClassNames, handleUpdateClick] as const;\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['connectionState']),\n)(LeftMain);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './Settings';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst SettingsAsync: FC = (props) => {\n const Settings = useModuleLoader(Bundles.Extra, 'Settings');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return Settings ? : ;\n};\n\nexport default memo(SettingsAsync);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport { OwnProps } from './NewChat';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\nimport Loading from '../../ui/Loading';\n\nconst NewChatAsync: FC = (props) => {\n const NewChat = useModuleLoader(Bundles.Extra, 'NewChat');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return NewChat ? : ;\n};\n\nexport default memo(NewChatAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ArchivedChats';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst ArchivedChatsAsync: FC = (props) => {\n const ArchivedChats = useModuleLoader(Bundles.Extra, 'ArchivedChats');\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ArchivedChats ? : ;\n};\n\nexport default memo(ArchivedChatsAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { LeftColumnContent, SettingsScreens } from '../../types';\n\nimport { IS_MAC_OS, LAYERS_ANIMATION_NAME } from '../../util/environment';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport getKeyFromEvent from '../../util/getKeyFromEvent';\nimport useFoldersReducer from '../../hooks/reducers/useFoldersReducer';\nimport { useResize } from '../../hooks/useResize';\n\nimport Transition from '../ui/Transition';\nimport LeftMain from './main/LeftMain';\nimport Settings from './settings/Settings.async';\nimport NewChat from './newChat/NewChat.async';\nimport ArchivedChats from './ArchivedChats.async';\n\nimport './LeftColumn.scss';\n\ntype StateProps = {\n searchQuery?: string;\n searchDate?: number;\n activeChatFolder: number;\n shouldSkipHistoryAnimations?: boolean;\n leftColumnWidth?: number;\n};\n\nenum ContentType {\n Main,\n // eslint-disable-next-line @typescript-eslint/no-shadow\n Settings,\n Archived,\n // eslint-disable-next-line no-shadow\n NewGroup,\n // eslint-disable-next-line no-shadow\n NewChannel,\n}\n\nconst RENDER_COUNT = Object.keys(ContentType).length / 2;\nconst RESET_TRANSITION_DELAY_MS = 250;\n\nconst LeftColumn: FC = ({\n searchQuery,\n searchDate,\n activeChatFolder,\n shouldSkipHistoryAnimations,\n leftColumnWidth,\n}) => {\n const {\n setGlobalSearchQuery,\n setGlobalSearchChatId,\n resetChatCreation,\n setGlobalSearchDate,\n loadPasswordInfo,\n clearTwoFaError,\n setLeftColumnWidth,\n resetLeftColumnWidth,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const resizeRef = useRef(null);\n const [content, setContent] = useState(LeftColumnContent.ChatList);\n const [settingsScreen, setSettingsScreen] = useState(SettingsScreens.Main);\n const [contactsFilter, setContactsFilter] = useState('');\n const [foldersState, foldersDispatch] = useFoldersReducer();\n\n // Used to reset child components in background.\n const [lastResetTime, setLastResetTime] = useState(0);\n\n let contentType: ContentType = ContentType.Main;\n switch (content) {\n case LeftColumnContent.Archived:\n contentType = ContentType.Archived;\n break;\n case LeftColumnContent.Settings:\n contentType = ContentType.Settings;\n break;\n case LeftColumnContent.NewChannelStep1:\n case LeftColumnContent.NewChannelStep2:\n contentType = ContentType.NewChannel;\n break;\n case LeftColumnContent.NewGroupStep1:\n case LeftColumnContent.NewGroupStep2:\n contentType = ContentType.NewGroup;\n break;\n }\n\n const handleReset = useCallback((forceReturnToChatList?: boolean) => {\n if (content === LeftColumnContent.NewGroupStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewGroupStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewChannelStep2\n && !forceReturnToChatList\n ) {\n setContent(LeftColumnContent.NewChannelStep1);\n return;\n }\n\n if (content === LeftColumnContent.NewGroupStep1) {\n const pickerSearchInput = document.getElementById('new-group-picker-search');\n if (pickerSearchInput) {\n pickerSearchInput.blur();\n }\n }\n\n if (content === LeftColumnContent.Settings) {\n switch (settingsScreen) {\n case SettingsScreens.EditProfile:\n case SettingsScreens.Folders:\n case SettingsScreens.General:\n case SettingsScreens.Notifications:\n case SettingsScreens.DataStorage:\n case SettingsScreens.Privacy:\n case SettingsScreens.Language:\n setSettingsScreen(SettingsScreens.Main);\n return;\n\n case SettingsScreens.GeneralChatBackground:\n case SettingsScreens.QuickReaction:\n setSettingsScreen(SettingsScreens.General);\n return;\n case SettingsScreens.GeneralChatBackgroundColor:\n setSettingsScreen(SettingsScreens.GeneralChatBackground);\n return;\n\n case SettingsScreens.PrivacyPhoneNumber:\n case SettingsScreens.PrivacyLastSeen:\n case SettingsScreens.PrivacyProfilePhoto:\n case SettingsScreens.PrivacyForwarding:\n case SettingsScreens.PrivacyGroupChats:\n case SettingsScreens.PrivacyActiveSessions:\n case SettingsScreens.PrivacyBlockedUsers:\n case SettingsScreens.TwoFaDisabled:\n case SettingsScreens.TwoFaEnabled:\n case SettingsScreens.TwoFaCongratulations:\n setSettingsScreen(SettingsScreens.Privacy);\n return;\n case SettingsScreens.PrivacyPhoneNumberAllowedContacts:\n case SettingsScreens.PrivacyPhoneNumberDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyPhoneNumber);\n return;\n case SettingsScreens.PrivacyLastSeenAllowedContacts:\n case SettingsScreens.PrivacyLastSeenDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyLastSeen);\n return;\n case SettingsScreens.PrivacyProfilePhotoAllowedContacts:\n case SettingsScreens.PrivacyProfilePhotoDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyProfilePhoto);\n return;\n case SettingsScreens.PrivacyForwardingAllowedContacts:\n case SettingsScreens.PrivacyForwardingDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyForwarding);\n return;\n case SettingsScreens.PrivacyGroupChatsAllowedContacts:\n case SettingsScreens.PrivacyGroupChatsDeniedContacts:\n setSettingsScreen(SettingsScreens.PrivacyGroupChats);\n return;\n case SettingsScreens.TwoFaNewPassword:\n setSettingsScreen(SettingsScreens.TwoFaDisabled);\n return;\n case SettingsScreens.TwoFaNewPasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaNewPassword);\n return;\n case SettingsScreens.TwoFaNewPasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordConfirm);\n return;\n case SettingsScreens.TwoFaNewPasswordEmail:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordHint);\n return;\n case SettingsScreens.TwoFaNewPasswordEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaNewPasswordEmail);\n return;\n case SettingsScreens.TwoFaChangePasswordCurrent:\n case SettingsScreens.TwoFaTurnOff:\n case SettingsScreens.TwoFaRecoveryEmailCurrentPassword:\n setSettingsScreen(SettingsScreens.TwoFaEnabled);\n return;\n case SettingsScreens.TwoFaChangePasswordNew:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordCurrent);\n return;\n case SettingsScreens.TwoFaChangePasswordConfirm:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordNew);\n return;\n case SettingsScreens.TwoFaChangePasswordHint:\n setSettingsScreen(SettingsScreens.TwoFaChangePasswordConfirm);\n return;\n case SettingsScreens.TwoFaRecoveryEmail:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmailCurrentPassword);\n return;\n case SettingsScreens.TwoFaRecoveryEmailCode:\n setSettingsScreen(SettingsScreens.TwoFaRecoveryEmail);\n return;\n\n case SettingsScreens.FoldersCreateFolder:\n case SettingsScreens.FoldersEditFolder:\n setSettingsScreen(SettingsScreens.Folders);\n return;\n\n case SettingsScreens.FoldersIncludedChatsFromChatList:\n case SettingsScreens.FoldersExcludedChatsFromChatList:\n setSettingsScreen(SettingsScreens.FoldersEditFolderFromChatList);\n return;\n\n case SettingsScreens.FoldersEditFolderFromChatList:\n setContent(LeftColumnContent.ChatList);\n setSettingsScreen(SettingsScreens.Main);\n return;\n default:\n break;\n }\n }\n\n if (content === LeftColumnContent.ChatList && activeChatFolder === 0) {\n setContent(LeftColumnContent.GlobalSearch);\n return;\n }\n\n setContent(LeftColumnContent.ChatList);\n setContactsFilter('');\n setGlobalSearchQuery({ query: '' });\n setGlobalSearchDate({ date: undefined });\n setGlobalSearchChatId({ id: undefined });\n resetChatCreation();\n setTimeout(() => {\n setLastResetTime(Date.now());\n }, RESET_TRANSITION_DELAY_MS);\n }, [\n content, activeChatFolder, settingsScreen, setGlobalSearchQuery, setGlobalSearchDate, setGlobalSearchChatId,\n resetChatCreation,\n ]);\n\n const handleSearchQuery = useCallback((query: string) => {\n if (content === LeftColumnContent.Contacts) {\n setContactsFilter(query);\n return;\n }\n\n setContent(LeftColumnContent.GlobalSearch);\n\n if (query !== searchQuery) {\n setGlobalSearchQuery({ query });\n }\n }, [content, searchQuery, setGlobalSearchQuery]);\n\n useEffect(\n () => (content !== LeftColumnContent.ChatList || activeChatFolder === 0\n ? captureEscKeyListener(() => handleReset())\n : undefined),\n [activeChatFolder, content, handleReset],\n );\n\n useEffect(() => {\n if (content === LeftColumnContent.GlobalSearch) {\n return undefined;\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (((IS_MAC_OS && e.metaKey) || (!IS_MAC_OS && e.ctrlKey)) && e.shiftKey && getKeyFromEvent(e) === 'f') {\n e.preventDefault();\n setContent(LeftColumnContent.GlobalSearch);\n }\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n }, [content]);\n\n useEffect(() => {\n clearTwoFaError();\n\n if (settingsScreen === SettingsScreens.Privacy) {\n loadPasswordInfo();\n }\n }, [clearTwoFaError, loadPasswordInfo, settingsScreen]);\n\n const {\n initResize, resetResize, handleMouseUp,\n } = useResize(resizeRef, setLeftColumnWidth, resetLeftColumnWidth, leftColumnWidth);\n\n const handleSettingsScreenSelect = (screen: SettingsScreens) => {\n setContent(LeftColumnContent.Settings);\n setSettingsScreen(screen);\n };\n\n return (\n \n \n {(isActive) => {\n switch (contentType) {\n case ContentType.Archived:\n return (\n \n );\n case ContentType.Settings:\n return (\n \n );\n case ContentType.NewChannel:\n return (\n \n );\n case ContentType.NewGroup:\n return (\n \n );\n default:\n return (\n \n );\n }\n }}\n \n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n globalSearch: {\n query,\n date,\n },\n chatFolders: {\n activeChatFolder,\n },\n shouldSkipHistoryAnimations,\n leftColumnWidth,\n } = global;\n return {\n searchQuery: query, searchDate: date, activeChatFolder, shouldSkipHistoryAnimations, leftColumnWidth,\n };\n },\n)(LeftColumn));\n","import { RefObject } from 'react';\nimport { useState, useEffect } from '../lib/teact/teact';\nimport useFlag from './useFlag';\n\nexport const useResize = (\n elementRef: RefObject,\n onResize: (width: number) => void,\n onReset: NoneToVoidFunction,\n initialWidth?: number,\n) => {\n const [isActive, markIsActive, unmarkIsActive] = useFlag();\n const [initialMouseX, setInitialMouseX] = useState();\n const [initialElementWidth, setInitialElementWidth] = useState();\n\n useEffect(() => {\n if (!elementRef.current || !initialWidth) {\n return;\n }\n\n elementRef.current.style.width = `${initialWidth}px`;\n }, [elementRef, initialWidth]);\n\n const handleMouseUp = () => {\n document.body.classList.remove('no-selection', 'cursor-ew-resize');\n };\n\n const initResize = (event: React.MouseEvent) => {\n document.body.classList.add('no-selection', 'cursor-ew-resize');\n\n setInitialMouseX(event.clientX);\n setInitialElementWidth(elementRef.current!.offsetWidth);\n markIsActive();\n };\n\n const resetResize = (event: React.MouseEvent) => {\n event.preventDefault();\n elementRef.current!.style.width = '';\n onReset();\n };\n\n useEffect(() => {\n if (!isActive) return;\n\n const handleMouseMove = (event: MouseEvent) => {\n const newWidth = Math.ceil(initialElementWidth + event.clientX - initialMouseX);\n elementRef.current!.style.width = `${newWidth}px`;\n };\n\n const stopDrag = () => {\n handleMouseUp();\n document.removeEventListener('mousemove', handleMouseMove, false);\n document.removeEventListener('mouseup', stopDrag, false);\n document.removeEventListener('blur', stopDrag, false);\n onResize(elementRef.current!.offsetWidth);\n unmarkIsActive();\n };\n\n document.addEventListener('mousemove', handleMouseMove, false);\n document.addEventListener('mouseup', stopDrag, false);\n document.addEventListener('blur', stopDrag, false);\n }, [initialElementWidth, initialMouseX, elementRef, onResize, isActive, unmarkIsActive]);\n\n return { initResize, resetResize, handleMouseUp };\n};\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { ThemeKey } from '../types';\n\nimport { CUSTOM_BG_CACHE_NAME } from '../config';\nimport * as cacheApi from '../util/cacheApi';\nimport { preloadImage } from '../util/files';\n\nexport default (theme: ThemeKey, settingValue?: string) => {\n const [value, setValue] = useState(settingValue);\n\n useEffect(() => {\n if (!settingValue) {\n return;\n }\n\n if (settingValue.startsWith('#')) {\n setValue(settingValue);\n } else {\n cacheApi.fetch(CUSTOM_BG_CACHE_NAME, theme, cacheApi.Type.Blob)\n .then((blob) => {\n const url = URL.createObjectURL(blob);\n preloadImage(url)\n .then(() => {\n setValue(`url(${url})`);\n });\n });\n }\n }, [settingValue, theme]);\n\n return settingValue ? value : undefined;\n};\n","import { useEffect, useState } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\nimport windowSize from '../util/windowSize';\nimport { ApiDimensions } from '../api/types';\n\nconst THROTTLE = 250;\n\nexport default () => {\n const [size, setSize] = useState(windowSize.get());\n\n useEffect(() => {\n const handleResize = throttle(() => {\n setSize(windowSize.get());\n }, THROTTLE, false);\n\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n }, []);\n\n return size;\n};\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './HeaderMenuContainer';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst HeaderMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const HeaderMenuContainer = useModuleLoader(Bundles.Extra, 'HeaderMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return HeaderMenuContainer ? : undefined;\n};\n\nexport default memo(HeaderMenuContainerAsync);\n","import React, {\n FC,\n memo,\n useRef,\n useCallback,\n useState,\n useEffect,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { MessageListType } from '../../global/types';\nimport { MAIN_THREAD_ID } from '../../api/types';\nimport { IAnchorPosition } from '../../types';\n\nimport {\n ARE_CALLS_SUPPORTED, IS_MAC_OS, IS_PWA, IS_SINGLE_COLUMN_LAYOUT,\n} from '../../util/environment';\nimport getKeyFromEvent from '../../util/getKeyFromEvent';\nimport {\n isChatBasicGroup, isChatChannel, isChatSuperGroup, isUserId,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatBot,\n selectIsUserBlocked,\n selectIsChatBotNotStarted,\n selectIsChatWithSelf,\n selectIsInSelectMode,\n selectIsRightColumnShown,\n} from '../../modules/selectors';\nimport useLang from '../../hooks/useLang';\n\nimport Button from '../ui/Button';\nimport HeaderMenuContainer from './HeaderMenuContainer.async';\n\ninterface OwnProps {\n chatId: string;\n threadId: number;\n messageListType: MessageListType;\n canExpandActions: boolean;\n}\n\ninterface StateProps {\n noMenu?: boolean;\n isChannel?: boolean;\n isRightColumnShown?: boolean;\n canStartBot?: boolean;\n canRestartBot?: boolean;\n canSubscribe?: boolean;\n canSearch?: boolean;\n canCall?: boolean;\n canMute?: boolean;\n canLeave?: boolean;\n canEnterVoiceChat?: boolean;\n canCreateVoiceChat?: boolean;\n}\n\n// Chrome breaks layout when focusing input during transition\nconst SEARCH_FOCUS_DELAY_MS = 400;\n\nconst HeaderActions: FC = ({\n chatId,\n threadId,\n noMenu,\n isChannel,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canCall,\n canMute,\n canLeave,\n canEnterVoiceChat,\n canCreateVoiceChat,\n isRightColumnShown,\n canExpandActions,\n}) => {\n const {\n joinChannel,\n sendBotCommand,\n openLocalTextSearch,\n restartBot,\n openCallFallbackConfirm,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const menuButtonRef = useRef(null);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState(undefined);\n\n const handleHeaderMenuOpen = useCallback(() => {\n setIsMenuOpen(true);\n const rect = menuButtonRef.current!.getBoundingClientRect();\n setMenuPosition({ x: rect.right, y: rect.bottom });\n }, []);\n\n const handleHeaderMenuClose = useCallback(() => {\n setIsMenuOpen(false);\n }, []);\n\n const handleHeaderMenuHide = useCallback(() => {\n setMenuPosition(undefined);\n }, []);\n\n const handleSubscribeClick = useCallback(() => {\n joinChannel({ chatId });\n }, [joinChannel, chatId]);\n\n const handleStartBot = useCallback(() => {\n sendBotCommand({ command: '/start' });\n }, [sendBotCommand]);\n\n const handleRestartBot = useCallback(() => {\n restartBot({ chatId });\n }, [chatId, restartBot]);\n\n const handleSearchClick = useCallback(() => {\n openLocalTextSearch();\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n // iOS requires synchronous focus on user event.\n const searchInput = document.querySelector('#MobileSearch input')!;\n searchInput.focus();\n } else {\n setTimeout(() => {\n const searchInput = document.querySelector('.RightHeader .SearchInput input');\n if (searchInput) {\n searchInput.focus();\n }\n }, SEARCH_FOCUS_DELAY_MS);\n }\n }, [openLocalTextSearch]);\n\n useEffect(() => {\n if (!canSearch) {\n return undefined;\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (\n IS_PWA && ((IS_MAC_OS && e.metaKey) || (!IS_MAC_OS && e.ctrlKey)) && !e.shiftKey && getKeyFromEvent(e) === 'f'\n ) {\n e.preventDefault();\n handleSearchClick();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n }, [canSearch, handleSearchClick]);\n\n const lang = useLang();\n\n return (\n
\n {!IS_SINGLE_COLUMN_LAYOUT && (\n <>\n {canExpandActions && canSubscribe && (\n \n {lang(isChannel ? 'ProfileJoinChannel' : 'ProfileJoinGroup')}\n \n )}\n {canExpandActions && canStartBot && (\n \n {lang('BotStart')}\n \n )}\n {canExpandActions && canRestartBot && (\n \n {lang('BotRestart')}\n \n )}\n {canSearch && (\n \n \n \n )}\n {canCall && (\n \n \n \n )}\n \n )}\n \n \n \n {menuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const chat = selectChat(global, chatId);\n const isChannel = Boolean(chat && isChatChannel(chat));\n\n if (!chat || chat.isRestricted || selectIsInSelectMode(global)) {\n return {\n noMenu: true,\n };\n }\n\n const bot = selectChatBot(global, chatId);\n const isChatWithSelf = selectIsChatWithSelf(global, chatId);\n const isMainThread = messageListType === 'thread' && threadId === MAIN_THREAD_ID;\n const isDiscussionThread = messageListType === 'thread' && threadId !== MAIN_THREAD_ID;\n const isRightColumnShown = selectIsRightColumnShown(global);\n\n const canRestartBot = Boolean(bot && selectIsUserBlocked(global, bot.id));\n const canStartBot = !canRestartBot && Boolean(selectIsChatBotNotStarted(global, chatId));\n const canSubscribe = Boolean(\n isMainThread && (isChannel || isChatSuperGroup(chat)) && chat.isNotJoined,\n );\n const canSearch = isMainThread || isDiscussionThread;\n const canCall = ARE_CALLS_SUPPORTED && isUserId(chat.id) && !isChatWithSelf && !bot;\n const canMute = isMainThread && !isChatWithSelf && !canSubscribe;\n const canLeave = isMainThread && !canSubscribe;\n const canEnterVoiceChat = ARE_CALLS_SUPPORTED && chat.isCallActive;\n const canCreateVoiceChat = ARE_CALLS_SUPPORTED && !chat.isCallActive\n && (chat.adminRights?.manageCall || (chat.isCreator && isChatBasicGroup(chat)));\n\n return {\n noMenu: false,\n isChannel,\n isRightColumnShown,\n canStartBot,\n canRestartBot,\n canSubscribe,\n canSearch,\n canCall,\n canMute,\n canLeave,\n canEnterVoiceChat,\n canCreateVoiceChat,\n };\n },\n)(HeaderActions));\n","import { useLayoutEffect, useState } from '../lib/teact/teact';\n\nimport { ApiMessage } from '../api/types';\n\nimport { DEBUG } from '../config';\nimport { isWebpSupported } from '../util/environment';\nimport { EMPTY_IMAGE_DATA_URI, webpToPngBase64 } from '../util/webpToPng';\nimport { getMessageMediaThumbDataUri } from '../modules/helpers';\n\nexport default function useWebpThumbnail(message?: ApiMessage) {\n const thumbDataUri = message && getMessageMediaThumbDataUri(message);\n const sticker = message?.content?.sticker;\n const shouldDecodeThumbnail = thumbDataUri && sticker && !isWebpSupported() && thumbDataUri.includes('image/webp');\n const [thumbnailDecoded, setThumbnailDecoded] = useState(EMPTY_IMAGE_DATA_URI);\n const messageId = message?.id;\n\n useLayoutEffect(() => {\n if (!shouldDecodeThumbnail) {\n return;\n }\n\n webpToPngBase64(`b64-${messageId}`, thumbDataUri!)\n .then(setThumbnailDecoded)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n }, [messageId, shouldDecodeThumbnail, thumbDataUri]);\n\n return shouldDecodeThumbnail ? thumbnailDecoded : thumbDataUri;\n}\n","import React, {\n FC,\n useRef,\n useEffect,\n useMemo,\n memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\ntype OwnProps = {\n count: number;\n index: number;\n};\n\nconst BORDER_MASK_LEVEL = 4;\n\nconst PinnedMessageNavigation: FC = ({\n count, index,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const markupParams = useMemo(() => {\n return calculateMarkup(count, index);\n }, [count, index]);\n\n useEffect(() => {\n if (!containerRef.current) {\n return;\n }\n\n const {\n trackHeight,\n trackTranslateY,\n markHeight,\n markTranslateY,\n clipPathId,\n clipPath,\n } = markupParams;\n\n const firstChild = containerRef.current.firstElementChild;\n if (containerRef?.current) {\n const currentElement = containerRef.current;\n const { style } = currentElement;\n style.height = `${trackHeight}px`;\n style.transform = `translateY(-${trackTranslateY}px)`;\n style.clipPath = `url(\"#${clipPathId}\")`;\n const svg = currentElement.querySelector('svg');\n const div = currentElement.querySelector('div');\n const defs = currentElement.querySelector('defs');\n if (!svg) {\n if (firstChild) {\n firstChild.innerHTML = ` ${clipPath} `;\n }\n }\n if (defs) {\n defs.innerHTML = clipPath;\n }\n if (div) {\n div.style.height = `${markHeight}px`;\n div.style.transform = `translateY(${markTranslateY}px)`;\n }\n }\n }, [markupParams]);\n\n if (count === 1) {\n return (\n
\n \n
\n );\n }\n\n const {\n trackHeight, trackTranslateY, markHeight, markTranslateY, clipPathId,\n } = markupParams;\n\n return (\n
BORDER_MASK_LEVEL && 'pinned-message-border-mask')}>\n \n \n \n
\n
\n );\n};\n\nfunction calculateMarkup(count: number, index: number) {\n const reverseIndex = count - index - 1;\n const barHeight = getBarHeight(count);\n const markHeight = getMarkHeight(count, reverseIndex);\n const trackHeight = getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath${count}`;\n const clipPath = getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = getMarkTranslateY(reverseIndex, barHeight, count);\n const trackTranslateY = getTrackTranslateY(reverseIndex, count, barHeight, trackHeight);\n return {\n markHeight,\n clipPath,\n markTranslateY,\n trackTranslateY,\n trackHeight,\n clipPathId,\n };\n}\n\nfunction getBarHeight(count: number): number {\n let barHeight = 8;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getMarkHeight(count: number, index: number) {\n let barHeight = 36;\n if (count === 1) {\n barHeight = 36;\n } else if (count === 2) {\n barHeight = 17;\n } else if (count === 3) {\n barHeight = index === 1 ? 12 : 11;\n } else if (count === 4) {\n barHeight = 7.5;\n } else if (count > 3) {\n barHeight = 7.5;\n }\n\n return barHeight;\n}\n\nfunction getTrackHeight(count: number, barHeight: number) {\n return count <= 3 ? 36 : barHeight * count + 2 * (count - 1);\n}\n\nfunction getClipPath(id: string, barHeight: number, count: number) {\n const radius = 1;\n\n let d = '';\n if (count === 3) {\n d = drawRect(0, 0, 2, barHeight, radius)\n + drawRect(0, 12, 2, barHeight + 1, radius)\n + drawRect(0, 25, 2, barHeight, radius);\n } else {\n for (let i = 0; i < count; i++) {\n d += drawRect(0, (barHeight + 2) * i, 2, barHeight, radius);\n }\n }\n\n return (\n `\n \n `\n );\n}\n\nfunction drawRect(x: number, y: number, width: number, height: number, radius: number) {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,\n ${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n}\n\nfunction getMarkTranslateY(index: number, barHeight: number, count: number) {\n if (count === 1) {\n return 0;\n } else if (count === 2) {\n return index === 0 ? 0 : barHeight + 2;\n }\n\n if (count === 3) {\n if (index === 0) {\n return 0;\n } else if (index === 1) {\n return 12;\n }\n\n return 25;\n } else {\n return (barHeight + 2) * index;\n }\n}\n\nfunction getTrackTranslateY(index: number, count: number, barHeight: number, trackHeight: number) {\n if (count <= 4) {\n return 0;\n }\n\n if (index <= 1) {\n return 0;\n } else if (index >= count - 2) {\n return trackHeight - 36;\n }\n\n return (barHeight + 4) / 2 + (index - 2) * (barHeight + 2);\n}\n\nexport default memo(PinnedMessageNavigation);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getPictogramDimensions } from '../common/helpers/mediaDimensions';\nimport { getMessageMediaHash, getMessageSummaryText } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\n\nimport ConfirmDialog from '../ui/ConfirmDialog';\nimport Button from '../ui/Button';\nimport RippleEffect from '../ui/RippleEffect';\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport PinnedMessageNavigation from './PinnedMessageNavigation';\n\ntype OwnProps = {\n message: ApiMessage;\n index: number;\n count: number;\n customTitle?: string;\n className?: string;\n onUnpinMessage?: (id: number) => void;\n onClick?: () => void;\n onAllPinnedClick?: () => void;\n};\n\nconst HeaderPinnedMessage: FC = ({\n message, count, index, customTitle, className, onUnpinMessage, onClick, onAllPinnedClick,\n}) => {\n const lang = useLang();\n const mediaThumbnail = useWebpThumbnail(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n\n const text = getMessageSummaryText(lang, message, Boolean(mediaThumbnail));\n const [isUnpinDialogOpen, openUnpinDialog, closeUnpinDialog] = useFlag();\n\n const handleUnpinMessage = useCallback(() => {\n closeUnpinDialog();\n\n if (onUnpinMessage) {\n onUnpinMessage(message.id);\n }\n }, [closeUnpinDialog, onUnpinMessage, message.id]);\n\n return (\n
\n {count > 1 && (\n \n \n \n )}\n {onUnpinMessage && (\n \n \n \n )}\n \n
\n \n {mediaThumbnail && renderPictogram(mediaThumbnail, mediaBlobUrl)}\n
\n
\n {customTitle || `${lang('PinnedMessage')} ${index > 0 ? `#${count - index}` : ''}`}\n
\n

{renderText(text)}

\n
\n\n \n
\n
\n );\n};\n\nfunction renderPictogram(thumbDataUri: string, blobUrl?: string) {\n const { width, height } = getPictogramDimensions();\n\n return (\n \"\"\n );\n}\n\nexport default memo(HeaderPinnedMessage);\n","export function scaleImage(image: string | Blob, ratio: number, outputType: string = 'image/png'): Promise {\n const url = image instanceof Blob ? URL.createObjectURL(image) : image;\n const img = new Image();\n return new Promise((resolve) => {\n img.onload = () => {\n scale(img, img.width * ratio, img.height * ratio, outputType)\n .then((blob) => URL.createObjectURL(blob))\n .then(resolve)\n .finally(() => {\n if (image instanceof Blob) {\n URL.revokeObjectURL(url); // Revoke blob url that we created\n }\n });\n };\n img.src = url;\n });\n}\n\nexport function resizeImage(\n image: string | Blob, width: number, height: number, outputType: string = 'image/png',\n): Promise {\n const url = image instanceof Blob ? URL.createObjectURL(image) : image;\n const img = new Image();\n return new Promise((resolve) => {\n img.onload = () => {\n scale(img, width, height, outputType)\n .then((blob) => URL.createObjectURL(blob))\n .then(resolve)\n .finally(() => {\n if (image instanceof Blob) {\n URL.revokeObjectURL(url); // Revoke blob url that we created\n }\n });\n };\n img.src = url;\n });\n}\n\nasync function scale(\n img: HTMLImageElement, width: number, height: number, outputType: string = 'image/png',\n) {\n // Safari does not have built-in resize method with quality control\n if ('createImageBitmap' in window) {\n try {\n const bitmap = await window.createImageBitmap(img,\n { resizeWidth: width, resizeHeight: height, resizeQuality: 'high' });\n if (bitmap.height !== height || bitmap.width !== width) {\n throw new Error('Image bitmap resize not supported!'); // FF93 added support for options, but not resize\n }\n return await new Promise((res) => {\n const canvas = document.createElement('canvas');\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n const ctx = canvas.getContext('bitmaprenderer');\n if (ctx) {\n ctx.transferFromImageBitmap(bitmap);\n } else {\n canvas.getContext('2d')!.drawImage(bitmap, 0, 0);\n }\n canvas.toBlob(res, outputType);\n });\n } catch (e) {\n // Fallback. Firefox below 93 does not recognize `createImageBitmap` with 2 parameters\n return steppedScale(img, width, height, undefined, outputType);\n }\n } else {\n return steppedScale(img, width, height, undefined, outputType);\n }\n}\n\nfunction steppedScale(\n img: HTMLImageElement, width: number, height: number, step: number = 0.5, outputType: string = 'image/png',\n): Promise {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n const oc = document.createElement('canvas');\n const octx = oc.getContext('2d')!;\n\n canvas.width = width;\n canvas.height = height;\n\n if (img.width * step > width) { // For performance avoid unnecessary drawing\n const mul = 1 / step;\n let cur = {\n width: Math.floor(img.width * step),\n height: Math.floor(img.height * step),\n };\n\n oc.width = cur.width;\n oc.height = cur.height;\n\n octx.drawImage(img, 0, 0, cur.width, cur.height);\n\n while (cur.width * step > width) {\n cur = {\n width: Math.floor(cur.width * step),\n height: Math.floor(cur.height * step),\n };\n octx.drawImage(oc, 0, 0, cur.width * mul, cur.height * mul, 0, 0, cur.width, cur.height);\n }\n\n ctx.drawImage(oc, 0, 0, cur.width, cur.height, 0, 0, canvas.width, canvas.height);\n } else {\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n }\n\n return new Promise((resolve) => {\n canvas.toBlob(resolve, outputType);\n });\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport {\n ApiAudio, ApiChat, ApiMessage, ApiUser, ApiVoice,\n} from '../api/types';\n\nimport useMedia from './useMedia';\nimport { useAsync } from './useAsync';\nimport {\n getAudioHasCover, getChatAvatarHash, getChatTitle, getMessageContent, getMessageMediaHash, getSenderTitle,\n} from '../modules/helpers';\nimport { getTranslation } from '../util/langProvider';\nimport { buildMediaMetadata } from '../util/mediaSession';\nimport { scaleImage, resizeImage } from '../util/imageResize';\nimport { AVATAR_FULL_DIMENSIONS } from '../components/common/helpers/mediaDimensions';\n\n// @ts-ignore\nimport telegramLogoPath from '../assets/telegram-logo-filled.svg';\n\nconst LOGO_DIMENSIONS = { width: 200, height: 200 };\nconst MINIMAL_SIZE = 115; // spec says 100, but on Chrome 93 it's not showing\n\n// TODO Add support for video in future\nexport default (message: ApiMessage, sender?: ApiUser | ApiChat, chat?: ApiChat): MediaMetadata | undefined => {\n const { audio, voice } = getMessageContent(message);\n const title = audio ? (audio.title || audio.fileName) : voice ? 'Voice message' : '';\n const artist = (audio && audio.performer) || (sender && getSenderTitle(getTranslation, sender));\n const album = (chat && getChatTitle(getTranslation, chat)) || 'Telegram';\n\n const audioCoverHash = (audio && getAudioHasCover(audio) && getMessageMediaHash(message, 'pictogram'));\n const avatarHash = sender && getChatAvatarHash(sender, 'big');\n const hash = (audio && audioCoverHash) || (voice && avatarHash);\n const media = useMedia(hash);\n\n const size = useMemo(() => {\n return getCoverSize(audio, voice, media);\n }, [audio, media, voice]);\n const { result: url } = useAsync(() => makeGoodArtwork(media, size), [media, size], telegramLogoPath);\n return useMemo(() => {\n return buildMediaMetadata({\n title,\n artist,\n album,\n artwork: [{ src: url }],\n });\n }, [album, artist, title, url]);\n};\n\nfunction makeGoodArtwork(url?: string, size?: { width: number; height: number }): Promise {\n if (!url) return Promise.resolve(telegramLogoPath);\n if (!size) return resizeImage(url, MINIMAL_SIZE, MINIMAL_SIZE);\n const min = Math.min(size.width, size.height);\n if (min < MINIMAL_SIZE) {\n const ratio = MINIMAL_SIZE / min;\n return scaleImage(url, ratio);\n }\n return Promise.resolve(url);\n}\n\nfunction getCoverSize(audio?: ApiAudio, voice?: ApiVoice, url?: string) {\n if (!url) return LOGO_DIMENSIONS;\n if (audio) {\n if (!audio.thumbnailSizes || audio.thumbnailSizes.length === 0) return undefined;\n const preferred = audio.thumbnailSizes.find((size) => size.type === 'm');\n return preferred || audio.thumbnailSizes[0]; // Sometimes `m` is not present\n }\n\n if (voice) {\n return AVATAR_FULL_DIMENSIONS;\n }\n\n return undefined;\n}\n","import { useEffect, useState } from '../lib/teact/teact';\n\nexport const useAsync = (fn: () => Promise, deps: any[], defaultValue?: T) => {\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState();\n const [result, setResult] = useState(defaultValue);\n useEffect(() => {\n setIsLoading(true);\n let wasCancelled = false;\n fn().then((res) => {\n if (wasCancelled) return;\n setIsLoading(false);\n setResult(res);\n }, (err) => {\n if (wasCancelled) return;\n setIsLoading(false);\n setError(err);\n });\n return () => {\n wasCancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n return { isLoading, error, result };\n};\n","import React, {\n FC, useCallback, useEffect, useMemo,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { AudioOrigin } from '../../types';\nimport {\n ApiAudio, ApiChat, ApiMessage, ApiUser,\n} from '../../api/types';\n\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../util/environment';\n\nimport * as mediaLoader from '../../util/mediaLoader';\nimport {\n getMediaDuration, getMessageContent, getMessageMediaHash, getSenderTitle, isMessageLocal,\n} from '../../modules/helpers';\nimport { selectChat, selectSender } from '../../modules/selectors';\nimport buildClassName from '../../util/buildClassName';\nimport { makeTrackId } from '../../util/audioPlayer';\nimport { clearMediaSession } from '../../util/mediaSession';\nimport windowSize from '../../util/windowSize';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useLang from '../../hooks/useLang';\nimport useMessageMediaMetadata from '../../hooks/useMessageMediaMetadata';\nimport renderText from '../common/helpers/renderText';\n\nimport RippleEffect from '../ui/RippleEffect';\nimport Button from '../ui/Button';\nimport RangeSlider from '../ui/RangeSlider';\n\nimport './AudioPlayer.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n origin?: AudioOrigin;\n className?: string;\n noUi?: boolean;\n};\n\ntype StateProps = {\n sender?: ApiChat | ApiUser;\n chat?: ApiChat;\n volume: number;\n playbackRate: number;\n isMuted: boolean;\n};\n\nconst FAST_PLAYBACK_RATE = 1.8;\n\nconst AudioPlayer: FC = ({\n message,\n className,\n noUi,\n sender,\n chat,\n volume,\n playbackRate,\n isMuted,\n}) => {\n const {\n setAudioPlayerVolume,\n setAudioPlayerPlaybackRate,\n setAudioPlayerMuted,\n focusMessage,\n closeAudioPlayer,\n } = getDispatch();\n\n const lang = useLang();\n const { audio, voice, video } = getMessageContent(message);\n const isVoice = Boolean(voice || video);\n const senderName = sender ? getSenderTitle(lang, sender) : undefined;\n const mediaData = mediaLoader.getFromMemory(getMessageMediaHash(message, 'inline')!) as (string | undefined);\n const mediaMetadata = useMessageMediaMetadata(message, sender, chat);\n\n const {\n playPause,\n stop,\n isPlaying,\n requestNextTrack,\n requestPreviousTrack,\n isFirst,\n isLast,\n setVolume,\n toggleMuted,\n setPlaybackRate,\n } = useAudioPlayer(\n makeTrackId(message),\n getMediaDuration(message)!,\n isVoice ? 'voice' : 'audio',\n mediaData,\n undefined,\n mediaMetadata,\n undefined,\n true,\n undefined,\n undefined,\n isMessageLocal(message),\n true,\n );\n\n // Prevent refresh by accidentally rotating device when listening to a voice message\n const isVoicePlaying = isVoice && isPlaying;\n useEffect(() => {\n if (!isVoicePlaying) {\n return undefined;\n }\n\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, [isVoicePlaying]);\n\n const handleClick = useCallback(() => {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }, [focusMessage, message.chatId, message.id]);\n\n const handleClose = useCallback(() => {\n if (isPlaying) {\n playPause();\n }\n closeAudioPlayer();\n clearMediaSession();\n stop();\n }, [closeAudioPlayer, isPlaying, playPause, stop]);\n\n const handleVolumeChange = useCallback((value: number) => {\n setAudioPlayerVolume({ volume: value / 100 });\n setAudioPlayerMuted({ isMuted: false });\n\n setVolume(value / 100);\n }, [setAudioPlayerMuted, setAudioPlayerVolume, setVolume]);\n\n const handleVolumeClick = useCallback(() => {\n if (IS_TOUCH_ENV && !IS_IOS) return;\n toggleMuted();\n setAudioPlayerMuted({ isMuted: !isMuted });\n }, [isMuted, setAudioPlayerMuted, toggleMuted]);\n\n const handlePlaybackClick = useCallback(() => {\n if (playbackRate === 1) {\n setPlaybackRate(FAST_PLAYBACK_RATE);\n setAudioPlayerPlaybackRate({ playbackRate: FAST_PLAYBACK_RATE });\n } else {\n setPlaybackRate(1);\n setAudioPlayerPlaybackRate({ playbackRate: 1 });\n }\n }, [playbackRate, setAudioPlayerPlaybackRate, setPlaybackRate]);\n\n const volumeIcon = useMemo(() => {\n if (volume === 0 || isMuted) return 'icon-muted';\n if (volume < 0.3) return 'icon-volume-1';\n if (volume < 0.6) return 'icon-volume-2';\n return 'icon-volume-3';\n }, [volume, isMuted]);\n\n if (noUi) {\n return undefined;\n }\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n\n
\n {audio ? renderAudio(audio) : renderVoice(lang('AttachAudio'), senderName)}\n \n
\n\n \n \n {!IS_IOS && (\n <>\n
\n
\n \n
\n \n )}\n \n\n {isVoice && (\n \n \n \n )}\n\n \n \n \n
\n );\n};\n\nfunction renderAudio(audio: ApiAudio) {\n const { title, performer, fileName } = audio;\n\n return (\n <>\n
{renderText(title || fileName)}
\n {performer && (\n
{renderText(performer)}
\n )}\n \n );\n}\n\nfunction renderVoice(subtitle: string, senderName?: string) {\n return (\n <>\n
{senderName && renderText(senderName)}
\n
{subtitle}
\n \n );\n}\n\nexport default withGlobal(\n (global, { message }): StateProps => {\n const sender = selectSender(global, message);\n const chat = selectChat(global, message.chatId);\n const { volume, playbackRate, isMuted } = global.audioPlayer;\n\n return {\n sender,\n chat,\n volume,\n playbackRate,\n isMuted,\n };\n },\n)(AudioPlayer);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiGroupCall, ApiUser } from '../../../api/types';\n\nimport { selectChatGroupCall } from '../../../modules/selectors/calls';\nimport buildClassName from '../../../util/buildClassName';\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\n\nimport './GroupCallTopPane.scss';\n\ntype OwnProps = {\n chatId: string;\n hasPinnedOffset: boolean;\n};\n\ntype StateProps = {\n groupCall?: ApiGroupCall;\n isActive: boolean;\n usersById: Record;\n chatsById: Record;\n};\n\nconst GroupCallTopPane: FC = ({\n chatId,\n isActive,\n groupCall,\n hasPinnedOffset,\n usersById,\n chatsById,\n}) => {\n const {\n joinGroupCall,\n subscribeToGroupCallUpdates,\n } = getDispatch();\n\n const lang = useLang();\n\n const handleJoinGroupCall = useCallback(() => {\n joinGroupCall({\n chatId,\n });\n }, [joinGroupCall, chatId]);\n\n const participants = groupCall?.participants;\n\n const fetchedParticipants = useMemo(() => {\n if (participants) {\n return Object.values(participants).filter((_, i) => i < 3).map(({ id, isUser }) => {\n if (isUser) {\n if (!usersById[id]) {\n return undefined;\n }\n return { user: usersById[id] };\n } else {\n if (!chatsById[id]) {\n return undefined;\n }\n return { chat: chatsById[id] };\n }\n }).filter(Boolean);\n } else return [];\n }, [chatsById, participants, usersById]);\n\n useEffect(() => {\n if (!groupCall?.id) return undefined;\n if (!isActive && groupCall.isLoaded) return undefined;\n\n subscribeToGroupCallUpdates({\n id: groupCall.id,\n subscribed: true,\n });\n\n return () => {\n subscribeToGroupCallUpdates({\n id: groupCall.id,\n subscribed: false,\n });\n };\n }, [groupCall?.id, groupCall?.isLoaded, isActive, subscribeToGroupCallUpdates]);\n\n if (!groupCall) return undefined;\n\n return (\n \n
\n {lang('VoipGroupVoiceChat')}\n {lang('Participants', groupCall.participantsCount || 0, 'i')}\n
\n
\n {fetchedParticipants.map((p) => {\n if (!p) return undefined;\n if (p.user) {\n return ;\n } else {\n return ;\n }\n })}\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }) => {\n const chat = selectChat(global, chatId)!;\n const groupCall = selectChatGroupCall(global, chatId);\n return {\n groupCall,\n usersById: global.users.byId,\n chatsById: global.chats.byId,\n activeGroupCallId: global.groupCalls.activeGroupCallId,\n isActive: ((!groupCall ? (chat && chat.isCallNotEmpty && chat.isCallActive)\n : (groupCall.participantsCount > 0 && groupCall.isLoaded)))\n && (global.groupCalls.activeGroupCallId !== groupCall?.id),\n };\n },\n)(GroupCallTopPane));\n","import React, {\n FC, useCallback, useMemo, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\nimport cycleRestrict from '../../util/cycleRestrict';\n\nimport { MessageListType } from '../../global/types';\nimport {\n ApiMessage,\n ApiChat,\n ApiUser,\n ApiTypingStatus,\n MAIN_THREAD_ID, ApiUpdateConnectionStateType,\n} from '../../api/types';\n\nimport {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n EDITABLE_INPUT_ID,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n SAFE_SCREEN_WIDTH_FOR_CHAT_INFO,\n} from '../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TABLET_COLUMN_LAYOUT } from '../../util/environment';\nimport {\n isUserId,\n getMessageKey,\n getChatTitle,\n getSenderTitle,\n} from '../../modules/helpers';\nimport {\n selectChat,\n selectChatMessage,\n selectAllowedMessageActions,\n selectIsRightColumnShown,\n selectThreadTopMessageId,\n selectThreadInfo,\n selectChatMessages,\n selectPinnedIds,\n selectIsChatWithSelf,\n selectForwardedSender,\n selectScheduledIds,\n selectIsInSelectMode,\n selectIsChatWithBot,\n selectCountNotMutedUnread,\n} from '../../modules/selectors';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useWindowSize from '../../hooks/useWindowSize';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../hooks/useCurrentOrPrev';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport useBrowserOnline from '../../hooks/useBrowserOnline';\n\nimport PrivateChatInfo from '../common/PrivateChatInfo';\nimport GroupChatInfo from '../common/GroupChatInfo';\nimport Transition from '../ui/Transition';\nimport Button from '../ui/Button';\nimport HeaderActions from './HeaderActions';\nimport HeaderPinnedMessage from './HeaderPinnedMessage';\nimport AudioPlayer from './AudioPlayer';\nimport GroupCallTopPane from '../calls/group/GroupCallTopPane';\n\nimport './MiddleHeader.scss';\n\nconst ANIMATION_DURATION = 350;\nconst BACK_BUTTON_INACTIVE_TIME = 450;\n\ntype OwnProps = {\n chatId: string;\n threadId: number;\n messageListType: MessageListType;\n isReady?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n pinnedMessageIds?: number[] | number;\n messagesById?: Record;\n canUnpin?: boolean;\n topMessageSender?: ApiChat | ApiUser;\n typingStatus?: ApiTypingStatus;\n isSelectModeActive?: boolean;\n isLeftColumnShown?: boolean;\n isRightColumnShown?: boolean;\n audioMessage?: ApiMessage;\n messagesCount?: number;\n isChatWithSelf?: boolean;\n isChatWithBot?: boolean;\n lastSyncTime?: number;\n shouldSkipHistoryAnimations?: boolean;\n currentTransitionKey: number;\n connectionState?: ApiUpdateConnectionStateType;\n};\n\nconst MiddleHeader: FC = ({\n chatId,\n threadId,\n messageListType,\n isReady,\n pinnedMessageIds,\n messagesById,\n canUnpin,\n topMessageSender,\n typingStatus,\n isSelectModeActive,\n isLeftColumnShown,\n isRightColumnShown,\n audioMessage,\n chat,\n messagesCount,\n isChatWithSelf,\n isChatWithBot,\n lastSyncTime,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n connectionState,\n}) => {\n const {\n openChatWithInfo,\n pinMessage,\n focusMessage,\n openChat,\n openPreviousChat,\n loadPinnedMessages,\n toggleLeftColumn,\n exitMessageSelectMode,\n } = getDispatch();\n\n const lang = useLang();\n const isBackButtonActive = useRef(true);\n\n const [pinnedMessageIndex, setPinnedMessageIndex] = useState(0);\n const pinnedMessageId = Array.isArray(pinnedMessageIds) ? pinnedMessageIds[pinnedMessageIndex] : pinnedMessageIds;\n const pinnedMessage = messagesById && pinnedMessageId ? messagesById[pinnedMessageId] : undefined;\n const pinnedMessagesCount = Array.isArray(pinnedMessageIds)\n ? pinnedMessageIds.length : (pinnedMessageIds ? 1 : undefined);\n const chatTitleLength = chat && getChatTitle(lang, chat).length;\n const topMessageTitle = topMessageSender ? getSenderTitle(lang, topMessageSender) : undefined;\n\n useEffect(() => {\n if (threadId === MAIN_THREAD_ID && lastSyncTime && isReady) {\n loadPinnedMessages({ chatId });\n }\n }, [chatId, loadPinnedMessages, lastSyncTime, threadId, isReady]);\n\n // Reset pinned index when switching chats and pinning/unpinning\n useEffect(() => {\n setPinnedMessageIndex(0);\n }, [pinnedMessageIds]);\n\n useEnsureMessage(chatId, pinnedMessageId, pinnedMessage);\n\n const { width: windowWidth } = useWindowSize();\n\n const isLeftColumnHideable = windowWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN;\n const shouldShowCloseButton = IS_TABLET_COLUMN_LAYOUT && isLeftColumnShown;\n\n // eslint-disable-next-line no-null/no-null\n const componentRef = useRef(null);\n const shouldAnimateTools = useRef(true);\n\n const handleHeaderClick = useCallback(() => {\n openChatWithInfo({ id: chatId });\n }, [openChatWithInfo, chatId]);\n\n const handleUnpinMessage = useCallback((messageId: number) => {\n pinMessage({ chatId, messageId, isUnpin: true });\n }, [pinMessage, chatId]);\n\n const handlePinnedMessageClick = useCallback((): void => {\n if (pinnedMessage) {\n focusMessage({ chatId: pinnedMessage.chatId, threadId, messageId: pinnedMessage.id });\n\n const newIndex = cycleRestrict(pinnedMessagesCount || 1, pinnedMessageIndex + 1);\n setPinnedMessageIndex(newIndex);\n }\n }, [pinnedMessage, focusMessage, threadId, pinnedMessagesCount, pinnedMessageIndex]);\n\n const handleAllPinnedClick = useCallback(() => {\n openChat({ id: chatId, threadId: MAIN_THREAD_ID, type: 'pinned' });\n }, [openChat, chatId]);\n\n const setBackButtonActive = useCallback(() => {\n setTimeout(() => {\n isBackButtonActive.current = true;\n }, BACK_BUTTON_INACTIVE_TIME);\n }, []);\n\n const handleBackClick = useCallback((e: React.MouseEvent) => {\n if (!isBackButtonActive.current) return;\n\n // Workaround for missing UI when quickly clicking the Back button\n isBackButtonActive.current = false;\n if (IS_SINGLE_COLUMN_LAYOUT) {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID);\n if (messageInput) {\n messageInput.blur();\n }\n }\n\n if (isSelectModeActive) {\n exitMessageSelectMode();\n setBackButtonActive();\n return;\n }\n\n if (threadId === MAIN_THREAD_ID && messageListType === 'thread' && currentTransitionKey === 0) {\n if (IS_SINGLE_COLUMN_LAYOUT || shouldShowCloseButton) {\n e.stopPropagation(); // Stop propagation to prevent chat re-opening on tablets\n openChat({ id: undefined });\n } else {\n toggleLeftColumn();\n }\n\n setBackButtonActive();\n\n return;\n }\n\n openPreviousChat();\n setBackButtonActive();\n }, [\n threadId, messageListType, currentTransitionKey, isSelectModeActive, openPreviousChat, shouldShowCloseButton,\n openChat, toggleLeftColumn, exitMessageSelectMode, setBackButtonActive,\n ]);\n\n const unreadCount = useMemo(() => {\n if (!isLeftColumnHideable) {\n return undefined;\n }\n\n return selectCountNotMutedUnread(getGlobal()) || undefined;\n }, [isLeftColumnHideable]);\n\n const canToolsCollideWithChatInfo = (\n windowWidth >= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_CHAT_INFO\n ) || (\n windowWidth > MOBILE_SCREEN_MAX_WIDTH\n && windowWidth < MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n && (!chatTitleLength || chatTitleLength > 30)\n );\n const shouldUseStackedToolsClass = canToolsCollideWithChatInfo || (\n windowWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n && windowWidth < SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n );\n\n const {\n shouldRender: shouldRenderAudioPlayer,\n transitionClassNames: audioPlayerClassNames,\n } = useShowTransition(Boolean(audioMessage));\n\n const renderingAudioMessage = useCurrentOrPrev(audioMessage);\n\n const {\n shouldRender: shouldRenderPinnedMessage,\n transitionClassNames: pinnedMessageClassNames,\n } = useShowTransition(Boolean(pinnedMessage));\n\n const renderingPinnedMessage = useCurrentOrPrev(pinnedMessage, true);\n const renderingPinnedMessagesCount = useCurrentOrPrev(pinnedMessagesCount, true);\n const renderingCanUnpin = useCurrentOrPrev(canUnpin, true);\n const renderingPinnedMessageTitle = useCurrentOrPrev(topMessageTitle);\n\n const canRevealTools = (shouldRenderPinnedMessage && renderingPinnedMessage)\n || (shouldRenderAudioPlayer && renderingAudioMessage);\n\n // Logic for transition to and from custom display of AudioPlayer/PinnedMessage on smaller screens\n useEffect(() => {\n const componentEl = componentRef.current;\n if (!componentEl) {\n return;\n }\n\n if (!shouldUseStackedToolsClass || !canRevealTools) {\n componentEl.classList.remove('tools-stacked', 'animated');\n shouldAnimateTools.current = true;\n return;\n }\n\n if (isRightColumnShown || canToolsCollideWithChatInfo) {\n if (shouldAnimateTools.current) {\n componentEl.classList.add('tools-stacked', 'animated');\n shouldAnimateTools.current = false;\n }\n\n // Remove animation class to prevent it messing up the show transitions\n setTimeout(() => {\n componentEl.classList.remove('animated');\n }, ANIMATION_DURATION);\n } else {\n componentEl.classList.remove('tools-stacked');\n shouldAnimateTools.current = true;\n }\n }, [shouldUseStackedToolsClass, canRevealTools, canToolsCollideWithChatInfo, isRightColumnShown]);\n\n const isBrowserOnline = useBrowserOnline();\n const isConnecting = (!isBrowserOnline || connectionState === 'connectionStateConnecting')\n && (IS_SINGLE_COLUMN_LAYOUT || (IS_TABLET_COLUMN_LAYOUT && !shouldShowCloseButton));\n\n function renderInfo() {\n if (isConnecting) {\n return (\n <>\n {renderBackButton()}\n

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

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

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

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

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

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

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

\n \n ) : undefined\n );\n }\n\n function renderMainThreadInfo() {\n return (\n <>\n {(isLeftColumnHideable || currentTransitionKey > 0) && renderBackButton(shouldShowCloseButton, true)}\n
\n {isUserId(chatId) ? (\n \n ) : (\n \n )}\n
\n \n );\n }\n\n function renderBackButton(asClose = false, withUnreadCount = false) {\n return (\n
\n \n
\n \n {withUnreadCount && unreadCount && (\n
\n {formatIntegerCompact(unreadCount)}\n
\n )}\n
\n );\n }\n\n const isAudioPlayerRendered = Boolean(shouldRenderAudioPlayer && renderingAudioMessage);\n\n return (\n
\n \n {renderInfo}\n \n\n \n\n {shouldRenderPinnedMessage && renderingPinnedMessage && (\n \n )}\n
\n {isAudioPlayerRendered && (\n \n )}\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId, messageListType }): StateProps => {\n const { isLeftColumnShown, lastSyncTime, shouldSkipHistoryAnimations } = global;\n const chat = selectChat(global, chatId);\n\n const { typingStatus } = chat || {};\n\n const { chatId: audioChatId, messageId: audioMessageId } = global.audioPlayer;\n const audioMessage = audioChatId && audioMessageId\n ? selectChatMessage(global, audioChatId, audioMessageId)\n : undefined;\n\n let messagesCount: number | undefined;\n if (messageListType === 'pinned') {\n const pinnedIds = selectPinnedIds(global, chatId);\n messagesCount = pinnedIds?.length;\n } else if (messageListType === 'scheduled') {\n const scheduledIds = selectScheduledIds(global, chatId);\n messagesCount = scheduledIds?.length;\n } else if (messageListType === 'thread' && threadId !== MAIN_THREAD_ID) {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n messagesCount = threadInfo?.messagesCount || 0;\n }\n\n const state: StateProps = {\n typingStatus,\n isLeftColumnShown,\n isRightColumnShown: selectIsRightColumnShown(global),\n isSelectModeActive: selectIsInSelectMode(global),\n audioMessage,\n chat,\n messagesCount,\n isChatWithSelf: selectIsChatWithSelf(global, chatId),\n isChatWithBot: chat && selectIsChatWithBot(global, chat),\n lastSyncTime,\n shouldSkipHistoryAnimations,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n connectionState: global.connectionState,\n };\n\n const messagesById = selectChatMessages(global, chatId);\n if (messageListType !== 'thread' || !messagesById) {\n return state;\n }\n\n Object.assign(state, { messagesById });\n\n if (threadId !== MAIN_THREAD_ID) {\n const pinnedMessageId = selectThreadTopMessageId(global, chatId, threadId);\n const message = pinnedMessageId ? selectChatMessage(global, chatId, pinnedMessageId) : undefined;\n const topMessageSender = message ? selectForwardedSender(global, message) : undefined;\n\n return {\n ...state,\n pinnedMessageIds: pinnedMessageId,\n canUnpin: false,\n topMessageSender,\n };\n }\n\n const pinnedMessageIds = selectPinnedIds(global, chatId);\n if (pinnedMessageIds?.length) {\n const firstPinnedMessage = messagesById[pinnedMessageIds[0]];\n const {\n canUnpin,\n } = (firstPinnedMessage && selectAllowedMessageActions(global, firstPinnedMessage, threadId)) || {};\n\n return {\n ...state,\n pinnedMessageIds,\n canUnpin,\n };\n }\n\n return state;\n },\n)(MiddleHeader));\n","import { ApiMessage } from '../../../api/types';\nimport { IAlbum } from '../../../types';\n\nimport { getDayStart } from '../../../util/dateFormat';\nimport { isActionMessage } from '../../../modules/helpers';\n\ntype SenderGroup = (ApiMessage | IAlbum)[];\n\nconst GROUP_INTERVAL_SECONDS = 600; // 10 minutes\n\nexport type MessageDateGroup = {\n originalDate: number;\n datetime: number;\n senderGroups: SenderGroup[];\n};\n\nexport function isAlbum(messageOrAlbum: ApiMessage | IAlbum): messageOrAlbum is IAlbum {\n return 'albumId' in messageOrAlbum;\n}\n\nexport function groupMessages(messages: ApiMessage[], firstUnreadId?: number) {\n let currentSenderGroup: SenderGroup = [];\n let currentDateGroup = {\n originalDate: messages[0].date,\n datetime: Number(getDayStart(messages[0].date * 1000)),\n senderGroups: [currentSenderGroup],\n };\n let currentAlbum: IAlbum | undefined;\n\n const dateGroups: MessageDateGroup[] = [currentDateGroup];\n\n messages.forEach((message, index) => {\n if (message.isInAlbum) {\n if (!currentAlbum) {\n currentAlbum = {\n albumId: message.groupedId!,\n messages: [message],\n mainMessage: message,\n };\n } else {\n currentAlbum.messages.push(message);\n if (message.content.text) {\n currentAlbum.mainMessage = message;\n }\n }\n } else {\n currentSenderGroup.push(message);\n }\n\n const nextMessage = messages[index + 1];\n\n if (\n currentAlbum\n && (!nextMessage || !nextMessage.groupedId || nextMessage.groupedId !== currentAlbum.albumId)\n ) {\n currentSenderGroup.push(currentAlbum);\n currentAlbum = undefined;\n }\n if (nextMessage) {\n const nextMessageDayStartsAt = Number(getDayStart(nextMessage.date * 1000));\n if (currentDateGroup.datetime !== nextMessageDayStartsAt) {\n currentDateGroup = {\n originalDate: nextMessage.date,\n datetime: nextMessageDayStartsAt,\n senderGroups: [],\n };\n dateGroups.push(currentDateGroup);\n\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n } else if (\n nextMessage.id === firstUnreadId\n || message.senderId !== nextMessage.senderId\n || message.isOutgoing !== nextMessage.isOutgoing\n || isActionMessage(message)\n || isActionMessage(nextMessage)\n || (\n message.forwardInfo && nextMessage.forwardInfo\n && (\n message.forwardInfo.senderUserId !== nextMessage.forwardInfo.senderUserId\n || message.forwardInfo.fromChatId !== nextMessage.forwardInfo.fromChatId\n || message.forwardInfo.hiddenUserName !== nextMessage.forwardInfo.hiddenUserName\n )\n )\n || message.inlineButtons\n || nextMessage.inlineButtons\n || (nextMessage.date - message.date) > GROUP_INTERVAL_SECONDS\n ) {\n currentSenderGroup = [];\n currentDateGroup.senderGroups.push(currentSenderGroup);\n }\n }\n });\n\n return dateGroups;\n}\n","import { RefObject } from 'react';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { MessageListType } from '../../../global/types';\n\nimport { IS_ANDROID, IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useBackgroundMode from '../../../hooks/useBackgroundMode';\n\nconst INTERSECTION_THROTTLE_FOR_MEDIA = IS_ANDROID ? 1000 : 350;\nconst INTERSECTION_MARGIN_FOR_MEDIA = IS_SINGLE_COLUMN_LAYOUT ? 300 : 500;\nconst INTERSECTION_THROTTLE_FOR_READING = 150;\n\nexport default function useMessageObservers(\n type: MessageListType,\n containerRef: RefObject,\n memoFirstUnreadIdRef: { current: number | undefined },\n) {\n const { markMessageListRead, markMessagesRead } = getDispatch();\n\n const {\n observe: observeIntersectionForMedia,\n } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n margin: INTERSECTION_MARGIN_FOR_MEDIA,\n });\n\n const {\n observe: observeIntersectionForReading, freeze: freezeForReading, unfreeze: unfreezeForReading,\n } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_READING,\n }, (entries) => {\n if (type !== 'thread') {\n return;\n }\n\n let maxId = 0;\n const mentionIds: number[] = [];\n\n entries.forEach((entry) => {\n const { isIntersecting, target } = entry;\n\n if (!isIntersecting) {\n return;\n }\n\n const { dataset } = target as HTMLDivElement;\n\n const messageId = Number(dataset.lastMessageId || dataset.messageId);\n if (messageId > maxId) {\n maxId = messageId;\n }\n\n if (dataset.hasUnreadMention) {\n mentionIds.push(messageId);\n }\n });\n\n if (memoFirstUnreadIdRef.current && maxId >= memoFirstUnreadIdRef.current) {\n markMessageListRead({ maxId });\n }\n\n if (mentionIds.length) {\n markMessagesRead({ messageIds: mentionIds });\n }\n });\n\n useBackgroundMode(freezeForReading, unfreezeForReading);\n\n const { observe: observeIntersectionForAnimatedStickers } = useIntersectionObserver({\n rootRef: containerRef,\n throttleMs: INTERSECTION_THROTTLE_FOR_MEDIA,\n });\n\n return {\n observeIntersectionForMedia,\n observeIntersectionForReading,\n observeIntersectionForAnimatedStickers,\n };\n}\n","import { ApiMessage } from '../../../../api/types';\n\nimport { getMessageContent } from '../../../../modules/helpers';\n\nexport function isEmojiOnlyMessage(customShape?: boolean | number) {\n return typeof customShape === 'number';\n}\n\nexport function buildContentClassName(\n message: ApiMessage,\n {\n hasReply,\n customShape,\n isLastInGroup,\n asForwarded,\n hasThread,\n forceSenderName,\n hasComments,\n hasActionButton,\n }: {\n hasReply?: boolean;\n customShape?: boolean | number;\n isLastInGroup?: boolean;\n asForwarded?: boolean;\n hasThread?: boolean;\n forceSenderName?: boolean;\n hasComments?: boolean;\n hasActionButton?: boolean;\n } = {},\n) {\n const {\n text, photo, video, audio, voice, document, poll, webPage, contact,\n } = getMessageContent(message);\n\n const classNames = ['message-content'];\n const isMedia = photo || video;\n const isMediaWithNoText = isMedia && !text;\n const isViaBot = Boolean(message.viaBotId);\n\n if (isEmojiOnlyMessage(customShape)) {\n classNames.push(`emoji-only emoji-only-${customShape}`);\n } else if (text) {\n classNames.push('text');\n }\n\n if (hasActionButton) {\n classNames.push('has-action-button');\n }\n\n if (customShape) {\n classNames.push('custom-shape');\n if (video?.isRound) {\n classNames.push('round');\n }\n\n if (hasComments) {\n classNames.push('has-comments');\n }\n }\n if (photo || video) {\n classNames.push('media');\n } else if (audio) {\n classNames.push('audio');\n } else if (voice) {\n classNames.push('voice');\n } else if (document) {\n classNames.push('document');\n } else if (contact) {\n classNames.push('contact');\n } else if (poll) {\n classNames.push('poll');\n } else if (webPage) {\n classNames.push('web-page');\n\n if (webPage.photo || webPage.video) {\n classNames.push('media');\n }\n }\n\n if (asForwarded) {\n classNames.push('is-forwarded');\n }\n\n if (hasReply) {\n classNames.push('is-reply');\n }\n\n if (hasThread) {\n classNames.push('has-replies');\n }\n\n if (isViaBot) {\n classNames.push('is-via-bot');\n }\n\n if (forceSenderName) {\n classNames.push('force-sender-name');\n }\n\n if (!customShape) {\n classNames.push('has-shadow');\n\n if (isMedia && hasComments) {\n classNames.push('has-background');\n }\n\n if (hasReply || asForwarded || !isMediaWithNoText || isViaBot || forceSenderName) {\n classNames.push('has-solid-background');\n }\n\n if (isLastInGroup && (photo || !isMediaWithNoText)) {\n classNames.push('has-appendix');\n }\n }\n\n return classNames.join(' ');\n}\n","import { ApiMessage } from '../../../../api/types';\nimport { calculateInlineImageDimensions, calculateVideoDimensions } from '../../../common/helpers/mediaDimensions';\nimport {\n getMessageText,\n getMessagePhoto,\n getMessageWebPagePhoto,\n isForwardedMessage,\n isOwnMessage,\n getMessageVideo,\n} from '../../../../modules/helpers';\n\nconst MIN_MEDIA_WIDTH = 100;\nconst MIN_MEDIA_WIDTH_WITH_COMMENTS = 238;\nconst MIN_MEDIA_WIDTH_WITH_TEXT = 175;\nconst MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS = 238;\nconst MIN_MEDIA_HEIGHT = 90;\nconst SMALL_IMAGE_THRESHOLD = 12;\n\nexport function getMinMediaWidth(hasText?: boolean, hasCommentButton?: boolean) {\n return hasText\n ? (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_TEXT_AND_COMMENTS : MIN_MEDIA_WIDTH_WITH_TEXT)\n : (hasCommentButton ? MIN_MEDIA_WIDTH_WITH_COMMENTS : MIN_MEDIA_WIDTH);\n}\n\nexport function calculateMediaDimensions(message: ApiMessage, noAvatars?: boolean) {\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const photo = getMessagePhoto(message) || getMessageWebPagePhoto(message);\n const video = getMessageVideo(message);\n\n const isWebPagePhoto = Boolean(getMessageWebPagePhoto(message));\n const { width, height } = photo\n ? calculateInlineImageDimensions(photo, isOwn, isForwarded, isWebPagePhoto, noAvatars)\n : calculateVideoDimensions(video!, isOwn, isForwarded, noAvatars);\n\n const hasText = Boolean(getMessageText(message));\n const minMediaWidth = getMinMediaWidth(hasText);\n\n let stretchFactor = 1;\n if (width < minMediaWidth && minMediaWidth - width < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = minMediaWidth / width;\n }\n if (height * stretchFactor < MIN_MEDIA_HEIGHT && MIN_MEDIA_HEIGHT - height * stretchFactor < SMALL_IMAGE_THRESHOLD) {\n stretchFactor = MIN_MEDIA_HEIGHT / height;\n }\n\n const finalWidth = Math.round(width * stretchFactor);\n const finalHeight = Math.round(height * stretchFactor);\n\n return {\n width: finalWidth,\n height: finalHeight,\n isSmall: finalWidth < minMediaWidth || finalHeight < MIN_MEDIA_HEIGHT,\n };\n}\n","/* eslint-disable no-bitwise */\n// Based on\n// https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/ui/grouped_layout.cpp\n// https://github.com/overtake/TelegramSwift/blob/master/Telegram-Mac/GroupedLayout.swift#L83\n\nimport { IAlbum } from '../../../../types';\nimport { ApiMessage, ApiDimensions } from '../../../../api/types';\n\nimport { getAvailableWidth, REM } from '../../../common/helpers/mediaDimensions';\nimport { calculateMediaDimensions } from './mediaDimensions';\n\nexport const AlbumRectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8,\n};\n\ntype IAttempt = {\n lineCounts: number[];\n heights: number[];\n};\nexport type IMediaDimensions = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\ntype IMediaLayout = {\n dimensions: IMediaDimensions;\n sides: number;\n};\ntype ILayoutParams = {\n ratios: number[];\n proportions: string;\n averageRatio: number;\n maxWidth: number;\n minWidth: number;\n maxHeight: number;\n spacing: number;\n};\nexport type IAlbumLayout = {\n layout: IMediaLayout[];\n containerStyle: ApiDimensions;\n};\n\nfunction getRatios(messages: ApiMessage[]) {\n return messages.map(\n (message) => {\n const dimensions = calculateMediaDimensions(message) as ApiDimensions;\n\n return dimensions.width / dimensions.height;\n },\n );\n}\n\nfunction getProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2 ? 'w' : (ratio < 0.8 ? 'n' : 'q'))).join('');\n}\n\nfunction getAverageRatio(ratios: number[]) {\n return ratios.reduce((result, ratio) => ratio + result, 1) / ratios.length;\n}\n\nfunction accumulate(list: number[], initValue: number) {\n return list.reduce((accumulator, item) => accumulator + item, initValue);\n}\n\nfunction clamp(num: number, low: number, high: number) {\n return num < low ? low : (num > high ? high : num);\n}\n\nfunction cropRatios(ratios: number[], averageRatio: number) {\n return ratios.map((ratio) => (averageRatio > 1.1 ? clamp(ratio, 1, 2.75) : clamp(ratio, 0.6667, 1)));\n}\n\nfunction calculateContainerSize(layout: IMediaLayout[]) {\n const styles: ApiDimensions = { width: 0, height: 0 };\n layout.forEach(({\n dimensions,\n sides,\n }) => {\n if (sides & AlbumRectPart.Right) {\n styles.width = dimensions.width + dimensions.x;\n }\n if (sides & AlbumRectPart.Bottom) {\n styles.height = dimensions.height + dimensions.y;\n }\n });\n\n return styles;\n}\n\nexport function calculateAlbumLayout(\n isOwn: boolean,\n isForwarded: boolean,\n noAvatars: boolean,\n album: IAlbum,\n): IAlbumLayout {\n const spacing = 2;\n const ratios = getRatios(album.messages);\n const proportions = getProportions(ratios);\n const averageRatio = getAverageRatio(ratios);\n const albumCount = ratios.length;\n const forceCalc = ratios.some((ratio) => ratio > 2);\n const maxWidth = getAvailableWidth(isOwn, isForwarded, false, noAvatars) - (isForwarded ? 2.5 : 0) * REM;\n const maxHeight = maxWidth;\n\n let layout;\n\n const params = {\n ratios,\n proportions,\n averageRatio,\n maxWidth,\n minWidth: 100,\n maxHeight,\n spacing,\n };\n\n if (albumCount >= 5 || forceCalc) {\n layout = layoutWithComplexLayouter(params);\n } else if (albumCount === 2) {\n layout = layoutTwo(params);\n } else if (albumCount === 3) {\n layout = layoutThree(params);\n } else {\n layout = layoutFour(params);\n }\n\n return {\n layout,\n containerStyle: calculateContainerSize(layout),\n };\n}\n\nfunction layoutWithComplexLayouter({\n ratios: originalRatios,\n averageRatio,\n maxWidth,\n minWidth,\n spacing,\n maxHeight = (4 * maxWidth) / 3,\n}: ILayoutParams) {\n const ratios = cropRatios(originalRatios, averageRatio);\n const count = originalRatios.length;\n const result = new Array(count);\n const attempts: IAttempt[] = [];\n\n const multiHeight = (offset: number, attemptCount: number) => {\n const attemptRatios = ratios.slice(offset, offset + attemptCount);\n const sum = accumulate(attemptRatios, 0);\n\n return (maxWidth - (attemptCount - 1) * spacing) / sum;\n };\n\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n lineCounts.forEach((currentCount) => {\n heights.push(multiHeight(offset, currentCount));\n offset += currentCount;\n });\n\n attempts.push({\n lineCounts,\n heights,\n });\n };\n\n for (let first = 1; first !== count; ++first) {\n const second = count - first;\n if (first <= 3 && second <= 3) {\n pushAttempt([first, second]);\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n const third = count - first - second;\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n pushAttempt([first, second, third]);\n }\n }\n }\n\n for (let first = 1; first !== count - 1; ++first) {\n for (let second = 1; second !== count - first; ++second) {\n for (let third = 1; third !== count - first - second; ++third) {\n const fourth = count - first - second - third;\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 4) {\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n }\n\n let optimalAttempt: IAttempt | undefined;\n let optimalDiff = 0;\n for (let i = 0; i < attempts.length; i++) {\n const {\n heights,\n lineCounts,\n } = attempts[i];\n const lineCount = lineCounts.length;\n const totalHeight = accumulate(heights, 0) + spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const bad1 = minLineHeight < minWidth ? 1.5 : 1;\n const bad2 = (() => {\n for (let line = 1; line !== lineCount; ++line) {\n if (lineCounts[line - 1] > lineCounts[line]) {\n return 1.5;\n }\n }\n\n return 1;\n })();\n const diff = Math.abs(totalHeight - maxHeight) * bad1 * bad2;\n\n if (!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempts[i];\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt!.lineCounts;\n const optimalHeights = optimalAttempt!.heights;\n const rowCount = optimalCounts.length;\n let index = 0;\n let y = 0;\n for (let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n let x = 0;\n\n for (let col = 0; col !== colCount; ++col) {\n const sides = AlbumRectPart.None\n | (row === 0 ? AlbumRectPart.Top : AlbumRectPart.None)\n | (row === rowCount - 1 ? AlbumRectPart.Bottom : AlbumRectPart.None)\n | (col === 0 ? AlbumRectPart.Left : AlbumRectPart.None)\n | (col === colCount - 1 ? AlbumRectPart.Right : AlbumRectPart.None);\n const ratio = ratios[index];\n const width = col === colCount - 1 ? maxWidth - x : Math.round(ratio * lineHeight);\n result[index] = {\n dimensions: {\n x,\n y,\n width,\n height,\n },\n sides,\n };\n x += width + spacing;\n ++index;\n }\n y += height + spacing;\n }\n\n return result;\n}\n\nfunction layoutTwo(params: ILayoutParams) {\n const {\n ratios,\n proportions,\n averageRatio,\n } = params;\n return proportions === 'ww' && averageRatio > 1.4 && ratios[1] - ratios[0] < 0.2\n ? layoutTwoTopBottom(params)\n : proportions === 'ww' || proportions === 'qq'\n ? layoutTwoLeftRightEqual(params)\n : layoutTwoLeftRight(params);\n}\n\nfunction layoutTwoTopBottom(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const height = Math.round(Math.min(maxWidth / ratios[0], Math.min(maxWidth / ratios[1], (maxHeight - spacing) / 2)));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: height + spacing,\n width: maxWidth,\n height,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutTwoLeftRightEqual(params: ILayoutParams) {\n const {\n ratios,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const width = (maxWidth - spacing) / 2;\n const height = Math.round(Math.min(width / ratios[0], Math.min(width / ratios[1], maxHeight)));\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: width + spacing,\n y: 0,\n width,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutTwoLeftRight(params: ILayoutParams) {\n const {\n ratios,\n minWidth,\n maxWidth,\n spacing,\n maxHeight,\n } = params;\n const minimalWidth = Math.round(1.5 * minWidth);\n const secondWidth = Math.min(\n Math.round(\n Math.max(\n 0.4 * (maxWidth - spacing),\n (maxWidth - spacing) / ratios[0] / (1 / ratios[0] + 1 / ratios[1]),\n ),\n ),\n maxWidth - spacing - minimalWidth,\n );\n const firstWidth = maxWidth - secondWidth - spacing;\n const height = Math.min(maxHeight, Math.round(Math.min(firstWidth / ratios[0], secondWidth / ratios[1])));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: firstWidth + spacing,\n y: 0,\n width: secondWidth,\n height,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutThree(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'n'\n ? layoutThreeLeftAndOther(params)\n : layoutThreeTopAndOther(params);\n}\n\nfunction layoutThreeLeftAndOther(params: ILayoutParams) {\n const {\n maxHeight,\n spacing,\n ratios,\n maxWidth,\n minWidth,\n } = params;\n const firstHeight = maxHeight;\n const thirdHeight = Math.round(\n Math.min(\n (maxHeight - spacing) / 2,\n (ratios[1] * (maxWidth - spacing)) / (ratios[2] + ratios[1]),\n ),\n );\n const secondHeight = firstHeight - thirdHeight - spacing;\n const rightWidth = Math.max(\n minWidth,\n Math.round(\n Math.min(\n (maxWidth - spacing) / 2,\n Math.min(\n thirdHeight * ratios[2],\n secondHeight * ratios[1],\n ),\n ),\n ),\n );\n const leftWidth = Math.min(Math.round(firstHeight * ratios[0]), maxWidth - spacing - rightWidth);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: leftWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: 0,\n width: rightWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: leftWidth + spacing,\n y: secondHeight + spacing,\n width: rightWidth,\n height: thirdHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutThreeTopAndOther(params: ILayoutParams) {\n const {\n maxWidth,\n ratios,\n maxHeight,\n spacing,\n } = params;\n const firstWidth = maxWidth;\n const firstHeight = Math.round(Math.min(firstWidth / ratios[0], 0.66 * (maxHeight - spacing)));\n const secondWidth = (maxWidth - spacing) / 2;\n const secondHeight = Math.min(\n maxHeight - firstHeight - spacing,\n Math.round(Math.min(\n secondWidth / ratios[1],\n secondWidth / ratios[2],\n )),\n );\n const thirdWidth = firstWidth - secondWidth - spacing;\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: firstWidth,\n height: firstHeight,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: firstHeight + spacing,\n width: secondWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: secondWidth + spacing,\n y: firstHeight + spacing,\n width: thirdWidth,\n height: secondHeight,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n\nfunction layoutFour(params: ILayoutParams) {\n const { proportions } = params;\n\n return proportions[0] === 'w'\n ? layoutFourTopAndOther(params)\n : layoutFourLeftAndOther(params);\n}\n\nfunction layoutFourTopAndOther({\n maxWidth,\n ratios,\n spacing,\n maxHeight,\n minWidth,\n}: ILayoutParams) {\n const w = maxWidth;\n const h0 = Math.round(Math.min(w / ratios[0], 0.66 * (maxHeight - spacing)));\n const h = Math.round((maxWidth - 2 * spacing) / (ratios[1] + ratios[2] + ratios[3]));\n const w0 = Math.max(minWidth, Math.round(Math.min(0.4 * (maxWidth - 2 * spacing), h * ratios[1])));\n const w2 = Math.round(Math.max(Math.max(minWidth, 0.33 * (maxWidth - 2 * spacing)), h * ratios[3]));\n const w1 = w - w0 - w2 - 2 * spacing;\n const h1 = Math.min(maxHeight - h0 - spacing, h);\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w,\n height: h0,\n },\n sides: AlbumRectPart.Left | AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: 0,\n y: h0 + spacing,\n width: w0,\n height: h1,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Left,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing + w1 + spacing,\n y: h0 + spacing,\n width: w2,\n height: h1,\n },\n sides: AlbumRectPart.Right | AlbumRectPart.Bottom,\n }];\n}\n\nfunction layoutFourLeftAndOther({\n maxHeight,\n ratios,\n maxWidth,\n spacing,\n minWidth,\n}: ILayoutParams) {\n const h = maxHeight;\n const w0 = Math.round(Math.min(h * ratios[0], 0.6 * (maxWidth - spacing)));\n const w = Math.round((maxHeight - 2 * spacing) / (1 / ratios[1] + 1 / ratios[2] + 1 / ratios[3]));\n const h0 = Math.round(w / ratios[1]);\n const h1 = Math.round(w / ratios[2]);\n const h2 = h - h0 - h1 - 2 * spacing;\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - spacing, w));\n\n return [{\n dimensions: {\n x: 0,\n y: 0,\n width: w0,\n height: h,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Left | AlbumRectPart.Bottom,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: 0,\n width: w1,\n height: h0,\n },\n sides: AlbumRectPart.Top | AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + spacing,\n width: w1,\n height: h1,\n },\n sides: AlbumRectPart.Right,\n }, {\n dimensions: {\n x: w0 + spacing,\n y: h0 + h1 + 2 * spacing,\n width: w1,\n height: h2,\n },\n sides: AlbumRectPart.Bottom | AlbumRectPart.Right,\n }];\n}\n","import { IS_IOS } from '../../../../util/environment';\n\nlet element: HTMLSpanElement | undefined;\n\nexport default function calculateAuthorWidth(text: string) {\n if (!element) {\n element = document.createElement('span');\n // eslint-disable-next-line max-len\n element.style.font = IS_IOS\n // eslint-disable-next-line max-len\n ? '400 12px system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\", sans-serif'\n : '400 12px \"Roboto\", -apple-system, \"Apple Color Emoji\", BlinkMacSystemFont, \"Helvetica Neue\", sans-serif';\n element.style.whiteSpace = 'nowrap';\n element.style.position = 'absolute';\n element.style.left = '-999px';\n element.style.opacity = '.01';\n document.body.appendChild(element);\n }\n\n element.innerHTML = text;\n\n return element.offsetWidth;\n}\n","import { FocusDirection } from '../../../../types';\n\nimport { useLayoutEffect } from '../../../../lib/teact/teact';\nimport fastSmoothScroll from '../../../../util/fastSmoothScroll';\n\n// This is used when the viewport was replaced.\nconst RELOCATED_FOCUS_OFFSET = 1000;\nconst FOCUS_MARGIN = 20;\n\nexport default function useFocusMessage(\n elementRef: { current: HTMLDivElement | null },\n chatId: string,\n isFocused?: boolean,\n focusDirection?: FocusDirection,\n noFocusHighlight?: boolean,\n isResizingContainer?: boolean,\n) {\n useLayoutEffect(() => {\n if (isFocused && elementRef.current) {\n const messagesContainer = elementRef.current.closest('.MessageList')!;\n\n fastSmoothScroll(\n messagesContainer,\n elementRef.current,\n // `noFocusHighlight` always called from “scroll-to-bottom” buttons\n noFocusHighlight ? 'end' : 'centerOrTop',\n FOCUS_MARGIN,\n focusDirection !== undefined ? RELOCATED_FOCUS_OFFSET : undefined,\n focusDirection,\n undefined,\n isResizingContainer,\n );\n }\n }, [elementRef, chatId, isFocused, focusDirection, noFocusHighlight, isResizingContainer]);\n}\n","import { RefObject } from 'react';\nimport React, { useEffect, useRef } 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';\nimport stopEvent from '../../../../util/stopEvent';\nimport { REM } from '../../../common/helpers/mediaDimensions';\n\nconst ANDROID_KEYBOARD_HIDE_DELAY_MS = 350;\nconst SWIPE_ANIMATION_DURATION = 150;\nconst QUICK_REACTION_DOUBLE_TAP_DELAY = 200;\nconst QUICK_REACTION_AREA_WIDTH = 3 * REM;\nconst QUICK_REACTION_AREA_HEIGHT = Number(REM);\nconst GROUP_MESSAGE_HOVER_ATTRIBUTE = 'data-is-document-group-hover';\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 isProtected: boolean,\n onContextMenu: (e: React.MouseEvent) => void,\n handleBeforeContextMenu: (e: React.MouseEvent) => void,\n chatId: string,\n isContextMenuShown: boolean,\n contentRef: RefObject,\n isOwn: boolean,\n shouldHandleMouseLeave: boolean,\n) {\n const { setReplyingToId, sendDefaultReaction } = getDispatch();\n\n const [isQuickReactionVisible, markQuickReactionVisible, unmarkQuickReactionVisible] = useFlag();\n const [isSwiped, markSwiped, unmarkSwiped] = useFlag();\n const doubleTapTimeoutRef = useRef();\n\n function handleMouseDown(e: React.MouseEvent) {\n preventMessageInputBlur(e);\n handleBeforeContextMenu(e);\n }\n\n function handleMouseMove(e: React.MouseEvent) {\n const container = contentRef.current;\n if (!container) return;\n\n const { clientX, clientY } = e;\n const {\n x, width, y, height,\n } = container.getBoundingClientRect();\n\n const isVisibleX = Math.abs((isOwn ? (clientX - x) : (x + width - clientX))) < QUICK_REACTION_AREA_WIDTH;\n const isVisibleY = Math.abs(y + height - clientY) < QUICK_REACTION_AREA_HEIGHT;\n if (isVisibleX && isVisibleY) {\n markQuickReactionVisible();\n } else {\n unmarkQuickReactionVisible();\n }\n }\n\n function handleSendQuickReaction(e: React.MouseEvent) {\n const { x, y } = e.currentTarget.getBoundingClientRect();\n sendDefaultReaction({\n chatId,\n messageId,\n x,\n y,\n });\n }\n\n function handleTap(e: React.MouseEvent) {\n 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 handleDoubleTap(e: React.MouseEvent) {\n const { pageX: x, pageY: y } = e;\n\n sendDefaultReaction({\n chatId,\n messageId,\n x,\n y,\n });\n }\n\n function handleClick(e: React.MouseEvent) {\n if (isInSelectMode) {\n selectMessage(e);\n return;\n }\n\n if (!IS_TOUCH_ENV) return;\n\n if (doubleTapTimeoutRef.current) {\n clearInterval(doubleTapTimeoutRef.current);\n doubleTapTimeoutRef.current = undefined;\n handleDoubleTap(e);\n return;\n }\n\n doubleTapTimeoutRef.current = setTimeout(() => {\n doubleTapTimeoutRef.current = undefined;\n handleTap(e);\n }, QUICK_REACTION_DOUBLE_TAP_DELAY);\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 if (IS_TOUCH_ENV) return;\n\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 || isContextMenuShown) {\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 }, [\n containerRef, isInSelectMode, messageId, setReplyingToId, markSwiped, unmarkSwiped, canReply, isContextMenuShown,\n ]);\n\n function handleMouseLeave(e: React.MouseEvent) {\n unmarkQuickReactionVisible();\n if (shouldHandleMouseLeave) handleDocumentGroupMouseLeave(e);\n }\n\n return {\n handleMouseDown: !isInSelectMode ? handleMouseDown : undefined,\n handleClick,\n handleContextMenu: !isInSelectMode ? handleContextMenu : (isProtected ? stopEvent : undefined),\n handleDoubleClick: !isInSelectMode ? handleContainerDoubleClick : undefined,\n handleContentDoubleClick: !IS_TOUCH_ENV ? stopPropagation : undefined,\n handleMouseMove,\n handleSendQuickReaction,\n handleMouseLeave,\n isSwiped,\n isQuickReactionVisible,\n handleDocumentGroupMouseEnter,\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","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './ContextMenuContainer';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst ContextMenuContainerAsync: FC = (props) => {\n const { isOpen } = props;\n const ContextMenuContainer = useModuleLoader(Bundles.Extra, 'ContextMenuContainer', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ContextMenuContainer ? : undefined;\n};\n\nexport default memo(ContextMenuContainerAsync);\n","import React, {\n FC, memo, useEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n selectUser,\n selectChatMessage,\n selectIsMessageFocused,\n selectChat,\n} from '../../modules/selectors';\nimport { isChatChannel } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport { renderActionMessageText } from '../common/helpers/renderActionMessageText';\nimport useEnsureMessage from '../../hooks/useEnsureMessage';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport { ObserveFn, useOnIntersect } from '../../hooks/useIntersectionObserver';\nimport useFocusMessage from './message/hooks/useFocusMessage';\nimport useLang from '../../hooks/useLang';\n\nimport ContextMenuContainer from './message/ContextMenuContainer.async';\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { preventMessageInputBlur } from './helpers/preventMessageInputBlur';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n isEmbedded?: boolean;\n appearanceOrder?: number;\n isLastInList?: boolean;\n};\n\ntype StateProps = {\n usersById: Record;\n sender?: ApiUser | ApiChat;\n targetUserIds?: string[];\n targetMessage?: ApiMessage;\n targetChatId?: string;\n isFocused: boolean;\n focusDirection?: FocusDirection;\n noFocusHighlight?: boolean;\n};\n\nconst APPEARANCE_DELAY = 10;\n\nconst ActionMessage: FC = ({\n message,\n observeIntersection,\n isEmbedded,\n appearanceOrder = 0,\n isLastInList,\n usersById,\n sender,\n targetUserIds,\n targetMessage,\n targetChatId,\n isFocused,\n focusDirection,\n noFocusHighlight,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n useOnIntersect(ref, observeIntersection);\n useEnsureMessage(message.chatId, message.replyToMessageId, targetMessage);\n useFocusMessage(ref, message.chatId, isFocused, focusDirection, noFocusHighlight);\n\n const lang = useLang();\n\n const noAppearanceAnimation = appearanceOrder <= 0;\n const [isShown, markShown] = useFlag(noAppearanceAnimation);\n useEffect(() => {\n if (noAppearanceAnimation) {\n return;\n }\n\n setTimeout(markShown, appearanceOrder * APPEARANCE_DELAY);\n }, [appearanceOrder, markShown, noAppearanceAnimation]);\n const { transitionClassNames } = useShowTransition(isShown, undefined, noAppearanceAnimation, false);\n\n const targetUsers = useMemo(() => {\n return targetUserIds\n ? targetUserIds.map((userId) => usersById?.[userId]).filter(Boolean as any)\n : undefined;\n }, [targetUserIds, usersById]);\n\n const content = renderActionMessageText(\n lang,\n message,\n sender,\n targetUsers,\n targetMessage,\n targetChatId,\n isEmbedded ? { isEmbedded: true, asPlain: true } : undefined,\n );\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(ref);\n const isContextMenuShown = contextMenuPosition !== undefined;\n\n const handleMouseDown = (e: React.MouseEvent) => {\n preventMessageInputBlur(e);\n handleBeforeContextMenu(e);\n };\n\n if (isEmbedded) {\n return {renderText(content as string)};\n }\n\n const className = buildClassName(\n 'ActionMessage message-list-item',\n isFocused && !noFocusHighlight && 'focused',\n isContextMenuShown && 'has-menu-open',\n isLastInList && 'last-in-list',\n transitionClassNames,\n );\n\n return (\n \n {content}\n {contextMenuPosition && (\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { message }): StateProps => {\n const { byId: usersById } = global.users;\n const userId = message.senderId;\n const { targetUserIds, targetChatId } = message.content.action || {};\n const targetMessageId = message.replyToMessageId;\n const targetMessage = targetMessageId\n ? selectChatMessage(global, message.chatId, targetMessageId)\n : undefined;\n\n const isFocused = selectIsMessageFocused(global, message);\n const { direction: focusDirection, noHighlight: noFocusHighlight } = (isFocused && global.focusedMessage) || {};\n\n const chat = selectChat(global, message.chatId);\n const sender = chat && (isChatChannel(chat) || userId === message.chatId)\n ? chat\n : userId ? selectUser(global, userId) : undefined;\n\n return {\n usersById,\n sender,\n targetChatId,\n targetUserIds,\n targetMessage,\n isFocused,\n ...(isFocused && { focusDirection, noFocusHighlight }),\n };\n },\n)(ActionMessage));\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport { ApiUser, ApiMessage, ApiChat } from '../../api/types';\n\nimport {\n getMessageMediaHash,\n isActionMessage,\n getMessageSummaryText,\n getSenderTitle,\n getMessageRoundVideo,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { getPictogramDimensions } from './helpers/mediaDimensions';\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useWebpThumbnail from '../../hooks/useWebpThumbnail';\nimport useLang from '../../hooks/useLang';\n\nimport ActionMessage from '../middle/ActionMessage';\n\nimport './EmbeddedMessage.scss';\n\ntype OwnProps = {\n observeIntersection?: ObserveFn;\n className?: string;\n message?: ApiMessage;\n sender?: ApiUser | ApiChat;\n title?: string;\n customText?: string;\n isProtected?: boolean;\n onClick: NoneToVoidFunction;\n};\n\nconst NBSP = '\\u00A0';\n\nconst EmbeddedMessage: FC = ({\n className,\n message,\n sender,\n title,\n customText,\n isProtected,\n observeIntersection,\n onClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const mediaBlobUrl = useMedia(message && getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n const pictogramId = message && `sticker-reply-thumb${message.id}`;\n const mediaThumbnail = useWebpThumbnail(message);\n const isRoundVideo = Boolean(message && getMessageRoundVideo(message));\n\n const lang = useLang();\n\n const senderTitle = sender && getSenderTitle(lang, sender);\n\n return (\n \n {mediaThumbnail && renderPictogram(pictogramId, mediaThumbnail, mediaBlobUrl, isRoundVideo, isProtected)}\n
\n

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

\n
{renderText(senderTitle || title || NBSP)}
\n
\n
\n );\n};\n\nfunction renderPictogram(\n id: string | undefined,\n thumbDataUri: string,\n blobUrl?: string,\n isRoundVideo?: boolean,\n isProtected?: boolean,\n) {\n const { width, height } = getPictogramDimensions();\n\n return (\n <>\n \n {isProtected && }\n \n );\n}\n\nexport default EmbeddedMessage;\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ActiveReaction } from '../../../global/types';\nimport { ApiAvailableReaction, ApiMediaFormat } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\n\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\nimport './ReactionAnimatedEmoji.scss';\n\ntype OwnProps = {\n reaction: string;\n activeReaction?: ActiveReaction;\n isInMeta?: boolean;\n availableReactions?: ApiAvailableReaction[];\n};\n\nconst CENTER_ICON_SIZE = 30;\nconst EFFECT_SIZE = 100;\n\nconst ReactionAnimatedEmoji: FC = ({\n reaction,\n activeReaction,\n isInMeta,\n availableReactions,\n}) => {\n const { stopActiveReaction } = getDispatch();\n\n const availableReaction = availableReactions?.find((r) => r.reaction === reaction);\n const centerIconId = availableReaction?.centerIcon?.id;\n const effectId = availableReaction?.aroundAnimation?.id;\n const mediaDataCenterIcon = useMedia(`sticker${centerIconId}`, !centerIconId, ApiMediaFormat.Lottie);\n const mediaDataEffect = useMedia(`sticker${effectId}`, !effectId, ApiMediaFormat.Lottie);\n\n const shouldPlay = Boolean(activeReaction?.reaction === reaction && mediaDataCenterIcon && mediaDataEffect);\n const {\n shouldRender: shouldRenderAnimation,\n transitionClassNames: animationClassNames,\n } = useShowTransition(shouldPlay, undefined, true, 'slow');\n\n const handleEnded = useCallback(() => {\n stopActiveReaction({ messageId: activeReaction?.messageId, reaction });\n }, [activeReaction?.messageId, reaction, stopActiveReaction]);\n\n const [isAnimationLoaded, markAnimationLoaded, unmarkAnimationLoaded] = useFlag();\n const shouldRenderStatic = !shouldPlay || !isAnimationLoaded;\n\n const className = buildClassName(\n 'ReactionAnimatedEmoji',\n isInMeta && 'in-meta',\n shouldRenderAnimation && 'is-animating',\n );\n\n return (\n
\n {shouldRenderStatic && }\n {shouldRenderAnimation && (\n <>\n \n \n \n )}\n
\n );\n};\n\nexport default memo(ReactionAnimatedEmoji);\n","import React, {\n FC, memo, useMemo,\n} from '../../../lib/teact/teact';\n\nimport { ApiAvailableReaction, ApiMessage, ApiMessageOutgoingStatus } from '../../../api/types';\nimport { ActiveReaction } from '../../../global/types';\n\nimport { formatDateTimeToString, formatTime } from '../../../util/dateFormat';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport MessageOutgoingStatus from '../../common/MessageOutgoingStatus';\nimport ReactionAnimatedEmoji from './ReactionAnimatedEmoji';\n\nimport './MessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n withReactions?: boolean;\n withReactionOffset?: boolean;\n outgoingStatus?: ApiMessageOutgoingStatus;\n signature?: string;\n onClick: (e: React.MouseEvent) => void;\n activeReaction?: ActiveReaction;\n availableReactions?: ApiAvailableReaction[];\n};\n\nconst MessageMeta: FC = ({\n message, outgoingStatus, signature, onClick, withReactions,\n activeReaction, withReactionOffset, availableReactions,\n}) => {\n const lang = useLang();\n const [isActivated, markActivated] = useFlag();\n\n const reactions = withReactions && message.reactions?.results.filter((l) => l.count > 0);\n\n const title = useMemo(() => {\n if (!isActivated) return undefined;\n const createDateTime = formatDateTimeToString(message.date * 1000, lang.code);\n const editDateTime = message.isEdited && formatDateTimeToString(message.editDate! * 1000, lang.code);\n const forwardedDateTime = message.forwardInfo && formatDateTimeToString(message.forwardInfo.date * 1000, lang.code);\n\n let text = createDateTime;\n if (editDateTime) {\n text += '\\n';\n text += lang('lng_edited_date').replace('{date}', editDateTime);\n }\n if (forwardedDateTime) {\n text += '\\n';\n text += lang('lng_forwarded_date').replace('{date}', forwardedDateTime);\n }\n\n return text;\n }, [isActivated, lang, message]);\n\n return (\n \n {reactions && reactions.map((l) => (\n \n ))}\n {Boolean(message.views) && (\n <>\n \n {formatIntegerCompact(message.views!)}\n \n \n \n )}\n {signature && (\n {renderText(signature)}\n )}\n \n {message.isEdited && `${lang('EditedMessage')} `}\n {formatTime(lang, message.date * 1000)}\n \n {outgoingStatus && (\n \n )}\n
\n );\n};\n\nexport default memo(MessageMeta);\n","import React, { FC, useRef } from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { MEMOJI_STICKER_ID } from '../../../config';\nimport { getStickerDimensions } from '../../common/helpers/mediaDimensions';\nimport { getMessageMediaFormat, getMessageMediaHash } from '../../../modules/helpers';\nimport buildClassName from '../../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMedia from '../../../hooks/useMedia';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\nimport useFlag from '../../../hooks/useFlag';\nimport useWebpThumbnail from '../../../hooks/useWebpThumbnail';\n\nimport AnimatedSticker from '../../common/AnimatedSticker';\nimport StickerSetModal from '../../common/StickerSetModal.async';\n\nimport './Sticker.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection: ObserveFn;\n observeIntersectionForPlaying: ObserveFn;\n shouldLoop?: boolean;\n lastSyncTime?: number;\n};\n\nconst Sticker: FC = ({\n message, observeIntersection, observeIntersectionForPlaying, shouldLoop, lastSyncTime,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const sticker = message.content.sticker!;\n const { isAnimated, stickerSetId } = sticker;\n const isMemojiSticker = stickerSetId === MEMOJI_STICKER_ID;\n\n const shouldLoad = useIsIntersecting(ref, observeIntersection);\n const shouldPlay = useIsIntersecting(ref, observeIntersectionForPlaying);\n\n const mediaHash = sticker.isPreloadedGlobally ? `sticker${sticker.id}` : getMessageMediaHash(message, 'inline')!;\n const thumbDataUri = useWebpThumbnail(message);\n const mediaData = useMedia(\n mediaHash,\n !shouldLoad,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n\n const isMediaLoaded = Boolean(mediaData);\n const [isAnimationLoaded, markAnimationLoaded] = useFlag(isMediaLoaded);\n const isMediaReady = isAnimated ? isAnimationLoaded : isMediaLoaded;\n const transitionClassNames = useMediaTransition(isMediaReady);\n\n const { width, height } = getStickerDimensions(sticker);\n const thumbClassName = buildClassName('thumbnail', !thumbDataUri && 'empty');\n\n const stickerClassName = buildClassName(\n 'Sticker media-inner',\n isMemojiSticker && 'inactive',\n );\n\n return (\n
\n {!isMediaReady && (\n \n )}\n {!isAnimated && (\n \n )}\n {isAnimated && isMediaLoaded && (\n \n )}\n \n
\n );\n};\n\nexport default Sticker;\n","import { ApiMessage } from '../../../../api/types';\n\nimport { IS_CANVAS_FILTER_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT } from '../../../../util/environment';\nimport { getMessageMediaThumbDataUri } from '../../../../modules/helpers';\nimport useCanvasBlur from '../../../../hooks/useCanvasBlur';\n\nexport default function useBlurredMediaThumbRef(message: ApiMessage, fullMediaData?: string) {\n return useCanvasBlur(\n getMessageMediaThumbDataUri(message),\n Boolean(fullMediaData),\n IS_SINGLE_COLUMN_LAYOUT && !IS_CANVAS_FILTER_SUPPORTED,\n );\n}\n","import { ISettings } from '../../../../types';\n\nconst SELECTED_APPENDIX_COLORS = {\n dark: {\n outgoing: 'rgb(135,116,225)',\n incoming: 'rgb(33,33,33)',\n },\n light: {\n outgoing: 'rgb(238,255,222)',\n incoming: 'rgb(255,255,255)',\n },\n};\n\nexport default function getCustomAppendixBg(\n src: string, isOwn: boolean, inSelectMode?: boolean, isSelected?: boolean, theme?: ISettings['theme'],\n) {\n if (isSelected) {\n return Promise.resolve(SELECTED_APPENDIX_COLORS[theme || 'light'][isOwn ? 'outgoing' : 'incoming']);\n }\n return getAppendixColorFromImage(src, isOwn);\n}\n\nasync function getAppendixColorFromImage(src: string, isOwn: boolean) {\n const img = new Image();\n img.src = src;\n\n if (!img.width) {\n await new Promise((resolve) => {\n img.onload = resolve;\n });\n }\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n\n canvas.width = img.width;\n canvas.height = img.height;\n\n ctx.drawImage(img, 0, 0, img.width, img.height);\n\n const x = isOwn ? img.width - 1 : 0;\n const y = img.height - 1;\n\n const pixel = Array.from(ctx.getImageData(x, y, 1, 1).data);\n return `rgba(${pixel.join(',')})`;\n}\n","import React, {\n FC, useCallback, useLayoutEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { ApiMessage } from '../../../api/types';\nimport { ISettings } from '../../../types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport {\n getMessagePhoto,\n getMessageWebPagePhoto,\n getMessageMediaHash,\n getMediaTransferState,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithLoadProgress from '../../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\nimport buildClassName from '../../../util/buildClassName';\nimport getCustomAppendixBg from './helpers/getCustomAppendixBg';\nimport { calculateMediaDimensions } from './helpers/mediaDimensions';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n noAvatars?: boolean;\n canAutoLoad?: boolean;\n isInSelectMode?: boolean;\n isSelected?: boolean;\n uploadProgress?: number;\n size?: 'inline' | 'pictogram';\n shouldAffectAppendix?: boolean;\n dimensions?: IMediaDimensions & { isSmall?: boolean };\n nonInteractive?: boolean;\n isDownloading: boolean;\n isProtected?: boolean;\n theme: ISettings['theme'];\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst CUSTOM_APPENDIX_ATTRIBUTE = 'data-has-custom-appendix';\n\nconst Photo: FC = ({\n id,\n message,\n observeIntersection,\n noAvatars,\n canAutoLoad,\n isInSelectMode,\n isSelected,\n uploadProgress,\n size = 'inline',\n dimensions,\n nonInteractive,\n shouldAffectAppendix,\n isDownloading,\n isProtected,\n theme,\n onClick,\n onCancelUpload,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const photo = (getMessagePhoto(message) || getMessageWebPagePhoto(message))!;\n const localBlobUrl = photo.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isLoadAllowed, setIsLoadAllowed] = useState(canAutoLoad);\n const shouldLoad = isLoadAllowed && isIntersecting;\n const {\n mediaData, loadProgress,\n } = useMediaWithLoadProgress(getMessageMediaHash(message, size), !shouldLoad);\n const fullMediaData = localBlobUrl || mediaData;\n const thumbRef = useBlurredMediaThumbRef(message, fullMediaData);\n\n const {\n loadProgress: downloadProgress,\n } = useMediaWithLoadProgress(getMessageMediaHash(message, 'download'), !isDownloading);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(\n message,\n uploadProgress || (isDownloading ? downloadProgress : loadProgress),\n shouldLoad && !fullMediaData,\n );\n const wasLoadDisabled = usePrevious(isLoadAllowed) === false;\n\n const transitionClassNames = useMediaTransition(fullMediaData);\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasLoadDisabled, 'slow');\n const {\n shouldRender: shouldRenderDownloadButton,\n transitionClassNames: downloadButtonClassNames,\n } = useShowTransition(!fullMediaData && !isLoadAllowed);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (!fullMediaData) {\n setIsLoadAllowed((isAllowed) => !isAllowed);\n } else if (onClick) {\n onClick(message.id);\n }\n }, [fullMediaData, isUploading, message, onCancelUpload, onClick]);\n\n const isOwn = isOwnMessage(message);\n useLayoutEffect(() => {\n if (!shouldAffectAppendix) {\n return;\n }\n\n const contentEl = ref.current!.closest('.message-content')!;\n\n if (fullMediaData) {\n getCustomAppendixBg(fullMediaData, isOwn, isInSelectMode, isSelected, theme).then((appendixBg) => {\n contentEl.style.setProperty('--appendix-bg', appendixBg);\n contentEl.setAttribute(CUSTOM_APPENDIX_ATTRIBUTE, '');\n });\n } else {\n contentEl.classList.add('has-appendix-thumb');\n }\n }, [fullMediaData, isOwn, shouldAffectAppendix, isInSelectMode, isSelected, theme]);\n\n const { width, height, isSmall } = dimensions || calculateMediaDimensions(message, noAvatars);\n\n const className = buildClassName(\n 'media-inner',\n !isUploading && !nonInteractive && 'interactive',\n isSmall && 'small-image',\n width === height && 'square-image',\n );\n\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n \n \n {isProtected && }\n {shouldRenderSpinner && !shouldRenderDownloadButton && (\n
\n \n
\n )}\n {shouldRenderDownloadButton && }\n {isTransferring && (\n {Math.round(transferProgress * 100)}%\n )}\n
\n );\n};\n\nexport default Photo;\n","import { useCallback, useRef } from '../../../../lib/teact/teact';\n\nimport { fastRaf } from '../../../../util/schedulers';\nimport safePlay from '../../../../util/safePlay';\nimport useBackgroundMode from '../../../../hooks/useBackgroundMode';\nimport useHeavyAnimationCheck from '../../../../hooks/useHeavyAnimationCheck';\n\nexport default function useVideoAutoPause(playerRef: { current: HTMLVideoElement | null }, canPlay: boolean) {\n const wasPlaying = useRef(playerRef.current?.paused);\n const canPlayRef = useRef();\n canPlayRef.current = canPlay;\n\n const freezePlaying = useCallback(() => {\n if (!playerRef.current) {\n return;\n }\n\n wasPlaying.current = !playerRef.current.paused;\n\n if (wasPlaying.current) {\n playerRef.current.pause();\n }\n }, [playerRef]);\n\n const unfreezePlaying = useCallback(() => {\n if (\n playerRef.current && wasPlaying.current && canPlayRef.current\n // At this point HTMLVideoElement can be unmounted from the DOM\n && document.body.contains(playerRef.current)\n ) {\n safePlay(playerRef.current);\n }\n }, [playerRef]);\n\n const unfreezePlayingOnRaf = useCallback(() => {\n fastRaf(unfreezePlaying);\n }, [unfreezePlaying]);\n\n useBackgroundMode(freezePlaying, unfreezePlayingOnRaf);\n useHeavyAnimationCheck(freezePlaying, unfreezePlaying);\n}\n","import React, {\n FC, useCallback, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat, ApiMessage } from '../../../api/types';\nimport { IMediaDimensions } from './helpers/calculateAlbumLayout';\n\nimport { formatMediaDuration } from '../../../util/dateFormat';\nimport buildClassName from '../../../util/buildClassName';\nimport { calculateVideoDimensions } from '../../common/helpers/mediaDimensions';\nimport {\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n getMessageVideo,\n getMessageWebPageVideo,\n isForwardedMessage,\n isOwnMessage,\n} from '../../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../../hooks/useIntersectionObserver';\nimport useMediaWithLoadProgress from '../../../hooks/useMediaWithLoadProgress';\nimport useMedia from '../../../hooks/useMedia';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useBuffering from '../../../hooks/useBuffering';\nimport useVideoCleanup from '../../../hooks/useVideoCleanup';\nimport useMediaTransition from '../../../hooks/useMediaTransition';\nimport useVideoAutoPause from './hooks/useVideoAutoPause';\nimport useBlurredMediaThumbRef from './hooks/useBlurredMediaThumbRef';\n\nimport ProgressSpinner from '../../ui/ProgressSpinner';\n\nexport type OwnProps = {\n id?: string;\n message: ApiMessage;\n observeIntersection: ObserveFn;\n noAvatars?: boolean;\n canAutoLoad?: boolean;\n canAutoPlay?: boolean;\n uploadProgress?: number;\n dimensions?: IMediaDimensions;\n lastSyncTime?: number;\n isDownloading: boolean;\n isProtected?: boolean;\n onClick?: (id: number) => void;\n onCancelUpload?: (message: ApiMessage) => void;\n};\n\nconst Video: FC = ({\n id,\n message,\n observeIntersection,\n noAvatars,\n canAutoLoad,\n canAutoPlay,\n uploadProgress,\n lastSyncTime,\n dimensions,\n onClick,\n onCancelUpload,\n isDownloading,\n isProtected,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const videoRef = useRef(null);\n\n const video = (getMessageVideo(message) || getMessageWebPageVideo(message))!;\n const localBlobUrl = video.blobUrl;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [isLoadAllowed, setIsLoadAllowed] = useState(canAutoLoad);\n const shouldLoad = Boolean(isLoadAllowed && isIntersecting && lastSyncTime);\n const [isPlayAllowed, setIsPlayAllowed] = useState(canAutoPlay);\n\n const previewBlobUrl = useMedia(\n getMessageMediaHash(message, 'pictogram'),\n !(isIntersecting && lastSyncTime),\n getMessageMediaFormat(message, 'pictogram'),\n lastSyncTime,\n );\n const previewClassNames = useMediaTransition(previewBlobUrl);\n\n const { mediaData, loadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'inline'),\n !shouldLoad,\n getMessageMediaFormat(message, 'inline'),\n lastSyncTime,\n );\n const fullMediaData = localBlobUrl || mediaData;\n const isInline = Boolean(isIntersecting && fullMediaData);\n // Thumbnail is always rendered so we can only disable blur if we have preview\n const thumbRef = useBlurredMediaThumbRef(message, previewBlobUrl);\n\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'download'),\n !isDownloading,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n\n const { isBuffered, bufferingHandlers } = useBuffering(!canAutoLoad);\n const { isUploading, isTransferring, transferProgress } = getMediaTransferState(\n message,\n uploadProgress || (isDownloading ? downloadProgress : loadProgress),\n (shouldLoad && !isBuffered) || isDownloading,\n );\n const wasLoadDisabled = usePrevious(isLoadAllowed) === false;\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, wasLoadDisabled);\n const {\n shouldRender: shouldRenderPlayButton,\n transitionClassNames: playButtonClassNames,\n } = useShowTransition(isLoadAllowed && !isPlayAllowed && !shouldRenderSpinner);\n\n const [playProgress, setPlayProgress] = useState(0);\n const handleTimeUpdate = useCallback((e: React.SyntheticEvent) => {\n setPlayProgress(Math.max(0, e.currentTarget.currentTime - 1));\n }, []);\n\n const duration = (videoRef.current?.duration) || video.duration || 0;\n\n const isOwn = isOwnMessage(message);\n const isForwarded = isForwardedMessage(message);\n const { width, height } = dimensions || calculateVideoDimensions(video, isOwn, isForwarded, noAvatars);\n\n useVideoAutoPause(videoRef, isInline);\n useVideoCleanup(videoRef, [isInline]);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload(message);\n }\n } else if (isDownloading) {\n getDispatch().cancelMessageMediaDownload({ message });\n } else if (!fullMediaData) {\n setIsLoadAllowed((isAllowed) => !isAllowed);\n } else if (fullMediaData && !isPlayAllowed) {\n setIsPlayAllowed(true);\n videoRef.current!.play();\n } else if (onClick) {\n onClick(message.id);\n }\n }, [isUploading, isDownloading, fullMediaData, isPlayAllowed, onClick, onCancelUpload, message]);\n\n const className = buildClassName('media-inner dark', !isUploading && 'interactive');\n const style = dimensions\n ? `width: ${width}px; height: ${height}px; left: ${dimensions.x}px; top: ${dimensions.y}px;`\n : '';\n\n return (\n \n \n \n {isInline && (\n \n \n \n )}\n {isProtected && }\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiContact, ApiCountryCode } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport buildClassName from '../../../util/buildClassName';\n\nimport Avatar from '../../common/Avatar';\n\nimport './Contact.scss';\n\ntype OwnProps = {\n contact: ApiContact;\n};\n\ntype StateProps = {\n user?: ApiUser;\n phoneCodeList: ApiCountryCode[];\n};\n\nconst Contact: FC = ({\n contact, user, phoneCodeList,\n}) => {\n const { openUserInfo } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiMessage, ApiPoll, ApiUser, ApiPollAnswer,\n} from '../../../api/types';\n\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\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 onSendVote,\n serverTimeOffset,\n}) => {\n const { loadMessage, openPollResults } = getDispatch();\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)(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 isProtected?: 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 isProtected,\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 { getDispatch, 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 {\n selectIsInSelectMode,\n selectIsMessageSelected,\n} from '../../../../modules/selectors';\n\ntype OwnProps =\n PhotoProps\n & VideoProps;\n\ntype StateProps = {\n isInSelectMode?: boolean;\n isSelected?: boolean;\n};\n\nexport default function withSelectControl(WrappedComponent: FC) {\n const ComponentWithSelectControl: FC = (props) => {\n const {\n isInSelectMode,\n isSelected,\n message,\n dimensions,\n } = props;\n const { toggleMessageSelection } = getDispatch();\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 )(ComponentWithSelectControl));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { 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 { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\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 isProtected?: 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\nconst Album: FC = ({\n album,\n observeIntersection,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n isProtected,\n albumLayout,\n onMediaClick,\n uploadsById,\n activeDownloadIds,\n theme,\n}) => {\n const { cancelSendingMessage } = getDispatch();\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)(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 { getDispatch, getGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiThreadInfo, ApiUser,\n} from '../../../api/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};\n\nconst CommentButton: FC = ({\n threadInfo,\n disabled,\n}) => {\n const { openChat } = getDispatch();\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, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiAvailableReaction, ApiMessage, ApiReactionCount, ApiUser,\n} from '../../../api/types';\nimport { ActiveReaction } from '../../../global/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\nimport ReactionAnimatedEmoji from './ReactionAnimatedEmoji';\n\nimport './Reactions.scss';\n\nconst MAX_REACTORS_AVATARS = 3;\n\nconst ReactionButton: FC<{\n reaction: ApiReactionCount;\n message: ApiMessage;\n activeReaction?: ActiveReaction;\n availableReactions?: ApiAvailableReaction[];\n}> = ({\n reaction,\n message,\n activeReaction,\n availableReactions,\n}) => {\n const { sendReaction } = getDispatch();\n\n const { recentReactions } = message.reactions!;\n\n const recentReactors = useMemo(() => {\n if (!recentReactions || reaction.count > MAX_REACTORS_AVATARS) {\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\n return recentReactions\n .filter((recentReaction) => recentReaction.reaction === reaction.reaction)\n .map((recentReaction) => usersById[recentReaction.userId])\n .filter(Boolean) as ApiUser[];\n }, [reaction, recentReactions]);\n\n const handleClick = useCallback(() => {\n sendReaction({\n reaction: reaction.isChosen ? undefined : reaction.reaction,\n chatId: message.chatId,\n messageId: message.id,\n });\n }, [message, reaction, sendReaction]);\n\n return (\n \n \n {recentReactors?.length ? (\n
\n {recentReactors.map((user) => )}\n
\n ) : formatIntegerCompact(reaction.count)}\n \n );\n};\n\nexport default memo(ReactionButton);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiAvailableReaction, ApiMessage } from '../../../api/types';\nimport { ActiveReaction } from '../../../global/types';\n\nimport buildClassName from '../../../util/buildClassName';\n\nimport ReactionButton from './ReactionButton';\n\nimport './Reactions.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n isOutside?: boolean;\n activeReaction?: ActiveReaction;\n availableReactions?: ApiAvailableReaction[];\n metaChildren?: React.ReactNode;\n};\n\nconst Reactions: FC = ({\n message,\n isOutside,\n activeReaction,\n availableReactions,\n metaChildren,\n}) => {\n return (\n
\n {message.reactions!.results.map((reaction) => (\n \n ))}\n {metaChildren}\n
\n );\n};\n\nexport default memo(Reactions);\n","import React, {\n FC, memo, useEffect, useState,\n} from '../../lib/teact/teact';\n\nimport { ActiveEmojiInteraction } from '../../global/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport getAnimationData, { ANIMATED_STICKERS_PATHS } from './helpers/animatedAssets';\nimport useAnimatedEmoji from './hooks/useAnimatedEmoji';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nconst QUALITY = 1;\n\ntype OwnProps = {\n localSticker?: string;\n localEffect?: string;\n isOwn?: boolean;\n soundId?: string;\n observeIntersection?: ObserveFn;\n size?: 'large' | 'medium' | 'small';\n lastSyncTime?: number;\n forceLoadPreview?: boolean;\n messageId?: number;\n chatId?: string;\n activeEmojiInteraction?: ActiveEmojiInteraction;\n};\n\nconst LocalAnimatedEmoji: FC = ({\n localSticker,\n localEffect,\n isOwn,\n soundId,\n size = 'medium',\n observeIntersection,\n messageId,\n chatId,\n activeEmojiInteraction,\n}) => {\n const {\n playKey,\n ref,\n style,\n width,\n handleClick,\n markAnimationLoaded,\n } = useAnimatedEmoji(size, chatId, messageId, soundId, activeEmojiInteraction, isOwn, localEffect);\n const id = `local_emoji_${localSticker}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [localStickerAnimationData, setLocalStickerAnimationData] = useState();\n useEffect(() => {\n if (localSticker) {\n getAnimationData(localSticker as keyof typeof ANIMATED_STICKERS_PATHS).then((data) => {\n setLocalStickerAnimationData(data);\n });\n }\n }, [localSticker]);\n\n return (\n \n {localStickerAnimationData && (\n \n )}\n \n );\n};\n\nexport default memo(LocalAnimatedEmoji);\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ActiveEmojiInteraction, ActiveReaction, MessageListType } from '../../../global/types';\nimport {\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n ApiChat,\n ApiSticker,\n ApiThreadInfo,\n ApiAvailableReaction,\n} from '../../../api/types';\nimport {\n AudioOrigin, FocusDirection, IAlbum, ISettings,\n} from '../../../types';\n\nimport { IS_ANDROID, IS_TOUCH_ENV } from '../../../util/environment';\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 selectAnimatedEmojiEffect,\n selectAnimatedEmojiSound,\n selectMessageIdsByGroupId,\n selectLocalAnimatedEmoji,\n selectIsMessageProtected,\n selectLocalAnimatedEmojiEffect,\n selectDefaultReaction,\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 areReactionsEmpty,\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';\nimport Reactions from './Reactions';\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport LocalAnimatedEmoji from '../../common/LocalAnimatedEmoji';\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 areReactionsInMeta?: 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 isInDocumentGroup: boolean;\n isProtected?: boolean;\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 localSticker?: string;\n localEffect?: string;\n animatedEmojiEffect?: ApiSticker;\n animatedEmojiSoundId?: string;\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 reactionMessage?: ApiMessage;\n availableReactions?: ApiAvailableReaction[];\n defaultReaction?: string;\n activeReaction?: ActiveReaction;\n activeEmojiInteraction?: ActiveEmojiInteraction;\n};\n\ntype MetaPosition =\n 'in-text'\n | 'standalone'\n | 'none';\ntype ReactionsPosition =\n 'inside'\n | 'outside'\n | 'in-meta'\n | 'none';\n\nconst NBSP = '\\u00A0';\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 areReactionsInMeta,\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 isInDocumentGroup,\n isProtected,\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 localSticker,\n localEffect,\n animatedEmojiEffect,\n animatedEmojiSoundId,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n reactionMessage,\n availableReactions,\n defaultReaction,\n activeReaction,\n activeEmojiInteraction,\n messageListType,\n isPinnedList,\n isDownloading,\n canAutoLoadMedia,\n canAutoPlayMedia,\n shouldLoopStickers,\n autoLoadFileMaxSizeMb,\n threadInfo,\n}) => {\n const {\n toggleMessageSelection,\n clickInlineButton,\n disableContextMenuHint,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const bottomMarkerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const contentRef = 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 {\n id: messageId, chatId, forwardInfo, viaBotId,\n } = 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 customShape = getMessageCustomShape(message);\n const hasAnimatedEmoji = localSticker || animatedEmoji;\n const asForwarded = (\n forwardInfo\n && (!isChatWithSelf || isScheduled)\n && !isRepliesChat\n && !forwardInfo.isLinkedChannelPost\n && !customShape\n );\n const isAlbum = Boolean(album) && album!.messages.length > 1;\n const isInDocumentGroupNotFirst = isInDocumentGroup && !isFirstInDocumentGroup;\n const isInDocumentGroupNotLast = isInDocumentGroup && !isLastInDocumentGroup;\n const isContextMenuShown = contextMenuPosition !== undefined;\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && !isInDocumentGroupNotLast\n );\n const canForward = isChannel && !isScheduled;\n const canFocus = Boolean(isPinnedList\n || (forwardInfo\n && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn) || isRepliesChat)\n && forwardInfo.fromMessageId\n ));\n\n const withCommentButton = threadInfo && !isInDocumentGroupNotLast && messageListType === 'thread' && !noComments;\n const withQuickReactionButton = !IS_TOUCH_ENV && defaultReaction && !isInDocumentGroupNotLast;\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 avatarPeer = forwardInfo && (isChatWithSelf || isRepliesChat || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n\n const {\n handleMouseDown,\n handleClick,\n handleContextMenu,\n handleDoubleClick,\n handleContentDoubleClick,\n handleMouseMove,\n handleSendQuickReaction,\n handleMouseLeave,\n isSwiped,\n isQuickReactionVisible,\n handleDocumentGroupMouseEnter,\n } = useOuterHandlers(\n selectMessage,\n ref,\n messageId,\n isAlbum,\n Boolean(isInSelectMode),\n Boolean(canReply),\n Boolean(isProtected),\n onContextMenu,\n handleBeforeContextMenu,\n chatId,\n isContextMenuShown,\n contentRef,\n isOwn,\n isInDocumentGroupNotLast,\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 asForwarded,\n 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 isProtected && 'is-protected',\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 Boolean(activeReaction) && 'has-active-reaction',\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\n const withAppendix = contentClassName.includes('has-appendix');\n const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape));\n\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice,\n } = getMessageContent(message);\n\n let metaPosition!: MetaPosition;\n if (isInDocumentGroupNotLast) {\n metaPosition = 'none';\n } else if (textParts && !hasAnimatedEmoji && !webPage) {\n metaPosition = 'in-text';\n } else {\n metaPosition = 'standalone';\n }\n\n let reactionsPosition!: ReactionsPosition;\n if (areReactionsInMeta) {\n reactionsPosition = 'in-meta';\n } else if (reactionMessage?.reactions && !areReactionsEmpty(reactionMessage.reactions)) {\n if (customShape || ((photo || video || hasAnimatedEmoji) && !textParts)) {\n reactionsPosition = 'outside';\n } else if (asForwarded) {\n metaPosition = 'standalone';\n reactionsPosition = 'inside';\n } else {\n reactionsPosition = 'inside';\n }\n } else {\n reactionsPosition = 'none';\n }\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 const signature = (isChannel && message.adminTitle) || (!asForwarded && forwardInfo?.adminTitle) || undefined;\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\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 renderReactionsAndMeta() {\n const meta = (\n \n );\n\n if (reactionsPosition !== 'inside') {\n return meta;\n }\n\n return (\n \n );\n }\n\n function renderContent() {\n const className = buildClassName(\n 'content-inner',\n asForwarded && 'forwarded-message',\n hasReply && 'reply-message',\n noMediaCorners && 'no-media-corners',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n const textContentClass = buildClassName(\n 'text-content',\n metaPosition === 'in-text' && '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 {localSticker && (\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 {!hasAnimatedEmoji && textParts && (\n

\n {textParts}\n {metaPosition === 'in-text' && renderReactionsAndMeta()}\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 ) && !isInDocumentGroupNotFirst && !(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 && !isInDocumentGroupNotFirst && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {!isInDocumentGroupNotLast && metaPosition === 'standalone' && renderReactionsAndMeta()}\n {canShowActionButton && canForward ? (\n \n \n \n ) : canShowActionButton && canFocus ? (\n \n \n \n ) : undefined}\n {withCommentButton && }\n {withAppendix && (\n
\n )}\n {withQuickReactionButton && (\n \n \n
\n )}\n \n {message.inlineButtons && (\n \n )}\n {reactionsPosition === 'outside' && (\n \n )}\n \n {contextMenuPosition && (\n \n )}\n \n );\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, isLastInDocumentGroup,\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 const isInDocumentGroup = Boolean(message.groupedId) && !message.isInAlbum;\n const documentGroupFirstMessageId = isInDocumentGroup\n ? selectMessageIdsByGroupId(global, chatId, message.groupedId!)![0]\n : undefined;\n const reactionMessage = isInDocumentGroup ? (\n isLastInDocumentGroup ? selectChatMessage(global, chatId, documentGroupFirstMessageId!) : undefined\n ) : message;\n\n const localSticker = singleEmoji ? selectLocalAnimatedEmoji(global, singleEmoji) : 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 isInDocumentGroup,\n isProtected: selectIsMessageProtected(global, message),\n isFocused,\n isForwarding,\n reactionMessage,\n isChatWithSelf,\n isRepliesChat,\n isChannel,\n canReply,\n lastSyncTime,\n highlight,\n isSingleEmoji: Boolean(singleEmoji),\n animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined,\n animatedEmojiEffect: singleEmoji && isUserId(chatId) ? selectAnimatedEmojiEffect(global, singleEmoji) : undefined,\n animatedEmojiSoundId: singleEmoji ? selectAnimatedEmojiSound(global, singleEmoji) : undefined,\n localSticker,\n localEffect: localSticker && isUserId(chatId) ? selectLocalAnimatedEmojiEffect(localSticker) : 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 availableReactions: global.availableReactions,\n defaultReaction: selectDefaultReaction(global, chatId),\n activeReaction: global.activeReactions[id],\n activeEmojiInteraction: global.activeEmojiInteraction,\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n ...(isFocused && { focusDirection, noFocusHighlight, isResizingContainer }),\n };\n },\n)(Message));\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 asForwarded?: 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 (asForwarded && 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 }, [\n asForwarded, focusMessage, forwardInfo, lang, openChat, openUserInfo, senderPeer, showNotification,\n ]);\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, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiSponsoredMessage, ApiUser } from '../../../api/types';\n\nimport { renderTextWithEntities } from '../../common/helpers/renderMessageText';\nimport { selectChat, selectSponsoredMessage, selectUser } from '../../../modules/selectors';\nimport { getChatTitle, getUserFullName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\n\nimport Button from '../../ui/Button';\n\nimport './SponsoredMessage.scss';\n\ntype OwnProps = {\n chatId: string;\n containerRef: RefObject;\n};\n\ntype StateProps = {\n message?: ApiSponsoredMessage;\n bot?: ApiUser;\n channel?: ApiChat;\n};\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\n\nconst SponsoredMessage: FC = ({\n chatId,\n message,\n containerRef,\n bot,\n channel,\n}) => {\n const {\n viewSponsoredMessage,\n openChat,\n openChatByInvite,\n startBot,\n focusMessage,\n } = getDispatch();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const contentRef = useRef(null);\n const shouldObserve = Boolean(message);\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n threshold: 1,\n });\n\n useEffect(() => {\n return shouldObserve ? observeIntersection(contentRef.current!, (target) => {\n if (target.isIntersecting) {\n viewSponsoredMessage({ chatId });\n }\n }) : undefined;\n }, [chatId, shouldObserve, observeIntersection, viewSponsoredMessage]);\n\n if (!message) {\n return undefined;\n }\n\n const handleClick = () => {\n if (message.chatInviteHash) {\n openChatByInvite({ hash: message.chatInviteHash });\n } else if (message.channelPostId) {\n focusMessage({ chatId: message.chatId, messageId: message.channelPostId });\n } else {\n openChat({ id: message.chatId });\n\n if (message.startParam) {\n startBot({\n botId: message.chatId,\n param: message.startParam,\n });\n }\n }\n };\n\n return (\n
\n
\n
\n
\n {bot && renderText(getUserFullName(bot) || '')}\n {channel && renderText(message.chatInviteTitle || getChatTitle(lang, channel, bot) || '')}\n
\n\n

\n \n {renderTextWithEntities(message.text.text, message.text.entities)}\n \n\n \n {lang('SponsoredMessage')}\n \n

\n\n \n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const message = selectSponsoredMessage(global, chatId);\n const { chatId: fromChatId, isBot } = message || {};\n\n return {\n message,\n bot: fromChatId && isBot ? selectUser(global, fromChatId) : undefined,\n channel: !isBot && fromChatId ? selectChat(global, fromChatId) : undefined,\n };\n },\n)(SponsoredMessage));\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 SponsoredMessage from './message/SponsoredMessage';\nimport ActionMessage from './ActionMessage';\nimport { getDispatch } from '../../lib/teact/teactn';\n\ninterface OwnProps {\n chatId: string;\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 areReactionsInMeta: 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}\n\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst MessageListContent: FC = ({\n chatId,\n messageIds,\n messageGroups,\n isViewportNewest,\n isUnread,\n withUsers,\n areReactionsInMeta,\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}) => {\n const { openHistoryCalendar } = getDispatch();\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 {isViewportNewest && }\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 if (!containerRef.current) {\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiUpdateConnectionStateType } from '../../api/types';\n\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\nconst INTERSECTION_DEBOUNCE_MS = 200;\n\nconst ContactGreeting: FC = ({\n sticker,\n connectionState,\n lastUnreadMessageId,\n}) => {\n const {\n loadGreetingStickers,\n sendMessage,\n markMessageListRead,\n } = getDispatch();\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)(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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID,\n} from '../../api/types';\nimport { 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 } 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';\nimport useInterval from '../../hooks/useInterval';\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 lastSyncTime?: number;\n};\n\nconst MESSAGE_REACTIONS_POLLING_INTERVAL = 15 * 1000;\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 lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n lastSyncTime,\n withBottomShift,\n}) => {\n const {\n loadViewportMessages, setScrollOffset, loadSponsoredMessages, loadMessageReactions,\n } = getDispatch();\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 useOnChange(() => {\n if (isChannelChat && isReady && lastSyncTime) {\n loadSponsoredMessages({ chatId });\n }\n }, [chatId, isReady, isChannelChat, lastSyncTime]);\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 useInterval(() => {\n if (!messageIds || !messagesById) {\n return;\n }\n const ids = messageIds.filter((l) => messagesById[l]?.reactions);\n\n if (!ids.length) return;\n\n loadMessageReactions({ chatId, ids });\n }, MESSAGE_REACTIONS_POLLING_INTERVAL);\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 containerRef.current!.dataset.normalHeight = String(containerRef.current!.offsetHeight);\n }, [windowHeight, 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) {\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]);\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 lastSyncTime: global.lastSyncTime,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n };\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, true);\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { 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 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\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n canPost,\n messageListType,\n unreadCount,\n withExtraShift,\n}) => {\n const { focusNextReply } = getDispatch();\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)(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 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';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiFormattedText, ApiMessage } from '../../../../api/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 htmlRef: { current: string },\n setHtml: (html: string) => void,\n editedMessage: ApiMessage | undefined,\n) => {\n const { saveDraft, clearDraft } = getDispatch();\n\n const updateDraft = useCallback((draftChatId: string, draftThreadId: number) => {\n const currentHtml = htmlRef.current;\n if (currentHtml.length && !editedMessage) {\n saveDraft({ chatId: draftChatId, threadId: draftThreadId, draft: parseMessageInput(currentHtml!) });\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 const html = htmlRef.current;\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 { useState } from '../lib/teact/teact';\n\nimport useDebounce from './useDebounce';\nimport useOnChange from './useOnChange';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport useFlag from './useFlag';\n\nexport default function useDebouncedMemo(\n resolverFn: () => R, ms: number, dependencies: D,\n): R | undefined {\n const runDebounced = useDebounce(ms, true);\n const [value, setValue] = useState();\n const [isFrozen, freeze, unfreeze] = useFlag();\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useOnChange(() => {\n if (isFrozen) {\n return;\n }\n\n runDebounced(() => {\n setValue(resolverFn());\n });\n }, [...dependencies, isFrozen]);\n\n return value;\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';\nimport useDebouncedMemo from '../../../../hooks/useDebouncedMemo';\n\nconst DEBOUNCE_MS = 300;\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;\nconst MEMO_NO_RESULT = {\n username: '',\n query: '',\n canShowHelp: false,\n usernameLowered: '',\n};\n\nconst tempEl = document.createElement('div');\n\nexport default function useInlineBotTooltip(\n isAllowed: boolean,\n chatId: string,\n html: string,\n inlineBots?: Record,\n) {\n const { queryInlineBot, resetInlineBot } = getDispatch();\n\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const {\n username, query, canShowHelp, usernameLowered,\n } = useDebouncedMemo(() => parseBotQuery(html), DEBOUNCE_MS, [html]) || {};\n const prevQuery = usePrevious(query);\n const prevUsername = usePrevious(username);\n const inlineBotData = usernameLowered ? inlineBots?.[usernameLowered] : undefined;\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 id: botId,\n isGallery,\n switchPm,\n results,\n closeTooltip: unmarkIsOpen,\n help: canShowHelp && help ? `@${username} ${help}` : undefined,\n loadMore,\n };\n}\n\nfunction parseBotQuery(html: string) {\n const text = getPlainText(html);\n const result = text.match(INLINE_BOT_QUERY_REGEXP);\n if (!result) {\n return MEMO_NO_RESULT;\n }\n\n return {\n username: result[1],\n query: result[2],\n canShowHelp: result[2] === '' && !text.match(HAS_NEW_LINE),\n usernameLowered: result[1].toLowerCase(),\n };\n}\n\nfunction getPlainText(html: string) {\n tempEl.innerHTML = html.replace(/
/g, '\\n');\n\n return tempEl.innerText;\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, memo } 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 memo(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\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\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose,\n}) => {\n const { clickInlineButton } = getDispatch();\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?.keyboardButtons]);\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)(BotKeyboardMenu));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 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\nconst FORWARD_RENDERING_DELAY = 300;\n\nconst ComposerEmbeddedMessage: FC = ({\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount,\n}) => {\n const {\n setReplyingToId,\n setEditingId,\n focusMessage,\n exitForwardMode,\n } = getDispatch();\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)(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, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 parseMessageInput from '../../../util/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';\nimport useDebouncedMemo from '../../../hooks/useDebouncedMemo';\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};\n\nconst DEBOUNCE_MS = 300;\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}) => {\n const {\n loadWebPagePreview,\n clearWebPagePreview,\n toggleMessageWebPage,\n } = getDispatch();\n\n const link = useDebouncedMemo(() => {\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 }, DEBOUNCE_MS, [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)(WebPagePreview));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './SendAsMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst SendAsMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const SendAsMenu = useModuleLoader(Bundles.Extra, 'SendAsMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SendAsMenu ? : undefined;\n};\n\nexport default memo(SendAsMenuAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { 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, SEND_MESSAGE_ACTION_INTERVAL,\n} from '../../../config';\nimport { IS_VOICE_RECORDING_SUPPORTED, IS_SINGLE_COLUMN_LAYOUT, IS_IOS } from '../../../util/environment';\nimport { MEMO_EMPTY_ARRAY } from '../../../util/memo';\nimport {\n selectChat,\n selectIsRightColumnShown,\n selectIsInSelectMode,\n selectNewestMessageWithBotKeyboardButtons,\n selectDraft,\n selectScheduledIds,\n selectEditingMessage,\n selectIsChatWithSelf,\n selectChatBot,\n selectChatUser,\n selectChatMessage,\n selectUser,\n selectUserStatus,\n} from '../../../modules/selectors';\nimport {\n getAllowedAttachmentOptions,\n getChatSlowModeOptions,\n isUserId,\n isChatAdmin,\n isChatSuperGroup,\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 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 usePrevious from '../../../hooks/usePrevious';\nimport useStickerTooltip from './hooks/useStickerTooltip';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\nimport useSendMessageAction from '../../../hooks/useSendMessageAction';\nimport useInterval from '../../../hooks/useInterval';\nimport useOnChange from '../../../hooks/useOnChange';\nimport { useStateRef } from '../../../hooks/useStateRef';\nimport useVoiceRecording from './hooks/useVoiceRecording';\nimport useClipboardPaste from './hooks/useClipboardPaste';\nimport useDraft from './hooks/useDraft';\nimport useEditing from './hooks/useEditing';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionTooltip from './hooks/useMentionTooltip';\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 CalendarModal from '../../common/CalendarModal.async';\nimport Avatar from '../../common/Avatar';\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 SendAsMenu from './SendAsMenu.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 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 sendAsUser?: ApiUser;\n sendAsChat?: ApiChat;\n sendAsId?: string;\n }\n & Pick;\n\nenum MainButtonState {\n Send = 'send',\n Record = 'record',\n Edit = 'edit',\n Schedule = 'schedule',\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 lastSyncTime,\n contentToBeScheduled,\n shouldSuggestStickers,\n baseEmojiKeywords,\n emojiKeywords,\n serverTimeOffset,\n recentEmojis,\n inlineBots,\n isInlineBotLoading,\n botCommands,\n chatBotCommands,\n sendAsUser,\n sendAsChat,\n sendAsId,\n}) => {\n const {\n sendMessage,\n clearDraft,\n showDialog,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n openChat,\n addRecentEmoji,\n sendInlineBotResult,\n loadSendAs,\n } = getDispatch();\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 htmlRef = useStateRef(html);\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 const sendAsIds = chat?.sendAsIds;\n const sendMessageAction = useSendMessageAction(chatId, threadId);\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 useEffect(() => {\n if (chatId && chat && lastSyncTime && !sendAsIds && isReady && isChatSuperGroup(chat)) {\n loadSendAs({ chatId });\n }\n }, [chat, chatId, isReady, lastSyncTime, loadSendAs, sendAsIds]);\n\n const shouldAnimateSendAsButtonRef = useRef(false);\n useOnChange(([prevChatId, prevSendAsIds]) => {\n // We only animate send-as button if `sendAsIds` was missing when opening the chat\n shouldAnimateSendAsButtonRef.current = Boolean(chatId === prevChatId && sendAsIds && !prevSendAsIds);\n }, [chatId, sendAsIds]);\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 [isSendAsMenuOpen, openSendAsMenu, closeSendAsMenu] = 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 useInterval(() => {\n sendMessageAction({ type: 'recordAudio' });\n }, activeVoiceRecording && SEND_MESSAGE_ACTION_INTERVAL);\n\n useEffect(() => {\n if (!activeVoiceRecording) {\n sendMessageAction({ type: 'cancel' });\n }\n }, [activeVoiceRecording, sendMessageAction]);\n\n const mainButtonState = editingMessage ? MainButtonState.Edit\n : (!IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding)\n ? (shouldSchedule ? MainButtonState.Schedule : MainButtonState.Send)\n : MainButtonState.Record;\n const canShowCustomSendMenu = !shouldSchedule;\n\n const {\n isMentionTooltipOpen, closeMentionTooltip, insertMention, mentionFilteredUsers,\n } = useMentionTooltip(\n !attachments.length,\n htmlRef,\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 {\n canSendStickers, canSendGifs, canAttachMedia, canAttachPolls, canAttachEmbedLinks,\n } = useMemo(() => getAllowedAttachmentOptions(chat, isChatWithBot), [chat, isChatWithBot]);\n\n const isAdmin = chat && isChatAdmin(chat);\n const slowMode = getChatSlowModeOptions(chat);\n\n const { isStickerTooltipOpen, closeStickerTooltip } = useStickerTooltip(\n Boolean(shouldSuggestStickers && canSendStickers && !attachments.length),\n html,\n stickersForEmoji,\n !isReady,\n );\n const {\n isEmojiTooltipOpen, closeEmojiTooltip, filteredEmojis, insertEmoji,\n } = useEmojiTooltip(\n Boolean(shouldSuggestStickers && canSendStickers && !attachments.length),\n htmlRef,\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 }, [htmlRef]);\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 }, [htmlRef]);\n\n const resetComposer = useCallback((shouldPreserveInput = false) => {\n if (!shouldPreserveInput) {\n setHtml('');\n }\n setAttachments(MEMO_EMPTY_ARRAY);\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);\n useDraft(draft, chatId, threadId, htmlRef, setHtml, editingMessage);\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(MEMO_EMPTY_ARRAY);\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, htmlRef,\n ]);\n\n const handleActivateBotCommandMenu = useCallback(() => {\n closeSymbolMenu();\n openBotCommandMenu();\n }, [closeSymbolMenu, openBotCommandMenu]);\n\n const handleActivateSymbolMenu = useCallback(() => {\n closeBotCommandMenu();\n closeSendAsMenu();\n openSymbolMenu();\n }, [closeBotCommandMenu, closeSendAsMenu, 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 handleSendAsMenuOpen = useCallback(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (!IS_SINGLE_COLUMN_LAYOUT || messageInput !== document.activeElement) {\n closeBotCommandMenu();\n closeSymbolMenu();\n openSendAsMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n closeBotCommandMenu();\n closeSymbolMenu();\n openSendAsMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [closeBotCommandMenu, closeSymbolMenu, openSendAsMenu]);\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 handleSend();\n break;\n case MainButtonState.Record:\n void startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n case MainButtonState.Schedule:\n if (activeVoiceRecording) {\n pauseRecordingVoice();\n }\n openCalendar();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, handleSend, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice,\n ]);\n\n const areVoiceMessagesNotAllowed = mainButtonState === MainButtonState.Record && !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 : mainButtonState === MainButtonState.Schedule ? openCalendar\n : handleSend;\n\n return (\n
\n {canAttachMedia && isReady && (\n \n )}\n \n \n {renderedEditedMessage && (\n \n )}\n \n \n \n \n
\n
\n \n \n
\n {isChatWithBot && botCommands !== false && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {!!sendAsIds?.length && (sendAsUser || sendAsChat) && (\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 \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 const { currentUserId } = global;\n const sendAsId = chat?.fullInfo ? chat?.fullInfo?.sendAsId || currentUserId : undefined;\n const sendAsUser = sendAsId ? selectUser(global, sendAsId) : undefined;\n const sendAsChat = !sendAsUser && sendAsId ? selectChat(global, sendAsId) : 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,\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 sendAsUser,\n sendAsChat,\n sendAsId,\n };\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({\n emoji: IS_EMOJI_SUPPORTED ? cleanHtml : cleanHtml.match(/alt=\"(.+)\"/)?.[1],\n });\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';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../../api/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) => {\n const { editMessage } = getDispatch();\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, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './EmojiInteractionAnimation';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst EmojiInteractionAnimationAsync: FC = (props) => {\n const { emojiInteraction } = props;\n const EmojiInteractionAnimation = useModuleLoader(Bundles.Extra, 'EmojiInteractionAnimation', !emojiInteraction);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiInteractionAnimation ? : undefined;\n};\n\nexport default memo(EmojiInteractionAnimationAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ReactorListModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ReactorListModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ReactorListModal = useModuleLoader(Bundles.Extra, 'ReactorListModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ReactorListModal ? : undefined;\n};\n\nexport default memo(ReactorListModalAsync);\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChatBannedRights, MAIN_THREAD_ID } from '../../api/types';\nimport {\n MessageListType,\n MessageList as GlobalMessageList,\n ActiveEmojiInteraction,\n} 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 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 useForceUpdate from '../../hooks/useForceUpdate';\nimport useOnChange from '../../hooks/useOnChange';\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';\nimport EmojiInteractionAnimation from './EmojiInteractionAnimation.async';\nimport ReactorListModal from './ReactorListModal.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 isReactorListModalOpen: 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 activeEmojiInteraction?: ActiveEmojiInteraction;\n};\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 isReactorListModalOpen,\n animationLevel,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n isChannel,\n canSubscribe,\n canStartBot,\n canRestartBot,\n activeEmojiInteraction,\n}) => {\n const {\n openChat,\n unpinAllMessages,\n loadUser,\n closeLocalTextSearch,\n exitMessageSelectMode,\n closePaymentModal,\n clearReceipt,\n joinChannel,\n sendBotCommand,\n restartBot,\n } = getDispatch();\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\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\n const cleanupExceptionKey = (\n prevTransitionKey !== undefined && prevTransitionKey < currentTransitionKey ? prevTransitionKey : undefined\n );\n\n const { isReady, handleOpenEnd, handleSlideStop } = useIsReady(\n animationLevel, currentTransitionKey, prevTransitionKey, chatId,\n );\n\n useEffect(() => {\n return chatId\n ? captureEscKeyListener(() => {\n openChat({ id: undefined });\n })\n : undefined;\n }, [chatId, openChat]);\n\n useOnChange(() => {\n setDropAreaState(DropAreaState.None);\n setIsFabShown(undefined);\n setIsNotchShown(undefined);\n }, [chatId]);\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 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 \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
\n {IS_SINGLE_COLUMN_LAYOUT && }\n \n )}\n {chatId && (\n \n )}\n {activeEmojiInteraction && (\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 }, activeEmojiInteraction } = 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 isReactorListModalOpen: Boolean(global.reactorModal),\n animationLevel: global.settings.byKey.animationLevel,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n activeEmojiInteraction,\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)(MiddleColumn));\n\nfunction useIsReady(\n animationLevel?: number,\n currentTransitionKey?: number,\n prevTransitionKey?: number,\n chatId?: string,\n) {\n const [isReady, setIsReady] = useState(!IS_SINGLE_COLUMN_LAYOUT);\n const forceUpdate = useForceUpdate();\n\n const willSwitchMessageList = prevTransitionKey !== undefined && prevTransitionKey !== currentTransitionKey;\n if (willSwitchMessageList) {\n if (animationLevel !== ANIMATION_LEVEL_MIN) {\n setIsReady(false);\n } else {\n forceUpdate();\n }\n }\n\n useOnChange(() => {\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n setIsReady(true);\n }\n }, [animationLevel]);\n\n function handleOpenEnd(e: React.TransitionEvent) {\n if (e.propertyName === 'transform' && e.target === e.currentTarget) {\n setIsReady(Boolean(chatId));\n }\n }\n\n function handleSlideStop() {\n setIsReady(true);\n }\n\n return {\n isReady: isReady && !willSwitchMessageList,\n handleOpenEnd: animationLevel !== ANIMATION_LEVEL_MIN ? handleOpenEnd : undefined,\n handleSlideStop: animationLevel !== ANIMATION_LEVEL_MIN ? handleSlideStop : undefined,\n };\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ManagementScreens, ProfileState } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\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, isChatAdmin, isChatChannel, 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 isEditingInvite?: boolean;\n};\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 ManageGroupNewAdminRights,\n ManageGroupMembers,\n ManageGroupAddAdmins,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n ManageInvites,\n ManageEditInvite,\n ManageReactions,\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 shouldSkipAnimation,\n isEditingInvite,\n}) => {\n const {\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n openHistoryCalendar, addContact,\n } = getDispatch();\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.ChatNewAdminRights ? (\n HeaderContent.ManageGroupNewAdminRights\n ) : managementScreen === ManagementScreens.GroupMembers ? (\n HeaderContent.ManageGroupMembers\n ) : managementScreen === ManagementScreens.Invites ? (\n HeaderContent.ManageInvites\n ) : managementScreen === ManagementScreens.EditInvite ? (\n HeaderContent.ManageEditInvite\n ) : managementScreen === ManagementScreens.GroupAddAdmins ? (\n HeaderContent.ManageGroupAddAdmins\n ) : managementScreen === ManagementScreens.Reactions ? (\n HeaderContent.ManageReactions\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(isChannel ? 'ChannelAddSubscribers' : '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.ManageGroupNewAdminRights:\n return

{lang('SetAsAdmin')}

;\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.ManageInvites:\n return

{lang('lng_group_invite_title')}

;\n case HeaderContent.ManageEditInvite:\n return

{isEditingInvite ? lang('EditLink') : lang('NewLink')}

;\n case HeaderContent.ManageGroupAddAdmins:\n return

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

;\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 case HeaderContent.ManageReactions:\n return

{lang('Reactions')}

;\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 const isEditingInvite = Boolean(chatId && global.management.byChatId[chatId]?.editingInvite);\n\n return {\n canManage,\n canAddContact,\n isChannel,\n userId: user?.id,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n isEditingInvite,\n };\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 { getDispatch, 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 {\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 { 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 isChatProtected?: boolean;\n};\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 isChatProtected,\n}) => {\n const {\n setLocalMediaSearchType,\n loadMoreMembers,\n loadCommonChats,\n openChat,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n loadProfilePhotos,\n setNewChatMembersDialogState,\n } = getDispatch();\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 isChatProtected: chat?.isProtected,\n ...(hasMembersTab && members && { members }),\n ...(hasCommonChatsTab && user && { commonChatIds: user.commonChats?.ids }),\n };\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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiChatMember, ApiUpdateConnectionStateType,\n} from '../../api/types';\nimport { NewChatMembersProgress } from '../../types';\n\nimport { 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\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 onClose,\n isActive,\n}) => {\n const { setUserSearchQuery, loadContactList } = getDispatch();\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)(AddChatMembers));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 {\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\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 shouldSkipHistoryAnimations,\n}) => {\n const {\n toggleChatInfo,\n toggleManagement,\n openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n addChatMembers,\n setNewChatMembersDialogState,\n setEditingExportedInvite,\n } = getDispatch();\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 case ManagementScreens.Invites:\n case ManagementScreens.Reactions:\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.ChatNewAdminRights:\n case ManagementScreens.GroupAddAdmins:\n case ManagementScreens.GroupRecentActions:\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n case ManagementScreens.EditInvite:\n setManagementScreen(ManagementScreens.Invites);\n setEditingExportedInvite({ chatId, invite: undefined });\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 setEditingExportedInvite, chatId,\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { 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';\n\ntype StateProps = {\n activeDownloads: Record;\n messages: Record;\n threadsById: Record;\n }>;\n};\n\nconst startedDownloads = new Set();\n\nconst DownloadManager: FC = ({\n activeDownloads,\n messages,\n}) => {\n const { cancelMessageMediaDownload } = getDispatch();\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)(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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { LangCode } from '../../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 {\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 stopEvent from '../../util/stopEvent';\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 addedSetIds?: string[];\n};\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 addedSetIds,\n}) => {\n const {\n loadAnimatedEmojis,\n loadNotificationSettings,\n loadNotificationExceptions,\n updateIsOnline,\n loadTopInlineBots,\n loadEmojiKeywords,\n loadCountryList,\n loadAvailableReactions,\n loadStickerSets,\n loadAddedStickers,\n loadFavoriteStickers,\n ensureTimeFormat,\n openStickerSetShortName,\n checkVersionNotification,\n loadAppConfig,\n } = getDispatch();\n const isSynced = Boolean(lastSyncTime);\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 loadAppConfig();\n loadAvailableReactions();\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, loadAvailableReactions, loadAppConfig,\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 // Sticker sets\n useEffect(() => {\n if (isSynced) {\n if (!addedSetIds) {\n loadStickerSets();\n loadFavoriteStickers();\n } else {\n loadAddedStickers();\n }\n }\n }, [isSynced, addedSetIds, loadStickerSets, loadFavoriteStickers, loadAddedStickers]);\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 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 addedSetIds: global.stickers.added.setIds,\n };\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","reactorModal","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","noWebPage","selectNoWebPage","sendAs","selectSendAs","clearWebPagePreview","value","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","currentUserId","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","sendAsId","sendAsChat","selectUser","fullInfo","sendAsIds","updateSponsoredMessage","selectSponsoredMessage","random","randomId","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","animatedEmojiEffects","loadAnimatedEmojiEffects","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","invite","editingInvite","loadAndReplaceArchivedChats","CHAT_LIST_LOAD_SLICE","archived","withPinned","updateUsers","addUserStatuses","userStatusesById","updateChats","replaceChatListIds","updateChatListSecondaryInfo","loadAndUpdateUsers","contactIds","contactList","updatedUsers","loadTopMessages","afterSyncCallback","DEBUG","console","log","savedUsers","lastLocalServiceMessage","selectLastServiceNotification","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","deleteContact","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","MAX_MESSAGES_LIST_WIDTH","SIDE_COLUMN_MAX_WIDTH","MIN_LEFT_COLUMN_WIDTH","subtractXForEmojiInteraction","x","windowWidth","windowSize","width","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","min","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","availableReaction","aroundAnimation","mediaLoader","ApiMediaFormat","centerIcon","availableReactions","y","localEffect","startSize","isReversed","activeEmojiInteraction","animatedEffect","interactions","startX","startY","emoticon","selectLocalAnimatedEmojiEffectByName","timestamps","endX","endY","reaction","selectDefaultReaction","sendReaction","reactions","some","isChosen","animationLevel","settings","byKey","ANIMATION_LEVEL_MAX","activeReactions","omit","recentReactions","canSeeList","addMessageReaction","appConfig","defaultReaction","reactors","runThrottledForUpdateAppBadge","areDeepEqual","value1","value2","type1","isArray1","isArray","array1","array2","every","member1","object1","object2","key1","update","noTopChatsRequest","selectIsChatListed","loadTopChats","newProfilePhoto","closeMessageNotifications","listType","selectChatListType","updateChatListIds","isNotJoined","requestChatUpdate","leaveChat","typingStatus","senderId","isFromScheduled","hasUnreadMention","unreadMentionsCount","notifyAboutNewMessage","messageUpdate","channelId","selectCommonBoxChatId","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","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","localEmoji","selectLocalAnimatedEmoji","selectLocalAnimatedEmojiEffect","scheduledIds","selectScheduledIds","selectIsChatWithBot","selectScheduledMessages","deleteChatScheduledMessages","thread","markMessageListRead","currentPinnedIds","selectPinnedIds","newPinnedIds","newTheadInfo","messagesById","loadFullChat","scheduledMessages","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","updatedPoll","updatedResults","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","targetOption","targetOptionIndex","updatedOption","votersCount","selectIsServiceChatReady","currentReactions","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","addBlockedContact","privacy","key","rules","updateNotifySettings","peerType","shouldShowPreviews","addNotifyException","twoFaSettings","call","connectionState","groupCalls","activeGroupCallId","leaveGroupCall","shouldRemove","removeGroupCall","updateGroupCall","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","globalSearchChatId","searchDate","theme","selectTheme","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","onReset","shouldSkipTransition","openTipsChat","setGlobalSearchDate","setSettingOption","setGlobalSearchChatId","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","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","MenuItem","icon","Switcher","label","checked","noAnimation","toLowerCase","langCode","href","FEEDBACK_URL","setPermanentWebVersion","clearWebsync","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","ALL_FOLDER_ID","handleSwitchTab","forceOnHeavyAnimation","current","captureEvents","selectorToPreventScroll","onSwipe","SwipeDirection","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","IS_MAC_OS","metaKey","getKeyFromEvent","initResize","resetResize","handleMouseUp","elementRef","onResize","initialWidth","markIsActive","unmarkIsActive","initialMouseX","setInitialMouseX","initialElementWidth","setInitialElementWidth","style","remove","handleMouseMove","event","newWidth","ceil","clientX","stopDrag","offsetWidth","add","useResize","handleSettingsScreenSelect","screen","LAYERS_ANIMATION_NAME","currentScreen","isChannel","onMouseDown","onMouseUp","onDoubleClick","setSize","handleResize","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","right","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleRestartBot","handleSearchClick","focus","searchInput","IS_PWA","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","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","pinnedMessage","pinnedMessagesCount","chatTitleLength","topMessageTitle","useEnsureMessage","useWindowSize","isLeftColumnHideable","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","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","getRatios","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","QUICK_REACTION_AREA_WIDTH","QUICK_REACTION_AREA_HEIGHT","GROUP_MESSAGE_HOVER_ATTRIBUTE","useOuterHandlers","selectMessage","isInSelectMode","canReply","isProtected","onContextMenu","handleBeforeContextMenu","isContextMenuShown","contentRef","shouldHandleMouseLeave","sendDefaultReaction","isQuickReactionVisible","markQuickReactionVisible","unmarkQuickReactionVisible","isSwiped","markSwiped","unmarkSwiped","doubleTapTimeoutRef","startedAt","onRelease","handleMouseDown","preventMessageInputBlur","clearInterval","pageX","pageY","handleDoubleTap","target","contains","handleTap","handleContextMenu","stopEvent","matches","handleDoubleClick","handleContentDoubleClick","container","clientY","isVisibleX","isVisibleY","handleSendQuickReaction","currentTarget","lastGroupElement","getLastElementInDocumentGroup","removeAttribute","handleDocumentGroupMouseLeave","handleDocumentGroupMouseEnter","setAttribute","nextElementSibling","ContextMenuContainer","targetUserIds","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","observeIntersection","isEmbedded","appearanceOrder","isLastInList","useOnIntersect","noAppearanceAnimation","markShown","targetUsers","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","customText","isIntersecting","useIsIntersecting","pictogramId","isRoundVideo","getMessageRoundVideo","senderTitle","draggable","activeReaction","isInMeta","stopActiveReaction","r","centerIconId","effectId","mediaDataCenterIcon","mediaDataEffect","shouldPlay","shouldRenderAnimation","animationClassNames","handleEnded","isAnimationLoaded","markAnimationLoaded","unmarkAnimationLoaded","shouldRenderStatic","ReactionStaticEmoji","AnimatedSticker","animationData","play","noLoop","onLoad","onEnded","outgoingStatus","signature","withReactions","withReactionOffset","isActivated","markActivated","createDateTime","formatDateTimeToString","editDateTime","isEdited","editDate","forwardedDateTime","replace","views","formatTime","MessageOutgoingStatus","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","mediaHash","getMessageMediaFormat","isMediaLoaded","isMediaReady","useMediaTransition","getStickerDimensions","thumbClassName","stickerClassName","fromSticker","useBlurredMediaThumbRef","fullMediaData","useCanvasBlur","IS_CANVAS_FILTER_SUPPORTED","SELECTED_APPENDIX_COLORS","dark","outgoing","incoming","light","canAutoLoad","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","ProgressSpinner","useVideoAutoPause","playerRef","canPlay","wasPlaying","paused","canPlayRef","freezePlaying","unfreezePlaying","safePlay","unfreezePlayingOnRaf","fastRaf","useBackgroundMode","canAutoPlay","videoRef","getMessageWebPageVideo","isPlayAllowed","setIsPlayAllowed","previewClassNames","isInline","isBuffered","bufferingHandlers","useBuffering","shouldRenderPlayButton","playButtonClassNames","playProgress","setPlayProgress","handleTimeUpdate","currentTime","duration","useVideoCleanup","cancelMessageMediaDownload","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","contact","countryList","phoneCodes","phoneCodeList","openUserInfo","formatPhoneNumberWithCode","getPercentage","toFixed","answer","voteResults","maxVotersCount","correctResults","shouldAnimate","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","setIsActivated","setProgress","svgCenter","ROUND_VIDEO_DIMENSIONS_PX","playerEl","playingProgressEl","stopPlaying","capturePlaying","stopCurrentAudio","videoClassName","recentReplierIds","recentRepliers","hasUnread","recentReactors","recentReaction","isOutside","metaChildren","localSticker","soundId","playKey","useAnimatedEmoji","localStickerAnimationData","setLocalStickerAnimationData","getAnimationData","quality","APPENDIX_OWN","__html","APPENDIX_NOT_OWN","withSenderName","withAvatar","isLastInDocumentGroup","viaBotId","replyToChatId","isRepliesChat","isChatWithRepliesBot","chatUsername","forceSenderName","isAnonymousOwnMessage","canShowSender","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","selectIsDownloading","actualThreadInfo","isInDocumentGroup","documentGroupFirstMessageId","reactionMessage","selectIsMessageProtected","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","animatedEmojiEffect","selectAnimatedEmojiEffect","animatedEmojiSoundId","selectAnimatedEmojiSound","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","canAutoLoadMedia","canAutoPlayMedia","autoLoadFileMaxSizeMb","shouldLoopStickers","selectShouldLoopStickers","selectOutgoingStatus","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","areReactionsInMeta","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","clickInlineButton","bottomMarkerRef","isLocal","hasReply","isReplyMessage","hasThread","getMessageCustomShape","hasAnimatedEmoji","asForwarded","isLinkedChannelPost","isInDocumentGroupNotFirst","isInDocumentGroupNotLast","canShowActionButton","canForward","canFocus","isChannelPost","fromMessageId","withCommentButton","withQuickReactionButton","avatarPeer","senderPeer","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","withAppendix","textParts","renderMessageText","metaPosition","reactionsPosition","areReactionsEmpty","calculatedWidth","noMediaCorners","extraPadding","adminTitle","metaSafeAuthorWidth","renderReactionsAndMeta","meta","onMouseMove","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","textContentClass","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","effect","forceLoadPreview","Audio","AudioOrigin","isSelectable","onPlay","onReadMedia","Document","renderContent","dangerouslySetInnerHTML","isBot","channel","viewSponsoredMessage","openChatByInvite","startBot","shouldObserve","observe","useIntersectionObserver","rootRef","debounceMs","threshold","getUserFullName","chatInviteTitle","chatInviteHash","messageGroups","isViewportNewest","withUsers","anchorIdRef","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","isScrollingRef","isScrollPatchNeededRef","hasLinkedChat","isSchedule","onFabToggle","onNotchToggle","openHistoryCalendar","observeIntersectionForReading","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","handleStickerSelect","selectedSticker","StickerButton","isGroupChatJustCreated","renderScheduled","renderSavedMessages","renderGroup","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","focusingId","withLastMessageWhenPreloading","chatBot","botDescription","isChatLoaded","isChannelChat","isGroupChat","isChatGroup","threadFirstMessageId","selectFirstMessageId","linkedChatId","hasTools","canPost","withBottomShift","setScrollOffset","loadSponsoredMessages","loadMessageReactions","scrollOffsetRef","selectScrollOffset","anchorTopRef","listItemElementsRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","onTickEnd","listedMessages","orderBy","useInterval","loadMoreAround","isScrolled","updateStickyDates","markIsScrolled","runDebounced","useDebounce","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","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","useDebouncedMemo","INLINE_BOT_QUERY_REGEXP","HAS_NEW_LINE","MEMO_NO_RESULT","canShowHelp","usernameLowered","tempEl","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","SendAsMenu","MainButtonState","chatUser","selectChatUser","REPLIES_USER_ID","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","shouldSuggestStickers","baseEmojiKeywords","BASE_EMOJI_KEYWORD_LANG","botKeyboardMessageId","keyboardMessage","sendAsUser","editingMessage","canScheduleUntilOnline","selectUserStatus","wasOnline","withScheduledButton","shouldSchedule","botKeyboardPlaceholder","keyboardPlaceholder","stickersForEmoji","groupChatMembers","topInlineBotIds","isInlineBotLoading","chatBotCommands","botCommands","dropAreaState","onDropHide","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","addRecentEmoji","sendInlineBotResult","loadSendAs","appendixRef","html","setHtml","htmlRef","useStateRef","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","sendMessageAction","useSendMessageAction","shouldAnimateSendAsButtonRef","prevChatId","prevSendAsIds","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isBotCommandMenuOpen","openBotCommandMenu","closeBotCommandMenu","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isSendAsMenuOpen","openSendAsMenu","closeSendAsMenu","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","SEND_MESSAGE_ACTION_INTERVAL","mainButtonState","Edit","Schedule","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","isInlineBotTooltipOpen","inlineBotId","isInlineBotTooltipGallery","inlineBotSwitchPm","inlineBotResults","closeTooltip","closeInlineBotTooltip","inlineBotHelp","loadMore","loadMoreForInlineBot","queryInlineBot","resetInlineBot","markIsOpen","unmarkIsOpen","innerText","getPlainText","parseBotQuery","prevQuery","prevUsername","useInlineBotTooltip","isBotCommandTooltipOpen","close","closeBotCommandTooltip","filteredBotCommands","botTooltipCommands","setFilteredBotCommands","getFilteredCommands","nextFilteredBotCommands","prepareForRegExp","substr","useBotCommandTooltip","isCustomSendMenuOpen","canSendStickers","canSendGifs","canAttachMedia","canAttachPolls","canAttachEmbedLinks","getAllowedAttachmentOptions","isChatAdmin","slowMode","getChatSlowModeOptions","isStickerTooltipOpen","closeStickerTooltip","isDisabled","cleanHtml","trim","clearStickersForEmoji","IS_EMOJI_SUPPORTED","parseEmojiOnlyString","hasStickers","useStickerTooltip","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","editMessage","hasMessageMedia","useEditing","saveDraft","updateDraft","draftChatId","draftThreadId","currentHtml","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","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","handleSendAsMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","onSend","DropAreaState","withQuick","onHide","onFileSelect","caption","onCaptionUpdate","onFileAppend","onClear","selectedSendAsId","onInsertUserName","filteredUsers","onSelectResult","withUsername","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","emojiInteraction","EmojiInteractionAnimation","ReactorListModal","CLOSE_ANIMATION_DURATION","isImage","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","isReceiptModalOpen","isSeenByModalOpen","isReactorListModalOpen","getCanPostInChat","isBotNotStarted","isPinnedMessageList","isScheduledMessageList","currentUserBannedRights","defaultBannedRights","hasPinnedOrAudioPlayer","loadUser","closePaymentModal","clearReceipt","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanSubscribe","renderingCanStartBot","renderingCanRestartBot","renderingCanPost","renderingHasTools","renderingIsFabShown","renderingIsChannel","prevTransitionKey","handleOpenEnd","handleSlideStop","setIsReady","forceUpdate","useForceUpdate","willSwitchMessageList","ANIMATION_LEVEL_MIN","propertyName","useIsReady","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","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","onStop","onUnpin","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canAddContact","getCanAddContact","canManage","isEditingInvite","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","isAddingChatMembers","profileState","managementScreen","shouldSkipAnimation","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","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","ManageGroupNewAdminRights","ManageGroupMembers","ManageInvites","ManageEditInvite","ManageGroupAddAdmins","ManageReactions","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","isChatProtected","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","setEditingExportedInvite","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","loadAvailableReactions","loadAddedStickers","ensureTimeFormat","openStickerSetShortName","checkVersionNotification","loadAppConfig","isSynced","LOCATION_HASH","processDeepLink","decodeURIComponent","middleColumnTransitionClassNames","rightColumnTransitionClassNames","prevIsLeftColumnShown","dispatchHeavyAnimationEnd","waitForTransitionEnd","prevIsRightColumnShown","initialUnread","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","handleStickerSetModalClose","usePreventPinchZoomGesture","onDrop","onDragOver","initApi"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/354.1679b9bab979435e8c49.js b/dist/354.1679b9bab979435e8c49.js new file mode 100644 index 000000000..cd9c81767 --- /dev/null +++ b/dist/354.1679b9bab979435e8c49.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,r,t={2993:(e,r,t)=>{var n=t(5802);"undefined"!=typeof window&&window.innerHeight,Math.round(425),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]);const a=new Set(["image/png","image/gif","image/jpeg"]),o=new Set(["video/mp4"]);new Set([...a,...o]),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),i({type:"unhandledError",error:{message:e.error.message||"Uncaught exception in worker"}})},self.addEventListener("unhandledrejection",(e=>{console.error(e),i({type:"unhandledError",error:{message:e.reason.message||"Uncaught rejection in worker"}})}));const s=new Map;function i(e,r){r?postMessage(e,r):postMessage(e)}let c;self.importScripts("rlottie-wasm.js");const l=new Promise((e=>{Module.onRuntimeInitialized=()=>{c={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()}})),d=new Map;async function u(e){const r=await fetch(e),t=r.headers.get("Content-Type");if(null!=t&&t.startsWith("text/"))return r.text();const a=await r.arrayBuffer();return(0,n.inflate)(a,{to:"string"})}function m(e,r,t){const n=r?30:60,a=JSON.parse(e).fr||n,o=a%n==0?a/n:1;return{reduceFactor:o,msPerFrame:1e3/(a/o),reducedFramesCount:Math.ceil(t/o)}}var p;p={init:async function(e,r,t,n,a){c||await l;const o=await u(r),s=allocate(intArrayFromString(o),"i8",0),i=c.init(),p=c.loadFromData(i,s);c.resize(i,t,t);const{reduceFactor:g,msPerFrame:f,reducedFramesCount:h}=m(o,n,p);d.set(e,{imgSize:t,reduceFactor:g,handle:i}),a(g,f,h)},changeData:async function(e,r,t,n){c||await l;const a=await u(r),o=allocate(intArrayFromString(a),"i8",0),{handle:s}=d.get(e),i=c.loadFromData(s,o),{reduceFactor:p,msPerFrame:g,reducedFramesCount:f}=m(a,t,i);n(p,g,f)},renderFrames:async function(e,r,t,n){c||await l;const{imgSize:a,reduceFactor:o,handle:s}=d.get(e);for(let e=r;e<=t;e++){const r=e*o;c.render(s,r);const t=c.buffer(s),i=Module.HEAPU8.subarray(t,t+a*a*4);n(e,new Uint8ClampedArray(i).buffer)}},destroy:function(e){const r=d.get(e);c.destroy(r.handle),d.delete(e)}},onmessage=async e=>{const{data:r}=e;switch(r.type){case"callMethod":{const{messageId:e,name:t,args:n}=r;try{if(e){const r=(...r)=>{const t=r[r.length-1];i({type:"methodCallback",messageId:e,callbackArgs:r},t instanceof ArrayBuffer?[t]:void 0)};s.set(e,r),n.push(r)}const[r,a]=await p[t](...n)||[];e&&i({type:"methodResponse",messageId:e,response:r},a)}catch(r){e&&i({type:"methodResponse",messageId:e,error:{message:r.message}})}e&&s.delete(e);break}case"cancelProgress":{const e=s.get(r.messageId);e&&(e.isCanceled=!0);break}}}}},n={};function a(e){var r=n[e];if(void 0!==r)return r.exports;var o=n[e]={exports:{}};return t[e].call(o.exports,o,o.exports,a),o.exports}a.m=t,a.x=()=>{var e=a.O(void 0,[802],(()=>a(2993)));return a.O(e)},e=[],a.O=(r,t,n,o)=>{if(!t){var s=1/0;for(d=0;d=o)&&Object.keys(a.O).every((e=>a.O[e](t[c])))?t.splice(c--,1):(i=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[t,n,o]},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,t)=>(a.f[t](e,r),r)),[])),a.u=e=>e+".ad1608fd78ee08b3bcb1.js",a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var r=a.g.document;if(!e&&r&&(r.currentScript&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");t.length&&(e=t[t.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{var e={354:1};a.f.i=(r,t)=>{e[r]||importScripts(a.p+a.u(r))};var r=self.webpackChunktelegram_t=self.webpackChunktelegram_t||[],t=r.push.bind(r);r.push=r=>{var[n,o,s]=r;for(var i in o)a.o(o,i)&&(a.m[i]=o[i]);for(s&&s(a);n.length;)e[n.pop()]=1;t(r)}})(),r=a.x,a.x=()=>a.e(802).then(r),a.x()})(); +//# sourceMappingURL=354.1679b9bab979435e8c49.js.map \ No newline at end of file diff --git a/dist/354.1679b9bab979435e8c49.js.map b/dist/354.1679b9bab979435e8c49.js.map new file mode 100644 index 000000000..1f5d20d74 --- /dev/null +++ b/dist/354.1679b9bab979435e8c49.js.map @@ -0,0 +1 @@ +{"version":3,"file":"354.1679b9bab979435e8c49.js","mappings":"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","sources":["webpack://telegram-t/webpack/runtime/chunk loaded","webpack://telegram-t/webpack/runtime/startup chunk dependencies","webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/util/createWorkerInterface.ts","webpack://telegram-t/./src/lib/rlottie/rlottie.worker.ts","webpack://telegram-t/webpack/bootstrap","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/publicPath","webpack://telegram-t/webpack/runtime/importScripts chunk loading","webpack://telegram-t/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(802).then(next);\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-v7';\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;\nexport const REACTION_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\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\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\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\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\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 { inflate } from 'pako/dist/pako_inflate';\nimport 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 HIGH_PRIORITY_MAX_FPS = 60;\nconst LOW_PRIORITY_MAX_FPS = 30;\n\nconst renderers = new Map();\n\nasync function init(\n key: string,\n animationData: string,\n imgSize: number,\n isLowPriority: boolean,\n onInit: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const json = await extractJson(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 const { reduceFactor, msPerFrame, reducedFramesCount } = calcParams(json, isLowPriority, framesCount);\n\n renderers.set(key, { imgSize, reduceFactor, handle });\n onInit(reduceFactor, msPerFrame, reducedFramesCount);\n}\n\nasync function changeData(\n key: string,\n animationData: string,\n isLowPriority: boolean,\n onInit: CancellableCallback,\n) {\n if (!rLottieApi) {\n await rLottieApiPromise;\n }\n\n const json = await extractJson(animationData);\n const stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n const { handle } = renderers.get(key)!;\n const framesCount = rLottieApi.loadFromData(handle, stringOnWasmHeap);\n\n const { reduceFactor, msPerFrame, reducedFramesCount } = calcParams(json, isLowPriority, framesCount);\n onInit(reduceFactor, msPerFrame, reducedFramesCount);\n}\n\nasync function extractJson(animationData: string) {\n const response = await fetch(animationData);\n const contentType = response.headers.get('Content-Type');\n\n // Support deprecated JSON format cached locally\n if (contentType?.startsWith('text/')) {\n return response.text();\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return inflate(arrayBuffer, { to: 'string' });\n}\n\nfunction calcParams(json: string, isLowPriority: boolean, framesCount: number) {\n const animationData = JSON.parse(json);\n const maxFps = isLowPriority ? LOW_PRIORITY_MAX_FPS : HIGH_PRIORITY_MAX_FPS;\n const sourceFps = animationData.fr || maxFps;\n const reduceFactor = sourceFps % maxFps === 0 ? sourceFps / maxFps : 1;\n\n return {\n reduceFactor,\n msPerFrame: 1000 / (sourceFps / reduceFactor),\n reducedFramesCount: Math.ceil(framesCount / reduceFactor),\n };\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","// 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// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [802], () => (__webpack_require__(2993)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\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 and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"ad1608fd78ee08b3bcb1\" + \".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 undefined;\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))","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;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t354: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunktelegram_t\"] = self[\"webpackChunktelegram_t\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","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","async","extractJson","animationData","response","fetch","contentType","headers","get","startsWith","text","arrayBuffer","inflate","to","calcParams","json","isLowPriority","framesCount","maxFps","sourceFps","JSON","parse","fr","reduceFactor","msPerFrame","reducedFramesCount","ceil","api","key","imgSize","onInit","stringOnWasmHeap","allocate","intArrayFromString","handle","set","changeData","renderFrames","fromIndex","toIndex","onProgress","i","realIndex","bufferPointer","HEAPU8","subarray","Uint8ClampedArray","renderer","delete","onmessage","messageId","name","args","callback","callbackArgs","lastArg","length","ArrayBuffer","undefined","push","isCanceled","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","x","__webpack_exports__","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","Object","keys","every","splice","r","f","chunkId","all","reduce","promises","u","miniCssF","g","globalThis","this","Function","o","obj","prop","prototype","hasOwnProperty","scriptUrl","location","document","currentScript","src","scripts","getElementsByTagName","Error","replace","p","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","then"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/354.c55fdff947ef87368301.js b/dist/354.c55fdff947ef87368301.js deleted file mode 100644 index 06079e2b5..000000000 --- a/dist/354.c55fdff947ef87368301.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"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.c55fdff947ef87368301.js.map \ No newline at end of file diff --git a/dist/354.c55fdff947ef87368301.js.map b/dist/354.c55fdff947ef87368301.js.map deleted file mode 100644 index bb6f0086c..000000000 --- a/dist/354.c55fdff947ef87368301.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"354.c55fdff947ef87368301.js","mappings":"mBAuCsC,oBAAXA,QAA0BA,OAAOC,YAoEzBC,KAAKC,MAAM,KACJ,IAAIC,IAAI,CAChD,aAAc,sBAAuB,iBAAkB,0BAA2B,kBA7G7E,MAuIMC,EAAgC,IAAID,IAAI,CACnD,YAAa,YAAa,eAGfE,EAAgC,IAAIF,IAAI,CACnD,cAGwC,IAAIA,IAAI,IAC7CC,KACAC,IAYyC,IAAIF,IAAI,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OC9E3JG,KAAKC,QAAWC,IAEdC,QAAQC,MAAMF,GACdG,EAAa,CAAEC,KAAM,iBAAkBF,MAAO,CAAEG,QAASL,EAAEE,MAAMG,SAAW,mCAG9EP,KAAKQ,iBAAiB,sBAAuBN,IAE3CC,QAAQC,MAAMF,GACdG,EAAa,CAAEC,KAAM,iBAAkBF,MAAO,CAAEG,QAASL,EAAEO,OAAOF,SAAW,qCAjFjF,MAAMG,EAAgB,IAAIC,IAqF1B,SAASN,EAAaO,EAAyBC,GACzCA,EACFC,YAAYF,EAAMC,GAElBC,YAAYF,GCnFhB,IAAIG,EAFJf,KAAKgB,cAAc,mBAGnB,MAAMC,EAAoB,IAAIC,SAAeC,IAC3CC,OAAOC,qBAAuB,KAC5BN,EAAa,CACXO,KAAMF,OAAOG,MAAM,cAAe,GAAI,IACtCC,QAASJ,OAAOG,MAAM,iBAAkB,GAAI,CAAC,WAC7CE,OAAQL,OAAOG,MAAM,gBAAiB,GAAI,CAAC,SAAU,SAAU,WAC/DG,OAAQN,OAAOG,MAAM,gBAAiB,SAAU,CAAC,WACjDI,OAAQP,OAAOG,MAAM,gBAAiB,GAAI,CAAC,SAAU,WACrDK,aAAcR,OAAOG,MAAM,wBAAyB,SAAU,CAAC,SAAU,YAG3EJ,QAIEU,EAAY,IAAIlB,IDpBP,IAAyBmB,EAAAA,EC8FlB,CACpBR,KArEFS,eACEC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEKtB,SACGE,EAGR,MAAMqB,EAAOC,KAAKC,UAAUP,GACtBQ,EAAmBC,SAASC,mBAAmBL,GAAO,KAAM,GAC5DM,EAAS7B,EAAWO,OACpBuB,EAAc9B,EAAWa,aAAagB,EAAQH,GACpD1B,EAAWU,OAAOmB,EAAQV,EAASA,GAEnCL,EAAUiB,IAAId,EAAK,CAAEE,QAAAA,EAASE,aAAAA,EAAcQ,OAAAA,IAE5CP,EAAO1C,KAAKoD,KAAKF,EAAcT,KAkD/BY,WA/CFjB,eACEC,EACAC,EACAI,GAEKtB,SACGE,EAGR,MAAMqB,EAAOC,KAAKC,UAAUP,IACtB,aAAEG,EAAF,OAAgBQ,GAAWf,EAAUoB,IAAIjB,GAEzCS,EAAmBC,SAASC,mBAAmBL,GAAO,KAAM,GAC5DO,EAAc9B,EAAWa,aAAagB,EAAQH,GACpDJ,EAAO1C,KAAKoD,KAAKF,EAAcT,KAkC/Bc,aA/BFnB,eACEC,EAAamB,EAAmBC,EAAiBC,GAE5CtC,SACGE,EAGR,MAAM,QAAEiB,EAAF,aAAWE,EAAX,OAAyBQ,GAAWf,EAAUoB,IAAIjB,GAExD,IAAK,IAAIsB,EAAIH,EAAWG,GAAKF,EAASE,IAAK,CACzC,MAAMC,EAAYD,EAAIlB,EAEtBrB,EAAWY,OAAOiB,EAAQW,GAC1B,MAAMC,EAAgBzC,EAAWW,OAAOkB,GAClChC,EAAOQ,OAAOqC,OAAOC,SAASF,EAAeA,EAAiBtB,EAAUA,EAAU,GAExFmB,EAAWC,EADS,IAAIK,kBAAkB/C,GAAMc,UAiBlDF,QAZF,SAAiBQ,GACf,MAAM4B,EAAW/B,EAAUoB,IAAIjB,GAE/BjB,EAAWS,QAAQoC,EAAShB,QAE5Bf,EAAUgC,OAAO7B,KD1FjB8B,UAAY/B,MAAAA,IACV,MAAM,KAAEnB,GAASL,EAEjB,OAAQK,EAAKN,MACX,IAAK,aAAc,CACjB,MAAM,UAAEyD,EAAF,KAAaC,EAAb,KAAmBC,GAASrD,EAClC,IACE,GAAImD,EAAW,CACb,MAAMG,EAAW,IAAIC,KACnB,MAAMC,EAAUD,EAAaA,EAAaE,OAAS,GAEnDhE,EAAa,CACXC,KAAM,iBACNyD,UAAAA,EACAI,aAAAA,GACCC,aAAmBE,YAAc,CAACF,QAAWG,IAGlD7D,EAAcoC,IAAIiB,EAAWG,GAE7BD,EAAKO,KAAKN,GAGZ,MAAOO,EAAU5D,SAAuBiB,EAAIkC,MAASC,IAAU,GAE3DF,GACF1D,EACE,CACEC,KAAM,iBACNyD,UAAAA,EACAU,SAAAA,GAEF5D,GAGJ,MAAOT,GAMH2D,GACF1D,EAAa,CACXC,KAAM,iBACNyD,UAAAA,EACA3D,MAAO,CAAEG,QAASH,EAAMG,WAK1BwD,GACFrD,EAAcmD,OAAOE,GAGvB,MAEF,IAAK,iBAAkB,CACrB,MAAMG,EAAWxD,EAAcuC,IAAIrC,EAAKmD,WACpCG,IACFA,EAASQ,YAAa,GAGxB,U","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-v7';\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;\nexport const REACTION_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\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\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\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\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\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/11.58cedc04083d3a8f14c7.css b/dist/37.9e975e031ef296075093.css similarity index 99% rename from dist/11.58cedc04083d3a8f14c7.css rename to dist/37.9e975e031ef296075093.css index ca27346c8..30f9ee18f 100644 --- a/dist/11.58cedc04083d3a8f14c7.css +++ b/dist/37.9e975e031ef296075093.css @@ -19,7 +19,7 @@ .Badge-transition{opacity:1;transition:transform .3s cubic-bezier(0.34, 1.56, 0.64, 1)}.Badge-transition:not(.open){transform:scale(0);opacity:0}.Badge-transition:not(.shown){display:none}.Badge-transition.closing{transition:transform .2s ease-out,opacity .2s ease-out}.Badge-wrapper{display:flex}.Badge-wrapper .Badge{margin-inline-start:.5rem}.Badge{min-width:1.5rem;height:1.5rem;background:var(--color-gray);border-radius:.75rem;padding:0 .4375rem;color:#fff;font-size:.875rem;line-height:1.5625rem;font-weight:500;text-align:center;flex-shrink:0}body.is-macos .Badge{line-height:1.5rem}body.is-ios .Badge{line-height:1.375rem;min-width:1.375rem;height:1.375rem;padding:0 .375rem}.Badge.mention,.Badge.unread:not(.muted){background:var(--color-green);color:var(--color-white)}.Badge.pinned:not(.unread){color:var(--color-pinned);background:transparent;width:1.5rem;padding:0}.Badge.pinned:not(.unread) i{font-size:1.5rem}.Badge.mention{width:1.5rem;padding:.25rem}.Badge.mention i{font-size:1rem;vertical-align:super}body.is-ios .Badge.mention{width:1.375rem;padding:.25rem}body.is-ios .Badge.mention i{font-size:.875rem} @keyframes bar-animation-transform-1{0%{transform:scaleY(0.33)}12.5%{transform:scaleY(1.66)}25%{transform:scaleY(0.33)}37.5%{transform:scaleY(1)}50%{transform:scaleY(0.33)}62.5%{transform:scaleY(1.66)}75%{transform:scaleY(0.33)}87.5%{transform:scaleY(1.66)}100%{transform:scaleY(0.33)}}@keyframes bar-animation-transform-2{0%{transform:scaleY(1)}12.5%{transform:scaleY(0.33)}25%{transform:scaleY(1.66)}37.5%{transform:scaleY(0.33)}50%{transform:scaleY(1)}62.5%{transform:scaleY(0.33)}75%{transform:scaleY(1.66)}87.5%{transform:scaleY(0.33)}100%{transform:scaleY(1)}}.ChatCallStatus{position:absolute;right:6px;bottom:0;width:20px;height:20px;border-radius:50%;background-color:#0ac630;border:2px solid var(--color-background);overflow:hidden}.ChatCallStatus .indicator{width:100%;height:100%;display:flex;align-items:center;justify-content:center;border-radius:50%}.ChatCallStatus .indicator>div{width:2px;height:6px;background:var(--color-background);border-radius:1px;margin:1px;will-change:transform;transform:translateZ(0)}.ChatCallStatus .indicator>div:nth-child(odd){transform:scaleY(0.8)}.ChatCallStatus .indicator>div:nth-child(even){transform:scaleY(1.33)}.ChatCallStatus.selected{background-color:var(--color-white);border-color:var(--color-chat-active)}.ChatCallStatus.selected .indicator div{background-color:var(--color-chat-active)}.ChatCallStatus.active .indicator div:nth-child(odd){animation:bar-animation-transform-2 3.2s normal infinite}.ChatCallStatus.active .indicator div:nth-child(even){animation:bar-animation-transform-1 3.2s normal infinite} .Chat{--background-color: var(--color-background);position:absolute;top:0;left:0;margin:0;width:100%}body.is-ios .Chat,body.is-macos .Chat{--color-text-meta: var(--color-text-meta-apple)}.Chat.animate-opacity{will-change:opacity;transition:opacity .2s ease-out}.Chat.animate-transform{will-change:transform;transition:transform .2s ease-out}.Chat:hover .Avatar.online::after,.Chat.ListItem.has-menu-open .Avatar.online::after{border-color:var(--color-chat-hover)}@media(max-width: 600px){.Chat.selected{--background-color: var(--color-chat-hover) !important}.Chat.selected .Avatar.online::after{border-color:var(--color-chat-hover)}}@media(min-width: 600px){.Chat.selected,.Chat.selected:hover{--background-color: var(--color-chat-active) !important}.Chat.selected .Avatar.online::after,.Chat.selected:hover .Avatar.online::after{border-color:var(--color-chat-active) !important;background:var(--color-white)}.Chat.selected .ListItem-button,.Chat.selected:hover .ListItem-button{--background-color: var(--color-chat-active) !important;--color-text: var(--color-white);--color-text-meta-colored: var(--color-white);--color-text-meta: var(--color-white);--color-text-secondary: var(--color-white);--color-error: var(--color-white);--color-pinned: var(--color-white)}.Chat.selected .icon-muted,.Chat.selected:hover .icon-muted{color:var(--color-white) !important}.Chat.selected .Badge:not(.pinned),.Chat.selected:hover .Badge:not(.pinned){background:var(--color-white);color:var(--color-chat-active)}}@media(max-width: 600px){.Chat .ListItem-button{border-radius:0 !important}}.Chat .status{position:relative;flex-shrink:0}.Chat .info .subtitle{margin-top:-0.125rem}.Chat .info h3{width:auto;max-width:80%}.Chat .info .icon-muted{font-size:1.25rem;margin-left:.25rem;margin-top:-0.0625rem;color:#c6c8ca}body.is-ios .Chat .info .icon-muted{margin-top:0;margin-right:.5rem}.Chat .info .LastMessageMeta{margin-left:auto}body.is-ios .Chat .info .LastMessageMeta{font-size:.875rem;margin-right:0}.Chat .info .last-message,.Chat .info .typing-status{padding-right:.25rem;flex-grow:1;color:var(--color-text-secondary);unicode-bidi:plaintext}.Chat .info .last-message[dir=ltr],.Chat .info .typing-status[dir=ltr]{text-align:left}.Chat .info .last-message .sender-name,.Chat .info .typing-status .sender-name{color:var(--color-text)}.Chat .info .last-message .draft,.Chat .info .typing-status .draft{color:var(--color-error)}.Chat .info .last-message .draft::after{content:": "}.Chat .info .last-message .colon{margin-inline-end:.25rem}.Chat .info .last-message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-0.25rem;margin-inline-end:.25rem}body.is-ios .Chat .info .last-message img{width:1.125rem;height:1.125rem;vertical-align:-0.1875rem}.Chat .info .last-message img.round{border-radius:.625rem}.Chat .info .last-message .emoji-small{width:1rem;height:1rem;vertical-align:-0.125rem}.Chat .info .last-message .icon-play{position:relative;display:inline-block;font-size:.75rem;color:#fff;margin-inline-start:-1.25rem;margin-inline-end:.5rem;bottom:.0625rem}body.is-ios .Chat .info .last-message .icon-play{margin-inline-start:-1.125rem;bottom:0}.Chat[dir=rtl] .info .LastMessageMeta{margin-left:0;margin-right:auto}.Chat[dir=rtl] .info .title,.Chat[dir=rtl] .info .subtitle{padding-left:.15rem;padding-right:0}.Chat[dir=rtl] .info .icon-muted{margin-left:0;margin-right:.25rem}.Chat[dir=rtl] .info .last-message,.Chat[dir=rtl] .info .typing-status{padding-left:.5rem;padding-right:0;text-align:right;unicode-bidi:plaintext} -.AnimatedEmoji{margin-bottom:.75rem}.AnimatedEmoji img{position:absolute;width:100%;height:100%}.AnimatedEmoji.like-sticker-thumb img{transform:scale(0.8)} +.AnimatedEmoji{cursor:pointer;margin-bottom:.75rem}.AnimatedEmoji img{position:absolute;width:100%;height:100%}.AnimatedEmoji.like-sticker-thumb img{transform:scale(0.8)} .EmptyFolder{width:100%;height:80%;display:flex;align-items:center;justify-content:center;flex-direction:column}@media(max-height: 480px){.EmptyFolder{height:100%}}.EmptyFolder .sticker{height:8rem;margin-bottom:1.875rem}.EmptyFolder .title{font-size:1.25rem;margin-bottom:.125rem}.EmptyFolder .description{font-size:.875rem;color:var(--color-text-secondary)}body.is-ios .EmptyFolder .description,body.is-macos .EmptyFolder .description{color:var(--color-text-secondary-apple)}.EmptyFolder .Button.pill{margin-top:.625rem;font-weight:500;padding-inline-start:.75rem;unicode-bidi:plaintext}.EmptyFolder .Button.pill i{margin-inline-end:.625rem;font-size:1.5rem} .NothingFound{display:flex;align-items:center;justify-content:center;color:var(--color-text-meta)}.NothingFound.with-description{flex-direction:column}.NothingFound .AnimatedSticker{margin:0 auto}.NothingFound .description{color:var(--color-text-secondary);font-size:.875rem;text-align:center;margin:1rem 0 0;unicode-bidi:plaintext} .Media{height:0;padding-bottom:100%;overflow:hidden;position:relative;cursor:pointer}.Media .video-duration{position:absolute;left:.25rem;top:.25rem;background:rgba(0,0,0,.25);color:#fff;font-size:.75rem;padding:0 .3125rem;border-radius:.1875rem;line-height:1.125rem}.Media img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover} @@ -36,4 +36,4 @@ .TextFormatter{transform:translate(-50%, -3.25rem)}.TextFormatter,.TextFormatter-link-control{position:absolute;background:var(--color-background);border-radius:var(--border-radius-messages);padding:.5rem .375rem;box-shadow:0 1px 2px var(--color-default-shadow)}.TextFormatter-link-control{left:0;top:0;opacity:0;pointer-events:none;transition:opacity .3s ease}.Modal .TextFormatter-link-control{max-width:100%}@media(max-width: 600px){.TextFormatter-link-control{max-width:calc(100vw - var(--text-formatter-left) + 3rem)}}.TextFormatter-link-control input{border:none !important;outline:none !important;width:100%;color:var(--color-text);background-color:var(--color-background)}.TextFormatter-buttons,.TextFormatter-link-url-confirm{display:flex;flex-wrap:nowrap;align-items:center}.TextFormatter-divider{width:1px;height:1.75rem;margin:0 .25rem;background-color:var(--color-borders)}.TextFormatter-link-url-input-wrapper{width:20rem;position:relative;max-width:100%}@media(max-width: 600px){.TextFormatter-link-url-input-wrapper{max-width:90vw}}.TextFormatter-link-url-input-wrapper::before,.TextFormatter-link-url-input-wrapper::after{content:"";display:block;position:absolute;top:0;bottom:0;width:1rem;z-index:2;opacity:0;transition:opacity .2s ease}.TextFormatter-link-url-input-wrapper::before{left:0;background:linear-gradient(to right, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper::after{right:0;background:linear-gradient(to left, var(--color-background) 0.25rem, transparent 1rem)}.TextFormatter-link-url-input-wrapper.mask-left::before{opacity:1}.TextFormatter-link-url-input-wrapper.mask-right::after{opacity:1}.TextFormatter-link-url-confirm{flex-shrink:0;opacity:0;transition:opacity .3s ease}.TextFormatter-link-url-confirm.shown{opacity:1}.TextFormatter.link-control-shown .TextFormatter-link-control{opacity:1;pointer-events:all}.TextFormatter .Button{width:2rem;height:2rem;padding:.25rem;font-size:1.5rem;margin:0 .125rem;border-radius:var(--border-radius-messages-small);flex-shrink:0;cursor:pointer}.TextFormatter .Button.active{background-color:var(--color-primary) !important;color:#fff}.TextFormatter .Button.disabled{opacity:.5;pointer-events:none} .Picker{height:100%;display:flex;flex-direction:column;overflow:hidden}.Picker .picker-header{padding:0 1rem .25rem .75rem;border-bottom:1px solid var(--color-borders);display:flex;flex-flow:row wrap;flex-shrink:0;overflow-y:auto;max-height:20rem}.Picker .picker-header .input-group{margin-bottom:.5rem;margin-left:.5rem;flex-grow:1}.Picker .picker-header .form-control{height:2rem;border:none;border-radius:0;padding:0;box-shadow:none}.Picker .picker-list{flex-grow:1;overflow-y:auto;overflow-x:hidden;padding:.5rem}@media(max-width: 600px){.Picker .picker-list{padding-left:0 !important;padding-right:0 !important}}.Picker .no-results{height:100%;margin:0;padding:1rem 1rem;display:flex;align-items:center;justify-content:center;color:var(--color-text-secondary)} -/*# sourceMappingURL=11.58cedc04083d3a8f14c7.css.map*/ \ No newline at end of file +/*# sourceMappingURL=37.9e975e031ef296075093.css.map*/ \ No newline at end of file diff --git a/dist/37.9e975e031ef296075093.css.map b/dist/37.9e975e031ef296075093.css.map new file mode 100644 index 000000000..a16de7a68 --- /dev/null +++ b/dist/37.9e975e031ef296075093.css.map @@ -0,0 +1 @@ +{"version":3,"file":"37.9e975e031ef296075093.css","mappings":"AAAA,YACE,kBAEA,cACE,WACA,YACA,wCACA,gCAEA,oCACE,kBACA,MACA,OAGF,kEACE,wBAKJ,kCACE,2BAMF,4DAEE,eACA,0FAEE,+BAGF,gFACE,kBACA,yBACA,MACA,OACA,6CACA,mBAKF,sBACE,2BAIA,kCACE,4CAGF,gCACE,2CAMJ,gCACE,4BAIA,4CACE,qDAGF,0CACE,sDAOJ,0BACE,4BAIA,sCACE,4CAGF,oCACE,2CAKF,oCACE,2BAIA,gDACE,qDAGF,8CACE,sDAWN,2BACE,wCAGF,6BACE,4BAIA,yCACE,gCAGF,uCACE,+BAMJ,uCACE,6BAIA,mDACE,yCAGF,iDACE,0CASJ,6BACE,sBACA,wBACA,UAGF,2BACE,sBACA,6BACA,UAIA,uCACE,+FAGF,qCACE,6FAMJ,uCACE,wBACA,UAGF,qCACE,8BACA,UAIA,iDACE,iHAGF,+CACE,mHASJ,4BACE,wBACA,mBACA,UAGF,0BACE,wBACA,UAMA,sCACE,qCAGF,oCACE,gEAMJ,sCACE,mBAGF,oCACE,sBAIA,gDACE,mFAGF,8CACE,sFASJ,uBACE,UAGF,qBACE,UAIA,iCACE,qCAGF,+BACE,oCASN,yBACE,4CACA,gBAEA,6BACE,mCAGF,6BACE,2BAIA,yCACE,mDAGF,uCACE,2CAMJ,uCACE,2BACA,YAIA,mDACE,qDAGF,iDACE,6DAUJ,2BACE,mCAGF,6BACE,wBACA,mBACA,UAEA,4CACE,uCAEA,qEACE,wCAKN,2BACE,2BAIA,uCACE,mCAGF,qCACE,uCAMJ,qCACE,qBAIA,iDACE,iDAGF,+CACE,6CASJ,uBACE,gEAIA,iCACE,kCAMJ,mCACE,0DAGF,iCACE,sCAIA,6CACE,6CAGF,2CACE,eASR,2BACE,GACE,UAEF,KACE,WAIJ,4BACE,GACE,UAEF,KACE,WAIJ,qCACE,GACE,UAEF,KACE,WAIJ,sCACE,GACE,UAEF,KACE,WAOJ,oBACE,GACE,2BAEF,KACE,yBAIJ,qBACE,GACE,wBAEF,KACE,6BAIJ,8BACE,GACE,wBAEF,KACE,4BAIJ,+BACE,GACE,4BAEF,KACE,yBAOJ,uBACE,GACE,4BAEF,KACE,yBAIJ,wBACE,GACE,wBAEF,KACE,8BAIJ,iCACE,GACE,wBAEF,KACE,6BAIJ,kCACE,GACE,6BAEF,KACE,yBAOJ,8BACE,GACE,6BAEF,KACE,yBAIJ,+BACE,GACE,wBAEF,KACE,+BAIJ,wCACE,GACE,wBAEF,KACE,8BAIJ,yCACE,GACE,8BAEF,KACE,yBAOJ,6BACE,GACE,qBAEF,KACE,oBAIJ,uCACE,GACE,mBAEF,KACE,sBAIJ,wCACE,GACE,sBAEF,KACE,oBAOJ,4BACE,GACE,wBACA,UAEF,KACE,2BACA,iDAIJ,sCACE,GACE,2BACA,gDAEF,KACE,wBACA,WAQJ,oBACE,GACE,mBACA,UAEF,KACE,qBACA,WAIJ,8BACE,GACE,qBACA,UAEF,KACE,mBACA,WAOJ,wBACE,GACE,2BAEF,KACE,yBAIJ,kCACE,GACE,wBAEF,KACE,4BAOJ,qBACE,GACE,gEAEF,KACE,2DAOJ,+BACE,GACE,0DAEF,KACE,iE;AC3qBJ,iBACE,kBACA,UACA,eACA,gBACA,qFACA,kBACA,eAEA,0BACE,kCACA,oBAGF,wBACE,sBAEA,+BACE,WACA,kBACA,eACA,gBACA,sBACA,sBACA,SACA,QACA,qCAIJ,gDACE,WACA,YACA,iFAEA,8DACE,sBACA,aACA,cAIJ,yBACE,cACA,eAEA,6BACE,WACA,YACA,eAGF,gCACE,iBAIJ,6BACE,wCAGF,qBACE,cACA,yBACA,yBACA,yDAGF,wBACE,iCAIJ,oCACE,KACE,uBAEF,GACE,0+B;AC9EJ,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,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,oBACE,iBAGF,mBACE,kCACA,mBACA,gBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;ACtKJ,UACE,kBAGE,oGACE,WACA,kBACA,SACA,YACA,QACA,iBACA,iCAGF,oFACE,cAGF,8EACE,OAMF,oDACE,gBACA,uBAIJ,2BACE,WACA,yCACA,uBACA,2BACA,wBACA,aACA,aACA,kBACA,gBACA,mBACA,mBACA,wBACA,2CACA,mCAEA,6BACE,iBACA,kBACA,kCAIJ,oFACE,mBACA,uBAIA,uCACE,kBACA,WAIJ,mBACE,oBAEA,oCACE,WAKF,0DACE,eAEA,gFACE,4BAGF,qBACE,gIACE,6CAIJ,yBACE,iEACE,6CAMR,yBAGI,4HACE,yDAKN,yCACE,4CAGF,iBACE,qBAEA,kCACE,mBAIJ,mBACE,oBAGF,gBACE,4CAIA,uCACE,yBAEA,yCACE,cAKN,uBACE,kBAEA,+BACE,WAEA,gDACE,6BACA,8BAKN,8BACE,iBAEA,sFAEE,0DAGF,+CACE,iBAGF,sCACE,cACA,mBAGF,oCACE,YACA,gBAGF,6EACE,gBACA,aACA,2BACA,mBAGF,gKACE,eACA,sBACA,SACA,gBACA,mBACA,uBACA,mBAIA,wCACE,gBAGF,mDACE,cACA,eACA,mBAGF,4CACE,2BACA,wBACA,cAIJ,6FAEE,kBACA,oBACA,kCAGF,wCACE,aACA,mBACA,YACA,gBAEA,uGACE,kBACA,oBACA,kCACA,qBAEA,qHACE,2BAGF,oPAEE,mBACA,WAGF,gTAEE,kBAKN,6PAGE,mBACA,uBAMA,4UAEE,mBAKF,wDACE,4CAGF,+CACE,kBACA,eAGF,qDACE,WAMJ,uCACE,qBAGF,mCACE,cAGF,6EACE,eACA,mBACA,gBACA,mBACA,uBACA,gBAGF,iDACE,iBACA,eAGF,0CACE,kCACA,kBAEA,mEACE,wBACA,mBACA,qBACA,kBAKF,0DACE,cACA,kBAGF,mDACE,eACA,cAKN,2BACE,SAEA,4CACE,eACA,aACA,mBAGF,mCACE,WACA,YAGF,qCACE,cACA,cACA,SACA,kBAIA,8CACE,eACA,mBAKN,0BACE,YACA,oBACA,gBAEA,qEACE,cACA,mBAGF,iCACE,oBACA,gBACA,uBACA,mBAGF,oCACE,kBACA,mBACA,kCAEA,8CACE,oBAGF,0CACE,wBAMJ,sCACE,iBACA,e;ACjYN,cACE,qBACA,cACA,aACA,cACA,yDACA,4BACA,qBACA,gC;ACRF,2BACE,qBACA,oCAGE,WACE,kCACA,0BAIJ,YACE,WACA,gBACA,iCAEA,aACE,uDACA,6FAEA,mCAEE,6BAMR,KACE,2BACE,kCAIJ,KACE,0BACE,E;ACpCJ,wBACE,kBACA,YACA,gBACA,mBACA,8BAEA,0BAPF,wBAQI,8CAGF,sCACE,mBAEA,wDACE,oBAKN,cACE,4FACA,uBACA,2CACA,4CACA,WACA,eAEA,6GAGE,sBACA,0BAGF,uBACE,iBACA,sBACA,+e;ACtCJ,OACE,cACA,kBACA,oBACA,gBACA,qBACA,mBACA,eAEA,gBACE,oBACA,WAGF,qBACE,eAEE,iFACE,kBAKN,aACE,kBACA,uBACA,UAIA,qDACE,WACA,cACA,kBACA,eACA,QACA,cACA,eACA,2BAGF,2BACE,4CACA,kBACA,yCACA,UACA,kDAGF,0BACE,cACA,cACA,eACA,kBACA,gCACA,UACA,4BAGF,0BACE,cACA,sBACA,uBACA,gBAGF,6BACE,cACA,kBACA,iBACA,kCACA,uBAKF,yCACE,kCAGF,wCACE,UAKF,qEAEE,qBAGF,wBACE,kBACA,eACA,QACA,2BACA,UACA,oCACA,wBAIJ,gBACE,eACA,qBAEA,4BACE,iBAEA,oCACE,UACA,gBAGF,mCACE,UACA,eAIJ,iDAEE,iBAGA,iCACA,UACA,gBAKN,mBACE,KACE,UAEF,GACE,W;ACzIJ,qBACE,WACA,c;ACFF,KACE,aACA,uBACA,cACA,6DACA,gBACA,WACA,SACA,YACA,uBACA,gBACA,kCACA,eACA,2DACA,4DAEA,4BAGE,aAGF,aACE,eACA,2BAEA,eACE,qBAIJ,qBACE,6BACE,mDAIJ,yBACE,8BACE,mDAIJ,UACE,kBACA,aACA,mBACA,mBAGF,YACE,kBACA,eACA,0BACA,6BACA,qBACA,mBACA,WACA,kBACA,sBACA,gBACA,kBACA,cAEA,kDAEE,oBAIJ,oBACE,2CAGF,OACE,kBACA,4BACA,OACA,UACA,sCACA,gBACA,WACA,oCACA,oBACA,uBACA,sBAEA,eACE,6CAEA,sCACE,2B;AC3FR,SACE,gBACA,MACA,cACA,aACA,8BACA,qBACA,kBACA,iBACA,+CACA,yCACA,gBACA,kBAEA,qBACA,8BAEA,aACE,eACA,kCAGF,4BACE,SAGF,kCACE,+BAEA,yC;AC5BF,+BACE,gBAGF,+BACE,2BAGF,+CACE,oBAGF,gCACE,sBAGF,wCACE,uB;AClBJ,aACE,kBACA,WACA,iDACA,yCACA,yCACA,uBACA,kCAEA,8BACE,aAEA,2CACE,aAGF,oCACE,mBAIA,6CACE,oBACA,eAKN,uBACE,kCACA,iCACA,yCAGE,+BACE,2BAKN,mBACE,cACA,gBACA,uBACA,uBACA,wCACA,2BACA,0JAEA,gCACE,gCAIJ,eACE,kBACA,UACA,YACA,mBAGF,sBACE,kBACA,UACA,YACA,cAEA,+BACE,uBAIJ,qBACE,kBACA,YACA,cACA,eAGF,yBACE,mBACE,cACA,sBACA,kDAGF,eACE,WAKF,4BACE,cAGF,wBACE,UACA,aAGF,+BACE,WACA,WAGF,8BACE,aACA,W;AC5GN,oBACE,aACA,mBACA,mCACA,YACA,eACA,kBACA,oBACA,mBACA,mBACA,eACA,kBACA,gBACA,cACA,sCAEA,6BAEA,8BACE,gBAGF,0BACE,0CAGF,oCACE,oDAEA,iDACE,UAGF,2FACE,UAKF,6CACE,gCAGF,sCACE,mCAGF,2CACE,kBAIJ,iCACE,cACA,kBACA,WACA,eAEA,kCAGF,2DACE,WACA,YACA,UACA,cACA,6BAEA,+DACE,eAIJ,+BACE,aACA,mBACA,uBACA,gBACA,kBACA,sCACA,WAEA,iCACE,kBACA,kBACA,SAIJ,+BACE,kBACA,mBACA,gBACA,uBAEA,kDACE,eACA,gBACA,yBACA,oBAIJ,iCACE,kBACA,OACA,MACA,WACA,YACA,kBACA,aACA,mBACA,uBACA,oCACA,iBACA,WACA,UACA,6BAGF,6BACE,kBACA,gBAEA,uCACE,gBACA,eAGF,0CACE,UACA,gBAGF,wCACE,cACA,mBAGF,0CACE,UACA,Q;AC7IN,UACE,oBACA,mBACA,kBACA,SAEA,mBACE,oBACA,WAGF,mBACE,oBAKA,8JAEE,2BAGF,kGACE,eAIJ,gBACE,SACA,QACA,kBACA,kBACA,uBACA,UAGF,kBACE,eACA,mBACA,eACA,eACA,6BACA,qBACA,oBACA,kBACA,kCAGF,wBACE,WACA,kBACA,cACA,OACA,eACA,gBACA,mCACA,qBACA,wBACA,uCAGF,gCACE,gCAGF,sCACE,2BACA,6CACA,kCAGF,+BACE,c;ACxEJ,uBACE,cACA,eACA,gBACA,qBACA,cACA,oBAEA,yBACE,mCAGF,+CACE,oBAGF,mCACE,WACA,Y;AClBJ,iBACE,mBACA,uBACA,cACA,iBACA,cACA,aACA,mBAEA,wCACE,qCACA,mBACA,kBAEA,oDACE,wBAIJ,uBACE,6BACA,oB;ACrBJ,kBACE,UACA,2DAEA,6BACE,mBACA,UAGF,8BACE,aAGF,0BACE,uDAIJ,eACE,aAEA,sBACE,0BAIJ,OACE,iBACA,cACA,6BACA,qBACA,mBACA,WACA,kBACA,sBACA,gBACA,kBACA,cAEA,qBACE,mBAGF,mBACE,qBACA,mBACA,gBACA,kBAGF,yCACE,8BACA,yBAGF,2BACE,0BACA,uBACA,aACA,UAEA,6BACE,iBAIJ,eACE,aACA,eAEA,iBACE,eACA,qBAGF,2BACE,eACA,eAEA,6BACE,kB;AC/ER,qCACE,0BACA,6BACA,2BACA,0BACA,2BACA,6BACA,2BACA,6BACA,6BAGF,qCACE,uBACA,6BACA,2BACA,6BACA,wBACA,6BACA,2BACA,6BACA,0BAIF,gBACE,kBACA,UACA,SACA,WACA,YACA,kBACA,yBACA,yCACA,gBAEA,2BACE,WACA,YACA,aACA,mBACA,uBACA,kBACA,+BACE,UACA,WACA,mCACA,kBACA,WACA,sBACA,wBAEF,8CACE,sBAEF,+CACE,uBAIJ,yBACE,oCACA,sCACA,wCACE,0CAKF,qDACE,yDAGF,sDACE,yD;AC3EN,MACE,4CAOA,kBACA,MACA,OACA,SACA,WATA,sCAEE,gDASF,sBACE,oBACA,gCAGF,wBACE,sBACA,kCAIA,qFACE,qCAIJ,yBACE,eACE,uDAEA,qCACE,sCAKN,yBACE,oCAEE,wDAEA,gFACE,iDACA,8BAGF,sEACE,wDACA,iCACA,8CACA,sCACA,2CACA,kCACA,mCAGF,4DACE,oCAGF,4EACE,8BACA,gCAKN,yBACE,uBACE,4BAIJ,cACE,kBACA,cAIA,sBACE,qBAGF,eACE,WACA,cAGF,wBACE,kBACA,mBACA,sBACA,cAEA,oCACE,aACA,mBAIJ,6BACE,iBAEA,yCACE,kBACA,eAIJ,qDACE,qBACA,YACA,kCACA,uBAEA,uEACE,gBAGF,+EACE,wBAGF,mEACE,yBAMA,wCACE,aAIJ,iCACE,yBAGF,8BACE,cACA,eACA,iBACA,sBACA,wBACA,yBAEA,0CACE,eACA,gBACA,0BAGF,oCACE,sBAIJ,uCACE,WACA,YACA,yBAGF,qCACE,kBACA,qBACA,iBACA,WACA,6BACA,wBACA,gBAEA,iDACE,8BACA,SAQJ,sCACE,cACA,kBAGF,2DACE,oBACA,gBAGF,iCACE,cACA,oBAGF,uEACE,mBACA,gBACA,iBACA,uB;AC9MR,eACE,eACA,qBAEA,mBACE,kBACA,WACA,YAGF,sCACE,qB;ACXJ,aACE,WACA,WACA,aACA,mBACA,uBACA,sBAEA,0BARF,aASI,aAGF,sBACE,YACA,uBAGF,oBACE,kBACA,sBAGF,0BACE,kBACA,kCAEA,8EAEE,wCAIJ,0BACE,mBACA,gBACA,4BACA,uBAEA,4BACE,0BACA,iB;ACxCN,cACE,aACA,mBACA,uBACA,6BAEA,+BACE,sBAGF,+BACE,cAGF,2BACE,kCACA,kBACA,kBACA,gBACA,uB;ACnBJ,OACE,SACA,oBACA,gBACA,kBACA,eAEA,uBACE,kBACA,YACA,WACA,2BACA,WACA,iBACA,mBACA,uBACA,qBAGF,WACE,kBACA,OACA,MACA,WACA,YACA,iB;ACzBJ,SACE,gBACA,2BACA,kBACA,qBACA,kBAEA,kBACE,kBAGF,+BACE,2BACA,WACA,YACA,kBACA,OACA,MACA,yDACA,WACA,aACA,mBACA,uBACA,kDACA,yBACA,gBACA,iBAGF,gBACE,kBACA,OACA,MACA,WACA,YACA,0BACA,gCACA,6DAGF,oEAGE,sBACA,mBAGF,oBACE,cACA,yBACA,gBACA,mBACA,gBACA,uBAGF,qBACE,eACA,gBACA,uBACA,sBAGF,iDAEE,gBACA,kCACA,qBACA,mBACA,oBACA,qBACA,4BACA,gBAGF,sBACE,kBAGF,kCACE,sBACA,uBAGF,kBACE,2BAEA,iEAEE,UACA,QAGF,2BACE,iB;AC9FN,oDACE,aAaA,mBACA,oBAZA,0CACE,sBAGF,eACE,0BACA,qBAFF,eAGI,6BAOJ,iBACE,2DAGF,cAGE,gBACA,yBACA,kDACA,gCACA,aACA,mBACA,uBACA,sBAGF,iBACE,MACA,OACA,kBAGF,yBACE,qBACA,cACA,kBACA,WACA,4BAEA,cACE,gBACA,wBACA,yBAGF,UACE,cACA,kBACA,MACA,QACA,iCACA,2BACA,qFACA,mCACA,mBACA,qCACA,qBAIJ,sBACE,gBACA,qEAEA,yBAEE,kDACA,yBAGF,gBACE,oBAIJ,UACE,iBACA,kBACA,MACA,QACA,eACA,gBACA,aACA,mBACA,uBACA,UACA,wBACA,wCAGF,cACE,gEAGE,cACE,2DAGF,SACE,kEAEA,SACE,wDAIJ,SACE,kBAKN,mBACE,qBACA,mBACA,gBACA,YACA,wBAEA,gBACE,kCACA,kBACA,mBACA,mBAIJ,cACE,mBACA,gBACA,gBACA,uBACA,0BAEA,mBACE,sBAIJ,iBACE,qBACA,6BACA,eACA,gBACA,uBACA,wCAGE,aACE,eAKN,2CACE,yCACA,8GAEA,UAIE,YACA,0BAGF,sBACE,iCAEA,0BACE,0BAIJ,oBACE,2BAGF,eACE,8BAGF,gBACE,2KAMF,kBAGE,eACA,qDAGF,gBACE,iEAEA,cACE,mBACA,yDAIJ,SACE,QACA,+CAQJ,mCACE,qDAGF,qCACE,mDAGF,wCACE,C;ACxOJ,OACE,aACA,uBACA,kBAEA,sBACE,kBACA,oBAEA,kCACE,mBAIJ,WACE,4CACA,oDACA,qEACA,qEAEA,uBACE,sCACA,uCAGF,mBACE,yCACA,0CACA,wDACA,2CAEA,+BACE,4BACA,mCAKN,oBACE,wBAEA,sCACE,2BAGF,4BACE,WACA,YACA,yBAEA,8BACE,mBAEA,yCACE,oBAKN,sBACE,kBAEA,gCACE,qBACA,yBAFF,gCAGI,qBAKN,+DACE,UACA,mBACA,uEAGF,yJAIE,UACA,qBAIJ,wBACE,kBACA,2BACA,4BACA,UACA,eACA,cACA,6CACA,UAEA,0BACE,mBAIJ,+BACE,UACA,SACA,6CAGF,gBACE,kBACA,YACA,YACA,mBAGF,oBACE,aACA,8BAGF,cACE,gBACA,SACA,iBACA,mBACA,gBACA,uBAGF,cACE,YAGF,uBACE,kBACA,kBACA,kCACA,kCACA,aACA,qBAEA,qCACE,WACA,kBACA,0BACA,eACA,gBACA,kBACA,qCAKF,iDACE,uBAIJ,sCACE,2BAGF,iBACE,eACA,gBACA,kBAGF,4CAGE,kBACA,kCACA,SACA,gBACA,mBACA,uBACA,uBAGF,iBACE,kBACA,kCACA,mBACA,gBACA,uBACA,cACA,kCAGF,aACE,aACA,mBACA,mBACA,yBAEA,kBACE,YACA,mBACA,gBACA,uBAGF,wBACE,cAGF,qCACE,0BAGF,qBACE,gBACA,cAIJ,iBACE,YACA,eACA,kBACA,QACA,eACA,kBAEA,yBACE,WACA,kBACA,WACA,QACA,WACA,mDACA,kBAIJ,kEACE,kBACA,WACA,kBACA,gBACA,WACA,QAEA,sEACE,kBACA,WACA,iDACA,WACA,kBACA,WAIJ,qCACE,8DAGF,uBACE,kBACA,WACA,QACA,OAEA,yBACE,oBACA,kBACA,WACA,WAEA,gCACE,WACA,kBACA,SACA,WACA,WACA,YACA,kBACA,2CAMJ,qBACE,mBACA,gBACA,uBACA,gBACA,mBAGF,oBACE,eAGF,6CAEE,sBAGF,wBACE,iBAGF,6BACE,aACA,cAIA,sCACE,qBACA,QAKN,mCACE,cACA,eAIA,2BACE,sBAGF,6BACE,kBACA,eAEA,qCACE,mBACA,eAIJ,6CACE,4BAGF,mDAEE,iBAGF,iCACE,UACA,WAKN,6BACE,uB;ACjWF,cACE,WACA,YACA,eACA,kBAEA,8BACE,WACA,iBAGF,iCACE,kBACA,OACA,MACA,WAGF,+BACE,WACA,YAGF,mJAKE,aACA,mBACA,uBACA,yBACA,wEACA,eAGF,uBACE,gBAGF,6FAGE,gB;AC3CJ,aACE,iBACA,kBAEA,kCACE,qBACE,WACA,iBACA,WAGF,oBACE,cACA,WACA,YAIJ,4BACE,WACA,kBACA,OACA,MACA,SAEA,wCACE,WACA,YAIJ,2BACE,kBACA,WACA,eACA,kBACA,UAEA,aACA,UACA,OAGF,yBACE,cACA,oCACA,YACA,sBACA,iBAEA,iCACE,YAIJ,yBACE,kBACA,MACA,SACA,UACA,YACA,UACA,SACA,6DACA,iCACA,wBACA,YACA,wBACA,aACA,eACA,UAEA,sEACE,UAGF,8BACE,OACA,yDACA,gCAGF,8BACE,QACA,yDACA,6CAIJ,mBACE,kBACA,SACA,OACA,WACA,iBACA,uBACA,+EACA,yBACA,aACA,sBACA,yBACA,oBAGE,oCACE,iBACA,uBAKF,oCACE,iBACA,uBAKN,oBACE,aACA,mBAEA,uBACE,gBACA,kBACA,qBACA,qBACA,sBACA,qBAGF,kCACE,mBACA,qBAGF,2BACE,aACA,cACA,uBAIJ,qBACE,kBACA,WAIA,uCACE,UACA,QACA,qBAGF,uCACE,OACA,WACA,qBAIJ,kBACE,wBACA,gBAEA,wBACE,SAGF,qCACE,UAGF,wBACE,sBAGF,0BACE,+C;ACnLN,YACE,2CACA,mCACA,gBACA,cACA,WACA,mBACA,iBACA,kBACA,uBACA,aACA,cACA,iDAEA,0BAdF,YAeI,gBAGF,oCACE,2BACA,mDAGF,wBACE,oBAGF,uBACE,gBAGF,4BACE,oBACA,2CACA,oBACA,cACA,aACA,sBACA,mBACA,uBACA,oCAGF,kBACE,kBACA,sBACA,sBAEA,0BALF,kBAMI,kBACA,mBACA,oBAGF,0BAXF,kBAYI,eACA,iBACA,oBACA,mBAIJ,mBACE,oBACA,gBACA,uBAEA,0BALF,mBAMI,gBAIJ,yBACE,eACA,oBAEA,0BAJF,yBAKI,mB;AC7EN,sBACE,kBACA,WACA,YACA,yEACA,4DAEA,6CACE,2BAGF,+BACE,yE;ACKJ,aACE,qCAEA,mBAEA,sBACE,oBACA,4CAGF,6BACE,aACA,8BACA,sBAEA,oCACE,cACA,iBACA,kCAIA,6CACE,cACA,kBAKN,0BACE,kBACA,UAEA,kCACE,WACA,kBACA,WACA,OACA,aACA,eACA,sCACA,sBACA,WACA,WAIJ,gCACE,kBACA,WACA,OACA,aACA,eACA,qCACA,sBACA,oBCvDF,+BACE,wBACA,cACA,WACA,cACA,oBACA,uBAEA,qCACE,aAGF,0CACE,WACA,eAEA,uBACA,yBACA,kBAGF,qDACE,wBAGF,kDACE,qBAGF,8DACE,eAGF,qGACE,eD+BF,qDA/EF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,oFAEA,2DACE,qBAyEA,iDAnFF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,iFAEA,uDACE,qBA6EA,0CAvFF,+BACA,YACA,cACA,aACA,kBACA,eACA,mBACA,gFAEA,gDACE,qBAkFF,6BACE,aACA,wBACA,sBACA,sBAGF,4BACE,kBACA,kBACA,eACA,kCACA,0BAEA,qEACE,wBAGF,mCACE,gBAGF,wCACE,gBAGF,uCACE,iB;AE1HN,UACE,kBACA,MACA,QACA,OACA,aACA,2BACA,uBAEA,aACA,sBAEA,kCACE,iD;ACbJ,eACE,qBACA,WACA,YACA,aACA,kDACA,wCACA,wBACA,kEACA,kBAEA,2BACE,eAEA,iCACE,wDAEA,wDACE,UAMN,yBAxBF,eAyBI,eAGF,0BACE,yBACA,eACA,eAGF,qBACE,YACA,aACA,SAGF,mDACE,kBACA,MACA,OACA,WACA,YAGF,mBACE,mBAGF,sCACE,kBACA,YACA,cACA,cACA,eACA,gBAMA,UAJA,wCACE,e;AC7DN,eACE,oCAEA,2CACE,kBACA,mCACA,4CACA,sBACA,iDAGF,4BACE,OACA,MACA,UACA,oBACA,4BAEA,mCACE,eAGF,yBAXF,4BAYI,2DAGF,kCACE,uBACA,wBACA,WACA,wBACA,yCAIJ,uDACE,aACA,iBACA,mBAGF,uBACE,UACA,eACA,gBACA,sCAGF,sCACE,YACA,kBACA,eAEA,yBALF,sCAMI,gBAGF,2FACE,WACA,cACA,kBACA,MACA,SACA,WACA,UACA,UACA,4BAGF,8CACE,OACA,wFAGF,6CACE,QACA,uFAIA,wDACE,UAKF,wDACE,UAKN,gCACE,cACA,UACA,4BAEA,sCACE,UAKF,8DACE,UACA,mBAIJ,uBACE,WACA,YACA,eACA,iBACA,iBACA,kDACA,cACA,eAEA,8BACE,iDACA,WAGF,gCACE,WACA,oB;AC9HN,QACE,YACA,aACA,sBACA,gBAEA,uBACE,6BACA,6CACA,aACA,mBACA,cAEA,gBACA,iBAEA,oCACE,oBACA,kBACA,YAGF,qCACE,YACA,YACA,gBACA,UACA,gBAIJ,qBACE,YACA,gBACA,kBACA,cAEA,yBANF,qBAOI,0BACA,4BAIJ,oBACE,YACA,SACA,kBACA,aACA,mBACA,uBACA,kC","sources":["webpack://telegram-t/./src/components/ui/Transition.scss","webpack://telegram-t/./src/components/ui/ProgressSpinner.scss","webpack://telegram-t/./src/components/common/Avatar.scss","webpack://telegram-t/./src/components/ui/Modal.scss","webpack://telegram-t/./src/components/ui/ListItem.scss","webpack://telegram-t/./src/components/common/VerifiedIcon.scss","webpack://telegram-t/./src/components/common/TypingStatus.scss","webpack://telegram-t/./src/components/ui/Notification.scss","webpack://telegram-t/./src/components/ui/Radio.scss","webpack://telegram-t/./src/components/common/ReactionStaticEmoji.scss","webpack://telegram-t/./src/components/ui/Tab.scss","webpack://telegram-t/./src/components/ui/TabList.scss","webpack://telegram-t/./src/components/common/DeleteChatModal.scss","webpack://telegram-t/./src/components/ui/SearchInput.scss","webpack://telegram-t/./src/components/common/PickerSelectedItem.scss","webpack://telegram-t/./src/components/ui/Switcher.scss","webpack://telegram-t/./src/components/common/MessageOutgoingStatus.scss","webpack://telegram-t/./src/components/common/LastMessageMeta.scss","webpack://telegram-t/./src/components/left/main/Badge.scss","webpack://telegram-t/./src/components/left/main/ChatCallStatus.scss","webpack://telegram-t/./src/components/left/main/Chat.scss","webpack://telegram-t/./src/components/common/AnimatedEmoji.scss","webpack://telegram-t/./src/components/left/main/EmptyFolder.scss","webpack://telegram-t/./src/components/common/NothingFound.scss","webpack://telegram-t/./src/components/common/Media.scss","webpack://telegram-t/./src/components/common/WebLink.scss","webpack://telegram-t/./src/components/common/File.scss","webpack://telegram-t/./src/components/common/Audio.scss","webpack://telegram-t/./src/components/common/ProfilePhoto.scss","webpack://telegram-t/./src/components/common/ProfileInfo.scss","webpack://telegram-t/./src/components/middle/composer/DropTarget.scss","webpack://telegram-t/./src/components/ui/FloatingActionButton.scss","webpack://telegram-t/./src/components/ui/RangeSlider.scss","webpack://telegram-t/./src/styles/_mixins.scss","webpack://telegram-t/./src/components/middle/composer/DropArea.scss","webpack://telegram-t/./src/components/common/StickerButton.scss","webpack://telegram-t/./src/components/middle/composer/TextFormatter.scss","webpack://telegram-t/./src/components/common/Picker.scss"],"sourcesContent":[".Transition {\n position: relative;\n\n > * {\n width: 100%;\n height: 100%;\n animation-fill-mode: forwards !important;\n transition: background-color .2s;\n\n &.from, &.to {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n &:not(.Transition__slide--active):not(.from):not(.to) {\n display: none !important; // Best performance when animating container\n //transform: scale(0); // Shortest initial delay\n }\n }\n\n &.skip-slide-transition {\n transition: none !important;\n }\n\n /*\n * slide\n */\n &.slide-optimized,\n &.slide-optimized-rtl {\n contain: strict;\n body.is-safari & {\n // Create a new composite layer to reduce the page repaint area when switching a tab (as `contain` is not supported in Safari)\n transform: translate3d(0, 0, 0);\n }\n\n #root & > div {\n position: absolute;\n display: block !important;\n top: 0;\n left: 0;\n transition: transform var(--slide-transition);\n transform: scale(0);\n }\n }\n\n &.slide {\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-out var(--slide-transition);\n }\n\n > .to {\n animation: slide-in var(--slide-transition);\n }\n }\n }\n\n &.slide.backwards {\n > .to {\n transform: translateX(-100%);\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--slide-transition);\n }\n\n > .to {\n animation: slide-out-backwards var(--slide-transition);\n }\n }\n }\n\n\n &.slide-rtl {\n > .to {\n transform: translateX(-100%);\n }\n\n &.animating {\n > .from {\n animation: slide-out var(--slide-transition);\n }\n\n > .to {\n animation: slide-in var(--slide-transition);\n }\n }\n\n &.backwards {\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--slide-transition);\n }\n\n > .to {\n animation: slide-out-backwards var(--slide-transition);\n }\n }\n }\n }\n\n /*\n * mv-slide\n */\n\n &.mv-slide {\n > * > div {\n animation-fill-mode: forwards !important;\n }\n\n > .to > div {\n transform: translateX(100vw);\n }\n\n &.animating {\n > .from > div {\n animation: mv-slide-out .4s ease;\n }\n\n > .to > div {\n animation: mv-slide-in .4s ease;\n }\n }\n }\n\n &.mv-slide.backwards {\n > .to > div {\n transform: translateX(-100vw);\n }\n\n &.animating {\n > .from > div {\n animation: mv-slide-in-backwards .4s ease;\n }\n\n > .to > div {\n animation: mv-slide-out-backwards .4s ease;\n }\n }\n }\n\n /*\n * slide-fade\n */\n &.slide-fade {\n > .from {\n transform-origin: left;\n transform: translateX(0);\n opacity: 1;\n }\n\n > .to {\n transform-origin: left;\n transform: translateX(1.5rem);\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity var(--slide-transition), slide-fade-out-move var(--slide-transition);\n }\n\n > .to {\n animation: fade-in-opacity var(--slide-transition), slide-fade-in-move var(--slide-transition);\n }\n }\n }\n\n &.slide-fade.backwards {\n > .from {\n transform: translateX(0);\n opacity: 1;\n }\n\n > .to {\n transform: translateX(-1.5rem);\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-in-backwards-opacity var(--slide-transition), slide-fade-in-backwards-move var(--slide-transition);\n }\n\n > .to {\n animation: fade-out-backwards-opacity var(--slide-transition), slide-fade-out-backwards-move var(--slide-transition);\n }\n }\n }\n\n /*\n * zoom-fade\n */\n &.zoom-fade {\n > .from {\n transform-origin: center;\n transform: scale(1);\n opacity: 1;\n }\n\n > .to {\n transform-origin: center;\n opacity: 0;\n // We can omit `transform: scale(1.1);` here because `opacity` is 0.\n // We need to for proper position calculation in `InfiniteScroll`.\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity .15s ease;\n }\n\n > .to {\n animation: fade-in-opacity .15s ease, zoom-fade-in-move .15s ease;\n }\n }\n }\n\n &.zoom-fade.backwards {\n > .from {\n transform: scale(1);\n }\n\n > .to {\n transform: scale(0.95);\n }\n\n &.animating {\n > .from {\n animation: fade-in-backwards-opacity .1s ease, zoom-fade-in-backwards-move .15s ease;\n }\n\n > .to {\n animation: fade-out-backwards-opacity .15s ease, zoom-fade-out-backwards-move .15s ease;\n }\n }\n }\n\n /*\n * fade\n */\n &.fade {\n > .from {\n opacity: 1;\n }\n\n > .to {\n opacity: 0;\n }\n\n &.animating {\n > .from {\n animation: fade-out-opacity .15s ease;\n }\n\n > .to {\n animation: fade-in-opacity .15s ease;\n }\n }\n }\n\n /*\n * slide-layers\n */\n\n &.slide-layers {\n --background-color: var(--color-background);\n background: black;\n\n > div {\n background: var(--background-color);\n }\n\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: slide-layers-out var(--layer-transition);\n }\n\n > .to {\n animation: slide-in var(--layer-transition);\n }\n }\n }\n\n &.slide-layers.backwards {\n > .to {\n transform: translateX(-20%);\n opacity: 0.75;\n }\n\n &.animating {\n > .from {\n animation: slide-in-backwards var(--layer-transition);\n }\n\n > .to {\n animation: slide-layers-out-backwards var(--layer-transition);\n }\n }\n }\n\n /*\n * push-slide\n */\n\n &.push-slide {\n > div {\n background: var(--color-background);\n }\n\n > .from {\n transform-origin: center;\n transform: scale(1);\n opacity: 1;\n\n .custom-scroll {\n scrollbar-color: transparent !important;\n\n &::-webkit-scrollbar-thumb {\n background-color: transparent !important;\n }\n }\n }\n\n > .to {\n transform: translateX(100%);\n }\n\n &.animating {\n > .from {\n animation: push-out .3s ease-in-out;\n }\n\n > .to {\n animation: slide-in-200 .3s ease-in-out;\n }\n }\n }\n\n &.push-slide.backwards {\n > .to {\n transform: scale(0.7);\n }\n\n &.animating {\n > .from {\n animation: slide-in-200-backwards .3s ease-in-out;\n }\n\n > .to {\n animation: push-out-backwards .3s ease-in-out;\n }\n }\n }\n\n /*\n * slide-fade\n */\n &.reveal {\n > .to {\n clip-path: inset(0 100% 0 0);\n }\n\n &.animating {\n > .to {\n animation: reveal-in 350ms ease-in;\n }\n }\n }\n\n &.reveal.backwards {\n > .from {\n clip-path: inset(0 0 0 0);\n }\n\n > .to {\n clip-path: none;\n }\n\n &.animating {\n > .from {\n animation: reveal-in-backwards 350ms ease-out;\n }\n\n > .to {\n animation: none;\n }\n }\n }\n}\n\n/*\n * common\n */\n@keyframes fade-in-opacity {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n@keyframes fade-out-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes fade-in-backwards-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n }\n}\n\n@keyframes fade-out-backwards-opacity {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n}\n\n/*\n * slide\n */\n@keyframes slide-in {\n 0% {\n transform: translateX(100%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-out {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100%);\n }\n}\n\n@keyframes slide-in-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(100%);\n }\n}\n\n@keyframes slide-out-backwards {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * mv-slide\n */\n@keyframes mv-slide-in {\n 0% {\n transform: translateX(100vw);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes mv-slide-out {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-100vw);\n }\n}\n\n@keyframes mv-slide-in-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(100vw);\n }\n}\n\n@keyframes mv-slide-out-backwards {\n 0% {\n transform: translateX(-100vw);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * slide-fade\n */\n@keyframes slide-fade-in-move {\n 0% {\n transform: translateX(1.5rem);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-fade-out-move {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(-1.5rem);\n }\n}\n\n@keyframes slide-fade-in-backwards-move {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(1.5rem);\n }\n}\n\n@keyframes slide-fade-out-backwards-move {\n 0% {\n transform: translateX(-1.5rem);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n/*\n * zoom-fade\n */\n@keyframes zoom-fade-in-move {\n 0% {\n transform: scale(1.1);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n@keyframes zoom-fade-in-backwards-move {\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1.1);\n }\n}\n\n@keyframes zoom-fade-out-backwards-move {\n 0% {\n transform: scale(0.95);\n }\n 100% {\n transform: scale(1);\n }\n}\n\n/*\n * slide-layers\n */\n@keyframes slide-layers-out {\n 0% {\n transform: translateX(0);\n opacity: 1;\n }\n 100% {\n transform: translateX(-20%);\n opacity: calc(1 - var(--layer-blackout-opacity));\n }\n}\n\n@keyframes slide-layers-out-backwards {\n 0% {\n transform: translateX(-20%);\n opacity: calc(1 - var(--layer-blackout-opacity));\n }\n 100% {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n/*\n * push-slide\n */\n\n@keyframes push-out {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 100% {\n transform: scale(0.7);\n opacity: 0;\n }\n}\n\n@keyframes push-out-backwards {\n 0% {\n transform: scale(0.7);\n opacity: 0;\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n/*\n * slide\n */\n@keyframes slide-in-200 {\n 0% {\n transform: translateX(200%);\n }\n 100% {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-in-200-backwards {\n 0% {\n transform: translateX(0);\n }\n 100% {\n transform: translateX(200%);\n }\n}\n\n/*\n * slide\n */\n@keyframes reveal-in {\n 0% {\n clip-path: inset(0 100% 0 0);\n }\n 100% {\n clip-path: inset(0 0 0 0);\n }\n}\n\n/*\n * slide\n */\n@keyframes reveal-in-backwards {\n 0% {\n clip-path: inset(0 0 0 0);\n }\n 100% {\n clip-path: inset(0 100% 0 0);\n }\n}\n",".ProgressSpinner {\n position: relative;\n z-index: 1;\n width: 3.375rem;\n height: 3.375rem;\n background: rgba(0, 0, 0, .25) url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkiIGhlaWdodD0iMTkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEwLjcxNyA5Ljc1TDE4LjMgMi4xNjdhLjY4NC42ODQgMCAxMC0uOTY3LS45NjdMOS43NSA4Ljc4MyAyLjE2NyAxLjJhLjY4NC42ODQgMCAxMC0uOTY3Ljk2N0w4Ljc4MyA5Ljc1IDEuMiAxNy4zMzNhLjY4NC42ODQgMCAxMC45NjcuOTY3bDcuNTgzLTcuNTgzIDcuNTgzIDcuNTgzYS42ODEuNjgxIDAgMDAuOTY3IDAgLjY4NC42ODQgMCAwMDAtLjk2N0wxMC43MTcgOS43NXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii43NSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==) no-repeat 49% 49%;\n border-radius: 50%;\n cursor: pointer;\n\n &.no-cross {\n background: transparent !important;\n pointer-events: none;\n }\n\n &.square {\n background-image: none;\n\n &::after {\n content: '';\n position: absolute;\n width: .8125rem;\n height: .8125rem;\n border-radius: .125rem;\n background-color: #fff;\n left: 50%;\n top: 50%;\n transform: translate3d(-50%, -50%, 0);\n }\n }\n\n &.size-s, &.size-m {\n width: auto;\n height: auto;\n background: transparent url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUiIGhlaWdodD0iMTUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTguMjE4IDcuNWw1LjYzMy01LjYzM2EuNTA4LjUwOCAwIDEwLS43MTgtLjcxOEw3LjUgNi43ODIgMS44NjcgMS4xNDlhLjUwOC41MDggMCAxMC0uNzE4LjcxOEw2Ljc4MiA3LjVsLTUuNjMzIDUuNjMzYS41MDguNTA4IDAgMTAuNzE4LjcxOEw3LjUgOC4yMThsNS42MzMgNS42MzNhLjUwNi41MDYgMCAwMC43MTggMCAuNTA4LjUwOCAwIDAwMC0uNzE4TDguMjE4IDcuNXoiIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjRkZGIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+) no-repeat 49% 49%;\n\n &.square {\n background-image: none;\n width: .75rem;\n height: .75rem;\n }\n }\n\n &.size-xl {\n width: 3.25rem;\n height: 3.25rem;\n\n svg {\n width: 3rem;\n height: 3rem;\n margin: .125rem;\n }\n\n circle {\n stroke-width: 3px;\n }\n }\n\n &.transparent {\n background-color: transparent !important;\n }\n\n svg {\n display: block;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n animation: 4s linear 0s infinite ProgressSpinnerAnimation;\n }\n\n circle {\n transition: stroke-dashoffset .5s;\n }\n}\n\n@keyframes ProgressSpinnerAnimation {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n",".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",".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 .modal-about {\n font-weight: bold;\n }\n\n .modal-help {\n color: var(--color-text-secondary);\n font-size: 0.9375rem;\n line-height: 1.3;\n }\n\n .dialog-buttons {\n display: flex;\n align-items: flex-end;\n\n .confirm-dialog-button + .confirm-dialog-button {\n margin-left: 1rem;\n }\n }\n\n .confirm-dialog-button {\n width: auto;\n height: auto;\n margin-left: auto;\n text-align: right;\n font-weight: 500;\n white-space: pre-wrap;\n }\n}\n",".ListItem {\n position: relative;\n\n body.is-ios &, body.is-android & {\n &:not(:last-of-type)::after {\n content: \"\";\n position: absolute;\n bottom: 0;\n left: 4.5rem;\n right: 0;\n height: 0.03125rem;\n background: var(--color-dividers);\n }\n\n &.small-icon::after {\n left: 3.875rem;\n }\n\n &.no-icon::after {\n left: 0;\n }\n }\n\n // Using half-pixel height is efficient on iOS but not supported on Android, so `transform` is used instead\n body.is-android & {\n &:not(:last-of-type)::after {\n height: 0.0625rem;\n transform: scaleY(0.25);\n }\n }\n\n .ListItem-button {\n width: 100%;\n background-color: var(--background-color);\n border: none !important;\n box-shadow: none !important;\n outline: none !important;\n display: flex;\n padding: 1rem;\n position: relative;\n overflow: hidden;\n line-height: 1.5rem;\n white-space: nowrap;\n color: var(--color-text);\n border-radius: var(--border-radius-default);\n --ripple-color: rgba(0, 0, 0, .08);\n\n > i {\n font-size: 1.5rem;\n margin-right: 2rem;\n color: var(--color-text-secondary);\n }\n }\n\n .user-status, .group-status, .title, .subtitle {\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n &.multiline {\n .ListItem-button > i {\n position: relative;\n top: .25rem;\n }\n }\n\n &.disabled {\n pointer-events: none;\n\n .ListItem-button {\n opacity: 0.5;\n }\n }\n\n &:not(.disabled):not(.is-static) {\n .ListItem-button {\n cursor: pointer;\n\n body.cursor-ew-resize & {\n cursor: ew-resize !important;\n }\n\n @media (hover: hover) {\n &:hover, &:focus {\n --background-color: var(--color-chat-hover);\n }\n }\n\n @media (max-width: 600px) {\n &.active {\n --background-color: var(--color-chat-hover);\n }\n }\n }\n }\n\n @media (min-width: 600px) {\n &:not(.has-ripple):not(.is-static),\n body.animation-level-0 & {\n .ListItem-button:active {\n --background-color: var(--color-item-active) !important;\n }\n }\n }\n\n &.has-menu-open .ListItem-button {\n --background-color: var(--color-chat-hover);\n }\n\n &.narrow {\n margin-bottom: 0.75rem;\n\n .ListItem-button {\n padding: 0.5rem 1rem;\n }\n }\n\n &.inactive {\n pointer-events: none;\n }\n\n &.focus {\n --background-color: var(--color-chat-hover);\n }\n\n &.destructive {\n .ListItem-button {\n color: var(--color-error);\n\n i {\n color: inherit;\n }\n }\n }\n\n &-context-menu {\n position: absolute;\n\n .bubble {\n width: auto;\n\n .MenuItem button {\n padding-left: 1rem !important;\n padding-right: 2rem !important;\n }\n }\n }\n\n &.chat-item-clickable {\n margin: 0 -0.5rem;\n\n body.is-ios &,\n body.is-macos & {\n --color-text-secondary: var(--color-text-secondary-apple);\n }\n\n .ListItem-button {\n padding: .5625rem;\n }\n\n .Avatar {\n flex-shrink: 0;\n margin-right: 0.5rem;\n }\n\n .info {\n flex-grow: 1;\n overflow: hidden;\n }\n\n .title, .subtitle {\n overflow: hidden;\n display: flex;\n justify-content: flex-start;\n align-items: center;\n }\n\n h3, .last-message, .status, .typing-status {\n font-size: 1rem;\n line-height: 1.6875rem;\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: initial;\n }\n\n .title {\n h3 {\n font-weight: 500;\n }\n\n .VerifiedIcon {\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 0.25rem;\n }\n\n .emoji {\n vertical-align: text-bottom;\n background-position: 0 0;\n flex-shrink: 0;\n }\n }\n\n .contact-phone,\n .contact-username {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: var(--color-text-secondary);\n }\n\n .ChatInfo {\n display: flex;\n align-items: center;\n flex-grow: 1;\n overflow: hidden;\n\n .status, .typing-status {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: var(--color-text-secondary);\n display: inline-block;\n\n &.online {\n color: var(--color-primary);\n }\n\n &[dir=rtl],\n &[dir=auto] {\n text-align: initial;\n width: 100%;\n }\n\n .group-status:only-child,\n .user-status:only-child {\n display: flow-root;\n }\n }\n }\n\n .contact-phone,\n .contact-username,\n h3, .last-message, .status, .typing-status {\n text-align: initial;\n unicode-bidi: plaintext;\n }\n\n .last-message,\n .status,\n .typing-status {\n body.is-ios &,\n body.is-macos & {\n font-size: .9375rem;\n }\n }\n\n &[dir=rtl] {\n .ListItem-button {\n padding: .5625rem .5625rem .5625rem .6975rem;\n }\n\n .Avatar {\n margin-left: 0.5rem;\n margin-right: 0;\n }\n\n .info > .status {\n width: 100%;\n }\n }\n }\n\n &.search-result-message {\n .title {\n padding-right: .15rem;\n }\n\n h3 {\n max-width: 80%;\n }\n\n h3, .subtitle {\n font-size: 1rem;\n line-height: 1.5rem;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n text-align: left;\n }\n\n .LastMessageMeta {\n margin-left: auto;\n margin-right: 0;\n }\n\n .subtitle {\n color: var(--color-text-secondary);\n margin-right: 2rem;\n\n .matching-text-highlight {\n color: var(--color-text);\n background: #CAE3F7;\n border-radius: 0.25rem;\n padding: 0 0.125rem;\n }\n }\n\n &[dir=rtl] {\n .LastMessageMeta {\n margin-left: 0;\n margin-right: auto;\n }\n\n .subtitle {\n margin-right: 0;\n display: block;\n }\n }\n }\n\n &.picker-list-item {\n margin: 0;\n\n .ListItem-button {\n padding-left: 0;\n display: flex;\n align-items: center;\n }\n\n .Avatar {\n width: 3rem;\n height: 3rem;\n }\n\n .Checkbox {\n flex-shrink: 0;\n height: 1.5rem;\n margin: 0;\n padding-left: 4rem;\n }\n\n &[dir=rtl] {\n .Checkbox {\n padding-left: 0;\n padding-right: 4rem;\n }\n }\n }\n\n .multiline-item {\n flex-grow: 1;\n white-space: initial;\n overflow: hidden;\n\n .title, .subtitle {\n display: block;\n text-align: initial;\n }\n\n .title {\n line-height: 1.25rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .subtitle {\n font-size: 0.875rem;\n line-height: 1.5rem;\n color: var(--color-text-secondary);\n\n & + .subtitle {\n margin-top: -0.25rem;\n }\n\n &.black {\n color: var(--color-text);\n }\n }\n }\n\n &[dir=rtl] {\n .ListItem-button > i {\n margin-left: 2rem;\n margin-right: 0;\n }\n }\n}\n",".VerifiedIcon {\n display: inline-block;\n flex-shrink: 0;\n width: 1.5rem;\n height: 1.5rem;\n background-image: url('../../assets/icon-verified.svg');\n background-repeat: no-repeat;\n background-size: 100%;\n background-position: center;\n}\n",".typing-status {\n display: flex;\n align-items: baseline;\n\n .sender-name {\n &::after {\n content: '\\00a0';\n color: var(--color-text-secondary);\n }\n }\n\n .ellipsis {\n display: flex;\n width: 1rem;\n overflow: hidden;\n\n &::after {\n content: '...';\n animation: typing-animation 1s steps(4, start) infinite;\n\n html[lang=ar] &,\n html[lang=fa] & {\n animation-name: typing-animation-rtl;\n }\n }\n }\n}\n\n@keyframes typing-animation {\n from {\n transform: translateX(-1rem);\n }\n}\n\n@keyframes typing-animation-rtl {\n from {\n transform: translateX(1rem);\n }\n}\n",".Notification-container {\n position: relative;\n width: 24rem;\n max-width: 100vw;\n margin: .25rem auto;\n z-index: var(--z-notification);\n\n @media (min-width: 1276px) {\n transition: transform var(--layer-transition);\n }\n\n &:first-of-type {\n margin-top: 4.25rem;\n\n .has-header-tools & {\n margin-top: 7.375rem;\n }\n }\n}\n\n.Notification {\n background: rgba(32, 32, 32, .8) url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiNGRkYiIGN4PSIxMiIgY3k9IjEyIiByPSIxMiIvPjxjaXJjbGUgZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJub256ZXJvIiBjeD0iMTIiIGN5PSI2LjUiIHI9IjEuNSIvPjxwYXRoIGQ9Ik0xMiA5LjVjLS41NTIgMC0xIC4zNy0xIC44MjZ2Ny4zNDhjMCAuNDU2LjQ0OC44MjYgMSAuODI2czEtLjM3IDEtLjgyNnYtNy4zNDhjMC0uNDU2LS40NDgtLjgyNi0xLS44MjZ6IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+\") no-repeat .9375rem 50%;\n background-size: 1.5rem;\n border-radius: var(--border-radius-default);\n padding: .9375rem .9375rem .9375rem 3.375rem;\n color: #fff;\n margin: 0 .5rem;\n\n .text-entity-link,\n .text-entity-link:hover,\n .text-entity-link:active {\n color: #fff !important;\n text-decoration: underline;\n }\n\n .content {\n line-height: 1.25;\n word-break: break-word;\n font-size: .9375rem;\n }\n}\n",".Radio {\n display: block;\n position: relative;\n padding-left: 4.5rem;\n text-align: left;\n margin-bottom: 1.5rem;\n line-height: 1.5rem;\n cursor: pointer;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n &.hidden-widget {\n cursor: default;\n .Radio-main {\n &::before, &::after {\n visibility: hidden;\n }\n }\n }\n\n > input {\n position: absolute;\n z-index: var(--z-below);\n opacity: 0;\n }\n\n .Radio-main {\n &::before, &::after {\n content: '';\n display: block;\n position: absolute;\n left: 1.0625rem;\n top: 50%;\n width: 1.25rem;\n height: 1.25rem;\n transform: translateY(-50%);\n }\n\n &::before {\n border: 2px solid var(--color-borders-input);\n border-radius: 50%;\n background-color: var(--color-background);\n opacity: 1;\n transition: border-color .1s ease, opacity .1s ease;\n }\n\n &::after {\n left: 1.375rem;\n width: 0.625rem;\n height: 0.625rem;\n border-radius: 50%;\n background: var(--color-primary);\n opacity: 0;\n transition: opacity .1s ease;\n }\n\n .label {\n display: block;\n word-break: break-word;\n unicode-bidi: plaintext;\n text-align: left;\n }\n\n .subLabel {\n display: block;\n font-size: 0.875rem;\n line-height: 1rem;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n }\n }\n\n input:checked ~ .Radio-main {\n &::before {\n border-color: var(--color-primary);\n }\n\n &::after {\n opacity: 1;\n }\n }\n\n &.loading {\n .Radio-main::before,\n .Radio-main::after {\n opacity: 0 !important;\n }\n\n .Spinner {\n position: absolute;\n left: 1.0625rem;\n top: 50%;\n transform: translateY(-50%);\n opacity: 0;\n animation: fade-in .2s ease forwards;\n --spinner-size: 1.25rem;\n }\n }\n\n &[dir=rtl] {\n padding-left: 0;\n padding-right: 4.5rem;\n\n .Radio-main {\n text-align: right;\n\n &::before {\n left: auto;\n right: 1.0625rem;\n }\n\n &::after {\n left: auto;\n right: 1.375rem;\n }\n }\n\n .label,\n .subLabel {\n text-align: right;\n }\n\n &.loading .Spinner {\n left: auto;\n right: 1.0625rem;\n }\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n",".ReactionStaticEmoji {\n width: 1rem;\n display: block;\n}\n",".Tab {\n display: flex;\n justify-content: center;\n flex: 1 1 auto;\n appearance: none;\n background: none;\n width: auto;\n margin: 0;\n border: none;\n padding: .625rem .25rem;\n font-weight: 500;\n color: var(--color-text-secondary);\n cursor: pointer;\n border-top-left-radius: var(--border-radius-messages-small);\n border-top-right-radius: var(--border-radius-messages-small);\n\n &,\n &:active,\n &:focus {\n outline: none;\n }\n\n &--active {\n cursor: default;\n color: var(--color-primary);\n\n i {\n opacity: 1 !important;\n }\n }\n\n @media (hover:hover) {\n &:not(&--active):hover {\n background: var(--color-interactive-element-hover);\n }\n }\n\n @media (max-width: 600px) {\n &:not(&--active):active {\n background: var(--color-interactive-element-hover);\n }\n }\n\n > span {\n position: relative;\n display: flex;\n align-items: center;\n white-space: nowrap;\n }\n\n .badge {\n min-width: 1.25rem;\n height: 1.25rem;\n margin-inline-start: 0.5rem;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .3125rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.3125rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n\n body.is-ios &,\n body.is-macos & {\n line-height: 1.25rem;\n }\n }\n\n &__badge--active {\n background: var(--color-primary) !important;\n }\n\n i {\n position: absolute;\n bottom: calc(-.625rem - 1px);\n left: 0;\n opacity: 0;\n background-color: var(--color-primary);\n height: .1875rem;\n width: 100%;\n border-radius: .1875rem .1875rem 0 0;\n pointer-events: none;\n box-sizing: content-box;\n transform-origin: left;\n\n &.animate {\n transition: transform var(--slide-transition);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n }\n }\n}\n",".TabList {\n position: sticky;\n top: 0;\n flex-shrink: 0;\n display: flex;\n justify-content: space-between;\n align-items: flex-end;\n font-size: .875rem;\n flex-wrap: nowrap;\n box-shadow: 0 2px 2px var(--color-light-shadow);\n background-color: var(--color-background);\n overflow-x: auto;\n overflow-y: hidden;\n\n scrollbar-width: none;\n scrollbar-color: rgba(0, 0, 0, 0);\n\n &.big {\n font-size: 1rem;\n --border-radius-messages-small: 0;\n }\n\n &::-webkit-scrollbar {\n height: 0;\n }\n\n &::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, 0);\n // `box-shadow` prevents repaint on macOS when hovering out of scrollable container\n box-shadow: 0 0 1px rgba(255, 255, 255, .01);\n }\n}\n",".DeleteChatModal {\n .modal-dialog {\n max-width: 20rem;\n }\n\n .modal-header {\n padding: 1.125rem 1.25rem 0;\n }\n\n .modal-title:not(:only-child) {\n margin: 0 0 0 .75rem;\n }\n\n .modal-content {\n padding: .5rem 1.25rem;\n }\n\n .confirm-dialog-button {\n margin-right: -.625rem;\n }\n}\n",".SearchInput {\n position: relative;\n width: 100%;\n color: rgba(var(--color-text-secondary-rgb), 0.5);\n background-color: var(--color-chat-hover);\n border: 2px solid var(--color-chat-hover);\n border-radius: 1.375rem;\n transition: border-color 0.15s ease;\n\n &.with-picker-item {\n display: flex;\n\n .icon-search {\n display: none;\n }\n\n input {\n padding-left: .5rem;\n }\n\n &[dir=rtl] {\n input {\n padding-right: .5rem;\n padding-left: 0;\n }\n }\n }\n\n &.has-focus {\n border-color: var(--color-primary);\n caret-color: var(--color-primary);\n background-color: var(--color-background);\n\n input {\n & + i {\n color: var(--color-primary);\n }\n }\n }\n\n input {\n height: 2.5rem;\n margin-bottom: 0;\n border: none !important;\n border-radius: 1.375rem;\n background-color: transparent !important;\n box-shadow: none !important;\n padding: calc(0.4375rem - var(--border-width)) calc(2.625rem - var(--border-width)) calc(0.5rem - var(--border-width)) calc(2.75rem - var(--border-width));\n\n &::placeholder {\n color: var(--color-placeholders);\n }\n }\n\n > i {\n position: absolute;\n top: .5rem;\n left: .75rem;\n font-size: 1.375rem;\n }\n\n .Loading {\n position: absolute;\n top: .5rem;\n right: .5rem;\n height: 1.5rem;\n\n .Spinner {\n --spinner-size: 1.5rem;\n }\n }\n\n .Button {\n position: absolute;\n top: .125rem;\n right: .125rem;\n font-size: 1rem;\n }\n\n @media (max-width: 600px) {\n input {\n height: 2.5rem;\n border-radius: 1.25rem;\n padding-left: calc(2.625rem - var(--border-width));\n }\n\n i {\n top: 0.5rem;\n }\n }\n\n &[dir=rtl] {\n input {\n direction: rtl;\n }\n\n > i {\n left: auto;\n right: .75rem;\n }\n\n .Loading {\n left: .5rem;\n right: auto;\n }\n\n .Button {\n left: .125rem;\n right: auto;\n }\n }\n}\n",".PickerSelectedItem {\n display: flex;\n align-items: center;\n background: var(--color-chat-hover);\n height: 2rem;\n min-width: 2rem;\n margin-left: 0.5rem;\n margin-bottom: 0.5rem;\n padding-right: 1rem;\n border-radius: 1rem;\n cursor: pointer;\n position: relative;\n overflow: hidden;\n flex-shrink: 1;\n transition: background-color .15s ease;\n\n max-width: calc(50% - 0.5rem);\n\n &.minimized {\n padding-right: 0;\n }\n\n &:hover {\n background-color: var(--color-item-active);\n }\n\n &.closeable:hover {\n background-color: rgba(var(--color-error-rgb), 0.16);\n\n .item-remove {\n opacity: 1;\n }\n\n .Avatar, .item-icon {\n opacity: 0;\n }\n }\n\n &.search-date {\n .item-remove {\n background: var(--color-primary);\n }\n\n &:hover {\n background: var(--color-chat-hover);\n }\n\n .item-name {\n font-size: 0.875rem;\n }\n }\n\n .SearchInput & {\n flex: 1 0 auto;\n position: relative;\n top: .25rem;\n left: -.125rem;\n\n color: var(--color-text-secondary);\n }\n\n .Avatar, .item-icon {\n width: 2rem;\n height: 2rem;\n opacity: 1;\n flex-shrink: 0;\n transition: opacity .15s ease;\n\n i {\n font-size: 2rem;\n }\n }\n\n .item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0.375rem;\n border-radius: 50%;\n background-color: var(--color-primary);\n color: white;\n\n i {\n font-size: 1.25rem;\n position: relative;\n top: -1px;\n }\n }\n\n .item-name {\n margin-left: 0.5rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji.emoji-small {\n width: 1.125rem;\n height: 1.125rem;\n background-size: 1.125rem;\n vertical-align: -2px;\n }\n }\n\n .item-remove {\n position: absolute;\n left: 0;\n top: 0;\n width: 2rem;\n height: 2rem;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--color-error);\n font-size: 1.5rem;\n color: white;\n opacity: 0;\n transition: opacity .15s ease;\n }\n\n &[dir=rtl] {\n padding-left: 1rem;\n padding-right: 0;\n\n &.minimized {\n padding-right: 0;\n padding-left: 0;\n }\n\n .SearchInput & {\n left: auto;\n right: -.125rem;\n }\n\n .item-name {\n margin-left: 0;\n margin-right: 0.5rem;\n }\n\n .item-remove {\n left: auto;\n right: 0;\n }\n }\n}\n",".Switcher {\n display: inline-flex;\n align-items: center;\n position: relative;\n margin: 0;\n\n &.disabled {\n pointer-events: none;\n opacity: 0.5;\n }\n\n &.inactive {\n pointer-events: none;\n }\n\n body.animation-level-0 &,\n &.no-animation {\n .widget,\n .widget::after {\n transition: none !important;\n }\n\n .widget:active:after {\n width: 1.125rem;\n }\n }\n\n input {\n height: 0;\n width: 0;\n visibility: hidden;\n position: absolute;\n z-index: var(--z-below);\n opacity: 0;\n }\n\n .widget {\n cursor: pointer;\n text-indent: -999px;\n width: 2.125rem;\n height: 0.875rem;\n background: var(--color-gray);\n display: inline-block;\n border-radius: .5rem;\n position: relative;\n transition: background .2s ease-in;\n }\n\n .widget:after {\n content: '';\n position: absolute;\n top: -.125rem;\n left: 0;\n width: 1.125rem;\n height: 1.125rem;\n background: var(--color-background);\n border-radius: .75rem;\n transition: 0.2s ease-out;\n border: .125rem solid var(--color-gray);\n }\n\n input:checked + .widget {\n background: var(--color-primary);\n }\n\n input:checked + .widget:after {\n left: calc(100% - 1.125rem);\n transform: translateX(calc(-100% + 1.125rem));\n border-color: var(--color-primary);\n }\n\n .widget:active:after {\n width: 1.25rem;\n }\n}\n",".MessageOutgoingStatus {\n width: 1.19rem;\n height: 1.19rem;\n overflow: hidden;\n display: inline-block;\n line-height: 1;\n font-size: 1.1875rem;\n\n i {\n background: var(--background-color);\n }\n\n .icon-message-succeeded {\n padding-left: 0.13rem;\n }\n\n .Transition {\n width: 100%;\n height: 100%;\n }\n}\n",".LastMessageMeta {\n margin-right: .2rem;\n padding: .3rem 0 .15rem;\n flex-shrink: 0;\n font-size: 0.75rem;\n line-height: 1;\n display: flex;\n align-items: center;\n\n .MessageOutgoingStatus {\n color: var(--color-text-meta-colored);\n margin-right: 0.1rem;\n font-size: 1.15rem;\n\n body.is-ios & {\n margin-bottom: -.125rem;\n }\n }\n\n .time {\n color: var(--color-text-meta);\n line-height: 1.15rem;\n }\n}\n",".Badge-transition {\n opacity: 1;\n transition: transform .3s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n &:not(.open) {\n transform: scale(0);\n opacity: 0;\n }\n\n &:not(.shown) {\n display: none;\n }\n\n &.closing {\n transition: transform .2s ease-out, opacity .2s ease-out;\n }\n}\n\n.Badge-wrapper {\n display: flex;\n\n .Badge {\n margin-inline-start: .5rem;\n }\n}\n\n.Badge {\n min-width: 1.5rem;\n height: 1.5rem;\n background: var(--color-gray);\n border-radius: 0.75rem;\n padding: 0 .4375rem;\n color: white;\n font-size: 0.875rem;\n line-height: 1.5625rem;\n font-weight: 500;\n text-align: center;\n flex-shrink: 0;\n\n body.is-macos & {\n line-height: 1.5rem;\n }\n\n body.is-ios & {\n line-height: 1.375rem;\n min-width: 1.375rem;\n height: 1.375rem;\n padding: 0 .375rem;\n }\n\n &.mention, &.unread:not(.muted) {\n background: var(--color-green);\n color: var(--color-white);\n }\n\n &.pinned:not(.unread) {\n color: var(--color-pinned);\n background: transparent;\n width: 1.5rem;\n padding: 0;\n\n i {\n font-size: 1.5rem;\n }\n }\n\n &.mention {\n width: 1.5rem;\n padding: 0.25rem;\n\n i {\n font-size: 1rem;\n vertical-align: super;\n }\n\n body.is-ios & {\n width: 1.375rem;\n padding: 0.25rem;\n\n i {\n font-size: .875rem;\n }\n }\n }\n}\n\n\n","\n@keyframes bar-animation-transform-1 {\n 0% { transform: scaleY(0.33); }\n 12.5% { transform: scaleY(1.66); }\n 25% { transform: scaleY(0.33); }\n 37.5% { transform: scaleY(1); }\n 50% { transform: scaleY(0.33); }\n 62.5% { transform: scaleY(1.66); }\n 75% { transform: scaleY(0.33); }\n 87.5% { transform: scaleY(1.66); }\n 100% { transform: scaleY(0.33); }\n}\n\n@keyframes bar-animation-transform-2 {\n 0% { transform: scaleY(1); }\n 12.5% { transform: scaleY(0.33); }\n 25% { transform: scaleY(1.66); }\n 37.5% { transform: scaleY(0.33); }\n 50% { transform: scaleY(1); }\n 62.5% { transform: scaleY(0.33); }\n 75% { transform: scaleY(1.66); }\n 87.5% { transform: scaleY(0.33); }\n 100% { transform: scaleY(1); }\n}\n\n\n.ChatCallStatus {\n position: absolute;\n right: 6px;\n bottom: 0;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background-color: #0ac630;\n border: 2px solid var(--color-background);\n overflow: hidden;\n\n .indicator {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n & > div {\n width: 2px;\n height: 6px;\n background: var(--color-background);\n border-radius: 1px;\n margin: 1px;\n will-change: transform;\n transform: translateZ(0);\n }\n & > div:nth-child(odd) {\n transform: scaleY(0.8);\n }\n & > div:nth-child(even) {\n transform: scaleY(1.33);\n }\n }\n\n &.selected {\n background-color: var(--color-white);\n border-color: var(--color-chat-active);\n .indicator div{\n background-color: var(--color-chat-active);\n }\n }\n\n &.active .indicator {\n div:nth-child(odd) {\n animation: bar-animation-transform-2 3.2s normal infinite;\n }\n\n div:nth-child(even) {\n animation: bar-animation-transform-1 3.2s normal infinite;\n }\n }\n\n}\n",".Chat {\n --background-color: var(--color-background);\n\n body.is-ios &,\n body.is-macos & {\n --color-text-meta: var(--color-text-meta-apple);\n }\n\n position: absolute;\n top: 0;\n left: 0;\n margin: 0;\n width: 100%;\n\n &.animate-opacity {\n will-change: opacity;\n transition: opacity .2s ease-out;\n }\n\n &.animate-transform {\n will-change: transform;\n transition: transform .2s ease-out;\n }\n\n &:hover, &.ListItem.has-menu-open {\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n\n @media (max-width: 600px) {\n &.selected {\n --background-color: var(--color-chat-hover) !important;\n\n .Avatar.online::after {\n border-color: var(--color-chat-hover);\n }\n }\n }\n\n @media (min-width: 600px) {\n &.selected,\n &.selected:hover {\n --background-color: var(--color-chat-active) !important;\n\n .Avatar.online::after {\n border-color: var(--color-chat-active) !important;\n background: var(--color-white);\n }\n\n .ListItem-button {\n --background-color: var(--color-chat-active) !important;\n --color-text: var(--color-white);\n --color-text-meta-colored: var(--color-white);\n --color-text-meta: var(--color-white);\n --color-text-secondary: var(--color-white);\n --color-error: var(--color-white);\n --color-pinned: var(--color-white);\n }\n\n .icon-muted {\n color: var(--color-white) !important;\n }\n\n .Badge:not(.pinned) {\n background: var(--color-white);\n color: var(--color-chat-active);\n }\n }\n }\n\n @media (max-width: 600px) {\n .ListItem-button {\n border-radius: 0 !important;\n }\n }\n\n .status {\n position: relative;\n flex-shrink: 0;\n }\n\n .info {\n .subtitle {\n margin-top: -.125rem;\n }\n\n h3 {\n width: auto;\n max-width: 80%;\n }\n\n .icon-muted {\n font-size: 1.25rem;\n margin-left: 0.25rem;\n margin-top: -.0625rem;\n color: #C6C8CA;\n\n body.is-ios & {\n margin-top: 0;\n margin-right: .5rem;\n }\n }\n\n .LastMessageMeta {\n margin-left: auto;\n\n body.is-ios & {\n font-size: .875rem;\n margin-right: 0;\n }\n }\n\n .last-message, .typing-status {\n padding-right: 0.25rem;\n flex-grow: 1;\n color: var(--color-text-secondary);\n unicode-bidi: plaintext;\n\n &[dir=ltr] {\n text-align: left;\n }\n\n .sender-name {\n color: var(--color-text);\n }\n\n .draft {\n color: var(--color-error);\n }\n }\n\n .last-message {\n .draft {\n &::after {\n content: ': ';\n }\n }\n\n .colon {\n margin-inline-end: .25rem;\n }\n\n img {\n width: 1.25rem;\n height: 1.25rem;\n object-fit: cover;\n border-radius: .125rem;\n vertical-align: -.25rem;\n margin-inline-end: .25rem;\n\n body.is-ios & {\n width: 1.125rem;\n height: 1.125rem;\n vertical-align: -.1875rem;\n }\n\n &.round {\n border-radius: .625rem;\n }\n }\n\n .emoji-small {\n width: 1rem;\n height: 1rem;\n vertical-align: -.125rem;\n }\n\n .icon-play {\n position: relative;\n display: inline-block;\n font-size: .75rem;\n color: #fff;\n margin-inline-start: -1.25rem;\n margin-inline-end: 0.5rem;\n bottom: 0.0625rem;\n\n body.is-ios & {\n margin-inline-start: -1.125rem;\n bottom: 0;\n }\n }\n }\n }\n\n &[dir=rtl] {\n .info {\n .LastMessageMeta {\n margin-left: 0;\n margin-right: auto;\n }\n\n .title, .subtitle {\n padding-left: .15rem;\n padding-right: 0;\n }\n\n .icon-muted {\n margin-left: 0;\n margin-right: 0.25rem;\n }\n\n .last-message, .typing-status {\n padding-left: 0.5rem;\n padding-right: 0;\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n }\n}\n",".AnimatedEmoji {\n cursor: pointer;\n margin-bottom: 0.75rem;\n\n img {\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n &.like-sticker-thumb img {\n transform: scale(0.8);\n }\n}\n",".EmptyFolder {\n width: 100%;\n height: 80%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n @media (max-height: 480px) {\n height: 100%;\n }\n\n .sticker {\n height: 8rem;\n margin-bottom: 1.875rem;\n }\n\n .title {\n font-size: 1.25rem;\n margin-bottom: .125rem;\n }\n\n .description {\n font-size: .875rem;\n color: var(--color-text-secondary);\n\n body.is-ios &,\n body.is-macos & {\n color: var(--color-text-secondary-apple);\n }\n }\n\n .Button.pill {\n margin-top: .625rem;\n font-weight: 500;\n padding-inline-start: .75rem;\n unicode-bidi: plaintext;\n\n i {\n margin-inline-end: .625rem;\n font-size: 1.5rem;\n }\n }\n}\n",".NothingFound {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-meta);\n\n &.with-description {\n flex-direction: column;\n }\n\n .AnimatedSticker {\n margin: 0 auto;\n }\n\n .description {\n color: var(--color-text-secondary);\n font-size: .875rem;\n text-align: center;\n margin: 1rem 0 0;\n unicode-bidi: plaintext;\n }\n}\n",".Media {\n height: 0;\n padding-bottom: 100%;\n overflow: hidden;\n position: relative;\n cursor: pointer;\n\n .video-duration {\n position: absolute;\n left: .25rem;\n top: .25rem;\n background: rgba(0, 0, 0, .25);\n color: #fff;\n font-size: .75rem;\n padding: 0 .3125rem;\n border-radius: .1875rem;\n line-height: 1.125rem;\n }\n\n img {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n}\n",".WebLink {\n min-height: 3rem;\n padding: .25rem 0 0 3.75rem;\n font-size: 0.875rem;\n line-height: 1.125rem;\n position: relative;\n\n & + & {\n margin-top: 1.5rem;\n }\n\n &.without-media::before {\n content: attr(data-initial);\n width: 3rem;\n height: 3rem;\n position: absolute;\n left: 0;\n top: 0;\n background-color: var(--color-webpage-initial-background);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--border-radius-messages-small);\n text-transform: uppercase;\n font-weight: 500;\n font-size: 1.5rem;\n }\n\n .Media {\n position: absolute;\n left: 0;\n top: 0;\n width: 3rem;\n height: 3rem;\n cursor: default !important;\n padding-bottom: unset !important;\n border-radius: var(--border-radius-messages-small) !important;\n }\n\n .site-name,\n .site-description,\n .site-title {\n word-break: break-word;\n text-align: initial;\n }\n\n .site-name {\n display: block;\n color: var(--color-links);\n font-weight: 400;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .site-title {\n font-size: 1rem;\n font-weight: 400;\n margin-bottom: .0625rem;\n line-height: 1.3125rem;\n }\n\n .sender-name,\n .site-description {\n margin-bottom: 0;\n color: var(--color-text-secondary);\n line-height: 1.125rem;\n max-height: 2.25rem;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .sender-name {\n margin-top: .25rem;\n }\n\n .site-description .emoji {\n width: 1rem !important;\n height: 1rem !important;\n }\n\n &[dir=rtl] {\n padding: .25rem 3.75rem 0 0;\n\n .Media,\n &.without-media::before {\n left: auto;\n right: 0;\n }\n\n .content {\n text-align: right;\n }\n }\n}\n",".File {\n --secondary-color: var(--color-text-secondary);\n\n .Message.own & {\n --secondary-color: var(--color-text-green);\n }\n\n .content-inner & {\n min-width: 14rem;\n @media (max-width: 340px) {\n min-width: 11rem;\n }\n }\n\n display: flex;\n align-items: center;\n\n .file-icon-container {\n position: relative;\n }\n\n .file-progress,\n .file-icon,\n .file-preview {\n width: 3.375rem;\n height: 3.375rem;\n margin-inline-end: .75rem;\n border-radius: var(--border-radius-messages-small);\n background: var(--color-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .file-progress {\n position: absolute;\n top: 0;\n left: 0;\n }\n\n .file-icon {\n padding: 1rem .75rem .5rem;\n align-items: flex-end;\n flex-shrink: 0;\n position: relative;\n color: white;\n\n .file-ext {\n font-size: 1rem;\n font-weight: 500;\n transition: opacity .15s;\n }\n\n &::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n right: 0;\n border-bottom-left-radius: 0.25rem;\n background: rgba(black, 0.25);\n border-color: transparent var(--background-color) transparent var(--background-color);\n border-width: 0 1.125rem 1.125rem 0;\n border-style: solid;\n transition: border-width .15s ease-in;\n }\n }\n\n .file-preview {\n background: transparent;\n overflow: hidden;\n\n & + .action-icon,\n & + .file-progress {\n background: rgba(black, 0.5);\n border-radius: var(--border-radius-messages-small);\n }\n\n img {\n object-fit: cover;\n }\n }\n\n .action-icon {\n color: #fff;\n font-size: 1.5rem;\n position: absolute;\n top: 0;\n start: 0;\n width: 3.375rem;\n height: 3.375rem;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity .25s;\n }\n\n &.interactive .file-icon-container {\n cursor: pointer;\n\n &:hover {\n .file-icon::after {\n border-width: 0;\n }\n\n .action-icon {\n opacity: 1;\n\n &.hidden {\n opacity: 0;\n }\n }\n\n .file-ext {\n opacity: 0;\n }\n }\n }\n\n .file-info {\n margin-top: .1875rem;\n margin-right: .125rem;\n white-space: nowrap;\n overflow: hidden;\n flex-grow: 1;\n\n & + .Link {\n font-size: .75rem;\n color: var(--color-text-secondary);\n padding-left: 1rem;\n white-space: nowrap;\n }\n }\n\n .file-title {\n font-size: 1rem;\n line-height: 1.5rem;\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n\n .emoji {\n vertical-align: -4px;\n }\n }\n\n .file-subtitle {\n font-size: .875rem;\n line-height: .9375rem;\n color: var(--secondary-color);\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n\n span + span {\n &::before {\n content: '\\00a0\\2022\\00a0';\n }\n }\n }\n\n &.smaller {\n --background-color: var(--color-background);\n --border-radius-messages-small: .3125rem;\n\n .action-icon,\n .file-progress,\n .file-icon,\n .file-preview {\n width: 3rem;\n height: 3rem;\n }\n\n .file-icon {\n padding-bottom: .375rem;\n\n &::after {\n border-width: 0 1rem 1rem 0;\n }\n }\n\n .file-info {\n margin-top: -.125rem;\n }\n\n .file-title {\n font-weight: 400;\n }\n\n .file-subtitle {\n line-height: 1rem;\n }\n }\n\n &:dir(rtl),\n &[dir=rtl] {\n .file-progress,\n .file-icon,\n .file-preview {\n margin-left: .75rem;\n margin-right: 0;\n }\n\n .file-info {\n text-align: right;\n\n & + .Link {\n padding-left: 0;\n padding-right: 1rem;\n }\n }\n\n .action-icon {\n left: auto;\n right: 0;\n }\n }\n}\n\n// Document extension colors\n.File .file-progress,\n.File .file-icon {\n &.red {\n background-color: var(--color-error);\n }\n\n &.orange {\n background-color: var(--color-warning);\n }\n\n &.green {\n background-color: var(--color-text-green);\n }\n}\n",".Audio {\n display: flex;\n align-items: flex-start;\n position: relative;\n\n .media-loading {\n position: absolute;\n pointer-events: none;\n\n &.interactive {\n pointer-events: all;\n }\n }\n\n &.own {\n --color-text-secondary: var(--accent-color);\n --color-interactive-active: var(--color-text-green);\n --color-interactive-inactive: rgba(var(--color-text-green-rgb), 0.4);\n --color-interactive-buffered: rgba(var(--color-text-green-rgb), 0.4); // Overlays underlying inactive color\n\n .theme-dark & {\n --color-text-green-rgb: 255, 255, 255;\n --color-text-green: var(--color-white);\n }\n\n .Button {\n --color-primary: var(--color-text-green);\n --color-primary-shade: var(--color-green);\n --color-primary-shade-darker: var(--color-green-darker);\n --color-white: var(--color-background-own);\n\n .theme-dark & {\n --color-primary-shade: #fff;\n --color-primary-shade-darker: #fff;\n }\n }\n }\n\n .toggle-play {\n margin-inline-end: .5rem;\n\n &.translucent-white {\n color: rgba(255, 255, 255, 0.8);\n }\n\n &.smaller {\n width: 3rem;\n height: 3rem;\n margin-inline-end: .75rem;\n\n i {\n font-size: 1.625rem;\n\n &.icon-pause {\n font-size: 1.5625rem;\n }\n }\n }\n\n i {\n position: absolute;\n\n &.icon-play {\n margin-left: .1875rem;\n @media (max-width: 600px) {\n margin-left: .125rem;\n }\n }\n }\n\n .icon-play, .icon-pause {\n opacity: 1;\n transform: scale(1);\n transition: opacity .4s, transform .6s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n\n &.play .icon-pause,\n &.pause .icon-play,\n &.loading .icon-play,\n &.loading .icon-pause {\n opacity: 0;\n transform: scale(.5);\n }\n }\n\n .download-button {\n position: absolute;\n width: 1.1875rem !important;\n height: 1.1875rem !important;\n padding: 0;\n left: 1.9375rem;\n top: 1.9375rem;\n border: .125rem solid var(--background-color);\n z-index: 1;\n\n i {\n font-size: 0.8125rem;\n }\n }\n\n &.bigger .download-button {\n left: 2rem;\n top: 2rem;\n border: .125rem solid var(--color-background);\n }\n\n .content {\n align-self: center;\n min-width: 0;\n flex-grow: 1;\n text-align: initial;\n }\n\n .content-row {\n display: flex;\n justify-content: space-between;\n }\n\n .title {\n font-weight: 500;\n margin: 0;\n line-height: 1.25;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n canvas {\n height: 23px;\n }\n\n .voice-duration {\n margin: .25rem 0 0;\n font-size: .875rem;\n color: var(--color-text-secondary);\n font-variant-numeric: tabular-nums;\n display: flex;\n align-items: flex-end;\n\n &.unread::after {\n content: '';\n position: relative;\n margin: 0 0 .375rem .25rem;\n width: 0.4375rem;\n height: 0.4375rem;\n border-radius: 50%;\n background-color: var(--accent-color);\n }\n }\n\n body.is-ios & {\n .voice-duration.unread::after {\n margin-bottom: .4375rem;\n }\n }\n\n &:not(.own) .voice-duration span {\n color: var(--color-primary);\n }\n\n .waveform {\n cursor: pointer;\n margin-left: 1px;\n touch-action: none;\n }\n\n .meta,\n .performer,\n .date {\n font-size: .875rem;\n color: var(--color-text-secondary);\n margin: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n unicode-bidi: plaintext;\n }\n\n .duration {\n font-size: .875rem;\n color: var(--color-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 0;\n font-variant-numeric: tabular-nums;\n }\n\n .meta {\n display: flex;\n align-items: center;\n margin-top: 0.125rem;\n padding-inline-end: 0.5rem;\n\n & > span {\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .performer {\n flex-shrink: 0;\n }\n\n .duration.with-seekline {\n margin-inline-end: 0.625rem;\n }\n\n .bullet {\n margin: 0 0.25rem;\n flex-shrink: 0;\n }\n }\n\n .seekline {\n flex-grow: 1;\n height: 1.25rem;\n position: relative;\n top: 3px;\n cursor: pointer;\n touch-action: none;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n top: 6px;\n height: 2px;\n background-color: var(--color-interactive-inactive);\n border-radius: 2px;\n }\n }\n\n .seekline-buffered-progress, .seekline-play-progress {\n position: absolute;\n height: 2px;\n border-radius: 2px;\n overflow: hidden;\n width: 100%;\n top: 6px;\n\n i {\n position: absolute;\n width: 100%;\n background-color: var(--color-interactive-active);\n height: 2px;\n border-radius: 2px;\n right: 100%;\n }\n }\n\n .seekline-buffered-progress i {\n background-color: var(--color-interactive-buffered) !important;\n }\n\n .seekline-thumb {\n position: absolute;\n width: 100%;\n top: 7px;\n left: 0;\n\n i {\n pointer-events: none;\n position: absolute;\n width: 100%;\n right: 100%;\n\n &::after {\n content: '';\n position: absolute;\n top: -6px;\n right: -6px;\n width: 12px;\n height: 12px;\n border-radius: 6px;\n background: var(--color-interactive-active);\n }\n }\n }\n\n &.bigger {\n .title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 400;\n line-height: 1.5rem;\n }\n\n .meta {\n height: 1.25rem;\n }\n\n .performer,\n .date {\n line-height: 1.0625rem;\n }\n\n .duration {\n line-height: 1rem;\n }\n\n .media-loading {\n top: 0.1875rem;\n left: 0.1875rem;\n }\n\n &[dir=rtl] {\n .media-loading {\n left: auto !important;\n right: 0;\n }\n }\n }\n\n .ProgressSpinner.size-s svg {\n width: 2.25rem;\n height: 2.25rem;\n }\n\n &[dir=rtl] {\n &:last-child {\n margin-bottom: 0.625rem;\n }\n\n .toggle-play {\n margin-left: .5rem;\n margin-right: 0;\n\n &.smaller {\n margin-left: .75rem;\n margin-right: 0;\n }\n }\n\n .meta.duration.with-seekline {\n margin-inline-start: 0.625rem;\n }\n\n .content,\n .duration {\n text-align: right;\n }\n\n .download-button {\n left: auto;\n right: 2rem;\n }\n }\n}\n\n.has-replies .Audio[dir=rtl] {\n margin-bottom: 1.625rem;\n}\n",".ProfilePhoto {\n width: 100%;\n height: 100%;\n cursor: pointer;\n position: relative;\n\n img:not(.emoji) {\n width: 100%;\n object-fit: cover;\n }\n\n .prev-avatar-media {\n position: absolute;\n left: 0;\n top: 0;\n z-index: -1;\n }\n\n .spinner-wrapper {\n width: 100%;\n height: 100%;\n }\n\n .spinner-wrapper,\n &.deleted-account,\n &.replies-bot-account,\n &.no-photo,\n &.saved-messages {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-white);\n background: linear-gradient(var(--color-white) -125%, var(--color-user));\n cursor: default;\n }\n\n &.no-photo {\n font-size: 14rem;\n }\n\n &.replies-bot-account,\n &.deleted-account,\n &.saved-messages {\n font-size: 20rem;\n }\n}\n",".ProfileInfo {\n aspect-ratio: 1 / 1;\n position: relative;\n\n @supports not (aspect-ratio: 1 / 1) {\n &::before {\n float: left;\n padding-top: 100%;\n content: \"\";\n }\n\n &::after {\n display: block;\n content: \"\";\n clear: both;\n }\n }\n\n .photo-wrapper {\n width: 100%;\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n\n > .Transition {\n width: 100%;\n height: 100%;\n }\n }\n\n .photo-dashes {\n position: absolute;\n width: 100%;\n height: .125rem;\n padding: 0 .375rem;\n z-index: 1;\n\n display: flex;\n top: .5rem;\n left: 0;\n }\n\n .photo-dash {\n flex: 1 1 auto;\n background-color: var(--color-white);\n opacity: .25;\n border-radius: .125rem;\n margin: 0 .125rem;\n\n &.current {\n opacity: .75;\n }\n }\n\n .navigation {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 25%;\n border: none;\n padding: 0;\n margin: 0;\n appearance: none;\n background: transparent no-repeat;\n background-size: 1.25rem;\n opacity: .25;\n transition: opacity .15s;\n outline: none;\n cursor: pointer;\n z-index: 1;\n\n &:hover, .is-touch-env & {\n opacity: 1;\n }\n\n &.prev {\n left: 0;\n background-image: url(\"../../assets/media_navigation_previous.svg\");\n background-position: 1.25rem 50%;\n }\n\n &.next {\n right: 0;\n background-image: url(\"../../assets/media_navigation_next.svg\");\n background-position: calc(100% - 1.25rem) 50%;\n }\n }\n\n .info {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n min-height: 100px;\n padding: 0 1.5rem .5rem;\n background: linear-gradient(0deg, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%);\n color: var(--color-white);\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n pointer-events: none;\n\n &:dir(rtl) {\n .status {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n\n &[dir=rtl] {\n .status {\n text-align: right;\n unicode-bidi: plaintext;\n }\n }\n }\n\n .title {\n display: flex;\n align-items: center;\n\n h3 {\n font-weight: 500;\n font-size: 1.25rem;\n line-height: 1.375rem;\n white-space: pre-wrap;\n word-break: break-word;\n margin-bottom: .25rem;\n }\n\n .VerifiedIcon {\n margin-left: 0.25rem;\n margin-top: -0.125rem;\n }\n\n .emoji {\n width: 1.5rem;\n height: 1.5rem;\n background-size: 1.5rem;\n }\n }\n\n .status {\n font-size: 0.875rem;\n opacity: .5;\n }\n\n &[dir=rtl] {\n .navigation.prev {\n left: auto;\n right: 0;\n transform: scaleX(-1);\n }\n\n .navigation.next {\n left: 0;\n right: auto;\n transform: scaleX(-1);\n }\n }\n\n &.self {\n margin: 0 -.5rem .75rem;\n overflow: hidden;\n\n &.ghost {\n margin: 0;\n }\n\n .prev-avatar-media {\n z-index: 0;\n }\n\n .info {\n padding-bottom: .75rem;\n }\n\n .status {\n line-height: 1rem;\n }\n }\n}\n",".DropTarget {\n border-radius: var(--border-radius-default);\n background: var(--color-background);\n padding: 1.25rem;\n flex: 1 1 auto;\n width: 100%;\n max-width: 43.75rem;\n margin-left: auto;\n margin-right: auto;\n margin-bottom: .3125rem;\n display: flex;\n color: #A4ACB3;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n\n @media (max-height: 350px) {\n padding: .75rem;\n }\n\n &.hovered .target-content {\n color: var(--color-primary);\n background-image: var(--drag-target-border-hovered);\n }\n\n & + & {\n margin-top: .3125rem;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .target-content {\n pointer-events: none;\n background-image: var(--drag-target-border);\n border-radius: .5rem;\n flex: 1 1 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n transition: .2s color, .2s background;\n }\n\n .icon {\n font-size: 6.25rem;\n line-height: 4.6875rem;\n margin-bottom: 2.25rem;\n\n @media (max-height: 520px) {\n font-size: 4.25rem;\n line-height: 3.5rem;\n margin-bottom: 1rem;\n }\n\n @media (max-height: 450px) {\n font-size: 2rem;\n line-height: 1rem;\n margin-bottom: .5rem;\n margin-top: .25rem;\n }\n }\n\n .title {\n font-size: 1.3125rem;\n font-weight: 500;\n letter-spacing: -.18px;\n\n @media (max-height: 450px) {\n font-size: 1rem;\n }\n }\n\n .description {\n font-size: 1rem;\n letter-spacing: .3px;\n\n @media (max-height: 450px) {\n font-size: .875rem;\n }\n }\n}\n",".FloatingActionButton {\n position: absolute;\n right: 1rem;\n bottom: 1rem;\n transform: translateY(calc(5rem - var(--group-call-header-height, 0rem)));\n transition: transform .25s cubic-bezier(0.34, 1.56, 0.64, 1);\n\n body.animation-level-0 & {\n transition: none !important;\n }\n\n &.revealed {\n transform: translateY(calc(0rem - var(--group-call-header-height, 0rem)));\n }\n}\n","@import '../../styles/mixins';\n\n@mixin thumb-styles() {\n background: var(--slider-color);\n border: none;\n height: 0.75rem;\n width: 0.75rem;\n border-radius: 50%;\n cursor: pointer;\n transform: scale(1);\n transition: transform .25s ease-in-out;\n\n &:hover {\n transform: scale(1.2);\n }\n}\n\n.RangeSlider {\n --slider-color: var(--color-primary);\n\n margin-bottom: 1rem;\n\n &.disabled {\n pointer-events: none;\n --slider-color: var(--color-text-secondary);\n }\n\n .slider-top-row {\n display: flex;\n justify-content: space-between;\n margin-bottom: 0.625rem;\n\n .value {\n flex-shrink: 0;\n margin-left: 1rem;\n color: var(--color-text-secondary);\n }\n\n &[dir=rtl] {\n .value {\n margin-left: 0;\n margin-right: 1rem;\n }\n }\n }\n\n .slider-main {\n position: relative;\n z-index: 1;\n\n &::before {\n content: '';\n position: absolute;\n width: 100%;\n left: 0;\n top: 0.3125rem;\n height: 0.125rem;\n background-color: var(--color-borders);\n border-radius: 0.125rem;\n opacity: 0.5;\n z-index: -1;\n }\n }\n\n .slider-fill-track {\n position: absolute;\n width: 100%;\n left: 0;\n top: 0.3125rem;\n height: 0.125rem;\n background-color: var(--slider-color);\n border-radius: 0.125rem;\n pointer-events: none;\n }\n\n // Reset range input browser styles\n @include reset-range();\n\n // Apply custom styles\n input[type=\"range\"] {\n // Note that while we're repeating code here, that's necessary as you can't comma-separate these type of selectors.\n // Browsers will drop the entire selector if it doesn't understand a part of it.\n &::-webkit-slider-thumb {\n @include thumb-styles();\n }\n\n &::-moz-range-thumb {\n @include thumb-styles();\n }\n\n &::-ms-thumb {\n @include thumb-styles();\n }\n }\n\n .slider-options {\n display: grid;\n grid-template-rows: auto;\n grid-auto-columns: 1fr;\n grid-auto-flow: column;\n }\n\n .slider-option {\n font-size: 0.825rem;\n text-align: center;\n cursor: pointer;\n color: var(--color-text-secondary);\n transition: color .2s ease;\n\n &:hover, &.active {\n color: var(--color-text);\n }\n\n &.active {\n font-weight: 500;\n }\n\n &:first-child {\n text-align: left;\n }\n\n &:last-child {\n text-align: right;\n }\n }\n}\n","// @optimization\n@mixin while-transition() {\n .Transition > div:not(.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",".DropArea {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n height: 100vh;\n z-index: var(--z-drop-area);\n padding: 80px 20px 20px;\n\n display: flex;\n flex-direction: column;\n\n #Main.right-column-open & {\n max-width: calc(100% - var(--right-column-width));\n }\n}\n",".StickerButton {\n display: inline-block;\n width: 4rem;\n height: 4rem;\n margin: 0.5rem;\n border-radius: var(--border-radius-messages-small);\n background: transparent no-repeat center;\n background-size: contain;\n transition: background-color .15s ease, opacity .3s ease !important;\n position: relative;\n\n &.interactive {\n cursor: pointer;\n\n &:hover {\n background-color: var(--color-interactive-element-hover);\n\n .sticker-unfave-button {\n opacity: 1;\n }\n }\n\n }\n\n @media (max-width: 600px) {\n margin: 0.25rem;\n }\n\n &.set-button {\n width: 2.75rem !important;\n height: 2.75rem;\n margin: 0 0.5rem;\n }\n\n &.large {\n width: 10rem;\n height: 10rem;\n margin: 0;\n }\n\n .AnimatedSticker, img {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n\n img {\n object-fit: contain;\n }\n\n .sticker-unfave-button {\n position: absolute;\n top: -0.5rem;\n right: -0.5rem;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0.125rem;\n\n i {\n font-size: 1rem;\n }\n\n opacity: 0;\n }\n}\n",".TextFormatter {\n transform: translate(-50%, -3.25rem);\n\n &, &-link-control {\n position: absolute;\n background: var(--color-background);\n border-radius: var(--border-radius-messages);\n padding: 0.5rem 0.375rem;\n box-shadow: 0 1px 2px var(--color-default-shadow);\n }\n\n &-link-control {\n left: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n transition: opacity .3s ease;\n\n .Modal & {\n max-width: 100%;\n }\n\n @media (max-width: 600px) {\n max-width: calc(100vw - var(--text-formatter-left) + 3rem);\n }\n\n input {\n border: none !important;\n outline: none !important;\n width: 100%;\n color: var(--color-text);\n background-color: var(--color-background);\n }\n }\n\n &-buttons, &-link-url-confirm {\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n }\n\n &-divider {\n width: 1px;\n height: 1.75rem;\n margin: 0 0.25rem;\n background-color: var(--color-borders);\n }\n\n &-link-url-input-wrapper {\n width: 20rem;\n position: relative;\n max-width: 100%;\n\n @media (max-width: 600px) {\n max-width: 90vw;\n }\n\n &::before, &::after {\n content: \"\";\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n width: 1rem;\n z-index: 2;\n opacity: 0;\n transition: opacity .2s ease;\n }\n\n &::before {\n left: 0;\n background: linear-gradient(to right, var(--color-background) .25rem, transparent 1rem)\n }\n\n &::after {\n right: 0;\n background: linear-gradient(to left, var(--color-background) .25rem, transparent 1rem)\n }\n\n &.mask-left {\n &::before {\n opacity: 1;\n }\n }\n\n &.mask-right {\n &::after {\n opacity: 1;\n }\n }\n }\n\n &-link-url-confirm {\n flex-shrink: 0;\n opacity: 0;\n transition: opacity .3s ease;\n\n &.shown {\n opacity: 1;\n }\n }\n\n &.link-control-shown {\n .TextFormatter-link-control {\n opacity: 1;\n pointer-events: all;\n }\n }\n\n .Button {\n width: 2rem;\n height: 2rem;\n padding: 0.25rem;\n font-size: 1.5rem;\n margin: 0 0.125rem;\n border-radius: var(--border-radius-messages-small);\n flex-shrink: 0;\n cursor: pointer;\n\n &.active {\n background-color: var(--color-primary) !important;\n color: white;\n }\n\n &.disabled {\n opacity: .5;\n pointer-events: none;\n }\n }\n}\n",".Picker {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n\n .picker-header {\n padding: 0 1rem 0.25rem 0.75rem;\n border-bottom: 1px solid var(--color-borders);\n display: flex;\n flex-flow: row wrap;\n flex-shrink: 0;\n\n overflow-y: auto;\n max-height: 20rem;\n\n .input-group {\n margin-bottom: 0.5rem;\n margin-left: 0.5rem;\n flex-grow: 1;\n }\n\n .form-control {\n height: 2rem;\n border: none;\n border-radius: 0;\n padding: 0;\n box-shadow: none;\n }\n }\n\n .picker-list {\n flex-grow: 1;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 0.5rem;\n\n @media (max-width: 600px) {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n }\n\n .no-results {\n height: 100%;\n margin: 0;\n padding: 1rem 1rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--color-text-secondary);\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/37.9e975e031ef296075093.js b/dist/37.9e975e031ef296075093.js new file mode 100644 index 000000000..6a31db862 --- /dev/null +++ b/dist/37.9e975e031ef296075093.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[37],{7854:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),r=n(6137),s=n(6752),i=n(3657),o=n(6202),c=n(692),l=n(5296),d=n(4399),u=n(7799);const m=(0,a.X$)((({sticker:e,effect:t,isOwn:n,soundId:m,size:h="medium",observeIntersection:f,lastSyncTime:v,forceLoadPreview:p,messageId:g,chatId:Z,activeEmojiInteraction:E})=>{var P;const{markAnimationLoaded:y,isAnimationLoaded:C,ref:b,width:N,style:w,handleClick:k,playKey:I}=(0,l.Z)(h,Z,g,m,E,n,void 0,null==t?void 0:t.emoji),T=`sticker${e.id}`,M=(0,i.Op)(b,f),S=null===(P=e.thumbnail)||void 0===P?void 0:P.dataUri,x=(0,o.Z)(`${T}?size=m`,!M&&!p,r.IU.BlobUrl,v),L=(0,c.Z)(x),$=(0,o.Z)(T,!M,r.IU.Lottie,v),A=Boolean($);return a.ZP.createElement("div",{ref:b,className:(0,s.Z)("AnimatedEmoji media-inner",e.id===d.wB&&"like-sticker-thumb"),style:w,onClick:k},!C&&S&&a.ZP.createElement("img",{src:S,alt:""}),!C&&x&&a.ZP.createElement("img",{src:x,className:L,alt:""}),A&&T&&a.ZP.createElement(u.Z,{key:T,id:T,animationData:$,size:N,quality:1,play:M&&I,forceOnHeavyAnimation:!0,noLoop:!0,onLoad:y}))}))},4752:(e,t,n)=>{n.d(t,{Z:()=>T});var a=n(4050),r=n(5116),s=n(6137),i=n(1713),o=n(7361),c=n(790),l=n(2858),d=n(6752),u=n(2340),m=n(5376),h=n(2566),f=n(1212),v=n(2019),p=n(3186),g=n(9107),Z=n(1174),E=n(6202),P=n(396),y=n(711),C=n(231),b=n(9196),N=n(8033);const w=o.wB?20:25,k=o.wB?50:75;function I(e,t,n){return a.ZP.createElement("div",{className:"seekline no-selection",ref:n},a.ZP.createElement("span",{className:"seekline-buffered-progress"},a.ZP.createElement("i",{style:`transform: translateX(${100*t}%)`})),a.ZP.createElement("span",{className:"seekline-play-progress"},a.ZP.createElement("i",{style:`transform: translateX(${100*e}%)`})),a.ZP.createElement("span",{className:"seekline-thumb"},a.ZP.createElement("i",{style:`transform: translateX(${100*e}%)`})))}const T=(0,a.X$)((({theme:e,message:t,senderTitle:n,uploadProgress:T,origin:M,date:S,lastSyncTime:x,className:L,isSelectable:$,isSelected:A,isDownloading:O,onPlay:F,onReadMedia:R,onCancelUpload:D,onDateClick:U})=>{const{content:{audio:B,voice:X,video:V},isMediaUnread:j}=t,z=Boolean(X||V),K=(0,a.sO)(!1),Y=(0,a.sO)(!1),H=(0,a.sO)(null),q=(0,g.Z)(),{isRtl:W}=q,_=(0,r.uC)(),[J,G]=(0,a.eJ)(!1),Q=x,ee=(0,l.Ti)(t,"pictogram"),te=(0,E.Z)(ee,!1,s.IU.BlobUrl),ne=(0,E.Z)((0,l.Ti)(t,"inline"),!Q,(0,l.kG)(t,"inline")),{loadProgress:ae}=(0,h.Z)((0,l.Ti)(t,"download"),!O),re=(0,a.I4)((()=>{G(!0),F(t.id,t.chatId)}),[t,F]),se=(0,a.I4)((()=>{G(!1)}),[]),{isBuffered:ie,bufferedProgress:oe,bufferingHandlers:ce,checkBuffering:le}=(0,v.Z)(),{isPlaying:de,playProgress:ue,playPause:me,play:he,pause:fe,setCurrentTime:ve,duration:pe}=(0,p.Z)((0,P.An)(t),(0,l.XV)(t),z?"voice":"audio",ne,ce,void 0,le,J,re,se,(0,l.CI)(t)),ge=(0,l.B4)(t),Ze=function(e,t,n=0,r=!1){const s=(0,a.sO)(null),{data:i,peak:o}=(0,a.Ye)((()=>{if(!t)return;const{waveform:e,duration:n}=t;if(!e)return{data:new Array(Math.min(n,30)).fill(0),peak:0};const a=Math.min(n/10,1),r=Math.round(w+(k-w)*a);return function(e,t){let n=0;const a=new Array(t),r=e.length/t,s=e[0],i=e[e.length-1];for(let d=0;d>n&31}const s=Math.floor(5*(n-1)/8),i=Math.floor(5*(n-1)%8),o=r[s]+(r[s+1]<<8);return a[n-1]=o>>i&31,a}(new Uint8Array(e)),r)}),[t])||{};return(0,a.bt)((()=>{const t=s.current;t&&i&&void 0!==o&&function(e,t,n,{peak:a,fillStyle:r,progressFillStyle:s}){const i=4*t.length;e.width=2*i,e.height=46,e.style.width=`${i}px`,e.style.height="23px";const o=e.getContext("2d");o.scale(2,2),t.forEach(((e,i)=>{o.globalAlpha=i/t.length>=n?.5:1,o.fillStyle=n>i/t.length?s:r;const c=Math.max(2,e/Math.max(1,a)*23);!function(e,t,n,a,r,s){2<2*s&&(s=1),r<2*s&&(s=r/2),e.beginPath(),e.moveTo(t+s,n),e.arcTo(t+2,n,t+2,n-r,s),e.arcTo(t+2,n-r,t,n-r,s),e.arcTo(t,n-r,t,n,s),e.arcTo(t,n,t+2,n,s),e.closePath()}(o,4*i,23,0,c,1),o.fill()}))}(t,i,n,{peak:o,fillStyle:r?"dark"===e?"#B7ABED":"#AEDFA4":"dark"===e?"#494A78":"#ADD3F7",progressFillStyle:r?"dark"===e?"#FFFFFF":"#4FAE4E":"dark"===e?"#8774E1":"#3390EC"})}),[r,o,n,i,e]),s}(e,X,j&&!ge?1:ue,ge),Ee=de||ue>0&&ue<1;(0,a.d4)((()=>{G(de)}),[de]);const Pe=J&&!ie,{isUploading:ye,isTransferring:Ce,transferProgress:be}=(0,l.Sc)(t,T||ae,Pe||O),{shouldRender:Ne,transitionClassNames:we}=(0,f.Z)(Ce),ke=Ne&&(Pe||ye),Ie=(0,a.I4)((()=>{ye?null==D||D():(de||F(t.id,t.chatId),(0,r.uC)().setAudioPlayerOrigin({origin:M}),G(!J),me())}),[ye,de,J,me,D,F,t.id,t.chatId,M]);(0,a.d4)((()=>{R&&j&&(de||O)&&R()}),[de,j,R,O]);const Te=(0,a.I4)((()=>{O?_.cancelMessageMediaDownload({message:t}):_.downloadMessageMedia({message:t})}),[_,O,t]),Me=(0,a.I4)((e=>{if(K.current&&H.current){const{width:t,left:n}=H.current.getBoundingClientRect(),a=e instanceof MouseEvent?e.clientX:e.targetTouches[0].clientX;e.stopPropagation(),ve(Math.max(Math.min(pe*((a-n)/t),pe-.1),.001))}}),[pe,ve]),Se=(0,a.I4)((e=>{e instanceof MouseEvent&&2===e.button||(K.current=!0,Y.current=de,fe(),Me(e))}),[Me,fe,de]),xe=(0,a.I4)((()=>{K.current=!1,Y.current&&he()}),[he]),Le=(0,a.I4)((()=>{U(t.id,t.chatId)}),[U,t.id,t.chatId]);function $e(){if(z)return n||"Voice";const{title:e,fileName:t}=B;return e||t}(0,a.d4)((()=>{if(H.current&&Ee)return(0,Z.s)(H.current,{onCapture:Se,onRelease:xe,onClick:xe,onDrag:Me})}),[Ee,Se,Me,xe]);const Ae=(0,d.Z)("Audio",L,ge&&M===i.Cr.Inline&&"own",(M===i.Cr.Search||M===i.Cr.SharedMedia)&&"bigger",A&&"audio-is-selected"),Oe=["toggle-play"];ke?Oe.push("loading"):de?Oe.push("pause"):de||Oe.push("play");const Fe=(0,d.Z)("content",Ee&&"with-seekline");function Re(){return a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:Fe},a.ZP.createElement("div",{className:"content-row"},a.ZP.createElement("p",{className:"title",dir:"auto",title:$e()},(0,u.Z)($e())),a.ZP.createElement("div",{className:"message-date"},S&&a.ZP.createElement(N.Z,{className:"date",onClick:Le},(0,c.VX)(q,1e3*S)))),Ee&&a.ZP.createElement("div",{className:"meta search-result",dir:W?"rtl":void 0},a.ZP.createElement("span",{className:"duration with-seekline",dir:"auto"},ue<1&&`${(0,c.k9)(pe*ue,pe)}`),I(ue,oe,H)),!Ee&&function(){if(z)return a.ZP.createElement("div",{className:"meta",dir:W?"rtl":void 0},(0,c.k9)((X||V).duration));const{performer:e}=B;return a.ZP.createElement("div",{className:"meta",dir:W?"rtl":void 0},(0,c.k9)(pe),a.ZP.createElement("span",{className:"bullet"},"•"),e&&a.ZP.createElement("span",{className:"performer",title:e},(0,u.Z)(e)),e&&n&&a.ZP.createElement("span",{className:"bullet"},"•"),n&&a.ZP.createElement("span",{title:n},(0,u.Z)(n)))}()))}return a.ZP.createElement("div",{className:Ae,dir:q.isRtl?"rtl":"ltr"},$&&a.ZP.createElement("div",{className:"message-select-control"},A&&a.ZP.createElement("i",{className:"icon-select"})),a.ZP.createElement(C.Z,{round:!0,ripple:!o.wB,size:"smaller",color:te?"translucent-white":"primary",className:Oe.join(" "),ariaLabel:de?"Pause audio":"Play audio",onClick:Ie,isRtl:q.isRtl,backgroundImage:te},a.ZP.createElement("i",{className:"icon-play"}),a.ZP.createElement("i",{className:"icon-pause"})),Ne&&a.ZP.createElement("div",{className:(0,d.Z)("media-loading",we,ke&&"interactive")},a.ZP.createElement(b.Z,{progress:be,transparent:!0,size:"m",onClick:ke?Ie:void 0,noCross:!ke})),B&&!ye&&a.ZP.createElement(C.Z,{round:!0,size:"tiny",className:"download-button",ariaLabel:O?"Cancel download":"Download",onClick:Te},a.ZP.createElement("i",{className:O?"icon-close":"icon-arrow-down"})),M===i.Cr.Search&&Re(),M!==i.Cr.Search&&B&&function(e,t,n,r,s,i,o,l,d,h,f){const{title:v,performer:p,fileName:g}=t,Z=r||s>0&&s<1,{isRtl:E}=y.i0;return a.ZP.createElement("div",{className:"content"},a.ZP.createElement("p",{className:"title",dir:"auto",title:v},(0,u.Z)(v||g)),Z&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},a.ZP.createElement("span",{className:"duration with-seekline",dir:"auto"},(0,c.k9)(n*s,n)),I(s,i,o)),!Z&&l&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},h?`${(0,m.yW)(t.size*h)} / `:void 0,(0,m.yW)(t.size)),!Z&&!l&&a.ZP.createElement("div",{className:"meta",dir:E?"rtl":void 0},a.ZP.createElement("span",{className:"duration",dir:"auto"},(0,c.k9)(n)),a.ZP.createElement("span",{className:"bullet"},"•"),a.ZP.createElement("span",{className:"performer",dir:"auto",title:p},(0,u.Z)(p||"Unknown")),d&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"bullet"},"•"),a.ZP.createElement(N.Z,{className:"date",onClick:f},(0,c.ZK)(e,1e3*d,!0)))))}(q,B,pe,de,ue,oe,H,O||ye,S,be,U?Le:void 0),M===i.Cr.SharedMedia&&(X||V)&&Re(),M===i.Cr.Inline&&X&&function(e,t,n,r,s){return a.ZP.createElement("div",{className:"content"},a.ZP.createElement("div",{className:"waveform",draggable:!1,ref:t},a.ZP.createElement("canvas",{ref:n})),a.ZP.createElement("p",{className:(0,d.Z)("voice-duration",s&&"unread"),dir:"auto"},0===r?(0,c.k9)(e.duration):(0,c.k9)(e.duration*r)))}(X,H,Ze,ue,j))}))},2531:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"CalendarModal",!t);return n?a.ZP.createElement(n,e):void 0}))},180:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),c=n(4319),l=n(6272),d=n(9107),u=n(1876),m=n(3321);const h=(0,a.X$)((0,r.c$)(((e,{chatOrUserId:t})=>{const{lastSyncTime:n,countryList:{phoneCodes:a}}=e,r=t?(0,s.Z1)(e,t):void 0,o=(0,i.YC)(t)?(0,s.dy)(e,t):void 0,c=r&&(0,i.i4)(r,(0,s.dZ)(e),(0,s.NJ)(e));return{lastSyncTime:n,phoneCodeList:a,chat:r,user:o,canInviteUsers:r&&!o&&(!(0,i.eA)(r)&&!(0,i.Mg)(r,"inviteUsers")||(0,i.VE)(r,"inviteUsers")),isMuted:c}}))((({lastSyncTime:e,user:t,chat:n,forceShowSelf:s,canInviteUsers:h,isMuted:f,phoneCodeList:v})=>{const{loadFullUser:p,showNotification:g,updateChatMutedState:Z}=(0,r.uC)(),{id:E,fullInfo:P,username:y,phoneNumber:C,isSelf:b}=t||{},{id:N}=n||{},w=(0,d.Z)();(0,a.d4)((()=>{e&&E&&p({userId:E})}),[p,E,e]);const k=(0,a.I4)((()=>{Z({chatId:N,isMuted:!f})}),[N,f,Z]);if(!n||n.isRestricted||b&&!s)return;function I(e,t){(0,c.TE)(e),g({message:`${t} was copied`})}const T=C&&(0,l.WZ)(v,C),M=(0,i.hu)(n),S=(null==P?void 0:P.bio)||(0,i.GM)(n);return a.ZP.createElement("div",{className:"ChatExtra"},T&&!!T.length&&a.ZP.createElement(u.Z,{icon:"phone",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(T,w("Phone"))},a.ZP.createElement("span",{className:"title",dir:"auto"},T),a.ZP.createElement("span",{className:"subtitle"},w("Phone"))),y&&a.ZP.createElement(u.Z,{icon:"mention",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(`@${y}`,w("Username"))},a.ZP.createElement("span",{className:"title",dir:"auto"},(0,o.Z)(y)),a.ZP.createElement("span",{className:"subtitle"},w("Username"))),S&&!!S.length&&a.ZP.createElement(u.Z,{icon:"info",multiline:!0,narrow:!0,isStatic:!0},a.ZP.createElement("span",{className:"title",dir:"auto"},(0,o.Z)(S,["br","links","emoji"])),a.ZP.createElement("span",{className:"subtitle"},w(E?"UserBio":"Info"))),(h||!y)&&M&&a.ZP.createElement(u.Z,{icon:n.username?"mention":"link",multiline:!0,narrow:!0,ripple:!0,onClick:()=>I(M,w("SetUrlPlaceholder"))},a.ZP.createElement("div",{className:"title"},M),a.ZP.createElement("span",{className:"subtitle"},w("SetUrlPlaceholder"))),!s&&a.ZP.createElement(u.Z,{icon:"unmute",ripple:!0,onClick:k},a.ZP.createElement("span",null,w("Notifications")),a.ZP.createElement(m.Z,{id:"group-notifications",label:E?"Toggle User Notifications":"Toggle Chat Notifications",checked:!f,inactive:!0})))})))},329:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(9107),c=n(2340),l=n(172),d=n(3103),u=n(231);const m=(0,a.X$)((0,r.c$)(((e,{chat:t})=>{const n=(0,i.YC)(t.id),a=(0,s.FM)(e,t.id),r=n&&(0,s.dy)(e,(0,i.zX)(t)),o=r&&(0,i.cS)(r)&&!t.isSupport,c=n&&!a&&!o,l=n?(0,i.Vl)((0,s.dy)(e,(0,i.zX)(t))):void 0;return{isPrivateChat:n,isChatWithSelf:a,isBot:o,isChannel:(0,i.eA)(t),isBasicGroup:(0,i.G9)(t),isSuperGroup:(0,i.ZV)(t),currentUserId:e.currentUserId,canDeleteForAll:c,contactName:l}}))((({isOpen:e,chat:t,isChannel:n,isPrivateChat:s,isChatWithSelf:m,isBot:h,isBasicGroup:f,isSuperGroup:v,currentUserId:p,canDeleteForAll:g,contactName:Z,onClose:E,onCloseAnimationEnd:P})=>{const{leaveChannel:y,deleteHistory:C,deleteChannel:b,deleteChatUser:N,blockContact:w}=(0,r.uC)(),k=(0,o.Z)(),I=(0,i.U)(k,t),T=(0,a.I4)((()=>{C({chatId:t.id,shouldDeleteForAll:!0}),E()}),[C,t.id,E]),M=(0,a.I4)((()=>{C({chatId:t.id,shouldDeleteForAll:!0}),w({contactId:t.id,accessHash:t.accessHash}),E()}),[C,t.id,t.accessHash,w,E]),S=(0,a.I4)((()=>{s?C({chatId:t.id,shouldDeleteForAll:!1}):f?(N({chatId:t.id,userId:p}),C({chatId:t.id,shouldDeleteForAll:!1})):!n&&!v||t.isCreator?(n||v)&&t.isCreator&&b({chatId:t.id}):y({chatId:t.id}),E()}),[s,f,n,v,p,t.isCreator,t.id,E,C,N,y,b]);return a.ZP.createElement(d.Z,{isOpen:e,className:"DeleteChatModal",header:a.ZP.createElement("div",{className:"modal-header",dir:k.isRtl?"rtl":void 0},a.ZP.createElement(l.Z,{size:"tiny",chat:t,isSavedMessages:m}),a.ZP.createElement("h3",{className:"modal-title"},k(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"ChannelDelete":f||v?"Group.LeaveGroup":"DeleteChatUser"))),onClose:E,onCloseAnimationEnd:P},n&&t.isCreator?a.ZP.createElement("p",null,(0,c.Z)(k("ChatList.DeleteAndLeaveGroupConfirmation",I),["simple_markdown"])):n&&!t.isCreator||f||v?a.ZP.createElement("p",null,(0,c.Z)(k("ChannelLeaveAlertWithName",I),["simple_markdown"])):a.ZP.createElement("p",null,(0,c.Z)(k("ChatList.DeleteChatConfirmation",Z),["simple_markdown"])),h&&a.ZP.createElement(u.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:M},k("DeleteAndStop")),g&&a.ZP.createElement(u.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:T},Z?(0,c.Z)(k("ChatList.DeleteForEveryone",Z)):k("DeleteForAll")),a.ZP.createElement(u.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:S},k(n&&!t.isCreator?"LeaveChannel":n&&t.isCreator?"Chat.Input.Delete":f||v?"Group.LeaveGroup":g?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(u.Z,{className:"confirm-dialog-button",isText:!0,onClick:E},k("Cancel")))})))},2535:(e,t,n)=>{n.d(t,{Z:()=>m});var a=n(4050),r=n(5116),s=n(5376),i=n(2858),o=n(3657),c=n(2566),l=n(6202),d=n(706),u=n(7002);const m=(0,a.X$)((({message:e,observeIntersection:t,smaller:n,canAutoLoad:m,autoLoadFileMaxSizeMb:h,uploadProgress:f,withDate:v,datetime:p,className:g,sender:Z,isSelected:E,isSelectable:P,onCancelUpload:y,onMediaClick:C,onDateClick:b,isDownloading:N})=>{const w=(0,r.uC)(),k=(0,a.sO)(null),I=e.content.document,{fileName:T,size:M,timestamp:S}=I,x=(0,s.K2)(I)||"",L=(0,o.Op)(k,t),[$,A]=(0,d.Z)();(0,a.d4)((()=>{L&&A()}),[L,A]);const[O,F]=(0,a.eJ)(m&&(!h||M<=1048576*h)),R=Boolean(N||O&&$),D=(0,i.Ti)(e,"download"),{loadProgress:U,mediaData:B}=(0,c.Z)(D,!R,void 0,void 0,void 0,!0),X=Boolean(B),{isUploading:V,isTransferring:j,transferProgress:z}=(0,i.Sc)(e,f||U,R&&!X),K=(0,s.v6)(I),Y=K?(0,i.DH)(e):void 0,H=K?I.previewBlobUrl:void 0,q=(0,l.Z)((0,i.Ti)(e,"pictogram"),!L),W=C&&Boolean(I.mediaType),_=(0,a.I4)((()=>{V?y&&y():N?w.cancelMessageMediaDownload({message:e}):j?F(!1):W?C():w.downloadMessageMedia({message:e})}),[V,N,j,W,y,w,e,C]),J=(0,a.I4)((()=>{b(e.id,e.chatId)}),[b,e.id,e.chatId]);return a.ZP.createElement(u.Z,{ref:k,name:T,extension:x,size:M,timestamp:v?p||S:void 0,thumbnailDataUri:Y,previewData:H||q,smaller:n,isTransferring:j,isUploading:V,transferProgress:z,className:g,sender:Z,isSelectable:P,isSelected:E,actionIcon:W?(0,i.hC)(e)?"icon-play":"icon-eye":"icon-download",onClick:_,onDateClick:b?J:void 0})}))},7002:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(1212),s=n(692),i=n(6752),o=n(790),c=n(5376),l=n(4399),d=n(2340),u=n(9107),m=n(9196),h=n(8033);const f=(0,a.X$)((({ref:e,name:t,size:n,extension:f="",timestamp:v,sender:p,thumbnailDataUri:g,previewData:Z,className:E,smaller:P,isTransferring:y,isUploading:C,isSelectable:b,isSelected:N,transferProgress:w,actionIcon:k,onClick:I,onDateClick:T})=>{const M=(0,u.Z)();let S=(0,a.sO)(null);e&&(S=e);const x=(0,s.Z)(Z),{shouldRender:L,transitionClassNames:$}=(0,r.Z)(y,void 0,!0),A=(0,c.Oh)(f),O=(0,c.yW)(n),{width:F,height:R}=(0,l.lE)(P),D=(0,i.Z)("File",E,P&&"smaller",I&&!C&&"interactive",N&&"file-is-selected");return a.ZP.createElement("div",{ref:S,className:D,dir:M.isRtl?"rtl":void 0},b&&a.ZP.createElement("div",{className:"message-select-control"},N&&a.ZP.createElement("i",{className:"icon-select"})),a.ZP.createElement("div",{className:"file-icon-container",onClick:C?void 0:I},g||Z?a.ZP.createElement("div",{className:"file-preview media-inner"},a.ZP.createElement("img",{src:g,width:F,height:R,className:"thumbnail",alt:""}),a.ZP.createElement("img",{src:Z,className:(0,i.Z)("full-media",x),width:F,height:R,alt:""})):a.ZP.createElement("div",{className:`file-icon ${A}`},f.length<=4&&a.ZP.createElement("span",{className:"file-ext",dir:"auto"},f)),L&&a.ZP.createElement("div",{className:(0,i.Z)("file-progress",A,$)},a.ZP.createElement(m.Z,{progress:w,size:P?"s":"m",onClick:C?I:void 0})),I&&a.ZP.createElement("i",{className:(0,i.Z)("action-icon",k||"icon-download",L&&"hidden")})),a.ZP.createElement("div",{className:"file-info"},a.ZP.createElement("div",{className:"file-title",dir:"auto"},(0,d.Z)(t)),a.ZP.createElement("div",{className:"file-subtitle",dir:"auto"},a.ZP.createElement("span",null,y&&w?`${Math.round(100*w)}%`:O),p&&a.ZP.createElement("span",{className:"file-sender"},(0,d.Z)(p)),!p&&v&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"bullet"}),a.ZP.createElement(h.Z,{onClick:T},(0,o.ZK)(M,1e3*v,!0))))),p&&v&&a.ZP.createElement(h.Z,{onClick:T},(0,o.VX)(M,1e3*v)))}))},8799:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(5116),s=n(1713),i=n(2858),o=n(1638),c=n(2340),l=n(9107),d=n(172),u=n(9411),m=n(8729);const h=(0,a.X$)((0,r.c$)(((e,{chatId:t})=>{const{lastSyncTime:n}=e,a=(0,o.Z1)(e,t);return{lastSyncTime:n,chat:a,onlineCount:a?(0,o.YK)(e,a):void 0,areMessagesLoaded:Boolean((0,o.Zw)(e,t))}}))((({typingStatus:e,avatarSize:t="medium",withMediaViewer:n,withUsername:o,withFullInfo:h,withUpdatingStatus:f,withChatType:v,noRtl:p,chat:g,onlineCount:Z,areMessagesLoaded:E,lastSyncTime:P})=>{const{loadFullChat:y,openMediaViewer:C}=(0,r.uC)(),b=g&&(0,i.ZV)(g),{id:N,isMin:w,isRestricted:k}=g||{};(0,a.d4)((()=>{N&&!w&&h&&P&&y({chatId:N})}),[N,w,P,h,y,b]);const I=(0,a.I4)(((e,n)=>{g&&n&&(e.stopPropagation(),C({avatarOwnerId:g.id,origin:"jumbo"===t?s.bZ.ProfileAvatar:s.bZ.MiddleHeaderAvatar}))}),[g,t,C]),T=(0,l.Z)();if(g)return a.ZP.createElement("div",{className:"ChatInfo",dir:!p&&T.isRtl?"rtl":void 0},a.ZP.createElement(d.Z,{key:g.id,size:t,chat:g,onClick:n?I:void 0}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},(0,c.Z)((0,i.U)(T,g))),g.isVerified&&a.ZP.createElement(u.Z,null)),function(){if(f&&!E&&!k)return a.ZP.createElement("span",{className:"status",dir:"auto"},T("Updating"));if(!g)return;if(e)return a.ZP.createElement(m.Z,{typingStatus:e});if(v)return a.ZP.createElement("div",{className:"status",dir:"auto"},T((0,i.l6)(g)));const t=o?g.username:void 0,n=function(e,t){const n=e((0,i.l6)(t)),{membersCount:a}=t;return t.isRestricted?"Channel"===n?"channel is inaccessible":"group is inaccessible":a?e("Channel"===n?"Subscribers":"Members",a,"i"):n}(T,g),r=Z?`, ${T("OnlineCount",Z,"i")}`:void 0;return a.ZP.createElement("div",{className:"status"},t&&a.ZP.createElement("span",{className:"handle"},t),a.ZP.createElement("span",{className:"group-status"},n),r&&a.ZP.createElement("span",{className:"online-status"},r))}()))})))},6844:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(790),s=n(9107),i=n(8018);const o=(0,a.X$)((({message:e,outgoingStatus:t})=>{const n=(0,s.Z)();return a.ZP.createElement("div",{className:"LastMessageMeta"},t&&a.ZP.createElement(i.Z,{status:t}),a.ZP.createElement("span",{className:"time"},(0,r.VX)(n,1e3*e.date)))}))},3709:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(790),s=n(3227),i=n(2858),o=n(6752),c=n(6202),l=n(692);const d=(0,a.X$)((({message:e,idPrefix:t="shared-media",isProtected:n,onClick:d})=>{const u=(0,a.I4)((()=>{d(e.id,e.chatId)}),[e.id,e.chatId,d]),m=(0,i.DH)(e),h=(0,c.Z)((0,i.Ti)(e,"pictogram")),f=(0,l.Z)(h),v=(0,i.b7)(e);return a.ZP.createElement("div",{id:`${t}${e.id}`,className:"Media scroll-item",onClick:d?u:void 0},a.ZP.createElement("img",{src:m,alt:"",draggable:!n,onContextMenu:n?s.Z:void 0}),a.ZP.createElement("img",{src:h,className:(0,o.Z)("full-media",f),alt:"",draggable:!n,onContextMenu:n?s.Z:void 0}),v&&a.ZP.createElement("span",{className:"video-duration"},v.isGif?"GIF":(0,r.k9)(v.duration)),n&&a.ZP.createElement("span",{className:"protector"}))}))},8018:(e,t,n)=>{n.d(t,{Z:()=>i});var a,r=n(4050),s=n(2255);!function(e){e[e.failed=0]="failed",e[e.pending=1]="pending",e[e.succeeded=2]="succeeded",e[e.read=3]="read"}(a||(a={}));const i=(0,r.X$)((({status:e})=>r.ZP.createElement("div",{className:"MessageOutgoingStatus"},r.ZP.createElement(s.Z,{name:"reveal",activeKey:a[e]},(()=>r.ZP.createElement("i",{className:`icon-message-${e}`}))))))},7262:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(6752),s=n(1212),i=n(2340),o=n(9107);const c=(0,a.X$)((({text:e="Nothing found.",description:t})=>{const n=(0,o.Z)(),{transitionClassNames:c}=(0,s.Z)(!0);return a.ZP.createElement("div",{className:(0,r.Z)("NothingFound",c,t&&"with-description")},e,t&&a.ZP.createElement("p",{className:"description"},(0,i.Z)(n(t),["br"])))}))},1820:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(2858),s=n(1273),i=n(4605),o=n(7687),c=n(1876),l=n(6058),d=n(8799),u=n(9187),m=n(7407),h=n(9107),f=n(4288);const v=(0,a.X$)((({itemIds:e,selectedIds:t,filterValue:n,filterPlaceholder:v,notFoundText:p,searchInputId:g,isLoading:Z,noScrollRestore:E,onSelectedIdsChange:P,onFilterChange:y,onLoadMore:C})=>{const b=(0,a.sO)(null),N=t.length>10;(0,a.d4)((()=>{setTimeout((()=>{requestAnimationFrame((()=>{b.current.focus()}))}),500)}),[]);const w=(0,a.I4)((e=>{const n=[...t];n.includes(e)?n.splice(n.indexOf(e),1):n.push(e),P(n),y("")}),[t,P,y]),k=(0,a.I4)((e=>{const{value:t}=e.currentTarget;y(t)}),[y]),[I,T]=(0,m.Z)(C,e,Boolean(n)),M=(0,h.Z)();return a.ZP.createElement("div",{className:"Picker"},a.ZP.createElement("div",{className:"picker-header custom-scroll",dir:M.isRtl?"rtl":void 0},t.map(((e,n)=>a.ZP.createElement(u.Z,{chatOrUserId:e,isMinimized:N&&na.ZP.createElement(c.Z,{key:e,className:"chat-item-clickable picker-list-item",onClick:()=>w(e),ripple:!0},a.ZP.createElement(i.Z,{label:"",checked:t.includes(e)}),(0,r.YC)(e)?a.ZP.createElement(l.Z,{userId:e}):a.ZP.createElement(d.Z,{chatId:e}))))):Z||!I||I.length?a.ZP.createElement(f.Z,null):a.ZP.createElement("p",{className:"no-results"},p||"Sorry, nothing found."))}))},9187:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),c=n(6752),l=n(9107),d=n(172);const u=(0,a.X$)((0,r.c$)(((e,{chatOrUserId:t})=>t?{chat:t?(0,s.Z1)(e,t):void 0,user:(0,i.YC)(t)?(0,s.dy)(e,t):void 0}:{}))((({icon:e,title:t,isMinimized:n,canClose:r,onClick:s,clickArg:u,chat:m,user:h,className:f})=>{const v=(0,l.Z)();let p,g;if(e&&t)p=a.ZP.createElement("div",{className:"item-icon"},a.ZP.createElement("i",{className:`icon-${e}`})),g=t;else if(m||h){p=a.ZP.createElement(d.Z,{chat:m,user:h,size:"small",isSavedMessages:null==h?void 0:h.isSelf});const e=!m||h&&!h.isSelf?(0,i.Vl)(h):(0,i.U)(v,m,h);g=e?(0,o.Z)(e):void 0}const Z=(0,c.Z)("PickerSelectedItem",f,n&&"minimized",r&&"closeable");return a.ZP.createElement("div",{className:Z,onClick:()=>s(u),title:n?g:void 0,dir:v.isRtl?"rtl":void 0},p,!n&&a.ZP.createElement("div",{className:"item-name",dir:"auto"},g),r&&a.ZP.createElement("div",{className:"item-remove"},a.ZP.createElement("i",{className:"icon-close"})))})))},6058:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(5116),s=n(1713),i=n(1638),o=n(2858),c=n(2340),l=n(9107),d=n(172),u=n(9411),m=n(8729);const h=(0,a.X$)((0,r.c$)(((e,{userId:t,forceShowSelf:n})=>{const{lastSyncTime:a,serverTimeOffset:r}=e,s=(0,i.dy)(e,t);return{lastSyncTime:a,user:s,userStatus:(0,i.ss)(e,t),isSavedMessages:!n&&s&&s.isSelf,areMessagesLoaded:Boolean((0,i.Zw)(e,t)),serverTimeOffset:r}}))((({typingStatus:e,avatarSize:t="medium",status:n,withMediaViewer:i,withUsername:h,withFullInfo:f,withUpdatingStatus:v,noStatusOrTyping:p,noRtl:g,user:Z,userStatus:E,isSavedMessages:P,areMessagesLoaded:y,lastSyncTime:C,serverTimeOffset:b})=>{const{loadFullUser:N,openMediaViewer:w}=(0,r.uC)(),{id:k}=Z||{},I=(0,o.Js)(Z);(0,a.d4)((()=>{f&&C&&k&&N({userId:k})}),[k,N,C,f]);const T=(0,a.I4)(((e,n)=>{Z&&n&&(e.stopPropagation(),w({avatarOwnerId:Z.id,origin:"jumbo"===t?s.bZ.ProfileAvatar:s.bZ.MiddleHeaderAvatar}))}),[Z,t,w]),M=(0,l.Z)();if(Z)return a.ZP.createElement("div",{className:"ChatInfo",dir:!g&&M.isRtl?"rtl":void 0},a.ZP.createElement(d.Z,{key:Z.id,size:t,user:Z,isSavedMessages:P,onClick:i?T:void 0}),a.ZP.createElement("div",{className:"info"},P?a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",null,M("SavedMessages"))):a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},I&&(0,c.Z)(I)),(null==Z?void 0:Z.isVerified)&&a.ZP.createElement(u.Z,null)),(n||!P&&!p)&&(n?a.ZP.createElement("span",{className:"status",dir:"auto"},n):v&&!y?a.ZP.createElement("span",{className:"status",dir:"auto"},M("Updating")):Z?e?a.ZP.createElement(m.Z,{typingStatus:e}):a.ZP.createElement("div",{className:"status "+((0,o.kM)(Z,E)?"online":"")},h&&Z.username&&a.ZP.createElement("span",{className:"handle"},Z.username),a.ZP.createElement("span",{className:"user-status",dir:"auto"},(0,o.Tq)(M,Z,E,b))):void 0)))})))},787:(e,t,n)=>{n.d(t,{Z:()=>b});var a=n(4050),r=n(5116),s=n(1713),i=n(7361),o=n(1638),c=n(2858),l=n(2340),d=n(1174),u=n(6752),m=n(6137),h=n(647),f=n(9107),v=n(9411),p=n(2155),g=n(6202),Z=n(2937),E=n(7204),P=n(9204);const y=(0,a.X$)((({chat:e,user:t,photo:n,isFirstPhoto:r,isSavedMessages:s,lastSyncTime:i,onClick:o})=>{const d=(0,f.Z)(),h=t&&(0,c.NB)(t),v=e&&(0,c.pK)(e.id);function y(a,r){if(n&&!r)return`photo${n.id}?size=c`;let i;return s||h||v||(t?i=(0,c.RT)(t,a):e&&(i=(0,c.RT)(e,a))),i}const C=(0,g.Z)(y("big"),!1,m.IU.BlobUrl,i),b=r&&!C?y("normal",!0):void 0,N=(0,g.Z)(b,!1,m.IU.BlobUrl,i),w=(0,Z.Z)(!C&&n&&n.thumbnail&&n.thumbnail.dataUri),k=C||N||w,I=(0,E.Z)(k);let T="";if(s)T=a.ZP.createElement("i",{className:"icon-avatar-saved-messages"});else if(h)T=a.ZP.createElement("i",{className:"icon-avatar-deleted-account"});else if(v)T=a.ZP.createElement("i",{className:"icon-reply-filled"});else if(k)T=a.ZP.createElement("img",{src:k,className:"avatar-media",alt:"",decoding:"async"});else if(!k&&t){const e=(0,c.Js)(t);T=e?(0,p.Xv)(e,2):void 0}else if(!k&&e){const t=(0,c.U)(d,e);T=t&&(0,p.Xv)(t,(0,c.YC)(e.id)?2:1)}else T=a.ZP.createElement("div",{className:"spinner-wrapper"},a.ZP.createElement(P.Z,{color:"white"}));const M=(0,u.Z)("ProfilePhoto",`color-bg-${(0,c.Rs)(t||e)}`,s&&"saved-messages",h&&"deleted-account",v&&"replies-bot-account",!s&&!k&&"no-photo");return a.ZP.createElement("div",{className:M,onClick:k?o:void 0},I&&k&&I!==k&&a.ZP.createElement("img",{src:I,className:"prev-avatar-media",alt:"",decoding:"async"}),"string"==typeof T?(0,l.Z)(T,["hq_emoji"]):T)}));var C=n(2255);const b=(0,a.X$)((0,r.c$)(((e,{userId:t,forceShowSelf:n})=>{const{connectionState:a,serverTimeOffset:r}=e,s=(0,o.dy)(e,t),i=(0,o.ss)(e,t),c=(0,o.Z1)(e,t),l=!n&&s&&s.isSelf,{animationLevel:d}=e.settings.byKey;return{connectionState:a,user:s,userStatus:i,chat:c,isSavedMessages:l,animationLevel:d,serverTimeOffset:r}}))((({forceShowSelf:e,user:t,userStatus:n,chat:o,isSavedMessages:p,connectionState:g,animationLevel:Z,serverTimeOffset:E})=>{var P;const{loadFullUser:b,openMediaViewer:N}=(0,r.uC)(),w=(0,f.Z)(),{id:k}=t||{},{id:I}=o||{},T=t?(0,c.Js)(t):o?o.title:"",M=(null==t?void 0:t.photos)||(null==o?void 0:o.photos)||[],S=Z>=1?w.isRtl?"slide-optimized-rtl":"slide-optimized":"none",[x,L]=(0,a.eJ)(0),$=p||M.length<=1||0===x,A=p||M.length<=1||x===M.length-1;(0,a.d4)((()=>{x>M.length&&L(Math.max(0,M.length-1))}),[x,M.length]),(0,a.d4)((()=>{"connectionStateReady"===g&&k&&!e&&b({userId:k})}),[k,b,g,e]),function(e,t,n){(0,a.d4)((()=>{t.slice(n,n+4).forEach((e=>{h.UV(`photo${e.id}?size=c`)||h.he(`photo${e.id}?size=c`,m.IU.BlobUrl)}))}),[n,t])}(0,M,x);const O=(0,a.I4)((()=>{N({avatarOwnerId:k||I,profilePhotoIndex:x,origin:e?s.bZ.SettingsAvatar:s.bZ.ProfileAvatar})}),[N,k,I,x,e]),F=(0,a.I4)((()=>{$||L(x-1)}),[x,$]),R=(0,a.I4)((()=>{A||L(x+1)}),[x,A]);if((0,a.d4)((()=>{const e=document.querySelector(".photo-wrapper");if(e)return(0,d.s)(e,{selectorToPreventScroll:".Profile, .settings-content",onSwipe:i.$b?(e,t)=>t===d.e.Right?(F(),!0):t===d.e.Left&&(R(),!0):void 0})}),[R,F]),!t&&!o)return;function D(){const e=!p&&M&&M.length>0?M[x]:void 0;return a.ZP.createElement(y,{key:x,user:t,chat:o,photo:e,isSavedMessages:p,isFirstPhoto:$,onClick:O})}const U=null===(P=t||o)||void 0===P?void 0:P.isVerified;return a.ZP.createElement("div",{className:(0,u.Z)("ProfileInfo",e&&"self"),dir:w.isRtl?"rtl":void 0},a.ZP.createElement("div",{className:"photo-wrapper"},function(){if(!(p||!M||M.length<=1))return a.ZP.createElement("div",{className:"photo-dashes"},M.map(((e,t)=>a.ZP.createElement("span",{className:"photo-dash "+(t===x?"current":"")}))))}(),a.ZP.createElement(C.Z,{activeKey:x,name:S,className:"profile-slide-container"},D),!$&&a.ZP.createElement("button",{type:"button",className:"navigation prev","aria-label":w("AccDescrPrevious"),onClick:F}),!A&&a.ZP.createElement("button",{type:"button",className:"navigation next","aria-label":w("Next"),onClick:R})),a.ZP.createElement("div",{className:"info",dir:w.isRtl?"rtl":"auto"},p?a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},w("SavedMessages"))):a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},T&&(0,l.Z)(T)),U&&a.ZP.createElement(v.Z,null)),!p&&(t?a.ZP.createElement("div",{className:"status "+((0,c.kM)(t,n)?"online":"")},a.ZP.createElement("span",{className:"user-status",dir:"auto"},(0,c.Tq)(w,t,n,E))):a.ZP.createElement("span",{className:"status",dir:"auto"},(0,c.eA)(o)?w("Subscribers",null!==(B=o.membersCount)&&void 0!==B?B:0,"i"):w("Members",null!==(X=o.membersCount)&&void 0!==X?X:0,"i")))));var B,X})))},8198:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(5116),s=n(6137),i=n(6202),o=n(6752);const c=(0,a.X$)((({reaction:e,ref:t,className:n})=>{var c,l,d;const u=null===(c=(0,r.Rd)().availableReactions)||void 0===c||null===(l=c.find((t=>t.reaction===e)))||void 0===l||null===(d=l.staticIcon)||void 0===d?void 0:d.id,m=(0,i.Z)(`document${u}`,!u,s.IU.BlobUrl);return a.ZP.createElement("img",{className:(0,o.Z)("ReactionStaticEmoji",n),ref:t,src:m,alt:""})}))},3547:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(6137),s=n(3657),i=n(6202),o=n(1212),c=n(706),l=n(6752),d=n(386),u=n(7799),m=n(231);const h=(0,a.X$)((({sticker:e,size:t,observeIntersection:n,noAnimate:h,title:f,className:v,onClick:p,clickArg:g,onUnfaveClick:Z})=>{const E=(0,a.sO)(null),P=`sticker${e.id}`,y=`sticker-button-${e.id}`,C=(0,s.Op)(E,n),b=e.thumbnail?e.thumbnail.dataUri:void 0,N=(0,i.Z)(`${P}?size=m`,!C,r.IU.BlobUrl),w=C&&!h,k=(0,i.Z)(e.isAnimated&&P,!w,r.IU.Lottie),[I,T,M]=(0,c.Z)(Boolean(k)),S=I&&w,{transitionClassNames:x}=(0,o.Z)(Boolean(N||S),void 0,void 0,"slow");(0,a.d4)((()=>{w||M()}),[M,w]);const L=(0,l.Z)("StickerButton",p&&"interactive",e.isAnimated&&"animated",y,v),$=b&&!S?`background-image: url('${b}');`:"";return a.ZP.createElement("div",{ref:E,className:L,title:f||(null==e?void 0:e.emoji),style:$,"data-sticker-id":e.id,onMouseDown:d.b,onClick:function(){p&&p(g)}},!S&&a.ZP.createElement("img",{src:N,className:x}),w&&k&&a.ZP.createElement(u.Z,{id:P,animationData:k,play:!0,size:t,isLowPriority:!0,onLoad:T}),Z&&a.ZP.createElement(m.Z,{className:"sticker-unfave-button",color:"dark",round:!0,onClick:function(t){t.stopPropagation(),t.preventDefault(),Z(e)}},a.ZP.createElement("i",{className:"icon-close"})))}))},4851:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"StickerSetModal",!t);return n?a.ZP.createElement(n,e):void 0}))},8729:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(5116),s=n(1638),i=n(2858),o=n(2340),c=n(9107);const l=(0,a.X$)((0,r.c$)(((e,{typingStatus:t})=>t.userId?{typingUser:(0,s.dy)(e,t.userId)}:{}))((({typingStatus:e,typingUser:t})=>{const n=(0,c.Z)(),r=t&&!t.isSelf&&(0,i.Vl)(t);return a.ZP.createElement("p",{className:"typing-status",dir:n.isRtl?"rtl":"auto"},r&&a.ZP.createElement("span",{className:"sender-name",dir:"auto"},(0,o.Z)(r)),n(e.action).replace("{user}","").replace("{emoji}",e.emoji).trim(),a.ZP.createElement("span",{className:"ellipsis"}))})))},9411:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=()=>a.ZP.createElement("span",{className:"VerifiedIcon"})},5418:(e,t,n)=>{n.d(t,{Z:()=>h});var a=n(4050),r=n(2858),s=n(6752),i=n(8035),o=n(2340),c=n(790),l=n(9107),d=n(3709),u=n(8033),m=n(88);const h=(0,a.X$)((({message:e,senderTitle:t,isProtected:n,onMessageClick:h})=>{const f=(0,l.Z)();let v=(0,r.s1)(e);if(!v){const t=(0,r.T7)(e);if(t){const{url:n,domain:a}=t,s=(0,r.MK)(f,e);v={siteName:a.replace(/^www./,""),url:n.includes("://")?n:n.includes("@")?`mailto:${n}`:`http://${n}`,description:s!==n?s:void 0}}}const p=(0,a.I4)((()=>{h(e.id,e.chatId)}),[h,e.id,e.chatId]);if(!v)return;const{siteName:g,url:Z,displayUrl:E,title:P,description:y,photo:C,video:b}=v,N=!t&&(0,i.Z)(y,170),w=(0,s.Z)("WebLink scroll-item",!C&&!b&&"without-media");return a.ZP.createElement("div",{className:w,"data-initial":(g||E)[0],dir:f.isRtl?"rtl":void 0},C&&a.ZP.createElement(d.Z,{message:e,isProtected:n}),a.ZP.createElement("div",{className:"content"},a.ZP.createElement(u.Z,{isRtl:f.isRtl,className:"site-title",onClick:p},(0,o.Z)(P||g||E)),N&&a.ZP.createElement(u.Z,{isRtl:f.isRtl,className:"site-description",onClick:p},(0,o.Z)(N)),a.ZP.createElement(m.Z,{url:Z,className:"site-name",text:"",isRtl:f.isRtl},Z.replace("mailto:","")||E),t&&a.ZP.createElement("div",{className:"sender-name"},(0,o.Z)(t))),t&&a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(u.Z,{className:"date",onClick:p,isRtl:f.isRtl},(0,c.VX)(f,1e3*e.date))))}))},4399:(e,t,n)=>{n.d(t,{L6:()=>o,Gw:()=>c,Rj:()=>l,vY:()=>d,wB:()=>u,kc:()=>p,fM:()=>Z,Eh:()=>E,GC:()=>P,W7:()=>y,lE:()=>C,Wr:()=>b,PA:()=>N,jg:()=>w});var a=n(3716),r=n(7361),s=n(3858),i=n(2858);const o="(max-height: 640px)",c=parseInt(getComputedStyle(document.documentElement).fontSize,10),l=240,d={width:640,height:640},u="4986041492570112461",m={width:100,height:100};let h,f,v;function p(e,t,n,a){const i=t||n?1.625:0;return(function(e,t){const n=e?30:29;if(!r.wB)return n;const{width:a}=s.Z.get();return h||(h=Math.min(30,a/c-4.5)),f||(f=Math.min(29,a/c-7)),v||(v=Math.min(29,a/c-4.5)),e?h:t?v:f}(e,a)-i)*c}function g({width:e,height:t,fromOwnMessage:n,isForwarded:a,isWebPagePhoto:r,isGif:s,noAvatars:i}){const o=t/e,l=p(n,a,r,i),d=function(e,t){return e&&t&&t>=.75&&t<=1.25?20*c:27*c}(s,o),u=s?Math.max(300,e):e;return w(l,d,u,s?t*(u/e):t)}function Z(e,t){const n=window.matchMedia(o),{width:a,height:r}=s.Z.get();let i=t&&n.matches?10:8.25;return e&&(i=n.matches?10:15),{width:a,height:r-i*c}}function E(e,t,n,a,r){const{width:s,height:o}=(0,i.HV)(e)||m;return g({width:s,height:o,fromOwnMessage:t,isForwarded:n,isWebPagePhoto:a,noAvatars:r})}function P(e,t,n,a){const{width:r,height:s}=(0,i.jC)(e)||m;return g({width:r,height:s,fromOwnMessage:t,isForwarded:n,isGif:e.isGif,noAvatars:a})}function y(){return{width:2*c,height:2*c}}function C(e){return e?{width:3*c,height:3*c}:{width:3.375*c,height:3.375*c}}function b(e){const{width:t}=e;let{height:n}=e;e.id===u&&(n=t);const s=n&&t&&n/t,i=c*(r.wB?a.w7:a.K7),o=s?i*s:i;return s&&o>i?{width:Math.round(i/s),height:i}:{width:i,height:o}}function N({width:e,height:t},n,a=!1){const{width:r,height:s}=Z(n,a);return w(r,s,e,t)}function w(e,t,n,a){const r=a/n,s=Math.min(n,e);return Math.round(s*r)>t?{width:Math.round(t/r),height:t}:{width:s,height:Math.round(s*r)}}},935:(e,t,n)=>{n.d(t,{X:()=>d,H:()=>h});var a=n(4050),r=n(5116),s=n(6137),i=n(2858),o=n(2340),c=n(7373),l=n(88);function d(e,t,n){const a=e.content.text;if(!a||!a.text){const t=(0,i.UD)(e);return t?[t]:void 0}const{text:r,entities:s}=a;return h(r,s,t,n)}function u(e,t,n,a){const{offset:r,length:s}=e,i=new Set([t]);if(a.has(t))return;const o=[];return n.filter(((e,n)=>n>t&&e.offset>=r&&e.offsetu(e,n.indexOf(e),n,a))).filter(Boolean).forEach((e=>{let t=!1;e.organizedIndexes.forEach((e=>{t||i.has(e)||(t=!0),i.add(e)})),t&&o.push(e)})),{entity:e,organizedIndexes:i,nestedEntities:o}}function m(e){const t=new Set,n=[];return e.forEach(((a,r)=>{if(t.has(r))return;const s=u(a,r,e,t);s&&(s.organizedIndexes.forEach((e=>{t.add(e)})),n.push(s))})),n}function h(e,t,n,r,i){if(!t||!t.length)return f(e,n,r,i);const d=[];let u=!1;const h=m(t);function Z(t,d,m,h){const E=[],{entity:P,nestedEntities:y}=m,{offset:C,length:b,type:N}=P;let w=e.substring(t,C);const k=w.length;w&&(u&&w.length>0&&"\n"===w[0]&&(w=w.substr(1),u=!1),w&&E.push(...f(w,n,r,i)));const I=t+k,T=I+b;let M=e.substring(C,C+b);const S=[];if(u&&M.length>0&&"\n"===M[0]&&(M=M.substr(1),u=!1),N===s.Vv.Pre&&(u=!0),y.length){let e=I;y.forEach(((t,n)=>{const{renderResult:a,entityEndIndex:r}=Z(e,T,t,n===y.length-1);S.push(...a),e=r}))}const x=i?function(e,t,n){const a="string"==typeof t&&t,r=n.length?n.join(""):(0,o.Z)(t,["escape_html","emoji_html","br_html"]).join("");if(!a)return r;switch(e.type){case s.Vv.Bold:return`${r}`;case s.Vv.Italic:return`${r}`;case s.Vv.Underline:return`${r}`;case s.Vv.Code:return`${r}`;case s.Vv.Pre:return`\`\`\`
${r}
\`\`\``;case s.Vv.Strike:return`${r}`;case s.Vv.MentionName:return`${r}`;case s.Vv.Url:case s.Vv.TextUrl:return`${r}`;default:return r}}(P,M,S):function(e,t,n){const r="string"==typeof t&&t,i=n.length?n:t;if(!r)return f(i);switch(e.type){case s.Vv.Bold:return a.ZP.createElement("strong",null,f(i));case s.Vv.Blockquote:return a.ZP.createElement("blockquote",null,f(i));case s.Vv.BotCommand:return a.ZP.createElement("a",{onClick:p,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Hashtag:case s.Vv.Cashtag:return a.ZP.createElement("a",{onClick:g,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Code:return a.ZP.createElement("code",{className:"text-entity-code"},f(i));case s.Vv.Email:return a.ZP.createElement("a",{href:`mailto:${r}`,target:"_blank",rel:"noopener noreferrer",className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Italic:return a.ZP.createElement("em",null,f(i));case s.Vv.MentionName:return a.ZP.createElement(c.Z,{userId:e.userId},f(i));case s.Vv.Mention:return a.ZP.createElement(c.Z,{username:r},f(i));case s.Vv.Phone:return a.ZP.createElement("a",{href:`tel:${r}`,className:"text-entity-link",dir:"auto"},f(i));case s.Vv.Pre:return a.ZP.createElement("pre",{className:"text-entity-pre"},f(i));case s.Vv.Strike:return a.ZP.createElement("del",null,f(i));case s.Vv.TextUrl:case s.Vv.Url:return a.ZP.createElement(l.Z,{url:v(r,e),text:r},f(i));case s.Vv.Underline:return a.ZP.createElement("ins",null,f(i));default:return f(i)}}(P,M,S);if(Array.isArray(x)?E.push(...x):E.push(x),h&&T0&&"\n"===t[0]&&(t=t.substring(1)),t&&E.push(...f(t,n,r,i))}return{renderResult:E,entityEndIndex:T}}let E=0;return h.forEach(((t,n)=>{const{renderResult:a,entityEndIndex:r}=Z(E,e.length,t,n===h.length-1);d.push(...a),E=r})),d}function f(e,t,n,a){if(Array.isArray(e)){const r=[];return e.forEach((e=>{r.push(...f(e,t,n,a))})),r}if(a)return(0,o.Z)(e,["escape_html","emoji_html","br_html"]);const r=n?"hq_emoji":"emoji";return t?(0,o.Z)(e,[r,"br","highlight"],{highlight:t}):(0,o.Z)(e,[r,"br"])}function v(e,t){const{type:n,url:a}=t;return n===s.Vv.TextUrl&&a?a:e}function p(e){(0,r.uC)().sendBotCommand({command:e.currentTarget.innerText})}function g(e){(0,r.uC)().setLocalTextSearchQuery({query:e.currentTarget.innerText}),(0,r.uC)().searchTextMessagesLocal()}},5296:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(4753),s=n(5116),i=n(6202),o=n(706),c=n(1638);const l={large:160,medium:128,small:104};function d(e,t,n,d,u,m,h,f){const{interactWithAnimatedEmoji:v,sendEmojiInteraction:p,sendWatchingEmojiInteraction:g}=(0,s.uC)(),Z=h||f,[E,P]=(0,o.Z)(),y=(0,a.sO)(null),C=(0,a.sO)(null),b=(0,i.Z)(d?`document${d}`:void 0,!d),N=l[e],w=`width: ${N}px; height: ${N}px;`,[k,I]=(0,a.eJ)(String(Math.random())),T=(0,a.sO)(void 0),M=(0,a.sO)(void 0),S=(0,a.I4)((()=>{y.current&&(p({chatId:t,messageId:n,localEffect:h,emoji:f,interactions:T.current}),M.current=void 0,T.current=void 0)}),[p,t,n,h,f]),x=(0,a.I4)((()=>{I(String(Math.random()));const e=C.current;b&&(e&&(e.pause(),e.remove()),C.current=new Audio,C.current.src=b,(0,r.Z)(C.current),C.current.addEventListener("ended",(()=>{C.current=void 0}),{once:!0}))}),[b]),L=(0,a.I4)((()=>{x();const e=y.current;if(!(Z&&e&&n&&t))return;const{x:a,y:r}=e.getBoundingClientRect();v({localEffect:h,emoji:f,x:a,y:r,startSize:N,isReversed:!m}),T.current||(T.current=[],M.current=performance.now(),setTimeout(S,1e3)),T.current.push(M.current?(performance.now()-M.current)/1e3:0)}),[t,f,Z,v,m,h,n,x,S,N]);return(0,a.d4)((()=>{const e=y.current;if(!e||!u)return;const{messageId:a,endX:r,endY:s}=u;if(!r&&!s&&a===n){const{x:n,y:a}=e.getBoundingClientRect();g({chatId:t,emoticon:h?(0,c.ji)(h):f,startSize:N,x:n,y:a,isReversed:!m}),x()}}),[u,t,f,m,h,n,x,g,N]),{playKey:k,ref:y,style:w,width:N,handleClick:L,markAnimationLoaded:P,isAnimationLoaded:E}}},742:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"ChatFolderModal",!t);return n?a.ZP.createElement(n,e):void 0}))},1080:(e,t,n)=>{n.d(t,{Z:()=>V});var a=n(4050),r=n(5116),s=n(3716),i=n(7361),o=n(7204),c=n(782),l=n(2858),d=n(1638),u=n(7407);let m;!function(e){e[e.Move=0]="Move",e[e.Opacity=1]="Opacity",e[e.None=2]="None"}(m||(m={}));var h=n(1273),f=n(4288),v=n(9107),p=n(6137),g=n(8005),Z=n(2340),E=n(9118),P=n(6752),y=n(5790),C=n(1470),b=n(706),N=n(6202),w=n(172),k=n(9411),I=n(8729),T=n(6844),M=n(329),S=n(1876),x=n(2155),L=n(126);const $=(0,a.X$)((({chat:e,isPinned:t,isMuted:n})=>{const r=Boolean(e.unreadCount||e.hasUnreadMark||t),s=(0,P.Z)("Badge",n&&"muted",t&&"pinned",Boolean(e.unreadCount||e.hasUnreadMark)&&"unread");function i(){return e.unreadCount?e.unreadMentionsCount?a.ZP.createElement("div",{className:"Badge-wrapper"},a.ZP.createElement("div",{className:"Badge mention"},a.ZP.createElement("i",{className:"icon-mention"})),a.ZP.createElement("div",{className:s},(0,x.bi)(e.unreadCount))):a.ZP.createElement("div",{className:s},(0,x.bi)(e.unreadCount)):e.hasUnreadMark?a.ZP.createElement("div",{className:s}):t?a.ZP.createElement("div",{className:s},a.ZP.createElement("i",{className:"icon-pinned-chat"})):void 0}return a.ZP.createElement(L.Z,{isCustom:!0,className:"Badge-transition",isOpen:r},i)}));var A=n(742);const O=(0,a.X$)((({isSelected:e,isActive:t})=>a.ZP.createElement("div",{className:(0,P.Z)("ChatCallStatus",t&&"active",e&&!i.wB&&"selected")},a.ZP.createElement("div",{className:"indicator"},a.ZP.createElement("div",null),a.ZP.createElement("div",null),a.ZP.createElement("div",null))))),F=(0,a.X$)((0,r.c$)(((e,{chatId:t})=>{var n;const a=(0,d.Z1)(e,t);if(!a||!a.lastMessage)return{};const{senderId:r,replyToMessageId:s,isOutgoing:i}=a.lastMessage,o=r?(0,d.dy)(e,r):void 0,c=(0,l.N5)(a.lastMessage),u=c&&s?(0,d.hj)(e,a.id,s):void 0,{targetUserIds:m,targetChatId:h}=c||{},f=(0,l.zX)(a),{chatId:v,threadId:g,type:Z}=(0,d.Bt)(e)||{},E=t===v&&g===p._f;return{chat:a,isMuted:(0,l.i4)(a,(0,d.dZ)(e),(0,d.NJ)(e)),lastMessageSender:o,actionTargetUserIds:m,actionTargetChatId:h,actionTargetMessage:u,draft:(0,d.Ms)(e,t,p._f),animationLevel:e.settings.byKey.animationLevel,isSelected:E,canScrollDown:E&&"thread"===Z,canChangeFolder:Boolean(null===(n=e.chatFolders.orderedIds)||void 0===n?void 0:n.length),lastSyncTime:e.lastSyncTime,...i&&{lastMessageOutgoingStatus:(0,d.dT)(e,a.lastMessage)},...f&&{user:(0,d.dy)(e,f),userStatus:(0,d.ss)(e,f)}}}))((({style:e,chatId:t,folderId:n,orderDiff:o,animationType:c,isPinned:d,chat:u,isMuted:h,user:f,userStatus:p,actionTargetUserIds:x,lastMessageSender:L,lastMessageOutgoingStatus:F,actionTargetMessage:R,actionTargetChatId:D,draft:U,animationLevel:B,isSelected:X,canScrollDown:V,canChangeFolder:j,lastSyncTime:z})=>{const{openChat:K,focusLastMessage:Y}=(0,r.uC)(),H=(0,a.sO)(null),[q,W,_]=(0,b.Z)(),[J,G,Q]=(0,b.Z)(),[ee,te,ne]=(0,b.Z)(),[ae,re,se]=(0,b.Z)(),{lastMessage:ie,typingStatus:oe}=u||{},ce=ie&&(0,l.Lo)(ie);(0,y.Z)(t,ce?ie.replyToMessageId:void 0,R);const le=ie&&!(0,l.bf)(ie)?(0,l.DH)(ie):void 0,de=(0,N.Z)(ie?(0,l.Ti)(ie,"micro"):void 0),ue=Boolean(ie&&(0,l.Y5)(ie)),me=(0,a.Ye)((()=>{if(!x)return;const e=(0,r.Rd)().users.byId;return x.map((t=>e[t])).filter(Boolean)}),[x]);(0,a.bt)((()=>{const e=H.current;if(0!==B&&e){if(c===m.Opacity)e.style.opacity="0",(0,E.T2)((()=>{e.classList.add("animate-opacity"),e.style.opacity="1"}));else{if(c!==m.Move)return;e.style.transform=`translate3d(0, ${100*-o}%, 0)`,(0,E.T2)((()=>{e.classList.add("animate-transform"),e.style.transform=""}))}setTimeout((()=>{(0,E.T2)((()=>{e.classList.remove("animate-opacity","animate-transform"),e.style.opacity="",e.style.transform=""}))}),200+s.fK)}}),[B,o,c]);const he=(0,a.I4)((()=>{K({id:t,shouldReplaceHistory:!0}),X&&V&&Y()}),[X,V,K,t,Y]),fe=(0,C.Z)({chat:u,user:f,handleDelete:function(){te(),W()},handleChatFolderChange:function(){re(),G()},folderId:n,isPinned:d,isMuted:h,canChangeFolder:j}),ve=(0,v.Z)();if(!u)return;const pe=(0,P.Z)("Chat chat-item-clickable",(0,l.YC)(t)?"private":"group",X&&"selected");return a.ZP.createElement(S.Z,{ref:H,className:pe,style:e,ripple:!i.wB,contextActions:fe,onClick:he},a.ZP.createElement("div",{className:"status"},a.ZP.createElement(w.Z,{chat:u,user:f,userStatus:p,isSavedMessages:null==f?void 0:f.isSelf,lastSyncTime:z}),u.isCallActive&&u.isCallNotEmpty&&a.ZP.createElement(O,{isSelected:X,isActive:0!==B})),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",null,(0,Z.Z)((0,l.U)(ve,u,f))),u.isVerified&&a.ZP.createElement(k.Z,null),h&&a.ZP.createElement("i",{className:"icon-muted"}),u.lastMessage&&a.ZP.createElement(T.Z,{message:u.lastMessage,outgoingStatus:F})),a.ZP.createElement("div",{className:"subtitle"},function(){if(oe&&ie&&oe.timestamp>1e3*ie.date)return a.ZP.createElement(I.Z,{typingStatus:oe});if(null!=U&&U.text.length)return a.ZP.createElement("p",{className:"last-message",dir:ve.isRtl?"auto":"ltr"},a.ZP.createElement("span",{className:"draft"},ve("Draft")),(0,Z.Z)(U.text));if(!ie)return;if(ce){const e=u&&((0,l.eA)(u)||ie.senderId===ie.chatId)?u:L;return a.ZP.createElement("p",{className:"last-message",dir:ve.isRtl?"auto":"ltr"},(0,Z.Z)((0,g.D)(ve,ie,e,me,R,D,{asPlain:!0})))}const e=(0,l.zF)(ve,t,L);return a.ZP.createElement("p",{className:"last-message",dir:ve.isRtl?"auto":"ltr"},e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("span",{className:"sender-name"},(0,Z.Z)(e)),a.ZP.createElement("span",{className:"colon"},":")),function(e,t,n,r){return n?a.ZP.createElement("span",{className:"media-preview"},a.ZP.createElement("img",{src:n,alt:"",className:r?"round":void 0}),(0,l.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,Z.Z)((0,l.MK)(e,t,!0))):(0,Z.Z)((0,l.MK)(e,t))}(ve,ie,de||le,ue))}(),a.ZP.createElement($,{chat:u,isPinned:d,isMuted:h}))),ee&&a.ZP.createElement(M.Z,{isOpen:q,onClose:_,onCloseAnimationEnd:ne,chat:u}),ae&&a.ZP.createElement(A.Z,{isOpen:J,onClose:Q,onCloseAnimationEnd:se,chatId:t}))})));var R=n(1713),D=n(231),U=n(7854);const B=(0,a.X$)((0,r.c$)(((e,{folderId:t,folderType:n})=>({chatFolder:t&&"folder"===n?(0,d.Mw)(e,t):void 0,animatedEmoji:(0,d.zB)(e,"📂")})))((({chatFolder:e,animatedEmoji:t,foldersDispatch:n,onScreenSelect:r})=>{const s=(0,v.Z)(),o=(0,a.I4)((()=>{n({type:"editFolder",payload:e}),r(R.MT.FoldersEditFolderFromChatList)}),[e,n,r]);return a.ZP.createElement("div",{className:"EmptyFolder"},a.ZP.createElement("div",{className:"sticker"},t&&a.ZP.createElement(U.Z,{sticker:t})),a.ZP.createElement("h3",{className:"title",dir:"auto"},s("FilterNoChatsToDisplay")),a.ZP.createElement("p",{className:"description",dir:"auto"},s(e?"ChatList.EmptyChatListFilterText":"Chat.EmptyChat")),e&&n&&r&&a.ZP.createElement(D.Z,{ripple:!i.wB,fluid:!0,pill:!0,onClick:o,size:"smaller",isRtl:s.isRtl},a.ZP.createElement("i",{className:"icon-settings"}),s("ChatList.EmptyChatListEditFilter")))})));var X;!function(e){e.all="active",e.archived="archived"}(X||(X={}));const V=(0,a.X$)((0,r.c$)(((e,{folderType:t,folderId:n})=>{const{chats:{listIds:a,byId:r,orderedPinnedIds:s},users:{byId:i},lastSyncTime:o}=e,c="folder"!==t?X[t]:void 0,l=n?(0,d.Mw)(e,n):void 0;return{allListIds:a,chatsById:r,usersById:i,lastSyncTime:o,notifySettings:(0,d.dZ)(e),notifyExceptions:(0,d.NJ)(e),...c?{listIds:a[c],orderedPinnedIds:s[c]}:{chatFolder:l}}}))((({folderType:e,folderId:t,isActive:n,allListIds:d,chatsById:v,usersById:p,listIds:g,orderedPinnedIds:Z,chatFolder:E,lastSyncTime:P,notifySettings:y,notifyExceptions:C,foldersDispatch:b,onScreenSelect:N})=>{const{loadMoreChats:w,preloadTopChatMessages:k,preloadArchivedChats:I,openChat:T,openNextChat:M}=(0,r.uC)(),[S,x]=(0,a.Ye)((()=>"folder"===e&&E?(0,l.P4)(d,v,p,E,y,C):[g,Z]),[e,E,d,v,p,y,C,g,Z]),[L,$,A]=(0,a.Ye)((()=>{if(!S||"folder"===e&&!E)return[];const t=(0,l.O)(v,S,x,e),n=[].concat(t.pinnedChats,t.otherChats),a=n.map((({id:e})=>e));return[n.reduce(((e,t,n)=>(e[t.id]=n,e)),{}),a,t]}),[S,x,e,E,v]),O=(0,o.Z)(L),R=(0,a.Ye)((()=>L&&O?(0,c.Q8)(L,((e,t)=>void 0!==O[t]?e-O[t]:-1/0)):{}),[L,O]),D=(0,a.I4)((()=>{w({listType:"archived"===e?"archived":"active"})}),[w,e]),[U,X]=(0,u.Z)(P?D:void 0,$,void 0,s.t_,"all"===e&&!s.NM),V=(0,a.Ye)((()=>{if(U&&A)return(0,l.wG)(A,U)}),[A,U]);(0,a.d4)((()=>{P&&"all"===e&&(k(),I())}),[P,e,k,I]),(0,a.d4)((()=>{if(n&&$)return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)};function e(e){if(i.fl&&(i.jm&&e.metaKey||!i.jm&&e.ctrlKey)&&e.code.startsWith("Digit")){const[,t]=e.code.match(/Digit(\d)/)||[];if(!t)return;const n=Number(t)-1;if(n>$.length-1)return;T({id:$[n],shouldReplaceHistory:!0})}if(e.altKey){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(!t)return;e.preventDefault(),M({targetIndexDelta:t,orderedIds:$})}}}),[n,T,M,$]);const j=function(e){return(0,a.Ye)((()=>{const t=Object.values(e),n=t.filter((e=>e<0)).length,a=t.filter((e=>e>0)).length;return t=>{const r=e[t];return 0===r?m.None:r===1/0||r===-1/0||n<=a&&r<0||a0?m.Opacity:m.Move}}),[e])}(R);return a.ZP.createElement(h.Z,{className:"chat-list custom-scroll",items:U,onLoadMore:X,preloadBackwards:s.t_,noFastList:!0,noScrollRestore:!0},null!=U&&U.length&&V?function(){const e=$.indexOf(U[0]),n=e+V.pinnedChats.length;return a.ZP.createElement("div",{className:"scroll-container",style:i.wZ?`height: ${$.length*s.rS}px`:void 0,teactFastList:!0},V.pinnedChats.map((({id:n},r)=>a.ZP.createElement(F,{key:n,teactOrderKey:r,chatId:n,isPinned:!0,folderId:t,animationType:j(n),orderDiff:R[n],style:`top: ${(e+r)*s.rS}px;`}))),V.otherChats.map(((e,r)=>a.ZP.createElement(F,{key:e.id,teactOrderKey:(0,l.OE)(e),chatId:e.id,folderId:t,animationType:j(e.id),orderDiff:R[e.id],style:`top: ${(n+r)*s.rS}px;`}))))}():U&&!U.length?a.ZP.createElement(B,{folderId:t,folderType:e,foldersDispatch:b,onScreenSelect:N}):a.ZP.createElement(f.Z,{key:"loading"}))})))},91:(e,t,n)=>{n.d(t,{F:()=>r});var a=n(2858);function r(e,t,n,r){const{senderId:s}=t;if(!s)return;const i=(0,a.YC)(s)?r[s]:n[s];let o=(0,a.OU)(e,i);const c=n[t.chatId];return c&&((0,a.YC)(s)&&i.isSelf?o=`${e("FromYou")} → ${(0,a.U)(e,c)}`:(0,a.Bf)(c)&&(o+=` → ${(0,a.U)(e,c)}`)),o}},2420:(e,t,n)=>{n.d(t,{t:()=>u,Z:()=>m});var a=n(4050),r=n(1212),s=n(6752),i=n(3989),o=n(7204),c=n(2898),l=n(706);const d=(0,a.X$)((({isQuick:e,onFileSelect:t})=>{const[n,r,i]=(0,l.Z)(),o=(0,s.Z)("DropTarget",n&&"hovered");return a.ZP.createElement("div",{className:o,onDrop:t,onDragEnter:()=>{r()},onDragLeave:e=>{const{relatedTarget:t}=e;t&&e.stopPropagation(),i()}},a.ZP.createElement("div",{className:"target-content"},a.ZP.createElement("div",{className:"icon icon-"+(e?"photo":"document")}),a.ZP.createElement("div",{className:"title"},"Drop files here to send them"),a.ZP.createElement("div",{className:"description"},e?"in a quick way":"without compression")))}));let u;!function(e){e.None="none",e.Document="document",e.QuickFile="quick_file"}(u||(u={}));const m=(0,a.X$)((({isOpen:e,withQuick:t,onHide:n,onFileSelect:l})=>{const u=(0,a.sO)(null),m=(0,o.Z)(t),{shouldRender:h,transitionClassNames:f}=(0,r.Z)(e);(0,a.d4)((()=>e?(0,i.Z)(n):void 0),[e,n]);const v=(0,a.I4)((e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),l(Array.from(t.files),!1))}),[l,n]),p=(0,a.I4)((e=>{const{dataTransfer:t}=e;t.files&&t.files.length>0&&(n(),l(Array.from(t.files),!0))}),[l,n]),g=(0,a.I4)((e=>{e.stopPropagation();const{target:t,relatedTarget:a}=e;t.matches(".DropTarget, .DropArea")&&!a&&(u.current=window.setTimeout((()=>{n()}),150))}),[n]);if(!h)return;const Z=(0,s.Z)("DropArea",f);return a.ZP.createElement(c.Z,{containerId:"#middle-column-portals"},a.ZP.createElement("div",{className:Z,onDragLeave:g,onDragOver:()=>{u.current&&window.clearTimeout(u.current)},onDrop:n},a.ZP.createElement(d,{onFileSelect:v}),(t||m)&&a.ZP.createElement(d,{onFileSelect:p,isQuick:!0})))}))},9830:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9203),s=n(8778);const i=(0,a.X$)((e=>{const{isOpen:t}=e,n=(0,s.Z)(r.gl.Extra,"EmojiTooltip",!t);return n?a.ZP.createElement(n,e):void 0}))},3616:(e,t,n)=>{n.d(t,{Z:()=>C});var a=n(4050),r=n(5116),s=n(3716),i=n(1638),o=n(9118),c=n(5723),l=n(6752),d=n(7361),u=n(517),m=n(2645),h=n(706),f=n(8674),v=n(6389),p=n(9107),g=n(4784),Z=n(6391),E=n(2340),P=n(3283);const y=d.wB?256:416,C=(0,a.X$)((0,r.c$)(((e,{chatId:t,threadId:n})=>{const{messageSendKeyCombo:a}=e.settings.byKey;return{messageSendKeyCombo:a,replyingToId:t&&n?(0,i.Yy)(e,t,n):void 0,noTabCapture:e.isPollModalOpen||e.payment.isPaymentModalOpen}}))((({id:e,chatId:t,threadId:n,isAttachmentModalInput:i,editableInputId:C,html:b,placeholder:N,forcedPlaceholder:w,canAutoFocus:k,shouldSuppressFocus:I,shouldSuppressTextFormatter:T,replyingToId:M,noTabCapture:S,messageSendKeyCombo:x,onUpdate:L,onSuppressedFocus:$,onSend:A})=>{const{editLastMessage:O,replyToNextMessage:F}=(0,r.uC)(),R=(0,a.sO)(null),D=(0,a.sO)(null),U=(0,p.Z)(),B=(0,a.sO)(!1),[X,V,j]=(0,h.Z)(),[z,K]=(0,a.eJ)(),[Y,H]=(0,a.eJ)(),q=(0,v.Z)(t,n);(0,a.d4)((()=>{i&&Q(!1)}),[i]),(0,m.Z)((([e])=>{b!==R.current.innerHTML&&(R.current.innerHTML=b),b!==D.current.innerHTML&&(D.current.innerHTML=b),void 0!==e&&e!==b&&Q(!b.length)}),[b]),(0,a.sO)(t).current=t;const W=(0,a.I4)((()=>{(0,f.zG)()?setTimeout(W,350):(0,c.Z)(R.current)}),[]),_=(0,a.I4)((()=>{j(),function(){const e=window.getSelection();e&&(e.removeAllRanges?e.removeAllRanges():e.empty&&e.empty())}()}),[j]);function J(){if(d.cj)return!1;const e=window.getSelection();if(!e||!e.rangeCount||B.current)return j(),!1;const t=e.getRangeAt(0),n=t.toString().trim();return!(T||!(0,Z.R)(t,C||s.R2)||!n||(0,g.Z)(n)||!t.START_TO_END)||(j(),!1)}function G(){if(!J())return;const e=window.getSelection().getRangeAt(0),t=e.getBoundingClientRect(),n=R.current.getBoundingClientRect();let a=t.left+t.width/2-n.left;a<90?a=90:a>n.width-90&&(a=n.width-90),K({x:a,y:t.top-n.top}),H(e),V()}function Q(e=!1){const t=R.current,n=D.current,a=Number(t.style.height.replace("px","")),r=Math.min(n.scrollHeight,y);if(r===a)return;const s=Math.round(50*Math.log(Math.abs(r-a))),i=()=>{t.style.height=`${r}px`,t.style.transitionDuration=`${s}ms`,t.classList.toggle("overflown",n.scrollHeight>y)};e?requestAnimationFrame(i):i()}(0,a.d4)((()=>{d.$b||k&&W()}),[t,W,M,k]),(0,a.d4)((()=>{if(S)return;const e=(0,o.Ds)((e=>{"Tab"===e.key&&(e.preventDefault(),requestAnimationFrame(W))}),2e3,!0,!1);return(0,u.Z)({onTab:e})}),[W,S]),(0,a.d4)((()=>{const e=R.current;function t(){e.blur()}return I&&e.addEventListener("focus",t),()=>{e.removeEventListener("focus",t)}}),[I]);const ee=(0,l.Z)("form-control custom-scroll",b.length>0&&"touched",I&&"focus-disabled");return a.ZP.createElement("div",{id:e,onClick:I?$:void 0,dir:U.isRtl?"rtl":void 0},a.ZP.createElement("div",{ref:R,id:C||s.R2,className:ee,contentEditable:!0,dir:"auto",onClick:W,onChange:function(e){const{innerHTML:t,textContent:n}=e.currentTarget;if(L("
"===t?"":t),q({type:"typing"}),!d.$b&&(!n||!n.length)&&(d.op||!t.includes("emoji-small"))){const e=window.getSelection();e&&(R.current.blur(),e.removeAllRanges(),(0,c.Z)(R.current,!0))}},onKeyDown:function(e){if(!b.length&&(e.metaKey||e.ctrlKey)){const t="ArrowDown"===e.key?1:"ArrowUp"===e.key?-1:void 0;if(t)return e.preventDefault(),void F({targetIndexDelta:t})}"Enter"!==e.key||e.shiftKey?"ArrowUp"!==e.key||b.length||e.metaKey||e.ctrlKey||e.altKey?e.target.addEventListener("keyup",(function t(){G(),e.target.removeEventListener("keyup",t)})):(e.preventDefault(),O()):d.cj||d.wZ||!("enter"===x&&!e.shiftKey||"ctrl-enter"===x&&(e.ctrlKey||e.metaKey))||(e.preventDefault(),j(),A())},onMouseDown:function(e){2===e.button?!0!==B.current&&(B.current=!0,document.addEventListener("mousedown",(function e(){setTimeout((()=>{B.current=!1}),100),window.removeEventListener("mouseup",e)})),document.addEventListener("keydown",(function e(t){"Esc"!==t.key&&"Escape"!==t.key||(setTimeout((()=>{B.current=!1}),100),window.removeEventListener("keydown",e))}))):e.target.addEventListener("mouseup",(function t(){G(),e.target.removeEventListener("mouseup",t)}))},onContextMenu:d.wZ?function(e){J()&&(e.preventDefault(),e.stopPropagation())}:void 0,onTouchCancel:d.wZ?G:void 0}),a.ZP.createElement("div",{ref:D,className:(0,l.Z)(ee,"clone"),dir:"auto"}),!w&&a.ZP.createElement("span",{className:"placeholder-text",dir:"auto"},N),a.ZP.createElement(P.Z,{isOpen:X,anchorPosition:z,selectedRange:Y,setSelectedRange:H,onClose:_}),w&&a.ZP.createElement("span",{className:"forced-placeholder"},(0,E.Z)(w)))})))},3283:(e,t,n)=>{n.d(t,{Z:()=>p});var a=n(4050),r=n(3716),s=n(6752),i=n(1396),o=n(3989),c=n(7529),l=n(1212),d=n(8758),u=n(706),m=n(9107),h=n(231);const f={B:"bold",STRONG:"bold",I:"italic",EM:"italic",U:"underline",DEL:"strikethrough",CODE:"monospace"},v=document.createElement("div"),p=(0,a.X$)((({isOpen:e,anchorPosition:t,selectedRange:n,setSelectedRange:p,onClose:g})=>{const Z=(0,a.sO)(null),E=(0,a.sO)(null),{shouldRender:P,transitionClassNames:y}=(0,l.Z)(e),[C,b,N]=(0,u.Z)(),[w,k]=(0,a.eJ)(""),[I,T]=(0,a.eJ)(!1),[M,S]=(0,a.eJ)(),[x,L]=(0,a.eJ)({});(0,a.d4)((()=>e?(0,o.Z)(g):void 0),[e,g]),(0,d.Z)(e,Z,g),(0,a.d4)((()=>{C?E.current.focus():(k(""),T(!1))}),[C]),(0,a.d4)((()=>{P||(N(),L({}),S(void 0))}),[N,P]),(0,a.d4)((()=>{if(!e||!n)return;const t={};let{parentElement:a}=n.commonAncestorContainer;for(;a&&a.id!==r.R2;){const e=f[a.tagName];e&&(t[e]=!0),a=a.parentElement}L(t)}),[e,n,b]);const $=(0,a.I4)((()=>{const e=window.getSelection();e&&p(e.getRangeAt(0))}),[p]),A=(0,a.I4)((()=>{if(n)return v.innerText=n.toString(),v.innerHTML}),[n]),O=(0,a.I4)((()=>{if(n)return n.commonAncestorContainer.parentElement}),[n]);function F(){const e=E.current;if(!e)return;const{offsetWidth:t,scrollWidth:n,scrollLeft:a}=e;if(n<=t)return void S(void 0);let r="";a0&&(r+=" mask-left"),S(r)}function R(e){if(x[e])return"active";if("monospace"===e||"strikethrough"===e){if(Object.keys(x).some((t=>t!==e&&!!x[t])))return"disabled"}else if(x.monospace||x.strikethrough)return"disabled"}const D=(0,a.I4)((()=>{L((e=>(document.execCommand(e.bold?"removeFormat":"bold"),Object.keys(e).forEach((t=>{"italic"!==t&&"underline"!==t||!e[t]||document.execCommand(t)})),$(),{...e,bold:!e.bold})))}),[$]),U=(0,a.I4)((()=>{document.execCommand("italic"),$(),L((e=>({...e,italic:!e.italic})))}),[$]),B=(0,a.I4)((()=>{document.execCommand("underline"),$(),L((e=>({...e,underline:!e.underline})))}),[$]),X=(0,a.I4)((()=>{if(x.strikethrough){const e=O();if(!n||!e||"DEL"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void L((e=>({...e,strikethrough:!1})))}const e=A();document.execCommand("insertHTML",!1,`${e}`),g()}),[O,A,g,n,x.strikethrough]),V=(0,a.I4)((()=>{if(x.monospace){const e=O();if(!n||!e||"CODE"!==e.tagName||!e.textContent)return;return e.replaceWith(e.textContent),void L((e=>({...e,monospace:!1})))}const e=A();document.execCommand("insertHTML",!1,`${e}`),g()}),[O,A,g,n,x.monospace]);function j(){const e=encodeURI((0,i.X)(w)||"");if(I){const t=O();if(!t||"A"!==t.tagName)return;return t.href=e,void g()}const t=A();!function(){if(!n)return;const e=window.getSelection();e&&(e.removeAllRanges(),e.addRange(n))}(),document.execCommand("insertHTML",!1,`${t}`),g()}const z=(0,a.I4)((e=>{const t={k:b,b:D,u:B,i:U,m:V,s:X}[(0,c.Z)(e)];!e.altKey&&(e.ctrlKey||e.metaKey)&&t&&(e.preventDefault(),e.stopPropagation(),t())}),[D,U,B,V,X,b]);(0,a.d4)((()=>(e&&document.addEventListener("keydown",z),()=>document.removeEventListener("keydown",z))),[e,z]);const K=(0,m.Z)();if(!P)return;const Y=(0,s.Z)("TextFormatter",y,C&&"link-control-shown"),H=(0,s.Z)("TextFormatter-link-url-confirm",!!w.length&&"shown"),q=t?`left: ${t.x}px; top: ${t.y}px;--text-formatter-left: ${t.x}px;`:"";return a.ZP.createElement("div",{ref:Z,className:Y,style:q,onKeyDown:function(e){"Enter"===e.key&&C&&(j(),e.preventDefault())}},a.ZP.createElement("div",{className:"TextFormatter-buttons"},a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Bold text",className:R("bold"),onClick:D},a.ZP.createElement("i",{className:"icon-bold"})),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Italic text",className:R("italic"),onClick:U},a.ZP.createElement("i",{className:"icon-italic"})),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Underlined text",className:R("underline"),onClick:B},a.ZP.createElement("i",{className:"icon-underlined"})),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Strikethrough text",className:R("strikethrough"),onClick:X},a.ZP.createElement("i",{className:"icon-strikethrough"})),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:"Monospace text",className:R("monospace"),onClick:V},a.ZP.createElement("i",{className:"icon-monospace"})),a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:K("TextFormat.AddLinkTitle"),onClick:b},a.ZP.createElement("i",{className:"icon-link"}))),a.ZP.createElement("div",{className:"TextFormatter-link-control"},a.ZP.createElement("div",{className:"TextFormatter-buttons"},a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:K("Cancel"),onClick:N},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement("div",{className:(0,s.Z)("TextFormatter-link-url-input-wrapper",M)},a.ZP.createElement("input",{ref:E,className:"TextFormatter-link-url-input",type:"text",value:w,placeholder:"Enter URL...",autoComplete:"off",inputMode:"url",dir:"auto",onChange:function(e){k(e.target.value),F()},onScroll:F})),a.ZP.createElement("div",{className:H},a.ZP.createElement("div",{className:"TextFormatter-divider"}),a.ZP.createElement(h.Z,{color:"translucent",ariaLabel:K("Save"),className:"color-primary",onClick:j},a.ZP.createElement("i",{className:"icon-check"}))))))}))},2400:(e,t,n)=>{n.d(t,{_:()=>o});const a=/(
|)/g,r=/( |\u00A0)/g,s=/(
|<\/div>)/gi,i=/\n$/i;function o(e){return e.replace(r," ").replace(a,"\n").replace(s,"").replace(i,"")}},6391:(e,t,n)=>{function a(e,t){const{commonAncestorContainer:n}=e;let a=n,r=1;for(;a&&a.id!==t&&r<5;)a=a.parentElement,r++;return Boolean(a&&a.id===t)}n.d(t,{R:()=>a})},3575:(e,t,n)=>{n.d(t,{Z:()=>P});var a=n(4050),r=n(3716),s=n(735),i=n(2400),o=n(4284),c=n(5723),l=n(782);const d=new WeakMap;function u(e){return(...t)=>{const n=d.get(e);if(n&&(0,l.et)(n.lastArgs,t))return n.lastResult;const a=e(...t);return d.set(e,{lastArgs:t,lastResult:a}),a}}var m=n(706);let h,f,v,p;const g=u((function(e,t,n){return e&&t.length?Object.values((0,l.q0)(e,t)).slice(0,n):s.D})),Z=u((function(e,t,n){const a=Object.values(e),r=(0,l.ee)(a,"native"),s=t?(0,l.Q8)(t,(e=>Object.values((0,l.q0)(r,e)))):{},i=n?(0,l.Q8)(n,(e=>Object.values((0,l.q0)(r,e)))):{},o={...s,...i},c=[].concat(Object.keys(s),Object.keys(i)),d=a.reduce(((e,t)=>(t.names.forEach((n=>{e[n]||(e[n]=[]),e[n].push(t)})),e)),{});return{byKeyword:o,keywords:c,byName:d,names:Object.keys(d)}})),E=u((function(e,t,n){const{byKeyword:a,keywords:r,byName:i,names:o}=e;let c=s.D;const d=r.filter((e=>e.startsWith(t))).sort();c=c.concat((0,l.xH)(Object.values((0,l.q0)(a,d))));const u=o.filter((e=>e.startsWith(t)));return c=c.concat((0,l.xH)(Object.values((0,l.q0)(i,u)))),c=(0,l.Tw)(c),c.slice(0,n)}));try{p=new RegExp("(^|\\s):[-+_:\\p{L}\\p{N}]*$","gui")}catch(e){p=new RegExp("(^|\\s):[-+_:\\d\\wа-яё]*$","gi")}function P(e,t,l,d=r.R2,u,P,y,C=!1){const[b,N,w]=(0,m.Z)(),[k,I]=(0,a.eJ)(),[T,M]=(0,a.eJ)(!1),[S,x]=(0,a.eJ)(s.D);(0,a.d4)((()=>{if(C)return;const e=()=>{I(v.emojis)};v?e():async function(){return h||(h=n.e(501).then(n.t.bind(n,7501,19)),f=(await h).default,v=(0,o.NM)(f)),h}().then(e)}),[C]);const L=t.current;(0,a.d4)((()=>{if(!e||!L||!k||C)return void w();const t=L.includes(":")&&function(e){const t=(0,i._)(e).match(p);return t?t[0].trim():void 0}(L);if(!t)return x(s.D),void w();const n=t.length>2&&t.endsWith(":"),a=t.substr(1,n?t.length-2:void 0);let r=s.D;if(M(n),a){if(a.length>=2){const e=Z(k,P,y);r=E(e,a,36)}}else r=g(k,l,36);r.length?(n||N(),x(r)):w()}),[k,L,e,N,l,w,M,C,P,y]);const $=(0,a.I4)(((e,n)=>{const a=t.current,r=a.lastIndexOf(":",n?a.lastIndexOf(":")-1:void 0);if(-1!==r){u(`${a.substr(0,r)}${e}`);const t=document.getElementById(d);requestAnimationFrame((()=>{(0,c.Z)(t,!0)}))}w()}),[t,d,u,w]);return(0,a.d4)((()=>{b&&T&&S.length&&$(S[0].native,!0)}),[S,$,b,T]),{isEmojiTooltipOpen:b,closeEmojiTooltip:w,filteredEmojis:S,insertEmoji:$}}},9295:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(5116),s=n(6137),i=n(3716),o=n(2858),c=n(2400),l=n(5723),d=n(706),u=n(782);const m=(0,n(9118).P2)((e=>e()),500,!0);let h;try{h=new RegExp("(^|\\s)@[-_\\p{L}\\p{M}\\p{N}]*$","gui")}catch(e){h=new RegExp("(^|\\s)@[-_\\d\\wа-яё]*$","gi")}function f(e,t,n,f=i.R2,v,p,g){const[Z,E,P]=(0,d.Z)(),[y,C]=(0,a.eJ)(),b=(0,a.I4)(((e,t)=>{const n=(0,r.Rd)().users.byId;(v||p)&&n?m((()=>{const a=null==v?void 0:v.reduce(((e,t)=>(t.userId!==g&&e.push(t.userId),e)),[]),r=(0,o.kK)((0,u.Tw)([...t&&p||[],...a||[]]),n,e);C(Object.values((0,u.q0)(n,r)))})):C(void 0)}),[g,v,p]),N=t.current;(0,a.d4)((()=>{if(!e||!N.length)return void P();const t=N.includes("@")&&function(e){const t=(0,c._)(e).match(h);return t?t[0].trim():void 0}(N);if(t){const e=t?t.substr(1):"";b(e,function(e){return e.startsWith("@")}(N))}else P()}),[e,b,E,P,N]),(0,a.d4)((()=>{null!=y&&y.length?E():P()}),[E,P,y]);const w=(0,a.I4)(((e,a=!1)=>{if(!e.username&&!(0,o.Vl)(e))return;const r=e.username?`@${e.username}`:`${(0,o.Vl)(e)}`,i=t.current,c=i.lastIndexOf("@");if(-1!==c){n(`${i.substr(0,c)}${r} `);const e=document.getElementById(f);requestAnimationFrame((()=>{(0,l.Z)(e,a)}))}P()}),[t,f,n,P]);return{isMentionTooltipOpen:Z,closeMentionTooltip:P,insertMention:w,mentionFilteredUsers:y}}},7891:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9290),s=n(5326);function i(e,t){const n=void 0===t,i=(0,a.sO)(n),o=(0,a.sO)(),c=(0,s.Z)();return(0,r.Z)((()=>{n||(i.current=!1,o.current&&(clearTimeout(o.current),o.current=void 0))}),e),(0,a.d4)((()=>{if(n||i.current)return;const e=()=>{i.current=!0,c()};t>0?o.current=window.setTimeout(e,t):e()}),e),i.current}},1218:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(4605);const s=(0,a.X$)((({id:e,options:t,selected:n=[],disabled:s,round:i,loadingOptions:o,onChange:c})=>{const[l,d]=(0,a.eJ)(n||[]),u=(0,a.I4)((e=>{const{value:t,checked:n}=e.currentTarget;let a;a=n?[...l,t]:l.filter((e=>e!==t)),d(a),c(a)}),[c,l]);return a.ZP.createElement("div",{id:e,className:"radio-group"},t.map((e=>a.ZP.createElement(r.Z,{label:e.label,subLabel:e.subLabel,value:e.value,checked:-1!==n.indexOf(e.value),disabled:s,round:i,isLoading:o?-1!==o.indexOf(e.value):void 0,onChange:u}))))}))},1151:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752),s=n(231);const i=({isShown:e,className:t,color:n="primary",ariaLabel:i,disabled:o,onClick:c,children:l})=>{const d=(0,r.Z)("FloatingActionButton",e&&"revealed",t);return a.ZP.createElement(s.Z,{className:d,color:n,round:!0,disabled:o,onClick:e&&!o?c:void 0,ariaLabel:i,tabIndex:-1},l)}},1876:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(7361),s=n(9118),i=n(6752),o=n(7240),c=n(3394),l=n(706),d=n(9107),u=n(8512),m=n(2328),h=n(8964),f=n(231);const v=({ref:e,buttonRef:t,icon:n,secondaryIcon:v,className:p,style:g,children:Z,disabled:E,ripple:P,narrow:y,inactive:C,focus:b,destructive:N,multiline:w,isStatic:k,contextActions:I,onMouseDown:T,onClick:M,onSecondaryIconClick:S})=>{let x=(0,a.sO)(null);e&&(x=e);const[L,$,A]=(0,l.Z)(),{isContextMenuOpen:O,contextMenuPosition:F,handleBeforeContextMenu:R,handleContextMenu:D,handleContextMenuClose:U,handleContextMenuHide:B}=(0,o.Z)(x,!I),X=(0,a.I4)((()=>x.current),[]),V=(0,a.I4)((()=>x.current.closest(".custom-scroll")),[]),j=(0,a.I4)((()=>x.current.querySelector(".ListItem-context-menu .bubble")),[]),{positionX:z,positionY:K,style:Y}=(0,c.Z)(F,X,V,j),H=(0,a.I4)((e=>{!E&&M&&(M(e),r.$b&&!P&&($(),(0,s.T2)(A)))}),[E,$,M,P,A]),q=(0,a.I4)((e=>{C||r.$b||(!I||2!==e.button&&M||R(e),0===e.button&&(M?H(e):D(e)))}),[C,I,M,R,D,H]),W=(0,d.Z)(),_=(0,i.Z)("ListItem",p,!k&&"no-selection",P&&"has-ripple",y&&"narrow",E&&"disabled",C&&"inactive",F&&"has-menu-open",b&&"focus",N&&"destructive",w&&"multiline",k&&"is-static");return a.ZP.createElement("div",{ref:x,className:_,dir:W.isRtl?"rtl":void 0,style:g,onMouseDown:T},a.ZP.createElement("div",{className:(0,i.Z)("ListItem-button",L&&"active"),role:"button",ref:t,tabIndex:0,onClick:!C&&r.$b?H:void 0,onMouseDown:q,onContextMenu:!C&&I?D:void 0},n&&a.ZP.createElement("i",{className:`icon-${n}`}),w&&a.ZP.createElement("div",{className:"multiline-item"},Z),!w&&Z,!E&&!C&&P&&a.ZP.createElement(u.Z,null),v&&a.ZP.createElement(f.Z,{className:"secondary-icon",round:!0,color:"translucent",size:"smaller",onMouseDown:e=>{E||0!==e.button||!S&&!I||(e.stopPropagation(),S?S(e):D(e))}},a.ZP.createElement("i",{className:`icon-${v}`}))),I&&void 0!==F&&a.ZP.createElement(m.Z,{isOpen:O,positionX:z,positionY:K,style:Y,className:"ListItem-context-menu",autoClose:!0,onClose:U,onCloseAnimationEnd:B},I.map((e=>a.ZP.createElement(h.Z,{key:e.title,icon:e.icon,destructive:e.destructive,disabled:!e.handler,onClick:e.handler},e.title)))))}},6937:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(3716),s=n(1212),i=n(6752),o=n(3989),c=n(2898);const l=({message:e,duration:t=3e3,containerId:n,onDismiss:l})=>{const[d,u]=(0,a.eJ)(!0),m=(0,a.sO)(null),{transitionClassNames:h}=(0,s.Z)(d),f=(0,a.I4)((()=>{u(!1),setTimeout(l,150+r.fK)}),[l]);(0,a.d4)((()=>d?(0,o.Z)(f):void 0),[d,f]),(0,a.d4)((()=>(m.current=window.setTimeout(f,t),()=>{m.current&&(clearTimeout(m.current),m.current=void 0)})),[t,f]);const v=(0,a.I4)((()=>{m.current&&(clearTimeout(m.current),m.current=void 0)}),[]),p=(0,a.I4)((()=>{m.current=window.setTimeout(f,t)}),[t,f]);return a.ZP.createElement(c.Z,{className:"Notification-container",containerId:n},a.ZP.createElement("div",{className:(0,i.Z)("Notification",h),onClick:f,onMouseEnter:v,onMouseLeave:p},a.ZP.createElement("div",{className:"content"},e)))}},9196:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752);const s={s:22,m:25,l:28,xl:20},i=(0,a.X$)((({progress:e=0,size:t="l",square:n,transparent:i,noCross:o,onClick:c})=>{const l=s[t],d=l-4,u=l-1,m=2*d*Math.PI,h=(0,a.sO)(null);(0,a.d4)((()=>{if(!h.current)return;const t=h.current.firstElementChild,n=m-Math.min(Math.max(.05,e),1)*m;t?t.firstElementChild.setAttribute("stroke-dashoffset",n.toString()):h.current.innerHTML=`\n \n `}),[h,m,u,d,e]);const f=(0,r.Z)(`ProgressSpinner size-${t}`,i&&"transparent",n&&"square",o&&"no-cross");return a.ZP.createElement("div",{ref:h,className:f,onClick:c})}))},4434:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(6752),s=n(9107),i=n(9204);const o=(0,a.X$)((({id:e,label:t,subLabel:n,value:o,name:c,checked:l,disabled:d,hidden:u,isLoading:m,onChange:h})=>{const f=(0,s.Z)(),v=(0,r.Z)("Radio",d&&"disabled",u&&"hidden-widget",m&&"loading");return a.ZP.createElement("label",{className:v,dir:f.isRtl?"rtl":void 0},a.ZP.createElement("input",{type:"radio",name:c,value:o,id:e,checked:l,onChange:h,disabled:d||u}),a.ZP.createElement("div",{className:"Radio-main"},a.ZP.createElement("span",{className:"label",dir:f.isRtl?"auto":void 0},t),n&&a.ZP.createElement("span",{className:"subLabel",dir:f.isRtl?"auto":void 0},n)),m&&a.ZP.createElement(i.Z,null))})),c=(0,a.X$)((({id:e,name:t,options:n,selected:r,disabled:s,loadingOption:i,onChange:c})=>{const l=(0,a.I4)((e=>{const{value:t}=e.currentTarget;c(t)}),[c]);return a.ZP.createElement("div",{id:e,className:"radio-group"},n.map((e=>a.ZP.createElement(o,{name:t,label:e.label,subLabel:e.subLabel,value:e.value,checked:e.value===r,hidden:e.hidden,disabled:s,isLoading:i?i===e.value:void 0,onChange:l}))))}))},8051:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(6752),s=n(9107);const i=(0,a.X$)((({options:e,min:t=0,max:n=(e?e.length-1:100),step:i=1,label:o,value:c,renderValue:l,disabled:d,onChange:u})=>{const m=(0,s.Z)(),h=(0,a.I4)((e=>{u(Number(e.currentTarget.value))}),[u]),f=(0,r.Z)("RangeSlider",d&&"disabled"),v=(0,a.Ye)((()=>e?c/(e.length-1)*100:(c-t)/((n-t)/i)*100),[e,c,n,t,i]);return a.ZP.createElement("div",{className:f},o&&a.ZP.createElement("div",{className:"slider-top-row",dir:m.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"label",dir:"auto"},o),!e&&a.ZP.createElement("span",{className:"value",dir:"auto"},l?l(c):c)),a.ZP.createElement("div",{className:"slider-main"},a.ZP.createElement("div",{className:"slider-fill-track",style:`width: ${v}%`}),a.ZP.createElement("input",{min:t,max:n,value:c,step:i,type:"range",onChange:h}),e&&a.ZP.createElement("div",{className:"slider-options"},e.map(((e,t)=>a.ZP.createElement("div",{className:(0,r.Z)("slider-option no-selection",t===c&&"active"),onClick:()=>u(t)},e))))))}))},9589:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(6752),s=n(706),i=n(9107),o=n(2515),c=n(4288),l=n(231);const d=(0,a.X$)((({ref:e,children:t,parentContainerClassName:n,value:d,inputId:u,className:m,focused:h,isLoading:f,placeholder:v,disabled:p,autoComplete:g,canClose:Z,autoFocusSearch:E,onChange:P,onReset:y,onFocus:C,onBlur:b})=>{let N=(0,a.sO)(null);e&&(N=e);const[w,k,I]=(0,s.Z)(h);(0,o.Z)(N,E,I),(0,a.d4)((()=>{N.current&&(h?N.current.focus():N.current.blur())}),[h,v]);const T=(0,i.Z)(),M=(0,a.I4)((e=>{if("ArrowDown"===e.key||"Enter"===e.key){const e=document.querySelector(`.${n} .ListItem-button`);e&&e.focus()}}),[n]);return a.ZP.createElement("div",{className:(0,r.Z)("SearchInput",m,w&&"has-focus"),dir:T.isRtl?"rtl":void 0},t,a.ZP.createElement("input",{ref:N,id:u,type:"text",dir:"auto",placeholder:v||T("Search"),className:"form-control",value:d,disabled:p,autoComplete:g,onChange:function(e){const{currentTarget:t}=e;P(t.value)},onFocus:function(){k(),C&&C()},onBlur:function(){I(),b&&b()},onKeyDown:M}),a.ZP.createElement("i",{className:"icon-search"}),f&&a.ZP.createElement(c.Z,null),!f&&(d||Z)&&y&&a.ZP.createElement(l.Z,{round:!0,size:"tiny",color:"translucent",onClick:y},a.ZP.createElement("span",{className:"icon-close"})))}))},126:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(1212),s=n(7204),i=n(6752);const o=({isOpen:e,isCustom:t,id:n,className:o,onClick:c,children:l})=>{const{shouldRender:d,transitionClassNames:u}=(0,r.Z)(e,void 0,void 0,!t&&void 0),m=(0,s.Z)(e),h=(0,s.Z)(l),f=(0,a.sO)();return m&&!e&&(f.current=h),d&&a.ZP.createElement("div",{id:n,className:(0,i.Z)(o,u),onClick:c},e?l():f.current())}},3321:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(6752);const s=(0,a.X$)((({id:e,name:t,value:n,label:s,checked:i=!1,disabled:o,inactive:c,noAnimation:l,onChange:d,onCheck:u})=>{const m=(0,a.I4)((e=>{d&&d(e),u&&u(e.currentTarget.checked)}),[d,u]),h=(0,r.Z)("Switcher",o&&"disabled",c&&"inactive",l&&"no-animation");return a.ZP.createElement("label",{className:h,title:s},a.ZP.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:i,disabled:o,onChange:m}),a.ZP.createElement("span",{className:"widget"}))}))},3133:(e,t,n)=>{n.d(t,{Z:()=>v});var a=n(4050),r=n(7361),s=n(1367),i=n(7204),o=n(8781),c=n(9107),l=n(6752),d=n(2972),u=n(2340);const m="Tab--active",h=(0,a.X$)((({className:e,title:t,isActive:n,badgeCount:r,isBadgeActive:s,previousActiveTab:i,onClick:o,clickArg:c})=>{const h=(0,a.sO)(null);return(0,a.d4)((()=>{if(n&&void 0===i&&h.current&&h.current.classList.add(m),!n||void 0===i)return;const e=h.current,t=e.parentElement.children[i];if(!t)return;const a=e.querySelector("i"),r=t.querySelector("i"),s=r.parentElement.offsetLeft-a.parentElement.offsetLeft,o=r.clientWidth/a.clientWidth;r.classList.remove("animate"),a.classList.remove("animate"),a.style.transform=`translate3d(${s}px, 0, 0) scale3d(${o}, 1, 1)`,(0,d.Z)(a),a.classList.add("animate"),a.style.transform="none",t.classList.remove(m),e.classList.add(m)}),[n,i]),a.ZP.createElement("div",{className:(0,l.Z)("Tab",e),onClick:()=>o(c),ref:h},a.ZP.createElement("span",null,(0,u.Z)(t),!!r&&a.ZP.createElement("span",{className:(0,l.Z)("badge",s&&"Tab__badge--active")},r),a.ZP.createElement("i",null)))})),f=r.cj?450:r.wZ?400:300,v=(0,a.X$)((({tabs:e,activeTab:t,big:n,onSwitchTab:r})=>{const l=(0,a.sO)(null),d=(0,i.Z)(t);(0,o.Z)(l.current),(0,a.d4)((()=>{const e=l.current,{scrollWidth:n,offsetWidth:a,scrollLeft:r}=e;if(n<=a)return;const i=e.childNodes[t];if(!i)return;const{offsetLeft:o,offsetWidth:c}=i,d=o-a/2+c/2;Math.abs(d-r)<16||(0,s.Z)(e,d,f)}),[t]);const u=(0,c.Z)();return a.ZP.createElement("div",{className:"TabList no-selection no-scrollbar "+(n?"big":""),ref:l,dir:u.isRtl?"rtl":void 0},e.map(((e,n)=>a.ZP.createElement(h,{key:e.title,title:u(e.title),isActive:n===t,badgeCount:e.badgeCount,isBadgeActive:e.isBadgeActive,previousActiveTab:d,onClick:r,clickArg:n}))))}))},2255:(e,t,n)=>{n.d(t,{Z:()=>f});var a=n(4050),r=n(5116),s=n(3716),i=n(6752),o=n(2972),c=n(1279),l=n(5326),d=n(7204),u=n(8674);const m=Symbol("CLEANED_UP"),h="Transition__slide--active",f=({ref:e,activeKey:t,name:n,direction:f="auto",renderCount:v,shouldRestoreHeight:p,shouldCleanup:g,cleanupExceptionKey:Z,id:E,className:P,onStart:y,onStop:C,children:b})=>{const{animationLevel:N}=(0,r.Rd)().settings.byKey,w=(0,a.sO)();let k=(0,a.sO)(null);e&&(k=e);const I=(0,a.sO)({}),T=(0,d.Z)(t),M=(0,l.Z)(),S=void 0!==T&&t!==T;!v&&S&&(I.current={[T]:I.current[T]}),I.current[t]=b,(0,a.bt)((()=>{function e(){!g||void 0!==Z&&Z===T||(I.current={[T]:m},M())}const a=k.current,r=a.children;if(1===r.length&&!S)return n.startsWith("slide-optimized")&&(r[0].style.transition="none",r[0].style.transform="translate3d(0, 0, 0)"),void r[0].classList.add(h);const i=Array.from(a.childNodes);if(!S||!i.length)return;w.current=t;const l=-1===f||"auto"===f&&T>t||"inverse"===f&&T{null==m||m(),p.style.transition="none",p.style.transform="translate3d(0, 0, 0)",v.style.transition="none",v.style.transform=`translate3d(${n?"-":""}100%, 0, 0)`,(0,o.Z)(v),p.style.transition="",p.style.transform=`translate3d(${n?"":"-"}100%, 0, 0)`,v.style.transition="",v.style.transform="translate3d(0, 0, 0)",p.classList.remove(h),v.classList.add(h),(0,c.L)(p,(()=>{r===i.current&&(p.style.transition="none",p.style.transform="",d&&(v.style.height="auto",l.style.height=`${v.clientHeight}px`),null==f||f(),g(),a())}))}))}(N,n,l,e,t,w,a,p,y,C,i[P],i[E]);if(a.classList.remove("animating"),a.classList.toggle("backwards",l),"none"===n||N===s.oB)return i.forEach(((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle(h,t===P))})),void e();i.forEach(((e,t)=>{e instanceof HTMLElement&&(e.classList.remove(h),e.classList.toggle("from",t===E),e.classList.toggle("through",t>E&&tP),e.classList.toggle("to",t===P))}));const b=(0,u.YW)();requestAnimationFrame((()=>{var r;function s(){requestAnimationFrame((()=>{if(t===w.current){if(a.classList.remove("animating","backwards"),i.forEach(((e,t)=>{e instanceof HTMLElement&&(e.classList.remove("from","through","to"),e.classList.toggle(h,t===P))})),p){const e=a.querySelector(`.${h}`);e&&(e.style.height="auto",a.style.height=`${e.clientHeight}px`)}null==C||C(),b(),e()}}))}a.classList.add("animating"),null==y||y();const o="mv-slide"===n?null===(r=i[P])||void 0===r?void 0:r.firstChild:"reveal"===n&&l?i[E]:i[P];o?(0,c.f)(o,s):s()}))}),[t,T,S,f,n,y,C,v,p,g,Z,N,M]),(0,a.bt)((()=>{if(p){const e=k.current,t=e.querySelector(`.${h}`)||e.querySelector(".from");t&&(t.style.height="auto",e.style.height=`${t.clientHeight}px`,e.style.flexBasis=`${t.clientHeight}px`)}}),[p,b]);const x=I.current,L=Object.keys(v?new Array(v).fill(void 0):x).map(Number).map((e=>{const n=x[e];return"function"==typeof n?a.ZP.createElement("div",{key:e,teactOrderKey:e},n(e===t,e===T,t)):void 0}));return a.ZP.createElement("div",{ref:k,id:E,className:(0,i.Z)("Transition",P,n),teactFastList:!v&&!g},L)}},3455:(e,t,n)=>{n.d(t,{fi:()=>s,Yy:()=>i,vb:()=>l,ZP:()=>h});var a=n(1090),r=n(782);const s=[{icon:"user",title:"FilterContacts",key:"contacts"},{icon:"non-contacts",title:"FilterNonContacts",key:"nonContacts"},{icon:"group",title:"FilterGroups",key:"groups"},{icon:"channel",title:"FilterChannels",key:"channels"},{icon:"bots",title:"FilterBots",key:"bots"}],i=[{icon:"mute",title:"FilterMuted",key:"excludeMuted"},{icon:"archive",title:"FilterArchived",key:"excludeArchived"},{icon:"readchats",title:"FilterRead",key:"excludeRead"}],o=["includedChatIds","bots","channels","groups","contacts","nonContacts"],c=["excludedChatIds","excludeArchived","excludeMuted","excludeRead"];function l(e,t,n){let a=[],s=[];if("included"===t){const{includedChatIds:t,...i}=n?e.includeFilters||{}:(0,r.ei)(e.folder,o);a=t||[],s=Object.keys(i).filter((e=>Boolean(i[e])))}else{const{excludedChatIds:t,...i}=n?e.excludeFilters||{}:(0,r.ei)(e.folder,c);a=t||[],s=Object.keys(i).filter((e=>Boolean(i[e])))}return{selectedChatIds:a,selectedChatTypes:s}}function d(e){if(e){const{includedChatIds:t,...n}=e;if(Object.values(n).filter(Boolean).length>1||null!=t&&t.length)return"";if(n.bots)return"Bots";if(n.groups)return"Groups";if(n.channels)return"Channels";if(n.contacts)return"Contacts";if(n.nonContacts)return"Non-Contacts"}return""}const u={mode:"create",chatFilter:"",folder:{title:"",includedChatIds:[],excludedChatIds:[]}},m=(e,t)=>{switch(t.type){case"setTitle":return{...e,folder:{...e.folder,title:t.payload},isTouched:!0};case"editIncludeFilters":return{...e,includeFilters:(0,r.ei)(e.folder,o)};case"editExcludeFilters":return{...e,excludeFilters:(0,r.ei)(e.folder,c)};case"setIncludeFilters":return{...e,includeFilters:t.payload,chatFilter:""};case"setExcludeFilters":return{...e,excludeFilters:t.payload,chatFilter:""};case"saveFilters":return e.includeFilters?{...e,folder:{...(0,r.CE)(e.folder,o),title:e.folder.title?e.folder.title:d(e.includeFilters),...e.includeFilters},includeFilters:void 0,chatFilter:"",isTouched:!0}:e.excludeFilters?{...e,folder:{...(0,r.CE)(e.folder,c),...e.excludeFilters},excludeFilters:void 0,chatFilter:"",isTouched:!0}:e;case"editFolder":{const{id:e,description:n,...a}=t.payload;return{mode:"edit",folderId:e,folder:a,chatFilter:""}}case"setChatFilter":return{...e,chatFilter:t.payload};case"setIsLoading":return{...e,isLoading:t.payload};case"setError":return{...e,error:t.payload};case"reset":return u;default:return e}},h=()=>(0,a.Z)(m,u)},3186:(e,t,n)=>{n.d(t,{Z:()=>d});var a=n(4050),r=n(5116),s=n(396),i=n(274),o=n(5266),c=n(9290),l=n(4532);const d=(e,t,n,d,u,m,h,f=!1,v,p,g=!1,Z=!1)=>{const E=(0,a.sO)(null),[P,y]=(0,a.eJ)(!1);let C=P;const[b,N]=(0,a.eJ)(0),w=(0,a.I4)((()=>{y(!1),p&&p()}),[p]);(0,c.Z)((()=>{E.current=(0,s.z2)(e,n,((e,a)=>{var s;switch(e){case"onPlay":{const{setVolume:e,setPlaybackRate:t,toggleMuted:a,proxy:s}=E.current;y(!0),(0,l.N)(m,function(e){let t={};if(e&&e.current){const{play:n,pause:a,setCurrentTime:s,proxy:i,requestNextTrack:o,requestPreviousTrack:c,isFirst:l,isLast:d}=e.current;t={play:()=>{n(i.src)},pause:()=>{a()},stop:()=>{a(),s(0),(0,r.uC)().closeAudioPlayer()},seekbackward:e=>{const t=e.seekOffset||10;s(Math.max(i.currentTime-t,0))},seekforward:e=>{const t=e.seekOffset||10;s(Math.min(i.currentTime+t,i.duration))},seekTo:e=>{e.seekTime&&s(e.seekTime)}},d()||(t.nexttrack=()=>{o()}),l()||(t.previoustrack=()=>{c()})}return t}(E)),(0,l.pC)("playing"),e((0,r.Rd)().audioPlayer.volume),a(!!(0,r.Rd)().audioPlayer.isMuted),"voice"===n&&t((0,r.Rd)().audioPlayer.playbackRate),(0,l.NS)({duration:s.duration||0,playbackRate:s.playbackRate,position:s.currentTime});break}case"onRateChange":{const{proxy:e}=E.current;(0,l.NS)({duration:e.duration||0,playbackRate:e.playbackRate,position:e.currentTime});break}case"onPause":y(!1),(0,l.pC)("paused");break;case"onTimeUpdate":{const{proxy:e}=E.current,n=e.duration&&Number.isFinite(e.duration)?e.duration:t;Z||N(e.currentTime/n);break}case"onEnded":(0,l.pC)("paused")}null==u||null===(s=u[e])||void 0===s||s.call(u,a)}),v,w);const{proxy:a}=E.current;P||a.paused||(y(!0),C=!0),h&&h(a)}),[e]),(0,a.d4)((()=>{P&&m&&(0,l.Ym)(m)}),[m,P]);const{play:k,pause:I,setCurrentTime:T,proxy:M,destroy:S,setVolume:x,stop:L,isFirst:$,isLast:A,requestNextTrack:O,requestPreviousTrack:F,setPlaybackRate:R,toggleMuted:D}=E.current,U=M.duration&&Number.isFinite(M.duration)?M.duration:t;(0,a.d4)((()=>{!U||(0,o.z)(M)||Z||N(M.currentTime/U)}),[U,b,M,Z]),(0,a.d4)((()=>()=>{S(g)}),[S,g]),(0,i.Z)((([e,t])=>{e===f&&d===t||M.src&&M.paused||f&&d&&!P&&k(d)}),[f,d,P,k,M.src,M.paused]);const B=(0,a.I4)((()=>{d&&k(d)}),[d,k]),X=(0,a.I4)((()=>{P?I():B()}),[I,B,P]),V=(0,a.I4)((e=>{T(e),U&&N(M.currentTime/U)}),[U,M,T]);return{isPlaying:C,playProgress:b,playPause:X,pause:I,play:B,stop:L,setCurrentTime:V,setVolume:x,audioProxy:M,duration:U,requestNextTrack:O,requestPreviousTrack:F,isFirst:$,isLast:A,setPlaybackRate:R,toggleMuted:D}}},2937:(e,t,n)=>{n.d(t,{Z:()=>l});var a=n(4050),r=n(6264),s=n(9290),i=n(1394),o=n(5326);const c=new Map;function l(e){const t=(0,a.sO)();let n=!1;(0,s.Z)((()=>{if(n=!0,t.current=void 0,!e)return;const a=new Image;if(a.src=e,!a.width)return;const s=(0,i.ao)(a);(0,r.Z)(s.getContext("2d"),0,0,s.width,s.height,2,2),t.current=s.toDataURL()}),[e]);const l=function(e,t=!1,n){const s=(0,a.sO)(e?c.get(e):void 0),l=(0,a.sO)(),d=(0,o.Z)();return l.current&&t&&(clearTimeout(l.current),l.current=void 0),(0,a.d4)((()=>{if(!e||s.current||t)return;const a=new Image;a.onload=()=>{const t=(0,i.ao)(a);(0,r.Z)(t.getContext("2d"),0,0,t.width,t.height,2,2);const n=t.toDataURL();s.current=n,d(),c.size>=1e3&&c.clear(),c.set(e,n)},n?l.current=window.setTimeout((()=>{a.src=e}),n):a.src=e}),[e,n,d,t]),s.current}(e||void 0,Boolean(t.current));return t.current||!n&&l||e||void 0}},2019:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(9118),s=n(5266);const i=(e=!1)=>{const[t,n]=(0,a.eJ)(!e),[i,o]=(0,a.eJ)(0),c=(0,a.Ye)((()=>(0,r.Ds)(n,200,!1,!0)),[]),l=(0,a.I4)((e=>{const t=e.currentTarget;(0,s.z)(t)||(t.buffered.length&&o(t.buffered.end(0)/t.duration),c(t.readyState>=3||t.currentTime>0))}),[c]);return{isBuffered:t,bufferedProgress:i,bufferingHandlers:{onLoadedData:l,onPlaying:l,onLoadStart:l,onPause:l,onTimeUpdate:l,onProgress:l},checkBuffering(e){c(e.readyState>=3)}}}},5866:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(6264),s=n(5326),i=n(7361);function o(e,t=!1,n){const o=(0,a.sO)(null),c=(0,s.Z)();return(0,a.d4)((()=>{const a=o.current;if(!e||!a||t)return;const s=new Image,c=()=>{a.width=s.width,a.height=s.height;const e=a.getContext("2d",{alpha:!1});i.vX&&(e.filter="blur(2px)"),e.drawImage(s,-4,-4,a.width+8,a.height+8),i.vX||(0,r.Z)(e,0,0,a.width,a.height,2,2)};s.onload=()=>{n?requestAnimationFrame(c):c()},s.src=e}),[o,e,c,t,n]),o}},1470:(e,t,n)=>{n.d(t,{Z:()=>c});var a=n(4050),r=n(5116),s=n(2858),i=n(782),o=n(9107);const c=({chat:e,user:t,handleDelete:n,handleChatFolderChange:c,folderId:l,isPinned:d,isMuted:u,canChangeFolder:m},h=!1)=>{const f=(0,o.Z)(),{isSelf:v}=t||{};return(0,a.Ye)((()=>{if(!e)return;const{toggleChatPinned:t,updateChatMutedState:a,toggleChatArchived:o,toggleChatUnread:p}=(0,r.uC)(),g=m?{title:f("ChatList.Filter.AddToFolder"),icon:"folder",handler:c}:void 0,Z=d?{title:f("UnpinFromTop"),icon:"unpin",handler:()=>t({id:e.id,folderId:l})}:{title:f("PinToTop"),icon:"pin",handler:()=>t({id:e.id,folderId:l})};if(h)return(0,i.oA)([Z,g]);const E=e.unreadCount||e.hasUnreadMark?{title:f("MarkAsRead"),icon:"readchats",handler:()=>p({id:e.id})}:{title:f("MarkAsUnread"),icon:"unread",handler:()=>p({id:e.id})},P=u?{title:f("ChatList.Unmute"),icon:"unmute",handler:()=>a({chatId:e.id,isMuted:!1})}:{title:f("ChatList.Mute"),icon:"mute",handler:()=>a({chatId:e.id,isMuted:!0})},y=(0,s.pE)(e)?{title:f("Unarchive"),icon:"unarchive",handler:()=>o({id:e.id})}:{title:f("Archive"),icon:"archive",handler:()=>o({id:e.id})},C={title:(0,s.YC)(e.id)?f("Delete"):f((0,s.cc)(e)?"DeleteChat":(0,s.eA)(e)?"LeaveChannel":"Group.LeaveGroup"),icon:"delete",destructive:!0,handler:n},b=void 0!==l;return(0,i.oA)([g,E,Z,!v&&P,!v&&!b&&y,C])}),[e,m,f,c,d,h,u,n,l,v])}},7240:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(7361);function s(e){e.stopImmediatePropagation(),e.preventDefault(),e.stopPropagation()}const i=(e,t,n,i)=>{const[o,c]=(0,a.eJ)(!1),[l,d]=(0,a.eJ)(void 0),u=(0,a.I4)((e=>{t||2!==e.button||e.target.classList.add("no-selection")}),[t]),m=(0,a.I4)((e=>{e.target.classList.remove("no-selection"),t||n&&e.target.matches("a[href]")||(e.preventDefault(),l||(c(!0),d({x:e.clientX,y:e.clientY})))}),[t,n,l]),h=(0,a.I4)((()=>{c(!1)}),[]),f=(0,a.I4)((()=>{d(void 0),document.body.classList.remove("no-selection")}),[]);return(0,a.d4)((()=>{if(t||!r.$b||i)return;const a=e.current;if(!a)return;let o;const u=()=>{o&&(clearTimeout(o),o=void 0)},m=e=>{t||r.wB&&window.document.body.classList.contains("enable-symbol-menu-transforms")||(u(),o=window.setTimeout((()=>(e=>{u();const{clientX:t,clientY:i,target:o}=e.touches[0];l||n&&o.matches("a[href]")||(a.addEventListener("touchend",(function e(t){a.removeEventListener("touchend",e,!0),s(t)}),!0),r.fl&&r.cj&&a.addEventListener("mousedown",(function e(t){a.removeEventListener("mousedown",e,!0),s(t)}),!0),document.body.classList.add("no-selection"),c(!0),d({x:t,y:i}))})(e)),200))};return a.addEventListener("touchstart",m,{passive:!0}),a.addEventListener("touchcancel",u,!0),a.addEventListener("touchend",u,!0),a.addEventListener("touchmove",u,{passive:!0}),()=>{u(),a.removeEventListener("touchstart",m),a.removeEventListener("touchcancel",u,!0),a.removeEventListener("touchend",u,!0),a.removeEventListener("touchmove",u)}}),[l,t,i,e,n]),{isContextMenuOpen:o,contextMenuPosition:l,handleBeforeContextMenu:u,handleContextMenu:m,handleContextMenuClose:h,handleContextMenuHide:f}}},3394:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050);const r={width:0,left:0,height:0,top:0};function s(e,t,n,s,i){const[o,c]=(0,a.eJ)("right"),[l,d]=(0,a.eJ)("bottom"),[u,m]=(0,a.eJ)(!1),[h,f]=(0,a.eJ)(""),[v,p]=(0,a.eJ)("opacity: 0;");return(0,a.d4)((()=>{const a=t();if(!e||!a)return;let{x:o,y:l}=e;const u=s(),h=n(),{extraPaddingX:v=0,extraTopPadding:g=0,marginSides:Z=0,extraMarginTop:E=0}=(null==i?void 0:i())||{},P=u?parseInt(getComputedStyle(u).marginTop,10)+E:void 0,y=u?{width:u.offsetWidth,height:u.offsetHeight+P}:r,C=h?h.getBoundingClientRect():r;let b;o+y.width+v0?(b="right",o-=3):(b="left",o=16),c(b),Z&&"right"===b&&o+v+Z>=C.width+C.left&&(o-=Z),Z&&"left"===b&&(o+v+Z+y.width>=C.width+C.left?o-=Z:o-Z<=0&&(o+=Z)),l+y.height{n.d(t,{Z:()=>s});var a=n(4050),r=n(9118);function s(e,t,n){return(0,a.Ye)((()=>(0,r.Ds)((e=>e()),e,!t,!n)),[e,t,n])}},5790:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(5116),s=n(9118);const i=(e,t,n,i)=>{const{loadMessage:o}=(0,r.uC)(),c=(0,a.Ye)((()=>{const n=(0,s.P2)(o,500,!0);return()=>{n({chatId:e,messageId:t,replyOriginForId:i})}}),[o,e,t,i]);(0,a.d4)((()=>{t&&!n&&c()}))}},8781:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=(e,t)=>{(0,a.d4)((()=>{if(e&&!t)return e.addEventListener("wheel",n,{passive:!0}),()=>{e.removeEventListener("wheel",n)};function n(t){t.deltaX||(e.scrollLeft+=t.deltaY/4)}}),[e,t])}},2515:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(7361);function s(e,t,n){(0,a.d4)((()=>{t?r.wB||setTimeout((()=>{requestAnimationFrame((()=>{e.current&&e.current.focus()}))}),500):(e.current&&e.current.blur(),n&&setTimeout(n,300))}),[e,t,n])}},3657:(e,t,n)=>{n.d(t,{S1:()=>i,_N:()=>o,Op:()=>c});var a=n(4050),r=n(9118),s=n(8674);function i({rootRef:e,throttleMs:t,debounceMs:n,shouldSkipFirst:i,margin:o,threshold:c,isDisabled:l},d){const u=(0,a.sO)(),m=(0,a.sO)(),h=(0,a.sO)(0),f=(0,a.sO)();m.current=d;const v=(0,a.I4)((()=>{h.current++}),[]),p=(0,a.I4)((()=>{h.current&&(h.current--,!h.current&&f.current&&(f.current(),f.current=void 0))}),[]);return(0,s.ZP)(v,p),(0,a.d4)((()=>{if(!l)return()=>{u.current&&(u.current.observer.disconnect(),u.current.callbacks.clear(),u.current=void 0)}}),[l]),{observe:(0,a.I4)(((a,s)=>{u.current||function(){const a=new Map,s=new Map,l=()=>{const e=Array.from(s.values());e.forEach((t=>{const n=a.get(t.target);n&&n(t,e)})),m.current&&m.current(e),s.clear()},d=t?r.P2:n?r.Ds:void 0,v=d?d(l,t||n,!i):l,p=new IntersectionObserver((e=>{e.forEach((e=>{s.set(e.target,e)})),h.current?f.current=()=>{v()}:v()}),{root:e.current,rootMargin:o?`${o}px`:void 0,threshold:c});u.current={observer:p,callbacks:a}}();const l=u.current;return l.observer.observe(a),s&&l.callbacks.set(a,s),()=>{s&&l.callbacks.delete(a),l.observer.unobserve(a)}}),[l]),freeze:v,unfreeze:p}}function o(e,t,n){(0,a.d4)((()=>t?t(e.current,n):void 0),[])}function c(e,t,n){const[r,s]=(0,a.eJ)(!t);return o(e,t,(e=>{s(e.isIntersecting),n&&n(e)})),r}},2357:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);const r=function(e,t,n=!1){const r=(0,a.sO)(e);(0,a.bt)((()=>{r.current=e}),[e]),(0,a.d4)((()=>{if(void 0===t)return;const e=setInterval((()=>r.current()),t);return n||r.current(),()=>clearInterval(e)}),[t,n])}},2645:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(7204);const s=(e,t,n)=>{const s=(0,r.Z)(t);return(0,a.bt)((()=>e(s||[])),t,n)}},692:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(1212);function r(e){const t=Boolean(e),{transitionClassNames:n}=(0,a.Z)(t,void 0,t,"slow");return n}},2566:(e,t,n)=>{n.d(t,{Z:()=>u});var a=n(4050),r=n(7361),s=n(6137),i=n(9118),o=n(647),c=n(5326),l=n(6926);const d={};function u(e,t=!1,n=s.IU.BlobUrl,u,m,h=!1){const f=e?o.UV(e):void 0,v=n===s.IU.Stream||r.I_&&n===s.IU.Progressive,p=(0,c.Z)(),g=(()=>{const e=(0,a.sO)();return e.current||(e.current=(0,l.Z)(d),d[e.current]=!0),e.current})(),[Z,E]=(0,a.eJ)(f&&!v?1:0),P=(0,a.sO)(),y=(0,a.Ye)((()=>(0,i.P2)((e=>{P.current&&(!m||Date.now()-P.current>m)&&E(e)}),500,!0)),[m]);return(0,a.d4)((()=>{!t&&e&&(f?v&&setTimeout((()=>{E(.75)}),1500):(E(0),P.current&&o.cC(y),P.current=Date.now(),o.he(e,n,h,y,g).then((()=>{const e=Date.now()-P.current;P.current=void 0,!m||e>=m?p():setTimeout(p,m-e)}))))}),[t,e,f,n,u,p,v,m,y,h,g]),(0,a.d4)((()=>{t&&P.current&&(o.cC(y),E(0),P.current=void 0)}),[y,t]),(0,a.d4)((()=>()=>{e&&o.Iq(e,g)}),[g,e]),{mediaData:f,loadProgress:Z}}},6503:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(4050),r=n(7361);let s;function i(e,t,n=250,i=!1){const o=(0,a.sO)(!1),c=(0,a.I4)((()=>{o.current=!0}),[]);return(0,a.d4)((()=>{s&&(clearTimeout(s),s=void 0),!e||r.$b||i||(s=window.setTimeout((()=>{o.current||t()}),2*n))}),[i,e,n,t]),[(0,a.I4)((()=>{o.current=!0}),[]),(0,a.I4)((()=>{o.current=!1,s&&(clearTimeout(s),s=void 0),s=window.setTimeout((()=>{o.current||t()}),n)}),[n,t]),c]}},2678:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(7204),s=n(5326),i=n(9290);function o(e,t){const n=(0,r.Z)(e,!0),o=(0,a.sO)(),c=(0,s.Z)(),l=null!=e,d=null!=n;return l&&o.current&&(clearTimeout(o.current),o.current=void 0),(0,i.Z)((()=>{t&&!l&&d&&!o.current&&(o.current=window.setTimeout((()=>{o.current=void 0,c()}),t))}),[e]),o.current&&t&&!l?n:e}},1090:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(4050);function r(e,t){const n=(0,a.sO)(e),[r,s]=(0,a.eJ)(t);return[r,(0,a.I4)((e=>{s((t=>n.current(t,e)))}),[])]}},6389:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(4050),r=n(5116),s=n(3716),i=n(9118);const o=(e,t)=>(0,a.Ye)((()=>(0,i.P2)((n=>{(0,r.uC)().sendMessageAction({chatId:e,threadId:t,action:n})}),s.o_)),[e,t])},971:(e,t,n)=>{n.d(t,{Y:()=>r});var a=n(4050);function r(e){const t=(0,a.sO)(e);return(0,a.d4)((()=>{t.current=e}),[e]),t}},6898:(e,t,n)=>{n.d(t,{Z:()=>s});var a=n(4050),r=n(9118);function s(e,t){(0,a.d4)((()=>{const t=e.current;return()=>{t&&(0,r.T2)((()=>{t.pause(),t.src="",t.load()}))}}),t)}},6264:(e,t,n)=>{n.d(t,{Z:()=>s});const a=[1,57,41,21,203,34,97,73,227,91,149,62,105,45,39,137,241,107,3,173,39,71,65,238,219,101,187,87,81,151,141,133,249,117,221,209,197,187,177,169,5,153,73,139,133,127,243,233,223,107,103,99,191,23,177,171,165,159,77,149,9,139,135,131,253,245,119,231,224,109,211,103,25,195,189,23,45,175,171,83,81,79,155,151,147,9,141,137,67,131,129,251,123,30,235,115,113,221,217,53,13,51,50,49,193,189,185,91,179,175,43,169,83,163,5,79,155,19,75,147,145,143,35,69,17,67,33,65,255,251,247,243,239,59,29,229,113,111,219,27,213,105,207,51,201,199,49,193,191,47,93,183,181,179,11,87,43,85,167,165,163,161,159,157,155,77,19,75,37,73,145,143,141,35,138,137,135,67,33,131,129,255,63,250,247,61,121,239,237,117,29,229,227,225,111,55,109,216,213,211,209,207,205,203,201,199,197,195,193,48,190,47,93,185,183,181,179,178,176,175,173,171,85,21,167,165,41,163,161,5,79,157,78,154,153,19,75,149,74,147,73,144,143,71,141,140,139,137,17,135,134,133,66,131,65,129,1],r=[0,9,10,10,14,12,14,14,16,15,16,15,16,15,15,17,18,17,12,18,16,17,17,19,19,18,19,18,18,19,19,19,20,19,20,20,20,20,20,20,15,20,19,20,20,20,21,21,21,20,20,20,21,18,21,21,21,21,20,21,17,21,21,21,22,22,21,22,22,21,22,21,19,22,22,19,20,22,22,21,21,21,22,22,22,18,22,22,21,22,22,23,22,20,23,22,22,23,23,21,19,21,21,21,23,23,23,22,23,23,21,23,22,23,18,22,23,20,22,23,23,23,21,22,20,22,21,22,24,24,24,24,24,22,21,24,23,23,24,21,24,23,24,22,24,24,22,24,24,22,23,24,24,24,20,23,22,23,24,24,24,24,24,24,24,23,21,23,22,23,24,24,24,22,24,24,24,23,22,24,24,25,23,25,25,23,24,25,25,24,22,25,25,25,24,23,24,25,25,25,25,25,25,25,25,25,25,25,25,23,25,23,24,25,25,25,25,25,25,25,25,25,24,22,25,25,23,25,25,20,24,25,24,25,25,22,24,25,24,25,24,25,25,24,25,25,25,25,22,25,25,25,24,25,24,25,18];function s(e,t,n,s,i,o,c){if(Number.isNaN(o)||o<1)return;o|=0,Number.isNaN(c)&&(c=1),(c|=0)>3&&(c=3),c<1&&(c=1);const l=e.getImageData(t,n,s,i),d=l.data;let u,m,h,f,v,p,g,Z,E,P,y,C,b=s-1,N=i-1,w=o+1,k=[],I=[],T=[],M=a[o],S=r[o],x=[],L=[];for(;c-- >0;){for(C=y=0,v=0;vb?b:p)<<2),u+=d[g++],m+=d[g++],h+=d[g++];for(f=0;f0?g<<2:0),Z=C+x[f],E=C+L[f],u+=d[Z++]-d[E++],m+=d[Z++]-d[E++],h+=d[Z++]-d[E++],y++;C+=s<<2}for(f=0;fN?0:s,u+=k[P],m+=I[P],h+=T[P];for(y=f<<2,v=0;v>>S,d[y+1]=m*M>>>S,d[y+2]=h*M>>>S,0==f&&(x[v]=((g=v+w)0?g*s:0),Z=f+x[v],E=f+L[v],u+=k[Z]-k[E],m+=I[Z]-I[E],h+=T[Z]-T[E],y+=s<<2}}e.putImageData(l,t,n)}},396:(e,t,n)=>{n.d(t,{Es:()=>p,z2:()=>g,An:()=>E});var a=n(5116),r=n(1713),s=n(7361),i=n(4753),o=n(5266),c=n(2858),l=n(9118),d=n(1638);const u=new Map;let m,h=[],f=[];function v(e,t){const n=m&&u.get(m);n&&(n.audio.pause(),n.audio.currentTime=0,n.onTrackChange&&n.onTrackChange());const s=Z(e,(0,a.Rd)().audioPlayer.origin||r.Cr.Inline,t);if(!s)return;if(!u.has(s))return void(0,a.uC)().openAudioPlayer((0,c.Ak)(P(s).messageKey));const o=u.get(s);o.onForcePlay&&o.onForcePlay(),m=s,o.audio.src&&(0,i.Z)(o.audio)}function p(){const e=m&&u.get(m);e&&e.audio.pause()}function g(e,t,n,p,g){if(!u.has(e)){const n=function(e,t,n,a){const r=new Audio;function s(t){return n=>{u.has(e)&&((0,o.z)(r)||u.get(e).handlers.forEach((e=>{e(t,n)})))}}return r.addEventListener("timeupdate",s("onTimeUpdate")),r.addEventListener("play",s("onPlay")),r.addEventListener("pause",s("onPause")),r.addEventListener("loadstart",s("onLoadStart")),r.addEventListener("loadeddata",s("onLoadedData")),r.addEventListener("playing",s("onPlaying")),r.addEventListener("ended",(()=>{u.has(e)&&((0,o.z)(r)||v(e))})),{audio:r,type:t,proxy:new Proxy(r,{get:(e,t)=>e[t]}),handlers:[],onForcePlay:n,onTrackChange:a}}(e,t,p,g);u.set(e,n),function(e,t){"audio"!==e.type||f.includes(t)||(f.push(t),f.sort(y)),"voice"!==e.type||h.includes(t)||(h.push(t),h.sort(y))}(n,e)}const{audio:E,proxy:C,handlers:b}=u.get(e);return b.push(n),{play(n){if(!E.paused)return;const l=m&&u.get(m);l&&m!==e&&(l.audio.pause(),l.audio.currentTime=0,(0,o.z)(l.audio)&&(l.audio.dataset.preventPlayAfterPatch="true"),l.onTrackChange&&l.onTrackChange()),m=e,E.src||(E.src=n,E.preload="auto",n.includes("/progressive/")&&s.s$&&(delete E.dataset.preventPlayAfterPatch,(0,o.B)(E))),(0,i.Z)(E),function(e,t){var n;if((0,a.Rd)().globalSearch.currentContent===r.nJ.Music)return;const{chatId:s}=(0,c.Ak)(P(t).messageKey),i=null===(n=(0,d.Bt)((0,a.Rd)()))||void 0===n?void 0:n.chatId,o=e=>e.startsWith(`msg${s}`)||i&&e.startsWith(`msg${i}`);"audio"===e&&(f=f.filter(o)),"voice"===e&&(h=h.filter(o))}(t,e)},pause(){m===e&&E.pause()},stop(){if(m===e){const e=E.src;E.pause(),(0,l.T2)((()=>{E.src="",E.src=e}))}},setCurrentTime(t){m===e&&(E.fastSeek?E.fastSeek(t):E.currentTime=t)},setVolume(t){m===e&&(E.volume=t,E.muted=!1)},setPlaybackRate(t){m===e&&(E.playbackRate=t)},toggleMuted(e){E.muted=void 0===e?!E.muted:e},proxy:C,requestNextTrack(){v(e)},isLast:()=>!Z(e,(0,a.Rd)().audioPlayer.origin),isFirst:()=>!Z(e,(0,a.Rd)().audioPlayer.origin,!0),requestPreviousTrack(){v(e,!0)},destroy(t=!1){const a=u.get(e);a&&(a.handlers=a.handlers.filter((e=>e!==n)),a.handlers.length||(a.audio.pause(),u.delete(e),t&&function(e,t){const n=e=>e!==t;"audio"===e.type&&(f=f.filter(n)),"voice"===e.type&&(h=h.filter(n))}(a,e),e===m&&(m=void 0)))}}}function Z(e,t=r.Cr.Inline,n){const a=function(e){switch(e.type){case"audio":return f;case"voice":return h;default:return}}(u.get(e));if(!a)return;if(t===r.Cr.Search){const t=a.indexOf(e);if(t<0)return;return a[t+(n?-1:1)]}const{chatId:s}=(0,c.Ak)(P(e).messageKey),i=a.filter((e=>e.startsWith(`msg${s}`))),o=i.indexOf(e);if(o<0)return;let l=t===r.Cr.Inline?-1:1;return n&&(l*=-1),i[o+l]}function E(e){return`${(0,c.Tp)(e)}-${e.date}`}function P(e){return{messageKey:e.match(/^msg(-?\d+)-(\d+)/)[0],date:Number(e.split("-").pop())}}function y(e,t){if(!e||!t)return 0;const{date:n,messageKey:a}=P(e),{date:r,messageKey:s}=P(t),i=r-n;return 0===i?s.localeCompare(a):i}},1174:(e,t,n)=>{n.d(t,{e:()=>r,s:()=>c});var a=n(7361);let r;function s(e,t){return t?Math.sqrt((t.pageX-e.pageX)**2+(t.pageY-e.pageY)**2):0}function i(e,t){return{x:(e.pageX+t.pageX)/2,y:(e.pageY+t.pageY)/2}}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Left=2]="Left",e[e.Right=3]="Right"}(r||(r={}));let o=0;function c(e,t){let n,c,l=!1,d=!1,u=0,m={x:window.innerWidth/2,y:window.innerHeight/2};function h(e){if(!t.excludedClosestSelector||!e.target.matches(t.excludedClosestSelector)&&!e.target.closest(t.excludedClosestSelector)){if(n=e,"mousedown"===e.type)document.addEventListener("mousemove",v),document.addEventListener("mouseup",f),t.onDoubleClick&&Date.now()-o<300&&t.onDoubleClick(e,{centerX:e.pageX,centerY:e.pageY}),o=Date.now();else if("touchstart"===e.type){const t=e.target;t.addEventListener("touchmove",v,{passive:!0}),t.addEventListener("touchend",f),t.addEventListener("touchcancel",f),"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY),2===e.touches.length&&(u=s(e.touches[0],e.touches[1]),m=i(e.touches[0],e.touches[1])))}document.body.classList.add("no-selection"),t.withCursor&&document.body.classList.add("cursor-grabbing"),t.onCapture&&t.onCapture(e)}}function f(e){n&&(t.withCursor&&document.body.classList.remove("cursor-grabbing"),document.body.classList.remove("no-selection"),document.removeEventListener("mouseup",f),document.removeEventListener("mousemove",v),n.target.removeEventListener("touchcancel",f),n.target.removeEventListener("touchend",f),n.target.removeEventListener("touchmove",v),n=void 0,a.cj&&t.selectorToPreventScroll&&Array.from(document.querySelectorAll(t.selectorToPreventScroll)).forEach((e=>{e.style.overflow=""})),l?t.onRelease&&t.onRelease(e):!t.onClick||"button"in e&&0!==e.button||t.onClick(e)),l=!1,d=!1,u=0,c=void 0,m={x:window.innerWidth/2,y:window.innerHeight/2}}function v(e){if(n){if("touchmove"===e.type&&"touches"in e&&(void 0===e.pageX&&(e.pageX=e.touches[0].pageX),void 0===e.pageY&&(e.pageY=e.touches[0].pageY),t.onZoom&&u>0&&2===e.touches.length)){const n=s(e.touches[0],e.touches[1]),a=i(e.touches[0],e.touches[1]),r=a.x-m.x,o=a.y-m.y,c=n/u;t.onZoom(e,{zoomFactor:c,initialCenterX:m.x,initialCenterY:m.y,dragOffsetX:r,dragOffsetY:o,currentCenterX:a.x,currentCenterY:a.y}),1!==c&&(l=!0)}const o=e.pageX-n.pageX,h=e.pageY-n.pageY;(Math.abs(o)>=15||Math.abs(h)>=15)&&(l=!0);let f=!1;t.onDrag&&(t.onDrag(e,n,{dragOffsetX:o,dragOffsetY:h}),f=!0),t.onSwipe&&!d&&(d=function(e,n,s){if(a.cj){const t=e.touches[0].pageX;if(t<=20||t>=window.innerWidth-20)return!1}const i=Math.abs(n),o=Math.abs(s);if(n&&s&&Math.max(i,o)/Math.min(i,o)<2)return!1;let l;if(i>=50?l="x":o>=50&&(l="y"),!l)return!1;if(c){if(c!==l)return!1}else c=l;return function(e,t,n,a,s){return"x"===t?s(e,n<0?r.Left:r.Right):"y"===t&&s(e,a<0?r.Up:r.Down)}(e,l,n,s,t.onSwipe)}(e,o,h),f=d),a.cj&&f&&t.selectorToPreventScroll&&Array.from(document.querySelectorAll(t.selectorToPreventScroll)).forEach((e=>{e.style.overflow="hidden"}))}}return e.addEventListener("mousedown",h),e.addEventListener("touchstart",h,{passive:!t.isNotPassive}),()=>{e.removeEventListener("mousedown",h),e.removeEventListener("touchstart",h)}}},1279:(e,t,n)=>{function a(e,t,n){s("transitionend",e,t,n)}function r(e,t,n){s("animationend",e,t,n)}function s(e,t,n,a){let r=!1;t.addEventListener(e,(function s(i){r||i.target!==i.currentTarget||a&&(i instanceof TransitionEvent&&i.propertyName===a||i instanceof AnimationEvent&&i.animationName===a)||(r=!0,t.removeEventListener(e,s),setTimeout((()=>{n()}),50))}))}n.d(t,{L:()=>a,f:()=>r})},3570:(e,t,n)=>{function a(e,t){return t-Math.floor(t/e)*e}n.d(t,{Z:()=>a})},539:(e,t,n)=>{n.d(t,{Z:()=>u,N:()=>m});var a=n(5116),r=n(1713),s=n(3716),i=n(7361),o=n(8674),c=n(9933),l=n(9118);let d=!1;function u(e,t,n,i=0,o=s.V$,c,l,d){const u=function(e,t,n=s.V$,a){const{offsetTop:i}=t,{scrollTop:o}=e;if(void 0===a){const t=i-e.scrollTop;if(t<-n)return o+(t+n);if(t>n)return o+(t-n)}else{if(a===r.fo.Up)return i+n;if(a===r.fo.Down)return Math.max(0,i-n)}return o}(e,t,o,c);c!==r.fo.Static?((0,a.Rd)().settings.byKey.animationLevel===s.oB&&(l=0),h(e,t,u,n,i,l,d)):h(e,t,u,n,i,0)}function m(){return d}function h(e,t,n,a,r=0,u,m){const{offsetTop:h,offsetHeight:p}=t,{scrollTop:g,offsetHeight:Z,scrollHeight:E}=e,P=m&&e.dataset.normalHeight?Number(e.dataset.normalHeight):Z;let y;switch(g!==n&&(e.scrollTop=n),a){case"start":y=h-r-n+(i.wZ?1:0);break;case"end":y=h+p+r-(n+P);break;case"nearest":case"center":case"centerOrTop":y=p0){const e=E-(n+P);y=Math.min(y,e)}if(0===y)return;const C=n+y;if(0===u)return void(e.scrollTop=C);d=!0;const b=Math.abs(y),N=b{(0,c.cK)((()=>{const t=Math.min((Date.now()-k)/w,1),n=y*(1-N(t));return e.scrollTop=Math.round(C-n),d=t<1,d||I(),d}))}))}function f(e){return 1-(1-e)**5}function v(e){return 1-(1-e)**3.5}},1367:(e,t,n)=>{n.d(t,{Z:()=>o});var a=n(5116),r=n(3716),s=n(9933),i=n(9118);function o(e,t,n=300){(0,a.Rd)().settings.byKey.animationLevel===r.oB&&(n=0),function(e,t,n){const a="rtl"===e.getAttribute("dir"),{scrollLeft:r,offsetWidth:o,scrollWidth:c}=e;let l=t-r;if(l<0){const e=-r*(a?-1:1);l=Math.max(l,e)}else if(l>0){const e=c-(r+o);l=Math.min(l,e)}if(0===l)return;const d=r+l;if(0===n)return void(e.scrollLeft=d);const u=Date.now();(0,i.T2)((()=>{(0,s.jt)((()=>{const t=Math.min((Date.now()-u)/n,1),a=l*(1-function(e){return 1-(1-e)**3.5}(t));return e.scrollLeft=Math.round(d-a),t<1}))}))}(e,t,n)}},5723:(e,t,n)=>{n.d(t,{Z:()=>r});var a=n(7361);function r(e,t){if(!t&&e===document.activeElement)return;const n=window.getSelection(),r=document.createRange(),s=e.lastChild||e;a.$b||s&&s.nodeValue?(r.selectNodeContents(s),r.collapse(!1),n.removeAllRanges(),n.addRange(r)):e.focus()}},7529:(e,t,n)=>{function a(e){const t="key"in e?e.key:e.code;return t.startsWith("Key")?t.slice(3).toLowerCase():t}n.d(t,{Z:()=>a})},4532:(e,t,n)=>{n.d(t,{N:()=>r,Ym:()=>s,Ay:()=>o,pC:()=>c,NS:()=>l,Of:()=>d});const a={play:void 0,pause:void 0,seekbackward:void 0,seekforward:void 0,previoustrack:void 0,nexttrack:void 0,stop:void 0,seekTo:void 0};function r(e,t){const{mediaSession:n}=window.navigator;n?(e&&s(e),t&&i(t)):console.warn("MediaSession API not supported in this browser")}function s(e){const{mediaSession:t}=window.navigator;t&&(t.metadata=null!=e?e:null)}function i(e){const{mediaSession:t}=window.navigator;t&&Object.entries({...a,...e}).forEach((([e,n])=>{try{t.setActionHandler(e,n)}catch(e){}}))}function o(){const{mediaSession:e}=window.navigator;var t;e&&(e.metadata=null,i(a),e.playbackState&&(e.playbackState="none"),null===(t=e.setPositionState)||void 0===t||t.call(e))}function c(e="none"){const{mediaSession:t}=window.navigator;t&&t.playbackState&&(t.playbackState=e)}function l(e){var t;if(!e||void 0===e.position||void 0===e.duration)return;e.position=Math.min(e.position,e.duration);const{mediaSession:n}=window.navigator;null==n||null===(t=n.setPositionState)||void 0===t||t.call(n,e)}function d({title:e,artist:t,album:n,artwork:a}){if("MediaMetadata"in window)return new window.MediaMetadata({title:e,artist:t,album:n,artwork:a})}},3099:(e,t,n)=>{n.d(t,{Z:()=>i});var a=n(6137),r=n(7361);const s={B:a.Vv.Bold,STRONG:a.Vv.Bold,I:a.Vv.Italic,EM:a.Vv.Italic,U:a.Vv.Underline,S:a.Vv.Strike,STRIKE:a.Vv.Strike,DEL:a.Vv.Strike,CODE:a.Vv.Code,PRE:a.Vv.Pre,BLOCKQUOTE:a.Vv.Blockquote};function i(e){const t=document.createElement("div");t.innerHTML=function(e){let t=e.slice(0);return r.op||(t=t.replace(/]+alt="([^"]+)"[^>]*>/gm,"$1")),t=t.replace(/<\/?span([^>]*)?>/g,""),t=t.replace(/ /g," "),t=t.replace(/
]*)?><\/div>/g,"\n"),t=t.replace(/]*)?>/g,"\n"),t=t.replace(/<\/div>(\s*)
/g,"\n"),t=t.replace(/
/g,"\n"),t=t.replace(/<\/div>/g,""),t=t.replace(/^`{3}(.*[\n\r][^]*?^)`{3}/gm,"
$1
"),t=t.replace(/[`]{3}([^`]+)[`]{3}/g,"
$1
"),t=t.replace(/[`]{1}([^`\n]+)[`]{1}/g,"$1"),t=t.replace(/(^|\s)(?!)(\s|$)/g,"$1$2$3"),t=t.replace(/(^|\s)(?!)(\s|$)/g,"$1$2$3"),t=t.replace(/(^|\s)(?!)(\s|$)/g,"$1$2$3"),t}(e);const n=t.innerText.trim().replace(/\u200b+/g,"");let i=0,o=0;const c=[];function l(e){const{index:t,entity:r}=function(e,t,n){const r=function(e){if(s[e.nodeName])return s[e.nodeName];if("A"===e.nodeName){const t=e;return t.dataset.entityType===a.Vv.MentionName?a.Vv.MentionName:t.dataset.entityType===a.Vv.Url?a.Vv.Url:t.href.startsWith("mailto:")?a.Vv.Email:t.href.startsWith("tel:")?a.Vv.Phone:t.href!==t.textContent?a.Vv.TextUrl:a.Vv.Url}return"SPAN"===e.nodeName?e.dataset.entityType:void 0}(e);if(!r||!e.textContent)return{index:n,entity:void 0};const i=t.indexOf(e.textContent,n),o=i>=0?i:n,c=t.substring(0,o).length,{length:l}=t.substring(o,o+e.textContent.length);let d,u;return r===a.Vv.TextUrl&&(d=e.href),r===a.Vv.MentionName&&(u=e.dataset.userId),{index:o,entity:{type:r,offset:c,length:l,...d&&{url:d},...u&&{userId:u}}}}(e,n,i);r?(i=t,c.push(r)):e.textContent&&(i+=e.textContent.length),e.hasChildNodes()&&o<=3&&(o+=1,Array.from(e.childNodes).forEach(l))}return Array.from(t.childNodes).forEach((e=>{o=1,l(e)})),{text:n,entities:c.length?c:void 0}}},5266:(e,t,n)=>{function a(e){e.dataset.patchedForSafari||(e.addEventListener("play",(()=>{const t=e.currentTime;e.dataset.patchForSafariInProgress="true",e.addEventListener("progress",(function n(){e.buffered.length&&(e.currentTime=e.duration-1,e.addEventListener("progress",(()=>{delete e.dataset.patchForSafariInProgress,e.currentTime=t,e.paused&&!e.dataset.preventPlayAfterPatch&&e.play()}),{once:!0}),e.removeEventListener("progress",n))}))}),{once:!0}),e.dataset.patchedForSafari="true")}function r(e){return Boolean(e.dataset.patchForSafariInProgress)}n.d(t,{B:()=>a,z:()=>r})},3227:(e,t,n)=>{n.d(t,{Z:()=>a});const a=e=>{e.stopPropagation(),e.preventDefault()}}}]); +//# sourceMappingURL=37.9e975e031ef296075093.js.map \ No newline at end of file diff --git a/dist/37.9e975e031ef296075093.js.map b/dist/37.9e975e031ef296075093.js.map new file mode 100644 index 000000000..a37090c8f --- /dev/null +++ b/dist/37.9e975e031ef296075093.js.map @@ -0,0 +1 @@ +{"version":3,"file":"37.9e975e031ef296075093.js","mappings":"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IAAK,IAAK,IAAK,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAE5qCC,EAAY,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IA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","sources":["webpack://telegram-t/./src/components/common/AnimatedEmoji.tsx","webpack://telegram-t/./src/components/common/Audio.tsx","webpack://telegram-t/./src/components/common/helpers/waveform.ts","webpack://telegram-t/./src/util/waveform.ts","webpack://telegram-t/./src/components/common/CalendarModal.async.tsx","webpack://telegram-t/./src/components/common/ChatExtra.tsx","webpack://telegram-t/./src/components/common/DeleteChatModal.tsx","webpack://telegram-t/./src/components/common/Document.tsx","webpack://telegram-t/./src/components/common/File.tsx","webpack://telegram-t/./src/components/common/GroupChatInfo.tsx","webpack://telegram-t/./src/components/common/LastMessageMeta.tsx","webpack://telegram-t/./src/components/common/Media.tsx","webpack://telegram-t/./src/components/common/MessageOutgoingStatus.tsx","webpack://telegram-t/./src/components/common/NothingFound.tsx","webpack://telegram-t/./src/components/common/Picker.tsx","webpack://telegram-t/./src/components/common/PickerSelectedItem.tsx","webpack://telegram-t/./src/components/common/PrivateChatInfo.tsx","webpack://telegram-t/./src/components/common/ProfilePhoto.tsx","webpack://telegram-t/./src/components/common/ProfileInfo.tsx","webpack://telegram-t/./src/components/common/hooks/usePhotosPreload.ts","webpack://telegram-t/./src/components/common/ReactionStaticEmoji.tsx","webpack://telegram-t/./src/components/common/StickerButton.tsx","webpack://telegram-t/./src/components/common/StickerSetModal.async.tsx","webpack://telegram-t/./src/components/common/TypingStatus.tsx","webpack://telegram-t/./src/components/common/VerifiedIcon.tsx","webpack://telegram-t/./src/components/common/WebLink.tsx","webpack://telegram-t/./src/components/common/helpers/mediaDimensions.ts","webpack://telegram-t/./src/components/common/helpers/renderMessageText.tsx","webpack://telegram-t/./src/components/common/hooks/useAnimatedEmoji.ts","webpack://telegram-t/./src/components/left/ChatFolderModal.async.tsx","webpack://telegram-t/./src/components/left/main/hooks/useChatAnimationType.ts","webpack://telegram-t/./src/components/left/main/Badge.tsx","webpack://telegram-t/./src/components/left/main/ChatCallStatus.tsx","webpack://telegram-t/./src/components/left/main/Chat.tsx","webpack://telegram-t/./src/components/left/main/EmptyFolder.tsx","webpack://telegram-t/./src/components/left/main/ChatList.tsx","webpack://telegram-t/./src/components/left/search/helpers/getSenderName.ts","webpack://telegram-t/./src/components/middle/composer/DropTarget.tsx","webpack://telegram-t/./src/components/middle/composer/DropArea.tsx","webpack://telegram-t/./src/components/middle/composer/EmojiTooltip.async.tsx","webpack://telegram-t/./src/components/middle/composer/MessageInput.tsx","webpack://telegram-t/./src/components/middle/composer/TextFormatter.tsx","webpack://telegram-t/./src/components/middle/composer/helpers/prepareForRegExp.ts","webpack://telegram-t/./src/components/middle/composer/helpers/selection.ts","webpack://telegram-t/./src/util/memoized.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useEmojiTooltip.ts","webpack://telegram-t/./src/components/middle/composer/hooks/useMentionTooltip.ts","webpack://telegram-t/./src/components/right/hooks/useAsyncRendering.ts","webpack://telegram-t/./src/components/ui/CheckboxGroup.tsx","webpack://telegram-t/./src/components/ui/FloatingActionButton.tsx","webpack://telegram-t/./src/components/ui/ListItem.tsx","webpack://telegram-t/./src/components/ui/Notification.tsx","webpack://telegram-t/./src/components/ui/ProgressSpinner.tsx","webpack://telegram-t/./src/components/ui/Radio.tsx","webpack://telegram-t/./src/components/ui/RadioGroup.tsx","webpack://telegram-t/./src/components/ui/RangeSlider.tsx","webpack://telegram-t/./src/components/ui/SearchInput.tsx","webpack://telegram-t/./src/components/ui/ShowTransition.tsx","webpack://telegram-t/./src/components/ui/Switcher.tsx","webpack://telegram-t/./src/components/ui/Tab.tsx","webpack://telegram-t/./src/components/ui/TabList.tsx","webpack://telegram-t/./src/components/ui/Transition.tsx","webpack://telegram-t/./src/hooks/reducers/useFoldersReducer.ts","webpack://telegram-t/./src/hooks/useAudioPlayer.ts","webpack://telegram-t/./src/hooks/useBlur.ts","webpack://telegram-t/./src/hooks/useBlurSync.ts","webpack://telegram-t/./src/hooks/useBuffering.ts","webpack://telegram-t/./src/hooks/useCanvasBlur.ts","webpack://telegram-t/./src/hooks/useChatContextActions.ts","webpack://telegram-t/./src/hooks/useContextMenuHandlers.ts","webpack://telegram-t/./src/hooks/useContextMenuPosition.ts","webpack://telegram-t/./src/hooks/useDebounce.ts","webpack://telegram-t/./src/hooks/useEnsureMessage.ts","webpack://telegram-t/./src/hooks/useHorizontalScroll.ts","webpack://telegram-t/./src/hooks/useInputFocusOnOpen.ts","webpack://telegram-t/./src/hooks/useIntersectionObserver.ts","webpack://telegram-t/./src/hooks/useInterval.ts","webpack://telegram-t/./src/hooks/useLayoutEffectWithPrevDeps.ts","webpack://telegram-t/./src/hooks/useMediaTransition.ts","webpack://telegram-t/./src/hooks/useUniqueId.ts","webpack://telegram-t/./src/hooks/useMediaWithLoadProgress.ts","webpack://telegram-t/./src/hooks/useMouseInside.ts","webpack://telegram-t/./src/hooks/usePrevDuringAnimation.ts","webpack://telegram-t/./src/hooks/useReducer.ts","webpack://telegram-t/./src/hooks/useSendMessageAction.ts","webpack://telegram-t/./src/hooks/useStateRef.ts","webpack://telegram-t/./src/hooks/useVideoCleanup.ts","webpack://telegram-t/./src/lib/fastBlur.js","webpack://telegram-t/./src/util/audioPlayer.ts","webpack://telegram-t/./src/util/captureEvents.ts","webpack://telegram-t/./src/util/cssAnimationEndListeners.ts","webpack://telegram-t/./src/util/cycleRestrict.ts","webpack://telegram-t/./src/util/fastSmoothScroll.ts","webpack://telegram-t/./src/util/fastSmoothScrollHorizontal.ts","webpack://telegram-t/./src/util/focusEditableElement.ts","webpack://telegram-t/./src/util/getKeyFromEvent.ts","webpack://telegram-t/./src/util/mediaSession.ts","webpack://telegram-t/./src/util/parseMessageInput.ts","webpack://telegram-t/./src/util/patchSafariProgressiveAudio.ts","webpack://telegram-t/./src/util/stopEvent.ts"],"sourcesContent":["import React, {\n FC, memo,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\nimport { ActiveEmojiInteraction } from '../../global/types';\n\nimport buildClassName from '../../util/buildClassName';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaTransition from '../../hooks/useMediaTransition';\nimport useAnimatedEmoji from './hooks/useAnimatedEmoji';\nimport { LIKE_STICKER_ID } from './helpers/mediaDimensions';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nimport './AnimatedEmoji.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n effect?: ApiSticker;\n isOwn?: boolean;\n soundId?: string;\n observeIntersection?: ObserveFn;\n size?: 'large' | 'medium' | 'small';\n lastSyncTime?: number;\n forceLoadPreview?: boolean;\n messageId?: number;\n chatId?: string;\n activeEmojiInteraction?: ActiveEmojiInteraction;\n};\n\nconst QUALITY = 1;\n\nconst AnimatedEmoji: FC = ({\n sticker,\n effect,\n isOwn,\n soundId,\n size = 'medium',\n observeIntersection,\n lastSyncTime,\n forceLoadPreview,\n messageId,\n chatId,\n activeEmojiInteraction,\n}) => {\n const {\n markAnimationLoaded,\n isAnimationLoaded,\n ref,\n width,\n style,\n handleClick,\n playKey,\n } = useAnimatedEmoji(size, chatId, messageId, soundId, activeEmojiInteraction, isOwn, undefined, effect?.emoji);\n\n const localMediaHash = `sticker${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail?.dataUri;\n const previewBlobUrl = useMedia(\n `${localMediaHash}?size=m`,\n !isIntersecting && !forceLoadPreview,\n ApiMediaFormat.BlobUrl,\n lastSyncTime,\n );\n const transitionClassNames = useMediaTransition(previewBlobUrl);\n\n const mediaData = useMedia(localMediaHash, !isIntersecting, ApiMediaFormat.Lottie, lastSyncTime);\n const isMediaLoaded = Boolean(mediaData);\n\n return (\n \n {!isAnimationLoaded && thumbDataUri && (\n \"\"\n )}\n {!isAnimationLoaded && previewBlobUrl && (\n \"\"\n )}\n {isMediaLoaded && localMediaHash && (\n \n )}\n
\n );\n};\n\nexport default memo(AnimatedEmoji);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiVoice,\n} from '../../api/types';\nimport { AudioOrigin, ISettings } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { formatMediaDateTime, formatMediaDuration, formatPastTimeShort } from '../../util/dateFormat';\nimport {\n getMediaDuration,\n getMediaTransferState,\n getMessageMediaFormat,\n getMessageMediaHash,\n isMessageLocal,\n isOwnMessage,\n} from '../../modules/helpers';\nimport { MAX_EMPTY_WAVEFORM_POINTS, renderWaveform } from './helpers/waveform';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport { getFileSizeString } from './helpers/documentInfo';\nimport { decodeWaveform, interpolateArray } from '../../util/waveform';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useBuffering from '../../hooks/useBuffering';\nimport useAudioPlayer from '../../hooks/useAudioPlayer';\nimport useLang, { LangFn } from '../../hooks/useLang';\nimport { captureEvents } from '../../util/captureEvents';\nimport useMedia from '../../hooks/useMedia';\nimport { makeTrackId } from '../../util/audioPlayer';\nimport { getTranslation } from '../../util/langProvider';\n\nimport Button from '../ui/Button';\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './Audio.scss';\n\ntype OwnProps = {\n theme: ISettings['theme'];\n message: ApiMessage;\n senderTitle?: string;\n uploadProgress?: number;\n origin: AudioOrigin;\n date?: number;\n lastSyncTime?: number;\n className?: string;\n isSelectable?: boolean;\n isSelected?: boolean;\n isDownloading: boolean;\n onPlay: (messageId: number, chatId: string) => void;\n onReadMedia?: () => void;\n onCancelUpload?: () => void;\n onDateClick?: (messageId: number, chatId: string) => void;\n};\n\nconst AVG_VOICE_DURATION = 10;\nconst MIN_SPIKES = IS_SINGLE_COLUMN_LAYOUT ? 20 : 25;\nconst MAX_SPIKES = IS_SINGLE_COLUMN_LAYOUT ? 50 : 75;\n// This is needed for browsers requiring user interaction before playing.\nconst PRELOAD = true;\n\nconst Audio: FC = ({\n theme,\n message,\n senderTitle,\n uploadProgress,\n origin,\n date,\n lastSyncTime,\n className,\n isSelectable,\n isSelected,\n isDownloading,\n onPlay,\n onReadMedia,\n onCancelUpload,\n onDateClick,\n}) => {\n const { content: { audio, voice, video }, isMediaUnread } = message;\n const isVoice = Boolean(voice || video);\n const isSeeking = useRef(false);\n const playStateBeforeSeeking = useRef(false);\n // eslint-disable-next-line no-null/no-null\n const seekerRef = useRef(null);\n const lang = useLang();\n const { isRtl } = lang;\n const dispatch = getDispatch();\n\n const [isActivated, setIsActivated] = useState(false);\n const shouldLoad = (isActivated || PRELOAD) && lastSyncTime;\n const coverHash = getMessageMediaHash(message, 'pictogram');\n const coverBlobUrl = useMedia(coverHash, false, ApiMediaFormat.BlobUrl);\n\n const mediaData = useMedia(\n getMessageMediaHash(message, 'inline'),\n !shouldLoad,\n getMessageMediaFormat(message, 'inline'),\n );\n\n const { loadProgress: downloadProgress } = useMediaWithLoadProgress(\n getMessageMediaHash(message, 'download'),\n !isDownloading,\n );\n\n const handleForcePlay = useCallback(() => {\n setIsActivated(true);\n onPlay(message.id, message.chatId);\n }, [message, onPlay]);\n\n const handleTrackChange = useCallback(() => {\n setIsActivated(false);\n }, []);\n\n const {\n isBuffered, bufferedProgress, bufferingHandlers, checkBuffering,\n } = useBuffering();\n\n const {\n isPlaying, playProgress, playPause, play, pause, setCurrentTime, duration,\n } = useAudioPlayer(\n makeTrackId(message),\n getMediaDuration(message)!,\n isVoice ? 'voice' : 'audio',\n mediaData,\n bufferingHandlers,\n undefined,\n checkBuffering,\n isActivated,\n handleForcePlay,\n handleTrackChange,\n isMessageLocal(message),\n );\n\n const isOwn = isOwnMessage(message);\n const waveformCanvasRef = useWaveformCanvas(theme, voice, (isMediaUnread && !isOwn) ? 1 : playProgress, isOwn);\n\n const withSeekline = isPlaying || (playProgress > 0 && playProgress < 1);\n\n useEffect(() => {\n setIsActivated(isPlaying);\n }, [isPlaying]);\n\n const isLoadingForPlaying = isActivated && !isBuffered;\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(\n message,\n uploadProgress || downloadProgress,\n isLoadingForPlaying || isDownloading,\n );\n\n const {\n shouldRender: shouldRenderSpinner,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring);\n\n const shouldRenderCross = shouldRenderSpinner && (isLoadingForPlaying || isUploading);\n\n const handleButtonClick = useCallback(() => {\n if (isUploading) {\n onCancelUpload?.();\n return;\n }\n\n if (!isPlaying) {\n onPlay(message.id, message.chatId);\n }\n\n getDispatch().setAudioPlayerOrigin({ origin });\n setIsActivated(!isActivated);\n playPause();\n }, [isUploading, isPlaying, isActivated, playPause, onCancelUpload, onPlay, message.id, message.chatId, origin]);\n\n useEffect(() => {\n if (onReadMedia && isMediaUnread && (isPlaying || isDownloading)) {\n onReadMedia();\n }\n }, [isPlaying, isMediaUnread, onReadMedia, isDownloading]);\n\n const handleDownloadClick = useCallback(() => {\n if (isDownloading) {\n dispatch.cancelMessageMediaDownload({ message });\n } else {\n dispatch.downloadMessageMedia({ message });\n }\n }, [dispatch, isDownloading, message]);\n\n const handleSeek = useCallback((e: MouseEvent | TouchEvent) => {\n if (isSeeking.current && seekerRef.current) {\n const { width, left } = seekerRef.current.getBoundingClientRect();\n const clientX = e instanceof MouseEvent ? e.clientX : e.targetTouches[0].clientX;\n e.stopPropagation(); // Prevent Slide-to-Reply activation\n // Prevent track skipping while seeking near end\n setCurrentTime(Math.max(Math.min(duration * ((clientX - left) / width), duration - 0.1), 0.001));\n }\n }, [duration, setCurrentTime]);\n\n const handleStartSeek = useCallback((e: MouseEvent | TouchEvent) => {\n if (e instanceof MouseEvent && e.button === 2) return;\n isSeeking.current = true;\n playStateBeforeSeeking.current = isPlaying;\n pause();\n handleSeek(e);\n }, [handleSeek, pause, isPlaying]);\n\n const handleStopSeek = useCallback(() => {\n isSeeking.current = false;\n if (playStateBeforeSeeking.current) play();\n }, [play]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n useEffect(() => {\n if (!seekerRef.current || !withSeekline) return undefined;\n return captureEvents(seekerRef.current, {\n onCapture: handleStartSeek,\n onRelease: handleStopSeek,\n onClick: handleStopSeek,\n onDrag: handleSeek,\n });\n }, [withSeekline, handleStartSeek, handleSeek, handleStopSeek]);\n\n function renderFirstLine() {\n if (isVoice) {\n return senderTitle || 'Voice';\n }\n\n const { title, fileName } = audio!;\n\n return title || fileName;\n }\n\n function renderSecondLine() {\n if (isVoice) {\n return (\n
\n {formatMediaDuration((voice || video)!.duration)}\n
\n );\n }\n\n const { performer } = audio!;\n\n return (\n
\n {formatMediaDuration(duration)}\n \n {performer && {renderText(performer)}}\n {performer && senderTitle && }\n {senderTitle && {renderText(senderTitle)}}\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Audio',\n className,\n isOwn && origin === AudioOrigin.Inline && 'own',\n (origin === AudioOrigin.Search || origin === AudioOrigin.SharedMedia) && 'bigger',\n isSelected && 'audio-is-selected',\n );\n\n const buttonClassNames = ['toggle-play'];\n if (shouldRenderCross) {\n buttonClassNames.push('loading');\n } else if (isPlaying) {\n buttonClassNames.push('pause');\n } else if (!isPlaying) {\n buttonClassNames.push('play');\n }\n\n const contentClassName = buildClassName('content', withSeekline && 'with-seekline');\n\n function renderWithTitle() {\n return (\n <>\n
\n
\n

{renderText(renderFirstLine())}

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

{renderText(title || fileName)}

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

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

\n
\n );\n}\n\nfunction useWaveformCanvas(\n theme: ISettings['theme'],\n voice?: ApiVoice,\n playProgress = 0,\n isOwn = false,\n) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n\n const { data: spikes, peak } = useMemo(() => {\n if (!voice) {\n return undefined;\n }\n\n const { waveform, duration } = voice;\n if (!waveform) {\n return {\n data: new Array(Math.min(duration, MAX_EMPTY_WAVEFORM_POINTS)).fill(0),\n peak: 0,\n };\n }\n\n const durationFactor = Math.min(duration / AVG_VOICE_DURATION, 1);\n const spikesCount = Math.round(MIN_SPIKES + (MAX_SPIKES - MIN_SPIKES) * durationFactor);\n const decodedWaveform = decodeWaveform(new Uint8Array(waveform));\n\n return interpolateArray(decodedWaveform, spikesCount);\n }, [voice]) || {};\n\n useLayoutEffect(() => {\n const canvas = canvasRef.current;\n\n if (!canvas || !spikes || peak === undefined) {\n return;\n }\n\n const fillColor = theme === 'dark' ? '#494A78' : '#ADD3F7';\n const fillOwnColor = theme === 'dark' ? '#B7ABED' : '#AEDFA4';\n const progressFillColor = theme === 'dark' ? '#8774E1' : '#3390EC';\n const progressFillOwnColor = theme === 'dark' ? '#FFFFFF' : '#4FAE4E';\n\n renderWaveform(canvas, spikes, playProgress, {\n peak,\n fillStyle: isOwn ? fillOwnColor : fillColor,\n progressFillStyle: isOwn ? progressFillOwnColor : progressFillColor,\n });\n }, [isOwn, peak, playProgress, spikes, theme]);\n\n return canvasRef;\n}\n\nfunction renderSeekline(\n playProgress: number,\n bufferedProgress: number,\n seekerRef: React.Ref,\n) {\n return (\n }\n >\n \n \n \n \n \n \n \n \n \n
\n );\n}\n\nexport default memo(Audio);\n","type IWaveformProps = {\n peak: number;\n fillStyle: string;\n progressFillStyle: string;\n};\n\nexport const MAX_EMPTY_WAVEFORM_POINTS = 30;\nconst SPIKE_WIDTH = 2;\nconst SPIKE_STEP = 4;\nconst SPIKE_RADIUS = 1;\nconst HEIGHT = 23;\n\nexport function renderWaveform(\n canvas: HTMLCanvasElement,\n spikes: number[],\n progress: number,\n {\n peak, fillStyle, progressFillStyle,\n }: IWaveformProps,\n) {\n const width = spikes.length * SPIKE_STEP;\n const height = HEIGHT;\n\n canvas.width = width * 2;\n canvas.height = height * 2;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext('2d')!;\n ctx.scale(2, 2);\n\n spikes.forEach((item, i) => {\n ctx.globalAlpha = (i / spikes.length >= progress) ? 0.5 : 1;\n ctx.fillStyle = progress > i / spikes.length ? progressFillStyle : fillStyle;\n const spikeHeight = Math.max(2, HEIGHT * (item / Math.max(1, peak)));\n roundedRectangle(ctx, i * SPIKE_STEP, height, SPIKE_WIDTH, spikeHeight, SPIKE_RADIUS);\n ctx.fill();\n });\n}\n\nfunction roundedRectangle(\n ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number,\n) {\n if (width < 2 * radius) {\n radius = width / 2;\n }\n if (height < 2 * radius) {\n radius = height / 2;\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + width, y, x + width, y - height, radius);\n ctx.arcTo(x + width, y - height, x, y - height, radius);\n ctx.arcTo(x, y - height, x, y, radius);\n ctx.arcTo(x, y, x + width, y, radius);\n ctx.closePath();\n}\n","/* eslint-disable no-bitwise */\n\n// eslint-disable-next-line max-len\n// Ref: https://github.com/telegramdesktop/tdesktop/blob/0743e71ab6b928d2ee5bae1aed991849b1e2b291/Telegram/SourceFiles/data/data_document.cpp#L1018\nexport function decodeWaveform(encoded5bit: Uint8Array) {\n const bitsCount = encoded5bit.length * 8;\n const valuesCount = Math.floor(bitsCount / 5);\n if (!valuesCount) {\n return [];\n }\n\n // Read each 5 bit of encoded5bit as 0-31 unsigned char.\n // We count the index of the byte in which the desired 5-bit sequence starts.\n // And then we read a uint16 starting from that byte to guarantee to get all of those 5 bits.\n //\n // BUT! if it is the last byte we have, we're not allowed to read a uint16 starting with it.\n // Because it will be an overflow (we'll access one byte after the available memory).\n // We see, that only the last 5 bits could start in the last available byte and be problematic.\n // So we read in a general way all the entries in a general way except the last one.\n const result = Array(valuesCount);\n const bitsData = encoded5bit;\n for (let i = 0, l = valuesCount - 1; i !== l; ++i) {\n const byteIndex = Math.floor((i * 5) / 8);\n const bitShift = Math.floor((i * 5) % 8);\n const value = bitsData[byteIndex] + (bitsData[byteIndex + 1] << 8);\n result[i] = ((value >> bitShift) & 0x1F);\n }\n const lastByteIndex = Math.floor(((valuesCount - 1) * 5) / 8);\n const lastBitShift = Math.floor(((valuesCount - 1) * 5) % 8);\n const lastValue = bitsData[lastByteIndex] + (bitsData[lastByteIndex + 1] << 8);\n result[valuesCount - 1] = (lastValue >> lastBitShift) & 0x1F;\n\n return result;\n}\n\nexport function interpolateArray(data: number[], fitCount: number) {\n let peak = 0;\n const newData = new Array(fitCount);\n const springFactor = data.length / fitCount;\n const leftFiller = data[0];\n const rightFiller = data[data.length - 1];\n for (let i = 0; i < fitCount; i++) {\n const idx = Math.floor(i * springFactor);\n const val = ((data[idx - 1] ?? leftFiller) + (data[idx] ?? leftFiller) + (data[idx + 1] ?? rightFiller)) / 3;\n newData[i] = val;\n if (peak < val) {\n peak = val;\n }\n }\n return { data: newData, peak };\n}\n","import React, { 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,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\nimport { ApiChat, ApiCountryCode, ApiUser } from '../../api/types';\n\nimport {\n selectChat, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../../modules/selectors';\nimport {\n getChatDescription, getChatLink, getHasAdminRight, isChatChannel, isUserId, isUserRightBanned, selectIsChatMuted,\n} from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport { copyTextToClipboard } from '../../util/clipboard';\nimport { formatPhoneNumberWithCode } from '../../util/phoneNumber';\nimport useLang from '../../hooks/useLang';\n\nimport ListItem from '../ui/ListItem';\nimport Switcher from '../ui/Switcher';\n\ntype OwnProps = {\n chatOrUserId: string;\n forceShowSelf?: boolean;\n};\n\ntype StateProps =\n {\n user?: ApiUser;\n chat?: ApiChat;\n canInviteUsers?: boolean;\n isMuted?: boolean;\n phoneCodeList: ApiCountryCode[];\n }\n & Pick;\n\nconst ChatExtra: FC = ({\n lastSyncTime,\n user,\n chat,\n forceShowSelf,\n canInviteUsers,\n isMuted,\n phoneCodeList,\n}) => {\n const {\n loadFullUser,\n showNotification,\n updateChatMutedState,\n } = getDispatch();\n\n const {\n id: userId,\n fullInfo,\n username,\n phoneNumber,\n isSelf,\n } = user || {};\n const { id: chatId } = chat || {};\n const lang = useLang();\n\n useEffect(() => {\n if (lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [loadFullUser, userId, lastSyncTime]);\n\n const handleNotificationChange = useCallback(() => {\n updateChatMutedState({ chatId, isMuted: !isMuted });\n }, [chatId, isMuted, updateChatMutedState]);\n\n if (!chat || chat.isRestricted || (isSelf && !forceShowSelf)) {\n return undefined;\n }\n\n function copy(text: string, entity: string) {\n copyTextToClipboard(text);\n showNotification({ message: `${entity} was copied` });\n }\n\n const formattedNumber = phoneNumber && formatPhoneNumberWithCode(phoneCodeList, phoneNumber);\n const link = getChatLink(chat);\n const description = (fullInfo?.bio) || getChatDescription(chat);\n\n return (\n
\n {formattedNumber && !!formattedNumber.length && (\n copy(formattedNumber, lang('Phone'))}>\n {formattedNumber}\n {lang('Phone')}\n \n )}\n {username && (\n copy(`@${username}`, lang('Username'))}\n >\n {renderText(username)}\n {lang('Username')}\n \n )}\n {description && !!description.length && (\n \n \n {renderText(description, ['br', 'links', 'emoji'])}\n \n {lang(userId ? 'UserBio' : 'Info')}\n \n )}\n {(canInviteUsers || !username) && link && (\n copy(link, lang('SetUrlPlaceholder'))}\n >\n
{link}
\n {lang('SetUrlPlaceholder')}\n \n )}\n {!forceShowSelf && (\n \n {lang('Notifications')}\n \n \n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n const { lastSyncTime, countryList: { phoneCodes: phoneCodeList } } = global;\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isUserId(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n const isMuted = chat && selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n\n const canInviteUsers = chat && !user && (\n (!isChatChannel(chat) && !isUserRightBanned(chat, 'inviteUsers'))\n || getHasAdminRight(chat, 'inviteUsers')\n );\n\n return {\n lastSyncTime, phoneCodeList, chat, user, canInviteUsers, isMuted,\n };\n },\n)(ChatExtra));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\n\nimport { selectIsChatWithSelf, selectUser } from '../../modules/selectors';\nimport {\n isUserId,\n isUserBot,\n getUserFirstOrLastName,\n getPrivateChatUserId,\n isChatBasicGroup,\n isChatSuperGroup,\n isChatChannel,\n getChatTitle,\n} from '../../modules/helpers';\nimport useLang from '../../hooks/useLang';\nimport renderText from './helpers/renderText';\n\nimport Avatar from './Avatar';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nimport './DeleteChatModal.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n chat: ApiChat;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n};\n\ntype StateProps = {\n isChannel: boolean;\n isChatWithSelf?: boolean;\n isBot?: boolean;\n isPrivateChat: boolean;\n isBasicGroup: boolean;\n isSuperGroup: boolean;\n currentUserId: string | undefined;\n canDeleteForAll?: boolean;\n contactName?: string;\n};\n\nconst DeleteChatModal: FC = ({\n isOpen,\n chat,\n isChannel,\n isPrivateChat,\n isChatWithSelf,\n isBot,\n isBasicGroup,\n isSuperGroup,\n currentUserId,\n canDeleteForAll,\n contactName,\n onClose,\n onCloseAnimationEnd,\n}) => {\n const {\n leaveChannel,\n deleteHistory,\n deleteChannel,\n deleteChatUser,\n blockContact,\n } = getDispatch();\n\n const lang = useLang();\n const chatTitle = getChatTitle(lang, chat);\n\n const handleDeleteMessageForAll = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n\n onClose();\n }, [deleteHistory, chat.id, onClose]);\n\n const handleDeleteAndStop = useCallback(() => {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: true });\n blockContact({ contactId: chat.id, accessHash: chat.accessHash });\n\n onClose();\n }, [deleteHistory, chat.id, chat.accessHash, blockContact, onClose]);\n\n const handleDeleteChat = useCallback(() => {\n if (isPrivateChat) {\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if (isBasicGroup) {\n deleteChatUser({ chatId: chat.id, userId: currentUserId });\n deleteHistory({ chatId: chat.id, shouldDeleteForAll: false });\n } else if ((isChannel || isSuperGroup) && !chat.isCreator) {\n leaveChannel({ chatId: chat.id });\n } else if ((isChannel || isSuperGroup) && chat.isCreator) {\n deleteChannel({ chatId: chat.id });\n }\n onClose();\n }, [\n isPrivateChat,\n isBasicGroup,\n isChannel,\n isSuperGroup,\n currentUserId,\n chat.isCreator,\n chat.id,\n onClose,\n deleteHistory,\n deleteChatUser,\n leaveChannel,\n deleteChannel,\n ]);\n\n function renderHeader() {\n return (\n
\n \n

{lang(renderTitle())}

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

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

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

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

;\n }\n\n return

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

;\n }\n\n function renderActionText() {\n if (isChannel && !chat.isCreator) {\n return 'LeaveChannel';\n }\n if (isChannel && chat.isCreator) {\n return 'Chat.Input.Delete';\n }\n\n if (isBasicGroup || isSuperGroup) {\n return 'Group.LeaveGroup';\n }\n\n return canDeleteForAll ? 'ChatList.DeleteForCurrentUser' : 'Delete';\n }\n\n return (\n \n {renderMessage()}\n {isBot && (\n \n )}\n {canDeleteForAll && (\n \n )}\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { chat }): StateProps => {\n const isPrivateChat = isUserId(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, chat.id);\n const user = isPrivateChat && selectUser(global, getPrivateChatUserId(chat)!);\n const isBot = user && isUserBot(user) && !chat.isSupport;\n const canDeleteForAll = (isPrivateChat && !isChatWithSelf && !isBot);\n const contactName = isPrivateChat\n ? getUserFirstOrLastName(selectUser(global, getPrivateChatUserId(chat)!))\n : undefined;\n\n return {\n isPrivateChat,\n isChatWithSelf,\n isBot,\n isChannel: isChatChannel(chat),\n isBasicGroup: isChatBasicGroup(chat),\n isSuperGroup: isChatSuperGroup(chat),\n currentUserId: global.currentUserId,\n canDeleteForAll,\n contactName,\n };\n },\n)(DeleteChatModal));\n","import React, {\n FC, useCallback, memo, useRef, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { getDocumentExtension, getDocumentHasPreview } from './helpers/documentInfo';\nimport {\n getMediaTransferState,\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n isMessageDocumentVideo,\n} from '../../modules/helpers';\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport useMediaWithLoadProgress from '../../hooks/useMediaWithLoadProgress';\nimport useMedia from '../../hooks/useMedia';\nimport useFlag from '../../hooks/useFlag';\n\nimport File from './File';\n\ntype OwnProps = {\n message: ApiMessage;\n observeIntersection?: ObserveFn;\n smaller?: boolean;\n isSelected?: boolean;\n isSelectable?: boolean;\n canAutoLoad?: boolean;\n uploadProgress?: number;\n withDate?: boolean;\n datetime?: number;\n className?: string;\n sender?: string;\n autoLoadFileMaxSizeMb?: number;\n isDownloading: boolean;\n onCancelUpload?: () => void;\n onMediaClick?: () => void;\n onDateClick?: (messageId: number, chatId: string) => void;\n};\n\nconst BYTES_PER_MB = 1024 * 1024;\n\nconst Document: FC = ({\n message,\n observeIntersection,\n smaller,\n canAutoLoad,\n autoLoadFileMaxSizeMb,\n uploadProgress,\n withDate,\n datetime,\n className,\n sender,\n isSelected,\n isSelectable,\n onCancelUpload,\n onMediaClick,\n onDateClick,\n isDownloading,\n}) => {\n const dispatch = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const document = message.content.document!;\n const { fileName, size, timestamp } = document;\n const extension = getDocumentExtension(document) || '';\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n const [wasIntersected, markIntersected] = useFlag();\n useEffect(() => {\n if (isIntersecting) {\n markIntersected();\n }\n }, [isIntersecting, markIntersected]);\n\n // Auto-loading does not use global download manager because requires additional click to save files locally\n const [isLoadAllowed, setIsLoadAllowed] = useState(\n canAutoLoad && (!autoLoadFileMaxSizeMb || size <= autoLoadFileMaxSizeMb * BYTES_PER_MB),\n );\n\n const shouldDownload = Boolean(isDownloading || (isLoadAllowed && wasIntersected));\n\n const documentHash = getMessageMediaHash(message, 'download');\n const { loadProgress: downloadProgress, mediaData } = useMediaWithLoadProgress(\n documentHash, !shouldDownload, undefined, undefined, undefined, true,\n );\n const isLoaded = Boolean(mediaData);\n\n const {\n isUploading, isTransferring, transferProgress,\n } = getMediaTransferState(message, uploadProgress || downloadProgress, shouldDownload && !isLoaded);\n\n const hasPreview = getDocumentHasPreview(document);\n const thumbDataUri = hasPreview ? getMessageMediaThumbDataUri(message) : undefined;\n const localBlobUrl = hasPreview ? document.previewBlobUrl : undefined;\n const previewData = useMedia(getMessageMediaHash(message, 'pictogram'), !isIntersecting);\n\n const withMediaViewer = onMediaClick && Boolean(document.mediaType);\n\n const handleClick = useCallback(() => {\n if (isUploading) {\n if (onCancelUpload) {\n onCancelUpload();\n }\n return;\n }\n\n if (isDownloading) {\n dispatch.cancelMessageMediaDownload({ message });\n return;\n }\n\n if (isTransferring) {\n setIsLoadAllowed(false);\n return;\n }\n\n if (withMediaViewer) {\n onMediaClick!();\n } else {\n dispatch.downloadMessageMedia({ message });\n }\n }, [\n isUploading, isDownloading, isTransferring, withMediaViewer, onCancelUpload, dispatch, message, onMediaClick,\n ]);\n\n const handleDateClick = useCallback(() => {\n onDateClick!(message.id, message.chatId);\n }, [onDateClick, message.id, message.chatId]);\n\n return (\n \n );\n};\n\nexport default memo(Document);\n","import { RefObject } from 'react';\nimport React, { FC, memo, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useMediaTransition from '../../hooks/useMediaTransition';\nimport buildClassName from '../../util/buildClassName';\nimport { formatMediaDateTime, formatPastTimeShort } from '../../util/dateFormat';\nimport { getColorFromExtension, getFileSizeString } from './helpers/documentInfo';\nimport { getDocumentThumbnailDimensions } from './helpers/mediaDimensions';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport ProgressSpinner from '../ui/ProgressSpinner';\nimport Link from '../ui/Link';\n\nimport './File.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n name: string;\n extension?: string;\n size: number;\n timestamp?: number;\n sender?: string;\n thumbnailDataUri?: string;\n previewData?: string;\n className?: string;\n smaller?: boolean;\n isTransferring?: boolean;\n isUploading?: boolean;\n isSelectable?: boolean;\n isSelected?: boolean;\n transferProgress?: number;\n actionIcon?: string;\n onClick?: () => void;\n onDateClick?: (e: React.MouseEvent) => void;\n};\n\nconst File: FC = ({\n ref,\n name,\n size,\n extension = '',\n timestamp,\n sender,\n thumbnailDataUri,\n previewData,\n className,\n smaller,\n isTransferring,\n isUploading,\n isSelectable,\n isSelected,\n transferProgress,\n actionIcon,\n onClick,\n onDateClick,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef(null);\n if (ref) {\n elementRef = ref;\n }\n\n const transitionClassNames = useMediaTransition(previewData);\n const {\n shouldRender: shouldSpinnerRender,\n transitionClassNames: spinnerClassNames,\n } = useShowTransition(isTransferring, undefined, true);\n\n const color = getColorFromExtension(extension);\n const sizeString = getFileSizeString(size);\n\n const { width, height } = getDocumentThumbnailDimensions(smaller);\n\n const fullClassName = buildClassName(\n 'File',\n className,\n smaller && 'smaller',\n onClick && !isUploading && 'interactive',\n isSelected && 'file-is-selected',\n );\n\n return (\n
\n {isSelectable && (\n
\n {isSelected && }\n
\n )}\n
\n {thumbnailDataUri || previewData ? (\n
\n \n \n
\n ) : (\n
\n {extension.length <= 4 && (\n {extension}\n )}\n
\n )}\n {shouldSpinnerRender && (\n
\n \n
\n )}\n {onClick && (\n \n )}\n
\n
\n
{renderText(name)}
\n
\n \n {isTransferring && transferProgress ? `${Math.round(transferProgress * 100)}%` : sizeString}\n \n {sender && {renderText(sender)}}\n {!sender && timestamp && (\n <>\n \n {formatMediaDateTime(lang, timestamp * 1000, true)}\n \n )}\n
\n
\n {sender && timestamp && (\n {formatPastTimeShort(lang, timestamp * 1000)}\n )}\n
\n );\n};\n\nexport default memo(File);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiTypingStatus } from '../../api/types';\nimport { GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport {\n getChatTypeString,\n getChatTitle,\n isChatSuperGroup,\n} from '../../modules/helpers';\nimport { selectChat, selectChatMessages, selectChatOnlineCount } from '../../modules/selectors';\nimport renderText from './helpers/renderText';\nimport useLang, { LangFn } from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n chatId: string;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'small' | 'medium' | 'large' | 'jumbo';\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n withChatType?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps =\n {\n chat?: ApiChat;\n onlineCount?: number;\n areMessagesLoaded: boolean;\n }\n & Pick;\n\nconst GroupChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n withChatType,\n noRtl,\n chat,\n onlineCount,\n areMessagesLoaded,\n lastSyncTime,\n}) => {\n const {\n loadFullChat,\n openMediaViewer,\n } = getDispatch();\n\n const isSuperGroup = chat && isChatSuperGroup(chat);\n const { id: chatId, isMin, isRestricted } = chat || {};\n\n useEffect(() => {\n if (chatId && !isMin && withFullInfo && lastSyncTime) {\n loadFullChat({ chatId });\n }\n }, [chatId, isMin, lastSyncTime, withFullInfo, loadFullChat, isSuperGroup]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (chat && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: chat.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [chat, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (withUpdatingStatus && !areMessagesLoaded && !isRestricted) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!chat) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n if (withChatType) {\n return (\n
{lang(getChatTypeString(chat))}
\n );\n }\n\n const handle = withUsername ? chat.username : undefined;\n const groupStatus = getGroupStatus(lang, chat);\n const onlineStatus = onlineCount ? `, ${lang('OnlineCount', onlineCount, 'i')}` : undefined;\n\n return (\n
\n {handle && {handle}}\n {groupStatus}\n {onlineStatus && {onlineStatus}}\n
\n );\n }\n\n return (\n
\n \n
\n
\n

{renderText(getChatTitle(lang, chat))}

\n {chat.isVerified && }\n
\n {renderStatusOrTyping()}\n
\n
\n );\n};\n\nfunction getGroupStatus(lang: LangFn, chat: ApiChat) {\n const chatTypeString = lang(getChatTypeString(chat));\n const { membersCount } = chat;\n\n if (chat.isRestricted) {\n return chatTypeString === 'Channel' ? 'channel is inaccessible' : 'group is inaccessible';\n }\n\n if (!membersCount) {\n return chatTypeString;\n }\n\n return chatTypeString === 'Channel'\n ? lang('Subscribers', membersCount, 'i')\n : lang('Members', membersCount, 'i');\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { lastSyncTime } = global;\n const chat = selectChat(global, chatId);\n const onlineCount = chat ? selectChatOnlineCount(global, chat) : undefined;\n const areMessagesLoaded = Boolean(selectChatMessages(global, chatId));\n\n return {\n lastSyncTime, chat, onlineCount, areMessagesLoaded,\n };\n },\n)(GroupChatInfo));\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiMessageOutgoingStatus } from '../../api/types';\n\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport MessageOutgoingStatus from './MessageOutgoingStatus';\n\nimport './LastMessageMeta.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n outgoingStatus?: ApiMessageOutgoingStatus;\n};\n\nconst LastMessageMeta: FC = ({ message, outgoingStatus }) => {\n const lang = useLang();\n return (\n
\n {outgoingStatus && (\n \n )}\n {formatPastTimeShort(lang, message.date * 1000)}\n
\n );\n};\n\nexport default memo(LastMessageMeta);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage } from '../../api/types';\n\nimport { formatMediaDuration } from '../../util/dateFormat';\nimport stopEvent from '../../util/stopEvent';\nimport {\n getMessageMediaHash,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n} from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport useMedia from '../../hooks/useMedia';\nimport useMediaTransition from '../../hooks/useMediaTransition';\n\nimport './Media.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n idPrefix?: string;\n isProtected?: boolean;\n onClick?: (messageId: number, chatId: string) => void;\n};\n\nconst Media: FC = ({\n message,\n idPrefix = 'shared-media',\n isProtected,\n onClick,\n}) => {\n const handleClick = useCallback(() => {\n onClick!(message.id, message.chatId);\n }, [message.id, message.chatId, onClick]);\n\n const thumbDataUri = getMessageMediaThumbDataUri(message);\n const mediaBlobUrl = useMedia(getMessageMediaHash(message, 'pictogram'));\n const transitionClassNames = useMediaTransition(mediaBlobUrl);\n\n const video = getMessageVideo(message);\n\n return (\n
\n \"\"\n \n {video && {video.isGif ? 'GIF' : formatMediaDuration(video.duration)}}\n {isProtected && }\n
\n );\n};\n\nexport default memo(Media);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport { ApiMessageOutgoingStatus } from '../../api/types';\n\nimport Transition from '../ui/Transition';\n\nimport './MessageOutgoingStatus.scss';\n\ntype OwnProps = {\n status: ApiMessageOutgoingStatus;\n};\n\nenum Keys {\n failed, pending, succeeded, read,\n}\n\nconst MessageOutgoingStatus: FC = ({ status }) => {\n return (\n
\n \n {() => (\n \n )}\n \n
\n );\n};\n\nexport default memo(MessageOutgoingStatus);\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './NothingFound.scss';\n\ninterface OwnProps {\n text?: string;\n description?: string;\n}\n\nconst DEFAULT_TEXT = 'Nothing found.';\n\nconst NothingFound: FC = ({ text = DEFAULT_TEXT, description }) => {\n const lang = useLang();\n const { transitionClassNames } = useShowTransition(true);\n\n return (\n
\n {text}\n {description &&

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

}\n
\n );\n};\n\nexport default memo(NothingFound);\n","import React, {\n FC, useCallback, useRef, useEffect, memo,\n} from '../../lib/teact/teact';\n\nimport { isUserId } from '../../modules/helpers';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport ListItem from '../ui/ListItem';\nimport PrivateChatInfo from './PrivateChatInfo';\nimport GroupChatInfo from './GroupChatInfo';\nimport PickerSelectedItem from './PickerSelectedItem';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Loading from '../ui/Loading';\n\nimport './Picker.scss';\n\ntype OwnProps = {\n itemIds: string[];\n selectedIds: string[];\n filterValue?: string;\n filterPlaceholder?: string;\n notFoundText?: string;\n searchInputId?: string;\n isLoading?: boolean;\n noScrollRestore?: boolean;\n onSelectedIdsChange: (ids: string[]) => void;\n onFilterChange: (value: string) => void;\n onLoadMore?: () => void;\n};\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\n\nconst MAX_FULL_ITEMS = 10;\nconst ALWAYS_FULL_ITEMS_COUNT = 5;\n\nconst Picker: FC = ({\n itemIds,\n selectedIds,\n filterValue,\n filterPlaceholder,\n notFoundText,\n searchInputId,\n isLoading,\n noScrollRestore,\n onSelectedIdsChange,\n onFilterChange,\n onLoadMore,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n const shouldMinimize = selectedIds.length > MAX_FULL_ITEMS;\n\n useEffect(() => {\n setTimeout(() => {\n requestAnimationFrame(() => {\n inputRef.current!.focus();\n });\n }, FOCUS_DELAY_MS);\n }, []);\n\n const handleItemClick = useCallback((id: string) => {\n const newSelectedIds = [...selectedIds];\n if (newSelectedIds.includes(id)) {\n newSelectedIds.splice(newSelectedIds.indexOf(id), 1);\n } else {\n newSelectedIds.push(id);\n }\n onSelectedIdsChange(newSelectedIds);\n onFilterChange('');\n }, [selectedIds, onSelectedIdsChange, onFilterChange]);\n\n const handleFilterChange = useCallback((e: React.ChangeEvent) => {\n const { value } = e.currentTarget;\n onFilterChange(value);\n }, [onFilterChange]);\n\n const [viewportIds, getMore] = useInfiniteScroll(onLoadMore, itemIds, Boolean(filterValue));\n\n const lang = useLang();\n\n return (\n
\n
\n {selectedIds.map((id, i) => (\n \n ))}\n \n
\n\n {viewportIds?.length ? (\n \n {viewportIds.map((id) => (\n handleItemClick(id)}\n ripple\n >\n \n {isUserId(id) ? (\n \n ) : (\n \n )}\n \n ))}\n \n ) : !isLoading && viewportIds && !viewportIds.length ? (\n

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

\n ) : (\n \n )}\n
\n );\n};\n\nexport default memo(Picker);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport { selectChat, selectUser } from '../../modules/selectors';\nimport { getChatTitle, getUserFirstOrLastName, isUserId } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\n\nimport './PickerSelectedItem.scss';\n\ntype OwnProps = {\n chatOrUserId?: string;\n icon?: string;\n title?: string;\n isMinimized?: boolean;\n canClose?: boolean;\n onClick: (arg: any) => void;\n clickArg: any;\n className?: string;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n user?: ApiUser;\n};\n\nconst PickerSelectedItem: FC = ({\n icon,\n title,\n isMinimized,\n canClose,\n onClick,\n clickArg,\n chat,\n user,\n className,\n}) => {\n const lang = useLang();\n\n let iconElement: any;\n let titleText: any;\n\n if (icon && title) {\n iconElement = (\n
\n \n
\n );\n\n titleText = title;\n } else if (chat || user) {\n iconElement = (\n \n );\n\n const name = !chat || (user && !user.isSelf)\n ? getUserFirstOrLastName(user)\n : getChatTitle(lang, chat, user);\n\n titleText = name ? renderText(name) : undefined;\n }\n\n const fullClassName = buildClassName(\n 'PickerSelectedItem',\n className,\n isMinimized && 'minimized',\n canClose && 'closeable',\n );\n\n return (\n onClick(clickArg)}\n title={isMinimized ? titleText : undefined}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {iconElement}\n {!isMinimized && (\n
\n {titleText}\n
\n )}\n {canClose && (\n
\n \n
\n )}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatOrUserId }): StateProps => {\n if (!chatOrUserId) {\n return {};\n }\n\n const chat = chatOrUserId ? selectChat(global, chatOrUserId) : undefined;\n const user = isUserId(chatOrUserId) ? selectUser(global, chatOrUserId) : undefined;\n\n return {\n chat,\n user,\n };\n },\n)(PickerSelectedItem));\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, useEffect, useCallback, memo,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus, ApiUserStatus } from '../../api/types';\nimport { GlobalState } from '../../global/types';\nimport { MediaViewerOrigin } from '../../types';\n\nimport { selectChatMessages, selectUser, selectUserStatus } from '../../modules/selectors';\nimport { getUserFullName, getUserStatus, isUserOnline } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport Avatar from './Avatar';\nimport VerifiedIcon from './VerifiedIcon';\nimport TypingStatus from './TypingStatus';\n\ntype OwnProps = {\n userId: string;\n typingStatus?: ApiTypingStatus;\n avatarSize?: 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n forceShowSelf?: boolean;\n status?: string;\n withMediaViewer?: boolean;\n withUsername?: boolean;\n withFullInfo?: boolean;\n withUpdatingStatus?: boolean;\n noStatusOrTyping?: boolean;\n noRtl?: boolean;\n};\n\ntype StateProps =\n {\n user?: ApiUser;\n userStatus?: ApiUserStatus;\n isSavedMessages?: boolean;\n areMessagesLoaded: boolean;\n serverTimeOffset: number;\n }\n & Pick;\n\nconst PrivateChatInfo: FC = ({\n typingStatus,\n avatarSize = 'medium',\n status,\n withMediaViewer,\n withUsername,\n withFullInfo,\n withUpdatingStatus,\n noStatusOrTyping,\n noRtl,\n user,\n userStatus,\n isSavedMessages,\n areMessagesLoaded,\n lastSyncTime,\n serverTimeOffset,\n}) => {\n const {\n loadFullUser,\n openMediaViewer,\n } = getDispatch();\n\n const { id: userId } = user || {};\n const fullName = getUserFullName(user);\n\n useEffect(() => {\n if (withFullInfo && lastSyncTime && userId) {\n loadFullUser({ userId });\n }\n }, [userId, loadFullUser, lastSyncTime, withFullInfo]);\n\n const handleAvatarViewerOpen = useCallback((e: ReactMouseEvent, hasPhoto: boolean) => {\n if (user && hasPhoto) {\n e.stopPropagation();\n openMediaViewer({\n avatarOwnerId: user.id,\n origin: avatarSize === 'jumbo' ? MediaViewerOrigin.ProfileAvatar : MediaViewerOrigin.MiddleHeaderAvatar,\n });\n }\n }, [user, avatarSize, openMediaViewer]);\n\n const lang = useLang();\n\n if (!user) {\n return undefined;\n }\n\n function renderStatusOrTyping() {\n if (status) {\n return (\n {status}\n );\n }\n\n if (withUpdatingStatus && !areMessagesLoaded) {\n return (\n {lang('Updating')}\n );\n }\n\n if (!user) {\n return undefined;\n }\n\n if (typingStatus) {\n return ;\n }\n\n return (\n
\n {withUsername && user.username && {user.username}}\n {getUserStatus(lang, user, userStatus, serverTimeOffset)}\n
\n );\n }\n\n return (\n
\n \n
\n {isSavedMessages ? (\n
\n

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

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

{lang('SavedMessages')}

\n
\n ) : (\n
\n

{fullName && renderText(fullName)}

\n {isVerifiedIconShown && }\n
\n )}\n {!isSavedMessages && renderStatus()}\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { userId, forceShowSelf }): StateProps => {\n const { connectionState, serverTimeOffset } = global;\n const user = selectUser(global, userId);\n const userStatus = selectUserStatus(global, userId);\n const chat = selectChat(global, userId);\n const isSavedMessages = !forceShowSelf && user && user.isSelf;\n const { animationLevel } = global.settings.byKey;\n\n return {\n connectionState,\n user,\n userStatus,\n chat,\n isSavedMessages,\n animationLevel,\n serverTimeOffset,\n };\n },\n)(ProfileInfo));\n","import {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser,\n} from '../../../api/types';\nimport { useEffect } from '../../../lib/teact/teact';\nimport * as mediaLoader from '../../../util/mediaLoader';\n\nconst PHOTOS_TO_PRELOAD = 4;\n\nexport default function usePhotosPreload(\n profile: ApiUser | ApiChat | undefined,\n photos: ApiPhoto[],\n currentIndex: number,\n) {\n useEffect(() => {\n photos.slice(currentIndex, currentIndex + PHOTOS_TO_PRELOAD).forEach((photo) => {\n const mediaData = mediaLoader.getFromMemory(`photo${photo.id}?size=c`);\n if (!mediaData) {\n mediaLoader.fetch(`photo${photo.id}?size=c`, ApiMediaFormat.BlobUrl);\n }\n });\n }, [currentIndex, photos]);\n}\n","import { RefObject } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\nimport { getGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\n\nimport useMedia from '../../hooks/useMedia';\nimport buildClassName from '../../util/buildClassName';\n\nimport './ReactionStaticEmoji.scss';\n\ntype OwnProps = {\n reaction: string;\n ref?: RefObject;\n className?: string;\n};\n\nconst ReactionStaticEmoji: FC = ({\n reaction,\n ref,\n className,\n}) => {\n const staticIconId = getGlobal().availableReactions?.find((l) => l.reaction === reaction)?.staticIcon?.id;\n const mediaData = useMedia(`document${staticIconId}`, !staticIconId, ApiMediaFormat.BlobUrl);\n\n return (\n \n );\n};\n\nexport default memo(ReactionStaticEmoji);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { ApiMediaFormat, ApiSticker } from '../../api/types';\n\nimport { useIsIntersecting, ObserveFn } from '../../hooks/useIntersectionObserver';\nimport useMedia from '../../hooks/useMedia';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\n\nimport AnimatedSticker from './AnimatedSticker';\nimport Button from '../ui/Button';\n\nimport './StickerButton.scss';\n\ntype OwnProps = {\n sticker: ApiSticker;\n size: number;\n observeIntersection: ObserveFn;\n noAnimate?: boolean;\n title?: string;\n className?: string;\n onClick?: (arg: any) => void;\n clickArg?: any;\n onUnfaveClick?: (sticker: ApiSticker) => void;\n};\n\nconst StickerButton: FC = ({\n sticker, size, observeIntersection, noAnimate, title, className, onClick, clickArg, onUnfaveClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const localMediaHash = `sticker${sticker.id}`;\n const stickerSelector = `sticker-button-${sticker.id}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const thumbDataUri = sticker.thumbnail ? sticker.thumbnail.dataUri : undefined;\n const previewBlobUrl = useMedia(`${localMediaHash}?size=m`, !isIntersecting, ApiMediaFormat.BlobUrl);\n\n const shouldPlay = isIntersecting && !noAnimate;\n const lottieData = useMedia(sticker.isAnimated && localMediaHash, !shouldPlay, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markLoaded, unmarkLoaded] = useFlag(Boolean(lottieData));\n const canAnimatedPlay = isAnimationLoaded && shouldPlay;\n\n const { transitionClassNames: previewTransitionClassNames } = useShowTransition(\n Boolean(previewBlobUrl || canAnimatedPlay),\n undefined,\n undefined,\n 'slow',\n );\n\n // To avoid flickering\n useEffect(() => {\n if (!shouldPlay) {\n unmarkLoaded();\n }\n }, [unmarkLoaded, shouldPlay]);\n\n function handleClick() {\n if (onClick) {\n onClick(clickArg);\n }\n }\n\n function handleUnfaveClick(e: ReactMouseEvent) {\n e.stopPropagation();\n e.preventDefault();\n\n onUnfaveClick!(sticker);\n }\n\n const fullClassName = buildClassName(\n 'StickerButton',\n onClick && 'interactive',\n sticker.isAnimated && 'animated',\n stickerSelector,\n className,\n );\n\n const style = thumbDataUri && !canAnimatedPlay ? `background-image: url('${thumbDataUri}');` : '';\n\n return (\n \n {!canAnimatedPlay && (\n // eslint-disable-next-line jsx-a11y/alt-text\n \n )}\n {shouldPlay && lottieData && (\n \n )}\n {onUnfaveClick && (\n \n \n \n )}\n \n );\n};\n\nexport default memo(StickerButton);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './StickerSetModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst StickerSetModalAsync: FC = (props) => {\n const { isOpen } = props;\n const StickerSetModal = useModuleLoader(Bundles.Extra, 'StickerSetModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return StickerSetModal ? : undefined;\n};\n\nexport default memo(StickerSetModalAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiUser, ApiTypingStatus } from '../../api/types';\n\nimport { selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from './helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport './TypingStatus.scss';\n\ntype OwnProps = {\n typingStatus: ApiTypingStatus;\n};\n\ntype StateProps = {\n typingUser?: ApiUser;\n};\n\nconst TypingStatus: FC = ({ typingStatus, typingUser }) => {\n const lang = useLang();\n const typingUserName = typingUser && !typingUser.isSelf && getUserFirstOrLastName(typingUser);\n\n return (\n

\n {typingUserName && (\n {renderText(typingUserName)}\n )}\n {/* fix for translation \"username _is_ typing\" */}\n {lang(typingStatus.action).replace('{user}', '').replace('{emoji}', typingStatus.emoji).trim()}\n \n

\n );\n};\n\nexport default memo(withGlobal(\n (global, { typingStatus }): StateProps => {\n if (!typingStatus.userId) {\n return {};\n }\n\n const typingUser = selectUser(global, typingStatus.userId);\n\n return { typingUser };\n },\n)(TypingStatus));\n","import React, { FC } from '../../lib/teact/teact';\n\nimport './VerifiedIcon.scss';\n\nconst VerifiedIcon: FC = () => {\n return (\n \n );\n};\n\nexport default VerifiedIcon;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport { ApiMessage, ApiWebPage } from '../../api/types';\n\nimport { getFirstLinkInMessage, getMessageSummaryText, getMessageWebPage } from '../../modules/helpers';\nimport buildClassName from '../../util/buildClassName';\nimport trimText from '../../util/trimText';\nimport renderText from './helpers/renderText';\nimport { formatPastTimeShort } from '../../util/dateFormat';\nimport useLang from '../../hooks/useLang';\n\nimport Media from './Media';\nimport Link from '../ui/Link';\nimport SafeLink from './SafeLink';\n\nimport './WebLink.scss';\n\nconst MAX_TEXT_LENGTH = 170; // symbols\n\ntype OwnProps = {\n message: ApiMessage;\n senderTitle?: string;\n isProtected?: boolean;\n onMessageClick: (messageId: number, chatId: string) => void;\n};\n\nconst WebLink: FC = ({\n message, senderTitle, isProtected, onMessageClick,\n}) => {\n const lang = useLang();\n\n let linkData: ApiWebPage | undefined = getMessageWebPage(message);\n\n if (!linkData) {\n const link = getFirstLinkInMessage(message);\n if (link) {\n const { url, domain } = link;\n const messageText = getMessageSummaryText(lang, message);\n\n linkData = {\n siteName: domain.replace(/^www./, ''),\n url: url.includes('://') ? url : url.includes('@') ? `mailto:${url}` : `http://${url}`,\n description: messageText !== url ? messageText : undefined,\n } as ApiWebPage;\n }\n }\n\n const handleMessageClick = useCallback(() => {\n onMessageClick(message.id, message.chatId);\n }, [onMessageClick, message.id, message.chatId]);\n\n if (!linkData) {\n return undefined;\n }\n\n const {\n siteName,\n url,\n displayUrl,\n title,\n description,\n photo,\n video,\n } = linkData;\n\n const truncatedDescription = !senderTitle && trimText(description, MAX_TEXT_LENGTH);\n\n const className = buildClassName(\n 'WebLink scroll-item',\n (!photo && !video) && 'without-media',\n );\n\n return (\n \n {photo && (\n \n )}\n
\n \n {renderText(title || siteName || displayUrl)}\n \n {truncatedDescription && (\n \n {renderText(truncatedDescription)}\n \n )}\n \n {url.replace('mailto:', '') || displayUrl}\n \n {senderTitle &&
{renderText(senderTitle)}
}\n
\n {senderTitle && (\n
\n \n {formatPastTimeShort(lang, message.date * 1000)}\n \n
\n )}\n \n );\n};\n\nexport default memo(WebLink);\n","import {\n ApiPhoto, ApiVideo, ApiSticker, ApiDimensions,\n} from '../../../api/types';\n\nimport { STICKER_SIZE_INLINE_DESKTOP_FACTOR, STICKER_SIZE_INLINE_MOBILE_FACTOR } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport windowSize from '../../../util/windowSize';\nimport { getPhotoInlineDimensions, getVideoDimensions } from '../../../modules/helpers';\n\nexport const MEDIA_VIEWER_MEDIA_QUERY = '(max-height: 640px)';\nexport const REM = parseInt(getComputedStyle(document.documentElement).fontSize, 10);\nexport const ROUND_VIDEO_DIMENSIONS_PX = 240;\nexport const GIF_MIN_WIDTH = 300;\nexport const AVATAR_FULL_DIMENSIONS = { width: 640, height: 640 };\nexport const LIKE_STICKER_ID = '4986041492570112461';\n\nconst DEFAULT_MEDIA_DIMENSIONS: ApiDimensions = { width: 100, height: 100 };\nconst MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM = 4.5;\nconst MOBILE_SCREEN_MESSAGE_EXTRA_WIDTH_REM = 7;\nconst MESSAGE_MAX_WIDTH_REM = 29;\nconst MESSAGE_OWN_MAX_WIDTH_REM = 30;\n\nlet cachedMaxWidthOwn: number | undefined;\nlet cachedMaxWidth: number | undefined;\nlet cachedMaxWidthNoAvatar: number | undefined;\n\nfunction getMaxMessageWidthRem(fromOwnMessage: boolean, noAvatars?: boolean) {\n const regularMaxWidth = fromOwnMessage ? MESSAGE_OWN_MAX_WIDTH_REM : MESSAGE_MAX_WIDTH_REM;\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n return regularMaxWidth;\n }\n\n const { width: windowWidth } = windowSize.get();\n\n // @optimization Limitation: changing device screen width not supported\n if (!cachedMaxWidthOwn) {\n cachedMaxWidthOwn = Math.min(\n MESSAGE_OWN_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n if (!cachedMaxWidth) {\n cachedMaxWidth = Math.min(\n MESSAGE_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n if (!cachedMaxWidthNoAvatar) {\n cachedMaxWidthNoAvatar = Math.min(\n MESSAGE_MAX_WIDTH_REM,\n windowWidth / REM - MOBILE_SCREEN_NO_AVATARS_MESSAGE_EXTRA_WIDTH_REM,\n );\n }\n\n return fromOwnMessage\n ? cachedMaxWidthOwn\n : (noAvatars ? cachedMaxWidthNoAvatar : cachedMaxWidth);\n}\n\nexport function getAvailableWidth(\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n noAvatars?: boolean,\n) {\n const extraPaddingRem = isForwarded || isWebPagePhoto ? 1.625 : 0;\n const availableWidthRem = getMaxMessageWidthRem(fromOwnMessage, noAvatars) - extraPaddingRem;\n\n return availableWidthRem * REM;\n}\n\nfunction getAvailableHeight(isGif?: boolean, aspectRatio?: number) {\n if (\n isGif && aspectRatio\n && aspectRatio >= 0.75 && aspectRatio <= 1.25\n ) {\n return 20 * REM;\n }\n\n return 27 * REM;\n}\n\nfunction calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n isGif,\n noAvatars,\n}: {\n width: number;\n height: number;\n fromOwnMessage: boolean;\n isForwarded?: boolean;\n isWebPagePhoto?: boolean;\n isGif?: boolean;\n noAvatars?: boolean;\n}): ApiDimensions {\n const aspectRatio = height / width;\n const availableWidth = getAvailableWidth(fromOwnMessage, isForwarded, isWebPagePhoto, noAvatars);\n const availableHeight = getAvailableHeight(isGif, aspectRatio);\n const mediaWidth = isGif ? Math.max(GIF_MIN_WIDTH, width) : width;\n const mediaHeight = isGif ? height * (mediaWidth / width) : height;\n\n return calculateDimensions(availableWidth, availableHeight, mediaWidth, mediaHeight);\n}\n\nexport function getMediaViewerAvailableDimensions(withFooter: boolean, isVideo: boolean): ApiDimensions {\n const mql = window.matchMedia(MEDIA_VIEWER_MEDIA_QUERY);\n const { width: windowWidth, height: windowHeight } = windowSize.get();\n let occupiedHeightRem = isVideo && mql.matches ? 10 : 8.25;\n if (withFooter) {\n occupiedHeightRem = mql.matches ? 10 : 15;\n }\n\n return {\n width: windowWidth,\n height: windowHeight - occupiedHeightRem * REM,\n };\n}\n\nexport function calculateInlineImageDimensions(\n photo: ApiPhoto,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n isWebPagePhoto?: boolean,\n noAvatars?: boolean,\n) {\n const { width, height } = getPhotoInlineDimensions(photo) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isWebPagePhoto,\n noAvatars,\n });\n}\n\nexport function calculateVideoDimensions(\n video: ApiVideo,\n fromOwnMessage: boolean,\n isForwarded?: boolean,\n noAvatars?: boolean,\n) {\n const { width, height } = getVideoDimensions(video) || DEFAULT_MEDIA_DIMENSIONS;\n\n return calculateDimensionsForMessageMedia({\n width,\n height,\n fromOwnMessage,\n isForwarded,\n isGif: video.isGif,\n noAvatars,\n });\n}\n\nexport function getPictogramDimensions(): ApiDimensions {\n return {\n width: 2 * REM,\n height: 2 * REM,\n };\n}\n\nexport function getDocumentThumbnailDimensions(smaller?: boolean): ApiDimensions {\n if (smaller) {\n return {\n width: 3 * REM,\n height: 3 * REM,\n };\n }\n\n return {\n width: 3.375 * REM,\n height: 3.375 * REM,\n };\n}\n\nexport function getStickerDimensions(sticker: ApiSticker): ApiDimensions {\n const { width } = sticker;\n let { height } = sticker;\n\n // For some reason this sticker has some weird `height` value\n if (sticker.id === LIKE_STICKER_ID) {\n height = width;\n }\n\n const aspectRatio = (height && width) && height / width;\n const baseWidth = REM * (\n IS_SINGLE_COLUMN_LAYOUT\n ? STICKER_SIZE_INLINE_MOBILE_FACTOR\n : STICKER_SIZE_INLINE_DESKTOP_FACTOR\n );\n const calculatedHeight = aspectRatio ? baseWidth * aspectRatio : baseWidth;\n\n if (aspectRatio && calculatedHeight > baseWidth) {\n return {\n width: Math.round(baseWidth / aspectRatio),\n height: baseWidth,\n };\n }\n\n return {\n width: baseWidth,\n height: calculatedHeight,\n };\n}\n\nexport function calculateMediaViewerDimensions(\n { width, height }: ApiDimensions, withFooter: boolean, isVideo: boolean = false,\n): ApiDimensions {\n const { width: availableWidth, height: availableHeight } = getMediaViewerAvailableDimensions(withFooter, isVideo);\n\n return calculateDimensions(availableWidth, availableHeight, width, height);\n}\n\nexport function calculateDimensions(\n availableWidth: number,\n availableHeight: number,\n mediaWidth: number,\n mediaHeight: number,\n): ApiDimensions {\n const aspectRatio = mediaHeight / mediaWidth;\n const calculatedWidth = Math.min(mediaWidth, availableWidth);\n const calculatedHeight = Math.round(calculatedWidth * aspectRatio);\n\n if (calculatedHeight > availableHeight) {\n return {\n width: Math.round(availableHeight / aspectRatio),\n height: availableHeight,\n };\n }\n\n return {\n width: calculatedWidth,\n height: Math.round(calculatedWidth * aspectRatio),\n };\n}\n","import { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiMessageEntity, ApiMessageEntityTypes, ApiMessage } from '../../../api/types';\n\nimport { getMessageText } from '../../../modules/helpers';\nimport renderText from './renderText';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\nexport type TextPart = string | Element;\n\nexport function renderMessageText(message: ApiMessage, highlight?: string, shouldRenderHqEmoji?: boolean) {\n const formattedText = message.content.text;\n\n if (!formattedText || !formattedText.text) {\n const rawText = getMessageText(message);\n return rawText ? [rawText] : undefined;\n }\n const { text, entities } = formattedText;\n\n return renderTextWithEntities(text, entities, highlight, shouldRenderHqEmoji);\n}\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set;\n nestedEntities: IOrganizedEntity[];\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities: IOrganizedEntity[] = [];\n const parsedNestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter(Boolean as any);\n\n parsedNestedEntities.forEach((parsedEntity) => {\n let isChanged = false;\n\n parsedEntity.organizedIndexes.forEach((organizedIndex) => {\n if (!isChanged && !organizedIndexes.has(organizedIndex)) {\n isChanged = true;\n }\n\n organizedIndexes.add(organizedIndex);\n });\n\n if (isChanged) {\n nestedEntities.push(parsedEntity);\n }\n });\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntities = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(entity, entityContent, nestedEntityContent);\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntities.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntities.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n if (!entityText) {\n return renderMessagePart(renderedContent);\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Blockquote:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.BotCommand:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Code:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.Email:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Italic:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.MentionName:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Mention:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Phone:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Pre:\n return
{renderMessagePart(renderedContent)}
;\n case ApiMessageEntityTypes.Strike:\n return {renderMessagePart(renderedContent)};\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n \n {renderMessagePart(renderedContent)}\n \n );\n case ApiMessageEntityTypes.Underline:\n return {renderMessagePart(renderedContent)};\n default:\n return renderMessagePart(renderedContent);\n }\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['escape_html', 'emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n if (highlight) {\n return renderText(content, [emojiFilter, 'br', 'highlight'], { highlight });\n } else {\n return renderText(content, [emojiFilter, 'br']);\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent) {\n getDispatch().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent) {\n getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getDispatch().searchTextMessagesLocal();\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' && entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(entityContent, ['escape_html', 'emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Italic:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Underline:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Code:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`
${renderedContent}
\\`\\`\\``;\n case ApiMessageEntityTypes.Strike:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.MentionName:\n return `${renderedContent}`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `${renderedContent}`;\n default:\n return renderedContent;\n }\n}\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport safePlay from '../../../util/safePlay';\nimport { getDispatch } from '../../../lib/teact/teactn';\nimport useMedia from '../../../hooks/useMedia';\nimport { ActiveEmojiInteraction } from '../../../global/types';\nimport useFlag from '../../../hooks/useFlag';\nimport { selectLocalAnimatedEmojiEffectByName } from '../../../modules/selectors';\n\nconst WIDTH = {\n large: 160,\n medium: 128,\n small: 104,\n};\nconst INTERACTION_BUNCH_TIME = 1000;\nconst MS_DIVIDER = 1000;\nconst TIME_DEFAULT = 0;\n\nexport default function useAnimatedEmoji(\n size: 'large' | 'medium' | 'small',\n chatId?: string,\n messageId?: number,\n soundId?: string,\n activeEmojiInteraction?: ActiveEmojiInteraction,\n isOwn?: boolean,\n localEffect?: string,\n emoji?: string,\n) {\n const {\n interactWithAnimatedEmoji, sendEmojiInteraction, sendWatchingEmojiInteraction,\n } = getDispatch();\n\n const hasEffect = localEffect || emoji;\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n // eslint-disable-next-line no-null/no-null\n const audioRef = useRef(null);\n\n const soundMediaData = useMedia(soundId ? `document${soundId}` : undefined, !soundId);\n\n const width = WIDTH[size];\n const style = `width: ${width}px; height: ${width}px;`;\n\n const [playKey, setPlayKey] = useState(String(Math.random()));\n const interactions = useRef(undefined);\n const startedInteractions = useRef(undefined);\n const sendInteractionBunch = useCallback(() => {\n const container = ref.current;\n\n if (!container) return;\n\n sendEmojiInteraction({\n chatId,\n messageId,\n localEffect,\n emoji,\n interactions: interactions.current,\n });\n startedInteractions.current = undefined;\n interactions.current = undefined;\n }, [sendEmojiInteraction, chatId, messageId, localEffect, emoji]);\n\n const play = useCallback(() => {\n setPlayKey(String(Math.random()));\n\n const audio = audioRef.current;\n if (soundMediaData) {\n if (audio) {\n audio.pause();\n audio.remove();\n }\n audioRef.current = new Audio();\n audioRef.current.src = soundMediaData;\n safePlay(audioRef.current);\n audioRef.current.addEventListener('ended', () => {\n audioRef.current = undefined;\n }, { once: true });\n }\n }, [soundMediaData]);\n\n const handleClick = useCallback(() => {\n play();\n\n const container = ref.current;\n\n if (!hasEffect || !container || !messageId || !chatId) {\n return;\n }\n\n const { x, y } = container.getBoundingClientRect();\n\n interactWithAnimatedEmoji({\n localEffect,\n emoji,\n x,\n y,\n startSize: width,\n isReversed: !isOwn,\n });\n\n if (!interactions.current) {\n interactions.current = [];\n startedInteractions.current = performance.now();\n setTimeout(sendInteractionBunch, INTERACTION_BUNCH_TIME);\n }\n\n interactions.current.push(startedInteractions.current\n ? (performance.now() - startedInteractions.current) / MS_DIVIDER\n : TIME_DEFAULT);\n }, [\n chatId, emoji, hasEffect, interactWithAnimatedEmoji, isOwn,\n localEffect, messageId, play, sendInteractionBunch, width,\n ]);\n\n // Set an end anchor for remote activated interaction\n useEffect(() => {\n const container = ref.current;\n\n if (!container || !activeEmojiInteraction) return;\n\n const {\n messageId: selectedMessageId, endX, endY,\n } = activeEmojiInteraction;\n\n if (!endX && !endY && selectedMessageId === messageId) {\n const { x, y } = container.getBoundingClientRect();\n\n sendWatchingEmojiInteraction({\n chatId,\n emoticon: localEffect ? selectLocalAnimatedEmojiEffectByName(localEffect) : emoji,\n startSize: width,\n x,\n y,\n isReversed: !isOwn,\n });\n play();\n }\n }, [\n activeEmojiInteraction, chatId, emoji, isOwn, localEffect, messageId, play, sendWatchingEmojiInteraction, width,\n ]);\n\n return {\n playKey,\n ref,\n style,\n width,\n handleClick,\n markAnimationLoaded,\n isAnimationLoaded,\n };\n}\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\nimport { OwnProps } from './ChatFolderModal';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ChatFolderModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ChatFolderModal = useModuleLoader(Bundles.Extra, 'ChatFolderModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ChatFolderModal ? : undefined;\n};\n\nexport default memo(ChatFolderModalAsync);\n","import { useMemo } from '../../../../lib/teact/teact';\n\nexport enum ChatAnimationTypes {\n Move,\n Opacity,\n None,\n}\n\nexport function useChatAnimationType(orderDiffById: Record) {\n return useMemo(() => {\n const orderDiffs = Object.values(orderDiffById);\n const numberOfUp = orderDiffs.filter((diff) => diff < 0).length;\n const numberOfDown = orderDiffs.filter((diff) => diff > 0).length;\n\n return (chatId: string): ChatAnimationTypes => {\n const orderDiff = orderDiffById[chatId];\n if (orderDiff === 0) {\n return ChatAnimationTypes.None;\n }\n\n if (\n orderDiff === Infinity\n || orderDiff === -Infinity\n || (numberOfUp <= numberOfDown && orderDiff < 0)\n || (numberOfDown < numberOfUp && orderDiff > 0)\n ) {\n return ChatAnimationTypes.Opacity;\n }\n\n return ChatAnimationTypes.Move;\n };\n }, [orderDiffById]);\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { formatIntegerCompact } from '../../../util/textFormat';\nimport buildClassName from '../../../util/buildClassName';\n\nimport ShowTransition from '../../ui/ShowTransition';\n\nimport './Badge.scss';\n\ntype OwnProps = {\n chat: ApiChat;\n isPinned?: boolean;\n isMuted?: boolean;\n};\n\nconst Badge: FC = ({ chat, isPinned, isMuted }) => {\n const isShown = Boolean(chat.unreadCount || chat.hasUnreadMark || isPinned);\n const className = buildClassName(\n 'Badge',\n isMuted && 'muted',\n isPinned && 'pinned',\n Boolean(chat.unreadCount || chat.hasUnreadMark) && 'unread',\n );\n\n function renderContent() {\n if (chat.unreadCount) {\n if (chat.unreadMentionsCount) {\n return (\n
\n
\n \n
\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n
\n );\n }\n\n return (\n
\n {formatIntegerCompact(chat.unreadCount)}\n
\n );\n } else if (chat.hasUnreadMark) {\n return (\n
\n );\n } else if (isPinned) {\n return (\n
\n \n
\n );\n }\n\n return undefined;\n }\n\n return (\n \n {renderContent}\n \n );\n};\n\nexport default memo(Badge);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport buildClassName from '../../../util/buildClassName';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\n\nimport './ChatCallStatus.scss';\n\ntype OwnProps = {\n isSelected?: boolean;\n isActive?: boolean;\n};\n\nconst ChatCallStatus: FC = ({\n isSelected,\n isActive,\n}) => {\n return (\n
\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport default memo(ChatCallStatus);\n","import React, {\n FC, memo, useCallback, useLayoutEffect, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport useLang, { LangFn } from '../../../hooks/useLang';\n\nimport {\n ApiChat, ApiUser, ApiMessage, ApiMessageOutgoingStatus, ApiFormattedText, MAIN_THREAD_ID, ApiUserStatus,\n} from '../../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport {\n getChatTitle,\n isUserId,\n isActionMessage,\n getPrivateChatUserId,\n getMessageAction,\n getMessageSenderName,\n isChatChannel,\n getMessageMediaHash,\n getMessageSummaryText,\n getMessageMediaThumbDataUri,\n getMessageVideo,\n getMessageSticker,\n selectIsChatMuted,\n getMessageRoundVideo,\n} from '../../../modules/helpers';\nimport {\n selectChat, selectUser, selectChatMessage, selectOutgoingStatus, selectDraft, selectCurrentMessageList,\n selectNotifySettings, selectNotifyExceptions, selectUserStatus,\n} from '../../../modules/selectors';\nimport { renderActionMessageText } from '../../common/helpers/renderActionMessageText';\nimport renderText from '../../common/helpers/renderText';\nimport { fastRaf } from '../../../util/schedulers';\nimport buildClassName from '../../../util/buildClassName';\nimport useEnsureMessage from '../../../hooks/useEnsureMessage';\nimport useChatContextActions from '../../../hooks/useChatContextActions';\nimport useFlag from '../../../hooks/useFlag';\nimport useMedia from '../../../hooks/useMedia';\nimport { ChatAnimationTypes } from './hooks';\n\nimport Avatar from '../../common/Avatar';\nimport VerifiedIcon from '../../common/VerifiedIcon';\nimport TypingStatus from '../../common/TypingStatus';\nimport LastMessageMeta from '../../common/LastMessageMeta';\nimport DeleteChatModal from '../../common/DeleteChatModal';\nimport ListItem from '../../ui/ListItem';\nimport Badge from './Badge';\nimport ChatFolderModal from '../ChatFolderModal.async';\nimport ChatCallStatus from './ChatCallStatus';\n\nimport './Chat.scss';\n\ntype OwnProps = {\n style?: string;\n chatId: string;\n folderId?: number;\n orderDiff: number;\n animationType: ChatAnimationTypes;\n isPinned?: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n isMuted?: boolean;\n user?: ApiUser;\n userStatus?: ApiUserStatus;\n actionTargetUserIds?: string[];\n actionTargetMessage?: ApiMessage;\n actionTargetChatId?: string;\n lastMessageSender?: ApiUser;\n lastMessageOutgoingStatus?: ApiMessageOutgoingStatus;\n draft?: ApiFormattedText;\n animationLevel?: number;\n isSelected?: boolean;\n canScrollDown?: boolean;\n canChangeFolder?: boolean;\n lastSyncTime?: number;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Chat: FC = ({\n style,\n chatId,\n folderId,\n orderDiff,\n animationType,\n isPinned,\n chat,\n isMuted,\n user,\n userStatus,\n actionTargetUserIds,\n lastMessageSender,\n lastMessageOutgoingStatus,\n actionTargetMessage,\n actionTargetChatId,\n draft,\n animationLevel,\n isSelected,\n canScrollDown,\n canChangeFolder,\n lastSyncTime,\n}) => {\n const {\n openChat,\n focusLastMessage,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n\n const [isDeleteModalOpen, openDeleteModal, closeDeleteModal] = useFlag();\n const [isChatFolderModalOpen, openChatFolderModal, closeChatFolderModal] = useFlag();\n const [shouldRenderDeleteModal, markRenderDeleteModal, unmarkRenderDeleteModal] = useFlag();\n const [shouldRenderChatFolderModal, markRenderChatFolderModal, unmarkRenderChatFolderModal] = useFlag();\n\n const { lastMessage, typingStatus } = chat || {};\n const isAction = lastMessage && isActionMessage(lastMessage);\n\n useEnsureMessage(chatId, isAction ? lastMessage!.replyToMessageId : undefined, actionTargetMessage);\n\n const mediaThumbnail = lastMessage && !getMessageSticker(lastMessage)\n ? getMessageMediaThumbDataUri(lastMessage)\n : undefined;\n const mediaBlobUrl = useMedia(lastMessage ? getMessageMediaHash(lastMessage, 'micro') : undefined);\n const isRoundVideo = Boolean(lastMessage && getMessageRoundVideo(lastMessage));\n\n const actionTargetUsers = useMemo(() => {\n if (!actionTargetUserIds) {\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 actionTargetUserIds.map((userId) => usersById[userId]).filter(Boolean as any);\n }, [actionTargetUserIds]);\n\n // Sets animation excess values when `orderDiff` changes and then resets excess values to animate.\n useLayoutEffect(() => {\n const element = ref.current;\n\n if (animationLevel === 0 || !element) {\n return;\n }\n\n // TODO Refactor animation: create `useListAnimation` that owns `orderDiff` and `animationType`\n if (animationType === ChatAnimationTypes.Opacity) {\n element.style.opacity = '0';\n\n fastRaf(() => {\n element.classList.add('animate-opacity');\n element.style.opacity = '1';\n });\n } else if (animationType === ChatAnimationTypes.Move) {\n element.style.transform = `translate3d(0, ${-orderDiff * 100}%, 0)`;\n\n fastRaf(() => {\n element.classList.add('animate-transform');\n element.style.transform = '';\n });\n } else {\n return;\n }\n\n setTimeout(() => {\n fastRaf(() => {\n element.classList.remove('animate-opacity', 'animate-transform');\n element.style.opacity = '';\n element.style.transform = '';\n });\n }, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [animationLevel, orderDiff, animationType]);\n\n const handleClick = useCallback(() => {\n openChat({ id: chatId, shouldReplaceHistory: true });\n\n if (isSelected && canScrollDown) {\n focusLastMessage();\n }\n }, [\n isSelected,\n canScrollDown,\n openChat,\n chatId,\n focusLastMessage,\n ]);\n\n function handleDelete() {\n markRenderDeleteModal();\n openDeleteModal();\n }\n\n function handleChatFolderChange() {\n markRenderChatFolderModal();\n openChatFolderModal();\n }\n\n const contextActions = useChatContextActions({\n chat,\n user,\n handleDelete,\n handleChatFolderChange,\n folderId,\n isPinned,\n isMuted,\n canChangeFolder,\n });\n\n const lang = useLang();\n\n if (!chat) {\n return undefined;\n }\n\n function renderLastMessageOrTyping() {\n if (typingStatus && lastMessage && typingStatus.timestamp > lastMessage.date * 1000) {\n return ;\n }\n\n if (draft?.text.length) {\n return (\n

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

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

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

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

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

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

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

\n {chat.isVerified && }\n {isMuted && }\n {chat.lastMessage && (\n \n )}\n
\n
\n {renderLastMessageOrTyping()}\n \n
\n
\n {shouldRenderDeleteModal && (\n \n )}\n {shouldRenderChatFolderModal && (\n \n )}\n \n );\n};\n\nfunction renderMessageSummary(lang: LangFn, message: ApiMessage, blobUrl?: string, isRoundVideo?: boolean) {\n if (!blobUrl) {\n return renderText(getMessageSummaryText(lang, message));\n }\n\n return (\n \n \"\"\n {getMessageVideo(message) && }\n {renderText(getMessageSummaryText(lang, message, true))}\n \n );\n}\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return {};\n }\n\n const { senderId, replyToMessageId, isOutgoing } = chat.lastMessage;\n const lastMessageSender = senderId ? selectUser(global, senderId) : undefined;\n const lastMessageAction = getMessageAction(chat.lastMessage);\n const actionTargetMessage = lastMessageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const { targetUserIds: actionTargetUserIds, targetChatId: actionTargetChatId } = lastMessageAction || {};\n const privateChatUserId = getPrivateChatUserId(chat);\n const {\n chatId: currentChatId,\n threadId: currentThreadId,\n type: messageListType,\n } = selectCurrentMessageList(global) || {};\n const isSelected = chatId === currentChatId && currentThreadId === MAIN_THREAD_ID;\n\n return {\n chat,\n isMuted: selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global)),\n lastMessageSender,\n actionTargetUserIds,\n actionTargetChatId,\n actionTargetMessage,\n draft: selectDraft(global, chatId, MAIN_THREAD_ID),\n animationLevel: global.settings.byKey.animationLevel,\n isSelected,\n canScrollDown: isSelected && messageListType === 'thread',\n canChangeFolder: Boolean(global.chatFolders.orderedIds?.length),\n lastSyncTime: global.lastSyncTime,\n ...(isOutgoing && { lastMessageOutgoingStatus: selectOutgoingStatus(global, chat.lastMessage) }),\n ...(privateChatUserId && {\n user: selectUser(global, privateChatUserId),\n userStatus: selectUserStatus(global, privateChatUserId),\n }),\n };\n },\n)(Chat));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatFolder, ApiSticker } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { selectAnimatedEmoji, selectChatFolder } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\nimport AnimatedEmoji from '../../common/AnimatedEmoji';\n\nimport './EmptyFolder.scss';\n\ntype OwnProps = {\n folderId?: number;\n folderType: 'all' | 'archived' | 'folder';\n foldersDispatch?: FolderEditDispatch;\n onScreenSelect?: (screen: SettingsScreens) => void;\n};\n\ntype StateProps = {\n chatFolder?: ApiChatFolder;\n animatedEmoji?: ApiSticker;\n};\n\nconst EmptyFolder: FC = ({\n chatFolder, animatedEmoji, foldersDispatch, onScreenSelect,\n}) => {\n const lang = useLang();\n\n const handleEditFolder = useCallback(() => {\n foldersDispatch!({ type: 'editFolder', payload: chatFolder });\n onScreenSelect!(SettingsScreens.FoldersEditFolderFromChatList);\n }, [chatFolder, foldersDispatch, onScreenSelect]);\n\n return (\n
\n
{animatedEmoji && }
\n

{lang('FilterNoChatsToDisplay')}

\n

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

\n {chatFolder && foldersDispatch && onScreenSelect && (\n \n \n {lang('ChatList.EmptyChatListEditFilter')}\n \n )}\n
\n );\n};\n\nexport default memo(withGlobal((global, { folderId, folderType }): StateProps => {\n const chatFolder = folderId && folderType === 'folder' ? selectChatFolder(global, folderId) : undefined;\n\n return {\n chatFolder,\n animatedEmoji: selectAnimatedEmoji(global, '📂'),\n };\n})(EmptyFolder));\n","import React, {\n FC, memo, useMemo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiChat, ApiChatFolder, ApiUser,\n} from '../../../api/types';\nimport { NotifyException, NotifySettings, SettingsScreens } from '../../../types';\nimport { FolderEditDispatch } from '../../../hooks/reducers/useFoldersReducer';\n\nimport { ALL_CHATS_PRELOAD_DISABLED, CHAT_HEIGHT_PX, CHAT_LIST_SLICE } from '../../../config';\nimport { IS_ANDROID, IS_MAC_OS, IS_PWA } from '../../../util/environment';\nimport usePrevious from '../../../hooks/usePrevious';\nimport { mapValues } from '../../../util/iteratees';\nimport {\n getChatOrder, prepareChatList, prepareFolderListIds, reduceChatList,\n} from '../../../modules/helpers';\nimport {\n selectChatFolder, selectNotifyExceptions, selectNotifySettings,\n} from '../../../modules/selectors';\nimport useInfiniteScroll from '../../../hooks/useInfiniteScroll';\nimport { useChatAnimationType } from './hooks';\n\nimport InfiniteScroll from '../../ui/InfiniteScroll';\nimport Loading from '../../ui/Loading';\nimport Chat from './Chat';\nimport EmptyFolder from './EmptyFolder';\n\ntype OwnProps = {\n folderType: 'all' | 'archived' | 'folder';\n folderId?: number;\n isActive: boolean;\n onScreenSelect?: (screen: SettingsScreens) => void;\n foldersDispatch?: FolderEditDispatch;\n};\n\ntype StateProps = {\n allListIds: GlobalState['chats']['listIds'];\n chatsById: Record;\n usersById: Record;\n listIds?: string[];\n orderedPinnedIds?: string[];\n chatFolder?: ApiChatFolder;\n lastSyncTime?: number;\n notifySettings: NotifySettings;\n notifyExceptions?: Record;\n};\n\nenum FolderTypeToListType {\n 'all' = 'active',\n 'archived' = 'archived',\n}\n\nconst ChatList: FC = ({\n folderType,\n folderId,\n isActive,\n allListIds,\n chatsById,\n usersById,\n listIds,\n orderedPinnedIds,\n chatFolder,\n lastSyncTime,\n notifySettings,\n notifyExceptions,\n foldersDispatch,\n onScreenSelect,\n}) => {\n const {\n loadMoreChats,\n preloadTopChatMessages,\n preloadArchivedChats,\n openChat,\n openNextChat,\n } = getDispatch();\n\n const [currentListIds, currentPinnedIds] = useMemo(() => {\n return folderType === 'folder' && chatFolder\n ? prepareFolderListIds(allListIds, chatsById, usersById, chatFolder, notifySettings, notifyExceptions)\n : [listIds, orderedPinnedIds];\n }, [\n folderType, chatFolder, allListIds, chatsById, usersById,\n notifySettings, notifyExceptions, listIds, orderedPinnedIds,\n ]);\n\n const [orderById, orderedIds, chatArrays] = useMemo(() => {\n if (!currentListIds || (folderType === 'folder' && !chatFolder)) {\n return [];\n }\n\n const newChatArrays = prepareChatList(chatsById, currentListIds, currentPinnedIds, folderType);\n const singleList = ([] as ApiChat[]).concat(newChatArrays.pinnedChats, newChatArrays.otherChats);\n const newOrderedIds = singleList.map(({ id }) => id);\n const newOrderById = singleList.reduce((acc, chat, i) => {\n acc[chat.id] = i;\n return acc;\n }, {} as Record);\n\n return [newOrderById, newOrderedIds, newChatArrays];\n }, [currentListIds, currentPinnedIds, folderType, chatFolder, chatsById]);\n\n const prevOrderById = usePrevious(orderById);\n\n const orderDiffById = useMemo(() => {\n if (!orderById || !prevOrderById) {\n return {};\n }\n\n return mapValues(orderById, (order, id) => {\n return prevOrderById[id] !== undefined ? order - prevOrderById[id] : -Infinity;\n });\n }, [orderById, prevOrderById]);\n\n const loadMoreOfType = useCallback(() => {\n loadMoreChats({ listType: folderType === 'archived' ? 'archived' : 'active' });\n }, [loadMoreChats, folderType]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n lastSyncTime ? loadMoreOfType : undefined,\n orderedIds,\n undefined,\n CHAT_LIST_SLICE,\n folderType === 'all' && !ALL_CHATS_PRELOAD_DISABLED,\n );\n\n const viewportChatArrays = useMemo(() => {\n if (!viewportIds || !chatArrays) {\n return undefined;\n }\n\n return reduceChatList(chatArrays, viewportIds);\n }, [chatArrays, viewportIds]);\n\n useEffect(() => {\n if (lastSyncTime && folderType === 'all') {\n preloadTopChatMessages();\n preloadArchivedChats();\n }\n }, [lastSyncTime, folderType, preloadTopChatMessages, preloadArchivedChats]);\n\n // Support + and + to navigate between chats\n useEffect(() => {\n if (!isActive || !orderedIds) {\n return undefined;\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (IS_PWA && ((IS_MAC_OS && e.metaKey) || (!IS_MAC_OS && e.ctrlKey)) && e.code.startsWith('Digit')) {\n const [, digit] = e.code.match(/Digit(\\d)/) || [];\n if (!digit) return;\n\n const position = Number(digit) - 1;\n if (position > orderedIds!.length - 1) return;\n\n openChat({ id: orderedIds![position], shouldReplaceHistory: true });\n }\n\n if (e.altKey) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (!targetIndexDelta) return;\n\n e.preventDefault();\n openNextChat({ targetIndexDelta, orderedIds });\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isActive, openChat, openNextChat, orderedIds]);\n\n const getAnimationType = useChatAnimationType(orderDiffById);\n\n function renderChats() {\n const viewportOffset = orderedIds!.indexOf(viewportIds![0]);\n const pinnedOffset = viewportOffset + viewportChatArrays!.pinnedChats.length;\n\n return (\n \n {viewportChatArrays!.pinnedChats.map(({ id }, i) => (\n \n ))}\n {viewportChatArrays!.otherChats.map((chat, i) => (\n \n ))}\n
\n );\n }\n\n return (\n \n {viewportIds?.length && viewportChatArrays ? (\n renderChats()\n ) : viewportIds && !viewportIds.length ? (\n (\n \n )\n ) : (\n \n )}\n \n );\n};\n\nexport default memo(withGlobal(\n (global, { folderType, folderId }): StateProps => {\n const {\n chats: {\n listIds,\n byId: chatsById,\n orderedPinnedIds,\n },\n users: { byId: usersById },\n lastSyncTime,\n } = global;\n const listType = folderType !== 'folder' ? FolderTypeToListType[folderType] : undefined;\n const chatFolder = folderId ? selectChatFolder(global, folderId) : undefined;\n\n return {\n allListIds: listIds,\n chatsById,\n usersById,\n lastSyncTime,\n notifySettings: selectNotifySettings(global),\n notifyExceptions: selectNotifyExceptions(global),\n ...(listType ? {\n listIds: listIds[listType],\n orderedPinnedIds: orderedPinnedIds[listType],\n } : {\n chatFolder,\n }),\n };\n },\n)(ChatList));\n","import { ApiChat, ApiMessage, ApiUser } from '../../../../api/types';\nimport {\n getChatTitle,\n getSenderTitle,\n isUserId,\n isChatGroup,\n} from '../../../../modules/helpers';\nimport { LangFn } from '../../../../hooks/useLang';\n\nexport function getSenderName(\n lang: LangFn, message: ApiMessage, chatsById: Record, usersById: Record,\n) {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n const sender = isUserId(senderId) ? usersById[senderId] : chatsById[senderId];\n\n let senderName = getSenderTitle(lang, sender);\n\n const chat = chatsById[message.chatId];\n if (chat) {\n if (isUserId(senderId) && (sender as ApiUser).isSelf) {\n senderName = `${lang('FromYou')} → ${getChatTitle(lang, chat)}`;\n } else if (isChatGroup(chat)) {\n senderName += ` → ${getChatTitle(lang, chat)}`;\n }\n }\n\n return senderName;\n}\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport useFlag from '../../../hooks/useFlag';\nimport buildClassName from '../../../util/buildClassName';\n\nimport './DropTarget.scss';\n\nexport type OwnProps = {\n isQuick?: boolean;\n onFileSelect: (e: React.DragEvent) => void;\n};\n\nconst DropTarget: FC = ({ isQuick, onFileSelect }) => {\n const [isHovered, markHovered, unmarkHovered] = useFlag();\n\n const handleDragEnter = () => { markHovered(); };\n const handleDragLeave = (e: React.DragEvent) => {\n const { relatedTarget: toTarget } = e;\n\n if (toTarget) {\n e.stopPropagation();\n }\n\n unmarkHovered();\n };\n\n const className = buildClassName(\n 'DropTarget',\n isHovered && 'hovered',\n );\n\n return (\n \n
\n
\n
Drop files here to send them
\n
{isQuick ? 'in a quick way' : 'without compression'}
\n
\n
\n );\n};\n\nexport default memo(DropTarget);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport buildClassName from '../../../util/buildClassName';\n\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport usePrevious from '../../../hooks/usePrevious';\n\nimport Portal from '../../ui/Portal';\nimport DropTarget from './DropTarget';\n\nimport './DropArea.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n withQuick?: boolean;\n onHide: NoneToVoidFunction;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n};\n\nexport enum DropAreaState {\n None = 'none',\n Document = 'document',\n QuickFile = 'quick_file',\n}\n\nconst DROP_LEAVE_TIMEOUT_MS = 150;\n\nconst DropArea: FC = ({\n isOpen, withQuick, onHide, onFileSelect,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const hideTimeoutRef = useRef(null);\n const prevWithQuick = usePrevious(withQuick);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n\n useEffect(() => (isOpen ? captureEscKeyListener(onHide) : undefined), [isOpen, onHide]);\n\n const handleFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), false);\n }\n }, [onFileSelect, onHide]);\n\n const handleQuickFilesDrop = useCallback((e: React.DragEvent) => {\n const { dataTransfer: dt } = e;\n\n if (dt.files && dt.files.length > 0) {\n onHide();\n onFileSelect(Array.from(dt.files), true);\n }\n }, [onFileSelect, onHide]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.stopPropagation();\n\n const { target: fromTarget, relatedTarget: toTarget } = e;\n\n // Esc button pressed during drag event\n if ((fromTarget as HTMLDivElement).matches('.DropTarget, .DropArea') && !toTarget) {\n hideTimeoutRef.current = window.setTimeout(() => {\n onHide();\n }, DROP_LEAVE_TIMEOUT_MS);\n }\n }, [onHide]);\n\n const handleDragOver = () => {\n if (hideTimeoutRef.current) {\n window.clearTimeout(hideTimeoutRef.current);\n }\n };\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'DropArea',\n transitionClassNames,\n );\n\n return (\n \n
\n \n {(withQuick || prevWithQuick) && }\n
\n
\n );\n};\n\nexport default memo(DropArea);\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './EmojiTooltip';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst EmojiTooltipAsync: FC = (props) => {\n const { isOpen } = props;\n const EmojiTooltip = useModuleLoader(Bundles.Extra, 'EmojiTooltip', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiTooltip ? : undefined;\n};\n\nexport default memo(EmojiTooltipAsync);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useEffect, useRef, memo, useState, useCallback,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { IAnchorPosition, ISettings } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { selectReplyingToId } from '../../../modules/selectors';\nimport { debounce } from '../../../util/schedulers';\nimport focusEditableElement from '../../../util/focusEditableElement';\nimport buildClassName from '../../../util/buildClassName';\nimport {\n IS_ANDROID, IS_EMOJI_SUPPORTED, IS_IOS, IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport captureKeyboardListeners from '../../../util/captureKeyboardListeners';\nimport useLayoutEffectWithPrevDeps from '../../../hooks/useLayoutEffectWithPrevDeps';\nimport useFlag from '../../../hooks/useFlag';\nimport { isHeavyAnimating } from '../../../hooks/useHeavyAnimationCheck';\nimport useSendMessageAction from '../../../hooks/useSendMessageAction';\nimport useLang from '../../../hooks/useLang';\nimport parseEmojiOnlyString from '../../common/helpers/parseEmojiOnlyString';\nimport { isSelectionInsideInput } from './helpers/selection';\nimport renderText from '../../common/helpers/renderText';\n\nimport TextFormatter from './TextFormatter';\n\nconst CONTEXT_MENU_CLOSE_DELAY_MS = 100;\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 350;\nconst TRANSITION_DURATION_FACTOR = 50;\n\ntype OwnProps = {\n id: string;\n chatId: string;\n threadId: number;\n isAttachmentModalInput?: boolean;\n editableInputId?: string;\n html: string;\n placeholder: string;\n forcedPlaceholder?: string;\n canAutoFocus: boolean;\n shouldSuppressFocus?: boolean;\n shouldSuppressTextFormatter?: boolean;\n onUpdate: (html: string) => void;\n onSuppressedFocus?: () => void;\n onSend: () => void;\n};\n\ntype StateProps = {\n replyingToId?: number;\n noTabCapture?: boolean;\n messageSendKeyCombo?: ISettings['messageSendKeyCombo'];\n};\n\nconst MAX_INPUT_HEIGHT = IS_SINGLE_COLUMN_LAYOUT ? 256 : 416;\nconst TAB_INDEX_PRIORITY_TIMEOUT = 2000;\nconst TEXT_FORMATTER_SAFE_AREA_PX = 90;\n// For some reason Safari inserts `
` after user removes text from input\nconst SAFARI_BR = '
';\n\nfunction clearSelection() {\n const selection = window.getSelection();\n if (!selection) {\n return;\n }\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n } else if (selection.empty) {\n selection.empty();\n }\n}\n\nconst MessageInput: FC = ({\n id,\n chatId,\n threadId,\n isAttachmentModalInput,\n editableInputId,\n html,\n placeholder,\n forcedPlaceholder,\n canAutoFocus,\n shouldSuppressFocus,\n shouldSuppressTextFormatter,\n replyingToId,\n noTabCapture,\n messageSendKeyCombo,\n onUpdate,\n onSuppressedFocus,\n onSend,\n}) => {\n const {\n editLastMessage,\n replyToNextMessage,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const cloneRef = useRef(null);\n\n const lang = useLang();\n const isContextMenuOpenRef = useRef(false);\n const [isTextFormatterOpen, openTextFormatter, closeTextFormatter] = useFlag();\n const [textFormatterAnchorPosition, setTextFormatterAnchorPosition] = useState();\n const [selectedRange, setSelectedRange] = useState();\n\n const sendMessageAction = useSendMessageAction(chatId, threadId);\n\n useEffect(() => {\n if (!isAttachmentModalInput) return;\n updateInputHeight(false);\n }, [isAttachmentModalInput]);\n\n useLayoutEffectWithPrevDeps(([prevHtml]) => {\n if (html !== inputRef.current!.innerHTML) {\n inputRef.current!.innerHTML = html;\n }\n\n if (html !== cloneRef.current!.innerHTML) {\n cloneRef.current!.innerHTML = html;\n }\n\n if (prevHtml !== undefined && prevHtml !== html) {\n updateInputHeight(!html.length);\n }\n }, [html]);\n\n const chatIdRef = useRef(chatId);\n chatIdRef.current = chatId;\n const focusInput = useCallback(() => {\n if (isHeavyAnimating()) {\n setTimeout(focusInput, FOCUS_DELAY_MS);\n return;\n }\n\n focusEditableElement(inputRef.current!);\n }, []);\n\n const handleCloseTextFormatter = useCallback(() => {\n closeTextFormatter();\n clearSelection();\n }, [closeTextFormatter]);\n\n function checkSelection() {\n // Disable the formatter on iOS devices for now.\n if (IS_IOS) {\n return false;\n }\n\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount || isContextMenuOpenRef.current) {\n closeTextFormatter();\n return false;\n }\n\n const selectionRange = selection.getRangeAt(0);\n const selectedText = selectionRange.toString().trim();\n if (\n shouldSuppressTextFormatter\n || !isSelectionInsideInput(selectionRange, editableInputId || EDITABLE_INPUT_ID)\n || !selectedText\n || parseEmojiOnlyString(selectedText)\n || !selectionRange.START_TO_END\n ) {\n closeTextFormatter();\n return false;\n }\n\n return true;\n }\n\n function processSelection() {\n if (!checkSelection()) {\n return;\n }\n\n const selectionRange = window.getSelection()!.getRangeAt(0);\n const selectionRect = selectionRange.getBoundingClientRect();\n const inputRect = inputRef.current!.getBoundingClientRect();\n\n let x = (selectionRect.left + selectionRect.width / 2) - inputRect.left;\n\n if (x < TEXT_FORMATTER_SAFE_AREA_PX) {\n x = TEXT_FORMATTER_SAFE_AREA_PX;\n } else if (x > inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX) {\n x = inputRect.width - TEXT_FORMATTER_SAFE_AREA_PX;\n }\n\n setTextFormatterAnchorPosition({\n x,\n y: selectionRect.top - inputRect.top,\n });\n\n setSelectedRange(selectionRange);\n openTextFormatter();\n }\n\n function handleMouseDown(event: React.MouseEvent) {\n function handleMouseUp() {\n processSelection();\n\n event.target.removeEventListener('mouseup', handleMouseUp);\n }\n\n if (event.button !== 2) {\n event.target.addEventListener('mouseup', handleMouseUp);\n return;\n }\n\n if (isContextMenuOpenRef.current === true) {\n return;\n }\n\n isContextMenuOpenRef.current = true;\n\n function closeContextMenuMouseListener() {\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('mouseup', closeContextMenuMouseListener);\n }\n\n function closeContextMenuKeyListener(e: KeyboardEvent) {\n if (e.key !== 'Esc' && e.key !== 'Escape') {\n return;\n }\n\n setTimeout(() => {\n isContextMenuOpenRef.current = false;\n }, CONTEXT_MENU_CLOSE_DELAY_MS);\n\n window.removeEventListener('keydown', closeContextMenuKeyListener);\n }\n\n document.addEventListener('mousedown', closeContextMenuMouseListener);\n document.addEventListener('keydown', closeContextMenuKeyListener);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n function handleKeyUp() {\n processSelection();\n\n e.target.removeEventListener('keyup', handleKeyUp);\n }\n\n if (!html.length && (e.metaKey || e.ctrlKey)) {\n const targetIndexDelta = e.key === 'ArrowDown' ? 1 : e.key === 'ArrowUp' ? -1 : undefined;\n if (targetIndexDelta) {\n e.preventDefault();\n\n replyToNextMessage({ targetIndexDelta });\n return;\n }\n }\n\n if (e.key === 'Enter' && !e.shiftKey) {\n if (\n !(IS_IOS || IS_ANDROID)\n && (\n (messageSendKeyCombo === 'enter' && !e.shiftKey)\n || (messageSendKeyCombo === 'ctrl-enter' && (e.ctrlKey || e.metaKey))\n )\n ) {\n e.preventDefault();\n\n closeTextFormatter();\n onSend();\n }\n } else if (e.key === 'ArrowUp' && !html.length && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault();\n editLastMessage();\n } else {\n e.target.addEventListener('keyup', handleKeyUp);\n }\n }\n\n function handleChange(e: ChangeEvent) {\n const { innerHTML, textContent } = e.currentTarget;\n\n onUpdate(innerHTML === SAFARI_BR ? '' : innerHTML);\n sendMessageAction({ type: 'typing' });\n\n // Reset focus on the input to remove any active styling when input is cleared\n if (\n !IS_TOUCH_ENV\n && (!textContent || !textContent.length)\n // When emojis are not supported, innerHTML contains an emoji img tag that doesn't exist in the textContext\n && !(!IS_EMOJI_SUPPORTED && innerHTML.includes('emoji-small'))\n ) {\n const selection = window.getSelection()!;\n if (selection) {\n inputRef.current!.blur();\n selection.removeAllRanges();\n focusEditableElement(inputRef.current!, true);\n }\n }\n }\n\n function stopEvent(e: React.MouseEvent) {\n if (!checkSelection()) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n function updateInputHeight(willSend = false) {\n const input = inputRef.current!;\n const clone = cloneRef.current!;\n const currentHeight = Number(input.style.height.replace('px', ''));\n const newHeight = Math.min(clone.scrollHeight, MAX_INPUT_HEIGHT);\n if (newHeight === currentHeight) {\n return;\n }\n\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\n );\n\n const exec = () => {\n input.style.height = `${newHeight}px`;\n input.style.transitionDuration = `${transitionDuration}ms`;\n input.classList.toggle('overflown', clone.scrollHeight > MAX_INPUT_HEIGHT);\n };\n\n if (willSend) {\n // Sync with sending animation\n requestAnimationFrame(exec);\n } else {\n exec();\n }\n }\n\n useEffect(() => {\n if (IS_TOUCH_ENV) {\n return;\n }\n\n if (canAutoFocus) {\n focusInput();\n }\n }, [chatId, focusInput, replyingToId, canAutoFocus]);\n\n useEffect(() => {\n if (noTabCapture) {\n return undefined;\n }\n\n const captureFirstTab = debounce((e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n requestAnimationFrame(focusInput);\n }\n }, TAB_INDEX_PRIORITY_TIMEOUT, true, false);\n\n return captureKeyboardListeners({ onTab: captureFirstTab });\n }, [focusInput, noTabCapture]);\n\n useEffect(() => {\n const input = inputRef.current!;\n\n function suppressFocus() {\n input.blur();\n }\n\n if (shouldSuppressFocus) {\n input.addEventListener('focus', suppressFocus);\n }\n\n return () => {\n input.removeEventListener('focus', suppressFocus);\n };\n }, [shouldSuppressFocus]);\n\n const className = buildClassName(\n 'form-control custom-scroll',\n html.length > 0 && 'touched',\n shouldSuppressFocus && 'focus-disabled',\n );\n\n return (\n
\n \n
\n {!forcedPlaceholder && {placeholder}}\n \n {forcedPlaceholder && {renderText(forcedPlaceholder!)}}\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId, threadId }: OwnProps): StateProps => {\n const { messageSendKeyCombo } = global.settings.byKey;\n\n return {\n messageSendKeyCombo,\n replyingToId: chatId && threadId ? selectReplyingToId(global, chatId, threadId) : undefined,\n noTabCapture: global.isPollModalOpen || global.payment.isPaymentModalOpen,\n };\n },\n)(MessageInput));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\n\nimport { IAnchorPosition } from '../../../types';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport buildClassName from '../../../util/buildClassName';\nimport { ensureProtocol } from '../../../util/ensureProtocol';\nimport captureEscKeyListener from '../../../util/captureEscKeyListener';\nimport getKeyFromEvent from '../../../util/getKeyFromEvent';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useVirtualBackdrop from '../../../hooks/useVirtualBackdrop';\nimport useFlag from '../../../hooks/useFlag';\nimport useLang from '../../../hooks/useLang';\n\nimport Button from '../../ui/Button';\n\nimport './TextFormatter.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n anchorPosition?: IAnchorPosition;\n selectedRange?: Range;\n setSelectedRange: (range: Range) => void;\n onClose: () => void;\n};\n\ninterface ISelectedTextFormats {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n monospace?: boolean;\n}\n\nconst TEXT_FORMAT_BY_TAG_NAME: Record = {\n B: 'bold',\n STRONG: 'bold',\n I: 'italic',\n EM: 'italic',\n U: 'underline',\n DEL: 'strikethrough',\n CODE: 'monospace',\n};\nconst fragmentEl = document.createElement('div');\n\nconst TextFormatter: FC = ({\n isOpen,\n anchorPosition,\n selectedRange,\n setSelectedRange,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const linkUrlInputRef = useRef(null);\n const { shouldRender, transitionClassNames } = useShowTransition(isOpen);\n const [isLinkControlOpen, openLinkControl, closeLinkControl] = useFlag();\n const [linkUrl, setLinkUrl] = useState('');\n const [isEditingLink, setIsEditingLink] = useState(false);\n const [inputClassName, setInputClassName] = useState();\n const [selectedTextFormats, setSelectedTextFormats] = useState({});\n\n useEffect(() => (isOpen ? captureEscKeyListener(onClose) : undefined), [isOpen, onClose]);\n useVirtualBackdrop(\n isOpen,\n containerRef,\n onClose,\n );\n\n useEffect(() => {\n if (isLinkControlOpen) {\n linkUrlInputRef.current!.focus();\n } else {\n setLinkUrl('');\n setIsEditingLink(false);\n }\n }, [isLinkControlOpen]);\n\n useEffect(() => {\n if (!shouldRender) {\n closeLinkControl();\n setSelectedTextFormats({});\n setInputClassName(undefined);\n }\n }, [closeLinkControl, shouldRender]);\n\n useEffect(() => {\n if (!isOpen || !selectedRange) {\n return;\n }\n\n const selectedFormats: ISelectedTextFormats = {};\n let { parentElement } = selectedRange.commonAncestorContainer;\n while (parentElement && parentElement.id !== EDITABLE_INPUT_ID) {\n const textFormat = TEXT_FORMAT_BY_TAG_NAME[parentElement.tagName];\n if (textFormat) {\n selectedFormats[textFormat] = true;\n }\n\n parentElement = parentElement.parentElement;\n }\n\n setSelectedTextFormats(selectedFormats);\n }, [isOpen, selectedRange, openLinkControl]);\n\n function restoreSelection() {\n if (!selectedRange) {\n return;\n }\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(selectedRange);\n }\n }\n\n const updateSelectedRange = useCallback(() => {\n const selection = window.getSelection();\n if (selection) {\n setSelectedRange(selection.getRangeAt(0));\n }\n }, [setSelectedRange]);\n\n const getSelectedText = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n fragmentEl.innerText = selectedRange.toString();\n\n return fragmentEl.innerHTML;\n }, [selectedRange]);\n\n const getSelectedElement = useCallback(() => {\n if (!selectedRange) {\n return undefined;\n }\n\n return selectedRange.commonAncestorContainer.parentElement;\n }, [selectedRange]);\n\n function updateInputStyles() {\n const input = linkUrlInputRef.current;\n if (!input) {\n return;\n }\n\n const { offsetWidth, scrollWidth, scrollLeft } = input;\n if (scrollWidth <= offsetWidth) {\n setInputClassName(undefined);\n return;\n }\n\n let className = '';\n if (scrollLeft < scrollWidth - offsetWidth) {\n className = 'mask-right';\n }\n if (scrollLeft > 0) {\n className += ' mask-left';\n }\n\n setInputClassName(className);\n }\n\n function handleLinkUrlChange(e: React.ChangeEvent) {\n setLinkUrl(e.target.value);\n updateInputStyles();\n }\n\n function getFormatButtonClassName(key: keyof ISelectedTextFormats) {\n if (selectedTextFormats[key]) {\n return 'active';\n }\n\n if (key === 'monospace' || key === 'strikethrough') {\n if (Object.keys(selectedTextFormats).some(\n (fKey) => fKey !== key && !!selectedTextFormats[fKey as keyof ISelectedTextFormats],\n )) {\n return 'disabled';\n }\n } else if (selectedTextFormats.monospace || selectedTextFormats.strikethrough) {\n return 'disabled';\n }\n\n return undefined;\n }\n\n const handleBoldText = useCallback(() => {\n setSelectedTextFormats((selectedFormats) => {\n // Somehow re-applying 'bold' command to already bold text doesn't work\n document.execCommand(selectedFormats.bold ? 'removeFormat' : 'bold');\n Object.keys(selectedFormats).forEach((key) => {\n if ((key === 'italic' || key === 'underline') && !!selectedFormats[key]) {\n document.execCommand(key);\n }\n });\n\n updateSelectedRange();\n return {\n ...selectedFormats,\n bold: !selectedFormats.bold,\n };\n });\n }, [updateSelectedRange]);\n\n const handleItalicText = useCallback(() => {\n document.execCommand('italic');\n updateSelectedRange();\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n italic: !selectedFormats.italic,\n }));\n }, [updateSelectedRange]);\n\n const handleUnderlineText = useCallback(() => {\n document.execCommand('underline');\n updateSelectedRange();\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n underline: !selectedFormats.underline,\n }));\n }, [updateSelectedRange]);\n\n const handleStrikethroughText = useCallback(() => {\n if (selectedTextFormats.strikethrough) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'DEL'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n strikethrough: false,\n }));\n\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.strikethrough,\n ]);\n\n const handleMonospaceText = useCallback(() => {\n if (selectedTextFormats.monospace) {\n const element = getSelectedElement();\n if (\n !selectedRange\n || !element\n || element.tagName !== 'CODE'\n || !element.textContent\n ) {\n return;\n }\n\n element.replaceWith(element.textContent);\n setSelectedTextFormats((selectedFormats) => ({\n ...selectedFormats,\n monospace: false,\n }));\n return;\n }\n\n const text = getSelectedText();\n document.execCommand('insertHTML', false, `${text}`);\n onClose();\n }, [\n getSelectedElement, getSelectedText, onClose,\n selectedRange, selectedTextFormats.monospace,\n ]);\n\n function handleLinkUrlConfirm() {\n const formattedLinkUrl = encodeURI(ensureProtocol(linkUrl) || '');\n\n if (isEditingLink) {\n const element = getSelectedElement();\n if (!element || element.tagName !== 'A') {\n return;\n }\n\n (element as HTMLAnchorElement).href = formattedLinkUrl;\n\n onClose();\n return;\n }\n\n const text = getSelectedText();\n restoreSelection();\n document.execCommand(\n 'insertHTML',\n false,\n `${text}`,\n );\n onClose();\n }\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n const HANDLERS_BY_KEY: Record = {\n k: openLinkControl,\n b: handleBoldText,\n u: handleUnderlineText,\n i: handleItalicText,\n m: handleMonospaceText,\n s: handleStrikethroughText,\n };\n\n const handler = HANDLERS_BY_KEY[getKeyFromEvent(e)];\n\n if (\n e.altKey\n || !(e.ctrlKey || e.metaKey)\n || !handler\n ) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n handler();\n }, [\n handleBoldText, handleItalicText, handleUnderlineText,\n handleMonospaceText, handleStrikethroughText,\n openLinkControl,\n ]);\n\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n }\n\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, handleKeyDown]);\n\n const lang = useLang();\n\n function handleContainerKeyDown(e: React.KeyboardEvent) {\n if (e.key === 'Enter' && isLinkControlOpen) {\n handleLinkUrlConfirm();\n e.preventDefault();\n }\n }\n\n if (!shouldRender) {\n return undefined;\n }\n\n const className = buildClassName(\n 'TextFormatter',\n transitionClassNames,\n isLinkControlOpen && 'link-control-shown',\n );\n\n const linkUrlConfirmClassName = buildClassName(\n 'TextFormatter-link-url-confirm',\n !!linkUrl.length && 'shown',\n );\n\n const style = anchorPosition\n ? `left: ${anchorPosition.x}px; top: ${anchorPosition.y}px;--text-formatter-left: ${anchorPosition.x}px;`\n : '';\n\n return (\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n\n
\n
\n \n
\n\n \n \n
\n\n
\n
\n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default memo(TextFormatter);\n","const RE_BR = /(
|)/g;\nconst RE_SPACE = /( |\\u00A0)/g;\nconst RE_CLEAN_HTML = /(
|<\\/div>)/gi;\nconst RE_EXTRA_NEW_LINE = /\\n$/i;\n\nexport function prepareForRegExp(html: string) {\n return html\n .replace(RE_SPACE, ' ')\n .replace(RE_BR, '\\n')\n .replace(RE_CLEAN_HTML, '')\n .replace(RE_EXTRA_NEW_LINE, '');\n}\n","const MAX_NESTING_PARENTS = 5;\n\nexport function isSelectionInsideInput(selectionRange: Range, inputId: string) {\n const { commonAncestorContainer } = selectionRange;\n let parentNode: HTMLElement | null = commonAncestorContainer as HTMLElement;\n let iterations = 1;\n while (parentNode && parentNode.id !== inputId && iterations < MAX_NESTING_PARENTS) {\n parentNode = parentNode.parentElement;\n iterations++;\n }\n\n return Boolean(parentNode && parentNode.id === inputId);\n}\n","import { areSortedArraysEqual } from './iteratees';\n\nconst cache = new WeakMap();\n\nexport default function memoized(fn: T) {\n return (...args: Parameters): ReturnType => {\n const cached = cache.get(fn);\n if (cached && areSortedArraysEqual(cached.lastArgs, args)) {\n return cached.lastResult;\n }\n\n const result = fn(...args);\n cache.set(fn, { lastArgs: args, lastResult: result });\n return result;\n };\n}\n","import {\n useCallback, useEffect, useState,\n} from '../../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { MEMO_EMPTY_ARRAY } from '../../../../util/memo';\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\nimport {\n EmojiData, EmojiModule, EmojiRawData, uncompressEmoji,\n} from '../../../../util/emoji';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport {\n buildCollectionByKey, flatten, mapValues, pickTruthy, unique,\n} from '../../../../util/iteratees';\nimport memoized from '../../../../util/memoized';\nimport useFlag from '../../../../hooks/useFlag';\n\ninterface Library {\n keywords: string[];\n byKeyword: Record;\n names: string[];\n byName: Record;\n}\n\nlet emojiDataPromise: Promise;\nlet emojiRawData: EmojiRawData;\nlet emojiData: EmojiData;\n\nlet RE_EMOJI_SEARCH: RegExp;\nconst EMOJIS_LIMIT = 36;\nconst FILTER_MIN_LENGTH = 2;\n\nconst prepareRecentEmojisMemo = memoized(prepareRecentEmojis);\nconst prepareLibraryMemo = memoized(prepareLibrary);\nconst searchInLibraryMemo = memoized(searchInLibrary);\n\ntry {\n RE_EMOJI_SEARCH = new RegExp('(^|\\\\s):[-+_:\\\\p{L}\\\\p{N}]*$', 'gui');\n} catch (e) {\n // Support for older versions of firefox\n RE_EMOJI_SEARCH = new RegExp('(^|\\\\s):[-+_:\\\\d\\\\wа-яё]*$', 'gi');\n}\n\nexport default function useEmojiTooltip(\n isAllowed: boolean,\n htmlRef: { current: string },\n recentEmojiIds: string[],\n inputId = EDITABLE_INPUT_ID,\n onUpdateHtml: (html: string) => void,\n baseEmojiKeywords?: Record,\n emojiKeywords?: Record,\n isDisabled = false,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [byId, setById] = useState | undefined>();\n const [shouldForceInsertEmoji, setShouldForceInsertEmoji] = useState(false);\n const [filteredEmojis, setFilteredEmojis] = useState(MEMO_EMPTY_ARRAY);\n\n // Initialize data on first render.\n useEffect(() => {\n if (isDisabled) return;\n const exec = () => {\n setById(emojiData.emojis);\n };\n\n if (emojiData) {\n exec();\n } else {\n ensureEmojiData()\n .then(exec);\n }\n }, [isDisabled]);\n\n const html = htmlRef.current;\n useEffect(() => {\n if (!isAllowed || !html || !byId || isDisabled) {\n unmarkIsOpen();\n return;\n }\n\n const code = html.includes(':') && getEmojiCode(html);\n if (!code) {\n setFilteredEmojis(MEMO_EMPTY_ARRAY);\n unmarkIsOpen();\n return;\n }\n\n const forceSend = code.length > 2 && code.endsWith(':');\n const filter = code.substr(1, forceSend ? code.length - 2 : undefined);\n let matched: Emoji[] = MEMO_EMPTY_ARRAY;\n\n setShouldForceInsertEmoji(forceSend);\n\n if (!filter) {\n matched = prepareRecentEmojisMemo(byId, recentEmojiIds, EMOJIS_LIMIT);\n } else if (filter.length >= FILTER_MIN_LENGTH) {\n const library = prepareLibraryMemo(byId, baseEmojiKeywords, emojiKeywords);\n matched = searchInLibraryMemo(library, filter, EMOJIS_LIMIT);\n }\n\n if (matched.length) {\n if (!forceSend) {\n markIsOpen();\n }\n setFilteredEmojis(matched);\n } else {\n unmarkIsOpen();\n }\n }, [\n byId, html, isAllowed, markIsOpen, recentEmojiIds, unmarkIsOpen, setShouldForceInsertEmoji,\n isDisabled, baseEmojiKeywords, emojiKeywords,\n ]);\n\n const insertEmoji = useCallback((textEmoji: string, isForce?: boolean) => {\n const currentHtml = htmlRef.current;\n const atIndex = currentHtml.lastIndexOf(':', isForce ? currentHtml.lastIndexOf(':') - 1 : undefined);\n if (atIndex !== -1) {\n onUpdateHtml(`${currentHtml.substr(0, atIndex)}${textEmoji}`);\n const messageInput = document.getElementById(inputId)!;\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, true);\n });\n }\n\n unmarkIsOpen();\n }, [htmlRef, inputId, onUpdateHtml, unmarkIsOpen]);\n\n useEffect(() => {\n if (isOpen && shouldForceInsertEmoji && filteredEmojis.length) {\n insertEmoji(filteredEmojis[0].native, true);\n }\n }, [filteredEmojis, insertEmoji, isOpen, shouldForceInsertEmoji]);\n\n return {\n isEmojiTooltipOpen: isOpen,\n closeEmojiTooltip: unmarkIsOpen,\n filteredEmojis,\n insertEmoji,\n };\n}\n\nfunction getEmojiCode(html: string) {\n const emojis = prepareForRegExp(html).match(RE_EMOJI_SEARCH);\n\n return emojis ? emojis[0].trim() : undefined;\n}\n\nasync function ensureEmojiData() {\n if (!emojiDataPromise) {\n emojiDataPromise = import('emoji-data-ios/emoji-data.json') as unknown as Promise;\n emojiRawData = (await emojiDataPromise).default;\n\n emojiData = uncompressEmoji(emojiRawData);\n }\n\n return emojiDataPromise;\n}\n\nfunction prepareRecentEmojis(byId: Record, recentEmojiIds: string[], limit: number) {\n if (!byId || !recentEmojiIds.length) {\n return MEMO_EMPTY_ARRAY;\n }\n\n return Object.values(pickTruthy(byId, recentEmojiIds)).slice(0, limit);\n}\n\nfunction prepareLibrary(\n byId: Record,\n baseEmojiKeywords?: Record,\n emojiKeywords?: Record,\n): Library {\n const emojis = Object.values(byId);\n\n const byNative = buildCollectionByKey(emojis, 'native');\n const baseEmojisByKeyword = baseEmojiKeywords\n ? mapValues(baseEmojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n })\n : {};\n const emojisByKeyword = emojiKeywords\n ? mapValues(emojiKeywords, (natives) => {\n return Object.values(pickTruthy(byNative, natives));\n })\n : {};\n\n const byKeyword = { ...baseEmojisByKeyword, ...emojisByKeyword };\n const keywords = ([] as string[]).concat(Object.keys(baseEmojisByKeyword), Object.keys(emojisByKeyword));\n\n const byName = emojis.reduce((result, emoji) => {\n emoji.names.forEach((name) => {\n if (!result[name]) {\n result[name] = [];\n }\n\n result[name].push(emoji);\n });\n\n return result;\n }, {} as Record);\n\n const names = Object.keys(byName);\n\n return {\n byKeyword,\n keywords,\n byName,\n names,\n };\n}\n\nfunction searchInLibrary(library: Library, filter: string, limit: number) {\n const {\n byKeyword, keywords, byName, names,\n } = library;\n\n let matched: Emoji[] = MEMO_EMPTY_ARRAY;\n\n const matchedKeywords = keywords.filter((keyword) => keyword.startsWith(filter)).sort();\n matched = matched.concat(flatten(Object.values(pickTruthy(byKeyword!, matchedKeywords))));\n\n // Also search by names, which is useful for non-English languages\n const matchedNames = names.filter((name) => name.startsWith(filter));\n matched = matched.concat(flatten(Object.values(pickTruthy(byName, matchedNames))));\n\n matched = unique(matched);\n\n return matched.slice(0, limit);\n}\n","import {\n useCallback, useEffect, useState,\n} from '../../../../lib/teact/teact';\nimport { getGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiMessageEntityTypes, ApiChatMember, ApiUser } from '../../../../api/types';\nimport { EDITABLE_INPUT_ID } from '../../../../config';\nimport { filterUsersByName, getUserFirstOrLastName } from '../../../../modules/helpers';\nimport { prepareForRegExp } from '../helpers/prepareForRegExp';\nimport focusEditableElement from '../../../../util/focusEditableElement';\nimport useFlag from '../../../../hooks/useFlag';\nimport { pickTruthy, unique } from '../../../../util/iteratees';\nimport { throttle } from '../../../../util/schedulers';\n\nconst runThrottled = throttle((cb) => cb(), 500, true);\nlet RE_USERNAME_SEARCH: RegExp;\n\ntry {\n RE_USERNAME_SEARCH = new RegExp('(^|\\\\s)@[-_\\\\p{L}\\\\p{M}\\\\p{N}]*$', 'gui');\n} catch (e) {\n // Support for older versions of firefox\n RE_USERNAME_SEARCH = new RegExp('(^|\\\\s)@[-_\\\\d\\\\wа-яё]*$', 'gi');\n}\n\nexport default function useMentionTooltip(\n canSuggestMembers: boolean | undefined,\n htmlRef: { current: string },\n onUpdateHtml: (html: string) => void,\n inputId: string = EDITABLE_INPUT_ID,\n groupChatMembers?: ApiChatMember[],\n topInlineBotIds?: string[],\n currentUserId?: string,\n) {\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const [usersToMention, setUsersToMention] = useState();\n\n const updateFilteredUsers = useCallback((filter, withInlineBots: boolean) => {\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n if (!(groupChatMembers || topInlineBotIds) || !usersById) {\n setUsersToMention(undefined);\n\n return;\n }\n\n runThrottled(() => {\n const memberIds = groupChatMembers?.reduce((acc: string[], member) => {\n if (member.userId !== currentUserId) {\n acc.push(member.userId);\n }\n\n return acc;\n }, []);\n\n const filteredIds = filterUsersByName(unique([\n ...((withInlineBots && topInlineBotIds) || []),\n ...(memberIds || []),\n ]), usersById, filter);\n\n setUsersToMention(Object.values(pickTruthy(usersById, filteredIds)));\n });\n }, [currentUserId, groupChatMembers, topInlineBotIds]);\n\n const html = htmlRef.current;\n useEffect(() => {\n if (!canSuggestMembers || !html.length) {\n unmarkIsOpen();\n return;\n }\n\n const usernameFilter = html.includes('@') && getUsernameFilter(html);\n\n if (usernameFilter) {\n const filter = usernameFilter ? usernameFilter.substr(1) : '';\n updateFilteredUsers(filter, canSuggestInlineBots(html));\n } else {\n unmarkIsOpen();\n }\n }, [canSuggestMembers, updateFilteredUsers, markIsOpen, unmarkIsOpen, html]);\n\n useEffect(() => {\n if (usersToMention?.length) {\n markIsOpen();\n } else {\n unmarkIsOpen();\n }\n }, [markIsOpen, unmarkIsOpen, usersToMention]);\n\n const insertMention = useCallback((user: ApiUser, forceFocus = false) => {\n if (!user.username && !getUserFirstOrLastName(user)) {\n return;\n }\n\n const insertedHtml = user.username\n ? `@${user.username}`\n : `${getUserFirstOrLastName(user)}`;\n\n const currentHtml = htmlRef.current;\n const atIndex = currentHtml.lastIndexOf('@');\n if (atIndex !== -1) {\n onUpdateHtml(`${currentHtml.substr(0, atIndex)}${insertedHtml} `);\n const messageInput = document.getElementById(inputId)!;\n requestAnimationFrame(() => {\n focusEditableElement(messageInput, forceFocus);\n });\n }\n\n unmarkIsOpen();\n }, [htmlRef, inputId, onUpdateHtml, unmarkIsOpen]);\n\n return {\n isMentionTooltipOpen: isOpen,\n closeMentionTooltip: unmarkIsOpen,\n insertMention,\n mentionFilteredUsers: usersToMention,\n };\n}\n\nfunction getUsernameFilter(html: string) {\n const username = prepareForRegExp(html).match(RE_USERNAME_SEARCH);\n\n return username ? username[0].trim() : undefined;\n}\n\nfunction canSuggestInlineBots(html: string) {\n return html.startsWith('@');\n}\n","import { useEffect, useRef } from '../../../lib/teact/teact';\n\nimport useOnChange from '../../../hooks/useOnChange';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\n\nexport default function useAsyncRendering(dependencies: T, delay?: number) {\n const isDisabled = delay === undefined;\n const shouldRenderRef = useRef(isDisabled);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n if (isDisabled) {\n return;\n }\n\n shouldRenderRef.current = false;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, dependencies);\n\n useEffect(() => {\n if (isDisabled || shouldRenderRef.current) {\n return;\n }\n\n const exec = () => {\n shouldRenderRef.current = true;\n forceUpdate();\n };\n\n if (delay! > 0) {\n timeoutRef.current = window.setTimeout(exec, delay);\n } else {\n exec();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n return shouldRenderRef.current;\n}\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, memo, useState,\n} from '../../lib/teact/teact';\n\nimport Checkbox from './Checkbox';\n\ntype IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n};\n\ntype OwnProps = {\n id?: string;\n options: IRadioOption[];\n selected?: string[];\n disabled?: boolean;\n round?: boolean;\n loadingOptions?: string[];\n onChange: (value: string[]) => void;\n};\n\nconst CheckboxGroup: FC = ({\n id,\n options,\n selected = [],\n disabled,\n round,\n loadingOptions,\n onChange,\n}) => {\n const [values, setValues] = useState(selected || []);\n\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value, checked } = event.currentTarget;\n let newValues: string[];\n if (checked) {\n newValues = [...values, value];\n } else {\n newValues = values.filter((v) => v !== value);\n }\n\n setValues(newValues);\n onChange(newValues);\n }, [onChange, values]);\n\n return (\n
\n {options.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default memo(CheckboxGroup);\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Button, { OwnProps as ButtonProps } from './Button';\n\nimport './FloatingActionButton.scss';\n\ntype OwnProps = {\n isShown: boolean;\n className?: string;\n color?: ButtonProps['color'];\n ariaLabel?: ButtonProps['ariaLabel'];\n disabled?: boolean;\n onClick: () => void;\n children: any;\n};\n\nconst FloatingActionButton: FC = ({\n isShown,\n className,\n color = 'primary',\n ariaLabel,\n disabled,\n onClick,\n children,\n}) => {\n const buttonClassName = buildClassName(\n 'FloatingActionButton',\n isShown && 'revealed',\n className,\n );\n\n return (\n \n {children}\n \n );\n};\n\nexport default FloatingActionButton;\n","import { RefObject } from 'react';\nimport React, { FC, useRef, useCallback } from '../../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../../util/environment';\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useContextMenuHandlers from '../../hooks/useContextMenuHandlers';\nimport useContextMenuPosition from '../../hooks/useContextMenuPosition';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\n\nimport RippleEffect from './RippleEffect';\nimport Menu from './Menu';\nimport MenuItem from './MenuItem';\nimport Button from './Button';\n\nimport './ListItem.scss';\n\ninterface MenuItemContextAction {\n title: string;\n icon: string;\n destructive?: boolean;\n handler?: () => void;\n}\n\ninterface OwnProps {\n ref?: RefObject;\n buttonRef?: RefObject;\n icon?: string;\n secondaryIcon?: string;\n className?: string;\n style?: string;\n children: any;\n disabled?: boolean;\n ripple?: boolean;\n narrow?: boolean;\n inactive?: boolean;\n focus?: boolean;\n destructive?: boolean;\n multiline?: boolean;\n isStatic?: boolean;\n contextActions?: MenuItemContextAction[];\n onMouseDown?: (e: React.MouseEvent) => void;\n onClick?: (e: React.MouseEvent) => void;\n onSecondaryIconClick?: (e: React.MouseEvent) => void;\n}\n\nconst ListItem: FC = ({\n ref,\n buttonRef,\n icon,\n secondaryIcon,\n className,\n style,\n children,\n disabled,\n ripple,\n narrow,\n inactive,\n focus,\n destructive,\n multiline,\n isStatic,\n contextActions,\n onMouseDown,\n onClick,\n onSecondaryIconClick,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n const [isTouched, markIsTouched, unmarkIsTouched] = useFlag();\n\n const {\n isContextMenuOpen, contextMenuPosition,\n handleBeforeContextMenu, handleContextMenu,\n handleContextMenuClose, handleContextMenuHide,\n } = useContextMenuHandlers(containerRef, !contextActions);\n\n const getTriggerElement = useCallback(() => containerRef.current, []);\n\n const getRootElement = useCallback(\n () => containerRef.current!.closest('.custom-scroll'),\n [],\n );\n\n const getMenuElement = useCallback(\n () => containerRef.current!.querySelector('.ListItem-context-menu .bubble'),\n [],\n );\n\n const { positionX, positionY, style: menuStyle } = useContextMenuPosition(\n contextMenuPosition,\n getTriggerElement,\n getRootElement,\n getMenuElement,\n );\n\n const handleClick = useCallback((e: React.MouseEvent) => {\n if (disabled || !onClick) {\n return;\n }\n onClick(e);\n\n if (IS_TOUCH_ENV && !ripple) {\n markIsTouched();\n fastRaf(unmarkIsTouched);\n }\n }, [disabled, markIsTouched, onClick, ripple, unmarkIsTouched]);\n\n const handleSecondaryIconClick = (e: React.MouseEvent) => {\n if (disabled || e.button !== 0 || (!onSecondaryIconClick && !contextActions)) return;\n\n e.stopPropagation();\n if (onSecondaryIconClick) {\n onSecondaryIconClick(e);\n } else {\n handleContextMenu(e);\n }\n };\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n if (inactive || IS_TOUCH_ENV) {\n return;\n }\n if (contextActions && (e.button === 2 || !onClick)) {\n handleBeforeContextMenu(e);\n }\n if (e.button === 0) {\n if (!onClick) {\n handleContextMenu(e);\n } else {\n handleClick(e);\n }\n }\n }, [inactive, contextActions, onClick, handleBeforeContextMenu, handleContextMenu, handleClick]);\n\n const lang = useLang();\n\n const fullClassName = buildClassName(\n 'ListItem',\n className,\n !isStatic && 'no-selection',\n ripple && 'has-ripple',\n narrow && 'narrow',\n disabled && 'disabled',\n inactive && 'inactive',\n contextMenuPosition && 'has-menu-open',\n focus && 'focus',\n destructive && 'destructive',\n multiline && 'multiline',\n isStatic && 'is-static',\n );\n\n return (\n \n \n {icon && (\n \n )}\n {multiline && (
{children}
)}\n {!multiline && children}\n {!disabled && !inactive && ripple && (\n \n )}\n {secondaryIcon && (\n \n \n \n )}\n
\n {contextActions && contextMenuPosition !== undefined && (\n \n {contextActions.map((action) => (\n \n {action.title}\n \n ))}\n \n )}\n
\n );\n};\n\nexport default ListItem;\n","import React, {\n FC,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from '../../lib/teact/teact';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { TextPart } from '../common/helpers/renderMessageText';\nimport buildClassName from '../../util/buildClassName';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\n\nimport Portal from './Portal';\n\nimport './Notification.scss';\n\ntype OwnProps = {\n containerId?: string;\n message: TextPart[];\n duration?: number;\n onDismiss: () => void;\n};\n\nconst DEFAULT_DURATION = 3000;\nconst ANIMATION_DURATION = 150;\n\nconst Notification: FC = ({\n message, duration = DEFAULT_DURATION, containerId, onDismiss,\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n // eslint-disable-next-line no-null/no-null\n const timerRef = useRef(null);\n\n const { transitionClassNames } = useShowTransition(isOpen);\n\n const closeAndDismiss = useCallback(() => {\n setIsOpen(false);\n setTimeout(onDismiss, ANIMATION_DURATION + ANIMATION_END_DELAY);\n }, [onDismiss]);\n\n useEffect(() => (isOpen ? captureEscKeyListener(closeAndDismiss) : undefined), [isOpen, closeAndDismiss]);\n\n useEffect(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n };\n }, [duration, closeAndDismiss]);\n\n const handleMouseEnter = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = undefined;\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timerRef.current = window.setTimeout(closeAndDismiss, duration);\n }, [duration, closeAndDismiss]);\n\n return (\n \n \n
\n {message}\n
\n
\n \n );\n};\n\nexport default Notification;\n","import React, {\n FC, useEffect, useRef, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './ProgressSpinner.scss';\n\nconst RADIUSES = {\n s: 22, m: 25, l: 28, xl: 20,\n};\nconst STROKE_WIDTH = 2;\nconst MIN_PROGRESS = 0.05;\nconst MAX_PROGRESS = 1;\n\nconst ProgressSpinner: FC<{\n progress?: number;\n size?: 's' | 'm' | 'l' | 'xl';\n square?: boolean;\n transparent?: boolean;\n noCross?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n}> = ({\n progress = 0,\n size = 'l',\n square,\n transparent,\n noCross,\n onClick,\n}) => {\n const radius = RADIUSES[size];\n const circleRadius = radius - STROKE_WIDTH * 2;\n const borderRadius = radius - 1;\n const circumference = circleRadius * 2 * Math.PI;\n // eslint-disable-next-line no-null/no-null\n const container = useRef(null);\n\n useEffect(() => {\n if (!container.current) {\n return;\n }\n\n const svg = container.current.firstElementChild;\n const strokeDashOffset = circumference - Math.min(Math.max(MIN_PROGRESS, progress), MAX_PROGRESS) * circumference;\n\n if (!svg) {\n container.current.innerHTML = `\n \n `;\n } else {\n (svg.firstElementChild as SVGElement).setAttribute('stroke-dashoffset', strokeDashOffset.toString());\n }\n }, [container, circumference, borderRadius, circleRadius, progress]);\n\n const className = buildClassName(\n `ProgressSpinner size-${size}`,\n transparent && 'transparent',\n square && 'square',\n noCross && 'no-cross',\n );\n\n return (\n \n );\n};\n\nexport default memo(ProgressSpinner);\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport Spinner from './Spinner';\n\nimport './Radio.scss';\n\ntype OwnProps = {\n id?: string;\n name: string;\n label: string;\n subLabel?: string;\n value: string;\n checked: boolean;\n disabled?: boolean;\n hidden?: boolean;\n isLoading?: boolean;\n onChange: (e: ChangeEvent) => void;\n};\n\nconst Radio: FC = ({\n id,\n label,\n subLabel,\n value,\n name,\n checked,\n disabled,\n hidden,\n isLoading,\n onChange,\n}) => {\n const lang = useLang();\n const className = buildClassName(\n 'Radio',\n disabled && 'disabled',\n hidden && 'hidden-widget',\n isLoading && 'loading',\n );\n\n return (\n \n );\n};\n\nexport default memo(Radio);\n","import { ChangeEvent } from 'react';\nimport React, { FC, useCallback, memo } from '../../lib/teact/teact';\n\nimport Radio from './Radio';\n\nexport type IRadioOption = {\n label: string;\n subLabel?: string;\n value: string;\n hidden?: boolean;\n};\n\ntype OwnProps = {\n id?: string;\n name: string;\n options: IRadioOption[];\n selected?: string;\n disabled?: boolean;\n loadingOption?: string;\n onChange: (value: string) => void;\n};\n\nconst RadioGroup: FC = ({\n id,\n name,\n options,\n selected,\n disabled,\n loadingOption,\n onChange,\n}) => {\n const handleChange = useCallback((event: ChangeEvent) => {\n const { value } = event.currentTarget;\n onChange(value);\n }, [onChange]);\n\n return (\n
\n {options.map((option) => (\n
\n );\n};\n\nexport default memo(RadioGroup);\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, useCallback, useMemo, memo,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './RangeSlider.scss';\n\ntype OwnProps = {\n options?: string[];\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n value: number;\n renderValue?: (value: number) => string;\n disabled?: boolean;\n onChange: (value: number) => void;\n};\n\nconst RangeSlider: FC = ({\n options,\n min = 0,\n max = options ? options.length - 1 : 100,\n step = 1,\n label,\n value,\n renderValue,\n disabled,\n onChange,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent) => {\n onChange(Number(event.currentTarget.value));\n }, [onChange]);\n\n const className = buildClassName(\n 'RangeSlider',\n disabled && 'disabled',\n );\n\n const trackWidth = useMemo(() => {\n if (options) {\n return (value / (options.length - 1)) * 100;\n } else {\n const possibleValuesLength = (max - min) / step;\n return ((value - min) / possibleValuesLength) * 100;\n }\n }, [options, value, max, min, step]);\n\n return (\n
\n {label && (\n
\n {label}\n {!options && (\n {renderValue ? renderValue(value) : value}\n )}\n
\n )}\n
\n \n \n {options && (\n
\n {options.map((option, index) => (\n onChange(index)}\n >\n {option}\n
\n ))}\n
\n )}\n
\n
\n );\n};\n\nexport default memo(RangeSlider);\n","import { RefObject } from 'react';\nimport React, {\n FC, useRef, useEffect, memo, useCallback,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\nimport useInputFocusOnOpen from '../../hooks/useInputFocusOnOpen';\n\nimport Loading from './Loading';\nimport Button from './Button';\n\nimport './SearchInput.scss';\n\ntype OwnProps = {\n ref?: RefObject;\n children?: any;\n parentContainerClassName?: string;\n className?: string;\n inputId?: string;\n value?: string;\n focused?: boolean;\n isLoading?: boolean;\n placeholder?: string;\n disabled?: boolean;\n autoComplete?: string;\n canClose?: boolean;\n autoFocusSearch?: boolean;\n onChange: (value: string) => void;\n onReset?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n onBlur?: NoneToVoidFunction;\n};\n\nconst SearchInput: FC = ({\n ref,\n children,\n parentContainerClassName,\n value,\n inputId,\n className,\n focused,\n isLoading,\n placeholder,\n disabled,\n autoComplete,\n canClose,\n autoFocusSearch,\n onChange,\n onReset,\n onFocus,\n onBlur,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let inputRef = useRef(null);\n if (ref) {\n inputRef = ref;\n }\n\n const [isInputFocused, markInputFocused, unmarkInputFocused] = useFlag(focused);\n\n useInputFocusOnOpen(inputRef, autoFocusSearch, unmarkInputFocused);\n\n useEffect(() => {\n if (!inputRef.current) {\n return;\n }\n\n if (focused) {\n inputRef.current.focus();\n } else {\n inputRef.current.blur();\n }\n }, [focused, placeholder]); // Trick for setting focus when selecting a contact to search for\n\n const lang = useLang();\n\n function handleChange(event: React.ChangeEvent) {\n const { currentTarget } = event;\n onChange(currentTarget.value);\n }\n\n function handleFocus() {\n markInputFocused();\n if (onFocus) {\n onFocus();\n }\n }\n\n function handleBlur() {\n unmarkInputFocused();\n if (onBlur) {\n onBlur();\n }\n }\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter') {\n const element = document.querySelector(`.${parentContainerClassName} .ListItem-button`) as HTMLElement;\n if (element) {\n element.focus();\n }\n }\n }, [parentContainerClassName]);\n\n return (\n \n {children}\n \n \n {isLoading && (\n \n )}\n {!isLoading && (value || canClose) && onReset && (\n \n \n \n )}\n
\n );\n};\n\nexport default memo(SearchInput);\n","import React, { FC, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport usePrevious from '../../hooks/usePrevious';\nimport buildClassName from '../../util/buildClassName';\n\ntype ChildrenFn = () => any;\n\ntype OwnProps = {\n isOpen: boolean;\n isCustom?: boolean;\n id?: string;\n className?: string;\n onClick?: (e: React.MouseEvent) => void;\n children: ChildrenFn;\n};\n\nconst ShowTransition: FC = ({\n isOpen, isCustom, id, className, onClick, children,\n}) => {\n const { shouldRender, transitionClassNames } = useShowTransition(\n isOpen, undefined, undefined, isCustom ? false : undefined,\n );\n const prevIsOpen = usePrevious(isOpen);\n const prevChildren = usePrevious(children);\n const fromChildrenRef = useRef();\n\n if (prevIsOpen && !isOpen) {\n fromChildrenRef.current = prevChildren;\n }\n\n return (\n shouldRender && (\n
\n {isOpen ? children() : fromChildrenRef.current!()}\n
\n )\n );\n};\n\nexport default ShowTransition;\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Switcher.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n checked?: boolean;\n disabled?: boolean;\n inactive?: boolean;\n noAnimation?: boolean;\n onChange?: (e: ChangeEvent) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Switcher: FC = ({\n id,\n name,\n value,\n label,\n checked = false,\n disabled,\n inactive,\n noAnimation,\n onChange,\n onCheck,\n}) => {\n const handleChange = useCallback((e: ChangeEvent) => {\n if (onChange) {\n onChange(e);\n }\n\n if (onCheck) {\n onCheck(e.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Switcher',\n disabled && 'disabled',\n inactive && 'inactive',\n noAnimation && 'no-animation',\n );\n\n return (\n \n );\n};\n\nexport default memo(Switcher);\n","import React, {\n FC, useRef, memo, useEffect,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport forceReflow from '../../util/forceReflow';\nimport renderText from '../common/helpers/renderText';\n\nimport './Tab.scss';\n\ntype OwnProps = {\n className?: string;\n title: string;\n isActive?: boolean;\n badgeCount?: number;\n isBadgeActive?: boolean;\n previousActiveTab?: number;\n onClick: (arg: number) => void;\n clickArg: number;\n};\n\nconst classNames = {\n active: 'Tab--active',\n badgeActive: 'Tab__badge--active',\n};\n\nconst Tab: FC = ({\n className,\n title,\n isActive,\n badgeCount,\n isBadgeActive,\n previousActiveTab,\n onClick,\n clickArg,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const tabRef = useRef(null);\n\n useEffect(() => {\n // Set initial active state\n if (isActive && previousActiveTab === undefined && tabRef.current) {\n tabRef.current.classList.add(classNames.active);\n }\n\n if (!isActive || previousActiveTab === undefined) {\n return;\n }\n\n const tabEl = tabRef.current!;\n const prevTabEl = tabEl.parentElement!.children[previousActiveTab];\n if (!prevTabEl) {\n return;\n }\n\n const platformEl = tabEl.querySelector('i')!;\n const prevPlatformEl = prevTabEl.querySelector('i')!;\n\n // We move and resize the platform, so it repeats the position and size of the previous one\n const shiftLeft = prevPlatformEl.parentElement!.offsetLeft - platformEl.parentElement!.offsetLeft;\n const scaleFactor = prevPlatformEl.clientWidth / platformEl.clientWidth;\n\n prevPlatformEl.classList.remove('animate');\n platformEl.classList.remove('animate');\n platformEl.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n forceReflow(platformEl);\n platformEl.classList.add('animate');\n platformEl.style.transform = 'none';\n\n prevTabEl.classList.remove(classNames.active);\n tabEl.classList.add(classNames.active);\n }, [isActive, previousActiveTab]);\n\n return (\n onClick(clickArg)}\n ref={tabRef}\n >\n \n {renderText(title)}\n {!!badgeCount && (\n {badgeCount}\n )}\n \n \n
\n );\n};\n\nexport default memo(Tab);\n","import React, {\n FC, memo, useRef, useEffect,\n} from '../../lib/teact/teact';\n\nimport { IS_ANDROID, IS_IOS } from '../../util/environment';\nimport fastSmoothScrollHorizontal from '../../util/fastSmoothScrollHorizontal';\nimport usePrevious from '../../hooks/usePrevious';\nimport useHorizontalScroll from '../../hooks/useHorizontalScroll';\nimport useLang from '../../hooks/useLang';\n\nimport Tab from './Tab';\n\nimport './TabList.scss';\n\nexport type TabWithProperties = {\n title: string;\n badgeCount?: number;\n isBadgeActive?: boolean;\n};\n\ntype OwnProps = {\n tabs: readonly TabWithProperties[];\n activeTab: number;\n big?: boolean;\n onSwitchTab: (index: number) => void;\n};\n\nconst TAB_SCROLL_THRESHOLD_PX = 16;\n// Should match duration from `--slide-transition` CSS variable\nconst SCROLL_DURATION = IS_IOS ? 450 : IS_ANDROID ? 400 : 300;\n\nconst TabList: FC = ({\n tabs, activeTab, big, onSwitchTab,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const previousActiveTab = usePrevious(activeTab);\n\n useHorizontalScroll(containerRef.current);\n\n // Scroll container to place active tab in the center\n useEffect(() => {\n const container = containerRef.current!;\n const { scrollWidth, offsetWidth, scrollLeft } = container;\n if (scrollWidth <= offsetWidth) {\n return;\n }\n\n const activeTabElement = container.childNodes[activeTab] as HTMLElement | null;\n if (!activeTabElement) {\n return;\n }\n\n const { offsetLeft: activeTabOffsetLeft, offsetWidth: activeTabOffsetWidth } = activeTabElement;\n const newLeft = activeTabOffsetLeft - (offsetWidth / 2) + (activeTabOffsetWidth / 2);\n\n // Prevent scrolling by only a couple of pixels, which doesn't look smooth\n if (Math.abs(newLeft - scrollLeft) < TAB_SCROLL_THRESHOLD_PX) {\n return;\n }\n\n fastSmoothScrollHorizontal(container, newLeft, SCROLL_DURATION);\n }, [activeTab]);\n\n const lang = useLang();\n\n return (\n \n {tabs.map((tab, i) => (\n \n ))}\n \n );\n};\n\nexport default memo(TabList);\n","import { RefObject } from 'react';\nimport React, {\n FC, useLayoutEffect, useRef,\n} from '../../lib/teact/teact';\nimport { getGlobal } from '../../lib/teact/teactn';\nimport { GlobalState } from '../../global/types';\n\nimport { ANIMATION_LEVEL_MIN } from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport forceReflow from '../../util/forceReflow';\nimport { waitForAnimationEnd, waitForTransitionEnd } from '../../util/cssAnimationEndListeners';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport usePrevious from '../../hooks/usePrevious';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport './Transition.scss';\n\ntype ChildrenFn = (isActive: boolean, isFrom: boolean, currentKey: number) => any;\nexport type TransitionProps = {\n ref?: RefObject;\n activeKey: number;\n name: (\n 'none' | 'slide' | 'slide-rtl' | 'mv-slide' | 'slide-fade' | 'zoom-fade' | 'slide-layers'\n | 'fade' | 'push-slide' | 'reveal' | 'slide-optimized' | 'slide-optimized-rtl'\n );\n direction?: 'auto' | 'inverse' | 1 | -1;\n renderCount?: number;\n shouldRestoreHeight?: boolean;\n shouldCleanup?: boolean;\n cleanupExceptionKey?: number;\n isDisabled?: boolean;\n id?: string;\n className?: string;\n onStart?: NoneToVoidFunction;\n onStop?: NoneToVoidFunction;\n children: ChildrenFn;\n};\n\nconst CLEANED_UP = Symbol('CLEANED_UP');\n\nconst classNames = {\n active: 'Transition__slide--active',\n};\n\nconst Transition: FC = ({\n ref,\n activeKey,\n name,\n direction = 'auto',\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n id,\n className,\n onStart,\n onStop,\n children,\n}) => {\n // No need for a container to update on change\n const { animationLevel } = getGlobal().settings.byKey;\n const currentKeyRef = useRef();\n\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const rendersRef = useRef>({});\n const prevActiveKey = usePrevious(activeKey);\n const forceUpdate = useForceUpdate();\n\n const activeKeyChanged = prevActiveKey !== undefined && activeKey !== prevActiveKey;\n\n if (!renderCount && activeKeyChanged) {\n rendersRef.current = { [prevActiveKey]: rendersRef.current[prevActiveKey] };\n }\n\n rendersRef.current[activeKey] = children;\n\n useLayoutEffect(() => {\n function cleanup() {\n if (!shouldCleanup || (cleanupExceptionKey !== undefined && cleanupExceptionKey === prevActiveKey)) {\n return;\n }\n\n rendersRef.current = { [prevActiveKey]: CLEANED_UP };\n forceUpdate();\n }\n\n const container = containerRef.current!;\n\n const childElements = container.children;\n if (childElements.length === 1 && !activeKeyChanged) {\n if (name.startsWith('slide-optimized')) {\n (childElements[0] as HTMLElement).style.transition = 'none';\n (childElements[0] as HTMLElement).style.transform = 'translate3d(0, 0, 0)';\n }\n\n childElements[0].classList.add(classNames.active);\n\n return;\n }\n\n const childNodes = Array.from(container.childNodes);\n\n if (!activeKeyChanged || !childNodes.length) {\n return;\n }\n\n currentKeyRef.current = activeKey;\n\n const isBackwards = (\n direction === -1\n || (direction === 'auto' && prevActiveKey > activeKey)\n || (direction === 'inverse' && prevActiveKey < activeKey)\n );\n\n const keys = Object.keys(rendersRef.current).map(Number);\n const prevActiveIndex = renderCount ? prevActiveKey : keys.indexOf(prevActiveKey);\n const activeIndex = renderCount ? activeKey : keys.indexOf(activeKey);\n\n if (name === 'slide-optimized' || name === 'slide-optimized-rtl') {\n performSlideOptimized(\n animationLevel,\n name,\n isBackwards,\n cleanup,\n activeKey,\n currentKeyRef,\n container,\n shouldRestoreHeight,\n onStart,\n onStop,\n childNodes[activeIndex] as HTMLElement,\n childNodes[prevActiveIndex] as HTMLElement,\n );\n\n return;\n }\n\n container.classList.remove('animating');\n container.classList.toggle('backwards', isBackwards);\n\n if (name === 'none' || animationLevel === ANIMATION_LEVEL_MIN) {\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle(classNames.active, i === activeIndex);\n }\n });\n\n cleanup();\n\n return;\n }\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove(classNames.active);\n node.classList.toggle('from', i === prevActiveIndex);\n node.classList.toggle('through', (\n (i > prevActiveIndex && i < activeIndex) || (i < prevActiveIndex && i > activeIndex)\n ));\n node.classList.toggle('to', i === activeIndex);\n }\n });\n\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n requestAnimationFrame(() => {\n container.classList.add('animating');\n\n onStart?.();\n\n function onAnimationEnd() {\n requestAnimationFrame(() => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\n container.classList.remove('animating', 'backwards');\n\n childNodes.forEach((node, i) => {\n if (node instanceof HTMLElement) {\n node.classList.remove('from', 'through', 'to');\n node.classList.toggle(classNames.active, i === activeIndex);\n }\n });\n\n if (shouldRestoreHeight) {\n const activeElement = container.querySelector(`.${classNames.active}`);\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n }\n }\n\n onStop?.();\n dispatchHeavyAnimationStop();\n cleanup();\n });\n }\n\n const watchedNode = name === 'mv-slide'\n ? childNodes[activeIndex]?.firstChild\n : name === 'reveal' && isBackwards\n ? childNodes[prevActiveIndex]\n : childNodes[activeIndex];\n\n if (watchedNode) {\n waitForAnimationEnd(watchedNode, onAnimationEnd);\n } else {\n onAnimationEnd();\n }\n });\n }, [\n activeKey,\n prevActiveKey,\n activeKeyChanged,\n direction,\n name,\n onStart,\n onStop,\n renderCount,\n shouldRestoreHeight,\n shouldCleanup,\n cleanupExceptionKey,\n animationLevel,\n forceUpdate,\n ]);\n\n useLayoutEffect(() => {\n if (shouldRestoreHeight) {\n const container = containerRef.current!;\n const activeElement = container.querySelector(`.${classNames.active}`)\n || container.querySelector('.from');\n\n if (activeElement) {\n activeElement.style.height = 'auto';\n container.style.height = `${activeElement.clientHeight}px`;\n container.style.flexBasis = `${activeElement.clientHeight}px`;\n }\n }\n }, [shouldRestoreHeight, children]);\n\n const renders = rendersRef.current;\n const collection = Object.keys(renderCount ? new Array(renderCount).fill(undefined) : renders).map(Number);\n\n const contents = collection.map((key) => {\n const render = renders[key];\n\n return (\n typeof render === 'function' ? (\n
{render(key === activeKey, key === prevActiveKey, activeKey)}
\n ) : undefined\n );\n });\n\n return (\n \n {contents}\n \n );\n};\n\nexport default Transition;\n\nfunction performSlideOptimized(\n animationLevel: GlobalState['settings']['byKey']['animationLevel'],\n name: 'slide-optimized' | 'slide-optimized-rtl',\n isBackwards: boolean,\n cleanup: NoneToVoidFunction,\n activeKey: number,\n currentKeyRef: { current: number | undefined },\n container: HTMLElement,\n shouldRestoreHeight?: boolean,\n onStart?: NoneToVoidFunction,\n onStop?: NoneToVoidFunction,\n toSlide?: HTMLElement,\n fromSlide?: HTMLElement,\n) {\n if (!fromSlide || !toSlide) {\n return;\n }\n\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = '';\n fromSlide.classList.remove(classNames.active);\n\n toSlide.style.transition = 'none';\n toSlide.style.transform = 'translate3d(0, 0, 0)';\n toSlide.classList.add(classNames.active);\n\n cleanup();\n\n return;\n }\n\n if (name === 'slide-optimized-rtl') {\n isBackwards = !isBackwards;\n }\n\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n requestAnimationFrame(() => {\n onStart?.();\n\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = 'translate3d(0, 0, 0)';\n\n toSlide.style.transition = 'none';\n toSlide.style.transform = `translate3d(${isBackwards ? '-' : ''}100%, 0, 0)`;\n\n forceReflow(toSlide);\n\n fromSlide.style.transition = '';\n fromSlide.style.transform = `translate3d(${isBackwards ? '' : '-'}100%, 0, 0)`;\n\n toSlide.style.transition = '';\n toSlide.style.transform = 'translate3d(0, 0, 0)';\n\n fromSlide.classList.remove(classNames.active);\n toSlide.classList.add(classNames.active);\n\n waitForTransitionEnd(fromSlide, () => {\n if (activeKey !== currentKeyRef.current) {\n return;\n }\n\n fromSlide.style.transition = 'none';\n fromSlide.style.transform = '';\n\n if (shouldRestoreHeight) {\n toSlide.style.height = 'auto';\n container.style.height = `${toSlide.clientHeight}px`;\n }\n\n onStop?.();\n dispatchHeavyAnimationStop();\n cleanup();\n });\n });\n}\n","import useReducer, { StateReducer, Dispatch } from '../useReducer';\nimport { ApiChatFolder } from '../../api/types';\nimport { pick, omit } from '../../util/iteratees';\n\nexport type FolderChatType = {\n icon: string;\n title: string;\n key: keyof Pick;\n};\n\nexport const INCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'user', title: 'FilterContacts', key: 'contacts' },\n { icon: 'non-contacts', title: 'FilterNonContacts', key: 'nonContacts' },\n { icon: 'group', title: 'FilterGroups', key: 'groups' },\n { icon: 'channel', title: 'FilterChannels', key: 'channels' },\n { icon: 'bots', title: 'FilterBots', key: 'bots' },\n];\n\nexport const EXCLUDED_CHAT_TYPES: FolderChatType[] = [\n { icon: 'mute', title: 'FilterMuted', key: 'excludeMuted' },\n { icon: 'archive', title: 'FilterArchived', key: 'excludeArchived' },\n { icon: 'readchats', title: 'FilterRead', key: 'excludeRead' },\n];\n\nconst INCLUDE_FILTER_FIELDS: Array = [\n 'includedChatIds', 'bots', 'channels', 'groups', 'contacts', 'nonContacts',\n];\nconst EXCLUDE_FILTER_FIELDS: Array = [\n 'excludedChatIds', 'excludeArchived', 'excludeMuted', 'excludeRead',\n];\n\nexport function selectChatFilters(state: FoldersState, mode: 'included' | 'excluded', selectTemp?: boolean) {\n let selectedChatIds: string[] = [];\n let selectedChatTypes: FolderChatType['key'][] = [];\n\n if (mode === 'included') {\n const {\n includedChatIds,\n ...includeFilters\n } = selectTemp\n ? state.includeFilters || {}\n : pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = includedChatIds || [];\n selectedChatTypes = (Object.keys(includeFilters) as Array)\n .filter((key) => Boolean(includeFilters[key]));\n } else {\n const {\n excludedChatIds,\n ...excludeFilters\n } = selectTemp\n ? state.excludeFilters || {}\n : pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n );\n\n selectedChatIds = excludedChatIds || [];\n selectedChatTypes = (Object.keys(excludeFilters) as Array)\n .filter((key) => Boolean(excludeFilters[key]));\n }\n\n return {\n selectedChatIds,\n selectedChatTypes,\n };\n}\n\nfunction getSuggestedFolderName(includeFilters?: FolderIncludeFilters) {\n if (includeFilters) {\n const {\n includedChatIds,\n ...filters\n } = includeFilters;\n\n if (\n Object.values(filters).filter(Boolean).length > 1\n || (includedChatIds?.length)\n ) {\n return '';\n }\n\n if (filters.bots) {\n return 'Bots';\n } else if (filters.groups) {\n return 'Groups';\n } else if (filters.channels) {\n return 'Channels';\n } else if (filters.contacts) {\n return 'Contacts';\n } else if (filters.nonContacts) {\n return 'Non-Contacts';\n }\n }\n\n return '';\n}\n\ntype FolderIncludeFilters = Pick;\ntype FolderExcludeFilters = Pick;\n\nexport type FoldersState = {\n mode: 'create' | 'edit';\n isLoading?: boolean;\n isTouched?: boolean;\n error?: string;\n folderId?: number;\n chatFilter: string;\n folder: Omit;\n includeFilters?: FolderIncludeFilters;\n excludeFilters?: FolderExcludeFilters;\n};\nexport type FoldersActions = (\n 'setTitle' | 'saveFilters' | 'editFolder' | 'reset' | 'setChatFilter' | 'setIsLoading' | 'setError' |\n 'editIncludeFilters' | 'editExcludeFilters' | 'setIncludeFilters' | 'setExcludeFilters'\n);\nexport type FolderEditDispatch = Dispatch;\n\nconst INITIAL_STATE: FoldersState = {\n mode: 'create',\n chatFilter: '',\n folder: {\n title: '',\n includedChatIds: [],\n excludedChatIds: [],\n },\n};\n\nconst foldersReducer: StateReducer = (\n state,\n action,\n) => {\n switch (action.type) {\n case 'setTitle':\n return {\n ...state,\n folder: {\n ...state.folder,\n title: action.payload,\n },\n isTouched: true,\n };\n case 'editIncludeFilters':\n return {\n ...state,\n includeFilters: pick(\n state.folder,\n INCLUDE_FILTER_FIELDS,\n ),\n };\n case 'editExcludeFilters':\n return {\n ...state,\n excludeFilters: pick(\n state.folder,\n EXCLUDE_FILTER_FIELDS,\n ),\n };\n case 'setIncludeFilters':\n return {\n ...state,\n includeFilters: action.payload,\n chatFilter: '',\n };\n case 'setExcludeFilters':\n return {\n ...state,\n excludeFilters: action.payload,\n chatFilter: '',\n };\n case 'saveFilters':\n if (state.includeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, INCLUDE_FILTER_FIELDS),\n title: state.folder.title ? state.folder.title : getSuggestedFolderName(state.includeFilters),\n ...state.includeFilters,\n },\n includeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else if (state.excludeFilters) {\n return {\n ...state,\n folder: {\n ...omit(state.folder, EXCLUDE_FILTER_FIELDS),\n ...state.excludeFilters,\n },\n excludeFilters: undefined,\n chatFilter: '',\n isTouched: true,\n };\n } else {\n return state;\n }\n case 'editFolder': {\n const { id: folderId, description, ...folder } = action.payload;\n\n return {\n mode: 'edit',\n folderId,\n folder,\n chatFilter: '',\n };\n }\n case 'setChatFilter': {\n return {\n ...state,\n chatFilter: action.payload,\n };\n }\n case 'setIsLoading': {\n return {\n ...state,\n isLoading: action.payload,\n };\n }\n case 'setError': {\n return {\n ...state,\n error: action.payload,\n };\n }\n case 'reset':\n return INITIAL_STATE;\n default:\n return state;\n }\n};\n\nexport default () => {\n return useReducer(foldersReducer, INITIAL_STATE);\n};\n","import {\n useCallback, useEffect, useRef, useState,\n} from '../lib/teact/teact';\nimport { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { register, Track, TrackId } from '../util/audioPlayer';\nimport useEffectWithPrevDeps from './useEffectWithPrevDeps';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\nimport useOnChange from './useOnChange';\nimport {\n MediaSessionHandlers, registerMediaSession, setPlaybackState, setPositionState, updateMetadata,\n} from '../util/mediaSession';\n\ntype Handler = (e: Event) => void;\n\nconst DEFAULT_SKIP_TIME = 10;\n\nexport default (\n trackId: TrackId,\n originalDuration: number, // Sometimes incorrect for voice messages\n trackType: Track['type'],\n src?: string,\n handlers?: Record,\n metadata?: MediaMetadata,\n onInit?: (element: HTMLAudioElement) => void,\n shouldPlay = false,\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n noPlaylist = false,\n noProgressUpdates = false,\n) => {\n // eslint-disable-next-line no-null/no-null\n const controllerRef = useRef>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n let isPlayingSync = isPlaying;\n\n const [playProgress, setPlayProgress] = useState(0);\n\n const handleTrackChange = useCallback(() => {\n setIsPlaying(false);\n if (onTrackChange) onTrackChange();\n }, [onTrackChange]);\n\n useOnChange(() => {\n controllerRef.current = register(trackId, trackType, (eventName, e) => {\n switch (eventName) {\n case 'onPlay': {\n const {\n setVolume, setPlaybackRate, toggleMuted, proxy,\n } = controllerRef.current!;\n setIsPlaying(true);\n\n registerMediaSession(metadata, makeMediaHandlers(controllerRef));\n setPlaybackState('playing');\n setVolume(getGlobal().audioPlayer.volume);\n toggleMuted(!!getGlobal().audioPlayer.isMuted);\n if (trackType === 'voice') {\n setPlaybackRate(getGlobal().audioPlayer.playbackRate);\n }\n\n setPositionState({\n duration: proxy.duration || 0,\n playbackRate: proxy.playbackRate,\n position: proxy.currentTime,\n });\n break;\n }\n case 'onRateChange': {\n const { proxy } = controllerRef.current!;\n setPositionState({\n duration: proxy.duration || 0,\n playbackRate: proxy.playbackRate,\n position: proxy.currentTime,\n });\n break;\n }\n case 'onPause':\n setIsPlaying(false);\n setPlaybackState('paused');\n break;\n case 'onTimeUpdate': {\n const { proxy } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n if (!noProgressUpdates) setPlayProgress(proxy.currentTime / duration);\n break;\n }\n case 'onEnded': {\n setPlaybackState('paused');\n break;\n }\n }\n\n handlers?.[eventName]?.(e);\n }, onForcePlay, handleTrackChange);\n\n const { proxy } = controllerRef.current!;\n\n if (!isPlaying && !proxy.paused) {\n setIsPlaying(true);\n isPlayingSync = true;\n }\n\n if (onInit) {\n onInit(proxy);\n }\n }, [trackId]);\n\n useEffect(() => {\n if (isPlaying && metadata) updateMetadata(metadata);\n }, [metadata, isPlaying]);\n\n const {\n play,\n pause,\n setCurrentTime,\n proxy,\n destroy,\n setVolume,\n stop,\n isFirst,\n isLast,\n requestNextTrack,\n requestPreviousTrack,\n setPlaybackRate,\n toggleMuted,\n } = controllerRef.current!;\n const duration = proxy.duration && Number.isFinite(proxy.duration) ? proxy.duration : originalDuration;\n\n // RAF progress\n useEffect(() => {\n if (duration && !isSafariPatchInProgress(proxy) && !noProgressUpdates) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, playProgress, proxy, noProgressUpdates]);\n\n // Cleanup\n useEffect(() => () => {\n destroy(noPlaylist);\n }, [destroy, noPlaylist]);\n\n // Autoplay once `src` is present\n useEffectWithPrevDeps(([prevShouldPlay, prevSrc]) => {\n if (prevShouldPlay === shouldPlay && src === prevSrc) {\n return;\n }\n\n // When paused by another player\n if (proxy.src && proxy.paused) {\n return;\n }\n\n if (shouldPlay && src && !isPlaying) {\n play(src);\n }\n }, [shouldPlay, src, isPlaying, play, proxy.src, proxy.paused]);\n\n const playIfPresent = useCallback(() => {\n if (src) {\n play(src);\n }\n }, [src, play]);\n\n const playPause = useCallback(() => {\n if (isPlaying) {\n pause();\n } else {\n playIfPresent();\n }\n }, [pause, playIfPresent, isPlaying]);\n\n const setTime = useCallback((time: number) => {\n setCurrentTime(time);\n if (duration) {\n setPlayProgress(proxy.currentTime / duration);\n }\n }, [duration, proxy, setCurrentTime]);\n\n return {\n isPlaying: isPlayingSync,\n playProgress,\n playPause,\n pause,\n play: playIfPresent,\n stop,\n setCurrentTime: setTime,\n setVolume,\n audioProxy: proxy,\n duration,\n requestNextTrack,\n requestPreviousTrack,\n isFirst,\n isLast,\n setPlaybackRate,\n toggleMuted,\n };\n};\n\nfunction makeMediaHandlers(controllerRef: React.RefObject>) {\n let mediaHandlers: MediaSessionHandlers = {};\n if (controllerRef && controllerRef.current) {\n const {\n play, pause, setCurrentTime, proxy, requestNextTrack, requestPreviousTrack, isFirst, isLast,\n } = controllerRef.current;\n mediaHandlers = {\n play: () => {\n play(proxy.src);\n },\n pause: () => {\n pause();\n },\n stop: () => {\n pause();\n setCurrentTime(0);\n getDispatch().closeAudioPlayer();\n },\n seekbackward: (event) => {\n const skipTime = event.seekOffset || DEFAULT_SKIP_TIME;\n setCurrentTime(Math.max(proxy.currentTime - skipTime, 0));\n },\n seekforward: (event) => {\n const skipTime = event.seekOffset || DEFAULT_SKIP_TIME;\n setCurrentTime(Math.min(proxy.currentTime + skipTime, proxy.duration));\n },\n seekTo: (event) => {\n if (event.seekTime) {\n setCurrentTime(event.seekTime);\n }\n },\n };\n\n if (!isLast()) {\n mediaHandlers.nexttrack = () => {\n requestNextTrack();\n };\n }\n if (!isFirst()) {\n mediaHandlers.previoustrack = () => {\n requestPreviousTrack();\n };\n }\n }\n return mediaHandlers;\n}\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport { imgToCanvas } from '../util/files';\nimport useForceUpdate from './useForceUpdate';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\nconst MAX_CACHE_SIZE = 1000;\n\nconst cache = new Map();\n\nexport default function useBlur(dataUri?: string, isDisabled = false, delay?: number) {\n const blurredRef = useRef(dataUri ? cache.get(dataUri) : undefined);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n\n if (timeoutRef.current && isDisabled) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useEffect(() => {\n if (!dataUri || blurredRef.current || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n img.onload = () => {\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n const blurredDataUri = canvas.toDataURL();\n\n blurredRef.current = blurredDataUri;\n forceUpdate();\n\n if (cache.size >= MAX_CACHE_SIZE) {\n cache.clear();\n }\n cache.set(dataUri, blurredDataUri);\n };\n\n if (delay) {\n timeoutRef.current = window.setTimeout(() => {\n img.src = dataUri;\n }, delay);\n } else {\n img.src = dataUri;\n }\n }, [dataUri, delay, forceUpdate, isDisabled]);\n\n return blurredRef.current;\n}\n","import { useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useOnChange from './useOnChange';\nimport useBlur from './useBlur';\nimport { imgToCanvas } from '../util/files';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useBlurSync(dataUri: string | false | undefined) {\n const blurredRef = useRef();\n\n let isChanged = false;\n\n useOnChange(() => {\n isChanged = true;\n\n blurredRef.current = undefined;\n\n if (!dataUri) {\n return;\n }\n\n const img = new Image();\n img.src = dataUri;\n if (!img.width) {\n return;\n }\n\n const canvas = imgToCanvas(img);\n fastBlur(canvas.getContext('2d'), 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n\n blurredRef.current = canvas.toDataURL();\n }, [dataUri]);\n\n // Sometimes `Image` do not manage to load synchronously,\n // so we fall back the non-blurred variant and prepare the async one at least for the next time\n const blurredAsync = useBlur(dataUri || undefined, Boolean(blurredRef.current));\n\n return blurredRef.current || (!isChanged && blurredAsync) || dataUri || undefined;\n}\n","import React, { useCallback, useMemo, useState } from '../lib/teact/teact';\nimport { debounce } from '../util/schedulers';\nimport { isSafariPatchInProgress } from '../util/patchSafariProgressiveAudio';\n\ntype BufferingEvent = (e: Event | React.SyntheticEvent) => void;\n\nconst MIN_READY_STATE = 3;\n// Avoid flickering when re-mounting previously buffered video\nconst DEBOUNCE = 200;\n\nexport default (noInitiallyBuffered = false) => {\n const [isBuffered, setIsBuffered] = useState(!noInitiallyBuffered);\n const [bufferedProgress, setBufferedProgress] = useState(0);\n\n const setIsBufferedDebounced = useMemo(() => {\n return debounce(setIsBuffered, DEBOUNCE, false, true);\n }, []);\n\n const handleBuffering = useCallback((e) => {\n const media = e.currentTarget as HTMLMediaElement;\n\n if (!isSafariPatchInProgress(media)) {\n if (media.buffered.length) {\n setBufferedProgress(media.buffered.end(0) / media.duration);\n }\n\n setIsBufferedDebounced(media.readyState >= MIN_READY_STATE || media.currentTime > 0);\n }\n }, [setIsBufferedDebounced]);\n\n const bufferingHandlers = {\n onLoadedData: handleBuffering,\n onPlaying: handleBuffering,\n onLoadStart: handleBuffering, // Needed for Safari to start\n onPause: handleBuffering, // Needed for Chrome when seeking\n onTimeUpdate: handleBuffering, // Needed for audio buffering progress\n onProgress: handleBuffering, // Needed for video buffering progress\n };\n\n return {\n isBuffered,\n bufferedProgress,\n bufferingHandlers,\n checkBuffering(element: HTMLMediaElement) {\n setIsBufferedDebounced(element.readyState >= MIN_READY_STATE);\n },\n };\n};\n","import { useEffect, useRef } from '../lib/teact/teact';\n\nimport fastBlur from '../lib/fastBlur';\nimport useForceUpdate from './useForceUpdate';\nimport { IS_CANVAS_FILTER_SUPPORTED } from '../util/environment';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nexport default function useCanvasBlur(dataUri?: string, isDisabled = false, withRaf?: boolean) {\n // eslint-disable-next-line no-null/no-null\n const canvasRef = useRef(null);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const canvas = canvasRef.current;\n\n if (!dataUri || !canvas || isDisabled) {\n return;\n }\n\n const img = new Image();\n\n const processBlur = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', { alpha: false })!;\n\n if (IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${RADIUS}px)`;\n }\n\n ctx.drawImage(img, -RADIUS * 2, -RADIUS * 2, canvas.width + RADIUS * 4, canvas.height + RADIUS * 4);\n\n if (!IS_CANVAS_FILTER_SUPPORTED) {\n fastBlur(ctx, 0, 0, canvas.width, canvas.height, RADIUS, ITERATIONS);\n }\n };\n\n img.onload = () => {\n if (withRaf) {\n requestAnimationFrame(processBlur);\n } else {\n processBlur();\n }\n };\n\n img.src = dataUri;\n }, [canvasRef, dataUri, forceUpdate, isDisabled, withRaf]);\n\n return canvasRef;\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../api/types';\n\nimport {\n isChatArchived, getCanDeleteChat, isUserId, isChatChannel,\n} from '../modules/helpers';\nimport { compact } from '../util/iteratees';\nimport useLang from './useLang';\n\nexport default ({\n chat,\n user,\n handleDelete,\n handleChatFolderChange,\n folderId,\n isPinned,\n isMuted,\n canChangeFolder,\n}: {\n chat: ApiChat | undefined;\n user: ApiUser | undefined;\n handleDelete: () => void;\n handleChatFolderChange: () => void;\n folderId?: number;\n isPinned?: boolean;\n isMuted?: boolean;\n canChangeFolder?: boolean;\n}, isInSearch = false) => {\n const lang = useLang();\n\n const { isSelf } = user || {};\n\n return useMemo(() => {\n if (!chat) {\n return undefined;\n }\n\n const {\n toggleChatPinned,\n updateChatMutedState,\n toggleChatArchived,\n toggleChatUnread,\n } = getDispatch();\n\n const actionAddToFolder = canChangeFolder ? {\n title: lang('ChatList.Filter.AddToFolder'),\n icon: 'folder',\n handler: handleChatFolderChange,\n } : undefined;\n\n const actionPin = isPinned\n ? {\n title: lang('UnpinFromTop'),\n icon: 'unpin',\n handler: () => toggleChatPinned({ id: chat.id, folderId }),\n }\n : { title: lang('PinToTop'), icon: 'pin', handler: () => toggleChatPinned({ id: chat.id, folderId }) };\n\n if (isInSearch) {\n return compact([actionPin, actionAddToFolder]);\n }\n\n const actionUnreadMark = chat.unreadCount || chat.hasUnreadMark\n ? { title: lang('MarkAsRead'), icon: 'readchats', handler: () => toggleChatUnread({ id: chat.id }) }\n : { title: lang('MarkAsUnread'), icon: 'unread', handler: () => toggleChatUnread({ id: chat.id }) };\n\n const actionMute = isMuted\n ? {\n title: lang('ChatList.Unmute'),\n icon: 'unmute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: false }),\n }\n : {\n title: lang('ChatList.Mute'),\n icon: 'mute',\n handler: () => updateChatMutedState({ chatId: chat.id, isMuted: true }),\n };\n\n const actionArchive = isChatArchived(chat)\n ? { title: lang('Unarchive'), icon: 'unarchive', handler: () => toggleChatArchived({ id: chat.id }) }\n : { title: lang('Archive'), icon: 'archive', handler: () => toggleChatArchived({ id: chat.id }) };\n\n const actionDelete = {\n title: isUserId(chat.id)\n ? lang('Delete')\n : lang(getCanDeleteChat(chat)\n ? 'DeleteChat'\n : (isChatChannel(chat) ? 'LeaveChannel' : 'Group.LeaveGroup')),\n icon: 'delete',\n destructive: true,\n handler: handleDelete,\n };\n\n const isInFolder = folderId !== undefined;\n\n return compact([\n actionAddToFolder,\n actionUnreadMark,\n actionPin,\n !isSelf && actionMute,\n !isSelf && !isInFolder && actionArchive,\n actionDelete,\n ]);\n }, [\n chat, canChangeFolder, lang, handleChatFolderChange, isPinned, isInSearch, isMuted, handleDelete, folderId, isSelf,\n ]);\n};\n","import { RefObject } from 'react';\nimport { useState, useEffect, useCallback } from '../lib/teact/teact';\n\nimport { IAnchorPosition } from '../types';\nimport {\n IS_TOUCH_ENV, IS_SINGLE_COLUMN_LAYOUT, IS_PWA, IS_IOS,\n} from '../util/environment';\n\nconst LONG_TAP_DURATION_MS = 200;\n\nfunction checkIsDisabledForMobile() {\n return IS_SINGLE_COLUMN_LAYOUT\n && window.document.body.classList.contains('enable-symbol-menu-transforms');\n}\n\nfunction stopEvent(e: Event) {\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n}\n\nexport default (\n elementRef: RefObject,\n isMenuDisabled?: boolean,\n shouldDisableOnLink?: boolean,\n shouldDisableOnLongTap?: boolean,\n) => {\n const [isContextMenuOpen, setIsContextMenuOpen] = useState(false);\n const [contextMenuPosition, setContextMenuPosition] = useState(undefined);\n\n const handleBeforeContextMenu = useCallback((e: React.MouseEvent) => {\n if (!isMenuDisabled && e.button === 2) {\n (e.target as HTMLElement).classList.add('no-selection');\n }\n }, [isMenuDisabled]);\n\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n (e.target as HTMLElement).classList.remove('no-selection');\n\n if (isMenuDisabled || (shouldDisableOnLink && (e.target as HTMLElement).matches('a[href]'))) {\n return;\n }\n e.preventDefault();\n\n if (contextMenuPosition) {\n return;\n }\n\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n }, [isMenuDisabled, shouldDisableOnLink, contextMenuPosition]);\n\n const handleContextMenuClose = useCallback(() => {\n setIsContextMenuOpen(false);\n }, []);\n\n const handleContextMenuHide = useCallback(() => {\n setContextMenuPosition(undefined);\n document.body.classList.remove('no-selection');\n }, []);\n\n // Support context menu on touch-devices\n useEffect(() => {\n if (isMenuDisabled || !IS_TOUCH_ENV || shouldDisableOnLongTap) {\n return undefined;\n }\n\n const element = elementRef.current;\n if (!element) {\n return undefined;\n }\n\n let timer: number | undefined;\n\n const clearLongPressTimer = () => {\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n const emulateContextMenuEvent = (originalEvent: TouchEvent) => {\n clearLongPressTimer();\n\n const { clientX, clientY, target } = originalEvent.touches[0];\n\n if (contextMenuPosition || (shouldDisableOnLink && (target as HTMLElement).matches('a[href]'))) {\n return;\n }\n\n // Temporarily intercept and clear the next click\n element.addEventListener('touchend', function cancelClickOnce(e) {\n element.removeEventListener('touchend', cancelClickOnce, true);\n stopEvent(e);\n }, true);\n\n // On iOS15, in PWA mode, the context menu immediately closes after opening\n if (IS_PWA && IS_IOS) {\n element.addEventListener('mousedown', function cancelClickOnce(e) {\n element.removeEventListener('mousedown', cancelClickOnce, true);\n stopEvent(e);\n }, true);\n }\n\n document.body.classList.add('no-selection');\n setIsContextMenuOpen(true);\n setContextMenuPosition({ x: clientX, y: clientY });\n };\n\n const startLongPressTimer = (e: TouchEvent) => {\n if (isMenuDisabled || checkIsDisabledForMobile()) {\n return;\n }\n clearLongPressTimer();\n\n timer = window.setTimeout(() => emulateContextMenuEvent(e), LONG_TAP_DURATION_MS);\n };\n\n // @perf Consider event delegation\n element.addEventListener('touchstart', startLongPressTimer, { passive: true });\n element.addEventListener('touchcancel', clearLongPressTimer, true);\n element.addEventListener('touchend', clearLongPressTimer, true);\n element.addEventListener('touchmove', clearLongPressTimer, { passive: true });\n\n return () => {\n clearLongPressTimer();\n element.removeEventListener('touchstart', startLongPressTimer);\n element.removeEventListener('touchcancel', clearLongPressTimer, true);\n element.removeEventListener('touchend', clearLongPressTimer, true);\n element.removeEventListener('touchmove', clearLongPressTimer);\n };\n }, [contextMenuPosition, isMenuDisabled, shouldDisableOnLongTap, elementRef, shouldDisableOnLink]);\n\n return {\n isContextMenuOpen,\n contextMenuPosition,\n handleBeforeContextMenu,\n handleContextMenu,\n handleContextMenuClose,\n handleContextMenuHide,\n };\n};\n","import { useState, useEffect } from '../lib/teact/teact';\nimport { IAnchorPosition } from '../types';\n\ninterface Layout {\n extraPaddingX?: number;\n extraTopPadding?: number;\n marginSides?: number;\n extraMarginTop?: number;\n}\n\nconst MENU_POSITION_VISUAL_COMFORT_SPACE_PX = 16;\nconst MENU_POSITION_BOTTOM_MARGIN = 12;\nconst EMPTY_RECT = {\n width: 0, left: 0, height: 0, top: 0,\n};\n\nexport default function useContextMenuPosition(\n anchor: IAnchorPosition | undefined,\n getTriggerElement: () => HTMLElement | null,\n getRootElement: () => HTMLElement | null,\n getMenuElement: () => HTMLElement | null,\n getLayout?: () => Layout,\n) {\n const [positionX, setPositionX] = useState<'right' | 'left'>('right');\n const [positionY, setPositionY] = useState<'top' | 'bottom'>('bottom');\n const [withScroll, setWithScroll] = useState(false);\n const [style, setStyle] = useState('');\n const [menuStyle, setMenuStyle] = useState('opacity: 0;');\n\n useEffect(() => {\n const triggerEl = getTriggerElement();\n if (!anchor || !triggerEl) {\n return;\n }\n\n let { x, y } = anchor;\n\n const menuEl = getMenuElement();\n const rootEl = getRootElement();\n\n const {\n extraPaddingX = 0,\n extraTopPadding = 0,\n marginSides = 0,\n extraMarginTop = 0,\n } = getLayout?.() || {};\n\n const marginTop = menuEl ? parseInt(getComputedStyle(menuEl).marginTop, 10) + extraMarginTop : undefined;\n\n const menuRect = menuEl ? {\n width: menuEl.offsetWidth,\n height: menuEl.offsetHeight + marginTop!,\n } : EMPTY_RECT;\n\n const rootRect = rootEl ? rootEl.getBoundingClientRect() : EMPTY_RECT;\n\n let horizontalPosition: 'left' | 'right';\n if (x + menuRect.width + extraPaddingX < rootRect.width + rootRect.left) {\n x += 3;\n horizontalPosition = 'left';\n } else if (x - menuRect.width > 0) {\n horizontalPosition = 'right';\n x -= 3;\n } else {\n horizontalPosition = 'left';\n x = 16;\n }\n setPositionX(horizontalPosition);\n\n if (marginSides\n && horizontalPosition === 'right' && (x + extraPaddingX + marginSides >= rootRect.width + rootRect.left)) {\n x -= marginSides;\n }\n\n if (marginSides && horizontalPosition === 'left') {\n if (x + extraPaddingX + marginSides + menuRect.width >= rootRect.width + rootRect.left) {\n x -= marginSides;\n } else if (x - marginSides <= 0) {\n x += marginSides;\n }\n }\n\n if (y + menuRect.height < rootRect.height + rootRect.top) {\n setPositionY('top');\n } else {\n setPositionY('bottom');\n\n if (y - menuRect.height < rootRect.top + extraTopPadding) {\n y = rootRect.top + rootRect.height;\n }\n }\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const left = horizontalPosition === 'left'\n ? Math.min(x - triggerRect.left, rootRect.width - menuRect.width - MENU_POSITION_VISUAL_COMFORT_SPACE_PX)\n : Math.max((x - triggerRect.left), menuRect.width + MENU_POSITION_VISUAL_COMFORT_SPACE_PX);\n const top = Math.min(\n rootRect.height - triggerRect.top + triggerRect.height - MENU_POSITION_BOTTOM_MARGIN + (marginTop || 0),\n y - triggerRect.top,\n );\n const menuMaxHeight = rootRect.height - MENU_POSITION_BOTTOM_MARGIN - (marginTop || 0);\n\n setWithScroll(menuMaxHeight < menuRect.height);\n setMenuStyle(`max-height: ${menuMaxHeight}px;`);\n setStyle(`left: ${left}px; top: ${top}px`);\n }, [\n anchor, getMenuElement, getRootElement, getTriggerElement, getLayout,\n ]);\n\n return {\n positionX,\n positionY,\n style,\n menuStyle,\n withScroll,\n };\n}\n","import { useMemo } from '../lib/teact/teact';\n\nimport { debounce } from '../util/schedulers';\n\nexport default function useDebounce(ms: number, noFirst?: boolean, noLast?: boolean) {\n return useMemo(() => {\n return debounce((cb) => cb(), ms, !noFirst, !noLast);\n }, [ms, noFirst, noLast]);\n}\n","import { useEffect, useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiMessage } from '../api/types';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (\n chatId: string,\n messageId?: number,\n message?: ApiMessage,\n replyOriginForId?: number,\n) => {\n const { loadMessage } = getDispatch();\n const loadMessageThrottled = useMemo(() => {\n const throttled = throttle(loadMessage, 500, true);\n return () => {\n throttled({ chatId, messageId, replyOriginForId });\n };\n }, [loadMessage, chatId, messageId, replyOriginForId]);\n\n useEffect(() => {\n if (messageId && !message) {\n loadMessageThrottled();\n }\n });\n};\n","import { useEffect } from '../lib/teact/teact';\n\nexport default (container: HTMLElement | null, isDisabled?: boolean) => {\n useEffect(() => {\n if (!container || isDisabled) {\n return undefined;\n }\n\n function handleScroll(e: WheelEvent) {\n // Ignore horizontal scroll and let it work natively (e.g. on touchpad)\n if (!e.deltaX) {\n container!.scrollLeft += e.deltaY / 4;\n }\n }\n\n container.addEventListener('wheel', handleScroll, { passive: true });\n\n return () => {\n container.removeEventListener('wheel', handleScroll);\n };\n }, [container, isDisabled]);\n};\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\n\n// Focus slows down animation, also it breaks transition layout in Chrome\nconst FOCUS_DELAY_MS = 500;\nconst MODAL_HIDE_DELAY_MS = 300;\n\nexport default function useInputFocusOnOpen(\n inputRef: RefObject,\n isOpen?: boolean,\n onClose?: NoneToVoidFunction,\n) {\n useEffect(() => {\n if (isOpen) {\n if (!IS_SINGLE_COLUMN_LAYOUT) {\n setTimeout(() => {\n requestAnimationFrame(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n });\n }, FOCUS_DELAY_MS);\n }\n } else {\n if (inputRef.current) {\n inputRef.current.blur();\n }\n\n if (onClose) {\n setTimeout(onClose, MODAL_HIDE_DELAY_MS);\n }\n }\n }, [inputRef, isOpen, onClose]);\n}\n","import { RefObject } from 'react';\nimport {\n useEffect, useRef, useCallback, useState,\n} from '../lib/teact/teact';\n\nimport { throttle, debounce } from '../util/schedulers';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\n\ntype TargetCallback = (entry: IntersectionObserverEntry) => void;\ntype RootCallback = (entries: IntersectionObserverEntry[]) => void;\ntype ObserveCleanup = NoneToVoidFunction;\nexport type ObserveFn = (target: HTMLElement, targetCallback?: TargetCallback) => ObserveCleanup;\n\ninterface IntersectionController {\n observer: IntersectionObserver;\n callbacks: Map;\n}\n\ninterface Response {\n observe: ObserveFn;\n freeze: NoneToVoidFunction;\n unfreeze: NoneToVoidFunction;\n}\n\nexport function useIntersectionObserver({\n rootRef,\n throttleMs,\n debounceMs,\n shouldSkipFirst,\n margin,\n threshold,\n isDisabled,\n}: {\n rootRef: RefObject;\n throttleMs?: number;\n debounceMs?: number;\n shouldSkipFirst?: boolean;\n margin?: number;\n threshold?: number | number[];\n isDisabled?: boolean;\n}, rootCallback?: RootCallback): Response {\n const controllerRef = useRef();\n const rootCallbackRef = useRef();\n const freezeFlagsRef = useRef(0);\n const onUnfreezeRef = useRef();\n\n rootCallbackRef.current = rootCallback;\n\n const freeze = useCallback(() => {\n freezeFlagsRef.current++;\n }, []);\n\n const unfreeze = useCallback(() => {\n if (!freezeFlagsRef.current) {\n return;\n }\n\n freezeFlagsRef.current--;\n\n if (!freezeFlagsRef.current && onUnfreezeRef.current) {\n onUnfreezeRef.current();\n onUnfreezeRef.current = undefined;\n }\n }, []);\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n return () => {\n if (controllerRef.current) {\n controllerRef.current.observer.disconnect();\n controllerRef.current.callbacks.clear();\n controllerRef.current = undefined;\n }\n };\n }, [isDisabled]);\n\n function initController() {\n const callbacks = new Map();\n const entriesAccumulator = new Map();\n const observerCallbackSync = () => {\n const entries = Array.from(entriesAccumulator.values());\n\n entries.forEach((entry: IntersectionObserverEntry) => {\n const callback = callbacks.get(entry.target);\n if (callback) {\n callback!(entry, entries);\n }\n });\n\n if (rootCallbackRef.current) {\n rootCallbackRef.current(entries);\n }\n\n entriesAccumulator.clear();\n };\n const scheduler = throttleMs ? throttle : debounceMs ? debounce : undefined;\n const observerCallback = scheduler\n ? scheduler(observerCallbackSync, (throttleMs || debounceMs)!, !shouldSkipFirst)\n : observerCallbackSync;\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n entriesAccumulator.set(entry.target, entry);\n });\n\n if (freezeFlagsRef.current) {\n onUnfreezeRef.current = () => {\n observerCallback();\n };\n } else {\n observerCallback();\n }\n },\n {\n root: rootRef.current,\n rootMargin: margin ? `${margin}px` : undefined,\n threshold,\n },\n );\n\n controllerRef.current = { observer, callbacks };\n }\n\n const observe = useCallback((target, targetCallback) => {\n if (!controllerRef.current) {\n initController();\n }\n\n const controller = controllerRef.current!;\n controller.observer.observe(target);\n\n if (targetCallback) {\n controller.callbacks.set(target, targetCallback);\n }\n\n return () => {\n if (targetCallback) {\n controller.callbacks.delete(target);\n }\n\n controller.observer.unobserve(target);\n };\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDisabled]);\n\n return { observe, freeze, unfreeze };\n}\n\nexport function useOnIntersect(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n useEffect(() => {\n return observe ? observe(targetRef.current!, callback) : undefined;\n // Arguments should never change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n\nexport function useIsIntersecting(\n targetRef: RefObject, observe?: ObserveFn, callback?: TargetCallback,\n) {\n const [isIntersecting, setIsIntersecting] = useState(!observe);\n\n useOnIntersect(targetRef, observe, (entry) => {\n setIsIntersecting(entry.isIntersecting);\n\n if (callback) {\n callback(entry);\n }\n });\n\n return isIntersecting;\n}\n","import { useEffect, useLayoutEffect, useRef } from '../lib/teact/teact';\n\nfunction useInterval(callback: NoneToVoidFunction, delay?: number, noFirst = false) {\n const savedCallback = useRef(callback);\n\n useLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (delay === undefined) {\n return undefined;\n }\n\n const id = setInterval(() => savedCallback.current(), delay);\n if (!noFirst) savedCallback.current();\n\n return () => clearInterval(id);\n }, [delay, noFirst]);\n}\n\nexport default useInterval;\n","import { useLayoutEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nexport default (cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\n const prevDeps = usePrevious(dependencies);\n return useLayoutEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n","import useShowTransition from './useShowTransition';\n\nexport default function useMediaTransition(mediaData?: any) {\n const isMediaReady = Boolean(mediaData);\n const { transitionClassNames } = useShowTransition(isMediaReady, undefined, isMediaReady, 'slow');\n\n return transitionClassNames;\n}\n","import { useRef } from '../lib/teact/teact';\nimport generateIdFor from '../util/generateIdFor';\n\nconst store: Record = {};\n\nexport default () => {\n const idRef = useRef();\n\n if (!idRef.current) {\n idRef.current = generateIdFor(store);\n store[idRef.current] = true;\n }\n\n return idRef.current;\n};\n","import {\n useEffect, useMemo, useRef, useState,\n} from '../lib/teact/teact';\n\nimport { IS_PROGRESSIVE_SUPPORTED } from '../util/environment';\nimport { ApiMediaFormat } from '../api/types';\nimport { throttle } from '../util/schedulers';\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\nimport useUniqueId from './useUniqueId';\n\nconst STREAMING_PROGRESS = 0.75;\nconst STREAMING_TIMEOUT = 1500;\nconst PROGRESS_THROTTLE = 500;\n\nexport default function useMediaWithLoadProgress(\n mediaHash: string | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n isHtmlAllowed = false,\n) {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const isStreaming = mediaFormat === ApiMediaFormat.Stream || (\n IS_PROGRESSIVE_SUPPORTED && mediaFormat === ApiMediaFormat.Progressive\n );\n const forceUpdate = useForceUpdate();\n const id = useUniqueId();\n const [loadProgress, setLoadProgress] = useState(mediaData && !isStreaming ? 1 : 0);\n const startedAtRef = useRef();\n\n const handleProgress = useMemo(() => {\n return throttle((progress: number) => {\n if (startedAtRef.current && (!delay || (Date.now() - startedAtRef.current > delay))) {\n setLoadProgress(progress);\n }\n }, PROGRESS_THROTTLE, true);\n }, [delay]);\n\n useEffect(() => {\n if (!noLoad && mediaHash) {\n if (!mediaData) {\n setLoadProgress(0);\n\n if (startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n }\n\n startedAtRef.current = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat, isHtmlAllowed, handleProgress, id).then(() => {\n const spentTime = Date.now() - startedAtRef.current!;\n startedAtRef.current = undefined;\n\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n } else if (isStreaming) {\n setTimeout(() => {\n setLoadProgress(STREAMING_PROGRESS);\n }, STREAMING_TIMEOUT);\n }\n }\n }, [\n noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, isStreaming, delay, handleProgress,\n isHtmlAllowed, id,\n ]);\n\n useEffect(() => {\n if (noLoad && startedAtRef.current) {\n mediaLoader.cancelProgress(handleProgress);\n setLoadProgress(0);\n startedAtRef.current = undefined;\n }\n }, [handleProgress, noLoad]);\n\n useEffect(() => {\n return () => {\n if (mediaHash) {\n mediaLoader.removeCallback(mediaHash, id);\n }\n };\n }, [id, mediaHash]);\n\n return { mediaData, loadProgress };\n}\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_TOUCH_ENV } from '../util/environment';\n\nconst MENU_CLOSE_TIMEOUT = 250;\nlet closeTimeout: number | undefined;\n\nexport default function useMouseInside(\n isOpen: boolean, onClose: NoneToVoidFunction, menuCloseTimeout = MENU_CLOSE_TIMEOUT, isDisabled = false,\n) {\n const isMouseInside = useRef(false);\n\n const markMouseInside = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n useEffect(() => {\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n if (isOpen && !IS_TOUCH_ENV && !isDisabled) {\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout * 2);\n }\n }, [isDisabled, isOpen, menuCloseTimeout, onClose]);\n\n const handleMouseEnter = useCallback(() => {\n isMouseInside.current = true;\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n isMouseInside.current = false;\n\n if (closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n }\n\n closeTimeout = window.setTimeout(() => {\n if (!isMouseInside.current) {\n onClose();\n }\n }, menuCloseTimeout);\n }, [menuCloseTimeout, onClose]);\n\n return [handleMouseEnter, handleMouseLeave, markMouseInside];\n}\n","import { useRef } from '../lib/teact/teact';\n\nimport usePrevious from './usePrevious';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport default function usePrevDuringAnimation(current: any, duration?: number) {\n const prev = usePrevious(current, true);\n const timeoutRef = useRef();\n const forceUpdate = useForceUpdate();\n // eslint-disable-next-line no-null/no-null\n const isCurrentPresent = current !== undefined && current !== null;\n // eslint-disable-next-line no-null/no-null\n const isPrevPresent = prev !== undefined && prev !== null;\n\n if (isCurrentPresent && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n\n useOnChange(() => {\n // When `current` becomes empty\n if (duration && !isCurrentPresent && isPrevPresent && !timeoutRef.current) {\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = undefined;\n forceUpdate();\n }, duration);\n }\n }, [current]);\n\n return !timeoutRef.current || !duration || isCurrentPresent ? current : prev;\n}\n","import { useState, useCallback, useRef } from '../lib/teact/teact';\n\nexport type ReducerAction = { type: Actions; payload?: any };\nexport type StateReducer = (state: State, action: ReducerAction) => State;\nexport type Dispatch = (action: ReducerAction) => void;\n\nexport default function useReducer(\n reducer: StateReducer,\n initialState: State,\n) {\n const reducerRef = useRef(reducer);\n const [state, setState] = useState(initialState);\n\n const dispatch = useCallback((action: ReducerAction) => {\n setState((currentState) => reducerRef.current(currentState, action));\n }, []);\n\n return [\n state,\n dispatch,\n ] as [State, Dispatch];\n}\n","import { useMemo } from '../lib/teact/teact';\nimport { getDispatch } from '../lib/teact/teactn';\n\nimport { ApiSendMessageAction } from '../api/types';\n\nimport { SEND_MESSAGE_ACTION_INTERVAL } from '../config';\nimport { throttle } from '../util/schedulers';\n\nexport default (chatId: string, threadId?: number) => {\n return useMemo(() => {\n return throttle((action: ApiSendMessageAction) => {\n getDispatch().sendMessageAction({ chatId, threadId, action });\n }, SEND_MESSAGE_ACTION_INTERVAL);\n }, [chatId, threadId]);\n};\n","import { useEffect, useRef } from '../lib/teact/teact';\n\n// Allows to use state value as \"silent\" dependency in hooks (not causing updates).\n// Useful for state values that update frequently (such as controlled input value).\nexport function useStateRef(value: T) {\n const ref = useRef(value);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref;\n}\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\nimport { fastRaf } from '../util/schedulers';\n\n// Fix for memory leak when unmounting video element\nexport default function useVideoCleanup(videoRef: RefObject, dependencies: any[]) {\n useEffect(() => {\n const videoEl = videoRef.current;\n\n return () => {\n if (videoEl) {\n fastRaf(() => {\n videoEl.pause();\n videoEl.src = '';\n videoEl.load();\n });\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n}\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n/* eslint-disable no-multi-assign */\n/* eslint-disable no-cond-assign */\n/* eslint-disable no-param-reassign */\n/* eslint-disable prefer-const */\n/* eslint-disable eqeqeq */\n\n/*\nSuperfast Blur - a fast Box Blur For Canvas\n\nVersion: 0.5\nAuthor: Mario Klingemann\nContact: mario@quasimondo.com\nWebsite: http://www.quasimondo.com/BoxBlurForCanvas\nTwitter: @quasimondo\n\nIn case you find this class useful - especially in commercial projects -\nI am not totally unhappy for a small donation to my PayPal account\nmario@quasimondo.de\n\nOr support me on flattr:\nhttps://flattr.com/thing/140066/Superfast-Blur-a-pretty-fast-Box-Blur-Effect-for-CanvasJavascript\n\nCopyright (c) 2011 Mario Klingemann\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// eslint-disable-next-line max-len\nconst mul_table = [1, 57, 41, 21, 203, 34, 97, 73, 227, 91, 149, 62, 105, 45, 39, 137, 241, 107, 3, 173, 39, 71, 65, 238, 219, 101, 187, 87, 81, 151, 141, 133, 249, 117, 221, 209, 197, 187, 177, 169, 5, 153, 73, 139, 133, 127, 243, 233, 223, 107, 103, 99, 191, 23, 177, 171, 165, 159, 77, 149, 9, 139, 135, 131, 253, 245, 119, 231, 224, 109, 211, 103, 25, 195, 189, 23, 45, 175, 171, 83, 81, 79, 155, 151, 147, 9, 141, 137, 67, 131, 129, 251, 123, 30, 235, 115, 113, 221, 217, 53, 13, 51, 50, 49, 193, 189, 185, 91, 179, 175, 43, 169, 83, 163, 5, 79, 155, 19, 75, 147, 145, 143, 35, 69, 17, 67, 33, 65, 255, 251, 247, 243, 239, 59, 29, 229, 113, 111, 219, 27, 213, 105, 207, 51, 201, 199, 49, 193, 191, 47, 93, 183, 181, 179, 11, 87, 43, 85, 167, 165, 163, 161, 159, 157, 155, 77, 19, 75, 37, 73, 145, 143, 141, 35, 138, 137, 135, 67, 33, 131, 129, 255, 63, 250, 247, 61, 121, 239, 237, 117, 29, 229, 227, 225, 111, 55, 109, 216, 213, 211, 209, 207, 205, 203, 201, 199, 197, 195, 193, 48, 190, 47, 93, 185, 183, 181, 179, 178, 176, 175, 173, 171, 85, 21, 167, 165, 41, 163, 161, 5, 79, 157, 78, 154, 153, 19, 75, 149, 74, 147, 73, 144, 143, 71, 141, 140, 139, 137, 17, 135, 134, 133, 66, 131, 65, 129, 1];\n// eslint-disable-next-line max-len\nconst shg_table = [0, 9, 10, 10, 14, 12, 14, 14, 16, 15, 16, 15, 16, 15, 15, 17, 18, 17, 12, 18, 16, 17, 17, 19, 19, 18, 19, 18, 18, 19, 19, 19, 20, 19, 20, 20, 20, 20, 20, 20, 15, 20, 19, 20, 20, 20, 21, 21, 21, 20, 20, 20, 21, 18, 21, 21, 21, 21, 20, 21, 17, 21, 21, 21, 22, 22, 21, 22, 22, 21, 22, 21, 19, 22, 22, 19, 20, 22, 22, 21, 21, 21, 22, 22, 22, 18, 22, 22, 21, 22, 22, 23, 22, 20, 23, 22, 22, 23, 23, 21, 19, 21, 21, 21, 23, 23, 23, 22, 23, 23, 21, 23, 22, 23, 18, 22, 23, 20, 22, 23, 23, 23, 21, 22, 20, 22, 21, 22, 24, 24, 24, 24, 24, 22, 21, 24, 23, 23, 24, 21, 24, 23, 24, 22, 24, 24, 22, 24, 24, 22, 23, 24, 24, 24, 20, 23, 22, 23, 24, 24, 24, 24, 24, 24, 24, 23, 21, 23, 22, 23, 24, 24, 24, 22, 24, 24, 24, 23, 22, 24, 24, 25, 23, 25, 25, 23, 24, 25, 25, 24, 22, 25, 25, 25, 24, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 25, 23, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 24, 22, 25, 25, 23, 25, 25, 20, 24, 25, 24, 25, 25, 22, 24, 25, 24, 25, 24, 25, 25, 24, 25, 25, 25, 25, 22, 25, 25, 25, 24, 25, 24, 25, 18];\n\nexport default function boxBlurCanvasRGB(context, top_x, top_y, width, height, radius, iterations) {\n if (Number.isNaN(radius) || radius < 1) return;\n\n radius |= 0;\n\n if (Number.isNaN(iterations)) iterations = 1;\n iterations |= 0;\n if (iterations > 3) iterations = 3;\n if (iterations < 1) iterations = 1;\n\n const imageData = context.getImageData(top_x, top_y, width, height);\n\n const pixels = imageData.data;\n\n let rsum;\n let gsum;\n let bsum;\n let x;\n let y;\n let i;\n let p;\n let p1;\n let p2;\n let yp;\n let yi;\n let yw;\n let wm = width - 1;\n let hm = height - 1;\n let rad1 = radius + 1;\n\n let r = [];\n let g = [];\n let b = [];\n\n let mul_sum = mul_table[radius];\n let shg_sum = shg_table[radius];\n\n let vmin = [];\n let vmax = [];\n\n while (iterations-- > 0) {\n yw = yi = 0;\n\n for (y = 0; y < height; y++) {\n rsum = pixels[yw] * rad1;\n gsum = pixels[yw + 1] * rad1;\n bsum = pixels[yw + 2] * rad1;\n\n for (i = 1; i <= radius; i++) {\n p = yw + (((i > wm ? wm : i)) << 2);\n rsum += pixels[p++];\n gsum += pixels[p++];\n bsum += pixels[p++];\n }\n\n for (x = 0; x < width; x++) {\n r[yi] = rsum;\n g[yi] = gsum;\n b[yi] = bsum;\n\n if (y == 0) {\n vmin[x] = ((p = x + rad1) < wm ? p : wm) << 2;\n vmax[x] = ((p = x - radius) > 0 ? p << 2 : 0);\n }\n\n p1 = yw + vmin[x];\n p2 = yw + vmax[x];\n\n rsum += pixels[p1++] - pixels[p2++];\n gsum += pixels[p1++] - pixels[p2++];\n bsum += pixels[p1++] - pixels[p2++];\n\n yi++;\n }\n yw += (width << 2);\n }\n\n for (x = 0; x < width; x++) {\n yp = x;\n rsum = r[yp] * rad1;\n gsum = g[yp] * rad1;\n bsum = b[yp] * rad1;\n\n for (i = 1; i <= radius; i++) {\n yp += (i > hm ? 0 : width);\n rsum += r[yp];\n gsum += g[yp];\n bsum += b[yp];\n }\n\n yi = x << 2;\n for (y = 0; y < height; y++) {\n pixels[yi] = (rsum * mul_sum) >>> shg_sum;\n pixels[yi + 1] = (gsum * mul_sum) >>> shg_sum;\n pixels[yi + 2] = (bsum * mul_sum) >>> shg_sum;\n\n if (x == 0) {\n vmin[y] = ((p = y + rad1) < hm ? p : hm) * width;\n vmax[y] = ((p = y - radius) > 0 ? p * width : 0);\n }\n\n p1 = x + vmin[y];\n p2 = x + vmax[y];\n\n rsum += r[p1] - r[p2];\n gsum += g[p1] - g[p2];\n bsum += b[p1] - b[p2];\n\n yi += width << 2;\n }\n }\n }\n\n context.putImageData(imageData, top_x, top_y);\n}\n","import { getDispatch, getGlobal } from '../lib/teact/teactn';\n\nimport { AudioOrigin, GlobalSearchContent } from '../types';\nimport { ApiMessage } from '../api/types';\n\nimport { IS_SAFARI } from './environment';\nimport safePlay from './safePlay';\nimport { patchSafariProgressiveAudio, isSafariPatchInProgress } from './patchSafariProgressiveAudio';\nimport { getMessageKey, MessageKey, parseMessageKey } from '../modules/helpers';\nimport { fastRaf } from './schedulers';\nimport { selectCurrentMessageList } from '../modules/selectors';\n\ntype Handler = (eventName: string, e: Event) => void;\nexport type TrackId = `${MessageKey}-${number}`;\n\nexport interface Track {\n audio: HTMLAudioElement;\n proxy: HTMLAudioElement;\n type: 'voice' | 'audio';\n handlers: Handler[];\n onForcePlay?: NoneToVoidFunction;\n onTrackChange?: NoneToVoidFunction;\n}\n\nconst tracks = new Map();\nlet voiceQueue: TrackId[] = [];\nlet musicQueue: TrackId[] = [];\n\nlet currentTrackId: TrackId | undefined;\n\nfunction createAudio(\n trackId: TrackId,\n type: Track['type'],\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n): Track {\n const audio = new Audio();\n\n function handleEvent(eventName: string) {\n return (e: Event) => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n tracks.get(trackId)!.handlers.forEach((handler) => {\n handler(eventName, e);\n });\n };\n }\n\n audio.addEventListener('timeupdate', handleEvent('onTimeUpdate'));\n audio.addEventListener('play', handleEvent('onPlay'));\n audio.addEventListener('pause', handleEvent('onPause'));\n audio.addEventListener('loadstart', handleEvent('onLoadStart'));\n audio.addEventListener('loadeddata', handleEvent('onLoadedData'));\n audio.addEventListener('playing', handleEvent('onPlaying'));\n audio.addEventListener('ended', () => {\n if (!tracks.has(trackId)) {\n return;\n }\n\n if (isSafariPatchInProgress(audio)) {\n return;\n }\n\n playNext(trackId);\n });\n\n return {\n audio,\n type,\n proxy: new Proxy(audio, {\n get: (target, key: keyof HTMLAudioElement) => target[key],\n }),\n handlers: [],\n onForcePlay,\n onTrackChange,\n };\n}\n\nfunction playNext(trackId: TrackId, isReverseOrder?: boolean) {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n currentTrack.audio.currentTime = 0;\n if (currentTrack.onTrackChange) currentTrack.onTrackChange();\n }\n\n const origin = getGlobal().audioPlayer.origin || AudioOrigin.Inline;\n\n const nextTrackId = findNextInQueue(trackId, origin, isReverseOrder);\n if (!nextTrackId) {\n return;\n }\n\n if (!tracks.has(nextTrackId)) {\n // A bit hacky way to continue playlist when switching chat\n getDispatch().openAudioPlayer(parseMessageKey(splitTrackId(nextTrackId).messageKey));\n\n return;\n }\n\n const nextTrack = tracks.get(nextTrackId)!;\n\n if (nextTrack.onForcePlay) {\n nextTrack.onForcePlay();\n }\n\n currentTrackId = nextTrackId;\n\n if (nextTrack.audio.src) {\n safePlay(nextTrack.audio);\n }\n}\n\nexport function stopCurrentAudio() {\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack) {\n currentTrack.audio.pause();\n }\n}\n\nexport function register(\n trackId: TrackId,\n trackType: Track['type'],\n handler: Handler,\n onForcePlay?: NoneToVoidFunction,\n onTrackChange?: NoneToVoidFunction,\n) {\n if (!tracks.has(trackId)) {\n const track = createAudio(trackId, trackType, onForcePlay, onTrackChange);\n tracks.set(trackId, track);\n addTrackToQueue(track, trackId);\n }\n const { audio, proxy, handlers } = tracks.get(trackId)!;\n\n handlers.push(handler);\n\n return {\n play(src: string) {\n if (!audio.paused) return;\n const currentTrack = currentTrackId && tracks.get(currentTrackId);\n if (currentTrack && currentTrackId !== trackId) {\n currentTrack.audio.pause();\n currentTrack.audio.currentTime = 0;\n if (isSafariPatchInProgress(currentTrack.audio)) {\n currentTrack.audio.dataset.preventPlayAfterPatch = 'true';\n }\n if (currentTrack.onTrackChange) currentTrack.onTrackChange();\n }\n\n currentTrackId = trackId;\n\n if (!audio.src) {\n audio.src = src;\n audio.preload = 'auto';\n\n if (src.includes('/progressive/') && IS_SAFARI) {\n delete audio.dataset.preventPlayAfterPatch;\n patchSafariProgressiveAudio(audio);\n }\n }\n\n safePlay(audio);\n cleanUpQueue(trackType, trackId);\n },\n\n pause() {\n if (currentTrackId === trackId) {\n audio.pause();\n }\n },\n\n stop() {\n if (currentTrackId === trackId) {\n // Hack, reset src to remove default media session notification\n const prevSrc = audio.src;\n audio.pause();\n // onPause not called otherwise, but required to sync UI\n fastRaf(() => {\n audio.src = '';\n audio.src = prevSrc;\n });\n }\n },\n\n setCurrentTime(time: number) {\n if (currentTrackId === trackId) {\n if (audio.fastSeek) {\n audio.fastSeek(time);\n } else {\n audio.currentTime = time;\n }\n }\n },\n\n setVolume(volume: number) {\n if (currentTrackId === trackId) {\n audio.volume = volume;\n audio.muted = false;\n }\n },\n\n setPlaybackRate(rate: number) {\n if (currentTrackId === trackId) {\n audio.playbackRate = rate;\n }\n },\n\n toggleMuted(muted?: boolean) {\n if (muted === undefined) {\n audio.muted = !audio.muted;\n } else {\n audio.muted = muted;\n }\n },\n\n proxy,\n\n requestNextTrack() {\n playNext(trackId);\n },\n\n isLast() {\n return !findNextInQueue(trackId, getGlobal().audioPlayer.origin);\n },\n\n isFirst() {\n return !findNextInQueue(trackId, getGlobal().audioPlayer.origin, true);\n },\n\n requestPreviousTrack() {\n playNext(trackId, true);\n },\n\n destroy(shouldRemoveFromQueue = false) {\n const track = tracks.get(trackId);\n if (!track) {\n return;\n }\n\n track.handlers = track.handlers.filter((h) => h !== handler);\n\n if (!track.handlers.length) {\n track.audio.pause();\n tracks.delete(trackId);\n\n if (shouldRemoveFromQueue) {\n removeFromQueue(track, trackId);\n }\n\n if (trackId === currentTrackId) {\n currentTrackId = undefined;\n }\n }\n },\n };\n}\n\nfunction getTrackQueue(track: Track) {\n switch (track.type) {\n case 'audio': return musicQueue;\n case 'voice': return voiceQueue;\n default: return undefined;\n }\n}\n\nfunction addTrackToQueue(track: Track, trackId: TrackId) {\n if (track.type === 'audio' && !musicQueue.includes(trackId)) {\n musicQueue.push(trackId);\n musicQueue.sort(trackIdComparator);\n }\n\n if (track.type === 'voice' && !voiceQueue.includes(trackId)) {\n voiceQueue.push(trackId);\n voiceQueue.sort(trackIdComparator);\n }\n}\n\nfunction removeFromQueue(track: Track, trackId: TrackId) {\n const trackIdFilter = (el: TrackId) => el !== trackId;\n if (track.type === 'audio') {\n musicQueue = musicQueue.filter(trackIdFilter);\n }\n\n if (track.type === 'voice') {\n voiceQueue = voiceQueue.filter(trackIdFilter);\n }\n}\n\nfunction cleanUpQueue(type: Track['type'], trackId: TrackId) {\n if (getGlobal().globalSearch.currentContent === GlobalSearchContent.Music) return;\n const { chatId } = parseMessageKey(splitTrackId(trackId).messageKey);\n const openedChatId = selectCurrentMessageList(getGlobal())?.chatId;\n const queueFilter = (id: string) => (\n id.startsWith(`msg${chatId}`) || (openedChatId && id.startsWith(`msg${openedChatId}`))\n );\n\n if (type === 'audio') {\n musicQueue = musicQueue.filter(queueFilter);\n }\n\n if (type === 'voice') {\n voiceQueue = voiceQueue.filter(queueFilter);\n }\n}\n\nfunction findNextInQueue(currentId: TrackId, origin = AudioOrigin.Inline, isReverseOrder?: boolean) {\n const track = tracks.get(currentId)!;\n const queue = getTrackQueue(track);\n if (!queue) return undefined;\n\n if (origin === AudioOrigin.Search) {\n const index = queue.indexOf(currentId);\n if (index < 0) return undefined;\n const direction = isReverseOrder ? -1 : 1;\n return queue[index + direction];\n }\n\n const { chatId } = parseMessageKey(splitTrackId(currentId).messageKey);\n const chatAudio = queue.filter((id) => id.startsWith(`msg${chatId}`));\n const index = chatAudio.indexOf(currentId);\n if (index < 0) return undefined;\n let direction = origin === AudioOrigin.Inline ? -1 : 1;\n if (isReverseOrder) direction *= -1;\n return chatAudio[index + direction];\n}\n\nexport function makeTrackId(message: ApiMessage): TrackId {\n return `${getMessageKey(message)}-${message.date}`;\n}\n\nfunction splitTrackId(trackId: TrackId) {\n const messageKey = trackId.match(/^msg(-?\\d+)-(\\d+)/)![0] as MessageKey;\n const date = Number(trackId.split('-').pop());\n return {\n messageKey,\n date,\n };\n}\n\n// Descending order by date\nfunction trackIdComparator(one?: TrackId, two?: TrackId) {\n if (!one || !two) return 0;\n const { date: dateOne, messageKey: keyOne } = splitTrackId(one);\n const { date: dateTwo, messageKey: keyTwo } = splitTrackId(two);\n const diff = dateTwo - dateOne;\n return diff === 0 ? keyTwo.localeCompare(keyOne) : diff;\n}\n","import { IS_IOS } from './environment';\n\nexport enum SwipeDirection {\n Up,\n Down,\n Left,\n Right,\n}\n\ninterface CaptureOptions {\n onCapture?: (e: MouseEvent | TouchEvent) => void;\n onRelease?: (e: MouseEvent | TouchEvent) => void;\n onDrag?: (\n e: MouseEvent | TouchEvent,\n captureEvent: MouseEvent | TouchEvent,\n params: {\n dragOffsetX: number;\n dragOffsetY: number;\n },\n ) => void;\n onSwipe?: (e: Event, direction: SwipeDirection) => boolean;\n onZoom?: (e: TouchEvent, params: {\n // Relative zoom factor\n zoomFactor: number;\n\n // center coordinate of the initial pinch\n initialCenterX: number;\n initialCenterY: number;\n\n // offset of the pinch center (current from initial)\n dragOffsetX: number;\n dragOffsetY: number;\n\n // center coordinate of the current pinch\n currentCenterX: number;\n currentCenterY: number;\n }) => void;\n onClick?: (e: MouseEvent | TouchEvent) => void;\n onDoubleClick?: (e: MouseEvent | RealTouchEvent, params: { centerX: number; centerY: number }) => void;\n excludedClosestSelector?: string;\n selectorToPreventScroll?: string;\n maxZoom?: number;\n minZoom?: number;\n isNotPassive?: boolean;\n withCursor?: boolean;\n}\n\n// https://stackoverflow.com/questions/11287877/how-can-i-get-e-offsetx-on-mobile-ipad\n// Android does not have this value, and iOS has it but as read-only\nexport interface RealTouchEvent extends TouchEvent {\n pageX?: number;\n pageY?: number;\n}\n\ntype TSwipeAxis =\n 'x'\n | 'y'\n | undefined;\n\nconst IOS_SCREEN_EDGE_THRESHOLD = 20;\nconst MOVED_THRESHOLD = 15;\nconst SWIPE_THRESHOLD = 50;\n\nfunction getDistance(a: Touch, b?: Touch) {\n if (!b) return 0;\n return Math.sqrt((b.pageX - a.pageX) ** 2 + (b.pageY - a.pageY) ** 2);\n}\n\nfunction getTouchCenter(a: Touch, b: Touch) {\n return {\n x: (a.pageX + b.pageX) / 2,\n y: (a.pageY + b.pageY) / 2,\n };\n}\n\nlet lastClickTime = 0;\n\nexport function captureEvents(element: HTMLElement, options: CaptureOptions) {\n let captureEvent: MouseEvent | RealTouchEvent | undefined;\n let hasMoved = false;\n let hasSwiped = false;\n let initialDistance = 0;\n let initialTouchCenter = { x: window.innerWidth / 2, y: window.innerHeight / 2 };\n let initialSwipeAxis: TSwipeAxis | undefined;\n\n function onCapture(e: MouseEvent | RealTouchEvent) {\n if (options.excludedClosestSelector && (\n (e.target as HTMLElement).matches(options.excludedClosestSelector)\n || (e.target as HTMLElement).closest(options.excludedClosestSelector)\n )) {\n return;\n }\n\n captureEvent = e;\n\n if (e.type === 'mousedown') {\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onRelease);\n if (options.onDoubleClick && Date.now() - lastClickTime < 300) {\n options.onDoubleClick(e, {\n centerX: e.pageX!,\n centerY: e.pageY!,\n });\n }\n lastClickTime = Date.now();\n } else if (e.type === 'touchstart') {\n // We need to always listen on `touchstart` target:\n // https://stackoverflow.com/questions/33298828/touch-move-event-dont-fire-after-touch-start-target-is-removed\n const target = e.target as HTMLElement;\n target.addEventListener('touchmove', onMove, { passive: true });\n target.addEventListener('touchend', onRelease);\n target.addEventListener('touchcancel', onRelease);\n\n if ('touches' in e) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n\n if (e.touches.length === 2) {\n initialDistance = getDistance(e.touches[0], e.touches[1]);\n initialTouchCenter = getTouchCenter(e.touches[0], e.touches[1]);\n }\n }\n }\n\n document.body.classList.add('no-selection');\n if (options.withCursor) {\n document.body.classList.add('cursor-grabbing');\n }\n\n if (options.onCapture) {\n options.onCapture(e);\n }\n }\n\n function onRelease(e: MouseEvent | TouchEvent) {\n if (captureEvent) {\n if (options.withCursor) {\n document.body.classList.remove('cursor-grabbing');\n }\n document.body.classList.remove('no-selection');\n\n document.removeEventListener('mouseup', onRelease);\n document.removeEventListener('mousemove', onMove);\n (captureEvent.target as HTMLElement).removeEventListener('touchcancel', onRelease);\n (captureEvent.target as HTMLElement).removeEventListener('touchend', onRelease);\n (captureEvent.target as HTMLElement).removeEventListener('touchmove', onMove);\n\n captureEvent = undefined;\n\n if (IS_IOS && options.selectorToPreventScroll) {\n Array.from(document.querySelectorAll(options.selectorToPreventScroll)).forEach((scrollable) => {\n scrollable.style.overflow = '';\n });\n }\n\n if (hasMoved) {\n if (options.onRelease) {\n options.onRelease(e);\n }\n } else if (options.onClick && (!('button' in e) || e.button === 0)) {\n options.onClick(e);\n }\n }\n\n hasMoved = false;\n hasSwiped = false;\n initialDistance = 0;\n initialSwipeAxis = undefined;\n initialTouchCenter = { x: window.innerWidth / 2, y: window.innerHeight / 2 };\n }\n\n function onMove(e: MouseEvent | RealTouchEvent) {\n if (captureEvent) {\n if (e.type === 'touchmove' && ('touches' in e)) {\n if (e.pageX === undefined) {\n e.pageX = e.touches[0].pageX;\n }\n\n if (e.pageY === undefined) {\n e.pageY = e.touches[0].pageY;\n }\n\n if (options.onZoom && initialDistance > 0 && e.touches.length === 2) {\n const endDistance = getDistance(e.touches[0], e.touches[1]);\n const touchCenter = getTouchCenter(e.touches[0], e.touches[1]);\n const dragOffsetX = touchCenter.x - initialTouchCenter.x;\n const dragOffsetY = touchCenter.y - initialTouchCenter.y;\n const zoomFactor = endDistance / initialDistance;\n options.onZoom(e, {\n zoomFactor,\n initialCenterX: initialTouchCenter.x,\n initialCenterY: initialTouchCenter.y,\n dragOffsetX,\n dragOffsetY,\n currentCenterX: touchCenter.x,\n currentCenterY: touchCenter.y,\n });\n if (zoomFactor !== 1) hasMoved = true;\n }\n }\n\n const dragOffsetX = e.pageX! - captureEvent.pageX!;\n const dragOffsetY = e.pageY! - captureEvent.pageY!;\n\n if (Math.abs(dragOffsetX) >= MOVED_THRESHOLD || Math.abs(dragOffsetY) >= MOVED_THRESHOLD) {\n hasMoved = true;\n }\n\n let shouldPreventScroll = false;\n\n if (options.onDrag) {\n options.onDrag(e, captureEvent, { dragOffsetX, dragOffsetY });\n shouldPreventScroll = true;\n }\n\n if (options.onSwipe && !hasSwiped) {\n hasSwiped = onSwipe(e, dragOffsetX, dragOffsetY);\n shouldPreventScroll = hasSwiped;\n }\n\n if (IS_IOS && shouldPreventScroll && options.selectorToPreventScroll) {\n Array.from(document.querySelectorAll(options.selectorToPreventScroll)).forEach((scrollable) => {\n scrollable.style.overflow = 'hidden';\n });\n }\n }\n }\n\n function onSwipe(e: MouseEvent | RealTouchEvent, dragOffsetX: number, dragOffsetY: number) {\n // Avoid conflicts with swipe-to-back gestures\n if (IS_IOS) {\n const x = (e as RealTouchEvent).touches[0].pageX;\n if (x <= IOS_SCREEN_EDGE_THRESHOLD || x >= window.innerWidth - IOS_SCREEN_EDGE_THRESHOLD) {\n return false;\n }\n }\n\n const xAbs = Math.abs(dragOffsetX);\n const yAbs = Math.abs(dragOffsetY);\n\n if (dragOffsetX && dragOffsetY) {\n const ratio = Math.max(xAbs, yAbs) / Math.min(xAbs, yAbs);\n // Diagonal swipe\n if (ratio < 2) {\n return false;\n }\n }\n\n let axis: TSwipeAxis | undefined;\n if (xAbs >= SWIPE_THRESHOLD) {\n axis = 'x';\n } else if (yAbs >= SWIPE_THRESHOLD) {\n axis = 'y';\n }\n\n if (!axis) {\n return false;\n }\n\n if (!initialSwipeAxis) {\n initialSwipeAxis = axis;\n } else if (initialSwipeAxis !== axis) {\n // Prevent horizontal swipe after vertical to prioritize scroll\n return false;\n }\n\n return processSwipe(e, axis, dragOffsetX, dragOffsetY, options.onSwipe!);\n }\n\n element.addEventListener('mousedown', onCapture);\n element.addEventListener('touchstart', onCapture, { passive: !options.isNotPassive });\n\n return () => {\n element.removeEventListener('mousedown', onCapture);\n element.removeEventListener('touchstart', onCapture);\n };\n}\n\nfunction processSwipe(\n e: Event,\n currentSwipeAxis: TSwipeAxis,\n dragOffsetX: number,\n dragOffsetY: number,\n onSwipe: (e: Event, direction: SwipeDirection) => boolean,\n) {\n if (currentSwipeAxis === 'x') {\n if (dragOffsetX < 0) {\n return onSwipe(e, SwipeDirection.Left);\n } else {\n return onSwipe(e, SwipeDirection.Right);\n }\n } else if (currentSwipeAxis === 'y') {\n if (dragOffsetY < 0) {\n return onSwipe(e, SwipeDirection.Up);\n } else {\n return onSwipe(e, SwipeDirection.Down);\n }\n }\n\n return false;\n}\n","// Sometimes event is fired earlier than animation completes\nconst ANIMATION_END_DELAY = 50;\n\nexport function waitForTransitionEnd(node: Node, handler: NoneToVoidFunction, propertyName?: string) {\n waitForEndEvent('transitionend', node, handler, propertyName);\n}\n\nexport function waitForAnimationEnd(node: Node, handler: NoneToVoidFunction, animationName?: string) {\n waitForEndEvent('animationend', node, handler, animationName);\n}\n\nfunction waitForEndEvent(\n eventType: 'transitionend' | 'animationend',\n node: Node,\n handler: NoneToVoidFunction,\n detailedName?: string,\n) {\n let isHandled = false;\n\n node.addEventListener(eventType, function handleAnimationEnd(e: TransitionEvent | AnimationEvent) {\n if (isHandled || e.target !== e.currentTarget) {\n return;\n }\n\n if (detailedName && (\n (e instanceof TransitionEvent && e.propertyName === detailedName)\n || (e instanceof AnimationEvent && e.animationName === detailedName)\n )) {\n return;\n }\n\n isHandled = true;\n\n node.removeEventListener(eventType, handleAnimationEnd as EventListener);\n\n setTimeout(() => {\n handler();\n }, ANIMATION_END_DELAY);\n } as EventListener);\n}\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { FocusDirection } from '../types';\n\nimport {\n ANIMATION_LEVEL_MIN,\n FAST_SMOOTH_MAX_DISTANCE, FAST_SMOOTH_MAX_DURATION, FAST_SMOOTH_MIN_DURATION,\n FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE,\n} from '../config';\nimport { IS_ANDROID } from './environment';\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { animateSingle } from './animation';\nimport { fastRaf } from './schedulers';\n\nlet isAnimating = false;\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n) {\n const scrollFrom = calculateScrollFrom(container, element, maxDistance, forceDirection);\n\n if (forceDirection === FocusDirection.Static) {\n scrollWithJs(container, element, scrollFrom, position, margin, 0);\n return;\n }\n\n if (getGlobal().settings.byKey.animationLevel === ANIMATION_LEVEL_MIN) {\n forceDuration = 0;\n }\n\n scrollWithJs(container, element, scrollFrom, position, margin, forceDuration, forceNormalContainerHeight);\n}\n\nexport function isAnimatingScroll() {\n return isAnimating;\n}\n\nfunction calculateScrollFrom(\n container: HTMLElement,\n element: HTMLElement,\n maxDistance = FAST_SMOOTH_MAX_DISTANCE,\n forceDirection?: FocusDirection,\n) {\n const { offsetTop: elementTop } = element;\n const { scrollTop } = container;\n\n if (forceDirection === undefined) {\n const offset = elementTop - container.scrollTop;\n\n if (offset < -maxDistance) {\n return scrollTop + (offset + maxDistance);\n } else if (offset > maxDistance) {\n return scrollTop + (offset - maxDistance);\n }\n } else if (forceDirection === FocusDirection.Up) {\n return elementTop + maxDistance;\n } else if (forceDirection === FocusDirection.Down) {\n return Math.max(0, elementTop - maxDistance);\n }\n\n return scrollTop;\n}\n\nfunction scrollWithJs(\n container: HTMLElement,\n element: HTMLElement,\n scrollFrom: number,\n position: ScrollLogicalPosition | 'centerOrTop',\n margin = 0,\n forceDuration?: number,\n forceNormalContainerHeight?: boolean,\n) {\n const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const { scrollTop: currentScrollTop, offsetHeight: containerHeight, scrollHeight } = container;\n const targetContainerHeight = forceNormalContainerHeight && container.dataset.normalHeight\n ? Number(container.dataset.normalHeight)\n : containerHeight;\n\n if (currentScrollTop !== scrollFrom) {\n container.scrollTop = scrollFrom;\n }\n\n let path!: number;\n\n switch (position) {\n case 'start':\n path = (elementTop - margin) - scrollFrom + (IS_ANDROID ? 1 : 0);\n break;\n case 'end':\n path = (elementTop + elementHeight + margin) - (scrollFrom + targetContainerHeight);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n case 'centerOrTop':\n path = elementHeight < targetContainerHeight\n ? (elementTop + elementHeight / 2) - (scrollFrom + targetContainerHeight / 2)\n : (elementTop - margin) - scrollFrom;\n break;\n }\n\n if (path < 0) {\n const remainingPath = -scrollFrom;\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollHeight - (scrollFrom + targetContainerHeight);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n return;\n }\n\n const target = scrollFrom + path;\n\n if (forceDuration === 0) {\n container.scrollTop = target;\n return;\n }\n\n isAnimating = true;\n\n const absPath = Math.abs(path);\n const transition = absPath < FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\n const duration = forceDuration || (\n FAST_SMOOTH_MIN_DURATION\n + (absPath / FAST_SMOOTH_MAX_DISTANCE) * (FAST_SMOOTH_MAX_DURATION - FAST_SMOOTH_MIN_DURATION)\n );\n const startAt = Date.now();\n const onHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n fastRaf(() => {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n const currentPath = path * (1 - transition(t));\n\n container.scrollTop = Math.round(target - currentPath);\n\n isAnimating = t < 1;\n\n if (!isAnimating) {\n onHeavyAnimationStop();\n }\n\n return isAnimating;\n });\n });\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MIN } from '../config';\nimport { animate } from './animation';\nimport { fastRaf } from './schedulers';\n\nconst DEFAULT_DURATION = 300;\n\nexport default function fastSmoothScrollHorizontal(container: HTMLElement, left: number, duration = DEFAULT_DURATION) {\n if (getGlobal().settings.byKey.animationLevel === ANIMATION_LEVEL_MIN) {\n duration = 0;\n }\n\n scrollWithJs(container, left, duration);\n}\n\nfunction scrollWithJs(container: HTMLElement, left: number, duration: number) {\n const isRtl = container.getAttribute('dir') === 'rtl';\n const { scrollLeft, offsetWidth: containerWidth, scrollWidth } = container;\n let path = left - scrollLeft;\n\n if (path < 0) {\n const remainingPath = -scrollLeft * (isRtl ? -1 : 1);\n path = Math.max(path, remainingPath);\n } else if (path > 0) {\n const remainingPath = scrollWidth - (scrollLeft + containerWidth);\n path = Math.min(path, remainingPath);\n }\n\n if (path === 0) {\n return;\n }\n\n const target = scrollLeft + path;\n\n if (duration === 0) {\n container.scrollLeft = target;\n return;\n }\n\n const startAt = Date.now();\n\n fastRaf(() => {\n animate(() => {\n const t = Math.min((Date.now() - startAt) / duration, 1);\n\n const currentPath = path * (1 - transition(t));\n container.scrollLeft = Math.round(target - currentPath);\n\n return t < 1;\n });\n });\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","import { IS_TOUCH_ENV } from './environment';\n\nexport default function focusEditableElement(element: HTMLElement, force?: boolean) {\n if (!force && element === document.activeElement) {\n return;\n }\n\n const selection = window.getSelection()!;\n const range = document.createRange();\n const lastChild = element.lastChild || element;\n\n if (!IS_TOUCH_ENV && (!lastChild || !lastChild.nodeValue)) {\n element.focus();\n return;\n }\n\n range.selectNodeContents(lastChild);\n // `false` means collapse to the end rather than the start\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n","export default function getKeyFromEvent(e: KeyboardEvent) {\n const key = 'key' in e ? e.key : e.code;\n\n return key.startsWith('Key') ? key.slice(3).toLowerCase() : key;\n}\n","export type MediaSessionHandlers = {\n play?: () => void;\n pause?: () => void;\n stop?: () => void;\n\n previoustrack?: () => void;\n nexttrack?: () => void;\n\n togglemicrophone?: () => void;\n togglecamera?: () => void;\n hangup?: () => void;\n\n seekbackward?: (details: MediaSessionActionDetails) => void;\n seekforward?: (details: MediaSessionActionDetails) => void;\n seekTo?: ((details: MediaSessionActionDetails) => void);\n};\n\ninterface MediaMetadataParameters {\n title?: string;\n artist?: string;\n album?: string;\n artwork?: MediaImage[];\n}\n\nconst DEFAULT_HANDLERS = {\n play: undefined,\n pause: undefined,\n seekbackward: undefined,\n seekforward: undefined,\n previoustrack: undefined,\n nexttrack: undefined,\n stop: undefined,\n seekTo: undefined,\n};\n\nexport function registerMediaSession(metadata?: MediaMetadata, handlers?: MediaSessionHandlers) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n if (metadata) updateMetadata(metadata);\n if (handlers) setMediaSessionHandlers(handlers);\n } else {\n // eslint-disable-next-line no-console\n console.warn('MediaSession API not supported in this browser');\n }\n}\n\nexport function updateMetadata(metadata?: MediaMetadata) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n // eslint-disable-next-line no-null/no-null\n mediaSession.metadata = metadata ?? null;\n }\n}\n\nexport function setMediaSessionHandlers(handlers: MediaSessionHandlers) {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n Object.entries({ ...DEFAULT_HANDLERS, ...handlers }).forEach(([key, handler]) => {\n try {\n // @ts-ignore API not standardized yet\n mediaSession.setActionHandler(key, handler);\n } catch (err) {\n // Handler not supported, ignoring\n }\n });\n }\n}\n\nexport function clearMediaSession() {\n const { mediaSession } = window.navigator;\n if (mediaSession) {\n // eslint-disable-next-line no-null/no-null\n mediaSession.metadata = null;\n setMediaSessionHandlers(DEFAULT_HANDLERS);\n if (mediaSession.playbackState) mediaSession.playbackState = 'none';\n mediaSession.setPositionState?.();\n }\n}\n\nexport function setPlaybackState(state: 'none' | 'paused' | 'playing' = 'none') {\n const { mediaSession } = window.navigator;\n if (mediaSession && mediaSession.playbackState) {\n mediaSession.playbackState = state;\n }\n}\n\nexport function setPositionState(state?: MediaPositionState) {\n if (!state || state.position === undefined || state.duration === undefined) return;\n state.position = Math.min(state.position, state.duration);\n\n const { mediaSession } = window.navigator;\n mediaSession?.setPositionState?.(state);\n}\n\nexport function setMicrophoneActive(active: boolean) {\n const { mediaSession } = window.navigator;\n // @ts-ignore typings not updated yet\n mediaSession?.setMicrophoneActive?.(active);\n}\n\nexport function setCameraActive(active: boolean) {\n const { mediaSession } = window.navigator;\n // @ts-ignore typings not updated yet\n mediaSession?.setCameraActive?.(active);\n}\n\nexport function buildMediaMetadata({\n title, artist, album, artwork,\n}: MediaMetadataParameters) {\n if ('MediaMetadata' in window) {\n return new window.MediaMetadata({\n title,\n artist,\n album,\n artwork,\n });\n }\n return undefined;\n}\n","import { ApiMessageEntity, ApiMessageEntityTypes, ApiFormattedText } from '../api/types';\nimport { IS_EMOJI_SUPPORTED } from './environment';\n\nconst ENTITY_CLASS_BY_NODE_NAME: Record = {\n B: ApiMessageEntityTypes.Bold,\n STRONG: ApiMessageEntityTypes.Bold,\n I: ApiMessageEntityTypes.Italic,\n EM: ApiMessageEntityTypes.Italic,\n U: ApiMessageEntityTypes.Underline,\n S: ApiMessageEntityTypes.Strike,\n STRIKE: ApiMessageEntityTypes.Strike,\n DEL: ApiMessageEntityTypes.Strike,\n CODE: ApiMessageEntityTypes.Code,\n PRE: ApiMessageEntityTypes.Pre,\n BLOCKQUOTE: ApiMessageEntityTypes.Blockquote,\n};\n\nconst MAX_TAG_DEEPNESS = 3;\n\nexport default function parseMessageInput(html: string): ApiFormattedText {\n const fragment = document.createElement('div');\n fragment.innerHTML = parseMarkdown(html);\n const text = fragment.innerText.trim().replace(/\\u200b+/g, '');\n let textIndex = 0;\n let recursionDeepness = 0;\n const entities: ApiMessageEntity[] = [];\n\n function addEntity(node: ChildNode) {\n const { index, entity } = getEntityDataFromNode(node, text, textIndex);\n\n if (entity) {\n textIndex = index;\n entities.push(entity);\n } else if (node.textContent) {\n textIndex += node.textContent.length;\n }\n\n if (node.hasChildNodes() && recursionDeepness <= MAX_TAG_DEEPNESS) {\n recursionDeepness += 1;\n Array.from(node.childNodes).forEach(addEntity);\n }\n }\n\n Array.from(fragment.childNodes).forEach((node) => {\n recursionDeepness = 1;\n addEntity(node);\n });\n\n return {\n text,\n entities: entities.length ? entities : undefined,\n };\n}\n\nfunction parseMarkdown(html: string) {\n let parsedHtml = html.slice(0);\n\n if (!IS_EMOJI_SUPPORTED) {\n // Emojis\n parsedHtml = parsedHtml.replace(/]+alt=\"([^\"]+)\"[^>]*>/gm, '$1');\n }\n\n // Strip redundant tags\n parsedHtml = parsedHtml.replace(/<\\/?span([^>]*)?>/g, '');\n\n // Strip redundant nbsp's\n parsedHtml = parsedHtml.replace(/ /g, ' ');\n\n // Replace

with newline (new line in Safari)\n parsedHtml = parsedHtml.replace(/
]*)?><\\/div>/g, '\\n');\n // Replace
with newline\n parsedHtml = parsedHtml.replace(/]*)?>/g, '\\n');\n\n // Strip redundant
tags\n parsedHtml = parsedHtml.replace(/<\\/div>(\\s*)
/g, '\\n');\n parsedHtml = parsedHtml.replace(/
/g, '\\n');\n parsedHtml = parsedHtml.replace(/<\\/div>/g, '');\n\n // Pre\n parsedHtml = parsedHtml.replace(/^`{3}(.*[\\n\\r][^]*?^)`{3}/gm, '
$1
');\n parsedHtml = parsedHtml.replace(/[`]{3}([^`]+)[`]{3}/g, '
$1
');\n\n // Code\n parsedHtml = parsedHtml.replace(/[`]{1}([^`\\n]+)[`]{1}/g, '$1');\n\n // Other simple markdown\n parsedHtml = parsedHtml.replace(\n /(^|\\s)(?!)(\\s|$)/g,\n '$1$2$3',\n );\n parsedHtml = parsedHtml.replace(\n /(^|\\s)(?!)(\\s|$)/g,\n '$1$2$3',\n );\n parsedHtml = parsedHtml.replace(\n /(^|\\s)(?!)(\\s|$)/g,\n '$1$2$3',\n );\n\n return parsedHtml;\n}\n\nfunction getEntityDataFromNode(\n node: ChildNode,\n rawText: string,\n textIndex: number,\n): { index: number; entity?: ApiMessageEntity } {\n const type = getEntityTypeFromNode(node);\n if (!type || !node.textContent) {\n return {\n index: textIndex,\n entity: undefined,\n };\n }\n\n const rawIndex = rawText.indexOf(node.textContent, textIndex);\n // In some cases, last text entity ends with a newline (which gets trimmed from `rawText`).\n // In this case, `rawIndex` would return `-1`, so we use `textIndex` instead.\n const index = rawIndex >= 0 ? rawIndex : textIndex;\n const offset = rawText.substring(0, index).length;\n const { length } = rawText.substring(index, index + node.textContent.length);\n\n let url: string | undefined;\n let userId: string | undefined;\n if (type === ApiMessageEntityTypes.TextUrl) {\n url = (node as HTMLAnchorElement).href;\n }\n if (type === ApiMessageEntityTypes.MentionName) {\n userId = (node as HTMLAnchorElement).dataset.userId;\n }\n\n return {\n index,\n entity: {\n type,\n offset,\n length,\n ...(url && { url }),\n ...(userId && { userId }),\n },\n };\n}\n\nfunction getEntityTypeFromNode(node: ChildNode) {\n if (ENTITY_CLASS_BY_NODE_NAME[node.nodeName]) {\n return ENTITY_CLASS_BY_NODE_NAME[node.nodeName];\n }\n\n if (node.nodeName === 'A') {\n const anchor = node as HTMLAnchorElement;\n if (anchor.dataset.entityType === ApiMessageEntityTypes.MentionName) {\n return ApiMessageEntityTypes.MentionName;\n }\n if (anchor.dataset.entityType === ApiMessageEntityTypes.Url) {\n return ApiMessageEntityTypes.Url;\n }\n if (anchor.href.startsWith('mailto:')) {\n return ApiMessageEntityTypes.Email;\n }\n if (anchor.href.startsWith('tel:')) {\n return ApiMessageEntityTypes.Phone;\n }\n if (anchor.href !== anchor.textContent) {\n return ApiMessageEntityTypes.TextUrl;\n }\n\n return ApiMessageEntityTypes.Url;\n }\n\n if (node.nodeName === 'SPAN') {\n return (node as HTMLElement).dataset.entityType;\n }\n\n return undefined;\n}\n","/*\n * Thanks to Ace Monkey for this mind-blowing patch.\n */\n\nexport function patchSafariProgressiveAudio(audioEl: HTMLAudioElement) {\n if (audioEl.dataset.patchedForSafari) {\n return;\n }\n\n audioEl.addEventListener('play', () => {\n const t = audioEl.currentTime;\n\n audioEl.dataset.patchForSafariInProgress = 'true';\n function onProgress() {\n if (!audioEl.buffered.length) {\n return;\n }\n audioEl.currentTime = audioEl.duration - 1;\n audioEl.addEventListener('progress', () => {\n delete audioEl.dataset.patchForSafariInProgress;\n audioEl.currentTime = t;\n if (audioEl.paused && !audioEl.dataset.preventPlayAfterPatch) {\n audioEl.play();\n }\n }, { once: true });\n\n audioEl.removeEventListener('progress', onProgress);\n }\n\n audioEl.addEventListener('progress', onProgress);\n }, { once: true });\n\n audioEl.dataset.patchedForSafari = 'true';\n}\n\nexport function isSafariPatchInProgress(audioEl: HTMLAudioElement) {\n return Boolean(audioEl.dataset.patchForSafariInProgress);\n}\n","import React from '../lib/teact/teact';\n\nexport default (e: React.UIEvent | Event) => {\n e.stopPropagation();\n e.preventDefault();\n};\n"],"names":["memo","sticker","effect","isOwn","soundId","size","observeIntersection","lastSyncTime","forceLoadPreview","messageId","chatId","activeEmojiInteraction","markAnimationLoaded","isAnimationLoaded","ref","width","style","handleClick","playKey","useAnimatedEmoji","undefined","emoji","localMediaHash","id","isIntersecting","useIsIntersecting","thumbDataUri","thumbnail","dataUri","previewBlobUrl","useMedia","ApiMediaFormat","transitionClassNames","useMediaTransition","mediaData","isMediaLoaded","Boolean","className","buildClassName","LIKE_STICKER_ID","onClick","src","alt","key","animationData","quality","play","forceOnHeavyAnimation","noLoop","onLoad","MIN_SPIKES","IS_SINGLE_COLUMN_LAYOUT","MAX_SPIKES","renderSeekline","playProgress","bufferedProgress","seekerRef","theme","message","senderTitle","uploadProgress","origin","date","isSelectable","isSelected","isDownloading","onPlay","onReadMedia","onCancelUpload","onDateClick","content","audio","voice","video","isMediaUnread","isVoice","isSeeking","useRef","playStateBeforeSeeking","lang","useLang","isRtl","dispatch","getDispatch","isActivated","setIsActivated","useState","shouldLoad","coverHash","getMessageMediaHash","coverBlobUrl","getMessageMediaFormat","loadProgress","downloadProgress","useMediaWithLoadProgress","handleForcePlay","useCallback","handleTrackChange","isBuffered","bufferingHandlers","checkBuffering","useBuffering","isPlaying","playPause","pause","setCurrentTime","duration","useAudioPlayer","makeTrackId","getMediaDuration","isMessageLocal","isOwnMessage","waveformCanvasRef","canvasRef","data","spikes","peak","useMemo","waveform","Array","Math","min","fill","durationFactor","spikesCount","round","fitCount","newData","springFactor","length","leftFiller","rightFiller","i","idx","floor","val","interpolateArray","encoded5bit","bitsCount","valuesCount","result","bitsData","l","byteIndex","bitShift","value","lastByteIndex","lastBitShift","lastValue","decodeWaveform","Uint8Array","useLayoutEffect","canvas","current","progress","fillStyle","progressFillStyle","height","ctx","getContext","scale","forEach","item","globalAlpha","spikeHeight","max","x","y","radius","beginPath","moveTo","arcTo","closePath","roundedRectangle","renderWaveform","useWaveformCanvas","withSeekline","useEffect","isLoadingForPlaying","isUploading","isTransferring","transferProgress","getMediaTransferState","shouldRender","shouldRenderSpinner","spinnerClassNames","useShowTransition","shouldRenderCross","handleButtonClick","setAudioPlayerOrigin","handleDownloadClick","cancelMessageMediaDownload","downloadMessageMedia","handleSeek","e","left","getBoundingClientRect","clientX","MouseEvent","targetTouches","stopPropagation","handleStartSeek","button","handleStopSeek","handleDateClick","renderFirstLine","title","fileName","captureEvents","onCapture","onRelease","onDrag","fullClassName","AudioOrigin","buttonClassNames","push","contentClassName","renderWithTitle","dir","renderText","Link","formatPastTimeShort","formatMediaDuration","performer","renderSecondLine","Button","ripple","color","join","ariaLabel","backgroundImage","ProgressSpinner","transparent","noCross","showProgress","showSeekline","getTranslation","getFileSizeString","formatMediaDateTime","renderAudio","draggable","renderVoice","props","isOpen","CalendarModal","useModuleLoader","Bundles","withGlobal","global","chatOrUserId","countryList","phoneCodes","phoneCodeList","chat","selectChat","user","isUserId","selectUser","isMuted","selectIsChatMuted","selectNotifySettings","selectNotifyExceptions","canInviteUsers","isChatChannel","isUserRightBanned","getHasAdminRight","forceShowSelf","loadFullUser","showNotification","updateChatMutedState","userId","fullInfo","username","phoneNumber","isSelf","handleNotificationChange","isRestricted","copy","text","entity","copyTextToClipboard","formattedNumber","formatPhoneNumberWithCode","link","getChatLink","description","bio","getChatDescription","icon","multiline","narrow","isStatic","label","checked","inactive","isPrivateChat","isChatWithSelf","selectIsChatWithSelf","getPrivateChatUserId","isBot","isUserBot","isSupport","canDeleteForAll","contactName","getUserFirstOrLastName","isChannel","isBasicGroup","isChatBasicGroup","isSuperGroup","isChatSuperGroup","currentUserId","onClose","onCloseAnimationEnd","leaveChannel","deleteHistory","deleteChannel","deleteChatUser","blockContact","chatTitle","getChatTitle","handleDeleteMessageForAll","shouldDeleteForAll","handleDeleteAndStop","contactId","accessHash","handleDeleteChat","isCreator","header","isSavedMessages","isText","smaller","canAutoLoad","autoLoadFileMaxSizeMb","withDate","datetime","sender","onMediaClick","document","timestamp","extension","getDocumentExtension","wasIntersected","markIntersected","useFlag","isLoadAllowed","setIsLoadAllowed","shouldDownload","documentHash","isLoaded","hasPreview","getDocumentHasPreview","getMessageMediaThumbDataUri","localBlobUrl","previewData","withMediaViewer","mediaType","name","thumbnailDataUri","actionIcon","isMessageDocumentVideo","elementRef","shouldSpinnerRender","getColorFromExtension","sizeString","getDocumentThumbnailDimensions","onlineCount","selectChatOnlineCount","areMessagesLoaded","selectChatMessages","typingStatus","avatarSize","withUsername","withFullInfo","withUpdatingStatus","withChatType","noRtl","loadFullChat","openMediaViewer","isMin","handleAvatarViewerOpen","hasPhoto","avatarOwnerId","MediaViewerOrigin","isVerified","getChatTypeString","handle","groupStatus","chatTypeString","membersCount","getGroupStatus","onlineStatus","renderStatusOrTyping","outgoingStatus","status","idPrefix","isProtected","mediaBlobUrl","getMessageVideo","onContextMenu","stopEvent","isGif","Keys","activeKey","itemIds","selectedIds","filterValue","filterPlaceholder","notFoundText","searchInputId","isLoading","noScrollRestore","onSelectedIdsChange","onFilterChange","onLoadMore","inputRef","shouldMinimize","setTimeout","requestAnimationFrame","focus","handleItemClick","newSelectedIds","includes","splice","indexOf","handleFilterChange","currentTarget","viewportIds","getMore","useInfiniteScroll","map","isMinimized","canClose","clickArg","onChange","placeholder","items","iconElement","titleText","serverTimeOffset","userStatus","selectUserStatus","noStatusOrTyping","fullName","getUserFullName","isUserOnline","getUserStatus","photo","isFirstPhoto","isDeleted","isDeletedUser","isRepliesChat","isChatWithRepliesBot","getMediaHash","forceAvatar","hash","getChatAvatarHash","photoBlobUrl","avatarMediaHash","avatarBlobUrl","useBlurSync","imageSrc","prevImageSrc","usePrevious","decoding","userFullName","getFirstLetters","Spinner","getUserColorKey","connectionState","animationLevel","settings","byKey","photos","slideAnimation","currentPhotoIndex","setCurrentPhotoIndex","isFirst","isLast","profile","currentIndex","slice","mediaLoader","usePhotosPreload","handleProfilePhotoClick","profilePhotoIndex","selectPreviousMedia","selectNextMedia","element","querySelector","selectorToPreventScroll","onSwipe","IS_TOUCH_ENV","direction","SwipeDirection","renderPhoto","isVerifiedIconShown","_","renderPhotoTabs","Transition","type","VerifiedIcon","reaction","staticIconId","getGlobal","availableReactions","find","staticIcon","noAnimate","onUnfaveClick","stickerSelector","shouldPlay","lottieData","isAnimated","markLoaded","unmarkLoaded","canAnimatedPlay","previewTransitionClassNames","onMouseDown","preventMessageInputBlurWithBubbling","isLowPriority","preventDefault","StickerSetModal","typingUser","typingUserName","action","replace","trim","onMessageClick","linkData","getMessageWebPage","getFirstLinkInMessage","url","domain","messageText","getMessageSummaryText","siteName","handleMessageClick","displayUrl","truncatedDescription","trimText","MEDIA_VIEWER_MEDIA_QUERY","REM","parseInt","getComputedStyle","documentElement","fontSize","ROUND_VIDEO_DIMENSIONS_PX","AVATAR_FULL_DIMENSIONS","DEFAULT_MEDIA_DIMENSIONS","cachedMaxWidthOwn","cachedMaxWidth","cachedMaxWidthNoAvatar","getAvailableWidth","fromOwnMessage","isForwarded","isWebPagePhoto","noAvatars","extraPaddingRem","regularMaxWidth","windowWidth","windowSize","getMaxMessageWidthRem","calculateDimensionsForMessageMedia","aspectRatio","availableWidth","availableHeight","getAvailableHeight","mediaWidth","calculateDimensions","getMediaViewerAvailableDimensions","withFooter","isVideo","mql","window","matchMedia","windowHeight","occupiedHeightRem","matches","calculateInlineImageDimensions","getPhotoInlineDimensions","calculateVideoDimensions","getVideoDimensions","getPictogramDimensions","getStickerDimensions","baseWidth","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_INLINE_DESKTOP_FACTOR","calculatedHeight","calculateMediaViewerDimensions","mediaHeight","calculatedWidth","renderMessageText","highlight","shouldRenderHqEmoji","formattedText","rawText","getMessageText","entities","renderTextWithEntities","organizeEntity","index","organizedEntityIndexes","offset","organizedIndexes","Set","has","nestedEntities","filter","parsedEntity","isChanged","organizedIndex","add","organizeEntities","organizedEntities","organizedEntity","shouldRenderAsHtml","renderMessagePart","deleteLineBreakAfterPre","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","textBefore","substring","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","ApiMessageEntityTypes","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","getLinkUrl","processEntityAsHtml","entityText","handleBotCommandClick","handleHashtagClick","href","target","rel","processEntity","isArray","textAfter","arrayIndex","c","emojiFilter","sendBotCommand","command","innerText","setLocalTextSearchQuery","query","searchTextMessagesLocal","WIDTH","large","medium","small","localEffect","interactWithAnimatedEmoji","sendEmojiInteraction","sendWatchingEmojiInteraction","hasEffect","audioRef","soundMediaData","setPlayKey","String","random","interactions","startedInteractions","sendInteractionBunch","remove","Audio","safePlay","addEventListener","once","container","startSize","isReversed","performance","now","selectedMessageId","endX","endY","emoticon","selectLocalAnimatedEmojiEffectByName","ChatFolderModal","ChatAnimationTypes","isPinned","isShown","unreadCount","hasUnreadMark","renderContent","unreadMentionsCount","formatIntegerCompact","ShowTransition","isCustom","isActive","lastMessage","senderId","replyToMessageId","isOutgoing","lastMessageSender","lastMessageAction","getMessageAction","actionTargetMessage","selectChatMessage","targetUserIds","actionTargetUserIds","targetChatId","actionTargetChatId","privateChatUserId","currentChatId","threadId","currentThreadId","messageListType","selectCurrentMessageList","MAIN_THREAD_ID","draft","selectDraft","canScrollDown","canChangeFolder","chatFolders","orderedIds","lastMessageOutgoingStatus","selectOutgoingStatus","folderId","orderDiff","animationType","openChat","focusLastMessage","isDeleteModalOpen","openDeleteModal","closeDeleteModal","isChatFolderModalOpen","openChatFolderModal","closeChatFolderModal","shouldRenderDeleteModal","markRenderDeleteModal","unmarkRenderDeleteModal","shouldRenderChatFolderModal","markRenderChatFolderModal","unmarkRenderChatFolderModal","isAction","isActionMessage","useEnsureMessage","mediaThumbnail","getMessageSticker","isRoundVideo","getMessageRoundVideo","actionTargetUsers","usersById","users","byId","Opacity","opacity","fastRaf","classList","Move","transform","ANIMATION_END_DELAY","shouldReplaceHistory","contextActions","useChatContextActions","handleDelete","handleChatFolderChange","ListItem","Avatar","isCallActive","isCallNotEmpty","LastMessageMeta","TypingStatus","actionOrigin","renderActionMessageText","asPlain","senderName","getMessageSenderName","blobUrl","renderMessageSummary","renderLastMessageOrTyping","DeleteChatModal","folderType","chatFolder","selectChatFolder","animatedEmoji","selectAnimatedEmoji","foldersDispatch","onScreenSelect","handleEditFolder","payload","SettingsScreens","AnimatedEmoji","fluid","pill","FolderTypeToListType","chats","listIds","chatsById","orderedPinnedIds","listType","allListIds","notifySettings","notifyExceptions","loadMoreChats","preloadTopChatMessages","preloadArchivedChats","openNextChat","currentListIds","currentPinnedIds","prepareFolderListIds","orderById","chatArrays","newChatArrays","prepareChatList","singleList","concat","pinnedChats","otherChats","newOrderedIds","reduce","acc","prevOrderById","orderDiffById","mapValues","order","loadMoreOfType","CHAT_LIST_SLICE","ALL_CHATS_PRELOAD_DISABLED","viewportChatArrays","reduceChatList","handleKeyDown","removeEventListener","IS_PWA","IS_MAC_OS","metaKey","ctrlKey","code","startsWith","digit","match","position","Number","altKey","targetIndexDelta","getAnimationType","orderDiffs","Object","values","numberOfUp","diff","numberOfDown","None","Infinity","useChatAnimationType","InfiniteScroll","preloadBackwards","noFastList","viewportOffset","pinnedOffset","IS_ANDROID","CHAT_HEIGHT_PX","teactFastList","teactOrderKey","getChatOrder","renderChats","Loading","getSenderName","getSenderTitle","isChatGroup","isQuick","onFileSelect","isHovered","markHovered","unmarkHovered","onDrop","onDragEnter","onDragLeave","relatedTarget","toTarget","DropAreaState","withQuick","onHide","hideTimeoutRef","prevWithQuick","captureEscKeyListener","handleFilesDrop","dataTransfer","dt","files","from","handleQuickFilesDrop","handleDragLeave","fromTarget","Portal","containerId","onDragOver","clearTimeout","EmojiTooltip","MAX_INPUT_HEIGHT","messageSendKeyCombo","replyingToId","selectReplyingToId","noTabCapture","isPollModalOpen","payment","isPaymentModalOpen","isAttachmentModalInput","editableInputId","html","forcedPlaceholder","canAutoFocus","shouldSuppressFocus","shouldSuppressTextFormatter","onUpdate","onSuppressedFocus","onSend","editLastMessage","replyToNextMessage","cloneRef","isContextMenuOpenRef","isTextFormatterOpen","openTextFormatter","closeTextFormatter","textFormatterAnchorPosition","setTextFormatterAnchorPosition","selectedRange","setSelectedRange","sendMessageAction","useSendMessageAction","updateInputHeight","useLayoutEffectWithPrevDeps","prevHtml","innerHTML","focusInput","isHeavyAnimating","focusEditableElement","handleCloseTextFormatter","selection","getSelection","removeAllRanges","empty","clearSelection","checkSelection","IS_IOS","rangeCount","selectionRange","getRangeAt","selectedText","toString","isSelectionInsideInput","EDITABLE_INPUT_ID","parseEmojiOnlyString","START_TO_END","processSelection","selectionRect","inputRect","top","willSend","input","clone","currentHeight","newHeight","scrollHeight","transitionDuration","log","abs","exec","toggle","captureFirstTab","debounce","captureKeyboardListeners","onTab","suppressFocus","blur","contentEditable","textContent","IS_EMOJI_SUPPORTED","onKeyDown","shiftKey","handleKeyUp","event","closeContextMenuMouseListener","closeContextMenuKeyListener","handleMouseUp","onTouchCancel","anchorPosition","TEXT_FORMAT_BY_TAG_NAME","B","STRONG","I","EM","U","DEL","CODE","fragmentEl","createElement","containerRef","linkUrlInputRef","isLinkControlOpen","openLinkControl","closeLinkControl","linkUrl","setLinkUrl","isEditingLink","setIsEditingLink","inputClassName","setInputClassName","selectedTextFormats","setSelectedTextFormats","useVirtualBackdrop","selectedFormats","parentElement","commonAncestorContainer","textFormat","tagName","updateSelectedRange","getSelectedText","getSelectedElement","updateInputStyles","offsetWidth","scrollWidth","scrollLeft","getFormatButtonClassName","keys","some","fKey","monospace","strikethrough","handleBoldText","execCommand","bold","handleItalicText","italic","handleUnderlineText","underline","handleStrikethroughText","replaceWith","handleMonospaceText","handleLinkUrlConfirm","formattedLinkUrl","encodeURI","ensureProtocol","addRange","restoreSelection","handler","k","b","u","m","s","getKeyFromEvent","linkUrlConfirmClassName","autoComplete","inputMode","onScroll","RE_BR","RE_SPACE","RE_CLEAN_HTML","RE_EXTRA_NEW_LINE","prepareForRegExp","inputId","parentNode","iterations","cache","WeakMap","memoized","fn","args","cached","get","areSortedArraysEqual","lastArgs","lastResult","set","emojiDataPromise","emojiRawData","emojiData","RE_EMOJI_SEARCH","prepareRecentEmojisMemo","recentEmojiIds","limit","pickTruthy","MEMO_EMPTY_ARRAY","prepareLibraryMemo","baseEmojiKeywords","emojiKeywords","emojis","byNative","buildCollectionByKey","baseEmojisByKeyword","natives","emojisByKeyword","byKeyword","keywords","byName","names","searchInLibraryMemo","library","matched","matchedKeywords","keyword","sort","flatten","matchedNames","unique","RegExp","useEmojiTooltip","isAllowed","htmlRef","onUpdateHtml","isDisabled","markIsOpen","unmarkIsOpen","setById","shouldForceInsertEmoji","setShouldForceInsertEmoji","filteredEmojis","setFilteredEmojis","async","default","uncompressEmoji","ensureEmojiData","then","getEmojiCode","forceSend","endsWith","insertEmoji","textEmoji","isForce","currentHtml","atIndex","lastIndexOf","messageInput","getElementById","native","isEmojiTooltipOpen","closeEmojiTooltip","runThrottled","throttle","cb","RE_USERNAME_SEARCH","useMentionTooltip","canSuggestMembers","groupChatMembers","topInlineBotIds","usersToMention","setUsersToMention","updateFilteredUsers","withInlineBots","memberIds","member","filteredIds","filterUsersByName","usernameFilter","getUsernameFilter","canSuggestInlineBots","insertMention","forceFocus","insertedHtml","isMentionTooltipOpen","closeMentionTooltip","mentionFilteredUsers","useAsyncRendering","dependencies","delay","shouldRenderRef","timeoutRef","forceUpdate","useForceUpdate","useOnChange","options","selected","disabled","loadingOptions","setValues","handleChange","newValues","v","option","subLabel","children","buttonClassName","tabIndex","buttonRef","secondaryIcon","destructive","onSecondaryIconClick","isTouched","markIsTouched","unmarkIsTouched","isContextMenuOpen","contextMenuPosition","handleBeforeContextMenu","handleContextMenu","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","getTriggerElement","getRootElement","closest","getMenuElement","positionX","positionY","menuStyle","useContextMenuPosition","handleMouseDown","role","autoClose","onDismiss","setIsOpen","timerRef","closeAndDismiss","handleMouseEnter","handleMouseLeave","onMouseEnter","onMouseLeave","RADIUSES","xl","square","circleRadius","STROKE_WIDTH","borderRadius","circumference","PI","svg","firstElementChild","strokeDashOffset","setAttribute","hidden","loadingOption","step","renderValue","trackWidth","parentContainerClassName","focused","autoFocusSearch","onReset","onFocus","onBlur","isInputFocused","markInputFocused","unmarkInputFocused","useInputFocusOnOpen","prevIsOpen","prevChildren","fromChildrenRef","noAnimation","onCheck","classNames","badgeCount","isBadgeActive","previousActiveTab","tabRef","tabEl","prevTabEl","platformEl","prevPlatformEl","shiftLeft","offsetLeft","scaleFactor","clientWidth","forceReflow","SCROLL_DURATION","tabs","activeTab","big","onSwitchTab","useHorizontalScroll","activeTabElement","childNodes","activeTabOffsetLeft","activeTabOffsetWidth","newLeft","fastSmoothScrollHorizontal","tab","CLEANED_UP","Symbol","renderCount","shouldRestoreHeight","shouldCleanup","cleanupExceptionKey","onStart","onStop","currentKeyRef","rendersRef","prevActiveKey","activeKeyChanged","cleanup","childElements","transition","isBackwards","prevActiveIndex","activeIndex","toSlide","fromSlide","ANIMATION_LEVEL_MIN","dispatchHeavyAnimationStop","dispatchHeavyAnimationEvent","waitForTransitionEnd","clientHeight","performSlideOptimized","node","HTMLElement","onAnimationEnd","activeElement","watchedNode","firstChild","waitForAnimationEnd","flexBasis","renders","contents","render","INCLUDED_CHAT_TYPES","EXCLUDED_CHAT_TYPES","INCLUDE_FILTER_FIELDS","EXCLUDE_FILTER_FIELDS","selectChatFilters","state","mode","selectTemp","selectedChatIds","selectedChatTypes","includedChatIds","includeFilters","pick","folder","excludedChatIds","excludeFilters","getSuggestedFolderName","filters","bots","groups","channels","contacts","nonContacts","INITIAL_STATE","chatFilter","foldersReducer","omit","error","useReducer","trackId","originalDuration","trackType","handlers","metadata","onInit","onForcePlay","onTrackChange","noPlaylist","noProgressUpdates","controllerRef","setIsPlaying","isPlayingSync","setPlayProgress","register","eventName","setVolume","setPlaybackRate","toggleMuted","proxy","registerMediaSession","mediaHandlers","requestNextTrack","requestPreviousTrack","stop","closeAudioPlayer","seekbackward","skipTime","seekOffset","currentTime","seekforward","seekTo","seekTime","nexttrack","previoustrack","makeMediaHandlers","setPlaybackState","audioPlayer","volume","playbackRate","setPositionState","isFinite","paused","updateMetadata","destroy","isSafariPatchInProgress","useEffectWithPrevDeps","prevShouldPlay","prevSrc","playIfPresent","setTime","time","audioProxy","Map","blurredRef","img","Image","imgToCanvas","fastBlur","toDataURL","blurredAsync","onload","blurredDataUri","clear","useBlur","noInitiallyBuffered","setIsBuffered","setBufferedProgress","setIsBufferedDebounced","handleBuffering","media","buffered","end","readyState","onLoadedData","onPlaying","onLoadStart","onPause","onTimeUpdate","onProgress","useCanvasBlur","withRaf","processBlur","alpha","IS_CANVAS_FILTER_SUPPORTED","drawImage","RADIUS","isInSearch","toggleChatPinned","toggleChatArchived","toggleChatUnread","actionAddToFolder","actionPin","compact","actionUnreadMark","actionMute","actionArchive","isChatArchived","actionDelete","getCanDeleteChat","isInFolder","stopImmediatePropagation","isMenuDisabled","shouldDisableOnLink","shouldDisableOnLongTap","setIsContextMenuOpen","setContextMenuPosition","clientY","body","timer","clearLongPressTimer","startLongPressTimer","contains","originalEvent","touches","cancelClickOnce","emulateContextMenuEvent","passive","EMPTY_RECT","anchor","getLayout","setPositionX","setPositionY","withScroll","setWithScroll","setStyle","setMenuStyle","triggerEl","menuEl","rootEl","extraPaddingX","extraTopPadding","marginSides","extraMarginTop","marginTop","menuRect","offsetHeight","rootRect","horizontalPosition","triggerRect","menuMaxHeight","useDebounce","ms","noFirst","noLast","replyOriginForId","loadMessage","loadMessageThrottled","throttled","handleScroll","deltaX","deltaY","useIntersectionObserver","rootRef","throttleMs","debounceMs","shouldSkipFirst","margin","threshold","rootCallback","rootCallbackRef","freezeFlagsRef","onUnfreezeRef","freeze","unfreeze","useHeavyAnimationCheck","observer","disconnect","callbacks","observe","targetCallback","entriesAccumulator","observerCallbackSync","entries","entry","callback","scheduler","observerCallback","IntersectionObserver","root","rootMargin","initController","controller","delete","unobserve","useOnIntersect","targetRef","setIsIntersecting","savedCallback","setInterval","clearInterval","debugKey","prevDeps","isMediaReady","store","mediaHash","noLoad","mediaFormat","cacheBuster","isHtmlAllowed","isStreaming","IS_PROGRESSIVE_SUPPORTED","idRef","generateIdFor","useUniqueId","setLoadProgress","startedAtRef","handleProgress","Date","spentTime","closeTimeout","useMouseInside","menuCloseTimeout","isMouseInside","markMouseInside","usePrevDuringAnimation","prev","isCurrentPresent","isPrevPresent","reducer","initialState","reducerRef","setState","currentState","SEND_MESSAGE_ACTION_INTERVAL","useStateRef","useVideoCleanup","videoRef","videoEl","load","mul_table","shg_table","boxBlurCanvasRGB","context","top_x","top_y","isNaN","imageData","getImageData","pixels","rsum","gsum","bsum","p","p1","p2","yp","yi","yw","wm","hm","rad1","r","g","mul_sum","shg_sum","vmin","vmax","putImageData","tracks","currentTrackId","voiceQueue","musicQueue","playNext","isReverseOrder","currentTrack","nextTrackId","findNextInQueue","openAudioPlayer","parseMessageKey","splitTrackId","messageKey","nextTrack","stopCurrentAudio","track","handleEvent","Proxy","createAudio","trackIdComparator","addTrackToQueue","dataset","preventPlayAfterPatch","preload","IS_SAFARI","patchSafariProgressiveAudio","globalSearch","currentContent","GlobalSearchContent","openedChatId","queueFilter","cleanUpQueue","fastSeek","muted","rate","shouldRemoveFromQueue","h","trackIdFilter","el","removeFromQueue","currentId","queue","getTrackQueue","chatAudio","getMessageKey","split","pop","one","two","dateOne","keyOne","dateTwo","keyTwo","localeCompare","getDistance","a","sqrt","pageX","pageY","getTouchCenter","lastClickTime","captureEvent","initialSwipeAxis","hasMoved","hasSwiped","initialDistance","initialTouchCenter","innerWidth","innerHeight","excludedClosestSelector","onMove","onDoubleClick","centerX","centerY","withCursor","querySelectorAll","scrollable","overflow","onZoom","endDistance","touchCenter","dragOffsetX","dragOffsetY","zoomFactor","initialCenterX","initialCenterY","currentCenterX","currentCenterY","shouldPreventScroll","xAbs","yAbs","axis","currentSwipeAxis","Left","Right","Up","Down","processSwipe","isNotPassive","propertyName","waitForEndEvent","animationName","eventType","detailedName","isHandled","handleAnimationEnd","TransitionEvent","AnimationEvent","cycleRestrict","isAnimating","fastSmoothScroll","maxDistance","FAST_SMOOTH_MAX_DISTANCE","forceDirection","forceDuration","forceNormalContainerHeight","scrollFrom","offsetTop","elementTop","scrollTop","FocusDirection","calculateScrollFrom","scrollWithJs","isAnimatingScroll","elementHeight","currentScrollTop","containerHeight","targetContainerHeight","normalHeight","path","remainingPath","absPath","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","shortTransition","longTransition","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","startAt","onHeavyAnimationStop","animateSingle","t","currentPath","getAttribute","containerWidth","animate","force","range","createRange","lastChild","nodeValue","selectNodeContents","collapse","toLowerCase","DEFAULT_HANDLERS","mediaSession","navigator","setMediaSessionHandlers","console","warn","setActionHandler","err","clearMediaSession","playbackState","buildMediaMetadata","artist","album","artwork","MediaMetadata","ENTITY_CLASS_BY_NODE_NAME","S","STRIKE","PRE","BLOCKQUOTE","parseMessageInput","fragment","parsedHtml","parseMarkdown","textIndex","recursionDeepness","addEntity","nodeName","entityType","getEntityTypeFromNode","rawIndex","getEntityDataFromNode","hasChildNodes","audioEl","patchedForSafari","patchForSafariInProgress"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/413.a34b7c2590a9b327dc23.js b/dist/413.a34b7c2590a9b327dc23.js new file mode 100644 index 000000000..d89394ec4 --- /dev/null +++ b/dist/413.a34b7c2590a9b327dc23.js @@ -0,0 +1,3 @@ +/*! For license information please see 413.a34b7c2590a9b327dc23.js.LICENSE.txt */ +(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[413],{8136:(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>w,CTR:()=>d,IGE:()=>v});var n=new Uint8Array(256),o=new Uint8Array(256),i=new Uint32Array(256),u=new Uint32Array(256),s=new Uint32Array(256),a=new Uint32Array(256),f=new Uint32Array(256),c=new Uint32Array(256),p=new Uint32Array(256),h=new Uint32Array(256);function l(t){if(t instanceof Uint32Array)return t;if("string"==typeof t){if(t.length%4!=0)for(var e=t.length%4;e<=4;e++)t+="\0x00";var r=new Uint32Array(t.length/4);for(e=0;e>7),v[g[b]^b]=b;for(;!n[d];d^=t||1)r=(r=w^w<<1^w<<2^w<<3^w<<4)>>8^255&r^99,n[d]=r,o[r]=d,y=16843009*g[e=g[t=g[d]]]^65537*e^257*t^16843008*d,l=257*g[r]^16843008*r,i[d]=l=l<<24^l>>>8,u[d]=l=l<<24^l>>>8,s[d]=l=l<<24^l>>>8,a[d]=l=l<<24^l>>>8,f[r]=y=y<<24^y>>>8,c[r]=y=y<<24^y>>>8,p[r]=y=y<<24^y>>>8,h[r]=y=y<<24^y>>>8,w=v[w]||1}();var g=function(){function t(t){var e=l(t);if(4!==e.length&&6!==e.length&&8!==e.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*e.length+28),this.decKey=new Uint32Array(4*e.length+28),this.encKey.set(e);for(var r,o=1,i=e.length;i<4*e.length+28;i++)r=this.encKey[i-1],(i%e.length==0||8===e.length&&i%e.length==4)&&(r=n[r>>>24]<<24^n[r>>16&255]<<16^n[r>>8&255]<<8^n[255&r],i%e.length==0&&(r=r<<8^r>>>24^o<<24,o=o<<1^283*(o>>7))),this.encKey[i]=this.encKey[i-e.length]^r;for(var u=0;i;u++,i--)r=this.encKey[3&u?i:i-4],this.decKey[u]=i<=4||u<4?r:f[n[r>>>24]]^c[n[r>>16&255]]^p[n[r>>8&255]]^h[n[255&r]]}return t.prototype.encrypt=function(t){for(var e,r,o,f=l(t),c=new Uint32Array(4),p=f[0]^this.encKey[0],h=f[1]^this.encKey[1],y=f[2]^this.encKey[2],g=f[3]^this.encKey[3],v=this.encKey.length/4-2,d=4,w=0;w>>24]^u[h>>16&255]^s[y>>8&255]^a[255&g]^this.encKey[d],r=i[h>>>24]^u[y>>16&255]^s[g>>8&255]^a[255&p]^this.encKey[d+1],o=i[y>>>24]^u[g>>16&255]^s[p>>8&255]^a[255&h]^this.encKey[d+2],g=i[g>>>24]^u[p>>16&255]^s[h>>8&255]^a[255&y]^this.encKey[d+3],p=e,h=r,y=o,d+=4;for(w=0;w<4;w++)c[w]=n[p>>>24]<<24^n[h>>16&255]<<16^n[y>>8&255]<<8^n[255&g]^this.encKey[d++],e=p,p=h,h=y,y=g,g=e;return c},t.prototype.decrypt=function(t){for(var e,r,n,i=l(t),u=new Uint32Array(4),s=i[0]^this.decKey[0],a=i[3]^this.decKey[1],y=i[2]^this.decKey[2],g=i[1]^this.decKey[3],v=this.decKey.length/4-2,d=4,w=0;w>>24]^c[a>>16&255]^p[y>>8&255]^h[255&g]^this.decKey[d],r=f[a>>>24]^c[y>>16&255]^p[g>>8&255]^h[255&s]^this.decKey[d+1],n=f[y>>>24]^c[g>>16&255]^p[s>>8&255]^h[255&a]^this.decKey[d+2],g=f[g>>>24]^c[s>>16&255]^p[a>>8&255]^h[255&y]^this.decKey[d+3],s=e,a=r,y=n,d+=4;for(w=0;w<4;w++)u[3&-w]=o[s>>>24]<<24^o[a>>16&255]<<16^o[y>>8&255]<<8^o[255&g]^this.decKey[d++],e=s,s=a,a=y,y=g,g=e;return u},t}(),v=function(){function t(t,e,r){void 0===r&&(r=16),this.key=l(t),this.iv=l(e),this.cipher=new g(t),this.blockSize=r/4}return t.prototype.encrypt=function(t,e){for(var r=l(t),n=e||new Uint32Array(r.length),o=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),u=new Uint32Array(this.blockSize),s=0;s=this.blockSize&&this.incrementCounter(),o&&(i-=o,o=0)}return this.offset=(this.offset+r.length%4)%4,n},t.prototype.decrypt=function(t,e){return this.encrypt(t,e)},t.prototype.incrementCounter=function(){for(var t=this.counter.length-1;t>=0&&!(++this.counter[t]<4294967295);t--);},t}();const w=g},5078:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(655),o=r(2403),i=function(){function t(t){this._semaphore=new o.default(1,t)}return t.prototype.acquire=function(){return n.__awaiter(this,void 0,void 0,(function(){return n.__generator(this,(function(t){switch(t.label){case 0:return[4,this._semaphore.acquire()];case 1:return[2,t.sent()[1]]}}))}))},t.prototype.runExclusive=function(t){return this._semaphore.runExclusive((function(){return t()}))},t.prototype.isLocked=function(){return this._semaphore.isLocked()},t.prototype.release=function(){this._semaphore.release()},t.prototype.cancel=function(){return this._semaphore.cancel()},t}();e.default=i},2403:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=r(655),o=r(1764),i=function(){function t(t,e){if(void 0===e&&(e=o.E_CANCELED),this._maxConcurrency=t,this._cancelError=e,this._queue=[],t<=0)throw new Error("semaphore must be initialized to a positive value");this._value=t}return t.prototype.acquire=function(){var t=this,e=this.isLocked(),r=new Promise((function(e,r){return t._queue.push({resolve:e,reject:r})}));return e||this._dispatch(),r},t.prototype.runExclusive=function(t){return n.__awaiter(this,void 0,void 0,(function(){var e,r,o;return n.__generator(this,(function(n){switch(n.label){case 0:return[4,this.acquire()];case 1:e=n.sent(),r=e[0],o=e[1],n.label=2;case 2:return n.trys.push([2,,4,5]),[4,t(r)];case 3:return[2,n.sent()];case 4:return o(),[7];case 5:return[2]}}))}))},t.prototype.isLocked=function(){return this._value<=0},t.prototype.release=function(){if(this._maxConcurrency>1)throw new Error("this method is unavailable on semaphores with concurrency > 1; use the scoped release returned by acquire instead");if(this._currentReleaser){var t=this._currentReleaser;this._currentReleaser=void 0,t()}},t.prototype.cancel=function(){var t=this;this._queue.forEach((function(e){return e.reject(t._cancelError)})),this._queue=[]},t.prototype._dispatch=function(){var t=this,e=this._queue.shift();if(e){var r=!1;this._currentReleaser=function(){r||(r=!0,t._value++,t._dispatch())},e.resolve([this._value--,this._currentReleaser])}},t}();e.default=i},1764:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.E_CANCELED=e.E_ALREADY_LOCKED=e.E_TIMEOUT=void 0,e.E_TIMEOUT=new Error("timeout while waiting for mutex to become available"),e.E_ALREADY_LOCKED=new Error("mutex already locked"),e.E_CANCELED=new Error("request for lock canceled")},8125:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.tryAcquire=e.withTimeout=e.Semaphore=e.Mutex=void 0;var n=r(655),o=r(5078);Object.defineProperty(e,"Mutex",{enumerable:!0,get:function(){return o.default}});var i=r(2403);Object.defineProperty(e,"Semaphore",{enumerable:!0,get:function(){return i.default}});var u=r(1960);Object.defineProperty(e,"withTimeout",{enumerable:!0,get:function(){return u.withTimeout}});var s=r(3143);Object.defineProperty(e,"tryAcquire",{enumerable:!0,get:function(){return s.tryAcquire}}),n.__exportStar(r(1764),e)},3143:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.tryAcquire=void 0;var n=r(1764),o=r(1960);e.tryAcquire=function(t,e){return void 0===e&&(e=n.E_ALREADY_LOCKED),o.withTimeout(t,0,e)}},1960:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.withTimeout=void 0;var n=r(655),o=r(1764);e.withTimeout=function(t,e,r){var i=this;return void 0===r&&(r=o.E_TIMEOUT),{acquire:function(){return new Promise((function(o,u){return n.__awaiter(i,void 0,void 0,(function(){var i,s,a,f;return n.__generator(this,(function(n){switch(n.label){case 0:i=!1,s=setTimeout((function(){i=!0,u(r)}),e),n.label=1;case 1:return n.trys.push([1,3,,4]),[4,t.acquire()];case 2:return a=n.sent(),i?(Array.isArray(a)?a[1]:a)():(clearTimeout(s),o(a)),[3,4];case 3:return f=n.sent(),i||(clearTimeout(s),u(f)),[3,4];case 4:return[2]}}))}))}))},runExclusive:function(t){return n.__awaiter(this,void 0,void 0,(function(){var e,r;return n.__generator(this,(function(n){switch(n.label){case 0:e=function(){},n.label=1;case 1:return n.trys.push([1,,7,8]),[4,this.acquire()];case 2:return r=n.sent(),Array.isArray(r)?(e=r[1],[4,t(r[0])]):[3,4];case 3:return[2,n.sent()];case 4:return e=r,[4,t()];case 5:return[2,n.sent()];case 6:return[3,8];case 7:return e(),[7];case 8:return[2]}}))}))},release:function(){t.release()},cancel:function(){return t.cancel()},isLocked:function(){return t.isLocked()}}}},9742:(t,e)=>{"use strict";e.byteLength=function(t){var e=a(t),r=e[0],n=e[1];return 3*(r+n)/4-n},e.toByteArray=function(t){var e,r,i=a(t),u=i[0],s=i[1],f=new o(function(t,e,r){return 3*(e+r)/4-r}(0,u,s)),c=0,p=s>0?u-4:u;for(r=0;r>16&255,f[c++]=e>>8&255,f[c++]=255&e;return 2===s&&(e=n[t.charCodeAt(r)]<<2|n[t.charCodeAt(r+1)]>>4,f[c++]=255&e),1===s&&(e=n[t.charCodeAt(r)]<<10|n[t.charCodeAt(r+1)]<<4|n[t.charCodeAt(r+2)]>>2,f[c++]=e>>8&255,f[c++]=255&e),f},e.fromByteArray=function(t){for(var e,n=t.length,o=n%3,i=[],u=16383,s=0,a=n-o;sa?a:s+u));return 1===o?(e=t[n-1],i.push(r[e>>2]+r[e<<4&63]+"==")):2===o&&(e=(t[n-2]<<8)+t[n-1],i.push(r[e>>10]+r[e>>4&63]+r[e<<2&63]+"=")),i.join("")};for(var r=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",u=0,s=i.length;u0)throw new Error("Invalid string. Length must be a multiple of 4");var r=t.indexOf("=");return-1===r&&(r=e),[r,r===e?0:4-r%4]}function f(t,e,n){for(var o,i,u=[],s=e;s>18&63]+r[i>>12&63]+r[i>>6&63]+r[63&i]);return u.join("")}n["-".charCodeAt(0)]=62,n["_".charCodeAt(0)]=63},4736:(t,e,r)=>{var n;t=r.nmd(t);var o=function(t){"use strict";var e=1e7,r=9007199254740992,n=h(r),i="0123456789abcdefghijklmnopqrstuvwxyz",u="function"==typeof BigInt;function s(t,e,r,n){return void 0===t?s[0]:void 0===e||10==+e&&!r?V(t):Z(t,e,r,n)}function a(t,e){this.value=t,this.sign=e,this.isSmall=!1}function f(t){this.value=t,this.sign=t<0,this.isSmall=!0}function c(t){this.value=t}function p(t){return-r0?Math.floor(t):Math.ceil(t)}function d(t,r){var n,o,i=t.length,u=r.length,s=new Array(i),a=0,f=e;for(o=0;o=f?1:0,s[o]=n-a*f;for(;o0&&s.push(a),s}function w(t,e){return t.length>=e.length?d(t,e):d(e,t)}function b(t,r){var n,o,i=t.length,u=new Array(i),s=e;for(o=0;o0;)u[o++]=r%s,r=Math.floor(r/s);return u}function m(t,r){var n,o,i=t.length,u=r.length,s=new Array(i),a=0,f=e;for(n=0;n0;)u[o++]=a%s,a=Math.floor(a/s);return u}function B(t,e){for(var r=[];e-- >0;)r.push(0);return r.concat(t)}function S(t,e){var r=Math.max(t.length,e.length);if(r<=30)return _(t,e);r=Math.ceil(r/2);var n=t.slice(r),o=t.slice(0,r),i=e.slice(r),u=e.slice(0,r),s=S(o,u),a=S(n,i),f=S(w(o,n),w(u,i)),c=w(w(s,B(m(m(f,s),a),r)),B(a,2*r));return y(c),c}function O(t,r,n){return new a(t=0;--r)o=(i=1e7*o+t[r])-(n=v(i/e))*e,s[r]=0|n;return[s,0|o]}function P(t,r){var n,o=V(r);if(u)return[new c(t.value/o.value),new c(t.value%o.value)];var i,p=t.value,d=o.value;if(0===d)throw new Error("Cannot divide by zero");if(t.isSmall)return o.isSmall?[new f(v(p/d)),new f(p%d)]:[s[0],t];if(o.isSmall){if(1===d)return[t,s[0]];if(-1==d)return[t.negate(),s[0]];var w=Math.abs(d);if(w=0;o--){for(n=h-1,w[o+p]!==v&&(n=Math.floor((w[o+p]*h+w[o+p-1])/v)),i=0,u=0,a=b.length,s=0;sf&&(i=(i+1)*h),n=Math.ceil(i/u);do{if(T(s=A(r,n),p)<=0)break;n--}while(n);c.push(n),p=m(p,s)}return c.reverse(),[l(c),l(p)]}(p,d))[0];var _=t.sign!==o.sign,B=n[1],S=t.sign;return"number"==typeof i?(_&&(i=-i),i=new f(i)):i=new a(i,_),"number"==typeof B?(S&&(B=-B),B=new f(B)):B=new a(B,S),[i,B]}function T(t,e){if(t.length!==e.length)return t.length>e.length?1:-1;for(var r=t.length-1;r>=0;r--)if(t[r]!==e[r])return t[r]>e[r]?1:-1;return 0}function M(t){var e=t.abs();return!e.isUnit()&&(!!(e.equals(2)||e.equals(3)||e.equals(5))||!(e.isEven()||e.isDivisibleBy(3)||e.isDivisibleBy(5))&&(!!e.lesser(49)||void 0))}function x(t,e){for(var r,n,i,u=t.prev(),s=u,a=0;s.isEven();)s=s.divide(2),a++;t:for(n=0;n=0?n=m(t,e):(n=m(e,t),r=!r),"number"==typeof(n=l(n))?(r&&(n=-n),new f(n)):new a(n,r)}(r,n,this.sign)},a.prototype.minus=a.prototype.subtract,f.prototype.subtract=function(t){var e=V(t),r=this.value;if(r<0!==e.sign)return this.add(e.negate());var n=e.value;return e.isSmall?new f(r-n):E(n,Math.abs(r),r>=0)},f.prototype.minus=f.prototype.subtract,c.prototype.subtract=function(t){return new c(this.value-V(t).value)},c.prototype.minus=c.prototype.subtract,a.prototype.negate=function(){return new a(this.value,!this.sign)},f.prototype.negate=function(){var t=this.sign,e=new f(-this.value);return e.sign=!t,e},c.prototype.negate=function(){return new c(-this.value)},a.prototype.abs=function(){return new a(this.value,!1)},f.prototype.abs=function(){return new f(Math.abs(this.value))},c.prototype.abs=function(){return new c(this.value>=0?this.value:-this.value)},a.prototype.multiply=function(t){var r,n,o,i=V(t),u=this.value,f=i.value,c=this.sign!==i.sign;if(i.isSmall){if(0===f)return s[0];if(1===f)return this;if(-1===f)return this.negate();if((r=Math.abs(f))0?S(u,f):_(u,f),c)},a.prototype.times=a.prototype.multiply,f.prototype._multiplyBySmall=function(t){return p(t.value*this.value)?new f(t.value*this.value):O(Math.abs(t.value),h(Math.abs(this.value)),this.sign!==t.sign)},a.prototype._multiplyBySmall=function(t){return 0===t.value?s[0]:1===t.value?this:-1===t.value?this.negate():O(Math.abs(t.value),this.value,this.sign!==t.sign)},f.prototype.multiply=function(t){return V(t)._multiplyBySmall(this)},f.prototype.times=f.prototype.multiply,c.prototype.multiply=function(t){return new c(this.value*V(t).value)},c.prototype.times=c.prototype.multiply,a.prototype.square=function(){return new a(I(this.value),!1)},f.prototype.square=function(){var t=this.value*this.value;return p(t)?new f(t):new a(I(h(Math.abs(this.value))),!1)},c.prototype.square=function(t){return new c(this.value*this.value)},a.prototype.divmod=function(t){var e=P(this,t);return{quotient:e[0],remainder:e[1]}},c.prototype.divmod=f.prototype.divmod=a.prototype.divmod,a.prototype.divide=function(t){return P(this,t)[0]},c.prototype.over=c.prototype.divide=function(t){return new c(this.value/V(t).value)},f.prototype.over=f.prototype.divide=a.prototype.over=a.prototype.divide,a.prototype.mod=function(t){return P(this,t)[1]},c.prototype.mod=c.prototype.remainder=function(t){return new c(this.value%V(t).value)},f.prototype.remainder=f.prototype.mod=a.prototype.remainder=a.prototype.mod,a.prototype.pow=function(t){var e,r,n,o=V(t),i=this.value,u=o.value;if(0===u)return s[1];if(0===i)return s[0];if(1===i)return s[1];if(-1===i)return o.isEven()?s[1]:s[-1];if(o.sign)return s[0];if(!o.isSmall)throw new Error("The exponent "+o.toString()+" is too large.");if(this.isSmall&&p(e=Math.pow(i,u)))return new f(v(e));for(r=this,n=s[1];!0&u&&(n=n.times(r),--u),0!==u;)u/=2,r=r.square();return n},f.prototype.pow=a.prototype.pow,c.prototype.pow=function(t){var e=V(t),r=this.value,n=e.value,o=BigInt(0),i=BigInt(1),u=BigInt(2);if(n===o)return s[1];if(r===o)return s[0];if(r===i)return s[1];if(r===BigInt(-1))return e.isEven()?s[1]:s[-1];if(e.isNegative())return new c(o);for(var a=this,f=s[1];(n&i)===i&&(f=f.times(a),--n),n!==o;)n/=u,a=a.square();return f},a.prototype.modPow=function(t,e){if(t=V(t),(e=V(e)).isZero())throw new Error("Cannot take modPow with modulus 0");var r=s[1],n=this.mod(e);for(t.isNegative()&&(t=t.multiply(s[-1]),n=n.modInv(e));t.isPositive();){if(n.isZero())return s[0];t.isOdd()&&(r=r.multiply(n).mod(e)),t=t.divide(2),n=n.square().mod(e)}return r},c.prototype.modPow=f.prototype.modPow=a.prototype.modPow,a.prototype.compareAbs=function(t){var e=V(t),r=this.value,n=e.value;return e.isSmall?1:T(r,n)},f.prototype.compareAbs=function(t){var e=V(t),r=Math.abs(this.value),n=e.value;return e.isSmall?r===(n=Math.abs(n))?0:r>n?1:-1:-1},c.prototype.compareAbs=function(t){var e=this.value,r=V(t).value;return(e=e>=0?e:-e)===(r=r>=0?r:-r)?0:e>r?1:-1},a.prototype.compare=function(t){if(t===1/0)return-1;if(t===-1/0)return 1;var e=V(t),r=this.value,n=e.value;return this.sign!==e.sign?e.sign?1:-1:e.isSmall?this.sign?-1:1:T(r,n)*(this.sign?-1:1)},a.prototype.compareTo=a.prototype.compare,f.prototype.compare=function(t){if(t===1/0)return-1;if(t===-1/0)return 1;var e=V(t),r=this.value,n=e.value;return e.isSmall?r==n?0:r>n?1:-1:r<0!==e.sign?r<0?-1:1:r<0?1:-1},f.prototype.compareTo=f.prototype.compare,c.prototype.compare=function(t){if(t===1/0)return-1;if(t===-1/0)return 1;var e=this.value,r=V(t).value;return e===r?0:e>r?1:-1},c.prototype.compareTo=c.prototype.compare,a.prototype.equals=function(t){return 0===this.compare(t)},c.prototype.eq=c.prototype.equals=f.prototype.eq=f.prototype.equals=a.prototype.eq=a.prototype.equals,a.prototype.notEquals=function(t){return 0!==this.compare(t)},c.prototype.neq=c.prototype.notEquals=f.prototype.neq=f.prototype.notEquals=a.prototype.neq=a.prototype.notEquals,a.prototype.greater=function(t){return this.compare(t)>0},c.prototype.gt=c.prototype.greater=f.prototype.gt=f.prototype.greater=a.prototype.gt=a.prototype.greater,a.prototype.lesser=function(t){return this.compare(t)<0},c.prototype.lt=c.prototype.lesser=f.prototype.lt=f.prototype.lesser=a.prototype.lt=a.prototype.lesser,a.prototype.greaterOrEquals=function(t){return this.compare(t)>=0},c.prototype.geq=c.prototype.greaterOrEquals=f.prototype.geq=f.prototype.greaterOrEquals=a.prototype.geq=a.prototype.greaterOrEquals,a.prototype.lesserOrEquals=function(t){return this.compare(t)<=0},c.prototype.leq=c.prototype.lesserOrEquals=f.prototype.leq=f.prototype.lesserOrEquals=a.prototype.leq=a.prototype.lesserOrEquals,a.prototype.isEven=function(){return 0==(1&this.value[0])},f.prototype.isEven=function(){return 0==(1&this.value)},c.prototype.isEven=function(){return(this.value&BigInt(1))===BigInt(0)},a.prototype.isOdd=function(){return 1==(1&this.value[0])},f.prototype.isOdd=function(){return 1==(1&this.value)},c.prototype.isOdd=function(){return(this.value&BigInt(1))===BigInt(1)},a.prototype.isPositive=function(){return!this.sign},f.prototype.isPositive=function(){return this.value>0},c.prototype.isPositive=f.prototype.isPositive,a.prototype.isNegative=function(){return this.sign},f.prototype.isNegative=function(){return this.value<0},c.prototype.isNegative=f.prototype.isNegative,a.prototype.isUnit=function(){return!1},f.prototype.isUnit=function(){return 1===Math.abs(this.value)},c.prototype.isUnit=function(){return this.abs().value===BigInt(1)},a.prototype.isZero=function(){return!1},f.prototype.isZero=function(){return 0===this.value},c.prototype.isZero=function(){return this.value===BigInt(0)},a.prototype.isDivisibleBy=function(t){var e=V(t);return!e.isZero()&&(!!e.isUnit()||(0===e.compareAbs(2)?this.isEven():this.mod(e).isZero()))},c.prototype.isDivisibleBy=f.prototype.isDivisibleBy=a.prototype.isDivisibleBy,a.prototype.isPrime=function(e){var r=M(this);if(r!==t)return r;var n=this.abs(),i=n.bitLength();if(i<=64)return x(n,[2,3,5,7,11,13,17,19,23,29,31,37]);for(var u=Math.log(2)*i.toJSNumber(),s=Math.ceil(!0===e?2*Math.pow(u,2):u),a=[],f=0;f-r?new f(t-1):new a(n,!0)},c.prototype.prev=function(){return new c(this.value-BigInt(1))};for(var R=[1];2*R[R.length-1]<=e;)R.push(2*R[R.length-1]);var L=R.length,N=R[L-1];function j(t){return Math.abs(t)<=e}function C(t,e,r){e=V(e);for(var n=t.isNegative(),i=e.isNegative(),u=n?t.not():t,s=i?e.not():e,a=0,f=0,c=null,p=null,h=[];!u.isZero()||!s.isZero();)a=(c=P(u,N))[1].toJSNumber(),n&&(a=N-1-a),f=(p=P(s,N))[1].toJSNumber(),i&&(f=N-1-f),u=c[0],s=p[0],h.push(r(a,f));for(var l=0!==r(n?1:0,i?1:0)?o(-1):o(0),y=h.length-1;y>=0;y-=1)l=l.multiply(N).add(o(h[y]));return l}a.prototype.shiftLeft=function(t){var e=V(t).toJSNumber();if(!j(e))throw new Error(String(e)+" is too large for shifting.");if(e<0)return this.shiftRight(-e);var r=this;if(r.isZero())return r;for(;e>=L;)r=r.multiply(N),e-=L-1;return r.multiply(R[e])},c.prototype.shiftLeft=function(t){return t=V(t),new c(this.value<=L;){if(n.isZero()||n.isNegative()&&n.isUnit())return n;n=(e=P(n,N))[1].isNegative()?e[0].prev():e[0],r-=L-1}return(e=P(n,R[r]))[1].isNegative()?e[0].prev():e[0]},c.prototype.shiftRight=function(t){return t=V(t),new c(this.value>>t.value)},f.prototype.shiftRight=a.prototype.shiftRight,a.prototype.not=function(){return this.negate().prev()},c.prototype.not=f.prototype.not=a.prototype.not,a.prototype.and=function(t){return C(this,t,(function(t,e){return t&e}))},c.prototype.and=f.prototype.and=a.prototype.and,a.prototype.or=function(t){return C(this,t,(function(t,e){return t|e}))},c.prototype.or=f.prototype.or=a.prototype.or,a.prototype.xor=function(t){return C(this,t,(function(t,e){return t^e}))},c.prototype.xor=f.prototype.xor=a.prototype.xor;var q=1<<30;function k(t){var r=t.value,n="number"==typeof r?r|q:"bigint"==typeof r?r|BigInt(q):r[0]+r[1]*e|1073758208;return n&-n}function D(t,e){if(e.compareTo(t)<=0){var r=D(t,e.square(e)),n=r.p,i=r.e,u=n.multiply(e);return u.compareTo(t)<=0?{p:u,e:2*i+1}:{p:n,e:2*i}}return{p:o(1),e:0}}function z(t,e){return t=V(t),e=V(e),t.greater(e)?t:e}function K(t,e){return t=V(t),e=V(e),t.lesser(e)?t:e}function $(t,e){if(t=V(t).abs(),e=V(e).abs(),t.equals(e))return t;if(t.isZero())return e;if(e.isZero())return t;for(var r,n,o=s[1];t.isEven()&&e.isEven();)r=K(k(t),k(e)),t=t.divide(r),e=e.divide(r),o=o.multiply(r);for(;t.isEven();)t=t.divide(k(t));do{for(;e.isEven();)e=e.divide(k(e));t.greater(e)&&(n=e,e=t,t=n),e=e.subtract(t)}while(!e.isZero());return o.isUnit()?t:t.multiply(o)}a.prototype.bitLength=function(){var t=this;return t.compareTo(o(0))<0&&(t=t.negate().subtract(o(1))),0===t.compareTo(o(0))?o(0):o(D(t,o(2)).e).add(o(1))},c.prototype.bitLength=f.prototype.bitLength=a.prototype.bitLength;var Z=function(t,e,r,n){r=r||i,t=String(t),n||(t=t.toLowerCase(),r=r.toLowerCase());var o,u=t.length,s=Math.abs(e),a={};for(o=0;o=s){if("1"===p&&1===s)continue;throw new Error(p+" is not a valid digit in base "+e+".")}e=V(e);var f=[],c="-"===t[0];for(o=c?1:0;o"!==t[o]&&o=0;n--)o=o.add(t[n].times(i)),i=i.times(e);return r?o.negate():o}function J(t,e){if((e=o(e)).isZero()){if(t.isZero())return{value:[0],isNegative:!1};throw new Error("Cannot convert nonzero numbers to base 0.")}if(e.equals(-1)){if(t.isZero())return{value:[0],isNegative:!1};if(t.isNegative())return{value:[].concat.apply([],Array.apply(null,Array(-t.toJSNumber())).map(Array.prototype.valueOf,[1,0])),isNegative:!1};var r=Array.apply(null,Array(t.toJSNumber()-1)).map(Array.prototype.valueOf,[0,1]);return r.unshift([1]),{value:[].concat.apply([],r),isNegative:!1}}var n=!1;if(t.isNegative()&&e.isPositive()&&(n=!0,t=t.abs()),e.isUnit())return t.isZero()?{value:[0],isNegative:!1}:{value:Array.apply(null,Array(t.toJSNumber())).map(Number.prototype.valueOf,1),isNegative:n};for(var i,u=[],s=t;s.isNegative()||s.compareAbs(e)>=0;){i=s.divmod(e),s=i.quotient;var a=i.remainder;a.isNegative()&&(a=e.minus(a).abs(),s=s.next()),u.push(a.toJSNumber())}return u.push(s.toJSNumber()),{value:u.reverse(),isNegative:n}}function G(t,e,r){var n=J(t,e);return(n.isNegative?"-":"")+n.value.map((function(t){return function(t,e){return t<(e=e||i).length?e[t]:"<"+t+">"}(t,r)})).join("")}function Y(t){if(p(+t)){var e=+t;if(e===v(e))return u?new c(BigInt(e)):new f(e);throw new Error("Invalid integer: "+t)}var r="-"===t[0];r&&(t=t.slice(1));var n=t.split(/e/i);if(n.length>2)throw new Error("Invalid integer: "+n.join("e"));if(2===n.length){var o=n[1];if("+"===o[0]&&(o=o.slice(1)),(o=+o)!==v(o)||!p(o))throw new Error("Invalid integer: "+o+" is not a valid exponent.");var i=n[0],s=i.indexOf(".");if(s>=0&&(o-=i.length-s-1,i=i.slice(0,s)+i.slice(s+1)),o<0)throw new Error("Cannot include negative exponent part for integers");t=i+=new Array(o+1).join("0")}if(!/^([0-9][0-9]*)$/.test(t))throw new Error("Invalid integer: "+t);if(u)return new c(BigInt(r?"-"+t:t));for(var h=[],l=t.length,g=l-7;l>0;)h.push(+t.slice(g,l)),(g-=7)<0&&(g=0),l-=7;return y(h),new a(h,r)}function V(t){return"number"==typeof t?function(t){if(u)return new c(BigInt(t));if(p(t)){if(t!==v(t))throw new Error(t+" is not an integer.");return new f(t)}return Y(t.toString())}(t):"string"==typeof t?Y(t):"bigint"==typeof t?new c(t):t}a.prototype.toArray=function(t){return J(this,t)},f.prototype.toArray=function(t){return J(this,t)},c.prototype.toArray=function(t){return J(this,t)},a.prototype.toString=function(e,r){if(e===t&&(e=10),10!==e)return G(this,e,r);for(var n,o=this.value,i=o.length,u=String(o[--i]);--i>=0;)n=String(o[i]),u+="0000000".slice(n.length)+n;return(this.sign?"-":"")+u},f.prototype.toString=function(e,r){return e===t&&(e=10),10!=e?G(this,e,r):String(this.value)},c.prototype.toString=f.prototype.toString,c.prototype.toJSON=a.prototype.toJSON=f.prototype.toJSON=function(){return this.toString()},a.prototype.valueOf=function(){return parseInt(this.toString(),10)},a.prototype.toJSNumber=a.prototype.valueOf,f.prototype.valueOf=function(){return this.value},f.prototype.toJSNumber=f.prototype.valueOf,c.prototype.valueOf=c.prototype.toJSNumber=function(){return parseInt(this.toString(),10)};for(var W=0;W<1e3;W++)s[W]=V(W),W>0&&(s[-W]=V(-W));return s.one=s[1],s.zero=s[0],s.minusOne=s[-1],s.max=z,s.min=K,s.gcd=$,s.lcm=function(t,e){return t=V(t).abs(),e=V(e).abs(),t.divide($(t,e)).multiply(e)},s.isInstance=function(t){return t instanceof a||t instanceof f||t instanceof c},s.randBetween=function(t,r,n){t=V(t),r=V(r);var o=n||Math.random,i=K(t,r),u=z(t,r).subtract(i).add(1);if(u.isSmall)return i.add(Math.floor(o()*u));for(var a=J(u,e).value,f=[],c=!0,p=0;p{"use strict";const n=r(9742),o=r(645),i="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;e.Buffer=a,e.SlowBuffer=function(t){return+t!=t&&(t=0),a.alloc(+t)},e.INSPECT_MAX_BYTES=50;const u=2147483647;function s(t){if(t>u)throw new RangeError('The value "'+t+'" is invalid for option "size"');const e=new Uint8Array(t);return Object.setPrototypeOf(e,a.prototype),e}function a(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new TypeError('The "string" argument must be of type string. Received type number');return p(t)}return f(t,e,r)}function f(t,e,r){if("string"==typeof t)return function(t,e){if("string"==typeof e&&""!==e||(e="utf8"),!a.isEncoding(e))throw new TypeError("Unknown encoding: "+e);const r=0|g(t,e);let n=s(r);const o=n.write(t,e);return o!==r&&(n=n.slice(0,o)),n}(t,e);if(ArrayBuffer.isView(t))return function(t){if(V(t,Uint8Array)){const e=new Uint8Array(t);return l(e.buffer,e.byteOffset,e.byteLength)}return h(t)}(t);if(null==t)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t);if(V(t,ArrayBuffer)||t&&V(t.buffer,ArrayBuffer))return l(t,e,r);if("undefined"!=typeof SharedArrayBuffer&&(V(t,SharedArrayBuffer)||t&&V(t.buffer,SharedArrayBuffer)))return l(t,e,r);if("number"==typeof t)throw new TypeError('The "value" argument must not be of type number. Received type number');const n=t.valueOf&&t.valueOf();if(null!=n&&n!==t)return a.from(n,e,r);const o=function(t){if(a.isBuffer(t)){const e=0|y(t.length),r=s(e);return 0===r.length||t.copy(r,0,0,e),r}return void 0!==t.length?"number"!=typeof t.length||W(t.length)?s(0):h(t):"Buffer"===t.type&&Array.isArray(t.data)?h(t.data):void 0}(t);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof t[Symbol.toPrimitive])return a.from(t[Symbol.toPrimitive]("string"),e,r);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof t)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('The value "'+t+'" is invalid for option "size"')}function p(t){return c(t),s(t<0?0:0|y(t))}function h(t){const e=t.length<0?0:0|y(t.length),r=s(e);for(let n=0;n=u)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+u.toString(16)+" bytes");return 0|t}function g(t,e){if(a.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||V(t,ArrayBuffer))return t.byteLength;if("string"!=typeof t)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof t);const r=t.length,n=arguments.length>2&&!0===arguments[2];if(!n&&0===r)return 0;let o=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":return J(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return G(t).length;default:if(o)return n?-1:J(t).length;e=(""+e).toLowerCase(),o=!0}}function v(t,e,r){let n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return T(this,e,r);case"utf8":case"utf-8":return O(this,e,r);case"ascii":return U(this,e,r);case"latin1":case"binary":return P(this,e,r);case"base64":return S(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return M(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function d(t,e,r){const n=t[e];t[e]=t[r],t[r]=n}function w(t,e,r,n,o){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),W(r=+r)&&(r=o?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(o)return-1;r=t.length-1}else if(r<0){if(!o)return-1;r=0}if("string"==typeof e&&(e=a.from(e,n)),a.isBuffer(e))return 0===e.length?-1:b(t,e,r,n,o);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):b(t,[e],r,n,o);throw new TypeError("val must be string, number or Buffer")}function b(t,e,r,n,o){let i,u=1,s=t.length,a=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;u=2,s/=2,a/=2,r/=2}function f(t,e){return 1===u?t[e]:t.readUInt16BE(e*u)}if(o){let n=-1;for(i=r;is&&(r=s-a),i=r;i>=0;i--){let r=!0;for(let n=0;no&&(n=o):n=o;const i=e.length;let u;for(n>i/2&&(n=i/2),u=0;u>8,o=r%256,i.push(o),i.push(n);return i}(e,t.length-r),t,r,n)}function S(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function O(t,e,r){r=Math.min(t.length,r);const n=[];let o=e;for(;o239?4:e>223?3:e>191?2:1;if(o+u<=r){let r,n,s,a;switch(u){case 1:e<128&&(i=e);break;case 2:r=t[o+1],128==(192&r)&&(a=(31&e)<<6|63&r,a>127&&(i=a));break;case 3:r=t[o+1],n=t[o+2],128==(192&r)&&128==(192&n)&&(a=(15&e)<<12|(63&r)<<6|63&n,a>2047&&(a<55296||a>57343)&&(i=a));break;case 4:r=t[o+1],n=t[o+2],s=t[o+3],128==(192&r)&&128==(192&n)&&128==(192&s)&&(a=(15&e)<<18|(63&r)<<12|(63&n)<<6|63&s,a>65535&&a<1114112&&(i=a))}}null===i?(i=65533,u=1):i>65535&&(i-=65536,n.push(i>>>10&1023|55296),i=56320|1023&i),n.push(i),o+=u}return function(t){const e=t.length;if(e<=I)return String.fromCharCode.apply(String,t);let r="",n=0;for(;nn.length?(a.isBuffer(e)||(e=a.from(e)),e.copy(n,o)):Uint8Array.prototype.set.call(n,e,o);else{if(!a.isBuffer(e))throw new TypeError('"list" argument must be an Array of Buffers');e.copy(n,o)}o+=e.length}return n},a.byteLength=g,a.prototype._isBuffer=!0,a.prototype.swap16=function(){const t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;er&&(t+=" ... "),""},i&&(a.prototype[i]=a.prototype.inspect),a.prototype.compare=function(t,e,r,n,o){if(V(t,Uint8Array)&&(t=a.from(t,t.offset,t.byteLength)),!a.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),e<0||r>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&e>=r)return 0;if(n>=o)return-1;if(e>=r)return 1;if(this===t)return 0;let i=(o>>>=0)-(n>>>=0),u=(r>>>=0)-(e>>>=0);const s=Math.min(i,u),f=this.slice(n,o),c=t.slice(e,r);for(let t=0;t>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}const o=this.length-e;if((void 0===r||r>o)&&(r=o),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");let i=!1;for(;;)switch(n){case"hex":return m(this,t,e,r);case"utf8":case"utf-8":return E(this,t,e,r);case"ascii":case"latin1":case"binary":return _(this,t,e,r);case"base64":return A(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return B(this,t,e,r);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},a.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const I=4096;function U(t,e,r){let n="";r=Math.min(t.length,r);for(let o=e;on)&&(r=n);let o="";for(let n=e;nr)throw new RangeError("Trying to access beyond buffer length")}function R(t,e,r,n,o,i){if(!a.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>o||et.length)throw new RangeError("Index out of range")}function L(t,e,r,n,o){K(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r++]=i,i>>=8,t[r++]=i,i>>=8,t[r++]=i,i>>=8,t[r++]=i;let u=Number(e>>BigInt(32)&BigInt(4294967295));return t[r++]=u,u>>=8,t[r++]=u,u>>=8,t[r++]=u,u>>=8,t[r++]=u,r}function N(t,e,r,n,o){K(e,n,o,t,r,7);let i=Number(e&BigInt(4294967295));t[r+7]=i,i>>=8,t[r+6]=i,i>>=8,t[r+5]=i,i>>=8,t[r+4]=i;let u=Number(e>>BigInt(32)&BigInt(4294967295));return t[r+3]=u,u>>=8,t[r+2]=u,u>>=8,t[r+1]=u,u>>=8,t[r]=u,r+8}function j(t,e,r,n,o,i){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function C(t,e,r,n,i){return e=+e,r>>>=0,i||j(t,0,r,4),o.write(t,e,r,n,23,4),r+4}function q(t,e,r,n,i){return e=+e,r>>>=0,i||j(t,0,r,8),o.write(t,e,r,n,52,8),r+8}a.prototype.slice=function(t,e){const r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e>>=0,e>>>=0,r||x(t,e,this.length);let n=this[t],o=1,i=0;for(;++i>>=0,e>>>=0,r||x(t,e,this.length);let n=this[t+--e],o=1;for(;e>0&&(o*=256);)n+=this[t+--e]*o;return n},a.prototype.readUint8=a.prototype.readUInt8=function(t,e){return t>>>=0,e||x(t,1,this.length),this[t]},a.prototype.readUint16LE=a.prototype.readUInt16LE=function(t,e){return t>>>=0,e||x(t,2,this.length),this[t]|this[t+1]<<8},a.prototype.readUint16BE=a.prototype.readUInt16BE=function(t,e){return t>>>=0,e||x(t,2,this.length),this[t]<<8|this[t+1]},a.prototype.readUint32LE=a.prototype.readUInt32LE=function(t,e){return t>>>=0,e||x(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},a.prototype.readUint32BE=a.prototype.readUInt32BE=function(t,e){return t>>>=0,e||x(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},a.prototype.readBigUInt64LE=H((function(t){$(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Z(t,this.length-8);const n=e+256*this[++t]+65536*this[++t]+this[++t]*2**24,o=this[++t]+256*this[++t]+65536*this[++t]+r*2**24;return BigInt(n)+(BigInt(o)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Z(t,this.length-8);const n=e*2**24+65536*this[++t]+256*this[++t]+this[++t],o=this[++t]*2**24+65536*this[++t]+256*this[++t]+r;return(BigInt(n)<>>=0,e>>>=0,r||x(t,e,this.length);let n=this[t],o=1,i=0;for(;++i=o&&(n-=Math.pow(2,8*e)),n},a.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||x(t,e,this.length);let n=e,o=1,i=this[t+--n];for(;n>0&&(o*=256);)i+=this[t+--n]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*e)),i},a.prototype.readInt8=function(t,e){return t>>>=0,e||x(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},a.prototype.readInt16LE=function(t,e){t>>>=0,e||x(t,2,this.length);const r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},a.prototype.readInt16BE=function(t,e){t>>>=0,e||x(t,2,this.length);const r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},a.prototype.readInt32LE=function(t,e){return t>>>=0,e||x(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},a.prototype.readInt32BE=function(t,e){return t>>>=0,e||x(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},a.prototype.readBigInt64LE=H((function(t){$(t>>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Z(t,this.length-8);const n=this[t+4]+256*this[t+5]+65536*this[t+6]+(r<<24);return(BigInt(n)<>>=0,"offset");const e=this[t],r=this[t+7];void 0!==e&&void 0!==r||Z(t,this.length-8);const n=(e<<24)+65536*this[++t]+256*this[++t]+this[++t];return(BigInt(n)<>>=0,e||x(t,4,this.length),o.read(this,t,!0,23,4)},a.prototype.readFloatBE=function(t,e){return t>>>=0,e||x(t,4,this.length),o.read(this,t,!1,23,4)},a.prototype.readDoubleLE=function(t,e){return t>>>=0,e||x(t,8,this.length),o.read(this,t,!0,52,8)},a.prototype.readDoubleBE=function(t,e){return t>>>=0,e||x(t,8,this.length),o.read(this,t,!1,52,8)},a.prototype.writeUintLE=a.prototype.writeUIntLE=function(t,e,r,n){t=+t,e>>>=0,r>>>=0,n||R(this,t,e,r,Math.pow(2,8*r)-1,0);let o=1,i=0;for(this[e]=255&t;++i>>=0,r>>>=0,n||R(this,t,e,r,Math.pow(2,8*r)-1,0);let o=r-1,i=1;for(this[e+o]=255&t;--o>=0&&(i*=256);)this[e+o]=t/i&255;return e+r},a.prototype.writeUint8=a.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,1,255,0),this[e]=255&t,e+1},a.prototype.writeUint16LE=a.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},a.prototype.writeUint16BE=a.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},a.prototype.writeUint32LE=a.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},a.prototype.writeUint32BE=a.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},a.prototype.writeBigUInt64LE=H((function(t,e=0){return L(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),a.prototype.writeBigUInt64BE=H((function(t,e=0){return N(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))})),a.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);R(this,t,e,r,n-1,-n)}let o=0,i=1,u=0;for(this[e]=255&t;++o>0)-u&255;return e+r},a.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){const n=Math.pow(2,8*r-1);R(this,t,e,r,n-1,-n)}let o=r-1,i=1,u=0;for(this[e+o]=255&t;--o>=0&&(i*=256);)t<0&&0===u&&0!==this[e+o+1]&&(u=1),this[e+o]=(t/i>>0)-u&255;return e+r},a.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},a.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},a.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},a.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},a.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||R(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},a.prototype.writeBigInt64LE=H((function(t,e=0){return L(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),a.prototype.writeBigInt64BE=H((function(t,e=0){return N(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),a.prototype.writeFloatLE=function(t,e,r){return C(this,t,e,!0,r)},a.prototype.writeFloatBE=function(t,e,r){return C(this,t,e,!1,r)},a.prototype.writeDoubleLE=function(t,e,r){return q(this,t,e,!0,r)},a.prototype.writeDoubleBE=function(t,e,r){return q(this,t,e,!1,r)},a.prototype.copy=function(t,e,r,n){if(!a.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(o=e;o=n+4;r-=3)e=`_${t.slice(r-3,r)}${e}`;return`${t.slice(0,r)}${e}`}function K(t,e,r,n,o,i){if(t>r||t3?0===e||e===BigInt(0)?`>= 0${n} and < 2${n} ** ${8*(i+1)}${n}`:`>= -(2${n} ** ${8*(i+1)-1}${n}) and < 2 ** ${8*(i+1)-1}${n}`:`>= ${e}${n} and <= ${r}${n}`,new k.ERR_OUT_OF_RANGE("value",o,t)}!function(t,e,r){$(e,"offset"),void 0!==t[e]&&void 0!==t[e+r]||Z(e,t.length-(r+1))}(n,o,i)}function $(t,e){if("number"!=typeof t)throw new k.ERR_INVALID_ARG_TYPE(e,"number",t)}function Z(t,e,r){if(Math.floor(t)!==t)throw $(t,r),new k.ERR_OUT_OF_RANGE(r||"offset","an integer",t);if(e<0)throw new k.ERR_BUFFER_OUT_OF_BOUNDS;throw new k.ERR_OUT_OF_RANGE(r||"offset",`>= ${r?1:0} and <= ${e}`,t)}D("ERR_BUFFER_OUT_OF_BOUNDS",(function(t){return t?`${t} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),D("ERR_INVALID_ARG_TYPE",(function(t,e){return`The "${t}" argument must be of type number. Received type ${typeof e}`}),TypeError),D("ERR_OUT_OF_RANGE",(function(t,e,r){let n=`The value of "${t}" is out of range.`,o=r;return Number.isInteger(r)&&Math.abs(r)>2**32?o=z(String(r)):"bigint"==typeof r&&(o=String(r),(r>BigInt(2)**BigInt(32)||r<-(BigInt(2)**BigInt(32)))&&(o=z(o)),o+="n"),n+=` It must be ${e}. Received ${o}`,n}),RangeError);const F=/[^+/0-9A-Za-z-_]/g;function J(t,e){let r;e=e||1/0;const n=t.length;let o=null;const i=[];for(let u=0;u55295&&r<57344){if(!o){if(r>56319){(e-=3)>-1&&i.push(239,191,189);continue}if(u+1===n){(e-=3)>-1&&i.push(239,191,189);continue}o=r;continue}if(r<56320){(e-=3)>-1&&i.push(239,191,189),o=r;continue}r=65536+(o-55296<<10|r-56320)}else o&&(e-=3)>-1&&i.push(239,191,189);if(o=null,r<128){if((e-=1)<0)break;i.push(r)}else if(r<2048){if((e-=2)<0)break;i.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;i.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;i.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return i}function G(t){return n.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(F,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Y(t,e,r,n){let o;for(o=0;o=e.length||o>=t.length);++o)e[o+r]=t[o];return o}function V(t,e){return t instanceof e||null!=t&&null!=t.constructor&&null!=t.constructor.name&&t.constructor.name===e.name}function W(t){return t!=t}const X=function(){const t="0123456789abcdef",e=new Array(256);for(let r=0;r<16;++r){const n=16*r;for(let o=0;o<16;++o)e[n+o]=t[r]+t[o]}return e}();function H(t){return"undefined"==typeof BigInt?Q:t}function Q(){throw new Error("BigInt not supported")}},284:t=>{var e=function(){if("object"==typeof self&&self)return self;if("object"==typeof window&&window)return window;throw new Error("Unable to resolve global `this`")};t.exports=function(){if(this)return this;if("object"==typeof globalThis&&globalThis)return globalThis;try{Object.defineProperty(Object.prototype,"__global__",{get:function(){return this},configurable:!0})}catch(t){return e()}try{return __global__||e()}finally{delete Object.prototype.__global__}}()},1875:(t,e,r)=>{"use strict";function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(r(9019));function i(t){return new Promise(((e,r)=>{t.oncomplete=t.onsuccess=()=>e(t.result),t.onabort=t.onerror=()=>r(t.error)}))}function u(t,e){const r=o.default().then((()=>{const r=indexedDB.open(t);return r.onupgradeneeded=()=>r.result.createObjectStore(e),i(r)}));return(t,n)=>r.then((r=>n(r.transaction(e,t).objectStore(e))))}let s;function a(){return s||(s=u("keyval-store","keyval")),s}function f(t,e){return t("readonly",(t=>(t.openCursor().onsuccess=function(){this.result&&(e(this.result),this.result.continue())},i(t.transaction))))}e.clear=function(t=a()){return t("readwrite",(t=>(t.clear(),i(t.transaction))))},e.createStore=u,e.del=function(t,e=a()){return e("readwrite",(e=>(e.delete(t),i(e.transaction))))},e.entries=function(t=a()){const e=[];return f(t,(t=>e.push([t.key,t.value]))).then((()=>e))},e.get=function(t,e=a()){return e("readonly",(e=>i(e.get(t))))},e.getMany=function(t,e=a()){return e("readonly",(e=>Promise.all(t.map((t=>i(e.get(t)))))))},e.keys=function(t=a()){const e=[];return f(t,(t=>e.push(t.key))).then((()=>e))},e.promisifyRequest=i,e.set=function(t,e,r=a()){return r("readwrite",(r=>(r.put(e,t),i(r.transaction))))},e.setMany=function(t,e=a()){return e("readwrite",(e=>(t.forEach((t=>e.put(t[1],t[0]))),i(e.transaction))))},e.update=function(t,e,r=a()){return r("readwrite",(r=>new Promise(((n,o)=>{r.get(t).onsuccess=function(){try{r.put(e(this.result),t),n(i(r.transaction))}catch(t){o(t)}}}))))},e.values=function(t=a()){const e=[];return f(t,(t=>e.push(t.value))).then((()=>e))}},645:(t,e)=>{e.read=function(t,e,r,n,o){var i,u,s=8*o-n-1,a=(1<>1,c=-7,p=r?o-1:0,h=r?-1:1,l=t[e+p];for(p+=h,i=l&(1<<-c)-1,l>>=-c,c+=s;c>0;i=256*i+t[e+p],p+=h,c-=8);for(u=i&(1<<-c)-1,i>>=-c,c+=n;c>0;u=256*u+t[e+p],p+=h,c-=8);if(0===i)i=1-f;else{if(i===a)return u?NaN:1/0*(l?-1:1);u+=Math.pow(2,n),i-=f}return(l?-1:1)*u*Math.pow(2,i-n)},e.write=function(t,e,r,n,o,i){var u,s,a,f=8*i-o-1,c=(1<>1,h=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:i-1,y=n?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,u=c):(u=Math.floor(Math.log(e)/Math.LN2),e*(a=Math.pow(2,-u))<1&&(u--,a*=2),(e+=u+p>=1?h/a:h*Math.pow(2,1-p))*a>=2&&(u++,a/=2),u+p>=c?(s=0,u=c):u+p>=1?(s=(e*a-1)*Math.pow(2,o),u+=p):(s=e*Math.pow(2,p-1)*Math.pow(2,o),u=0));o>=8;t[r+l]=255&s,l+=y,s/=256,o-=8);for(u=u<0;t[r+l]=255&u,l+=y,u/=256,f-=8);t[r+l-y]|=128*g}},7435:(t,e)=>{e.endianness=function(){return"LE"},e.hostname=function(){return"undefined"!=typeof location?location.hostname:""},e.loadavg=function(){return[]},e.uptime=function(){return 0},e.freemem=function(){return Number.MAX_VALUE},e.totalmem=function(){return Number.MAX_VALUE},e.cpus=function(){return[]},e.type=function(){return"Browser"},e.release=function(){return"undefined"!=typeof navigator?navigator.appVersion:""},e.networkInterfaces=e.getNetworkInterfaces=function(){return{}},e.arch=function(){return"javascript"},e.platform=function(){return"browser"},e.tmpdir=e.tmpDir=function(){return"/tmp"},e.EOL="\n",e.homedir=function(){return"/"}},9019:t=>{"use strict";t.exports=function(){if(navigator.userAgentData||!/Safari\//.test(navigator.userAgent)||/Chrom(e|ium)\//.test(navigator.userAgent)||!indexedDB.databases)return Promise.resolve();let t;return new Promise((e=>{const r=()=>indexedDB.databases().finally(e);t=setInterval(r,100),r()})).finally((()=>clearInterval(t)))}},655:(t,e,r)=>{"use strict";r.r(e),r.d(e,{__extends:()=>o,__assign:()=>i,__rest:()=>u,__decorate:()=>s,__param:()=>a,__metadata:()=>f,__awaiter:()=>c,__generator:()=>p,__createBinding:()=>h,__exportStar:()=>l,__values:()=>y,__read:()=>g,__spread:()=>v,__spreadArrays:()=>d,__spreadArray:()=>w,__await:()=>b,__asyncGenerator:()=>m,__asyncDelegator:()=>E,__asyncValues:()=>_,__makeTemplateObject:()=>A,__importStar:()=>S,__importDefault:()=>O,__classPrivateFieldGet:()=>I,__classPrivateFieldSet:()=>U});var n=function(t,e){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])})(t,e)};function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}var i=function(){return(i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=0;s--)(o=t[s])&&(u=(i<3?o(u):i>3?o(e,r,u):o(e,r))||u);return i>3&&u&&Object.defineProperty(e,r,u),u}function a(t,e){return function(r,n){e(r,n,t)}}function f(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)}function c(t,e,r,n){return new(r||(r=Promise))((function(o,i){function u(t){try{a(n.next(t))}catch(t){i(t)}}function s(t){try{a(n.throw(t))}catch(t){i(t)}}function a(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(u,s)}a((n=n.apply(t,e||[])).next())}))}function p(t,e){var r,n,o,i,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;u;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return u.label++,{value:i[1],done:!1};case 5:u.label++,n=i[1],i=[0];continue;case 7:i=u.ops.pop(),u.trys.pop();continue;default:if(!((o=(o=u.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){u=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function g(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),u=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)u.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return u}function v(){for(var t=[],e=0;e1||s(t,e)}))})}function s(t,e){try{(r=o[t](e)).value instanceof b?Promise.resolve(r.value.v).then(a,f):c(i[0][2],r)}catch(t){c(i[0][3],t)}var r}function a(t){s("next",t)}function f(t){s("throw",t)}function c(t,e){t(e),i.shift(),i.length&&s(i[0][0],i[0][1])}}function E(t){var e,r;return e={},n("next"),n("throw",(function(t){throw t})),n("return"),e[Symbol.iterator]=function(){return this},e;function n(n,o){e[n]=t[n]?function(e){return(r=!r)?{value:b(t[n](e)),done:"return"===n}:o?o(e):e}:o}}function _(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,r=t[Symbol.asyncIterator];return r?r.call(t):(t=y(t),e={},n("next"),n("throw"),n("return"),e[Symbol.asyncIterator]=function(){return this},e);function n(r){e[r]=t[r]&&function(e){return new Promise((function(n,o){!function(t,e,r,n){Promise.resolve(n).then((function(e){t({value:e,done:r})}),e)}(n,o,(e=t[r](e)).done,e.value)}))}}}function A(t,e){return Object.defineProperty?Object.defineProperty(t,"raw",{value:e}):t.raw=e,t}var B=Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e};function S(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&h(e,t,r);return B(e,t),e}function O(t){return t&&t.__esModule?t:{default:t}}function I(t,e,r,n){if("a"===r&&!n)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!n:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(t):n?n.value:e.get(t)}function U(t,e,r,n,o){if("m"===n)throw new TypeError("Private method is not writable");if("a"===n&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!o:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===n?o.call(t,r):o?o.value=r:e.set(t,r),r}},5840:(t,e,r)=>{var n;if("object"==typeof globalThis)n=globalThis;else try{n=r(284)}catch(t){}finally{if(n||"undefined"==typeof window||(n=window),!n)throw new Error("Could not determine global this")}var o=n.WebSocket||n.MozWebSocket,i=r(9387);function u(t,e){return e?new o(t,e):new o(t)}o&&["CONNECTING","OPEN","CLOSING","CLOSED"].forEach((function(t){Object.defineProperty(u,t,{get:function(){return o[t]}})})),t.exports={w3cwebsocket:o?u:null,version:i}},9387:(t,e,r)=>{t.exports=r(9794).version},9794:t=>{"use strict";t.exports={version:"1.0.34"}}}]); +//# sourceMappingURL=413.a34b7c2590a9b327dc23.js.map \ No newline at end of file diff --git a/dist/592.d7ca037ed9b7d1c6792a.js.LICENSE.txt b/dist/413.a34b7c2590a9b327dc23.js.LICENSE.txt similarity index 93% rename from dist/592.d7ca037ed9b7d1c6792a.js.LICENSE.txt rename to dist/413.a34b7c2590a9b327dc23.js.LICENSE.txt index 56212fb23..fc4ce6971 100644 --- a/dist/592.d7ca037ed9b7d1c6792a.js.LICENSE.txt +++ b/dist/413.a34b7c2590a9b327dc23.js.LICENSE.txt @@ -21,5 +21,3 @@ PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ - -/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */ diff --git a/dist/413.a34b7c2590a9b327dc23.js.map b/dist/413.a34b7c2590a9b327dc23.js.map new file mode 100644 index 000000000..9d8d18534 --- /dev/null +++ b/dist/413.a34b7c2590a9b327dc23.js.map @@ -0,0 +1 @@ +{"version":3,"file":"413.a34b7c2590a9b327dc23.js","mappings":"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","sources":["webpack://telegram-t/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://telegram-t/./node_modules/async-mutex/lib/Mutex.js","webpack://telegram-t/./node_modules/async-mutex/lib/Semaphore.js","webpack://telegram-t/./node_modules/async-mutex/lib/errors.js","webpack://telegram-t/./node_modules/async-mutex/lib/index.js","webpack://telegram-t/./node_modules/async-mutex/lib/tryAcquire.js","webpack://telegram-t/./node_modules/async-mutex/lib/withTimeout.js","webpack://telegram-t/./node_modules/base64-js/index.js","webpack://telegram-t/./node_modules/big-integer/BigInteger.js","webpack://telegram-t/./node_modules/buffer/index.js","webpack://telegram-t/./node_modules/es5-ext/global.js","webpack://telegram-t/./node_modules/idb-keyval/dist/cjs/index.js","webpack://telegram-t/./node_modules/ieee754/index.js","webpack://telegram-t/./node_modules/os-browserify/browser.js","webpack://telegram-t/./node_modules/safari-14-idb-fix/dist/cjs/index.js","webpack://telegram-t/./node_modules/tslib/tslib.es6.js","webpack://telegram-t/./node_modules/websocket/lib/browser.js","webpack://telegram-t/./node_modules/websocket/lib/version.js"],"sourcesContent":["var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar Semaphore_1 = require(\"./Semaphore\");\nvar Mutex = /** @class */ (function () {\n function Mutex(cancelError) {\n this._semaphore = new Semaphore_1.default(1, cancelError);\n }\n Mutex.prototype.acquire = function () {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n var _a, releaser;\n return tslib_1.__generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this._semaphore.acquire()];\n case 1:\n _a = _b.sent(), releaser = _a[1];\n return [2 /*return*/, releaser];\n }\n });\n });\n };\n Mutex.prototype.runExclusive = function (callback) {\n return this._semaphore.runExclusive(function () { return callback(); });\n };\n Mutex.prototype.isLocked = function () {\n return this._semaphore.isLocked();\n };\n /** @deprecated Deprecated in 0.3.0, will be removed in 0.4.0. Use runExclusive instead. */\n Mutex.prototype.release = function () {\n this._semaphore.release();\n };\n Mutex.prototype.cancel = function () {\n return this._semaphore.cancel();\n };\n return Mutex;\n}());\nexports.default = Mutex;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar errors_1 = require(\"./errors\");\nvar Semaphore = /** @class */ (function () {\n function Semaphore(_maxConcurrency, _cancelError) {\n if (_cancelError === void 0) { _cancelError = errors_1.E_CANCELED; }\n this._maxConcurrency = _maxConcurrency;\n this._cancelError = _cancelError;\n this._queue = [];\n if (_maxConcurrency <= 0) {\n throw new Error('semaphore must be initialized to a positive value');\n }\n this._value = _maxConcurrency;\n }\n Semaphore.prototype.acquire = function () {\n var _this = this;\n var locked = this.isLocked();\n var ticketPromise = new Promise(function (resolve, reject) {\n return _this._queue.push({ resolve: resolve, reject: reject });\n });\n if (!locked)\n this._dispatch();\n return ticketPromise;\n };\n Semaphore.prototype.runExclusive = function (callback) {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n var _a, value, release;\n return tslib_1.__generator(this, function (_b) {\n switch (_b.label) {\n case 0: return [4 /*yield*/, this.acquire()];\n case 1:\n _a = _b.sent(), value = _a[0], release = _a[1];\n _b.label = 2;\n case 2:\n _b.trys.push([2, , 4, 5]);\n return [4 /*yield*/, callback(value)];\n case 3: return [2 /*return*/, _b.sent()];\n case 4:\n release();\n return [7 /*endfinally*/];\n case 5: return [2 /*return*/];\n }\n });\n });\n };\n Semaphore.prototype.isLocked = function () {\n return this._value <= 0;\n };\n /** @deprecated Deprecated in 0.3.0, will be removed in 0.4.0. Use runExclusive instead. */\n Semaphore.prototype.release = function () {\n if (this._maxConcurrency > 1) {\n throw new Error('this method is unavailable on semaphores with concurrency > 1; use the scoped release returned by acquire instead');\n }\n if (this._currentReleaser) {\n var releaser = this._currentReleaser;\n this._currentReleaser = undefined;\n releaser();\n }\n };\n Semaphore.prototype.cancel = function () {\n var _this = this;\n this._queue.forEach(function (ticket) { return ticket.reject(_this._cancelError); });\n this._queue = [];\n };\n Semaphore.prototype._dispatch = function () {\n var _this = this;\n var nextTicket = this._queue.shift();\n if (!nextTicket)\n return;\n var released = false;\n this._currentReleaser = function () {\n if (released)\n return;\n released = true;\n _this._value++;\n _this._dispatch();\n };\n nextTicket.resolve([this._value--, this._currentReleaser]);\n };\n return Semaphore;\n}());\nexports.default = Semaphore;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.E_CANCELED = exports.E_ALREADY_LOCKED = exports.E_TIMEOUT = void 0;\nexports.E_TIMEOUT = new Error('timeout while waiting for mutex to become available');\nexports.E_ALREADY_LOCKED = new Error('mutex already locked');\nexports.E_CANCELED = new Error('request for lock canceled');\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tryAcquire = exports.withTimeout = exports.Semaphore = exports.Mutex = void 0;\nvar tslib_1 = require(\"tslib\");\nvar Mutex_1 = require(\"./Mutex\");\nObject.defineProperty(exports, \"Mutex\", { enumerable: true, get: function () { return Mutex_1.default; } });\nvar Semaphore_1 = require(\"./Semaphore\");\nObject.defineProperty(exports, \"Semaphore\", { enumerable: true, get: function () { return Semaphore_1.default; } });\nvar withTimeout_1 = require(\"./withTimeout\");\nObject.defineProperty(exports, \"withTimeout\", { enumerable: true, get: function () { return withTimeout_1.withTimeout; } });\nvar tryAcquire_1 = require(\"./tryAcquire\");\nObject.defineProperty(exports, \"tryAcquire\", { enumerable: true, get: function () { return tryAcquire_1.tryAcquire; } });\ntslib_1.__exportStar(require(\"./errors\"), exports);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tryAcquire = void 0;\nvar errors_1 = require(\"./errors\");\nvar withTimeout_1 = require(\"./withTimeout\");\n// eslint-disable-next-lisne @typescript-eslint/explicit-module-boundary-types\nfunction tryAcquire(sync, alreadyAcquiredError) {\n if (alreadyAcquiredError === void 0) { alreadyAcquiredError = errors_1.E_ALREADY_LOCKED; }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return withTimeout_1.withTimeout(sync, 0, alreadyAcquiredError);\n}\nexports.tryAcquire = tryAcquire;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.withTimeout = void 0;\nvar tslib_1 = require(\"tslib\");\nvar errors_1 = require(\"./errors\");\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction withTimeout(sync, timeout, timeoutError) {\n var _this = this;\n if (timeoutError === void 0) { timeoutError = errors_1.E_TIMEOUT; }\n return {\n acquire: function () {\n return new Promise(function (resolve, reject) { return tslib_1.__awaiter(_this, void 0, void 0, function () {\n var isTimeout, handle, ticket, release, e_1;\n return tslib_1.__generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n isTimeout = false;\n handle = setTimeout(function () {\n isTimeout = true;\n reject(timeoutError);\n }, timeout);\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, , 4]);\n return [4 /*yield*/, sync.acquire()];\n case 2:\n ticket = _a.sent();\n if (isTimeout) {\n release = Array.isArray(ticket) ? ticket[1] : ticket;\n release();\n }\n else {\n clearTimeout(handle);\n resolve(ticket);\n }\n return [3 /*break*/, 4];\n case 3:\n e_1 = _a.sent();\n if (!isTimeout) {\n clearTimeout(handle);\n reject(e_1);\n }\n return [3 /*break*/, 4];\n case 4: return [2 /*return*/];\n }\n });\n }); });\n },\n runExclusive: function (callback) {\n return tslib_1.__awaiter(this, void 0, void 0, function () {\n var release, ticket;\n return tslib_1.__generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n release = function () { return undefined; };\n _a.label = 1;\n case 1:\n _a.trys.push([1, , 7, 8]);\n return [4 /*yield*/, this.acquire()];\n case 2:\n ticket = _a.sent();\n if (!Array.isArray(ticket)) return [3 /*break*/, 4];\n release = ticket[1];\n return [4 /*yield*/, callback(ticket[0])];\n case 3: return [2 /*return*/, _a.sent()];\n case 4:\n release = ticket;\n return [4 /*yield*/, callback()];\n case 5: return [2 /*return*/, _a.sent()];\n case 6: return [3 /*break*/, 8];\n case 7:\n release();\n return [7 /*endfinally*/];\n case 8: return [2 /*return*/];\n }\n });\n });\n },\n /** @deprecated Deprecated in 0.3.0, will be removed in 0.4.0. Use runExclusive instead. */\n release: function () {\n sync.release();\n },\n cancel: function () {\n return sync.cancel();\n },\n isLocked: function () { return sync.isLocked(); },\n };\n}\nexports.withTimeout = withTimeout;\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","var bigInt = (function (undefined) {\r\n \"use strict\";\r\n\r\n var BASE = 1e7,\r\n LOG_BASE = 7,\r\n MAX_INT = 9007199254740992,\r\n MAX_INT_ARR = smallToArray(MAX_INT),\r\n DEFAULT_ALPHABET = \"0123456789abcdefghijklmnopqrstuvwxyz\";\r\n\r\n var supportsNativeBigInt = typeof BigInt === \"function\";\r\n\r\n function Integer(v, radix, alphabet, caseSensitive) {\r\n if (typeof v === \"undefined\") return Integer[0];\r\n if (typeof radix !== \"undefined\") return +radix === 10 && !alphabet ? parseValue(v) : parseBase(v, radix, alphabet, caseSensitive);\r\n return parseValue(v);\r\n }\r\n\r\n function BigInteger(value, sign) {\r\n this.value = value;\r\n this.sign = sign;\r\n this.isSmall = false;\r\n }\r\n BigInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function SmallInteger(value) {\r\n this.value = value;\r\n this.sign = value < 0;\r\n this.isSmall = true;\r\n }\r\n SmallInteger.prototype = Object.create(Integer.prototype);\r\n\r\n function NativeBigInt(value) {\r\n this.value = value;\r\n }\r\n NativeBigInt.prototype = Object.create(Integer.prototype);\r\n\r\n function isPrecise(n) {\r\n return -MAX_INT < n && n < MAX_INT;\r\n }\r\n\r\n function smallToArray(n) { // For performance reasons doesn't reference BASE, need to change this function if BASE changes\r\n if (n < 1e7)\r\n return [n];\r\n if (n < 1e14)\r\n return [n % 1e7, Math.floor(n / 1e7)];\r\n return [n % 1e7, Math.floor(n / 1e7) % 1e7, Math.floor(n / 1e14)];\r\n }\r\n\r\n function arrayToSmall(arr) { // If BASE changes this function may need to change\r\n trim(arr);\r\n var length = arr.length;\r\n if (length < 4 && compareAbs(arr, MAX_INT_ARR) < 0) {\r\n switch (length) {\r\n case 0: return 0;\r\n case 1: return arr[0];\r\n case 2: return arr[0] + arr[1] * BASE;\r\n default: return arr[0] + (arr[1] + arr[2] * BASE) * BASE;\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n function trim(v) {\r\n var i = v.length;\r\n while (v[--i] === 0);\r\n v.length = i + 1;\r\n }\r\n\r\n function createArray(length) { // function shamelessly stolen from Yaffle's library https://github.com/Yaffle/BigInteger\r\n var x = new Array(length);\r\n var i = -1;\r\n while (++i < length) {\r\n x[i] = 0;\r\n }\r\n return x;\r\n }\r\n\r\n function truncate(n) {\r\n if (n > 0) return Math.floor(n);\r\n return Math.ceil(n);\r\n }\r\n\r\n function add(a, b) { // assumes a and b are arrays with a.length >= b.length\r\n var l_a = a.length,\r\n l_b = b.length,\r\n r = new Array(l_a),\r\n carry = 0,\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l_b; i++) {\r\n sum = a[i] + b[i] + carry;\r\n carry = sum >= base ? 1 : 0;\r\n r[i] = sum - carry * base;\r\n }\r\n while (i < l_a) {\r\n sum = a[i] + carry;\r\n carry = sum === base ? 1 : 0;\r\n r[i++] = sum - carry * base;\r\n }\r\n if (carry > 0) r.push(carry);\r\n return r;\r\n }\r\n\r\n function addAny(a, b) {\r\n if (a.length >= b.length) return add(a, b);\r\n return add(b, a);\r\n }\r\n\r\n function addSmall(a, carry) { // assumes a is array, carry is number with 0 <= carry < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n sum, i;\r\n for (i = 0; i < l; i++) {\r\n sum = a[i] - base + carry;\r\n carry = Math.floor(sum / base);\r\n r[i] = sum - carry * base;\r\n carry += 1;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall) {\r\n return new BigInteger(addSmall(a, Math.abs(b)), this.sign);\r\n }\r\n return new BigInteger(addAny(a, b), this.sign);\r\n };\r\n BigInteger.prototype.plus = BigInteger.prototype.add;\r\n\r\n SmallInteger.prototype.add = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.subtract(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n if (isPrecise(a + b)) return new SmallInteger(a + b);\r\n b = smallToArray(Math.abs(b));\r\n }\r\n return new BigInteger(addSmall(b, Math.abs(a)), a < 0);\r\n };\r\n SmallInteger.prototype.plus = SmallInteger.prototype.add;\r\n\r\n NativeBigInt.prototype.add = function (v) {\r\n return new NativeBigInt(this.value + parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.plus = NativeBigInt.prototype.add;\r\n\r\n function subtract(a, b) { // assumes a and b are arrays with a >= b\r\n var a_l = a.length,\r\n b_l = b.length,\r\n r = new Array(a_l),\r\n borrow = 0,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < b_l; i++) {\r\n difference = a[i] - borrow - b[i];\r\n if (difference < 0) {\r\n difference += base;\r\n borrow = 1;\r\n } else borrow = 0;\r\n r[i] = difference;\r\n }\r\n for (i = b_l; i < a_l; i++) {\r\n difference = a[i] - borrow;\r\n if (difference < 0) difference += base;\r\n else {\r\n r[i++] = difference;\r\n break;\r\n }\r\n r[i] = difference;\r\n }\r\n for (; i < a_l; i++) {\r\n r[i] = a[i];\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function subtractAny(a, b, sign) {\r\n var value;\r\n if (compareAbs(a, b) >= 0) {\r\n value = subtract(a, b);\r\n } else {\r\n value = subtract(b, a);\r\n sign = !sign;\r\n }\r\n value = arrayToSmall(value);\r\n if (typeof value === \"number\") {\r\n if (sign) value = -value;\r\n return new SmallInteger(value);\r\n }\r\n return new BigInteger(value, sign);\r\n }\r\n\r\n function subtractSmall(a, b, sign) { // assumes a is array, b is number with 0 <= b < MAX_INT\r\n var l = a.length,\r\n r = new Array(l),\r\n carry = -b,\r\n base = BASE,\r\n i, difference;\r\n for (i = 0; i < l; i++) {\r\n difference = a[i] + carry;\r\n carry = Math.floor(difference / base);\r\n difference %= base;\r\n r[i] = difference < 0 ? difference + base : difference;\r\n }\r\n r = arrayToSmall(r);\r\n if (typeof r === \"number\") {\r\n if (sign) r = -r;\r\n return new SmallInteger(r);\r\n } return new BigInteger(r, sign);\r\n }\r\n\r\n BigInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n if (this.sign !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var a = this.value, b = n.value;\r\n if (n.isSmall)\r\n return subtractSmall(a, Math.abs(b), this.sign);\r\n return subtractAny(a, b, this.sign);\r\n };\r\n BigInteger.prototype.minus = BigInteger.prototype.subtract;\r\n\r\n SmallInteger.prototype.subtract = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value;\r\n if (a < 0 !== n.sign) {\r\n return this.add(n.negate());\r\n }\r\n var b = n.value;\r\n if (n.isSmall) {\r\n return new SmallInteger(a - b);\r\n }\r\n return subtractSmall(b, Math.abs(a), a >= 0);\r\n };\r\n SmallInteger.prototype.minus = SmallInteger.prototype.subtract;\r\n\r\n NativeBigInt.prototype.subtract = function (v) {\r\n return new NativeBigInt(this.value - parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.minus = NativeBigInt.prototype.subtract;\r\n\r\n BigInteger.prototype.negate = function () {\r\n return new BigInteger(this.value, !this.sign);\r\n };\r\n SmallInteger.prototype.negate = function () {\r\n var sign = this.sign;\r\n var small = new SmallInteger(-this.value);\r\n small.sign = !sign;\r\n return small;\r\n };\r\n NativeBigInt.prototype.negate = function () {\r\n return new NativeBigInt(-this.value);\r\n }\r\n\r\n BigInteger.prototype.abs = function () {\r\n return new BigInteger(this.value, false);\r\n };\r\n SmallInteger.prototype.abs = function () {\r\n return new SmallInteger(Math.abs(this.value));\r\n };\r\n NativeBigInt.prototype.abs = function () {\r\n return new NativeBigInt(this.value >= 0 ? this.value : -this.value);\r\n }\r\n\r\n\r\n function multiplyLong(a, b) {\r\n var a_l = a.length,\r\n b_l = b.length,\r\n l = a_l + b_l,\r\n r = createArray(l),\r\n base = BASE,\r\n product, carry, i, a_i, b_j;\r\n for (i = 0; i < a_l; ++i) {\r\n a_i = a[i];\r\n for (var j = 0; j < b_l; ++j) {\r\n b_j = b[j];\r\n product = a_i * b_j + r[i + j];\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n r[i + j + 1] += carry;\r\n }\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n function multiplySmall(a, b) { // assumes a is array, b is number with |b| < BASE\r\n var l = a.length,\r\n r = new Array(l),\r\n base = BASE,\r\n carry = 0,\r\n product, i;\r\n for (i = 0; i < l; i++) {\r\n product = a[i] * b + carry;\r\n carry = Math.floor(product / base);\r\n r[i] = product - carry * base;\r\n }\r\n while (carry > 0) {\r\n r[i++] = carry % base;\r\n carry = Math.floor(carry / base);\r\n }\r\n return r;\r\n }\r\n\r\n function shiftLeft(x, n) {\r\n var r = [];\r\n while (n-- > 0) r.push(0);\r\n return r.concat(x);\r\n }\r\n\r\n function multiplyKaratsuba(x, y) {\r\n var n = Math.max(x.length, y.length);\r\n\r\n if (n <= 30) return multiplyLong(x, y);\r\n n = Math.ceil(n / 2);\r\n\r\n var b = x.slice(n),\r\n a = x.slice(0, n),\r\n d = y.slice(n),\r\n c = y.slice(0, n);\r\n\r\n var ac = multiplyKaratsuba(a, c),\r\n bd = multiplyKaratsuba(b, d),\r\n abcd = multiplyKaratsuba(addAny(a, b), addAny(c, d));\r\n\r\n var product = addAny(addAny(ac, shiftLeft(subtract(subtract(abcd, ac), bd), n)), shiftLeft(bd, 2 * n));\r\n trim(product);\r\n return product;\r\n }\r\n\r\n // The following function is derived from a surface fit of a graph plotting the performance difference\r\n // between long multiplication and karatsuba multiplication versus the lengths of the two arrays.\r\n function useKaratsuba(l1, l2) {\r\n return -0.012 * l1 - 0.012 * l2 + 0.000015 * l1 * l2 > 0;\r\n }\r\n\r\n BigInteger.prototype.multiply = function (v) {\r\n var n = parseValue(v),\r\n a = this.value, b = n.value,\r\n sign = this.sign !== n.sign,\r\n abs;\r\n if (n.isSmall) {\r\n if (b === 0) return Integer[0];\r\n if (b === 1) return this;\r\n if (b === -1) return this.negate();\r\n abs = Math.abs(b);\r\n if (abs < BASE) {\r\n return new BigInteger(multiplySmall(a, abs), sign);\r\n }\r\n b = smallToArray(abs);\r\n }\r\n if (useKaratsuba(a.length, b.length)) // Karatsuba is only faster for certain array sizes\r\n return new BigInteger(multiplyKaratsuba(a, b), sign);\r\n return new BigInteger(multiplyLong(a, b), sign);\r\n };\r\n\r\n BigInteger.prototype.times = BigInteger.prototype.multiply;\r\n\r\n function multiplySmallAndArray(a, b, sign) { // a >= 0\r\n if (a < BASE) {\r\n return new BigInteger(multiplySmall(b, a), sign);\r\n }\r\n return new BigInteger(multiplyLong(b, smallToArray(a)), sign);\r\n }\r\n SmallInteger.prototype._multiplyBySmall = function (a) {\r\n if (isPrecise(a.value * this.value)) {\r\n return new SmallInteger(a.value * this.value);\r\n }\r\n return multiplySmallAndArray(Math.abs(a.value), smallToArray(Math.abs(this.value)), this.sign !== a.sign);\r\n };\r\n BigInteger.prototype._multiplyBySmall = function (a) {\r\n if (a.value === 0) return Integer[0];\r\n if (a.value === 1) return this;\r\n if (a.value === -1) return this.negate();\r\n return multiplySmallAndArray(Math.abs(a.value), this.value, this.sign !== a.sign);\r\n };\r\n SmallInteger.prototype.multiply = function (v) {\r\n return parseValue(v)._multiplyBySmall(this);\r\n };\r\n SmallInteger.prototype.times = SmallInteger.prototype.multiply;\r\n\r\n NativeBigInt.prototype.multiply = function (v) {\r\n return new NativeBigInt(this.value * parseValue(v).value);\r\n }\r\n NativeBigInt.prototype.times = NativeBigInt.prototype.multiply;\r\n\r\n function square(a) {\r\n //console.assert(2 * BASE * BASE < MAX_INT);\r\n var l = a.length,\r\n r = createArray(l + l),\r\n base = BASE,\r\n product, carry, i, a_i, a_j;\r\n for (i = 0; i < l; i++) {\r\n a_i = a[i];\r\n carry = 0 - a_i * a_i;\r\n for (var j = i; j < l; j++) {\r\n a_j = a[j];\r\n product = 2 * (a_i * a_j) + r[i + j] + carry;\r\n carry = Math.floor(product / base);\r\n r[i + j] = product - carry * base;\r\n }\r\n r[i + l] = carry;\r\n }\r\n trim(r);\r\n return r;\r\n }\r\n\r\n BigInteger.prototype.square = function () {\r\n return new BigInteger(square(this.value), false);\r\n };\r\n\r\n SmallInteger.prototype.square = function () {\r\n var value = this.value * this.value;\r\n if (isPrecise(value)) return new SmallInteger(value);\r\n return new BigInteger(square(smallToArray(Math.abs(this.value))), false);\r\n };\r\n\r\n NativeBigInt.prototype.square = function (v) {\r\n return new NativeBigInt(this.value * this.value);\r\n }\r\n\r\n function divMod1(a, b) { // Left over from previous version. Performs faster than divMod2 on smaller input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n base = BASE,\r\n result = createArray(b.length),\r\n divisorMostSignificantDigit = b[b_l - 1],\r\n // normalization\r\n lambda = Math.ceil(base / (2 * divisorMostSignificantDigit)),\r\n remainder = multiplySmall(a, lambda),\r\n divisor = multiplySmall(b, lambda),\r\n quotientDigit, shift, carry, borrow, i, l, q;\r\n if (remainder.length <= a_l) remainder.push(0);\r\n divisor.push(0);\r\n divisorMostSignificantDigit = divisor[b_l - 1];\r\n for (shift = a_l - b_l; shift >= 0; shift--) {\r\n quotientDigit = base - 1;\r\n if (remainder[shift + b_l] !== divisorMostSignificantDigit) {\r\n quotientDigit = Math.floor((remainder[shift + b_l] * base + remainder[shift + b_l - 1]) / divisorMostSignificantDigit);\r\n }\r\n // quotientDigit <= base - 1\r\n carry = 0;\r\n borrow = 0;\r\n l = divisor.length;\r\n for (i = 0; i < l; i++) {\r\n carry += quotientDigit * divisor[i];\r\n q = Math.floor(carry / base);\r\n borrow += remainder[shift + i] - (carry - q * base);\r\n carry = q;\r\n if (borrow < 0) {\r\n remainder[shift + i] = borrow + base;\r\n borrow = -1;\r\n } else {\r\n remainder[shift + i] = borrow;\r\n borrow = 0;\r\n }\r\n }\r\n while (borrow !== 0) {\r\n quotientDigit -= 1;\r\n carry = 0;\r\n for (i = 0; i < l; i++) {\r\n carry += remainder[shift + i] - base + divisor[i];\r\n if (carry < 0) {\r\n remainder[shift + i] = carry + base;\r\n carry = 0;\r\n } else {\r\n remainder[shift + i] = carry;\r\n carry = 1;\r\n }\r\n }\r\n borrow += carry;\r\n }\r\n result[shift] = quotientDigit;\r\n }\r\n // denormalization\r\n remainder = divModSmall(remainder, lambda)[0];\r\n return [arrayToSmall(result), arrayToSmall(remainder)];\r\n }\r\n\r\n function divMod2(a, b) { // Implementation idea shamelessly stolen from Silent Matt's library http://silentmatt.com/biginteger/\r\n // Performs faster than divMod1 on larger input sizes.\r\n var a_l = a.length,\r\n b_l = b.length,\r\n result = [],\r\n part = [],\r\n base = BASE,\r\n guess, xlen, highx, highy, check;\r\n while (a_l) {\r\n part.unshift(a[--a_l]);\r\n trim(part);\r\n if (compareAbs(part, b) < 0) {\r\n result.push(0);\r\n continue;\r\n }\r\n xlen = part.length;\r\n highx = part[xlen - 1] * base + part[xlen - 2];\r\n highy = b[b_l - 1] * base + b[b_l - 2];\r\n if (xlen > b_l) {\r\n highx = (highx + 1) * base;\r\n }\r\n guess = Math.ceil(highx / highy);\r\n do {\r\n check = multiplySmall(b, guess);\r\n if (compareAbs(check, part) <= 0) break;\r\n guess--;\r\n } while (guess);\r\n result.push(guess);\r\n part = subtract(part, check);\r\n }\r\n result.reverse();\r\n return [arrayToSmall(result), arrayToSmall(part)];\r\n }\r\n\r\n function divModSmall(value, lambda) {\r\n var length = value.length,\r\n quotient = createArray(length),\r\n base = BASE,\r\n i, q, remainder, divisor;\r\n remainder = 0;\r\n for (i = length - 1; i >= 0; --i) {\r\n divisor = remainder * base + value[i];\r\n q = truncate(divisor / lambda);\r\n remainder = divisor - q * lambda;\r\n quotient[i] = q | 0;\r\n }\r\n return [quotient, remainder | 0];\r\n }\r\n\r\n function divModAny(self, v) {\r\n var value, n = parseValue(v);\r\n if (supportsNativeBigInt) {\r\n return [new NativeBigInt(self.value / n.value), new NativeBigInt(self.value % n.value)];\r\n }\r\n var a = self.value, b = n.value;\r\n var quotient;\r\n if (b === 0) throw new Error(\"Cannot divide by zero\");\r\n if (self.isSmall) {\r\n if (n.isSmall) {\r\n return [new SmallInteger(truncate(a / b)), new SmallInteger(a % b)];\r\n }\r\n return [Integer[0], self];\r\n }\r\n if (n.isSmall) {\r\n if (b === 1) return [self, Integer[0]];\r\n if (b == -1) return [self.negate(), Integer[0]];\r\n var abs = Math.abs(b);\r\n if (abs < BASE) {\r\n value = divModSmall(a, abs);\r\n quotient = arrayToSmall(value[0]);\r\n var remainder = value[1];\r\n if (self.sign) remainder = -remainder;\r\n if (typeof quotient === \"number\") {\r\n if (self.sign !== n.sign) quotient = -quotient;\r\n return [new SmallInteger(quotient), new SmallInteger(remainder)];\r\n }\r\n return [new BigInteger(quotient, self.sign !== n.sign), new SmallInteger(remainder)];\r\n }\r\n b = smallToArray(abs);\r\n }\r\n var comparison = compareAbs(a, b);\r\n if (comparison === -1) return [Integer[0], self];\r\n if (comparison === 0) return [Integer[self.sign === n.sign ? 1 : -1], Integer[0]];\r\n\r\n // divMod1 is faster on smaller input sizes\r\n if (a.length + b.length <= 200)\r\n value = divMod1(a, b);\r\n else value = divMod2(a, b);\r\n\r\n quotient = value[0];\r\n var qSign = self.sign !== n.sign,\r\n mod = value[1],\r\n mSign = self.sign;\r\n if (typeof quotient === \"number\") {\r\n if (qSign) quotient = -quotient;\r\n quotient = new SmallInteger(quotient);\r\n } else quotient = new BigInteger(quotient, qSign);\r\n if (typeof mod === \"number\") {\r\n if (mSign) mod = -mod;\r\n mod = new SmallInteger(mod);\r\n } else mod = new BigInteger(mod, mSign);\r\n return [quotient, mod];\r\n }\r\n\r\n BigInteger.prototype.divmod = function (v) {\r\n var result = divModAny(this, v);\r\n return {\r\n quotient: result[0],\r\n remainder: result[1]\r\n };\r\n };\r\n NativeBigInt.prototype.divmod = SmallInteger.prototype.divmod = BigInteger.prototype.divmod;\r\n\r\n\r\n BigInteger.prototype.divide = function (v) {\r\n return divModAny(this, v)[0];\r\n };\r\n NativeBigInt.prototype.over = NativeBigInt.prototype.divide = function (v) {\r\n return new NativeBigInt(this.value / parseValue(v).value);\r\n };\r\n SmallInteger.prototype.over = SmallInteger.prototype.divide = BigInteger.prototype.over = BigInteger.prototype.divide;\r\n\r\n BigInteger.prototype.mod = function (v) {\r\n return divModAny(this, v)[1];\r\n };\r\n NativeBigInt.prototype.mod = NativeBigInt.prototype.remainder = function (v) {\r\n return new NativeBigInt(this.value % parseValue(v).value);\r\n };\r\n SmallInteger.prototype.remainder = SmallInteger.prototype.mod = BigInteger.prototype.remainder = BigInteger.prototype.mod;\r\n\r\n BigInteger.prototype.pow = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value,\r\n value, x, y;\r\n if (b === 0) return Integer[1];\r\n if (a === 0) return Integer[0];\r\n if (a === 1) return Integer[1];\r\n if (a === -1) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.sign) {\r\n return Integer[0];\r\n }\r\n if (!n.isSmall) throw new Error(\"The exponent \" + n.toString() + \" is too large.\");\r\n if (this.isSmall) {\r\n if (isPrecise(value = Math.pow(a, b)))\r\n return new SmallInteger(truncate(value));\r\n }\r\n x = this;\r\n y = Integer[1];\r\n while (true) {\r\n if (b & 1 === 1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === 0) break;\r\n b /= 2;\r\n x = x.square();\r\n }\r\n return y;\r\n };\r\n SmallInteger.prototype.pow = BigInteger.prototype.pow;\r\n\r\n NativeBigInt.prototype.pow = function (v) {\r\n var n = parseValue(v);\r\n var a = this.value, b = n.value;\r\n var _0 = BigInt(0), _1 = BigInt(1), _2 = BigInt(2);\r\n if (b === _0) return Integer[1];\r\n if (a === _0) return Integer[0];\r\n if (a === _1) return Integer[1];\r\n if (a === BigInt(-1)) return n.isEven() ? Integer[1] : Integer[-1];\r\n if (n.isNegative()) return new NativeBigInt(_0);\r\n var x = this;\r\n var y = Integer[1];\r\n while (true) {\r\n if ((b & _1) === _1) {\r\n y = y.times(x);\r\n --b;\r\n }\r\n if (b === _0) break;\r\n b /= _2;\r\n x = x.square();\r\n }\r\n return y;\r\n }\r\n\r\n BigInteger.prototype.modPow = function (exp, mod) {\r\n exp = parseValue(exp);\r\n mod = parseValue(mod);\r\n if (mod.isZero()) throw new Error(\"Cannot take modPow with modulus 0\");\r\n var r = Integer[1],\r\n base = this.mod(mod);\r\n if (exp.isNegative()) {\r\n exp = exp.multiply(Integer[-1]);\r\n base = base.modInv(mod);\r\n }\r\n while (exp.isPositive()) {\r\n if (base.isZero()) return Integer[0];\r\n if (exp.isOdd()) r = r.multiply(base).mod(mod);\r\n exp = exp.divide(2);\r\n base = base.square().mod(mod);\r\n }\r\n return r;\r\n };\r\n NativeBigInt.prototype.modPow = SmallInteger.prototype.modPow = BigInteger.prototype.modPow;\r\n\r\n function compareAbs(a, b) {\r\n if (a.length !== b.length) {\r\n return a.length > b.length ? 1 : -1;\r\n }\r\n for (var i = a.length - 1; i >= 0; i--) {\r\n if (a[i] !== b[i]) return a[i] > b[i] ? 1 : -1;\r\n }\r\n return 0;\r\n }\r\n\r\n BigInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) return 1;\r\n return compareAbs(a, b);\r\n };\r\n SmallInteger.prototype.compareAbs = function (v) {\r\n var n = parseValue(v),\r\n a = Math.abs(this.value),\r\n b = n.value;\r\n if (n.isSmall) {\r\n b = Math.abs(b);\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n return -1;\r\n };\r\n NativeBigInt.prototype.compareAbs = function (v) {\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n a = a >= 0 ? a : -a;\r\n b = b >= 0 ? b : -b;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n\r\n BigInteger.prototype.compare = function (v) {\r\n // See discussion about comparison with Infinity:\r\n // https://github.com/peterolson/BigInteger.js/issues/61\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (this.sign !== n.sign) {\r\n return n.sign ? 1 : -1;\r\n }\r\n if (n.isSmall) {\r\n return this.sign ? -1 : 1;\r\n }\r\n return compareAbs(a, b) * (this.sign ? -1 : 1);\r\n };\r\n BigInteger.prototype.compareTo = BigInteger.prototype.compare;\r\n\r\n SmallInteger.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n\r\n var n = parseValue(v),\r\n a = this.value,\r\n b = n.value;\r\n if (n.isSmall) {\r\n return a == b ? 0 : a > b ? 1 : -1;\r\n }\r\n if (a < 0 !== n.sign) {\r\n return a < 0 ? -1 : 1;\r\n }\r\n return a < 0 ? 1 : -1;\r\n };\r\n SmallInteger.prototype.compareTo = SmallInteger.prototype.compare;\r\n\r\n NativeBigInt.prototype.compare = function (v) {\r\n if (v === Infinity) {\r\n return -1;\r\n }\r\n if (v === -Infinity) {\r\n return 1;\r\n }\r\n var a = this.value;\r\n var b = parseValue(v).value;\r\n return a === b ? 0 : a > b ? 1 : -1;\r\n }\r\n NativeBigInt.prototype.compareTo = NativeBigInt.prototype.compare;\r\n\r\n BigInteger.prototype.equals = function (v) {\r\n return this.compare(v) === 0;\r\n };\r\n NativeBigInt.prototype.eq = NativeBigInt.prototype.equals = SmallInteger.prototype.eq = SmallInteger.prototype.equals = BigInteger.prototype.eq = BigInteger.prototype.equals;\r\n\r\n BigInteger.prototype.notEquals = function (v) {\r\n return this.compare(v) !== 0;\r\n };\r\n NativeBigInt.prototype.neq = NativeBigInt.prototype.notEquals = SmallInteger.prototype.neq = SmallInteger.prototype.notEquals = BigInteger.prototype.neq = BigInteger.prototype.notEquals;\r\n\r\n BigInteger.prototype.greater = function (v) {\r\n return this.compare(v) > 0;\r\n };\r\n NativeBigInt.prototype.gt = NativeBigInt.prototype.greater = SmallInteger.prototype.gt = SmallInteger.prototype.greater = BigInteger.prototype.gt = BigInteger.prototype.greater;\r\n\r\n BigInteger.prototype.lesser = function (v) {\r\n return this.compare(v) < 0;\r\n };\r\n NativeBigInt.prototype.lt = NativeBigInt.prototype.lesser = SmallInteger.prototype.lt = SmallInteger.prototype.lesser = BigInteger.prototype.lt = BigInteger.prototype.lesser;\r\n\r\n BigInteger.prototype.greaterOrEquals = function (v) {\r\n return this.compare(v) >= 0;\r\n };\r\n NativeBigInt.prototype.geq = NativeBigInt.prototype.greaterOrEquals = SmallInteger.prototype.geq = SmallInteger.prototype.greaterOrEquals = BigInteger.prototype.geq = BigInteger.prototype.greaterOrEquals;\r\n\r\n BigInteger.prototype.lesserOrEquals = function (v) {\r\n return this.compare(v) <= 0;\r\n };\r\n NativeBigInt.prototype.leq = NativeBigInt.prototype.lesserOrEquals = SmallInteger.prototype.leq = SmallInteger.prototype.lesserOrEquals = BigInteger.prototype.leq = BigInteger.prototype.lesserOrEquals;\r\n\r\n BigInteger.prototype.isEven = function () {\r\n return (this.value[0] & 1) === 0;\r\n };\r\n SmallInteger.prototype.isEven = function () {\r\n return (this.value & 1) === 0;\r\n };\r\n NativeBigInt.prototype.isEven = function () {\r\n return (this.value & BigInt(1)) === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isOdd = function () {\r\n return (this.value[0] & 1) === 1;\r\n };\r\n SmallInteger.prototype.isOdd = function () {\r\n return (this.value & 1) === 1;\r\n };\r\n NativeBigInt.prototype.isOdd = function () {\r\n return (this.value & BigInt(1)) === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isPositive = function () {\r\n return !this.sign;\r\n };\r\n SmallInteger.prototype.isPositive = function () {\r\n return this.value > 0;\r\n };\r\n NativeBigInt.prototype.isPositive = SmallInteger.prototype.isPositive;\r\n\r\n BigInteger.prototype.isNegative = function () {\r\n return this.sign;\r\n };\r\n SmallInteger.prototype.isNegative = function () {\r\n return this.value < 0;\r\n };\r\n NativeBigInt.prototype.isNegative = SmallInteger.prototype.isNegative;\r\n\r\n BigInteger.prototype.isUnit = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isUnit = function () {\r\n return Math.abs(this.value) === 1;\r\n };\r\n NativeBigInt.prototype.isUnit = function () {\r\n return this.abs().value === BigInt(1);\r\n }\r\n\r\n BigInteger.prototype.isZero = function () {\r\n return false;\r\n };\r\n SmallInteger.prototype.isZero = function () {\r\n return this.value === 0;\r\n };\r\n NativeBigInt.prototype.isZero = function () {\r\n return this.value === BigInt(0);\r\n }\r\n\r\n BigInteger.prototype.isDivisibleBy = function (v) {\r\n var n = parseValue(v);\r\n if (n.isZero()) return false;\r\n if (n.isUnit()) return true;\r\n if (n.compareAbs(2) === 0) return this.isEven();\r\n return this.mod(n).isZero();\r\n };\r\n NativeBigInt.prototype.isDivisibleBy = SmallInteger.prototype.isDivisibleBy = BigInteger.prototype.isDivisibleBy;\r\n\r\n function isBasicPrime(v) {\r\n var n = v.abs();\r\n if (n.isUnit()) return false;\r\n if (n.equals(2) || n.equals(3) || n.equals(5)) return true;\r\n if (n.isEven() || n.isDivisibleBy(3) || n.isDivisibleBy(5)) return false;\r\n if (n.lesser(49)) return true;\r\n // we don't know if it's prime: let the other functions figure it out\r\n }\r\n\r\n function millerRabinTest(n, a) {\r\n var nPrev = n.prev(),\r\n b = nPrev,\r\n r = 0,\r\n d, t, i, x;\r\n while (b.isEven()) b = b.divide(2), r++;\r\n next: for (i = 0; i < a.length; i++) {\r\n if (n.lesser(a[i])) continue;\r\n x = bigInt(a[i]).modPow(b, n);\r\n if (x.isUnit() || x.equals(nPrev)) continue;\r\n for (d = r - 1; d != 0; d--) {\r\n x = x.square().mod(n);\r\n if (x.isUnit()) return false;\r\n if (x.equals(nPrev)) continue next;\r\n }\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n // Set \"strict\" to true to force GRH-supported lower bound of 2*log(N)^2\r\n BigInteger.prototype.isPrime = function (strict) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var bits = n.bitLength();\r\n if (bits <= 64)\r\n return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);\r\n var logN = Math.log(2) * bits.toJSNumber();\r\n var t = Math.ceil((strict === true) ? (2 * Math.pow(logN, 2)) : logN);\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt(i + 2));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isPrime = SmallInteger.prototype.isPrime = BigInteger.prototype.isPrime;\r\n\r\n BigInteger.prototype.isProbablePrime = function (iterations, rng) {\r\n var isPrime = isBasicPrime(this);\r\n if (isPrime !== undefined) return isPrime;\r\n var n = this.abs();\r\n var t = iterations === undefined ? 5 : iterations;\r\n for (var a = [], i = 0; i < t; i++) {\r\n a.push(bigInt.randBetween(2, n.minus(2), rng));\r\n }\r\n return millerRabinTest(n, a);\r\n };\r\n NativeBigInt.prototype.isProbablePrime = SmallInteger.prototype.isProbablePrime = BigInteger.prototype.isProbablePrime;\r\n\r\n BigInteger.prototype.modInv = function (n) {\r\n var t = bigInt.zero, newT = bigInt.one, r = parseValue(n), newR = this.abs(), q, lastT, lastR;\r\n while (!newR.isZero()) {\r\n q = r.divide(newR);\r\n lastT = t;\r\n lastR = r;\r\n t = newT;\r\n r = newR;\r\n newT = lastT.subtract(q.multiply(newT));\r\n newR = lastR.subtract(q.multiply(newR));\r\n }\r\n if (!r.isUnit()) throw new Error(this.toString() + \" and \" + n.toString() + \" are not co-prime\");\r\n if (t.compare(0) === -1) {\r\n t = t.add(n);\r\n }\r\n if (this.isNegative()) {\r\n return t.negate();\r\n }\r\n return t;\r\n };\r\n\r\n NativeBigInt.prototype.modInv = SmallInteger.prototype.modInv = BigInteger.prototype.modInv;\r\n\r\n BigInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return subtractSmall(value, 1, this.sign);\r\n }\r\n return new BigInteger(addSmall(value, 1), this.sign);\r\n };\r\n SmallInteger.prototype.next = function () {\r\n var value = this.value;\r\n if (value + 1 < MAX_INT) return new SmallInteger(value + 1);\r\n return new BigInteger(MAX_INT_ARR, false);\r\n };\r\n NativeBigInt.prototype.next = function () {\r\n return new NativeBigInt(this.value + BigInt(1));\r\n }\r\n\r\n BigInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (this.sign) {\r\n return new BigInteger(addSmall(value, 1), true);\r\n }\r\n return subtractSmall(value, 1, this.sign);\r\n };\r\n SmallInteger.prototype.prev = function () {\r\n var value = this.value;\r\n if (value - 1 > -MAX_INT) return new SmallInteger(value - 1);\r\n return new BigInteger(MAX_INT_ARR, true);\r\n };\r\n NativeBigInt.prototype.prev = function () {\r\n return new NativeBigInt(this.value - BigInt(1));\r\n }\r\n\r\n var powersOfTwo = [1];\r\n while (2 * powersOfTwo[powersOfTwo.length - 1] <= BASE) powersOfTwo.push(2 * powersOfTwo[powersOfTwo.length - 1]);\r\n var powers2Length = powersOfTwo.length, highestPower2 = powersOfTwo[powers2Length - 1];\r\n\r\n function shift_isSmall(n) {\r\n return Math.abs(n) <= BASE;\r\n }\r\n\r\n BigInteger.prototype.shiftLeft = function (v) {\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftRight(-n);\r\n var result = this;\r\n if (result.isZero()) return result;\r\n while (n >= powers2Length) {\r\n result = result.multiply(highestPower2);\r\n n -= powers2Length - 1;\r\n }\r\n return result.multiply(powersOfTwo[n]);\r\n };\r\n NativeBigInt.prototype.shiftLeft = function(v){\r\n v = parseValue(v)\r\n return new NativeBigInt(this.value << v.value)\r\n }\r\n SmallInteger.prototype.shiftLeft = BigInteger.prototype.shiftLeft;\r\n\r\n BigInteger.prototype.shiftRight = function (v) {\r\n var remQuo;\r\n var n = parseValue(v).toJSNumber();\r\n if (!shift_isSmall(n)) {\r\n throw new Error(String(n) + \" is too large for shifting.\");\r\n }\r\n if (n < 0) return this.shiftLeft(-n);\r\n var result = this;\r\n while (n >= powers2Length) {\r\n if (result.isZero() || (result.isNegative() && result.isUnit())) return result;\r\n remQuo = divModAny(result, highestPower2);\r\n result = remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n n -= powers2Length - 1;\r\n }\r\n remQuo = divModAny(result, powersOfTwo[n]);\r\n return remQuo[1].isNegative() ? remQuo[0].prev() : remQuo[0];\r\n };\r\n NativeBigInt.prototype.shiftRight = function (v){\r\n v = parseValue(v)\r\n return new NativeBigInt(this.value >> v.value)\r\n }\r\n SmallInteger.prototype.shiftRight = BigInteger.prototype.shiftRight;\r\n\r\n function bitwise(x, y, fn) {\r\n y = parseValue(y);\r\n var xSign = x.isNegative(), ySign = y.isNegative();\r\n var xRem = xSign ? x.not() : x,\r\n yRem = ySign ? y.not() : y;\r\n var xDigit = 0, yDigit = 0;\r\n var xDivMod = null, yDivMod = null;\r\n var result = [];\r\n while (!xRem.isZero() || !yRem.isZero()) {\r\n xDivMod = divModAny(xRem, highestPower2);\r\n xDigit = xDivMod[1].toJSNumber();\r\n if (xSign) {\r\n xDigit = highestPower2 - 1 - xDigit; // two's complement for negative numbers\r\n }\r\n\r\n yDivMod = divModAny(yRem, highestPower2);\r\n yDigit = yDivMod[1].toJSNumber();\r\n if (ySign) {\r\n yDigit = highestPower2 - 1 - yDigit; // two's complement for negative numbers\r\n }\r\n\r\n xRem = xDivMod[0];\r\n yRem = yDivMod[0];\r\n result.push(fn(xDigit, yDigit));\r\n }\r\n var sum = fn(xSign ? 1 : 0, ySign ? 1 : 0) !== 0 ? bigInt(-1) : bigInt(0);\r\n for (var i = result.length - 1; i >= 0; i -= 1) {\r\n sum = sum.multiply(highestPower2).add(bigInt(result[i]));\r\n }\r\n return sum;\r\n }\r\n\r\n BigInteger.prototype.not = function () {\r\n return this.negate().prev();\r\n };\r\n NativeBigInt.prototype.not = SmallInteger.prototype.not = BigInteger.prototype.not;\r\n\r\n BigInteger.prototype.and = function (n) {\r\n return bitwise(this, n, function (a, b) { return a & b; });\r\n };\r\n NativeBigInt.prototype.and = SmallInteger.prototype.and = BigInteger.prototype.and;\r\n\r\n BigInteger.prototype.or = function (n) {\r\n return bitwise(this, n, function (a, b) { return a | b; });\r\n };\r\n NativeBigInt.prototype.or = SmallInteger.prototype.or = BigInteger.prototype.or;\r\n\r\n BigInteger.prototype.xor = function (n) {\r\n return bitwise(this, n, function (a, b) { return a ^ b; });\r\n };\r\n NativeBigInt.prototype.xor = SmallInteger.prototype.xor = BigInteger.prototype.xor;\r\n\r\n var LOBMASK_I = 1 << 30, LOBMASK_BI = (BASE & -BASE) * (BASE & -BASE) | LOBMASK_I;\r\n function roughLOB(n) { // get lowestOneBit (rough)\r\n // SmallInteger: return Min(lowestOneBit(n), 1 << 30)\r\n // BigInteger: return Min(lowestOneBit(n), 1 << 14) [BASE=1e7]\r\n var v = n.value,\r\n x = typeof v === \"number\" ? v | LOBMASK_I :\r\n typeof v === \"bigint\" ? v | BigInt(LOBMASK_I) :\r\n v[0] + v[1] * BASE | LOBMASK_BI;\r\n return x & -x;\r\n }\r\n\r\n function integerLogarithm(value, base) {\r\n if (base.compareTo(value) <= 0) {\r\n var tmp = integerLogarithm(value, base.square(base));\r\n var p = tmp.p;\r\n var e = tmp.e;\r\n var t = p.multiply(base);\r\n return t.compareTo(value) <= 0 ? { p: t, e: e * 2 + 1 } : { p: p, e: e * 2 };\r\n }\r\n return { p: bigInt(1), e: 0 };\r\n }\r\n\r\n BigInteger.prototype.bitLength = function () {\r\n var n = this;\r\n if (n.compareTo(bigInt(0)) < 0) {\r\n n = n.negate().subtract(bigInt(1));\r\n }\r\n if (n.compareTo(bigInt(0)) === 0) {\r\n return bigInt(0);\r\n }\r\n return bigInt(integerLogarithm(n, bigInt(2)).e).add(bigInt(1));\r\n }\r\n NativeBigInt.prototype.bitLength = SmallInteger.prototype.bitLength = BigInteger.prototype.bitLength;\r\n\r\n function max(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.greater(b) ? a : b;\r\n }\r\n function min(a, b) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n return a.lesser(b) ? a : b;\r\n }\r\n function gcd(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n if (a.equals(b)) return a;\r\n if (a.isZero()) return b;\r\n if (b.isZero()) return a;\r\n var c = Integer[1], d, t;\r\n while (a.isEven() && b.isEven()) {\r\n d = min(roughLOB(a), roughLOB(b));\r\n a = a.divide(d);\r\n b = b.divide(d);\r\n c = c.multiply(d);\r\n }\r\n while (a.isEven()) {\r\n a = a.divide(roughLOB(a));\r\n }\r\n do {\r\n while (b.isEven()) {\r\n b = b.divide(roughLOB(b));\r\n }\r\n if (a.greater(b)) {\r\n t = b; b = a; a = t;\r\n }\r\n b = b.subtract(a);\r\n } while (!b.isZero());\r\n return c.isUnit() ? a : a.multiply(c);\r\n }\r\n function lcm(a, b) {\r\n a = parseValue(a).abs();\r\n b = parseValue(b).abs();\r\n return a.divide(gcd(a, b)).multiply(b);\r\n }\r\n function randBetween(a, b, rng) {\r\n a = parseValue(a);\r\n b = parseValue(b);\r\n var usedRNG = rng || Math.random;\r\n var low = min(a, b), high = max(a, b);\r\n var range = high.subtract(low).add(1);\r\n if (range.isSmall) return low.add(Math.floor(usedRNG() * range));\r\n var digits = toBase(range, BASE).value;\r\n var result = [], restricted = true;\r\n for (var i = 0; i < digits.length; i++) {\r\n var top = restricted ? digits[i] : BASE;\r\n var digit = truncate(usedRNG() * top);\r\n result.push(digit);\r\n if (digit < top) restricted = false;\r\n }\r\n return low.add(Integer.fromArray(result, BASE, false));\r\n }\r\n\r\n var parseBase = function (text, base, alphabet, caseSensitive) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n text = String(text);\r\n if (!caseSensitive) {\r\n text = text.toLowerCase();\r\n alphabet = alphabet.toLowerCase();\r\n }\r\n var length = text.length;\r\n var i;\r\n var absBase = Math.abs(base);\r\n var alphabetValues = {};\r\n for (i = 0; i < alphabet.length; i++) {\r\n alphabetValues[alphabet[i]] = i;\r\n }\r\n for (i = 0; i < length; i++) {\r\n var c = text[i];\r\n if (c === \"-\") continue;\r\n if (c in alphabetValues) {\r\n if (alphabetValues[c] >= absBase) {\r\n if (c === \"1\" && absBase === 1) continue;\r\n throw new Error(c + \" is not a valid digit in base \" + base + \".\");\r\n }\r\n }\r\n }\r\n base = parseValue(base);\r\n var digits = [];\r\n var isNegative = text[0] === \"-\";\r\n for (i = isNegative ? 1 : 0; i < text.length; i++) {\r\n var c = text[i];\r\n if (c in alphabetValues) digits.push(parseValue(alphabetValues[c]));\r\n else if (c === \"<\") {\r\n var start = i;\r\n do { i++; } while (text[i] !== \">\" && i < text.length);\r\n digits.push(parseValue(text.slice(start + 1, i)));\r\n }\r\n else throw new Error(c + \" is not a valid character\");\r\n }\r\n return parseBaseFromArray(digits, base, isNegative);\r\n };\r\n\r\n function parseBaseFromArray(digits, base, isNegative) {\r\n var val = Integer[0], pow = Integer[1], i;\r\n for (i = digits.length - 1; i >= 0; i--) {\r\n val = val.add(digits[i].times(pow));\r\n pow = pow.times(base);\r\n }\r\n return isNegative ? val.negate() : val;\r\n }\r\n\r\n function stringify(digit, alphabet) {\r\n alphabet = alphabet || DEFAULT_ALPHABET;\r\n if (digit < alphabet.length) {\r\n return alphabet[digit];\r\n }\r\n return \"<\" + digit + \">\";\r\n }\r\n\r\n function toBase(n, base) {\r\n base = bigInt(base);\r\n if (base.isZero()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n throw new Error(\"Cannot convert nonzero numbers to base 0.\");\r\n }\r\n if (base.equals(-1)) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n if (n.isNegative())\r\n return {\r\n value: [].concat.apply([], Array.apply(null, Array(-n.toJSNumber()))\r\n .map(Array.prototype.valueOf, [1, 0])\r\n ),\r\n isNegative: false\r\n };\r\n\r\n var arr = Array.apply(null, Array(n.toJSNumber() - 1))\r\n .map(Array.prototype.valueOf, [0, 1]);\r\n arr.unshift([1]);\r\n return {\r\n value: [].concat.apply([], arr),\r\n isNegative: false\r\n };\r\n }\r\n\r\n var neg = false;\r\n if (n.isNegative() && base.isPositive()) {\r\n neg = true;\r\n n = n.abs();\r\n }\r\n if (base.isUnit()) {\r\n if (n.isZero()) return { value: [0], isNegative: false };\r\n\r\n return {\r\n value: Array.apply(null, Array(n.toJSNumber()))\r\n .map(Number.prototype.valueOf, 1),\r\n isNegative: neg\r\n };\r\n }\r\n var out = [];\r\n var left = n, divmod;\r\n while (left.isNegative() || left.compareAbs(base) >= 0) {\r\n divmod = left.divmod(base);\r\n left = divmod.quotient;\r\n var digit = divmod.remainder;\r\n if (digit.isNegative()) {\r\n digit = base.minus(digit).abs();\r\n left = left.next();\r\n }\r\n out.push(digit.toJSNumber());\r\n }\r\n out.push(left.toJSNumber());\r\n return { value: out.reverse(), isNegative: neg };\r\n }\r\n\r\n function toBaseString(n, base, alphabet) {\r\n var arr = toBase(n, base);\r\n return (arr.isNegative ? \"-\" : \"\") + arr.value.map(function (x) {\r\n return stringify(x, alphabet);\r\n }).join('');\r\n }\r\n\r\n BigInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n SmallInteger.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n NativeBigInt.prototype.toArray = function (radix) {\r\n return toBase(this, radix);\r\n };\r\n\r\n BigInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix !== 10) return toBaseString(this, radix, alphabet);\r\n var v = this.value, l = v.length, str = String(v[--l]), zeros = \"0000000\", digit;\r\n while (--l >= 0) {\r\n digit = String(v[l]);\r\n str += zeros.slice(digit.length) + digit;\r\n }\r\n var sign = this.sign ? \"-\" : \"\";\r\n return sign + str;\r\n };\r\n\r\n SmallInteger.prototype.toString = function (radix, alphabet) {\r\n if (radix === undefined) radix = 10;\r\n if (radix != 10) return toBaseString(this, radix, alphabet);\r\n return String(this.value);\r\n };\r\n\r\n NativeBigInt.prototype.toString = SmallInteger.prototype.toString;\r\n\r\n NativeBigInt.prototype.toJSON = BigInteger.prototype.toJSON = SmallInteger.prototype.toJSON = function () { return this.toString(); }\r\n\r\n BigInteger.prototype.valueOf = function () {\r\n return parseInt(this.toString(), 10);\r\n };\r\n BigInteger.prototype.toJSNumber = BigInteger.prototype.valueOf;\r\n\r\n SmallInteger.prototype.valueOf = function () {\r\n return this.value;\r\n };\r\n SmallInteger.prototype.toJSNumber = SmallInteger.prototype.valueOf;\r\n NativeBigInt.prototype.valueOf = NativeBigInt.prototype.toJSNumber = function () {\r\n return parseInt(this.toString(), 10);\r\n }\r\n\r\n function parseStringValue(v) {\r\n if (isPrecise(+v)) {\r\n var x = +v;\r\n if (x === truncate(x))\r\n return supportsNativeBigInt ? new NativeBigInt(BigInt(x)) : new SmallInteger(x);\r\n throw new Error(\"Invalid integer: \" + v);\r\n }\r\n var sign = v[0] === \"-\";\r\n if (sign) v = v.slice(1);\r\n var split = v.split(/e/i);\r\n if (split.length > 2) throw new Error(\"Invalid integer: \" + split.join(\"e\"));\r\n if (split.length === 2) {\r\n var exp = split[1];\r\n if (exp[0] === \"+\") exp = exp.slice(1);\r\n exp = +exp;\r\n if (exp !== truncate(exp) || !isPrecise(exp)) throw new Error(\"Invalid integer: \" + exp + \" is not a valid exponent.\");\r\n var text = split[0];\r\n var decimalPlace = text.indexOf(\".\");\r\n if (decimalPlace >= 0) {\r\n exp -= text.length - decimalPlace - 1;\r\n text = text.slice(0, decimalPlace) + text.slice(decimalPlace + 1);\r\n }\r\n if (exp < 0) throw new Error(\"Cannot include negative exponent part for integers\");\r\n text += (new Array(exp + 1)).join(\"0\");\r\n v = text;\r\n }\r\n var isValid = /^([0-9][0-9]*)$/.test(v);\r\n if (!isValid) throw new Error(\"Invalid integer: \" + v);\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(sign ? \"-\" + v : v));\r\n }\r\n var r = [], max = v.length, l = LOG_BASE, min = max - l;\r\n while (max > 0) {\r\n r.push(+v.slice(min, max));\r\n min -= l;\r\n if (min < 0) min = 0;\r\n max -= l;\r\n }\r\n trim(r);\r\n return new BigInteger(r, sign);\r\n }\r\n\r\n function parseNumberValue(v) {\r\n if (supportsNativeBigInt) {\r\n return new NativeBigInt(BigInt(v));\r\n }\r\n if (isPrecise(v)) {\r\n if (v !== truncate(v)) throw new Error(v + \" is not an integer.\");\r\n return new SmallInteger(v);\r\n }\r\n return parseStringValue(v.toString());\r\n }\r\n\r\n function parseValue(v) {\r\n if (typeof v === \"number\") {\r\n return parseNumberValue(v);\r\n }\r\n if (typeof v === \"string\") {\r\n return parseStringValue(v);\r\n }\r\n if (typeof v === \"bigint\") {\r\n return new NativeBigInt(v);\r\n }\r\n return v;\r\n }\r\n // Pre-define numbers in range [-999,999]\r\n for (var i = 0; i < 1000; i++) {\r\n Integer[i] = parseValue(i);\r\n if (i > 0) Integer[-i] = parseValue(-i);\r\n }\r\n // Backwards compatibility\r\n Integer.one = Integer[1];\r\n Integer.zero = Integer[0];\r\n Integer.minusOne = Integer[-1];\r\n Integer.max = max;\r\n Integer.min = min;\r\n Integer.gcd = gcd;\r\n Integer.lcm = lcm;\r\n Integer.isInstance = function (x) { return x instanceof BigInteger || x instanceof SmallInteger || x instanceof NativeBigInt; };\r\n Integer.randBetween = randBetween;\r\n\r\n Integer.fromArray = function (digits, base, isNegative) {\r\n return parseBaseFromArray(digits.map(parseValue), parseValue(base || 10), isNegative);\r\n };\r\n\r\n return Integer;\r\n})();\r\n\r\n// Node.js check\r\nif (typeof module !== \"undefined\" && module.hasOwnProperty(\"exports\")) {\r\n module.exports = bigInt;\r\n}\r\n\r\n//amd check\r\nif (typeof define === \"function\" && define.amd) {\r\n define( function () {\r\n return bigInt;\r\n });\r\n}\r\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","var naiveFallback = function () {\n\tif (typeof self === \"object\" && self) return self;\n\tif (typeof window === \"object\" && window) return window;\n\tthrow new Error(\"Unable to resolve global `this`\");\n};\n\nmodule.exports = (function () {\n\tif (this) return this;\n\n\t// Unexpected strict mode (may happen if e.g. bundled into ESM module)\n\n\t// Fallback to standard globalThis if available\n\tif (typeof globalThis === \"object\" && globalThis) return globalThis;\n\n\t// Thanks @mathiasbynens -> https://mathiasbynens.be/notes/globalthis\n\t// In all ES5+ engines global object inherits from Object.prototype\n\t// (if you approached one that doesn't please report)\n\ttry {\n\t\tObject.defineProperty(Object.prototype, \"__global__\", {\n\t\t\tget: function () { return this; },\n\t\t\tconfigurable: true\n\t\t});\n\t} catch (error) {\n\t\t// Unfortunate case of updates to Object.prototype being restricted\n\t\t// via preventExtensions, seal or freeze\n\t\treturn naiveFallback();\n\t}\n\ttry {\n\t\t// Safari case (window.__global__ works, but __global__ does not)\n\t\tif (!__global__) return naiveFallback();\n\t\treturn __global__;\n\t} finally {\n\t\tdelete Object.prototype.__global__;\n\t}\n})();\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar safariFix = require('safari-14-idb-fix');\n\nfunction _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }\n\nvar safariFix__default = /*#__PURE__*/_interopDefaultLegacy(safariFix);\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__default['default']().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\nexports.clear = clear;\nexports.createStore = createStore;\nexports.del = del;\nexports.entries = entries;\nexports.get = get;\nexports.getMany = getMany;\nexports.keys = keys;\nexports.promisifyRequest = promisifyRequest;\nexports.set = set;\nexports.setMany = setMany;\nexports.update = update;\nexports.values = values;\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","exports.endianness = function () { return 'LE' };\n\nexports.hostname = function () {\n if (typeof location !== 'undefined') {\n return location.hostname\n }\n else return '';\n};\n\nexports.loadavg = function () { return [] };\n\nexports.uptime = function () { return 0 };\n\nexports.freemem = function () {\n return Number.MAX_VALUE;\n};\n\nexports.totalmem = function () {\n return Number.MAX_VALUE;\n};\n\nexports.cpus = function () { return [] };\n\nexports.type = function () { return 'Browser' };\n\nexports.release = function () {\n if (typeof navigator !== 'undefined') {\n return navigator.appVersion;\n }\n return '';\n};\n\nexports.networkInterfaces\n= exports.getNetworkInterfaces\n= function () { return {} };\n\nexports.arch = function () { return 'javascript' };\n\nexports.platform = function () { return 'browser' };\n\nexports.tmpdir = exports.tmpDir = function () {\n return '/tmp';\n};\n\nexports.EOL = '\\n';\n\nexports.homedir = function () {\n\treturn '/'\n};\n","'use strict';\n\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\nmodule.exports = idbReady;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || from);\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","var _globalThis;\nif (typeof globalThis === 'object') {\n\t_globalThis = globalThis;\n} else {\n\ttry {\n\t\t_globalThis = require('es5-ext/global');\n\t} catch (error) {\n\t} finally {\n\t\tif (!_globalThis && typeof window !== 'undefined') { _globalThis = window; }\n\t\tif (!_globalThis) { throw new Error('Could not determine global this'); }\n\t}\n}\n\nvar NativeWebSocket = _globalThis.WebSocket || _globalThis.MozWebSocket;\nvar websocket_version = require('./version');\n\n\n/**\n * Expose a W3C WebSocket class with just one or two arguments.\n */\nfunction W3CWebSocket(uri, protocols) {\n\tvar native_instance;\n\n\tif (protocols) {\n\t\tnative_instance = new NativeWebSocket(uri, protocols);\n\t}\n\telse {\n\t\tnative_instance = new NativeWebSocket(uri);\n\t}\n\n\t/**\n\t * 'native_instance' is an instance of nativeWebSocket (the browser's WebSocket\n\t * class). Since it is an Object it will be returned as it is when creating an\n\t * instance of W3CWebSocket via 'new W3CWebSocket()'.\n\t *\n\t * ECMAScript 5: http://bclary.com/2004/11/07/#a-13.2.2\n\t */\n\treturn native_instance;\n}\nif (NativeWebSocket) {\n\t['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'].forEach(function(prop) {\n\t\tObject.defineProperty(W3CWebSocket, prop, {\n\t\t\tget: function() { return NativeWebSocket[prop]; }\n\t\t});\n\t});\n}\n\n/**\n * Module exports.\n */\nmodule.exports = {\n 'w3cwebsocket' : NativeWebSocket ? W3CWebSocket : null,\n 'version' : websocket_version\n};\n","module.exports = require('../package.json').version;\n"],"names":["S","Uint8Array","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","length","i","buf","pos","str","charCodeAt","Error","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","this","encKey","decKey","set","tmp","rcon","j","prototype","encrypt","_message","a2","b2","c2","message","out","a","b","c","rounds","k","decrypt","AES_IGE","iv","blockSize","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","AES_IGE$1","counter","offset","incrementCounter","carry","Object","defineProperty","exports","value","tslib_1","Semaphore_1","Mutex","cancelError","_semaphore","default","acquire","__awaiter","__generator","_b","label","sent","runExclusive","callback","isLocked","release","cancel","errors_1","Semaphore","_maxConcurrency","_cancelError","E_CANCELED","_queue","_value","_this","locked","ticketPromise","Promise","resolve","reject","push","_dispatch","_a","trys","_currentReleaser","releaser","undefined","forEach","ticket","nextTicket","shift","released","E_ALREADY_LOCKED","E_TIMEOUT","tryAcquire","withTimeout","Mutex_1","enumerable","get","withTimeout_1","tryAcquire_1","__exportStar","sync","alreadyAcquiredError","timeout","timeoutError","isTimeout","handle","e_1","setTimeout","Array","isArray","clearTimeout","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","arr","Arr","_byteLength","curByte","len","revLookup","fromByteArray","uint8","extraBytes","parts","maxChunkLength","len2","encodeChunk","lookup","join","code","indexOf","start","end","num","output","BASE","MAX_INT","MAX_INT_ARR","smallToArray","DEFAULT_ALPHABET","supportsNativeBigInt","BigInt","Integer","v","radix","alphabet","caseSensitive","parseValue","parseBase","BigInteger","sign","isSmall","SmallInteger","NativeBigInt","isPrecise","n","Math","floor","arrayToSmall","trim","compareAbs","createArray","truncate","ceil","add","sum","l_a","l_b","r","base","addAny","addSmall","l","subtract","difference","a_l","b_l","borrow","subtractSmall","multiplyLong","product","a_i","multiplySmall","shiftLeft","concat","multiplyKaratsuba","max","slice","ac","bd","abcd","multiplySmallAndArray","square","divModSmall","lambda","q","remainder","divisor","quotient","divModAny","self","negate","abs","comparison","quotientDigit","result","divisorMostSignificantDigit","divMod1","guess","xlen","highx","highy","check","part","unshift","reverse","divMod2","qSign","mod","mSign","isBasicPrime","isUnit","equals","isEven","isDivisibleBy","lesser","millerRabinTest","nPrev","prev","divide","next","bigInt","modPow","create","plus","subtractAny","minus","small","multiply","l1","l2","times","_multiplyBySmall","divmod","over","pow","toString","_0","_1","_2","isNegative","exp","isZero","modInv","isPositive","isOdd","compare","Infinity","compareTo","eq","notEquals","neq","greater","gt","lt","greaterOrEquals","geq","lesserOrEquals","leq","isPrime","strict","bits","bitLength","logN","log","toJSNumber","isProbablePrime","iterations","rng","randBetween","lastT","lastR","zero","newT","one","newR","powersOfTwo","powers2Length","highestPower2","shift_isSmall","bitwise","fn","xSign","ySign","xRem","not","yRem","xDigit","yDigit","xDivMod","yDivMod","String","shiftRight","remQuo","and","or","LOBMASK_I","roughLOB","integerLogarithm","p","e","min","gcd","toLowerCase","absBase","alphabetValues","digits","parseBaseFromArray","val","toBase","apply","map","valueOf","neg","Number","digit","toBaseString","stringify","parseStringValue","split","decimalPlace","test","parseNumberValue","toArray","toJSON","parseInt","minusOne","lcm","isInstance","usedRNG","random","low","range","restricted","top","fromArray","module","hasOwnProperty","base64","ieee754","customInspectSymbol","Symbol","Buffer","SlowBuffer","alloc","INSPECT_MAX_BYTES","K_MAX_LENGTH","createBuffer","RangeError","setPrototypeOf","arg","encodingOrOffset","TypeError","allocUnsafe","from","string","encoding","isEncoding","actual","write","fromString","ArrayBuffer","isView","arrayView","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","obj","isBuffer","checked","numberIsNaN","type","data","fromObject","toPrimitive","assertSize","size","array","mustMatch","arguments","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","m","bidirectionalIndexOf","dir","arrayIndexOf","call","lastIndexOf","indexSize","arrLength","valLength","read","readUInt16BE","foundIndex","found","hexWrite","remaining","strLen","parsed","substr","utf8Write","blitBuffer","asciiWrite","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","decodeCodePointsArray","kMaxLength","TYPED_ARRAY_SUPPORT","proto","foo","typedArraySupport","console","error","poolSize","fill","allocUnsafeSlow","_isBuffer","list","swap16","swap32","swap64","toLocaleString","inspect","replace","target","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","_arr","ret","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","name","stack","addNumericalSeparator","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","INVALID_BASE64_RE","leadSurrogate","base64clean","src","dst","table","i16","BufferBigIntNotDefined","naiveFallback","window","globalThis","__global__","_interopDefaultLegacy","safariFix__default","promisifyRequest","request","oncomplete","onsuccess","onabort","onerror","createStore","dbName","storeName","dbp","then","indexedDB","open","onupgradeneeded","createObjectStore","txMode","db","transaction","objectStore","defaultGetStoreFunc","defaultGetStore","eachCursor","customStore","store","openCursor","continue","clear","del","delete","entries","items","cursor","getMany","keys","all","put","setMany","entry","update","updater","err","values","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","NaN","rt","isNaN","LN2","endianness","hostname","location","loadavg","uptime","freemem","MAX_VALUE","totalmem","cpus","navigator","appVersion","networkInterfaces","getNetworkInterfaces","arch","platform","tmpdir","tmpDir","EOL","homedir","userAgentData","userAgent","databases","intervalId","tryIdb","finally","setInterval","clearInterval","extendStatics","__proto__","__extends","__","__assign","assign","__rest","getOwnPropertySymbols","propertyIsEnumerable","__decorate","decorators","desc","getOwnPropertyDescriptor","Reflect","decorate","__param","paramIndex","decorator","__metadata","metadataKey","metadataValue","metadata","thisArg","_arguments","P","generator","fulfilled","step","rejected","done","body","f","g","_","ops","verb","iterator","op","pop","__createBinding","o","k2","__values","__read","ar","__spread","__spreadArrays","il","jl","__spreadArray","pack","__await","__asyncGenerator","asyncIterator","resume","fulfill","settle","__asyncDelegator","__asyncValues","__makeTemplateObject","cooked","raw","__setModuleDefault","__importStar","__esModule","__importDefault","__classPrivateFieldGet","receiver","state","kind","has","__classPrivateFieldSet","_globalThis","NativeWebSocket","WebSocket","MozWebSocket","websocket_version","W3CWebSocket","uri","protocols","prop"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/442.8bbf7947a0dd02949ce6.css.map b/dist/442.8bbf7947a0dd02949ce6.css.map deleted file mode 100644 index 3602c7ec2..000000000 --- a/dist/442.8bbf7947a0dd02949ce6.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"442.8bbf7947a0dd02949ce6.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;AC1KV,kBACE,gDACA,4DACA,qCAEA,iCACE,gBAGF,6BACE,oBAGF,yCACE,oBAGF,gCACE,iBACA,cACA,kBAGF,sCACE,SAGF,uDACE,aACA,mBAGF,uCACE,aACA,cACA,yB;ACnCJ,2BACE,aACA,aACA,WACA,eACA,kBACA,MACA,OACA,WACA,YACA,oBACA,aAEA,kCACE,KACE,oDAGF,GACE,kCACA,iCACA,wDAIJ,kCACE,KACE,8DAGF,GACE,qDAKJ,yBACE,KACE,yCAGF,GACE,kCACA,iCACA,sDAIJ,yBACE,KACE,iDAGF,GACE,0CAIJ,4CACE,kBACA,mBACA,oBACA,iCACA,0BAEA,6DAGF,qDACE,4CAGF,oDACE,2EAGF,6DACE,oFAGF,mDACE,UACA,2EAGF,4DACE,oF;ACrFF,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,yBAIA,4CACE,aAGF,8CACE,uBACA,aAKF,8CACE,aACA,cACA,uB;AE/TJ,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,kBACE,kBACA,YACA,mCACA,eACA,4BACA,YACA,mBACA,mEACA,YACA,YAEA,8BACE,kBACA,cACA,WACA,aACA,eACA,WACA,YACA,kBACA,mCACA,WAGF,gCACE,kBACA,cACA,WACA,cACA,gBACA,YACA,aACA,kBACA,mCAGF,iCACE,YACA,wDAGF,4FACE,wDAGF,iCACE,WACA,YACA,gBACA,mBAGF,yBACE,eACA,WACA,YACA,gBACA,iBACA,kBACA,aACA,eACA,mBACA,mBAGF,4BACE,kBACA,kBACA,eACA,gBAEA,wCACE,cAIJ,uCACE,WACA,kBACA,MACA,OACA,qBAGF,mCACE,kBACA,MACA,O;ACxFJ,oBACE,kBACA,eAEA,wCACE,cACA,iBACA,gBACA,4BAGF,4BACE,4GACA,qBACA,iBACA,UAGF,2CACE,kBAGF,8BACE,kBAGF,6BACE,aACA,kBACA,iBACA,kBAEA,qCACE,8CACA,eACA,uBAEA,uDACE,uB;ACrCN,+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,wHACE,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,UhBxKF,oGgB4KE,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;AC/CR,2BACE,gBACA,oBACA,sBACA,yBACA,mBAGF,4BACE,wBACA,gBACA,gBACA,cACA,sBAEA,yBAPF,4BAQI,yBAKF,sCACE,UACA,kBACA,UACA,OACA,WACA,aACA,cAKN,YACE,oBAGA,6BACE,oBACA,kBACA,2BACA,4BAEA,qCACE,cACA,WACA,kBACA,SACA,UACA,sCACA,uBACA,wBACA,kBAIJ,6BACE,iCACA,gBACA,mBAGF,kBACE,0BAIF,sBACE,mBACA,kCACA,mB;ACvEJ,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,yCACE,aACA,mBAGF,oDACE,aACA,kBAGF,0CACE,gBAGF,yDACE,oBACA,mBACA,gBACA,uBAGF,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,mBAIA,6BACE,kBAGF,mCACE,eACA,mBAGF,uCACE,kBACA,YACA,QACA,6BACA,UAGF,4BACE,oBAKF,yBACE,mBAGF,4BACE,gBAGF,2BACE,gBAEA,0BACA,4GAEE,wBAMJ,yCACE,kBACA,gBACA,iB;ACrNJ,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/middle/ReactorListModal.scss","webpack://telegram-t/./src/components/middle/EmojiInteractionAnimation.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/ReactionSelector.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/middle/composer/SendAsMenu.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",".ReactorListModal {\n --color-reaction: var(--color-message-reaction);\n --hover-color-reaction: var(--color-message-reaction-hover);\n --accent-color: var(--color-primary);\n\n .modal-content {\n overflow: hidden;\n }\n\n .Reactions {\n margin-bottom: 0.5rem;\n }\n\n .reaction-filter-emoji {\n margin-right: 0.25rem;\n }\n\n .reactor-list {\n max-height: 400px;\n overflow: auto;\n overflow-x: hidden;\n }\n\n .reactors-list-item {\n margin: 0;\n }\n\n .reactors-list-item .ListItem-button {\n display: flex;\n align-items: center;\n }\n\n .reactors-list-emoji {\n width: 1.5rem;\n height: 1.5rem;\n margin-inline-start: auto;\n }\n}\n",".EmojiInteractionAnimation {\n --start-x: 0;\n --start-y: 0;\n --scale: 0;\n --end-scale: 0;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 1000;\n\n @keyframes hide-reaction-reversed {\n from {\n transform: translate(100%, -50%) scaleX(-1) scale(1);\n }\n\n to {\n left: var(--end-x, var(--start-x));\n top: var(--end-y, var(--start-y));\n transform: translate(50%, 0) scale(var(--end-scale, 0));\n }\n }\n\n @keyframes show-reaction-reversed {\n from {\n transform: translate(50%, 0) scaleX(-1) scale(var(--scale, 0));\n }\n\n to {\n transform: translate(100%, -50%) scaleX(-1) scale(1);\n }\n }\n\n\n @keyframes hide-reaction {\n from {\n transform: translate(-50%, -50%) scale(1);\n }\n\n to {\n left: var(--end-x, var(--start-x));\n top: var(--end-y, var(--start-y));\n transform: translate(0, 0) scale(var(--end-scale, 0));\n }\n }\n\n @keyframes show-reaction {\n from {\n transform: translate(0, 0) scale(var(--scale, 0));\n }\n\n to {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n .AnimatedSticker {\n position: absolute;\n top: var(--start-y);\n left: var(--start-x);\n transform: scale(var(--scale), 0);\n transform-origin: left top;\n\n transition: 0.25s cubic-bezier(.29,.81,.27,.99) opacity;\n }\n\n &.reversed .AnimatedSticker {\n transform: scale(var(--scale), 0) scaleX(-1);\n }\n\n &.playing .AnimatedSticker {\n animation: show-reaction forwards 0.25s cubic-bezier(.29,.81,.27,.99);\n }\n\n &.reversed.playing .AnimatedSticker {\n animation: show-reaction-reversed forwards 0.25s cubic-bezier(.29,.81,.27,.99);\n }\n\n &.hiding .AnimatedSticker {\n opacity: 0;\n animation: hide-reaction forwards 0.25s cubic-bezier(.29,.81,.27,.99);\n }\n\n &.reversed.hiding .AnimatedSticker {\n animation: hide-reaction-reversed forwards 0.25s cubic-bezier(.29,.81,.27,.99);\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(#7f7f7f, 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\n.settings-quick-reaction {\n .Radio-main .label {\n display: flex;\n }\n\n .ReactionStaticEmoji {\n margin-inline-end: 1rem;\n width: 1.5rem\n }\n}\n\n.SettingsDefaultReaction {\n .ReactionStaticEmoji {\n width: 1.5rem;\n height: 1.5rem;\n margin-inline-end: 2rem;\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",".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",".ReactionSelector {\n position: absolute;\n height: 3rem;\n background: var(--color-background);\n min-width: 3rem;\n max-width: calc(100% + 5rem);\n z-index: 100;\n border-radius: 3rem;\n filter: drop-shadow(0 0.25rem 0.125rem var(--color-default-shadow));\n right: -3rem;\n top: -3.5rem;\n\n .bubble-big {\n position: absolute;\n display: block;\n content: \"\";\n right: 1.5rem;\n bottom: -0.5rem;\n width: 1rem;\n height: 1rem;\n border-radius: 50%;\n background: var(--color-background);\n z-index: -1;\n }\n\n .bubble-small {\n position: absolute;\n display: block;\n content: \"\";\n right: 1.25rem;\n bottom: -1.25rem;\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 50%;\n background: var(--color-background);\n }\n\n body.is-safari & {\n filter: none;\n box-shadow: 0 0.25rem 0.125rem var(--color-default-shadow);\n }\n\n body.is-safari .bubble-small, body.is-safari .bubble-big {\n box-shadow: 0 0.25rem 0.125rem var(--color-default-shadow);\n }\n\n .items-wrapper {\n width: 100%;\n height: 100%;\n overflow: hidden;\n border-radius: 3rem;\n }\n\n .items {\n padding: 0 1rem;\n width: 100%;\n height: 100%;\n overflow-x: auto;\n overflow: overlay;\n overflow-y: hidden;\n display: flex;\n cursor: pointer;\n align-items: center;\n border-radius: 3rem;\n }\n\n .reaction {\n margin-left: 0.5rem;\n position: relative;\n min-width: 2rem;\n min-height: 2rem;\n\n &:first-child {\n margin-left: 0;\n }\n }\n\n .ReactionStaticEmoji {\n width: 2rem;\n position: absolute;\n top: 0;\n left: 0;\n transform: scale(0.9);\n }\n\n .AnimatedSticker {\n position: absolute;\n top: 0;\n left: 0;\n }\n}\n",".MessageContextMenu {\n position: absolute;\n font-size: 1rem;\n\n .scrollable-content {\n overflow: auto;\n overflow: overlay;\n padding: 0.5rem 0;\n overscroll-behavior: contain;\n }\n\n .bubble {\n transition: opacity .15s cubic-bezier(0.2, 0, 0.2, 1), transform .15s cubic-bezier(0.2, 0, 0.2, 1) !important;\n transform: scale(0.7);\n overflow: initial;\n padding: 0;\n }\n\n &.with-reactions .bubble {\n margin-top: 3.5rem;\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 ~ &, .Button.send-as-button ~ & {\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",".SendAsMenu {\n .send-as-title {\n font-weight: 500;\n line-height: 1.25rem;\n word-break: break-word;\n margin-inline-start: 1rem;\n margin-block: 0.5rem;\n }\n\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 z-index: 2;\n position: absolute;\n top: -1rem;\n left: 0;\n right: auto;\n width: 3.5rem;\n height: 4.5rem;\n }\n }\n}\n\n.SendAsItem {\n margin: 0 !important;\n $border-size: 2px;\n\n .Avatar.selected {\n margin-right: 0.75rem;\n position: relative;\n width: calc(2.125rem - #{$border-size * 2});\n height: calc(2.125rem - #{$border-size * 2});\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: #{-$border-size * 2};\n left: #{-$border-size * 2};\n border: $border-size solid var(--color-primary);\n width: calc(100% + #{$border-size * 4});\n height: calc(100% + #{$border-size * 4});\n border-radius: 50%;\n }\n }\n\n .ListItem-button {\n padding: 0.5625rem 1rem !important;\n border-radius: 0;\n align-items: center;\n }\n\n .info {\n margin-inline-start: 0.5rem;\n }\n\n\n .subtitle {\n font-size: .9375rem;\n color: var(--color-text-secondary);\n line-height: 1.3125;\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 -0.75rem;\n\n .Reaction {\n display: flex;\n align-items: center;\n }\n\n .ReactionStaticEmoji {\n width: 1.5rem;\n margin-right: 1rem;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .multiline-item .subtitle {\n line-height: 1.25rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\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: 0.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: 0.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: 0.625rem;\n }\n }\n\n .Radio-main {\n &::before {\n left: 0.125rem;\n top: 0.25rem;\n transform: none;\n }\n\n &::after {\n left: 0.4375rem;\n top: 0.5625rem;\n transform: none;\n }\n }\n }\n}\n\n.ManageGroupMembers {\n padding: 0.5rem 1rem;\n}\n\n.ManageInvites {\n .primary-link {\n position: relative;\n }\n\n .primary-link-input {\n cursor: pointer;\n margin-bottom: 1rem;\n }\n\n .primary-link-more-menu {\n position: absolute;\n right: 0.5rem;\n top: 50%;\n transform: translate(0, -50%);\n z-index: 1;\n }\n\n .create-link {\n margin-bottom: 0.5rem;\n }\n}\n\n.ManageInvite {\n .link-name {\n margin-bottom: 1rem;\n }\n\n .expire-limit {\n margin-top: 1rem;\n }\n\n .usage-limit {\n margin-top: 1rem;\n\n -moz-appearance: textfield;\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n }\n }\n}\n\n.ManageInvite, .ManageInvites {\n .hint {\n font-size: 0.875rem;\n margin-bottom: 0;\n margin-top: 0.5rem;\n }\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/442.8bbf7947a0dd02949ce6.js b/dist/442.8bbf7947a0dd02949ce6.js deleted file mode 100644 index 09f0dd7c2..000000000 --- a/dist/442.8bbf7947a0dd02949ce6.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[442],{1442:(e,t,n)=>{n.r(t),n.d(t,{ArchivedChats:()=>ns,AttachMenu:()=>gr,AttachmentModal:()=>Js,BotCommandMenu:()=>Cr,BotCommandTooltip:()=>Er,CalendarModal:()=>Ke,ChatFolderModal:()=>ss,ContactList:()=>ja,ContextMenuContainer:()=>bs,CustomSendMenu:()=>br,DeleteMessageModal:()=>We,Dialogs:()=>Ue,DropArea:()=>Ir.Z,EmojiInteractionAnimation:()=>ht,EmojiTooltip:()=>Sr,ForwardPicker:()=>Be,GifSearch:()=>Gr,HeaderMenuContainer:()=>Ns,HistoryCalendar:()=>qe,InlineBotTooltip:()=>Rr,LeftSearch:()=>tn,Management:()=>Eo,MediaViewer:()=>be,MentionTooltip:()=>Os,MessageSelectToolbar:()=>rt,MobileSearch:()=>ks,NewChat:()=>es,NewChatStep1:()=>qa,NewChatStep2:()=>Wa,Notifications:()=>Ge,PaymentModal:()=>zo,PinMessageModal:()=>Qe,PollModal:()=>_s,PollResults:()=>Xr,ReactorListModal:()=>ct,ReceiptModal:()=>Vo,RightSearch:()=>$r,SafeLinkModal:()=>_e,SeenByModal:()=>ot,SendAsMenu:()=>Fr,Settings:()=>Ha,StickerSearch:()=>Or,StickerSetModal:()=>Is,StickerTooltip:()=>fr,SymbolMenu:()=>vr,TextFormatter:()=>yr.Z,UnpinAllMessagesModal:()=>et});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),v=n(2858),g=n(1638),p=n(396),E=n(3989),C=n(1174),f=n(7361),b=n(3858),I=n(4399),y=n(935),N=n(3227);function S(e,t){const n=document.createElement("div");n.classList.add("ghost");const a=new Image;if(a.draggable=!1,a.oncontextmenu=N.Z,"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 w(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 L=n(231),A=n(126),R=n(2255),F=n(3106),B=n(8964),$=n(9196);const D=(0,a.X$)((0,s.c$)(((e,{message:t})=>({isDownloading:!!t&&(0,g.te)(e,t),isProtected:(0,g.EV)(e,t)})))((({mediaData:e,isVideo:t,isZoomed:n,message:r,fileName:o,isAvatar:i,isDownloading:l,isProtected:c,onCloseMediaViewer:d,onForward:m,onZoomToggle:h})=>{const{downloadMessageMedia:P,cancelMessageMediaDownload:g}=(0,s.uC)(),{loadProgress:p}=(0,Z.Z)(r&&(0,v.Ti)(r,"download"),!l),E=(0,a.I4)((()=>{l?g({message:r}):P({message:r})}),[g,P,l,r]),C=(0,u.Z)(),b=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]);if(f.wB){if(c)return;return a.ZP.createElement("div",{className:"MediaViewerActions-mobile"},a.ZP.createElement(F.Z,{trigger:b,positionX:"right"},!i&&a.ZP.createElement(B.Z,{icon:"forward",onClick:m},C("Forward")),t?a.ZP.createElement(B.Z,{icon:l?"close":"download",onClick:E},l?`${Math.round(100*p)}% Downloading...`:"Download"):a.ZP.createElement(B.Z,{icon:"download",href:e,download:o},C("AccActionDownload"))),l&&a.ZP.createElement($.Z,{progress:p,size:"s",noCross:!0}))}return a.ZP.createElement("div",{className:"MediaViewerActions"},!i&&!c&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:C("Forward"),onClick:m},a.ZP.createElement("i",{className:"icon-forward"}))),function(){if(!c)return t?a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:C("AccActionDownload"),onClick:E},l?a.ZP.createElement($.Z,{progress:p,size:"s",onClick:E}):a.ZP.createElement("i",{className:"icon-download"})):a.ZP.createElement(L.Z,{href:e,download:o,round:!0,size:"smaller",color:"translucent-white",ariaLabel:C("AccActionDownload")},a.ZP.createElement("i",{className:"icon-download"}))}(),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:n?"Zoom Out":"Zoom In",onClick:h},a.ZP.createElement("i",{className:n?"icon-zoom-out":"icon-zoom-in"})),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:C("Close"),onClick:d},a.ZP.createElement("i",{className:"icon-close"})))})));var x=n(2202),U=n(9933),O=n(275),G=n(9118),J=n(9204),X=n(6752);const _=({text:e="",isHidden:t,isForVideo:n,onClick:s})=>{const[r,o]=(0,a.eJ)(!1);(0,a.d4)((()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;o(t>2*I.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 z=n(1212),Y=n(2019);const H=void 0!==document.fullscreenElement?"fullscreenElement":void 0!==document.mozFullScreenElement?"mozFullScreenElement":void 0!==document.webkitFullscreenElement?"webkitFullscreenElement":"";var V=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),v=(0,a.sO)(null),g=(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(g.current&&v.current){const{width:t,left:a}=v.current.getBoundingClientRect(),s=e instanceof MouseEvent?e.clientX:e.targetTouches[0].clientX;h(Math.max(Math.min(n*((s-a)/t),n),0))}}),[n,h]),b=(0,a.I4)((e=>{g.current=!0,E(e)}),[E]),I=(0,a.I4)((()=>{g.current=!1}),[]);var y,N;if((0,a.d4)((()=>{if(v.current&&Z)return(0,C.s)(v.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,v),a.ZP.createElement(L.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,N=s,a.ZP.createElement("div",{className:"player-file-size"},`${W(N*y)} / ${W(N)}`)),l&&a.ZP.createElement(L.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,v]=(0,a.eJ)(!0),[g,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,Y.Z)(),{shouldRender:y,transitionClassNames:N}=(0,z.Z)(!C,void 0,void 0,"slow"),{shouldRender:S,transitionClassNames:w}=(0,z.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 k=(0,a.I4)((e=>{e.stopPropagation(),m?(d.current.pause(),u(!1)):((0,j.Z)(d.current),u(!0),f.wB&&v(!1))}),[m]);(0,V.Z)(d,[]);const M=(0,a.I4)((()=>{v(!0)}),[]),T=(0,a.I4)((()=>{v(!1)}),[]),A=(0,a.I4)((e=>{Z(e.currentTarget.currentTime)}),[]),R=(0,a.I4)((()=>{Z(0),u(!1),v(!0)}),[]),F=(0,a.I4)((()=>{g&&E?E():!g&&p&&p()}),[E,g,p]),B=(0,a.I4)((e=>{d.current.currentTime=e}),[]),D=(0,a.I4)((e=>{e.stopPropagation(),v(!P),P||(d.current.pause(),u(!1))}),[P]);(0,a.d4)((()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),k(e))};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),[k]);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:R,onClick:f.wB?void 0:k,onDoubleClick:F},I,{onTimeUpdate:A}),e&&a.ZP.createElement("source",{src:e}))),S&&a.ZP.createElement(L.Z,{round:!0,className:`play-button ${w}`,onClick:k},a.ZP.createElement("i",{className:"icon-play"})),y&&a.ZP.createElement("div",{className:["spinner-container",N].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:g,fileSize:o,duration:d.current?d.current.duration:0,isForceVisible:P,isForceMobileVersion:s&&s.width<400,onSeek:B,onChangeFullscreen:F,onPlayPause:k}))})),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,g.hj)(e,n,s);return t?{chatId:n,messageId:s,senderId:t.senderId,origin:l,message:t,isProtected:(0,g.EV)(e,t)}:{}}if(r)return{messageId:-1,senderId:r,avatarOwner:(0,g.dy)(e,r)||(0,g.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,g.Tm)(e,n,s):(0,g.hj)(e,n,s),c?{chatId:n,threadId:a,messageId:s,senderId:c.senderId,origin:l,message:c,isProtected:(0,g.EV)(e,c)}:{}}))((e=>{const{messageId:t,isActive:n,avatarOwner:s,chatId:i,message:c,profilePhotoIndex:d,origin:m,animationLevel:u,onClose:P,onFooterClick:g,isFooterHidden:p,isProtected:E}=e,C=c?(0,v.O$)(c):void 0,b=c?(0,v.b7)(c):void 0,S=c?(0,v.F$)(c):void 0,w=c?(0,v.Cg)(c):void 0,k=!!c&&(0,v.rl)(c),M=!!c&&(0,v.hC)(c),T=Boolean(b||w||M),L=Boolean(!T&&(C||S||k)),{isGif:A}=b||w||{},R=Boolean(s||t),F=Boolean(s),B=m===o.bZ.SharedMedia,$=m===o.bZ.SearchResult,D=2===u;function x(e){if(F&&void 0!==d){const{photos:t}=s;return t&&t[d]?`photo${t[d].id}?size=c`:(0,v.RT)(s,e?"big":"normal")}return c&&(0,v.Ti)(c,e?"viewerFull":"viewerPreview")}const U=(0,h.Z)(c&&(B||$)&&(0,v.Ti)(c,"pictogram"),void 0,r.IU.BlobUrl,void 0,D&&350),O=x(),G=(0,h.Z)(O,void 0,r.IU.BlobUrl,void 0,D&&350),{mediaData:X,loadProgress:z}=(0,Z.Z)(x(!0),void 0,c&&(0,v.kG)(c,"viewerFull"),void 0,D&&350),Y=C||b?(C||b).blobUrl:void 0;let H=!T&&(Y||X)||G||U;const V=(0,l.Z)(!H&&c&&(0,v.DH)(c));H||m===o.bZ.SearchResult||(H=V);const j=c?(0,v.c0)(c):void 0;let K;if(c?k||M?K=(0,v.aE)(c).mediaSize:C||S?K=(0,v.bV)(C||S):(b||w)&&(K=(0,v.jC)(b||w)):K=I.vY,F)return a.ZP.createElement("div",{key:i,className:"MediaViewerContent"},se(X||G,(0,I.PA)(I.vY,!1),!f.wB&&!E));if(!c)return;const q=(0,y.X)(c),W=Boolean(q);return a.ZP.createElement("div",{className:"MediaViewerContent "+(W?"has-footer":"")},E&&a.ZP.createElement("div",{onContextMenu:N.Z,className:"protector"}),L&&se(Y||X||G||U,c&&(0,I.PA)(K,W),!f.wB&&!E),T&&(n?a.ZP.createElement(ne,{key:t,url:Y||X,isGif:A,posterData:H,posterSize:c&&(0,I.PA)(K,W,!0),loadProgress:z,fileSize:j,isMediaViewerOpen:R,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(n)}))):a.ZP.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},a.ZP.createElement(J.Z,{color:"white"}))}(H,c&&(0,I.PA)(K,W,!0),!f.wB&&!E)),q&&a.ZP.createElement(_,{text:q,onClick:g,isHidden:p&&(!T||A),isForVideo:T&&!A}))})));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(J.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),v=(0,a.sO)(!0),[g,p]=(0,a.eJ)(e),E=(0,c.Z)(),[b,I]=(0,a.eJ)(!1),{isZoomed:y,onClose:N}=m,S=(0,a.I4)((e=>{Z.current=e,E()}),[E]),w=(0,a.I4)((e=>{P.current=e,E()}),[E]),k=(0,a.I4)((e=>{v.current=e,E()}),[E]),M=(0,x.Z)(350,!0),T=(0,x.Z)(500,!0),L=(0,x.Z)(800,!0),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||!g)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;S({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=>S({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=>S({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=>S({x:e[0],y:e[1],scale:e[2]})}))}if(e={x:u,y:h,scale:m},d>=50)return N();if(d>0)return(0,U.vr)({from:h,to:0,duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>S({x:0,y:e,scale:m})});const P=u<0?1:-1,v=t(g,u<0?1:-1),E=r.x<0?-1:1;if(v&&c>=50&&P===E){const e=(window.innerWidth+40)*P;Z.current.x+=e,p(v),M((()=>n(v)))}T((()=>w(!1))),L((()=>k(!0))),ie=(0,U.vr)({from:Z.current.x,to:0,duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>S({y:0,x:e,scale:Z.current.scale})})}})}),[y,N,S,t,g,w,k]),!g)return;const R=t(g,1),F=t(g,-1),B=Z.current.x,$=Z.current.y,{scale:D}=Z.current;return a.ZP.createElement("div",{className:"MediaViewerSlides",ref:u},F&&1===D&&a.ZP.createElement("div",{className:"MediaViewerSlide",style:de(-window.innerWidth+B-40)},a.ZP.createElement(ae,re({},m,{messageId:F,isFooterHidden:b}))),g&&a.ZP.createElement("div",{className:"MediaViewerSlide "+(l?"MediaViewerSlide--active":""),onClick:A,ref:h,style:de(B,$,D)},a.ZP.createElement(ae,re({},m,{messageId:g,isActive:v.current,isFooterHidden:b||y||1!==D}))),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}))))}));function de(e=0,t=0,n=1){return`transform: translate3d(${e.toFixed(3)}px, ${t.toFixed(3)}px, 0px) scale(${n.toFixed(3)});`}var me=n(782);const ue=[1,0,0,1,0,0],he={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5},Ze=150,Pe=(0,a.X$)((({children:e,className:t,noWrap:n,canPan:s,zoomLevel:r,panDeltaX:o,panDeltaY:i,onPan:l})=>{const c=he[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)(ue),v=(0,a.sO)(null),g=(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,me.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-Ze{s||P(ue)}),[s]),(0,a.d4)((()=>{g.current&&(g.current.style.transform=`matrix(${Z.toString()})`)}),[n,Z]),n?e:a.ZP.createElement("div",{ref:v,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),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.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),g.current&&(g.current.style.transform=`matrix(${Z.toString()})`)}}},a.ZP.createElement("div",{ref:g,className:"pan-container"},e))}));var ve=n(2340),ge=n(172);const pe=(0,s.c$)(((e,{chatId:t,messageId:n,isAvatar:a})=>{if(a&&t)return{sender:(0,v.YC)(t)?(0,g.dy)(e,t):(0,g.Z1)(e,t)};if(!n||!t)return{};const s=(0,g.hj)(e,t,n);return{message:s,sender:s&&(0,g.Ur)(e,s)}}))((({chatId:e,messageId:t,sender:n,isAvatar:r,message:o})=>{const{closeMediaViewer:i,focusMessage:l}=(0,s.uC)(),c=(0,a.I4)((()=>{i(),l({chatId:e,messageId:t})}),[e,l,t,i]),d=(0,u.Z)();if(!n||!o&&!r)return;const m=(0,v.OU)(d,n);return a.ZP.createElement("div",{className:"SenderInfo",onClick:c},(0,v.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"},m&&(0,ve.Z)(m)),a.ZP.createElement("div",{className:"date",dir:"auto"},r?d("lng_mediaview_profile_photo"):(0,K.ZK)(d,1e3*o.date,!0))))})),Ee=({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(R.Z,t,e),Ce=(0,a.X$)((({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:n}=(0,z.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(L.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(L.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}))))})),fe=350,be=(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,g.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,g.dy)(e,s)||(0,g.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,g.Tm)(e,t,a):(0,g.hj)(e,t,a),!c)return{animationLevel:l};if(d=i&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(i)?(0,g.Fn)(e,t):(0,g.Zw)(e,t),i===o.bZ.Inline||i===o.bZ.Album)m=(0,g.qC)(e,t,n)||(0,g.gb)(e,t,n);else if(i===o.bZ.SharedMedia){const t=(0,g.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}}))((({chatId:e,threadId:t,messageId:n,senderId:g,origin:N,avatarOwner:F,profilePhotoIndex:B,message:$,chatMessages:x,collectionIds:U,animationLevel:O})=>{const{openMediaViewer:G,closeMediaViewer:J,openForwardMenu:X,focusMessage:_}=(0,s.uC)(),z=Boolean(F||n),Y=N===o.bZ.SharedMedia,H=N===o.bZ.SearchResult,V=$?(0,v.O$)($):void 0,j=$?(0,v.b7)($):void 0,K=$?(0,v.F$)($):void 0,q=$?(0,v.Cg)($):void 0,W=!!$&&(0,v.rl)($),Q=!!$&&(0,v.hC)($),ee=Boolean(j||q||Q),{isGif:te}=j||q||{},ne=Boolean(!ee&&(V||K||W)),ae=Boolean(F),se=Boolean(K||q),re=(0,a.Ye)((()=>se&&n?[n]:(0,v.N0)(x||{},U||[],Y)),[se,n,x,U,Y]),oe=n?re.indexOf(n):-1,ie=0===oe||-1===oe,le=oe===re.length-1||-1===oe,de=(0,a.sO)(),me=(0,P.Z)(g);!z||me&&me===g&&de.current||(de.current=oe);const ue=O>=1&&!f.$b?"mv-slide":"none",he=2===O?"slide-fade":"none",Ze=2===O,[ve,ge]=(0,a.eJ)(!1),[be,Ie]=(0,a.eJ)(!1),[ye,Ne]=(0,a.eJ)(1),[Se,we]=(0,a.eJ)({x:0,y:0});function ke(e){if(ae&&void 0!==B){const{photos:t}=F;return t&&t[B]?`photo${t[B].id}?size=c`:(0,v.RT)(F,e?"big":"normal")}return $&&(0,v.Ti)($,e?"viewerFull":"viewerPreview")}const Me=(0,h.Z)($&&(Y||H)&&(0,v.Ti)($,"pictogram"),void 0,r.IU.BlobUrl,void 0,Ze&&fe),Te=ke(),Le=(0,h.Z)(Te,void 0,r.IU.BlobUrl,void 0,Ze&&fe),{mediaData:Ae}=(0,Z.Z)(ke(!0),void 0,$&&(0,v.kG)($,"viewerFull"),void 0,Ze&&fe),Re=V||j?(V||j).blobUrl:void 0;let Fe=!ee&&(Re||Ae)||Le||Me;const Be=(0,l.Z)(!Fe&&$&&(0,v.DH)($));Fe||N===o.bZ.SearchResult||(Fe=Be);const $e=$?(0,v.ep)($):ae?`avatar${F.id}-${B}.jpg`:void 0;let De;$?W||Q?De=(0,v.aE)($).mediaSize:V||K?De=(0,v.bV)(V||K):(j||q)&&(De=(0,v.jC)(j||q)):De=I.vY,(0,a.d4)((()=>{f.wB&&document.body.classList.toggle("is-media-viewer-open",z)}),[z]);const xe=(0,c.Z)();(0,a.d4)((()=>{const e=window.matchMedia(I.L6);return"function"==typeof e.addEventListener?e.addEventListener("change",xe):"function"==typeof e.addListener&&e.addListener(xe),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",xe):"function"==typeof e.removeListener&&e.removeListener(xe)}}),[xe]);const Ue=(0,P.Z)($),Oe=(0,P.Z)(N),Ge=(0,P.Z)(F),Je=(0,P.Z)(Fe),Xe=$?(0,y.X)($):void 0,_e=Boolean(Xe);(0,a.d4)((()=>{Ze&&z&&!Ue&&!Ge&&((0,d.YW)(fe+i.fK),function(e,t,n,a,s,r){const{mediaEl:l}=M(t,r);if(!l)return;const{width:c}=b.Z.get(),{width:d,height:m}=(0,I.fM)(e,s),{width:u,height:h}=(0,I.jg)(d,m,a.width,a.height),Z=(c-u)/2,P=function(e){const t=window.matchMedia(I.L6);let n=4.125;return e&&(n+=t.matches?.875:3.375),n*I.Gw}(e)+(m-h)/2;let{top:v,left:g,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,v,g,p,E);v=e.top,g=e.left,p=e.width,E=e.height}const C=g+p/2-(Z+u/2),f=v+E/2-(P+h/2),y=p/u,N=E/h,w=S(n||l);k(w,{top:`${P}px`,left:`${Z}px`,width:`${u}px`,height:`${h}px`,transform:`translate3d(${C}px, ${f}px, 0) scale(${y}, ${N})`}),T(w,t),document.body.classList.add("ghost-animating"),requestAnimationFrame((()=>{document.body.appendChild(w),requestAnimationFrame((()=>{w.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(w),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(w)&&document.body.removeChild(w),document.body.classList.remove("ghost-animating")}))}),200+i.fK)}))}))}(_e,N,Fe,De,ee,$)),Ze&&!z&&(Ue||Ge)&&((0,d.YW)(fe+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 v=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:n}=b.Z.get();return t.top<=n&&t.top+t.height>=0}(a)){const{height:e}=b.Z.get();v=uC?E=C:C>E&&(C=E));const I=document.getElementsByClassName("ghost")[0],y=I||S(t||s,e);I||k(y,{top:`${v}px`,left:`${h}px`,width:`${Z}px`,height:`${P}px`,transform:`translate3d(${g}px, ${p}px, 0) scale(${E}, ${C})`}),requestAnimationFrame((()=>{if(I){const{top:e,left:t,width:n,height:a}=I.getBoundingClientRect();k(y,{transition:"none",top:`${v}px`,left:`${h}px`,transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-v}px, 0) scale(${n/Z}, ${a/P})`,width:`${Z}px`,height:`${P}px`})}document.body.classList.add("ghost-animating"),I||document.body.appendChild(y),requestAnimationFrame((()=>{I&&(I.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)}))}))}(Oe,Je,Ue||void 0))}),[Ze,z,N,Oe,$,Ue,Ge,Fe,Je,De,ee,_e]),(0,a.d4)((()=>{let e;return be?ge(!0):e=window.setTimeout((()=>{ge(!1)}),fe),()=>{e&&window.clearTimeout(e)}}),[be]);const ze=()=>{Ie(!1),Ne(1),we({x:0,y:0})},Ye=(0,a.I4)((()=>{Ie(!be),Ne(be?1:1.5),be&&we({x:0,y:0})}),[be]),He=(0,a.I4)(((e,t=!1)=>{Ne(e),1===e&&t&&ze()}),[]),Ve=(0,a.I4)((()=>{J(),ze()}),[J]),je=(0,a.I4)((()=>{Ve(),_({chatId:e,threadId:t,messageId:n})}),[Ve,e,t,_,n]),Ke=(0,a.I4)((()=>{X({fromChatId:e,messageIds:[n]}),ze()}),[X,e,n]),qe=(0,a.I4)((n=>G({chatId:e,threadId:t,messageId:n,origin:N},{forceOnHeavyAnimation:!0})),[e,G,N,t]);(0,a.d4)((()=>z?(0,E.Z)((()=>{be?ze():Ve()})):void 0),[Ve,z,be]),(0,a.d4)((()=>{ee&&!te&&(0,p.Es)()}),[te,ee]),(0,a.d4)((()=>{if(z)return b.Z.disableRefresh(),()=>{b.Z.enableRefresh()}}),[z]);const We=(0,a.I4)(((e,t)=>{if(!e)return;const n=re.indexOf(e);return-1===t&&n>0||1===t&&n{we({x:e,y:t})}),[]),nt=(0,u.Z)();function at(){return ae?a.ZP.createElement(pe,{key:F.id,chatId:F.id,isAvatar:!0}):a.ZP.createElement(pe,{key:n,chatId:e,messageId:n})}return(0,m.ZP)(z,J,G,{chatId:e,threadId:t,messageId:n,origin:N,avatarOwnerId:F&&F.id}),(0,a.d4)((()=>{if(z)return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)};function e(e){switch(e.key){case"Left":case"ArrowLeft":qe(et);break;case"Right":case"ArrowRight":qe(Qe)}}}),[z,Qe,et,qe]),(0,a.d4)((()=>{if(be||f.$b)return;const e=document.querySelector(".MediaViewerSlide--active");if(!e)return;const t=te&&!f.cj;return(0,C.s)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:Ve})}),[Ve,te,be,n]),a.ZP.createElement(A.Z,{id:"MediaViewer",className:be?"zoomed":"",isOpen:z},(()=>a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"media-viewer-head",dir:nt.isRtl?"rtl":void 0},f.wB&&a.ZP.createElement(L.Z,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:nt("Close"),onClick:Ve},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(R.Z,{activeKey:de.current,name:he},at),a.ZP.createElement(D,{mediaData:Ae||Le,isVideo:ee,isZoomed:be,message:$,fileName:$e,onCloseMediaViewer:Ve,onForward:Ke,onZoomToggle:Ye,isAvatar:ae})),a.ZP.createElement(Pe,{noWrap:!ve,canPan:be,panDeltaX:Se.x,panDeltaY:Se.y,zoomLevel:ye,onPan:tt},a.ZP.createElement(Ee,{activeKey:oe,name:ue},(s=>a.ZP.createElement(ce,{messageId:n,getMessageId:We,chatId:e,isPhoto:ne,isGif:te,threadId:t,avatarOwnerId:F&&F.id,profilePhotoIndex:B,origin:N,isOpen:z,hasFooter:_e,isZoomed:be,isActive:s,animationLevel:O,onClose:Ve,selectMessage:qe,onFooterClick:je})))),!ie&&!f.$b&&a.ZP.createElement("button",{type:"button",className:`navigation prev ${ee&&!te&&"inline"}`,"aria-label":nt("AccDescrPrevious"),dir:nt.isRtl?"rtl":void 0,onClick:()=>qe(et)}),!le&&!f.$b&&a.ZP.createElement("button",{type:"button",className:`navigation next ${ee&&!te&&"inline"}`,"aria-label":nt("Next"),dir:nt.isRtl?"rtl":void 0,onClick:()=>qe(Qe)}),a.ZP.createElement(Ce,{isShown:be,onChangeZoom:He}))))})));var Ie=n(8360),ye=n(7407),Ne=n(2313),Se=n(2515),we=n(4288),ke=n(3103),Me=n(7687),Te=n(1273),Le=n(1876),Ae=n(8799),Re=n(6058);const Fe=(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,ye.Z)(c,n,Boolean(r)),P=(0,a.I4)((()=>{i("")}),[i]);(0,Se.Z)(s,e,P);const g=(0,a.sO)(null),p=(0,a.I4)((e=>{i(e.currentTarget.value)}),[i]),E=(0,Ne.Z)(g,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(L.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:m("Close"),onClick:l},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(Me.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(Te.Z,{className:"picker-list custom-scroll",items:h,onLoadMore:Z,noScrollRestore:Boolean(r),ref:g,onKeyDown:E},h.map((e=>a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>d(e)},(0,v.YC)(e)?a.ZP.createElement(Re.Z,{status:e===t?m("SavedMessagesInfo"):void 0,userId:e}):a.ZP.createElement(Ae.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))})),Be=(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}}))((({chatsById:e,activeListIds:t,archivedListIds:n,pinnedIds:o,contactIds:i,currentUserId:l,isOpen:c})=>{const{setForwardChatId:d,exitForwardMode:m,loadMoreChats:h}=(0,s.uC)(),Z=(0,u.Z)(),[P,g]=(0,a.eJ)(""),p=(0,a.sO)(null),E=(0,a.Ye)((()=>{if(!c)return;let a=o||[];l&&(a=(0,me.Tw)([l,...a]));const d=[...t||[],...n||[]].filter((t=>{const n=e[t];return n&&(0,v.Qm)(n,r._f)})),m=(0,s.Rd)().users.byId;return(0,v.ih)((0,me.Tw)([...(0,v.$l)(Z,d,e,P,l),...i?(0,v.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,Ie.Z)(E);return a.ZP.createElement(Fe,{currentUserId:l,isOpen:c,chatOrUserIds:f,filterRef:p,filterPlaceholder:Z("ForwardTo"),filter:P,onFilterChange:g,loadMore:h,onSelectChatOrUser:C,onClose:m})})));var $e=n(1947),De=n(706);function xe(e){return e.isSlowMode?"Slowmode enabled":e.hasErrorKey?"Something went wrong":"Telegram"}const Ue=(0,a.X$)((0,s.c$)((e=>(0,me.ei)(e,["dialogs"])))((({dialogs:e})=>{const{dismissDialog:t,acceptInviteConfirmation:n,sendMessage:r}=(0,s.uC)(),[o,i,l]=(0,De.Z)(),c=(0,u.Z)();var d,m,h;if((0,a.d4)((()=>{e.length>0&&i()}),[e,i]),e.length)return a.ZP.createElement("div",{id:"Dialogs"},Boolean(e.length)&&("hash"in(d=e[e.length-1])?(e=>{const{hash:s,title:r,about:i,participantsCount:d,isChannel:m,photo:u,isRequestNeeded:h}=e,P=c(m?"Subscribers":"Members",d,"i"),v=c(m?"ChannelJoin":"JoinGroup"),g=c(m?"MemberRequests.RequestToJoinChannel":"MemberRequests.RequestToJoinGroup");return a.ZP.createElement(ke.Z,{isOpen:o,onClose:l,className:"error",header:Z(r,u),onCloseAnimationEnd:t},i&&a.ZP.createElement("p",{className:"modal-about"},(0,ve.Z)(i)),void 0!==d&&a.ZP.createElement("p",null,P),h&&a.ZP.createElement("p",{className:"modal-help"},c(m?"MemberRequests.RequestToJoinDescriptionChannel":"MemberRequests.RequestToJoinDescriptionGroup")),a.ZP.createElement(L.Z,{isText:!0,className:"confirm-dialog-button",onClick:()=>{n({hash:s}),l()}},h?g:v),a.ZP.createElement(L.Z,{isText:!0,className:"confirm-dialog-button",onClick:l},c("Cancel")))})(d):"phoneNumber"in d?(m=d,a.ZP.createElement(ke.Z,{isOpen:o,onClose:l,className:"confirm",title:c("ShareYouPhoneNumberTitle"),onCloseAnimationEnd:t},c("AreYouSureShareMyContactInfoBot"),a.ZP.createElement("div",null,a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:()=>{r({contact:(0,me.ei)(m,["firstName","lastName","phoneNumber"])}),l()}},c("OK")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:l},c("Cancel"))))):(h=d,a.ZP.createElement(ke.Z,{isOpen:o,onClose:l,onCloseAnimationEnd:t,className:"error",title:xe(h)},h.hasErrorKey?(0,$e.ZP)(h):(0,ve.Z)(h.message,["emoji","br"]),a.ZP.createElement("div",null,a.ZP.createElement(L.Z,{isText:!0,onClick:l},c("OK")))))));function Z(e,t){return a.ZP.createElement("div",{className:"modal-header"},t&&a.ZP.createElement(ge.Z,{size:"small",photo:t}),a.ZP.createElement("div",{className:"modal-title"},(0,ve.Z)(e)),a.ZP.createElement(L.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:c("Close"),onClick:l},a.ZP.createElement("i",{className:"icon-close"})))}})));var Oe=n(6937);const Ge=(0,a.X$)((0,s.c$)((e=>(0,me.ei)(e,["notifications"])))((({notifications:e})=>{const{dismissNotification:t}=(0,s.uC)();if(e.length)return a.ZP.createElement("div",{id:"Notifications"},e.map((({message:e,localId:n})=>a.ZP.createElement(Oe.Z,{message:(0,ve.Z)(e,["emoji","br","links","simple_markdown"]),onDismiss:()=>t({localId:n})}))))})));var Je=n(1396),Xe=n(7551);const _e=(0,a.X$)((({url:e})=>{const{toggleSafeLinkModal:t}=(0,s.uC)(),n=(0,u.Z)(),r=(0,a.I4)((()=>{window.open((0,Je.X)(e)),t({url:void 0})}),[t,e]),o=(0,a.I4)((()=>{t({url:void 0})}),[t]),i=(0,Ie.Z)(e);return a.ZP.createElement(Xe.Z,{isOpen:Boolean(e),onClose:o,title:n("OpenUrlTitle"),textParts:(0,ve.Z)(n("OpenUrlAlert2",i),["links"]),confirmLabel:n("OpenUrlTitle"),confirmHandler:r})})),ze=2147483647e3,Ye=["lng_weekday1","lng_weekday2","lng_weekday3","lng_weekday4","lng_weekday5","lng_weekday6","lng_weekday7"];function He(e,t,n,a,s){const r=new Date(e,t,n),o=a&&(0,K.$Y)(a),i=s&&(0,K.$Y)(s);return!!(i&&r>i)||!!(o&&r{const Z=(0,u.Z)(),v=new Date,g=(0,a.Ye)((()=>s&&!t?new Date:new Date(Math.max(t||0,0))),[s,t]),p=(0,a.Ye)((()=>r&&!n?new Date:new Date(Math.min(n||ze,ze))),[r,n]),E=(0,a.Ye)((()=>e?new Date(e):new Date),[e]),C=(0,P.Z)(o),[f,b,I]=(0,De.Z)(!1),[y,N]=(0,a.eJ)(E),[S,w]=(0,a.eJ)(new Date(y.getFullYear(),y.getMonth(),1)),[k,M]=(0,a.eJ)(Ve(E.getHours())),[T,A]=(0,a.eJ)(Ve(E.getMinutes())),R=je(y.getFullYear(),y.getMonth(),y.getDate()),F=S.getFullYear(),B=S.getMonth();(0,a.d4)((()=>{!C&&o&&(N(E),w(new Date(E.getFullYear(),E.getMonth(),1)),i&&(M(Ve(E.getHours())),A(Ve(E.getMinutes()))))}),[E,o,C,i]),(0,a.d4)((()=>{s&&!f&&y.getTime(){r&&!f&&y.getTime()>p.getTime()&&(N(p),M(Ve(p.getHours())),A(Ve(p.getMinutes())))}),[s,r,f,p,g,y]),(0,a.d4)((()=>{if(e){const t=new Date(e);N(t),M(Ve(t.getHours())),A(Ve(t.getMinutes()))}}),[e]);const $=r&&F>=v.getFullYear()&&B>=v.getMonth()||p&&F>=p.getFullYear()&&B>=p.getMonth(),D=s&&F<=v.getFullYear()&&B<=v.getMonth(),{prevMonthGrid:x,currentMonthGrid:U,nextMonthGrid:O}=(0,a.Ye)((()=>function(e,t){const n=[],a=[],s=[],r=new Date;r.setDate(1),r.setMonth(t),r.setFullYear(e);const o=r.getDay(),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}}(F,B)),[B,F]),G=(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),23)),a=new Date(y.getTime());a.setHours(n),N(a);const s=Ve(n);M(s),e.target.value=s}),[y]),J=(0,a.I4)((e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return A(""),void(e.target.value="");const n=Math.max(0,Math.min(Number(t),59)),a=new Date(y.getTime());a.setMinutes(n),N(a);const s=Ve(n);A(s),e.target.value=s}),[y]);return a.ZP.createElement(ke.Z,{isOpen:o,onClose:d,className:"CalendarModal"},a.ZP.createElement("div",{className:"container"},a.ZP.createElement("div",{className:"month-selector"},a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:d},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h4",null,Z(`lng_month${B+1}`)," ",F),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",disabled:D,onClick:D?void 0:function(){w((e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t}))}},a.ZP.createElement("i",{className:"icon-previous"})),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",disabled:$,onClick:$?void 0:function(){w((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"},Ye.map((e=>a.ZP.createElement("div",{className:"day-button faded weekday"},a.ZP.createElement("span",null,Z(e))))),x.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))),U.map((e=>a.ZP.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void N((e=>{const n=new Date(e);return n.setDate(t),n.setMonth(B),n.setFullYear(F),n}));var t},className:(0,X.Z)("day-button",He(F,B,e,g,p)?"disabled":e?"clickable":"",R===je(F,B,e)&&"selected")},!!e&&a.ZP.createElement("span",null,e)))),O.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))))),i&&a.ZP.createElement("div",{className:"timepicker"},a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:k,onChange:G,onFocus:b,onBlur:I}),":",a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:T,onChange:J,onFocus:b,onBlur:I})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(L.Z,{onClick:function(){m(y)}},l||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)(e,t)):e("Conversation.ScheduleMessage.SendOn",[n,(0,K.mr)(e,t)])}(Z,y)),c&&a.ZP.createElement(L.Z,{onClick:h,isText:!0},c)))})),qe=(0,a.X$)((0,s.c$)((e=>({selectedAt:e.historyCalendarSelectedAt})))((({isOpen:e,selectedAt:t})=>{const{searchMessagesByDate:n,closeHistoryCalendar:r}=(0,s.uC)(),o=(0,a.I4)((e=>{n({timestamp:e.valueOf()/1e3}),r()}),[r,n]),i=(0,u.Z)();return a.ZP.createElement(Ke,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:i("JumpToDate"),onClose:r,onSubmit:o})}))),We=(0,a.X$)((0,s.c$)(((e,{message:t,isSchedule:n})=>{const{threadId:a}=(0,g.Bt)(e)||{},{canDeleteForAll:s}=a&&(0,g._k)(e,t,a)||{},r=(0,g.Z1)(e,t.chatId);return{canDeleteForAll:!n&&s,contactName:r&&(0,v.YC)(r.id)?(0,v.Vl)((0,g.dy)(e,(0,v.zX)(r))):void 0,willDeleteForCurrentUserOnly:r&&(0,v.G9)(r)&&!s,willDeleteForAll:r&&(0,v.ZV)(r)}}))((({isOpen:e,isSchedule:t,message:n,album:r,canDeleteForAll:o,contactName:i,willDeleteForCurrentUserOnly:l,willDeleteForAll:c,onClose:d})=>{const{deleteMessages:m,deleteScheduledMessages:h}=(0,s.uC)(),Z=(0,a.I4)((()=>{const e=null!=r&&r.messages?r.messages.map((({id:e})=>e)):[n.id];m({messageIds:e,shouldDeleteForAll:!0}),d()}),[m,n.id,d,r]),P=(0,a.I4)((()=>{const e=null!=r&&r.messages?r.messages.map((({id:e})=>e)):[n.id];t?h({messageIds:e}):m({messageIds:e,shouldDeleteForAll:!1}),d()}),[r,n.id,t,d,h,m]),v=(0,u.Z)();return a.ZP.createElement(ke.Z,{isOpen:e,onClose:d,onEnter:e&&!o?P:void 0,className:"delete",title:v("DeleteSingleMessagesTitle")},a.ZP.createElement("p",null,v("AreYouSureDeleteSingleMessage")),l&&a.ZP.createElement("p",null,v("lng_delete_for_me_chat_hint",1,"i")),c&&a.ZP.createElement("p",null,v("lng_delete_for_everyone_hint",1,"i")),o&&a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:Z},i&&(0,ve.Z)(v("Conversation.DeleteMessagesFor",i)),!i&&v("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:P},v(o?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:d},v("Cancel")))}))),Qe=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.YC)(t),a=(0,g.FM)(e,t),s=(0,g.Z1)(e,t),r=!!s&&(0,v.eA)(s),o=!!s&&(0,v.G9)(s),i=!!s&&(0,v.ZV)(s);return{isPrivateChat:n,isChatWithSelf:a,isChannel:r,isGroup:o,isSuperGroup:i,canPinForAll:n&&!a||i||o,contactName:s&&(0,v.YC)(s.id)?(0,v.Vl)((0,g.dy)(e,(0,v.zX)(s))):void 0}}))((({isOpen:e,messageId:t,chatId:n,isChannel:r,isGroup:o,isSuperGroup:i,canPinForAll:l,contactName:c,onClose:d})=>{const{pinMessage:m}=(0,s.uC)(),h=(0,a.I4)((()=>{m({chatId:n,messageId:t,isUnpin:!1}),d()}),[m,n,t,d]),Z=(0,a.I4)((()=>{m({chatId:n,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),d()}),[n,t,d,m]),P=(0,u.Z)();return a.ZP.createElement(ke.Z,{isOpen:e,onClose:d,className:"pin",title:P("PinMessageAlertTitle")},a.ZP.createElement("p",null,P(r?"PinMessageAlertChannel":o||i?"PinMessageAlert":"PinMessageAlertChat")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:Z},P("DialogPin")),l&&a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:h},c?(0,ve.Z)(P("Conversation.PinMessagesFor",c)):P("Conversation.PinMessageAlert.PinAndNotifyMembers")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:d},P("Cancel")))}))),et=(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(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:s},r("DialogUnpin")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:n},r("Cancel")))}));var tt=n(517);const nt=(0,a.X$)((0,s.c$)(((e,{isSchedule:t})=>{const{messageIds:n}=e.selectedMessages||{},{canDeleteForAll:a}=(0,g.xl)(e),s=(0,g.jr)(e);return{selectedMessageIds:n,canDeleteForAll:!t&&a,contactName:s&&(0,v.YC)(s.id)?(0,v.Vl)((0,g.dy)(e,(0,v.zX)(s))):void 0,willDeleteForCurrentUserOnly:s&&(0,v.G9)(s)&&!a,willDeleteForAll:s&&(0,v.ZV)(s)}}))((({isOpen:e,isSchedule:t,selectedMessageIds:n,canDeleteForAll:r,contactName:o,willDeleteForCurrentUserOnly:i,willDeleteForAll:l,onClose:c})=>{const{deleteMessages:d,deleteScheduledMessages:m,exitMessageSelectMode:h}=(0,s.uC)(),Z=(0,P.Z)(e),v=(0,a.I4)((()=>{c(),d({messageIds:n,shouldDeleteForAll:!0})}),[d,n,c]),g=(0,a.I4)((()=>{t?m({messageIds:n}):d({messageIds:n,shouldDeleteForAll:!1}),c()}),[t,c,m,n,d]),p=(0,u.Z)();if((0,a.d4)((()=>{!e&&Z&&h()}),[h,e,Z]),n)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:c,onEnter:r?void 0:g,className:"delete",title:p("Conversation.DeleteManyMessages")},a.ZP.createElement("p",null,p("AreYouSureDeleteFewMessages")),i&&a.ZP.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&a.ZP.createElement("p",null,"This will delete them for everyone in this chat."),r&&a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:v},o?(0,ve.Z)(p("ChatList.DeleteForEveryone",o)):p("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:g},p(r?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},p("Cancel")))})));var at=n(4434);const st=(0,a.X$)((({isOpen:e,messageIds:t,onClose:n})=>{const{reportMessages:r,exitMessageSelectMode:o}=(0,s.uC)(),[i,l]=(0,a.eJ)("spam"),[c,d]=(0,a.eJ)(""),m=()=>{r({messageIds:t,reason:i,description:c}),o(),n()},h=(0,a.I4)((e=>{l(e)}),[]),Z=(0,a.I4)((e=>{d(e.target.value)}),[]),P=(0,u.Z)(),v=[{value:"spam",label:P("lng_report_reason_spam")},{value:"violence",label:P("lng_report_reason_violence")},{value:"pornography",label:P("lng_report_reason_pornography")},{value:"childAbuse",label:P("lng_report_reason_child_abuse")},{value:"copyright",label:P("ReportPeer.ReasonCopyright")},{value:"other",label:P("lng_report_reason_other")}];if(t)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:n,onEnter:e?m:void 0,className:"report",title:P("lng_report_message_title")},a.ZP.createElement(at.Z,{name:"report-message",options:v,onChange:h,selected:i}),a.ZP.createElement(Me.Z,{label:P("lng_report_reason_description"),value:c,onChange:Z}),a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:m},P("lng_report_button")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:n},P("Cancel")))})),rt=(0,a.X$)((0,s.c$)((e=>{const{type:t,chatId:n}=(0,g.Bt)(e)||{},{canDelete:a}=(0,g.xl)(e),s=(0,g.nB)(e),r=(0,g.Nu)(e),{messageIds:o}=e.selectedMessages||{},i=!!n&&(0,g.ku)(e,n,o);return{isSchedule:"scheduled"===t,selectedMessagesCount:(0,g.D7)(e),canDeleteMessages:a,canReportMessages:s,canDownloadMessages:r,selectedMessageIds:o,hasProtectedMessage:i}}))((({canPost:e,isActive:t,messageListType:n,isSchedule:r,selectedMessagesCount:o,canDeleteMessages:i,canReportMessages:l,canDownloadMessages:c,hasProtectedMessage:d,selectedMessageIds:m})=>{const{exitMessageSelectMode:h,openForwardMenuForSelectedMessages:Z,downloadSelectedMessages:v}=(0,s.uC)(),[g,p,E]=(0,De.Z)(),[C,f,b]=(0,De.Z)();(0,a.d4)((()=>!t||g||C?void 0:(0,tt.Z)({onBackspace:p,onDelete:p,onEsc:h})),[t,g,C,p,h]);const I=(0,a.I4)((()=>{v(),h()}),[v,h]),y=(0,P.Z)(o||void 0,!0),N=t?o:y,S=(0,u.Z)(),w=S("VoiceOver.Chat.MessagesSelected",N,"i"),k=(0,X.Z)("MessageSelectToolbar",e&&"with-composer",t&&"shown"),M=(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:k},a.ZP.createElement("div",{className:"MessageSelectToolbar-inner"},a.ZP.createElement(L.Z,{color:"translucent",round:!0,onClick:h,ariaLabel:"Exit select mode"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("span",{className:"MessageSelectToolbar-count",title:w},w),!!o&&a.ZP.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==n&&M("forward",S("Chat.ForwardActionHeader"),Z,d),l&&M("flag",S("Conversation.ReportMessages"),f),c&&M("download",S("lng_media_download"),I,d),M("delete",S("EditAdminGroupDeleteMessages"),p,!i,!0))),a.ZP.createElement(nt,{isOpen:g,isSchedule:r,onClose:E}),a.ZP.createElement(st,{isOpen:C,onClose:b,messageIds:m}))}))),ot=(0,a.X$)((0,s.c$)((e=>{var t;const{chatId:n,messageId:a}=e.seenByModal||{};return n&&a?{memberIds:null===(t=(0,g.hj)(e,n,a))||void 0===t?void 0:t.seenByUserIds}:{}}))((({isOpen:e,memberIds:t})=>{const{openChat:n,closeSeenByModal:r}=(0,s.uC)(),o=(0,u.Z)(),i=(0,a.I4)((e=>{r(),setTimeout((()=>{n({id:e})}),100)}),[r,n]),l=(0,Ie.Z)(t,!0);return a.ZP.createElement(ke.Z,{isOpen:e,onClose:r,className:"narrow",title:"Which users read the message"},a.ZP.createElement("div",{dir:o.isRtl?"rtl":void 0},l&&l.map((e=>a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable scroll-item small-icon",onClick:()=>i(e)},a.ZP.createElement(Re.Z,{userId:e,noStatusOrTyping:!0}))))),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},o("Close")))})));var it=n(2155),lt=n(8198);const ct=(0,a.X$)((0,s.c$)((e=>{const{chatId:t,messageId:n}=e.reactorModal||{},a=t&&n?(0,g.hj)(e,t,n):void 0;return{chatId:t,messageId:n,reactions:null==a?void 0:a.reactions,reactors:null==a?void 0:a.reactors,seenByUserIds:null==a?void 0:a.seenByUserIds}}))((({isOpen:e,reactors:t,reactions:n,chatId:r,messageId:i,seenByUserIds:l})=>{const{loadReactors:c,closeReactorListModal:d,openChat:m}=(0,s.uC)(),h=(0,s.Rd)().users.byId,Z=(0,u.Z)(),[P,g,p]=(0,De.Z)(!1),[E,C]=(0,a.eJ)(void 0),f=t&&n&&t.count>=10&&n.results.length>1,b=(0,a.sO)();(0,a.d4)((()=>{P&&!e&&(p(),C(void 0))}),[P,e,p]);const I=(0,a.I4)((()=>{b.current&&m({id:b.current}),d()}),[d,m]),y=(0,a.I4)((()=>{g()}),[g]),N=(0,a.I4)((e=>{b.current=e,y()}),[y]),S=(0,a.I4)((()=>{c({chatId:r,messageId:i})}),[r,c,i]),w=(0,a.Ye)((()=>null!=t&&t.reactions?(0,me.Tw)(t.reactions.map((e=>e.reaction))):[]),[null==t?void 0:t.reactions]),k=(0,a.Ye)((()=>E?null==t?void 0:t.reactions.filter((e=>e.reaction===E)).map((e=>e.userId)):(0,me.Tw)((null==t?void 0:t.reactions.map((e=>e.userId)).concat(l||[]))||[])),[E,null==t?void 0:t.reactions,l]),[M,T]=(0,ye.Z)(S,k,t&&void 0===t.nextOffset);return(0,a.d4)((()=>{null==T||T({direction:o.Uq.Backwards})}),[T]),a.ZP.createElement(ke.Z,{isOpen:e&&!P,onClose:y,className:"ReactorListModal narrow",title:Z("Reactions"),onCloseAnimationEnd:I},f&&a.ZP.createElement("div",{className:"Reactions"},a.ZP.createElement(L.Z,{className:(0,X.Z)(!E&&"chosen"),size:"tiny",ripple:!0,onClick:()=>C(void 0)},a.ZP.createElement("i",{className:"icon-reaction-filled"}),(null==t?void 0:t.count)&&(0,it.bi)(t.count)),w.map((e=>{var t;const s=null==n||null===(t=n.results.find((t=>t.reaction===e)))||void 0===t?void 0:t.count;return a.ZP.createElement(L.Z,{className:(0,X.Z)(E===e&&"chosen"),size:"tiny",ripple:!0,onClick:()=>C(e)},a.ZP.createElement(lt.Z,{reaction:e,className:"reaction-filter-emoji"}),s&&(0,it.bi)(s))}))),a.ZP.createElement("div",{dir:Z.isRtl?"rtl":void 0},null!=M&&M.length?a.ZP.createElement(Te.Z,{className:"reactor-list custom-scroll",items:M,onLoadMore:T},null==M?void 0:M.map((e=>{var n;const s=h[e],r=(0,v.Js)(s),o=null==t||null===(n=t.reactions.find((t=>t.userId===e)))||void 0===n?void 0:n.reaction;return a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable reactors-list-item",onClick:()=>N(e)},a.ZP.createElement(ge.Z,{user:s,size:"medium"}),a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},r&&(0,ve.Z)(r))),o&&a.ZP.createElement(lt.Z,{className:"reactors-list-emoji",reaction:o}))}))):a.ZP.createElement(we.Z,null)),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:d},Z("Close")))})));var dt=n(7324),mt=n(7799);const ut=1.125*I.Gw,ht=(0,a.X$)((0,s.c$)(((e,{emojiInteraction:t})=>{const n=void 0!==t.animatedEffect&&(0,g.tH)(e,t.animatedEffect);return{effectAnimationId:n?n.id:void 0,localEffectAnimation:!n&&t.animatedEffect&&Object.keys(dt.x).includes(t.animatedEffect)?t.animatedEffect:void 0,isReversed:t.isReversed}}))((({emojiInteraction:e,effectAnimationId:t,localEffectAnimation:n,isReversed:o})=>{const{stopActiveEmojiInteraction:i}=(0,s.uC)(),[l,c]=(0,De.Z)(!1),[d,m]=(0,De.Z)(!1),u=(0,a.I4)((()=>{c(),setTimeout((()=>{i()}),250)}),[c,i]);(0,a.d4)((()=>(document.addEventListener("touchstart",u),document.addEventListener("touchmove",u),document.addEventListener("mousedown",u),document.addEventListener("wheel",u),()=>{document.removeEventListener("touchstart",u),document.removeEventListener("touchmove",u),document.removeEventListener("mousedown",u),document.removeEventListener("wheel",u)})),[u]),(0,a.d4)((()=>{setTimeout(u,3e3)}),[u]);const Z=(0,h.Z)(`sticker${t}`,!t,r.IU.Lottie),[P,v]=(0,a.eJ)();(0,a.d4)((()=>{n&&(0,dt.Z)(n).then((e=>{v(e)}))}),[n]);const g=(e.startSize||0)/240,p=ut/240;return a.ZP.createElement("div",{className:(0,X.Z)("EmojiInteractionAnimation",l&&"hiding",d&&"playing",o&&"reversed"),style:`--end-scale: ${p}; --scale: ${g}; --start-x: ${e.x}px;--start-y: ${e.y}px;${e.endX&&e.endY?`--end-x: ${e.endX}px; --end-y: ${e.endY}px;`:""}`},a.ZP.createElement(mt.Z,{id:`effect_${t}`,size:240,animationData:P||Z,play:d,noLoop:!0,onLoad:m}))})));var Zt=n(3133),Pt=n(735),vt=n(1470);const gt=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 pt=n(329),Et=n(742);const Ct=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t),a=n&&(0,v.zX)(n);return{chat:n,user:a?(0,g.dy)(e,a):void 0,isPinned:(0,g.ep)(e,t),isMuted:n?(0,v.i4)(n,(0,g.dZ)(e),(0,g.NJ)(e)):void 0}}))((({chatId:e,chat:t,user:n,isPinned:s,isMuted:r,withUsername:o,onClick:i})=>{const[l,c,d]=(0,De.Z)(),[m,u,h]=(0,De.Z)(),Z=(0,vt.Z)({chat:t,user:n,isPinned:s,isMuted:r,handleDelete:c,handleChatFolderChange:u},!0),P=()=>{i(e)},g=gt(P);if(t)return a.ZP.createElement(Le.Z,{className:"chat-item-clickable search-result",onClick:P,contextActions:Z,buttonRef:g},(0,v.YC)(e)?a.ZP.createElement(Re.Z,{userId:e,withUsername:o,avatarSize:"large"}):a.ZP.createElement(Ae.Z,{chatId:e,withUsername:o,avatarSize:"large"}),a.ZP.createElement(pt.Z,{isOpen:l,onClose:d,chat:t}),a.ZP.createElement(Et.Z,{isOpen:m,onClose:h,chatId:e}))})));var ft=n(8781);const bt=(0,G.P2)((e=>e()),6e4,!0),It=(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}}))((({topUserIds:e,usersById:t,recentlyFoundChatIds:n,onReset:r})=>{const{loadTopUsers:o,loadContactList:i,openChat:l,addRecentlyFoundChatId:c,clearRecentlyFoundChats:d}=(0,s.uC)(),m=(0,a.sO)(null);(0,a.d4)((()=>{bt((()=>{o(),i()}))}),[o,i]),(0,ft.Z)(m.current,!e);const h=(0,a.I4)((e=>{l({id:e,shouldReplaceHistory:!0}),r(),setTimeout((()=>{c({id:e})}),250)}),[l,c,r]),Z=(0,u.Z)();return a.ZP.createElement("div",{className:"RecentContacts custom-scroll"},e&&a.ZP.createElement("div",{className:"top-peers-section",dir:Z.isRtl?"rtl":void 0},a.ZP.createElement("div",{ref:m,className:"top-peers no-selection"},e.map((e=>a.ZP.createElement("div",{className:"top-peer-item",onClick:()=>h(e),dir:Z.isRtl?"rtl":void 0},a.ZP.createElement(ge.Z,{user:t[e]}),a.ZP.createElement("div",{className:"top-peer-name"},(0,ve.Z)((0,v.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:Z.isRtl?"rtl":void 0},Z("Recent"),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:d,isRtl:Z.isRtl},a.ZP.createElement("i",{className:"icon-close"}))),n.map((e=>a.ZP.createElement(Ct,{chatId:e,onClick:h})))))})));var yt=n(9411),Nt=n(8033);const St=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t);if(!n)return{};const a=(0,v.zX)(n);return{chat:n,lastSyncTime:e.lastSyncTime,...a&&{privateChatUser:(0,g.dy)(e,a)}}}))((({message:e,searchQuery:t,chatId:n,chat:r,privateChatUser:o,lastSyncTime:i})=>{const{focusMessage:l}=(0,s.uC)(),c=(0,v.DH)(e),d=(0,h.Z)((0,v.Ti)(e,"micro")),m=Boolean((0,v.Y5)(e)),Z=(0,a.I4)((()=>{l({chatId:n,messageId:e.id})}),[n,l,e.id]),P=(0,u.Z)(),g=gt(Z);if(r)return a.ZP.createElement(Le.Z,{className:"ChatMessage chat-item-clickable",ripple:!f.wB,onClick:Z,buttonRef:g},a.ZP.createElement(ge.Z,{chat:r,user:o,isSavedMessages:null==o?void 0:o.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,ve.Z)((0,v.U)(P,r,o))),r.isVerified&&a.ZP.createElement(yt.Z,null)),a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(Nt.Z,{className:"date"},(0,K.VX)(P,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,v.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,ve.Z)((0,v.MK)(e,t,!0),["emoji","highlight"],{highlight:s})):(0,ve.Z)((0,v.MK)(e,t))}(P,e,d||c,t,m)))))}))),wt=(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 kt=n(7262),Mt=n(9187);const Tt=(0,G.P2)((e=>e()),500,!0),Lt=(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}}))((({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:g,lastSyncTime:p,onReset:E,onSearchDateSelect:C})=>{const{openChat:b,addRecentlyFoundChatId:I,searchMessagesGlobal:y,setGlobalSearchChatId:N}=(0,s.uC)(),S=(0,u.Z)(),[w,k]=(0,a.eJ)(!1),[M,T]=(0,a.eJ)(!1),L=(0,a.I4)((({direction:t})=>{p&&t===o.Uq.Backwards&&Tt((()=>{y({type:"text",query:e})}))}),[p,y,e]),A=(0,a.I4)((e=>{b({id:e,shouldReplaceHistory:!0}),e!==r&&I({id:e}),f.wB||E()}),[r,b,I,E]),R=(0,a.I4)((e=>{N({id:e})}),[N]),F=(0,a.Ye)((()=>{if(!e||e.startsWith("@")&&e.length<2)return Pt.D;const t=[...r?[r]:[],...i||[]],n=(0,s.Rd)().users.byId,a=(0,v.kK)(t,n,e,r,S("SavedMessages"));return[...(0,v.ih)((0,me.Tw)([...a||[],...l||[],...c||[]]),P,void 0,r?[r]:void 0)]}),[e,r,i,S,l,c,P]),B=(0,a.Ye)((()=>!e||e.length<4||!d||!m?Pt.D:(0,v.ih)((0,me.Tw)([...d,...m]),P,!0)),[P,d,m,e]),$=(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)):Pt.D),[h,Z,e,t]),D=(0,a.I4)((()=>{k(!w)}),[w]),x=(0,a.I4)((()=>{T(!M)}),[M]),U=g&&!g.chats&&!g.messages&&!F.length&&!B.length&&!$.length;return e||t?a.ZP.createElement(Te.Z,{className:"LeftSearch custom-scroll",items:$,onLoadMore:L,noScrollRestoreOnTop:!0,noFastList:!0},n&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar"},a.ZP.createElement(wt,{searchDate:n,onSelect:C})),U&&a.ZP.createElement(kt.Z,{text:S("ChatList.Search.NoResults"),description:S("ChatList.Search.NoResultsDescription")}),!!F.length&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:S.isRtl?"rtl":void 0},F.map((e=>a.ZP.createElement(Mt.Z,{chatOrUserId:e,onClick:R,clickArg:e})))),!!F.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:S.isRtl?"auto":void 0},F.length>5&&a.ZP.createElement(Nt.Z,{onClick:D},S(w?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),S("DialogList.SearchSectionDialogs")),F.map(((e,t)=>{if(w||!(t>=5))return a.ZP.createElement(Ct,{chatId:e,onClick:A})}))),!!B.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:S.isRtl?"auto":void 0},B.length>5&&a.ZP.createElement(Nt.Z,{onClick:x},S(M?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),S("DialogList.SearchSectionGlobal")),B.map(((e,t)=>{if(M||!(t>=5))return a.ZP.createElement(Ct,{chatId:e,withUsername:!0,onClick:A})}))),!!$.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:S.isRtl?"auto":void 0},S("SearchMessages")),$.map((function(t){const n=(0,v.MK)(S,t),s=P[t.chatId];if(n&&s)return a.ZP.createElement(St,{chatId:t.chatId,message:t,searchQuery:e})})))):a.ZP.createElement(It,{onReset:E})}))),At=(0,G.P2)((e=>e()),500,!0),Rt=(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}}))((({searchQuery:e,currentUserId:t,dateSearchQuery:n,foundIds:r,globalMessagesByChatId:i,chatsById:l,fetchingStatus:c,lastSyncTime:d,onSearchDateSelect:m})=>{const{searchMessagesGlobal:h}=(0,s.uC)(),Z=(0,u.Z)(),P=(0,a.I4)((({direction:n})=>{d&&n===o.Uq.Backwards&&At((()=>{h({type:"text",query:e,chatId:t})}))}),[t,d,h,e]),g=(0,a.Ye)((()=>r&&0!==r.length?r.map((e=>{var t;const[n,a]=e.split("_");return null==i||null===(t=i[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean).sort(((e,t)=>t.date-e.date)):Pt.D),[r,i]),p=c&&!c.chats&&!c.messages&&!g.length;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:"search-content custom-scroll chat-list",items:g,onLoadMore:P,noFastList:!0},n&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar"},a.ZP.createElement(wt,{searchDate:n,onSelect:m})),p&&a.ZP.createElement(kt.Z,{text:Z("ChatList.Search.NoResults"),description:Z("ChatList.Search.NoResultsDescription")}),!!g.length&&g.map((function(t){const n=(0,v.MK)(Z,t),s=l[t.chatId];if(n&&s)return a.ZP.createElement(St,{chatId:t.chatId,message:t,searchQuery:e})}))))})));function Ft(e){return(t,n)=>{var a,s;const{byId:r}=t.chats,{byId:o}=t.users,{fetchingStatus:i,resultsByType:l,chatId:c}=t.globalSearch,d="audio"!==e?e:null!=n&&n.isVoice?"voice":"audio",{byChatId:m}=t.messages,u=null==l||null===(a=l[d])||void 0===a?void 0:a.foundIds,h=t.activeDownloads.byChatId;return{theme:(0,g.Pu)(t),isLoading:void 0===u||!!i&&Boolean(i.chats||i.messages),chatsById:r,usersById:o,globalMessagesByChatId:m,foundIds:u,searchChatId:c,activeDownloads:h,isChatProtected:c?null===(s=(0,g.Z1)(t,c))||void 0===s?void 0:s.isProtected:void 0,lastSyncTime:t.lastSyncTime}}}var Bt=n(7891),$t=n(3709);const Dt="media",xt=(0,G.P2)((e=>e()),500,!0),Ut=(0,a.X$)((0,s.c$)(Ft(Dt))((({searchQuery:e,searchChatId:t,isLoading:n,globalMessagesByChatId:r,foundIds:l,lastSyncTime:c,isChatProtected:d})=>{const{searchMessagesGlobal:m,openMediaViewer:h}=(0,s.uC)(),Z=(0,u.Z)(),P=(0,a.I4)((({direction:n})=>{c&&n===o.Uq.Backwards&&xt((()=>{m({type:Dt,query:e,chatId:t})}))}),[c,m,e,t]),v=(0,a.Ye)((()=>l&&r?l.map((e=>{var t;const[n,a]=e.split("_");return null===(t=r[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):Pt.D),[r,l]),g=(0,a.I4)(((e,t)=>{h({chatId:t,messageId:e,origin:o.bZ.SearchResult})}),[h]),p=(0,Bt.Z)([e],i.Y)&&!n,E=p&&l&&l.length>0&&!e,C=p&&l&&l.length>0&&e,f=(0,X.Z)("search-content custom-scroll",C&&"chat-list");return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:f,items:v,itemSelector:e?".ListItem":".Media",onLoadMore:P,noFastList:!0},!p&&a.ZP.createElement(we.Z,null),p&&(!l||0===l.length)&&a.ZP.createElement(kt.Z,{text:Z("ChatList.Search.NoResults"),description:Z("ChatList.Search.NoResultsDescription")}),E&&a.ZP.createElement("div",{className:"media-list",dir:Z.isRtl?"rtl":void 0},v.map((e=>a.ZP.createElement($t.Z,{key:e.id,idPrefix:"search-media",message:e,isProtected:d||e.isProtected,onClick:g})))),C&&v.map((e=>a.ZP.createElement(St,{key:e.id,chatId:e.chatId,message:e})))))})));var Ot=n(91),Gt=n(5418);const Jt="links",Xt=(0,G.P2)((e=>e()),500,!0),_t=(0,a.X$)((0,s.c$)(Ft(Jt))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:r,usersById:l,globalMessagesByChatId:c,foundIds:d,lastSyncTime:m,isChatProtected:h})=>{const{searchMessagesGlobal:Z,focusMessage:P}=(0,s.uC)(),v=(0,u.Z)(),g=(0,a.I4)((({direction:n})=>{m&&n===o.Uq.Backwards&&Xt((()=>{Z({type:Jt,query:e,chatId:t})}))}),[m,Z,e,t]),p=(0,a.Ye)((()=>d&&c?d.map((e=>{var t;const[n,a]=e.split("_");return null===(t=c[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):Pt.D),[c,d]),E=(0,a.I4)(((e,t)=>{P({chatId:t,messageId:e})}),[P]),C=(0,Bt.Z)([e],i.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:g,noFastList:!0},!C&&a.ZP.createElement(we.Z,null),C&&(!d||0===d.length)&&a.ZP.createElement(kt.Z,{text:v("ChatList.Search.NoResults"),description:v("ChatList.Search.NoResultsDescription")}),C&&d&&d.length>0&&p.map(((e,t)=>{const n=0===t||(0,K.kj)(e.date)!==(0,K.kj)(p[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",dir:v.isRtl?"rtl":void 0,key:e.id},n&&a.ZP.createElement("p",{className:"section-heading",dir:v.isRtl?"rtl":void 0},(0,K.np)(v,new Date(1e3*e.date))),a.ZP.createElement(Gt.Z,{key:e.id,message:e,senderTitle:(0,Ot.F)(v,e,r,l),isProtected:h||e.isProtected,onMessageClick:E}))}))))})));var zt=n(2535);const Yt="documents",Ht=(0,G.P2)((e=>e()),500,!0),Vt=(0,a.X$)((0,s.c$)(Ft(Yt))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:r,usersById:l,globalMessagesByChatId:c,foundIds:d,activeDownloads:m,lastSyncTime:h})=>{const{searchMessagesGlobal:Z,focusMessage:P}=(0,s.uC)(),g=(0,u.Z)(),p=(0,a.I4)((({direction:n})=>{h&&n===o.Uq.Backwards&&Ht((()=>{Z({type:Yt,query:e,chatId:t})}))}),[h,Z,e,t]),E=(0,a.Ye)((()=>d&&c?d.map((e=>{var t;const[n,a]=e.split("_"),s=null===(t=c[n])||void 0===t?void 0:t.byId[Number(a)];return s&&(0,v.aE)(s)?s:void 0})).filter(Boolean):Pt.D),[c,d]),C=(0,a.I4)(((e,t)=>{P({chatId:t,messageId:e})}),[P]),f=(0,Bt.Z)([e],i.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:"search-content documents-list custom-scroll",items:E,onLoadMore:p,noFastList:!0},!f&&a.ZP.createElement(we.Z,null),f&&(!d||0===d.length)&&a.ZP.createElement(kt.Z,{text:g("ChatList.Search.NoResults"),description:g("ChatList.Search.NoResultsDescription")}),f&&d&&d.length>0&&E.map(((e,t)=>{var n;const s=0===t||(0,K.kj)(e.date)!==(0,K.kj)(E[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:e.id},s&&a.ZP.createElement("p",{className:"section-heading"},(0,K.np)(g,new Date(1e3*e.date))),a.ZP.createElement(zt.Z,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:(0,Ot.F)(g,e,r,l),className:"scroll-item",onDateClick:C,isDownloading:null===(n=m[e.chatId])||void 0===n?void 0:n.includes(e.id)}))}))))})));var jt=n(4752);const Kt=(0,G.P2)((e=>e()),500,!0),qt=(0,a.X$)((0,s.c$)(Ft("audio"))((({theme:e,isVoice:t,searchQuery:n,searchChatId:r,isLoading:l,chatsById:c,usersById:d,globalMessagesByChatId:m,foundIds:h,lastSyncTime:Z,activeDownloads:P})=>{const{searchMessagesGlobal:v,focusMessage:g,openAudioPlayer:p}=(0,s.uC)(),E=(0,u.Z)(),C=t?"voice":"audio",f=(0,a.I4)((({direction:e})=>{Z&&e===o.Uq.Backwards&&Kt((()=>{v({type:C,query:n,chatId:r})}))}),[C,Z,v,n,r]),b=(0,a.Ye)((()=>h&&m?h.map((e=>{var t;const[n,a]=e.split("_");return null===(t=m[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):Pt.D),[m,h]),I=(0,a.I4)(((e,t)=>{g({chatId:t,messageId:e})}),[g]),y=(0,a.I4)(((e,t)=>{p({chatId:t,messageId:e})}),[p]),N=(0,Bt.Z)([n],i.Y)&&!l;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:"search-content documents-list custom-scroll",items:b,onLoadMore:f,noFastList:!0},!N&&a.ZP.createElement(we.Z,null),N&&(!h||0===h.length)&&a.ZP.createElement(kt.Z,{text:E("ChatList.Search.NoResults"),description:E("ChatList.Search.NoResultsDescription")}),N&&h&&h.length>0&&b.map(((t,n)=>{var s;const r=0===n||(0,K.kj)(t.date)!==(0,K.kj)(b[n-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:t.id},r&&a.ZP.createElement("p",{className:"section-heading",dir:E.isRtl?"rtl":void 0},(0,K.np)(E,new Date(1e3*t.date))),a.ZP.createElement(jt.Z,{key:t.id,theme:e,message:t,origin:o.Cr.Search,senderTitle:(0,Ot.F)(E,t,c,d),date:t.date,lastSyncTime:Z,className:"scroll-item",onPlay:y,onDateClick:I,isDownloading:null===(s=P[t.chatId])||void 0===s?void 0:s.includes(t.id)}))}))))}))),Wt=[{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"}],Qt=[{type:o.nJ.ChatList,title:"All Messages"},...Wt.slice(1)],en=Object.keys(o.nJ).length/2,tn=(0,a.X$)((0,s.c$)((e=>{const{currentContent:t,chatId:n}=e.globalSearch;return{currentContent:t,chatId:n}}))((({searchQuery:e,searchDate:t,isActive:n,currentContent:r=o.nJ.ChatList,chatId:i,onReset:l})=>{const{setGlobalSearchContent:c,setGlobalSearchDate:d}=(0,s.uC)(),h=(0,u.Z)(),[Z,P]=(0,a.eJ)(r),v=(0,a.Ye)((()=>(0,K.xk)(e)),[e]),g=(0,a.I4)((e=>{const t=Wt[e];c({content:t.type}),P(e)}),[c]),p=(0,a.I4)((e=>{d({date:e.getTime()/1e3})}),[d]);(0,m.ZP)(n,l,void 0,void 0,!0);const E=(0,a.sO)(null),C=(0,Ne.Z)(E,n,void 0,".ListItem-button",!0);return a.ZP.createElement("div",{className:"LeftSearch",ref:E,onKeyDown:C},a.ZP.createElement(Zt.Z,{activeTab:Z,tabs:i?Qt:Wt,onSwitchTab:g}),a.ZP.createElement(R.Z,{name:h.isRtl?"slide-optimized-rtl":"slide-optimized",renderCount:en,activeKey:r},(()=>{switch(r){case o.nJ.ChatList:return i?a.ZP.createElement(Rt,{searchQuery:e,dateSearchQuery:v,onReset:l,onSearchDateSelect:p}):a.ZP.createElement(Lt,{searchQuery:e,searchDate:t,dateSearchQuery:v,onReset:l,onSearchDateSelect:p});case o.nJ.Media:return a.ZP.createElement(Ut,{searchQuery:e});case o.nJ.Links:return a.ZP.createElement(_t,{searchQuery:e});case o.nJ.Files:return a.ZP.createElement(Vt,{searchQuery:e});case o.nJ.Music:return a.ZP.createElement(qt,{key:"audio",searchQuery:e});case o.nJ.Voice:return a.ZP.createElement(qt,{key:"voice",isVoice:!0,searchQuery:e});default:return}})))})));var nn=n(1090);const an={currentPassword:"",password:"",hint:"",email:""},sn=(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 an;default:return e}},rn=(0,a.X$)((({currentScreen:e,editedFolderId:t,onReset:n,onSaveFilter:r,onScreenSelect:i})=>{const{signOut:l,deleteChatFolder:c}=(0,s.uC)(),[d,m]=(0,a.eJ)(!1),[h,Z]=(0,a.eJ)(!1),P=(0,a.I4)((()=>{m(!0)}),[]),v=(0,a.I4)((()=>{m(!1)}),[]),g=(0,a.I4)((()=>{Z(!0)}),[]),p=(0,a.I4)((()=>{Z(!1)}),[]),E=(0,a.I4)((()=>{v(),l()}),[v,l]),C=(0,a.I4)((()=>{p(),c({id:t}),n()}),[t,p,c,n]),b=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(L.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"}))),[]),I=(0,u.Z)();return a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:n,ariaLabel:I("AccDescrGoBack")},a.ZP.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case o.MT.EditProfile:return a.ZP.createElement("h3",null,I("lng_settings_information"));case o.MT.General:return a.ZP.createElement("h3",null,I("General"));case o.MT.QuickReaction:return a.ZP.createElement("h3",null,I("DoubleTapSetting"));case o.MT.Notifications:return a.ZP.createElement("h3",null,I("Notifications"));case o.MT.DataStorage:return a.ZP.createElement("h3",null,I("DataSettings"));case o.MT.Privacy:return a.ZP.createElement("h3",null,I("PrivacySettings"));case o.MT.Language:return a.ZP.createElement("h3",null,I("Language"));case o.MT.GeneralChatBackground:return a.ZP.createElement("h3",null,I("ChatBackground"));case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement("h3",null,I("SetColor"));case o.MT.PrivacyPhoneNumber:return a.ZP.createElement("h3",null,I("PrivacyPhone"));case o.MT.PrivacyLastSeen:return a.ZP.createElement("h3",null,I("PrivacyLastSeen"));case o.MT.PrivacyProfilePhoto:return a.ZP.createElement("h3",null,I("Privacy.ProfilePhoto"));case o.MT.PrivacyForwarding:return a.ZP.createElement("h3",null,I("PrivacyForwards"));case o.MT.PrivacyGroupChats:return a.ZP.createElement("h3",null,I("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,I("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,I("NeverShareWith"));case o.MT.PrivacyActiveSessions:return a.ZP.createElement("h3",null,I("SessionsTitle"));case o.MT.PrivacyBlockedUsers:return a.ZP.createElement("h3",null,I("BlockedUsers"));case o.MT.TwoFaDisabled:case o.MT.TwoFaEnabled:return a.ZP.createElement("h3",null,I("TwoStepVerification"));case o.MT.TwoFaNewPassword:case o.MT.TwoFaChangePasswordNew:case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement("h3",null,I("PleaseEnterCurrentPassword"));case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement("h3",null,I("PleaseReEnterPassword"));case o.MT.TwoFaNewPasswordHint:case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement("h3",null,I("PasswordHint"));case o.MT.TwoFaNewPasswordEmail:case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement("h3",null,I("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,I("TwoStepVerificationPasswordSet"));case o.MT.TwoFaChangePasswordCurrent:case o.MT.TwoFaTurnOff:case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement("h3",null,I("PleaseEnterCurrentPassword"));case o.MT.Folders:return a.ZP.createElement("h3",null,I("Filters"));case o.MT.FoldersCreateFolder:return a.ZP.createElement("h3",null,I("FilterNew"));case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,I("FilterEdit")),t&&a.ZP.createElement(F.Z,{className:"settings-more-menu",trigger:b,positionX:"right"},a.ZP.createElement(B.Z,{icon:"delete",destructive:!0,onClick:g},I("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,I("FilterInclude")):a.ZP.createElement("h3",null,I("FilterExclude")),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:r,ariaLabel:I("AutoDeleteConfirm")},a.ZP.createElement("i",{className:"icon-check"})));default:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,I("SETTINGS")),a.ZP.createElement(L.Z,{round:!0,ripple:!f.wB,size:"smaller",color:"translucent",onClick:()=>i(o.MT.EditProfile),ariaLabel:I("lng_settings_information")},a.ZP.createElement("i",{className:"icon-edit"})),a.ZP.createElement(F.Z,{className:"settings-more-menu",trigger:b,positionX:"right"},a.ZP.createElement(B.Z,{icon:"logout",onClick:P},I("LogOutTitle"))))}}(),a.ZP.createElement(Xe.Z,{isOpen:d,onClose:v,text:I("lng_sure_logout"),confirmLabel:I("AccountSettings.Logout"),confirmHandler:E,confirmIsDestructive:!0}),a.ZP.createElement(Xe.Z,{isOpen:h,onClose:p,text:I("FilterDeleteAlert"),confirmLabel:I("Delete"),confirmHandler:C,confirmIsDestructive:!0}))}));var on=n(787),ln=n(180);const cn=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t,lastSyncTime:n}=e;return{currentUser:t?(0,g.dy)(e,t):void 0,lastSyncTime:n}}))((({isActive:e,onScreenSelect:t,onReset:n,currentUser:r,lastSyncTime:i})=>{const{loadProfilePhotos:l}=(0,s.uC)(),c=(0,u.Z)(),d=null==r?void 0:r.id;return(0,a.d4)((()=>{d&&i&&l({profileId:d})}),[i,d,l]),(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(on.Z,{userId:r.id,forceShowSelf:!0}),r&&a.ZP.createElement(ln.Z,{chatOrUserId:r.id,forceShowSelf:!0}),a.ZP.createElement(Le.Z,{icon:"settings",onClick:()=>t(o.MT.General)},c("Telegram.GeneralSettingsViewController")),a.ZP.createElement(Le.Z,{icon:"unmute",onClick:()=>t(o.MT.Notifications)},c("Notifications")),a.ZP.createElement(Le.Z,{icon:"lock",onClick:()=>t(o.MT.Privacy)},c("PrivacySettings")),a.ZP.createElement(Le.Z,{icon:"data",onClick:()=>t(o.MT.DataStorage)},c("DataSettings")),a.ZP.createElement(Le.Z,{icon:"folder",onClick:()=>t(o.MT.Folders)},c("Filters")),a.ZP.createElement(Le.Z,{icon:"language",onClick:()=>t(o.MT.Language)},c("Language"))))})));var dn=n(710),mn=n(1151);const un="https://t.me/",hn=/https:\/\/t\.me\/?/i,Zn=/^([a-zA-Z0-9_]+)$/,Pn=(0,G.Ds)((e=>e()),250,!1),vn=(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`]:Zn.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(hn,"");l(n),e.target.value=`${t?un:""}${n}`;const a=function(e){return e.length>=5&&e.length<=32&&Zn.test(e)}(n);a&&Pn((()=>{r({username:n})})),o&&o(!!a&&n)}),[t,r,o]);return a.ZP.createElement(Me.Z,{value:`${t?un:""}${i}`,onChange:P,label:m,error:Z,success:h,readOnly:n})})),gn=(0,G.P2)((e=>e()),6e4,!0),pn="Please provide your first name",En="Bio can' be longer than 70 characters",Cn=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e,{progress:n,isUsernameAvailable:a}=e.profileEdit||{},s=t?(0,g.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,v.RT)(s),currentFirstName:r,currentLastName:o,currentBio:c,currentUsername:i,progress:n,isUsernameAvailable:a}}))((({isActive:e,onScreenSelect:t,onReset:n,currentAvatarHash:i,currentFirstName:l,currentLastName:c,currentBio:d,currentUsername:Z,progress:P,isUsernameAvailable:v})=>{const{loadCurrentUser:g,updateProfile:p,checkUsername:E}=(0,s.uC)(),C=(0,u.Z)(),[f,b]=(0,a.eJ)(!1),[I,y]=(0,a.eJ)(!1),[N,S]=(0,a.eJ)(),[w,k]=(0,a.eJ)(),[M,T]=(0,a.eJ)(l||""),[L,A]=(0,a.eJ)(c||""),[R,F]=(0,a.eJ)(d||""),[B,$]=(0,a.eJ)(Z||""),D=(0,h.Z)(i,!1,r.IU.BlobUrl),x=P===o.rN.InProgress,U=!1===B,O=(0,a.Ye)((()=>!U&&(Boolean(w)||I||!0===v)),[w,I,U,v]);(0,m.ZP)(e,n,t,o.MT.EditProfile),(0,a.d4)((()=>{gn((()=>{g()}))}),[g]),(0,a.d4)((()=>{k(void 0)}),[D]),(0,a.d4)((()=>{T(l||""),A(c||""),F(d||"")}),[l,c,d]),(0,a.d4)((()=>{$(Z||"")}),[Z]),(0,a.d4)((()=>{P===o.rN.Complete&&(y(!1),b(!1),S(void 0))}),[P]);const G=(0,a.I4)((e=>{k(e)}),[]),X=(0,a.I4)((e=>{T(e.target.value),y(!0)}),[]),_=(0,a.I4)((e=>{A(e.target.value),y(!0)}),[]),z=(0,a.I4)((e=>{F(e.target.value),y(!0)}),[]),Y=(0,a.I4)((e=>{$(e),b(!0)}),[]),H=(0,a.I4)((()=>{const e=M.trim(),t=L.trim(),n=R.trim();e.length?n.length>70?S(En):p({photo:w,...I&&{firstName:e,lastName:t,bio:n},...f&&{username:B}}):S(pn)}),[w,M,L,R,I,B,f,p]);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(dn.Z,{currentAvatarBlobUrl:D,onChange:G,title:"Edit your profile photo",disabled:x}),a.ZP.createElement(Me.Z,{value:M,onChange:X,label:C("FirstName"),disabled:x,error:N===pn?N:void 0}),a.ZP.createElement(Me.Z,{value:L,onChange:_,label:C("LastName"),disabled:x}),a.ZP.createElement(Me.Z,{value:R,onChange:z,label:C("UserBio"),disabled:x,error:N===En?N:void 0}),a.ZP.createElement("p",{className:"settings-item-description",dir:C.isRtl?"rtl":void 0},(0,ve.Z)(C("lng_settings_about_bio"),["br","simple_markdown"]))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:C.isRtl?"rtl":void 0},C("Username")),a.ZP.createElement(vn,{currentUsername:B||"",isLoading:x,isUsernameAvailable:v,checkUsername:E,onChange:Y}),a.ZP.createElement("p",{className:"settings-item-description",dir:C.isRtl?"rtl":void 0},(0,ve.Z)(C("UsernameHelp"),["br","simple_markdown"])),B&&a.ZP.createElement("p",{className:"settings-item-description",dir:C.isRtl?"rtl":void 0},C("lng_username_link"),a.ZP.createElement("br",null),a.ZP.createElement("span",{className:"username-link"},"https://t.me/",B)))),a.ZP.createElement(mn.Z,{isShown:O,onClick:H,disabled:x,ariaLabel:"Save changes"},x?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var fn=n(4605),bn=n(8051);const In=(0,a.X$)((0,s.c$)((e=>(0,me.ei)(e.settings.byKey,["canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoPlayGifs","canAutoPlayVideos","autoLoadFileMaxSizeMb"])))((({isActive:e,onScreenSelect:t,onReset:n,canAutoLoadPhotoFromContacts:r,canAutoLoadPhotoInPrivateChats:l,canAutoLoadPhotoInGroups:c,canAutoLoadPhotoInChannels:d,canAutoLoadVideoFromContacts:h,canAutoLoadVideoInPrivateChats:Z,canAutoLoadVideoInGroups:P,canAutoLoadVideoInChannels:v,canAutoLoadFileFromContacts:g,canAutoLoadFileInPrivateChats:p,canAutoLoadFileInGroups:E,canAutoLoadFileInChannels:C,canAutoPlayGifs:f,canAutoPlayVideos:b,autoLoadFileMaxSizeMb:I})=>{const{setSettingOption:y}=(0,s.uC)(),N=(0,u.Z)();(0,m.ZP)(e,n,t,o.MT.General);const S=(0,a.I4)((e=>N("AutodownloadSizeLimitUpTo",N("FileSize.MB",String(i.by[e]),"i"))),[N]),w=(0,a.I4)((e=>{y({autoLoadFileMaxSizeMb:i.by[e]})}),[y]);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:N.isRtl?"rtl":void 0},e),a.ZP.createElement(fn.Z,{label:N("AutoDownloadSettings.Contacts"),checked:n,onCheck:e=>y({[`canAutoLoad${t}FromContacts`]:e})}),a.ZP.createElement(fn.Z,{label:N("AutoDownloadSettings.PrivateChats"),checked:s,onCheck:e=>y({[`canAutoLoad${t}InPrivateChats`]:e})}),a.ZP.createElement(fn.Z,{label:N("AutoDownloadSettings.GroupChats"),checked:r,onCheck:e=>y({[`canAutoLoad${t}InGroups`]:e})}),a.ZP.createElement(fn.Z,{label:N("AutoDownloadSettings.Channels"),checked:o,onCheck:e=>y({[`canAutoLoad${t}InChannels`]:e})}),"File"===t&&function(){const e=i.by.indexOf(I);return a.ZP.createElement("div",{className:"pt-5"},a.ZP.createElement(bn.Z,{label:N("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(N("AutoDownloadPhotosTitle"),"Photo",r,l,c,d),k(N("AutoDownloadVideosTitle"),"Video",h,Z,P,v),k("Auto-download files","File",g,p,E,C),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("AutoplayMedia")),a.ZP.createElement(fn.Z,{label:N("GifsTab2"),checked:f,onCheck:e=>y({canAutoPlayGifs:e})}),a.ZP.createElement(fn.Z,{label:N("DataAndStorage.Autoplay.Videos"),checked:b,onCheck:e=>y({canAutoPlayVideos:e})})))}))),yn=(0,G.P2)((e=>e()),6e4,!0),Nn=(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,g.dZ)(e),notifyExceptions:(0,g.NJ)(e)}}))((({isActive:e,allListIds:t,chatsById:n,usersById:r,orderedFolderIds:l,foldersById:c,recommendedChatFolders:d,notifySettings:h,notifyExceptions:Z,onCreateFolder:P,onEditFolder:g,onScreenSelect:p,onReset:E})=>{const{loadRecommendedChatFolders:C,addChatFolder:f,showDialog:b}=(0,s.uC)(),[I,y]=(0,a.eJ)(),[N,S]=(0,a.eJ)(!1),w=(0,a.I4)((()=>S(!0)),[]);(0,a.d4)((()=>{I||(0,dt.Z)("FoldersAll").then(y)}),[I]),(0,a.d4)((()=>{yn((()=>{C()}))}),[C]);const k=(0,a.I4)((()=>{Object.keys(c).length>=10?b({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):P()}),[c,b,P]),M=(0,u.Z)();(0,m.ZP)(e,E,p,o.MT.Folders);const T=(0,a.Ye)((()=>{if(l)return l.map((e=>{const a=c[e];return{id:a.id,title:a.title,subtitle:(0,v.SB)(M,t,n,r,a,h,Z)}}))}),[M,t,c,n,r,l,h,Z]),A=(0,a.I4)((e=>{Object.keys(c).length>=10?b({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):f({folder:e})}),[c,f,b]);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"},I&&a.ZP.createElement(mt.Z,{id:"settingsFoldersMain",size:i.ku,animationData:I,play:N,noLoop:!0,onLoad:w})),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},M("CreateNewFilterInfo")),a.ZP.createElement(L.Z,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:k,isRtl:M.isRtl},a.ZP.createElement("i",{className:"icon-add"}),M("CreateNewFilter"))),a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:M.isRtl?"rtl":void 0},M("Filters")),null!=T&&T.length?T.map((e=>a.ZP.createElement(Le.Z,{className:"mb-2 no-icon",narrow:!0,multiline:!0,onClick:()=>g(c[e.id])},a.ZP.createElement("span",{className:"title"},e.title),a.ZP.createElement("span",{className:"subtitle"},e.subtitle)))):T&&!T.length?a.ZP.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):a.ZP.createElement(we.Z,null)),d&&!!d.length&&a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:M.isRtl?"rtl":void 0},M("FilterRecommended")),d.map((e=>a.ZP.createElement(Le.Z,{className:"mb-2",narrow:!0,onClick:()=>A(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(L.Z,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:M.isRtl},M("Add"))))))))})));var Sn=n(3455);const wn=({count:e,itemName:t,itemPluralName:n,isLoading:s,onClick:r})=>{const o=(0,u.Z)();return a.ZP.createElement(L.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)},kn="Please provide a title for this folder.",Mn="ChatList.Filter.Error.Empty",Tn=(0,a.X$)((0,s.c$)((e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}}))((({state:e,dispatch:t,onAddIncludedChats:n,onAddExcludedChats:r,isActive:l,onScreenSelect:c,onReset:d,onBack:h,loadedActiveChatIds:Z,loadedArchivedChatIds:P})=>{const{editChatFolder:g,addChatFolder:p,loadMoreChats:E}=(0,s.uC)(),[C,f]=(0,a.eJ)(),[b,I]=(0,a.eJ)(!1),y=(0,a.I4)((()=>I(!0)),[]),[N,S]=(0,a.eJ)(!1),[w,k]=(0,a.eJ)(!1),{selectedChatIds:M,selectedChatTypes:T}=(0,Sn.vb)(e,"included"),{selectedChatIds:L,selectedChatTypes:A}=(0,Sn.vb)(e,"excluded");(0,a.d4)((()=>{C||(0,dt.Z)("FoldersNew").then(f)}),[C]),(0,a.d4)((()=>{S(!1),k(!1)}),[e.folderId]);const[R,F]=(0,a.Ye)((()=>{const e=new Set([...Z||[],...P||[]]),t=(0,me.eL)(M,e),n=(0,me.eL)(L,e);return[N?t:t.slice(0,5-T.length),w?n:n.slice(0,5-A.length)]}),[L,M,T,A,w,N,Z,P]);(0,a.d4)((()=>{(R.lengthS(!0):()=>k(!0);return a.ZP.createElement(a.ZP.Fragment,null,t.map((t=>function(e,t){const n="included"===t?Sn.fi.find((({key:t})=>t===e)):Sn.Yy.find((({key:t})=>t===e));if(n)return a.ZP.createElement(Le.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(Le.Z,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},(0,v.YC)(e)?a.ZP.createElement(Re.Z,{avatarSize:"small",userId:e}):a.ZP.createElement(Ae.Z,{avatarSize:"small",chatId:e})))),!s&&r>0&&a.ZP.createElement(wn,{count:r,itemName:"chat",onClick:o}))}return(0,m.ZP)(l,h,c,"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"},C&&a.ZP.createElement(mt.Z,{id:"settingsFoldersEdit",size:i.ku,animationData:C,play:b&&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(Me.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===kn?kn:void 0})),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===Mn&&a.ZP.createElement("p",{className:"settings-item-description color-danger mb-2",dir: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(Le.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(Le.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:r},B("FilterAddChats")),$("excluded"))),a.ZP.createElement(mn.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?g({id:e.folderId,folderUpdate:e.folder}):p({folder:e.folder}),setTimeout((()=>{d()}),500)):t({type:"setError",payload:Mn}):t({type:"setError",payload:kn})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var Ln=n(5765);const An=(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?Sn.fi:Sn.Yy,h=n.length+s.length>10,Z=n.length>=100;(0,a.d4)((()=>{setTimeout((()=>{requestAnimationFrame((()=>{d.current.focus()}))}),500)}),[]);const P=(0,a.I4)((e=>{const t=[...n];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),o(t)}),[n,o]),g=(0,a.I4)((e=>{const t=[...s];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),i(t)}),[s,i]),p=(0,a.I4)((e=>{const{value:t}=e.currentTarget;l(t)}),[l]),E=(0,u.Z)(),[C,f]=(0,ye.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(Mt.Z,{icon:t.icon,title:E(t.title),isMinimized:h,canClose:!0,onClick:g,clickArg:t.key})})),n.map(((e,t)=>a.ZP.createElement(Mt.Z,{chatOrUserId:e,isMinimized:h&&tg(e.key),ripple:!0},a.ZP.createElement("i",{className:`icon-${e.icon}`}),a.ZP.createElement("h3",{className:"chat-type",dir:"auto"},E(e.title)),a.ZP.createElement(fn.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(Le.Z,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>P(e),ripple:!0,disabled:!t&&Z},(0,v.YC)(e)?a.ZP.createElement(Re.Z,{userId:e}):a.ZP.createElement(Ae.Z,{chatId:e,withChatType:!0}),a.ZP.createElement(fn.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"})))})),Rn=(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}}))((({isActive:e,onScreenSelect:t,onReset:n,mode:r,state:i,dispatch:l,chatsById:c,listIds:d,orderedPinnedIds:h,archivedListIds:Z,archivedPinnedIds:P})=>{const{loadMoreChats:g}=(0,s.uC)(),{chatFilter:p}=i,{selectedChatIds:E,selectedChatTypes:C}=(0,Sn.vb)(i,r,!0),f=(0,u.Z)(),b=(0,a.Ye)((()=>{const e=d?(0,v.O)(c,d,h,"all"):void 0,t=Z?(0,v.O)(c,Z,P,"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)||[]]}),[c,d,h,Z,P]),I=(0,a.Ye)((()=>{if(b)return b.filter((e=>!p||(0,Ln.Z)((0,v.U)(f,e),p)||E.includes(e.id))).map((({id:e})=>e))}),[b,p,f,E]),y=(0,a.I4)((e=>{l({type:"setChatFilter",payload:e})}),[l]),N=(0,a.I4)((e=>{l("included"===r?{type:"setIncludeFilters",payload:{...i.includeFilters,includedChatIds:e}}:{type:"setExcludeFilters",payload:{...i.excludeFilters,excludedChatIds:e}})}),[r,i,l]),S=(0,a.I4)((e=>{const t={};e.forEach((e=>{t[e]=!0})),l("included"===r?{type:"setIncludeFilters",payload:{includedChatIds:E,...t}}:{type:"setExcludeFilters",payload:{excludedChatIds:E,...t}})}),[r,E,l]);return(0,m.ZP)(e,n,t,"included"===r?o.MT.FoldersIncludedChats:o.MT.FoldersExcludedChats),I?a.ZP.createElement(An,{mode:r,chatIds:I,selectedIds:E,selectedChatTypes:C,filterValue:p,onSelectedIdsChange:N,onSelectedChatTypesChange:S,onFilterChange:y,onLoadMore:g}):a.ZP.createElement(we.Z,null)}))),Fn=(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(Nn,{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(Tn,{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(Rn,{mode:"included",state:n,dispatch:s,onReset:c,onScreenSelect:i,isActive:r});case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement(Rn,{mode:"excluded",state:n,dispatch:s,onReset:c,onScreenSelect:i,isActive:r});default:return}}));var Bn=n(663),$n=n(3657),Dn=n(692);const xn=(0,a.X$)((({size:e=i.DC,stickerSet:t,observeIntersection:n})=>{const s=(0,a.sO)(null),o=(0,$n.Op)(s,n),l=`stickerSet${t.id}`,c=(0,h.Z)(l,!o,r.IU.Lottie),d=(0,Dn.Z)(c),m=(0,a.Ye)((()=>{if(!c)return(0,it.Xv)(t.title,2)}),[c,t.title]);return a.ZP.createElement("div",{ref:s,className:"sticker-set-cover"},m,c&&a.ZP.createElement(mt.Z,{id:l,size:e,animationData:c,className:d}))})),Un=(0,a.X$)((({stickerSet:e,observeIntersection:t})=>{const n=(0,a.sO)(null),s=(0,$n.Op)(n,t),r=(0,h.Z)(e.hasThumbnail&&`stickerSet${e.id}`,!s),o=(0,Dn.Z)(r),i=(0,a.Ye)((()=>{if(!r)return(0,it.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 On=n(3547);const Gn=(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(Le.Z,{narrow:!0,className:"SettingsStickerSet",inactive:!o,onClick:()=>o&&n(o)},a.ZP.createElement(L.Z,{ariaLabel:e.title,color:"translucent",isRtl:r.isRtl},e.isAnimated?a.ZP.createElement(xn,{size:i.Mw,stickerSet:e,observeIntersection:t}):a.ZP.createElement(Un,{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(Le.Z,{narrow:!0,className:"SettingsStickerSet",onClick:()=>n(o)},a.ZP.createElement(On.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 Jn=n(4851);const Xn=["Solid and Steady","Nice and Fast","Lots of Stuff"],_n=[{label:"12-hour",value:"12h"},{label:"24-hour",value:"24h"}],zn=(0,a.X$)((0,s.c$)((e=>{var t;return{...(0,me.ei)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","isSensitiveEnabled","canChangeSensitive","timeFormat"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById,defaultReaction:null===(t=e.appConfig)||void 0===t?void 0:t.defaultReaction}}))((({isActive:e,onScreenSelect:t,onReset:n,stickerSetIds:r,stickerSetsById:i,defaultReaction:l,messageTextSize:c,animationLevel:d,messageSendKeyCombo:h,shouldSuggestStickers:Z,shouldLoopStickers:P,timeFormat:v})=>{const{setSettingOption:g}=(0,s.uC)(),p=(0,a.sO)(null),{observe:E}=(0,$n.S1)({rootRef:p}),[C,b,I]=(0,De.Z)(),[y,N]=(0,a.eJ)(),S=(0,u.Z)(),w=f.$b?void 0:[{value:"enter",label:S("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:S(f.jm?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}],k=(0,a.I4)((e=>{Xn.forEach(((t,n)=>{document.body.classList.toggle(`animation-level-${n}`,e===n)})),g({animationLevel:e})}),[g]),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()),g({messageTextSize:e})}),[g]),T=(0,a.I4)((e=>{g({timeFormat:e}),g({wasTimeFormatSetManually:!0}),(0,Bn.qf)(e)}),[g]),L=(0,a.I4)((e=>{N(e),b()}),[b]),A=r&&r.map((e=>{var t;return!(null==i||null===(t=i[e])||void 0===t||!t.installedDate)&&i[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:S.isRtl?"rtl":void 0},S("SETTINGS")),a.ZP.createElement(bn.Z,{label:S("TextSize"),min:12,max:20,value:c,onChange:M}),a.ZP.createElement(Le.Z,{icon:"photo",onClick:()=>t(o.MT.GeneralChatBackground)},S("ChatBackground"))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},"Time Format"),a.ZP.createElement(at.Z,{name:"timeformat",options:_n,selected:v,onChange:T})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},"Animation Level"),a.ZP.createElement("p",{className:"settings-item-description",dir:S.isRtl?"rtl":void 0},"Choose the desired animations amount."),a.ZP.createElement(bn.Z,{options:Xn,value:d,onChange:k})),w&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("VoiceOver.Keyboard")),a.ZP.createElement(at.Z,{name:"keyboard-send-settings",options:w,onChange:e=>g({messageSendKeyCombo:e}),selected:h})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AccDescrStickers")),l&&a.ZP.createElement(Le.Z,{className:"SettingsDefaultReaction",onClick:()=>t(o.MT.QuickReaction)},a.ZP.createElement(lt.Z,{reaction:l}),a.ZP.createElement("div",{className:"title"},S("DoubleTapSetting"))),a.ZP.createElement(fn.Z,{label:S("SuggestStickers"),checked:Z,onCheck:e=>g({shouldSuggestStickers:e})}),a.ZP.createElement(fn.Z,{label:S("LoopAnimatedStickers"),checked:P,onCheck:e=>g({shouldLoopStickers:e})}),a.ZP.createElement("div",{className:"mt-4",ref:p},A&&A.map((e=>a.ZP.createElement(Gn,{key:e.id,stickerSet:e,observeIntersection:E,onClick:L})))),y&&a.ZP.createElement(Jn.Z,{isOpen:C,fromSticker:y,onClose:I})))})));let Yn;function Hn(e="*",t,n=!1){Yn||(Yn=document.createElement("input"),Yn.setAttribute("type","file")),Yn.setAttribute("accept",e),n?Yn.removeAttribute("multiple"):Yn.setAttribute("multiple","multiple"),Yn.onchange=null,Yn.value="",Yn.onchange=t,Yn.click()}var Vn=n(1394);function jn(e){return[parseInt(e.substring(0,2),16),parseInt(e.substring(2,4),16),parseInt(e.substring(4,6),16)]}function Kn(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 qn([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 ea=n(9524),ta=n(5866);const na=(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`),v=(0,ta.Z)(null===(r=c.thumbnail)||void 0===r?void 0:r.dataUri,Boolean(u),!0),{transitionClassNames:g}=(0,z.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.Z)(p&&!C||l===o.mp,void 0,b,"slow"),N=(0,a.sO)();N.current=t;const S=(0,a.I4)((()=>{(async()=>{const e=await(0,Vn.gm)(C);await ea.save(i.fo,N.current,e),s(l)})()}),[C,s,l]);(0,a.d4)((()=>{C&&S()}),[C,S]);const w=(0,a.I4)((()=>{C?S():E((e=>!e))}),[C,S]),k=(0,X.Z)("WallpaperTile",n&&"selected");return a.ZP.createElement("div",{className:k,onClick:w},a.ZP.createElement("div",{className:"media-inner"},a.ZP.createElement("canvas",{ref:v,className:"thumbnail"}),a.ZP.createElement("img",{src:u||m,className:(0,X.Z)("full-media",g),alt:""}),I&&a.ZP.createElement("div",{className:(0,X.Z)("spinner-container",y)},a.ZP.createElement($.Z,{progress:f,onClick:w}))))})),aa=(0,G.P2)((e=>e()),6e4,!0),sa=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.Pu)(e),{background:n,isBlurred:a}=e.settings.themes[t]||{},{loadedWallpapers:s}=e.settings;return{background:n,isBlurred:a,loadedWallpapers:s,theme:t}}))((({isActive:e,onScreenSelect:t,onReset:n,background:r,isBlurred:l,loadedWallpapers:c,theme:d})=>{const{loadWallpapers:h,uploadWallpaper:Z,setThemeSettings:P}=(0,s.uC)(),v=(0,a.sO)();v.current=d,(0,a.d4)((()=>{aa((()=>{h()}))}),[h]);const g=(0,a.I4)((e=>{const{files:t}=e.target;t&&t.length>0&&Z(t[0])}),[Z]),p=(0,a.I4)((()=>{Hn("image/jpeg",g,!0)}),[g]),E=(0,a.I4)((()=>{t(o.MT.GeneralChatBackgroundColor)}),[t]),C=(0,a.I4)((()=>{P({theme:d,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===d?i.Vv:i.g})}),[P,d]),f=(0,a.I4)((e=>{P({theme:v.current,background:e});const t=c&&c.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,Vn.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=Qn(e),n=`#${Kn(e)}`;P({theme:v.current,backgroundColor:n,patternColor:t})}))}),[c,P]),b=(0,a.I4)((e=>{P({theme:v.current,isBlurred:e.target.checked})}),[P]),I=(0,u.Z)();(0,m.ZP)(e,n,t,o.MT.GeneralChatBackground);const y=(null==c?void 0:c[0])&&c[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(Le.Z,{icon:"camera-add",className:"mb-0",disabled:y,onClick:p},I("UploadImage")),a.ZP.createElement(Le.Z,{icon:"colorize",className:"mb-0",onClick:E},I("SetColor")),a.ZP.createElement(Le.Z,{icon:"favorite",onClick:C},I("ThemeResetToDefaults")),a.ZP.createElement(fn.Z,{label:I("BackgroundBlurred"),checked:Boolean(l),onChange:b})),c?a.ZP.createElement("div",{className:"settings-wallpapers"},c.map((e=>a.ZP.createElement(na,{wallpaper:e,theme:d,isSelected:r===e.slug,onClick:f})))):a.ZP.createElement(we.Z,null))}))),ra=qn(jn("e6ebee")),oa=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function ia(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 la({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 ca=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.Pu)(e),{backgroundColor:n}=e.settings.themes[t]||{};return{backgroundColor:n,theme:t}}))((({isActive:e,onScreenSelect:t,onReset:n,theme:r,backgroundColor:i})=>{const{setThemeSettings:l}=(0,s.uC)(),c=(0,a.sO)();c.current=r;const d=(0,a.sO)(null),u=(0,a.sO)(null),h=(0,a.sO)(null),Z=(0,a.sO)(!0),[P,v]=(0,a.eJ)(function(e){return e&&e.startsWith("#")?qn(jn(e.replace("#",""))):ra}(i)),g=(0,a.sO)(P);(0,a.d4)((()=>{g.current=P}),[P]);const[p,E,f]=(0,De.Z)(),[b,I]=(0,a.eJ)(""),[y,N]=(0,a.eJ)(""),S=(0,a.sO)(),w=(0,a.sO)();(0,a.d4)((()=>{const e={offsetLeft:u.current.offsetLeft,...(0,me.ei)(u.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:h.current.offsetLeft,...(0,me.ei)(h.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+d.current.scrollTop),e.height-1)],{huePosition:a}=ia(g.current,S.current);return v(la({colorPosition:n,huePosition:a},S.current)),E(),!0}function a(e){const{colorPosition:n}=ia(g.current,S.current),a=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);return v(la({colorPosition:n,huePosition:a},S.current)),E(),!0}S.current={colorRect:e,hueRect:t},(0,C.s)(u.current,{onCapture:n,onDrag:n,onRelease:f,onClick:f,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0}),(0,C.s)(h.current,{onCapture:a,onDrag:a,onRelease:f,onClick:f,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0})}),[E,f]);const{colorPosition:k=[0,0],huePosition:M=0}=S.current?ia(P,S.current):{},T=Kn(Wn(P)),L=P[0],A=Kn(Wn([L,1,1]));(0,a.d4)((()=>{const e=Wn(P),t=`#${Kn(e)}`;if(I(e.join(", ")),N(t),!Z.current){const n=Qn(e);l({theme:c.current,background:void 0,backgroundColor:t,patternColor:n})}Z.current=!1}),[P,l]),(0,a.d4)((()=>{!function(e,t,n,a){let s,r,o;n.current&&a.current?(s=a.current.colorRect.width,r=a.current.colorRect.height,o=n.current):(s=e.offsetWidth,r=e.offsetHeight,o=e.getContext("2d"),e.width=s,e.height=r,n.current=o);const i=o.createImageData(s,r),l=i.data,c=Wn([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())));v(qn(e))}e.currentTarget.value=t}),[]),F=(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}$/)&&v(qn(jn(t.replace("#","")))),e.currentTarget.value=t}),[]),B=(0,a.I4)((e=>{v(qn(jn(e.currentTarget.dataset.color.replace("#",""))))}),[]),$=(0,X.Z)("SettingsGeneralBackgroundColor settings-content custom-scroll",p&&"is-dragging");return(0,m.ZP)(e,n,t,o.MT.GeneralChatBackgroundColor),a.ZP.createElement("div",{ref:d,className:$},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("div",{ref:u,className:"color-picker"},a.ZP.createElement("canvas",null),a.ZP.createElement("div",{className:"handle",style:`transform: translate(${k[0]}px, ${k[1]}px); background-color: #${T};`})),a.ZP.createElement("div",{ref:h,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(Me.Z,{value:y,label:"HEX",onChange:F}),a.ZP.createElement(Me.Z,{value:b,label:"RGB",onChange:R}))),a.ZP.createElement("div",{className:"predefined-colors"},oa.map((e=>a.ZP.createElement("div",{className:e===`#${T}`?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:B})))))})));var da=n(8406);const ma=(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})))((({isActive:e,onScreenSelect:t,onReset:n,hasPrivateChatsNotifications:r,hasPrivateChatsMessagePreview:i,hasGroupNotifications:l,hasGroupMessagePreview:c,hasBroadcastNotifications:d,hasBroadcastMessagePreview:h,hasContactJoinedNotifications:Z,hasPushNotifications:P,hasWebNotifications:v,notificationSoundVolume:g})=>{const{loadNotificationSettings:p,updateContactSignUpNotification:E,updateNotificationSettings:C,updateWebNotificationSettings:f}=(0,s.uC)();(0,a.d4)((()=>{p()}),[p]);const b=(0,x.Z)(500,!0),I=(0,a.I4)(((e,t,n)=>{const a="contact"===t?!r:!("group"===t?l:d),s="contact"===t?i:"group"===t?c:h;C({peerType:t,..."silent"===n&&{isSilent:!e.target.checked,shouldShowPreviews:s},..."showPreviews"===n&&{shouldShowPreviews:e.target.checked,isSilent:a}})}),[h,d,c,l,i,r,C]),y=(0,a.I4)((e=>{E({isSilent:!e.target.checked})}),[E]),N=(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:N.isRtl?"rtl":void 0},"Web notifications"),a.ZP.createElement(fn.Z,{label:"Web notifications",subLabel:N(v?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:v,onChange:e=>{f({hasWebNotifications:e.target.checked})}}),a.ZP.createElement(fn.Z,{label:"Offline notifications",disabled:!v,subLabel:N(P?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:P,onChange:e=>{f({hasPushNotifications:e.target.checked})}}),a.ZP.createElement("div",{className:"settings-item-slider"},a.ZP.createElement(bn.Z,{label:"Sound",min:0,max:10,value:g,onChange:e=>{f({notificationSoundVolume:e}),b((()=>(0,da.q3)(void 0,e)))}}))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("AutodownloadPrivateChats")),a.ZP.createElement(fn.Z,{label:N("NotificationsForPrivateChats"),subLabel:N(r?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:r,onChange:e=>{I(e,"contact","silent")}}),a.ZP.createElement(fn.Z,{label:N("MessagePreview"),disabled:!r,subLabel:N(i?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:i,onChange:e=>{I(e,"contact","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("FilterGroups")),a.ZP.createElement(fn.Z,{label:N("NotificationsForGroups"),subLabel:N(l?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:l,onChange:e=>{I(e,"group","silent")}}),a.ZP.createElement(fn.Z,{label:N("MessagePreview"),disabled:!l,subLabel:N(c?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:c,onChange:e=>{I(e,"group","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("FilterChannels")),a.ZP.createElement(fn.Z,{label:N("NotificationsForChannels"),subLabel:N(d?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:d,onChange:e=>{I(e,"broadcast","silent")}}),a.ZP.createElement(fn.Z,{label:N("MessagePreview"),disabled:!d,subLabel:N(h?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:h,onChange:e=>{I(e,"broadcast","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("PhoneOther")),a.ZP.createElement(fn.Z,{label:N("ContactJoined"),checked:Z,onChange:y})))}))),ua=(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}}))((({isActive:e,onScreenSelect:t,onReset:n,hasPassword:r,blockedCount:i,sessionsCount:l,isSensitiveEnabled:c,canChangeSensitive:d,visibilityPrivacyPhoneNumber:h,visibilityPrivacyLastSeen:Z,visibilityPrivacyProfilePhoto:P,visibilityPrivacyForwarding:v,visibilityPrivacyGroupChats:g})=>{const{loadPrivacySettings:p,loadBlockedContacts:E,loadAuthorizations:C,loadContentSettings:f,updateContentSettings:b}=(0,s.uC)();(0,a.d4)((()=>{E(),C(),p(),f()}),[E,C,p,f]);const I=(0,u.Z)();function y(e){switch(e){case"everybody":return I("P2PEverybody");case"contacts":return I("P2PContacts");case"nobody":return I("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(Le.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"},I("BlockedUsers")),i>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I("Users",i)))),a.ZP.createElement(Le.Z,{icon:"lock",narrow:!0,onClick:()=>t(r?o.MT.TwoFaEnabled:o.MT.TwoFaDisabled)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},I("TwoStepVerification")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(r?"PasswordOn":"PasswordOff")))),a.ZP.createElement(Le.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"},I("SessionsTitle")),l>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},1===l?"1 session":`${l} sessions`)))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:I.isRtl?"rtl":void 0},I("PrivacyTitle")),a.ZP.createElement(Le.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"},I("PrivacyPhoneTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(h)))),a.ZP.createElement(Le.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"},I("LastSeenTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(Z)))),a.ZP.createElement(Le.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"},I("PrivacyProfilePhotoTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(P)))),a.ZP.createElement(Le.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"},I("PrivacyForwardsTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(v)))),a.ZP.createElement(Le.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"},I("WhoCanAddMe")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(g))))),d&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:I.isRtl?"rtl":void 0},I("lng_settings_sensitive_title")),a.ZP.createElement(fn.Z,{label:I("lng_settings_sensitive_disable_filtering"),subLabel:I("lng_settings_sensitive_about"),checked:Boolean(c),disabled:!d,onCheck:b})))}))),ha=(0,a.X$)((0,s.c$)((e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language})))((({isActive:e,onScreenSelect:t,onReset:n,languages:r,language:i})=>{const{loadLanguages:l,setSettingOption:c}=(0,s.uC)(),[d,u]=(0,a.eJ)(i),[h,Z,P]=(0,De.Z)();(0,a.d4)((()=>{l()}),[l]);const v=(0,a.I4)((e=>{u(e),Z(),(0,Bn.m0)(e,(()=>{P(),c({language:e})}))}),[Z,P,c]),g=(0,a.Ye)((()=>r?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))}(r):void 0),[r]);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(at.Z,{name:"keyboard-send-settings",options:g,selected:d,loadingOption:h?d:void 0,onChange:v}):a.ZP.createElement(we.Z,null))})));function Za(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 Pa=(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}:{}}))((({screen:e,isActive:t,onScreenSelect:n,onReset:r,visibility:i,allowUserIds:l,allowChatIds:c,blockUserIds:d,blockChatIds:h,chatsById:Z})=>{const{setPrivacyVisibility:P}=(0,s.uC)(),v=(0,u.Z)(),g=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyGroupChats:return[{value:"everybody",label:v("P2PEverybody")},{value:"contacts",label:v("P2PContacts")}];default:return[{value:"everybody",label:v("P2PEverybody")},{value:"contacts",label:v("P2PContacts")},{value:"nobody",label:v("P2PNobody")}]}}),[v,e]),p={shouldShowDenied:"nobody"!==i,shouldShowAllowed:"everybody"!==i},E=Za(e),C=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyPhoneNumber:return v("PrivacyPhoneTitle");case o.MT.PrivacyLastSeen:return v("LastSeenTitle");case o.MT.PrivacyProfilePhoto:return v("PrivacyProfilePhotoTitle");case o.MT.PrivacyForwarding:return v("PrivacyForwardsTitle");case o.MT.PrivacyGroupChats:return v("WhoCanAddMe");default:return}}),[v,e]);(0,m.ZP)(t,r,n,e);const f=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyLastSeen:return v("CustomHelp");default:return}}),[v,e]),b=(()=>{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}})(),I=(()=>{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}})(),y=(0,a.Ye)((()=>l&&c&&Z?c.reduce(((e,t)=>e+(Z[t]?Z[t].membersCount:0)),l.length):0),[c,l,Z]),N=(0,a.Ye)((()=>d&&h&&Z?h.reduce(((e,t)=>e+(Z[t]?Z[t].membersCount:0)),d.length):0),[h,d,Z]),S=(0,a.I4)((e=>{P({privacyKey:E,visibility:e})}),[E,P]);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:v.isRtl?"rtl":void 0},C),a.ZP.createElement(at.Z,{name:`visibility-${E}`,options:g,onChange:S,selected:i}),f&&a.ZP.createElement("p",{className:"settings-item-description-larger",dir:v.isRtl?"rtl":void 0},f)),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:v.isRtl?"rtl":void 0},v("PrivacyExceptions")),p.shouldShowAllowed&&a.ZP.createElement(Le.Z,{narrow:!0,icon:"add-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"},v("AlwaysShareWith")),a.ZP.createElement("span",{className:"subtitle"},v("EditAdminAddUsers")))),p.shouldShowDenied&&a.ZP.createElement(Le.Z,{narrow:!0,icon:"delete-user",onClick:()=>{n(I)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},N>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"−",N),a.ZP.createElement("span",{className:"title"},v("NeverShareWith")),a.ZP.createElement("span",{className:"subtitle"},v("EditAdminAddUsers"))))))})));function va(e){return[e.region,e.country].filter(Boolean).join(", ")}function ga(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}const pa=(0,a.X$)((0,s.c$)((e=>({activeSessions:e.activeSessions})))((({isActive:e,onScreenSelect:t,onReset:n,activeSessions:r})=>{const{loadAuthorizations:i,terminateAuthorization:l,terminateAllAuthorizations:c}=(0,s.uC)(),[d,h,Z]=(0,De.Z)();(0,a.d4)((()=>{i()}),[i]);const P=(0,a.I4)((e=>{l({hash:e})}),[l]),v=(0,a.I4)((()=>{Z(),c()}),[Z,c]),g=(0,a.Ye)((()=>r.find((e=>e.isCurrent))),[r]),p=(0,a.Ye)((()=>r.filter((e=>!e.isCurrent))),[r]),E=(0,u.Z)();return(0,m.ZP)(e,n,t,o.MT.PrivacyActiveSessions),a.ZP.createElement("div",{className:"settings-content custom-scroll"},g&&(f=g,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:E.isRtl?"rtl":void 0},E("AuthSessions.CurrentSession")),a.ZP.createElement(Le.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"},f.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ga(f)),a.ZP.createElement("span",{className:"subtitle"},f.ip," - ",va(f)))),a.ZP.createElement(Le.Z,{className:"destructive mb-0 no-icon",icon:"stop",ripple:!0,narrow:!0,onClick:h},E("TerminateAllSessions")))),p&&(C=p,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:E.isRtl?"rtl":void 0},E("OtherSessions")),C.map((function(e){return a.ZP.createElement(Le.Z,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{P(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)(E,1e3*e.dateActive)),a.ZP.createElement("span",{className:"title"},e.appName),a.ZP.createElement("span",{className:"subtitle black tight"},ga(e)),a.ZP.createElement("span",{className:"subtitle"},e.ip," - ",va(e))))})))),p&&a.ZP.createElement(Xe.Z,{isOpen:d,onClose:Z,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:v,confirmIsDestructive:!0}));var C,f})));var Ea=n(6272);const Ca=(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}}))((({usersById:e,blockedIds:t,contactIds:n,localContactIds:r,currentUserId:o,isOpen:i,onClose:l})=>{const{loadContactList:c,setUserSearchQuery:d,blockContact:m}=(0,s.uC)(),h=(0,u.Z)(),[Z,P]=(0,a.eJ)(""),g=(0,a.sO)(null);(0,a.d4)((()=>{d({query:Z})}),[Z,d]);const p=(0,a.Ye)((()=>{const a=(0,me.Tw)([...n||[],...r||[]].filter((e=>e!==o&&!t.includes(e))));return(0,v.kK)(a,e,Z).sort(((t,n)=>{const a=(0,v.Js)(e[t])||"",s=(0,v.Js)(e[n])||"";return a.localeCompare(s)}))}),[t,n,o,Z,r,e]),E=(0,a.I4)((t=>{const{id:n,accessHash:a}=e[t]||{};n&&a&&(m({contactId:n,accessHash:a}),l())}),[m,l,e]);return a.ZP.createElement(Fe,{isOpen:i,chatOrUserIds:p,filterRef:g,filterPlaceholder:h("BlockedUsers.BlockUser"),filter:Z,onFilterChange:P,loadMore:c,onSelectChatOrUser:E,onClose:l})}))),fa=(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}}))((({isActive:e,onScreenSelect:t,onReset:n,chatsByIds:r,usersByIds:l,blockedIds:c,phoneCodeList:d})=>{const{unblockContact:h}=(0,s.uC)(),Z=(0,u.Z)(),[P,g,p]=(0,De.Z)(),E=(0,a.I4)((e=>{h({contactId:e})}),[h]);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:Z.isRtl?"rtl":void 0},Z("BlockedUsersInfo"))),a.ZP.createElement("div",{className:"chat-list custom-scroll"},null!=c&&c.length?a.ZP.createElement("div",{className:"scroll-container"},c.map(((e,t)=>function(e,t,n){const s=(0,v.YC)(e),o=s?l[e]:void 0,c=s?void 0:r[e],m=(0,X.Z)("Chat chat-item-clickable blocked-list-item small-icon",s?"private":"group");return a.ZP.createElement(Le.Z,{key:e,className:m,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{E(e)}}],style:`top: ${(0+t)*i.rS}px;`},a.ZP.createElement(ge.Z,{size:"medium",user:o,chat:c}),a.ZP.createElement("div",{className:"contact-info",dir:"auto"},a.ZP.createElement("h3",{dir:"auto"},(0,ve.Z)((s?(0,v.Js)(o):(0,v.U)(Z,c))||"")),(null==o?void 0:o.phoneNumber)&&a.ZP.createElement("div",{className:"contact-phone",dir:"auto"},(0,Ea.WZ)(d,o.phoneNumber)),o&&!o.phoneNumber&&o.username&&a.ZP.createElement("div",{className:"contact-username",dir:"auto"},"@",o.username)))}(e,t)))):c&&!c.length?a.ZP.createElement("div",{className:"no-results",dir:"auto"},Z("NoBlocked")):a.ZP.createElement(we.Z,{key:"loading"}))),a.ZP.createElement(mn.Z,{isShown:!0,onClick:g,ariaLabel:Z("BlockContact")},a.ZP.createElement("i",{className:"icon-add"})),a.ZP.createElement(Ca,{isOpen:P,onClose:p}))})));var ba=n(7854);const Ia=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,g.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(ba.Z,{sticker:n,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},(0,ve.Z)(r("EnabledPasswordText"),["br"]))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Le.Z,{icon:"edit",onClick:()=>s(o.MT.TwoFaChangePasswordCurrent)},r("ChangePassword")),a.ZP.createElement(Le.Z,{icon:"password-off",onClick:()=>s(o.MT.TwoFaTurnOff)},r("TurnPasswordOff")),a.ZP.createElement(Le.Z,{icon:"email",onClick:()=>s(o.MT.TwoFaRecoveryEmailCurrentPassword)},r("SetRecoveryEmail"))))})));var ya=n(3490),Na=n(9364);const Sa=(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,v]=(0,a.eJ)(""),[g,p]=(0,a.eJ)(!1),E=(0,a.I4)((e=>{i&&e!==i?v("Passwords Should Be Equal"):Z(e)}),[Z,i]),C=(0,a.I4)((()=>{h&&h(),v("")}),[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(ya.Z,{isBig:!0,isPasswordVisible:g})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Na.Z,{error:P||r,hint:c,placeholder:l,submitLabel:d||f("Next"),clearError:C,isLoading:o,isPasswordVisible:g,onChangePasswordVisibility:p,onSubmit:E})))})),wa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,g.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(ba.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(L.Z,{onClick:r},i("EditAdminTransferSetPassword"))))}))),ka=f.wB?550:400,Ma=(0,a.X$)((0,s.c$)(((e,{icon:t})=>({animatedEmoji:(0,g.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),[v,g]=(0,a.eJ)(""),[p,E,C]=(0,De.Z)(!1);(0,a.d4)((()=>{f.$b||setTimeout((()=>{P.current.focus()}),ka)}),[]);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(ba.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(v)}},a.ZP.createElement(Me.Z,{ref:P,value:v,inputMode:t,label:r,error:s,onChange:e=>{s&&i&&i(),g(e.target.value)}}),v?a.ZP.createElement(L.Z,{type:"submit",isLoading:n,ripple:!0},b("Continue")):a.ZP.createElement(L.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,ve.Z)(b("YourEmailSkipWarningText"),["br","simple_markdown"]),a.ZP.createElement("div",{className:"dialog-buttons"},a.ZP.createElement(L.Z,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{C(),l()}},b("YourEmailSkip")),a.ZP.createElement(L.Z,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:C},b("Cancel"))))))}))),Ta=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,g.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(ba.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(L.Z,{onClick:()=>{s(o.MT.Privacy)}},r("TwoStepVerificationPasswordReturnSettings"))))}))),La=f.wB?550:400,Aa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,g.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()}),La)}),[]);const v=(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(ba.Z,{sticker:e,size:"large"})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Me.Z,{value:Z,ref:h,inputMode:"decimal",label:v("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)))}))),Ra=(0,a.X$)((0,s.c$)((e=>({...e.twoFaSettings})))((({currentScreen:e,shownScreen:t,state:n,hint:r,isLoading:i,error:l,waitingEmailCodeLength:c,dispatch:d,isActive:m,onScreenSelect:h,onReset:Z})=>{const{updatePassword:P,checkPassword:v,clearTwoFaError:g,updateRecoveryEmail:p,provideTwoFaEmailCode:E,clearPassword:C}=(0,s.uC)();(0,a.d4)((()=>{c&&(e===o.MT.TwoFaNewPasswordEmail?h(o.MT.TwoFaNewPasswordEmailCode):e===o.MT.TwoFaRecoveryEmail&&h(o.MT.TwoFaRecoveryEmailCode))}),[e,h,c]);const f=(0,a.I4)((()=>{d({type:"reset"}),h(o.MT.TwoFaNewPassword)}),[d,h]),b=(0,a.I4)((e=>{d({type:"setPassword",payload:e}),h(o.MT.TwoFaNewPasswordConfirm)}),[d,h]),I=(0,a.I4)((()=>{h(o.MT.TwoFaNewPasswordHint)}),[h]),y=(0,a.I4)((e=>{d({type:"setHint",payload:e}),h(o.MT.TwoFaNewPasswordEmail)}),[d,h]),N=(0,a.I4)((e=>{d({type:"setEmail",payload:e}),P({...n,email:e,onSuccess:()=>{h(o.MT.TwoFaCongratulations)}})}),[d,h,n,P]),S=(0,a.I4)((e=>{d({type:"setCurrentPassword",payload:e}),v({currentPassword:e,onSuccess:()=>{h(o.MT.TwoFaChangePasswordNew)}})}),[v,d,h]),w=(0,a.I4)((e=>{d({type:"setPassword",payload:e}),h(o.MT.TwoFaChangePasswordConfirm)}),[d,h]),k=(0,a.I4)((()=>{h(o.MT.TwoFaChangePasswordHint)}),[h]),M=(0,a.I4)((e=>{d({type:"setHint",payload:e}),P({...n,hint:e,onSuccess:()=>{h(o.MT.TwoFaCongratulations)}})}),[d,h,n,P]),T=(0,a.I4)((e=>{C({currentPassword:e,onSuccess:()=>{h(o.MT.Privacy)}})}),[C,h]),L=(0,a.I4)((e=>{d({type:"setCurrentPassword",payload:e}),v({currentPassword:e,onSuccess:()=>{h(o.MT.TwoFaRecoveryEmail)}})}),[v,d,h]),A=(0,a.I4)((e=>{d({type:"setEmail",payload:e}),p({...n,email:e,onSuccess:()=>{h(o.MT.TwoFaCongratulations)}})}),[d,h,n,p]),R=(0,a.I4)((e=>{E({code:e})}),[E]),F=(0,u.Z)();switch(e){case o.MT.TwoFaDisabled:return a.ZP.createElement(wa,{onStart:f,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPassword,o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPassword:return a.ZP.createElement(Sa,{screen:e,placeholder:F("PleaseEnterPassword"),submitLabel:F("Continue"),onSubmit:b,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement(Sa,{screen:e,expectedPassword:n.password,placeholder:F("PleaseReEnterPassword"),submitLabel:F("Continue"),onSubmit:I,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPasswordHint:return a.ZP.createElement(Ma,{icon:"hint",placeholder:F("PasswordHintPlaceholder"),onSubmit:y,screen:e,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPasswordEmail:return a.ZP.createElement(Ma,{icon:"email",type:"email",isLoading:i,error:l,clearError:g,placeholder:F("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:N,screen:e,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPasswordEmailCode:return a.ZP.createElement(Aa,{isLoading:i,error:l,clearError:g,onSubmit:R,screen:e,onScreenSelect:h,isActive:m||t===o.MT.TwoFaCongratulations,onReset:Z});case o.MT.TwoFaCongratulations:return a.ZP.createElement(Ta,{onScreenSelect:h,isActive:m,onReset:Z});case o.MT.TwoFaEnabled:return a.ZP.createElement(Ia,{onScreenSelect:h,isActive:m||[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:Z});case o.MT.TwoFaChangePasswordCurrent:return a.ZP.createElement(Sa,{screen:e,isLoading:i,error:l,clearError:g,hint:r,onSubmit:S,onScreenSelect:h,isActive:m||[o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaChangePasswordNew:return a.ZP.createElement(Sa,{screen:e,placeholder:F("PleaseEnterNewFirstPassword"),onSubmit:w,onScreenSelect:h,isActive:m||[o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement(Sa,{screen:e,expectedPassword:n.password,placeholder:F("PleaseReEnterPassword"),onSubmit:k,onScreenSelect:h,isActive:m||[o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement(Ma,{isLoading:i,error:l,clearError:g,icon:"hint",placeholder:F("PasswordHintPlaceholder"),onSubmit:M,onScreenSelect:h,isActive:m||t===o.MT.TwoFaCongratulations,onReset:Z,screen:e});case o.MT.TwoFaTurnOff:return a.ZP.createElement(Sa,{isLoading:i,error:l,clearError:g,hint:r,onSubmit:T,onScreenSelect:h,isActive:m,onReset:Z,screen:e});case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement(Sa,{screen:e,isLoading:i,error:l,clearError:g,hint:r,onSubmit:L,onScreenSelect:h,isActive:m||[o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement(Ma,{screen:e,icon:"email",type:"email",placeholder:F("RecoveryEmailTitle"),onSubmit:A,onScreenSelect:h,isActive:m||[o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement(Aa,{screen:e,isLoading:i,error:l,clearError:g,onSubmit:R,onScreenSelect:h,isActive:m||t===o.MT.TwoFaCongratulations,onReset:Z});default:return}})));var Fa=n(1820);function Ba(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 $a=(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:Ba(e,t)}}))((({currentUserId:e,isAllowList:t,screen:n,settings:r,chatsById:i,listIds:l,orderedPinnedIds:c,archivedListIds:d,archivedPinnedIds:h,isActive:Z,onScreenSelect:P,onReset:g})=>{const{setPrivacySettings:p}=(0,s.uC)(),E=(0,u.Z)(),C=(0,a.Ye)((()=>r?t?[...r.allowUserIds,...r.allowChatIds]:[...r.blockUserIds,...r.blockChatIds]:[]),[t,r]),[f,b]=(0,a.eJ)(""),[I,y]=(0,a.eJ)(!1),[N,S]=(0,a.eJ)(C),w=(0,a.Ye)((()=>{const e=l?(0,v.O)(i,l,c,"all"):void 0,t=d?(0,v.O)(i,d,h,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]}),[i,l,c,d,h]),k=(0,a.Ye)((()=>{if(w)return w.filter((t=>((0,v.YC)(t.id)&&t.id!==e||(0,v.Bf)(t))&&(!f||(0,Ln.Z)((0,v.U)(E,t),f)||C.includes(t.id)))).map((({id:e})=>e))}),[w,e,E,f,C]),M=(0,a.I4)((e=>{S(e),y(!0)}),[]),T=(0,a.I4)((()=>{p({privacyKey:Za(n),isAllowList:Boolean(t),contactsIds:N}),P(o.MT.Privacy)}),[t,N,P,n,p]);return(0,m.ZP)(Z,g,P,n),a.ZP.createElement("div",{className:"NewChat-inner step-1"},a.ZP.createElement(Fa.Z,{itemIds:k||[],selectedIds:N,filterValue:f,filterPlaceholder:E(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:M,onFilterChange:b}),a.ZP.createElement(mn.Z,{isShown:I,onClick:T,ariaLabel:E(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Da=(0,a.X$)((0,s.c$)((e=>{const{availableReactions:t,appConfig:n}=e;return{availableReactions:t,selectedReaction:null==n?void 0:n.defaultReaction}}))((({isActive:e,onReset:t,onScreenSelect:n,availableReactions:r,selectedReaction:i})=>{const{setDefaultReaction:l}=(0,s.uC)();(0,m.ZP)(e,t,n,o.MT.General);const c=(null==r?void 0:r.filter((e=>!e.isInactive)).map((e=>({label:a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(lt.Z,{reaction:e.reaction}),e.title),value:e.reaction}))))||[],d=(0,a.I4)((e=>{l({reaction:e})}),[l]);return a.ZP.createElement("div",{className:"settings-content settings-item custom-scroll settings-quick-reaction"},a.ZP.createElement(at.Z,{name:"quick-reaction-settings",options:c,selected:i,onChange:d}))}))),xa=Object.keys(o.MT).length/2,Ua=[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],Oa=[o.MT.Folders,o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersEditFolderFromChatList,o.MT.FoldersIncludedChats,o.MT.FoldersIncludedChatsFromChatList,o.MT.FoldersExcludedChats,o.MT.FoldersExcludedChatsFromChatList],Ga=[o.MT.PrivacyBlockedUsers,o.MT.PrivacyActiveSessions],Ja=[o.MT.PrivacyPhoneNumberAllowedContacts,o.MT.PrivacyPhoneNumberDeniedContacts],Xa=[o.MT.PrivacyLastSeenAllowedContacts,o.MT.PrivacyLastSeenDeniedContacts],_a=[o.MT.PrivacyProfilePhotoAllowedContacts,o.MT.PrivacyProfilePhotoDeniedContacts],za=[o.MT.PrivacyForwardingAllowedContacts,o.MT.PrivacyForwardingDeniedContacts],Ya=[o.MT.PrivacyGroupChatsAllowedContacts,o.MT.PrivacyGroupChatsDeniedContacts],Ha=(0,a.X$)((({isActive:e,currentScreen:t,foldersState:n,foldersDispatch:s,onScreenSelect:r,onReset:i,shouldSkipTransition:l})=>{const[c,d]=(0,nn.Z)(sn,an),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(rn,{currentScreen:t,onReset:m,onSaveFilter:u,onScreenSelect:r,editedFolderId:n.folderId}),function(i,l){const u={[o.MT.PrivacyPhoneNumber]:Ja.includes(l),[o.MT.PrivacyLastSeen]:Xa.includes(l),[o.MT.PrivacyProfilePhoto]:_a.includes(l),[o.MT.PrivacyForwarding]:za.includes(l),[o.MT.PrivacyGroupChats]:Ya.includes(l)},h=Ua.includes(l),Z=Oa.includes(l),P=Ga.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(cn,{onScreenSelect:r,isActive:e,onReset:m});case o.MT.EditProfile:return a.ZP.createElement(Cn,{onScreenSelect:r,isActive:e&&i,onReset:m});case o.MT.General:return a.ZP.createElement(zn,{onScreenSelect:r,isActive:i||l===o.MT.GeneralChatBackgroundColor||l===o.MT.GeneralChatBackground||l===o.MT.QuickReaction||P||Z,onReset:m});case o.MT.QuickReaction:return a.ZP.createElement(Da,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.Notifications:return a.ZP.createElement(ma,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.DataStorage:return a.ZP.createElement(In,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.Privacy:return a.ZP.createElement(ua,{onScreenSelect:r,isActive:i||P||h,onReset:m});case o.MT.Language:return a.ZP.createElement(ha,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.GeneralChatBackground:return a.ZP.createElement(sa,{onScreenSelect:r,isActive:i||l===o.MT.GeneralChatBackgroundColor,onReset:m});case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement(ca,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyActiveSessions:return a.ZP.createElement(pa,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyBlockedUsers:return a.ZP.createElement(fa,{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(Pa,{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($a,{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($a,{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(Fn,{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(Ra,{currentScreen:t,state:c,dispatch:d,shownScreen:l,isActive:i,onScreenSelect:r,onReset:m});default:return}}(i,h))}return a.ZP.createElement(R.Z,{id:"Settings",name:l?"none":f.s0,activeKey:t,renderCount:xa},h)})),Va=(0,G.P2)((e=>e()),6e4,!0),ja=(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}}))((({isActive:e,filter:t,usersById:n,userStatusesById:r,contactIds:o,serverTimeOffset:i,onReset:l})=>{const{loadContactList:c,openChat:d}=(0,s.uC)();(0,a.d4)((()=>{Va((()=>{c()}))})),(0,m.ZP)(e,l);const u=(0,a.I4)((e=>{d({id:e,shouldReplaceHistory:!0})}),[d]),h=(0,a.Ye)((()=>{if(!o)return;const e=(0,v.kK)(o,n,t);return(0,v.Z0)(e,n,r,void 0,i)}),[o,t,n,r,i]),[Z,P]=(0,ye.Z)(void 0,h,Boolean(t));return a.ZP.createElement(Te.Z,{items:Z,onLoadMore:P,className:"chat-list custom-scroll"},null!=Z&&Z.length?Z.map((e=>a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable",onClick:()=>u(e),ripple:!f.wB},a.ZP.createElement(Re.Z,{userId:e,forceShowSelf:!0,avatarSize:"large"})))):Z&&!Z.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"}))}))),Ka=(0,G.P2)((e=>e()),6e4,!0),qa=(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}}))((({isChannel:e,isActive:t,selectedMemberIds:n,onSelectedMemberIdsChange:r,onNextStep:o,onReset:i,chatsById:l,localContactIds:c,searchQuery:d,isSearching:h,localUserIds:Z,globalUserIds:P})=>{const{loadContactList:g,setGlobalSearchQuery:p}=(0,s.uC)();(0,a.d4)((()=>{Ka((()=>{g()}))}));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,v.kK)(c,e,d):[];return(0,v.ih)((0,me.Tw)([...t,...Z||[],...P||[]]).filter((t=>{const n=e[t];return!n||!n.isSelf&&(n.canBeInvitedToGroup||!(0,v.cS)(n))})),l,!1,n)}),[c,l,d,Z,P,n]),b=(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(L.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(Fa.Z,{itemIds:f,selectedIds:n,filterValue:d,filterPlaceholder:E("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:r,onFilterChange:C}),a.ZP.createElement(mn.Z,{isShown:Boolean(n.length||e),onClick:b,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},a.ZP.createElement("i",{className:"icon-arrow-right"}))))}))),Wa=(0,a.X$)((0,s.c$)((e=>{const{progress:t,error:n}=e.chatCreation||{};return{creationProgress:t,creationError:n}}))((({isChannel:e,isActive:t,memberIds:n,onReset:r,creationProgress:i,creationError:l})=>{const{createGroupChat:c,createChannel:d}=(0,s.uC)(),h=(0,u.Z)();(0,m.ZP)(t,r);const[Z,P]=(0,a.eJ)(""),[v,g]=(0,a.eJ)(""),[p,E]=(0,a.eJ)(),[C,f]=(0,a.eJ)(),b="Chat title can't be empty",I="Channel title can't be empty",y="Sorry, creating supergroups is not yet supported",N=i===o.Nh.InProgress,S=(0,a.I4)((e=>{const{value:t}=e.currentTarget,n=t.replace(/^\s+/,"");P(n),n!==t&&(e.currentTarget.value=n)}),[]),w=(0,a.I4)((e=>{g(e.currentTarget.value)}),[]),k=(0,a.I4)((()=>{Z.length?n.length>199?f(y):c({title:Z,photo:p,memberIds:n}):f(b)}),[Z,n,c,p,b,y]),M=(0,a.I4)((()=>{Z.length?d({title:Z,about:v,photo:p,memberIds:n}):f(I)}),[Z,d,v,p,n,I]);(0,a.d4)((()=>{i===o.Nh.Complete&&r(!0)}),[i,r]);const T=l&&h(l)||(C!==b&&C!==I?C:void 0);return a.ZP.createElement("div",{className:"NewChat"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>r(),ariaLabel:"Return to member selection"},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("h3",null,h(e?"NewChannel":"NewGroup"))),a.ZP.createElement("div",{className:"NewChat-inner step-2"},a.ZP.createElement(dn.Z,{onChange:E,title:h("AddPhoto")}),a.ZP.createElement(Me.Z,{value:Z,onChange:S,label:h(e?"EnterChannelName":"GroupName"),error:C===b||C===I?C:void 0}),e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Me.Z,{value:v,onChange:w,label:h("DescriptionOptionalPlaceholder")}),a.ZP.createElement("p",{className:"note"},h("DescriptionInfo"))),T&&a.ZP.createElement("p",{className:"error"},T),n.length>0&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"chat-members-heading"},h("GroupInfo.ParticipantCount",n.length,"i")),a.ZP.createElement("div",{className:"chat-members-list custom-scroll"},n.map((e=>a.ZP.createElement(Le.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Re.Z,{userId:e}))))))),a.ZP.createElement(mn.Z,{isShown:0!==Z.length,onClick:e?M:k,disabled:N,ariaLabel:e?h("ChannelIntro.CreateChannel"):"Create Group"},N?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Qa=Object.keys(o.du).length/2,es=(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(R.Z,{id:"NewChat",name:f.s0,renderCount:Qa,activeKey:n},(s=>{switch(n){case o.du.NewChannelStep1:case o.du.NewGroupStep1:return a.ZP.createElement(qa,{isChannel:t,isActive:e,selectedMemberIds:i,onSelectedMemberIdsChange:l,onNextStep:c,onReset:r});case o.du.NewChannelStep2:case o.du.NewGroupStep2:return a.ZP.createElement(Wa,{isChannel:t,isActive:s&&e,memberIds:i,onReset:r});default:return}}))}));var ts=n(1080);const ns=(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(L.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(ts.Z,{folderType:"archived",isActive:e}))}));var as=n(1218);const ss=(0,a.X$)((0,s.c$)((e=>{const{byId:t,orderedIds:n}=e.chatFolders;return{foldersById:t,folderOrderedIds:n}}))((({isOpen:e,chatId:t,foldersById:n,folderOrderedIds:r,onClose:o,onCloseAnimationEnd:i})=>{const{editChatFolders:l}=(0,s.uC)(),c=(0,u.Z)(),d=(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]),[m,h]=(0,a.eJ)(d),Z=(0,a.Ye)((()=>(null==r?void 0:r.map((e=>({label:n?n[e].title:"",value:String(e)}))))||[]),[r,n]),P=(0,a.I4)((()=>{const e=d.filter((e=>!m.includes(e))).map(Number),n=m.filter((e=>!d.includes(e))).map(Number);l({chatId:t,idsToRemove:e,idsToAdd:n}),o()}),[t,l,d,o,m]);if(n&&r)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:o,onCloseAnimationEnd:i,onEnter:P,className:"delete",title:c("FilterAddTo")},a.ZP.createElement(as.Z,{options:Z,selected:m,onChange:h,round:!0}),a.ZP.createElement(L.Z,{color:"primary",className:"confirm-dialog-button",isText:!0,onClick:P},c("FilterAddTo")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:o},c("Cancel")))})));var rs=n(4319),os=n(647);function is(e){return e?"lng_context_copy_selected":"lng_context_copy_text"}let ls,cs;const ds={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},ms=e=>"changedTouches"in e?e.changedTouches[0].clientY:0,us=e=>{const t="deltaY"in e?e.deltaY:ms(e);if(!ls||!ls.contains(e.target)||ls.scrollTop<=0&&t<=0||ls.scrollTop>=ls.scrollHeight-ls.offsetHeight&&t>=0){if(cs&&e.target.closest(cs))return;e.preventDefault()}};function hs(e){ds[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 Zs(e,t){ls=e,cs=t,document.addEventListener("wheel",us,{passive:!1}),document.addEventListener("touchmove",us,{passive:!1}),document.onkeydown=hs}function Ps(){ls=void 0,cs=void 0,document.removeEventListener("wheel",us),document.removeEventListener("touchmove",us),document.onkeydown=null}var vs=n(3394),gs=n(2328);const ps=({reaction:e,onSendReaction:t,isReady:n})=>{var s;const o=(0,a.sO)(null),[i,l,c]=(0,De.Z)(),d=(0,h.Z)(`document${null===(s=e.selectAnimation)||void 0===s?void 0:s.id}`,!n,r.IU.Lottie),[m,u]=(0,De.Z)(),Z=!m,P=d,v=n&&i;return a.ZP.createElement("div",{className:"reaction",onClick:function(){if(!o.current)return;const{x:n,y:a}=o.current.getBoundingClientRect();t(e.reaction,n,a)},ref:o,onMouseEnter:n?l:void 0},Z&&a.ZP.createElement(lt.Z,{reaction:e.reaction}),P&&a.ZP.createElement(mt.Z,{id:`select_${e.reaction}`,animationData:d,play:v,noLoop:!0,onEnded:c,size:32,onLoad:u}))},Es=(0,a.X$)((({availableReactions:e,enabledReactions:t,onSendReaction:n,isPrivate:s,isReady:r})=>{const o=(0,a.sO)(null),[i,l]=(0,De.Z)(!1);(0,ft.Z)(o.current,!i),(0,a.bt)((()=>{l()}),[l]);const c=e=>{o&&("deltaY"in e?e.deltaY:ms(e))&&e.preventDefault()};if((s||null!=t&&t.length)&&e)return a.ZP.createElement("div",{className:"ReactionSelector",onWheelCapture:c,onTouchMove:c},a.ZP.createElement("div",{className:"bubble-big"}),a.ZP.createElement("div",{className:"bubble-small"}),a.ZP.createElement("div",{className:"items-wrapper"},a.ZP.createElement("div",{className:"items no-scrollbar",ref:o},null==e?void 0:e.map((e=>{if(!e.isInactive&&(s||t&&t.includes(e.reaction)))return a.ZP.createElement(ps,{key:e.reaction,isReady:r,onSendReaction:n,reaction:e})})))))})),Cs=(0,a.X$)((({availableReactions:e,isOpen:t,message:n,isPrivate:s,enabledReactions:o,anchor:i,canSendNow:l,canReschedule:c,canReply:d,canEdit:m,canPin:h,canUnpin:Z,canDelete:P,canReport:g,canForward:p,canFaveSticker:E,canUnfaveSticker:C,canCopy:b,canCopyLink:I,canSelect:y,canDownload:N,isDownloading:S,canShowSeenBy:w,canShowReactionsCount:k,canRemoveReaction:M,canShowReactionList:T,seenByRecentUsers:L,onReply:A,onEdit:R,onPin:F,onUnpin:$,onForward:D,onDelete:x,onReport:U,onFaveSticker:O,onUnfaveSticker:G,onSelect:J,onSend:_,onReschedule:z,onClose:Y,onCloseAnimationEnd:H,onCopyLink:V,onDownload:j,onShowSeenBy:K,onShowReactors:q,onSendReaction:W})=>{var Q,ee,te,ne,ae;const se=(0,a.sO)(null),re=(0,a.sO)(null),oe=function(e,t,n){const a=[],s=(0,v.UD)(e),o=(0,v.O$)(e)||((0,v.Cg)(e)?void 0:(0,v.F$)(e)),i=(0,v.Ti)(e,"inline"),l=o&&(i||(0,v.BM)(e))&&rs.yl,c=window.getSelection();if(l&&a.push({label:"lng_context_copy_image",handler:()=>{Promise.resolve(i?os.he(i,r.IU.BlobUrl):o.blobUrl).then(rs.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:is(e),handler:()=>{const n=e&&c?c.toString():s;(0,rs.TE)(n),t&&t()}})}return n&&a.push({label:"lng_context_copy_message_link",handler:()=>{n(),t&&t()}}),a}(n,Y,I?V:void 0),ie=!(s||null!=o&&o.length),le=T&&!ie,[ce,de,me]=(0,De.Z)(),ue=(0,a.I4)((()=>document.querySelector(`.Transition__slide--active > .MessageList div[data-message-id="${n.id}"]`)),[n.id]),he=(0,a.I4)((()=>document.querySelector(".Transition__slide--active > .MessageList")),[]),Ze=(0,a.I4)((()=>document.querySelector(".MessageContextMenu .bubble")),[]),Pe=(0,a.I4)((()=>{W(void 0,0,0)}),[W]);(0,a.d4)((()=>{t?setTimeout((()=>{de()}),200):me()}),[t,de,me]);const ve=f.wB&&(null===(Q=document.querySelector(".AudioPlayer-content"))||void 0===Q?void 0:Q.offsetHeight)||0,pe=document.querySelector(".HeaderPinnedMessage-wrapper"),Ee=(f.wB&&!ve||!f.wB&&(null==pe?void 0:pe.classList.contains("full-width")))&&(null==pe?void 0:pe.offsetHeight)||0,{positionX:Ce,positionY:fe,style:be,menuStyle:Ie,withScroll:ye}=(0,vs.Z)(i,ue,he,Ze,10,document.querySelector(".MiddleHeader").offsetHeight,le?32:void 0,Ee+ve);(0,a.d4)((()=>(Zs(ye?re.current:void 0,".ReactionSelector"),Ps)),[ye]);const Ne=(0,u.Z)();return a.ZP.createElement(gs.Z,{ref:se,isOpen:t,positionX:Ce,positionY:fe,style:be,menuStyle:Ie,className:(0,X.Z)("MessageContextMenu","fluid",le&&"with-reactions"),onClose:Y,onCloseAnimationEnd:H},T&&a.ZP.createElement(Es,{enabledReactions:o,onSendReaction:W,isPrivate:s,availableReactions:e,isReady:ce}),a.ZP.createElement("div",{className:"scrollable-content custom-scroll",style:Ie,ref:re},M&&a.ZP.createElement(B.Z,{icon:"reactions",onClick:Pe},"Remove Reaction"),l&&a.ZP.createElement(B.Z,{icon:"send-outline",onClick:_},Ne("MessageScheduleSend")),c&&a.ZP.createElement(B.Z,{icon:"schedule",onClick:z},Ne("MessageScheduleEditTime")),d&&a.ZP.createElement(B.Z,{icon:"reply",onClick:A},Ne("Reply")),m&&a.ZP.createElement(B.Z,{icon:"edit",onClick:R},Ne("Edit")),E&&a.ZP.createElement(B.Z,{icon:"favorite",onClick:O},Ne("AddToFavorites")),C&&a.ZP.createElement(B.Z,{icon:"favorite",onClick:G},Ne("Stickers.RemoveFromFavorites")),b&&oe.map((e=>a.ZP.createElement(B.Z,{key:e.label,icon:"copy",onClick:e.handler},Ne(e.label)))),h&&a.ZP.createElement(B.Z,{icon:"pin",onClick:F},Ne("DialogPin")),Z&&a.ZP.createElement(B.Z,{icon:"unpin",onClick:$},Ne("DialogUnpin")),N&&a.ZP.createElement(B.Z,{icon:"download",onClick:j},Ne(S?"lng_context_cancel_download":"lng_media_download")),p&&a.ZP.createElement(B.Z,{icon:"forward",onClick:D},Ne("Forward")),y&&a.ZP.createElement(B.Z,{icon:"select",onClick:J},Ne("Common.Select")),g&&a.ZP.createElement(B.Z,{icon:"flag",onClick:U},Ne("lng_context_report_msg")),(w||k)&&a.ZP.createElement(B.Z,{icon:k?"reactions":"group",onClick:k?q:K,disabled:!(k||null!==(ee=n.seenByUserIds)&&void 0!==ee&&ee.length)},k&&null!==(te=n.reactors)&&void 0!==te&&te.count?w&&null!==(ne=n.seenByUserIds)&&void 0!==ne&&ne.length?Ne("Chat.OutgoingContextMixedReactionCount",[n.reactors.count,n.seenByUserIds.length]):Ne("Chat.ContextReactionCount",n.reactors.count,"i"):null!==(ae=n.seenByUserIds)&&void 0!==ae&&ae.length?Ne("Conversation.ContextMenuSeen",n.seenByUserIds.length,"i"):Ne("Conversation.ContextMenuNoViews"),a.ZP.createElement("div",{className:"avatars"},null==L?void 0:L.map((e=>a.ZP.createElement(ge.Z,{size:"micro",user:e}))))),P&&a.ZP.createElement(B.Z,{destructive:!0,icon:"delete",onClick:x},Ne("Delete"))))})),fs=2*I.Gw,bs=(0,a.X$)((0,s.c$)(((e,{message:t,messageListType:n})=>{var a,s,r;const{threadId:o}=(0,g.Bt)(e)||{},l=(0,g.xs)(e,t.chatId),c=(0,g.Z1)(e,t.chatId),{noOptions:d,canReply:m,canPin:u,canUnpin:h,canDelete:Z,canReport:P,canEdit:p,canForward:E,canFaveSticker:C,canUnfaveSticker:f,canCopy:b,canCopyLink:I,canSelect:y,canDownload:N}=o&&(0,g._k)(e,t,o)||{},S="pinned"===n,w="scheduled"===n,k=c&&(0,v.eA)(c),M=Boolean(c&&(0,v.Bf)(c)&&(0,v.B4)(t)&&!w&&c.membersCount&&c.membersCountDate.now()/1e3-i.EH),T=c&&(0,v.YC)(c.id),L=(0,v.Lo)(t),A=!k&&!w&&!L&&!T&&t.reactions&&!(0,v.JE)(t.reactions)&&t.reactions.canSeeList,R=T&&(null===(a=t.reactions)||void 0===a||null===(s=a.results)||void 0===s?void 0:s.some((e=>e.isChosen))),F=(0,g.EV)(e,t);return{availableReactions:e.availableReactions,noOptions:d,canSendNow:w,canReschedule:w,canReply:!S&&!w&&m,canPin:!w&&u,canUnpin:!w&&h,canDelete:Z,canReport:P,canEdit:!S&&p,canForward:!F&&!w&&E,canFaveSticker:!w&&C,canUnfaveSticker:!w&&f,canCopy:!F&&b,canCopyLink:!F&&!w&&I,canSelect:y,canDownload:!F&&N,activeDownloads:l,canShowSeenBy:M,enabledReactions:null==c||null===(r=c.fullInfo)||void 0===r?void 0:r.enabledReactions,isPrivate:T,hasFullInfo:Boolean(null==c?void 0:c.fullInfo),canShowReactionsCount:A,canShowReactionList:!L&&!w&&(null==c?void 0:c.id)!==i.aw,canRemoveReaction:R}}))((({availableReactions:e,isOpen:t,messageListType:n,chatUsername:r,message:o,album:i,anchor:l,onClose:c,onCloseAnimationEnd:d,noOptions:m,canSendNow:u,hasFullInfo:h,canReschedule:Z,canReply:P,canPin:v,canUnpin:g,canDelete:p,canReport:E,canShowReactionsCount:C,canShowReactionList:f,canRemoveReaction:b,canEdit:I,enabledReactions:y,isPrivate:N,canForward:S,canFaveSticker:w,canUnfaveSticker:k,canCopy:M,canCopyLink:T,canSelect:L,canDownload:A,activeDownloads:R,canShowSeenBy:F})=>{var B;const{setReplyingToId:$,setEditingId:D,pinMessage:x,openForwardMenu:U,faveSticker:O,unfaveSticker:G,toggleMessageSelection:J,sendScheduledMessages:X,rescheduleMessage:_,downloadMessageMedia:Y,cancelMessageMediaDownload:H,loadSeenBy:V,openSeenByModal:j,sendReaction:q,openReactorListModal:W,loadFullChat:Q,loadReactors:ee}=(0,s.uC)(),{transitionClassNames:te}=(0,z.Z)(t,d,void 0,!1),[ne,ae]=(0,a.eJ)(!0),[se,re]=(0,a.eJ)(!1),[oe,ie]=(0,a.eJ)(!1),[le,ce]=(0,a.eJ)(!1),[de,me,ue]=(0,De.Z)();(0,a.d4)((()=>{F&&t&&V({chatId:o.chatId,messageId:o.id})}),[V,t,o.chatId,o.id,F]),(0,a.d4)((()=>{C&&t&&ee({chatId:o.chatId,messageId:o.id})}),[C,t,ee,o.chatId,o.id]),(0,a.d4)((()=>{h||N||!t||Q({chatId:o.chatId})}),[h,t,N,Q,o.chatId]);const he=(0,a.Ye)((()=>{var e,t,n;if(null!==(e=o.reactions)&&void 0!==e&&null!==(t=e.recentReactions)&&void 0!==t&&t.length){var a,r;const e=(0,s.Rd)().users.byId;return null===(a=o.reactions)||void 0===a||null===(r=a.recentReactions)||void 0===r?void 0:r.slice(0,3).map((({userId:t})=>e[t])).filter(Boolean)}if(!o.seenByUserIds)return;const i=(0,s.Rd)().users.byId;return null===(n=o.seenByUserIds)||void 0===n?void 0:n.slice(0,3).map((e=>i[e])).filter(Boolean)}),[null===(B=o.reactions)||void 0===B?void 0:B.recentReactions,o.seenByUserIds]),Ze=i?i.messages.some((e=>R.includes(e.id))):R.includes(o.id),Pe=(0,a.I4)((()=>{ae(!1),re(!0)}),[]),ve=(0,a.I4)((()=>{ae(!1),ie(!0)}),[]),ge=(0,a.I4)((()=>{ae(!1),c()}),[c]),pe=(0,a.I4)((()=>{re(!1),c()}),[c]),Ee=(0,a.I4)((()=>{ie(!1),c()}),[c]),Ce=(0,a.I4)((()=>{ce(!1),c()}),[c]),fe=(0,a.I4)((()=>{ue(),c()}),[ue,c]),be=(0,a.I4)((()=>{$({messageId:o.id}),ge()}),[$,o.id,ge]),Ie=(0,a.I4)((()=>{D({messageId:o.id}),ge()}),[D,o.id,ge]),ye=(0,a.I4)((()=>{ae(!1),ce(!0)}),[]),Ne=(0,a.I4)((()=>{x({messageId:o.id,isUnpin:!0}),ge()}),[x,o.id,ge]),Se=(0,a.I4)((()=>{if(ge(),null!=i&&i.messages){const e=i.messages.map((({id:e})=>e));U({fromChatId:o.chatId,messageIds:e})}else U({fromChatId:o.chatId,messageIds:[o.id]})}),[U,o,ge,i]),we=(0,a.I4)((()=>{ge(),O({sticker:o.content.sticker})}),[ge,o.content.sticker,O]),ke=(0,a.I4)((()=>{ge(),G({sticker:o.content.sticker})}),[ge,o.content.sticker,G]),Me=(0,a.I4)((()=>{const e=null!=i&&i.messages?{messageId:o.id,childMessageIds:i.messages.map((({id:e})=>e)),withShift:!1}:{messageId:o.id,withShift:!1};J(e),ge()}),[ge,o.id,J,i]),Te=(0,a.I4)((()=>{X({chatId:o.chatId,id:o.id}),ge()}),[ge,o.chatId,o.id,X]),Le=(0,a.I4)((()=>{ae(!1),me()}),[me]),Ae=(0,a.I4)((()=>{ge(),j({chatId:o.chatId,messageId:o.id})}),[ge,o.chatId,o.id,j]),Re=(0,a.I4)((()=>{ge(),W({chatId:o.chatId,messageId:o.id})}),[ge,W,o.chatId,o.id]),Fe=(0,a.I4)((e=>{_({chatId:o.chatId,messageId:o.id,scheduledAt:Math.round(e.getTime()/1e3)})}),[o.chatId,o.id,_]),Be=(0,a.I4)((()=>{(0,rs.TE)(`https://t.me/${r||`c/${o.chatId.replace("-","")}`}/${o.id}`),ge()}),[r,ge,o.chatId,o.id]),$e=(0,a.I4)((()=>{((null==i?void 0:i.messages)||[o]).forEach((e=>{Ze?H({message:e}):Y({message:e})})),ge()}),[i,o,ge,Ze,H,Y]),xe=(0,a.I4)(((e,t,n)=>{q({chatId:o.chatId,messageId:o.id,reaction:e,x:t,y:n,startSize:fs}),ge()}),[ge,o.chatId,o.id,q]),Ue=(0,a.Ye)((()=>(i?i.messages:[o]).map((({id:e})=>e))),[i,o]);if(m)return void ge();const Oe=new Date;return Oe.setFullYear(Oe.getFullYear()+1),a.ZP.createElement("div",{className:["ContextMenuContainer",te].join(" ")},a.ZP.createElement(Cs,{availableReactions:e,message:o,isPrivate:N,isOpen:ne,enabledReactions:y,anchor:l,canShowReactionsCount:C,canShowReactionList:f,canRemoveReaction:b,canSendNow:u,canReschedule:Z,canReply:P,canDelete:p,canReport:E,canPin:v,canUnpin:g,canEdit:I,canForward:S,canFaveSticker:w,canUnfaveSticker:k,canCopy:M,canCopyLink:T,canSelect:L,canDownload:A,canShowSeenBy:F,isDownloading:Ze,seenByRecentUsers:he,onReply:be,onEdit:Ie,onPin:ye,onUnpin:Ne,onForward:Se,onDelete:Pe,onReport:ve,onFaveSticker:we,onUnfaveSticker:ke,onSelect:Me,onSend:Te,onReschedule:Le,onClose:ge,onCopyLink:Be,onDownload:$e,onShowSeenBy:Ae,onSendReaction:xe,onShowReactors:Re}),a.ZP.createElement(We,{isOpen:se,isSchedule:"scheduled"===n,onClose:pe,album:i,message:o}),a.ZP.createElement(st,{isOpen:oe,onClose:Ee,messageIds:Ue}),a.ZP.createElement(Qe,{isOpen:le,messageId:o.id,chatId:o.chatId,onClose:Ce}),a.ZP.createElement(Ke,{isOpen:de,withTimePicker:!0,selectedAt:1e3*o.date,maxAt:(0,K._F)(Oe),isFutureMode:!0,onClose:fe,onSubmit:Fe}))}))),Is=(0,a.X$)((0,s.c$)(((e,{fromSticker:t,stickerSetShortName:n})=>{const a=(0,g.Bt)(e),{chatId:s,threadId:r}=a||{},o=s&&(0,g.Z1)(e,s),i=o?(0,v.H5)(o):void 0;return{canSendStickers:Boolean(o&&r&&(0,v.Qm)(o,r)&&(null==i?void 0:i.canSendStickers)),stickerSet:t?(0,g.Ny)(e,t.stickerSetId):n?(0,g.E_)(e,n):void 0}}))((({isOpen:e,fromSticker:t,stickerSetShortName:n,stickerSet:r,canSendStickers:o,onClose:l})=>{const{loadStickers:c,toggleStickerSet:d,sendMessage:m}=(0,s.uC)(),h=(0,a.sO)(null),Z=(0,u.Z)(),{observe:P}=(0,$n.S1)({rootRef:h,throttleMs:200,isDisabled:!e});(0,a.d4)((()=>{if(e)if(t){const{stickerSetId:e,stickerSetAccessHash:n}=t;c({stickerSetId:e,stickerSetAccessHash:n})}else n&&c({stickerSetShortName:n})}),[e,t,c,n]);const v=(0,a.I4)((e=>{e={...e,isPreloadedGlobally:!0},m({sticker:e}),l()}),[l,m]),g=(0,a.I4)((()=>{r&&(d({stickerSetId:r.id}),l())}),[l,r,d]);return a.ZP.createElement(ke.Z,{className:"StickerSetModal",isOpen:e,onClose:l,hasCloseButton:!0,title:r?(0,ve.Z)(r.title,["emoji","links"]):Z("AccDescrStickerSet")},null!=r&&r.stickers?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{ref:h,className:"stickers custom-scroll"},r.stickers.map((e=>a.ZP.createElement(On.Z,{sticker:e,size:i.yK,observeIntersection:P,onClick:o?v:void 0,clickArg:e})))),a.ZP.createElement("div",{className:"button-wrapper"},a.ZP.createElement(L.Z,{size:"smaller",fluid:!0,color:r.installedDate?"danger":"primary",onClick:g},Z(r.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",r.count,"i")))):a.ZP.createElement(we.Z,null))})));var ys=n(2898);const Ns=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.Z1)(e,t);if(!a||a.isRestricted)return{};const s=(0,v.YC)(a.id),r=s?(0,g.dy)(e,t):void 0,o=r&&(0,v.kw)(r);return{chat:a,isMuted:(0,v.i4)(a,(0,g.dZ)(e),(0,g.NJ)(e)),isPrivate:s,canAddContact:o,canDeleteChat:(0,v.cc)(a),hasLinkedChat:Boolean(null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId)}}))((({chatId:e,isOpen:t,withExtraActions:n,anchor:r,isChannel:o,canStartBot:i,canRestartBot:l,canSubscribe:c,canSearch:d,canCall:m,canMute:h,canLeave:Z,canEnterVoiceChat:P,canCreateVoiceChat:v,chat:g,isPrivate:p,isMuted:E,canDeleteChat:C,hasLinkedChat:b,canAddContact:I,onSubscribeChannel:y,onSearchClick:N,onClose:S,onCloseAnimationEnd:w})=>{const{updateChatMutedState:k,enterMessageSelectMode:M,sendBotCommand:T,restartBot:L,joinGroupCall:A,createGroupCall:R,openLinkedChat:F,addContact:$,openCallFallbackConfirm:D}=(0,s.uC)(),[x,U]=(0,a.eJ)(!0),[O,G]=(0,a.eJ)(!1),{x:J,y:X}=r;(0,z.Z)(t,w,void 0,!1);const _=(0,a.I4)((()=>{U(!1),G(!0)}),[]),Y=(0,a.I4)((()=>{U(!1),S()}),[S]),H=(0,a.I4)((()=>{G(!1),S()}),[S]),V=(0,a.I4)((()=>{T({command:"/start"})}),[T]),j=(0,a.I4)((()=>{L({chatId:e})}),[e,L]),K=(0,a.I4)((()=>{k({chatId:e,isMuted:!E}),Y()}),[e,Y,E,k]),q=(0,a.I4)((()=>{v?R({chatId:e}):A({chatId:e}),Y()}),[Y,v,e,A,R]),W=(0,a.I4)((()=>{F({id:e}),Y()}),[e,Y,F]),Q=(0,a.I4)((()=>{$({userId:e}),Y()}),[$,e,Y]),ee=(0,a.I4)((()=>{y(),Y()}),[Y,y]),te=(0,a.I4)((()=>{D(),Y()}),[Y,D]),ne=(0,a.I4)((()=>{N(),Y()}),[Y,N]),ae=(0,a.I4)((()=>{M(),Y()}),[Y,M]);(0,a.d4)((()=>(Zs(),Ps)),[]);const se=(0,u.Z)();return a.ZP.createElement(ys.Z,null,a.ZP.createElement("div",{className:"HeaderMenuContainer"},a.ZP.createElement(gs.Z,{isOpen:x,positionX:"right",style:`left: ${J}px;top: ${X}px;`,onClose:Y},n&&i&&a.ZP.createElement(B.Z,{icon:"bots",onClick:V},se("BotStart")),n&&l&&a.ZP.createElement(B.Z,{icon:"bots",onClick:j},se("BotRestart")),n&&c&&a.ZP.createElement(B.Z,{icon:o?"channel":"group",onClick:ee},se(o?"ProfileJoinChannel":"ProfileJoinGroup")),I&&a.ZP.createElement(B.Z,{icon:"add-user",onClick:Q},se("AddContact")),f.wB&&m&&a.ZP.createElement(B.Z,{icon:"phone",onClick:te},se("Call")),f.wB&&d&&a.ZP.createElement(B.Z,{icon:"search",onClick:ne},se("Search")),h&&a.ZP.createElement(B.Z,{icon:E?"unmute":"mute",onClick:K},se(E?"ChatsUnmute":"ChatsMute")),(P||v)&&a.ZP.createElement(B.Z,{icon:"voice-chat",onClick:q},se(v?"StartVoipChat":"VoipGroupJoinCall")),b&&a.ZP.createElement(B.Z,{icon:o?"comments":"channel",onClick:W},se(o?"ViewDiscussion":"lng_profile_view_channel")),a.ZP.createElement(B.Z,{icon:"select",onClick:ae},se("ReportSelectMessages")),Z&&a.ZP.createElement(B.Z,{destructive:!0,icon:"delete",onClick:_},se(p?"DeleteChatUser":C?"GroupInfo.DeleteAndExit":o?"LeaveChannel":"Group.LeaveGroup"))),g&&a.ZP.createElement(pt.Z,{isOpen:O,onClose:H,chat:g})))})));var Ss=n(9589);const ws=(0,G.Ds)((e=>e()),200,!1),ks=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.jr)(e);if(!t)return{};const{query:n,results:a}=(0,g.n5)(e)||{},{totalCount:s,foundIds:r}=a||{};return{chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}}))((({isActive:e,chat:t,query:n,totalCount:r,foundIds:o,isHistoryCalendarOpen:i})=>{const{setLocalTextSearchQuery:l,searchTextMessagesLocal:c,focusMessage:d,closeLocalTextSearch:m,openHistoryCalendar:u}=(0,s.uC)(),h=(0,a.sO)(null),[Z,P]=(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===h.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&&o&&o.length?(d({chatId:t.id,messageId:o[o.length-1]}),P(0)):P(-1)}),[t,d,o]),(0,a.d4)((()=>{Array.from(document.querySelectorAll("input")).forEach((t=>{t.disabled=Boolean(e&&t!==h.current)})),Array.from(document.querySelectorAll("div[contenteditable]")).forEach((t=>{t.contentEditable=e?"false":"true"}))}),[e]),(0,a.d4)((()=>{e||h.current.blur()}),[e]),(0,a.bt)((()=>{document.querySelector("#MobileSearch input").blur()}),[i]);const v=(0,a.I4)((e=>{l({query:e}),e.length&&ws(c)}),[c,l]),g=(0,a.I4)((()=>{if(t&&o){const e=Z+1;d({chatId:t.id,messageId:o[o.length-1-e]}),P(e)}}),[t,Z,d,o]),p=(0,a.I4)((()=>{if(t&&o){const e=Z-1;d({chatId:t.id,messageId:o[o.length-1-e]}),P(e)}}),[t,Z,d,o]);return a.ZP.createElement("div",{id:"MobileSearch",className:e?"active":""},a.ZP.createElement("div",{className:"header"},a.ZP.createElement(L.Z,{size:"smaller",round:!0,color:"translucent",onClick:m},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement(Ss.Z,{ref:h,value:n,onChange:v})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement("div",{className:"counter"},n?null!=o&&o.length?`${Z+1} of ${r}`:o&&!o.length?"No results":"":a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>u({selectedAt:(0,K._F)(Date.now())}),ariaLabel:"Search messages by date"},a.ZP.createElement("i",{className:"icon-calendar"}))),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:g,disabled:!o||!o.length||Z===o.length-1},a.ZP.createElement("i",{className:"icon-up"})),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:p,disabled:!o||!o.length||0===Z},a.ZP.createElement("i",{className:"icon-down"}))))})));var Ms=n(5376),Ts=n(9295),Ls=n(3575),As=n(7002),Rs=n(3616);function Fs(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 Bs=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,$s.Z)(a,r[t],e,10)}}var xs=n(3570);function Us({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,xs.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,tt.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 Os=(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.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=Us({isActive:e,items:r,onSelect:d,shouldSelectOnTab:!0,shouldSaveSelectionOnUpdateItems:!0,onClose:t});(0,a.d4)((()=>{Ds(".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(Le.Z,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>c(e),focus:m===t},a.ZP.createElement(Re.Z,{userId:e,avatarSize:"small",withUsername:!0})))))}));var Gs=n(9830);const Js=(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:v,onSend:g,onFileAppend:p,onClear:C})=>{const f=(0,a.sO)(null),b=(0,P.Z)(n),I=n.length?n:b,y=Boolean(n.length),[N,S,w]=(0,De.Z)(),k=Boolean(I&&I.every((e=>e.quick))),M=(0,u.Z)(),{isMentionTooltipOpen:T,closeMentionTooltip:A,insertMention:R,mentionFilteredUsers:F}=(0,Ts.Z)(y,s,v,i.nY,l,void 0,o),{isEmojiTooltipOpen:B,closeEmojiTooltip:$,filteredEmojis:D,insertEmoji:x}=(0,Ls.Z)(y,s,d,i.nY,v,m,h,!r);(0,a.d4)((()=>y?(0,E.Z)(C):void 0),[y,C]);const U=(0,a.I4)((()=>{y&&g()}),[y,g]),O=(0,a.I4)((e=>{e.preventDefault(),w();const{dataTransfer:{files:t}}=e;if(null!=t&&t.length){const e=k?Array.from(t).filter((e=>e.type&&i.dI.has(e.type))):Array.from(t);p(e,k)}}),[k,p,w]);if(!I)return;const G=I.every((e=>i.oG.has(e.mimeType))),J=I.every((e=>i.wG.has(e.mimeType))),X=I.every((e=>e.mimeType.startsWith("audio/")));let _="";return _=M(G?"PreviewSender.SendPhoto":J?"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(L.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"},_),a.ZP.createElement(L.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:U},M("Send")))}(),className:"AttachmentModal "+(N?"hovered":"")},a.ZP.createElement("div",{className:"drop-target",onDragEnter:S,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(w,150)),n&&n.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),w())},"data-attach-description":M("Preview.Dragging.AddItems",10)},k?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(As.Z,{name:e.filename,extension:(0,Ms.mD)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0})))),a.ZP.createElement("div",{className:"attachment-caption-wrapper"},a.ZP.createElement(Os,{isOpen:T,onClose:A,onInsertUserName:R,filteredUsers:F,usersById:c}),a.ZP.createElement(Gs.Z,{isOpen:B,emojis:D,onClose:$,onEmojiSelect:x,addRecentEmoji:Z}),a.ZP.createElement(Rs.Z,{id:"caption-input-text",chatId:e,threadId:t,isAttachmentModalInput:!0,html:s,editableInputId:i.nY,placeholder:M("Caption"),onUpdate:v,onSend:g,canAutoFocus:Boolean(r&&n.length)}))))}));var Xs=n(3099);const _s=(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),[v,g]=(0,a.eJ)(!1),[p,C]=(0,a.eJ)(),[f,b]=(0,a.eJ)(),[I,y]=(0,a.eJ)(!1),N=(0,u.Z)(),S=(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),g(!1),C(""),b(""),y(!1))}),[e]),(0,a.d4)((()=>S(s)),[S,e]),(0,a.bt)((()=>{const e=o.current;e&&p!==e.innerHTML&&(e.innerHTML=p)}),[p]);const w=(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"}))}))}),[]),k=(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?w(a):d(a):w(),void y(!0);if(v&&(!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},...v&&{quiz:!0}}};if(v){const{text:e,entities:t}=p&&(0,Xs.Z)(p.substring(0,200))||{};s.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(s)}),[e,i,c,v,f,m,Z,t,w,p]),M=(0,a.I4)(((e,t)=>{const n=[...c];n[e]=t,n[n.length-1].trim().length&&n.length<10?w(n):d(n)}),[c,w]),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]),R=(0,a.I4)((e=>{h(e.target.checked)}),[]),F=(0,a.I4)((e=>{P(e.target.checked)}),[]),B=(0,a.I4)((e=>{g(e.target.checked)}),[]),$=(0,a.I4)((e=>{13===e.keyCode&&k()}),[k]),D=(0,a.I4)((()=>{if(I&&!i.trim().length)return N("lng_polls_choose_question")}),[I,N,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 N("lng_polls_choose_answers")}),[I,N,c]);function U(){return c.map(((e,t)=>a.ZP.createElement("div",{className:"option-wrapper"},a.ZP.createElement(Me.Z,{label:t!==c.length-1||10===c.length?N("OptionHint"):N("CreatePoll.AddOption"),error:x(t),value:e,onChange:e=>M(t,e.currentTarget.value),onKeyPress:$}),t!==c.length-1&&a.ZP.createElement(L.Z,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:N("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(L.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"},N("NewPoll")),a.ZP.createElement(L.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:k},N("Create"))),className:"PollModal"},a.ZP.createElement(Me.Z,{ref:s,label:N("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"},N("PollOptions")),I&&function(){const e=c.map((e=>e.trim())).filter((e=>e.length));return v&&(!f||!e[Number(f)])&&a.ZP.createElement("p",{className:"error"},N("lng_polls_choose_correct"))}(),v?a.ZP.createElement(at.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(fn.Z,{label:N("PollAnonymous"),checked:m,onChange:R}),a.ZP.createElement(fn.Z,{label:N("PollMultiple"),checked:Z,disabled:v,onChange:F}),a.ZP.createElement(fn.Z,{label:N("PollQuiz"),checked:v,disabled:Z,onChange:B}),v&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"options-header"},N("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"},N("CreatePoll.ExplanationInfo")))))}));var zs=n(6503),Ys=n(4284),Hs=n(1367);const Vs=(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"}))})),js=(0,a.X$)((({category:e,index:t,allEmojis:n,observeIntersection:s,shouldRender:r,onEmojiSelect:o})=>{const i=(0,a.sO)(null);(0,$n._N)(i,s);const l=(0,Dn.Z)(r),c=(0,u.Z)(),d=f.wB?Math.floor((b.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(Vs,{key:s.id,emoji:s,onClick:o})}))))})),Ks={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"},qs=[];let Ws,Qs,er;const tr=(0,a.X$)((0,s.c$)((e=>(0,me.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,$n.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-",""));qs[n]=e.isIntersecting}));const t=qs.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&Z(t[Math.floor(t.length/2)].index)}));(0,ft.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,Hs.Z)(e,t)}),[l,h]);const v=(0,u.Z)(),g=(0,a.Ye)((()=>{if(!l)return Pt.D;const e=[...l];return null!=s&&s.length&&e.unshift({id:"recent",name:v("RecentStickers"),emojis:s}),e}),[l,v,s]);(0,a.d4)((()=>{setTimeout((()=>{const e=()=>{c(er.categories),m(er.emojis)};er?e():async function(){return Ws||(Ws=n.e(501).then(n.t.bind(n,7501,19)),Qs=(await Ws).default,er=(0,Ys.NM)(Qs)),Ws}().then(e)}),200)}),[]);const p=(0,a.I4)((e=>{Z(e);const t=document.getElementById(`emoji-category-${e}`);(0,$s.Z)(r.current,t,"start",50,800)}),[]),E=(0,a.I4)(((e,n)=>{t(e,n)}),[t]),C=(0,Bt.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:v.isRtl?"rtl":""},g.map((function(e,t){const n=Ks[e.id];return n&&a.ZP.createElement(L.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")},g.map(((e,t)=>a.ZP.createElement(js,{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))})));var nr=n(6389);const ar=f.wB?8:16,sr=(0,a.X$)((({stickerSet:e,loadAndPlay:t,index:n,observeIntersection:s,shouldRender:r,onStickerSelect:o,onStickerUnfave:l})=>{const c=(0,a.sO)(null);(0,$n._N)(c,s);const d=(0,Dn.Z)(r),m=f.wB?Math.floor((b.Z.get().width-8)/(i.Q+ar)):5,u=Math.ceil(e.count/m)*(i.Q+ar);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(On.Z,{key:n.id,sticker:n,size:i.Q,observeIntersection:s,noAnimate:!t,onClick:o,clickArg:n,onUnfaveClick:"favorite"===e.id?l:void 0})))))})),rr=[],or=(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}}))((({chatId:e,threadId:t,className:n,loadAndPlay:r,canSendStickers:o,recentStickers:l,favoriteStickers:c,addedSetIds:d,stickerSetsById:m,shouldPlay:h,onStickerSelect:Z})=>{const{loadRecentStickers:P,addRecentSticker:v,unfaveSticker:g}=(0,s.uC)(),p=(0,a.sO)(null),E=(0,a.sO)(null),[C,b]=(0,a.eJ)(0),I=(0,nr.Z)(e,t),{observe:y}=(0,$n.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-",""));rr[n]=e.isIntersecting}));const t=rr.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&b(t[Math.floor(t.length/2)].index)})),{observe:N}=(0,$n.S1)({rootRef:E}),S=(0,u.Z)(),w=Boolean(d),k=(0,a.Ye)((()=>d?[{id:"recent",title:S("RecentStickers"),stickers:l,count:l.length},{id:"favorite",title:S("FavoriteStickers"),stickers:c,count:c.length},...d.map((e=>m[e])).filter(Boolean)]:Pt.D),[d,S,l,c,m]),M=(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)((()=>{r&&(P(),I({type:"chooseSticker"}))}),[r,P,I]),(0,ft.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,Hs.Z)(e,t)}),[w,C]);const T=(0,a.I4)((e=>{b(e);const t=document.getElementById(`sticker-set-${e}`);(0,$s.Z)(p.current,t,"start",void 0,500)}),[]),A=(0,a.I4)((e=>{Z(e),v({sticker:e})}),[v,Z]),R=(0,a.I4)((e=>{g({sticker:e})}),[g]),F=(0,a.I4)((()=>{I({type:"chooseSticker"})}),[I]),B=(0,Bt.Z)([],i.Y),$=(0,X.Z)("StickerPicker",n);return w&&B&&!M&&o?a.ZP.createElement("div",{className:$},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(L.Z,{key:e.id,className:r,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>T(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(xn,{stickerSet:e,observeIntersection:N}):a.ZP.createElement(Un,{stickerSet:e,observeIntersection:N})):a.ZP.createElement(On.Z,{key:e.id,sticker:s,size:i.DC,title:e.title,className:r,observeIntersection:N,onClick:T,clickArg:t})}))),a.ZP.createElement("div",{ref:p,onMouseMove:F,className:(0,X.Z)("StickerPicker-main no-selection",f.$b?"no-scrollbar":"custom-scroll")},k.map(((e,t)=>a.ZP.createElement(sr,{key:e.id,stickerSet:e,loadAndPlay:Boolean(h&&r),index:t,observeIntersection:y,shouldRender:C>=t-1&&C<=t+1,onStickerSelect:A,onStickerUnfave:R}))))):a.ZP.createElement("div",{className:$},o?M?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 ir=n(386);function lr(){return(lr=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,$n.Op)(c,t)&&!n,P=(0,h.Z)(`${u}?size=m`,!Z,r.IU.BlobUrl),v=(0,ta.Z)(null===(l=e.thumbnail)||void 0===l?void 0:l.dataUri,Boolean(P)),g=(0,h.Z)(u,!Z,r.IU.BlobUrl),p=Boolean(Z&&g),{isBuffered:E,bufferingHandlers:C}=(0,Y.Z)(!0),f=Z&&!E,b=Z&&E;(0,V.Z)(d,[p]);const I=(0,a.I4)((()=>o({...e,blobUrl:g})),[o,e,g]),y=(0,X.Z)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs})))((({className:e,loadAndPlay:t,canSendGifs:n,savedGifs:r,onGifSelect:o})=>{const{loadSavedGifs:l}=(0,s.uC)(),c=(0,a.sO)(null),{observe:d}=(0,$n.S1)({rootRef:c,debounceMs:300});(0,a.d4)((()=>{t&&l()}),[t,l]);const m=(0,Bt.Z)([],i.Y);return a.ZP.createElement("div",{ref:c,className:(0,X.Z)("GifPicker",e,f.$b?"no-scrollbar":"custom-scroll")},n?m&&r&&r.length?r.map((e=>a.ZP.createElement(cr,{key:e.id,gif:e,observeIntersection:d,isDisabled:!t,onClick:o}))):m&&r?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 mr;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(mr||(mr={}));const ur=Object.values(mr).filter((e=>"string"==typeof e)),hr={[mr.Emoji]:"icon-smile",[mr.Stickers]:"icon-stickers",[mr.GIFs]:"icon-gifs"},Zr=(0,a.X$)((({activeTab:e,onSwitchTab:t,onRemoveSymbol:n,onSearchOpen:s})=>{const r=(0,u.Z)();function o(n){return a.ZP.createElement(L.Z,{className:"symbol-tab-button "+(e===n?"activated":""),onClick:()=>t(n),ariaLabel:ur[n],round:!0,faded:!0,color:"translucent"},a.ZP.createElement("i",{className:hr[n]}))}const i=(0,a.I4)((()=>{s(e===mr.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!==mr.Emoji&&a.ZP.createElement(L.Z,{className:"symbol-search-button",ariaLabel:e===mr.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:i},a.ZP.createElement("i",{className:"icon-search"})),o(mr.Emoji),o(mr.Stickers),o(mr.GIFs),e===mr.Emoji&&a.ZP.createElement(L.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 Pr=!1;const vr=(0,a.X$)((0,s.c$)((e=>({isLeftColumnShown:e.isLeftColumnShown})))((({chatId:e,threadId:t,isOpen:n,allowedAttachmentOptions:s,isLeftColumnShown:r,onLoad:o,onClose:i,onEmojiSelect:l,onStickerSelect:c,onGifSelect:d,onRemoveSymbol:m,onSearchOpen:h,addRecentEmoji:Z})=>{const[P,v]=(0,a.eJ)(0),[g,p]=(0,a.eJ)([]),[E,C]=(0,zs.Z)(n,i,void 0,f.wB),{shouldRender:b,transitionClassNames:I}=(0,z.Z)(n,i,!1,!1);!Pr&&n&&(Pr=!0),(0,a.d4)((()=>{o()}),[o]),(0,a.bt)((()=>{if(f.wB)return n&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{n&&(0,G.T2)((()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout((()=>{document.body.classList.remove("enable-symbol-menu-transforms")}),350)}))}}),[n]);const y=(0,a.sO)(g);y.current=g,(0,a.d4)((()=>{y.current.length&&(y.current.forEach((e=>{Z({emoji:e})})),p([]))}),[n,P,Z]);const N=(0,a.I4)(((e,t)=>{p((e=>[...e,t])),l(e)}),[l]),S=(0,a.I4)((e=>{i(),h(e)}),[i,h]),w=(0,a.I4)((e=>{c(e,!0)}),[c]),k=(0,u.Z)(),{canSendStickers:M,canSendGifs:T}=s;function A(s,r){switch(P){case mr.Emoji:return a.ZP.createElement(tr,{className:"picker-tab",onEmojiSelect:N});case mr.Stickers:return a.ZP.createElement(or,{className:"picker-tab",loadAndPlay:!!M&&n&&(s||r),canSendStickers:M,onStickerSelect:w,chatId:e,threadId:t});case mr.GIFs:return a.ZP.createElement(dr,{className:"picker-tab",loadAndPlay:!!T&&n&&(s||r),canSendGifs:T,onGifSelect:d})}}const F=a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},Pr&&a.ZP.createElement(R.Z,{name:"slide",activeKey:P,renderCount:ur.length},A)),f.wB&&a.ZP.createElement(L.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:k("Close"),className:"symbol-close-button",size:"tiny",onClick:i},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(Zr,{activeTab:P,onSwitchTab:v,onRemoveSymbol:m,onSearchOpen:S}));if(f.wB){if(!b)return;const e=(0,X.Z)("SymbolMenu mobile-menu",I,!r&&"middle-column-open");return a.ZP.createElement(ys.Z,null,a.ZP.createElement("div",{className:e},F))}return a.ZP.createElement(gs.Z,{isOpen:n,positionX:"left",positionY:"bottom",onClose:i,className:"SymbolMenu",onCloseAnimationEnd:i,onMouseEnter:f.$b?void 0:E,onMouseLeave:f.$b?void 0:C,noCloseOnBackdrop:!f.$b},F)}))),gr=(0,a.X$)((({isOpen:e,allowedAttachmentOptions:t,onFileSelect:n,onPollCreate:s,onClose:r})=>{const[o,l]=(0,zs.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)((()=>{Hn(Array.from(i.dI).join(","),(e=>c(e,!0)))}),[c]),m=(0,a.I4)((()=>{Hn("*",(e=>c(e,!1)))}),[c]),h=(0,u.Z)(),{canAttachMedia:Z,canAttachPolls:P}=t;return a.ZP.createElement(gs.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")))})),pr=(0,a.X$)((({withAvatar:e,focus:t,botCommand:n,bot:s,onClick:r})=>a.ZP.createElement(Le.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,ve.Z)(n.description)))))),Er=(0,a.X$)((0,s.c$)((e=>({usersById:e.users.byId})))((({usersById:e,isOpen:t,withUsername:n,botCommands:r,onClick:o,onClose:i})=>{const{sendBotCommand:l}=(0,s.uC)(),c=(0,a.sO)(null),{shouldRender:d,transitionClassNames:m}=(0,z.Z)(t,void 0,void 0,!1),u=(0,a.I4)((({botId:t,command:a})=>{const s=e[t];l({command:`/${a}${n&&s?`@${s.username}`:""}`,botId:t}),o()}),[o,l,e,n]),h=Us({isActive:t,items:r,onSelect:u,onClose:i});(0,a.d4)((()=>{r&&!r.length&&i()}),[r,i]),(0,a.d4)((()=>{Ds(".chat-item-clickable",h,c)}),[h]);const Z=(0,P.Z)(r&&r.length?r:void 0,d),v=r&&!r.length?Z:r;if(!d||v&&!v.length)return;const g=(0,X.Z)("BotCommandTooltip composer-tooltip custom-scroll",m);return a.ZP.createElement("div",{className:g,ref:c},v&&v.map(((t,n)=>a.ZP.createElement(pr,{key:`${t.botId}_${t.command}`,botCommand:t,bot:e[t.botId],withAvatar:!0,onClick:u,focus:h===n}))))}))),Cr=(0,a.X$)((({isOpen:e,botCommands:t,onClose:n})=>{const{sendBotCommand:r}=(0,s.uC)(),[o,i]=(0,zs.Z)(e,n,void 0,f.wB),l=(0,a.I4)((e=>{r({command:`/${e.command}`,botId:e.botId}),n()}),[n,r]);return a.ZP.createElement(gs.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:n,className:"BotCommandMenu",onCloseAnimationEnd:n,onMouseEnter:f.$b?void 0:o,onMouseLeave:f.$b?void 0:i,noCloseOnBackdrop:!f.$b},t.map((e=>a.ZP.createElement(pr,{key:e.command,botCommand:e,onClick:l}))))})),fr=(0,a.X$)((0,s.c$)((e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}}))((({chatId:e,threadId:t,isOpen:n,onStickerSelect:r,stickers:o})=>{const{clearStickersForEmoji:l}=(0,s.uC)(),c=(0,a.sO)(null),{shouldRender:d,transitionClassNames:m}=(0,z.Z)(n,void 0,void 0,!1),u=(0,P.Z)(o,!0),h=o||u,Z=(0,nr.Z)(e,t),{observe:v}=(0,$n.S1)({rootRef:c,throttleMs:200});(0,a.d4)((()=>n?(0,E.Z)(l):void 0),[n,l]);const g=(0,X.Z)("StickerTooltip composer-tooltip custom-scroll",m,!(null!=h&&h.length)&&"hidden");return a.ZP.createElement("div",{ref:c,className:g,onMouseEnter:f.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:f.$b?void 0:()=>{document.body.classList.remove("no-select")},onMouseMove:()=>{Z({type:"chooseSticker"})}},d&&h?h.map((e=>a.ZP.createElement(On.Z,{key:e.id,sticker:e,size:i.Q,observeIntersection:v,onClick:r,clickArg:e}))):d?a.ZP.createElement(we.Z,null):void 0)}))),br=(0,a.X$)((({isOpen:e,onSilentSend:t,onScheduleSend:n,onClose:s,onCloseAnimationEnd:r})=>{const[o,i]=(0,zs.Z)(e,s),l=(0,u.Z)();return a.ZP.createElement(gs.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 Ir=n(2420),yr=n(3283),Nr=n(2678);const Sr=(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.Z)(e,void 0,void 0,!1),c=(0,Nr.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=Us({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}=Fs(n,".EmojiButton",8,!0,!0,!0);if(!s.length||!s[e])return;const r=a[0];if(!a.includes(e)||e===r&&!Bs(n,s[r],!0)){const t="start"==(e>a[a.length-1]?"start":"end")?44*e:0;(0,Hs.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(Vs,{key:e.id,emoji:e,focus:u===t,onClick:m}))):i?a.ZP.createElement(we.Z,null):void 0)})),wr=(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,it.Xv)(e,1)),a.ZP.createElement(Le.Z,{focus:r,className:"BaseResult chat-item-clickable",onMouseDown:ir.b,onClick:i},a.ZP.createElement("span",{className:"thumb"},"string"==typeof l?(0,ve.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)))})),kr=(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,Dn.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:v,description:g}=n;return a.ZP.createElement(wr,{focus:e,thumbUrl:d||(null===(r=i)||void 0===r?void 0:r.dataUri)||c,transitionClassNames:m,title:v,description:g,onClick:u})})),Mr=(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(wr,{focus:e,thumbnail:i,title:s||r,description:o,onClick:l})})),Tr=(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(cr,{gif:s,observeIntersection:t,className:"chat-item-clickable",onClick:r})})),Lr=(0,a.X$)((({inlineResult:e,observeIntersection:t,onClick:n})=>{const{sticker:s}=e;if(s)return a.ZP.createElement(On.Z,{sticker:s,size:i.zq,observeIntersection:t,title:s.emoji,className:"chat-item-clickable",onClick:n,clickArg:e})})),Ar=(0,G.P2)((e=>e()),500,!0),Rr=(0,a.X$)((({isOpen:e,botId:t,isGallery:n,inlineBotResults:r,switchPm:i,loadMore:l,onClose:c,onSelectResult:d})=>{const{openChat:m,startBot:u}=(0,s.uC)(),h=(0,a.sO)(null),{shouldRender:Z,transitionClassNames:v}=(0,z.Z)(e,void 0,void 0,!1),{observe:g}=(0,$n.S1)({rootRef:h,debounceMs:200,isDisabled:!e}),p=(0,a.I4)((({direction:e})=>{e===o.Uq.Backwards&&Ar(l)}),[l]),E=Us({isActive:e,shouldRemoveSelectionOnReset:n,noArrowNavigation:n,items:r,onSelect:d,onClose:c});(0,a.d4)((()=>{Ds(".chat-item-clickable",E,h)}),[E]);const C=(0,a.I4)((()=>{m({id:t}),u({botId:t,param:i.startParam})}),[t,m,u,i]),b=(0,P.Z)(null!=r&&r.length?r:void 0,Z),I=r&&!r.length?b:r;if(!Z||!(null!=I&&I.length||i))return;const y=(0,X.Z)("InlineBotTooltip composer-tooltip",f.$b?"no-scrollbar":"custom-scroll",n&&"gallery",v);return a.ZP.createElement(Te.Z,{ref:h,className:y,items:I,itemSelector:".chat-item-clickable",noFastList:!0,onLoadMore:p,sensitiveArea:160},i&&a.ZP.createElement(Le.Z,{ripple:!0,className:"switch-pm scroll-item",onClick:C},a.ZP.createElement("span",{className:"title"},i.text)),(null==I?void 0:I.length)&&I.map(((e,t)=>{switch(e.type){case"gif":return a.ZP.createElement(Tr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:d});case"photo":return a.ZP.createElement(kr,{key:e.id,isForGallery:n,inlineResult:e,onClick:d});case"sticker":return a.ZP.createElement(Lr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:d});case"video":case"file":case"game":return a.ZP.createElement(kr,{key:e.id,focus:E===t,inlineResult:e,onClick:d});case"article":case"audio":return a.ZP.createElement(Mr,{key:e.id,focus:E===t,inlineResult:e,onClick:d});default:return}})))})),Fr=(0,a.X$)((({isOpen:e,onClose:t,chatId:n,selectedSendAsId:r,sendAsIds:o})=>{const{saveDefaultSendAs:i}=(0,s.uC)(),l=(0,s.Rd)().users.byId,c=(0,s.Rd)().chats.byId,d=(0,u.Z)(),m=(0,a.sO)(null),[h,Z,P]=(0,zs.Z)(e,t,void 0);(0,a.d4)((()=>{e&&P()}),[e,P]);const g=(0,a.I4)((e=>{t(),i({chatId:n,sendAsId:e})}),[n,t,i]),p=Us({isActive:e,items:o,onSelect:g,shouldSelectOnTab:!0,shouldSaveSelectionOnUpdateItems:!0,onClose:t});return(0,a.d4)((()=>{Ds(".chat-item-clickable",p,m)}),[p]),(0,a.d4)((()=>{o&&!o.length&&t()}),[o,t]),a.ZP.createElement(gs.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:t,className:"SendAsMenu",onCloseAnimationEnd:t,onMouseEnter:f.$b?void 0:h,onMouseLeave:f.$b?void 0:Z,noCloseOnBackdrop:!f.$b},a.ZP.createElement("div",{className:"send-as-title",dir:"auto"},d("SendMessageAsTitle")),l&&c&&(null==o?void 0:o.map(((e,t)=>{const n=(0,v.YC)(e)?l[e]:void 0,s=n?void 0:c[e],o=n?(0,v.Js)(n):null==s?void 0:s.title;return a.ZP.createElement(Le.Z,{key:e,className:"SendAsItem chat-item-clickable scroll-item with-avatar",onClick:()=>g(e),focus:p===t},a.ZP.createElement(ge.Z,{size:"small",user:n,chat:s,className:(0,X.Z)(r===e&&"selected")}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},o&&(0,ve.Z)(o))),a.ZP.createElement("span",{className:"subtitle"},n?d("VoipGroupPersonalAccount"):d("Subscribers",null==s?void 0:s.membersCount,"i"))))}))))}));var Br=n(6844);const $r=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t),a=n&&(0,g.Zw)(e,n.id);if(!n||!a)return{};const{query:s,results:r}=(0,g.n5)(e)||{},{totalCount:o,foundIds:i}=r||{};return{chat:n,messagesById:a,query:s,totalCount:o,foundIds:i}}))((({chatId:e,threadId:t,onClose:n,isActive:r,chat:o,messagesById:i,query:l,totalCount:c,foundIds:d})=>{const{searchTextMessagesLocal:h,focusMessage:Z}=(0,s.uC)(),P=(0,u.Z)(),p=(0,a.Ye)((()=>{if(!(l&&d&&d.length&&i))return Pt.D;const n=d.map((n=>{const a=i[n];if(!a)return;const r=a.senderId?(0,g.dy)((0,s.Rd)(),a.senderId):void 0;let l;if(o&&(0,v.eA)(o))l=o;else if(a.forwardInfo){const{isChannelPost:e,fromChatId:t}=a.forwardInfo;l=e&&t?(0,g.Z1)((0,s.Rd)(),t):void 0}else l=a.senderId?(0,g.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,me.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,Ne.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(Te.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,v.U)(P,n):(0,v.Js)(t),o=(0,v.MK)(P,e);return a.ZP.createElement(Le.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,ve.Z)(r)),a.ZP.createElement(Br.Z,{message:e})),a.ZP.createElement("div",{className:"subtitle",dir:"auto"},(0,ve.Z)(o,["emoji","highlight"],{highlight:l}))))})))})));var Dr=n(9290);const xr=(0,a.X$)((0,s.c$)(((e,{stickerSetId:t})=>({set:(0,g.Ny)(e,t),shouldPlay:(0,g.yB)(e)})))((({stickerSetId:e,observeIntersection:t,set:n,shouldPlay:r,isSomeModalOpen:o,onModalToggle:l})=>{const{loadStickers:c,toggleStickerSet:d}=(0,s.uC)(),m=(0,u.Z)(),h=n&&Boolean(n.installedDate),Z=Boolean(null==n?void 0:n.stickers),[P,v,g]=(0,De.Z)();(0,Dr.Z)((()=>{l(P)}),[P,l]);const p=(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)((()=>{!Z&&p.length<5&&c({stickerSetId:e})}),[Z,p.length,c,e]);const E=(0,a.I4)((()=>{d({stickerSetId:e})}),[d,e]);if(!n)return;const C=p.length>0;return a.ZP.createElement("div",{key:n.id,className:"sticker-set",dir:m.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"},m("Stickers",n.count,"i"))),a.ZP.createElement(L.Z,{className:h?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:E},m(h?"Stickers.Installed":"Stickers.Install"))),a.ZP.createElement("div",{className:"sticker-set-main"},!C&&a.ZP.createElement(J.Z,null),C&&p.map((e=>a.ZP.createElement(On.Z,{sticker:e,size:i.Y7,observeIntersection:t,noAnimate:!r||P||o,onClick:v})))),C&&a.ZP.createElement(Jn.Z,{isOpen:P,fromSticker:p[0],onClose:g}))}))),Ur=(0,G.P2)((e=>e()),6e4,!0),Or=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.y5)(e),{query:n,resultIds:a}=t||{},{featured:s}=e.stickers;return{query:n,featuredIds:s.setIds,resultIds:a}}))((({onClose:e,isActive:t,query:n,featuredIds:r,resultIds:o})=>{const{loadFeaturedStickers:i}=(0,s.uC)(),l=(0,a.sO)(null),c=(0,u.Z)(),[d,h]=(0,a.eJ)(!1),{observe:Z}=(0,$n.S1)({rootRef:l,throttleMs:200});return(0,a.d4)((()=>{Ur((()=>{i()}))})),(0,m.ZP)(t,e),a.ZP.createElement("div",{ref:l,className:"StickerSearch custom-scroll",dir:c.isRtl?"rtl":void 0},function(){if(void 0!==n)return!n&&r?r.map((e=>a.ZP.createElement(xr,{key:e,stickerSetId:e,observeIntersection:Z,isSomeModalOpen:d,onModalToggle:h}))):o?o.length?o.map((e=>a.ZP.createElement(xr,{key:e,stickerSetId:e,observeIntersection:Z,isSomeModalOpen:d,onModalToggle:h}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):a.ZP.createElement(we.Z,null)}())}))),Gr=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.yN)(e),{query:n,results:a}=t||{},{chatId:s}=(0,g.Bt)(e)||{},r=s?(0,g.Z1)(e,s):void 0;return{query:n,results:a,chat:r,isChatWithBot:r?(0,g.xo)(e,r):void 0}}))((({onClose:e,isActive:t,query:n,results:r,chat:o,isChatWithBot:i})=>{const{searchMoreGifs:l,sendMessage:c,setGifSearchQuery:d}=(0,s.uC)(),h=(0,a.sO)(null),{observe:Z}=(0,$n.S1)({rootRef:h,debounceMs:300}),{canSendGifs:P}=(0,v.H5)(o,i),g=(0,a.I4)((e=>{P&&c({gif:e}),f.$b&&d({query:void 0})}),[P,c,d]),p=(0,u.Z)();(0,m.ZP)(t,e);const E=Boolean(void 0!==n&&r&&r.length);return a.ZP.createElement("div",{className:"GifSearch",dir:p.isRtl?"rtl":void 0},a.ZP.createElement(Te.Z,{ref:h,className:(0,X.Z)("gif-container custom-scroll",E&&"grid"),items:r,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:l},function(){if(void 0!==n)return r?r.length?r.map((e=>a.ZP.createElement(cr,{key:e.id,gif:e,observeIntersection:Z,onClick:g}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},p("NoGIFsFound")):a.ZP.createElement(we.Z,null)}()))}))),Jr=(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])||""}}))((({chat:e,message:t,answer:n,answerVote:r,totalVoters:o,voters:i,offset:l})=>{const{loadPollOptionResults:c,openChat:d,closePollResults:m}=(0,s.uC)(),h=(0,P.Z)(r.votersCount),[Z,v]=(0,a.eJ)(!0),g=Boolean(i),{option:p,text:E}=n,C=(0,u.Z)();(0,a.d4)((()=>{g&&h===r.votersCount||c({chat:e,messageId:t.id,option:p,offset:l,limit:4,shouldResetVoters:!0})}),[r.votersCount,g]);const f=(0,a.I4)((()=>{v(!0),c({chat:e,messageId:t.id,option:p,offset:l,limit:50})}),[e,c,t.id,l,p]);(0,a.d4)((()=>{v(!1)}),[i]);const b=(0,a.I4)((e=>{d({id:e}),m()}),[m,d]);return a.ZP.createElement("div",{className:"PollAnswerResults"},a.ZP.createElement("div",{className:"poll-voters"},i?i.map((e=>a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable",onClick:()=>b(e)},a.ZP.createElement(Re.Z,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0})))):a.ZP.createElement(we.Z,null),i&&function(){const e=r.votersCount-i.length;return r.votersCount>4&&e>0&&a.ZP.createElement(wn,{count:e,itemName:"voter",isLoading:Z,onClick:f})}()),a.ZP.createElement("div",{className:"answer-head",dir:C.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"answer-title",dir:"auto"},E),a.ZP.createElement("span",{className:"answer-percent",dir:C.isRtl?"auto":void 0},(I=r.votersCount,(y=o)>0?(I/y*100).toFixed():0),"%")));var I,y}))),Xr=(0,a.X$)((0,s.c$)((e=>{const{pollResults:{chatId:t,messageId:n},lastSyncTime:a}=e;return t&&n?{chat:(0,g.Z1)(e,t),message:(0,g.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,v.t9)(s);if(!l.results)return;const c=(0,me.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,ve.Z)(i.question,["emoji","br"])),a.ZP.createElement("div",{className:"poll-results-list custom-scroll"},r&&i.answers.map((e=>a.ZP.createElement(Jr,{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)))}))),_r="Please provide first name",zr=(0,a.X$)((0,s.c$)(((e,{userId:t})=>{const n=(0,g.dy)(e,t),a=(0,g.Z1)(e,t),{progress:s}=e.management;return{user:n,progress:s,isMuted:(0,v.i4)(a,(0,g.dZ)(e),(0,g.NJ)(e))}}))((({userId:e,user:t,progress:n,isMuted:r,onClose:i,isActive:l})=>{const{updateContact:c,deleteContact:d,closeManagement:h}=(0,s.uC)(),[Z,P,v]=(0,De.Z)(),[g,p]=(0,a.eJ)(!1),[E,C]=(0,a.eJ)(),f=(0,u.Z)();(0,m.ZP)(l,i);const b=t&&t.firstName||"",I=t&&t.lastName||"",[y,N]=(0,a.eJ)(b),[S,w]=(0,a.eJ)(I),[k,M]=(0,a.eJ)(!r);(0,a.d4)((()=>{M(!r)}),[r]),(0,a.d4)((()=>{p(!1),v()}),[v,e]),(0,a.d4)((()=>{N(b),w(I)}),[b,I,t]),(0,a.d4)((()=>{n===o.wv.Complete&&(p(!1),C(void 0),v())}),[v,n]);const T=(0,a.I4)((e=>{N(e.target.value),p(!0)}),[]),L=(0,a.I4)((e=>{w(e.target.value),p(!0)}),[]),A=(0,a.I4)((e=>{M(e.target.checked),p(!0)}),[]),R=(0,a.I4)((()=>{const t=y.trim(),n=S.trim();t.length||C(_r),c({userId:e,isMuted:!k,firstName:t,lastName:n})}),[y,S,c,e,k]),F=(0,a.I4)((()=>{d({userId:e}),v(),h()}),[v,h,d,e]);if(!t)return;const B=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(Re.Z,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),a.ZP.createElement(Me.Z,{id:"user-first-name",label:f("UserInfo.FirstNamePlaceholder"),onChange:T,value:y,error:E===_r?E:void 0}),a.ZP.createElement(Me.Z,{id:"user-last-name",label:f("UserInfo.LastNamePlaceholder"),onChange:L,value:S}),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(fn.Z,{checked:k,label:f("Notifications"),subLabel:f(k?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:A}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:P},f("DeleteContact")))),a.ZP.createElement(mn.Z,{isShown:g,onClick:R,disabled:B,ariaLabel:f("Save")},B?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Xe.Z,{isOpen:Z,onClose:v,text:f("AreYouSureDeleteContact"),confirmLabel:f("DeleteContact"),confirmHandler:F,confirmIsDestructive:!0}))}))),Yr="Group title can't be empty",Hr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n,a;const s=(0,g.Z1)(e,t),{progress:r}=e.management,o=Boolean(null===(n=s.fullInfo)||void 0===n?void 0:n.linkedChatId),i=(0,v.G9)(s),{invites:l}=e.management.byChatId[t]||{};return{chat:s,progress:r,isBasicGroup:i,hasLinkedChannel:o,canChangeInfo:i?s.isCreator:(0,v.VE)(s,"changeInfo"),canBanUsers:i?s.isCreator:(0,v.VE)(s,"banUsers"),canInvite:i?s.isCreator:(0,v.VE)(s,"inviteUsers"),exportedInvites:l,lastSyncTime:e.lastSyncTime,availableReactionsCount:null===(a=e.availableReactions)||void 0===a?void 0:a.filter((e=>!e.isInactive)).length}}))((({chatId:e,chat:t,progress:n,isBasicGroup:i,hasLinkedChannel:l,canChangeInfo:c,canBanUsers:d,canInvite:Z,onScreenSelect:P,onClose:g,isActive:p,exportedInvites:E,lastSyncTime:C,availableReactionsCount:f})=>{var b,I,y,N,S;const{togglePreHistoryHidden:w,updateChat:k,deleteChat:M,leaveChannel:T,deleteChannel:L,closeManagement:A,openChat:R,loadExportedChatInvites:F}=(0,s.uC)(),[B,$,D]=(0,De.Z)(),x=t.title,U=t.fullInfo&&t.fullInfo.about||"",[O,G]=(0,a.eJ)(!1),[X,_]=(0,a.eJ)(x),[z,Y]=(0,a.eJ)(U),[H,V]=(0,a.eJ)(),[j,K]=(0,a.eJ)(),q=(0,v.RT)(t),W=(0,h.Z)(q,!1,r.IU.BlobUrl),Q=(0,u.Z)();(0,m.ZP)(p,g),(0,a.d4)((()=>{C&&Z&&F({chatId:e})}),[e,F,C,Z]),(0,a.d4)((()=>{n===o.wv.Complete&&(G(!1),K(void 0))}),[n]);const ee=(0,a.I4)((()=>{P(o.u1.ChatPrivacyType)}),[P]),te=(0,a.I4)((()=>{P(o.u1.Discussion)}),[P]),ne=(0,a.I4)((()=>{P(o.u1.Reactions)}),[P]),ae=(0,a.I4)((()=>{P(o.u1.GroupPermissions)}),[P]),se=(0,a.I4)((()=>{P(o.u1.ChatAdministrators)}),[P]),re=(0,a.I4)((()=>{P(o.u1.Invites)}),[P]),oe=(0,a.I4)((e=>{V(e),G(!0)}),[]),ie=(0,a.I4)((e=>{_(e.target.value),G(!0)}),[]),le=(0,a.I4)((e=>{Y(e.target.value),G(!0)}),[]),ce=(0,a.I4)((()=>{const t=X.trim(),n=z.trim();t.length?k({chatId:e,title:t,about:n,photo:H}):K(Yr)}),[z,e,H,X,k]),de=(0,a.I4)((()=>{P(o.u1.GroupMembers)}),[P]),me=(0,a.I4)((()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;w({chatId:t.id,isEnabled:!e})}),[t,w]),ue=(null===(b=t.fullInfo)||void 0===b||null===(I=b.enabledReactions)||void 0===I?void 0:I.length)||0,he=(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]),Ze=(null===(y=t.fullInfo)||void 0===y||null===(N=y.adminMembers)||void 0===N?void 0:N.length)||0,Pe=(0,a.I4)((()=>{i?M({chatId:t.id}):t.isCreator?L({chatId:t.id}):T({chatId:t.id}),D(),A(),R({id:void 0})}),[i,t.isCreator,t.id,D,A,T,L,M,R]);if(t.isRestricted)return;const ge=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(dn.Z,{currentAvatarBlobUrl:W,onChange:oe,disabled:!c}),a.ZP.createElement(Me.Z,{id:"group-title",label:Q("GroupName"),onChange:ie,value:X,error:j===Yr?j:void 0,disabled:!c}),a.ZP.createElement(Me.Z,{id:"group-about",className:"mb-2",label:Q("DescriptionPlaceholder"),onChange:le,value:z,disabled:!c}),t.isCreator&&a.ZP.createElement(Le.Z,{icon:"lock",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title"},Q("GroupType")),a.ZP.createElement("span",{className:"subtitle"},t.username?Q("TypePublic"):Q("TypePrivate"))),l&&a.ZP.createElement(Le.Z,{icon:"message",multiline:!0,onClick:te},a.ZP.createElement("span",{className:"title"},Q("LinkedChannel")),a.ZP.createElement("span",{className:"subtitle"},Q("DiscussionUnlink"))),a.ZP.createElement(Le.Z,{icon:"permissions",multiline:!0,onClick:ae,disabled:!d},a.ZP.createElement("span",{className:"title"},Q("ChannelPermissions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},he,"/",8)),a.ZP.createElement(Le.Z,{icon:"reactions",multiline:!0,onClick:ne,disabled:!c},a.ZP.createElement("span",{className:"title"},Q("Reactions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},ue,"/",f)),a.ZP.createElement(Le.Z,{icon:"admin",multiline:!0,onClick:se},a.ZP.createElement("span",{className:"title"},Q("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},(0,it.kh)(Ze))),Z&&a.ZP.createElement(Le.Z,{icon:"link",onClick:re,multiline:!0,disabled:!E},a.ZP.createElement("span",{className:"title"},Q("GroupInfo.InviteLinks")),a.ZP.createElement("span",{className:"subtitle"},E?(0,it.kh)(E.length):Q("Loading")))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"group",multiline:!0,onClick:de},a.ZP.createElement("span",{className:"title"},Q("GroupMembers")),a.ZP.createElement("span",{className:"subtitle"},(0,it.kh)(null!==(S=t.membersCount)&&void 0!==S?S:0))),t.fullInfo&&a.ZP.createElement("div",{className:"ListItem narrow no-selection"},a.ZP.createElement(fn.Z,{checked:!t.fullInfo.isPreHistoryHidden,label:Q("ChatHistory"),onChange:me,disabled:!d}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:$},Q("DeleteMega")))),a.ZP.createElement(mn.Z,{isShown:O,onClick:ce,disabled:ge,ariaLabel:Q("Save")},ge?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Xe.Z,{isOpen:B,onClose:D,textParts:(0,ve.Z)(i||!t.isCreator?Q("AreYouSureDeleteAndExit"):Q("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:i||!t.isCreator?Q("DeleteMega"):Q("DeleteGroupForAll"),confirmHandler:Pe,confirmIsDestructive:!0}))}))),Vr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,g.Z1)(e,t),currentUserId:e.currentUserId})))((({onScreenSelect:e,onChatMemberSelect:t,chat:n,currentUserId:r,onClose:i,isActive:l})=>{const{updateChatDefaultBannedRights:c}=(0,s.uC)(),[d,h]=(0,a.eJ)({}),[Z,P]=(0,a.eJ)(!1),[v,g]=(0,a.eJ)(!1),p=(0,u.Z)();(0,m.ZP)(l,i);const E=(0,a.I4)((()=>{e(o.u1.GroupRemovedUsers)}),[e]),C=(0,a.I4)((()=>{e(o.u1.GroupUserPermissionsCreate)}),[e]),f=(0,a.I4)((n=>{t(n.userId,n.promotedByUserId===r),e(o.u1.GroupUserPermissions)}),[r,t,e]);(0,a.d4)((()=>{h((null==n?void 0:n.defaultBannedRights)||{}),P(!1),setTimeout((()=>{g(!1)}),250)}),[n]);const b=(0,a.I4)((e=>{const{name:t}=e.target;function n(e){return!e||void 0}h((e=>({...e,[t]:n(e[t]),..."sendStickers"===t&&{sendGifs:n(e[t])}}))),P(!0)}),[]),I=(0,a.I4)((()=>{n&&(g(!0),c({chatId:n.id,bannedRights:d}))}),[n,d,c]),y=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.kickedMembers?n.fullInfo.kickedMembers.length:0),[n]),N=(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=p(s);return`${e}${e.length?`, ${r}`:r}`}),"")}),[n,p]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},p("ChannelPermissionsHeader")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"sendMessages",checked:!d.sendMessages,label:p("UserRestrictionsSend"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"sendMedia",checked:!d.sendMedia,label:p("UserRestrictionsSendMedia"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"sendStickers",checked:!d.sendStickers&&!d.sendGifs,label:p("UserRestrictionsSendStickers"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"sendPolls",checked:!d.sendPolls,label:p("UserRestrictionsSendPolls"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"embedLinks",checked:!d.embedLinks,label:p("UserRestrictionsEmbedLinks"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"inviteUsers",checked:!d.inviteUsers,label:p("UserRestrictionsInviteUsers"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"pinMessages",checked:!d.pinMessages,label:p("UserRestrictionsPinMessages"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"changeInfo",checked:!d.changeInfo,label:p("UserRestrictionsChangeInfo"),blocking:!0,onChange:b}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete-user",multiline:!0,narrow:!0,onClick:E},a.ZP.createElement("span",{className:"title"},p("ChannelBlockedUsers")),a.ZP.createElement("span",{className:"subtitle"},y))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},p("PrivacyExceptions")),a.ZP.createElement(Le.Z,{icon:"add-user",onClick:C},p("ChannelAddException")),N.map((e=>a.ZP.createElement(Le.Z,{key:e.userId,className:"chat-item-clickable exceptions-member",onClick:()=>f(e)},a.ZP.createElement(Re.Z,{userId:e.userId,status:S(e)})))))),a.ZP.createElement(mn.Z,{isShown:Z,onClick:I,ariaLabel:p("Save"),disabled:v},v?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),jr=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e;return{currentUserId:t}}))((({chat:e,currentUserId:t,isOpen:n,onClose:r})=>{var o;const{loadMoreMembers:i,deleteChatMember:l}=(0,s.uC)(),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,v.kK)(a,r,d)}),[null===(o=e.fullInfo)||void 0===o?void 0:o.members,t,d]),P=(0,a.I4)((t=>{l({chatId:e.id,userId:t}),r()}),[e.id,l,r]);return a.ZP.createElement(Fe,{isOpen:n,chatOrUserIds:Z,filterRef:h,filterPlaceholder:c("ChannelBlockUser"),filter:d,onFilterChange:m,loadMore:i,onSelectChatOrUser:P,onClose:r})}))),Kr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t),{byId:a}=e.users;return{chat:n,usersById:a,canDeleteMembers:n&&((0,v.VE)(n,"banUsers")||n.isCreator)}}))((({chat:e,usersById:t,canDeleteMembers:n,onClose:r,isActive:o})=>{const{updateChatMemberBannedRights:i}=(0,s.uC)(),l=(0,u.Z)(),[c,d,h]=(0,De.Z)();(0,m.ZP)(o,r);const Z=(0,a.Ye)((()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[]),[e]),P=(0,a.I4)((e=>{if(!e.kickedByUserId)return;const n=t[e.kickedByUserId];return n?l("UserRemovedBy",(0,v.Js)(n)):void 0}),[l,t]),g=(0,a.I4)((t=>{if(e)return[{title:l("Unblock"),icon:"delete",destructive:!0,handler:()=>i({chatId:e.id,userId:t.userId,bannedRights:{}})}]}),[l,e,i]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:l.isRtl?"rtl":void 0},a.ZP.createElement("p",{className:"text-muted"},l("NoBlockedGroup2")),Z.map((e=>a.ZP.createElement(Le.Z,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:g(e)},a.ZP.createElement(Re.Z,{userId:e.userId,status:P(e)})))),n&&a.ZP.createElement(mn.Z,{isShown:!0,onClick:d,ariaLabel:l("Channel.EditAdmin.Permission.BanUsers")},a.ZP.createElement("i",{className:"icon-add-user-filled"})),e&&n&&a.ZP.createElement(jr,{chat:e,isOpen:c,onClose:h}))))}))),qr="Channel title can't be empty",Wr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.Z1)(e,t),{progress:s}=e.management,r=Boolean(null==a?void 0:a.isSignaturesShown),{invites:o}=e.management.byChatId[t]||{};return{chat:a,progress:s,isSignaturesShown:r,canChangeInfo:(0,v.VE)(a,"changeInfo"),canInvite:(0,v.VE)(a,"inviteUsers"),lastSyncTime:e.lastSyncTime,exportedInvites:o,availableReactionsCount:null===(n=e.availableReactions)||void 0===n?void 0:n.filter((e=>!e.isInactive)).length}}))((({chatId:e,chat:t,progress:n,isSignaturesShown:i,canChangeInfo:l,canInvite:c,exportedInvites:d,lastSyncTime:Z,availableReactionsCount:P,onScreenSelect:g,onClose:p,isActive:E})=>{var C,f,b,I,y,N;const{updateChat:S,toggleSignatures:w,closeManagement:k,leaveChannel:M,deleteChannel:T,openChat:L,loadExportedChatInvites:A}=(0,s.uC)(),R=t&&t.title||"",F=null!=t&&t.fullInfo&&t.fullInfo.about||"",B=null==t||null===(C=t.fullInfo)||void 0===C?void 0:C.linkedChatId,[$,D,x]=(0,De.Z)(),[U,O]=(0,a.eJ)(!1),[G,X]=(0,a.eJ)(R),[_,z]=(0,a.eJ)(F),[Y,H]=(0,a.eJ)(),[V,j]=(0,a.eJ)(),K=t&&(0,v.RT)(t),q=(0,h.Z)(K,!1,r.IU.BlobUrl),W=(0,u.Z)();(0,m.ZP)(E,p),(0,a.d4)((()=>{Z&&A({chatId:e})}),[e,A,Z]),(0,a.d4)((()=>{n===o.wv.Complete&&(O(!1),j(void 0))}),[n]);const Q=(null==t||null===(f=t.fullInfo)||void 0===f||null===(b=f.adminMembers)||void 0===b?void 0:b.length)||0,ee=(0,a.I4)((()=>{g(o.u1.ChatPrivacyType)}),[g]),te=(0,a.I4)((()=>{g(o.u1.Discussion)}),[g]),ne=(0,a.I4)((()=>{g(o.u1.Reactions)}),[g]),ae=(0,a.I4)((()=>{g(o.u1.ChatAdministrators)}),[g]),se=(0,a.I4)((()=>{g(o.u1.Invites)}),[g]),re=(0,a.I4)((e=>{H(e),O(!0)}),[]),oe=(0,a.I4)((e=>{X(e.target.value),O(!0)}),[]),ie=(0,a.I4)((e=>{z(e.target.value),O(!0)}),[]),le=(0,a.I4)((()=>{const t=G.trim(),n=_.trim();t.length?S({chatId:e,title:t,about:n,photo:Y}):j(qr)}),[_,e,Y,G,S]),ce=(0,a.I4)((()=>{w({chatId:e,isEnabled:!i})}),[e,i,w]),de=(0,a.I4)((()=>{g(o.u1.ChannelSubscribers)}),[g]),me=(0,a.I4)((()=>{t.isCreator?T({chatId:t.id}):M({chatId:t.id}),x(),k(),L({id:void 0})}),[t.isCreator,t.id,x,k,M,T,L]),ue=(null===(I=t.fullInfo)||void 0===I||null===(y=I.enabledReactions)||void 0===y?void 0:y.length)||0;if(t.isRestricted)return;const he=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(dn.Z,{currentAvatarBlobUrl:q,onChange:re,disabled:!l}),a.ZP.createElement(Me.Z,{id:"channel-title",label:W("EnterChannelName"),onChange:oe,value:G,error:V===qr?V:void 0,disabled:!l}),a.ZP.createElement(Me.Z,{id:"channel-about",className:"mb-2",label:W("DescriptionPlaceholder"),onChange:ie,value:_,disabled:!l}),t.isCreator&&a.ZP.createElement(Le.Z,{icon:"lock",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title"},W("ChannelType")),a.ZP.createElement("span",{className:"subtitle"},t.username?W("TypePublic"):W("TypePrivate"))),a.ZP.createElement(Le.Z,{icon:"message",multiline:!0,onClick:te,disabled:!l},a.ZP.createElement("span",{className:"title"},W("Discussion")),a.ZP.createElement("span",{className:"subtitle"},W(B?"DiscussionUnlink":"Add"))),a.ZP.createElement(Le.Z,{icon:"admin",multiline:!0,onClick:ae},a.ZP.createElement("span",{className:"title"},W("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},Q)),c&&a.ZP.createElement(Le.Z,{icon:"link",onClick:se,multiline:!0,disabled:!d},a.ZP.createElement("span",{className:"title"},W("GroupInfo.InviteLinks")),a.ZP.createElement("span",{className:"subtitle"},d?(0,it.kh)(d.length):W("Loading"))),a.ZP.createElement(Le.Z,{icon:"reactions",multiline:!0,onClick:ne,disabled:!l},a.ZP.createElement("span",{className:"title"},W("Reactions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},ue,"/",P)),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(fn.Z,{checked:i,label:W("ChannelSignMessages"),onChange:ce}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"group",multiline:!0,onClick:de},a.ZP.createElement("span",{className:"title",dir:"auto"},W("ChannelSubscribers")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},W("Subscribers",null!==(N=t.membersCount)&&void 0!==N?N:0,"i")))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:D},t.isCreator?W("ChannelDelete"):W("LeaveChannel")))),a.ZP.createElement(mn.Z,{isShown:U,onClick:le,disabled:he,ariaLabel:W("Save")},he?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Xe.Z,{isOpen:$,onClose:x,text:t.isCreator?W("ChannelDeleteAlert"):W("ChannelLeaveAlert"),confirmLabel:t.isCreator?W("ChannelDelete"):W("LeaveChannel"),confirmHandler:me,confirmIsDestructive:!0}))})));var Qr=n(88);const eo=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t),{isUsernameAvailable:a}=(0,g.aW)(e,t);return{chat:n,isChannel:(0,v.eA)(n),progress:e.management.progress,isUsernameAvailable:a,isProtected:null==n?void 0:n.isProtected}}))((({chat:e,onClose:t,isActive:n,isChannel:r,progress:i,isUsernameAvailable:l,isProtected:c})=>{var d;const{checkPublicLink:h,updatePublicLink:Z,updatePrivateLink:P,toggleIsProtected:v}=(0,s.uC)(),g=Boolean(e.username),p=null===(d=e.fullInfo)||void 0===d?void 0:d.inviteLink,[E,C]=(0,a.eJ)(g?"public":"private"),[f,b]=(0,a.eJ)(),[I,y,N]=(0,De.Z)(),S=Boolean("public"===E&&f&&l||"private"===E&&g);(0,m.ZP)(n,t),(0,a.d4)((()=>{E&&!p&&P()}),[E,p,P]);const w=(0,a.I4)((e=>{C(e)}),[]),k=(0,a.I4)((t=>{v({chatId:e.id,isProtected:"protected"===t})}),[e.id,v]),M=(0,a.I4)((()=>{Z({username:"public"===E?f:""})}),[E,Z,f]),T=(0,a.I4)((()=>{N(),P()}),[N,P]),L=(0,u.Z)(),A=r?"Channel":"Mega",R=r?"Channel":"Group",F=[{value:"private",label:L(`${A}Private`),subLabel:L(`${A}PrivateInfo`)},{value:"public",label:L(`${A}Public`),subLabel:L(`${A}PublicInfo`)}],B=[{value:"allowed",label:L("ChannelVisibility.Forwarding.Enabled")},{value:"protected",label:L("ChannelVisibility.Forwarding.Disabled")}],$=i===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:L.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading"},L(`${R}Type`)),a.ZP.createElement(at.Z,{selected:E,name:"channel-type",options:F,onChange:w})),"private"===E?a.ZP.createElement("div",{className:"section",dir:L.isRtl?"rtl":void 0},p?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Qr.Z,{url:p,className:"group-link",text:p}),a.ZP.createElement("p",{className:"section-info",dir:L.isRtl?"rtl":void 0},L(`${A}PrivateLinkHelp`)),a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:y},L("RevokeLink")),a.ZP.createElement(Xe.Z,{isOpen:I,onClose:N,text:L("RevokeAlert"),confirmLabel:L("RevokeButton"),confirmHandler:T,confirmIsDestructive:!0})):a.ZP.createElement(we.Z,null)):a.ZP.createElement("div",{className:"section no-border"},a.ZP.createElement(vn,{asLink:!0,currentUsername:e.username,isLoading:$,isUsernameAvailable:l,checkUsername:h,onChange:b}),a.ZP.createElement("p",{className:"section-info",dir:"auto"},L(`${R}.Username.CreatePublicLinkHelp`))),a.ZP.createElement("div",{className:"section",dir:L.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading"},L(r?"ChannelVisibility.Forwarding.ChannelTitle":"ChannelVisibility.Forwarding.GroupTitle")),a.ZP.createElement(at.Z,{selected:c?"protected":"allowed",name:"channel-type",options:B,onChange:k}),a.ZP.createElement("p",{className:"section-info"},L(r?"ChannelVisibility.Forwarding.ChannelInfo":"ChannelVisibility.Forwarding.GroupInfo")))),a.ZP.createElement(mn.Z,{isShown:S,disabled:$,ariaLabel:L("Save"),onClick:M},$?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),to=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.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,g.Z1)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&(0,v.eA)(a)}}))((({chat:e,onClose:t,isActive:n,chatId:r,chatsByIds:l,linkedChat:c,forDiscussionIds:d,isChannel:h,onScreenSelect:Z})=>{const{loadGroupsForDiscussion:P,linkDiscussionGroup:v,unlinkDiscussionGroup:g}=(0,s.uC)(),[p,E]=(0,a.eJ)(),[C,f]=(0,a.eJ)(),[b,I]=(0,a.eJ)(!1),y=(0,a.I4)((()=>I(!0)),[]),[N,S,w]=(0,De.Z)(),[k,M,T]=(0,De.Z)(),L=(0,u.Z)(),A=null==c?void 0:c.id;(0,m.ZP)(n,t),(0,a.d4)((()=>{P()}),[P]),(0,a.d4)((()=>{C||(0,dt.Z)("DiscussionGroups").then(f)}),[C]);const R=(0,a.I4)((()=>{w(),g({channelId:h?r:A}),h||Z(o.u1.Initial)}),[w,g,h,r,A,Z]),F=(0,a.I4)((()=>{T(),v({channelId:r,chatId:p})}),[T,v,r,p]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"section-icon"},C&&a.ZP.createElement(mt.Z,{id:"discussionGroupsDucks",size:i.bM,animationData:C,play:b,noLoop:!0,onLoad:y})),c&&a.ZP.createElement("div",null,a.ZP.createElement(Le.Z,{className:"chat-item-clickable",inactive:!0},a.ZP.createElement(Ae.Z,{chatId:c.id})),a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:S},L(h?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),a.ZP.createElement(Xe.Z,{isOpen:N,onClose:w,header:a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(ge.Z,{size:"tiny",chat:c}),a.ZP.createElement("div",{className:"modal-title"},L(h?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:(0,ve.Z)(L(h?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",c.title),["br","simple_markdown"]),confirmLabel:L(h?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:R,confirmIsDestructive:!0})),!c&&a.ZP.createElement("div",null,a.ZP.createElement("p",{className:"section-help",dir:"auto"},L("DiscussionChannelHelp")),a.ZP.createElement("div",{teactFastList:!0},a.ZP.createElement(Le.Z,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},L("DiscussionCreateGroup")),d?d.map(((e,t)=>a.ZP.createElement(Le.Z,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{E(e),M()}},a.ZP.createElement(Ae.Z,{chatId:e})))):a.ZP.createElement(kt.Z,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),a.ZP.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},L("DiscussionChannelHelp2")),a.ZP.createElement(Xe.Z,{isOpen:k,onClose:T,header:function(){const e=l[p];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"},L("Channel.DiscussionGroup.LinkGroup")))}(),textParts:function(){const t=l[p];if(t)return t.hasPrivateLink?(0,ve.Z)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):(0,ve.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:L("DiscussionLinkGroup"),confirmHandler:F,isButtonsInOneRow:!0})))))}))),no=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,g.Z1)(e,t);return{chat:a,isFormFullyDisabled:!(a.isCreator||n)}}))((({chat:e,selectedChatMemberId:t,onScreenSelect:n,isFormFullyDisabled:r,onClose:i,isActive:l})=>{const{updateChatMemberBannedRights:c}=(0,s.uC)(),[d,h]=(0,a.eJ)({}),[Z,P]=(0,a.eJ)(!1),[v,g]=(0,a.eJ)(!1),[p,E,C]=(0,De.Z)(),f=(0,u.Z)();(0,m.ZP)(l,i);const b=(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&&!b&&n(o.u1.GroupPermissions)}),[e,n,b,t]),(0,a.d4)((()=>{h((null==b?void 0:b.bannedRights)||(null==e?void 0:e.defaultBannedRights)||{}),P(!1),g(!1)}),[e,b]);const I=(0,a.I4)((e=>{const{name:t}=e.target;function n(e){return!e||void 0}h((e=>({...e,[t]:n(e[t]),..."sendStickers"===t&&{sendGifs:n(e[t])}}))),P(!0)}),[]),y=(0,a.I4)((()=>{e&&t&&(g(!0),c({chatId:e.id,userId:t,bannedRights:d}))}),[e,t,d,c]),N=(0,a.I4)((()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})}),[e,t,c]),S=(0,a.I4)((t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t]),[e,r]);if(b)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Re.Z,{userId:b.userId})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},f("UserRestrictionsCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"sendMessages",checked:!d.sendMessages,label:f("UserRestrictionsSend"),blocking:!0,disabled:S("sendMessages"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"sendMedia",checked:!d.sendMedia,label:f("UserRestrictionsSendMedia"),blocking:!0,disabled:S("sendMedia"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"sendStickers",checked:!d.sendStickers&&!d.sendGifs,label:f("UserRestrictionsSendStickers"),blocking:!0,disabled:S("sendStickers"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"sendPolls",checked:!d.sendPolls,label:f("UserRestrictionsSendPolls"),blocking:!0,disabled:S("sendPolls"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"embedLinks",checked:!d.embedLinks,label:f("UserRestrictionsEmbedLinks"),blocking:!0,disabled:S("embedLinks"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"inviteUsers",checked:!d.inviteUsers,label:f("UserRestrictionsInviteUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"pinMessages",checked:!d.pinMessages,label:f("UserRestrictionsPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"changeInfo",checked:!d.changeInfo,label:f("UserRestrictionsChangeInfo"),blocking:!0,disabled:S("changeInfo"),onChange:I}))),!r&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete-user",ripple:!0,destructive:!0,onClick:E},f("UserRestrictionsBlock")))),a.ZP.createElement(mn.Z,{isShown:Z,onClick:y,ariaLabel:f("Save"),disabled:v},v?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Xe.Z,{isOpen:p,onClose:C,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:N,confirmIsDestructive:!0}))}))),ao=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t);return{chat:n,currentUserId:e.currentUserId,isChannel:(0,v.eA)(n)}}))((({chat:e,isChannel:t,currentUserId:n,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)((()=>{r(o.u1.GroupAddAdmins)}),[r]),g=(0,a.I4)((e=>{if(e.isOwner)return d("ChannelCreator");const t=(0,s.Rd)().users.byId,n=e.promotedByUserId?t[e.promotedByUserId]:void 0;return n?d("EditAdminPromotedBy",(0,v.Js)(n)):d("ChannelAdmin")}),[d]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.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(Le.Z,{key:e.userId,className:"chat-item-clickable",onClick:()=>Z(e)},a.ZP.createElement(Re.Z,{userId:e.userId,status:g(e),forceShowSelf:!0})))),a.ZP.createElement(mn.Z,{isShown:!0,onClick:P,ariaLabel:d("Channel.Management.AddModerator")},a.ZP.createElement("i",{className:"icon-add-user-filled"})))))}))),so=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,g.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(fn.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllEvents"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewAdmins"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewMembers"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterChannelInfo"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterDeletedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterEditedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.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(fn.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllAdmins"),onChange:void 0})),r.map((e=>a.ZP.createElement(Le.Z,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},a.ZP.createElement(fn.Z,{label:"",checked:!0}),a.ZP.createElement(Re.Z,{userId:e.userId,status:o(e),forceShowSelf:!0})))))))}))),ro=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,g.Z1)(e,t),{byId:s}=e.users,{currentUserId:r}=e;return{chat:a,usersById:s,currentUserId:r,isChannel:(0,v.eA)(a),isFormFullyDisabled:!(a.isCreator||n),defaultRights:a.adminRights}}))((({isNewAdmin:e,selectedChatMemberId:t,defaultRights:n,onScreenSelect:r,chat:i,usersById:l,currentUserId:c,isChannel:d,isFormFullyDisabled:h,onClose:Z,isActive:P})=>{const{updateChatAdmin:g}=(0,s.uC)(),[p,E]=(0,a.eJ)({}),[C,f]=(0,a.eJ)(e),[b,I]=(0,a.eJ)(!1),[y,N,S]=(0,De.Z)(),[w,k]=(0,a.eJ)(""),M=(0,u.Z)();(0,m.ZP)(P,Z);const T=(0,a.Ye)((()=>{var n,a;const s=null===(n=i.fullInfo)||void 0===n||null===(a=n.adminMembers)||void 0===a?void 0:a.find((({userId:e})=>e===t));var r,o;return e?s||null===(r=i.fullInfo)||void 0===r||null===(o=r.members)||void 0===o?void 0:o.find((({userId:e})=>e===t)):s}),[i.fullInfo,e,t]);(0,a.d4)((()=>{null!=i&&i.fullInfo&&t&&!T&&r(o.u1.ChatAdministrators)}),[i,r,T,t]),(0,a.d4)((()=>{E((e?n:null==T?void 0:T.adminRights)||{}),k(((e?"admin":null==T?void 0:T.customTitle)||"").substr(0,16)),f(Boolean(e)),I(!1)}),[n,e,T]);const L=(0,a.I4)((e=>{const{name:t}=e.target;E((e=>{return{...e,[t]:(n=e[t],!n||void 0)};var n})),f(!0)}),[]),A=(0,a.I4)((()=>{t&&(I(!0),g({chatId:i.id,userId:t,adminRights:p,customTitle:w}))}),[t,g,i.id,p,w]),R=(0,a.I4)((()=>{t&&(g({chatId:i.id,userId:t,adminRights:{}}),S())}),[i.id,S,t,g]),F=(0,a.I4)((e=>!((0,v.G9)(i)||!h&&i.adminRights&&i.adminRights[e])),[i,h]),B=(0,a.Ye)((()=>{if(e||!T)return;if(T.isOwner)return M("ChannelCreator");const t=T.promotedByUserId?l[T.promotedByUserId]:void 0;return t?M("EditAdminPromotedBy",(0,v.Js)(t)):M("ChannelAdmin")}),[e,T,l,M]),$=(0,a.I4)((e=>{const{value:t}=e.target;k(t),f(!0)}),[]);if(T)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Re.Z,{userId:T.userId,status:B,forceShowSelf:!0})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},M("EditAdminWhatCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"changeInfo",checked:!!p.changeInfo,label:M(d?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:F("changeInfo"),onChange:L})),d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"postMessages",checked:!!p.postMessages,label:M("EditAdminPostMessages"),blocking:!0,disabled:F("postMessages"),onChange:L})),d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"editMessages",checked:!!p.editMessages,label:M("EditAdminEditMessages"),blocking:!0,disabled:F("editMessages"),onChange:L})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"deleteMessages",checked:!!p.deleteMessages,label:M(d?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:F("deleteMessages"),onChange:L})),!d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"banUsers",checked:!!p.banUsers,label:M("EditAdminBanUsers"),blocking:!0,disabled:F("banUsers"),onChange:L})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"inviteUsers",checked:!!p.inviteUsers,label:M("EditAdminAddUsers"),blocking:!0,disabled:F("inviteUsers"),onChange:L})),!d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"pinMessages",checked:!!p.pinMessages,label:M("EditAdminPinMessages"),blocking:!0,disabled:F("pinMessages"),onChange:L})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"addAdmins",checked:!!p.addAdmins,label:M("EditAdminAddAdmins"),blocking:!0,disabled:F("addAdmins"),onChange:L})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"manageCall",checked:!!p.manageCall,label:M("StartVoipChatPermission"),blocking:!0,disabled:F("manageCall"),onChange:L})),!d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"anonymous",checked:!!p.anonymous,label:M("EditAdminSendAnonymously"),blocking:!0,disabled:F("anonymous"),onChange:L})),h&&a.ZP.createElement("p",{className:"section-info mb-4",dir:"auto"},M("Channel.EditAdmin.CannotEdit")),!d&&a.ZP.createElement(Me.Z,{id:"admin-title",label:M("EditAdminRank"),onChange:$,value:w,disabled:h,maxLength:16}),c!==t&&!h&&!e&&a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:N},M("EditAdminRemoveAdmin")))),a.ZP.createElement(mn.Z,{isShown:C,onClick:A,ariaLabel:M("Save"),disabled:b},b?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),!e&&a.ZP.createElement(Xe.Z,{isOpen:y,onClose:S,text:"Are you sure you want to dismiss this admin?",confirmLabel:M("Channel.Admin.Dismiss"),confirmHandler:R,confirmIsDestructive:!0}))}))),oo=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n,a;const s=(0,g.Z1)(e,t),{statusesById:r}=e.users;return{members:null==s||null===(n=s.fullInfo)||void 0===n?void 0:n.members,adminMembers:null==s||null===(a=s.fullInfo)||void 0===a?void 0:a.adminMembers,userStatusesById:r,isChannel:s&&(0,v.eA)(s),serverTimeOffset:e.serverTimeOffset}}))((({noAdmins:e,members:t,adminMembers:n,userStatusesById:r,isChannel:i,isActive:l,serverTimeOffset:c,onClose:d,onScreenSelect:u,onChatMemberSelect:h})=>{const{openUserInfo:Z}=(0,s.uC)(),P=(0,a.Ye)((()=>{const a=(0,s.Rd)().users.byId;if(!t||!a)return;const o=e&&(null==n?void 0:n.map((({userId:e})=>e)))||[],i=(0,v.Z0)(t.map((({userId:e})=>e)),a,r,void 0,c);return e?i.filter((e=>!o.includes(e))):i}),[t,e,n,r,c]),g=(0,a.I4)((t=>{e?(h(t,!1),u(o.u1.ChatNewAdminRights)):Z({id:t})}),[e,h,u,Z]);return(0,m.ZP)(l,d),a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},P?P.map(((e,t)=>a.ZP.createElement(Le.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>g(e)},a.ZP.createElement(Re.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(kt.Z,{teactOrderKey:0,key:"nothing-found",text:i?"No subscribers found":"No members found"}))))}))),io=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.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,v.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,v.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(Le.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>h(e)},a.ZP.createElement(Re.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(kt.Z,{teactOrderKey:0,key:"nothing-found",text:s?"No subscribers found":"No members found"}))))})));var lo=n(2357),co=n(2267);function mo(e,t){const{isPermanent:n,usage:a=0,date:s}=e,{isPermanent:r,usage:o=0,date:i}=t;return n||r?Number(n)-Number(r):a||o?o-a:i-s}const uo=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const{invites:n}=e.management.byChatId[t];return{exportedInvites:n,chat:(0,g.Z1)(e,t),serverTimeOffset:e.serverTimeOffset}}))((({chatId:e,chat:t,exportedInvites:n,isActive:r,serverTimeOffset:i,onClose:l,onScreenSelect:d})=>{const{setEditingExportedInvite:h,showNotification:Z,editExportedChatInvite:P}=(0,s.uC)();(0,m.ZP)(r,l);const v=(0,u.Z)(),g=(0,a.Ye)((()=>{if(n)return n.some((({expireDate:e})=>e&&e-(0,co.b)(i){p()}),g?1e3:void 0);const E=null==n?void 0:n.find((({isPermanent:e})=>e)),C=null!=t&&t.username?`t.me/${t.username}`:null==E?void 0:E.link,b=(0,a.Ye)((()=>{const e=null!=t&&t.username?n:null==n?void 0:n.filter((({isPermanent:e})=>!e));return null==e?void 0:e.filter((({isRevoked:e})=>!e)).sort(mo)}),[null==t?void 0:t.username,n]),I=(0,a.I4)((t=>{const{link:n,title:a,isRequestNeeded:s,expireDate:r,usageLimit:o}=t;P({chatId:e,link:n,title:a,isRequestNeeded:s,expireDate:r,usageLimit:o,isRevoked:!0})}),[e,P]),y=(0,a.I4)((()=>{d(o.u1.EditInvite)}),[d]),N=(0,a.I4)((()=>{E&&I(E)}),[E,I]),S=(0,a.I4)((e=>{(0,rs.TE)(e),Z({message:v("LinkCopied")})}),[v,Z]),w=(0,a.I4)((()=>{S(C)}),[S,C]),k=t=>{const n=[];return n.push({title:v("Copy"),icon:"copy",handler:()=>S(t.link)}),t.isPermanent||n.push({title:v("Edit"),icon:v("edit"),handler:()=>(t=>{h({chatId:e,invite:t}),d(o.u1.EditInvite)})(t)}),n.push({title:v("RevokeButton"),icon:v("delete"),handler:()=>I(t),destructive:!0}),n},M=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(L.Z,{round:!0,ripple:!f.wB,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"Actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]);return a.ZP.createElement("div",{className:"Management ManageInvites"},a.ZP.createElement("div",{className:"custom-scroll"},C&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement("p",{className:"text-muted"},null!=t&&t.username?v("PublicLink"):v("lng_create_permanent_link_title")),a.ZP.createElement("div",{className:"primary-link"},a.ZP.createElement("input",{className:"form-control primary-link-input",value:C,readOnly:!0,onClick:w}),a.ZP.createElement(F.Z,{className:"primary-link-more-menu",trigger:M,positionX:"right"},a.ZP.createElement(B.Z,{icon:"copy",onClick:w},v("Copy")),!(null!=t&&t.username)&&a.ZP.createElement(B.Z,{icon:"delete",onClick:N,destructive:!0},v("RevokeButton")))),a.ZP.createElement(L.Z,{onClick:w},v("CopyLink"))),a.ZP.createElement("div",{className:"section",teactFastList:!0},a.ZP.createElement(L.Z,{isText:!0,key:"create",className:"create-link",onClick:y},v("CreateNewLink")),!b&&a.ZP.createElement(kt.Z,{text:"No links found",key:"nothing"}),null==b?void 0:b.map((e=>a.ZP.createElement(Le.Z,{icon:"link",secondaryIcon:"more",multiline:!0,onClick:()=>S(e.link),contextActions:k(e),key:e.link},a.ZP.createElement("span",{className:"title"},e.title||e.link),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},(e=>{const{usage:t=0,usageLimit:n,expireDate:a,isPermanent:s,requested:r}=e;let o="";if(o=n&&t0?v("InviteLink.ExpiresIn",(0,K.D)(v,e)):v("InviteLink.Expired")}else s&&(o+=` • ${v("Permanent")}`);return o})(e))))),a.ZP.createElement("p",{className:"text-muted hint",key:"links-hint"},v("ManageLinksInfoHelp")))))})));var ho=n(2531);const Zo=[1,10,100],Po={hour:36e5,day:864e5,week:6048e5},vo=Po.hour,go=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const{editingInvite:n}=e.management.byChatId[t];return{editingInvite:n,serverTimeOffset:e.serverTimeOffset}}))((({chatId:e,editingInvite:t,isActive:n,serverTimeOffset:r,onClose:i,onScreenSelect:l})=>{const{editExportedChatInvite:c,exportChatInvite:d}=(0,s.uC)(),h=(0,u.Z)(),[Z,P,v]=(0,De.Z)(),[g,p]=(0,a.eJ)(!1),[E,C]=(0,a.eJ)(""),[f,b]=(0,a.eJ)(Date.now()+vo),[I,y]=(0,a.eJ)("unlimited"),[N,S]=(0,a.eJ)(10),[w,k]=(0,a.eJ)("0");(0,m.ZP)(n,i),(0,a.d4)((()=>{if(t){const{title:e,usageLimit:n,expireDate:a,isRequestNeeded:s}=t;e&&C(e),n&&(k(Zo.includes(n)?n.toString():"custom"),S(n)),a&&(y("custom"),b(1e3*a)),s&&p(!0)}else C(""),y("unlimited"),k("0"),b(1e3*(0,co.b)(r)+vo),S(10),p(!1)}),[t,r]);const M=(0,a.I4)((e=>{p(e.target.checked)}),[]),T=(0,a.I4)((e=>{C(e.target.value)}),[]),A=(0,a.I4)((e=>{S(Number.parseInt(e.target.value,10))}),[]),R=(0,a.I4)((e=>{b(e.getTime()),v()}),[v]),F=(0,a.I4)((()=>{const n="custom"===w?N:w;let a;switch(I){case"custom":a=(0,co.b)(r)+(f-Date.now())/1e3;break;case"hour":case"day":case"week":a=(0,co.b)(r)+Po[I]/1e3;break;case"unlimited":default:a=void 0}t?c({link:t.link,chatId:e,title:E,isRequestNeeded:g,expireDate:a,usageLimit:n}):d({chatId:e,title:E,isRequestNeeded:g,expireDate:a,usageLimit:n}),l(o.u1.Invites)}),[e,f,N,c,t,d,g,I,w,E,l,r]);return a.ZP.createElement("div",{className:"Management ManageInvite"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(fn.Z,{label:h("ApproveNewMembers"),subLabel:h("ApproveNewMembersDescription"),checked:g,onChange:M})),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Me.Z,{className:"link-name",placeholder:h("LinkNameHint"),value:E,onChange:T}),a.ZP.createElement("p",{className:"text-muted hint"},h("LinkNameHelp"))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"section-header"},h("LimitByPeriod")),a.ZP.createElement(at.Z,{name:"expireOptions",options:[{value:"hour",label:h("Hours",1)},{value:"day",label:h("Days",1)},{value:"week",label:h("Weeks",1)},{value:"unlimited",label:h("NoLimit")},{value:"custom",label:h("lng_group_invite_expire_custom")}],onChange:y,selected:I}),"custom"===I&&a.ZP.createElement(L.Z,{className:"expire-limit",isText:!0,onClick:P},(0,K.Tu)(h,f)," ",(0,K.mr)(h,f)),a.ZP.createElement("p",{className:"text-muted hint"},h("TimeLimitHelp"))),!g&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"section-header"},h("LimitNumberOfUses")),a.ZP.createElement(at.Z,{name:"usageOptions",options:[...Zo.map((e=>({value:e.toString(),label:e}))),{value:"0",label:h("NoLimit")},{value:"custom",label:h("lng_group_invite_usage_custom")}],onChange:k,selected:w}),"custom"===w&&a.ZP.createElement("input",{className:"form-control usage-limit",type:"number",min:"1",max:"99999",value:N,onChange:A}),a.ZP.createElement("p",{className:"text-muted hint"},h("UsesLimitHelp"))),a.ZP.createElement(mn.Z,{isShown:!0,onClick:F,ariaLabel:h(t?"SaveLink":"CreateLink")},a.ZP.createElement("i",{className:"icon-check"}))),a.ZP.createElement(ho.Z,{isOpen:Z,isFutureMode:!0,withTimePicker:!0,onClose:v,onSubmit:R,selectedAt:f,submitButtonLabel:h("Save")}))}))),po=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.Z1)(e,t);return{enabledReactions:null===(n=a.fullInfo)||void 0===n?void 0:n.enabledReactions,availableReactions:e.availableReactions,chat:a}}))((({availableReactions:e,enabledReactions:t,chat:n,isActive:r,onClose:o})=>{const{setChatEnabledReactions:i}=(0,s.uC)(),l=(0,u.Z)(),[c,d]=(0,a.eJ)(!1),[h,Z]=(0,a.eJ)(!1),[P,v]=(0,a.eJ)(t);(0,m.ZP)(r,o);const g=(0,a.I4)((()=>{n&&(Z(!0),i({chatId:n.id,enabledReactions:P}))}),[n,P,i]);(0,a.d4)((()=>{Z(!1),d(!1),v(t||[])}),[t]);const p=(0,a.I4)((t=>{if(!n||!e)return;const{name:a,checked:s}=t.currentTarget,r="all"===a?s?e.map((e=>e.reaction)):[]:s?[...P,a]:P.filter((e=>e!==a));v(r),d(!0)}),[e,n,P]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:"all",checked:!P||P.length>0,label:l("EnableReactions"),onChange:p})),null==e?void 0:e.filter((e=>!e.isInactive)).map((({reaction:e,title:t})=>a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(fn.Z,{name:e,checked:!P||(null==P?void 0:P.includes(e)),disabled:0===(null==P?void 0:P.length),label:a.ZP.createElement("div",{className:"Reaction"},a.ZP.createElement(lt.Z,{reaction:e}),t),onChange:p})))))),a.ZP.createElement(mn.Z,{isShown:c,onClick:g,ariaLabel:l("Save"),disabled:h},h?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),Eo=(0,a.X$)((0,s.c$)((e=>({managementType:(0,g.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(zr,{key:e,userId:e,onClose:l,isActive:c});case"group":return a.ZP.createElement(Hr,{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.ChatNewAdminRights,o.u1.GroupRecentActions].includes(t)});case"channel":return a.ZP.createElement(Wr,{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.ChatNewAdminRights,o.u1.GroupRecentActions].includes(t)})}break;case o.u1.ChatPrivacyType:return a.ZP.createElement(eo,{chatId:e,isActive:c,onClose:l});case o.u1.Discussion:return a.ZP.createElement(to,{chatId:e,onScreenSelect:r,isActive:c,onClose:l});case o.u1.GroupPermissions:return a.ZP.createElement(Vr,{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(Kr,{chatId:e,isActive:c,onClose:l});case o.u1.GroupUserPermissionsCreate:return a.ZP.createElement(io,{chatId:e,onChatMemberSelect:i,onScreenSelect:r,isActive:c||[o.u1.GroupUserPermissions].includes(t),onClose:l});case o.u1.GroupUserPermissions:return a.ZP.createElement(no,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChatAdministrators:return a.ZP.createElement(ao,{chatId:e,onScreenSelect:r,onChatMemberSelect:i,isActive:c||[o.u1.ChatAdminRights,o.u1.ChatNewAdminRights,o.u1.GroupRecentActions].includes(t),onClose:l});case o.u1.GroupRecentActions:return a.ZP.createElement(so,{chatId:e,isActive:c,onClose:l});case o.u1.ChatAdminRights:return a.ZP.createElement(ro,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChatNewAdminRights:return a.ZP.createElement(ro,{chatId:e,isNewAdmin:!0,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChannelSubscribers:case o.u1.GroupMembers:return a.ZP.createElement(oo,{chatId:e,isActive:c,onClose:l});case o.u1.Invites:return a.ZP.createElement(uo,{chatId:e,isActive:c,onClose:l,onScreenSelect:r});case o.u1.EditInvite:return a.ZP.createElement(go,{chatId:e,isActive:c,onClose:l,onScreenSelect:r});case o.u1.GroupAddAdmins:return a.ZP.createElement(oo,{chatId:e,noAdmins:!0,isActive:c,onClose:l,onScreenSelect:r,onChatMemberSelect:i});case o.u1.Reactions:return a.ZP.createElement(po,{chatId:e,isActive:c,onClose:l})}})));var Co=n(9937);const fo=/^4[0-9]{12}(?:[0-9]{1,3})?$/,bo=/^5[1-5][0-9]{11,14}$/,Io=/^2[2-7][0-9]{11,14}$/;let yo;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(yo||(yo={}));const No={[yo.Default]:"",[yo.Visa]:"visa",[yo.Mastercard]:"mastercard"};function So(e){return e=e.replace(/\s/g,""),fo.test(e)?yo.Visa:bo.test(e)||Io.test(e)?yo.Mastercard:yo.Default}const wo={},ko=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/,Mo="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 ko;const t=e[0];let n;if(!wo[t]){const e=t.split("").map(Number);n=e.reduce(((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`),""),wo[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return wo[t]}(e.match(/\d+$/))}))),To={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},Lo=(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:Ao(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:Ao(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function Ao(e){const t=Mo.find((({id:t})=>t===e));return t?t.name:""}function Ro(e,t=400){(0,a.d4)((()=>{f.$b||setTimeout((()=>{(0,G.T2)((()=>{e.current&&e.current.focus()}))}),t)}),[e,t])}const Fo=(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))})),Bo=(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)();Ro(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]),v=(0,a.I4)((e=>{o({type:"changeCountry",payload:e.target.value})}),[o]),g=(0,a.I4)((e=>{o({type:"changePostCode",payload:e.target.value})}),[o]),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(Me.Z,{ref:i,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:b.streetLine1}),a.ZP.createElement(Me.Z,{label:"Address2 (Street)",onChange:h,value:e.streetLine2,inputMode:"text",error:b.streetLine2}),a.ZP.createElement(Me.Z,{label:"City",onChange:Z,value:e.city,inputMode:"text",error:b.city}),a.ZP.createElement(Me.Z,{label:"State",onChange:P,value:e.state,inputMode:"text",error:b.state}),a.ZP.createElement(Fo,{label:"Country",placeholder:"Country",onChange:v,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:b.countryIso2,ref:c},Mo.map((({name:e,id:t})=>a.ZP.createElement("option",{value:t,className:"county-item"},e)))),a.ZP.createElement(Me.Z,{label:"Post Code",onChange:g,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(Me.Z,{label:"Full name",onChange:p,value:e.fullName,inputMode:"text",error:b.fullName}),t&&a.ZP.createElement(Me.Z,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:b.email}),n&&a.ZP.createElement(Me.Z,{label:"Phone number",onChange:C,value:e.phone,inputMode:"tel",error:b.phone,ref:l}),a.ZP.createElement(fn.Z,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))})),$o=(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,Co.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(at.Z,{name:"shipping-options",options:i,onChange:o,selected:e.shipping})))}));function Do(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,Co.x)(n,s,e)))}function xo(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 Uo=(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:v,shippingMethod:g}=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=>Do(i.code,e.label,e.amount,r))),n&&n.map((e=>Do(i.code,e.label,e.amount,r))),void 0!==o&&Do(i.code,i("Checkout.TotalAmount"),o,r,!0)),a.ZP.createElement("div",{className:"invoice-info"},m&&xo("icon-card",m,"Payment method"),h&&xo("stripe-provider",h,"Payment provider"),Z&&xo("icon-location",Z,"Shipping address"),P&&xo("icon-user",P,"Name"),v&&xo("icon-phone",v,"Phone number"),g&&xo("icon-truck",g,"Shipping method")))})),Oo=(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(Me.Z,{label:"Expiry date",ref:s,onChange:o,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}));var Go=n(6352),Jo=n(5753);const Xo=(0,a.X$)((({value:e,error:t,onChange:n})=>{const s=(0,a.sO)(null);Ro(s);const[r,o]=(0,a.eJ)(yo.Default);(0,a.d4)((()=>{const t=So(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=So(e.target.value);o(a),n(t),s.current&&(s.current.value=t)}),[n,s]),l=function(e){switch(e){case yo.Mastercard:return a.ZP.createElement("img",{src:Go,alt:""});case yo.Visa:return a.ZP.createElement("img",{src:Jo,alt:""});default:return}}(r);return a.ZP.createElement("div",{className:"CardInput"},a.ZP.createElement("span",{className:"left-addon"},l),a.ZP.createElement(Me.Z,{ref:s,label:"Card number",onChange:i,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))})),_o=(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]),v=(0,u.Z)(),{formErrors:g={}}=e;return a.ZP.createElement("div",{className:"PaymentInfo"},a.ZP.createElement("form",null,a.ZP.createElement("h5",null,v("PaymentCardTitle")),a.ZP.createElement(Xo,{onChange:l,value:e.cardNumber,error:g.cardNumber}),n&&a.ZP.createElement(Me.Z,{label:"Name on card",onChange:c,value:e.cardholder,inputMode:"text",error:g.cardholder}),a.ZP.createElement("section",{className:"inline-inputs"},a.ZP.createElement(Oo,{value:e.expiry,onChange:d,error:g.expiry}),a.ZP.createElement(Me.Z,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:g.cvv})),s||r?a.ZP.createElement("h5",null,v("PaymentBillingAddress")):void 0,s&&a.ZP.createElement(Fo,{label:"Country",placeholder:"Country",onChange:h,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:g.billingCountry,ref:i},Mo.map((({name:e})=>a.ZP.createElement("option",{value:e,className:"county-item"},e)))),r&&a.ZP.createElement(Me.Z,{label:"Post Code",onChange:Z,value:e.billingZip,inputMode:"text",error:g.billingZip}),t&&a.ZP.createElement(fn.Z,{label:v("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:P})))})),zo=(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:v,emailRequested:g,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:v,emailRequested:g,flexible:E,phoneToProvider:C,emailToProvider:f,currency:b,prices:I,isProviderError:m,invoiceContent:o,needCardholderName:u,needCountry:h,needZip:Z,error:d}}))((({isOpen:e,onClose:t,step:n,shippingOptions:r,savedInfo:i,canSaveCredentials:l,nameRequested:c,shippingAddressRequested:d,phoneRequested:m,emailRequested:h,phoneToProvider:Z,emailToProvider:P,currency:v,passwordMissing:g,isProviderError:p,invoiceContent:E,nativeProvider:C,prices:f,needCardholderName:b,needCountry:I,needZip:y,error:N})=>{const{validateRequestedInfo:S,sendPaymentForm:w,setPaymentStep:k,sendCredentialsInfo:M,clearPaymentError:T}=(0,s.uC)(),[A,F]=(0,nn.Z)(Lo,To),[B,$]=(0,a.eJ)(!1),D=(0,u.Z)();(0,a.d4)((()=>{(n||N)&&$(!1)}),[n,N]),(0,a.d4)((()=>{null!=N&&N.field&&F({type:"setFormErrors",payload:{[N.field]:N.message}})}),[N,F]),(0,a.d4)((()=>{if(i){const{name:e,phone:t,email:n,shippingAddress:a}=i;F({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?`+${t}`:t,email:n,...a||{}}})}}),[i,F]);const x=(0,a.I4)((()=>{T()}),[T]),U=(0,a.Ye)((()=>n!==o.KB.Checkout?0:function(e=[],t,n){const a=t?Ho(t,n):[];let s=0;return s=e.concat(a||[]).reduce(((e,t)=>e+t.amount),s),s}(f,r,A.shipping)),[n,A.shipping,f,r]),O=(0,a.Ye)((()=>{if(n===o.KB.Checkout)return function(e,t,n){const a=`${function(e){const t=So(e);return No[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?Yo(t,e.shipping):void 0;return{paymentMethod:a,paymentProvider:n,shippingAddress:s,name:o,phone:r,shippingMethod:null==i?void 0:i.title}}(A,r,C||"")}),[n,A,r,C]),G=(0,a.I4)((()=>{const{saveInfo:e}=A,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}}}(A);S({requestInfo:t,saveInfo:e})}),[S,A]),X=(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}}}(A);M({credentials:e})}),[M,A]),_=(0,a.I4)((()=>{w({shippingOptionId:A.shipping,saveCredentials:A.saveCredentials})}),[w,A]),z=(0,a.I4)((e=>{k({step:e})}),[k]),Y=(0,a.I4)((()=>{switch($(!0),n){case o.KB.ShippingInfo:return G();case o.KB.Shipping:return z(o.KB.PaymentInfo);case o.KB.PaymentInfo:return X();case o.KB.Checkout:return _();default:return()=>{}}}),[n,G,z,X,_]),H=(0,a.Ye)((()=>{switch(n){case o.KB.ShippingInfo:return D("PaymentShippingInfo");case o.KB.Shipping:return D("PaymentShippingMethod");case o.KB.PaymentInfo:return D("PaymentCardInfo");case o.KB.Checkout:return D("PaymentCheckout");default:return""}}),[n,D]),V=(0,a.Ye)((()=>{switch(n){case o.KB.Checkout:return D("Checkout.PayPrice",(0,Co.x)(U,v,D.code));default:return D("Next")}}),[n,D,v,U]);return p?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(L.Z,{isText:!0,onClick:t},D("OK"))):a.ZP.createElement(ke.Z,{className:"PaymentModal",isOpen:e,onClose:t},a.ZP.createElement("div",{className:"header",dir:D.isRtl?"rtl":void 0},a.ZP.createElement(L.Z,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h3",null,H)),void 0!==n?a.ZP.createElement(R.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(Bo,{state:A,dispatch:F,needAddress:Boolean(d),needEmail:Boolean(h||P),needPhone:Boolean(m||Z),needName:Boolean(c)});case o.KB.Shipping:return a.ZP.createElement($o,{state:A,dispatch:F,shippingOptions:r||[],currency:v});case o.KB.PaymentInfo:return a.ZP.createElement(_o,{state:A,dispatch:F,canSaveCredentials:Boolean(!g&&l),needCardholderName:b,needCountry:I,needZip:y});case o.KB.Checkout:return a.ZP.createElement(Uo,{prices:f,shippingPrices:A.shipping&&r?Ho(r,A.shipping):void 0,totalPrice:U,invoiceContent:E,checkoutInfo:O,currency:v});default:return}}(n)))):a.ZP.createElement("div",{className:"empty-content"},a.ZP.createElement(J.Z,{color:"gray"})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(L.Z,{type:"submit",onClick:Y,disabled:B,isLoading:B},V)),N&&!N.field&&function(){if(N)return a.ZP.createElement(ke.Z,{className:"error",isOpen:Boolean(N),onClose:x},a.ZP.createElement("h4",null,N.description||"Error"),a.ZP.createElement("p",null,N.description||"Error"),a.ZP.createElement(L.Z,{isText:!0,onClick:T},D("OK")))}())})));function Yo(e,t){return e.find((({id:e})=>e===t))}function Ho(e,t){const n=Yo(e,t);return null==n?void 0:n.prices}const Vo=(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(L.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(Uo,{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:v})=>{const g=(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((()=>{g.current.focus()}),c)}),[]),(0,a.d4)((()=>{n&&requestAnimationFrame((()=>{g.current.focus(),g.current.select()}))}),[n]),a.ZP.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||f&&v(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:g,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),[v,g]=(0,a.eJ)(!1);(0,a.d4)((()=>{n?setTimeout((()=>g(!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:v?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:p}),u&&a.ZP.createElement(i.Z,{id:"peekMonkey",size:t?s.K2:m,className:v?"shown":"hidden",animationData:u,playSegment:e?c:d,noLoop:!0}))}))},710:(e,t,n)=>{n.d(t,{Z:()=>v});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,size:{width:1024,height:1024}};let u,h,Z;const P=(0,a.X$)((({file:e,onChange:t,onClose:s})=>{const[P,v]=(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((()=>v(!0))))}),[e,P]);const g=(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:g("CropImage")},a.ZP.createElement("i",{className:"icon-check"})))})),v=(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))}}))}))},6352:(e,t,n)=>{e.exports=n.p+"mastercard.4216118edafe23cc2dec..svg"},5753:(e,t,n)=>{e.exports=n.p+"visa.e5a7c336e1deb4b92a63..svg"}}]); -//# sourceMappingURL=442.8bbf7947a0dd02949ce6.js.map \ No newline at end of file diff --git a/dist/442.8bbf7947a0dd02949ce6.js.map b/dist/442.8bbf7947a0dd02949ce6.js.map deleted file mode 100644 index 168e15427..000000000 --- a/dist/442.8bbf7947a0dd02949ce6.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"442.8bbf7947a0dd02949ce6.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/components/middle/ReactorListModal.tsx","webpack://telegram-t/./src/components/middle/EmojiInteractionAnimation.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/SettingsQuickReaction.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/ReactionSelector.tsx","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/middle/composer/SendAsMenu.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/ManageInvites.tsx","webpack://telegram-t/./src/components/right/management/ManageInvite.tsx","webpack://telegram-t/./src/components/right/management/ManageReactions.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/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';\nimport stopEvent from '../../../util/stopEvent';\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 img.draggable = false;\n img.oncontextmenu = stopEvent;\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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, selectIsMessageProtected } from '../../modules/selectors';\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 isProtected?: 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\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n isDownloading,\n isProtected,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const {\n downloadMessageMedia,\n cancelMessageMediaDownload,\n } = getDispatch();\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 function renderDownloadButton() {\n if (isProtected) {\n return undefined;\n }\n\n return isVideo ? (\n \n {isDownloading ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n );\n }\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n if (isProtected) {\n return undefined;\n }\n\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 && !isProtected && (\n <>\n \n \n \n \n )}\n {renderDownloadButton()}\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 const isProtected = selectIsMessageProtected(global, message);\n\n return {\n isDownloading,\n isProtected,\n };\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 { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\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, selectIsMessageProtected, selectScheduledMessage, selectUser,\n} from '../../modules/selectors';\nimport { AVATAR_FULL_DIMENSIONS, calculateMediaViewerDimensions } from '../common/helpers/mediaDimensions';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport stopEvent from '../../util/stopEvent';\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 isProtected?: boolean;\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 isProtected,\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 !IS_SINGLE_COLUMN_LAYOUT && !isProtected,\n )}\n
\n );\n }\n\n if (!message) return undefined;\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n return (\n \n {isProtected &&
}\n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaBlobUrl || previewBlobUrl || pictogramBlobUrl,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n !IS_SINGLE_COLUMN_LAYOUT && !isProtected,\n )}\n {isVideo && (isActive ? (\n \n ) : renderVideoPreview(\n bestImageData,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter, true),\n !IS_SINGLE_COLUMN_LAYOUT && !isProtected,\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 isProtected: selectIsMessageProtected(global, 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 isProtected: selectIsMessageProtected(global, 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, true);\n const debounceSwipe = useDebounce(DEBOUNCE_SWIPE, true);\n const debounceActive = useDebounce(DEBOUNCE_ACTIVE, true);\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 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\nconst SenderInfo: FC = ({\n chatId,\n messageId,\n sender,\n isAvatar,\n message,\n}) => {\n const {\n closeMediaViewer,\n focusMessage,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 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\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 animationLevel,\n}) => {\n const {\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n } = getDispatch();\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)(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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport {\n filterChatsByName,\n filterUsersByName,\n getCanPostInChat,\n sortChatIds,\n} from '../../modules/helpers';\nimport { 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\nconst ForwardPicker: FC = ({\n chatsById,\n activeListIds,\n archivedListIds,\n pinnedIds,\n contactIds,\n currentUserId,\n isOpen,\n}) => {\n const {\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n } = getDispatch();\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)(ForwardPicker));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiContact, ApiError, ApiInviteInfo, ApiPhoto,\n} from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Avatar from '../common/Avatar';\n\nimport './Dialogs.scss';\n\ntype StateProps = {\n dialogs: (ApiError | ApiInviteInfo)[];\n};\n\nconst Dialogs: FC = ({ dialogs }) => {\n const { dismissDialog, acceptInviteConfirmation, sendMessage } = getDispatch();\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const lang = useLang();\n\n useEffect(() => {\n if (dialogs.length > 0) {\n openModal();\n }\n }, [dialogs, openModal]);\n\n if (!dialogs.length) {\n return undefined;\n }\n\n function renderInviteHeader(title: string, photo?: ApiPhoto) {\n return (\n
\n {photo && }\n
\n {renderText(title)}\n
\n \n
\n );\n }\n\n const renderInvite = (invite: ApiInviteInfo) => {\n const {\n hash, title, about, participantsCount, isChannel, photo, isRequestNeeded,\n } = invite;\n\n const handleJoinClick = () => {\n acceptInviteConfirmation({\n hash,\n });\n closeModal();\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 const requestToJoinText = isChannel\n ? lang('MemberRequests.RequestToJoinChannel') : lang('MemberRequests.RequestToJoinGroup');\n\n return (\n \n {about &&

{renderText(about)}

}\n {participantsCount !== undefined &&

{participantsText}

}\n {isRequestNeeded && (\n

\n {isChannel\n ? lang('MemberRequests.RequestToJoinDescriptionChannel')\n : lang('MemberRequests.RequestToJoinDescriptionGroup')}\n

\n )}\n \n \n \n );\n };\n\n const renderContactRequest = (contactRequest: ApiContact) => {\n const handleConfirm = () => {\n sendMessage({\n contact: pick(contactRequest, ['firstName', 'lastName', 'phoneNumber']),\n });\n closeModal();\n };\n\n return (\n \n {lang('AreYouSureShareMyContactInfoBot')}\n
\n \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 | ApiContact) => {\n if ('hash' in dialog) {\n return renderInvite(dialog);\n }\n\n if ('phoneNumber' in dialog) {\n return renderContactRequest(dialog);\n }\n\n return renderError(dialog);\n };\n\n return (\n
\n {Boolean(dialogs.length) && renderDialog(dialogs[dialogs.length - 1])}\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)(Dialogs));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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\nconst Notifications: FC = ({ notifications }) => {\n const { dismissNotification } = getDispatch();\n\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)(Notifications));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\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\nconst SafeLinkModal: FC = ({ url }) => {\n const { toggleSafeLinkModal } = getDispatch();\n\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(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, getDayStart } 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\nconst MAX_SAFE_DATE = 2147483647 * 1000; // API has int for dates\nconst MIN_SAFE_DATE = 0;\n\nexport type OwnProps = {\n selectedAt?: number;\n minAt?: 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 minAt,\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\n const minDate = useMemo(() => {\n if (isFutureMode && !minAt) return new Date();\n return new Date(Math.max(minAt || MIN_SAFE_DATE, MIN_SAFE_DATE));\n }, [isFutureMode, minAt]);\n const maxDate = useMemo(() => {\n if (isPastMode && !maxAt) return new Date();\n return new Date(Math.min(maxAt || MAX_SAFE_DATE, MAX_SAFE_DATE));\n }, [isPastMode, maxAt]);\n\n const passedSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const prevIsOpen = usePrevious(isOpen);\n const [isTimeInputFocused, markTimeInputAsFocused, unmarkTimeInputAsFocused] = useFlag(false);\n\n const [selectedDate, setSelectedDate] = useState(passedSelectedDate);\n const [currentMonthAndYear, setCurrentMonthAndYear] = useState(\n new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1),\n );\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(passedSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(passedSelectedDate.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(passedSelectedDate);\n setCurrentMonthAndYear(new Date(passedSelectedDate.getFullYear(), passedSelectedDate.getMonth(), 1));\n if (withTimePicker) {\n setSelectedHours(formatInputTime(passedSelectedDate.getHours()));\n setSelectedMinutes(formatInputTime(passedSelectedDate.getMinutes()));\n }\n }\n }, [passedSelectedDate, isOpen, prevIsOpen, withTimePicker]);\n\n useEffect(() => {\n if (isFutureMode && !isTimeInputFocused && selectedDate.getTime() < minDate.getTime()) {\n setSelectedDate(minDate);\n setSelectedHours(formatInputTime(minDate.getHours()));\n setSelectedMinutes(formatInputTime(minDate.getMinutes()));\n }\n }, [isFutureMode, isTimeInputFocused, minDate, selectedDate]);\n\n useEffect(() => {\n if (isPastMode && !isTimeInputFocused && selectedDate.getTime() > maxDate.getTime()) {\n setSelectedDate(maxDate);\n setSelectedHours(formatInputTime(maxDate.getHours()));\n setSelectedMinutes(formatInputTime(maxDate.getMinutes()));\n }\n }, [isFutureMode, isPastMode, isTimeInputFocused, maxDate, minDate, selectedDate]);\n\n useEffect(() => {\n if (selectedAt) {\n const newSelectedDate = new Date(selectedAt);\n setSelectedDate(newSelectedDate);\n setSelectedHours(formatInputTime(newSelectedDate.getHours()));\n setSelectedMinutes(formatInputTime(newSelectedDate.getMinutes()));\n }\n }, [selectedAt]);\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, minDate, 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);\n const fixedMinDate = minDate && getDayStart(minDate);\n const fixedMaxDate = maxDate && getDayStart(maxDate);\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(lang, date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', [day, formatTime(lang, date)]);\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt,\n}) => {\n const { searchMessagesByDate, closeHistoryCalendar } = getDispatch();\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)(HistoryCalendar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../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 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\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n}) => {\n const {\n deleteMessages,\n deleteScheduledMessages,\n } = getDispatch();\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)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\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 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\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n}) => {\n const { pinMessage } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\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 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\nconst DeleteSelectedMessageModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n}) => {\n const {\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n } = getDispatch();\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)(DeleteSelectedMessageModal));\n","import { ChangeEvent } from 'react';\n\nimport React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport { ApiReportReason } from '../../api/types';\n\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\nconst ReportMessageModal: FC = ({\n isOpen,\n messageIds,\n onClose,\n}) => {\n const {\n reportMessages,\n exitMessageSelectMode,\n } = getDispatch();\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(ReportMessageModal);\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCanDownloadSelectedMessages,\n selectCanReportSelectedMessages,\n selectCurrentMessageList,\n selectHasProtectedMessage,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\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 hasProtectedMessage?: boolean;\n selectedMessageIds?: number[];\n};\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n canReportMessages,\n canDownloadMessages,\n hasProtectedMessage,\n selectedMessageIds,\n}) => {\n const {\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n downloadSelectedMessages,\n } = getDispatch();\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(\n 'forward', lang('Chat.ForwardActionHeader'), openForwardMenuForSelectedMessages, hasProtectedMessage,\n )\n )}\n {canReportMessages && (\n renderButton('flag', lang('Conversation.ReportMessages'), openReportModal)\n )}\n {canDownloadMessages && (\n renderButton('download', lang('lng_media_download'), handleDownload, hasProtectedMessage)\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, chatId } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n const canReport = selectCanReportSelectedMessages(global);\n const canDownload = selectCanDownloadSelectedMessages(global);\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const hasProtectedMessage = chatId ? selectHasProtectedMessage(global, chatId, selectedMessageIds) : false;\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n canReportMessages: canReport,\n canDownloadMessages: canDownload,\n selectedMessageIds,\n hasProtectedMessage,\n };\n },\n)(MessageSelectToolbar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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\nconst CLOSE_ANIMATION_DURATION = 100;\n\nconst SeenByModal: FC = ({\n isOpen,\n memberIds,\n}) => {\n const {\n openChat,\n closeSeenByModal,\n } = getDispatch();\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)(SeenByModal));\n","import React, {\n FC, useCallback, memo, useMemo, useEffect, useState, useRef,\n} from '../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport useLang from '../../hooks/useLang';\nimport { selectChatMessage } from '../../modules/selectors';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport { getUserFullName } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport { unique } from '../../util/iteratees';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Avatar from '../common/Avatar';\nimport ListItem from '../ui/ListItem';\nimport ReactionStaticEmoji from '../common/ReactionStaticEmoji';\nimport Loading from '../ui/Loading';\n\nimport './ReactorListModal.scss';\n\nconst MIN_REACTIONS_COUNT_FOR_FILTERS = 10;\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\nexport type StateProps = Pick & {\n chatId?: string;\n messageId?: number;\n};\n\nconst ReactorListModal: FC = ({\n isOpen,\n reactors,\n reactions,\n chatId,\n messageId,\n seenByUserIds,\n}) => {\n const {\n loadReactors,\n closeReactorListModal,\n openChat,\n } = getDispatch();\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n const lang = useLang();\n const [isClosing, startClosing, stopClosing] = useFlag(false);\n const [chosenTab, setChosenTab] = useState(undefined);\n const canShowFilters = reactors && reactions && reactors.count >= MIN_REACTIONS_COUNT_FOR_FILTERS\n && reactions.results.length > 1;\n const chatIdRef = useRef();\n\n useEffect(() => {\n if (isClosing && !isOpen) {\n stopClosing();\n setChosenTab(undefined);\n }\n }, [isClosing, isOpen, stopClosing]);\n\n const handleCloseAnimationEnd = useCallback(() => {\n if (chatIdRef.current) {\n openChat({ id: chatIdRef.current });\n }\n closeReactorListModal();\n }, [closeReactorListModal, openChat]);\n\n const handleClose = useCallback(() => {\n startClosing();\n }, [startClosing]);\n\n const handleClick = useCallback((userId: string) => {\n chatIdRef.current = userId;\n handleClose();\n }, [handleClose]);\n\n const handleLoadMore = useCallback(() => {\n loadReactors({\n chatId,\n messageId,\n });\n }, [chatId, loadReactors, messageId]);\n\n const allReactions = useMemo(() => {\n return reactors?.reactions ? unique(reactors.reactions.map((l) => l.reaction)) : [];\n }, [reactors?.reactions]);\n\n const userIds = useMemo(() => {\n if (chosenTab) {\n return reactors?.reactions.filter((l) => l.reaction === chosenTab).map((l) => l.userId);\n }\n return unique(reactors?.reactions.map((l) => l.userId).concat(seenByUserIds || []) || []);\n }, [chosenTab, reactors?.reactions, seenByUserIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n handleLoadMore, userIds, reactors && reactors.nextOffset === undefined,\n );\n\n useEffect(() => {\n getMore?.({ direction: LoadMoreDirection.Backwards });\n }, [getMore]);\n\n return (\n \n {canShowFilters && (\n
\n setChosenTab(undefined)}\n >\n \n {reactors?.count && formatIntegerCompact(reactors.count)}\n \n {allReactions.map((reaction) => {\n const count = reactions?.results.find((l) => l.reaction === reaction)?.count;\n return (\n setChosenTab(reaction)}\n >\n \n {count && formatIntegerCompact(count)}\n \n );\n })}\n
\n )}\n\n
\n {viewportIds?.length ? (\n \n {viewportIds?.map(\n (userId) => {\n const user = usersById[userId];\n const fullName = getUserFullName(user);\n const reaction = reactors?.reactions.find((l) => l.userId === userId)?.reaction;\n return (\n handleClick(userId)}\n >\n \n
\n

{fullName && renderText(fullName)}

\n
\n {reaction && }\n \n );\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.reactorModal || {};\n const message = chatId && messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n\n return {\n chatId,\n messageId,\n reactions: message?.reactions,\n reactors: message?.reactors,\n seenByUserIds: message?.seenByUserIds,\n };\n },\n)(ReactorListModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ActiveEmojiInteraction } from '../../global/types';\nimport { ApiMediaFormat } from '../../api/types';\n\nimport useFlag from '../../hooks/useFlag';\nimport useMedia from '../../hooks/useMedia';\nimport buildClassName from '../../util/buildClassName';\nimport {\n selectAnimatedEmojiEffect,\n} from '../../modules/selectors';\nimport { REM } from '../common/helpers/mediaDimensions';\nimport getAnimationData, { ANIMATED_STICKERS_PATHS } from '../common/helpers/animatedAssets';\n\nimport AnimatedSticker from '../common/AnimatedSticker';\n\nimport './EmojiInteractionAnimation.scss';\n\nexport type OwnProps = {\n emojiInteraction: ActiveEmojiInteraction;\n};\n\ntype StateProps = {\n effectAnimationId?: string;\n localEffectAnimation?: string;\n isReversed?: boolean;\n};\n\nconst HIDE_ANIMATION_DURATION = 250;\nconst PLAYING_DURATION = 3000;\nconst END_SIZE = 1.125 * REM;\nconst EFFECT_SIZE = 240;\n\nconst EmojiInteractionAnimation: FC = ({\n emojiInteraction,\n effectAnimationId,\n localEffectAnimation,\n isReversed,\n}) => {\n const { stopActiveEmojiInteraction } = getDispatch();\n\n const [isHiding, startHiding] = useFlag(false);\n const [isPlaying, startPlaying] = useFlag(false);\n\n const stop = useCallback(() => {\n startHiding();\n setTimeout(() => {\n stopActiveEmojiInteraction();\n }, HIDE_ANIMATION_DURATION);\n }, [startHiding, stopActiveEmojiInteraction]);\n\n useEffect(() => {\n document.addEventListener('touchstart', stop);\n document.addEventListener('touchmove', stop);\n document.addEventListener('mousedown', stop);\n document.addEventListener('wheel', stop);\n\n return () => {\n document.removeEventListener('touchstart', stop);\n document.removeEventListener('touchmove', stop);\n document.removeEventListener('mousedown', stop);\n document.removeEventListener('wheel', stop);\n };\n }, [stop]);\n\n useEffect(() => {\n setTimeout(stop, PLAYING_DURATION);\n }, [stop]);\n\n const mediaDataEffect = useMedia(`sticker${effectAnimationId}`, !effectAnimationId, ApiMediaFormat.Lottie);\n\n const [localEffectAnimationData, setLocalEffectAnimationData] = useState();\n useEffect(() => {\n if (localEffectAnimation) {\n getAnimationData(localEffectAnimation as keyof typeof ANIMATED_STICKERS_PATHS).then((data) => {\n setLocalEffectAnimationData(data);\n });\n }\n }, [localEffectAnimation]);\n\n const scale = (emojiInteraction.startSize || 0) / EFFECT_SIZE;\n const endScale = END_SIZE / EFFECT_SIZE;\n\n return (\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { emojiInteraction }): StateProps => {\n const animatedEffect = emojiInteraction.animatedEffect !== undefined\n && selectAnimatedEmojiEffect(global, emojiInteraction.animatedEffect);\n return {\n effectAnimationId: animatedEffect ? animatedEffect.id : undefined,\n localEffectAnimation: !animatedEffect && emojiInteraction.animatedEffect\n && Object.keys(ANIMATED_STICKERS_PATHS).includes(emojiInteraction.animatedEffect)\n ? emojiInteraction.animatedEffect : undefined,\n isReversed: emojiInteraction.isReversed,\n };\n },\n)(EmojiInteractionAnimation));\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\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\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,\n}) => {\n const {\n loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n } = getDispatch();\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)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 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\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n lastSyncTime,\n}) => {\n const { focusMessage } = getDispatch();\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)(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 { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { unique } 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\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,\n}) => {\n const {\n openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n } = getDispatch();\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(\n contactIdsWithMe, usersById, searchQuery, currentUserId, lang('SavedMessages'),\n );\n\n return [\n ...sortChatIds(unique([\n ...(foundContactIds || []),\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById, undefined, currentUserId ? [currentUserId] : undefined),\n ];\n }, [searchQuery, currentUserId, localContactIds, lang, 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)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\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\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 onSearchDateSelect,\n}) => {\n const { searchMessagesGlobal } = getDispatch();\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)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\nimport { ISettings } from '../../../../types';\n\nimport { selectChat, 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 isChatProtected?: boolean;\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 isChatProtected: chatId ? selectChat(global, chatId)?.isProtected : undefined,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 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\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 isChatProtected,\n}) => {\n const {\n searchMessagesGlobal,\n openMediaViewer,\n } = getDispatch();\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)(MediaResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 { 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\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 isChatProtected,\n}) => {\n const {\n searchMessagesGlobal,\n focusMessage,\n } = getDispatch();\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)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/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 { 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\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}) => {\n const {\n searchMessagesGlobal,\n focusMessage,\n } = getDispatch();\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)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 { 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\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}) => {\n const {\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n } = getDispatch();\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)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalSearchContent } from '../../../types';\n\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\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 onReset,\n}) => {\n const {\n setGlobalSearchContent,\n setGlobalSearchDate,\n } = getDispatch();\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)(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 { getDispatch } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\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\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n onScreenSelect,\n}) => {\n const {\n signOut,\n deleteChatFolder,\n } = getDispatch();\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.QuickReaction:\n return

{lang('DoubleTapSetting')}

;\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(SettingsHeader);\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\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\nconst SettingsMain: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n currentUser,\n lastSyncTime,\n}) => {\n const { loadProfilePhotos } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { ProfileEditProgress, SettingsScreens } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\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\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}) => {\n const {\n loadCurrentUser,\n updateProfile,\n checkUsername,\n } = getDispatch();\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)(SettingsEditProfile));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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\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}) => {\n const { setSettingOption } = getDispatch();\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)(SettingsDataStorage));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../../lib/teact/teactn';\n\nimport { 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 { 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\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}) => {\n const {\n loadRecommendedChatFolders,\n addChatFolder,\n showDialog,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { findIntersectionWithSet } 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\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}) => {\n const {\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\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\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}) => {\n const { loadMoreChats } = getDispatch();\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)(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, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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';\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps =\n Pick & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n defaultReaction?: string;\n };\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 defaultReaction,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldSuggestStickers,\n shouldLoopStickers,\n timeFormat,\n}) => {\n const {\n setSettingOption,\n } = getDispatch();\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 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 {defaultReaction && (\n onScreenSelect(SettingsScreens.QuickReaction)}\n >\n \n
{lang('DoubleTapSetting')}
\n \n )}\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 defaultReaction: global.appConfig?.defaultReaction,\n };\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 { 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\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}) => {\n const {\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n } = getDispatch();\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)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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\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}) => {\n const { setThemeSettings } = getDispatch();\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)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport useDebounce from '../../../hooks/useDebounce';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\n\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\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}) => {\n const {\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n updateWebNotificationSettings,\n } = getDispatch();\n\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const runDebounced = useDebounce(500, 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 {\n handleSettingsChange(e, 'contact', 'silent');\n }}\n />\n {\n handleSettingsChange(e, 'contact', 'showPreviews');\n }}\n />\n
\n\n
\n

{lang('FilterGroups')}

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

{lang('FilterChannels')}

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

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (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)(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\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\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\n}) => {\n const {\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n loadContentSettings,\n updateContentSettings,\n } = getDispatch();\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)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ISettings, LangCode, SettingsScreens } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\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\nconst SettingsLanguage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n languages,\n language,\n}) => {\n const {\n loadLanguages,\n setSettingOption,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\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 =\n Partial & {\n chatsById?: Record;\n usersById?: Record;\n };\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}) => {\n const { setPrivacyVisibility } = getDispatch();\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 {\n onScreenSelect(allowedContactsScreen);\n }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n {\n onScreenSelect(deniedContactsScreen);\n }}\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)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSession } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\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\nconst SettingsPrivacyActiveSessions: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n activeSessions,\n}) => {\n const {\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n } = getDispatch();\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)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, useMemo, useState, memo, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\n\nimport { filterUsersByName, getUserFullName } from '../../../modules/helpers';\nimport { 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\nconst BlockUserModal: FC = ({\n usersById,\n blockedIds,\n contactIds,\n localContactIds,\n currentUserId,\n isOpen,\n onClose,\n}) => {\n const {\n loadContactList,\n setUserSearchQuery,\n blockContact,\n } = getDispatch();\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)(BlockUserModal));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiCountryCode, ApiUser } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\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\nconst SettingsPrivacyBlockedUsers: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n chatsByIds,\n usersByIds,\n blockedIds,\n phoneCodeList,\n}) => {\n const { unblockContact } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\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\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}) => {\n const {\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n } = getDispatch();\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)(SettingsTwoFa));\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\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\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const { setPrivacySettings } = getDispatch();\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)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiAvailableReaction } from '../../../api/types';\n\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport RadioGroup from '../../ui/RadioGroup';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n availableReactions?: ApiAvailableReaction[];\n selectedReaction?: string;\n};\n\nconst SettingsQuickReaction: FC = ({\n isActive,\n onReset,\n onScreenSelect,\n availableReactions,\n selectedReaction,\n}) => {\n const { setDefaultReaction } = getDispatch();\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\n\n const options = availableReactions?.filter((l) => !l.isInactive).map((l) => {\n return {\n label: <>{l.title},\n value: l.reaction,\n };\n }) || [];\n\n const handleChange = useCallback((reaction: string) => {\n setDefaultReaction({ reaction });\n }, [setDefaultReaction]);\n\n return (\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global) => {\n const { availableReactions, appConfig } = global;\n\n return {\n availableReactions,\n selectedReaction: appConfig?.defaultReaction,\n };\n },\n)(SettingsQuickReaction));\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';\nimport SettingsQuickReaction from './SettingsQuickReaction';\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.QuickReaction:\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiUserStatus } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\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\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}) => {\n const {\n loadContactList,\n openChat,\n } = getDispatch();\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)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { 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\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}) => {\n const {\n loadContactList,\n setGlobalSearchQuery,\n } = getDispatch();\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.isSelf && (user.canBeInvitedToGroup || !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)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ChatCreationProgress } from '../../../types';\n\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\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}) => {\n const {\n createGroupChat,\n createChannel,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChatFolder } from '../../api/types';\n\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\nconst ChatFolderModal: FC = ({\n isOpen,\n chatId,\n foldersById,\n folderOrderedIds,\n onClose,\n onCloseAnimationEnd,\n}) => {\n const { editChatFolders } = getDispatch();\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)(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;\nlet excludedClosestSelector: string | 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\nexport const getTouchY = (e: WheelEvent | TouchEvent | React.WheelEvent | React.TouchEvent) => {\n return ('changedTouches' in e ? e.changedTouches[0].clientY : 0);\n};\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 if (excludedClosestSelector && (e.target as HTMLElement).closest(excludedClosestSelector)) return;\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, _excludedClosestSelector?: string) {\n scrollLockEl = el;\n excludedClosestSelector = _excludedClosestSelector;\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 excludedClosestSelector = 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, useLayoutEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAvailableReaction, ApiMediaFormat } from '../../../api/types';\n\nimport useMedia from '../../../hooks/useMedia';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useFlag from '../../../hooks/useFlag';\nimport { getTouchY } from '../../../util/scrollLock';\n\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\nimport './ReactionSelector.scss';\n\nconst REACTION_SIZE = 32;\n\ntype OwnProps = {\n enabledReactions?: string[];\n onSendReaction: (reaction: string, x: number, y: number) => void;\n isPrivate?: boolean;\n availableReactions?: ApiAvailableReaction[];\n isReady?: boolean;\n};\n\nconst AvailableReaction: FC<{\n reaction: ApiAvailableReaction;\n isReady?: boolean;\n onSendReaction: (reaction: string, x: number, y: number) => void;\n}> = ({ reaction, onSendReaction, isReady }) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n const [isActivated, activate, deactivate] = useFlag();\n const mediaData = useMedia(`document${reaction.selectAnimation?.id}`, !isReady, ApiMediaFormat.Lottie);\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n\n function handleClick() {\n if (!containerRef.current) return;\n const { x, y } = containerRef.current.getBoundingClientRect();\n\n onSendReaction(reaction.reaction, x, y);\n }\n\n const shouldRenderPreview = !isAnimationLoaded;\n const shouldRenderAnimated = mediaData;\n const shouldPlay = isReady && isActivated;\n\n return (\n \n {shouldRenderPreview && }\n {shouldRenderAnimated && (\n \n )}\n
\n );\n};\nconst ReactionSelector: FC = ({\n availableReactions,\n enabledReactions,\n onSendReaction,\n isPrivate,\n isReady,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const itemsScrollRef = useRef(null);\n const [isHorizontalScrollEnabled, enableHorizontalScroll] = useFlag(false);\n useHorizontalScroll(itemsScrollRef.current, !isHorizontalScrollEnabled);\n\n useLayoutEffect(() => {\n enableHorizontalScroll();\n }, [enableHorizontalScroll]);\n\n const handleWheel = (e: React.WheelEvent | React.TouchEvent) => {\n if (!itemsScrollRef) return;\n const deltaY = 'deltaY' in e ? e.deltaY : getTouchY(e);\n\n if (deltaY) {\n e.preventDefault();\n }\n };\n\n if ((!isPrivate && !enabledReactions?.length) || !availableReactions) return undefined;\n\n return (\n
\n
\n
\n
\n
\n {availableReactions?.map((reaction) => {\n if (reaction.isInactive\n || (!isPrivate && (!enabledReactions || !enabledReactions.includes(reaction.reaction)))) return undefined;\n return (\n \n );\n })}\n
\n
\n
\n );\n};\n\nexport default memo(ReactionSelector);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAvailableReaction, 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';\nimport buildClassName from '../../../util/buildClassName';\nimport useFlag from '../../../hooks/useFlag';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\nimport Avatar from '../../common/Avatar';\nimport ReactionSelector from './ReactionSelector';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n availableReactions?: ApiAvailableReaction[];\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n enabledReactions?: string[];\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canShowReactionsCount?: boolean;\n canShowReactionList?: boolean;\n canRemoveReaction?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n isPrivate?: 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 onShowReactors?: () => void;\n onSendReaction: (reaction: string | undefined, x: number, y: number) => void;\n};\n\nconst SCROLLBAR_WIDTH = 10;\nconst REACTION_BUBBLE_EXTRA_WIDTH = 32;\nconst ANIMATION_DURATION = 200;\n\nconst MessageContextMenu: FC = ({\n availableReactions,\n isOpen,\n message,\n isPrivate,\n enabledReactions,\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 canShowReactionsCount,\n canRemoveReaction,\n canShowReactionList,\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 onShowReactors,\n onSendReaction,\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 scrollableRef = useRef(null);\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n const noReactions = !isPrivate && !enabledReactions?.length;\n const withReactions = canShowReactionList && !noReactions;\n\n const [isReady, markIsReady, unmarkIsReady] = useFlag();\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 handleRemoveReaction = useCallback(() => {\n onSendReaction(undefined, 0, 0);\n }, [onSendReaction]);\n\n useEffect(() => {\n if (!isOpen) {\n unmarkIsReady();\n return;\n }\n\n setTimeout(() => {\n markIsReady();\n }, ANIMATION_DURATION);\n }, [isOpen, markIsReady, unmarkIsReady]);\n\n const extraHeightAudioPlayer = (IS_SINGLE_COLUMN_LAYOUT\n && (document.querySelector('.AudioPlayer-content'))?.offsetHeight) || 0;\n const pinnedElement = document.querySelector('.HeaderPinnedMessage-wrapper');\n const extraHeightPinned = (((IS_SINGLE_COLUMN_LAYOUT && !extraHeightAudioPlayer)\n || (!IS_SINGLE_COLUMN_LAYOUT && pinnedElement?.classList.contains('full-width')))\n && pinnedElement?.offsetHeight) || 0;\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')!).offsetHeight,\n withReactions ? REACTION_BUBBLE_EXTRA_WIDTH : undefined,\n extraHeightPinned + extraHeightAudioPlayer,\n );\n\n useEffect(() => {\n disableScrolling(withScroll ? scrollableRef.current : undefined, '.ReactionSelector');\n\n return enableScrolling;\n }, [withScroll]);\n\n const lang = useLang();\n\n return (\n \n {canShowReactionList && (\n \n )}\n\n \n {canRemoveReaction && Remove Reaction}\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 || canShowReactionsCount) && (\n \n {canShowReactionsCount && message.reactors?.count ? (\n canShowSeenBy && message.seenByUserIds?.length\n ? lang('Chat.OutgoingContextMixedReactionCount', [message.reactors.count, message.seenByUserIds.length])\n : lang('Chat.ContextReactionCount', message.reactors.count, 'i'))\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};\n\nexport default memo(MessageContextMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { MessageListType } from '../../../global/types';\nimport { ApiAvailableReaction, ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport {\n selectActiveDownloadIds,\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectIsMessageProtected,\n} from '../../../modules/selectors';\nimport {\n isActionMessage, isChatChannel,\n isChatGroup, isOwnMessage, areReactionsEmpty, isUserId,\n} from '../../../modules/helpers';\nimport { SEEN_BY_MEMBERS_EXPIRE, SEEN_BY_MEMBERS_CHAT_MAX, SERVICE_NOTIFICATIONS_USER_ID } from '../../../config';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\nimport { REM } from '../../common/helpers/mediaDimensions';\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\nconst START_SIZE = 2 * REM;\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 availableReactions?: ApiAvailableReaction[];\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canShowReactionsCount?: boolean;\n canShowReactionList?: boolean;\n canRemoveReaction?: 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 isPrivate?: boolean;\n hasFullInfo?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n canDownload?: boolean;\n activeDownloads: number[];\n canShowSeenBy?: boolean;\n enabledReactions?: string[];\n};\n\nconst ContextMenuContainer: FC = ({\n availableReactions,\n isOpen,\n messageListType,\n chatUsername,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n hasFullInfo,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canShowReactionsCount,\n canShowReactionList,\n canRemoveReaction,\n canEdit,\n enabledReactions,\n isPrivate,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n activeDownloads,\n canShowSeenBy,\n}) => {\n const {\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 sendReaction,\n openReactorListModal,\n loadFullChat,\n loadReactors,\n } = getDispatch();\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 useEffect(() => {\n if (canShowReactionsCount && isOpen) {\n loadReactors({ chatId: message.chatId, messageId: message.id });\n }\n }, [canShowReactionsCount, isOpen, loadReactors, message.chatId, message.id]);\n\n useEffect(() => {\n if (!hasFullInfo && !isPrivate && isOpen) {\n loadFullChat({ chatId: message.chatId });\n }\n }, [hasFullInfo, isOpen, isPrivate, loadFullChat, message.chatId]);\n\n const seenByRecentUsers = useMemo(() => {\n if (message.reactions?.recentReactions?.length) {\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n return message.reactions?.recentReactions?.slice(0, 3).map(({ userId }) => usersById[userId]).filter(Boolean);\n }\n\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.reactions?.recentReactions, 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 handleOpenReactorListModal = useCallback(() => {\n closeMenu();\n openReactorListModal({ chatId: message.chatId, messageId: message.id });\n }, [closeMenu, openReactorListModal, message.chatId, message.id]);\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 handleSendReaction = useCallback((reaction: string | undefined, x: number, y: number) => {\n sendReaction({\n chatId: message.chatId, messageId: message.id, reaction, x, y, startSize: START_SIZE,\n });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendReaction]);\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 isChannel = chat && isChatChannel(chat);\n const canShowSeenBy = Boolean(chat\n && isChatGroup(chat)\n && isOwnMessage(message)\n && !isScheduled\n && chat.membersCount\n && chat.membersCount < SEEN_BY_MEMBERS_CHAT_MAX\n && message.date > Date.now() / 1000 - SEEN_BY_MEMBERS_EXPIRE);\n const isPrivate = chat && isUserId(chat.id);\n const isAction = isActionMessage(message);\n const canShowReactionsCount = !isChannel && !isScheduled && !isAction && !isPrivate && message.reactions\n && !areReactionsEmpty(message.reactions) && message.reactions.canSeeList;\n const canRemoveReaction = isPrivate && message.reactions?.results?.some((l) => l.isChosen);\n const isProtected = selectIsMessageProtected(global, message);\n\n return {\n availableReactions: global.availableReactions,\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: !isProtected && !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy: !isProtected && canCopy,\n canCopyLink: !isProtected && !isScheduled && canCopyLink,\n canSelect,\n canDownload: !isProtected && canDownload,\n activeDownloads,\n canShowSeenBy,\n enabledReactions: chat?.fullInfo?.enabledReactions,\n isPrivate,\n hasFullInfo: Boolean(chat?.fullInfo),\n canShowReactionsCount,\n canShowReactionList: !isAction && !isScheduled && chat?.id !== SERVICE_NOTIFICATIONS_USER_ID,\n canRemoveReaction,\n };\n },\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\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\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSetShortName,\n stickerSet,\n canSendStickers,\n onClose,\n}) => {\n const {\n loadStickers,\n toggleStickerSet,\n sendMessage,\n } = getDispatch();\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)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 {\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\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}) => {\n const {\n updateChatMutedState,\n enterMessageSelectMode,\n sendBotCommand,\n restartBot,\n joinGroupCall,\n createGroupCall,\n openLinkedChat,\n addContact,\n openCallFallbackConfirm,\n } = getDispatch();\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)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\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\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen,\n}) => {\n const {\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 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';\nimport useSendMessageAction from '../../../hooks/useSendMessageAction';\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 chatId: string;\n threadId?: number;\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\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 chatId,\n threadId,\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n}) => {\n const {\n loadRecentStickers,\n addRecentSticker,\n unfaveSticker,\n } = getDispatch();\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 const sendMessageAction = useSendMessageAction(chatId, threadId);\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 loadRecentStickers();\n sendMessageAction({ type: 'chooseSticker' });\n }\n }, [loadAndPlay, loadRecentStickers, sendMessageAction]);\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 handleMouseMove = useCallback(() => {\n sendMessageAction({ type: 'chooseSticker' });\n }, [sendMessageAction]);\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 { 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\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n}) => {\n const { loadSavedGifs } = getDispatch();\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)(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 chatId: string;\n threadId?: number;\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 chatId,\n threadId,\n isOpen,\n allowedAttachmentOptions,\n isLeftColumnShown,\n onLoad,\n onClose,\n onEmojiSelect,\n onStickerSelect,\n onGifSelect,\n onRemoveSymbol,\n onSearchOpen,\n 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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiBotCommand, ApiUser } from '../../../api/types';\n\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\nconst BotCommandTooltip: FC = ({\n usersById,\n isOpen,\n withUsername,\n botCommands,\n onClick,\n onClose,\n}) => {\n const { sendBotCommand } = getDispatch();\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)(BotCommandTooltip));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiBotCommand } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport BotCommand from './BotCommand';\n\nimport './BotCommandMenu.scss';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nexport type OwnProps = {\n isOpen: boolean;\n botCommands: ApiBotCommand[];\n onClose: NoneToVoidFunction;\n};\n\nconst BotCommandMenu: FC = ({\n isOpen, botCommands, onClose,\n}) => {\n const { sendBotCommand } = getDispatch();\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(BotCommandMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/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 { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useSendMessageAction from '../../../hooks/useSendMessageAction';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './StickerTooltip.scss';\n\nexport type OwnProps = {\n chatId: string;\n threadId?: number;\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerTooltip: FC = ({\n chatId,\n threadId,\n isOpen,\n onStickerSelect,\n stickers,\n}) => {\n const { clearStickersForEmoji } = getDispatch();\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 const sendMessageAction = useSendMessageAction(chatId, threadId);\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 handleMouseMove = () => {\n sendMessageAction({ type: 'chooseSticker' });\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)(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';\n\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 { 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';\nimport { getDispatch } from '../../../lib/teact/teactn';\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\nconst InlineBotTooltip: FC = ({\n isOpen,\n botId,\n isGallery,\n inlineBotResults,\n switchPm,\n loadMore,\n onClose,\n onSelectResult,\n}) => {\n const {\n openChat,\n startBot,\n } = getDispatch();\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?.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 'file':\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 {renderedInlineBotResults?.length && renderContent()}\n \n );\n};\n\nexport default memo(InlineBotTooltip);\n","import React, {\n FC, useCallback, useEffect, useRef, memo,\n} from '../../../lib/teact/teact';\n\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport renderText from '../../common/helpers/renderText';\nimport { getUserFullName, isUserId } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\nimport buildClassName from '../../../util/buildClassName';\nimport { getDispatch, getGlobal } from '../../../lib/teact/teactn';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\nimport Menu from '../../ui/Menu';\n\nimport './SendAsMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n chatId?: string;\n selectedSendAsId?: string;\n sendAsIds?: string[];\n};\n\nconst SendAsMenu: FC = ({\n isOpen,\n onClose,\n chatId,\n selectedSendAsId,\n sendAsIds,\n}) => {\n const { saveDefaultSendAs } = getDispatch();\n\n // No need for expensive global updates on users and chats, so we avoid them\n const usersById = getGlobal().users.byId;\n const chatsById = getGlobal().chats.byId;\n\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const [handleMouseEnter, handleMouseLeave, markMouseInside] = useMouseInside(isOpen, onClose, undefined);\n\n useEffect(() => {\n if (isOpen) {\n markMouseInside();\n }\n }, [isOpen, markMouseInside]);\n\n const handleUserSelect = useCallback((id: string) => {\n onClose();\n saveDefaultSendAs({ chatId, sendAsId: id });\n }, [chatId, onClose, saveDefaultSendAs]);\n\n const selectedSendAsIndex = useKeyboardNavigation({\n isActive: isOpen,\n items: sendAsIds,\n onSelect: handleUserSelect,\n shouldSelectOnTab: true,\n shouldSaveSelectionOnUpdateItems: true,\n onClose,\n });\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedSendAsIndex, containerRef);\n }, [selectedSendAsIndex]);\n\n useEffect(() => {\n if (sendAsIds && !sendAsIds.length) {\n onClose();\n }\n }, [sendAsIds, onClose]);\n\n return (\n \n
{lang('SendMessageAsTitle')}
\n {usersById && chatsById && sendAsIds?.map((id, index) => {\n const user = isUserId(id) ? usersById[id] : undefined;\n const chat = !user ? chatsById[id] : undefined;\n const fullName = user ? getUserFullName(user) : chat?.title;\n\n return (\n handleUserSelect(id)}\n focus={selectedSendAsIndex === index}\n >\n \n
\n
\n

{fullName && renderText(fullName)}

\n
\n {user\n ? lang('VoipGroupPersonalAccount')\n : lang('Subscribers', chat?.membersCount, 'i')}\n \n
\n \n );\n })}\n \n );\n};\n\nexport default memo(SendAsMenu);\n","import React, {\n FC, useMemo, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/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 } 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\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}) => {\n const {\n searchTextMessagesLocal,\n focusMessage,\n } = getDispatch();\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)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\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\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay,\n isSomeModalOpen, onModalToggle,\n}) => {\n const { loadStickers, toggleStickerSet } = getDispatch();\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)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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\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}) => {\n const { loadFeaturedStickers } = getDispatch();\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)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 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\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}) => {\n const {\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n } = getDispatch();\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)(GifSearch));\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\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\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}) => {\n const {\n loadPollOptionResults,\n openChat,\n closePollResults,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\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 progress?: ManagementProgress;\n isMuted?: boolean;\n};\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n progress,\n isMuted,\n onClose,\n isActive,\n}) => {\n const {\n updateContact,\n deleteContact,\n closeManagement,\n } = getDispatch();\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 deleteContact({ userId });\n closeDeleteDialog();\n closeManagement();\n }, [closeDeleteDialog, closeManagement, deleteContact, 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, progress, isMuted,\n };\n },\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport {\n ApiChat, ApiChatBannedRights, ApiExportedInvite, ApiMediaFormat,\n} from '../../../api/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 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 canInvite?: boolean;\n exportedInvites?: ApiExportedInvite[];\n lastSyncTime?: number;\n availableReactionsCount?: number;\n};\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 canInvite,\n onScreenSelect,\n onClose,\n isActive,\n exportedInvites,\n lastSyncTime,\n availableReactionsCount,\n}) => {\n const {\n togglePreHistoryHidden,\n updateChat,\n deleteChat,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n loadExportedChatInvites,\n } = getDispatch();\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 (lastSyncTime && canInvite) {\n loadExportedChatInvites({ chatId });\n }\n }, [chatId, loadExportedChatInvites, lastSyncTime, canInvite]);\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 handleClickReactions = useCallback(() => {\n onScreenSelect(ManagementScreens.Reactions);\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 handleClickInvites = useCallback(() => {\n onScreenSelect(ManagementScreens.Invites);\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 enabledReactionsCount = chat.fullInfo?.enabledReactions?.length || 0;\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 \n {lang('Reactions')}\n \n {enabledReactionsCount}/{availableReactionsCount}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n {canInvite && (\n \n {lang('GroupInfo.InviteLinks')}\n \n {exportedInvites ? formatInteger(exportedInvites.length) : lang('Loading')}\n \n \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 const { invites } = global.management.byChatId[chatId] || {};\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 canInvite: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'inviteUsers'),\n exportedInvites: invites,\n lastSyncTime: global.lastSyncTime,\n availableReactionsCount: global.availableReactions?.filter((l) => !l.isInactive).length,\n };\n },\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\n\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 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\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 onClose,\n isActive,\n}) => {\n const { updateChatDefaultBannedRights } = getDispatch();\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)(ManageGroupPermissions));\n","import React, {\n FC, useMemo, useState, memo, useRef, useCallback,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { filterUsersByName } from '../../../modules/helpers';\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\nconst RemoveGroupUserModal: FC = ({\n chat,\n currentUserId,\n isOpen,\n onClose,\n}) => {\n const {\n loadMoreMembers,\n deleteChatMember,\n } = getDispatch();\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)(RemoveGroupUserModal));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getHasAdminRight, getUserFullName } from '../../../modules/helpers';\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\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n canDeleteMembers,\n onClose,\n isActive,\n}) => {\n const { updateChatMemberBannedRights } = getDispatch();\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)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiExportedInvite, ApiMediaFormat } from '../../../api/types';\n\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport { formatInteger } from '../../../util/textFormat';\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 isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n canInvite?: boolean;\n exportedInvites?: ApiExportedInvite[];\n lastSyncTime?: number;\n availableReactionsCount?: number;\n};\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 canInvite,\n exportedInvites,\n lastSyncTime,\n availableReactionsCount,\n onScreenSelect,\n onClose,\n isActive,\n}) => {\n const {\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n loadExportedChatInvites,\n } = getDispatch();\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 (lastSyncTime) {\n loadExportedChatInvites({ chatId });\n }\n }, [chatId, loadExportedChatInvites, lastSyncTime]);\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 handleClickReactions = useCallback(() => {\n onScreenSelect(ManagementScreens.Reactions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleClickInvites = useCallback(() => {\n onScreenSelect(ManagementScreens.Invites);\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 const enabledReactionsCount = chat.fullInfo?.enabledReactions?.length || 0;\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 {canInvite && (\n \n {lang('GroupInfo.InviteLinks')}\n \n {exportedInvites ? formatInteger(exportedInvites.length) : lang('Loading')}\n \n \n )}\n \n {lang('Reactions')}\n \n {enabledReactionsCount}/{availableReactionsCount}\n \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 const { invites } = global.management.byChatId[chatId] || {};\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canInvite: getHasAdminRight(chat, 'inviteUsers'),\n lastSyncTime: global.lastSyncTime,\n exportedInvites: invites,\n availableReactionsCount: global.availableReactions?.filter((l) => !l.isInactive).length,\n };\n },\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\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 isProtected?: boolean;\n};\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n onClose,\n isActive,\n isChannel,\n progress,\n isUsernameAvailable,\n isProtected,\n}) => {\n const {\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n toggleIsProtected,\n } = getDispatch();\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 handleForwardingOptionChange = useCallback((value: string) => {\n toggleIsProtected({\n chatId: chat.id,\n isProtected: value === 'protected',\n });\n }, [chat.id, toggleIsProtected]);\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 forwardingOptions = [{\n value: 'allowed',\n label: lang('ChannelVisibility.Forwarding.Enabled'),\n }, {\n value: 'protected',\n label: lang('ChannelVisibility.Forwarding.Disabled'),\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 {lang(isChannel ? 'ChannelVisibility.Forwarding.ChannelTitle' : 'ChannelVisibility.Forwarding.GroupTitle')}\n

\n \n

\n {isChannel\n ? lang('ChannelVisibility.Forwarding.ChannelInfo')\n : lang('ChannelVisibility.Forwarding.GroupInfo')}\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 isProtected: chat?.isProtected,\n };\n },\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\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\nconst ManageDiscussion: FC = ({\n chat,\n onClose,\n isActive,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n}) => {\n const {\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n } = getDispatch();\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\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 {\n onDiscussionClick(id);\n }}\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)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\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\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n isFormFullyDisabled,\n onClose,\n isActive,\n}) => {\n const { updateChatMemberBannedRights } = getDispatch();\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)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember } 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';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\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};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\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 handleAddAdminClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupAddAdmins);\n }, [onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\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]);\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
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n };\n },\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\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 isNewAdmin?: 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 defaultRights?: ApiChatAdminRights;\n};\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n isNewAdmin,\n selectedChatMemberId,\n defaultRights,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n onClose,\n isActive,\n}) => {\n const { updateChatAdmin } = getDispatch();\n\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(isNewAdmin);\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 const selectedAdminMember = chat.fullInfo?.adminMembers?.find(({ userId }) => userId === selectedChatMemberId);\n\n if (isNewAdmin) {\n // If selectedAdminMember is fullfilled, it means that we are editing an existing admin (after a user\n // has been promoted as admin)\n return selectedAdminMember\n ? undefined\n : chat.fullInfo?.members?.find(({ userId }) => userId === selectedChatMemberId);\n }\n\n return selectedAdminMember;\n }, [chat.fullInfo, isNewAdmin, 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((isNewAdmin ? defaultRights : selectedChatMember?.adminRights) || {});\n setCustomTitle(((isNewAdmin ? 'admin' : selectedChatMember?.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(Boolean(isNewAdmin));\n setIsLoading(false);\n }, [defaultRights, isNewAdmin, 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 }, [selectedChatMemberId, updateChatAdmin, chat.id, permissions, customTitle]);\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 (isNewAdmin || !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 }, [isNewAdmin, 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 && !isNewAdmin && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n {!isNewAdmin && (\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 defaultRights: chat.adminRights,\n };\n },\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, 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 NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: string;\n isActive: boolean;\n noAdmins?: boolean;\n onClose: NoneToVoidFunction;\n onScreenSelect?: (screen: ManagementScreens) => void;\n onChatMemberSelect?: (memberId: string, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n userStatusesById: Record;\n members?: ApiChatMember[];\n adminMembers?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupMembers: FC = ({\n noAdmins,\n members,\n adminMembers,\n userStatusesById,\n isChannel,\n isActive,\n serverTimeOffset,\n onClose,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const { openUserInfo } = getDispatch();\n\n const memberIds = useMemo(() => {\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n if (!members || !usersById) {\n return undefined;\n }\n const adminIds = noAdmins ? adminMembers?.map(({ userId }) => userId) || [] : [];\n\n const userIds = sortUserIds(\n members.map(({ userId }) => userId),\n usersById,\n userStatusesById,\n undefined,\n serverTimeOffset,\n );\n\n return noAdmins ? userIds.filter((userId) => !adminIds.includes(userId)) : userIds;\n }, [members, noAdmins, adminMembers, userStatusesById, serverTimeOffset]);\n\n const handleMemberClick = useCallback((id: string) => {\n if (noAdmins) {\n onChatMemberSelect!(id, false);\n onScreenSelect!(ManagementScreens.ChatNewAdminRights);\n } else {\n openUserInfo({ id });\n }\n }, [noAdmins, onChatMemberSelect, onScreenSelect, 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 { statusesById: userStatusesById } = global.users;\n const members = chat?.fullInfo?.members;\n const adminMembers = chat?.fullInfo?.adminMembers;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n adminMembers,\n userStatusesById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\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, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiExportedInvite } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport useLang from '../../../hooks/useLang';\nimport { formatCountdown, MILLISECONDS_IN_DAY } from '../../../util/dateFormat';\nimport useInterval from '../../../hooks/useInterval';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\nimport { selectChat } from '../../../modules/selectors';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { getServerTime } from '../../../util/serverTime';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport Button from '../../ui/Button';\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n onScreenSelect: (screen: ManagementScreens) => void;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n exportedInvites?: ApiExportedInvite[];\n serverTimeOffset: number;\n};\n\nconst BULLET = '\\u2022';\n\nfunction inviteComparator(i1: ApiExportedInvite, i2: ApiExportedInvite) {\n const { isPermanent: i1IsPermanent, usage: i1Usage = 0, date: i1Date } = i1;\n const { isPermanent: i2IsPermanent, usage: i2Usage = 0, date: i2Date } = i2;\n if (i1IsPermanent || i2IsPermanent) return Number(i1IsPermanent) - Number(i2IsPermanent);\n if (i1Usage || i2Usage) return i2Usage - i1Usage;\n return i2Date - i1Date;\n}\n\nconst ManageInvites: FC = ({\n chatId,\n chat,\n exportedInvites,\n isActive,\n serverTimeOffset,\n onClose,\n onScreenSelect,\n}) => {\n const { setEditingExportedInvite, showNotification, editExportedChatInvite } = getDispatch();\n useHistoryBack(isActive, onClose);\n const lang = useLang();\n\n const hasDetailedCountdown = useMemo(() => {\n if (!exportedInvites) return undefined;\n return exportedInvites\n .some(({ expireDate }) => (\n expireDate && (expireDate - getServerTime(serverTimeOffset) < MILLISECONDS_IN_DAY / 1000)\n ));\n }, [exportedInvites, serverTimeOffset]);\n const forceUpdate = useForceUpdate();\n useInterval(() => {\n forceUpdate();\n }, hasDetailedCountdown ? 1000 : undefined);\n\n const primaryInvite = exportedInvites?.find(({ isPermanent }) => isPermanent);\n const primaryInviteLink = chat?.username ? `t.me/${chat.username}` : primaryInvite?.link;\n const temporalInvites = useMemo(() => {\n const invites = chat?.username ? exportedInvites : exportedInvites?.filter(({ isPermanent }) => !isPermanent);\n return invites?.filter(({ isRevoked }) => !isRevoked)\n .sort(inviteComparator);\n }, [chat?.username, exportedInvites]);\n\n const editInvite = (invite: ApiExportedInvite) => {\n setEditingExportedInvite({ chatId, invite });\n onScreenSelect(ManagementScreens.EditInvite);\n };\n\n const revokeInvite = useCallback((invite: ApiExportedInvite) => {\n const {\n link, title, isRequestNeeded, expireDate, usageLimit,\n } = invite;\n editExportedChatInvite({\n chatId,\n link,\n title,\n isRequestNeeded,\n expireDate,\n usageLimit,\n isRevoked: true,\n });\n }, [chatId, editExportedChatInvite]);\n\n const handleCreateNewClick = useCallback(() => {\n onScreenSelect(ManagementScreens.EditInvite);\n }, [onScreenSelect]);\n\n const handlePrimaryRevoke = useCallback(() => {\n if (primaryInvite) {\n revokeInvite(primaryInvite);\n }\n }, [primaryInvite, revokeInvite]);\n\n const copyLink = useCallback((link: string) => {\n copyTextToClipboard(link);\n showNotification({\n message: lang('LinkCopied'),\n });\n }, [lang, showNotification]);\n\n const handleCopyPrimaryClicked = useCallback(() => {\n copyLink(primaryInviteLink!);\n }, [copyLink, primaryInviteLink]);\n\n const prepareUsageText = (invite: ApiExportedInvite) => {\n const {\n usage = 0, usageLimit, expireDate, isPermanent, requested,\n } = invite;\n let text = '';\n if (usageLimit && usage < usageLimit) {\n text = lang('CanJoin', usageLimit - usage);\n } else if (usage) {\n text = lang('PeopleJoined', usage);\n } else {\n text = lang('NoOneJoined');\n }\n\n if (requested) {\n text += ` ${BULLET} ${lang('JoinRequests', requested)}`;\n }\n\n if (usageLimit !== undefined && usage === usageLimit) {\n text += ` ${BULLET} ${lang('LinkLimitReached')}`;\n } else if (expireDate) {\n const diff = (expireDate - getServerTime(serverTimeOffset)) * 1000;\n text += ` ${BULLET} `;\n if (diff > 0) {\n text += lang('InviteLink.ExpiresIn', formatCountdown(lang, diff));\n } else {\n text += lang('InviteLink.Expired');\n }\n } else if (isPermanent) {\n text += ` ${BULLET} ${lang('Permanent')}`;\n }\n\n return text;\n };\n\n const prepareContextActions = (invite: ApiExportedInvite) => {\n const actions = [];\n actions.push({\n title: lang('Copy'),\n icon: 'copy',\n handler: () => copyLink(invite.link),\n });\n if (!invite.isPermanent) {\n actions.push({\n title: lang('Edit'),\n icon: lang('edit'),\n handler: () => editInvite(invite),\n });\n }\n actions.push({\n title: lang('RevokeButton'),\n icon: lang('delete'),\n handler: () => revokeInvite(invite),\n destructive: true,\n });\n return actions;\n };\n\n const PrimaryLinkMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n return (\n
\n
\n {primaryInviteLink && (\n
\n

\n {chat?.username ? lang('PublicLink') : lang('lng_create_permanent_link_title')}\n

\n
\n \n \n {lang('Copy')}\n {!chat?.username && (\n {lang('RevokeButton')}\n )}\n \n
\n \n
\n )}\n
\n \n {!temporalInvites && }\n {temporalInvites?.map((invite) => (\n copyLink(invite.link)}\n contextActions={prepareContextActions(invite)}\n key={invite.link}\n >\n {invite.title || invite.link}\n \n {prepareUsageText(invite)}\n \n \n ))}\n

{lang('ManageLinksInfoHelp')}

\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { invites } = global.management.byChatId[chatId];\n const chat = selectChat(global, chatId);\n\n return {\n exportedInvites: invites,\n chat,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n)(ManageInvites));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiExportedInvite } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport useLang from '../../../hooks/useLang';\nimport { formatFullDate, formatTime } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport { getServerTime } from '../../../util/serverTime';\n\nimport Checkbox from '../../ui/Checkbox';\nimport InputText from '../../ui/InputText';\nimport RadioGroup from '../../ui/RadioGroup';\nimport CalendarModalAsync from '../../common/CalendarModal.async';\nimport Button from '../../ui/Button';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nconst DEFAULT_USAGE_LIMITS = [1, 10, 100];\nconst DEFAULT_EXPIRE_DATE = {\n hour: 3600000,\n day: 86400000,\n week: 604800000,\n};\nconst DEFAULT_CUSTOM_EXPIRE_DATE = DEFAULT_EXPIRE_DATE.hour;\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n onScreenSelect: (screen: ManagementScreens) => void;\n isActive: boolean;\n};\n\ntype StateProps = {\n editingInvite?: ApiExportedInvite;\n serverTimeOffset: number;\n};\n\nconst ManageInvite: FC = ({\n chatId,\n editingInvite,\n isActive,\n serverTimeOffset,\n onClose,\n onScreenSelect,\n}) => {\n const { editExportedChatInvite, exportChatInvite } = getDispatch();\n\n const lang = useLang();\n const [isCalendarOpened, openCalendar, closeCalendar] = useFlag();\n const [isRequestNeeded, setIsRequestNeeded] = useState(false);\n const [title, setTitle] = useState('');\n const [customExpireDate, setCustomExpireDate] = useState(Date.now() + DEFAULT_CUSTOM_EXPIRE_DATE);\n const [selectedExpireOption, setSelectedExpireOption] = useState('unlimited');\n const [customUsageLimit, setCustomUsageLimit] = useState(10);\n const [selectedUsageOption, setSelectedUsageOption] = useState('0');\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (!editingInvite) {\n setTitle('');\n setSelectedExpireOption('unlimited');\n setSelectedUsageOption('0');\n setCustomExpireDate(getServerTime(serverTimeOffset) * 1000 + DEFAULT_CUSTOM_EXPIRE_DATE);\n setCustomUsageLimit(10);\n setIsRequestNeeded(false);\n } else {\n const {\n title: editingTitle, usageLimit, expireDate, isRequestNeeded: editingIsRequestNeeded,\n } = editingInvite;\n if (editingTitle) setTitle(editingTitle);\n if (usageLimit) {\n setSelectedUsageOption(DEFAULT_USAGE_LIMITS.includes(usageLimit) ? usageLimit.toString() : 'custom');\n setCustomUsageLimit(usageLimit);\n }\n if (expireDate) {\n setSelectedExpireOption('custom');\n setCustomExpireDate(expireDate * 1000);\n }\n if (editingIsRequestNeeded) {\n setIsRequestNeeded(true);\n }\n }\n }, [editingInvite, serverTimeOffset]);\n\n const handleIsRequestChange = useCallback((e: ChangeEvent) => {\n setIsRequestNeeded(e.target.checked);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n }, []);\n\n const handleCustomUsageLimitChange = useCallback((e: ChangeEvent) => {\n setCustomUsageLimit(Number.parseInt(e.target.value, 10));\n }, []);\n\n const handleExpireDateChange = useCallback((date: Date) => {\n setCustomExpireDate(date.getTime());\n closeCalendar();\n }, [closeCalendar]);\n\n const handleSaveClick = useCallback(() => {\n const usageLimit = selectedUsageOption === 'custom' ? customUsageLimit : selectedUsageOption;\n let expireDate;\n switch (selectedExpireOption) {\n case 'custom':\n expireDate = getServerTime(serverTimeOffset) + (customExpireDate - Date.now()) / 1000;\n break;\n case 'hour':\n case 'day':\n case 'week':\n expireDate = getServerTime(serverTimeOffset) + DEFAULT_EXPIRE_DATE[selectedExpireOption] / 1000;\n break;\n case 'unlimited':\n default:\n expireDate = undefined;\n }\n\n if (editingInvite) {\n editExportedChatInvite({\n link: editingInvite.link,\n chatId,\n title,\n isRequestNeeded,\n expireDate,\n usageLimit,\n });\n } else {\n exportChatInvite({\n chatId,\n title,\n isRequestNeeded,\n expireDate,\n usageLimit,\n });\n }\n onScreenSelect(ManagementScreens.Invites);\n }, [\n chatId, customExpireDate, customUsageLimit, editExportedChatInvite, editingInvite,\n exportChatInvite, isRequestNeeded, selectedExpireOption, selectedUsageOption, title, onScreenSelect,\n serverTimeOffset,\n ]);\n\n return (\n
\n
\n
\n \n
\n
\n \n

{lang('LinkNameHelp')}

\n
\n
\n
{lang('LimitByPeriod')}
\n \n {selectedExpireOption === 'custom' && (\n \n )}\n

{lang('TimeLimitHelp')}

\n
\n {!isRequestNeeded && (\n
\n
{lang('LimitNumberOfUses')}
\n ({ value: n.toString(), label: n })),\n {\n value: '0',\n label: lang('NoLimit'),\n },\n {\n value: 'custom',\n label: lang('lng_group_invite_usage_custom'),\n },\n ]}\n onChange={setSelectedUsageOption}\n selected={selectedUsageOption}\n />\n {selectedUsageOption === 'custom' && (\n \n )}\n

{lang('UsesLimitHelp')}

\n
\n )}\n \n \n \n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { editingInvite } = global.management.byChatId[chatId];\n\n return {\n editingInvite,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n)(ManageInvite));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiAvailableReaction, ApiChat } from '../../../api/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n availableReactions?: ApiAvailableReaction[];\n enabledReactions?: string[];\n};\n\nconst ManageReactions: FC = ({\n availableReactions,\n enabledReactions,\n chat,\n isActive,\n onClose,\n}) => {\n const { setChatEnabledReactions } = getDispatch();\n\n const lang = useLang();\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [localEnabledReactions, setLocalEnabledReactions] = useState(enabledReactions);\n\n useHistoryBack(isActive, onClose);\n\n const handleSaveReactions = useCallback(() => {\n if (!chat) return;\n setIsLoading(true);\n\n setChatEnabledReactions({\n chatId: chat.id,\n enabledReactions: localEnabledReactions,\n });\n }, [chat, localEnabledReactions, setChatEnabledReactions]);\n\n useEffect(() => {\n setIsLoading(false);\n setIsTouched(false);\n setLocalEnabledReactions(enabledReactions || []);\n }, [enabledReactions]);\n\n const handleReactionChange = useCallback((e: React.ChangeEvent) => {\n if (!chat || !availableReactions) return;\n\n const { name, checked } = e.currentTarget;\n const newEnabledReactions = name === 'all' ? (checked ? availableReactions.map((l) => l.reaction) : [])\n : (!checked\n ? localEnabledReactions.filter((l) => l !== name)\n : [...localEnabledReactions, name]);\n\n setLocalEnabledReactions(newEnabledReactions);\n setIsTouched(true);\n }, [availableReactions, chat, localEnabledReactions]);\n\n return (\n
\n
\n
\n
\n 0}\n label={lang('EnableReactions')}\n onChange={handleReactionChange}\n />\n
\n {availableReactions?.filter((l) => !l.isInactive).map(({ reaction, title }) => (\n
\n \n \n {title}\n
\n )}\n onChange={handleReactionChange}\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 {\n enabledReactions: chat.fullInfo?.enabledReactions,\n availableReactions: global.availableReactions,\n chat,\n };\n },\n)(ManageReactions));\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';\nimport ManageInvites from './ManageInvites';\nimport ManageInvite from './ManageInvite';\nimport ManageReactions from './ManageReactions';\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.ChatNewAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n case ManagementScreens.Invites:\n return (\n \n );\n case ManagementScreens.EditInvite:\n return (\n \n );\n case ManagementScreens.GroupAddAdmins:\n return (\n \n );\n\n case ManagementScreens.Reactions:\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\n\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\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}) => {\n const {\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n } = getDispatch();\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 }\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)(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 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 size: { width: 1024, height: 1024 },\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","draggable","oncontextmenu","stopEvent","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","isProtected","selectIsMessageProtected","mediaData","isVideo","isZoomed","fileName","isAvatar","onCloseMediaViewer","onForward","onZoomToggle","downloadMessageMedia","cancelMessageMediaDownload","getDispatch","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","renderDownloadButton","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","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","onContextMenu","imageSize","canDrag","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","pick","dialogs","dismissDialog","acceptInviteConfirmation","sendMessage","isModalOpen","openModal","closeModal","useFlag","dialog","contactRequest","invite","hash","title","about","participantsCount","isChannel","isRequestNeeded","participantsText","joinText","requestToJoinText","renderInviteHeader","onCloseAnimationEnd","isText","renderInvite","contact","getReadableErrorText","notifications","dismissNotification","localId","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","ensureProtocol","handleDismiss","renderingUrl","ConfirmDialog","confirmLabel","confirmHandler","MAX_SAFE_DATE","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","fixedMinDate","getDayStart","fixedMaxDate","formatInputTime","String","padStart","formatDay","selectedAt","minAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","passedSelectedDate","prevIsOpen","isTimeInputFocused","markTimeInputAsFocused","unmarkTimeInputAsFocused","selectedDate","setSelectedDate","currentMonthAndYear","setCurrentMonthAndYear","getFullYear","getMonth","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","getDate","currentYear","currentMonth","getTime","newSelectedDate","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","hasProtectedMessage","selectHasProtectedMessage","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","reactorModal","reactions","reactors","loadReactors","closeReactorListModal","isClosing","startClosing","stopClosing","chosenTab","setChosenTab","canShowFilters","count","results","chatIdRef","handleCloseAnimationEnd","handleClose","handleLoadMore","allReactions","l","reaction","concat","nextOffset","LoadMoreDirection","formatIntegerCompact","find","ReactionStaticEmoji","fullName","getUserFullName","END_SIZE","emojiInteraction","animatedEffect","selectAnimatedEmojiEffect","effectAnimationId","localEffectAnimation","keys","ANIMATED_STICKERS_PATHS","isReversed","stopActiveEmojiInteraction","isHiding","startHiding","isPlaying","startPlaying","stop","mediaDataEffect","localEffectAnimationData","setLocalEffectAnimationData","getAnimationData","then","data","startSize","endScale","endX","endY","AnimatedSticker","animationData","play","noLoop","onLoad","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","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","isChatProtected","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","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","onScreenSelect","signOut","deleteChatFolder","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","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","handleCreateFolder","userFolders","folder","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","STICKER_SIZE_FOLDER_SETTINGS","pill","fluid","narrow","multiline","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","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","defaultReaction","appConfig","messageTextSize","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","timeFormat","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","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","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","availableReactions","selectedReaction","setDefaultReaction","isInactive","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","setAbout","chatTitleEmptyError","channelTitleEmptyError","chatTooManyUsersError","ChatCreationProgress","handleTitleChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","isStepActive","ChatList","folderType","folderOrderedIds","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","getTouchY","changedTouches","clientY","scrollHeight","preventDefaultForScrollKeys","HTMLElement","tagName","getAttribute","isTextBox","disableScrolling","_excludedClosestSelector","passive","onkeydown","enableScrolling","AvailableReaction","onSendReaction","isReady","isActivated","activate","deactivate","selectAnimation","markAnimationLoaded","shouldRenderPreview","shouldRenderAnimated","shouldPlay","onMouseEnter","enabledReactions","itemsScrollRef","isHorizontalScrollEnabled","enableHorizontalScroll","handleWheel","onWheelCapture","onTouchMove","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","canShowSeenBy","canShowReactionsCount","canRemoveReaction","canShowReactionList","seenByRecentUsers","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCopyLink","onDownload","onShowSeenBy","onShowReactors","menuRef","scrollableRef","copyOptions","afterEffect","getMessageText","canImageBeCopied","hasMessageLocalBlobUrl","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","Promise","resolve","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","noReactions","withReactions","markIsReady","unmarkIsReady","getTriggerElement","getRootElement","getMenuElement","handleRemoveReaction","extraHeightAudioPlayer","pinnedElement","extraHeightPinned","positionY","menuStyle","withScroll","useContextMenuPosition","Menu","START_SIZE","selectActiveDownloadIds","noOptions","isScheduled","isOwnMessage","SEEN_BY_MEMBERS_CHAT_MAX","SEEN_BY_MEMBERS_EXPIRE","isAction","isActionMessage","areReactionsEmpty","canSeeList","some","isChosen","hasFullInfo","SERVICE_NOTIFICATIONS_USER_ID","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadSeenBy","openSeenByModal","sendReaction","openReactorListModal","loadFullChat","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","setIsReportModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","recentReactions","msg","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleOpenSeenByModal","handleOpenReactorListModal","handleRescheduleMessage","scheduledAt","handleCopyLink","handleSendReaction","reportMessageIds","scheduledMaxDate","getDayStartAt","stickerSetShortName","currentMessageList","sendOptions","getAllowedAttachmentOptions","canSendStickers","selectStickerSet","stickerSetId","selectStickerSetByShortName","loadStickers","toggleStickerSet","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","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","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","loadRecentStickers","addRecentSticker","activeSetIndex","setActiveSetIndex","sendMessageAction","useSendMessageAction","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","handleMouseMove","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","isLeftColumnShown","allowedAttachmentOptions","setRecentEmojis","handleMouseEnter","handleMouseLeave","useMouseInside","fastRaf","recentEmojisRef","renderContent","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","onSelectResult","startBot","handleSendPm","startParam","prevInlineBotResults","renderedInlineBotResults","sensitiveArea","inlineBotResult","selectedSendAsId","sendAsIds","saveDefaultSendAs","markMouseInside","sendAsId","selectedSendAsIndex","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","deleteContact","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","GROUP_TITLE_EMPTY","hasLinkedChannel","isBasicGroup","invites","canChangeInfo","isCreator","getHasAdminRight","canBanUsers","canInvite","exportedInvites","availableReactionsCount","togglePreHistoryHidden","updateChat","deleteChat","leaveChannel","deleteChannel","loadExportedChatInvites","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","handleClickDiscussion","handleClickReactions","handleClickPermissions","handleClickAdministrators","handleClickInvites","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledReactionsCount","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","toggleIsProtected","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleForwardingOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","forwardingOptions","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","handleAddAdminClick","getMemberStatus","promotedByUser","defaultRights","adminRights","isNewAdmin","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","selectedAdminMember","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","manageCall","anonymous","maxLength","noAdmins","openUserInfo","adminIds","memberId","inviteComparator","i1","i2","isPermanent","i1IsPermanent","usage","i1Usage","i1Date","i2IsPermanent","i2Usage","i2Date","setEditingExportedInvite","showNotification","editExportedChatInvite","hasDetailedCountdown","expireDate","getServerTime","MILLISECONDS_IN_DAY","useInterval","primaryInvite","primaryInviteLink","link","temporalInvites","isRevoked","revokeInvite","usageLimit","handleCreateNewClick","handlePrimaryRevoke","copyLink","handleCopyPrimaryClicked","prepareContextActions","actions","editInvite","PrimaryLinkMenuButton","secondaryIcon","requested","diff","formatCountdown","prepareUsageText","DEFAULT_USAGE_LIMITS","DEFAULT_EXPIRE_DATE","hour","week","DEFAULT_CUSTOM_EXPIRE_DATE","editingInvite","exportChatInvite","isCalendarOpened","setIsRequestNeeded","customExpireDate","setCustomExpireDate","selectedExpireOption","setSelectedExpireOption","customUsageLimit","setCustomUsageLimit","selectedUsageOption","setSelectedUsageOption","editingTitle","editingIsRequestNeeded","handleIsRequestChange","handleCustomUsageLimitChange","handleExpireDateChange","handleSaveClick","formatFullDate","n","setChatEnabledReactions","localEnabledReactions","setLocalEnabledReactions","handleSaveReactions","handleReactionChange","newEnabledReactions","managementType","selectCurrentManagementType","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","formatsCache","defaultPhoneNumberFormat","str","flag","phoneFormat","format","formatValue","phoneNumberFormat","phoneNumberGroups","RegExp","repeat","getPhoneNumberFormat","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","reducer","getBillingCountry","countryCode","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","currency","handleShippingSelect","amount","formatCurrency","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","expiryInputRef","charAt","parts","formatCardExpiry","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","field","handleErrorModalClose","PaymentStep","shippingOption","getShippingPrices","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","buttonText","currentStep","renderModalContent","renderError","optionId","receipt","info","totalAmount","credentialsTitle","fullAddress","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","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/442.8bbf7947a0dd02949ce6.css b/dist/442.f81b4eb30975dff27660.css similarity index 97% rename from dist/442.8bbf7947a0dd02949ce6.css rename to dist/442.f81b4eb30975dff27660.css index 55cbf523d..d8b825551 100644 --- a/dist/442.8bbf7947a0dd02949ce6.css +++ b/dist/442.f81b4eb30975dff27660.css @@ -13,7 +13,7 @@ .CalendarModal .modal-dialog{max-width:26.25rem}.CalendarModal .modal-dialog .modal-content{padding:.375rem 1rem 1rem}.CalendarModal .timepicker{display:flex;align-items:center;justify-content:center;margin-bottom:1.5rem}.CalendarModal .timepicker .form-control{max-width:5rem;text-align:center}.CalendarModal .timepicker .form-control:first-child{margin-right:1rem}.CalendarModal .timepicker .form-control:last-child{margin-left:1rem}.CalendarModal .footer{display:flex;justify-content:flex-end;flex-direction:column}.CalendarModal .footer .Button{text-transform:none}.CalendarModal .footer .Button+.Button{margin-top:.5rem}.CalendarModal .month-selector{display:flex;align-items:center}.CalendarModal .month-selector h4{flex:1;margin:0 0 0 1.25rem;font-size:1.25rem}@media(max-width: 600px){.CalendarModal .month-selector h4{margin-left:.75rem}}.CalendarModal .month-selector h4~.Button{color:var(--color-primary)}.CalendarModal .month-selector .Button.hidden{opacity:.5;pointer-events:none}.CalendarModal .day-button{position:relative;border-radius:4rem;outline:none !important;font-weight:500;margin:.125rem .625rem}@media(max-width: 600px){.CalendarModal .day-button{margin:.25rem .375rem}}.CalendarModal .day-button.weekday{margin-bottom:0;height:1rem}.CalendarModal .day-button.clickable{cursor:pointer}.CalendarModal .day-button.clickable:hover{background-color:var(--color-interactive-element-hover)}.CalendarModal .day-button.clickable.selected{background-color:var(--color-primary);color:#fff}.CalendarModal .day-button.disabled{opacity:.25;pointer-events:none}.CalendarModal .day-button::before{content:"";display:block;padding-top:100%}.CalendarModal .day-button span{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:.875rem}.CalendarModal .calendar-wrapper{display:flex;align-items:center;justify-content:center;min-height:17rem;margin:1.5rem -0.5rem .5rem}.CalendarModal .calendar-grid{display:grid;grid-template-columns:repeat(7, 1fr);width:100%} .MessageSelectToolbar{position:absolute;bottom:.5rem;left:.5rem;right:.5rem;width:auto;z-index:20;justify-content:center;margin:0;opacity:1}@supports(padding-bottom: env(safe-area-inset-bottom)){.MessageSelectToolbar{bottom:calc(0.5rem + env(safe-area-inset-bottom))}}.mask-image-disabled .MessageSelectToolbar::before{left:auto !important;right:auto !important}.no-composer .MessageSelectToolbar{width:100%}@media(max-width: 600px){.no-composer .MessageSelectToolbar{width:calc(100% - 1rem)}}@media(min-width: 601px){.MessageSelectToolbar{left:1rem;right:1rem;bottom:1.25rem}.no-composer .MessageSelectToolbar{top:-4.75rem}}.MessageSelectToolbar-inner{transform:scaleX(1);transition:transform var(--select-transition),opacity var(--select-transition)}.MessageSelectToolbar .MessageSelectToolbar-inner{transform:scaleX(1) translateX(0)}.no-composer .middle-column-footer-button-container+.MessageSelectToolbar,.no-composer .messaging-disabled+.MessageSelectToolbar{top:auto}body.animation-level-0 .MessageSelectToolbar{transition:none !important}.MessageSelectToolbar:not(.shown){opacity:0;pointer-events:none}.MessageSelectToolbar:not(.shown) .shown-inner{transform:scaleX(var(--toolbar-hidden-scale, 1))}.MessageSelectToolbar:not(.shown).with-composer .MessageSelectToolbar-inner{transform:scaleX(var(--toolbar-hidden-scale, 1)) translateX(var(--toolbar-translate-x, 0))}.MessageSelectToolbar:not(.shown):not(.with-composer) .MessageSelectToolbar-inner{transform:scaleX(var(--toolbar-unpin-hidden-scale)) translateX(0)}.MessageSelectToolbar::before{z-index:-1;max-width:32rem;width:100%;left:auto;right:auto}.MessageSelectToolbar-inner{width:100%;max-width:32rem;display:flex;align-items:center;padding:.25rem;background:var(--color-background);border-radius:var(--border-radius-messages);box-shadow:0 1px 2px var(--color-default-shadow);font-weight:500}@media(max-width: 600px){.MessageSelectToolbar-inner{padding:0;max-width:none}}.MessageSelectToolbar-inner>.Button{width:3rem;height:3rem}@media(max-width: 600px){.MessageSelectToolbar-inner>.Button{width:2.875rem;height:2.875rem}}.MessageSelectToolbar-count{margin-left:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-grow:1}@media(max-width: 600px){.MessageSelectToolbar-count{margin-right:.5rem}}.MessageSelectToolbar-actions{margin-left:auto;display:flex}.MessageSelectToolbar-actions .item{width:100%;background:none;border:none !important;box-shadow:none !important;outline:none !important;display:flex;position:relative;overflow:hidden;line-height:1.5rem;white-space:nowrap;color:var(--color-text);--ripple-color: rgba(0, 0, 0, 0.08);cursor:pointer;unicode-bidi:plaintext;padding:.6875rem;border-radius:50%}.MessageSelectToolbar-actions .item i{font-size:1.5rem;color:var(--color-text-secondary)}.MessageSelectToolbar-actions .item.destructive{color:var(--color-error)}.MessageSelectToolbar-actions .item.destructive i{color:inherit}.MessageSelectToolbar-actions .item.disabled{opacity:.5;cursor:default;pointer-events:none}.MessageSelectToolbar-actions .item:not(.disabled):active{background-color:var(--color-item-active);transition:none !important}@media(hover: hover){.MessageSelectToolbar-actions .item:hover,.MessageSelectToolbar-actions .item:focus{background-color:var(--color-chat-hover);text-decoration:none}} .ReactorListModal{--color-reaction: var(--color-message-reaction);--hover-color-reaction: var(--color-message-reaction-hover);--accent-color: var(--color-primary)}.ReactorListModal .modal-content{overflow:hidden}.ReactorListModal .Reactions{margin-bottom:.5rem}.ReactorListModal .reaction-filter-emoji{margin-right:.25rem}.ReactorListModal .reactor-list{max-height:400px;overflow:auto;overflow-x:hidden}.ReactorListModal .reactors-list-item{margin:0}.ReactorListModal .reactors-list-item .ListItem-button{display:flex;align-items:center}.ReactorListModal .reactors-list-emoji{width:1.5rem;height:1.5rem;margin-inline-start:auto} -.EmojiInteractionAnimation{--start-x: 0;--start-y: 0;--scale: 0;--end-scale: 0;position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000}@keyframes hide-reaction-reversed{from{transform:translate(100%, -50%) scaleX(-1) scale(1)}to{left:var(--end-x, var(--start-x));top:var(--end-y, var(--start-y));transform:translate(50%, 0) scale(var(--end-scale, 0))}}@keyframes show-reaction-reversed{from{transform:translate(50%, 0) scaleX(-1) scale(var(--scale, 0))}to{transform:translate(100%, -50%) scaleX(-1) scale(1)}}@keyframes hide-reaction{from{transform:translate(-50%, -50%) scale(1)}to{left:var(--end-x, var(--start-x));top:var(--end-y, var(--start-y));transform:translate(0, 0) scale(var(--end-scale, 0))}}@keyframes show-reaction{from{transform:translate(0, 0) scale(var(--scale, 0))}to{transform:translate(-50%, -50%) scale(1)}}.EmojiInteractionAnimation .AnimatedSticker{position:absolute;top:var(--start-y);left:var(--start-x);transform:scale(var(--scale), 0);transform-origin:left top;transition:.25s cubic-bezier(0.29, 0.81, 0.27, 0.99) opacity}.EmojiInteractionAnimation.reversed .AnimatedSticker{transform:scale(var(--scale), 0) scaleX(-1)}.EmojiInteractionAnimation.playing .AnimatedSticker{animation:show-reaction forwards .25s cubic-bezier(0.29, 0.81, 0.27, 0.99)}.EmojiInteractionAnimation.reversed.playing .AnimatedSticker{animation:show-reaction-reversed forwards .25s cubic-bezier(0.29, 0.81, 0.27, 0.99)}.EmojiInteractionAnimation.hiding .AnimatedSticker{opacity:0;animation:hide-reaction forwards .25s cubic-bezier(0.29, 0.81, 0.27, 0.99)}.EmojiInteractionAnimation.reversed.hiding .AnimatedSticker{animation:hide-reaction-reversed forwards .25s cubic-bezier(0.29, 0.81, 0.27, 0.99)} +.EmojiInteractionAnimation{--start-x: 0;--start-y: 0;--scale: 0;position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1000}@keyframes show-interaction{from{transform:translate(0, 0) scale(var(--scale, 0))}to{transform:translate(-50%, -50%) scale(1)}}@keyframes show-interaction-reversed{from{transform:translate(50%, 0) scaleX(-1) scale(var(--scale, 0))}to{transform:translate(100%, -50%) scaleX(-1) scale(1)}}.EmojiInteractionAnimation .AnimatedSticker{position:absolute;top:var(--start-y);left:var(--start-x);transform:scale(var(--scale), 0);transform-origin:left top;transition:.25s cubic-bezier(0.29, 0.81, 0.27, 0.99) opacity}.EmojiInteractionAnimation.reversed .AnimatedSticker{transform:scale(var(--scale), 0) scaleX(-1)}.EmojiInteractionAnimation.playing .AnimatedSticker{animation:show-interaction forwards .25s cubic-bezier(0.29, 0.81, 0.27, 0.99)}.EmojiInteractionAnimation.reversed.playing .AnimatedSticker{animation:show-interaction-reversed forwards .25s cubic-bezier(0.29, 0.81, 0.27, 0.99)}.EmojiInteractionAnimation.hiding .AnimatedSticker{opacity:0}.EmojiInteractionAnimation.reversed.hiding .AnimatedSticker{opacity:0} .RecentContacts .Loading{min-height:75vh}.RecentContacts .top-peers-section{padding:.5rem 1rem}.RecentContacts .top-peers{height:6rem;margin:0 -1rem;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:none;scrollbar-color:rgba(0,0,0,0)}.RecentContacts .top-peers::-webkit-scrollbar{height:0}.RecentContacts .top-peers::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0)}.RecentContacts .top-peer-item{display:inline-block;width:4.5rem;height:6rem;padding:.625rem .25rem;margin-left:.5rem;border-radius:var(--border-radius-default);cursor:pointer;position:relative;overflow:hidden}.RecentContacts .top-peer-item:first-child{margin-left:.125rem}.RecentContacts .top-peer-item:last-child{margin-right:.125rem}.RecentContacts .top-peer-item .Avatar{margin:0 auto .375rem}.RecentContacts .top-peer-item:hover{background:var(--color-chat-hover)}.RecentContacts .top-peer-item .top-peer-name{text-align:center;white-space:nowrap;font-size:.75rem;overflow:hidden;text-overflow:ellipsis}.RecentContacts .top-peer-item .top-peer-name .emoji-small{width:1rem;height:1rem;background-size:1rem;margin-inline-end:1px;vertical-align:-3px}.RecentContacts .recent-chats-header{display:flex;align-items:center}.RecentContacts .recent-chats-header .Button{margin-left:auto}.RecentContacts .recent-chats-header[dir=rtl] .Button{margin-left:0;margin-right:auto} .ChatMessage:first-child{margin-top:.5rem}.ChatMessage:hover .Avatar.online::after,.ChatMessage.selected .Avatar.online::after{border-color:var(--color-chat-hover)}.ChatMessage .ListItem-button{padding:.25rem .5rem}.ChatMessage .info .title{flex-grow:1}.ChatMessage .info h3{font-size:1rem;width:auto}.ChatMessage .info .subtitle{color:var(--color-text-secondary)}.ChatMessage .info .subtitle .matching-text-highlight{color:var(--color-text);background:#cae3f7;border-radius:.25rem;padding:0 .125rem}.ChatMessage .info .message{flex-grow:1;color:var(--color-text-secondary);overflow:hidden;text-overflow:ellipsis}.ChatMessage .info .message .sender-name{color:var(--color-text)}.ChatMessage .info .message .sender-name::after{content:": "}.ChatMessage .info .message img{width:1.25rem;height:1.25rem;object-fit:cover;border-radius:.125rem;vertical-align:-0.25rem;margin-right:.25rem}.ChatMessage .info .message .icon-play{position:relative;display:inline-block;font-size:.75rem;color:#fff;margin-inline-start:-1.25rem;margin-inline-end:.5rem;bottom:.0625rem}.ChatMessage .info-row{display:flex;justify-content:space-between}.ChatMessage[dir=rtl] .subtitle{text-align:right} .DateSuggest{display:flex;height:2rem;flex-direction:row;justify-content:space-between;margin-left:.5rem;margin-bottom:.5rem}.DateSuggest .date-item{display:flex;flex:1 1 auto;min-width:8rem;margin-top:.375rem;cursor:pointer;font-size:.875rem;font-weight:500;color:var(--color-text-secondary)}.DateSuggest .date-item .icon-calendar{font-size:1.25rem;margin-right:.25rem} @@ -69,4 +69,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=442.8bbf7947a0dd02949ce6.css.map*/ \ No newline at end of file +/*# sourceMappingURL=442.f81b4eb30975dff27660.css.map*/ \ No newline at end of file diff --git a/dist/442.f81b4eb30975dff27660.css.map b/dist/442.f81b4eb30975dff27660.css.map new file mode 100644 index 000000000..17101f221 --- /dev/null +++ b/dist/442.f81b4eb30975dff27660.css.map @@ -0,0 +1 @@ +{"version":3,"file":"442.f81b4eb30975dff27660.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;AC1KV,kBACE,gDACA,4DACA,qCAEA,iCACE,gBAGF,6BACE,oBAGF,yCACE,oBAGF,gCACE,iBACA,cACA,kBAGF,sCACE,SAGF,uDACE,aACA,mBAGF,uCACE,aACA,cACA,yB;ACnCJ,2BACE,aACA,aACA,WACA,kBACA,MACA,OACA,WACA,YACA,oBACA,aAEA,4BACE,KACE,iDAGF,GACE,0CAIJ,qCACE,KACE,8DAGF,GACE,qDAIJ,4CACE,kBACA,mBACA,oBACA,iCACA,0BACA,6DAGF,qDACE,4CAGF,oDACE,8EAGF,6DACE,uFAGF,mDACE,UAGF,4DACE,U;ACzDF,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,yBAIA,4CACE,aAGF,8CACE,uBACA,aAKF,8CACE,aACA,cACA,uB;AE/TJ,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,kBACE,kBACA,YACA,mCACA,eACA,4BACA,YACA,mBACA,mEACA,YACA,YAEA,8BACE,kBACA,cACA,WACA,aACA,eACA,WACA,YACA,kBACA,mCACA,WAGF,gCACE,kBACA,cACA,WACA,cACA,gBACA,YACA,aACA,kBACA,mCAGF,iCACE,YACA,wDAGF,4FACE,wDAGF,iCACE,WACA,YACA,gBACA,mBAGF,yBACE,eACA,WACA,YACA,gBACA,iBACA,kBACA,aACA,eACA,mBACA,mBAGF,4BACE,kBACA,kBACA,eACA,gBAEA,wCACE,cAIJ,uCACE,WACA,kBACA,MACA,OACA,qBAGF,mCACE,kBACA,MACA,O;ACxFJ,oBACE,kBACA,eAEA,wCACE,cACA,iBACA,gBACA,4BAGF,4BACE,4GACA,qBACA,iBACA,UAGF,2CACE,kBAGF,8BACE,kBAGF,6BACE,aACA,kBACA,iBACA,kBAEA,qCACE,8CACA,eACA,uBAEA,uDACE,uB;ACrCN,+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,wHACE,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,UhBxKF,oGgB4KE,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;AC/CR,2BACE,gBACA,oBACA,sBACA,yBACA,mBAGF,4BACE,wBACA,gBACA,gBACA,cACA,sBAEA,yBAPF,4BAQI,yBAKF,sCACE,UACA,kBACA,UACA,OACA,WACA,aACA,cAKN,YACE,oBAGA,6BACE,oBACA,kBACA,2BACA,4BAEA,qCACE,cACA,WACA,kBACA,SACA,UACA,sCACA,uBACA,wBACA,kBAIJ,6BACE,iCACA,gBACA,mBAGF,kBACE,0BAIF,sBACE,mBACA,kCACA,mB;ACvEJ,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,yCACE,aACA,mBAGF,oDACE,aACA,kBAGF,0CACE,gBAGF,yDACE,oBACA,mBACA,gBACA,uBAGF,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,mBAIA,6BACE,kBAGF,mCACE,eACA,mBAGF,uCACE,kBACA,YACA,QACA,6BACA,UAGF,4BACE,oBAKF,yBACE,mBAGF,4BACE,gBAGF,2BACE,gBAEA,0BACA,4GAEE,wBAMJ,yCACE,kBACA,gBACA,iB;ACrNJ,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/middle/ReactorListModal.scss","webpack://telegram-t/./src/components/middle/EmojiInteractionAnimation.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/ReactionSelector.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/middle/composer/SendAsMenu.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",".ReactorListModal {\n --color-reaction: var(--color-message-reaction);\n --hover-color-reaction: var(--color-message-reaction-hover);\n --accent-color: var(--color-primary);\n\n .modal-content {\n overflow: hidden;\n }\n\n .Reactions {\n margin-bottom: 0.5rem;\n }\n\n .reaction-filter-emoji {\n margin-right: 0.25rem;\n }\n\n .reactor-list {\n max-height: 400px;\n overflow: auto;\n overflow-x: hidden;\n }\n\n .reactors-list-item {\n margin: 0;\n }\n\n .reactors-list-item .ListItem-button {\n display: flex;\n align-items: center;\n }\n\n .reactors-list-emoji {\n width: 1.5rem;\n height: 1.5rem;\n margin-inline-start: auto;\n }\n}\n",".EmojiInteractionAnimation {\n --start-x: 0;\n --start-y: 0;\n --scale: 0;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 1000;\n\n @keyframes show-interaction {\n from {\n transform: translate(0, 0) scale(var(--scale, 0));\n }\n\n to {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes show-interaction-reversed {\n from {\n transform: translate(50%, 0) scaleX(-1) scale(var(--scale, 0));\n }\n\n to {\n transform: translate(100%, -50%) scaleX(-1) scale(1);\n }\n }\n\n .AnimatedSticker {\n position: absolute;\n top: var(--start-y);\n left: var(--start-x);\n transform: scale(var(--scale), 0);\n transform-origin: left top;\n transition: 0.25s cubic-bezier(.29,.81,.27,.99) opacity;\n }\n\n &.reversed .AnimatedSticker {\n transform: scale(var(--scale), 0) scaleX(-1);\n }\n\n &.playing .AnimatedSticker {\n animation: show-interaction forwards 0.25s cubic-bezier(.29,.81,.27,.99);\n }\n\n &.reversed.playing .AnimatedSticker {\n animation: show-interaction-reversed forwards 0.25s cubic-bezier(.29,.81,.27,.99);\n }\n\n &.hiding .AnimatedSticker {\n opacity: 0;\n }\n\n &.reversed.hiding .AnimatedSticker {\n opacity: 0;\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(#7f7f7f, 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\n.settings-quick-reaction {\n .Radio-main .label {\n display: flex;\n }\n\n .ReactionStaticEmoji {\n margin-inline-end: 1rem;\n width: 1.5rem\n }\n}\n\n.SettingsDefaultReaction {\n .ReactionStaticEmoji {\n width: 1.5rem;\n height: 1.5rem;\n margin-inline-end: 2rem;\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",".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",".ReactionSelector {\n position: absolute;\n height: 3rem;\n background: var(--color-background);\n min-width: 3rem;\n max-width: calc(100% + 5rem);\n z-index: 100;\n border-radius: 3rem;\n filter: drop-shadow(0 0.25rem 0.125rem var(--color-default-shadow));\n right: -3rem;\n top: -3.5rem;\n\n .bubble-big {\n position: absolute;\n display: block;\n content: \"\";\n right: 1.5rem;\n bottom: -0.5rem;\n width: 1rem;\n height: 1rem;\n border-radius: 50%;\n background: var(--color-background);\n z-index: -1;\n }\n\n .bubble-small {\n position: absolute;\n display: block;\n content: \"\";\n right: 1.25rem;\n bottom: -1.25rem;\n width: 0.5rem;\n height: 0.5rem;\n border-radius: 50%;\n background: var(--color-background);\n }\n\n body.is-safari & {\n filter: none;\n box-shadow: 0 0.25rem 0.125rem var(--color-default-shadow);\n }\n\n body.is-safari .bubble-small, body.is-safari .bubble-big {\n box-shadow: 0 0.25rem 0.125rem var(--color-default-shadow);\n }\n\n .items-wrapper {\n width: 100%;\n height: 100%;\n overflow: hidden;\n border-radius: 3rem;\n }\n\n .items {\n padding: 0 1rem;\n width: 100%;\n height: 100%;\n overflow-x: auto;\n overflow: overlay;\n overflow-y: hidden;\n display: flex;\n cursor: pointer;\n align-items: center;\n border-radius: 3rem;\n }\n\n .reaction {\n margin-left: 0.5rem;\n position: relative;\n min-width: 2rem;\n min-height: 2rem;\n\n &:first-child {\n margin-left: 0;\n }\n }\n\n .ReactionStaticEmoji {\n width: 2rem;\n position: absolute;\n top: 0;\n left: 0;\n transform: scale(0.9);\n }\n\n .AnimatedSticker {\n position: absolute;\n top: 0;\n left: 0;\n }\n}\n",".MessageContextMenu {\n position: absolute;\n font-size: 1rem;\n\n .scrollable-content {\n overflow: auto;\n overflow: overlay;\n padding: 0.5rem 0;\n overscroll-behavior: contain;\n }\n\n .bubble {\n transition: opacity .15s cubic-bezier(0.2, 0, 0.2, 1), transform .15s cubic-bezier(0.2, 0, 0.2, 1) !important;\n transform: scale(0.7);\n overflow: initial;\n padding: 0;\n }\n\n &.with-reactions .bubble {\n margin-top: 3.5rem;\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 ~ &, .Button.send-as-button ~ & {\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",".SendAsMenu {\n .send-as-title {\n font-weight: 500;\n line-height: 1.25rem;\n word-break: break-word;\n margin-inline-start: 1rem;\n margin-block: 0.5rem;\n }\n\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 z-index: 2;\n position: absolute;\n top: -1rem;\n left: 0;\n right: auto;\n width: 3.5rem;\n height: 4.5rem;\n }\n }\n}\n\n.SendAsItem {\n margin: 0 !important;\n $border-size: 2px;\n\n .Avatar.selected {\n margin-right: 0.75rem;\n position: relative;\n width: calc(2.125rem - #{$border-size * 2});\n height: calc(2.125rem - #{$border-size * 2});\n\n &::before {\n display: block;\n content: \"\";\n position: absolute;\n top: #{-$border-size * 2};\n left: #{-$border-size * 2};\n border: $border-size solid var(--color-primary);\n width: calc(100% + #{$border-size * 4});\n height: calc(100% + #{$border-size * 4});\n border-radius: 50%;\n }\n }\n\n .ListItem-button {\n padding: 0.5625rem 1rem !important;\n border-radius: 0;\n align-items: center;\n }\n\n .info {\n margin-inline-start: 0.5rem;\n }\n\n\n .subtitle {\n font-size: .9375rem;\n color: var(--color-text-secondary);\n line-height: 1.3125;\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 -0.75rem;\n\n .Reaction {\n display: flex;\n align-items: center;\n }\n\n .ReactionStaticEmoji {\n width: 1.5rem;\n margin-right: 1rem;\n }\n\n &:last-child {\n margin-bottom: 0;\n }\n\n .multiline-item .subtitle {\n line-height: 1.25rem;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\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: 0.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: 0.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: 0.625rem;\n }\n }\n\n .Radio-main {\n &::before {\n left: 0.125rem;\n top: 0.25rem;\n transform: none;\n }\n\n &::after {\n left: 0.4375rem;\n top: 0.5625rem;\n transform: none;\n }\n }\n }\n}\n\n.ManageGroupMembers {\n padding: 0.5rem 1rem;\n}\n\n.ManageInvites {\n .primary-link {\n position: relative;\n }\n\n .primary-link-input {\n cursor: pointer;\n margin-bottom: 1rem;\n }\n\n .primary-link-more-menu {\n position: absolute;\n right: 0.5rem;\n top: 50%;\n transform: translate(0, -50%);\n z-index: 1;\n }\n\n .create-link {\n margin-bottom: 0.5rem;\n }\n}\n\n.ManageInvite {\n .link-name {\n margin-bottom: 1rem;\n }\n\n .expire-limit {\n margin-top: 1rem;\n }\n\n .usage-limit {\n margin-top: 1rem;\n\n -moz-appearance: textfield;\n &::-webkit-outer-spin-button,\n &::-webkit-inner-spin-button {\n -webkit-appearance: none;\n }\n }\n}\n\n.ManageInvite, .ManageInvites {\n .hint {\n font-size: 0.875rem;\n margin-bottom: 0;\n margin-top: 0.5rem;\n }\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/442.f81b4eb30975dff27660.js b/dist/442.f81b4eb30975dff27660.js new file mode 100644 index 000000000..9987b3285 --- /dev/null +++ b/dist/442.f81b4eb30975dff27660.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[442],{1442:(e,t,n)=>{n.r(t),n.d(t,{ArchivedChats:()=>ts,AttachMenu:()=>gr,AttachmentModal:()=>Js,BotCommandMenu:()=>Cr,BotCommandTooltip:()=>Er,CalendarModal:()=>Ke,ChatFolderModal:()=>as,ContactList:()=>Va,ContextMenuContainer:()=>fs,CustomSendMenu:()=>br,DeleteMessageModal:()=>We,Dialogs:()=>Ue,DropArea:()=>Ir.Z,EmojiInteractionAnimation:()=>ut,EmojiTooltip:()=>Sr,ForwardPicker:()=>Be,GifSearch:()=>Gr,HeaderMenuContainer:()=>ys,HistoryCalendar:()=>qe,InlineBotTooltip:()=>Rr,LeftSearch:()=>en,Management:()=>Eo,MediaViewer:()=>be,MentionTooltip:()=>Os,MessageSelectToolbar:()=>rt,MobileSearch:()=>ws,NewChat:()=>Qa,NewChatStep1:()=>Ka,NewChatStep2:()=>qa,Notifications:()=>Ge,PaymentModal:()=>zo,PinMessageModal:()=>Qe,PollModal:()=>_s,PollResults:()=>Xr,ReactorListModal:()=>ct,ReceiptModal:()=>Vo,RightSearch:()=>$r,SafeLinkModal:()=>_e,SeenByModal:()=>ot,SendAsMenu:()=>Fr,Settings:()=>Ya,StickerSearch:()=>Or,StickerSetModal:()=>bs,StickerTooltip:()=>fr,SymbolMenu:()=>vr,TextFormatter:()=>yr.Z,UnpinAllMessagesModal:()=>et});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),v=n(2858),g=n(1638),p=n(396),E=n(3989),C=n(1174),f=n(7361),b=n(3858),I=n(4399),y=n(935),N=n(3227);function S(e,t){const n=document.createElement("div");n.classList.add("ghost");const a=new Image;if(a.draggable=!1,a.oncontextmenu=N.Z,"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 w(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 L=n(231),A=n(126),R=n(2255),F=n(3106),B=n(8964),$=n(9196);const D=(0,a.X$)((0,s.c$)(((e,{message:t})=>({isDownloading:!!t&&(0,g.te)(e,t),isProtected:(0,g.EV)(e,t)})))((({mediaData:e,isVideo:t,isZoomed:n,message:r,fileName:o,isAvatar:i,isDownloading:l,isProtected:c,onCloseMediaViewer:d,onForward:m,onZoomToggle:h})=>{const{downloadMessageMedia:P,cancelMessageMediaDownload:g}=(0,s.uC)(),{loadProgress:p}=(0,Z.Z)(r&&(0,v.Ti)(r,"download"),!l),E=(0,a.I4)((()=>{l?g({message:r}):P({message:r})}),[g,P,l,r]),C=(0,u.Z)(),b=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",className:t?"active":void 0,onClick:e,ariaLabel:"More actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]);if(f.wB){if(c)return;return a.ZP.createElement("div",{className:"MediaViewerActions-mobile"},a.ZP.createElement(F.Z,{trigger:b,positionX:"right"},!i&&a.ZP.createElement(B.Z,{icon:"forward",onClick:m},C("Forward")),t?a.ZP.createElement(B.Z,{icon:l?"close":"download",onClick:E},l?`${Math.round(100*p)}% Downloading...`:"Download"):a.ZP.createElement(B.Z,{icon:"download",href:e,download:o},C("AccActionDownload"))),l&&a.ZP.createElement($.Z,{progress:p,size:"s",noCross:!0}))}return a.ZP.createElement("div",{className:"MediaViewerActions"},!i&&!c&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:C("Forward"),onClick:m},a.ZP.createElement("i",{className:"icon-forward"}))),function(){if(!c)return t?a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:C("AccActionDownload"),onClick:E},l?a.ZP.createElement($.Z,{progress:p,size:"s",onClick:E}):a.ZP.createElement("i",{className:"icon-download"})):a.ZP.createElement(L.Z,{href:e,download:o,round:!0,size:"smaller",color:"translucent-white",ariaLabel:C("AccActionDownload")},a.ZP.createElement("i",{className:"icon-download"}))}(),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:n?"Zoom Out":"Zoom In",onClick:h},a.ZP.createElement("i",{className:n?"icon-zoom-out":"icon-zoom-in"})),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent-white",ariaLabel:C("Close"),onClick:d},a.ZP.createElement("i",{className:"icon-close"})))})));var x=n(2202),U=n(9933),O=n(275),G=n(9118),J=n(9204),X=n(6752);const _=({text:e="",isHidden:t,isForVideo:n,onClick:s})=>{const[r,o]=(0,a.eJ)(!1);(0,a.d4)((()=>{const e=document.querySelector(".MediaViewerFooter .media-text"),t=()=>{const t=e?e.clientHeight:0;o(t>2*I.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 z=n(1212),Y=n(2019);const H=void 0!==document.fullscreenElement?"fullscreenElement":void 0!==document.mozFullScreenElement?"mozFullScreenElement":void 0!==document.webkitFullscreenElement?"webkitFullscreenElement":"";var V=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),v=(0,a.sO)(null),g=(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(g.current&&v.current){const{width:t,left:a}=v.current.getBoundingClientRect(),s=e instanceof MouseEvent?e.clientX:e.targetTouches[0].clientX;h(Math.max(Math.min(n*((s-a)/t),n),0))}}),[n,h]),b=(0,a.I4)((e=>{g.current=!0,E(e)}),[E]),I=(0,a.I4)((()=>{g.current=!1}),[]);var y,N;if((0,a.d4)((()=>{if(v.current&&Z)return(0,C.s)(v.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,v),a.ZP.createElement(L.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,N=s,a.ZP.createElement("div",{className:"player-file-size"},`${W(N*y)} / ${W(N)}`)),l&&a.ZP.createElement(L.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,v]=(0,a.eJ)(!0),[g,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,Y.Z)(),{shouldRender:y,transitionClassNames:N}=(0,z.Z)(!C,void 0,void 0,"slow"),{shouldRender:S,transitionClassNames:w}=(0,z.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 k=(0,a.I4)((e=>{e.stopPropagation(),m?(d.current.pause(),u(!1)):((0,j.Z)(d.current),u(!0),f.wB&&v(!1))}),[m]);(0,V.Z)(d,[]);const M=(0,a.I4)((()=>{v(!0)}),[]),T=(0,a.I4)((()=>{v(!1)}),[]),A=(0,a.I4)((e=>{Z(e.currentTarget.currentTime)}),[]),R=(0,a.I4)((()=>{Z(0),u(!1),v(!0)}),[]),F=(0,a.I4)((()=>{g&&E?E():!g&&p&&p()}),[E,g,p]),B=(0,a.I4)((e=>{d.current.currentTime=e}),[]),D=(0,a.I4)((e=>{e.stopPropagation(),v(!P),P||(d.current.pause(),u(!1))}),[P]);(0,a.d4)((()=>{const e=e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),k(e))};return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)}}),[k]);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:R,onClick:f.wB?void 0:k,onDoubleClick:F},I,{onTimeUpdate:A}),e&&a.ZP.createElement("source",{src:e}))),S&&a.ZP.createElement(L.Z,{round:!0,className:`play-button ${w}`,onClick:k},a.ZP.createElement("i",{className:"icon-play"})),y&&a.ZP.createElement("div",{className:["spinner-container",N].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:g,fileSize:o,duration:d.current?d.current.duration:0,isForceVisible:P,isForceMobileVersion:s&&s.width<400,onSeek:B,onChangeFullscreen:F,onPlayPause:k}))})),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,g.hj)(e,n,s);return t?{chatId:n,messageId:s,senderId:t.senderId,origin:l,message:t,isProtected:(0,g.EV)(e,t)}:{}}if(r)return{messageId:-1,senderId:r,avatarOwner:(0,g.dy)(e,r)||(0,g.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,g.Tm)(e,n,s):(0,g.hj)(e,n,s),c?{chatId:n,threadId:a,messageId:s,senderId:c.senderId,origin:l,message:c,isProtected:(0,g.EV)(e,c)}:{}}))((e=>{const{messageId:t,isActive:n,avatarOwner:s,chatId:i,message:c,profilePhotoIndex:d,origin:m,animationLevel:u,onClose:P,onFooterClick:g,isFooterHidden:p,isProtected:E}=e,C=c?(0,v.O$)(c):void 0,b=c?(0,v.b7)(c):void 0,S=c?(0,v.F$)(c):void 0,w=c?(0,v.Cg)(c):void 0,k=!!c&&(0,v.rl)(c),M=!!c&&(0,v.hC)(c),T=Boolean(b||w||M),L=Boolean(!T&&(C||S||k)),{isGif:A}=b||w||{},R=Boolean(s||t),F=Boolean(s),B=m===o.bZ.SharedMedia,$=m===o.bZ.SearchResult,D=2===u;function x(e){if(F&&void 0!==d){const{photos:t}=s;return t&&t[d]?`photo${t[d].id}?size=c`:(0,v.RT)(s,e?"big":"normal")}return c&&(0,v.Ti)(c,e?"viewerFull":"viewerPreview")}const U=(0,h.Z)(c&&(B||$)&&(0,v.Ti)(c,"pictogram"),void 0,r.IU.BlobUrl,void 0,D&&350),O=x(),G=(0,h.Z)(O,void 0,r.IU.BlobUrl,void 0,D&&350),{mediaData:X,loadProgress:z}=(0,Z.Z)(x(!0),void 0,c&&(0,v.kG)(c,"viewerFull"),void 0,D&&350),Y=C||b?(C||b).blobUrl:void 0;let H=!T&&(Y||X)||G||U;const V=(0,l.Z)(!H&&c&&(0,v.DH)(c));H||m===o.bZ.SearchResult||(H=V);const j=c?(0,v.c0)(c):void 0;let K;if(c?k||M?K=(0,v.aE)(c).mediaSize:C||S?K=(0,v.bV)(C||S):(b||w)&&(K=(0,v.jC)(b||w)):K=I.vY,F)return a.ZP.createElement("div",{key:i,className:"MediaViewerContent"},se(X||G,(0,I.PA)(I.vY,!1),!f.wB&&!E));if(!c)return;const q=(0,y.X)(c),W=Boolean(q);return a.ZP.createElement("div",{className:"MediaViewerContent "+(W?"has-footer":"")},E&&a.ZP.createElement("div",{onContextMenu:N.Z,className:"protector"}),L&&se(Y||X||G||U,c&&(0,I.PA)(K,W),!f.wB&&!E),T&&(n?a.ZP.createElement(ne,{key:t,url:Y||X,isGif:A,posterData:H,posterSize:c&&(0,I.PA)(K,W,!0),loadProgress:z,fileSize:j,isMediaViewerOpen:R,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(n)}))):a.ZP.createElement("div",{className:"spinner-wrapper",style:t?`width: ${t.width}px`:""},a.ZP.createElement(J.Z,{color:"white"}))}(H,c&&(0,I.PA)(K,W,!0),!f.wB&&!E)),q&&a.ZP.createElement(_,{text:q,onClick:g,isHidden:p&&(!T||A),isForVideo:T&&!A}))})));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(J.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),v=(0,a.sO)(!0),[g,p]=(0,a.eJ)(e),E=(0,c.Z)(),[b,I]=(0,a.eJ)(!1),{isZoomed:y,onClose:N}=m,S=(0,a.I4)((e=>{Z.current=e,E()}),[E]),w=(0,a.I4)((e=>{P.current=e,E()}),[E]),k=(0,a.I4)((e=>{v.current=e,E()}),[E]),M=(0,x.Z)(350,!0),T=(0,x.Z)(500,!0),L=(0,x.Z)(800,!0),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||!g)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;S({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=>S({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=>S({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=>S({x:e[0],y:e[1],scale:e[2]})}))}if(e={x:u,y:h,scale:m},d>=50)return N();if(d>0)return(0,U.vr)({from:h,to:0,duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>S({x:0,y:e,scale:m})});const P=u<0?1:-1,v=t(g,u<0?1:-1),E=r.x<0?-1:1;if(v&&c>=50&&P===E){const e=(window.innerWidth+40)*P;Z.current.x+=e,p(v),M((()=>n(v)))}T((()=>w(!1))),L((()=>k(!0))),ie=(0,U.vr)({from:Z.current.x,to:0,duration:oe,timing:U.M8.easeOutCubic,onUpdate:e=>S({y:0,x:e,scale:Z.current.scale})})}})}),[y,N,S,t,g,w,k]),!g)return;const R=t(g,1),F=t(g,-1),B=Z.current.x,$=Z.current.y,{scale:D}=Z.current;return a.ZP.createElement("div",{className:"MediaViewerSlides",ref:u},F&&1===D&&a.ZP.createElement("div",{className:"MediaViewerSlide",style:de(-window.innerWidth+B-40)},a.ZP.createElement(ae,re({},m,{messageId:F,isFooterHidden:b}))),g&&a.ZP.createElement("div",{className:"MediaViewerSlide "+(l?"MediaViewerSlide--active":""),onClick:A,ref:h,style:de(B,$,D)},a.ZP.createElement(ae,re({},m,{messageId:g,isActive:v.current,isFooterHidden:b||y||1!==D}))),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}))))}));function de(e=0,t=0,n=1){return`transform: translate3d(${e.toFixed(3)}px, ${t.toFixed(3)}px, 0px) scale(${n.toFixed(3)});`}var me=n(782);const ue=[1,0,0,1,0,0],he={1:1,1.5:1.5,2:2.2,2.5:3.3,3:5.5},Ze=150,Pe=(0,a.X$)((({children:e,className:t,noWrap:n,canPan:s,zoomLevel:r,panDeltaX:o,panDeltaY:i,onPan:l})=>{const c=he[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)(ue),v=(0,a.sO)(null),g=(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,me.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-Ze{s||P(ue)}),[s]),(0,a.d4)((()=>{g.current&&(g.current.style.transform=`matrix(${Z.toString()})`)}),[n,Z]),n?e:a.ZP.createElement("div",{ref:v,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),v.current&&v.current.classList.add("move")},onMouseUp:()=>{m(!1),v.current&&v.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),g.current&&(g.current.style.transform=`matrix(${Z.toString()})`)}}},a.ZP.createElement("div",{ref:g,className:"pan-container"},e))}));var ve=n(2340),ge=n(172);const pe=(0,s.c$)(((e,{chatId:t,messageId:n,isAvatar:a})=>{if(a&&t)return{sender:(0,v.YC)(t)?(0,g.dy)(e,t):(0,g.Z1)(e,t)};if(!n||!t)return{};const s=(0,g.hj)(e,t,n);return{message:s,sender:s&&(0,g.Ur)(e,s)}}))((({chatId:e,messageId:t,sender:n,isAvatar:r,message:o})=>{const{closeMediaViewer:i,focusMessage:l}=(0,s.uC)(),c=(0,a.I4)((()=>{i(),l({chatId:e,messageId:t})}),[e,l,t,i]),d=(0,u.Z)();if(!n||!o&&!r)return;const m=(0,v.OU)(d,n);return a.ZP.createElement("div",{className:"SenderInfo",onClick:c},(0,v.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"},m&&(0,ve.Z)(m)),a.ZP.createElement("div",{className:"date",dir:"auto"},r?d("lng_mediaview_profile_photo"):(0,K.ZK)(d,1e3*o.date,!0))))})),Ee=({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(R.Z,t,e),Ce=(0,a.X$)((({isShown:e,onChangeZoom:t})=>{const{transitionClassNames:n}=(0,z.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(L.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(L.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}))))})),fe=350,be=(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,g.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,g.dy)(e,s)||(0,g.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,g.Tm)(e,t,a):(0,g.hj)(e,t,a),!c)return{animationLevel:l};if(d=i&&[o.bZ.ScheduledAlbum,o.bZ.ScheduledInline].includes(i)?(0,g.Fn)(e,t):(0,g.Zw)(e,t),i===o.bZ.Inline||i===o.bZ.Album)m=(0,g.qC)(e,t,n)||(0,g.gb)(e,t,n);else if(i===o.bZ.SharedMedia){const t=(0,g.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}}))((({chatId:e,threadId:t,messageId:n,senderId:g,origin:N,avatarOwner:F,profilePhotoIndex:B,message:$,chatMessages:x,collectionIds:U,animationLevel:O})=>{const{openMediaViewer:G,closeMediaViewer:J,openForwardMenu:X,focusMessage:_}=(0,s.uC)(),z=Boolean(F||n),Y=N===o.bZ.SharedMedia,H=N===o.bZ.SearchResult,V=$?(0,v.O$)($):void 0,j=$?(0,v.b7)($):void 0,K=$?(0,v.F$)($):void 0,q=$?(0,v.Cg)($):void 0,W=!!$&&(0,v.rl)($),Q=!!$&&(0,v.hC)($),ee=Boolean(j||q||Q),{isGif:te}=j||q||{},ne=Boolean(!ee&&(V||K||W)),ae=Boolean(F),se=Boolean(K||q),re=(0,a.Ye)((()=>se&&n?[n]:(0,v.N0)(x||{},U||[],Y)),[se,n,x,U,Y]),oe=n?re.indexOf(n):-1,ie=0===oe||-1===oe,le=oe===re.length-1||-1===oe,de=(0,a.sO)(),me=(0,P.Z)(g);!z||me&&me===g&&de.current||(de.current=oe);const ue=O>=1&&!f.$b?"mv-slide":"none",he=2===O?"slide-fade":"none",Ze=2===O,[ve,ge]=(0,a.eJ)(!1),[be,Ie]=(0,a.eJ)(!1),[ye,Ne]=(0,a.eJ)(1),[Se,we]=(0,a.eJ)({x:0,y:0});function ke(e){if(ae&&void 0!==B){const{photos:t}=F;return t&&t[B]?`photo${t[B].id}?size=c`:(0,v.RT)(F,e?"big":"normal")}return $&&(0,v.Ti)($,e?"viewerFull":"viewerPreview")}const Me=(0,h.Z)($&&(Y||H)&&(0,v.Ti)($,"pictogram"),void 0,r.IU.BlobUrl,void 0,Ze&&fe),Te=ke(),Le=(0,h.Z)(Te,void 0,r.IU.BlobUrl,void 0,Ze&&fe),{mediaData:Ae}=(0,Z.Z)(ke(!0),void 0,$&&(0,v.kG)($,"viewerFull"),void 0,Ze&&fe),Re=V||j?(V||j).blobUrl:void 0;let Fe=!ee&&(Re||Ae)||Le||Me;const Be=(0,l.Z)(!Fe&&$&&(0,v.DH)($));Fe||N===o.bZ.SearchResult||(Fe=Be);const $e=$?(0,v.ep)($):ae?`avatar${F.id}-${B}.jpg`:void 0;let De;$?W||Q?De=(0,v.aE)($).mediaSize:V||K?De=(0,v.bV)(V||K):(j||q)&&(De=(0,v.jC)(j||q)):De=I.vY,(0,a.d4)((()=>{f.wB&&document.body.classList.toggle("is-media-viewer-open",z)}),[z]);const xe=(0,c.Z)();(0,a.d4)((()=>{const e=window.matchMedia(I.L6);return"function"==typeof e.addEventListener?e.addEventListener("change",xe):"function"==typeof e.addListener&&e.addListener(xe),()=>{"function"==typeof e.removeEventListener?e.removeEventListener("change",xe):"function"==typeof e.removeListener&&e.removeListener(xe)}}),[xe]);const Ue=(0,P.Z)($),Oe=(0,P.Z)(N),Ge=(0,P.Z)(F),Je=(0,P.Z)(Fe),Xe=$?(0,y.X)($):void 0,_e=Boolean(Xe);(0,a.d4)((()=>{Ze&&z&&!Ue&&!Ge&&((0,d.YW)(fe+i.fK),function(e,t,n,a,s,r){const{mediaEl:l}=M(t,r);if(!l)return;const{width:c}=b.Z.get(),{width:d,height:m}=(0,I.fM)(e,s),{width:u,height:h}=(0,I.jg)(d,m,a.width,a.height),Z=(c-u)/2,P=function(e){const t=window.matchMedia(I.L6);let n=4.125;return e&&(n+=t.matches?.875:3.375),n*I.Gw}(e)+(m-h)/2;let{top:v,left:g,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,v,g,p,E);v=e.top,g=e.left,p=e.width,E=e.height}const C=g+p/2-(Z+u/2),f=v+E/2-(P+h/2),y=p/u,N=E/h,w=S(n||l);k(w,{top:`${P}px`,left:`${Z}px`,width:`${u}px`,height:`${h}px`,transform:`translate3d(${C}px, ${f}px, 0) scale(${y}, ${N})`}),T(w,t),document.body.classList.add("ghost-animating"),requestAnimationFrame((()=>{document.body.appendChild(w),requestAnimationFrame((()=>{w.style.transform="",function(e){e.firstChild.style.objectFit="default",e.classList.remove("rounded-corners","circle")}(w),setTimeout((()=>{requestAnimationFrame((()=>{document.body.contains(w)&&document.body.removeChild(w),document.body.classList.remove("ghost-animating")}))}),200+i.fK)}))}))}(_e,N,Fe,De,ee,$)),Ze&&!z&&(Ue||Ge)&&((0,d.YW)(fe+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 v=u;if(!function(e){if("none"===e.style.display)return!1;const t=e.getBoundingClientRect(),{height:n}=b.Z.get();return t.top<=n&&t.top+t.height>=0}(a)){const{height:e}=b.Z.get();v=uC?E=C:C>E&&(C=E));const I=document.getElementsByClassName("ghost")[0],y=I||S(t||s,e);I||k(y,{top:`${v}px`,left:`${h}px`,width:`${Z}px`,height:`${P}px`,transform:`translate3d(${g}px, ${p}px, 0) scale(${E}, ${C})`}),requestAnimationFrame((()=>{if(I){const{top:e,left:t,width:n,height:a}=I.getBoundingClientRect();k(y,{transition:"none",top:`${v}px`,left:`${h}px`,transformOrigin:"top left",transform:`translate3d(${t-h}px, ${e-v}px, 0) scale(${n/Z}, ${a/P})`,width:`${Z}px`,height:`${P}px`})}document.body.classList.add("ghost-animating"),I||document.body.appendChild(y),requestAnimationFrame((()=>{I&&(I.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)}))}))}(Oe,Je,Ue||void 0))}),[Ze,z,N,Oe,$,Ue,Ge,Fe,Je,De,ee,_e]),(0,a.d4)((()=>{let e;return be?ge(!0):e=window.setTimeout((()=>{ge(!1)}),fe),()=>{e&&window.clearTimeout(e)}}),[be]);const ze=()=>{Ie(!1),Ne(1),we({x:0,y:0})},Ye=(0,a.I4)((()=>{Ie(!be),Ne(be?1:1.5),be&&we({x:0,y:0})}),[be]),He=(0,a.I4)(((e,t=!1)=>{Ne(e),1===e&&t&&ze()}),[]),Ve=(0,a.I4)((()=>{J(),ze()}),[J]),je=(0,a.I4)((()=>{Ve(),_({chatId:e,threadId:t,messageId:n})}),[Ve,e,t,_,n]),Ke=(0,a.I4)((()=>{X({fromChatId:e,messageIds:[n]}),ze()}),[X,e,n]),qe=(0,a.I4)((n=>G({chatId:e,threadId:t,messageId:n,origin:N},{forceOnHeavyAnimation:!0})),[e,G,N,t]);(0,a.d4)((()=>z?(0,E.Z)((()=>{be?ze():Ve()})):void 0),[Ve,z,be]),(0,a.d4)((()=>{ee&&!te&&(0,p.Es)()}),[te,ee]),(0,a.d4)((()=>{if(z)return b.Z.disableRefresh(),()=>{b.Z.enableRefresh()}}),[z]);const We=(0,a.I4)(((e,t)=>{if(!e)return;const n=re.indexOf(e);return-1===t&&n>0||1===t&&n{we({x:e,y:t})}),[]),nt=(0,u.Z)();function at(){return ae?a.ZP.createElement(pe,{key:F.id,chatId:F.id,isAvatar:!0}):a.ZP.createElement(pe,{key:n,chatId:e,messageId:n})}return(0,m.ZP)(z,J,G,{chatId:e,threadId:t,messageId:n,origin:N,avatarOwnerId:F&&F.id}),(0,a.d4)((()=>{if(z)return document.addEventListener("keydown",e,!1),()=>{document.removeEventListener("keydown",e,!1)};function e(e){switch(e.key){case"Left":case"ArrowLeft":qe(et);break;case"Right":case"ArrowRight":qe(Qe)}}}),[z,Qe,et,qe]),(0,a.d4)((()=>{if(be||f.$b)return;const e=document.querySelector(".MediaViewerSlide--active");if(!e)return;const t=te&&!f.cj;return(0,C.s)(e,{excludedClosestSelector:".backdrop, .navigation, .media-viewer-head, .media-viewer-footer"+(t?"":", .VideoPlayer"),onClick:Ve})}),[Ve,te,be,n]),a.ZP.createElement(A.Z,{id:"MediaViewer",className:be?"zoomed":"",isOpen:z},(()=>a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"media-viewer-head",dir:nt.isRtl?"rtl":void 0},f.wB&&a.ZP.createElement(L.Z,{className:"media-viewer-close",round:!0,size:"smaller",color:"translucent-white",ariaLabel:nt("Close"),onClick:Ve},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(R.Z,{activeKey:de.current,name:he},at),a.ZP.createElement(D,{mediaData:Ae||Le,isVideo:ee,isZoomed:be,message:$,fileName:$e,onCloseMediaViewer:Ve,onForward:Ke,onZoomToggle:Ye,isAvatar:ae})),a.ZP.createElement(Pe,{noWrap:!ve,canPan:be,panDeltaX:Se.x,panDeltaY:Se.y,zoomLevel:ye,onPan:tt},a.ZP.createElement(Ee,{activeKey:oe,name:ue},(s=>a.ZP.createElement(ce,{messageId:n,getMessageId:We,chatId:e,isPhoto:ne,isGif:te,threadId:t,avatarOwnerId:F&&F.id,profilePhotoIndex:B,origin:N,isOpen:z,hasFooter:_e,isZoomed:be,isActive:s,animationLevel:O,onClose:Ve,selectMessage:qe,onFooterClick:je})))),!ie&&!f.$b&&a.ZP.createElement("button",{type:"button",className:`navigation prev ${ee&&!te&&"inline"}`,"aria-label":nt("AccDescrPrevious"),dir:nt.isRtl?"rtl":void 0,onClick:()=>qe(et)}),!le&&!f.$b&&a.ZP.createElement("button",{type:"button",className:`navigation next ${ee&&!te&&"inline"}`,"aria-label":nt("Next"),dir:nt.isRtl?"rtl":void 0,onClick:()=>qe(Qe)}),a.ZP.createElement(Ce,{isShown:be,onChangeZoom:He}))))})));var Ie=n(8360),ye=n(7407),Ne=n(2313),Se=n(2515),we=n(4288),ke=n(3103),Me=n(7687),Te=n(1273),Le=n(1876),Ae=n(8799),Re=n(6058);const Fe=(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,ye.Z)(c,n,Boolean(r)),P=(0,a.I4)((()=>{i("")}),[i]);(0,Se.Z)(s,e,P);const g=(0,a.sO)(null),p=(0,a.I4)((e=>{i(e.currentTarget.value)}),[i]),E=(0,Ne.Z)(g,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(L.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:m("Close"),onClick:l},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(Me.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(Te.Z,{className:"picker-list custom-scroll",items:h,onLoadMore:Z,noScrollRestore:Boolean(r),ref:g,onKeyDown:E},h.map((e=>a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable force-rounded-corners",onClick:()=>d(e)},(0,v.YC)(e)?a.ZP.createElement(Re.Z,{status:e===t?m("SavedMessagesInfo"):void 0,userId:e}):a.ZP.createElement(Ae.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))})),Be=(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}}))((({chatsById:e,activeListIds:t,archivedListIds:n,pinnedIds:o,contactIds:i,currentUserId:l,isOpen:c})=>{const{setForwardChatId:d,exitForwardMode:m,loadMoreChats:h}=(0,s.uC)(),Z=(0,u.Z)(),[P,g]=(0,a.eJ)(""),p=(0,a.sO)(null),E=(0,a.Ye)((()=>{if(!c)return;let a=o||[];l&&(a=(0,me.Tw)([l,...a]));const d=[...t||[],...n||[]].filter((t=>{const n=e[t];return n&&(0,v.Qm)(n,r._f)})),m=(0,s.Rd)().users.byId;return(0,v.ih)((0,me.Tw)([...(0,v.$l)(Z,d,e,P,l),...i?(0,v.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,Ie.Z)(E);return a.ZP.createElement(Fe,{currentUserId:l,isOpen:c,chatOrUserIds:f,filterRef:p,filterPlaceholder:Z("ForwardTo"),filter:P,onFilterChange:g,loadMore:h,onSelectChatOrUser:C,onClose:m})})));var $e=n(1947),De=n(706);function xe(e){return e.isSlowMode?"Slowmode enabled":e.hasErrorKey?"Something went wrong":"Telegram"}const Ue=(0,a.X$)((0,s.c$)((e=>(0,me.ei)(e,["dialogs"])))((({dialogs:e})=>{const{dismissDialog:t,acceptInviteConfirmation:n,sendMessage:r}=(0,s.uC)(),[o,i,l]=(0,De.Z)(),c=(0,u.Z)();var d,m,h;if((0,a.d4)((()=>{e.length>0&&i()}),[e,i]),e.length)return a.ZP.createElement("div",{id:"Dialogs"},Boolean(e.length)&&("hash"in(d=e[e.length-1])?(e=>{const{hash:s,title:r,about:i,participantsCount:d,isChannel:m,photo:u,isRequestNeeded:h}=e,P=c(m?"Subscribers":"Members",d,"i"),v=c(m?"ChannelJoin":"JoinGroup"),g=c(m?"MemberRequests.RequestToJoinChannel":"MemberRequests.RequestToJoinGroup");return a.ZP.createElement(ke.Z,{isOpen:o,onClose:l,className:"error",header:Z(r,u),onCloseAnimationEnd:t},i&&a.ZP.createElement("p",{className:"modal-about"},(0,ve.Z)(i)),void 0!==d&&a.ZP.createElement("p",null,P),h&&a.ZP.createElement("p",{className:"modal-help"},c(m?"MemberRequests.RequestToJoinDescriptionChannel":"MemberRequests.RequestToJoinDescriptionGroup")),a.ZP.createElement(L.Z,{isText:!0,className:"confirm-dialog-button",onClick:()=>{n({hash:s}),l()}},h?g:v),a.ZP.createElement(L.Z,{isText:!0,className:"confirm-dialog-button",onClick:l},c("Cancel")))})(d):"phoneNumber"in d?(m=d,a.ZP.createElement(ke.Z,{isOpen:o,onClose:l,className:"confirm",title:c("ShareYouPhoneNumberTitle"),onCloseAnimationEnd:t},c("AreYouSureShareMyContactInfoBot"),a.ZP.createElement("div",null,a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:()=>{r({contact:(0,me.ei)(m,["firstName","lastName","phoneNumber"])}),l()}},c("OK")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:l},c("Cancel"))))):(h=d,a.ZP.createElement(ke.Z,{isOpen:o,onClose:l,onCloseAnimationEnd:t,className:"error",title:xe(h)},h.hasErrorKey?(0,$e.ZP)(h):(0,ve.Z)(h.message,["emoji","br"]),a.ZP.createElement("div",null,a.ZP.createElement(L.Z,{isText:!0,onClick:l},c("OK")))))));function Z(e,t){return a.ZP.createElement("div",{className:"modal-header"},t&&a.ZP.createElement(ge.Z,{size:"small",photo:t}),a.ZP.createElement("div",{className:"modal-title"},(0,ve.Z)(e)),a.ZP.createElement(L.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:c("Close"),onClick:l},a.ZP.createElement("i",{className:"icon-close"})))}})));var Oe=n(6937);const Ge=(0,a.X$)((0,s.c$)((e=>(0,me.ei)(e,["notifications"])))((({notifications:e})=>{const{dismissNotification:t}=(0,s.uC)();if(e.length)return a.ZP.createElement("div",{id:"Notifications"},e.map((({message:e,localId:n})=>a.ZP.createElement(Oe.Z,{message:(0,ve.Z)(e,["emoji","br","links","simple_markdown"]),onDismiss:()=>t({localId:n})}))))})));var Je=n(1396),Xe=n(7551);const _e=(0,a.X$)((({url:e})=>{const{toggleSafeLinkModal:t}=(0,s.uC)(),n=(0,u.Z)(),r=(0,a.I4)((()=>{window.open((0,Je.X)(e)),t({url:void 0})}),[t,e]),o=(0,a.I4)((()=>{t({url:void 0})}),[t]),i=(0,Ie.Z)(e);return a.ZP.createElement(Xe.Z,{isOpen:Boolean(e),onClose:o,title:n("OpenUrlTitle"),textParts:(0,ve.Z)(n("OpenUrlAlert2",i),["links"]),confirmLabel:n("OpenUrlTitle"),confirmHandler:r})})),ze=2147483647e3,Ye=["lng_weekday1","lng_weekday2","lng_weekday3","lng_weekday4","lng_weekday5","lng_weekday6","lng_weekday7"];function He(e,t,n,a,s){const r=new Date(e,t,n),o=a&&(0,K.$Y)(a),i=s&&(0,K.$Y)(s);return!!(i&&r>i)||!!(o&&r{const Z=(0,u.Z)(),v=new Date,g=(0,a.Ye)((()=>s&&!t?new Date:new Date(Math.max(t||0,0))),[s,t]),p=(0,a.Ye)((()=>r&&!n?new Date:new Date(Math.min(n||ze,ze))),[r,n]),E=(0,a.Ye)((()=>e?new Date(e):new Date),[e]),C=(0,P.Z)(o),[f,b,I]=(0,De.Z)(!1),[y,N]=(0,a.eJ)(E),[S,w]=(0,a.eJ)(new Date(y.getFullYear(),y.getMonth(),1)),[k,M]=(0,a.eJ)(Ve(E.getHours())),[T,A]=(0,a.eJ)(Ve(E.getMinutes())),R=je(y.getFullYear(),y.getMonth(),y.getDate()),F=S.getFullYear(),B=S.getMonth();(0,a.d4)((()=>{!C&&o&&(N(E),w(new Date(E.getFullYear(),E.getMonth(),1)),i&&(M(Ve(E.getHours())),A(Ve(E.getMinutes()))))}),[E,o,C,i]),(0,a.d4)((()=>{s&&!f&&y.getTime(){r&&!f&&y.getTime()>p.getTime()&&(N(p),M(Ve(p.getHours())),A(Ve(p.getMinutes())))}),[s,r,f,p,g,y]),(0,a.d4)((()=>{if(e){const t=new Date(e);N(t),M(Ve(t.getHours())),A(Ve(t.getMinutes()))}}),[e]);const $=r&&F>=v.getFullYear()&&B>=v.getMonth()||p&&F>=p.getFullYear()&&B>=p.getMonth(),D=s&&F<=v.getFullYear()&&B<=v.getMonth(),{prevMonthGrid:x,currentMonthGrid:U,nextMonthGrid:O}=(0,a.Ye)((()=>function(e,t){const n=[],a=[],s=[],r=new Date;r.setDate(1),r.setMonth(t),r.setFullYear(e);const o=r.getDay(),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}}(F,B)),[B,F]),G=(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),23)),a=new Date(y.getTime());a.setHours(n),N(a);const s=Ve(n);M(s),e.target.value=s}),[y]),J=(0,a.I4)((e=>{const t=e.target.value.replace(/[^\d]+/g,"");if(!t.length)return A(""),void(e.target.value="");const n=Math.max(0,Math.min(Number(t),59)),a=new Date(y.getTime());a.setMinutes(n),N(a);const s=Ve(n);A(s),e.target.value=s}),[y]);return a.ZP.createElement(ke.Z,{isOpen:o,onClose:d,className:"CalendarModal"},a.ZP.createElement("div",{className:"container"},a.ZP.createElement("div",{className:"month-selector"},a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:d},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h4",null,Z(`lng_month${B+1}`)," ",F),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",disabled:D,onClick:D?void 0:function(){w((e=>{const t=new Date(e);return t.setMonth(t.getMonth()-1),t}))}},a.ZP.createElement("i",{className:"icon-previous"})),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",disabled:$,onClick:$?void 0:function(){w((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"},Ye.map((e=>a.ZP.createElement("div",{className:"day-button faded weekday"},a.ZP.createElement("span",null,Z(e))))),x.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))),U.map((e=>a.ZP.createElement("div",{role:"button",tabIndex:0,onClick:()=>{return t=e,void N((e=>{const n=new Date(e);return n.setDate(t),n.setMonth(B),n.setFullYear(F),n}));var t},className:(0,X.Z)("day-button",He(F,B,e,g,p)?"disabled":e?"clickable":"",R===je(F,B,e)&&"selected")},!!e&&a.ZP.createElement("span",null,e)))),O.map((e=>a.ZP.createElement("div",{className:"day-button disabled"},a.ZP.createElement("span",null,e)))))),i&&a.ZP.createElement("div",{className:"timepicker"},a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:k,onChange:G,onFocus:b,onBlur:I}),":",a.ZP.createElement("input",{type:"text",className:"form-control",inputMode:"decimal",value:T,onChange:J,onFocus:b,onBlur:I})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(L.Z,{onClick:function(){m(y)}},l||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)(e,t)):e("Conversation.ScheduleMessage.SendOn",[n,(0,K.mr)(e,t)])}(Z,y)),c&&a.ZP.createElement(L.Z,{onClick:h,isText:!0},c)))})),qe=(0,a.X$)((0,s.c$)((e=>({selectedAt:e.historyCalendarSelectedAt})))((({isOpen:e,selectedAt:t})=>{const{searchMessagesByDate:n,closeHistoryCalendar:r}=(0,s.uC)(),o=(0,a.I4)((e=>{n({timestamp:e.valueOf()/1e3}),r()}),[r,n]),i=(0,u.Z)();return a.ZP.createElement(Ke,{isOpen:e,selectedAt:t,isPastMode:!0,submitButtonLabel:i("JumpToDate"),onClose:r,onSubmit:o})}))),We=(0,a.X$)((0,s.c$)(((e,{message:t,isSchedule:n})=>{const{threadId:a}=(0,g.Bt)(e)||{},{canDeleteForAll:s}=a&&(0,g._k)(e,t,a)||{},r=(0,g.Z1)(e,t.chatId);return{canDeleteForAll:!n&&s,contactName:r&&(0,v.YC)(r.id)?(0,v.Vl)((0,g.dy)(e,(0,v.zX)(r))):void 0,willDeleteForCurrentUserOnly:r&&(0,v.G9)(r)&&!s,willDeleteForAll:r&&(0,v.ZV)(r)}}))((({isOpen:e,isSchedule:t,message:n,album:r,canDeleteForAll:o,contactName:i,willDeleteForCurrentUserOnly:l,willDeleteForAll:c,onClose:d})=>{const{deleteMessages:m,deleteScheduledMessages:h}=(0,s.uC)(),Z=(0,a.I4)((()=>{const e=null!=r&&r.messages?r.messages.map((({id:e})=>e)):[n.id];m({messageIds:e,shouldDeleteForAll:!0}),d()}),[m,n.id,d,r]),P=(0,a.I4)((()=>{const e=null!=r&&r.messages?r.messages.map((({id:e})=>e)):[n.id];t?h({messageIds:e}):m({messageIds:e,shouldDeleteForAll:!1}),d()}),[r,n.id,t,d,h,m]),v=(0,u.Z)();return a.ZP.createElement(ke.Z,{isOpen:e,onClose:d,onEnter:e&&!o?P:void 0,className:"delete",title:v("DeleteSingleMessagesTitle")},a.ZP.createElement("p",null,v("AreYouSureDeleteSingleMessage")),l&&a.ZP.createElement("p",null,v("lng_delete_for_me_chat_hint",1,"i")),c&&a.ZP.createElement("p",null,v("lng_delete_for_everyone_hint",1,"i")),o&&a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:Z},i&&(0,ve.Z)(v("Conversation.DeleteMessagesFor",i)),!i&&v("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:P},v(o?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:d},v("Cancel")))}))),Qe=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,v.YC)(t),a=(0,g.FM)(e,t),s=(0,g.Z1)(e,t),r=!!s&&(0,v.eA)(s),o=!!s&&(0,v.G9)(s),i=!!s&&(0,v.ZV)(s);return{isPrivateChat:n,isChatWithSelf:a,isChannel:r,isGroup:o,isSuperGroup:i,canPinForAll:n&&!a||i||o,contactName:s&&(0,v.YC)(s.id)?(0,v.Vl)((0,g.dy)(e,(0,v.zX)(s))):void 0}}))((({isOpen:e,messageId:t,chatId:n,isChannel:r,isGroup:o,isSuperGroup:i,canPinForAll:l,contactName:c,onClose:d})=>{const{pinMessage:m}=(0,s.uC)(),h=(0,a.I4)((()=>{m({chatId:n,messageId:t,isUnpin:!1}),d()}),[m,n,t,d]),Z=(0,a.I4)((()=>{m({chatId:n,messageId:t,isUnpin:!1,isOneSide:!0,isSilent:!0}),d()}),[n,t,d,m]),P=(0,u.Z)();return a.ZP.createElement(ke.Z,{isOpen:e,onClose:d,className:"pin",title:P("PinMessageAlertTitle")},a.ZP.createElement("p",null,P(r?"PinMessageAlertChannel":o||i?"PinMessageAlert":"PinMessageAlertChat")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:Z},P("DialogPin")),l&&a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:h},c?(0,ve.Z)(P("Conversation.PinMessagesFor",c)):P("Conversation.PinMessageAlert.PinAndNotifyMembers")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:d},P("Cancel")))}))),et=(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(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:s},r("DialogUnpin")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:n},r("Cancel")))}));var tt=n(517);const nt=(0,a.X$)((0,s.c$)(((e,{isSchedule:t})=>{const{messageIds:n}=e.selectedMessages||{},{canDeleteForAll:a}=(0,g.xl)(e),s=(0,g.jr)(e);return{selectedMessageIds:n,canDeleteForAll:!t&&a,contactName:s&&(0,v.YC)(s.id)?(0,v.Vl)((0,g.dy)(e,(0,v.zX)(s))):void 0,willDeleteForCurrentUserOnly:s&&(0,v.G9)(s)&&!a,willDeleteForAll:s&&(0,v.ZV)(s)}}))((({isOpen:e,isSchedule:t,selectedMessageIds:n,canDeleteForAll:r,contactName:o,willDeleteForCurrentUserOnly:i,willDeleteForAll:l,onClose:c})=>{const{deleteMessages:d,deleteScheduledMessages:m,exitMessageSelectMode:h}=(0,s.uC)(),Z=(0,P.Z)(e),v=(0,a.I4)((()=>{c(),d({messageIds:n,shouldDeleteForAll:!0})}),[d,n,c]),g=(0,a.I4)((()=>{t?m({messageIds:n}):d({messageIds:n,shouldDeleteForAll:!1}),c()}),[t,c,m,n,d]),p=(0,u.Z)();if((0,a.d4)((()=>{!e&&Z&&h()}),[h,e,Z]),n)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:c,onEnter:r?void 0:g,className:"delete",title:p("Conversation.DeleteManyMessages")},a.ZP.createElement("p",null,p("AreYouSureDeleteFewMessages")),i&&a.ZP.createElement("p",null,"This will delete them just for you, not for other participants in the chat."),l&&a.ZP.createElement("p",null,"This will delete them for everyone in this chat."),r&&a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:v},o?(0,ve.Z)(p("ChatList.DeleteForEveryone",o)):p("Conversation.DeleteMessagesForEveryone")),a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:g},p(r?"ChatList.DeleteForCurrentUser":"Delete")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:c},p("Cancel")))})));var at=n(4434);const st=(0,a.X$)((({isOpen:e,messageIds:t,onClose:n})=>{const{reportMessages:r,exitMessageSelectMode:o}=(0,s.uC)(),[i,l]=(0,a.eJ)("spam"),[c,d]=(0,a.eJ)(""),m=()=>{r({messageIds:t,reason:i,description:c}),o(),n()},h=(0,a.I4)((e=>{l(e)}),[]),Z=(0,a.I4)((e=>{d(e.target.value)}),[]),P=(0,u.Z)(),v=[{value:"spam",label:P("lng_report_reason_spam")},{value:"violence",label:P("lng_report_reason_violence")},{value:"pornography",label:P("lng_report_reason_pornography")},{value:"childAbuse",label:P("lng_report_reason_child_abuse")},{value:"copyright",label:P("ReportPeer.ReasonCopyright")},{value:"other",label:P("lng_report_reason_other")}];if(t)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:n,onEnter:e?m:void 0,className:"report",title:P("lng_report_message_title")},a.ZP.createElement(at.Z,{name:"report-message",options:v,onChange:h,selected:i}),a.ZP.createElement(Me.Z,{label:P("lng_report_reason_description"),value:c,onChange:Z}),a.ZP.createElement(L.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:m},P("lng_report_button")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:n},P("Cancel")))})),rt=(0,a.X$)((0,s.c$)((e=>{const{type:t,chatId:n}=(0,g.Bt)(e)||{},{canDelete:a}=(0,g.xl)(e),s=(0,g.nB)(e),r=(0,g.Nu)(e),{messageIds:o}=e.selectedMessages||{},i=!!n&&(0,g.ku)(e,n,o);return{isSchedule:"scheduled"===t,selectedMessagesCount:(0,g.D7)(e),canDeleteMessages:a,canReportMessages:s,canDownloadMessages:r,selectedMessageIds:o,hasProtectedMessage:i}}))((({canPost:e,isActive:t,messageListType:n,isSchedule:r,selectedMessagesCount:o,canDeleteMessages:i,canReportMessages:l,canDownloadMessages:c,hasProtectedMessage:d,selectedMessageIds:m})=>{const{exitMessageSelectMode:h,openForwardMenuForSelectedMessages:Z,downloadSelectedMessages:v}=(0,s.uC)(),[g,p,E]=(0,De.Z)(),[C,f,b]=(0,De.Z)();(0,a.d4)((()=>!t||g||C?void 0:(0,tt.Z)({onBackspace:p,onDelete:p,onEsc:h})),[t,g,C,p,h]);const I=(0,a.I4)((()=>{v(),h()}),[v,h]),y=(0,P.Z)(o||void 0,!0),N=t?o:y,S=(0,u.Z)(),w=S("VoiceOver.Chat.MessagesSelected",N,"i"),k=(0,X.Z)("MessageSelectToolbar",e&&"with-composer",t&&"shown"),M=(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:k},a.ZP.createElement("div",{className:"MessageSelectToolbar-inner"},a.ZP.createElement(L.Z,{color:"translucent",round:!0,onClick:h,ariaLabel:"Exit select mode"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("span",{className:"MessageSelectToolbar-count",title:w},w),!!o&&a.ZP.createElement("div",{className:"MessageSelectToolbar-actions"},"scheduled"!==n&&M("forward",S("Chat.ForwardActionHeader"),Z,d),l&&M("flag",S("Conversation.ReportMessages"),f),c&&M("download",S("lng_media_download"),I,d),M("delete",S("EditAdminGroupDeleteMessages"),p,!i,!0))),a.ZP.createElement(nt,{isOpen:g,isSchedule:r,onClose:E}),a.ZP.createElement(st,{isOpen:C,onClose:b,messageIds:m}))}))),ot=(0,a.X$)((0,s.c$)((e=>{var t;const{chatId:n,messageId:a}=e.seenByModal||{};return n&&a?{memberIds:null===(t=(0,g.hj)(e,n,a))||void 0===t?void 0:t.seenByUserIds}:{}}))((({isOpen:e,memberIds:t})=>{const{openChat:n,closeSeenByModal:r}=(0,s.uC)(),o=(0,u.Z)(),i=(0,a.I4)((e=>{r(),setTimeout((()=>{n({id:e})}),100)}),[r,n]),l=(0,Ie.Z)(t,!0);return a.ZP.createElement(ke.Z,{isOpen:e,onClose:r,className:"narrow",title:"Which users read the message"},a.ZP.createElement("div",{dir:o.isRtl?"rtl":void 0},l&&l.map((e=>a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable scroll-item small-icon",onClick:()=>i(e)},a.ZP.createElement(Re.Z,{userId:e,noStatusOrTyping:!0}))))),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:r},o("Close")))})));var it=n(2155),lt=n(8198);const ct=(0,a.X$)((0,s.c$)((e=>{const{chatId:t,messageId:n}=e.reactorModal||{},a=t&&n?(0,g.hj)(e,t,n):void 0;return{chatId:t,messageId:n,reactions:null==a?void 0:a.reactions,reactors:null==a?void 0:a.reactors,seenByUserIds:null==a?void 0:a.seenByUserIds}}))((({isOpen:e,reactors:t,reactions:n,chatId:r,messageId:i,seenByUserIds:l})=>{const{loadReactors:c,closeReactorListModal:d,openChat:m}=(0,s.uC)(),h=(0,s.Rd)().users.byId,Z=(0,u.Z)(),[P,g,p]=(0,De.Z)(!1),[E,C]=(0,a.eJ)(void 0),f=t&&n&&t.count>=10&&n.results.length>1,b=(0,a.sO)();(0,a.d4)((()=>{P&&!e&&(p(),C(void 0))}),[P,e,p]);const I=(0,a.I4)((()=>{b.current&&m({id:b.current}),d()}),[d,m]),y=(0,a.I4)((()=>{g()}),[g]),N=(0,a.I4)((e=>{b.current=e,y()}),[y]),S=(0,a.I4)((()=>{c({chatId:r,messageId:i})}),[r,c,i]),w=(0,a.Ye)((()=>null!=t&&t.reactions?(0,me.Tw)(t.reactions.map((e=>e.reaction))):[]),[null==t?void 0:t.reactions]),k=(0,a.Ye)((()=>E?null==t?void 0:t.reactions.filter((e=>e.reaction===E)).map((e=>e.userId)):(0,me.Tw)((null==t?void 0:t.reactions.map((e=>e.userId)).concat(l||[]))||[])),[E,null==t?void 0:t.reactions,l]),[M,T]=(0,ye.Z)(S,k,t&&void 0===t.nextOffset);return(0,a.d4)((()=>{null==T||T({direction:o.Uq.Backwards})}),[T]),a.ZP.createElement(ke.Z,{isOpen:e&&!P,onClose:y,className:"ReactorListModal narrow",title:Z("Reactions"),onCloseAnimationEnd:I},f&&a.ZP.createElement("div",{className:"Reactions"},a.ZP.createElement(L.Z,{className:(0,X.Z)(!E&&"chosen"),size:"tiny",ripple:!0,onClick:()=>C(void 0)},a.ZP.createElement("i",{className:"icon-reaction-filled"}),(null==t?void 0:t.count)&&(0,it.bi)(t.count)),w.map((e=>{var t;const s=null==n||null===(t=n.results.find((t=>t.reaction===e)))||void 0===t?void 0:t.count;return a.ZP.createElement(L.Z,{className:(0,X.Z)(E===e&&"chosen"),size:"tiny",ripple:!0,onClick:()=>C(e)},a.ZP.createElement(lt.Z,{reaction:e,className:"reaction-filter-emoji"}),s&&(0,it.bi)(s))}))),a.ZP.createElement("div",{dir:Z.isRtl?"rtl":void 0},null!=M&&M.length?a.ZP.createElement(Te.Z,{className:"reactor-list custom-scroll",items:M,onLoadMore:T},null==M?void 0:M.map((e=>{var n;const s=h[e],r=(0,v.Js)(s),o=null==t||null===(n=t.reactions.find((t=>t.userId===e)))||void 0===n?void 0:n.reaction;return a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable reactors-list-item",onClick:()=>N(e)},a.ZP.createElement(ge.Z,{user:s,size:"medium"}),a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},r&&(0,ve.Z)(r))),o&&a.ZP.createElement(lt.Z,{className:"reactors-list-emoji",reaction:o}))}))):a.ZP.createElement(we.Z,null)),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:d},Z("Close")))})));var dt=n(7324),mt=n(7799);const ut=(0,a.X$)((0,s.c$)(((e,{emojiInteraction:t})=>{const n=void 0!==t.animatedEffect&&(0,g.tH)(e,t.animatedEffect);return{effectAnimationId:n?n.id:void 0,localEffectAnimation:!n&&t.animatedEffect&&Object.keys(dt.x).includes(t.animatedEffect)?t.animatedEffect:void 0,isReversed:t.isReversed}}))((({emojiInteraction:e,effectAnimationId:t,localEffectAnimation:n,isReversed:o})=>{const{stopActiveEmojiInteraction:i}=(0,s.uC)(),[l,c]=(0,De.Z)(!1),[m,u]=(0,De.Z)(!1),Z=(0,a.I4)((()=>{c(),setTimeout((()=>{i()}),250)}),[c,i]);(0,a.d4)((()=>(document.addEventListener("touchstart",Z),document.addEventListener("touchmove",Z),document.addEventListener("mousedown",Z),document.addEventListener("wheel",Z),()=>{document.removeEventListener("touchstart",Z),document.removeEventListener("touchmove",Z),document.removeEventListener("mousedown",Z),document.removeEventListener("wheel",Z)})),[Z]),(0,a.bt)((()=>{const e=(0,d.YW)();setTimeout((()=>{Z(),e()}),3e3)}),[Z]);const P=(0,h.Z)(`sticker${t}`,!t,r.IU.Lottie),[v,g]=(0,a.eJ)();(0,a.d4)((()=>{n&&(0,dt.Z)(n).then((e=>{g(e)}))}),[n]);const p=(e.startSize||0)/240;return a.ZP.createElement("div",{className:(0,X.Z)("EmojiInteractionAnimation",l&&"hiding",m&&"playing",o&&"reversed"),style:`--scale: ${p}; --start-x: ${e.x}px; --start-y: ${e.y}px;`},a.ZP.createElement(mt.Z,{id:`effect_${t}`,size:240,animationData:v||P,play:m,isLowPriority:f.wZ,forceOnHeavyAnimation:!0,noLoop:!0,onLoad:u}))})));var ht=n(3133),Zt=n(735),Pt=n(1470);const vt=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 gt=n(329),pt=n(742);const Et=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t),a=n&&(0,v.zX)(n);return{chat:n,user:a?(0,g.dy)(e,a):void 0,isPinned:(0,g.ep)(e,t),isMuted:n?(0,v.i4)(n,(0,g.dZ)(e),(0,g.NJ)(e)):void 0}}))((({chatId:e,chat:t,user:n,isPinned:s,isMuted:r,withUsername:o,onClick:i})=>{const[l,c,d]=(0,De.Z)(),[m,u,h]=(0,De.Z)(),Z=(0,Pt.Z)({chat:t,user:n,isPinned:s,isMuted:r,handleDelete:c,handleChatFolderChange:u},!0),P=()=>{i(e)},g=vt(P);if(t)return a.ZP.createElement(Le.Z,{className:"chat-item-clickable search-result",onClick:P,contextActions:Z,buttonRef:g},(0,v.YC)(e)?a.ZP.createElement(Re.Z,{userId:e,withUsername:o,avatarSize:"large"}):a.ZP.createElement(Ae.Z,{chatId:e,withUsername:o,avatarSize:"large"}),a.ZP.createElement(gt.Z,{isOpen:l,onClose:d,chat:t}),a.ZP.createElement(pt.Z,{isOpen:m,onClose:h,chatId:e}))})));var Ct=n(8781);const ft=(0,G.P2)((e=>e()),6e4,!0),bt=(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}}))((({topUserIds:e,usersById:t,recentlyFoundChatIds:n,onReset:r})=>{const{loadTopUsers:o,loadContactList:i,openChat:l,addRecentlyFoundChatId:c,clearRecentlyFoundChats:d}=(0,s.uC)(),m=(0,a.sO)(null);(0,a.d4)((()=>{ft((()=>{o(),i()}))}),[o,i]),(0,Ct.Z)(m.current,!e);const h=(0,a.I4)((e=>{l({id:e,shouldReplaceHistory:!0}),r(),setTimeout((()=>{c({id:e})}),250)}),[l,c,r]),Z=(0,u.Z)();return a.ZP.createElement("div",{className:"RecentContacts custom-scroll"},e&&a.ZP.createElement("div",{className:"top-peers-section",dir:Z.isRtl?"rtl":void 0},a.ZP.createElement("div",{ref:m,className:"top-peers no-selection"},e.map((e=>a.ZP.createElement("div",{className:"top-peer-item",onClick:()=>h(e),dir:Z.isRtl?"rtl":void 0},a.ZP.createElement(ge.Z,{user:t[e]}),a.ZP.createElement("div",{className:"top-peer-name"},(0,ve.Z)((0,v.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:Z.isRtl?"rtl":void 0},Z("Recent"),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",ariaLabel:"Clear recent chats",onClick:d,isRtl:Z.isRtl},a.ZP.createElement("i",{className:"icon-close"}))),n.map((e=>a.ZP.createElement(Et,{chatId:e,onClick:h})))))})));var It=n(9411),yt=n(8033);const Nt=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t);if(!n)return{};const a=(0,v.zX)(n);return{chat:n,lastSyncTime:e.lastSyncTime,...a&&{privateChatUser:(0,g.dy)(e,a)}}}))((({message:e,searchQuery:t,chatId:n,chat:r,privateChatUser:o,lastSyncTime:i})=>{const{focusMessage:l}=(0,s.uC)(),c=(0,v.DH)(e),d=(0,h.Z)((0,v.Ti)(e,"micro")),m=Boolean((0,v.Y5)(e)),Z=(0,a.I4)((()=>{l({chatId:n,messageId:e.id})}),[n,l,e.id]),P=(0,u.Z)(),g=vt(Z);if(r)return a.ZP.createElement(Le.Z,{className:"ChatMessage chat-item-clickable",ripple:!f.wB,onClick:Z,buttonRef:g},a.ZP.createElement(ge.Z,{chat:r,user:o,isSavedMessages:null==o?void 0:o.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,ve.Z)((0,v.U)(P,r,o))),r.isVerified&&a.ZP.createElement(It.Z,null)),a.ZP.createElement("div",{className:"message-date"},a.ZP.createElement(yt.Z,{className:"date"},(0,K.VX)(P,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,v.b7)(t)&&a.ZP.createElement("i",{className:"icon-play"}),(0,ve.Z)((0,v.MK)(e,t,!0),["emoji","highlight"],{highlight:s})):(0,ve.Z)((0,v.MK)(e,t))}(P,e,d||c,t,m)))))}))),St=(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 wt=n(7262),kt=n(9187);const Mt=(0,G.P2)((e=>e()),500,!0),Tt=(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}}))((({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:g,lastSyncTime:p,onReset:E,onSearchDateSelect:C})=>{const{openChat:b,addRecentlyFoundChatId:I,searchMessagesGlobal:y,setGlobalSearchChatId:N}=(0,s.uC)(),S=(0,u.Z)(),[w,k]=(0,a.eJ)(!1),[M,T]=(0,a.eJ)(!1),L=(0,a.I4)((({direction:t})=>{p&&t===o.Uq.Backwards&&Mt((()=>{y({type:"text",query:e})}))}),[p,y,e]),A=(0,a.I4)((e=>{b({id:e,shouldReplaceHistory:!0}),e!==r&&I({id:e}),f.wB||E()}),[r,b,I,E]),R=(0,a.I4)((e=>{N({id:e})}),[N]),F=(0,a.Ye)((()=>{if(!e||e.startsWith("@")&&e.length<2)return Zt.D;const t=[...r?[r]:[],...i||[]],n=(0,s.Rd)().users.byId,a=(0,v.kK)(t,n,e,r,S("SavedMessages"));return[...(0,v.ih)((0,me.Tw)([...a||[],...l||[],...c||[]]),P,void 0,r?[r]:void 0)]}),[e,r,i,S,l,c,P]),B=(0,a.Ye)((()=>!e||e.length<4||!d||!m?Zt.D:(0,v.ih)((0,me.Tw)([...d,...m]),P,!0)),[P,d,m,e]),$=(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)):Zt.D),[h,Z,e,t]),D=(0,a.I4)((()=>{k(!w)}),[w]),x=(0,a.I4)((()=>{T(!M)}),[M]),U=g&&!g.chats&&!g.messages&&!F.length&&!B.length&&!$.length;return e||t?a.ZP.createElement(Te.Z,{className:"LeftSearch custom-scroll",items:$,onLoadMore:L,noScrollRestoreOnTop:!0,noFastList:!0},n&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar"},a.ZP.createElement(St,{searchDate:n,onSelect:C})),U&&a.ZP.createElement(wt.Z,{text:S("ChatList.Search.NoResults"),description:S("ChatList.Search.NoResultsDescription")}),!!F.length&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar",dir:S.isRtl?"rtl":void 0},F.map((e=>a.ZP.createElement(kt.Z,{chatOrUserId:e,onClick:R,clickArg:e})))),!!F.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:S.isRtl?"auto":void 0},F.length>5&&a.ZP.createElement(yt.Z,{onClick:D},S(w?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),S("DialogList.SearchSectionDialogs")),F.map(((e,t)=>{if(w||!(t>=5))return a.ZP.createElement(Et,{chatId:e,onClick:A})}))),!!B.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:S.isRtl?"auto":void 0},B.length>5&&a.ZP.createElement(yt.Z,{onClick:x},S(M?"ChatList.Search.ShowLess":"ChatList.Search.ShowMore")),S("DialogList.SearchSectionGlobal")),B.map(((e,t)=>{if(M||!(t>=5))return a.ZP.createElement(Et,{chatId:e,withUsername:!0,onClick:A})}))),!!$.length&&a.ZP.createElement("div",{className:"search-section"},a.ZP.createElement("h3",{className:"section-heading",dir:S.isRtl?"auto":void 0},S("SearchMessages")),$.map((function(t){const n=(0,v.MK)(S,t),s=P[t.chatId];if(n&&s)return a.ZP.createElement(Nt,{chatId:t.chatId,message:t,searchQuery:e})})))):a.ZP.createElement(bt,{onReset:E})}))),Lt=(0,G.P2)((e=>e()),500,!0),At=(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}}))((({searchQuery:e,currentUserId:t,dateSearchQuery:n,foundIds:r,globalMessagesByChatId:i,chatsById:l,fetchingStatus:c,lastSyncTime:d,onSearchDateSelect:m})=>{const{searchMessagesGlobal:h}=(0,s.uC)(),Z=(0,u.Z)(),P=(0,a.I4)((({direction:n})=>{d&&n===o.Uq.Backwards&&Lt((()=>{h({type:"text",query:e,chatId:t})}))}),[t,d,h,e]),g=(0,a.Ye)((()=>r&&0!==r.length?r.map((e=>{var t;const[n,a]=e.split("_");return null==i||null===(t=i[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean).sort(((e,t)=>t.date-e.date)):Zt.D),[r,i]),p=c&&!c.chats&&!c.messages&&!g.length;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:"search-content custom-scroll chat-list",items:g,onLoadMore:P,noFastList:!0},n&&a.ZP.createElement("div",{className:"chat-selection no-selection no-scrollbar"},a.ZP.createElement(St,{searchDate:n,onSelect:m})),p&&a.ZP.createElement(wt.Z,{text:Z("ChatList.Search.NoResults"),description:Z("ChatList.Search.NoResultsDescription")}),!!g.length&&g.map((function(t){const n=(0,v.MK)(Z,t),s=l[t.chatId];if(n&&s)return a.ZP.createElement(Nt,{chatId:t.chatId,message:t,searchQuery:e})}))))})));function Rt(e){return(t,n)=>{var a,s;const{byId:r}=t.chats,{byId:o}=t.users,{fetchingStatus:i,resultsByType:l,chatId:c}=t.globalSearch,d="audio"!==e?e:null!=n&&n.isVoice?"voice":"audio",{byChatId:m}=t.messages,u=null==l||null===(a=l[d])||void 0===a?void 0:a.foundIds,h=t.activeDownloads.byChatId;return{theme:(0,g.Pu)(t),isLoading:void 0===u||!!i&&Boolean(i.chats||i.messages),chatsById:r,usersById:o,globalMessagesByChatId:m,foundIds:u,searchChatId:c,activeDownloads:h,isChatProtected:c?null===(s=(0,g.Z1)(t,c))||void 0===s?void 0:s.isProtected:void 0,lastSyncTime:t.lastSyncTime}}}var Ft=n(7891),Bt=n(3709);const $t="media",Dt=(0,G.P2)((e=>e()),500,!0),xt=(0,a.X$)((0,s.c$)(Rt($t))((({searchQuery:e,searchChatId:t,isLoading:n,globalMessagesByChatId:r,foundIds:l,lastSyncTime:c,isChatProtected:d})=>{const{searchMessagesGlobal:m,openMediaViewer:h}=(0,s.uC)(),Z=(0,u.Z)(),P=(0,a.I4)((({direction:n})=>{c&&n===o.Uq.Backwards&&Dt((()=>{m({type:$t,query:e,chatId:t})}))}),[c,m,e,t]),v=(0,a.Ye)((()=>l&&r?l.map((e=>{var t;const[n,a]=e.split("_");return null===(t=r[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):Zt.D),[r,l]),g=(0,a.I4)(((e,t)=>{h({chatId:t,messageId:e,origin:o.bZ.SearchResult})}),[h]),p=(0,Ft.Z)([e],i.Y)&&!n,E=p&&l&&l.length>0&&!e,C=p&&l&&l.length>0&&e,f=(0,X.Z)("search-content custom-scroll",C&&"chat-list");return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:f,items:v,itemSelector:e?".ListItem":".Media",onLoadMore:P,noFastList:!0},!p&&a.ZP.createElement(we.Z,null),p&&(!l||0===l.length)&&a.ZP.createElement(wt.Z,{text:Z("ChatList.Search.NoResults"),description:Z("ChatList.Search.NoResultsDescription")}),E&&a.ZP.createElement("div",{className:"media-list",dir:Z.isRtl?"rtl":void 0},v.map((e=>a.ZP.createElement(Bt.Z,{key:e.id,idPrefix:"search-media",message:e,isProtected:d||e.isProtected,onClick:g})))),C&&v.map((e=>a.ZP.createElement(Nt,{key:e.id,chatId:e.chatId,message:e})))))})));var Ut=n(91),Ot=n(5418);const Gt="links",Jt=(0,G.P2)((e=>e()),500,!0),Xt=(0,a.X$)((0,s.c$)(Rt(Gt))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:r,usersById:l,globalMessagesByChatId:c,foundIds:d,lastSyncTime:m,isChatProtected:h})=>{const{searchMessagesGlobal:Z,focusMessage:P}=(0,s.uC)(),v=(0,u.Z)(),g=(0,a.I4)((({direction:n})=>{m&&n===o.Uq.Backwards&&Jt((()=>{Z({type:Gt,query:e,chatId:t})}))}),[m,Z,e,t]),p=(0,a.Ye)((()=>d&&c?d.map((e=>{var t;const[n,a]=e.split("_");return null===(t=c[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):Zt.D),[c,d]),E=(0,a.I4)(((e,t)=>{P({chatId:t,messageId:e})}),[P]),C=(0,Ft.Z)([e],i.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:"search-content documents-list custom-scroll",items:p,onLoadMore:g,noFastList:!0},!C&&a.ZP.createElement(we.Z,null),C&&(!d||0===d.length)&&a.ZP.createElement(wt.Z,{text:v("ChatList.Search.NoResults"),description:v("ChatList.Search.NoResultsDescription")}),C&&d&&d.length>0&&p.map(((e,t)=>{const n=0===t||(0,K.kj)(e.date)!==(0,K.kj)(p[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",dir:v.isRtl?"rtl":void 0,key:e.id},n&&a.ZP.createElement("p",{className:"section-heading",dir:v.isRtl?"rtl":void 0},(0,K.np)(v,new Date(1e3*e.date))),a.ZP.createElement(Ot.Z,{key:e.id,message:e,senderTitle:(0,Ut.F)(v,e,r,l),isProtected:h||e.isProtected,onMessageClick:E}))}))))})));var _t=n(2535);const zt="documents",Yt=(0,G.P2)((e=>e()),500,!0),Ht=(0,a.X$)((0,s.c$)(Rt(zt))((({searchQuery:e,searchChatId:t,isLoading:n,chatsById:r,usersById:l,globalMessagesByChatId:c,foundIds:d,activeDownloads:m,lastSyncTime:h})=>{const{searchMessagesGlobal:Z,focusMessage:P}=(0,s.uC)(),g=(0,u.Z)(),p=(0,a.I4)((({direction:n})=>{h&&n===o.Uq.Backwards&&Yt((()=>{Z({type:zt,query:e,chatId:t})}))}),[h,Z,e,t]),E=(0,a.Ye)((()=>d&&c?d.map((e=>{var t;const[n,a]=e.split("_"),s=null===(t=c[n])||void 0===t?void 0:t.byId[Number(a)];return s&&(0,v.aE)(s)?s:void 0})).filter(Boolean):Zt.D),[c,d]),C=(0,a.I4)(((e,t)=>{P({chatId:t,messageId:e})}),[P]),f=(0,Ft.Z)([e],i.Y)&&!n;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:"search-content documents-list custom-scroll",items:E,onLoadMore:p,noFastList:!0},!f&&a.ZP.createElement(we.Z,null),f&&(!d||0===d.length)&&a.ZP.createElement(wt.Z,{text:g("ChatList.Search.NoResults"),description:g("ChatList.Search.NoResultsDescription")}),f&&d&&d.length>0&&E.map(((e,t)=>{var n;const s=0===t||(0,K.kj)(e.date)!==(0,K.kj)(E[t-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:e.id},s&&a.ZP.createElement("p",{className:"section-heading"},(0,K.np)(g,new Date(1e3*e.date))),a.ZP.createElement(_t.Z,{message:e,withDate:!0,datetime:e.date,smaller:!0,sender:(0,Ut.F)(g,e,r,l),className:"scroll-item",onDateClick:C,isDownloading:null===(n=m[e.chatId])||void 0===n?void 0:n.includes(e.id)}))}))))})));var Vt=n(4752);const jt=(0,G.P2)((e=>e()),500,!0),Kt=(0,a.X$)((0,s.c$)(Rt("audio"))((({theme:e,isVoice:t,searchQuery:n,searchChatId:r,isLoading:l,chatsById:c,usersById:d,globalMessagesByChatId:m,foundIds:h,lastSyncTime:Z,activeDownloads:P})=>{const{searchMessagesGlobal:v,focusMessage:g,openAudioPlayer:p}=(0,s.uC)(),E=(0,u.Z)(),C=t?"voice":"audio",f=(0,a.I4)((({direction:e})=>{Z&&e===o.Uq.Backwards&&jt((()=>{v({type:C,query:n,chatId:r})}))}),[C,Z,v,n,r]),b=(0,a.Ye)((()=>h&&m?h.map((e=>{var t;const[n,a]=e.split("_");return null===(t=m[n])||void 0===t?void 0:t.byId[Number(a)]})).filter(Boolean):Zt.D),[m,h]),I=(0,a.I4)(((e,t)=>{g({chatId:t,messageId:e})}),[g]),y=(0,a.I4)(((e,t)=>{p({chatId:t,messageId:e})}),[p]),N=(0,Ft.Z)([n],i.Y)&&!l;return a.ZP.createElement("div",{className:"LeftSearch"},a.ZP.createElement(Te.Z,{className:"search-content documents-list custom-scroll",items:b,onLoadMore:f,noFastList:!0},!N&&a.ZP.createElement(we.Z,null),N&&(!h||0===h.length)&&a.ZP.createElement(wt.Z,{text:E("ChatList.Search.NoResults"),description:E("ChatList.Search.NoResultsDescription")}),N&&h&&h.length>0&&b.map(((t,n)=>{var s;const r=0===n||(0,K.kj)(t.date)!==(0,K.kj)(b[n-1].date);return a.ZP.createElement("div",{className:"ListItem small-icon",key:t.id},r&&a.ZP.createElement("p",{className:"section-heading",dir:E.isRtl?"rtl":void 0},(0,K.np)(E,new Date(1e3*t.date))),a.ZP.createElement(Vt.Z,{key:t.id,theme:e,message:t,origin:o.Cr.Search,senderTitle:(0,Ut.F)(E,t,c,d),date:t.date,lastSyncTime:Z,className:"scroll-item",onPlay:y,onDateClick:I,isDownloading:null===(s=P[t.chatId])||void 0===s?void 0:s.includes(t.id)}))}))))}))),qt=[{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"}],Wt=[{type:o.nJ.ChatList,title:"All Messages"},...qt.slice(1)],Qt=Object.keys(o.nJ).length/2,en=(0,a.X$)((0,s.c$)((e=>{const{currentContent:t,chatId:n}=e.globalSearch;return{currentContent:t,chatId:n}}))((({searchQuery:e,searchDate:t,isActive:n,currentContent:r=o.nJ.ChatList,chatId:i,onReset:l})=>{const{setGlobalSearchContent:c,setGlobalSearchDate:d}=(0,s.uC)(),h=(0,u.Z)(),[Z,P]=(0,a.eJ)(r),v=(0,a.Ye)((()=>(0,K.xk)(e)),[e]),g=(0,a.I4)((e=>{const t=qt[e];c({content:t.type}),P(e)}),[c]),p=(0,a.I4)((e=>{d({date:e.getTime()/1e3})}),[d]);(0,m.ZP)(n,l,void 0,void 0,!0);const E=(0,a.sO)(null),C=(0,Ne.Z)(E,n,void 0,".ListItem-button",!0);return a.ZP.createElement("div",{className:"LeftSearch",ref:E,onKeyDown:C},a.ZP.createElement(ht.Z,{activeTab:Z,tabs:i?Wt:qt,onSwitchTab:g}),a.ZP.createElement(R.Z,{name:h.isRtl?"slide-optimized-rtl":"slide-optimized",renderCount:Qt,activeKey:r},(()=>{switch(r){case o.nJ.ChatList:return i?a.ZP.createElement(At,{searchQuery:e,dateSearchQuery:v,onReset:l,onSearchDateSelect:p}):a.ZP.createElement(Tt,{searchQuery:e,searchDate:t,dateSearchQuery:v,onReset:l,onSearchDateSelect:p});case o.nJ.Media:return a.ZP.createElement(xt,{searchQuery:e});case o.nJ.Links:return a.ZP.createElement(Xt,{searchQuery:e});case o.nJ.Files:return a.ZP.createElement(Ht,{searchQuery:e});case o.nJ.Music:return a.ZP.createElement(Kt,{key:"audio",searchQuery:e});case o.nJ.Voice:return a.ZP.createElement(Kt,{key:"voice",isVoice:!0,searchQuery:e});default:return}})))})));var tn=n(1090);const nn={currentPassword:"",password:"",hint:"",email:""},an=(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 nn;default:return e}},sn=(0,a.X$)((({currentScreen:e,editedFolderId:t,onReset:n,onSaveFilter:r,onScreenSelect:i})=>{const{signOut:l,deleteChatFolder:c}=(0,s.uC)(),[d,m]=(0,a.eJ)(!1),[h,Z]=(0,a.eJ)(!1),P=(0,a.I4)((()=>{m(!0)}),[]),v=(0,a.I4)((()=>{m(!1)}),[]),g=(0,a.I4)((()=>{Z(!0)}),[]),p=(0,a.I4)((()=>{Z(!1)}),[]),E=(0,a.I4)((()=>{v(),l()}),[v,l]),C=(0,a.I4)((()=>{p(),c({id:t}),n()}),[t,p,c,n]),b=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(L.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"}))),[]),I=(0,u.Z)();return a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:n,ariaLabel:I("AccDescrGoBack")},a.ZP.createElement("i",{className:"icon-arrow-left"})),function(){switch(e){case o.MT.EditProfile:return a.ZP.createElement("h3",null,I("lng_settings_information"));case o.MT.General:return a.ZP.createElement("h3",null,I("General"));case o.MT.QuickReaction:return a.ZP.createElement("h3",null,I("DoubleTapSetting"));case o.MT.Notifications:return a.ZP.createElement("h3",null,I("Notifications"));case o.MT.DataStorage:return a.ZP.createElement("h3",null,I("DataSettings"));case o.MT.Privacy:return a.ZP.createElement("h3",null,I("PrivacySettings"));case o.MT.Language:return a.ZP.createElement("h3",null,I("Language"));case o.MT.GeneralChatBackground:return a.ZP.createElement("h3",null,I("ChatBackground"));case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement("h3",null,I("SetColor"));case o.MT.PrivacyPhoneNumber:return a.ZP.createElement("h3",null,I("PrivacyPhone"));case o.MT.PrivacyLastSeen:return a.ZP.createElement("h3",null,I("PrivacyLastSeen"));case o.MT.PrivacyProfilePhoto:return a.ZP.createElement("h3",null,I("Privacy.ProfilePhoto"));case o.MT.PrivacyForwarding:return a.ZP.createElement("h3",null,I("PrivacyForwards"));case o.MT.PrivacyGroupChats:return a.ZP.createElement("h3",null,I("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,I("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,I("NeverShareWith"));case o.MT.PrivacyActiveSessions:return a.ZP.createElement("h3",null,I("SessionsTitle"));case o.MT.PrivacyBlockedUsers:return a.ZP.createElement("h3",null,I("BlockedUsers"));case o.MT.TwoFaDisabled:case o.MT.TwoFaEnabled:return a.ZP.createElement("h3",null,I("TwoStepVerification"));case o.MT.TwoFaNewPassword:case o.MT.TwoFaChangePasswordNew:case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement("h3",null,I("PleaseEnterCurrentPassword"));case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement("h3",null,I("PleaseReEnterPassword"));case o.MT.TwoFaNewPasswordHint:case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement("h3",null,I("PasswordHint"));case o.MT.TwoFaNewPasswordEmail:case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement("h3",null,I("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,I("TwoStepVerificationPasswordSet"));case o.MT.TwoFaChangePasswordCurrent:case o.MT.TwoFaTurnOff:case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement("h3",null,I("PleaseEnterCurrentPassword"));case o.MT.Folders:return a.ZP.createElement("h3",null,I("Filters"));case o.MT.FoldersCreateFolder:return a.ZP.createElement("h3",null,I("FilterNew"));case o.MT.FoldersEditFolder:case o.MT.FoldersEditFolderFromChatList:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,I("FilterEdit")),t&&a.ZP.createElement(F.Z,{className:"settings-more-menu",trigger:b,positionX:"right"},a.ZP.createElement(B.Z,{icon:"delete",destructive:!0,onClick:g},I("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,I("FilterInclude")):a.ZP.createElement("h3",null,I("FilterExclude")),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",className:"color-primary",onClick:r,ariaLabel:I("AutoDeleteConfirm")},a.ZP.createElement("i",{className:"icon-check"})));default:return a.ZP.createElement("div",{className:"settings-main-header"},a.ZP.createElement("h3",null,I("SETTINGS")),a.ZP.createElement(L.Z,{round:!0,ripple:!f.wB,size:"smaller",color:"translucent",onClick:()=>i(o.MT.EditProfile),ariaLabel:I("lng_settings_information")},a.ZP.createElement("i",{className:"icon-edit"})),a.ZP.createElement(F.Z,{className:"settings-more-menu",trigger:b,positionX:"right"},a.ZP.createElement(B.Z,{icon:"logout",onClick:P},I("LogOutTitle"))))}}(),a.ZP.createElement(Xe.Z,{isOpen:d,onClose:v,text:I("lng_sure_logout"),confirmLabel:I("AccountSettings.Logout"),confirmHandler:E,confirmIsDestructive:!0}),a.ZP.createElement(Xe.Z,{isOpen:h,onClose:p,text:I("FilterDeleteAlert"),confirmLabel:I("Delete"),confirmHandler:C,confirmIsDestructive:!0}))}));var rn=n(787),on=n(180);const ln=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t,lastSyncTime:n}=e;return{currentUser:t?(0,g.dy)(e,t):void 0,lastSyncTime:n}}))((({isActive:e,onScreenSelect:t,onReset:n,currentUser:r,lastSyncTime:i})=>{const{loadProfilePhotos:l}=(0,s.uC)(),c=(0,u.Z)(),d=null==r?void 0:r.id;return(0,a.d4)((()=>{d&&i&&l({profileId:d})}),[i,d,l]),(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(rn.Z,{userId:r.id,forceShowSelf:!0}),r&&a.ZP.createElement(on.Z,{chatOrUserId:r.id,forceShowSelf:!0}),a.ZP.createElement(Le.Z,{icon:"settings",onClick:()=>t(o.MT.General)},c("Telegram.GeneralSettingsViewController")),a.ZP.createElement(Le.Z,{icon:"unmute",onClick:()=>t(o.MT.Notifications)},c("Notifications")),a.ZP.createElement(Le.Z,{icon:"lock",onClick:()=>t(o.MT.Privacy)},c("PrivacySettings")),a.ZP.createElement(Le.Z,{icon:"data",onClick:()=>t(o.MT.DataStorage)},c("DataSettings")),a.ZP.createElement(Le.Z,{icon:"folder",onClick:()=>t(o.MT.Folders)},c("Filters")),a.ZP.createElement(Le.Z,{icon:"language",onClick:()=>t(o.MT.Language)},c("Language"))))})));var cn=n(710),dn=n(1151);const mn="https://t.me/",un=/https:\/\/t\.me\/?/i,hn=/^([a-zA-Z0-9_]+)$/,Zn=(0,G.Ds)((e=>e()),250,!1),Pn=(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`]:hn.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(un,"");l(n),e.target.value=`${t?mn:""}${n}`;const a=function(e){return e.length>=5&&e.length<=32&&hn.test(e)}(n);a&&Zn((()=>{r({username:n})})),o&&o(!!a&&n)}),[t,r,o]);return a.ZP.createElement(Me.Z,{value:`${t?mn:""}${i}`,onChange:P,label:m,error:Z,success:h,readOnly:n})})),vn=(0,G.P2)((e=>e()),6e4,!0),gn="Please provide your first name",pn="Bio can' be longer than 70 characters",En=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e,{progress:n,isUsernameAvailable:a}=e.profileEdit||{},s=t?(0,g.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,v.RT)(s),currentFirstName:r,currentLastName:o,currentBio:c,currentUsername:i,progress:n,isUsernameAvailable:a}}))((({isActive:e,onScreenSelect:t,onReset:n,currentAvatarHash:i,currentFirstName:l,currentLastName:c,currentBio:d,currentUsername:Z,progress:P,isUsernameAvailable:v})=>{const{loadCurrentUser:g,updateProfile:p,checkUsername:E}=(0,s.uC)(),C=(0,u.Z)(),[f,b]=(0,a.eJ)(!1),[I,y]=(0,a.eJ)(!1),[N,S]=(0,a.eJ)(),[w,k]=(0,a.eJ)(),[M,T]=(0,a.eJ)(l||""),[L,A]=(0,a.eJ)(c||""),[R,F]=(0,a.eJ)(d||""),[B,$]=(0,a.eJ)(Z||""),D=(0,h.Z)(i,!1,r.IU.BlobUrl),x=P===o.rN.InProgress,U=!1===B,O=(0,a.Ye)((()=>!U&&(Boolean(w)||I||!0===v)),[w,I,U,v]);(0,m.ZP)(e,n,t,o.MT.EditProfile),(0,a.d4)((()=>{vn((()=>{g()}))}),[g]),(0,a.d4)((()=>{k(void 0)}),[D]),(0,a.d4)((()=>{T(l||""),A(c||""),F(d||"")}),[l,c,d]),(0,a.d4)((()=>{$(Z||"")}),[Z]),(0,a.d4)((()=>{P===o.rN.Complete&&(y(!1),b(!1),S(void 0))}),[P]);const G=(0,a.I4)((e=>{k(e)}),[]),X=(0,a.I4)((e=>{T(e.target.value),y(!0)}),[]),_=(0,a.I4)((e=>{A(e.target.value),y(!0)}),[]),z=(0,a.I4)((e=>{F(e.target.value),y(!0)}),[]),Y=(0,a.I4)((e=>{$(e),b(!0)}),[]),H=(0,a.I4)((()=>{const e=M.trim(),t=L.trim(),n=R.trim();e.length?n.length>70?S(pn):p({photo:w,...I&&{firstName:e,lastName:t,bio:n},...f&&{username:B}}):S(gn)}),[w,M,L,R,I,B,f,p]);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(cn.Z,{currentAvatarBlobUrl:D,onChange:G,title:"Edit your profile photo",disabled:x}),a.ZP.createElement(Me.Z,{value:M,onChange:X,label:C("FirstName"),disabled:x,error:N===gn?N:void 0}),a.ZP.createElement(Me.Z,{value:L,onChange:_,label:C("LastName"),disabled:x}),a.ZP.createElement(Me.Z,{value:R,onChange:z,label:C("UserBio"),disabled:x,error:N===pn?N:void 0}),a.ZP.createElement("p",{className:"settings-item-description",dir:C.isRtl?"rtl":void 0},(0,ve.Z)(C("lng_settings_about_bio"),["br","simple_markdown"]))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:C.isRtl?"rtl":void 0},C("Username")),a.ZP.createElement(Pn,{currentUsername:B||"",isLoading:x,isUsernameAvailable:v,checkUsername:E,onChange:Y}),a.ZP.createElement("p",{className:"settings-item-description",dir:C.isRtl?"rtl":void 0},(0,ve.Z)(C("UsernameHelp"),["br","simple_markdown"])),B&&a.ZP.createElement("p",{className:"settings-item-description",dir:C.isRtl?"rtl":void 0},C("lng_username_link"),a.ZP.createElement("br",null),a.ZP.createElement("span",{className:"username-link"},"https://t.me/",B)))),a.ZP.createElement(dn.Z,{isShown:O,onClick:H,disabled:x,ariaLabel:"Save changes"},x?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var Cn=n(4605),fn=n(8051);const bn=(0,a.X$)((0,s.c$)((e=>(0,me.ei)(e.settings.byKey,["canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoPlayGifs","canAutoPlayVideos","autoLoadFileMaxSizeMb"])))((({isActive:e,onScreenSelect:t,onReset:n,canAutoLoadPhotoFromContacts:r,canAutoLoadPhotoInPrivateChats:l,canAutoLoadPhotoInGroups:c,canAutoLoadPhotoInChannels:d,canAutoLoadVideoFromContacts:h,canAutoLoadVideoInPrivateChats:Z,canAutoLoadVideoInGroups:P,canAutoLoadVideoInChannels:v,canAutoLoadFileFromContacts:g,canAutoLoadFileInPrivateChats:p,canAutoLoadFileInGroups:E,canAutoLoadFileInChannels:C,canAutoPlayGifs:f,canAutoPlayVideos:b,autoLoadFileMaxSizeMb:I})=>{const{setSettingOption:y}=(0,s.uC)(),N=(0,u.Z)();(0,m.ZP)(e,n,t,o.MT.General);const S=(0,a.I4)((e=>N("AutodownloadSizeLimitUpTo",N("FileSize.MB",String(i.by[e]),"i"))),[N]),w=(0,a.I4)((e=>{y({autoLoadFileMaxSizeMb:i.by[e]})}),[y]);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:N.isRtl?"rtl":void 0},e),a.ZP.createElement(Cn.Z,{label:N("AutoDownloadSettings.Contacts"),checked:n,onCheck:e=>y({[`canAutoLoad${t}FromContacts`]:e})}),a.ZP.createElement(Cn.Z,{label:N("AutoDownloadSettings.PrivateChats"),checked:s,onCheck:e=>y({[`canAutoLoad${t}InPrivateChats`]:e})}),a.ZP.createElement(Cn.Z,{label:N("AutoDownloadSettings.GroupChats"),checked:r,onCheck:e=>y({[`canAutoLoad${t}InGroups`]:e})}),a.ZP.createElement(Cn.Z,{label:N("AutoDownloadSettings.Channels"),checked:o,onCheck:e=>y({[`canAutoLoad${t}InChannels`]:e})}),"File"===t&&function(){const e=i.by.indexOf(I);return a.ZP.createElement("div",{className:"pt-5"},a.ZP.createElement(fn.Z,{label:N("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(N("AutoDownloadPhotosTitle"),"Photo",r,l,c,d),k(N("AutoDownloadVideosTitle"),"Video",h,Z,P,v),k("Auto-download files","File",g,p,E,C),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("AutoplayMedia")),a.ZP.createElement(Cn.Z,{label:N("GifsTab2"),checked:f,onCheck:e=>y({canAutoPlayGifs:e})}),a.ZP.createElement(Cn.Z,{label:N("DataAndStorage.Autoplay.Videos"),checked:b,onCheck:e=>y({canAutoPlayVideos:e})})))}))),In=(0,G.P2)((e=>e()),6e4,!0),yn=(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,g.dZ)(e),notifyExceptions:(0,g.NJ)(e)}}))((({isActive:e,allListIds:t,chatsById:n,usersById:r,orderedFolderIds:l,foldersById:c,recommendedChatFolders:d,notifySettings:h,notifyExceptions:Z,onCreateFolder:P,onEditFolder:g,onScreenSelect:p,onReset:E})=>{const{loadRecommendedChatFolders:C,addChatFolder:f,showDialog:b}=(0,s.uC)(),[I,y]=(0,a.eJ)(),[N,S]=(0,a.eJ)(!1),w=(0,a.I4)((()=>S(!0)),[]);(0,a.d4)((()=>{I||(0,dt.Z)("FoldersAll").then(y)}),[I]),(0,a.d4)((()=>{In((()=>{C()}))}),[C]);const k=(0,a.I4)((()=>{Object.keys(c).length>=10?b({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):P()}),[c,b,P]),M=(0,u.Z)();(0,m.ZP)(e,E,p,o.MT.Folders);const T=(0,a.Ye)((()=>{if(l)return l.map((e=>{const a=c[e];return{id:a.id,title:a.title,subtitle:(0,v.SB)(M,t,n,r,a,h,Z)}}))}),[M,t,c,n,r,l,h,Z]),A=(0,a.I4)((e=>{Object.keys(c).length>=10?b({data:{message:"DIALOG_FILTERS_TOO_MUCH",hasErrorKey:!0}}):f({folder:e})}),[c,f,b]);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"},I&&a.ZP.createElement(mt.Z,{id:"settingsFoldersMain",size:i.ku,animationData:I,play:N,noLoop:!0,onLoad:w})),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},M("CreateNewFilterInfo")),a.ZP.createElement(L.Z,{className:"with-icon mb-2",color:"primary",size:"smaller",pill:!0,fluid:!0,onClick:k,isRtl:M.isRtl},a.ZP.createElement("i",{className:"icon-add"}),M("CreateNewFilter"))),a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:M.isRtl?"rtl":void 0},M("Filters")),null!=T&&T.length?T.map((e=>a.ZP.createElement(Le.Z,{className:"mb-2 no-icon",narrow:!0,multiline:!0,onClick:()=>g(c[e.id])},a.ZP.createElement("span",{className:"title"},e.title),a.ZP.createElement("span",{className:"subtitle"},e.subtitle)))):T&&!T.length?a.ZP.createElement("p",{className:"settings-item-description my-4",dir:"auto"},"You have no folders yet."):a.ZP.createElement(we.Z,null)),d&&!!d.length&&a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("h4",{className:"settings-item-header mb-3",dir:M.isRtl?"rtl":void 0},M("FilterRecommended")),d.map((e=>a.ZP.createElement(Le.Z,{className:"mb-2",narrow:!0,onClick:()=>A(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(L.Z,{className:"px-3",color:"primary",size:"tiny",pill:!0,fluid:!0,isRtl:M.isRtl},M("Add"))))))))})));var Nn=n(3455);const Sn=({count:e,itemName:t,itemPluralName:n,isLoading:s,onClick:r})=>{const o=(0,u.Z)();return a.ZP.createElement(L.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)},wn="Please provide a title for this folder.",kn="ChatList.Filter.Error.Empty",Mn=(0,a.X$)((0,s.c$)((e=>{const{listIds:t}=e.chats;return{loadedActiveChatIds:t.active,loadedArchivedChatIds:t.archived}}))((({state:e,dispatch:t,onAddIncludedChats:n,onAddExcludedChats:r,isActive:l,onScreenSelect:c,onReset:d,onBack:h,loadedActiveChatIds:Z,loadedArchivedChatIds:P})=>{const{editChatFolder:g,addChatFolder:p,loadMoreChats:E}=(0,s.uC)(),[C,f]=(0,a.eJ)(),[b,I]=(0,a.eJ)(!1),y=(0,a.I4)((()=>I(!0)),[]),[N,S]=(0,a.eJ)(!1),[w,k]=(0,a.eJ)(!1),{selectedChatIds:M,selectedChatTypes:T}=(0,Nn.vb)(e,"included"),{selectedChatIds:L,selectedChatTypes:A}=(0,Nn.vb)(e,"excluded");(0,a.d4)((()=>{C||(0,dt.Z)("FoldersNew").then(f)}),[C]),(0,a.d4)((()=>{S(!1),k(!1)}),[e.folderId]);const[R,F]=(0,a.Ye)((()=>{const e=new Set([...Z||[],...P||[]]),t=(0,me.eL)(M,e),n=(0,me.eL)(L,e);return[N?t:t.slice(0,5-T.length),w?n:n.slice(0,5-A.length)]}),[L,M,T,A,w,N,Z,P]);(0,a.d4)((()=>{(R.lengthS(!0):()=>k(!0);return a.ZP.createElement(a.ZP.Fragment,null,t.map((t=>function(e,t){const n="included"===t?Nn.fi.find((({key:t})=>t===e)):Nn.Yy.find((({key:t})=>t===e));if(n)return a.ZP.createElement(Le.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(Le.Z,{className:"settings-folders-list-item mb-1",narrow:!0,inactive:!0},(0,v.YC)(e)?a.ZP.createElement(Re.Z,{avatarSize:"small",userId:e}):a.ZP.createElement(Ae.Z,{avatarSize:"small",chatId:e})))),!s&&r>0&&a.ZP.createElement(Sn,{count:r,itemName:"chat",onClick:o}))}return(0,m.ZP)(l,h,c,"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"},C&&a.ZP.createElement(mt.Z,{id:"settingsFoldersEdit",size:i.ku,animationData:C,play:b&&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(Me.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===wn?wn:void 0})),a.ZP.createElement("div",{className:"settings-item no-border pt-3"},e.error&&e.error===kn&&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(Le.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(Le.Z,{className:"settings-folders-list-item color-primary mb-0",icon:"add",onClick:r},B("FilterAddChats")),$("excluded"))),a.ZP.createElement(dn.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?g({id:e.folderId,folderUpdate:e.folder}):p({folder:e.folder}),setTimeout((()=>{d()}),500)):t({type:"setError",payload:kn}):t({type:"setError",payload:wn})},ariaLabel:"edit"===e.mode?"Save changes":"Create folder"},e.isLoading?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))})));var Tn=n(5765);const Ln=(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?Nn.fi:Nn.Yy,h=n.length+s.length>10,Z=n.length>=100;(0,a.d4)((()=>{setTimeout((()=>{requestAnimationFrame((()=>{d.current.focus()}))}),500)}),[]);const P=(0,a.I4)((e=>{const t=[...n];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),o(t)}),[n,o]),g=(0,a.I4)((e=>{const t=[...s];t.includes(e)?t.splice(t.indexOf(e),1):t.push(e),i(t)}),[s,i]),p=(0,a.I4)((e=>{const{value:t}=e.currentTarget;l(t)}),[l]),E=(0,u.Z)(),[C,f]=(0,ye.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(kt.Z,{icon:t.icon,title:E(t.title),isMinimized:h,canClose:!0,onClick:g,clickArg:t.key})})),n.map(((e,t)=>a.ZP.createElement(kt.Z,{chatOrUserId:e,isMinimized:h&&tg(e.key),ripple:!0},a.ZP.createElement("i",{className:`icon-${e.icon}`}),a.ZP.createElement("h3",{className:"chat-type",dir:"auto"},E(e.title)),a.ZP.createElement(Cn.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(Le.Z,{key:e,className:"chat-item-clickable picker-list-item chat-item",onClick:()=>P(e),ripple:!0,disabled:!t&&Z},(0,v.YC)(e)?a.ZP.createElement(Re.Z,{userId:e}):a.ZP.createElement(Ae.Z,{chatId:e,withChatType:!0}),a.ZP.createElement(Cn.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"})))})),An=(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}}))((({isActive:e,onScreenSelect:t,onReset:n,mode:r,state:i,dispatch:l,chatsById:c,listIds:d,orderedPinnedIds:h,archivedListIds:Z,archivedPinnedIds:P})=>{const{loadMoreChats:g}=(0,s.uC)(),{chatFilter:p}=i,{selectedChatIds:E,selectedChatTypes:C}=(0,Nn.vb)(i,r,!0),f=(0,u.Z)(),b=(0,a.Ye)((()=>{const e=d?(0,v.O)(c,d,h,"all"):void 0,t=Z?(0,v.O)(c,Z,P,"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)||[]]}),[c,d,h,Z,P]),I=(0,a.Ye)((()=>{if(b)return b.filter((e=>!p||(0,Tn.Z)((0,v.U)(f,e),p)||E.includes(e.id))).map((({id:e})=>e))}),[b,p,f,E]),y=(0,a.I4)((e=>{l({type:"setChatFilter",payload:e})}),[l]),N=(0,a.I4)((e=>{l("included"===r?{type:"setIncludeFilters",payload:{...i.includeFilters,includedChatIds:e}}:{type:"setExcludeFilters",payload:{...i.excludeFilters,excludedChatIds:e}})}),[r,i,l]),S=(0,a.I4)((e=>{const t={};e.forEach((e=>{t[e]=!0})),l("included"===r?{type:"setIncludeFilters",payload:{includedChatIds:E,...t}}:{type:"setExcludeFilters",payload:{excludedChatIds:E,...t}})}),[r,E,l]);return(0,m.ZP)(e,n,t,"included"===r?o.MT.FoldersIncludedChats:o.MT.FoldersExcludedChats),I?a.ZP.createElement(Ln,{mode:r,chatIds:I,selectedIds:E,selectedChatTypes:C,filterValue:p,onSelectedIdsChange:N,onSelectedChatTypesChange:S,onFilterChange:y,onLoadMore:g}):a.ZP.createElement(we.Z,null)}))),Rn=(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(yn,{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(Mn,{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(An,{mode:"included",state:n,dispatch:s,onReset:c,onScreenSelect:i,isActive:r});case o.MT.FoldersExcludedChats:case o.MT.FoldersExcludedChatsFromChatList:return a.ZP.createElement(An,{mode:"excluded",state:n,dispatch:s,onReset:c,onScreenSelect:i,isActive:r});default:return}}));var Fn=n(711),Bn=n(3657),$n=n(692);const Dn=(0,a.X$)((({size:e=i.DC,stickerSet:t,observeIntersection:n})=>{const s=(0,a.sO)(null),o=(0,Bn.Op)(s,n),l=`stickerSet${t.id}`,c=(0,h.Z)(l,!o,r.IU.Lottie),d=(0,$n.Z)(c),m=(0,a.Ye)((()=>{if(!c)return(0,it.Xv)(t.title,2)}),[c,t.title]);return a.ZP.createElement("div",{ref:s,className:"sticker-set-cover"},m,c&&a.ZP.createElement(mt.Z,{id:l,size:e,animationData:c,className:d}))})),xn=(0,a.X$)((({stickerSet:e,observeIntersection:t})=>{const n=(0,a.sO)(null),s=(0,Bn.Op)(n,t),r=(0,h.Z)(e.hasThumbnail&&`stickerSet${e.id}`,!s),o=(0,$n.Z)(r),i=(0,a.Ye)((()=>{if(!r)return(0,it.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 Un=n(3547);const On=(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(Le.Z,{narrow:!0,className:"SettingsStickerSet",inactive:!o,onClick:()=>o&&n(o)},a.ZP.createElement(L.Z,{ariaLabel:e.title,color:"translucent",isRtl:r.isRtl},e.isAnimated?a.ZP.createElement(Dn,{size:i.Mw,stickerSet:e,observeIntersection:t}):a.ZP.createElement(xn,{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(Le.Z,{narrow:!0,className:"SettingsStickerSet",onClick:()=>n(o)},a.ZP.createElement(Un.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 Gn=n(4851);const Jn=["Solid and Steady","Nice and Fast","Lots of Stuff"],Xn=[{label:"12-hour",value:"12h"},{label:"24-hour",value:"24h"}],_n=(0,a.X$)((0,s.c$)((e=>{var t;return{...(0,me.ei)(e.settings.byKey,["messageTextSize","animationLevel","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","isSensitiveEnabled","canChangeSensitive","timeFormat"]),stickerSetIds:e.stickers.added.setIds,stickerSetsById:e.stickers.setsById,defaultReaction:null===(t=e.appConfig)||void 0===t?void 0:t.defaultReaction}}))((({isActive:e,onScreenSelect:t,onReset:n,stickerSetIds:r,stickerSetsById:i,defaultReaction:l,messageTextSize:c,animationLevel:d,messageSendKeyCombo:h,shouldSuggestStickers:Z,shouldLoopStickers:P,timeFormat:v})=>{const{setSettingOption:g}=(0,s.uC)(),p=(0,a.sO)(null),{observe:E}=(0,Bn.S1)({rootRef:p}),[C,b,I]=(0,De.Z)(),[y,N]=(0,a.eJ)(),S=(0,u.Z)(),w=f.$b?void 0:[{value:"enter",label:S("lng_settings_send_enter"),subLabel:"New line by Shift + Enter"},{value:"ctrl-enter",label:S(f.jm?"lng_settings_send_cmdenter":"lng_settings_send_ctrlenter"),subLabel:"New line by Enter"}],k=(0,a.I4)((e=>{Jn.forEach(((t,n)=>{document.body.classList.toggle(`animation-level-${n}`,e===n)})),g({animationLevel:e})}),[g]),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()),g({messageTextSize:e})}),[g]),T=(0,a.I4)((e=>{g({timeFormat:e}),g({wasTimeFormatSetManually:!0}),(0,Fn.qf)(e)}),[g]),L=(0,a.I4)((e=>{N(e),b()}),[b]),A=r&&r.map((e=>{var t;return!(null==i||null===(t=i[e])||void 0===t||!t.installedDate)&&i[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:S.isRtl?"rtl":void 0},S("SETTINGS")),a.ZP.createElement(fn.Z,{label:S("TextSize"),min:12,max:20,value:c,onChange:M}),a.ZP.createElement(Le.Z,{icon:"photo",onClick:()=>t(o.MT.GeneralChatBackground)},S("ChatBackground"))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},"Time Format"),a.ZP.createElement(at.Z,{name:"timeformat",options:Xn,selected:v,onChange:T})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},"Animation Level"),a.ZP.createElement("p",{className:"settings-item-description",dir:S.isRtl?"rtl":void 0},"Choose the desired animations amount."),a.ZP.createElement(fn.Z,{options:Jn,value:d,onChange:k})),w&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("VoiceOver.Keyboard")),a.ZP.createElement(at.Z,{name:"keyboard-send-settings",options:w,onChange:e=>g({messageSendKeyCombo:e}),selected:h})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:S.isRtl?"rtl":void 0},S("AccDescrStickers")),l&&a.ZP.createElement(Le.Z,{className:"SettingsDefaultReaction",onClick:()=>t(o.MT.QuickReaction)},a.ZP.createElement(lt.Z,{reaction:l}),a.ZP.createElement("div",{className:"title"},S("DoubleTapSetting"))),a.ZP.createElement(Cn.Z,{label:S("SuggestStickers"),checked:Z,onCheck:e=>g({shouldSuggestStickers:e})}),a.ZP.createElement(Cn.Z,{label:S("LoopAnimatedStickers"),checked:P,onCheck:e=>g({shouldLoopStickers:e})}),a.ZP.createElement("div",{className:"mt-4",ref:p},A&&A.map((e=>a.ZP.createElement(On,{key:e.id,stickerSet:e,observeIntersection:E,onClick:L})))),y&&a.ZP.createElement(Gn.Z,{isOpen:C,fromSticker:y,onClose:I})))})));let zn;function Yn(e="*",t,n=!1){zn||(zn=document.createElement("input"),zn.setAttribute("type","file")),zn.setAttribute("accept",e),n?zn.removeAttribute("multiple"):zn.setAttribute("multiple","multiple"),zn.onchange=null,zn.value="",zn.onchange=t,zn.click()}var Hn=n(1394);function Vn(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 Kn([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 Qn=n(9524),ea=n(5866);const ta=(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`),v=(0,ea.Z)(null===(r=c.thumbnail)||void 0===r?void 0:r.dataUri,Boolean(u),!0),{transitionClassNames:g}=(0,z.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.Z)(p&&!C||l===o.mp,void 0,b,"slow"),N=(0,a.sO)();N.current=t;const S=(0,a.I4)((()=>{(async()=>{const e=await(0,Hn.gm)(C);await Qn.save(i.fo,N.current,e),s(l)})()}),[C,s,l]);(0,a.d4)((()=>{C&&S()}),[C,S]);const w=(0,a.I4)((()=>{C?S():E((e=>!e))}),[C,S]),k=(0,X.Z)("WallpaperTile",n&&"selected");return a.ZP.createElement("div",{className:k,onClick:w},a.ZP.createElement("div",{className:"media-inner"},a.ZP.createElement("canvas",{ref:v,className:"thumbnail"}),a.ZP.createElement("img",{src:u||m,className:(0,X.Z)("full-media",g),alt:""}),I&&a.ZP.createElement("div",{className:(0,X.Z)("spinner-container",y)},a.ZP.createElement($.Z,{progress:f,onClick:w}))))})),na=(0,G.P2)((e=>e()),6e4,!0),aa=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.Pu)(e),{background:n,isBlurred:a}=e.settings.themes[t]||{},{loadedWallpapers:s}=e.settings;return{background:n,isBlurred:a,loadedWallpapers:s,theme:t}}))((({isActive:e,onScreenSelect:t,onReset:n,background:r,isBlurred:l,loadedWallpapers:c,theme:d})=>{const{loadWallpapers:h,uploadWallpaper:Z,setThemeSettings:P}=(0,s.uC)(),v=(0,a.sO)();v.current=d,(0,a.d4)((()=>{na((()=>{h()}))}),[h]);const g=(0,a.I4)((e=>{const{files:t}=e.target;t&&t.length>0&&Z(t[0])}),[Z]),p=(0,a.I4)((()=>{Yn("image/jpeg",g,!0)}),[g]),E=(0,a.I4)((()=>{t(o.MT.GeneralChatBackgroundColor)}),[t]),C=(0,a.I4)((()=>{P({theme:d,background:void 0,backgroundColor:void 0,isBlurred:!0,patternColor:"dark"===d?i.Vv:i.g})}),[P,d]),f=(0,a.I4)((e=>{P({theme:v.current,background:e});const t=c&&c.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,Hn.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=Wn(e),n=`#${jn(e)}`;P({theme:v.current,backgroundColor:n,patternColor:t})}))}),[c,P]),b=(0,a.I4)((e=>{P({theme:v.current,isBlurred:e.target.checked})}),[P]),I=(0,u.Z)();(0,m.ZP)(e,n,t,o.MT.GeneralChatBackground);const y=(null==c?void 0:c[0])&&c[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(Le.Z,{icon:"camera-add",className:"mb-0",disabled:y,onClick:p},I("UploadImage")),a.ZP.createElement(Le.Z,{icon:"colorize",className:"mb-0",onClick:E},I("SetColor")),a.ZP.createElement(Le.Z,{icon:"favorite",onClick:C},I("ThemeResetToDefaults")),a.ZP.createElement(Cn.Z,{label:I("BackgroundBlurred"),checked:Boolean(l),onChange:b})),c?a.ZP.createElement("div",{className:"settings-wallpapers"},c.map((e=>a.ZP.createElement(ta,{wallpaper:e,theme:d,isSelected:r===e.slug,onClick:f})))):a.ZP.createElement(we.Z,null))}))),sa=Kn(Vn("e6ebee")),ra=["#e6ebee","#b2cee1","#008dd0","#c6e7cb","#c4e1a6","#60b16e","#ccd0af","#a6a997","#7a7072","#fdd7af","#fdb76e","#dd8851"];function oa(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 ia({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 la=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.Pu)(e),{backgroundColor:n}=e.settings.themes[t]||{};return{backgroundColor:n,theme:t}}))((({isActive:e,onScreenSelect:t,onReset:n,theme:r,backgroundColor:i})=>{const{setThemeSettings:l}=(0,s.uC)(),c=(0,a.sO)();c.current=r;const d=(0,a.sO)(null),u=(0,a.sO)(null),h=(0,a.sO)(null),Z=(0,a.sO)(!0),[P,v]=(0,a.eJ)(function(e){return e&&e.startsWith("#")?Kn(Vn(e.replace("#",""))):sa}(i)),g=(0,a.sO)(P);(0,a.d4)((()=>{g.current=P}),[P]);const[p,E,f]=(0,De.Z)(),[b,I]=(0,a.eJ)(""),[y,N]=(0,a.eJ)(""),S=(0,a.sO)(),w=(0,a.sO)();(0,a.d4)((()=>{const e={offsetLeft:u.current.offsetLeft,...(0,me.ei)(u.current.getBoundingClientRect(),["top","width","height"])},t={offsetLeft:h.current.offsetLeft,...(0,me.ei)(h.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+d.current.scrollTop),e.height-1)],{huePosition:a}=oa(g.current,S.current);return v(ia({colorPosition:n,huePosition:a},S.current)),E(),!0}function a(e){const{colorPosition:n}=oa(g.current,S.current),a=Math.min(Math.max(0,e.pageX-t.offsetLeft),t.width-1);return v(ia({colorPosition:n,huePosition:a},S.current)),E(),!0}S.current={colorRect:e,hueRect:t},(0,C.s)(u.current,{onCapture:n,onDrag:n,onRelease:f,onClick:f,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0}),(0,C.s)(h.current,{onCapture:a,onDrag:a,onRelease:f,onClick:f,selectorToPreventScroll:".SettingsGeneralBackgroundColor",withCursor:!0})}),[E,f]);const{colorPosition:k=[0,0],huePosition:M=0}=S.current?oa(P,S.current):{},T=jn(qn(P)),L=P[0],A=jn(qn([L,1,1]));(0,a.d4)((()=>{const e=qn(P),t=`#${jn(e)}`;if(I(e.join(", ")),N(t),!Z.current){const n=Wn(e);l({theme:c.current,background:void 0,backgroundColor:t,patternColor:n})}Z.current=!1}),[P,l]),(0,a.d4)((()=>{!function(e,t,n,a){let s,r,o;n.current&&a.current?(s=a.current.colorRect.width,r=a.current.colorRect.height,o=n.current):(s=e.offsetWidth,r=e.offsetHeight,o=e.getContext("2d"),e.width=s,e.height=r,n.current=o);const i=o.createImageData(s,r),l=i.data,c=qn([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())));v(Kn(e))}e.currentTarget.value=t}),[]),F=(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}$/)&&v(Kn(Vn(t.replace("#","")))),e.currentTarget.value=t}),[]),B=(0,a.I4)((e=>{v(Kn(Vn(e.currentTarget.dataset.color.replace("#",""))))}),[]),$=(0,X.Z)("SettingsGeneralBackgroundColor settings-content custom-scroll",p&&"is-dragging");return(0,m.ZP)(e,n,t,o.MT.GeneralChatBackgroundColor),a.ZP.createElement("div",{ref:d,className:$},a.ZP.createElement("div",{className:"settings-item pt-3"},a.ZP.createElement("div",{ref:u,className:"color-picker"},a.ZP.createElement("canvas",null),a.ZP.createElement("div",{className:"handle",style:`transform: translate(${k[0]}px, ${k[1]}px); background-color: #${T};`})),a.ZP.createElement("div",{ref:h,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(Me.Z,{value:y,label:"HEX",onChange:F}),a.ZP.createElement(Me.Z,{value:b,label:"RGB",onChange:R}))),a.ZP.createElement("div",{className:"predefined-colors"},ra.map((e=>a.ZP.createElement("div",{className:e===`#${T}`?"active":void 0,"data-color":e,style:`background-color: ${e};`,onClick:B})))))})));var ca=n(8406);const da=(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})))((({isActive:e,onScreenSelect:t,onReset:n,hasPrivateChatsNotifications:r,hasPrivateChatsMessagePreview:i,hasGroupNotifications:l,hasGroupMessagePreview:c,hasBroadcastNotifications:d,hasBroadcastMessagePreview:h,hasContactJoinedNotifications:Z,hasPushNotifications:P,hasWebNotifications:v,notificationSoundVolume:g})=>{const{loadNotificationSettings:p,updateContactSignUpNotification:E,updateNotificationSettings:C,updateWebNotificationSettings:f}=(0,s.uC)();(0,a.d4)((()=>{p()}),[p]);const b=(0,x.Z)(500,!0),I=(0,a.I4)(((e,t,n)=>{const a="contact"===t?!r:!("group"===t?l:d),s="contact"===t?i:"group"===t?c:h;C({peerType:t,..."silent"===n&&{isSilent:!e.target.checked,shouldShowPreviews:s},..."showPreviews"===n&&{shouldShowPreviews:e.target.checked,isSilent:a}})}),[h,d,c,l,i,r,C]),y=(0,a.I4)((e=>{E({isSilent:!e.target.checked})}),[E]),N=(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:N.isRtl?"rtl":void 0},"Web notifications"),a.ZP.createElement(Cn.Z,{label:"Web notifications",subLabel:N(v?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:v,onChange:e=>{f({hasWebNotifications:e.target.checked})}}),a.ZP.createElement(Cn.Z,{label:"Offline notifications",disabled:!v,subLabel:N(P?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:P,onChange:e=>{f({hasPushNotifications:e.target.checked})}}),a.ZP.createElement("div",{className:"settings-item-slider"},a.ZP.createElement(fn.Z,{label:"Sound",min:0,max:10,value:g,onChange:e=>{f({notificationSoundVolume:e}),b((()=>(0,ca.q3)(void 0,e)))}}))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("AutodownloadPrivateChats")),a.ZP.createElement(Cn.Z,{label:N("NotificationsForPrivateChats"),subLabel:N(r?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:r,onChange:e=>{I(e,"contact","silent")}}),a.ZP.createElement(Cn.Z,{label:N("MessagePreview"),disabled:!r,subLabel:N(i?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:i,onChange:e=>{I(e,"contact","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("FilterGroups")),a.ZP.createElement(Cn.Z,{label:N("NotificationsForGroups"),subLabel:N(l?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:l,onChange:e=>{I(e,"group","silent")}}),a.ZP.createElement(Cn.Z,{label:N("MessagePreview"),disabled:!l,subLabel:N(c?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:c,onChange:e=>{I(e,"group","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("FilterChannels")),a.ZP.createElement(Cn.Z,{label:N("NotificationsForChannels"),subLabel:N(d?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:d,onChange:e=>{I(e,"broadcast","silent")}}),a.ZP.createElement(Cn.Z,{label:N("MessagePreview"),disabled:!d,subLabel:N(h?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),checked:h,onChange:e=>{I(e,"broadcast","showPreviews")}})),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:N.isRtl?"rtl":void 0},N("PhoneOther")),a.ZP.createElement(Cn.Z,{label:N("ContactJoined"),checked:Z,onChange:y})))}))),ma=(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}}))((({isActive:e,onScreenSelect:t,onReset:n,hasPassword:r,blockedCount:i,sessionsCount:l,isSensitiveEnabled:c,canChangeSensitive:d,visibilityPrivacyPhoneNumber:h,visibilityPrivacyLastSeen:Z,visibilityPrivacyProfilePhoto:P,visibilityPrivacyForwarding:v,visibilityPrivacyGroupChats:g})=>{const{loadPrivacySettings:p,loadBlockedContacts:E,loadAuthorizations:C,loadContentSettings:f,updateContentSettings:b}=(0,s.uC)();(0,a.d4)((()=>{E(),C(),p(),f()}),[E,C,p,f]);const I=(0,u.Z)();function y(e){switch(e){case"everybody":return I("P2PEverybody");case"contacts":return I("P2PContacts");case"nobody":return I("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(Le.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"},I("BlockedUsers")),i>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I("Users",i)))),a.ZP.createElement(Le.Z,{icon:"lock",narrow:!0,onClick:()=>t(r?o.MT.TwoFaEnabled:o.MT.TwoFaDisabled)},a.ZP.createElement("div",{className:"multiline-menu-item"},a.ZP.createElement("span",{className:"title"},I("TwoStepVerification")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},I(r?"PasswordOn":"PasswordOff")))),a.ZP.createElement(Le.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"},I("SessionsTitle")),l>0&&a.ZP.createElement("span",{className:"subtitle",dir:"auto"},1===l?"1 session":`${l} sessions`)))),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:I.isRtl?"rtl":void 0},I("PrivacyTitle")),a.ZP.createElement(Le.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"},I("PrivacyPhoneTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(h)))),a.ZP.createElement(Le.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"},I("LastSeenTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(Z)))),a.ZP.createElement(Le.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"},I("PrivacyProfilePhotoTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(P)))),a.ZP.createElement(Le.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"},I("PrivacyForwardsTitle")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(v)))),a.ZP.createElement(Le.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"},I("WhoCanAddMe")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},y(g))))),d&&a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header",dir:I.isRtl?"rtl":void 0},I("lng_settings_sensitive_title")),a.ZP.createElement(Cn.Z,{label:I("lng_settings_sensitive_disable_filtering"),subLabel:I("lng_settings_sensitive_about"),checked:Boolean(c),disabled:!d,onCheck:b})))}))),ua=(0,a.X$)((0,s.c$)((e=>({languages:e.settings.byKey.languages,language:e.settings.byKey.language})))((({isActive:e,onScreenSelect:t,onReset:n,languages:r,language:i})=>{const{loadLanguages:l,setSettingOption:c}=(0,s.uC)(),[d,u]=(0,a.eJ)(i),[h,Z,P]=(0,De.Z)();(0,a.d4)((()=>{l()}),[l]);const v=(0,a.I4)((e=>{u(e),Z(),(0,Fn.m0)(e,(()=>{P(),c({language:e})}))}),[Z,P,c]),g=(0,a.Ye)((()=>r?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))}(r):void 0),[r]);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(at.Z,{name:"keyboard-send-settings",options:g,selected:d,loadingOption:h?d:void 0,onChange:v}):a.ZP.createElement(we.Z,null))})));function ha(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 Za=(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}:{}}))((({screen:e,isActive:t,onScreenSelect:n,onReset:r,visibility:i,allowUserIds:l,allowChatIds:c,blockUserIds:d,blockChatIds:h,chatsById:Z})=>{const{setPrivacyVisibility:P}=(0,s.uC)(),v=(0,u.Z)(),g=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyProfilePhoto:case o.MT.PrivacyGroupChats:return[{value:"everybody",label:v("P2PEverybody")},{value:"contacts",label:v("P2PContacts")}];default:return[{value:"everybody",label:v("P2PEverybody")},{value:"contacts",label:v("P2PContacts")},{value:"nobody",label:v("P2PNobody")}]}}),[v,e]),p={shouldShowDenied:"nobody"!==i,shouldShowAllowed:"everybody"!==i},E=ha(e),C=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyPhoneNumber:return v("PrivacyPhoneTitle");case o.MT.PrivacyLastSeen:return v("LastSeenTitle");case o.MT.PrivacyProfilePhoto:return v("PrivacyProfilePhotoTitle");case o.MT.PrivacyForwarding:return v("PrivacyForwardsTitle");case o.MT.PrivacyGroupChats:return v("WhoCanAddMe");default:return}}),[v,e]);(0,m.ZP)(t,r,n,e);const f=(0,a.Ye)((()=>{switch(e){case o.MT.PrivacyLastSeen:return v("CustomHelp");default:return}}),[v,e]),b=(()=>{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}})(),I=(()=>{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}})(),y=(0,a.Ye)((()=>l&&c&&Z?c.reduce(((e,t)=>e+(Z[t]?Z[t].membersCount:0)),l.length):0),[c,l,Z]),N=(0,a.Ye)((()=>d&&h&&Z?h.reduce(((e,t)=>e+(Z[t]?Z[t].membersCount:0)),d.length):0),[h,d,Z]),S=(0,a.I4)((e=>{P({privacyKey:E,visibility:e})}),[E,P]);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:v.isRtl?"rtl":void 0},C),a.ZP.createElement(at.Z,{name:`visibility-${E}`,options:g,onChange:S,selected:i}),f&&a.ZP.createElement("p",{className:"settings-item-description-larger",dir:v.isRtl?"rtl":void 0},f)),a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:v.isRtl?"rtl":void 0},v("PrivacyExceptions")),p.shouldShowAllowed&&a.ZP.createElement(Le.Z,{narrow:!0,icon:"add-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"},v("AlwaysShareWith")),a.ZP.createElement("span",{className:"subtitle"},v("EditAdminAddUsers")))),p.shouldShowDenied&&a.ZP.createElement(Le.Z,{narrow:!0,icon:"delete-user",onClick:()=>{n(I)}},a.ZP.createElement("div",{className:"multiline-menu-item full-size"},N>0&&a.ZP.createElement("span",{className:"date",dir:"auto"},"−",N),a.ZP.createElement("span",{className:"title"},v("NeverShareWith")),a.ZP.createElement("span",{className:"subtitle"},v("EditAdminAddUsers"))))))})));function Pa(e){return[e.region,e.country].filter(Boolean).join(", ")}function va(e){return`${e.deviceModel}${e.deviceModel?", ":""} ${e.platform} ${e.systemVersion}`}const ga=(0,a.X$)((0,s.c$)((e=>({activeSessions:e.activeSessions})))((({isActive:e,onScreenSelect:t,onReset:n,activeSessions:r})=>{const{loadAuthorizations:i,terminateAuthorization:l,terminateAllAuthorizations:c}=(0,s.uC)(),[d,h,Z]=(0,De.Z)();(0,a.d4)((()=>{i()}),[i]);const P=(0,a.I4)((e=>{l({hash:e})}),[l]),v=(0,a.I4)((()=>{Z(),c()}),[Z,c]),g=(0,a.Ye)((()=>r.find((e=>e.isCurrent))),[r]),p=(0,a.Ye)((()=>r.filter((e=>!e.isCurrent))),[r]),E=(0,u.Z)();return(0,m.ZP)(e,n,t,o.MT.PrivacyActiveSessions),a.ZP.createElement("div",{className:"settings-content custom-scroll"},g&&(f=g,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:E.isRtl?"rtl":void 0},E("AuthSessions.CurrentSession")),a.ZP.createElement(Le.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"},f.appName),a.ZP.createElement("span",{className:"subtitle black tight"},va(f)),a.ZP.createElement("span",{className:"subtitle"},f.ip," - ",Pa(f)))),a.ZP.createElement(Le.Z,{className:"destructive mb-0 no-icon",icon:"stop",ripple:!0,narrow:!0,onClick:h},E("TerminateAllSessions")))),p&&(C=p,a.ZP.createElement("div",{className:"settings-item"},a.ZP.createElement("h4",{className:"settings-item-header mb-4",dir:E.isRtl?"rtl":void 0},E("OtherSessions")),C.map((function(e){return a.ZP.createElement(Le.Z,{key:e.hash,ripple:!0,narrow:!0,contextActions:[{title:"Terminate",icon:"stop",handler:()=>{P(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)(E,1e3*e.dateActive)),a.ZP.createElement("span",{className:"title"},e.appName),a.ZP.createElement("span",{className:"subtitle black tight"},va(e)),a.ZP.createElement("span",{className:"subtitle"},e.ip," - ",Pa(e))))})))),p&&a.ZP.createElement(Xe.Z,{isOpen:d,onClose:Z,text:"Are you sure you want to terminate all other sessions?",confirmLabel:"Terminate All Other Sessions",confirmHandler:v,confirmIsDestructive:!0}));var C,f})));var pa=n(6272);const Ea=(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}}))((({usersById:e,blockedIds:t,contactIds:n,localContactIds:r,currentUserId:o,isOpen:i,onClose:l})=>{const{loadContactList:c,setUserSearchQuery:d,blockContact:m}=(0,s.uC)(),h=(0,u.Z)(),[Z,P]=(0,a.eJ)(""),g=(0,a.sO)(null);(0,a.d4)((()=>{d({query:Z})}),[Z,d]);const p=(0,a.Ye)((()=>{const a=(0,me.Tw)([...n||[],...r||[]].filter((e=>e!==o&&!t.includes(e))));return(0,v.kK)(a,e,Z).sort(((t,n)=>{const a=(0,v.Js)(e[t])||"",s=(0,v.Js)(e[n])||"";return a.localeCompare(s)}))}),[t,n,o,Z,r,e]),E=(0,a.I4)((t=>{const{id:n,accessHash:a}=e[t]||{};n&&a&&(m({contactId:n,accessHash:a}),l())}),[m,l,e]);return a.ZP.createElement(Fe,{isOpen:i,chatOrUserIds:p,filterRef:g,filterPlaceholder:h("BlockedUsers.BlockUser"),filter:Z,onFilterChange:P,loadMore:c,onSelectChatOrUser:E,onClose:l})}))),Ca=(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}}))((({isActive:e,onScreenSelect:t,onReset:n,chatsByIds:r,usersByIds:l,blockedIds:c,phoneCodeList:d})=>{const{unblockContact:h}=(0,s.uC)(),Z=(0,u.Z)(),[P,g,p]=(0,De.Z)(),E=(0,a.I4)((e=>{h({contactId:e})}),[h]);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:Z.isRtl?"rtl":void 0},Z("BlockedUsersInfo"))),a.ZP.createElement("div",{className:"chat-list custom-scroll"},null!=c&&c.length?a.ZP.createElement("div",{className:"scroll-container"},c.map(((e,t)=>function(e,t,n){const s=(0,v.YC)(e),o=s?l[e]:void 0,c=s?void 0:r[e],m=(0,X.Z)("Chat chat-item-clickable blocked-list-item small-icon",s?"private":"group");return a.ZP.createElement(Le.Z,{key:e,className:m,ripple:!0,narrow:!0,contextActions:[{title:"Unblock",icon:"unlock",handler:()=>{E(e)}}],style:`top: ${(0+t)*i.rS}px;`},a.ZP.createElement(ge.Z,{size:"medium",user:o,chat:c}),a.ZP.createElement("div",{className:"contact-info",dir:"auto"},a.ZP.createElement("h3",{dir:"auto"},(0,ve.Z)((s?(0,v.Js)(o):(0,v.U)(Z,c))||"")),(null==o?void 0:o.phoneNumber)&&a.ZP.createElement("div",{className:"contact-phone",dir:"auto"},(0,pa.WZ)(d,o.phoneNumber)),o&&!o.phoneNumber&&o.username&&a.ZP.createElement("div",{className:"contact-username",dir:"auto"},"@",o.username)))}(e,t)))):c&&!c.length?a.ZP.createElement("div",{className:"no-results",dir:"auto"},Z("NoBlocked")):a.ZP.createElement(we.Z,{key:"loading"}))),a.ZP.createElement(dn.Z,{isShown:!0,onClick:g,ariaLabel:Z("BlockContact")},a.ZP.createElement("i",{className:"icon-add"})),a.ZP.createElement(Ea,{isOpen:P,onClose:p}))})));var fa=n(7854);const ba=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,g.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(fa.Z,{sticker:n,size:"large"}),a.ZP.createElement("p",{className:"settings-item-description mb-3",dir:"auto"},(0,ve.Z)(r("EnabledPasswordText"),["br"]))),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Le.Z,{icon:"edit",onClick:()=>s(o.MT.TwoFaChangePasswordCurrent)},r("ChangePassword")),a.ZP.createElement(Le.Z,{icon:"password-off",onClick:()=>s(o.MT.TwoFaTurnOff)},r("TurnPasswordOff")),a.ZP.createElement(Le.Z,{icon:"email",onClick:()=>s(o.MT.TwoFaRecoveryEmailCurrentPassword)},r("SetRecoveryEmail"))))})));var Ia=n(3490),ya=n(9364);const Na=(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,v]=(0,a.eJ)(""),[g,p]=(0,a.eJ)(!1),E=(0,a.I4)((e=>{i&&e!==i?v("Passwords Should Be Equal"):Z(e)}),[Z,i]),C=(0,a.I4)((()=>{h&&h(),v("")}),[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(Ia.Z,{isBig:!0,isPasswordVisible:g})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(ya.Z,{error:P||r,hint:c,placeholder:l,submitLabel:d||f("Next"),clearError:C,isLoading:o,isPasswordVisible:g,onChangePasswordVisibility:p,onSubmit:E})))})),Sa=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,g.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(fa.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(L.Z,{onClick:r},i("EditAdminTransferSetPassword"))))}))),wa=f.wB?550:400,ka=(0,a.X$)((0,s.c$)(((e,{icon:t})=>({animatedEmoji:(0,g.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),[v,g]=(0,a.eJ)(""),[p,E,C]=(0,De.Z)(!1);(0,a.d4)((()=>{f.$b||setTimeout((()=>{P.current.focus()}),wa)}),[]);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(fa.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(v)}},a.ZP.createElement(Me.Z,{ref:P,value:v,inputMode:t,label:r,error:s,onChange:e=>{s&&i&&i(),g(e.target.value)}}),v?a.ZP.createElement(L.Z,{type:"submit",isLoading:n,ripple:!0},b("Continue")):a.ZP.createElement(L.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,ve.Z)(b("YourEmailSkipWarningText"),["br","simple_markdown"]),a.ZP.createElement("div",{className:"dialog-buttons"},a.ZP.createElement(L.Z,{color:"danger",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:()=>{C(),l()}},b("YourEmailSkip")),a.ZP.createElement(L.Z,{color:"primary",ripple:!0,isText:!0,className:"confirm-dialog-button",onClick:C},b("Cancel"))))))}))),Ma=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,g.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(fa.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(L.Z,{onClick:()=>{s(o.MT.Privacy)}},r("TwoStepVerificationPasswordReturnSettings"))))}))),Ta=f.wB?550:400,La=(0,a.X$)((0,s.c$)((e=>({animatedEmoji:(0,g.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()}),Ta)}),[]);const v=(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(fa.Z,{sticker:e,size:"large"})),a.ZP.createElement("div",{className:"settings-item pt-0 no-border"},a.ZP.createElement(Me.Z,{value:Z,ref:h,inputMode:"decimal",label:v("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)))}))),Aa=(0,a.X$)((0,s.c$)((e=>({...e.twoFaSettings})))((({currentScreen:e,shownScreen:t,state:n,hint:r,isLoading:i,error:l,waitingEmailCodeLength:c,dispatch:d,isActive:m,onScreenSelect:h,onReset:Z})=>{const{updatePassword:P,checkPassword:v,clearTwoFaError:g,updateRecoveryEmail:p,provideTwoFaEmailCode:E,clearPassword:C}=(0,s.uC)();(0,a.d4)((()=>{c&&(e===o.MT.TwoFaNewPasswordEmail?h(o.MT.TwoFaNewPasswordEmailCode):e===o.MT.TwoFaRecoveryEmail&&h(o.MT.TwoFaRecoveryEmailCode))}),[e,h,c]);const f=(0,a.I4)((()=>{d({type:"reset"}),h(o.MT.TwoFaNewPassword)}),[d,h]),b=(0,a.I4)((e=>{d({type:"setPassword",payload:e}),h(o.MT.TwoFaNewPasswordConfirm)}),[d,h]),I=(0,a.I4)((()=>{h(o.MT.TwoFaNewPasswordHint)}),[h]),y=(0,a.I4)((e=>{d({type:"setHint",payload:e}),h(o.MT.TwoFaNewPasswordEmail)}),[d,h]),N=(0,a.I4)((e=>{d({type:"setEmail",payload:e}),P({...n,email:e,onSuccess:()=>{h(o.MT.TwoFaCongratulations)}})}),[d,h,n,P]),S=(0,a.I4)((e=>{d({type:"setCurrentPassword",payload:e}),v({currentPassword:e,onSuccess:()=>{h(o.MT.TwoFaChangePasswordNew)}})}),[v,d,h]),w=(0,a.I4)((e=>{d({type:"setPassword",payload:e}),h(o.MT.TwoFaChangePasswordConfirm)}),[d,h]),k=(0,a.I4)((()=>{h(o.MT.TwoFaChangePasswordHint)}),[h]),M=(0,a.I4)((e=>{d({type:"setHint",payload:e}),P({...n,hint:e,onSuccess:()=>{h(o.MT.TwoFaCongratulations)}})}),[d,h,n,P]),T=(0,a.I4)((e=>{C({currentPassword:e,onSuccess:()=>{h(o.MT.Privacy)}})}),[C,h]),L=(0,a.I4)((e=>{d({type:"setCurrentPassword",payload:e}),v({currentPassword:e,onSuccess:()=>{h(o.MT.TwoFaRecoveryEmail)}})}),[v,d,h]),A=(0,a.I4)((e=>{d({type:"setEmail",payload:e}),p({...n,email:e,onSuccess:()=>{h(o.MT.TwoFaCongratulations)}})}),[d,h,n,p]),R=(0,a.I4)((e=>{E({code:e})}),[E]),F=(0,u.Z)();switch(e){case o.MT.TwoFaDisabled:return a.ZP.createElement(Sa,{onStart:f,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPassword,o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPassword:return a.ZP.createElement(Na,{screen:e,placeholder:F("PleaseEnterPassword"),submitLabel:F("Continue"),onSubmit:b,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPasswordConfirm,o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPasswordConfirm:return a.ZP.createElement(Na,{screen:e,expectedPassword:n.password,placeholder:F("PleaseReEnterPassword"),submitLabel:F("Continue"),onSubmit:I,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPasswordHint,o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPasswordHint:return a.ZP.createElement(ka,{icon:"hint",placeholder:F("PasswordHintPlaceholder"),onSubmit:y,screen:e,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPasswordEmail,o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPasswordEmail:return a.ZP.createElement(ka,{icon:"email",type:"email",isLoading:i,error:l,clearError:g,placeholder:F("RecoveryEmailTitle"),shouldConfirm:!0,onSubmit:N,screen:e,onScreenSelect:h,isActive:m||[o.MT.TwoFaNewPasswordEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaNewPasswordEmailCode:return a.ZP.createElement(La,{isLoading:i,error:l,clearError:g,onSubmit:R,screen:e,onScreenSelect:h,isActive:m||t===o.MT.TwoFaCongratulations,onReset:Z});case o.MT.TwoFaCongratulations:return a.ZP.createElement(Ma,{onScreenSelect:h,isActive:m,onReset:Z});case o.MT.TwoFaEnabled:return a.ZP.createElement(ba,{onScreenSelect:h,isActive:m||[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:Z});case o.MT.TwoFaChangePasswordCurrent:return a.ZP.createElement(Na,{screen:e,isLoading:i,error:l,clearError:g,hint:r,onSubmit:S,onScreenSelect:h,isActive:m||[o.MT.TwoFaChangePasswordNew,o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaChangePasswordNew:return a.ZP.createElement(Na,{screen:e,placeholder:F("PleaseEnterNewFirstPassword"),onSubmit:w,onScreenSelect:h,isActive:m||[o.MT.TwoFaChangePasswordConfirm,o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaChangePasswordConfirm:return a.ZP.createElement(Na,{screen:e,expectedPassword:n.password,placeholder:F("PleaseReEnterPassword"),onSubmit:k,onScreenSelect:h,isActive:m||[o.MT.TwoFaChangePasswordHint,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaChangePasswordHint:return a.ZP.createElement(ka,{isLoading:i,error:l,clearError:g,icon:"hint",placeholder:F("PasswordHintPlaceholder"),onSubmit:M,onScreenSelect:h,isActive:m||t===o.MT.TwoFaCongratulations,onReset:Z,screen:e});case o.MT.TwoFaTurnOff:return a.ZP.createElement(Na,{isLoading:i,error:l,clearError:g,hint:r,onSubmit:T,onScreenSelect:h,isActive:m,onReset:Z,screen:e});case o.MT.TwoFaRecoveryEmailCurrentPassword:return a.ZP.createElement(Na,{screen:e,isLoading:i,error:l,clearError:g,hint:r,onSubmit:L,onScreenSelect:h,isActive:m||[o.MT.TwoFaRecoveryEmail,o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaRecoveryEmail:return a.ZP.createElement(ka,{screen:e,icon:"email",type:"email",placeholder:F("RecoveryEmailTitle"),onSubmit:A,onScreenSelect:h,isActive:m||[o.MT.TwoFaRecoveryEmailCode,o.MT.TwoFaCongratulations].includes(t),onReset:Z});case o.MT.TwoFaRecoveryEmailCode:return a.ZP.createElement(La,{screen:e,isLoading:i,error:l,clearError:g,onSubmit:R,onScreenSelect:h,isActive:m||t===o.MT.TwoFaCongratulations,onReset:Z});default:return}})));var Ra=n(1820);function Fa(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 Ba=(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:Fa(e,t)}}))((({currentUserId:e,isAllowList:t,screen:n,settings:r,chatsById:i,listIds:l,orderedPinnedIds:c,archivedListIds:d,archivedPinnedIds:h,isActive:Z,onScreenSelect:P,onReset:g})=>{const{setPrivacySettings:p}=(0,s.uC)(),E=(0,u.Z)(),C=(0,a.Ye)((()=>r?t?[...r.allowUserIds,...r.allowChatIds]:[...r.blockUserIds,...r.blockChatIds]:[]),[t,r]),[f,b]=(0,a.eJ)(""),[I,y]=(0,a.eJ)(!1),[N,S]=(0,a.eJ)(C),w=(0,a.Ye)((()=>{const e=l?(0,v.O)(i,l,c,"all"):void 0,t=d?(0,v.O)(i,d,h,"archived"):void 0;if(e||t)return[...e?[...e.pinnedChats,...e.otherChats]:[],...t?t.otherChats:[]]}),[i,l,c,d,h]),k=(0,a.Ye)((()=>{if(w)return w.filter((t=>((0,v.YC)(t.id)&&t.id!==e||(0,v.Bf)(t))&&(!f||(0,Tn.Z)((0,v.U)(E,t),f)||C.includes(t.id)))).map((({id:e})=>e))}),[w,e,E,f,C]),M=(0,a.I4)((e=>{S(e),y(!0)}),[]),T=(0,a.I4)((()=>{p({privacyKey:ha(n),isAllowList:Boolean(t),contactsIds:N}),P(o.MT.Privacy)}),[t,N,P,n,p]);return(0,m.ZP)(Z,g,P,n),a.ZP.createElement("div",{className:"NewChat-inner step-1"},a.ZP.createElement(Ra.Z,{itemIds:k||[],selectedIds:N,filterValue:f,filterPlaceholder:E(t?"AlwaysShareWithPlaceholder":"NeverShareWithPlaceholder"),searchInputId:"new-group-picker-search",onSelectedIdsChange:M,onFilterChange:b}),a.ZP.createElement(dn.Z,{isShown:I,onClick:T,ariaLabel:E(t?"AlwaysShareWithTitle":"NeverShareWithTitle")},a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),$a=(0,a.X$)((0,s.c$)((e=>{const{availableReactions:t,appConfig:n}=e;return{availableReactions:t,selectedReaction:null==n?void 0:n.defaultReaction}}))((({isActive:e,onReset:t,onScreenSelect:n,availableReactions:r,selectedReaction:i})=>{const{setDefaultReaction:l}=(0,s.uC)();(0,m.ZP)(e,t,n,o.MT.General);const c=(null==r?void 0:r.filter((e=>!e.isInactive)).map((e=>({label:a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(lt.Z,{reaction:e.reaction}),e.title),value:e.reaction}))))||[],d=(0,a.I4)((e=>{l({reaction:e})}),[l]);return a.ZP.createElement("div",{className:"settings-content settings-item custom-scroll settings-quick-reaction"},a.ZP.createElement(at.Z,{name:"quick-reaction-settings",options:c,selected:i,onChange:d}))}))),Da=Object.keys(o.MT).length/2,xa=[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],Ua=[o.MT.Folders,o.MT.FoldersCreateFolder,o.MT.FoldersEditFolder,o.MT.FoldersEditFolderFromChatList,o.MT.FoldersIncludedChats,o.MT.FoldersIncludedChatsFromChatList,o.MT.FoldersExcludedChats,o.MT.FoldersExcludedChatsFromChatList],Oa=[o.MT.PrivacyBlockedUsers,o.MT.PrivacyActiveSessions],Ga=[o.MT.PrivacyPhoneNumberAllowedContacts,o.MT.PrivacyPhoneNumberDeniedContacts],Ja=[o.MT.PrivacyLastSeenAllowedContacts,o.MT.PrivacyLastSeenDeniedContacts],Xa=[o.MT.PrivacyProfilePhotoAllowedContacts,o.MT.PrivacyProfilePhotoDeniedContacts],_a=[o.MT.PrivacyForwardingAllowedContacts,o.MT.PrivacyForwardingDeniedContacts],za=[o.MT.PrivacyGroupChatsAllowedContacts,o.MT.PrivacyGroupChatsDeniedContacts],Ya=(0,a.X$)((({isActive:e,currentScreen:t,foldersState:n,foldersDispatch:s,onScreenSelect:r,onReset:i,shouldSkipTransition:l})=>{const[c,d]=(0,tn.Z)(an,nn),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(sn,{currentScreen:t,onReset:m,onSaveFilter:u,onScreenSelect:r,editedFolderId:n.folderId}),function(i,l){const u={[o.MT.PrivacyPhoneNumber]:Ga.includes(l),[o.MT.PrivacyLastSeen]:Ja.includes(l),[o.MT.PrivacyProfilePhoto]:Xa.includes(l),[o.MT.PrivacyForwarding]:_a.includes(l),[o.MT.PrivacyGroupChats]:za.includes(l)},h=xa.includes(l),Z=Ua.includes(l),P=Oa.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(ln,{onScreenSelect:r,isActive:e,onReset:m});case o.MT.EditProfile:return a.ZP.createElement(En,{onScreenSelect:r,isActive:e&&i,onReset:m});case o.MT.General:return a.ZP.createElement(_n,{onScreenSelect:r,isActive:i||l===o.MT.GeneralChatBackgroundColor||l===o.MT.GeneralChatBackground||l===o.MT.QuickReaction||P||Z,onReset:m});case o.MT.QuickReaction:return a.ZP.createElement($a,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.Notifications:return a.ZP.createElement(da,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.DataStorage:return a.ZP.createElement(bn,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.Privacy:return a.ZP.createElement(ma,{onScreenSelect:r,isActive:i||P||h,onReset:m});case o.MT.Language:return a.ZP.createElement(ua,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.GeneralChatBackground:return a.ZP.createElement(aa,{onScreenSelect:r,isActive:i||l===o.MT.GeneralChatBackgroundColor,onReset:m});case o.MT.GeneralChatBackgroundColor:return a.ZP.createElement(la,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyActiveSessions:return a.ZP.createElement(ga,{onScreenSelect:r,isActive:i,onReset:m});case o.MT.PrivacyBlockedUsers:return a.ZP.createElement(Ca,{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(Za,{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(Ba,{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(Ba,{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(Rn,{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(Aa,{currentScreen:t,state:c,dispatch:d,shownScreen:l,isActive:i,onScreenSelect:r,onReset:m});default:return}}(i,h))}return a.ZP.createElement(R.Z,{id:"Settings",name:l?"none":f.s0,activeKey:t,renderCount:Da},h)})),Ha=(0,G.P2)((e=>e()),6e4,!0),Va=(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}}))((({isActive:e,filter:t,usersById:n,userStatusesById:r,contactIds:o,serverTimeOffset:i,onReset:l})=>{const{loadContactList:c,openChat:d}=(0,s.uC)();(0,a.d4)((()=>{Ha((()=>{c()}))})),(0,m.ZP)(e,l);const u=(0,a.I4)((e=>{d({id:e,shouldReplaceHistory:!0})}),[d]),h=(0,a.Ye)((()=>{if(!o)return;const e=(0,v.kK)(o,n,t);return(0,v.Z0)(e,n,r,void 0,i)}),[o,t,n,r,i]),[Z,P]=(0,ye.Z)(void 0,h,Boolean(t));return a.ZP.createElement(Te.Z,{items:Z,onLoadMore:P,className:"chat-list custom-scroll"},null!=Z&&Z.length?Z.map((e=>a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable",onClick:()=>u(e),ripple:!f.wB},a.ZP.createElement(Re.Z,{userId:e,forceShowSelf:!0,avatarSize:"large"})))):Z&&!Z.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"}))}))),ja=(0,G.P2)((e=>e()),6e4,!0),Ka=(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}}))((({isChannel:e,isActive:t,selectedMemberIds:n,onSelectedMemberIdsChange:r,onNextStep:o,onReset:i,chatsById:l,localContactIds:c,searchQuery:d,isSearching:h,localUserIds:Z,globalUserIds:P})=>{const{loadContactList:g,setGlobalSearchQuery:p}=(0,s.uC)();(0,a.d4)((()=>{ja((()=>{g()}))}));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,v.kK)(c,e,d):[];return(0,v.ih)((0,me.Tw)([...t,...Z||[],...P||[]]).filter((t=>{const n=e[t];return!n||!n.isSelf&&(n.canBeInvitedToGroup||!(0,v.cS)(n))})),l,!1,n)}),[c,l,d,Z,P,n]),b=(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(L.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(Ra.Z,{itemIds:f,selectedIds:n,filterValue:d,filterPlaceholder:E("SendMessageTo"),searchInputId:"new-group-picker-search",isLoading:h,onSelectedIdsChange:r,onFilterChange:C}),a.ZP.createElement(dn.Z,{isShown:Boolean(n.length||e),onClick:b,ariaLabel:e?"Continue To Channel Info":"Continue To Group Info"},a.ZP.createElement("i",{className:"icon-arrow-right"}))))}))),qa=(0,a.X$)((0,s.c$)((e=>{const{progress:t,error:n}=e.chatCreation||{};return{creationProgress:t,creationError:n}}))((({isChannel:e,isActive:t,memberIds:n,onReset:r,creationProgress:i,creationError:l})=>{const{createGroupChat:c,createChannel:d}=(0,s.uC)(),h=(0,u.Z)();(0,m.ZP)(t,r);const[Z,P]=(0,a.eJ)(""),[v,g]=(0,a.eJ)(""),[p,E]=(0,a.eJ)(),[C,f]=(0,a.eJ)(),b="Chat title can't be empty",I="Channel title can't be empty",y="Sorry, creating supergroups is not yet supported",N=i===o.Nh.InProgress,S=(0,a.I4)((e=>{const{value:t}=e.currentTarget,n=t.replace(/^\s+/,"");P(n),n!==t&&(e.currentTarget.value=n)}),[]),w=(0,a.I4)((e=>{g(e.currentTarget.value)}),[]),k=(0,a.I4)((()=>{Z.length?n.length>199?f(y):c({title:Z,photo:p,memberIds:n}):f(b)}),[Z,n,c,p,b,y]),M=(0,a.I4)((()=>{Z.length?d({title:Z,about:v,photo:p,memberIds:n}):f(I)}),[Z,d,v,p,n,I]);(0,a.d4)((()=>{i===o.Nh.Complete&&r(!0)}),[i,r]);const T=l&&h(l)||(C!==b&&C!==I?C:void 0);return a.ZP.createElement("div",{className:"NewChat"},a.ZP.createElement("div",{className:"left-header"},a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>r(),ariaLabel:"Return to member selection"},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement("h3",null,h(e?"NewChannel":"NewGroup"))),a.ZP.createElement("div",{className:"NewChat-inner step-2"},a.ZP.createElement(cn.Z,{onChange:E,title:h("AddPhoto")}),a.ZP.createElement(Me.Z,{value:Z,onChange:S,label:h(e?"EnterChannelName":"GroupName"),error:C===b||C===I?C:void 0}),e&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Me.Z,{value:v,onChange:w,label:h("DescriptionOptionalPlaceholder")}),a.ZP.createElement("p",{className:"note"},h("DescriptionInfo"))),T&&a.ZP.createElement("p",{className:"error"},T),n.length>0&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"chat-members-heading"},h("GroupInfo.ParticipantCount",n.length,"i")),a.ZP.createElement("div",{className:"chat-members-list custom-scroll"},n.map((e=>a.ZP.createElement(Le.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Re.Z,{userId:e}))))))),a.ZP.createElement(dn.Z,{isShown:0!==Z.length,onClick:e?M:k,disabled:N,ariaLabel:e?h("ChannelIntro.CreateChannel"):"Create Group"},N?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-arrow-right"})))}))),Wa=Object.keys(o.du).length/2,Qa=(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(R.Z,{id:"NewChat",name:f.s0,renderCount:Wa,activeKey:n},(s=>{switch(n){case o.du.NewChannelStep1:case o.du.NewGroupStep1:return a.ZP.createElement(Ka,{isChannel:t,isActive:e,selectedMemberIds:i,onSelectedMemberIdsChange:l,onNextStep:c,onReset:r});case o.du.NewChannelStep2:case o.du.NewGroupStep2:return a.ZP.createElement(qa,{isChannel:t,isActive:s&&e,memberIds:i,onReset:r});default:return}}))}));var es=n(1080);const ts=(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(L.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(es.Z,{folderType:"archived",isActive:e}))}));var ns=n(1218);const as=(0,a.X$)((0,s.c$)((e=>{const{byId:t,orderedIds:n}=e.chatFolders;return{foldersById:t,folderOrderedIds:n}}))((({isOpen:e,chatId:t,foldersById:n,folderOrderedIds:r,onClose:o,onCloseAnimationEnd:i})=>{const{editChatFolders:l}=(0,s.uC)(),c=(0,u.Z)(),d=(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]),[m,h]=(0,a.eJ)(d),Z=(0,a.Ye)((()=>(null==r?void 0:r.map((e=>({label:n?n[e].title:"",value:String(e)}))))||[]),[r,n]),P=(0,a.I4)((()=>{const e=d.filter((e=>!m.includes(e))).map(Number),n=m.filter((e=>!d.includes(e))).map(Number);l({chatId:t,idsToRemove:e,idsToAdd:n}),o()}),[t,l,d,o,m]);if(n&&r)return a.ZP.createElement(ke.Z,{isOpen:e,onClose:o,onCloseAnimationEnd:i,onEnter:P,className:"delete",title:c("FilterAddTo")},a.ZP.createElement(ns.Z,{options:Z,selected:m,onChange:h,round:!0}),a.ZP.createElement(L.Z,{color:"primary",className:"confirm-dialog-button",isText:!0,onClick:P},c("FilterAddTo")),a.ZP.createElement(L.Z,{className:"confirm-dialog-button",isText:!0,onClick:o},c("Cancel")))})));var ss=n(4319),rs=n(647);function os(e){return e?"lng_context_copy_selected":"lng_context_copy_text"}let is,ls;const cs={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},ds=e=>"changedTouches"in e?e.changedTouches[0].clientY:0,ms=e=>{const t="deltaY"in e?e.deltaY:ds(e);if(!is||!is.contains(e.target)||is.scrollTop<=0&&t<=0||is.scrollTop>=is.scrollHeight-is.offsetHeight&&t>=0){if(ls&&e.target.closest(ls))return;e.preventDefault()}};function us(e){cs[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 hs(e,t){is=e,ls=t,document.addEventListener("wheel",ms,{passive:!1}),document.addEventListener("touchmove",ms,{passive:!1}),document.onkeydown=us}function Zs(){is=void 0,ls=void 0,document.removeEventListener("wheel",ms),document.removeEventListener("touchmove",ms),document.onkeydown=null}var Ps=n(3394),vs=n(2328);const gs=({reaction:e,onSendReaction:t,isReady:n})=>{var s;const o=(0,a.sO)(null),i=(0,h.Z)(`document${null===(s=e.selectAnimation)||void 0===s?void 0:s.id}`,!n,r.IU.Lottie),[l,c,d]=(0,De.Z)(),[m,u]=(0,De.Z)(),Z=Boolean(n&&i),{transitionClassNames:P}=(0,z.Z)(Z),{shouldRender:v,transitionClassNames:g}=(0,z.Z)(!n||!m,void 0,!0);return a.ZP.createElement("div",{className:"reaction",onClick:function(){if(!o.current)return;const{x:n,y:a}=o.current.getBoundingClientRect();t(e.reaction,n,a)},ref:o,onMouseEnter:n?c:void 0},v&&a.ZP.createElement(lt.Z,{className:n?g:void 0,reaction:e.reaction}),Z&&a.ZP.createElement(mt.Z,{id:`select_${e.reaction}`,className:P,animationData:i,play:l,noLoop:!0,size:32,onLoad:u,onEnded:d}))},ps=(0,a.X$)((({availableReactions:e,enabledReactions:t,onSendReaction:n,isPrivate:s,isReady:r})=>{const o=(0,a.sO)(null),[i,l]=(0,De.Z)(!1);(0,Ct.Z)(o.current,!i),(0,a.bt)((()=>{l()}),[l]);const c=e=>{o&&("deltaY"in e?e.deltaY:ds(e))&&e.preventDefault()};if((s||null!=t&&t.length)&&e)return a.ZP.createElement("div",{className:"ReactionSelector",onWheelCapture:c,onTouchMove:c},a.ZP.createElement("div",{className:"bubble-big"}),a.ZP.createElement("div",{className:"bubble-small"}),a.ZP.createElement("div",{className:"items-wrapper"},a.ZP.createElement("div",{className:"items no-scrollbar",ref:o},null==e?void 0:e.map((e=>{if(!e.isInactive&&(s||t&&t.includes(e.reaction)))return a.ZP.createElement(gs,{key:e.reaction,isReady:r,onSendReaction:n,reaction:e})})))))})),Es=(0,a.X$)((({availableReactions:e,isOpen:t,message:n,isPrivate:s,enabledReactions:o,anchor:i,canSendNow:l,canReschedule:c,canReply:d,canEdit:m,canPin:h,canUnpin:Z,canDelete:P,canReport:g,canForward:p,canFaveSticker:E,canUnfaveSticker:C,canCopy:b,canCopyLink:I,canSelect:y,canDownload:N,isDownloading:S,canShowSeenBy:w,canShowReactionsCount:k,canRemoveReaction:M,canShowReactionList:T,seenByRecentUsers:L,onReply:A,onEdit:R,onPin:F,onUnpin:$,onForward:D,onDelete:x,onReport:U,onFaveSticker:O,onUnfaveSticker:G,onSelect:J,onSend:_,onReschedule:z,onClose:Y,onCloseAnimationEnd:H,onCopyLink:V,onDownload:j,onShowSeenBy:K,onShowReactors:q,onSendReaction:W})=>{var Q,ee,te,ne;const ae=(0,a.sO)(null),se=(0,a.sO)(null),re=function(e,t,n){const a=[],s=(0,v.UD)(e),o=(0,v.O$)(e)||((0,v.Cg)(e)?void 0:(0,v.F$)(e)),i=(0,v.Ti)(e,"inline"),l=o&&(i||(0,v.BM)(e))&&ss.yl,c=window.getSelection();if(l&&a.push({label:"lng_context_copy_image",handler:()=>{Promise.resolve(i?rs.he(i,r.IU.BlobUrl):o.blobUrl).then(ss.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:os(e),handler:()=>{const n=e&&c?c.toString():s;(0,ss.TE)(n),t&&t()}})}return n&&a.push({label:"lng_context_copy_message_link",handler:()=>{n(),t&&t()}}),a}(n,Y,I?V:void 0),oe=!(s||null!=o&&o.length),ie=T&&!oe,[le,ce,de]=(0,De.Z)(),me=(0,a.I4)((()=>document.querySelector(`.Transition__slide--active > .MessageList div[data-message-id="${n.id}"]`)),[n.id]),ue=(0,a.I4)((()=>document.querySelector(".Transition__slide--active > .MessageList")),[]),he=(0,a.I4)((()=>document.querySelector(".MessageContextMenu .bubble")),[]),Ze=(0,a.I4)((()=>{var e;const t=f.wB&&(null===(e=document.querySelector(".AudioPlayer-content"))||void 0===e?void 0:e.offsetHeight)||0,n=document.querySelector(".HeaderPinnedMessage-wrapper"),a=(f.wB&&!t||!f.wB&&(null==n?void 0:n.classList.contains("full-width")))&&(null==n?void 0:n.offsetHeight)||0;return{extraPaddingX:10,extraTopPadding:document.querySelector(".MiddleHeader").offsetHeight,marginSides:ie?32:void 0,extraMarginTop:a+t}}),[ie]),Pe=(0,a.I4)((()=>{W(void 0,0,0)}),[W]);(0,a.d4)((()=>{t?setTimeout((()=>{ce()}),200):de()}),[t,ce,de]);const{positionX:ve,positionY:pe,style:Ee,menuStyle:Ce,withScroll:fe}=(0,Ps.Z)(i,me,ue,he,Ze);(0,a.d4)((()=>(hs(fe?se.current:void 0,".ReactionSelector"),Zs)),[fe]);const be=(0,u.Z)();return a.ZP.createElement(vs.Z,{ref:ae,isOpen:t,positionX:ve,positionY:pe,style:Ee,bubbleStyle:Ce,className:(0,X.Z)("MessageContextMenu","fluid",ie&&"with-reactions"),onClose:Y,onCloseAnimationEnd:H},T&&a.ZP.createElement(ps,{enabledReactions:o,onSendReaction:W,isPrivate:s,availableReactions:e,isReady:le}),a.ZP.createElement("div",{className:"scrollable-content custom-scroll",style:Ce,ref:se},M&&a.ZP.createElement(B.Z,{icon:"reactions",onClick:Pe},"Remove Reaction"),l&&a.ZP.createElement(B.Z,{icon:"send-outline",onClick:_},be("MessageScheduleSend")),c&&a.ZP.createElement(B.Z,{icon:"schedule",onClick:z},be("MessageScheduleEditTime")),d&&a.ZP.createElement(B.Z,{icon:"reply",onClick:A},be("Reply")),m&&a.ZP.createElement(B.Z,{icon:"edit",onClick:R},be("Edit")),E&&a.ZP.createElement(B.Z,{icon:"favorite",onClick:O},be("AddToFavorites")),C&&a.ZP.createElement(B.Z,{icon:"favorite",onClick:G},be("Stickers.RemoveFromFavorites")),b&&re.map((e=>a.ZP.createElement(B.Z,{key:e.label,icon:"copy",onClick:e.handler},be(e.label)))),h&&a.ZP.createElement(B.Z,{icon:"pin",onClick:F},be("DialogPin")),Z&&a.ZP.createElement(B.Z,{icon:"unpin",onClick:$},be("DialogUnpin")),N&&a.ZP.createElement(B.Z,{icon:"download",onClick:j},be(S?"lng_context_cancel_download":"lng_media_download")),p&&a.ZP.createElement(B.Z,{icon:"forward",onClick:D},be("Forward")),y&&a.ZP.createElement(B.Z,{icon:"select",onClick:J},be("Common.Select")),g&&a.ZP.createElement(B.Z,{icon:"flag",onClick:U},be("lng_context_report_msg")),(w||k)&&a.ZP.createElement(B.Z,{icon:k?"reactions":"group",onClick:k?q:K,disabled:!(k||null!==(Q=n.seenByUserIds)&&void 0!==Q&&Q.length)},k&&null!==(ee=n.reactors)&&void 0!==ee&&ee.count?w&&null!==(te=n.seenByUserIds)&&void 0!==te&&te.length?be("Chat.OutgoingContextMixedReactionCount",[n.reactors.count,n.seenByUserIds.length]):be("Chat.ContextReactionCount",n.reactors.count,"i"):null!==(ne=n.seenByUserIds)&&void 0!==ne&&ne.length?be("Conversation.ContextMenuSeen",n.seenByUserIds.length,"i"):be("Conversation.ContextMenuNoViews"),a.ZP.createElement("div",{className:"avatars"},null==L?void 0:L.map((e=>a.ZP.createElement(ge.Z,{size:"micro",user:e}))))),P&&a.ZP.createElement(B.Z,{destructive:!0,icon:"delete",onClick:x},be("Delete"))))})),Cs=2*I.Gw,fs=(0,a.X$)((0,s.c$)(((e,{message:t,messageListType:n})=>{var a,s,r;const{threadId:o}=(0,g.Bt)(e)||{},l=(0,g.xs)(e,t.chatId),c=(0,g.Z1)(e,t.chatId),{noOptions:d,canReply:m,canPin:u,canUnpin:h,canDelete:Z,canReport:P,canEdit:p,canForward:E,canFaveSticker:C,canUnfaveSticker:f,canCopy:b,canCopyLink:I,canSelect:y,canDownload:N}=o&&(0,g._k)(e,t,o)||{},S="pinned"===n,w="scheduled"===n,k=c&&(0,v.eA)(c),M=Boolean(c&&(0,v.Bf)(c)&&(0,v.B4)(t)&&!w&&c.membersCount&&c.membersCountDate.now()/1e3-i.EH),T=c&&(0,v.YC)(c.id),L=(0,v.Lo)(t),A=!k&&!w&&!L&&!T&&t.reactions&&!(0,v.JE)(t.reactions)&&t.reactions.canSeeList,R=T&&(null===(a=t.reactions)||void 0===a||null===(s=a.results)||void 0===s?void 0:s.some((e=>e.isChosen))),F=(0,g.EV)(e,t);return{availableReactions:e.availableReactions,noOptions:d,canSendNow:w,canReschedule:w,canReply:!S&&!w&&m,canPin:!w&&u,canUnpin:!w&&h,canDelete:Z,canReport:P,canEdit:!S&&p,canForward:!F&&!w&&E,canFaveSticker:!w&&C,canUnfaveSticker:!w&&f,canCopy:!F&&b,canCopyLink:!F&&!w&&I,canSelect:y,canDownload:!F&&N,activeDownloads:l,canShowSeenBy:M,enabledReactions:null==c||null===(r=c.fullInfo)||void 0===r?void 0:r.enabledReactions,isPrivate:T,hasFullInfo:Boolean(null==c?void 0:c.fullInfo),canShowReactionsCount:A,canShowReactionList:!L&&!w&&(null==c?void 0:c.id)!==i.aw,canRemoveReaction:R}}))((({availableReactions:e,isOpen:t,messageListType:n,chatUsername:r,message:o,album:i,anchor:l,onClose:c,onCloseAnimationEnd:d,noOptions:m,canSendNow:u,hasFullInfo:h,canReschedule:Z,canReply:P,canPin:v,canUnpin:g,canDelete:p,canReport:E,canShowReactionsCount:C,canShowReactionList:f,canRemoveReaction:b,canEdit:I,enabledReactions:y,isPrivate:N,canForward:S,canFaveSticker:w,canUnfaveSticker:k,canCopy:M,canCopyLink:T,canSelect:L,canDownload:A,activeDownloads:R,canShowSeenBy:F})=>{var B;const{setReplyingToId:$,setEditingId:D,pinMessage:x,openForwardMenu:U,faveSticker:O,unfaveSticker:G,toggleMessageSelection:J,sendScheduledMessages:X,rescheduleMessage:_,downloadMessageMedia:Y,cancelMessageMediaDownload:H,loadSeenBy:V,openSeenByModal:j,sendReaction:q,openReactorListModal:W,loadFullChat:Q,loadReactors:ee}=(0,s.uC)(),{transitionClassNames:te}=(0,z.Z)(t,d,void 0,!1),[ne,ae]=(0,a.eJ)(!0),[se,re]=(0,a.eJ)(!1),[oe,ie]=(0,a.eJ)(!1),[le,ce]=(0,a.eJ)(!1),[de,me,ue]=(0,De.Z)();(0,a.d4)((()=>{F&&t&&V({chatId:o.chatId,messageId:o.id})}),[V,t,o.chatId,o.id,F]),(0,a.d4)((()=>{C&&t&&ee({chatId:o.chatId,messageId:o.id})}),[C,t,ee,o.chatId,o.id]),(0,a.d4)((()=>{h||N||!t||Q({chatId:o.chatId})}),[h,t,N,Q,o.chatId]);const he=(0,a.Ye)((()=>{var e,t,n;if(null!==(e=o.reactions)&&void 0!==e&&null!==(t=e.recentReactions)&&void 0!==t&&t.length){var a,r;const e=(0,s.Rd)().users.byId;return null===(a=o.reactions)||void 0===a||null===(r=a.recentReactions)||void 0===r?void 0:r.slice(0,3).map((({userId:t})=>e[t])).filter(Boolean)}if(!o.seenByUserIds)return;const i=(0,s.Rd)().users.byId;return null===(n=o.seenByUserIds)||void 0===n?void 0:n.slice(0,3).map((e=>i[e])).filter(Boolean)}),[null===(B=o.reactions)||void 0===B?void 0:B.recentReactions,o.seenByUserIds]),Ze=i?i.messages.some((e=>R.includes(e.id))):R.includes(o.id),Pe=(0,a.I4)((()=>{ae(!1),re(!0)}),[]),ve=(0,a.I4)((()=>{ae(!1),ie(!0)}),[]),ge=(0,a.I4)((()=>{ae(!1),c()}),[c]),pe=(0,a.I4)((()=>{re(!1),c()}),[c]),Ee=(0,a.I4)((()=>{ie(!1),c()}),[c]),Ce=(0,a.I4)((()=>{ce(!1),c()}),[c]),fe=(0,a.I4)((()=>{ue(),c()}),[ue,c]),be=(0,a.I4)((()=>{$({messageId:o.id}),ge()}),[$,o.id,ge]),Ie=(0,a.I4)((()=>{D({messageId:o.id}),ge()}),[D,o.id,ge]),ye=(0,a.I4)((()=>{ae(!1),ce(!0)}),[]),Ne=(0,a.I4)((()=>{x({messageId:o.id,isUnpin:!0}),ge()}),[x,o.id,ge]),Se=(0,a.I4)((()=>{if(ge(),null!=i&&i.messages){const e=i.messages.map((({id:e})=>e));U({fromChatId:o.chatId,messageIds:e})}else U({fromChatId:o.chatId,messageIds:[o.id]})}),[U,o,ge,i]),we=(0,a.I4)((()=>{ge(),O({sticker:o.content.sticker})}),[ge,o.content.sticker,O]),ke=(0,a.I4)((()=>{ge(),G({sticker:o.content.sticker})}),[ge,o.content.sticker,G]),Me=(0,a.I4)((()=>{const e=null!=i&&i.messages?{messageId:o.id,childMessageIds:i.messages.map((({id:e})=>e)),withShift:!1}:{messageId:o.id,withShift:!1};J(e),ge()}),[ge,o.id,J,i]),Te=(0,a.I4)((()=>{X({chatId:o.chatId,id:o.id}),ge()}),[ge,o.chatId,o.id,X]),Le=(0,a.I4)((()=>{ae(!1),me()}),[me]),Ae=(0,a.I4)((()=>{ge(),j({chatId:o.chatId,messageId:o.id})}),[ge,o.chatId,o.id,j]),Re=(0,a.I4)((()=>{ge(),W({chatId:o.chatId,messageId:o.id})}),[ge,W,o.chatId,o.id]),Fe=(0,a.I4)((e=>{_({chatId:o.chatId,messageId:o.id,scheduledAt:Math.round(e.getTime()/1e3)})}),[o.chatId,o.id,_]),Be=(0,a.I4)((()=>{(0,ss.TE)(`https://t.me/${r||`c/${o.chatId.replace("-","")}`}/${o.id}`),ge()}),[r,ge,o.chatId,o.id]),$e=(0,a.I4)((()=>{((null==i?void 0:i.messages)||[o]).forEach((e=>{Ze?H({message:e}):Y({message:e})})),ge()}),[i,o,ge,Ze,H,Y]),xe=(0,a.I4)(((e,t,n)=>{q({chatId:o.chatId,messageId:o.id,reaction:e,x:t,y:n,startSize:Cs}),ge()}),[ge,o.chatId,o.id,q]),Ue=(0,a.Ye)((()=>(i?i.messages:[o]).map((({id:e})=>e))),[i,o]);if(m)return void ge();const Oe=new Date;return Oe.setFullYear(Oe.getFullYear()+1),a.ZP.createElement("div",{className:["ContextMenuContainer",te].join(" ")},a.ZP.createElement(Es,{availableReactions:e,message:o,isPrivate:N,isOpen:ne,enabledReactions:y,anchor:l,canShowReactionsCount:C,canShowReactionList:f,canRemoveReaction:b,canSendNow:u,canReschedule:Z,canReply:P,canDelete:p,canReport:E,canPin:v,canUnpin:g,canEdit:I,canForward:S,canFaveSticker:w,canUnfaveSticker:k,canCopy:M,canCopyLink:T,canSelect:L,canDownload:A,canShowSeenBy:F,isDownloading:Ze,seenByRecentUsers:he,onReply:be,onEdit:Ie,onPin:ye,onUnpin:Ne,onForward:Se,onDelete:Pe,onReport:ve,onFaveSticker:we,onUnfaveSticker:ke,onSelect:Me,onSend:Te,onReschedule:Le,onClose:ge,onCopyLink:Be,onDownload:$e,onShowSeenBy:Ae,onSendReaction:xe,onShowReactors:Re}),a.ZP.createElement(We,{isOpen:se,isSchedule:"scheduled"===n,onClose:pe,album:i,message:o}),a.ZP.createElement(st,{isOpen:oe,onClose:Ee,messageIds:Ue}),a.ZP.createElement(Qe,{isOpen:le,messageId:o.id,chatId:o.chatId,onClose:Ce}),a.ZP.createElement(Ke,{isOpen:de,withTimePicker:!0,selectedAt:1e3*o.date,maxAt:(0,K._F)(Oe),isFutureMode:!0,onClose:fe,onSubmit:Fe}))}))),bs=(0,a.X$)((0,s.c$)(((e,{fromSticker:t,stickerSetShortName:n})=>{const a=(0,g.Bt)(e),{chatId:s,threadId:r}=a||{},o=s&&(0,g.Z1)(e,s),i=o?(0,v.H5)(o):void 0;return{canSendStickers:Boolean(o&&r&&(0,v.Qm)(o,r)&&(null==i?void 0:i.canSendStickers)),stickerSet:t?(0,g.Ny)(e,t.stickerSetId):n?(0,g.E_)(e,n):void 0}}))((({isOpen:e,fromSticker:t,stickerSetShortName:n,stickerSet:r,canSendStickers:o,onClose:l})=>{const{loadStickers:c,toggleStickerSet:d,sendMessage:m}=(0,s.uC)(),h=(0,a.sO)(null),Z=(0,u.Z)(),{observe:P}=(0,Bn.S1)({rootRef:h,throttleMs:200,isDisabled:!e});(0,a.d4)((()=>{if(e)if(t){const{stickerSetId:e,stickerSetAccessHash:n}=t;c({stickerSetId:e,stickerSetAccessHash:n})}else n&&c({stickerSetShortName:n})}),[e,t,c,n]);const v=(0,a.I4)((e=>{e={...e,isPreloadedGlobally:!0},m({sticker:e}),l()}),[l,m]),g=(0,a.I4)((()=>{r&&(d({stickerSetId:r.id}),l())}),[l,r,d]);return a.ZP.createElement(ke.Z,{className:"StickerSetModal",isOpen:e,onClose:l,hasCloseButton:!0,title:r?(0,ve.Z)(r.title,["emoji","links"]):Z("AccDescrStickerSet")},null!=r&&r.stickers?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{ref:h,className:"stickers custom-scroll"},r.stickers.map((e=>a.ZP.createElement(Un.Z,{sticker:e,size:i.yK,observeIntersection:P,onClick:o?v:void 0,clickArg:e})))),a.ZP.createElement("div",{className:"button-wrapper"},a.ZP.createElement(L.Z,{size:"smaller",fluid:!0,color:r.installedDate?"danger":"primary",onClick:g},Z(r.installedDate?"StickerPack.RemoveStickerCount":"StickerPack.AddStickerCount",r.count,"i")))):a.ZP.createElement(we.Z,null))})));var Is=n(2898);const ys=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.Z1)(e,t);if(!a||a.isRestricted)return{};const s=(0,v.YC)(a.id),r=s?(0,g.dy)(e,t):void 0,o=r&&(0,v.kw)(r);return{chat:a,isMuted:(0,v.i4)(a,(0,g.dZ)(e),(0,g.NJ)(e)),isPrivate:s,canAddContact:o,canDeleteChat:(0,v.cc)(a),hasLinkedChat:Boolean(null==a||null===(n=a.fullInfo)||void 0===n?void 0:n.linkedChatId)}}))((({chatId:e,isOpen:t,withExtraActions:n,anchor:r,isChannel:o,canStartBot:i,canRestartBot:l,canSubscribe:c,canSearch:d,canCall:m,canMute:h,canLeave:Z,canEnterVoiceChat:P,canCreateVoiceChat:v,chat:g,isPrivate:p,isMuted:E,canDeleteChat:C,hasLinkedChat:b,canAddContact:I,onSubscribeChannel:y,onSearchClick:N,onClose:S,onCloseAnimationEnd:w})=>{const{updateChatMutedState:k,enterMessageSelectMode:M,sendBotCommand:T,restartBot:L,joinGroupCall:A,createGroupCall:R,openLinkedChat:F,addContact:$,openCallFallbackConfirm:D}=(0,s.uC)(),[x,U]=(0,a.eJ)(!0),[O,G]=(0,a.eJ)(!1),{x:J,y:X}=r;(0,z.Z)(t,w,void 0,!1);const _=(0,a.I4)((()=>{U(!1),G(!0)}),[]),Y=(0,a.I4)((()=>{U(!1),S()}),[S]),H=(0,a.I4)((()=>{G(!1),S()}),[S]),V=(0,a.I4)((()=>{T({command:"/start"})}),[T]),j=(0,a.I4)((()=>{L({chatId:e})}),[e,L]),K=(0,a.I4)((()=>{k({chatId:e,isMuted:!E}),Y()}),[e,Y,E,k]),q=(0,a.I4)((()=>{v?R({chatId:e}):A({chatId:e}),Y()}),[Y,v,e,A,R]),W=(0,a.I4)((()=>{F({id:e}),Y()}),[e,Y,F]),Q=(0,a.I4)((()=>{$({userId:e}),Y()}),[$,e,Y]),ee=(0,a.I4)((()=>{y(),Y()}),[Y,y]),te=(0,a.I4)((()=>{D(),Y()}),[Y,D]),ne=(0,a.I4)((()=>{N(),Y()}),[Y,N]),ae=(0,a.I4)((()=>{M(),Y()}),[Y,M]);(0,a.d4)((()=>(hs(),Zs)),[]);const se=(0,u.Z)();return a.ZP.createElement(Is.Z,null,a.ZP.createElement("div",{className:"HeaderMenuContainer"},a.ZP.createElement(vs.Z,{isOpen:x,positionX:"right",style:`left: ${J}px;top: ${X}px;`,onClose:Y},n&&i&&a.ZP.createElement(B.Z,{icon:"bots",onClick:V},se("BotStart")),n&&l&&a.ZP.createElement(B.Z,{icon:"bots",onClick:j},se("BotRestart")),n&&c&&a.ZP.createElement(B.Z,{icon:o?"channel":"group",onClick:ee},se(o?"ProfileJoinChannel":"ProfileJoinGroup")),I&&a.ZP.createElement(B.Z,{icon:"add-user",onClick:Q},se("AddContact")),f.wB&&m&&a.ZP.createElement(B.Z,{icon:"phone",onClick:te},se("Call")),f.wB&&d&&a.ZP.createElement(B.Z,{icon:"search",onClick:ne},se("Search")),h&&a.ZP.createElement(B.Z,{icon:E?"unmute":"mute",onClick:K},se(E?"ChatsUnmute":"ChatsMute")),(P||v)&&a.ZP.createElement(B.Z,{icon:"voice-chat",onClick:q},se(v?"StartVoipChat":"VoipGroupJoinCall")),b&&a.ZP.createElement(B.Z,{icon:o?"comments":"channel",onClick:W},se(o?"ViewDiscussion":"lng_profile_view_channel")),a.ZP.createElement(B.Z,{icon:"select",onClick:ae},se("ReportSelectMessages")),Z&&a.ZP.createElement(B.Z,{destructive:!0,icon:"delete",onClick:_},se(p?"DeleteChatUser":C?"GroupInfo.DeleteAndExit":o?"LeaveChannel":"Group.LeaveGroup"))),g&&a.ZP.createElement(gt.Z,{isOpen:O,onClose:H,chat:g})))})));var Ns=n(9589);const Ss=(0,G.Ds)((e=>e()),200,!1),ws=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.jr)(e);if(!t)return{};const{query:n,results:a}=(0,g.n5)(e)||{},{totalCount:s,foundIds:r}=a||{};return{chat:t,query:n,totalCount:s,foundIds:r,isHistoryCalendarOpen:Boolean(e.historyCalendarSelectedAt)}}))((({isActive:e,chat:t,query:n,totalCount:r,foundIds:o,isHistoryCalendarOpen:i})=>{const{setLocalTextSearchQuery:l,searchTextMessagesLocal:c,focusMessage:d,closeLocalTextSearch:m,openHistoryCalendar:u}=(0,s.uC)(),h=(0,a.sO)(null),[Z,P]=(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===h.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&&o&&o.length?(d({chatId:t.id,messageId:o[o.length-1]}),P(0)):P(-1)}),[t,d,o]),(0,a.d4)((()=>{Array.from(document.querySelectorAll("input")).forEach((t=>{t.disabled=Boolean(e&&t!==h.current)})),Array.from(document.querySelectorAll("div[contenteditable]")).forEach((t=>{t.contentEditable=e?"false":"true"}))}),[e]),(0,a.d4)((()=>{e||h.current.blur()}),[e]),(0,a.bt)((()=>{document.querySelector("#MobileSearch input").blur()}),[i]);const v=(0,a.I4)((e=>{l({query:e}),e.length&&Ss(c)}),[c,l]),g=(0,a.I4)((()=>{if(t&&o){const e=Z+1;d({chatId:t.id,messageId:o[o.length-1-e]}),P(e)}}),[t,Z,d,o]),p=(0,a.I4)((()=>{if(t&&o){const e=Z-1;d({chatId:t.id,messageId:o[o.length-1-e]}),P(e)}}),[t,Z,d,o]);return a.ZP.createElement("div",{id:"MobileSearch",className:e?"active":""},a.ZP.createElement("div",{className:"header"},a.ZP.createElement(L.Z,{size:"smaller",round:!0,color:"translucent",onClick:m},a.ZP.createElement("i",{className:"icon-arrow-left"})),a.ZP.createElement(Ns.Z,{ref:h,value:n,onChange:v})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement("div",{className:"counter"},n?null!=o&&o.length?`${Z+1} of ${r}`:o&&!o.length?"No results":"":a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>u({selectedAt:(0,K._F)(Date.now())}),ariaLabel:"Search messages by date"},a.ZP.createElement("i",{className:"icon-calendar"}))),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:g,disabled:!o||!o.length||Z===o.length-1},a.ZP.createElement("i",{className:"icon-up"})),a.ZP.createElement(L.Z,{round:!0,size:"smaller",color:"translucent",onClick:p,disabled:!o||!o.length||0===Z},a.ZP.createElement("i",{className:"icon-down"}))))})));var ks=n(5376),Ms=n(9295),Ts=n(3575),Ls=n(971),As=n(7002),Rs=n(3616);function Fs(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 Bs=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,$s.Z)(a,r[t],e,10)}}var xs=n(3570);function Us({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,xs.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,tt.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 Os=(0,a.X$)((({isOpen:e,onClose:t,onInsertUserName:n,filteredUsers:r})=>{const o=(0,a.sO)(null),{shouldRender:i,transitionClassNames:l}=(0,z.Z)(e,void 0,void 0,!1),c=(0,a.I4)(((e,t=!1)=>{const a=(0,s.Rd)().users.byId[e];a&&n(a,t)}),[n]),d=(0,a.I4)((e=>{c(e.id,!0)}),[c]),m=Us({isActive:e,items:r,onSelect:d,shouldSelectOnTab:!0,shouldSaveSelectionOnUpdateItems:!0,onClose:t});(0,a.d4)((()=>{Ds(".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(Le.Z,{key:e,className:"chat-item-clickable scroll-item",onClick:()=>c(e),focus:m===t},a.ZP.createElement(Re.Z,{userId:e,avatarSize:"small",withUsername:!0})))))}));var Gs=n(9830);const Js=(0,a.X$)((({chatId:e,threadId:t,attachments:n,caption:s,isReady:r,currentUserId:o,groupChatMembers:l,recentEmojis:c,baseEmojiKeywords:d,emojiKeywords:m,addRecentEmoji:h,onCaptionUpdate:Z,onSend:v,onFileAppend:g,onClear:p})=>{const C=(0,Ls.Y)(s),f=(0,a.sO)(),b=(0,P.Z)(n),I=n.length?n:b,y=Boolean(n.length),[N,S,w]=(0,De.Z)(),k=Boolean(I&&I.every((e=>e.quick))),M=(0,u.Z)(),{isMentionTooltipOpen:T,closeMentionTooltip:A,insertMention:R,mentionFilteredUsers:F}=(0,Ms.Z)(y,C,Z,i.nY,l,void 0,o),{isEmojiTooltipOpen:B,closeEmojiTooltip:$,filteredEmojis:D,insertEmoji:x}=(0,Ts.Z)(y,C,c,i.nY,Z,d,m,!r);(0,a.d4)((()=>y?(0,E.Z)(p):void 0),[y,p]);const U=(0,a.I4)((()=>{y&&v()}),[y,v]),O=(0,a.I4)((e=>{e.preventDefault(),w();const{dataTransfer:{files:t}}=e;if(null!=t&&t.length){const e=k?Array.from(t).filter((e=>e.type&&i.dI.has(e.type))):Array.from(t);g(e,k)}}),[k,g,w]);if(!I)return;const G=I.every((e=>i.oG.has(e.mimeType))),J=I.every((e=>i.wG.has(e.mimeType))),X=I.every((e=>e.mimeType.startsWith("audio/")));let _="";return _=M(G?"PreviewSender.SendPhoto":J?"PreviewSender.SendVideo":X?"PreviewSender.SendAudio":"PreviewSender.SendFile",I.length,"i"),a.ZP.createElement(ke.Z,{isOpen:y,onClose:p,header:function(){if(I)return a.ZP.createElement("div",{className:"modal-header-condensed",dir:M.isRtl?"rtl":void 0},a.ZP.createElement(L.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:"Cancel attachments",onClick:p},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("div",{className:"modal-title"},_),a.ZP.createElement(L.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:U},M("Send")))}(),className:"AttachmentModal "+(N?"hovered":"")},a.ZP.createElement("div",{className:"drop-target",onDragEnter:S,onDrop:O,onDragOver:function(e){e.preventDefault(),e.stopPropagation(),f.current&&(window.clearTimeout(f.current),f.current=void 0)},onDragLeave:e=>{const{relatedTarget:t,target:n}=e;n.matches(".drop-target")&&!t&&(f.current=window.setTimeout(w,150)),n&&n.closest(".AttachmentModal.hovered")||(t&&e.stopPropagation(),w())},"data-attach-description":M("Preview.Dragging.AddItems",10)},k?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(As.Z,{name:e.filename,extension:(0,ks.mD)(e.filename,e.mimeType),previewData:e.previewBlobUrl,size:e.size,smaller:!0})))),a.ZP.createElement("div",{className:"attachment-caption-wrapper"},a.ZP.createElement(Os,{isOpen:T,onClose:A,onInsertUserName:R,filteredUsers:F}),a.ZP.createElement(Gs.Z,{isOpen:B,emojis:D,onClose:$,onEmojiSelect:x,addRecentEmoji:h}),a.ZP.createElement(Rs.Z,{id:"caption-input-text",chatId:e,threadId:t,isAttachmentModalInput:!0,html:s,editableInputId:i.nY,placeholder:M("Caption"),onUpdate:Z,onSend:v,canAutoFocus:Boolean(r&&n.length)}))))}));var Xs=n(3099);const _s=(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),[v,g]=(0,a.eJ)(!1),[p,C]=(0,a.eJ)(),[f,b]=(0,a.eJ)(),[I,y]=(0,a.eJ)(!1),N=(0,u.Z)(),S=(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),g(!1),C(""),b(""),y(!1))}),[e]),(0,a.d4)((()=>S(s)),[S,e]),(0,a.bt)((()=>{const e=o.current;e&&p!==e.innerHTML&&(e.innerHTML=p)}),[p]);const w=(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"}))}))}),[]),k=(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?w(a):d(a):w(),void y(!0);if(v&&(!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},...v&&{quiz:!0}}};if(v){const{text:e,entities:t}=p&&(0,Xs.Z)(p.substring(0,200))||{};s.quiz={correctAnswers:[f],...e&&{solution:e},...t&&{solutionEntities:t}}}t(s)}),[e,i,c,v,f,m,Z,t,w,p]),M=(0,a.I4)(((e,t)=>{const n=[...c];n[e]=t,n[n.length-1].trim().length&&n.length<10?w(n):d(n)}),[c,w]),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]),R=(0,a.I4)((e=>{h(e.target.checked)}),[]),F=(0,a.I4)((e=>{P(e.target.checked)}),[]),B=(0,a.I4)((e=>{g(e.target.checked)}),[]),$=(0,a.I4)((e=>{13===e.keyCode&&k()}),[k]),D=(0,a.I4)((()=>{if(I&&!i.trim().length)return N("lng_polls_choose_question")}),[I,N,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 N("lng_polls_choose_answers")}),[I,N,c]);function U(){return c.map(((e,t)=>a.ZP.createElement("div",{className:"option-wrapper"},a.ZP.createElement(Me.Z,{label:t!==c.length-1||10===c.length?N("OptionHint"):N("CreatePoll.AddOption"),error:x(t),value:e,onChange:e=>M(t,e.currentTarget.value),onKeyPress:$}),t!==c.length-1&&a.ZP.createElement(L.Z,{className:"option-remove-button",round:!0,color:"translucent",size:"smaller",ariaLabel:N("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(L.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"},N("NewPoll")),a.ZP.createElement(L.Z,{color:"primary",size:"smaller",className:"modal-action-button",onClick:k},N("Create"))),className:"PollModal"},a.ZP.createElement(Me.Z,{ref:s,label:N("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"},N("PollOptions")),I&&function(){const e=c.map((e=>e.trim())).filter((e=>e.length));return v&&(!f||!e[Number(f)])&&a.ZP.createElement("p",{className:"error"},N("lng_polls_choose_correct"))}(),v?a.ZP.createElement(at.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(Cn.Z,{label:N("PollAnonymous"),checked:m,onChange:R}),a.ZP.createElement(Cn.Z,{label:N("PollMultiple"),checked:Z,disabled:v,onChange:F}),a.ZP.createElement(Cn.Z,{label:N("PollQuiz"),checked:v,disabled:Z,onChange:B}),v&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("h3",{className:"options-header"},N("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"},N("CreatePoll.ExplanationInfo")))))}));var zs=n(6503),Ys=n(4284),Hs=n(1367);const Vs=(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"}))})),js=(0,a.X$)((({category:e,index:t,allEmojis:n,observeIntersection:s,shouldRender:r,onEmojiSelect:o})=>{const i=(0,a.sO)(null);(0,Bn._N)(i,s);const l=(0,$n.Z)(r),c=(0,u.Z)(),d=f.wB?Math.floor((b.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(Vs,{key:s.id,emoji:s,onClick:o})}))))})),Ks={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"},qs=[];let Ws,Qs,er;const tr=(0,a.X$)((0,s.c$)((e=>(0,me.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,Bn.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-",""));qs[n]=e.isIntersecting}));const t=qs.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&Z(t[Math.floor(t.length/2)].index)}));(0,Ct.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,Hs.Z)(e,t)}),[l,h]);const v=(0,u.Z)(),g=(0,a.Ye)((()=>{if(!l)return Zt.D;const e=[...l];return null!=s&&s.length&&e.unshift({id:"recent",name:v("RecentStickers"),emojis:s}),e}),[l,v,s]);(0,a.d4)((()=>{setTimeout((()=>{const e=()=>{c(er.categories),m(er.emojis)};er?e():async function(){return Ws||(Ws=n.e(501).then(n.t.bind(n,7501,19)),Qs=(await Ws).default,er=(0,Ys.NM)(Qs)),Ws}().then(e)}),200)}),[]);const p=(0,a.I4)((e=>{Z(e);const t=document.getElementById(`emoji-category-${e}`);(0,$s.Z)(r.current,t,"start",50,800)}),[]),E=(0,a.I4)(((e,n)=>{t(e,n)}),[t]),C=(0,Ft.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:v.isRtl?"rtl":""},g.map((function(e,t){const n=Ks[e.id];return n&&a.ZP.createElement(L.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")},g.map(((e,t)=>a.ZP.createElement(js,{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))})));var nr=n(6389);const ar=f.wB?8:16,sr=(0,a.X$)((({stickerSet:e,loadAndPlay:t,index:n,observeIntersection:s,shouldRender:r,onStickerSelect:o,onStickerUnfave:l})=>{const c=(0,a.sO)(null);(0,Bn._N)(c,s);const d=(0,$n.Z)(r),m=f.wB?Math.floor((b.Z.get().width-8)/(i.Q+ar)):5,u=Math.ceil(e.count/m)*(i.Q+ar);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(Un.Z,{key:n.id,sticker:n,size:i.Q,observeIntersection:s,noAnimate:!t,onClick:o,clickArg:n,onUnfaveClick:"favorite"===e.id?l:void 0})))))})),rr=[],or=(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}}))((({chatId:e,threadId:t,className:n,loadAndPlay:r,canSendStickers:o,recentStickers:l,favoriteStickers:c,addedSetIds:d,stickerSetsById:m,shouldPlay:h,onStickerSelect:Z})=>{const{loadRecentStickers:P,addRecentSticker:v,unfaveSticker:g}=(0,s.uC)(),p=(0,a.sO)(null),E=(0,a.sO)(null),[C,b]=(0,a.eJ)(0),I=(0,nr.Z)(e,t),{observe:y}=(0,Bn.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-",""));rr[n]=e.isIntersecting}));const t=rr.map(((e,t)=>({index:t,isIntersecting:e}))).filter((({isIntersecting:e})=>e));t.length&&b(t[Math.floor(t.length/2)].index)})),{observe:N}=(0,Bn.S1)({rootRef:E}),S=(0,u.Z)(),w=Boolean(d),k=(0,a.Ye)((()=>d?[{id:"recent",title:S("RecentStickers"),stickers:l,count:l.length},{id:"favorite",title:S("FavoriteStickers"),stickers:c,count:c.length},...d.map((e=>m[e])).filter(Boolean)]:Zt.D),[d,S,l,c,m]),M=(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)((()=>{r&&(P(),I({type:"chooseSticker"}))}),[r,P,I]),(0,Ct.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,Hs.Z)(e,t)}),[w,C]);const T=(0,a.I4)((e=>{b(e);const t=document.getElementById(`sticker-set-${e}`);(0,$s.Z)(p.current,t,"start",void 0,500)}),[]),A=(0,a.I4)((e=>{Z(e),v({sticker:e})}),[v,Z]),R=(0,a.I4)((e=>{g({sticker:e})}),[g]),F=(0,a.I4)((()=>{I({type:"chooseSticker"})}),[I]),B=(0,Ft.Z)([],i.Y),$=(0,X.Z)("StickerPicker",n);return w&&B&&!M&&o?a.ZP.createElement("div",{className:$},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(L.Z,{key:e.id,className:r,ariaLabel:e.title,round:!0,faded:"recent"===e.id||"favorite"===e.id,color:"translucent",onClick:()=>T(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(Dn,{stickerSet:e,observeIntersection:N}):a.ZP.createElement(xn,{stickerSet:e,observeIntersection:N})):a.ZP.createElement(Un.Z,{key:e.id,sticker:s,size:i.DC,title:e.title,className:r,observeIntersection:N,onClick:T,clickArg:t})}))),a.ZP.createElement("div",{ref:p,onMouseMove:F,className:(0,X.Z)("StickerPicker-main no-selection",f.$b?"no-scrollbar":"custom-scroll")},k.map(((e,t)=>a.ZP.createElement(sr,{key:e.id,stickerSet:e,loadAndPlay:Boolean(h&&r),index:t,observeIntersection:y,shouldRender:C>=t-1&&C<=t+1,onStickerSelect:A,onStickerUnfave:R}))))):a.ZP.createElement("div",{className:$},o?M?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 ir=n(386);function lr(){return(lr=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,Bn.Op)(c,t)&&!n,P=(0,h.Z)(`${u}?size=m`,!Z,r.IU.BlobUrl),v=(0,ea.Z)(null===(l=e.thumbnail)||void 0===l?void 0:l.dataUri,Boolean(P)),g=(0,h.Z)(u,!Z,r.IU.BlobUrl),p=Boolean(Z&&g),{isBuffered:E,bufferingHandlers:C}=(0,Y.Z)(!0),f=Z&&!E,b=Z&&E;(0,V.Z)(d,[p]);const I=(0,a.I4)((()=>o({...e,blobUrl:g})),[o,e,g]),y=(0,X.Z)("GifButton",e.width&&e.height&&e.width({savedGifs:e.gifs.saved.gifs})))((({className:e,loadAndPlay:t,canSendGifs:n,savedGifs:r,onGifSelect:o})=>{const{loadSavedGifs:l}=(0,s.uC)(),c=(0,a.sO)(null),{observe:d}=(0,Bn.S1)({rootRef:c,debounceMs:300});(0,a.d4)((()=>{t&&l()}),[t,l]);const m=(0,Ft.Z)([],i.Y);return a.ZP.createElement("div",{ref:c,className:(0,X.Z)("GifPicker",e,f.$b?"no-scrollbar":"custom-scroll")},n?m&&r&&r.length?r.map((e=>a.ZP.createElement(cr,{key:e.id,gif:e,observeIntersection:d,isDisabled:!t,onClick:o}))):m&&r?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 mr;!function(e){e[e.Emoji=0]="Emoji",e[e.Stickers=1]="Stickers",e[e.GIFs=2]="GIFs"}(mr||(mr={}));const ur=Object.values(mr).filter((e=>"string"==typeof e)),hr={[mr.Emoji]:"icon-smile",[mr.Stickers]:"icon-stickers",[mr.GIFs]:"icon-gifs"},Zr=(0,a.X$)((({activeTab:e,onSwitchTab:t,onRemoveSymbol:n,onSearchOpen:s})=>{const r=(0,u.Z)();function o(n){return a.ZP.createElement(L.Z,{className:"symbol-tab-button "+(e===n?"activated":""),onClick:()=>t(n),ariaLabel:ur[n],round:!0,faded:!0,color:"translucent"},a.ZP.createElement("i",{className:hr[n]}))}const i=(0,a.I4)((()=>{s(e===mr.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!==mr.Emoji&&a.ZP.createElement(L.Z,{className:"symbol-search-button",ariaLabel:e===mr.Stickers?"Search Stickers":"Search GIFs",round:!0,faded:!0,color:"translucent",onClick:i},a.ZP.createElement("i",{className:"icon-search"})),o(mr.Emoji),o(mr.Stickers),o(mr.GIFs),e===mr.Emoji&&a.ZP.createElement(L.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 Pr=!1;const vr=(0,a.X$)((0,s.c$)((e=>({isLeftColumnShown:e.isLeftColumnShown})))((({chatId:e,threadId:t,isOpen:n,canSendStickers:s,canSendGifs:r,isLeftColumnShown:o,onLoad:i,onClose:l,onEmojiSelect:c,onStickerSelect:d,onGifSelect:m,onRemoveSymbol:h,onSearchOpen:Z,addRecentEmoji:P})=>{const[v,g]=(0,a.eJ)(0),[p,E]=(0,a.eJ)([]),[C,b]=(0,zs.Z)(n,l,void 0,f.wB),{shouldRender:I,transitionClassNames:y}=(0,z.Z)(n,l,!1,!1);!Pr&&n&&(Pr=!0),(0,a.d4)((()=>{i()}),[i]),(0,a.bt)((()=>{if(f.wB)return n&&(document.body.classList.add("enable-symbol-menu-transforms"),document.body.classList.add("is-symbol-menu-open")),()=>{n&&(0,G.T2)((()=>{document.body.classList.remove("is-symbol-menu-open"),setTimeout((()=>{document.body.classList.remove("enable-symbol-menu-transforms")}),350)}))}}),[n]);const N=(0,a.sO)(p);N.current=p,(0,a.d4)((()=>{N.current.length&&(N.current.forEach((e=>{P({emoji:e})})),E([]))}),[n,v,P]);const S=(0,a.I4)(((e,t)=>{E((e=>[...e,t])),c(e)}),[c]),w=(0,a.I4)((e=>{l(),Z(e)}),[l,Z]),k=(0,a.I4)((e=>{d(e,!0)}),[d]),M=(0,u.Z)();function T(o,i){switch(v){case mr.Emoji:return a.ZP.createElement(tr,{className:"picker-tab",onEmojiSelect:S});case mr.Stickers:return a.ZP.createElement(or,{className:"picker-tab",loadAndPlay:!!s&&n&&(o||i),canSendStickers:s,onStickerSelect:k,chatId:e,threadId:t});case mr.GIFs:return a.ZP.createElement(dr,{className:"picker-tab",loadAndPlay:!!r&&n&&(o||i),canSendGifs:r,onGifSelect:m})}}const A=a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement("div",{className:"SymbolMenu-main",onClick:function(e){e.stopPropagation()}},Pr&&a.ZP.createElement(R.Z,{name:"slide",activeKey:v,renderCount:ur.length},T)),f.wB&&a.ZP.createElement(L.Z,{round:!0,faded:!0,color:"translucent",ariaLabel:M("Close"),className:"symbol-close-button",size:"tiny",onClick:l},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement(Zr,{activeTab:v,onSwitchTab:g,onRemoveSymbol:h,onSearchOpen:w}));if(f.wB){if(!I)return;const e=(0,X.Z)("SymbolMenu mobile-menu",y,!o&&"middle-column-open");return a.ZP.createElement(Is.Z,null,a.ZP.createElement("div",{className:e},A))}return a.ZP.createElement(vs.Z,{isOpen:n,positionX:"left",positionY:"bottom",onClose:l,className:"SymbolMenu",onCloseAnimationEnd:l,onMouseEnter:f.$b?void 0:C,onMouseLeave:f.$b?void 0:b,noCloseOnBackdrop:!f.$b},A)}))),gr=(0,a.X$)((({isOpen:e,canAttachMedia:t,canAttachPolls:n,onFileSelect:s,onPollCreate:r,onClose:o})=>{const[l,c]=(0,zs.Z)(e,o),d=(0,a.I4)(((e,t)=>{const{files:n}=e.target;n&&n.length>0&&s(Array.from(n),t)}),[s]),m=(0,a.I4)((()=>{Yn(Array.from(i.dI).join(","),(e=>d(e,!0)))}),[d]),h=(0,a.I4)((()=>{Yn("*",(e=>d(e,!1)))}),[d]),Z=(0,u.Z)();return a.ZP.createElement(vs.Z,{isOpen:e,autoClose:!0,positionX:"right",positionY:"bottom",onClose:o,className:"AttachMenu fluid",onCloseAnimationEnd:o,onMouseEnter:f.$b?void 0:l,onMouseLeave:f.$b?void 0:c,noCloseOnBackdrop:!f.$b},!t&&a.ZP.createElement(B.Z,{className:"media-disabled",disabled:!0},"Posting media content is not allowed in this group."),t&&a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(B.Z,{icon:"photo",onClick:m},Z("AttachmentMenu.PhotoOrVideo")),a.ZP.createElement(B.Z,{icon:"document",onClick:h},Z("AttachDocument"))),n&&a.ZP.createElement(B.Z,{icon:"poll",onClick:r},Z("Poll")))})),pr=(0,a.X$)((({withAvatar:e,focus:t,botCommand:n,bot:s,onClick:r})=>a.ZP.createElement(Le.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,ve.Z)(n.description)))))),Er=(0,a.X$)((0,s.c$)((e=>({usersById:e.users.byId})))((({usersById:e,isOpen:t,withUsername:n,botCommands:r,onClick:o,onClose:i})=>{const{sendBotCommand:l}=(0,s.uC)(),c=(0,a.sO)(null),{shouldRender:d,transitionClassNames:m}=(0,z.Z)(t,void 0,void 0,!1),u=(0,a.I4)((({botId:t,command:a})=>{const s=e[t];l({command:`/${a}${n&&s?`@${s.username}`:""}`,botId:t}),o()}),[o,l,e,n]),h=Us({isActive:t,items:r,onSelect:u,onClose:i});(0,a.d4)((()=>{r&&!r.length&&i()}),[r,i]),(0,a.d4)((()=>{Ds(".chat-item-clickable",h,c)}),[h]);const Z=(0,P.Z)(r&&r.length?r:void 0,d),v=r&&!r.length?Z:r;if(!d||v&&!v.length)return;const g=(0,X.Z)("BotCommandTooltip composer-tooltip custom-scroll",m);return a.ZP.createElement("div",{className:g,ref:c},v&&v.map(((t,n)=>a.ZP.createElement(pr,{key:`${t.botId}_${t.command}`,botCommand:t,bot:e[t.botId],withAvatar:!0,onClick:u,focus:h===n}))))}))),Cr=(0,a.X$)((({isOpen:e,botCommands:t,onClose:n})=>{const{sendBotCommand:r}=(0,s.uC)(),[o,i]=(0,zs.Z)(e,n,void 0,f.wB),l=(0,a.I4)((e=>{r({command:`/${e.command}`,botId:e.botId}),n()}),[n,r]);return a.ZP.createElement(vs.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:n,className:"BotCommandMenu",onCloseAnimationEnd:n,onMouseEnter:f.$b?void 0:o,onMouseLeave:f.$b?void 0:i,noCloseOnBackdrop:!f.$b},t.map((e=>a.ZP.createElement(pr,{key:e.command,botCommand:e,onClick:l}))))})),fr=(0,a.X$)((0,s.c$)((e=>{const{stickers:t}=e.stickers.forEmoji;return{stickers:t}}))((({chatId:e,threadId:t,isOpen:n,onStickerSelect:r,stickers:o})=>{const{clearStickersForEmoji:l}=(0,s.uC)(),c=(0,a.sO)(null),{shouldRender:d,transitionClassNames:m}=(0,z.Z)(n,void 0,void 0,!1),u=(0,P.Z)(o,!0),h=o||u,Z=(0,nr.Z)(e,t),{observe:v}=(0,Bn.S1)({rootRef:c,throttleMs:200});(0,a.d4)((()=>n?(0,E.Z)(l):void 0),[n,l]);const g=(0,X.Z)("StickerTooltip composer-tooltip custom-scroll",m,!(null!=h&&h.length)&&"hidden");return a.ZP.createElement("div",{ref:c,className:g,onMouseEnter:f.$b?void 0:()=>{document.body.classList.add("no-select")},onMouseLeave:f.$b?void 0:()=>{document.body.classList.remove("no-select")},onMouseMove:()=>{Z({type:"chooseSticker"})}},d&&h?h.map((e=>a.ZP.createElement(Un.Z,{key:e.id,sticker:e,size:i.Q,observeIntersection:v,onClick:r,clickArg:e}))):d?a.ZP.createElement(we.Z,null):void 0)}))),br=(0,a.X$)((({isOpen:e,onSilentSend:t,onScheduleSend:n,onClose:s,onCloseAnimationEnd:r})=>{const[o,i]=(0,zs.Z)(e,s),l=(0,u.Z)();return a.ZP.createElement(vs.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 Ir=n(2420),yr=n(3283),Nr=n(2678);const Sr=(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.Z)(e,void 0,void 0,!1),c=(0,Nr.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=Us({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}=Fs(n,".EmojiButton",8,!0,!0,!0);if(!s.length||!s[e])return;const r=a[0];if(!a.includes(e)||e===r&&!Bs(n,s[r],!0)){const t="start"==(e>a[a.length-1]?"start":"end")?44*e:0;(0,Hs.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(Vs,{key:e.id,emoji:e,focus:u===t,onClick:m}))):i?a.ZP.createElement(we.Z,null):void 0)})),wr=(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,it.Xv)(e,1)),a.ZP.createElement(Le.Z,{focus:r,className:"BaseResult chat-item-clickable",onMouseDown:ir.b,onClick:i},a.ZP.createElement("span",{className:"thumb"},"string"==typeof l?(0,ve.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)))})),kr=(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,$n.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:v,description:g}=n;return a.ZP.createElement(wr,{focus:e,thumbUrl:d||(null===(r=i)||void 0===r?void 0:r.dataUri)||c,transitionClassNames:m,title:v,description:g,onClick:u})})),Mr=(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(wr,{focus:e,thumbnail:i,title:s||r,description:o,onClick:l})})),Tr=(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(cr,{gif:s,observeIntersection:t,className:"chat-item-clickable",onClick:r})})),Lr=(0,a.X$)((({inlineResult:e,observeIntersection:t,onClick:n})=>{const{sticker:s}=e;if(s)return a.ZP.createElement(Un.Z,{sticker:s,size:i.zq,observeIntersection:t,title:s.emoji,className:"chat-item-clickable",onClick:n,clickArg:e})})),Ar=(0,G.P2)((e=>e()),500,!0),Rr=(0,a.X$)((({isOpen:e,botId:t,isGallery:n,inlineBotResults:r,switchPm:i,loadMore:l,onClose:c,onSelectResult:d})=>{const{openChat:m,startBot:u}=(0,s.uC)(),h=(0,a.sO)(null),{shouldRender:Z,transitionClassNames:v}=(0,z.Z)(e,void 0,void 0,!1),{observe:g}=(0,Bn.S1)({rootRef:h,debounceMs:200,isDisabled:!e}),p=(0,a.I4)((({direction:e})=>{e===o.Uq.Backwards&&Ar(l)}),[l]),E=Us({isActive:e,shouldRemoveSelectionOnReset:n,noArrowNavigation:n,items:r,onSelect:d,onClose:c});(0,a.d4)((()=>{Ds(".chat-item-clickable",E,h)}),[E]);const C=(0,a.I4)((()=>{m({id:t}),u({botId:t,param:i.startParam})}),[t,m,u,i]),b=(0,P.Z)(null!=r&&r.length?r:void 0,Z),I=r&&!r.length?b:r;if(!Z||!(null!=I&&I.length||i))return;const y=(0,X.Z)("InlineBotTooltip composer-tooltip",f.$b?"no-scrollbar":"custom-scroll",n&&"gallery",v);return a.ZP.createElement(Te.Z,{ref:h,className:y,items:I,itemSelector:".chat-item-clickable",noFastList:!0,onLoadMore:p,sensitiveArea:160},i&&a.ZP.createElement(Le.Z,{ripple:!0,className:"switch-pm scroll-item",onClick:C},a.ZP.createElement("span",{className:"title"},i.text)),(null==I?void 0:I.length)&&I.map(((e,t)=>{switch(e.type){case"gif":return a.ZP.createElement(Tr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:d});case"photo":return a.ZP.createElement(kr,{key:e.id,isForGallery:n,inlineResult:e,onClick:d});case"sticker":return a.ZP.createElement(Lr,{key:e.id,inlineResult:e,observeIntersection:g,onClick:d});case"video":case"file":case"game":return a.ZP.createElement(kr,{key:e.id,focus:E===t,inlineResult:e,onClick:d});case"article":case"audio":return a.ZP.createElement(Mr,{key:e.id,focus:E===t,inlineResult:e,onClick:d});default:return}})))})),Fr=(0,a.X$)((({isOpen:e,onClose:t,chatId:n,selectedSendAsId:r,sendAsIds:o})=>{const{saveDefaultSendAs:i}=(0,s.uC)(),l=(0,s.Rd)().users.byId,c=(0,s.Rd)().chats.byId,d=(0,u.Z)(),m=(0,a.sO)(null),[h,Z,P]=(0,zs.Z)(e,t,void 0);(0,a.d4)((()=>{e&&P()}),[e,P]);const g=(0,a.I4)((e=>{t(),i({chatId:n,sendAsId:e})}),[n,t,i]),p=Us({isActive:e,items:o,onSelect:g,shouldSelectOnTab:!0,shouldSaveSelectionOnUpdateItems:!0,onClose:t});return(0,a.d4)((()=>{Ds(".chat-item-clickable",p,m)}),[p]),(0,a.d4)((()=>{o&&!o.length&&t()}),[o,t]),a.ZP.createElement(vs.Z,{isOpen:e,positionX:"left",positionY:"bottom",onClose:t,className:"SendAsMenu",onCloseAnimationEnd:t,onMouseEnter:f.$b?void 0:h,onMouseLeave:f.$b?void 0:Z,noCloseOnBackdrop:!f.$b},a.ZP.createElement("div",{className:"send-as-title",dir:"auto"},d("SendMessageAsTitle")),l&&c&&(null==o?void 0:o.map(((e,t)=>{const n=(0,v.YC)(e)?l[e]:void 0,s=n?void 0:c[e],o=n?(0,v.Js)(n):null==s?void 0:s.title;return a.ZP.createElement(Le.Z,{key:e,className:"SendAsItem chat-item-clickable scroll-item with-avatar",onClick:()=>g(e),focus:p===t},a.ZP.createElement(ge.Z,{size:"small",user:n,chat:s,className:(0,X.Z)(r===e&&"selected")}),a.ZP.createElement("div",{className:"info"},a.ZP.createElement("div",{className:"title"},a.ZP.createElement("h3",{dir:"auto"},o&&(0,ve.Z)(o))),a.ZP.createElement("span",{className:"subtitle"},n?d("VoipGroupPersonalAccount"):d("Subscribers",null==s?void 0:s.membersCount,"i"))))}))))}));var Br=n(6844);const $r=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t),a=n&&(0,g.Zw)(e,n.id);if(!n||!a)return{};const{query:s,results:r}=(0,g.n5)(e)||{},{totalCount:o,foundIds:i}=r||{};return{chat:n,messagesById:a,query:s,totalCount:o,foundIds:i}}))((({chatId:e,threadId:t,onClose:n,isActive:r,chat:o,messagesById:i,query:l,totalCount:c,foundIds:d})=>{const{searchTextMessagesLocal:h,focusMessage:Z}=(0,s.uC)(),P=(0,u.Z)(),p=(0,a.Ye)((()=>{if(!(l&&d&&d.length&&i))return Zt.D;const n=d.map((n=>{const a=i[n];if(!a)return;const r=a.senderId?(0,g.dy)((0,s.Rd)(),a.senderId):void 0;let l;if(o&&(0,v.eA)(o))l=o;else if(a.forwardInfo){const{isChannelPost:e,fromChatId:t}=a.forwardInfo;l=e&&t?(0,g.Z1)((0,s.Rd)(),t):void 0}else l=a.senderId?(0,g.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,me.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,Ne.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(Te.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,v.U)(P,n):(0,v.Js)(t),o=(0,v.MK)(P,e);return a.ZP.createElement(Le.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,ve.Z)(r)),a.ZP.createElement(Br.Z,{message:e})),a.ZP.createElement("div",{className:"subtitle",dir:"auto"},(0,ve.Z)(o,["emoji","highlight"],{highlight:l}))))})))})));var Dr=n(9290);const xr=(0,a.X$)((0,s.c$)(((e,{stickerSetId:t})=>({set:(0,g.Ny)(e,t),shouldPlay:(0,g.yB)(e)})))((({stickerSetId:e,observeIntersection:t,set:n,shouldPlay:r,isSomeModalOpen:o,onModalToggle:l})=>{const{loadStickers:c,toggleStickerSet:d}=(0,s.uC)(),m=(0,u.Z)(),h=n&&Boolean(n.installedDate),Z=Boolean(null==n?void 0:n.stickers),[P,v,g]=(0,De.Z)();(0,Dr.Z)((()=>{l(P)}),[P,l]);const p=(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)((()=>{!Z&&p.length<5&&c({stickerSetId:e})}),[Z,p.length,c,e]);const E=(0,a.I4)((()=>{d({stickerSetId:e})}),[d,e]);if(!n)return;const C=p.length>0;return a.ZP.createElement("div",{key:n.id,className:"sticker-set",dir:m.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"},m("Stickers",n.count,"i"))),a.ZP.createElement(L.Z,{className:h?"is-added":void 0,color:"primary",size:"tiny",pill:!0,fluid:!0,onClick:E},m(h?"Stickers.Installed":"Stickers.Install"))),a.ZP.createElement("div",{className:"sticker-set-main"},!C&&a.ZP.createElement(J.Z,null),C&&p.map((e=>a.ZP.createElement(Un.Z,{sticker:e,size:i.Y7,observeIntersection:t,noAnimate:!r||P||o,onClick:v})))),C&&a.ZP.createElement(Gn.Z,{isOpen:P,fromSticker:p[0],onClose:g}))}))),Ur=(0,G.P2)((e=>e()),6e4,!0),Or=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.y5)(e),{query:n,resultIds:a}=t||{},{featured:s}=e.stickers;return{query:n,featuredIds:s.setIds,resultIds:a}}))((({onClose:e,isActive:t,query:n,featuredIds:r,resultIds:o})=>{const{loadFeaturedStickers:i}=(0,s.uC)(),l=(0,a.sO)(null),c=(0,u.Z)(),[d,h]=(0,a.eJ)(!1),{observe:Z}=(0,Bn.S1)({rootRef:l,throttleMs:200});return(0,a.d4)((()=>{Ur((()=>{i()}))})),(0,m.ZP)(t,e),a.ZP.createElement("div",{ref:l,className:"StickerSearch custom-scroll",dir:c.isRtl?"rtl":void 0},function(){if(void 0!==n)return!n&&r?r.map((e=>a.ZP.createElement(xr,{key:e,stickerSetId:e,observeIntersection:Z,isSomeModalOpen:d,onModalToggle:h}))):o?o.length?o.map((e=>a.ZP.createElement(xr,{key:e,stickerSetId:e,observeIntersection:Z,isSomeModalOpen:d,onModalToggle:h}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},"Nothing found."):a.ZP.createElement(we.Z,null)}())}))),Gr=(0,a.X$)((0,s.c$)((e=>{const t=(0,g.yN)(e),{query:n,results:a}=t||{},{chatId:s}=(0,g.Bt)(e)||{},r=s?(0,g.Z1)(e,s):void 0;return{query:n,results:a,chat:r,isChatWithBot:r?(0,g.xo)(e,r):void 0}}))((({onClose:e,isActive:t,query:n,results:r,chat:o,isChatWithBot:i})=>{const{searchMoreGifs:l,sendMessage:c,setGifSearchQuery:d}=(0,s.uC)(),h=(0,a.sO)(null),{observe:Z}=(0,Bn.S1)({rootRef:h,debounceMs:300}),{canSendGifs:P}=(0,v.H5)(o,i),g=(0,a.I4)((e=>{P&&c({gif:e}),f.$b&&d({query:void 0})}),[P,c,d]),p=(0,u.Z)();(0,m.ZP)(t,e);const E=Boolean(void 0!==n&&r&&r.length);return a.ZP.createElement("div",{className:"GifSearch",dir:p.isRtl?"rtl":void 0},a.ZP.createElement(Te.Z,{ref:h,className:(0,X.Z)("gif-container custom-scroll",E&&"grid"),items:r,itemSelector:".GifButton",preloadBackwards:96,noFastList:!0,onLoadMore:l},function(){if(void 0!==n)return r?r.length?r.map((e=>a.ZP.createElement(cr,{key:e.id,gif:e,observeIntersection:Z,onClick:g}))):a.ZP.createElement("p",{className:"helper-text",dir:"auto"},p("NoGIFsFound")):a.ZP.createElement(we.Z,null)}()))}))),Jr=(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])||""}}))((({chat:e,message:t,answer:n,answerVote:r,totalVoters:o,voters:i,offset:l})=>{const{loadPollOptionResults:c,openChat:d,closePollResults:m}=(0,s.uC)(),h=(0,P.Z)(r.votersCount),[Z,v]=(0,a.eJ)(!0),g=Boolean(i),{option:p,text:E}=n,C=(0,u.Z)();(0,a.d4)((()=>{g&&h===r.votersCount||c({chat:e,messageId:t.id,option:p,offset:l,limit:4,shouldResetVoters:!0})}),[r.votersCount,g]);const f=(0,a.I4)((()=>{v(!0),c({chat:e,messageId:t.id,option:p,offset:l,limit:50})}),[e,c,t.id,l,p]);(0,a.d4)((()=>{v(!1)}),[i]);const b=(0,a.I4)((e=>{d({id:e}),m()}),[m,d]);return a.ZP.createElement("div",{className:"PollAnswerResults"},a.ZP.createElement("div",{className:"poll-voters"},i?i.map((e=>a.ZP.createElement(Le.Z,{key:e,className:"chat-item-clickable",onClick:()=>b(e)},a.ZP.createElement(Re.Z,{avatarSize:"tiny",userId:e,forceShowSelf:!0,noStatusOrTyping:!0})))):a.ZP.createElement(we.Z,null),i&&function(){const e=r.votersCount-i.length;return r.votersCount>4&&e>0&&a.ZP.createElement(Sn,{count:e,itemName:"voter",isLoading:Z,onClick:f})}()),a.ZP.createElement("div",{className:"answer-head",dir:C.isRtl?"rtl":void 0},a.ZP.createElement("span",{className:"answer-title",dir:"auto"},E),a.ZP.createElement("span",{className:"answer-percent",dir:C.isRtl?"auto":void 0},(I=r.votersCount,(y=o)>0?(I/y*100).toFixed():0),"%")));var I,y}))),Xr=(0,a.X$)((0,s.c$)((e=>{const{pollResults:{chatId:t,messageId:n},lastSyncTime:a}=e;return t&&n?{chat:(0,g.Z1)(e,t),message:(0,g.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,v.t9)(s);if(!l.results)return;const c=(0,me.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,ve.Z)(i.question,["emoji","br"])),a.ZP.createElement("div",{className:"poll-results-list custom-scroll"},r&&i.answers.map((e=>a.ZP.createElement(Jr,{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)))}))),_r="Please provide first name",zr=(0,a.X$)((0,s.c$)(((e,{userId:t})=>{const n=(0,g.dy)(e,t),a=(0,g.Z1)(e,t),{progress:s}=e.management;return{user:n,progress:s,isMuted:(0,v.i4)(a,(0,g.dZ)(e),(0,g.NJ)(e))}}))((({userId:e,user:t,progress:n,isMuted:r,onClose:i,isActive:l})=>{const{updateContact:c,deleteContact:d,closeManagement:h}=(0,s.uC)(),[Z,P,v]=(0,De.Z)(),[g,p]=(0,a.eJ)(!1),[E,C]=(0,a.eJ)(),f=(0,u.Z)();(0,m.ZP)(l,i);const b=t&&t.firstName||"",I=t&&t.lastName||"",[y,N]=(0,a.eJ)(b),[S,w]=(0,a.eJ)(I),[k,M]=(0,a.eJ)(!r);(0,a.d4)((()=>{M(!r)}),[r]),(0,a.d4)((()=>{p(!1),v()}),[v,e]),(0,a.d4)((()=>{N(b),w(I)}),[b,I,t]),(0,a.d4)((()=>{n===o.wv.Complete&&(p(!1),C(void 0),v())}),[v,n]);const T=(0,a.I4)((e=>{N(e.target.value),p(!0)}),[]),L=(0,a.I4)((e=>{w(e.target.value),p(!0)}),[]),A=(0,a.I4)((e=>{M(e.target.checked),p(!0)}),[]),R=(0,a.I4)((()=>{const t=y.trim(),n=S.trim();t.length||C(_r),c({userId:e,isMuted:!k,firstName:t,lastName:n})}),[y,S,c,e,k]),F=(0,a.I4)((()=>{d({userId:e}),v(),h()}),[v,h,d,e]);if(!t)return;const B=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(Re.Z,{userId:t.id,avatarSize:"jumbo",status:"original name",withFullInfo:!0}),a.ZP.createElement(Me.Z,{id:"user-first-name",label:f("UserInfo.FirstNamePlaceholder"),onChange:T,value:y,error:E===_r?E:void 0}),a.ZP.createElement(Me.Z,{id:"user-last-name",label:f("UserInfo.LastNamePlaceholder"),onChange:L,value:S}),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(Cn.Z,{checked:k,label:f("Notifications"),subLabel:f(k?"UserInfo.NotificationsEnabled":"UserInfo.NotificationsDisabled"),onChange:A}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:P},f("DeleteContact")))),a.ZP.createElement(dn.Z,{isShown:g,onClick:R,disabled:B,ariaLabel:f("Save")},B?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Xe.Z,{isOpen:Z,onClose:v,text:f("AreYouSureDeleteContact"),confirmLabel:f("DeleteContact"),confirmHandler:F,confirmIsDestructive:!0}))}))),Yr="Group title can't be empty",Hr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n,a;const s=(0,g.Z1)(e,t),{progress:r}=e.management,o=Boolean(null===(n=s.fullInfo)||void 0===n?void 0:n.linkedChatId),i=(0,v.G9)(s),{invites:l}=e.management.byChatId[t]||{};return{chat:s,progress:r,isBasicGroup:i,hasLinkedChannel:o,canChangeInfo:i?s.isCreator:(0,v.VE)(s,"changeInfo"),canBanUsers:i?s.isCreator:(0,v.VE)(s,"banUsers"),canInvite:i?s.isCreator:(0,v.VE)(s,"inviteUsers"),exportedInvites:l,lastSyncTime:e.lastSyncTime,availableReactionsCount:null===(a=e.availableReactions)||void 0===a?void 0:a.filter((e=>!e.isInactive)).length}}))((({chatId:e,chat:t,progress:n,isBasicGroup:i,hasLinkedChannel:l,canChangeInfo:c,canBanUsers:d,canInvite:Z,onScreenSelect:P,onClose:g,isActive:p,exportedInvites:E,lastSyncTime:C,availableReactionsCount:f})=>{var b,I,y,N,S;const{togglePreHistoryHidden:w,updateChat:k,deleteChat:M,leaveChannel:T,deleteChannel:L,closeManagement:A,openChat:R,loadExportedChatInvites:F}=(0,s.uC)(),[B,$,D]=(0,De.Z)(),x=t.title,U=t.fullInfo&&t.fullInfo.about||"",[O,G]=(0,a.eJ)(!1),[X,_]=(0,a.eJ)(x),[z,Y]=(0,a.eJ)(U),[H,V]=(0,a.eJ)(),[j,K]=(0,a.eJ)(),q=(0,v.RT)(t),W=(0,h.Z)(q,!1,r.IU.BlobUrl),Q=(0,u.Z)();(0,m.ZP)(p,g),(0,a.d4)((()=>{C&&Z&&F({chatId:e})}),[e,F,C,Z]),(0,a.d4)((()=>{n===o.wv.Complete&&(G(!1),K(void 0))}),[n]);const ee=(0,a.I4)((()=>{P(o.u1.ChatPrivacyType)}),[P]),te=(0,a.I4)((()=>{P(o.u1.Discussion)}),[P]),ne=(0,a.I4)((()=>{P(o.u1.Reactions)}),[P]),ae=(0,a.I4)((()=>{P(o.u1.GroupPermissions)}),[P]),se=(0,a.I4)((()=>{P(o.u1.ChatAdministrators)}),[P]),re=(0,a.I4)((()=>{P(o.u1.Invites)}),[P]),oe=(0,a.I4)((e=>{V(e),G(!0)}),[]),ie=(0,a.I4)((e=>{_(e.target.value),G(!0)}),[]),le=(0,a.I4)((e=>{Y(e.target.value),G(!0)}),[]),ce=(0,a.I4)((()=>{const t=X.trim(),n=z.trim();t.length?k({chatId:e,title:t,about:n,photo:H}):K(Yr)}),[z,e,H,X,k]),de=(0,a.I4)((()=>{P(o.u1.GroupMembers)}),[P]),me=(0,a.I4)((()=>{if(!t.fullInfo)return;const{isPreHistoryHidden:e}=t.fullInfo;w({chatId:t.id,isEnabled:!e})}),[t,w]),ue=(null===(b=t.fullInfo)||void 0===b||null===(I=b.enabledReactions)||void 0===I?void 0:I.length)||0,he=(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]),Ze=(null===(y=t.fullInfo)||void 0===y||null===(N=y.adminMembers)||void 0===N?void 0:N.length)||0,Pe=(0,a.I4)((()=>{i?M({chatId:t.id}):t.isCreator?L({chatId:t.id}):T({chatId:t.id}),D(),A(),R({id:void 0})}),[i,t.isCreator,t.id,D,A,T,L,M,R]);if(t.isRestricted)return;const ge=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(cn.Z,{currentAvatarBlobUrl:W,onChange:oe,disabled:!c}),a.ZP.createElement(Me.Z,{id:"group-title",label:Q("GroupName"),onChange:ie,value:X,error:j===Yr?j:void 0,disabled:!c}),a.ZP.createElement(Me.Z,{id:"group-about",className:"mb-2",label:Q("DescriptionPlaceholder"),onChange:le,value:z,disabled:!c}),t.isCreator&&a.ZP.createElement(Le.Z,{icon:"lock",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title"},Q("GroupType")),a.ZP.createElement("span",{className:"subtitle"},t.username?Q("TypePublic"):Q("TypePrivate"))),l&&a.ZP.createElement(Le.Z,{icon:"message",multiline:!0,onClick:te},a.ZP.createElement("span",{className:"title"},Q("LinkedChannel")),a.ZP.createElement("span",{className:"subtitle"},Q("DiscussionUnlink"))),a.ZP.createElement(Le.Z,{icon:"permissions",multiline:!0,onClick:ae,disabled:!d},a.ZP.createElement("span",{className:"title"},Q("ChannelPermissions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},he,"/",8)),a.ZP.createElement(Le.Z,{icon:"reactions",multiline:!0,onClick:ne,disabled:!c},a.ZP.createElement("span",{className:"title"},Q("Reactions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},ue,"/",f)),a.ZP.createElement(Le.Z,{icon:"admin",multiline:!0,onClick:se},a.ZP.createElement("span",{className:"title"},Q("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},(0,it.kh)(Ze))),Z&&a.ZP.createElement(Le.Z,{icon:"link",onClick:re,multiline:!0,disabled:!E},a.ZP.createElement("span",{className:"title"},Q("GroupInfo.InviteLinks")),a.ZP.createElement("span",{className:"subtitle"},E?(0,it.kh)(E.length):Q("Loading")))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"group",multiline:!0,onClick:de},a.ZP.createElement("span",{className:"title"},Q("GroupMembers")),a.ZP.createElement("span",{className:"subtitle"},(0,it.kh)(null!==(S=t.membersCount)&&void 0!==S?S:0))),t.fullInfo&&a.ZP.createElement("div",{className:"ListItem narrow no-selection"},a.ZP.createElement(Cn.Z,{checked:!t.fullInfo.isPreHistoryHidden,label:Q("ChatHistory"),onChange:me,disabled:!d}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:$},Q("DeleteMega")))),a.ZP.createElement(dn.Z,{isShown:O,onClick:ce,disabled:ge,ariaLabel:Q("Save")},ge?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Xe.Z,{isOpen:B,onClose:D,textParts:(0,ve.Z)(i||!t.isCreator?Q("AreYouSureDeleteAndExit"):Q("AreYouSureDeleteThisChatWithGroup",t.title),["br","simple_markdown"]),confirmLabel:i||!t.isCreator?Q("DeleteMega"):Q("DeleteGroupForAll"),confirmHandler:Pe,confirmIsDestructive:!0}))}))),Vr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,g.Z1)(e,t),currentUserId:e.currentUserId})))((({onScreenSelect:e,onChatMemberSelect:t,chat:n,currentUserId:r,onClose:i,isActive:l})=>{const{updateChatDefaultBannedRights:c}=(0,s.uC)(),[d,h]=(0,a.eJ)({}),[Z,P]=(0,a.eJ)(!1),[v,g]=(0,a.eJ)(!1),p=(0,u.Z)();(0,m.ZP)(l,i);const E=(0,a.I4)((()=>{e(o.u1.GroupRemovedUsers)}),[e]),C=(0,a.I4)((()=>{e(o.u1.GroupUserPermissionsCreate)}),[e]),f=(0,a.I4)((n=>{t(n.userId,n.promotedByUserId===r),e(o.u1.GroupUserPermissions)}),[r,t,e]);(0,a.d4)((()=>{h((null==n?void 0:n.defaultBannedRights)||{}),P(!1),setTimeout((()=>{g(!1)}),250)}),[n]);const b=(0,a.I4)((e=>{const{name:t}=e.target;function n(e){return!e||void 0}h((e=>({...e,[t]:n(e[t]),..."sendStickers"===t&&{sendGifs:n(e[t])}}))),P(!0)}),[]),I=(0,a.I4)((()=>{n&&(g(!0),c({chatId:n.id,bannedRights:d}))}),[n,d,c]),y=(0,a.Ye)((()=>n&&n.fullInfo&&n.fullInfo.kickedMembers?n.fullInfo.kickedMembers.length:0),[n]),N=(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=p(s);return`${e}${e.length?`, ${r}`:r}`}),"")}),[n,p]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},p("ChannelPermissionsHeader")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"sendMessages",checked:!d.sendMessages,label:p("UserRestrictionsSend"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"sendMedia",checked:!d.sendMedia,label:p("UserRestrictionsSendMedia"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"sendStickers",checked:!d.sendStickers&&!d.sendGifs,label:p("UserRestrictionsSendStickers"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"sendPolls",checked:!d.sendPolls,label:p("UserRestrictionsSendPolls"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"embedLinks",checked:!d.embedLinks,label:p("UserRestrictionsEmbedLinks"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"inviteUsers",checked:!d.inviteUsers,label:p("UserRestrictionsInviteUsers"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"pinMessages",checked:!d.pinMessages,label:p("UserRestrictionsPinMessages"),blocking:!0,onChange:b})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"changeInfo",checked:!d.changeInfo,label:p("UserRestrictionsChangeInfo"),blocking:!0,onChange:b}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete-user",multiline:!0,narrow:!0,onClick:E},a.ZP.createElement("span",{className:"title"},p("ChannelBlockedUsers")),a.ZP.createElement("span",{className:"subtitle"},y))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement("h3",{className:"section-heading",dir:"auto"},p("PrivacyExceptions")),a.ZP.createElement(Le.Z,{icon:"add-user",onClick:C},p("ChannelAddException")),N.map((e=>a.ZP.createElement(Le.Z,{key:e.userId,className:"chat-item-clickable exceptions-member",onClick:()=>f(e)},a.ZP.createElement(Re.Z,{userId:e.userId,status:S(e)})))))),a.ZP.createElement(dn.Z,{isShown:Z,onClick:I,ariaLabel:p("Save"),disabled:v},v?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),jr=(0,a.X$)((0,s.c$)((e=>{const{currentUserId:t}=e;return{currentUserId:t}}))((({chat:e,currentUserId:t,isOpen:n,onClose:r})=>{var o;const{loadMoreMembers:i,deleteChatMember:l}=(0,s.uC)(),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,v.kK)(a,r,d)}),[null===(o=e.fullInfo)||void 0===o?void 0:o.members,t,d]),P=(0,a.I4)((t=>{l({chatId:e.id,userId:t}),r()}),[e.id,l,r]);return a.ZP.createElement(Fe,{isOpen:n,chatOrUserIds:Z,filterRef:h,filterPlaceholder:c("ChannelBlockUser"),filter:d,onFilterChange:m,loadMore:i,onSelectChatOrUser:P,onClose:r})}))),Kr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t),{byId:a}=e.users;return{chat:n,usersById:a,canDeleteMembers:n&&((0,v.VE)(n,"banUsers")||n.isCreator)}}))((({chat:e,usersById:t,canDeleteMembers:n,onClose:r,isActive:o})=>{const{updateChatMemberBannedRights:i}=(0,s.uC)(),l=(0,u.Z)(),[c,d,h]=(0,De.Z)();(0,m.ZP)(o,r);const Z=(0,a.Ye)((()=>e&&e.fullInfo&&e.fullInfo.kickedMembers?e.fullInfo.kickedMembers:[]),[e]),P=(0,a.I4)((e=>{if(!e.kickedByUserId)return;const n=t[e.kickedByUserId];return n?l("UserRemovedBy",(0,v.Js)(n)):void 0}),[l,t]),g=(0,a.I4)((t=>{if(e)return[{title:l("Unblock"),icon:"delete",destructive:!0,handler:()=>i({chatId:e.id,userId:t.userId,bannedRights:{}})}]}),[l,e,i]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:l.isRtl?"rtl":void 0},a.ZP.createElement("p",{className:"text-muted"},l("NoBlockedGroup2")),Z.map((e=>a.ZP.createElement(Le.Z,{key:e.userId,className:"chat-item-clickable",ripple:!0,contextActions:g(e)},a.ZP.createElement(Re.Z,{userId:e.userId,status:P(e)})))),n&&a.ZP.createElement(dn.Z,{isShown:!0,onClick:d,ariaLabel:l("Channel.EditAdmin.Permission.BanUsers")},a.ZP.createElement("i",{className:"icon-add-user-filled"})),e&&n&&a.ZP.createElement(jr,{chat:e,isOpen:c,onClose:h}))))}))),qr="Channel title can't be empty",Wr=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.Z1)(e,t),{progress:s}=e.management,r=Boolean(null==a?void 0:a.isSignaturesShown),{invites:o}=e.management.byChatId[t]||{};return{chat:a,progress:s,isSignaturesShown:r,canChangeInfo:(0,v.VE)(a,"changeInfo"),canInvite:(0,v.VE)(a,"inviteUsers"),lastSyncTime:e.lastSyncTime,exportedInvites:o,availableReactionsCount:null===(n=e.availableReactions)||void 0===n?void 0:n.filter((e=>!e.isInactive)).length}}))((({chatId:e,chat:t,progress:n,isSignaturesShown:i,canChangeInfo:l,canInvite:c,exportedInvites:d,lastSyncTime:Z,availableReactionsCount:P,onScreenSelect:g,onClose:p,isActive:E})=>{var C,f,b,I,y,N;const{updateChat:S,toggleSignatures:w,closeManagement:k,leaveChannel:M,deleteChannel:T,openChat:L,loadExportedChatInvites:A}=(0,s.uC)(),R=t&&t.title||"",F=null!=t&&t.fullInfo&&t.fullInfo.about||"",B=null==t||null===(C=t.fullInfo)||void 0===C?void 0:C.linkedChatId,[$,D,x]=(0,De.Z)(),[U,O]=(0,a.eJ)(!1),[G,X]=(0,a.eJ)(R),[_,z]=(0,a.eJ)(F),[Y,H]=(0,a.eJ)(),[V,j]=(0,a.eJ)(),K=t&&(0,v.RT)(t),q=(0,h.Z)(K,!1,r.IU.BlobUrl),W=(0,u.Z)();(0,m.ZP)(E,p),(0,a.d4)((()=>{Z&&A({chatId:e})}),[e,A,Z]),(0,a.d4)((()=>{n===o.wv.Complete&&(O(!1),j(void 0))}),[n]);const Q=(null==t||null===(f=t.fullInfo)||void 0===f||null===(b=f.adminMembers)||void 0===b?void 0:b.length)||0,ee=(0,a.I4)((()=>{g(o.u1.ChatPrivacyType)}),[g]),te=(0,a.I4)((()=>{g(o.u1.Discussion)}),[g]),ne=(0,a.I4)((()=>{g(o.u1.Reactions)}),[g]),ae=(0,a.I4)((()=>{g(o.u1.ChatAdministrators)}),[g]),se=(0,a.I4)((()=>{g(o.u1.Invites)}),[g]),re=(0,a.I4)((e=>{H(e),O(!0)}),[]),oe=(0,a.I4)((e=>{X(e.target.value),O(!0)}),[]),ie=(0,a.I4)((e=>{z(e.target.value),O(!0)}),[]),le=(0,a.I4)((()=>{const t=G.trim(),n=_.trim();t.length?S({chatId:e,title:t,about:n,photo:Y}):j(qr)}),[_,e,Y,G,S]),ce=(0,a.I4)((()=>{w({chatId:e,isEnabled:!i})}),[e,i,w]),de=(0,a.I4)((()=>{g(o.u1.ChannelSubscribers)}),[g]),me=(0,a.I4)((()=>{t.isCreator?T({chatId:t.id}):M({chatId:t.id}),x(),k(),L({id:void 0})}),[t.isCreator,t.id,x,k,M,T,L]),ue=(null===(I=t.fullInfo)||void 0===I||null===(y=I.enabledReactions)||void 0===y?void 0:y.length)||0;if(t.isRestricted)return;const he=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(cn.Z,{currentAvatarBlobUrl:q,onChange:re,disabled:!l}),a.ZP.createElement(Me.Z,{id:"channel-title",label:W("EnterChannelName"),onChange:oe,value:G,error:V===qr?V:void 0,disabled:!l}),a.ZP.createElement(Me.Z,{id:"channel-about",className:"mb-2",label:W("DescriptionPlaceholder"),onChange:ie,value:_,disabled:!l}),t.isCreator&&a.ZP.createElement(Le.Z,{icon:"lock",multiline:!0,onClick:ee},a.ZP.createElement("span",{className:"title"},W("ChannelType")),a.ZP.createElement("span",{className:"subtitle"},t.username?W("TypePublic"):W("TypePrivate"))),a.ZP.createElement(Le.Z,{icon:"message",multiline:!0,onClick:te,disabled:!l},a.ZP.createElement("span",{className:"title"},W("Discussion")),a.ZP.createElement("span",{className:"subtitle"},W(B?"DiscussionUnlink":"Add"))),a.ZP.createElement(Le.Z,{icon:"admin",multiline:!0,onClick:ae},a.ZP.createElement("span",{className:"title"},W("ChannelAdministrators")),a.ZP.createElement("span",{className:"subtitle"},Q)),c&&a.ZP.createElement(Le.Z,{icon:"link",onClick:se,multiline:!0,disabled:!d},a.ZP.createElement("span",{className:"title"},W("GroupInfo.InviteLinks")),a.ZP.createElement("span",{className:"subtitle"},d?(0,it.kh)(d.length):W("Loading"))),a.ZP.createElement(Le.Z,{icon:"reactions",multiline:!0,onClick:ne,disabled:!l},a.ZP.createElement("span",{className:"title"},W("Reactions")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},ue,"/",P)),a.ZP.createElement("div",{className:"ListItem no-selection narrow"},a.ZP.createElement(Cn.Z,{checked:i,label:W("ChannelSignMessages"),onChange:ce}))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"group",multiline:!0,onClick:de},a.ZP.createElement("span",{className:"title",dir:"auto"},W("ChannelSubscribers")),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},W("Subscribers",null!==(N=t.membersCount)&&void 0!==N?N:0,"i")))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:D},t.isCreator?W("ChannelDelete"):W("LeaveChannel")))),a.ZP.createElement(dn.Z,{isShown:U,onClick:le,disabled:he,ariaLabel:W("Save")},he?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Xe.Z,{isOpen:$,onClose:x,text:t.isCreator?W("ChannelDeleteAlert"):W("ChannelLeaveAlert"),confirmLabel:t.isCreator?W("ChannelDelete"):W("LeaveChannel"),confirmHandler:me,confirmIsDestructive:!0}))})));var Qr=n(88);const eo=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t),{isUsernameAvailable:a}=(0,g.aW)(e,t);return{chat:n,isChannel:(0,v.eA)(n),progress:e.management.progress,isUsernameAvailable:a,isProtected:null==n?void 0:n.isProtected}}))((({chat:e,onClose:t,isActive:n,isChannel:r,progress:i,isUsernameAvailable:l,isProtected:c})=>{var d;const{checkPublicLink:h,updatePublicLink:Z,updatePrivateLink:P,toggleIsProtected:v}=(0,s.uC)(),g=Boolean(e.username),p=null===(d=e.fullInfo)||void 0===d?void 0:d.inviteLink,[E,C]=(0,a.eJ)(g?"public":"private"),[f,b]=(0,a.eJ)(),[I,y,N]=(0,De.Z)(),S=Boolean("public"===E&&f&&l||"private"===E&&g);(0,m.ZP)(n,t),(0,a.d4)((()=>{E&&!p&&P()}),[E,p,P]);const w=(0,a.I4)((e=>{C(e)}),[]),k=(0,a.I4)((t=>{v({chatId:e.id,isProtected:"protected"===t})}),[e.id,v]),M=(0,a.I4)((()=>{Z({username:"public"===E?f:""})}),[E,Z,f]),T=(0,a.I4)((()=>{N(),P()}),[N,P]),L=(0,u.Z)(),A=r?"Channel":"Mega",R=r?"Channel":"Group",F=[{value:"private",label:L(`${A}Private`),subLabel:L(`${A}PrivateInfo`)},{value:"public",label:L(`${A}Public`),subLabel:L(`${A}PublicInfo`)}],B=[{value:"allowed",label:L("ChannelVisibility.Forwarding.Enabled")},{value:"protected",label:L("ChannelVisibility.Forwarding.Disabled")}],$=i===o.wv.InProgress;return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",dir:L.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading"},L(`${R}Type`)),a.ZP.createElement(at.Z,{selected:E,name:"channel-type",options:F,onChange:w})),"private"===E?a.ZP.createElement("div",{className:"section",dir:L.isRtl?"rtl":void 0},p?a.ZP.createElement(a.ZP.Fragment,null,a.ZP.createElement(Qr.Z,{url:p,className:"group-link",text:p}),a.ZP.createElement("p",{className:"section-info",dir:L.isRtl?"rtl":void 0},L(`${A}PrivateLinkHelp`)),a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:y},L("RevokeLink")),a.ZP.createElement(Xe.Z,{isOpen:I,onClose:N,text:L("RevokeAlert"),confirmLabel:L("RevokeButton"),confirmHandler:T,confirmIsDestructive:!0})):a.ZP.createElement(we.Z,null)):a.ZP.createElement("div",{className:"section no-border"},a.ZP.createElement(Pn,{asLink:!0,currentUsername:e.username,isLoading:$,isUsernameAvailable:l,checkUsername:h,onChange:b}),a.ZP.createElement("p",{className:"section-info",dir:"auto"},L(`${R}.Username.CreatePublicLinkHelp`))),a.ZP.createElement("div",{className:"section",dir:L.isRtl?"rtl":void 0},a.ZP.createElement("h3",{className:"section-heading"},L(r?"ChannelVisibility.Forwarding.ChannelTitle":"ChannelVisibility.Forwarding.GroupTitle")),a.ZP.createElement(at.Z,{selected:c?"protected":"allowed",name:"channel-type",options:B,onChange:k}),a.ZP.createElement("p",{className:"section-info"},L(r?"ChannelVisibility.Forwarding.ChannelInfo":"ChannelVisibility.Forwarding.GroupInfo")))),a.ZP.createElement(dn.Z,{isShown:S,disabled:$,ariaLabel:L("Save"),onClick:M},$?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),to=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.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,g.Z1)(e,a.fullInfo.linkedChatId):void 0,isChannel:a&&(0,v.eA)(a)}}))((({chat:e,onClose:t,isActive:n,chatId:r,chatsByIds:l,linkedChat:c,forDiscussionIds:d,isChannel:h,onScreenSelect:Z})=>{const{loadGroupsForDiscussion:P,linkDiscussionGroup:v,unlinkDiscussionGroup:g}=(0,s.uC)(),[p,E]=(0,a.eJ)(),[C,f]=(0,a.eJ)(),[b,I]=(0,a.eJ)(!1),y=(0,a.I4)((()=>I(!0)),[]),[N,S,w]=(0,De.Z)(),[k,M,T]=(0,De.Z)(),L=(0,u.Z)(),A=null==c?void 0:c.id;(0,m.ZP)(n,t),(0,a.d4)((()=>{P()}),[P]),(0,a.d4)((()=>{C||(0,dt.Z)("DiscussionGroups").then(f)}),[C]);const R=(0,a.I4)((()=>{w(),g({channelId:h?r:A}),h||Z(o.u1.Initial)}),[w,g,h,r,A,Z]),F=(0,a.I4)((()=>{T(),v({channelId:r,chatId:p})}),[T,v,r,p]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"section-icon"},C&&a.ZP.createElement(mt.Z,{id:"discussionGroupsDucks",size:i.bM,animationData:C,play:b,noLoop:!0,onLoad:y})),c&&a.ZP.createElement("div",null,a.ZP.createElement(Le.Z,{className:"chat-item-clickable",inactive:!0},a.ZP.createElement(Ae.Z,{chatId:c.id})),a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:S},L(h?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel")),a.ZP.createElement(Xe.Z,{isOpen:N,onClose:w,header:a.ZP.createElement("div",{className:"modal-header"},a.ZP.createElement(ge.Z,{size:"tiny",chat:c}),a.ZP.createElement("div",{className:"modal-title"},L(h?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"))),textParts:(0,ve.Z)(L(h?"DiscussionUnlinkChannelAlert":"DiscussionUnlinkGroupAlert",c.title),["br","simple_markdown"]),confirmLabel:L(h?"DiscussionUnlinkGroup":"DiscussionUnlinkChannel"),confirmHandler:R,confirmIsDestructive:!0})),!c&&a.ZP.createElement("div",null,a.ZP.createElement("p",{className:"section-help",dir:"auto"},L("DiscussionChannelHelp")),a.ZP.createElement("div",{teactFastList:!0},a.ZP.createElement(Le.Z,{key:"create-group",icon:"group",ripple:!0,teactOrderKey:0,className:"not-implemented"},L("DiscussionCreateGroup")),d?d.map(((e,t)=>a.ZP.createElement(Le.Z,{key:e,teactOrderKey:t+1,className:"chat-item-clickable scroll-item",onClick:()=>{E(e),M()}},a.ZP.createElement(Ae.Z,{chatId:e})))):a.ZP.createElement(wt.Z,{key:"nothing-found",teactOrderKey:0,text:"No discussion groups found"})),a.ZP.createElement("p",{className:"mt-4 mb-0 section-help",dir:"auto"},L("DiscussionChannelHelp2")),a.ZP.createElement(Xe.Z,{isOpen:k,onClose:T,header:function(){const e=l[p];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"},L("Channel.DiscussionGroup.LinkGroup")))}(),textParts:function(){const t=l[p];if(t)return t.hasPrivateLink?(0,ve.Z)(`Do you want to make **${t.title}** the discussion board for **${e.title}**?`,["br","simple_markdown"]):(0,ve.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:L("DiscussionLinkGroup"),confirmHandler:F,isButtonsInOneRow:!0})))))}))),no=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,g.Z1)(e,t);return{chat:a,isFormFullyDisabled:!(a.isCreator||n)}}))((({chat:e,selectedChatMemberId:t,onScreenSelect:n,isFormFullyDisabled:r,onClose:i,isActive:l})=>{const{updateChatMemberBannedRights:c}=(0,s.uC)(),[d,h]=(0,a.eJ)({}),[Z,P]=(0,a.eJ)(!1),[v,g]=(0,a.eJ)(!1),[p,E,C]=(0,De.Z)(),f=(0,u.Z)();(0,m.ZP)(l,i);const b=(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&&!b&&n(o.u1.GroupPermissions)}),[e,n,b,t]),(0,a.d4)((()=>{h((null==b?void 0:b.bannedRights)||(null==e?void 0:e.defaultBannedRights)||{}),P(!1),g(!1)}),[e,b]);const I=(0,a.I4)((e=>{const{name:t}=e.target;function n(e){return!e||void 0}h((e=>({...e,[t]:n(e[t]),..."sendStickers"===t&&{sendGifs:n(e[t])}}))),P(!0)}),[]),y=(0,a.I4)((()=>{e&&t&&(g(!0),c({chatId:e.id,userId:t,bannedRights:d}))}),[e,t,d,c]),N=(0,a.I4)((()=>{e&&t&&c({chatId:e.id,userId:t,bannedRights:{viewMessages:!0}})}),[e,t,c]),S=(0,a.I4)((t=>!!r||!(!e||!e.defaultBannedRights)&&e.defaultBannedRights[t]),[e,r]);if(b)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Re.Z,{userId:b.userId})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},f("UserRestrictionsCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"sendMessages",checked:!d.sendMessages,label:f("UserRestrictionsSend"),blocking:!0,disabled:S("sendMessages"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"sendMedia",checked:!d.sendMedia,label:f("UserRestrictionsSendMedia"),blocking:!0,disabled:S("sendMedia"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"sendStickers",checked:!d.sendStickers&&!d.sendGifs,label:f("UserRestrictionsSendStickers"),blocking:!0,disabled:S("sendStickers"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"sendPolls",checked:!d.sendPolls,label:f("UserRestrictionsSendPolls"),blocking:!0,disabled:S("sendPolls"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"embedLinks",checked:!d.embedLinks,label:f("UserRestrictionsEmbedLinks"),blocking:!0,disabled:S("embedLinks"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"inviteUsers",checked:!d.inviteUsers,label:f("UserRestrictionsInviteUsers"),blocking:!0,disabled:S("inviteUsers"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"pinMessages",checked:!d.pinMessages,label:f("UserRestrictionsPinMessages"),blocking:!0,disabled:S("pinMessages"),onChange:I})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"changeInfo",checked:!d.changeInfo,label:f("UserRestrictionsChangeInfo"),blocking:!0,disabled:S("changeInfo"),onChange:I}))),!r&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{icon:"delete-user",ripple:!0,destructive:!0,onClick:E},f("UserRestrictionsBlock")))),a.ZP.createElement(dn.Z,{isShown:Z,onClick:y,ariaLabel:f("Save"),disabled:v},v?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),a.ZP.createElement(Xe.Z,{isOpen:p,onClose:C,text:"Are you sure you want to ban and remove this user from the group?",confirmLabel:"Remove",confirmHandler:N,confirmIsDestructive:!0}))}))),ao=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const n=(0,g.Z1)(e,t);return{chat:n,currentUserId:e.currentUserId,isChannel:(0,v.eA)(n)}}))((({chat:e,isChannel:t,currentUserId:n,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)((()=>{r(o.u1.GroupAddAdmins)}),[r]),g=(0,a.I4)((e=>{if(e.isOwner)return d("ChannelCreator");const t=(0,s.Rd)().users.byId,n=e.promotedByUserId?t[e.promotedByUserId]:void 0;return n?d("EditAdminPromotedBy",(0,v.Js)(n)):d("ChannelAdmin")}),[d]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.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(Le.Z,{key:e.userId,className:"chat-item-clickable",onClick:()=>Z(e)},a.ZP.createElement(Re.Z,{userId:e.userId,status:g(e),forceShowSelf:!0})))),a.ZP.createElement(dn.Z,{isShown:!0,onClick:P,ariaLabel:d("Channel.Management.AddModerator")},a.ZP.createElement("i",{className:"icon-add-user-filled"})))))}))),so=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>({chat:(0,g.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(Cn.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllEvents"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewAdmins"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterNewMembers"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterChannelInfo"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterDeletedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"changeInfo",checked:!0,label:s("EventLogFilterEditedMessages"),onChange:void 0})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.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(Cn.Z,{name:"changeInfo",checked:!0,label:s("EventLogAllAdmins"),onChange:void 0})),r.map((e=>a.ZP.createElement(Le.Z,{key:e.userId,className:"chat-item-clickable picker-list-item",onClick:void 0,ripple:!0},a.ZP.createElement(Cn.Z,{label:"",checked:!0}),a.ZP.createElement(Re.Z,{userId:e.userId,status:o(e),forceShowSelf:!0})))))))}))),ro=(0,a.X$)((0,s.c$)(((e,{chatId:t,isPromotedByCurrentUser:n})=>{const a=(0,g.Z1)(e,t),{byId:s}=e.users,{currentUserId:r}=e;return{chat:a,usersById:s,currentUserId:r,isChannel:(0,v.eA)(a),isFormFullyDisabled:!(a.isCreator||n),defaultRights:a.adminRights}}))((({isNewAdmin:e,selectedChatMemberId:t,defaultRights:n,onScreenSelect:r,chat:i,usersById:l,currentUserId:c,isChannel:d,isFormFullyDisabled:h,onClose:Z,isActive:P})=>{const{updateChatAdmin:g}=(0,s.uC)(),[p,E]=(0,a.eJ)({}),[C,f]=(0,a.eJ)(e),[b,I]=(0,a.eJ)(!1),[y,N,S]=(0,De.Z)(),[w,k]=(0,a.eJ)(""),M=(0,u.Z)();(0,m.ZP)(P,Z);const T=(0,a.Ye)((()=>{var n,a;const s=null===(n=i.fullInfo)||void 0===n||null===(a=n.adminMembers)||void 0===a?void 0:a.find((({userId:e})=>e===t));var r,o;return e?s||null===(r=i.fullInfo)||void 0===r||null===(o=r.members)||void 0===o?void 0:o.find((({userId:e})=>e===t)):s}),[i.fullInfo,e,t]);(0,a.d4)((()=>{null!=i&&i.fullInfo&&t&&!T&&r(o.u1.ChatAdministrators)}),[i,r,T,t]),(0,a.d4)((()=>{E((e?n:null==T?void 0:T.adminRights)||{}),k(((e?"admin":null==T?void 0:T.customTitle)||"").substr(0,16)),f(Boolean(e)),I(!1)}),[n,e,T]);const L=(0,a.I4)((e=>{const{name:t}=e.target;E((e=>{return{...e,[t]:(n=e[t],!n||void 0)};var n})),f(!0)}),[]),A=(0,a.I4)((()=>{t&&(I(!0),g({chatId:i.id,userId:t,adminRights:p,customTitle:w}))}),[t,g,i.id,p,w]),R=(0,a.I4)((()=>{t&&(g({chatId:i.id,userId:t,adminRights:{}}),S())}),[i.id,S,t,g]),F=(0,a.I4)((e=>!((0,v.G9)(i)||!h&&i.adminRights&&i.adminRights[e])),[i,h]),B=(0,a.Ye)((()=>{if(e||!T)return;if(T.isOwner)return M("ChannelCreator");const t=T.promotedByUserId?l[T.promotedByUserId]:void 0;return t?M("EditAdminPromotedBy",(0,v.Js)(t)):M("ChannelAdmin")}),[e,T,l,M]),$=(0,a.I4)((e=>{const{value:t}=e.target;k(t),f(!0)}),[]);if(T)return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Le.Z,{inactive:!0,className:"chat-item-clickable"},a.ZP.createElement(Re.Z,{userId:T.userId,status:B,forceShowSelf:!0})),a.ZP.createElement("h3",{className:"section-heading mt-4",dir:"auto"},M("EditAdminWhatCanDo")),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"changeInfo",checked:!!p.changeInfo,label:M(d?"EditAdminChangeChannelInfo":"EditAdminChangeGroupInfo"),blocking:!0,disabled:F("changeInfo"),onChange:L})),d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"postMessages",checked:!!p.postMessages,label:M("EditAdminPostMessages"),blocking:!0,disabled:F("postMessages"),onChange:L})),d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"editMessages",checked:!!p.editMessages,label:M("EditAdminEditMessages"),blocking:!0,disabled:F("editMessages"),onChange:L})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"deleteMessages",checked:!!p.deleteMessages,label:M(d?"EditAdminDeleteMessages":"EditAdminGroupDeleteMessages"),blocking:!0,disabled:F("deleteMessages"),onChange:L})),!d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"banUsers",checked:!!p.banUsers,label:M("EditAdminBanUsers"),blocking:!0,disabled:F("banUsers"),onChange:L})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"inviteUsers",checked:!!p.inviteUsers,label:M("EditAdminAddUsers"),blocking:!0,disabled:F("inviteUsers"),onChange:L})),!d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"pinMessages",checked:!!p.pinMessages,label:M("EditAdminPinMessages"),blocking:!0,disabled:F("pinMessages"),onChange:L})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"addAdmins",checked:!!p.addAdmins,label:M("EditAdminAddAdmins"),blocking:!0,disabled:F("addAdmins"),onChange:L})),a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"manageCall",checked:!!p.manageCall,label:M("StartVoipChatPermission"),blocking:!0,disabled:F("manageCall"),onChange:L})),!d&&a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"anonymous",checked:!!p.anonymous,label:M("EditAdminSendAnonymously"),blocking:!0,disabled:F("anonymous"),onChange:L})),h&&a.ZP.createElement("p",{className:"section-info mb-4",dir:"auto"},M("Channel.EditAdmin.CannotEdit")),!d&&a.ZP.createElement(Me.Z,{id:"admin-title",label:M("EditAdminRank"),onChange:$,value:w,disabled:h,maxLength:16}),c!==t&&!h&&!e&&a.ZP.createElement(Le.Z,{icon:"delete",ripple:!0,destructive:!0,onClick:N},M("EditAdminRemoveAdmin")))),a.ZP.createElement(dn.Z,{isShown:C,onClick:A,ariaLabel:M("Save"),disabled:b},b?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})),!e&&a.ZP.createElement(Xe.Z,{isOpen:y,onClose:S,text:"Are you sure you want to dismiss this admin?",confirmLabel:M("Channel.Admin.Dismiss"),confirmHandler:R,confirmIsDestructive:!0}))}))),oo=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n,a;const s=(0,g.Z1)(e,t),{statusesById:r}=e.users;return{members:null==s||null===(n=s.fullInfo)||void 0===n?void 0:n.members,adminMembers:null==s||null===(a=s.fullInfo)||void 0===a?void 0:a.adminMembers,userStatusesById:r,isChannel:s&&(0,v.eA)(s),serverTimeOffset:e.serverTimeOffset}}))((({noAdmins:e,members:t,adminMembers:n,userStatusesById:r,isChannel:i,isActive:l,serverTimeOffset:c,onClose:d,onScreenSelect:u,onChatMemberSelect:h})=>{const{openUserInfo:Z}=(0,s.uC)(),P=(0,a.Ye)((()=>{const a=(0,s.Rd)().users.byId;if(!t||!a)return;const o=e&&(null==n?void 0:n.map((({userId:e})=>e)))||[],i=(0,v.Z0)(t.map((({userId:e})=>e)),a,r,void 0,c);return e?i.filter((e=>!o.includes(e))):i}),[t,e,n,r,c]),g=(0,a.I4)((t=>{e?(h(t,!1),u(o.u1.ChatNewAdminRights)):Z({id:t})}),[e,h,u,Z]);return(0,m.ZP)(l,d),a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section",teactFastList:!0},P?P.map(((e,t)=>a.ZP.createElement(Le.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>g(e)},a.ZP.createElement(Re.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(wt.Z,{teactOrderKey:0,key:"nothing-found",text:i?"No subscribers found":"No members found"}))))}))),io=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.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,v.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,v.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(Le.Z,{key:e,teactOrderKey:t,className:"chat-item-clickable scroll-item",onClick:()=>h(e)},a.ZP.createElement(Re.Z,{userId:e,forceShowSelf:!0})))):a.ZP.createElement(wt.Z,{teactOrderKey:0,key:"nothing-found",text:s?"No subscribers found":"No members found"}))))})));var lo=n(2357),co=n(2267);function mo(e,t){const{isPermanent:n,usage:a=0,date:s}=e,{isPermanent:r,usage:o=0,date:i}=t;return n||r?Number(n)-Number(r):a||o?o-a:i-s}const uo=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const{invites:n}=e.management.byChatId[t];return{exportedInvites:n,chat:(0,g.Z1)(e,t),serverTimeOffset:e.serverTimeOffset}}))((({chatId:e,chat:t,exportedInvites:n,isActive:r,serverTimeOffset:i,onClose:l,onScreenSelect:d})=>{const{setEditingExportedInvite:h,showNotification:Z,editExportedChatInvite:P}=(0,s.uC)();(0,m.ZP)(r,l);const v=(0,u.Z)(),g=(0,a.Ye)((()=>{if(n)return n.some((({expireDate:e})=>e&&e-(0,co.b)(i){p()}),g?1e3:void 0);const E=null==n?void 0:n.find((({isPermanent:e})=>e)),C=null!=t&&t.username?`t.me/${t.username}`:null==E?void 0:E.link,b=(0,a.Ye)((()=>{const e=null!=t&&t.username?n:null==n?void 0:n.filter((({isPermanent:e})=>!e));return null==e?void 0:e.filter((({isRevoked:e})=>!e)).sort(mo)}),[null==t?void 0:t.username,n]),I=(0,a.I4)((t=>{const{link:n,title:a,isRequestNeeded:s,expireDate:r,usageLimit:o}=t;P({chatId:e,link:n,title:a,isRequestNeeded:s,expireDate:r,usageLimit:o,isRevoked:!0})}),[e,P]),y=(0,a.I4)((()=>{d(o.u1.EditInvite)}),[d]),N=(0,a.I4)((()=>{E&&I(E)}),[E,I]),S=(0,a.I4)((e=>{(0,ss.TE)(e),Z({message:v("LinkCopied")})}),[v,Z]),w=(0,a.I4)((()=>{S(C)}),[S,C]),k=t=>{const n=[];return n.push({title:v("Copy"),icon:"copy",handler:()=>S(t.link)}),t.isPermanent||n.push({title:v("Edit"),icon:v("edit"),handler:()=>(t=>{h({chatId:e,invite:t}),d(o.u1.EditInvite)})(t)}),n.push({title:v("RevokeButton"),icon:v("delete"),handler:()=>I(t),destructive:!0}),n},M=(0,a.Ye)((()=>({onTrigger:e,isOpen:t})=>a.ZP.createElement(L.Z,{round:!0,ripple:!f.wB,size:"smaller",color:"translucent",className:t?"active":"",onClick:e,ariaLabel:"Actions"},a.ZP.createElement("i",{className:"icon-more"}))),[]);return a.ZP.createElement("div",{className:"Management ManageInvites"},a.ZP.createElement("div",{className:"custom-scroll"},C&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement("p",{className:"text-muted"},null!=t&&t.username?v("PublicLink"):v("lng_create_permanent_link_title")),a.ZP.createElement("div",{className:"primary-link"},a.ZP.createElement("input",{className:"form-control primary-link-input",value:C,readOnly:!0,onClick:w}),a.ZP.createElement(F.Z,{className:"primary-link-more-menu",trigger:M,positionX:"right"},a.ZP.createElement(B.Z,{icon:"copy",onClick:w},v("Copy")),!(null!=t&&t.username)&&a.ZP.createElement(B.Z,{icon:"delete",onClick:N,destructive:!0},v("RevokeButton")))),a.ZP.createElement(L.Z,{onClick:w},v("CopyLink"))),a.ZP.createElement("div",{className:"section",teactFastList:!0},a.ZP.createElement(L.Z,{isText:!0,key:"create",className:"create-link",onClick:y},v("CreateNewLink")),!b&&a.ZP.createElement(wt.Z,{text:"No links found",key:"nothing"}),null==b?void 0:b.map((e=>a.ZP.createElement(Le.Z,{icon:"link",secondaryIcon:"more",multiline:!0,onClick:()=>S(e.link),contextActions:k(e),key:e.link},a.ZP.createElement("span",{className:"title"},e.title||e.link),a.ZP.createElement("span",{className:"subtitle",dir:"auto"},(e=>{const{usage:t=0,usageLimit:n,expireDate:a,isPermanent:s,requested:r}=e;let o="";if(o=n&&t0?v("InviteLink.ExpiresIn",(0,K.D)(v,e)):v("InviteLink.Expired")}else s&&(o+=` • ${v("Permanent")}`);return o})(e))))),a.ZP.createElement("p",{className:"text-muted hint",key:"links-hint"},v("ManageLinksInfoHelp")))))})));var ho=n(2531);const Zo=[1,10,100],Po={hour:36e5,day:864e5,week:6048e5},vo=Po.hour,go=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{const{editingInvite:n}=e.management.byChatId[t];return{editingInvite:n,serverTimeOffset:e.serverTimeOffset}}))((({chatId:e,editingInvite:t,isActive:n,serverTimeOffset:r,onClose:i,onScreenSelect:l})=>{const{editExportedChatInvite:c,exportChatInvite:d}=(0,s.uC)(),h=(0,u.Z)(),[Z,P,v]=(0,De.Z)(),[g,p]=(0,a.eJ)(!1),[E,C]=(0,a.eJ)(""),[f,b]=(0,a.eJ)(Date.now()+vo),[I,y]=(0,a.eJ)("unlimited"),[N,S]=(0,a.eJ)(10),[w,k]=(0,a.eJ)("0");(0,m.ZP)(n,i),(0,a.d4)((()=>{if(t){const{title:e,usageLimit:n,expireDate:a,isRequestNeeded:s}=t;e&&C(e),n&&(k(Zo.includes(n)?n.toString():"custom"),S(n)),a&&(y("custom"),b(1e3*a)),s&&p(!0)}else C(""),y("unlimited"),k("0"),b(1e3*(0,co.b)(r)+vo),S(10),p(!1)}),[t,r]);const M=(0,a.I4)((e=>{p(e.target.checked)}),[]),T=(0,a.I4)((e=>{C(e.target.value)}),[]),A=(0,a.I4)((e=>{S(Number.parseInt(e.target.value,10))}),[]),R=(0,a.I4)((e=>{b(e.getTime()),v()}),[v]),F=(0,a.I4)((()=>{const n="custom"===w?N:w;let a;switch(I){case"custom":a=(0,co.b)(r)+(f-Date.now())/1e3;break;case"hour":case"day":case"week":a=(0,co.b)(r)+Po[I]/1e3;break;case"unlimited":default:a=void 0}t?c({link:t.link,chatId:e,title:E,isRequestNeeded:g,expireDate:a,usageLimit:n}):d({chatId:e,title:E,isRequestNeeded:g,expireDate:a,usageLimit:n}),l(o.u1.Invites)}),[e,f,N,c,t,d,g,I,w,E,l,r]);return a.ZP.createElement("div",{className:"Management ManageInvite"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Cn.Z,{label:h("ApproveNewMembers"),subLabel:h("ApproveNewMembersDescription"),checked:g,onChange:M})),a.ZP.createElement("div",{className:"section"},a.ZP.createElement(Me.Z,{className:"link-name",placeholder:h("LinkNameHint"),value:E,onChange:T}),a.ZP.createElement("p",{className:"text-muted hint"},h("LinkNameHelp"))),a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"section-header"},h("LimitByPeriod")),a.ZP.createElement(at.Z,{name:"expireOptions",options:[{value:"hour",label:h("Hours",1)},{value:"day",label:h("Days",1)},{value:"week",label:h("Weeks",1)},{value:"unlimited",label:h("NoLimit")},{value:"custom",label:h("lng_group_invite_expire_custom")}],onChange:y,selected:I}),"custom"===I&&a.ZP.createElement(L.Z,{className:"expire-limit",isText:!0,onClick:P},(0,K.Tu)(h,f)," ",(0,K.mr)(h,f)),a.ZP.createElement("p",{className:"text-muted hint"},h("TimeLimitHelp"))),!g&&a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"section-header"},h("LimitNumberOfUses")),a.ZP.createElement(at.Z,{name:"usageOptions",options:[...Zo.map((e=>({value:e.toString(),label:e}))),{value:"0",label:h("NoLimit")},{value:"custom",label:h("lng_group_invite_usage_custom")}],onChange:k,selected:w}),"custom"===w&&a.ZP.createElement("input",{className:"form-control usage-limit",type:"number",min:"1",max:"99999",value:N,onChange:A}),a.ZP.createElement("p",{className:"text-muted hint"},h("UsesLimitHelp"))),a.ZP.createElement(dn.Z,{isShown:!0,onClick:F,ariaLabel:h(t?"SaveLink":"CreateLink")},a.ZP.createElement("i",{className:"icon-check"}))),a.ZP.createElement(ho.Z,{isOpen:Z,isFutureMode:!0,withTimePicker:!0,onClose:v,onSubmit:R,selectedAt:f,submitButtonLabel:h("Save")}))}))),po=(0,a.X$)((0,s.c$)(((e,{chatId:t})=>{var n;const a=(0,g.Z1)(e,t);return{enabledReactions:null===(n=a.fullInfo)||void 0===n?void 0:n.enabledReactions,availableReactions:e.availableReactions,chat:a}}))((({availableReactions:e,enabledReactions:t,chat:n,isActive:r,onClose:o})=>{const{setChatEnabledReactions:i}=(0,s.uC)(),l=(0,u.Z)(),[c,d]=(0,a.eJ)(!1),[h,Z]=(0,a.eJ)(!1),[P,v]=(0,a.eJ)(t);(0,m.ZP)(r,o);const g=(0,a.I4)((()=>{n&&(Z(!0),i({chatId:n.id,enabledReactions:P}))}),[n,P,i]);(0,a.d4)((()=>{Z(!1),d(!1),v(t||[])}),[t]);const p=(0,a.I4)((t=>{if(!n||!e)return;const{name:a,checked:s}=t.currentTarget,r="all"===a?s?e.map((e=>e.reaction)):[]:s?[...P,a]:P.filter((e=>e!==a));v(r),d(!0)}),[e,n,P]);return a.ZP.createElement("div",{className:"Management"},a.ZP.createElement("div",{className:"custom-scroll"},a.ZP.createElement("div",{className:"section"},a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:"all",checked:!P||P.length>0,label:l("EnableReactions"),onChange:p})),null==e?void 0:e.filter((e=>!e.isInactive)).map((({reaction:e,title:t})=>a.ZP.createElement("div",{className:"ListItem no-selection"},a.ZP.createElement(Cn.Z,{name:e,checked:!P||(null==P?void 0:P.includes(e)),disabled:0===(null==P?void 0:P.length),label:a.ZP.createElement("div",{className:"Reaction"},a.ZP.createElement(lt.Z,{reaction:e}),t),onChange:p})))))),a.ZP.createElement(dn.Z,{isShown:c,onClick:g,ariaLabel:l("Save"),disabled:h},h?a.ZP.createElement(J.Z,{color:"white"}):a.ZP.createElement("i",{className:"icon-check"})))}))),Eo=(0,a.X$)((0,s.c$)((e=>({managementType:(0,g.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(zr,{key:e,userId:e,onClose:l,isActive:c});case"group":return a.ZP.createElement(Hr,{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.ChatNewAdminRights,o.u1.GroupRecentActions].includes(t)});case"channel":return a.ZP.createElement(Wr,{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.ChatNewAdminRights,o.u1.GroupRecentActions].includes(t)})}break;case o.u1.ChatPrivacyType:return a.ZP.createElement(eo,{chatId:e,isActive:c,onClose:l});case o.u1.Discussion:return a.ZP.createElement(to,{chatId:e,onScreenSelect:r,isActive:c,onClose:l});case o.u1.GroupPermissions:return a.ZP.createElement(Vr,{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(Kr,{chatId:e,isActive:c,onClose:l});case o.u1.GroupUserPermissionsCreate:return a.ZP.createElement(io,{chatId:e,onChatMemberSelect:i,onScreenSelect:r,isActive:c||[o.u1.GroupUserPermissions].includes(t),onClose:l});case o.u1.GroupUserPermissions:return a.ZP.createElement(no,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChatAdministrators:return a.ZP.createElement(ao,{chatId:e,onScreenSelect:r,onChatMemberSelect:i,isActive:c||[o.u1.ChatAdminRights,o.u1.ChatNewAdminRights,o.u1.GroupRecentActions].includes(t),onClose:l});case o.u1.GroupRecentActions:return a.ZP.createElement(so,{chatId:e,isActive:c,onClose:l});case o.u1.ChatAdminRights:return a.ZP.createElement(ro,{chatId:e,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChatNewAdminRights:return a.ZP.createElement(ro,{chatId:e,isNewAdmin:!0,selectedChatMemberId:n,isPromotedByCurrentUser:s,onScreenSelect:r,isActive:c,onClose:l});case o.u1.ChannelSubscribers:case o.u1.GroupMembers:return a.ZP.createElement(oo,{chatId:e,isActive:c,onClose:l});case o.u1.Invites:return a.ZP.createElement(uo,{chatId:e,isActive:c,onClose:l,onScreenSelect:r});case o.u1.EditInvite:return a.ZP.createElement(go,{chatId:e,isActive:c,onClose:l,onScreenSelect:r});case o.u1.GroupAddAdmins:return a.ZP.createElement(oo,{chatId:e,noAdmins:!0,isActive:c,onClose:l,onScreenSelect:r,onChatMemberSelect:i});case o.u1.Reactions:return a.ZP.createElement(po,{chatId:e,isActive:c,onClose:l})}})));var Co=n(9937);const fo=/^4[0-9]{12}(?:[0-9]{1,3})?$/,bo=/^5[1-5][0-9]{11,14}$/,Io=/^2[2-7][0-9]{11,14}$/;let yo;!function(e){e[e.Default=0]="Default",e[e.Visa=1]="Visa",e[e.Mastercard=2]="Mastercard"}(yo||(yo={}));const No={[yo.Default]:"",[yo.Visa]:"visa",[yo.Mastercard]:"mastercard"};function So(e){return e=e.replace(/\s/g,""),fo.test(e)?yo.Visa:bo.test(e)||Io.test(e)?yo.Mastercard:yo.Default}const wo={},ko=/(\d{1,3})(\d{1,3})?(\d{1,3})?(\d{1,3})?(\d{1,3})?/,Mo="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 ko;const t=e[0];let n;if(!wo[t]){const e=t.split("").map(Number);n=e.reduce(((e,t,n)=>`${e}(\\d{1,${t}})${n>0?"?":""}`),""),wo[t]=new RegExp(`${n}${"()?".repeat(5-e.length)}`)}return wo[t]}(e.match(/\d+$/))}))),To={streetLine1:"",streetLine2:"",city:"",state:"",countryIso2:"",postCode:"",fullName:"",email:"",phone:"",shipping:"",cardNumber:"",cardholder:"",expiry:"",cvv:"",billingCountry:"",billingZip:"",saveInfo:!0,saveCredentials:!1,formErrors:{}},Lo=(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:Ao(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:Ao(t.payload.countryIso2)}:{...e,...t.payload};case"setFormErrors":return{...e,formErrors:{...e.formErrors,...t.payload}};default:return e}};function Ao(e){const t=Mo.find((({id:t})=>t===e));return t?t.name:""}function Ro(e,t=400){(0,a.d4)((()=>{f.$b||setTimeout((()=>{(0,G.T2)((()=>{e.current&&e.current.focus()}))}),t)}),[e,t])}const Fo=(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))})),Bo=(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)();Ro(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]),v=(0,a.I4)((e=>{o({type:"changeCountry",payload:e.target.value})}),[o]),g=(0,a.I4)((e=>{o({type:"changePostCode",payload:e.target.value})}),[o]),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(Me.Z,{ref:i,label:"Address1 (Street)",onChange:m,value:e.streetLine1,inputMode:"text",error:b.streetLine1}),a.ZP.createElement(Me.Z,{label:"Address2 (Street)",onChange:h,value:e.streetLine2,inputMode:"text",error:b.streetLine2}),a.ZP.createElement(Me.Z,{label:"City",onChange:Z,value:e.city,inputMode:"text",error:b.city}),a.ZP.createElement(Me.Z,{label:"State",onChange:P,value:e.state,inputMode:"text",error:b.state}),a.ZP.createElement(Fo,{label:"Country",placeholder:"Country",onChange:v,value:e.countryIso2,hasArrow:Boolean(!0),id:"shipping-country",error:b.countryIso2,ref:c},Mo.map((({name:e,id:t})=>a.ZP.createElement("option",{value:t,className:"county-item"},e)))),a.ZP.createElement(Me.Z,{label:"Post Code",onChange:g,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(Me.Z,{label:"Full name",onChange:p,value:e.fullName,inputMode:"text",error:b.fullName}),t&&a.ZP.createElement(Me.Z,{label:"Email",onChange:E,value:e.email,inputMode:"email",error:b.email}),n&&a.ZP.createElement(Me.Z,{label:"Phone number",onChange:C,value:e.phone,inputMode:"tel",error:b.phone,ref:l}),a.ZP.createElement(Cn.Z,{label:d("PaymentShippingSave"),subLabel:d("PaymentShippingSaveInfo"),checked:Boolean(e.saveInfo),onChange:f})))})),$o=(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,Co.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(at.Z,{name:"shipping-options",options:i,onChange:o,selected:e.shipping})))}));function Do(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,Co.x)(n,s,e)))}function xo(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 Uo=(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:v,shippingMethod:g}=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=>Do(i.code,e.label,e.amount,r))),n&&n.map((e=>Do(i.code,e.label,e.amount,r))),void 0!==o&&Do(i.code,i("Checkout.TotalAmount"),o,r,!0)),a.ZP.createElement("div",{className:"invoice-info"},m&&xo("icon-card",m,"Payment method"),h&&xo("stripe-provider",h,"Payment provider"),Z&&xo("icon-location",Z,"Shipping address"),P&&xo("icon-user",P,"Name"),v&&xo("icon-phone",v,"Phone number"),g&&xo("icon-truck",g,"Shipping method")))})),Oo=(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(Me.Z,{label:"Expiry date",ref:s,onChange:o,onKeyDown:r,value:e,error:t,inputMode:"numeric",maxLength:5})}));var Go=n(6352),Jo=n(5753);const Xo=(0,a.X$)((({value:e,error:t,onChange:n})=>{const s=(0,a.sO)(null);Ro(s);const[r,o]=(0,a.eJ)(yo.Default);(0,a.d4)((()=>{const t=So(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=So(e.target.value);o(a),n(t),s.current&&(s.current.value=t)}),[n,s]),l=function(e){switch(e){case yo.Mastercard:return a.ZP.createElement("img",{src:Go,alt:""});case yo.Visa:return a.ZP.createElement("img",{src:Jo,alt:""});default:return}}(r);return a.ZP.createElement("div",{className:"CardInput"},a.ZP.createElement("span",{className:"left-addon"},l),a.ZP.createElement(Me.Z,{ref:s,label:"Card number",onChange:i,value:e,inputMode:"numeric",className:r?"has-left-addon":"",error:t,maxLength:23}))})),_o=(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]),v=(0,u.Z)(),{formErrors:g={}}=e;return a.ZP.createElement("div",{className:"PaymentInfo"},a.ZP.createElement("form",null,a.ZP.createElement("h5",null,v("PaymentCardTitle")),a.ZP.createElement(Xo,{onChange:l,value:e.cardNumber,error:g.cardNumber}),n&&a.ZP.createElement(Me.Z,{label:"Name on card",onChange:c,value:e.cardholder,inputMode:"text",error:g.cardholder}),a.ZP.createElement("section",{className:"inline-inputs"},a.ZP.createElement(Oo,{value:e.expiry,onChange:d,error:g.expiry}),a.ZP.createElement(Me.Z,{label:"CVV code",onChange:m,value:e.cvv,inputMode:"numeric",maxLength:3,error:g.cvv})),s||r?a.ZP.createElement("h5",null,v("PaymentBillingAddress")):void 0,s&&a.ZP.createElement(Fo,{label:"Country",placeholder:"Country",onChange:h,value:e.billingCountry,hasArrow:Boolean(!0),id:"billing-country",error:g.billingCountry,ref:i},Mo.map((({name:e})=>a.ZP.createElement("option",{value:e,className:"county-item"},e)))),r&&a.ZP.createElement(Me.Z,{label:"Post Code",onChange:Z,value:e.billingZip,inputMode:"text",error:g.billingZip}),t&&a.ZP.createElement(Cn.Z,{label:v("PaymentCardSavePaymentInformation"),checked:e.saveCredentials,onChange:P})))})),zo=(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:v,emailRequested:g,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:v,emailRequested:g,flexible:E,phoneToProvider:C,emailToProvider:f,currency:b,prices:I,isProviderError:m,invoiceContent:o,needCardholderName:u,needCountry:h,needZip:Z,error:d}}))((({isOpen:e,onClose:t,step:n,shippingOptions:r,savedInfo:i,canSaveCredentials:l,nameRequested:c,shippingAddressRequested:d,phoneRequested:m,emailRequested:h,phoneToProvider:Z,emailToProvider:P,currency:v,passwordMissing:g,isProviderError:p,invoiceContent:E,nativeProvider:C,prices:f,needCardholderName:b,needCountry:I,needZip:y,error:N})=>{const{validateRequestedInfo:S,sendPaymentForm:w,setPaymentStep:k,sendCredentialsInfo:M,clearPaymentError:T}=(0,s.uC)(),[A,F]=(0,tn.Z)(Lo,To),[B,$]=(0,a.eJ)(!1),D=(0,u.Z)();(0,a.d4)((()=>{(n||N)&&$(!1)}),[n,N]),(0,a.d4)((()=>{null!=N&&N.field&&F({type:"setFormErrors",payload:{[N.field]:N.message}})}),[N,F]),(0,a.d4)((()=>{if(i){const{name:e,phone:t,email:n,shippingAddress:a}=i;F({type:"updateUserInfo",payload:{fullName:e,phone:t&&"+"!==t.charAt(0)?`+${t}`:t,email:n,...a||{}}})}}),[i,F]);const x=(0,a.I4)((()=>{T()}),[T]),U=(0,a.Ye)((()=>n!==o.KB.Checkout?0:function(e=[],t,n){const a=t?Ho(t,n):[];let s=0;return s=e.concat(a||[]).reduce(((e,t)=>e+t.amount),s),s}(f,r,A.shipping)),[n,A.shipping,f,r]),O=(0,a.Ye)((()=>{if(n===o.KB.Checkout)return function(e,t,n){const a=`${function(e){const t=So(e);return No[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?Yo(t,e.shipping):void 0;return{paymentMethod:a,paymentProvider:n,shippingAddress:s,name:o,phone:r,shippingMethod:null==i?void 0:i.title}}(A,r,C||"")}),[n,A,r,C]),G=(0,a.I4)((()=>{const{saveInfo:e}=A,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}}}(A);S({requestInfo:t,saveInfo:e})}),[S,A]),X=(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}}}(A);M({credentials:e})}),[M,A]),_=(0,a.I4)((()=>{w({shippingOptionId:A.shipping,saveCredentials:A.saveCredentials})}),[w,A]),z=(0,a.I4)((e=>{k({step:e})}),[k]),Y=(0,a.I4)((()=>{switch($(!0),n){case o.KB.ShippingInfo:return G();case o.KB.Shipping:return z(o.KB.PaymentInfo);case o.KB.PaymentInfo:return X();case o.KB.Checkout:return _();default:return()=>{}}}),[n,G,z,X,_]),H=(0,a.Ye)((()=>{switch(n){case o.KB.ShippingInfo:return D("PaymentShippingInfo");case o.KB.Shipping:return D("PaymentShippingMethod");case o.KB.PaymentInfo:return D("PaymentCardInfo");case o.KB.Checkout:return D("PaymentCheckout");default:return""}}),[n,D]),V=(0,a.Ye)((()=>{switch(n){case o.KB.Checkout:return D("Checkout.PayPrice",(0,Co.x)(U,v,D.code));default:return D("Next")}}),[n,D,v,U]);return p?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(L.Z,{isText:!0,onClick:t},D("OK"))):a.ZP.createElement(ke.Z,{className:"PaymentModal",isOpen:e,onClose:t},a.ZP.createElement("div",{className:"header",dir:D.isRtl?"rtl":void 0},a.ZP.createElement(L.Z,{className:"close-button",color:"translucent",round:!0,size:"smaller",onClick:t,ariaLabel:"Close"},a.ZP.createElement("i",{className:"icon-close"})),a.ZP.createElement("h3",null,H)),void 0!==n?a.ZP.createElement(R.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(Bo,{state:A,dispatch:F,needAddress:Boolean(d),needEmail:Boolean(h||P),needPhone:Boolean(m||Z),needName:Boolean(c)});case o.KB.Shipping:return a.ZP.createElement($o,{state:A,dispatch:F,shippingOptions:r||[],currency:v});case o.KB.PaymentInfo:return a.ZP.createElement(_o,{state:A,dispatch:F,canSaveCredentials:Boolean(!g&&l),needCardholderName:b,needCountry:I,needZip:y});case o.KB.Checkout:return a.ZP.createElement(Uo,{prices:f,shippingPrices:A.shipping&&r?Ho(r,A.shipping):void 0,totalPrice:U,invoiceContent:E,checkoutInfo:O,currency:v});default:return}}(n)))):a.ZP.createElement("div",{className:"empty-content"},a.ZP.createElement(J.Z,{color:"gray"})),a.ZP.createElement("div",{className:"footer"},a.ZP.createElement(L.Z,{type:"submit",onClick:Y,disabled:B,isLoading:B},V)),N&&!N.field&&function(){if(N)return a.ZP.createElement(ke.Z,{className:"error",isOpen:Boolean(N),onClose:x},a.ZP.createElement("h4",null,N.description||"Error"),a.ZP.createElement("p",null,N.description||"Error"),a.ZP.createElement(L.Z,{isText:!0,onClick:T},D("OK")))}())})));function Yo(e,t){return e.find((({id:e})=>e===t))}function Ho(e,t){const n=Yo(e,t);return null==n?void 0:n.prices}const Vo=(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(L.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(Uo,{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:v})=>{const g=(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((()=>{g.current.focus()}),c)}),[]),(0,a.d4)((()=>{n&&requestAnimationFrame((()=>{g.current.focus(),g.current.select()}))}),[n]),a.ZP.createElement("form",{action:"",onSubmit:function(t){t.preventDefault(),e||f&&v(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:g,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),[v,g]=(0,a.eJ)(!1);(0,a.d4)((()=>{n?setTimeout((()=>g(!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:v?"hidden":"shown",animationData:n,playSegment:l,noLoop:!0,onLoad:p}),u&&a.ZP.createElement(i.Z,{id:"peekMonkey",size:t?s.K2:m,className:v?"shown":"hidden",animationData:u,playSegment:e?c:d,noLoop:!0}))}))},710:(e,t,n)=>{n.d(t,{Z:()=>v});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,size:{width:1024,height:1024}};let u,h,Z;const P=(0,a.X$)((({file:e,onChange:t,onClose:s})=>{const[P,v]=(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((()=>v(!0))))}),[e,P]);const g=(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:g("CropImage")},a.ZP.createElement("i",{className:"icon-check"})))})),v=(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))}}))}))},6352:(e,t,n)=>{e.exports=n.p+"mastercard.4216118edafe23cc2dec..svg"},5753:(e,t,n)=>{e.exports=n.p+"visa.e5a7c336e1deb4b92a63..svg"}}]); +//# sourceMappingURL=442.f81b4eb30975dff27660.js.map \ No newline at end of file diff --git a/dist/442.f81b4eb30975dff27660.js.map b/dist/442.f81b4eb30975dff27660.js.map new file mode 100644 index 000000000..6d33c62a5 --- /dev/null +++ b/dist/442.f81b4eb30975dff27660.js.map @@ -0,0 +1 @@ +{"version":3,"file":"442.f81b4eb30975dff27660.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/components/middle/ReactorListModal.tsx","webpack://telegram-t/./src/components/middle/EmojiInteractionAnimation.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/SettingsQuickReaction.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/ReactionSelector.tsx","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/middle/composer/SendAsMenu.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/ManageInvites.tsx","webpack://telegram-t/./src/components/right/management/ManageInvite.tsx","webpack://telegram-t/./src/components/right/management/ManageReactions.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/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';\nimport stopEvent from '../../../util/stopEvent';\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 img.draggable = false;\n img.oncontextmenu = stopEvent;\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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, selectIsMessageProtected } from '../../modules/selectors';\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 isProtected?: 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\nconst MediaViewerActions: FC = ({\n mediaData,\n isVideo,\n isZoomed,\n message,\n fileName,\n isAvatar,\n isDownloading,\n isProtected,\n onCloseMediaViewer,\n onForward,\n onZoomToggle,\n}) => {\n const {\n downloadMessageMedia,\n cancelMessageMediaDownload,\n } = getDispatch();\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 function renderDownloadButton() {\n if (isProtected) {\n return undefined;\n }\n\n return isVideo ? (\n \n {isDownloading ? (\n \n ) : (\n \n )}\n \n ) : (\n \n \n \n );\n }\n\n if (IS_SINGLE_COLUMN_LAYOUT) {\n if (isProtected) {\n return undefined;\n }\n\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 && !isProtected && (\n <>\n \n \n \n \n )}\n {renderDownloadButton()}\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 const isProtected = selectIsMessageProtected(global, message);\n\n return {\n isDownloading,\n isProtected,\n };\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 { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\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, selectIsMessageProtected, selectScheduledMessage, selectUser,\n} from '../../modules/selectors';\nimport { AVATAR_FULL_DIMENSIONS, calculateMediaViewerDimensions } from '../common/helpers/mediaDimensions';\nimport { renderMessageText } from '../common/helpers/renderMessageText';\nimport stopEvent from '../../util/stopEvent';\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 isProtected?: boolean;\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 isProtected,\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 !IS_SINGLE_COLUMN_LAYOUT && !isProtected,\n )}\n
\n );\n }\n\n if (!message) return undefined;\n const textParts = renderMessageText(message);\n const hasFooter = Boolean(textParts);\n return (\n \n {isProtected &&
}\n {isPhoto && renderPhoto(\n localBlobUrl || fullMediaBlobUrl || previewBlobUrl || pictogramBlobUrl,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter),\n !IS_SINGLE_COLUMN_LAYOUT && !isProtected,\n )}\n {isVideo && (isActive ? (\n \n ) : renderVideoPreview(\n bestImageData,\n message && calculateMediaViewerDimensions(dimensions!, hasFooter, true),\n !IS_SINGLE_COLUMN_LAYOUT && !isProtected,\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 isProtected: selectIsMessageProtected(global, 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 isProtected: selectIsMessageProtected(global, 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, true);\n const debounceSwipe = useDebounce(DEBOUNCE_SWIPE, true);\n const debounceActive = useDebounce(DEBOUNCE_ACTIVE, true);\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 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\nconst SenderInfo: FC = ({\n chatId,\n messageId,\n sender,\n isAvatar,\n message,\n}) => {\n const {\n closeMediaViewer,\n focusMessage,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 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\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 animationLevel,\n}) => {\n const {\n openMediaViewer,\n closeMediaViewer,\n openForwardMenu,\n focusMessage,\n } = getDispatch();\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)(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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat, MAIN_THREAD_ID } from '../../api/types';\n\nimport {\n filterChatsByName,\n filterUsersByName,\n getCanPostInChat,\n sortChatIds,\n} from '../../modules/helpers';\nimport { 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\nconst ForwardPicker: FC = ({\n chatsById,\n activeListIds,\n archivedListIds,\n pinnedIds,\n contactIds,\n currentUserId,\n isOpen,\n}) => {\n const {\n setForwardChatId,\n exitForwardMode,\n loadMoreChats,\n } = getDispatch();\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)(ForwardPicker));\n","import React, { FC, memo, useEffect } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiContact, ApiError, ApiInviteInfo, ApiPhoto,\n} from '../../api/types';\n\nimport getReadableErrorText from '../../util/getReadableErrorText';\nimport { pick } from '../../util/iteratees';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Avatar from '../common/Avatar';\n\nimport './Dialogs.scss';\n\ntype StateProps = {\n dialogs: (ApiError | ApiInviteInfo)[];\n};\n\nconst Dialogs: FC = ({ dialogs }) => {\n const { dismissDialog, acceptInviteConfirmation, sendMessage } = getDispatch();\n const [isModalOpen, openModal, closeModal] = useFlag();\n\n const lang = useLang();\n\n useEffect(() => {\n if (dialogs.length > 0) {\n openModal();\n }\n }, [dialogs, openModal]);\n\n if (!dialogs.length) {\n return undefined;\n }\n\n function renderInviteHeader(title: string, photo?: ApiPhoto) {\n return (\n
\n {photo && }\n
\n {renderText(title)}\n
\n \n
\n );\n }\n\n const renderInvite = (invite: ApiInviteInfo) => {\n const {\n hash, title, about, participantsCount, isChannel, photo, isRequestNeeded,\n } = invite;\n\n const handleJoinClick = () => {\n acceptInviteConfirmation({\n hash,\n });\n closeModal();\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 const requestToJoinText = isChannel\n ? lang('MemberRequests.RequestToJoinChannel') : lang('MemberRequests.RequestToJoinGroup');\n\n return (\n \n {about &&

{renderText(about)}

}\n {participantsCount !== undefined &&

{participantsText}

}\n {isRequestNeeded && (\n

\n {isChannel\n ? lang('MemberRequests.RequestToJoinDescriptionChannel')\n : lang('MemberRequests.RequestToJoinDescriptionGroup')}\n

\n )}\n \n \n \n );\n };\n\n const renderContactRequest = (contactRequest: ApiContact) => {\n const handleConfirm = () => {\n sendMessage({\n contact: pick(contactRequest, ['firstName', 'lastName', 'phoneNumber']),\n });\n closeModal();\n };\n\n return (\n \n {lang('AreYouSureShareMyContactInfoBot')}\n
\n \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 | ApiContact) => {\n if ('hash' in dialog) {\n return renderInvite(dialog);\n }\n\n if ('phoneNumber' in dialog) {\n return renderContactRequest(dialog);\n }\n\n return renderError(dialog);\n };\n\n return (\n
\n {Boolean(dialogs.length) && renderDialog(dialogs[dialogs.length - 1])}\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)(Dialogs));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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\nconst Notifications: FC = ({ notifications }) => {\n const { dismissNotification } = getDispatch();\n\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)(Notifications));\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\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\nconst SafeLinkModal: FC = ({ url }) => {\n const { toggleSafeLinkModal } = getDispatch();\n\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(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, getDayStart } 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\nconst MAX_SAFE_DATE = 2147483647 * 1000; // API has int for dates\nconst MIN_SAFE_DATE = 0;\n\nexport type OwnProps = {\n selectedAt?: number;\n minAt?: 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 minAt,\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\n const minDate = useMemo(() => {\n if (isFutureMode && !minAt) return new Date();\n return new Date(Math.max(minAt || MIN_SAFE_DATE, MIN_SAFE_DATE));\n }, [isFutureMode, minAt]);\n const maxDate = useMemo(() => {\n if (isPastMode && !maxAt) return new Date();\n return new Date(Math.min(maxAt || MAX_SAFE_DATE, MAX_SAFE_DATE));\n }, [isPastMode, maxAt]);\n\n const passedSelectedDate = useMemo(() => (selectedAt ? new Date(selectedAt) : new Date()), [selectedAt]);\n const prevIsOpen = usePrevious(isOpen);\n const [isTimeInputFocused, markTimeInputAsFocused, unmarkTimeInputAsFocused] = useFlag(false);\n\n const [selectedDate, setSelectedDate] = useState(passedSelectedDate);\n const [currentMonthAndYear, setCurrentMonthAndYear] = useState(\n new Date(selectedDate.getFullYear(), selectedDate.getMonth(), 1),\n );\n const [selectedHours, setSelectedHours] = useState(\n formatInputTime(passedSelectedDate.getHours()),\n );\n const [selectedMinutes, setSelectedMinutes] = useState(\n formatInputTime(passedSelectedDate.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(passedSelectedDate);\n setCurrentMonthAndYear(new Date(passedSelectedDate.getFullYear(), passedSelectedDate.getMonth(), 1));\n if (withTimePicker) {\n setSelectedHours(formatInputTime(passedSelectedDate.getHours()));\n setSelectedMinutes(formatInputTime(passedSelectedDate.getMinutes()));\n }\n }\n }, [passedSelectedDate, isOpen, prevIsOpen, withTimePicker]);\n\n useEffect(() => {\n if (isFutureMode && !isTimeInputFocused && selectedDate.getTime() < minDate.getTime()) {\n setSelectedDate(minDate);\n setSelectedHours(formatInputTime(minDate.getHours()));\n setSelectedMinutes(formatInputTime(minDate.getMinutes()));\n }\n }, [isFutureMode, isTimeInputFocused, minDate, selectedDate]);\n\n useEffect(() => {\n if (isPastMode && !isTimeInputFocused && selectedDate.getTime() > maxDate.getTime()) {\n setSelectedDate(maxDate);\n setSelectedHours(formatInputTime(maxDate.getHours()));\n setSelectedMinutes(formatInputTime(maxDate.getMinutes()));\n }\n }, [isFutureMode, isPastMode, isTimeInputFocused, maxDate, minDate, selectedDate]);\n\n useEffect(() => {\n if (selectedAt) {\n const newSelectedDate = new Date(selectedAt);\n setSelectedDate(newSelectedDate);\n setSelectedHours(formatInputTime(newSelectedDate.getHours()));\n setSelectedMinutes(formatInputTime(newSelectedDate.getMinutes()));\n }\n }, [selectedAt]);\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, minDate, 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);\n const fixedMinDate = minDate && getDayStart(minDate);\n const fixedMaxDate = maxDate && getDayStart(maxDate);\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(lang, date));\n }\n\n return lang('Conversation.ScheduleMessage.SendOn', [day, formatTime(lang, date)]);\n}\n\nexport default memo(CalendarModal);\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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\nconst HistoryCalendar: FC = ({\n isOpen, selectedAt,\n}) => {\n const { searchMessagesByDate, closeHistoryCalendar } = getDispatch();\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)(HistoryCalendar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { IAlbum } from '../../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 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\nconst DeleteMessageModal: FC = ({\n isOpen,\n isSchedule,\n message,\n album,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n}) => {\n const {\n deleteMessages,\n deleteScheduledMessages,\n } = getDispatch();\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)(DeleteMessageModal));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\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 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\nconst PinMessageModal: FC = ({\n isOpen,\n messageId,\n chatId,\n isChannel,\n isGroup,\n isSuperGroup,\n canPinForAll,\n contactName,\n onClose,\n}) => {\n const { pinMessage } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\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 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\nconst DeleteSelectedMessageModal: FC = ({\n isOpen,\n isSchedule,\n selectedMessageIds,\n canDeleteForAll,\n contactName,\n willDeleteForCurrentUserOnly,\n willDeleteForAll,\n onClose,\n}) => {\n const {\n deleteMessages,\n deleteScheduledMessages,\n exitMessageSelectMode,\n } = getDispatch();\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)(DeleteSelectedMessageModal));\n","import { ChangeEvent } from 'react';\n\nimport React, {\n FC, memo, useCallback, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport { ApiReportReason } from '../../api/types';\n\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\nconst ReportMessageModal: FC = ({\n isOpen,\n messageIds,\n onClose,\n}) => {\n const {\n reportMessages,\n exitMessageSelectMode,\n } = getDispatch();\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(ReportMessageModal);\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { MessageListType } from '../../global/types';\n\nimport {\n selectCanDeleteSelectedMessages,\n selectCanDownloadSelectedMessages,\n selectCanReportSelectedMessages,\n selectCurrentMessageList,\n selectHasProtectedMessage,\n selectSelectedMessagesCount,\n} from '../../modules/selectors';\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 hasProtectedMessage?: boolean;\n selectedMessageIds?: number[];\n};\n\nconst MessageSelectToolbar: FC = ({\n canPost,\n isActive,\n messageListType,\n isSchedule,\n selectedMessagesCount,\n canDeleteMessages,\n canReportMessages,\n canDownloadMessages,\n hasProtectedMessage,\n selectedMessageIds,\n}) => {\n const {\n exitMessageSelectMode,\n openForwardMenuForSelectedMessages,\n downloadSelectedMessages,\n } = getDispatch();\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(\n 'forward', lang('Chat.ForwardActionHeader'), openForwardMenuForSelectedMessages, hasProtectedMessage,\n )\n )}\n {canReportMessages && (\n renderButton('flag', lang('Conversation.ReportMessages'), openReportModal)\n )}\n {canDownloadMessages && (\n renderButton('download', lang('lng_media_download'), handleDownload, hasProtectedMessage)\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, chatId } = selectCurrentMessageList(global) || {};\n const { canDelete } = selectCanDeleteSelectedMessages(global);\n const canReport = selectCanReportSelectedMessages(global);\n const canDownload = selectCanDownloadSelectedMessages(global);\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const hasProtectedMessage = chatId ? selectHasProtectedMessage(global, chatId, selectedMessageIds) : false;\n\n return {\n isSchedule: messageListType === 'scheduled',\n selectedMessagesCount: selectSelectedMessagesCount(global),\n canDeleteMessages: canDelete,\n canReportMessages: canReport,\n canDownloadMessages: canDownload,\n selectedMessageIds,\n hasProtectedMessage,\n };\n },\n)(MessageSelectToolbar));\n","import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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\nconst CLOSE_ANIMATION_DURATION = 100;\n\nconst SeenByModal: FC = ({\n isOpen,\n memberIds,\n}) => {\n const {\n openChat,\n closeSeenByModal,\n } = getDispatch();\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)(SeenByModal));\n","import React, {\n FC, useCallback, memo, useMemo, useEffect, useState, useRef,\n} from '../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\nimport { LoadMoreDirection } from '../../types';\n\nimport useLang from '../../hooks/useLang';\nimport { selectChatMessage } from '../../modules/selectors';\nimport useInfiniteScroll from '../../hooks/useInfiniteScroll';\nimport { getUserFullName } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useFlag from '../../hooks/useFlag';\nimport buildClassName from '../../util/buildClassName';\nimport { formatIntegerCompact } from '../../util/textFormat';\nimport { unique } from '../../util/iteratees';\n\nimport InfiniteScroll from '../ui/InfiniteScroll';\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\nimport Avatar from '../common/Avatar';\nimport ListItem from '../ui/ListItem';\nimport ReactionStaticEmoji from '../common/ReactionStaticEmoji';\nimport Loading from '../ui/Loading';\n\nimport './ReactorListModal.scss';\n\nconst MIN_REACTIONS_COUNT_FOR_FILTERS = 10;\n\nexport type OwnProps = {\n isOpen: boolean;\n};\n\nexport type StateProps = Pick & {\n chatId?: string;\n messageId?: number;\n};\n\nconst ReactorListModal: FC = ({\n isOpen,\n reactors,\n reactions,\n chatId,\n messageId,\n seenByUserIds,\n}) => {\n const {\n loadReactors,\n closeReactorListModal,\n openChat,\n } = getDispatch();\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n const lang = useLang();\n const [isClosing, startClosing, stopClosing] = useFlag(false);\n const [chosenTab, setChosenTab] = useState(undefined);\n const canShowFilters = reactors && reactions && reactors.count >= MIN_REACTIONS_COUNT_FOR_FILTERS\n && reactions.results.length > 1;\n const chatIdRef = useRef();\n\n useEffect(() => {\n if (isClosing && !isOpen) {\n stopClosing();\n setChosenTab(undefined);\n }\n }, [isClosing, isOpen, stopClosing]);\n\n const handleCloseAnimationEnd = useCallback(() => {\n if (chatIdRef.current) {\n openChat({ id: chatIdRef.current });\n }\n closeReactorListModal();\n }, [closeReactorListModal, openChat]);\n\n const handleClose = useCallback(() => {\n startClosing();\n }, [startClosing]);\n\n const handleClick = useCallback((userId: string) => {\n chatIdRef.current = userId;\n handleClose();\n }, [handleClose]);\n\n const handleLoadMore = useCallback(() => {\n loadReactors({\n chatId,\n messageId,\n });\n }, [chatId, loadReactors, messageId]);\n\n const allReactions = useMemo(() => {\n return reactors?.reactions ? unique(reactors.reactions.map((l) => l.reaction)) : [];\n }, [reactors?.reactions]);\n\n const userIds = useMemo(() => {\n if (chosenTab) {\n return reactors?.reactions.filter((l) => l.reaction === chosenTab).map((l) => l.userId);\n }\n return unique(reactors?.reactions.map((l) => l.userId).concat(seenByUserIds || []) || []);\n }, [chosenTab, reactors?.reactions, seenByUserIds]);\n\n const [viewportIds, getMore] = useInfiniteScroll(\n handleLoadMore, userIds, reactors && reactors.nextOffset === undefined,\n );\n\n useEffect(() => {\n getMore?.({ direction: LoadMoreDirection.Backwards });\n }, [getMore]);\n\n return (\n \n {canShowFilters && (\n
\n setChosenTab(undefined)}\n >\n \n {reactors?.count && formatIntegerCompact(reactors.count)}\n \n {allReactions.map((reaction) => {\n const count = reactions?.results.find((l) => l.reaction === reaction)?.count;\n return (\n setChosenTab(reaction)}\n >\n \n {count && formatIntegerCompact(count)}\n \n );\n })}\n
\n )}\n\n
\n {viewportIds?.length ? (\n \n {viewportIds?.map(\n (userId) => {\n const user = usersById[userId];\n const fullName = getUserFullName(user);\n const reaction = reactors?.reactions.find((l) => l.userId === userId)?.reaction;\n return (\n handleClick(userId)}\n >\n \n
\n

{fullName && renderText(fullName)}

\n
\n {reaction && }\n \n );\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.reactorModal || {};\n const message = chatId && messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n\n return {\n chatId,\n messageId,\n reactions: message?.reactions,\n reactors: message?.reactors,\n seenByUserIds: message?.seenByUserIds,\n };\n },\n)(ReactorListModal));\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ActiveEmojiInteraction } from '../../global/types';\nimport { ApiMediaFormat } from '../../api/types';\n\nimport { IS_ANDROID } from '../../util/environment';\nimport useFlag from '../../hooks/useFlag';\nimport useMedia from '../../hooks/useMedia';\nimport buildClassName from '../../util/buildClassName';\nimport {\n selectAnimatedEmojiEffect,\n} from '../../modules/selectors';\nimport getAnimationData, { ANIMATED_STICKERS_PATHS } from '../common/helpers/animatedAssets';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\n\nimport AnimatedSticker from '../common/AnimatedSticker';\n\nimport './EmojiInteractionAnimation.scss';\n\nexport type OwnProps = {\n emojiInteraction: ActiveEmojiInteraction;\n};\n\ntype StateProps = {\n effectAnimationId?: string;\n localEffectAnimation?: string;\n isReversed?: boolean;\n};\n\nconst HIDE_ANIMATION_DURATION = 250;\nconst PLAYING_DURATION = 3000;\nconst EFFECT_SIZE = 240;\n\nconst EmojiInteractionAnimation: FC = ({\n emojiInteraction,\n effectAnimationId,\n localEffectAnimation,\n isReversed,\n}) => {\n const { stopActiveEmojiInteraction } = getDispatch();\n\n const [isHiding, startHiding] = useFlag(false);\n const [isPlaying, startPlaying] = useFlag(false);\n\n const stop = useCallback(() => {\n startHiding();\n setTimeout(() => {\n stopActiveEmojiInteraction();\n }, HIDE_ANIMATION_DURATION);\n }, [startHiding, stopActiveEmojiInteraction]);\n\n useEffect(() => {\n document.addEventListener('touchstart', stop);\n document.addEventListener('touchmove', stop);\n document.addEventListener('mousedown', stop);\n document.addEventListener('wheel', stop);\n\n return () => {\n document.removeEventListener('touchstart', stop);\n document.removeEventListener('touchmove', stop);\n document.removeEventListener('mousedown', stop);\n document.removeEventListener('wheel', stop);\n };\n }, [stop]);\n\n useLayoutEffect(() => {\n const dispatchHeavyAnimationStop = dispatchHeavyAnimationEvent();\n\n setTimeout(() => {\n stop();\n dispatchHeavyAnimationStop();\n }, PLAYING_DURATION);\n }, [stop]);\n\n const effectAnimationData = useMedia(`sticker${effectAnimationId}`, !effectAnimationId, ApiMediaFormat.Lottie);\n\n const [localEffectAnimationData, setLocalEffectAnimationData] = useState();\n useEffect(() => {\n if (localEffectAnimation) {\n getAnimationData(localEffectAnimation as keyof typeof ANIMATED_STICKERS_PATHS).then((data) => {\n setLocalEffectAnimationData(data);\n });\n }\n }, [localEffectAnimation]);\n\n const scale = (emojiInteraction.startSize || 0) / EFFECT_SIZE;\n\n return (\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { emojiInteraction }): StateProps => {\n const animatedEffect = emojiInteraction.animatedEffect !== undefined\n && selectAnimatedEmojiEffect(global, emojiInteraction.animatedEffect);\n return {\n effectAnimationId: animatedEffect ? animatedEffect.id : undefined,\n localEffectAnimation: !animatedEffect && emojiInteraction.animatedEffect\n && Object.keys(ANIMATED_STICKERS_PATHS).includes(emojiInteraction.animatedEffect)\n ? emojiInteraction.animatedEffect : undefined,\n isReversed: emojiInteraction.isReversed,\n };\n },\n)(EmojiInteractionAnimation));\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\n\nimport { getUserFirstOrLastName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport { throttle } from '../../../util/schedulers';\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\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,\n}) => {\n const {\n loadTopUsers, loadContactList, openChat,\n addRecentlyFoundChatId, clearRecentlyFoundChats,\n } = getDispatch();\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)(RecentContacts));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 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\nconst ChatMessage: FC = ({\n message,\n searchQuery,\n chatId,\n chat,\n privateChatUser,\n lastSyncTime,\n}) => {\n const { focusMessage } = getDispatch();\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)(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 { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { unique } 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\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,\n}) => {\n const {\n openChat, addRecentlyFoundChatId, searchMessagesGlobal, setGlobalSearchChatId,\n } = getDispatch();\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(\n contactIdsWithMe, usersById, searchQuery, currentUserId, lang('SavedMessages'),\n );\n\n return [\n ...sortChatIds(unique([\n ...(foundContactIds || []),\n ...(localChatIds || []),\n ...(localUserIds || []),\n ]), chatsById, undefined, currentUserId ? [currentUserId] : undefined),\n ];\n }, [searchQuery, currentUserId, localContactIds, lang, 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)(ChatResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiMessage } from '../../../api/types';\nimport { LoadMoreDirection } from '../../../types';\n\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\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 onSearchDateSelect,\n}) => {\n const { searchMessagesGlobal } = getDispatch();\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)(ChatMessageResults));\n","import { GlobalState } from '../../../../global/types';\nimport {\n ApiChat, ApiGlobalMessageSearchType, ApiMessage, ApiUser,\n} from '../../../../api/types';\nimport { ISettings } from '../../../../types';\n\nimport { selectChat, 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 isChatProtected?: boolean;\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 isChatProtected: chatId ? selectChat(global, chatId)?.isProtected : undefined,\n lastSyncTime: global.lastSyncTime,\n };\n };\n}\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 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\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 isChatProtected,\n}) => {\n const {\n searchMessagesGlobal,\n openMediaViewer,\n } = getDispatch();\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)(MediaResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 { 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\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 isChatProtected,\n}) => {\n const {\n searchMessagesGlobal,\n focusMessage,\n } = getDispatch();\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)(LinkResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/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 { 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\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}) => {\n const {\n searchMessagesGlobal,\n focusMessage,\n } = getDispatch();\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)(FileResults));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 { 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\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}) => {\n const {\n searchMessagesGlobal,\n focusMessage,\n openAudioPlayer,\n } = getDispatch();\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)(AudioResults));\n","import React, {\n FC, memo, useCallback, useState, useMemo, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalSearchContent } from '../../../types';\n\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\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 onReset,\n}) => {\n const {\n setGlobalSearchContent,\n setGlobalSearchDate,\n } = getDispatch();\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)(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 { getDispatch } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\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\nconst SettingsHeader: FC = ({\n currentScreen,\n editedFolderId,\n onReset,\n onSaveFilter,\n onScreenSelect,\n}) => {\n const {\n signOut,\n deleteChatFolder,\n } = getDispatch();\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.QuickReaction:\n return

{lang('DoubleTapSetting')}

;\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(SettingsHeader);\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\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\nconst SettingsMain: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n currentUser,\n lastSyncTime,\n}) => {\n const { loadProfilePhotos } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../../api/types';\nimport { ProfileEditProgress, SettingsScreens } from '../../../types';\n\nimport { throttle } from '../../../util/schedulers';\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\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}) => {\n const {\n loadCurrentUser,\n updateProfile,\n checkUsername,\n } = getDispatch();\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)(SettingsEditProfile));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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\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}) => {\n const { setSettingOption } = getDispatch();\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)(SettingsDataStorage));\n","import React, {\n FC, memo, useMemo, useCallback, useState, useEffect,\n} from '../../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../../lib/teact/teactn';\n\nimport { 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 { 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\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}) => {\n const {\n loadRecommendedChatFolders,\n addChatFolder,\n showDialog,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../../types';\n\nimport { STICKER_SIZE_FOLDER_SETTINGS } from '../../../../config';\nimport { findIntersectionWithSet } 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\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}) => {\n const {\n editChatFolder,\n addChatFolder,\n loadMoreChats,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../../api/types';\nimport { SettingsScreens } from '../../../../types';\n\nimport useLang from '../../../../hooks/useLang';\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\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}) => {\n const { loadMoreChats } = getDispatch();\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)(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, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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';\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps =\n Pick & {\n stickerSetIds?: string[];\n stickerSetsById?: Record;\n defaultReaction?: string;\n };\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 defaultReaction,\n messageTextSize,\n animationLevel,\n messageSendKeyCombo,\n shouldSuggestStickers,\n shouldLoopStickers,\n timeFormat,\n}) => {\n const {\n setSettingOption,\n } = getDispatch();\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 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 {defaultReaction && (\n onScreenSelect(SettingsScreens.QuickReaction)}\n >\n \n
{lang('DoubleTapSetting')}
\n \n )}\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 defaultReaction: global.appConfig?.defaultReaction,\n };\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 { 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\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}) => {\n const {\n loadWallpapers,\n uploadWallpaper,\n setThemeSettings,\n } = getDispatch();\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)(SettingsGeneralBackground));\n","import { ChangeEvent, MutableRefObject, RefObject } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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\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}) => {\n const { setThemeSettings } = getDispatch();\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)(SettingsGeneralBackground));\n","import { ChangeEvent } from 'react';\nimport useDebounce from '../../../hooks/useDebounce';\nimport React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\n\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\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}) => {\n const {\n loadNotificationSettings,\n updateContactSignUpNotification,\n updateNotificationSettings,\n updateWebNotificationSettings,\n } = getDispatch();\n\n useEffect(() => {\n loadNotificationSettings();\n }, [loadNotificationSettings]);\n\n const runDebounced = useDebounce(500, 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 {\n handleSettingsChange(e, 'contact', 'silent');\n }}\n />\n {\n handleSettingsChange(e, 'contact', 'showPreviews');\n }}\n />\n
\n\n
\n

{lang('FilterGroups')}

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

{lang('FilterChannels')}

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

{lang('PhoneOther')}

\n\n \n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (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)(SettingsNotifications));\n","import React, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { PrivacyVisibility, SettingsScreens } from '../../../types';\n\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\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\n}) => {\n const {\n loadPrivacySettings,\n loadBlockedContacts,\n loadAuthorizations,\n loadContentSettings,\n updateContentSettings,\n } = getDispatch();\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)(SettingsPrivacy));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ISettings, LangCode, SettingsScreens } from '../../../types';\nimport { ApiLanguage } from '../../../api/types';\n\nimport { setLanguage } from '../../../util/langProvider';\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\nconst SettingsLanguage: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n languages,\n language,\n}) => {\n const {\n loadLanguages,\n setSettingOption,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\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 =\n Partial & {\n chatsById?: Record;\n usersById?: Record;\n };\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}) => {\n const { setPrivacyVisibility } = getDispatch();\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 {\n onScreenSelect(allowedContactsScreen);\n }}\n >\n
\n {allowedCount > 0 && +{allowedCount}}\n {lang('AlwaysShareWith')}\n {lang('EditAdminAddUsers')}\n
\n \n )}\n {exceptionLists.shouldShowDenied && (\n {\n onScreenSelect(deniedContactsScreen);\n }}\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)(SettingsPrivacyVisibility));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSession } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\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\nconst SettingsPrivacyActiveSessions: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n activeSessions,\n}) => {\n const {\n loadAuthorizations,\n terminateAuthorization,\n terminateAllAuthorizations,\n } = getDispatch();\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)(SettingsPrivacyActiveSessions));\n","import React, {\n FC, useMemo, useState, memo, useRef, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\n\nimport { filterUsersByName, getUserFullName } from '../../../modules/helpers';\nimport { 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\nconst BlockUserModal: FC = ({\n usersById,\n blockedIds,\n contactIds,\n localContactIds,\n currentUserId,\n isOpen,\n onClose,\n}) => {\n const {\n loadContactList,\n setUserSearchQuery,\n blockContact,\n } = getDispatch();\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)(BlockUserModal));\n","import React, {\n FC, memo, useCallback,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiCountryCode, ApiUser } from '../../../api/types';\nimport { SettingsScreens } from '../../../types';\n\nimport { CHAT_HEIGHT_PX } from '../../../config';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\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\nconst SettingsPrivacyBlockedUsers: FC = ({\n isActive,\n onScreenSelect,\n onReset,\n chatsByIds,\n usersByIds,\n blockedIds,\n phoneCodeList,\n}) => {\n const { unblockContact } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../../global/types';\nimport { SettingsScreens } from '../../../../types';\n\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\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}) => {\n const {\n updatePassword,\n checkPassword,\n clearTwoFaError,\n updateRecoveryEmail,\n provideTwoFaEmailCode,\n clearPassword,\n } = getDispatch();\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)(SettingsTwoFa));\n","import React, {\n FC, memo, useCallback, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport { ApiChat } from '../../../api/types';\nimport { ApiPrivacySettings, SettingsScreens } from '../../../types';\n\nimport useLang from '../../../hooks/useLang';\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\nconst SettingsPrivacyVisibilityExceptionList: FC = ({\n currentUserId,\n isAllowList,\n screen,\n settings,\n chatsById,\n listIds,\n orderedPinnedIds,\n archivedListIds,\n archivedPinnedIds,\n isActive,\n onScreenSelect,\n onReset,\n}) => {\n const { setPrivacySettings } = getDispatch();\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)(SettingsPrivacyVisibilityExceptionList));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { SettingsScreens } from '../../../types';\nimport { ApiAvailableReaction } from '../../../api/types';\n\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport RadioGroup from '../../ui/RadioGroup';\n\ntype OwnProps = {\n isActive?: boolean;\n onScreenSelect: (screen: SettingsScreens) => void;\n onReset: () => void;\n};\n\ntype StateProps = {\n availableReactions?: ApiAvailableReaction[];\n selectedReaction?: string;\n};\n\nconst SettingsQuickReaction: FC = ({\n isActive,\n onReset,\n onScreenSelect,\n availableReactions,\n selectedReaction,\n}) => {\n const { setDefaultReaction } = getDispatch();\n useHistoryBack(isActive, onReset, onScreenSelect, SettingsScreens.General);\n\n const options = availableReactions?.filter((l) => !l.isInactive).map((l) => {\n return {\n label: <>{l.title},\n value: l.reaction,\n };\n }) || [];\n\n const handleChange = useCallback((reaction: string) => {\n setDefaultReaction({ reaction });\n }, [setDefaultReaction]);\n\n return (\n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global) => {\n const { availableReactions, appConfig } = global;\n\n return {\n availableReactions,\n selectedReaction: appConfig?.defaultReaction,\n };\n },\n)(SettingsQuickReaction));\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';\nimport SettingsQuickReaction from './SettingsQuickReaction';\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.QuickReaction:\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiUserStatus } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { throttle } from '../../../util/schedulers';\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\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}) => {\n const {\n loadContactList,\n openChat,\n } = getDispatch();\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)(ContactList));\n","import React, {\n FC, useCallback, useEffect, useMemo, memo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { 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\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}) => {\n const {\n loadContactList,\n setGlobalSearchQuery,\n } = getDispatch();\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.isSelf && (user.canBeInvitedToGroup || !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)(NewChatStep1));\n","import React, {\n FC, useState, useCallback, useEffect, memo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ChatCreationProgress } from '../../../types';\n\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\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}) => {\n const {\n createGroupChat,\n createChannel,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChatFolder } from '../../api/types';\n\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\nconst ChatFolderModal: FC = ({\n isOpen,\n chatId,\n foldersById,\n folderOrderedIds,\n onClose,\n onCloseAnimationEnd,\n}) => {\n const { editChatFolders } = getDispatch();\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)(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;\nlet excludedClosestSelector: string | 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\nexport const getTouchY = (e: WheelEvent | TouchEvent | React.WheelEvent | React.TouchEvent) => {\n return ('changedTouches' in e ? e.changedTouches[0].clientY : 0);\n};\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 if (excludedClosestSelector && (e.target as HTMLElement).closest(excludedClosestSelector)) return;\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, _excludedClosestSelector?: string) {\n scrollLockEl = el;\n excludedClosestSelector = _excludedClosestSelector;\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 excludedClosestSelector = 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, useLayoutEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAvailableReaction, ApiMediaFormat } from '../../../api/types';\n\nimport useMedia from '../../../hooks/useMedia';\nimport useHorizontalScroll from '../../../hooks/useHorizontalScroll';\nimport useFlag from '../../../hooks/useFlag';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport { getTouchY } from '../../../util/scrollLock';\n\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport AnimatedSticker from '../../common/AnimatedSticker';\n\nimport './ReactionSelector.scss';\n\nconst REACTION_SIZE = 32;\n\ntype OwnProps = {\n enabledReactions?: string[];\n onSendReaction: (reaction: string, x: number, y: number) => void;\n isPrivate?: boolean;\n availableReactions?: ApiAvailableReaction[];\n isReady?: boolean;\n};\n\nconst AvailableReaction: FC<{\n reaction: ApiAvailableReaction;\n isReady?: boolean;\n onSendReaction: (reaction: string, x: number, y: number) => void;\n}> = ({ reaction, onSendReaction, isReady }) => {\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const mediaData = useMedia(`document${reaction.selectAnimation?.id}`, !isReady, ApiMediaFormat.Lottie);\n\n const [isActivated, activate, deactivate] = useFlag();\n const [isAnimationLoaded, markAnimationLoaded] = useFlag();\n\n const shouldRenderAnimated = Boolean(isReady && mediaData);\n const { transitionClassNames: animatedClassNames } = useShowTransition(shouldRenderAnimated);\n const { shouldRender: shouldRenderStatic, transitionClassNames: staticClassNames } = useShowTransition(\n !isReady || !isAnimationLoaded, undefined, true,\n );\n\n function handleClick() {\n if (!containerRef.current) return;\n const { x, y } = containerRef.current.getBoundingClientRect();\n\n onSendReaction(reaction.reaction, x, y);\n }\n\n return (\n \n {shouldRenderStatic && (\n \n )}\n {shouldRenderAnimated && (\n \n )}\n
\n );\n};\nconst ReactionSelector: FC = ({\n availableReactions,\n enabledReactions,\n onSendReaction,\n isPrivate,\n isReady,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const itemsScrollRef = useRef(null);\n const [isHorizontalScrollEnabled, enableHorizontalScroll] = useFlag(false);\n useHorizontalScroll(itemsScrollRef.current, !isHorizontalScrollEnabled);\n\n useLayoutEffect(() => {\n enableHorizontalScroll();\n }, [enableHorizontalScroll]);\n\n const handleWheel = (e: React.WheelEvent | React.TouchEvent) => {\n if (!itemsScrollRef) return;\n const deltaY = 'deltaY' in e ? e.deltaY : getTouchY(e);\n\n if (deltaY) {\n e.preventDefault();\n }\n };\n\n if ((!isPrivate && !enabledReactions?.length) || !availableReactions) return undefined;\n\n return (\n
\n
\n
\n
\n
\n {availableReactions?.map((reaction) => {\n if (reaction.isInactive\n || (!isPrivate && (!enabledReactions || !enabledReactions.includes(reaction.reaction)))) return undefined;\n return (\n \n );\n })}\n
\n
\n
\n );\n};\n\nexport default memo(ReactionSelector);\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { ApiAvailableReaction, 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';\nimport buildClassName from '../../../util/buildClassName';\nimport useFlag from '../../../hooks/useFlag';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\n\nimport Menu from '../../ui/Menu';\nimport MenuItem from '../../ui/MenuItem';\nimport Avatar from '../../common/Avatar';\nimport ReactionSelector from './ReactionSelector';\n\nimport './MessageContextMenu.scss';\n\ntype OwnProps = {\n availableReactions?: ApiAvailableReaction[];\n isOpen: boolean;\n anchor: IAnchorPosition;\n message: ApiMessage;\n canSendNow?: boolean;\n enabledReactions?: string[];\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canUnpin?: boolean;\n canDelete?: boolean;\n canReport?: boolean;\n canShowReactionsCount?: boolean;\n canShowReactionList?: boolean;\n canRemoveReaction?: boolean;\n canEdit?: boolean;\n canForward?: boolean;\n canFaveSticker?: boolean;\n canUnfaveSticker?: boolean;\n canCopy?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n isPrivate?: 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 onShowReactors?: () => void;\n onSendReaction: (reaction: string | undefined, x: number, y: number) => void;\n};\n\nconst SCROLLBAR_WIDTH = 10;\nconst REACTION_BUBBLE_EXTRA_WIDTH = 32;\nconst ANIMATION_DURATION = 200;\n\nconst MessageContextMenu: FC = ({\n availableReactions,\n isOpen,\n message,\n isPrivate,\n enabledReactions,\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 canShowReactionsCount,\n canRemoveReaction,\n canShowReactionList,\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 onShowReactors,\n onSendReaction,\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 scrollableRef = useRef(null);\n const copyOptions = getMessageCopyOptions(message, onClose, canCopyLink ? onCopyLink : undefined);\n const noReactions = !isPrivate && !enabledReactions?.length;\n const withReactions = canShowReactionList && !noReactions;\n\n const [isReady, markIsReady, unmarkIsReady] = useFlag();\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 getLayout = useCallback(() => {\n const extraHeightAudioPlayer = (IS_SINGLE_COLUMN_LAYOUT\n && (document.querySelector('.AudioPlayer-content'))?.offsetHeight) || 0;\n const pinnedElement = document.querySelector('.HeaderPinnedMessage-wrapper');\n const extraHeightPinned = (((IS_SINGLE_COLUMN_LAYOUT && !extraHeightAudioPlayer)\n || (!IS_SINGLE_COLUMN_LAYOUT && pinnedElement?.classList.contains('full-width')))\n && pinnedElement?.offsetHeight) || 0;\n\n return {\n extraPaddingX: SCROLLBAR_WIDTH,\n extraTopPadding: (document.querySelector('.MiddleHeader')!).offsetHeight,\n marginSides: withReactions ? REACTION_BUBBLE_EXTRA_WIDTH : undefined,\n extraMarginTop: extraHeightPinned + extraHeightAudioPlayer,\n };\n }, [withReactions]);\n\n const handleRemoveReaction = useCallback(() => {\n onSendReaction(undefined, 0, 0);\n }, [onSendReaction]);\n\n useEffect(() => {\n if (!isOpen) {\n unmarkIsReady();\n return;\n }\n\n setTimeout(() => {\n markIsReady();\n }, ANIMATION_DURATION);\n }, [isOpen, markIsReady, unmarkIsReady]);\n\n const {\n positionX, positionY, style, menuStyle, withScroll,\n } = useContextMenuPosition(anchor, getTriggerElement, getRootElement, getMenuElement, getLayout);\n\n useEffect(() => {\n disableScrolling(withScroll ? scrollableRef.current : undefined, '.ReactionSelector');\n\n return enableScrolling;\n }, [withScroll]);\n\n const lang = useLang();\n\n return (\n \n {canShowReactionList && (\n \n )}\n\n \n {canRemoveReaction && Remove Reaction}\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 || canShowReactionsCount) && (\n \n {canShowReactionsCount && message.reactors?.count ? (\n canShowSeenBy && message.seenByUserIds?.length\n ? lang('Chat.OutgoingContextMixedReactionCount', [message.reactors.count, message.seenByUserIds.length])\n : lang('Chat.ContextReactionCount', message.reactors.count, 'i')\n ) : (\n message.seenByUserIds?.length\n ? lang('Conversation.ContextMenuSeen', message.seenByUserIds.length, 'i')\n : lang('Conversation.ContextMenuNoViews')\n )}\n
\n {seenByRecentUsers?.map((user) => (\n \n ))}\n
\n \n )}\n {canDelete && {lang('Delete')}}\n
\n \n );\n};\n\nexport default memo(MessageContextMenu);\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { MessageListType } from '../../../global/types';\nimport { ApiAvailableReaction, ApiMessage } from '../../../api/types';\nimport { IAlbum, IAnchorPosition } from '../../../types';\nimport {\n selectActiveDownloadIds,\n selectAllowedMessageActions,\n selectChat,\n selectCurrentMessageList,\n selectIsMessageProtected,\n} from '../../../modules/selectors';\nimport {\n isActionMessage, isChatChannel,\n isChatGroup, isOwnMessage, areReactionsEmpty, isUserId,\n} from '../../../modules/helpers';\nimport { SEEN_BY_MEMBERS_EXPIRE, SEEN_BY_MEMBERS_CHAT_MAX, SERVICE_NOTIFICATIONS_USER_ID } from '../../../config';\nimport { getDayStartAt } from '../../../util/dateFormat';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useFlag from '../../../hooks/useFlag';\nimport { REM } from '../../common/helpers/mediaDimensions';\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\nconst START_SIZE = 2 * REM;\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 availableReactions?: ApiAvailableReaction[];\n noOptions?: boolean;\n canSendNow?: boolean;\n canReschedule?: boolean;\n canReply?: boolean;\n canPin?: boolean;\n canShowReactionsCount?: boolean;\n canShowReactionList?: boolean;\n canRemoveReaction?: 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 isPrivate?: boolean;\n hasFullInfo?: boolean;\n canCopyLink?: boolean;\n canSelect?: boolean;\n canDownload?: boolean;\n activeDownloads: number[];\n canShowSeenBy?: boolean;\n enabledReactions?: string[];\n};\n\nconst ContextMenuContainer: FC = ({\n availableReactions,\n isOpen,\n messageListType,\n chatUsername,\n message,\n album,\n anchor,\n onClose,\n onCloseAnimationEnd,\n noOptions,\n canSendNow,\n hasFullInfo,\n canReschedule,\n canReply,\n canPin,\n canUnpin,\n canDelete,\n canReport,\n canShowReactionsCount,\n canShowReactionList,\n canRemoveReaction,\n canEdit,\n enabledReactions,\n isPrivate,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n activeDownloads,\n canShowSeenBy,\n}) => {\n const {\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 sendReaction,\n openReactorListModal,\n loadFullChat,\n loadReactors,\n } = getDispatch();\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 useEffect(() => {\n if (canShowReactionsCount && isOpen) {\n loadReactors({ chatId: message.chatId, messageId: message.id });\n }\n }, [canShowReactionsCount, isOpen, loadReactors, message.chatId, message.id]);\n\n useEffect(() => {\n if (!hasFullInfo && !isPrivate && isOpen) {\n loadFullChat({ chatId: message.chatId });\n }\n }, [hasFullInfo, isOpen, isPrivate, loadFullChat, message.chatId]);\n\n const seenByRecentUsers = useMemo(() => {\n if (message.reactions?.recentReactions?.length) {\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n\n return message.reactions?.recentReactions?.slice(0, 3).map(({ userId }) => usersById[userId]).filter(Boolean);\n }\n\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.reactions?.recentReactions, 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 handleOpenReactorListModal = useCallback(() => {\n closeMenu();\n openReactorListModal({ chatId: message.chatId, messageId: message.id });\n }, [closeMenu, openReactorListModal, message.chatId, message.id]);\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 handleSendReaction = useCallback((reaction: string | undefined, x: number, y: number) => {\n sendReaction({\n chatId: message.chatId, messageId: message.id, reaction, x, y, startSize: START_SIZE,\n });\n closeMenu();\n }, [closeMenu, message.chatId, message.id, sendReaction]);\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 isChannel = chat && isChatChannel(chat);\n const canShowSeenBy = Boolean(chat\n && isChatGroup(chat)\n && isOwnMessage(message)\n && !isScheduled\n && chat.membersCount\n && chat.membersCount < SEEN_BY_MEMBERS_CHAT_MAX\n && message.date > Date.now() / 1000 - SEEN_BY_MEMBERS_EXPIRE);\n const isPrivate = chat && isUserId(chat.id);\n const isAction = isActionMessage(message);\n const canShowReactionsCount = !isChannel && !isScheduled && !isAction && !isPrivate && message.reactions\n && !areReactionsEmpty(message.reactions) && message.reactions.canSeeList;\n const canRemoveReaction = isPrivate && message.reactions?.results?.some((l) => l.isChosen);\n const isProtected = selectIsMessageProtected(global, message);\n\n return {\n availableReactions: global.availableReactions,\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: !isProtected && !isScheduled && canForward,\n canFaveSticker: !isScheduled && canFaveSticker,\n canUnfaveSticker: !isScheduled && canUnfaveSticker,\n canCopy: !isProtected && canCopy,\n canCopyLink: !isProtected && !isScheduled && canCopyLink,\n canSelect,\n canDownload: !isProtected && canDownload,\n activeDownloads,\n canShowSeenBy,\n enabledReactions: chat?.fullInfo?.enabledReactions,\n isPrivate,\n hasFullInfo: Boolean(chat?.fullInfo),\n canShowReactionsCount,\n canShowReactionList: !isAction && !isScheduled && chat?.id !== SERVICE_NOTIFICATIONS_USER_ID,\n canRemoveReaction,\n };\n },\n)(ContextMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiStickerSet } from '../../api/types';\n\nimport { STICKER_SIZE_MODAL } from '../../config';\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\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerSetModal: FC = ({\n isOpen,\n fromSticker,\n stickerSetShortName,\n stickerSet,\n canSendStickers,\n onClose,\n}) => {\n const {\n loadStickers,\n toggleStickerSet,\n sendMessage,\n } = getDispatch();\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)(StickerSetModal));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 {\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\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}) => {\n const {\n updateChatMutedState,\n enterMessageSelectMode,\n sendBotCommand,\n restartBot,\n joinGroupCall,\n createGroupCall,\n openLinkedChat,\n addContact,\n openCallFallbackConfirm,\n } = getDispatch();\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)(HeaderMenuContainer));\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState, useLayoutEffect,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\n\nimport { debounce } from '../../util/schedulers';\nimport { selectCurrentTextSearch, selectCurrentChat } from '../../modules/selectors';\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\nconst runDebouncedForSearch = debounce((cb) => cb(), 200, false);\n\nconst MobileSearchFooter: FC = ({\n isActive,\n chat,\n query,\n totalCount,\n foundIds,\n isHistoryCalendarOpen,\n}) => {\n const {\n setLocalTextSearchQuery,\n searchTextMessagesLocal,\n focusMessage,\n closeLocalTextSearch,\n openHistoryCalendar,\n } = getDispatch();\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)(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 { getGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useShowTransition from '../../../hooks/useShowTransition';\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};\n\nconst MentionTooltip: FC = ({\n isOpen,\n onClose,\n onInsertUserName,\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 // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n const user = usersById[userId];\n if (!user) {\n return;\n }\n\n onInsertUserName(user, forceFocus);\n }, [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 } 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';\nimport { useStateRef } from '../../../hooks/useStateRef';\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 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 recentEmojis,\n baseEmojiKeywords,\n emojiKeywords,\n addRecentEmoji,\n onCaptionUpdate,\n onSend,\n onFileAppend,\n onClear,\n}) => {\n const captionRef = useStateRef(caption);\n const hideTimeoutRef = useRef();\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 captionRef,\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 captionRef,\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 hideTimeoutRef.current = undefined;\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 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';\nimport useSendMessageAction from '../../../hooks/useSendMessageAction';\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 chatId: string;\n threadId?: number;\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\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 chatId,\n threadId,\n className,\n loadAndPlay,\n canSendStickers,\n recentStickers,\n favoriteStickers,\n addedSetIds,\n stickerSetsById,\n shouldPlay,\n onStickerSelect,\n}) => {\n const {\n loadRecentStickers,\n addRecentSticker,\n unfaveSticker,\n } = getDispatch();\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 const sendMessageAction = useSendMessageAction(chatId, threadId);\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 loadRecentStickers();\n sendMessageAction({ type: 'chooseSticker' });\n }\n }, [loadAndPlay, loadRecentStickers, sendMessageAction]);\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 handleMouseMove = useCallback(() => {\n sendMessageAction({ type: 'chooseSticker' });\n }, [sendMessageAction]);\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 { 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\nconst INTERSECTION_DEBOUNCE = 300;\n\nconst GifPicker: FC = ({\n className,\n loadAndPlay,\n canSendGifs,\n savedGifs,\n onGifSelect,\n}) => {\n const { loadSavedGifs } = getDispatch();\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)(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 { 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 chatId: string;\n threadId?: number;\n isOpen: boolean;\n canSendStickers: boolean;\n canSendGifs: boolean;\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 chatId,\n threadId,\n isOpen,\n canSendStickers,\n canSendGifs,\n isLeftColumnShown,\n onLoad,\n onClose,\n onEmojiSelect,\n onStickerSelect,\n onGifSelect,\n onRemoveSymbol,\n onSearchOpen,\n 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 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 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 canAttachMedia: boolean;\n canAttachPolls: boolean;\n onFileSelect: (files: File[], isQuick: boolean) => void;\n onPollCreate: () => void;\n onClose: () => void;\n};\n\nconst AttachMenu: FC = ({\n isOpen, canAttachMedia, canAttachPolls, 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 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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiBotCommand, ApiUser } from '../../../api/types';\n\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\nconst BotCommandTooltip: FC = ({\n usersById,\n isOpen,\n withUsername,\n botCommands,\n onClick,\n onClose,\n}) => {\n const { sendBotCommand } = getDispatch();\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)(BotCommandTooltip));\n","import React, { FC, memo, useCallback } from '../../../lib/teact/teact';\n\nimport { ApiBotCommand } from '../../../api/types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT, IS_TOUCH_ENV } from '../../../util/environment';\nimport useMouseInside from '../../../hooks/useMouseInside';\n\nimport Menu from '../../ui/Menu';\nimport BotCommand from './BotCommand';\n\nimport './BotCommandMenu.scss';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nexport type OwnProps = {\n isOpen: boolean;\n botCommands: ApiBotCommand[];\n onClose: NoneToVoidFunction;\n};\n\nconst BotCommandMenu: FC = ({\n isOpen, botCommands, onClose,\n}) => {\n const { sendBotCommand } = getDispatch();\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(BotCommandMenu);\n","import React, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiSticker } from '../../../api/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 { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport usePrevious from '../../../hooks/usePrevious';\nimport useSendMessageAction from '../../../hooks/useSendMessageAction';\n\nimport Loading from '../../ui/Loading';\nimport StickerButton from '../../common/StickerButton';\n\nimport './StickerTooltip.scss';\n\nexport type OwnProps = {\n chatId: string;\n threadId?: number;\n isOpen: boolean;\n onStickerSelect: (sticker: ApiSticker) => void;\n};\n\ntype StateProps = {\n stickers?: ApiSticker[];\n};\n\nconst INTERSECTION_THROTTLE = 200;\n\nconst StickerTooltip: FC = ({\n chatId,\n threadId,\n isOpen,\n onStickerSelect,\n stickers,\n}) => {\n const { clearStickersForEmoji } = getDispatch();\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 const sendMessageAction = useSendMessageAction(chatId, threadId);\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 handleMouseMove = () => {\n sendMessageAction({ type: 'chooseSticker' });\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)(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';\n\nimport { ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm } from '../../../api/types';\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 { 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';\nimport { getDispatch } from '../../../lib/teact/teactn';\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 inlineBotResults?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n switchPm?: ApiBotInlineSwitchPm;\n onSelectResult: (inlineResult: ApiBotInlineMediaResult | ApiBotInlineResult) => void;\n loadMore: NoneToVoidFunction;\n onClose: NoneToVoidFunction;\n};\n\nconst InlineBotTooltip: FC = ({\n isOpen,\n botId,\n isGallery,\n inlineBotResults,\n switchPm,\n loadMore,\n onClose,\n onSelectResult,\n}) => {\n const {\n openChat,\n startBot,\n } = getDispatch();\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?.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 'file':\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 {renderedInlineBotResults?.length && renderContent()}\n \n );\n};\n\nexport default memo(InlineBotTooltip);\n","import React, {\n FC, useCallback, useEffect, useRef, memo,\n} from '../../../lib/teact/teact';\n\nimport setTooltipItemVisible from '../../../util/setTooltipItemVisible';\nimport { useKeyboardNavigation } from './hooks/useKeyboardNavigation';\nimport { IS_TOUCH_ENV } from '../../../util/environment';\nimport renderText from '../../common/helpers/renderText';\nimport { getUserFullName, isUserId } from '../../../modules/helpers';\nimport useMouseInside from '../../../hooks/useMouseInside';\nimport useLang from '../../../hooks/useLang';\nimport buildClassName from '../../../util/buildClassName';\nimport { getDispatch, getGlobal } from '../../../lib/teact/teactn';\n\nimport ListItem from '../../ui/ListItem';\nimport Avatar from '../../common/Avatar';\nimport Menu from '../../ui/Menu';\n\nimport './SendAsMenu.scss';\n\nexport type OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n chatId?: string;\n selectedSendAsId?: string;\n sendAsIds?: string[];\n};\n\nconst SendAsMenu: FC = ({\n isOpen,\n onClose,\n chatId,\n selectedSendAsId,\n sendAsIds,\n}) => {\n const { saveDefaultSendAs } = getDispatch();\n\n // No need for expensive global updates on users and chats, so we avoid them\n const usersById = getGlobal().users.byId;\n const chatsById = getGlobal().chats.byId;\n\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const containerRef = useRef(null);\n\n const [handleMouseEnter, handleMouseLeave, markMouseInside] = useMouseInside(isOpen, onClose, undefined);\n\n useEffect(() => {\n if (isOpen) {\n markMouseInside();\n }\n }, [isOpen, markMouseInside]);\n\n const handleUserSelect = useCallback((id: string) => {\n onClose();\n saveDefaultSendAs({ chatId, sendAsId: id });\n }, [chatId, onClose, saveDefaultSendAs]);\n\n const selectedSendAsIndex = useKeyboardNavigation({\n isActive: isOpen,\n items: sendAsIds,\n onSelect: handleUserSelect,\n shouldSelectOnTab: true,\n shouldSaveSelectionOnUpdateItems: true,\n onClose,\n });\n\n useEffect(() => {\n setTooltipItemVisible('.chat-item-clickable', selectedSendAsIndex, containerRef);\n }, [selectedSendAsIndex]);\n\n useEffect(() => {\n if (sendAsIds && !sendAsIds.length) {\n onClose();\n }\n }, [sendAsIds, onClose]);\n\n return (\n \n
{lang('SendMessageAsTitle')}
\n {usersById && chatsById && sendAsIds?.map((id, index) => {\n const user = isUserId(id) ? usersById[id] : undefined;\n const chat = !user ? chatsById[id] : undefined;\n const fullName = user ? getUserFullName(user) : chat?.title;\n\n return (\n handleUserSelect(id)}\n focus={selectedSendAsIndex === index}\n >\n \n
\n
\n

{fullName && renderText(fullName)}

\n
\n {user\n ? lang('VoipGroupPersonalAccount')\n : lang('Subscribers', chat?.membersCount, 'i')}\n \n
\n \n );\n })}\n \n );\n};\n\nexport default memo(SendAsMenu);\n","import React, {\n FC, useMemo, memo, useRef,\n} from '../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMessage, ApiUser, ApiChat } from '../../api/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 } 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\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}) => {\n const {\n searchTextMessagesLocal,\n focusMessage,\n } = getDispatch();\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)(RightSearch));\n","import React, {\n FC, useEffect, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiStickerSet } from '../../api/types';\nimport { ObserveFn } from '../../hooks/useIntersectionObserver';\n\nimport { STICKER_SIZE_SEARCH } from '../../config';\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\nconst STICKERS_TO_DISPLAY = 5;\n\nconst StickerSetResult: FC = ({\n stickerSetId, observeIntersection, set, shouldPlay,\n isSomeModalOpen, onModalToggle,\n}) => {\n const { loadStickers, toggleStickerSet } = getDispatch();\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)(StickerSetResult));\n","import React, {\n FC, memo, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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\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}) => {\n const { loadFeaturedStickers } = getDispatch();\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)(StickerSearch));\n","import React, {\n FC, memo, useRef, useCallback,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 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\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}) => {\n const {\n searchMoreGifs,\n sendMessage,\n setGifSearchQuery,\n } = getDispatch();\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)(GifSearch));\n","import React, {\n FC, useCallback, useState, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat,\n ApiMessage,\n ApiPollAnswer,\n ApiPollResult,\n} from '../../api/types';\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\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}) => {\n const {\n loadPollOptionResults,\n openChat,\n closePollResults,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\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 progress?: ManagementProgress;\n isMuted?: boolean;\n};\n\nconst ERROR_FIRST_NAME_MISSING = 'Please provide first name';\n\nconst ManageUser: FC = ({\n userId,\n user,\n progress,\n isMuted,\n onClose,\n isActive,\n}) => {\n const {\n updateContact,\n deleteContact,\n closeManagement,\n } = getDispatch();\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 deleteContact({ userId });\n closeDeleteDialog();\n closeManagement();\n }, [closeDeleteDialog, closeManagement, deleteContact, 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, progress, isMuted,\n };\n },\n)(ManageUser));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport {\n ApiChat, ApiChatBannedRights, ApiExportedInvite, ApiMediaFormat,\n} from '../../../api/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 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 canInvite?: boolean;\n exportedInvites?: ApiExportedInvite[];\n lastSyncTime?: number;\n availableReactionsCount?: number;\n};\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 canInvite,\n onScreenSelect,\n onClose,\n isActive,\n exportedInvites,\n lastSyncTime,\n availableReactionsCount,\n}) => {\n const {\n togglePreHistoryHidden,\n updateChat,\n deleteChat,\n leaveChannel,\n deleteChannel,\n closeManagement,\n openChat,\n loadExportedChatInvites,\n } = getDispatch();\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 (lastSyncTime && canInvite) {\n loadExportedChatInvites({ chatId });\n }\n }, [chatId, loadExportedChatInvites, lastSyncTime, canInvite]);\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 handleClickReactions = useCallback(() => {\n onScreenSelect(ManagementScreens.Reactions);\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 handleClickInvites = useCallback(() => {\n onScreenSelect(ManagementScreens.Invites);\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 enabledReactionsCount = chat.fullInfo?.enabledReactions?.length || 0;\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 \n {lang('Reactions')}\n \n {enabledReactionsCount}/{availableReactionsCount}\n \n \n \n {lang('ChannelAdministrators')}\n {formatInteger(adminsCount)}\n \n {canInvite && (\n \n {lang('GroupInfo.InviteLinks')}\n \n {exportedInvites ? formatInteger(exportedInvites.length) : lang('Loading')}\n \n \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 const { invites } = global.management.byChatId[chatId] || {};\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 canInvite: isBasicGroup ? chat.isCreator : getHasAdminRight(chat, 'inviteUsers'),\n exportedInvites: invites,\n lastSyncTime: global.lastSyncTime,\n availableReactionsCount: global.availableReactions?.filter((l) => !l.isInactive).length,\n };\n },\n)(ManageGroup));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatBannedRights, ApiChatMember } from '../../../api/types';\n\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 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\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 onClose,\n isActive,\n}) => {\n const { updateChatDefaultBannedRights } = getDispatch();\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)(ManageGroupPermissions));\n","import React, {\n FC, useMemo, useState, memo, useRef, useCallback,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\n\nimport { filterUsersByName } from '../../../modules/helpers';\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\nconst RemoveGroupUserModal: FC = ({\n chat,\n currentUserId,\n isOpen,\n onClose,\n}) => {\n const {\n loadMoreMembers,\n deleteChatMember,\n } = getDispatch();\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)(RemoveGroupUserModal));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatMember, ApiUser } from '../../../api/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport { getHasAdminRight, getUserFullName } from '../../../modules/helpers';\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\nconst ManageGroupRemovedUsers: FC = ({\n chat,\n usersById,\n canDeleteMembers,\n onClose,\n isActive,\n}) => {\n const { updateChatMemberBannedRights } = getDispatch();\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)(ManageGroupRemovedUsers));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens, ManagementProgress } from '../../../types';\nimport { ApiChat, ApiExportedInvite, ApiMediaFormat } from '../../../api/types';\n\nimport { getChatAvatarHash, getHasAdminRight } from '../../../modules/helpers';\nimport useMedia from '../../../hooks/useMedia';\nimport useLang from '../../../hooks/useLang';\nimport { selectChat } from '../../../modules/selectors';\nimport useFlag from '../../../hooks/useFlag';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport { formatInteger } from '../../../util/textFormat';\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 isSignaturesShown: boolean;\n canChangeInfo?: boolean;\n canInvite?: boolean;\n exportedInvites?: ApiExportedInvite[];\n lastSyncTime?: number;\n availableReactionsCount?: number;\n};\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 canInvite,\n exportedInvites,\n lastSyncTime,\n availableReactionsCount,\n onScreenSelect,\n onClose,\n isActive,\n}) => {\n const {\n updateChat,\n toggleSignatures,\n closeManagement,\n leaveChannel,\n deleteChannel,\n openChat,\n loadExportedChatInvites,\n } = getDispatch();\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 (lastSyncTime) {\n loadExportedChatInvites({ chatId });\n }\n }, [chatId, loadExportedChatInvites, lastSyncTime]);\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 handleClickReactions = useCallback(() => {\n onScreenSelect(ManagementScreens.Reactions);\n }, [onScreenSelect]);\n\n const handleClickAdministrators = useCallback(() => {\n onScreenSelect(ManagementScreens.ChatAdministrators);\n }, [onScreenSelect]);\n\n const handleClickInvites = useCallback(() => {\n onScreenSelect(ManagementScreens.Invites);\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 const enabledReactionsCount = chat.fullInfo?.enabledReactions?.length || 0;\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 {canInvite && (\n \n {lang('GroupInfo.InviteLinks')}\n \n {exportedInvites ? formatInteger(exportedInvites.length) : lang('Loading')}\n \n \n )}\n \n {lang('Reactions')}\n \n {enabledReactionsCount}/{availableReactionsCount}\n \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 const { invites } = global.management.byChatId[chatId] || {};\n\n return {\n chat,\n progress,\n isSignaturesShown,\n canChangeInfo: getHasAdminRight(chat, 'changeInfo'),\n canInvite: getHasAdminRight(chat, 'inviteUsers'),\n lastSyncTime: global.lastSyncTime,\n exportedInvites: invites,\n availableReactionsCount: global.availableReactions?.filter((l) => !l.isInactive).length,\n };\n },\n)(ManageChannel));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\nimport { ManagementProgress } from '../../../types';\n\nimport { selectChat, selectManagement } from '../../../modules/selectors';\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 isProtected?: boolean;\n};\n\nconst ManageChatPrivacyType: FC = ({\n chat,\n onClose,\n isActive,\n isChannel,\n progress,\n isUsernameAvailable,\n isProtected,\n}) => {\n const {\n checkPublicLink,\n updatePublicLink,\n updatePrivateLink,\n toggleIsProtected,\n } = getDispatch();\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 handleForwardingOptionChange = useCallback((value: string) => {\n toggleIsProtected({\n chatId: chat.id,\n isProtected: value === 'protected',\n });\n }, [chat.id, toggleIsProtected]);\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 forwardingOptions = [{\n value: 'allowed',\n label: lang('ChannelVisibility.Forwarding.Enabled'),\n }, {\n value: 'protected',\n label: lang('ChannelVisibility.Forwarding.Disabled'),\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 {lang(isChannel ? 'ChannelVisibility.Forwarding.ChannelTitle' : 'ChannelVisibility.Forwarding.GroupTitle')}\n

\n \n

\n {isChannel\n ? lang('ChannelVisibility.Forwarding.ChannelInfo')\n : lang('ChannelVisibility.Forwarding.GroupInfo')}\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 isProtected: chat?.isProtected,\n };\n },\n)(ManageChatPrivacyType));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport { STICKER_SIZE_DISCUSSION_GROUPS } from '../../../config';\nimport { selectChat } from '../../../modules/selectors';\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\nconst ManageDiscussion: FC = ({\n chat,\n onClose,\n isActive,\n chatId,\n chatsByIds,\n linkedChat,\n forDiscussionIds,\n isChannel,\n onScreenSelect,\n}) => {\n const {\n loadGroupsForDiscussion,\n linkDiscussionGroup,\n unlinkDiscussionGroup,\n } = getDispatch();\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\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 {\n onDiscussionClick(id);\n }}\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)(ManageDiscussion));\n","import React, {\n FC, memo, useCallback, useEffect, useMemo, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatBannedRights } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\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\nconst ManageGroupUserPermissions: FC = ({\n chat,\n selectedChatMemberId,\n onScreenSelect,\n isFormFullyDisabled,\n onClose,\n isActive,\n}) => {\n const { updateChatMemberBannedRights } = getDispatch();\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)(ManageGroupUserPermissions));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ManagementScreens } from '../../../types';\nimport { ApiChat, ApiChatMember } 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';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\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};\n\nconst ManageChatAdministrators: FC = ({\n chat,\n isChannel,\n currentUserId,\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 handleAddAdminClick = useCallback(() => {\n onScreenSelect(ManagementScreens.GroupAddAdmins);\n }, [onScreenSelect]);\n\n const getMemberStatus = useCallback((member: ApiChatMember) => {\n if (member.isOwner) {\n return lang('ChannelCreator');\n }\n\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\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]);\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
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const chat = selectChat(global, chatId)!;\n\n return {\n chat,\n currentUserId: global.currentUserId,\n isChannel: isChatChannel(chat),\n };\n },\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiChatAdminRights, ApiUser } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\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 isNewAdmin?: 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 defaultRights?: ApiChatAdminRights;\n};\n\nconst CUSTOM_TITLE_MAX_LENGTH = 16;\n\nconst ManageGroupAdminRights: FC = ({\n isNewAdmin,\n selectedChatMemberId,\n defaultRights,\n onScreenSelect,\n chat,\n usersById,\n currentUserId,\n isChannel,\n isFormFullyDisabled,\n onClose,\n isActive,\n}) => {\n const { updateChatAdmin } = getDispatch();\n\n const [permissions, setPermissions] = useState({});\n const [isTouched, setIsTouched] = useState(isNewAdmin);\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 const selectedAdminMember = chat.fullInfo?.adminMembers?.find(({ userId }) => userId === selectedChatMemberId);\n\n if (isNewAdmin) {\n // If selectedAdminMember is fullfilled, it means that we are editing an existing admin (after a user\n // has been promoted as admin)\n return selectedAdminMember\n ? undefined\n : chat.fullInfo?.members?.find(({ userId }) => userId === selectedChatMemberId);\n }\n\n return selectedAdminMember;\n }, [chat.fullInfo, isNewAdmin, 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((isNewAdmin ? defaultRights : selectedChatMember?.adminRights) || {});\n setCustomTitle(((isNewAdmin ? 'admin' : selectedChatMember?.customTitle) || '').substr(0, CUSTOM_TITLE_MAX_LENGTH));\n setIsTouched(Boolean(isNewAdmin));\n setIsLoading(false);\n }, [defaultRights, isNewAdmin, 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 }, [selectedChatMemberId, updateChatAdmin, chat.id, permissions, customTitle]);\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 (isNewAdmin || !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 }, [isNewAdmin, 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 && !isNewAdmin && (\n \n {lang('EditAdminRemoveAdmin')}\n \n )}\n
\n
\n\n \n {isLoading ? (\n \n ) : (\n \n )}\n \n\n {!isNewAdmin && (\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 defaultRights: chat.adminRights,\n };\n },\n)(ManageGroupAdminRights));\n","import React, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChatMember, 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 NothingFound from '../../common/NothingFound';\nimport ListItem from '../../ui/ListItem';\n\ntype OwnProps = {\n chatId: string;\n isActive: boolean;\n noAdmins?: boolean;\n onClose: NoneToVoidFunction;\n onScreenSelect?: (screen: ManagementScreens) => void;\n onChatMemberSelect?: (memberId: string, isPromotedByCurrentUser?: boolean) => void;\n};\n\ntype StateProps = {\n userStatusesById: Record;\n members?: ApiChatMember[];\n adminMembers?: ApiChatMember[];\n isChannel?: boolean;\n serverTimeOffset: number;\n};\n\nconst ManageGroupMembers: FC = ({\n noAdmins,\n members,\n adminMembers,\n userStatusesById,\n isChannel,\n isActive,\n serverTimeOffset,\n onClose,\n onScreenSelect,\n onChatMemberSelect,\n}) => {\n const { openUserInfo } = getDispatch();\n\n const memberIds = useMemo(() => {\n // No need for expensive global updates on users, so we avoid them\n const usersById = getGlobal().users.byId;\n if (!members || !usersById) {\n return undefined;\n }\n const adminIds = noAdmins ? adminMembers?.map(({ userId }) => userId) || [] : [];\n\n const userIds = sortUserIds(\n members.map(({ userId }) => userId),\n usersById,\n userStatusesById,\n undefined,\n serverTimeOffset,\n );\n\n return noAdmins ? userIds.filter((userId) => !adminIds.includes(userId)) : userIds;\n }, [members, noAdmins, adminMembers, userStatusesById, serverTimeOffset]);\n\n const handleMemberClick = useCallback((id: string) => {\n if (noAdmins) {\n onChatMemberSelect!(id, false);\n onScreenSelect!(ManagementScreens.ChatNewAdminRights);\n } else {\n openUserInfo({ id });\n }\n }, [noAdmins, onChatMemberSelect, onScreenSelect, 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 { statusesById: userStatusesById } = global.users;\n const members = chat?.fullInfo?.members;\n const adminMembers = chat?.fullInfo?.adminMembers;\n const isChannel = chat && isChatChannel(chat);\n\n return {\n members,\n adminMembers,\n userStatusesById,\n isChannel,\n serverTimeOffset: global.serverTimeOffset,\n };\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, {\n FC, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiExportedInvite } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport useLang from '../../../hooks/useLang';\nimport { formatCountdown, MILLISECONDS_IN_DAY } from '../../../util/dateFormat';\nimport useInterval from '../../../hooks/useInterval';\nimport useForceUpdate from '../../../hooks/useForceUpdate';\nimport { selectChat } from '../../../modules/selectors';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../../util/environment';\nimport { getServerTime } from '../../../util/serverTime';\n\nimport ListItem from '../../ui/ListItem';\nimport NothingFound from '../../common/NothingFound';\nimport Button from '../../ui/Button';\nimport DropdownMenu from '../../ui/DropdownMenu';\nimport MenuItem from '../../ui/MenuItem';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n onScreenSelect: (screen: ManagementScreens) => void;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n exportedInvites?: ApiExportedInvite[];\n serverTimeOffset: number;\n};\n\nconst BULLET = '\\u2022';\n\nfunction inviteComparator(i1: ApiExportedInvite, i2: ApiExportedInvite) {\n const { isPermanent: i1IsPermanent, usage: i1Usage = 0, date: i1Date } = i1;\n const { isPermanent: i2IsPermanent, usage: i2Usage = 0, date: i2Date } = i2;\n if (i1IsPermanent || i2IsPermanent) return Number(i1IsPermanent) - Number(i2IsPermanent);\n if (i1Usage || i2Usage) return i2Usage - i1Usage;\n return i2Date - i1Date;\n}\n\nconst ManageInvites: FC = ({\n chatId,\n chat,\n exportedInvites,\n isActive,\n serverTimeOffset,\n onClose,\n onScreenSelect,\n}) => {\n const { setEditingExportedInvite, showNotification, editExportedChatInvite } = getDispatch();\n useHistoryBack(isActive, onClose);\n const lang = useLang();\n\n const hasDetailedCountdown = useMemo(() => {\n if (!exportedInvites) return undefined;\n return exportedInvites\n .some(({ expireDate }) => (\n expireDate && (expireDate - getServerTime(serverTimeOffset) < MILLISECONDS_IN_DAY / 1000)\n ));\n }, [exportedInvites, serverTimeOffset]);\n const forceUpdate = useForceUpdate();\n useInterval(() => {\n forceUpdate();\n }, hasDetailedCountdown ? 1000 : undefined);\n\n const primaryInvite = exportedInvites?.find(({ isPermanent }) => isPermanent);\n const primaryInviteLink = chat?.username ? `t.me/${chat.username}` : primaryInvite?.link;\n const temporalInvites = useMemo(() => {\n const invites = chat?.username ? exportedInvites : exportedInvites?.filter(({ isPermanent }) => !isPermanent);\n return invites?.filter(({ isRevoked }) => !isRevoked)\n .sort(inviteComparator);\n }, [chat?.username, exportedInvites]);\n\n const editInvite = (invite: ApiExportedInvite) => {\n setEditingExportedInvite({ chatId, invite });\n onScreenSelect(ManagementScreens.EditInvite);\n };\n\n const revokeInvite = useCallback((invite: ApiExportedInvite) => {\n const {\n link, title, isRequestNeeded, expireDate, usageLimit,\n } = invite;\n editExportedChatInvite({\n chatId,\n link,\n title,\n isRequestNeeded,\n expireDate,\n usageLimit,\n isRevoked: true,\n });\n }, [chatId, editExportedChatInvite]);\n\n const handleCreateNewClick = useCallback(() => {\n onScreenSelect(ManagementScreens.EditInvite);\n }, [onScreenSelect]);\n\n const handlePrimaryRevoke = useCallback(() => {\n if (primaryInvite) {\n revokeInvite(primaryInvite);\n }\n }, [primaryInvite, revokeInvite]);\n\n const copyLink = useCallback((link: string) => {\n copyTextToClipboard(link);\n showNotification({\n message: lang('LinkCopied'),\n });\n }, [lang, showNotification]);\n\n const handleCopyPrimaryClicked = useCallback(() => {\n copyLink(primaryInviteLink!);\n }, [copyLink, primaryInviteLink]);\n\n const prepareUsageText = (invite: ApiExportedInvite) => {\n const {\n usage = 0, usageLimit, expireDate, isPermanent, requested,\n } = invite;\n let text = '';\n if (usageLimit && usage < usageLimit) {\n text = lang('CanJoin', usageLimit - usage);\n } else if (usage) {\n text = lang('PeopleJoined', usage);\n } else {\n text = lang('NoOneJoined');\n }\n\n if (requested) {\n text += ` ${BULLET} ${lang('JoinRequests', requested)}`;\n }\n\n if (usageLimit !== undefined && usage === usageLimit) {\n text += ` ${BULLET} ${lang('LinkLimitReached')}`;\n } else if (expireDate) {\n const diff = (expireDate - getServerTime(serverTimeOffset)) * 1000;\n text += ` ${BULLET} `;\n if (diff > 0) {\n text += lang('InviteLink.ExpiresIn', formatCountdown(lang, diff));\n } else {\n text += lang('InviteLink.Expired');\n }\n } else if (isPermanent) {\n text += ` ${BULLET} ${lang('Permanent')}`;\n }\n\n return text;\n };\n\n const prepareContextActions = (invite: ApiExportedInvite) => {\n const actions = [];\n actions.push({\n title: lang('Copy'),\n icon: 'copy',\n handler: () => copyLink(invite.link),\n });\n if (!invite.isPermanent) {\n actions.push({\n title: lang('Edit'),\n icon: lang('edit'),\n handler: () => editInvite(invite),\n });\n }\n actions.push({\n title: lang('RevokeButton'),\n icon: lang('delete'),\n handler: () => revokeInvite(invite),\n destructive: true,\n });\n return actions;\n };\n\n const PrimaryLinkMenuButton: FC<{ onTrigger: () => void; isOpen?: boolean }> = useMemo(() => {\n return ({ onTrigger, isOpen }) => (\n \n \n \n );\n }, []);\n\n return (\n
\n
\n {primaryInviteLink && (\n
\n

\n {chat?.username ? lang('PublicLink') : lang('lng_create_permanent_link_title')}\n

\n
\n \n \n {lang('Copy')}\n {!chat?.username && (\n {lang('RevokeButton')}\n )}\n \n
\n \n
\n )}\n
\n \n {!temporalInvites && }\n {temporalInvites?.map((invite) => (\n copyLink(invite.link)}\n contextActions={prepareContextActions(invite)}\n key={invite.link}\n >\n {invite.title || invite.link}\n \n {prepareUsageText(invite)}\n \n \n ))}\n

{lang('ManageLinksInfoHelp')}

\n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { invites } = global.management.byChatId[chatId];\n const chat = selectChat(global, chatId);\n\n return {\n exportedInvites: invites,\n chat,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n)(ManageInvites));\n","import { ChangeEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiExportedInvite } from '../../../api/types';\nimport { ManagementScreens } from '../../../types';\n\nimport useHistoryBack from '../../../hooks/useHistoryBack';\nimport useLang from '../../../hooks/useLang';\nimport { formatFullDate, formatTime } from '../../../util/dateFormat';\nimport useFlag from '../../../hooks/useFlag';\nimport { getServerTime } from '../../../util/serverTime';\n\nimport Checkbox from '../../ui/Checkbox';\nimport InputText from '../../ui/InputText';\nimport RadioGroup from '../../ui/RadioGroup';\nimport CalendarModalAsync from '../../common/CalendarModal.async';\nimport Button from '../../ui/Button';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\n\nconst DEFAULT_USAGE_LIMITS = [1, 10, 100];\nconst DEFAULT_EXPIRE_DATE = {\n hour: 3600000,\n day: 86400000,\n week: 604800000,\n};\nconst DEFAULT_CUSTOM_EXPIRE_DATE = DEFAULT_EXPIRE_DATE.hour;\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n onScreenSelect: (screen: ManagementScreens) => void;\n isActive: boolean;\n};\n\ntype StateProps = {\n editingInvite?: ApiExportedInvite;\n serverTimeOffset: number;\n};\n\nconst ManageInvite: FC = ({\n chatId,\n editingInvite,\n isActive,\n serverTimeOffset,\n onClose,\n onScreenSelect,\n}) => {\n const { editExportedChatInvite, exportChatInvite } = getDispatch();\n\n const lang = useLang();\n const [isCalendarOpened, openCalendar, closeCalendar] = useFlag();\n const [isRequestNeeded, setIsRequestNeeded] = useState(false);\n const [title, setTitle] = useState('');\n const [customExpireDate, setCustomExpireDate] = useState(Date.now() + DEFAULT_CUSTOM_EXPIRE_DATE);\n const [selectedExpireOption, setSelectedExpireOption] = useState('unlimited');\n const [customUsageLimit, setCustomUsageLimit] = useState(10);\n const [selectedUsageOption, setSelectedUsageOption] = useState('0');\n\n useHistoryBack(isActive, onClose);\n\n useEffect(() => {\n if (!editingInvite) {\n setTitle('');\n setSelectedExpireOption('unlimited');\n setSelectedUsageOption('0');\n setCustomExpireDate(getServerTime(serverTimeOffset) * 1000 + DEFAULT_CUSTOM_EXPIRE_DATE);\n setCustomUsageLimit(10);\n setIsRequestNeeded(false);\n } else {\n const {\n title: editingTitle, usageLimit, expireDate, isRequestNeeded: editingIsRequestNeeded,\n } = editingInvite;\n if (editingTitle) setTitle(editingTitle);\n if (usageLimit) {\n setSelectedUsageOption(DEFAULT_USAGE_LIMITS.includes(usageLimit) ? usageLimit.toString() : 'custom');\n setCustomUsageLimit(usageLimit);\n }\n if (expireDate) {\n setSelectedExpireOption('custom');\n setCustomExpireDate(expireDate * 1000);\n }\n if (editingIsRequestNeeded) {\n setIsRequestNeeded(true);\n }\n }\n }, [editingInvite, serverTimeOffset]);\n\n const handleIsRequestChange = useCallback((e: ChangeEvent) => {\n setIsRequestNeeded(e.target.checked);\n }, []);\n\n const handleTitleChange = useCallback((e: ChangeEvent) => {\n setTitle(e.target.value);\n }, []);\n\n const handleCustomUsageLimitChange = useCallback((e: ChangeEvent) => {\n setCustomUsageLimit(Number.parseInt(e.target.value, 10));\n }, []);\n\n const handleExpireDateChange = useCallback((date: Date) => {\n setCustomExpireDate(date.getTime());\n closeCalendar();\n }, [closeCalendar]);\n\n const handleSaveClick = useCallback(() => {\n const usageLimit = selectedUsageOption === 'custom' ? customUsageLimit : selectedUsageOption;\n let expireDate;\n switch (selectedExpireOption) {\n case 'custom':\n expireDate = getServerTime(serverTimeOffset) + (customExpireDate - Date.now()) / 1000;\n break;\n case 'hour':\n case 'day':\n case 'week':\n expireDate = getServerTime(serverTimeOffset) + DEFAULT_EXPIRE_DATE[selectedExpireOption] / 1000;\n break;\n case 'unlimited':\n default:\n expireDate = undefined;\n }\n\n if (editingInvite) {\n editExportedChatInvite({\n link: editingInvite.link,\n chatId,\n title,\n isRequestNeeded,\n expireDate,\n usageLimit,\n });\n } else {\n exportChatInvite({\n chatId,\n title,\n isRequestNeeded,\n expireDate,\n usageLimit,\n });\n }\n onScreenSelect(ManagementScreens.Invites);\n }, [\n chatId, customExpireDate, customUsageLimit, editExportedChatInvite, editingInvite,\n exportChatInvite, isRequestNeeded, selectedExpireOption, selectedUsageOption, title, onScreenSelect,\n serverTimeOffset,\n ]);\n\n return (\n
\n
\n
\n \n
\n
\n \n

{lang('LinkNameHelp')}

\n
\n
\n
{lang('LimitByPeriod')}
\n \n {selectedExpireOption === 'custom' && (\n \n )}\n

{lang('TimeLimitHelp')}

\n
\n {!isRequestNeeded && (\n
\n
{lang('LimitNumberOfUses')}
\n ({ value: n.toString(), label: n })),\n {\n value: '0',\n label: lang('NoLimit'),\n },\n {\n value: 'custom',\n label: lang('lng_group_invite_usage_custom'),\n },\n ]}\n onChange={setSelectedUsageOption}\n selected={selectedUsageOption}\n />\n {selectedUsageOption === 'custom' && (\n \n )}\n

{lang('UsesLimitHelp')}

\n
\n )}\n \n \n \n
\n \n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const { editingInvite } = global.management.byChatId[chatId];\n\n return {\n editingInvite,\n serverTimeOffset: global.serverTimeOffset,\n };\n },\n)(ManageInvite));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiAvailableReaction, ApiChat } from '../../../api/types';\n\nimport { selectChat } from '../../../modules/selectors';\nimport useLang from '../../../hooks/useLang';\nimport useHistoryBack from '../../../hooks/useHistoryBack';\n\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport Checkbox from '../../ui/Checkbox';\nimport FloatingActionButton from '../../ui/FloatingActionButton';\nimport Spinner from '../../ui/Spinner';\n\ntype OwnProps = {\n chatId: string;\n onClose: NoneToVoidFunction;\n isActive: boolean;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n availableReactions?: ApiAvailableReaction[];\n enabledReactions?: string[];\n};\n\nconst ManageReactions: FC = ({\n availableReactions,\n enabledReactions,\n chat,\n isActive,\n onClose,\n}) => {\n const { setChatEnabledReactions } = getDispatch();\n\n const lang = useLang();\n const [isTouched, setIsTouched] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [localEnabledReactions, setLocalEnabledReactions] = useState(enabledReactions);\n\n useHistoryBack(isActive, onClose);\n\n const handleSaveReactions = useCallback(() => {\n if (!chat) return;\n setIsLoading(true);\n\n setChatEnabledReactions({\n chatId: chat.id,\n enabledReactions: localEnabledReactions,\n });\n }, [chat, localEnabledReactions, setChatEnabledReactions]);\n\n useEffect(() => {\n setIsLoading(false);\n setIsTouched(false);\n setLocalEnabledReactions(enabledReactions || []);\n }, [enabledReactions]);\n\n const handleReactionChange = useCallback((e: React.ChangeEvent) => {\n if (!chat || !availableReactions) return;\n\n const { name, checked } = e.currentTarget;\n const newEnabledReactions = name === 'all' ? (checked ? availableReactions.map((l) => l.reaction) : [])\n : (!checked\n ? localEnabledReactions.filter((l) => l !== name)\n : [...localEnabledReactions, name]);\n\n setLocalEnabledReactions(newEnabledReactions);\n setIsTouched(true);\n }, [availableReactions, chat, localEnabledReactions]);\n\n return (\n
\n
\n
\n
\n 0}\n label={lang('EnableReactions')}\n onChange={handleReactionChange}\n />\n
\n {availableReactions?.filter((l) => !l.isInactive).map(({ reaction, title }) => (\n
\n \n \n {title}\n
\n )}\n onChange={handleReactionChange}\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 {\n enabledReactions: chat.fullInfo?.enabledReactions,\n availableReactions: global.availableReactions,\n chat,\n };\n },\n)(ManageReactions));\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';\nimport ManageInvites from './ManageInvites';\nimport ManageInvite from './ManageInvite';\nimport ManageReactions from './ManageReactions';\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.ChatNewAdminRights:\n return (\n \n );\n\n case ManagementScreens.ChannelSubscribers:\n case ManagementScreens.GroupMembers:\n return (\n \n );\n case ManagementScreens.Invites:\n return (\n \n );\n case ManagementScreens.EditInvite:\n return (\n \n );\n case ManagementScreens.GroupAddAdmins:\n return (\n \n );\n\n case ManagementScreens.Reactions:\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\nimport { PaymentStep, ShippingOption, Price } from '../../types';\n\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\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}) => {\n const {\n validateRequestedInfo,\n sendPaymentForm,\n setPaymentStep,\n sendCredentialsInfo,\n clearPaymentError,\n } = getDispatch();\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 }\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)(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 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 size: { width: 1024, height: 1024 },\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","draggable","oncontextmenu","stopEvent","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","isProtected","selectIsMessageProtected","mediaData","isVideo","isZoomed","fileName","isAvatar","onCloseMediaViewer","onForward","onZoomToggle","downloadMessageMedia","cancelMessageMediaDownload","getDispatch","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","renderDownloadButton","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","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","onContextMenu","imageSize","canDrag","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","pick","dialogs","dismissDialog","acceptInviteConfirmation","sendMessage","isModalOpen","openModal","closeModal","useFlag","dialog","contactRequest","invite","hash","title","about","participantsCount","isChannel","isRequestNeeded","participantsText","joinText","requestToJoinText","renderInviteHeader","onCloseAnimationEnd","isText","renderInvite","contact","getReadableErrorText","notifications","dismissNotification","localId","Notification","onDismiss","toggleSafeLinkModal","handleOpen","open","ensureProtocol","handleDismiss","renderingUrl","ConfirmDialog","confirmLabel","confirmHandler","MAX_SAFE_DATE","WEEKDAY_LETTERS","isDisabledDay","year","month","day","minDate","maxDate","selectedDay","fixedMinDate","getDayStart","fixedMaxDate","formatInputTime","String","padStart","formatDay","selectedAt","minAt","maxAt","isFutureMode","isPastMode","withTimePicker","submitButtonLabel","secondButtonLabel","onSubmit","onSecondButtonClick","passedSelectedDate","prevIsOpen","isTimeInputFocused","markTimeInputAsFocused","unmarkTimeInputAsFocused","selectedDate","setSelectedDate","currentMonthAndYear","setCurrentMonthAndYear","getFullYear","getMonth","selectedHours","setSelectedHours","getHours","selectedMinutes","setSelectedMinutes","getMinutes","getDate","currentYear","currentMonth","getTime","newSelectedDate","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","hasProtectedMessage","selectHasProtectedMessage","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","reactorModal","reactions","reactors","loadReactors","closeReactorListModal","isClosing","startClosing","stopClosing","chosenTab","setChosenTab","canShowFilters","count","results","chatIdRef","handleCloseAnimationEnd","handleClose","handleLoadMore","allReactions","l","reaction","concat","nextOffset","LoadMoreDirection","formatIntegerCompact","find","ReactionStaticEmoji","fullName","getUserFullName","emojiInteraction","animatedEffect","selectAnimatedEmojiEffect","effectAnimationId","localEffectAnimation","keys","ANIMATED_STICKERS_PATHS","isReversed","stopActiveEmojiInteraction","isHiding","startHiding","isPlaying","startPlaying","stop","dispatchHeavyAnimationStop","effectAnimationData","localEffectAnimationData","setLocalEffectAnimationData","getAnimationData","then","data","startSize","AnimatedSticker","animationData","play","isLowPriority","IS_ANDROID","noLoop","onLoad","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","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","isChatProtected","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","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","onScreenSelect","signOut","deleteChatFolder","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","setAnimationData","isAnimationLoaded","setIsAnimationLoaded","handleAnimationLoad","handleCreateFolder","userFolders","folder","subtitle","getFolderDescriptionText","handleCreateFolderFromRecommended","STICKER_SIZE_FOLDER_SETTINGS","pill","fluid","narrow","multiline","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","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","defaultReaction","appConfig","messageTextSize","messageSendKeyCombo","shouldSuggestStickers","shouldLoopStickers","timeFormat","stickerSettingsRef","observe","observeIntersectionForCovers","useIntersectionObserver","rootRef","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","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","availableReactions","selectedReaction","setDefaultReaction","isInactive","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","setAbout","chatTitleEmptyError","channelTitleEmptyError","chatTooManyUsersError","ChatCreationProgress","handleTitleChange","handleCreateGroup","handleCreateChannel","renderedError","RENDER_COUNT","LeftColumnContent","onContentChange","newChatMemberIds","setNewChatMemberIds","isStepActive","ChatList","folderType","folderOrderedIds","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","getTouchY","changedTouches","clientY","scrollHeight","preventDefaultForScrollKeys","HTMLElement","tagName","getAttribute","isTextBox","disableScrolling","_excludedClosestSelector","passive","onkeydown","enableScrolling","AvailableReaction","onSendReaction","isReady","selectAnimation","isActivated","activate","deactivate","markAnimationLoaded","shouldRenderAnimated","animatedClassNames","shouldRenderStatic","staticClassNames","onMouseEnter","enabledReactions","itemsScrollRef","isHorizontalScrollEnabled","enableHorizontalScroll","handleWheel","onWheelCapture","onTouchMove","anchor","canSendNow","canReschedule","canReply","canEdit","canPin","canUnpin","canForward","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","canShowSeenBy","canShowReactionsCount","canRemoveReaction","canShowReactionList","seenByRecentUsers","onReply","onEdit","onPin","onReport","onFaveSticker","onUnfaveSticker","onSend","onReschedule","onCopyLink","onDownload","onShowSeenBy","onShowReactors","menuRef","scrollableRef","copyOptions","afterEffect","getMessageText","canImageBeCopied","hasMessageLocalBlobUrl","CLIPBOARD_ITEM_SUPPORTED","selection","getSelection","Promise","resolve","mediaLoader","copyImageToClipboard","anchorNode","parentNode","clipboardText","copyTextToClipboard","getMessageCopyOptions","noReactions","withReactions","markIsReady","unmarkIsReady","getTriggerElement","getRootElement","getMenuElement","getLayout","extraHeightAudioPlayer","pinnedElement","extraHeightPinned","extraPaddingX","extraTopPadding","marginSides","extraMarginTop","handleRemoveReaction","positionY","menuStyle","withScroll","useContextMenuPosition","Menu","bubbleStyle","START_SIZE","selectActiveDownloadIds","noOptions","isScheduled","isOwnMessage","SEEN_BY_MEMBERS_CHAT_MAX","SEEN_BY_MEMBERS_EXPIRE","isAction","isActionMessage","areReactionsEmpty","canSeeList","some","isChosen","hasFullInfo","SERVICE_NOTIFICATIONS_USER_ID","chatUsername","setReplyingToId","setEditingId","faveSticker","unfaveSticker","toggleMessageSelection","sendScheduledMessages","rescheduleMessage","loadSeenBy","openSeenByModal","sendReaction","openReactorListModal","loadFullChat","isMenuOpen","setIsMenuOpen","setIsDeleteModalOpen","setIsReportModalOpen","isPinModalOpen","setIsPinModalOpen","isCalendarOpen","openCalendar","closeCalendar","recentReactions","msg","closeMenu","closePinModal","handleCloseCalendar","handleReply","handleEdit","handlePin","handleUnpin","handleFaveSticker","handleUnfaveSticker","handleSelectMessage","params","childMessageIds","withShift","handleScheduledMessageSend","handleOpenCalendar","handleOpenSeenByModal","handleOpenReactorListModal","handleRescheduleMessage","scheduledAt","handleCopyLink","handleSendReaction","reportMessageIds","scheduledMaxDate","getDayStartAt","stickerSetShortName","currentMessageList","sendOptions","getAllowedAttachmentOptions","canSendStickers","selectStickerSet","stickerSetId","selectStickerSetByShortName","loadStickers","toggleStickerSet","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","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","groupChatMembers","recentEmojis","baseEmojiKeywords","emojiKeywords","addRecentEmoji","onCaptionUpdate","onFileAppend","onClear","captionRef","useStateRef","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","addRecentSticker","activeSetIndex","setActiveSetIndex","sendMessageAction","useSendMessageAction","areAddedLoaded","allSets","noPopulatedSets","set","stickerSetEl","handleStickerSelect","handleStickerUnfave","handleMouseMove","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","isLeftColumnShown","setRecentEmojis","handleMouseEnter","handleMouseLeave","useMouseInside","fastRaf","recentEmojisRef","renderContent","onMouseLeave","noCloseOnBackdrop","canAttachMedia","canAttachPolls","onFileSelect","onPollCreate","handleQuickSelect","handleDocumentSelect","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","onSelectResult","startBot","handleSendPm","startParam","prevInlineBotResults","renderedInlineBotResults","sensitiveArea","inlineBotResult","selectedSendAsId","sendAsIds","saveDefaultSendAs","markMouseInside","sendAsId","selectedSendAsIndex","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","deleteContact","closeManagement","isDeleteDialogOpen","openDeleteDialog","closeDeleteDialog","isNotificationsEnabled","setIsNotificationsEnabled","ManagementProgress","handleNotificationChange","handleDeleteContact","withFullInfo","GROUP_TITLE_EMPTY","hasLinkedChannel","isBasicGroup","invites","canChangeInfo","isCreator","getHasAdminRight","canBanUsers","canInvite","exportedInvites","availableReactionsCount","togglePreHistoryHidden","updateChat","deleteChat","leaveChannel","deleteChannel","loadExportedChatInvites","currentTitle","currentAbout","imageHash","handleClickEditType","ManagementScreens","handleClickDiscussion","handleClickReactions","handleClickPermissions","handleClickAdministrators","handleClickInvites","handleSetPhoto","handleAboutChange","handleUpdateGroup","trimmedTitle","trimmedAbout","handleClickMembers","handleTogglePreHistory","isPreHistoryHidden","isEnabled","enabledReactionsCount","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","toggleIsProtected","privateLink","inviteLink","privacyType","setPrivacyType","isRevokeConfirmDialogOpen","openRevokeConfirmDialog","closeRevokeConfirmDialog","canUpdate","handleOptionChange","handleForwardingOptionChange","handleSave","handleRevokePrivateLink","langPrefix1","langPrefix2","forwardingOptions","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","handleAddAdminClick","getMemberStatus","promotedByUser","defaultRights","adminRights","isNewAdmin","updateChatAdmin","setIsTouched","isDismissConfirmationDialogOpen","openDismissConfirmationDialog","closeDismissConfirmationDialog","customTitle","setCustomTitle","selectedAdminMember","handleDismissAdmin","memberStatus","handleCustomTitleChange","postMessages","editMessages","banUsers","addAdmins","manageCall","anonymous","maxLength","noAdmins","openUserInfo","adminIds","memberId","inviteComparator","i1","i2","isPermanent","i1IsPermanent","usage","i1Usage","i1Date","i2IsPermanent","i2Usage","i2Date","setEditingExportedInvite","showNotification","editExportedChatInvite","hasDetailedCountdown","expireDate","getServerTime","MILLISECONDS_IN_DAY","useInterval","primaryInvite","primaryInviteLink","link","temporalInvites","isRevoked","revokeInvite","usageLimit","handleCreateNewClick","handlePrimaryRevoke","copyLink","handleCopyPrimaryClicked","prepareContextActions","actions","editInvite","PrimaryLinkMenuButton","secondaryIcon","requested","diff","formatCountdown","prepareUsageText","DEFAULT_USAGE_LIMITS","DEFAULT_EXPIRE_DATE","hour","week","DEFAULT_CUSTOM_EXPIRE_DATE","editingInvite","exportChatInvite","isCalendarOpened","setIsRequestNeeded","customExpireDate","setCustomExpireDate","selectedExpireOption","setSelectedExpireOption","customUsageLimit","setCustomUsageLimit","selectedUsageOption","setSelectedUsageOption","editingTitle","editingIsRequestNeeded","handleIsRequestChange","handleCustomUsageLimitChange","handleExpireDateChange","handleSaveClick","formatFullDate","n","setChatEnabledReactions","localEnabledReactions","setLocalEnabledReactions","handleSaveReactions","handleReactionChange","newEnabledReactions","managementType","selectCurrentManagementType","VISA","MASTERCARD1","MASTERCARD2","CardType","cards","Default","Visa","Mastercard","detectCardType","cardNumber","formatsCache","defaultPhoneNumberFormat","str","flag","phoneFormat","format","formatValue","phoneNumberFormat","phoneNumberGroups","RegExp","repeat","getPhoneNumberFormat","streetLine1","streetLine2","city","countryIso2","postCode","phone","shipping","cardholder","expiry","cvv","billingCountry","billingZip","saveInfo","saveCredentials","formErrors","reducer","getBillingCountry","countryCode","useFocusAfterAnimation","animationDuration","hasArrow","labelText","htmlFor","needEmail","needPhone","needName","needAddress","phoneRef","selectCountryRef","handleAddress1Change","handleAddress2Change","handleCityChange","handleStateChange","handleCountryChange","handlePostCodeChange","handleFullNameChange","handleEmailChange","handlePhoneChange","handleSaveInfoChange","shippingOptions","currency","handleShippingSelect","amount","formatCurrency","renderPaymentItem","main","renderCheckoutItem","invoiceContent","prices","shippingPrices","checkoutInfo","totalPrice","photoUrl","paymentMethod","paymentProvider","shippingAddress","shippingMethod","expiryInputRef","charAt","parts","formatCardExpiry","cardNumberRef","cardType","setCardType","newCardType","formatCardNumber","cardIcon","mastercardIconPath","visaIconPath","getCardIcon","canSaveCredentials","needCardholderName","needCountry","needZip","handleCardNumberChange","handleCardholderChange","toUpperCase","handleExpiryChange","handleCvvChange","handleBillingPostCodeChange","handleChangeSaveCredentials","savedInfo","invoice","nativeProvider","nativeParams","passwordMissing","payment","isProviderError","nameRequested","phoneRequested","emailRequested","shippingAddressRequested","flexible","phoneToProvider","emailToProvider","validateRequestedInfo","sendPaymentForm","setPaymentStep","sendCredentialsInfo","clearPaymentError","paymentState","paymentDispatch","field","handleErrorModalClose","PaymentStep","shippingOption","getShippingPrices","cur","getTotalPrice","detectCardTypeText","findShippingOption","getCheckoutInfo","validateRequest","requestInfo","getRequestInfo","sendCredentials","credentials","expiryMonth","expiryYear","zip","getCredentials","sendForm","shippingOptionId","setStep","nextStep","buttonText","currentStep","renderModalContent","renderError","optionId","receipt","info","totalAmount","credentialsTitle","fullAddress","onInputChange","setPassword","canSubmit","setCanSubmit","select","autoComplete","MIN_PASSWORD_LENGTH","SEGMENT_COVER_EYES","SEGMENT_UNCOVER_EYE","SEGMENT_COVER_EYE","STICKER_SIZE","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_AUTH","closeMonkeyData","setCloseMonkeyData","peekMonkeyData","setPeekMonkeyData","isFirstMonkeyLoaded","setIsFirstMonkeyLoaded","isPeekShown","setIsPeekShown","handleFirstMonkeyLoad","STICKER_SIZE_TWO_FA","playSegment","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.4a5a09d66c985b7d1074.js b/dist/524.4f91b5e8a34fdeca4cde.js similarity index 99% rename from dist/524.4a5a09d66c985b7d1074.js rename to dist/524.4f91b5e8a34fdeca4cde.js index b77428f81..7b85ffe87 100644 --- a/dist/524.4a5a09d66c985b7d1074.js +++ b/dist/524.4f91b5e8a34fdeca4cde.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.4a5a09d66c985b7d1074.js.map \ No newline at end of file +//# sourceMappingURL=524.4f91b5e8a34fdeca4cde.js.map \ No newline at end of file diff --git a/dist/524.4a5a09d66c985b7d1074.js.map b/dist/524.4f91b5e8a34fdeca4cde.js.map similarity index 99% rename from dist/524.4a5a09d66c985b7d1074.js.map rename to dist/524.4f91b5e8a34fdeca4cde.js.map index cc28de7de..d77da93ad 100644 --- a/dist/524.4a5a09d66c985b7d1074.js.map +++ b/dist/524.4f91b5e8a34fdeca4cde.js.map @@ -1 +1 @@ -{"version":3,"file":"524.4a5a09d66c985b7d1074.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-v7';\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;\nexport const REACTION_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\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\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\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\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\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 +{"version":3,"file":"524.4f91b5e8a34fdeca4cde.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-v7';\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;\nexport const REACTION_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\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\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\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\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\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.a30fdabaf6a4ec59d8a7.css b/dist/532.a137aefcf87d9a57c87e.css similarity index 99% rename from dist/532.a30fdabaf6a4ec59d8a7.css rename to dist/532.a137aefcf87d9a57c87e.css index b9ee5fcc0..89d751b89 100644 --- a/dist/532.a30fdabaf6a4ec59d8a7.css +++ b/dist/532.a137aefcf87d9a57c87e.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.a30fdabaf6a4ec59d8a7.css.map*/ \ No newline at end of file +/*# sourceMappingURL=532.a137aefcf87d9a57c87e.css.map*/ \ No newline at end of file diff --git a/dist/532.a30fdabaf6a4ec59d8a7.css.map b/dist/532.a137aefcf87d9a57c87e.css.map similarity index 99% rename from dist/532.a30fdabaf6a4ec59d8a7.css.map rename to dist/532.a137aefcf87d9a57c87e.css.map index 9432579f7..18b31979e 100644 --- a/dist/532.a30fdabaf6a4ec59d8a7.css.map +++ b/dist/532.a137aefcf87d9a57c87e.css.map @@ -1 +1 @@ -{"version":3,"file":"532.a30fdabaf6a4ec59d8a7.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,oBACE,iBAGF,mBACE,kCACA,mBACA,gBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;ACtKJ,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 .modal-about {\n font-weight: bold;\n }\n\n .modal-help {\n color: var(--color-text-secondary);\n font-size: 0.9375rem;\n line-height: 1.3;\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.a137aefcf87d9a57c87e.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,oBACE,iBAGF,mBACE,kCACA,mBACA,gBAGF,uBACE,aACA,qBAEA,qEACE,iBAIJ,8BACE,WACA,YACA,iBACA,iBACA,gBACA,qB;ACtKJ,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 .modal-about {\n font-weight: bold;\n }\n\n .modal-help {\n color: var(--color-text-secondary);\n font-size: 0.9375rem;\n line-height: 1.3;\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.a30fdabaf6a4ec59d8a7.js b/dist/532.a137aefcf87d9a57c87e.js similarity index 99% rename from dist/532.a30fdabaf6a4ec59d8a7.js rename to dist/532.a137aefcf87d9a57c87e.js index 089d15d0f..3509a5af4 100644 --- a/dist/532.a30fdabaf6a4ec59d8a7.js +++ b/dist/532.a137aefcf87d9a57c87e.js @@ -1,3 +1,3 @@ -/*! For license information please see 532.a30fdabaf6a4ec59d8a7.js.LICENSE.txt */ +/*! For license information please see 532.a137aefcf87d9a57c87e.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),y=a(3106),Z=a(8964),k=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 N=(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})})),M=(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}}))((({noAudioStream:e,canSelfUnmute:t,isMuted:a,hasRequestedToSpeak:n,connectionState:r})=>{const{toggleGroupCallMute:s,requestToSpeak:l,playGroupCallSound:c}=(0,o.uC)(),d=(0,P.Z)(),u=(0,i.sO)("up"),[p,m]=(0,i.eJ)(!1),v="connected"!==r,g=!t&&a,f=(0,G.Z)(g);(0,i.d4)((()=>{f&&!g&&c("allowTalk")}),[c,f,g]);const C=(0,i.Ye)((()=>{if(p){const e=Math.floor(100*Math.random());return e<32?[0,120]:e<64?[120,240]:e<97?[240,420]:[420,540]}return!f&&g?e?[99,135]:[136,172]:f&&!g?[0,36]:g?[0,0]:e?[69,99]:[36,69]}),[f,p,e,g]),S=p?"HandFilled":"VoiceMini",E=()=>{I(),s()},b=(0,i.Ye)((()=>d(n?"VoipMutedTapedForSpeak":g?"VoipMutedByAdmin":e?"VoipUnmute":"VoipTapToMute")),[n,e,d,g]);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",v&&"is-connecting",g&&"muted-by-admin"),onMouseDown:()=>{if(g){if(p)return;return I(),l(),m(!0),void setTimeout((()=>{m(!1)}),3e3)}u.current="down",e&&setTimeout((()=>{"down"===u.current&&(u.current="hold",E())}),200)},onMouseUp:()=>{g||(E(),u.current="up")}},i.ZP.createElement(N,{name:S,size:48,playSegment:C})),i.ZP.createElement("div",{className:"button-text"},b))})));var U=a(4605),O=a(6071),R=a(2328),$=a(2275);const D=[0,17],V=[17,34],A=(0,i.X$)((0,o.c$)((e=>({isAdmin:(0,c.Ht)(e)})))((({participant:e,closeDropdown:t,isDropdownOpen:a,anchor:n,isAdmin:s})=>{const{toggleGroupCallMute:l,setGroupCallParticipantVolume:c,toggleGroupCallPanel:d,openChat:u,requestToSpeak:p}=(0,o.uC)(),m=(0,P.Z)(),[v,g,f]=(0,S.Z)(),C=null==e?void 0:e.id,{isMutedByMe:E,isMuted:b,isSelf:y,canSelfUnmute:k}=e||{},I=Boolean(null==e?void 0:e.raiseHandRating),G=!k&&b,[w,T]=(0,i.eJ)(E?0:((null==e?void 0:e.volume)||r.aC)/r.Ro);(0,i.d4)((()=>{T(E?0:((null==e?void 0:e.volume)||r.aC)/r.Ro)}),[C]);const M=(0,O.Z)(500),U=(0,i.I4)((e=>{e.stopPropagation(),g(),t()}),[g,t]),A=(0,i.I4)((e=>{e.stopPropagation(),p({value:!1}),t()}),[p,t]),H=(0,i.I4)((e=>{e.stopPropagation(),t(),s||T(E?r.aC/r.Ro:0),l({participantId:C,value:s?!G:!E})}),[t,l,C,s,G,E]),F=(0,i.I4)((e=>{e.stopPropagation(),d(),u({id:C}),t()}),[d,t,u,C]),L=0===w?D:V;return i.ZP.createElement("div",null,i.ZP.createElement(R.Z,{isOpen:a,positionX:"right",autoClose:!0,style:n?`right: 1rem; top: ${n.y}px;`:void 0,onClose:t,className:"participant-menu"},!y&&!G&&i.ZP.createElement("div",{className:"group"},i.ZP.createElement("div",{className:(0,h.Z)("volume-control",w<50&&"low",w>=50&&w<100&&"medium",w>=100&&w<150&&"normal",w>=150&&"high")},i.ZP.createElement("input",{type:"range",min:"0",max:"200",value:w,onChange:e=>{const t=Number(e.target.value);T(t),M((()=>{0===t?l({participantId:C,value:!0}):c({participantId:C,volume:Math.floor(t*r.Ro)})}))}}),i.ZP.createElement("div",{className:"info"},i.ZP.createElement(N,{name:"Speaker",playSegment:L,size:24}),i.ZP.createElement("span",null,w,"%")))),i.ZP.createElement("div",{className:"group"},I&&y&&i.ZP.createElement(Z.Z,{icon:"stop-raising-hand",onClick:A},m("VoipGroupCancelRaiseHand")),!y&&i.ZP.createElement(Z.Z,{icon:"user",onClick:F},m("VoipGroupOpenProfile")),!y&&i.ZP.createElement(Z.Z,{icon:b&&s?"allow-speak":"microphone-alt",onClick:H},m(s?G?"VoipGroupAllowToSpeak":"VoipMute":E?"VoipGroupUnmuteForMe":"VoipGroupMuteForMe")),!y&&s&&i.ZP.createElement(Z.Z,{icon:"delete-user",destructive:!0,onClick:U},m("VoipGroupUserRemove")))),!y&&s&&i.ZP.createElement($.Z,{isOpen:v,userId:C,onClose:f}))})));var H=a(7407),F=a(172);const L=(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(N,{name:"VoiceOutlined",playSegment:u,size:28,color:p})})),x=(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(F.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(L,{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}}))((({participants:e,participantsCount:t,openParticipantMenu:a})=>{const{createGroupCallInviteLink:n,loadMoreGroupCallParticipants:r}=(0,o.uC)(),s=(0,P.Z)(),l=(0,i.Ye)((()=>Object.keys(e||{})),[e]),[c,d]=(0,H.Z)(r,l,l.length>=t);return i.ZP.createElement("div",{className:"participants"},i.ZP.createElement("div",{className:"invite-btn",onClick:n},i.ZP.createElement("div",{className:"icon"},i.ZP.createElement("i",{className:"icon-add-user"})),i.ZP.createElement("div",{className:"text"},s("VoipGroupInviteMember"))),i.ZP.createElement(j.Z,{items:c,onLoadMore:d},null==c?void 0:c.map((t=>e[t]&&i.ZP.createElement(x,{key:t,openParticipantMenu:a,participant:e[t]})))))}))),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(F.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}}))((({groupCallId:e,isGroupCallPanelHidden:t,connectionState:a,isSpeakerEnabled:r,title:s,meParticipant:l,isAdmin:c,participants:d})=>{const{toggleGroupCallVideo:u,toggleGroupCallPresentation:p,leaveGroupCall:m,toggleGroupCallPanel:v,connectToActiveGroupCall:g,playGroupCallSound:f}=(0,o.uC)(),I=(0,P.Z)(),G=(0,i.sO)(null),[w,T]=(0,i.eJ)(!1),[O,R,$]=(0,S.Z)(),[D,V,H]=(0,S.Z)(!0),F=d&&Object.values(d).some((e=>e.video||e.presentation)),L=O&&!C.wB&&F,[x,j]=(0,i.eJ)(),[B,q,J]=(0,S.Z)(),[X,Y,W]=(0,S.Z)(),[K,ee]=(0,i.eJ)(!1),[te,ae]=(0,i.eJ)(!1),ne=null==l?void 0:l.hasVideoStream,ie=null==l?void 0:l.hasPresentationStream,oe="connected"!==a,re=!(null==l?void 0:l.canSelfUnmute)&&(null==l?void 0:l.isMuted),se=(0,i.I4)(((e,t)=>{const a=e.getBoundingClientRect(),n=G.current;j({anchor:{x:a.left,y:a.top-n.offsetTop+60},participant:t}),q()}),[q]);(0,i.d4)((()=>{"connected"===a?f({sound:"join"}):"reconnecting"===a&&f({sound:"connecting"})}),[a,f]);const le=()=>{W(),ee(!1)},ce=(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:I("AccDescrMoreOptions")},i.ZP.createElement("i",{className:"icon-more"}))),[I]),de=(0,i.I4)((()=>{G.current&&(O?document.exitFullscreen().then($):G.current.requestFullscreen().then(R))}),[$,O,R]),ue=(0,i.I4)((()=>{C.t0&&(O||H(),de())}),[H,de,O]),pe=(0,i.I4)((()=>{O?$():R()}),[$,O,R]);(0,i.d4)((()=>{if(!C.t0)return;const e=G.current;return e?(e.addEventListener("fullscreenchange",pe),()=>{e.removeEventListener("fullscreenchange",pe)}):void 0}),[pe]),(0,i.d4)((()=>{g()}),[g,e]);const me=()=>{if(c&&!X)return Y(),void(O&&de());f({sound:"leave"}),T(!0),W()};return i.ZP.createElement(k.Z,{isOpen:!t&&!w,onClose:v,className:(0,h.Z)("GroupCall",C.wB&&"single-column",L&&"landscape",!D&&"no-sidebar"),dialogRef:G,onCloseAnimationEnd:()=>{w&&m({shouldDiscard:te})}},i.ZP.createElement("div",{className:"header"},i.ZP.createElement("h3",null,s||I("VoipGroupVoiceChat")),C.t0&&i.ZP.createElement(b.Z,{round:!0,size:"smaller",color:"translucent",onClick:de,ariaLabel:I(O?"AccExitFullscreen":"AccSwitchToFullscreen")},i.ZP.createElement("i",{className:O?"icon-smallscreen":"icon-fullscreen"})),L&&i.ZP.createElement(b.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>{D?H():V()}},i.ZP.createElement("i",{className:"icon-sidebar"})),(n.IS_SCREENSHARE_SUPPORTED&&!re||c)&&i.ZP.createElement(y.Z,{positionX:"right",trigger:ce},n.IS_SCREENSHARE_SUPPORTED&&!re&&i.ZP.createElement(Z.Z,{icon:"share-screen",onClick:p},I(ie?"VoipChatStopScreenCapture":"VoipChatStartScreenCapture")),c&&i.ZP.createElement(Z.Z,{icon:"phone-discard-outline",onClick:()=>{ee(!0),ae(!0),Y(),O&&de()},destructive:!0},I("VoipGroupLeaveAlertEndChat"))),i.ZP.createElement(b.Z,{round:!0,size:"smaller",color:"translucent",onClick:()=>{v(),O&&$()}},i.ZP.createElement("i",{className:"icon-close"}))),i.ZP.createElement("div",{className:"scrollable custom-scroll"},i.ZP.createElement(z,{onDoubleClick:ue}),(!L||D)&&i.ZP.createElement(_,{openParticipantMenu:se})),i.ZP.createElement(A,{participant:null==x?void 0:x.participant,anchor:null==x?void 0:x.anchor,isDropdownOpen:B,closeDropdown:J}),i.ZP.createElement("div",{className:"buttons"},oe&&i.ZP.createElement(E.Z,null),i.ZP.createElement("div",{className:"button-wrapper"},i.ZP.createElement("div",{className:"video-buttons"},ne&&(C.wZ||C.cj)&&i.ZP.createElement("button",{className:"smaller-button",onClick:n.switchCameraInput},i.ZP.createElement(N,{name:"CameraFlip",playSegment:Q,size:24})),i.ZP.createElement("button",{className:(0,h.Z)("small-button",re?"speaker":"camera",(ne||re&&r)&&"active"),onClick:()=>{re?(0,n.toggleSpeaker)():u()}},i.ZP.createElement("i",{className:re?"icon-speaker":ne?"icon-video-stop":"icon-video"}))),i.ZP.createElement("div",{className:"button-text"},I(re?"VoipSpeaker":"VoipCamera"))),i.ZP.createElement(M,null),i.ZP.createElement("div",{className:"button-wrapper"},i.ZP.createElement("button",{className:"small-button leave",onClick:me},i.ZP.createElement("i",{className:"icon-phone-discard"})),i.ZP.createElement("div",{className:"button-text"},I("VoipGroupLeave")))),i.ZP.createElement(k.Z,{isOpen:X,onClose:le,className:"error",title:I(K?"VoipGroupEndAlertTitle":"VoipGroupLeaveAlertTitle")},i.ZP.createElement("p",null,I(K?"VoipGroupEndAlertText":"VoipGroupLeaveAlertText")),!K&&i.ZP.createElement(U.Z,{label:I("VoipGroupEndChat"),checked:te,onCheck:ae}),i.ZP.createElement(b.Z,{isText:!0,className:"confirm-dialog-button",onClick:me},I(K?"VoipGroupEnd":"VoipGroupLeave")),i.ZP.createElement(b.Z,{isText:!0,className:"confirm-dialog-button",onClick:le},I("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)})))((({groupCall:e,meParticipant:t,isGroupCallPanelHidden:a})=>{const{toggleGroupCallPanel:n}=(0,o.uC)(),r=(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||r("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)}}))((({isOpen:e,channelTitle:t,userFullName:a})=>{const{closeCallFallbackConfirm:n,inviteToCallFallback:r}=(0,o.uC)(),[s,l]=(0,i.eJ)(!0),c=(0,W.Z)(a,!0);return i.ZP.createElement(X.Z,{title:"Start Call",isOpen:e,confirmHandler:()=>{r({shouldRemove:s})},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(U.Z,{label:`Remove ${c} from this channel after the call`,checked:s,onCheck:l}))})))},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})})()},1171:(e,t,a)=>{"use strict";e.exports=a.p+"call-fallback-avatar.50c421eaa09a90e44ec4..png"}}]); -//# sourceMappingURL=532.a30fdabaf6a4ec59d8a7.js.map \ No newline at end of file +//# sourceMappingURL=532.a137aefcf87d9a57c87e.js.map \ No newline at end of file diff --git a/dist/532.a30fdabaf6a4ec59d8a7.js.LICENSE.txt b/dist/532.a137aefcf87d9a57c87e.js.LICENSE.txt similarity index 100% rename from dist/532.a30fdabaf6a4ec59d8a7.js.LICENSE.txt rename to dist/532.a137aefcf87d9a57c87e.js.LICENSE.txt diff --git a/dist/532.a137aefcf87d9a57c87e.js.map b/dist/532.a137aefcf87d9a57c87e.js.map new file mode 100644 index 000000000..79662cf80 --- /dev/null +++ b/dist/532.a137aefcf87d9a57c87e.js.map @@ -0,0 +1 @@ +{"version":3,"file":"532.a137aefcf87d9a57c87e.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/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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { vibrateShort } from '../../../util/vibrate';\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\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}) => {\n const {\n toggleGroupCallMute,\n requestToSpeak,\n playGroupCallSound,\n } = getDispatch();\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)(MicrophoneButton));\n","import { GroupCallParticipant } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { IAnchorPosition } from '../../../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 { 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\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 isAdmin,\n}) => {\n const {\n toggleGroupCallMute,\n setGroupCallParticipantVolume,\n toggleGroupCallPanel,\n openChat,\n requestToSpeak,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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\nconst GroupCallParticipantList: FC = ({\n participants,\n participantsCount,\n openParticipantMenu,\n}) => {\n const {\n createGroupCallInviteLink,\n loadMoreGroupCallParticipants,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\nimport '../../../modules/actions/calls';\n\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 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\nconst GroupCall: FC = ({\n groupCallId,\n isGroupCallPanelHidden,\n connectionState,\n isSpeakerEnabled,\n title,\n meParticipant,\n isAdmin,\n participants,\n\n}) => {\n const {\n toggleGroupCallVideo,\n toggleGroupCallPresentation,\n leaveGroupCall,\n toggleGroupCallPanel,\n connectToActiveGroupCall,\n playGroupCallSound,\n } = getDispatch();\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)(GroupCall));\n","import { GroupCallParticipant } from '../../lib/secret-sauce';\nimport React, {\n FC, memo, useEffect,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiGroupCall } from '../../api/types';\n\nimport { selectActiveGroupCall, selectGroupCallParticipant } from '../../modules/selectors/calls';\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\nconst ActiveCallHeader: FC = ({\n groupCall,\n meParticipant,\n isGroupCallPanelHidden,\n}) => {\n const { toggleGroupCallPanel } = getDispatch();\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)(ActiveCallHeader));\n","import React, { FC, memo, useState } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\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\nconst CallFallbackConfirm: FC = ({\n isOpen,\n channelTitle,\n userFullName,\n}) => {\n const {\n closeCallFallbackConfirm,\n inviteToCallFallback,\n } = getDispatch();\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)(CallFallbackConfirm));\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","toggleGroupCallMute","requestToSpeak","playGroupCallSound","getDispatch","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","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","window","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 diff --git a/dist/532.a30fdabaf6a4ec59d8a7.js.map b/dist/532.a30fdabaf6a4ec59d8a7.js.map deleted file mode 100644 index dc1683075..000000000 --- a/dist/532.a30fdabaf6a4ec59d8a7.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"532.a30fdabaf6a4ec59d8a7.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/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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { vibrateShort } from '../../../util/vibrate';\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\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}) => {\n const {\n toggleGroupCallMute,\n requestToSpeak,\n playGroupCallSound,\n } = getDispatch();\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)(MicrophoneButton));\n","import { GroupCallParticipant } from '../../../lib/secret-sauce';\nimport React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { IAnchorPosition } from '../../../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 { 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\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 isAdmin,\n}) => {\n const {\n toggleGroupCallMute,\n setGroupCallParticipantVolume,\n toggleGroupCallPanel,\n openChat,\n requestToSpeak,\n } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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\nconst GroupCallParticipantList: FC = ({\n participants,\n participantsCount,\n openParticipantMenu,\n}) => {\n const {\n createGroupCallInviteLink,\n loadMoreGroupCallParticipants,\n } = getDispatch();\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)(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 {isProtected && }\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiUser, ApiContact, ApiCountryCode } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\nimport { formatPhoneNumberWithCode } from '../../../util/phoneNumber';\nimport buildClassName from '../../../util/buildClassName';\n\nimport Avatar from '../../common/Avatar';\n\nimport './Contact.scss';\n\ntype OwnProps = {\n contact: ApiContact;\n};\n\ntype StateProps = {\n user?: ApiUser;\n phoneCodeList: ApiCountryCode[];\n};\n\nconst Contact: FC = ({\n contact, user, phoneCodeList,\n}) => {\n const { openUserInfo } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiMessage, ApiPoll, ApiUser, ApiPollAnswer,\n} from '../../../api/types';\n\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\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 onSendVote,\n serverTimeOffset,\n}) => {\n const { loadMessage, openPollResults } = getDispatch();\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)(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 isProtected?: 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 isProtected,\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 { getDispatch, 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 {\n selectIsInSelectMode,\n selectIsMessageSelected,\n} from '../../../../modules/selectors';\n\ntype OwnProps =\n PhotoProps\n & VideoProps;\n\ntype StateProps = {\n isInSelectMode?: boolean;\n isSelected?: boolean;\n};\n\nexport default function withSelectControl(WrappedComponent: FC) {\n const ComponentWithSelectControl: FC = (props) => {\n const {\n isInSelectMode,\n isSelected,\n message,\n dimensions,\n } = props;\n const { toggleMessageSelection } = getDispatch();\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 )(ComponentWithSelectControl));\n}\n","import React, { FC, useCallback } from '../../../lib/teact/teact';\n\nimport { 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 { getDispatch, getGlobal, withGlobal } from '../../../lib/teact/teactn';\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 isProtected?: 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\nconst Album: FC = ({\n album,\n observeIntersection,\n hasCustomAppendix,\n lastSyncTime,\n isOwn,\n isProtected,\n albumLayout,\n onMediaClick,\n uploadsById,\n activeDownloadIds,\n theme,\n}) => {\n const { cancelSendingMessage } = getDispatch();\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)(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 { getDispatch, getGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiThreadInfo, ApiUser,\n} from '../../../api/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};\n\nconst CommentButton: FC = ({\n threadInfo,\n disabled,\n}) => {\n const { openChat } = getDispatch();\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, memo, useCallback, useMemo,\n} from '../../../lib/teact/teact';\nimport { getDispatch, getGlobal } from '../../../lib/teact/teactn';\n\nimport {\n ApiAvailableReaction, ApiMessage, ApiReactionCount, ApiUser,\n} from '../../../api/types';\nimport { ActiveReaction } from '../../../global/types';\n\nimport buildClassName from '../../../util/buildClassName';\nimport { formatIntegerCompact } from '../../../util/textFormat';\n\nimport Button from '../../ui/Button';\nimport Avatar from '../../common/Avatar';\nimport ReactionAnimatedEmoji from './ReactionAnimatedEmoji';\n\nimport './Reactions.scss';\n\nconst MAX_REACTORS_AVATARS = 3;\n\nconst ReactionButton: FC<{\n reaction: ApiReactionCount;\n message: ApiMessage;\n activeReaction?: ActiveReaction;\n availableReactions?: ApiAvailableReaction[];\n}> = ({\n reaction,\n message,\n activeReaction,\n availableReactions,\n}) => {\n const { sendReaction } = getDispatch();\n\n const { recentReactions } = message.reactions!;\n\n const recentReactors = useMemo(() => {\n if (!recentReactions || reaction.count > MAX_REACTORS_AVATARS) {\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\n return recentReactions\n .filter((recentReaction) => recentReaction.reaction === reaction.reaction)\n .map((recentReaction) => usersById[recentReaction.userId])\n .filter(Boolean) as ApiUser[];\n }, [reaction, recentReactions]);\n\n const handleClick = useCallback(() => {\n sendReaction({\n reaction: reaction.isChosen ? undefined : reaction.reaction,\n chatId: message.chatId,\n messageId: message.id,\n });\n }, [message, reaction, sendReaction]);\n\n return (\n \n \n {recentReactors?.length ? (\n
\n {recentReactors.map((user) => )}\n
\n ) : formatIntegerCompact(reaction.count)}\n \n );\n};\n\nexport default memo(ReactionButton);\n","import React, { FC, memo } from '../../../lib/teact/teact';\n\nimport { ApiAvailableReaction, ApiMessage } from '../../../api/types';\nimport { ActiveReaction } from '../../../global/types';\n\nimport buildClassName from '../../../util/buildClassName';\n\nimport ReactionButton from './ReactionButton';\n\nimport './Reactions.scss';\n\ntype OwnProps = {\n message: ApiMessage;\n isOutside?: boolean;\n activeReaction?: ActiveReaction;\n availableReactions?: ApiAvailableReaction[];\n metaChildren?: React.ReactNode;\n};\n\nconst Reactions: FC = ({\n message,\n isOutside,\n activeReaction,\n availableReactions,\n metaChildren,\n}) => {\n return (\n
\n {message.reactions!.results.map((reaction) => (\n \n ))}\n {metaChildren}\n
\n );\n};\n\nexport default memo(Reactions);\n","import React, {\n FC, memo, useEffect, useState,\n} from '../../lib/teact/teact';\n\nimport { ActiveEmojiInteraction } from '../../global/types';\n\nimport { ObserveFn, useIsIntersecting } from '../../hooks/useIntersectionObserver';\nimport getAnimationData, { ANIMATED_STICKERS_PATHS } from './helpers/animatedAssets';\nimport useAnimatedEmoji from './hooks/useAnimatedEmoji';\n\nimport AnimatedSticker from './AnimatedSticker';\n\nconst QUALITY = 1;\n\ntype OwnProps = {\n localSticker?: string;\n localEffect?: string;\n isOwn?: boolean;\n soundId?: string;\n observeIntersection?: ObserveFn;\n size?: 'large' | 'medium' | 'small';\n lastSyncTime?: number;\n forceLoadPreview?: boolean;\n messageId?: number;\n chatId?: string;\n activeEmojiInteraction?: ActiveEmojiInteraction;\n};\n\nconst LocalAnimatedEmoji: FC = ({\n localSticker,\n localEffect,\n isOwn,\n soundId,\n size = 'medium',\n observeIntersection,\n messageId,\n chatId,\n activeEmojiInteraction,\n}) => {\n const {\n playKey,\n ref,\n style,\n width,\n handleClick,\n markAnimationLoaded,\n } = useAnimatedEmoji(size, chatId, messageId, soundId, activeEmojiInteraction, isOwn, localEffect);\n const id = `local_emoji_${localSticker}`;\n\n const isIntersecting = useIsIntersecting(ref, observeIntersection);\n\n const [localStickerAnimationData, setLocalStickerAnimationData] = useState();\n useEffect(() => {\n if (localSticker) {\n getAnimationData(localSticker as keyof typeof ANIMATED_STICKERS_PATHS).then((data) => {\n setLocalStickerAnimationData(data);\n });\n }\n }, [localSticker]);\n\n return (\n \n {localStickerAnimationData && (\n \n )}\n \n );\n};\n\nexport default memo(LocalAnimatedEmoji);\n","import React, {\n FC,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ActiveEmojiInteraction, ActiveReaction, MessageListType } from '../../../global/types';\nimport {\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n ApiChat,\n ApiSticker,\n ApiThreadInfo,\n ApiAvailableReaction,\n} from '../../../api/types';\nimport {\n AudioOrigin, FocusDirection, IAlbum, ISettings,\n} from '../../../types';\n\nimport { IS_ANDROID, IS_TOUCH_ENV } from '../../../util/environment';\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 selectAnimatedEmojiEffect,\n selectAnimatedEmojiSound,\n selectMessageIdsByGroupId,\n selectLocalAnimatedEmoji,\n selectIsMessageProtected,\n selectLocalAnimatedEmojiEffect,\n selectDefaultReaction,\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 areReactionsEmpty,\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';\nimport Reactions from './Reactions';\nimport ReactionStaticEmoji from '../../common/ReactionStaticEmoji';\nimport LocalAnimatedEmoji from '../../common/LocalAnimatedEmoji';\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 areReactionsInMeta?: 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 isInDocumentGroup: boolean;\n isProtected?: boolean;\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 localSticker?: string;\n localEffect?: string;\n animatedEmojiEffect?: ApiSticker;\n animatedEmojiSoundId?: string;\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 reactionMessage?: ApiMessage;\n availableReactions?: ApiAvailableReaction[];\n defaultReaction?: string;\n activeReaction?: ActiveReaction;\n activeEmojiInteraction?: ActiveEmojiInteraction;\n};\n\ntype MetaPosition =\n 'in-text'\n | 'standalone'\n | 'none';\ntype ReactionsPosition =\n 'inside'\n | 'outside'\n | 'in-meta'\n | 'none';\n\nconst NBSP = '\\u00A0';\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 areReactionsInMeta,\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 isInDocumentGroup,\n isProtected,\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 localSticker,\n localEffect,\n animatedEmojiEffect,\n animatedEmojiSoundId,\n isInSelectMode,\n isSelected,\n isGroupSelected,\n threadId,\n reactionMessage,\n availableReactions,\n defaultReaction,\n activeReaction,\n activeEmojiInteraction,\n messageListType,\n isPinnedList,\n isDownloading,\n canAutoLoadMedia,\n canAutoPlayMedia,\n shouldLoopStickers,\n autoLoadFileMaxSizeMb,\n threadInfo,\n}) => {\n const {\n toggleMessageSelection,\n clickInlineButton,\n disableContextMenuHint,\n } = getDispatch();\n\n // eslint-disable-next-line no-null/no-null\n const ref = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const bottomMarkerRef = useRef(null);\n // eslint-disable-next-line no-null/no-null\n const contentRef = 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 {\n id: messageId, chatId, forwardInfo, viaBotId,\n } = 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 customShape = getMessageCustomShape(message);\n const hasAnimatedEmoji = localSticker || animatedEmoji;\n const asForwarded = (\n forwardInfo\n && (!isChatWithSelf || isScheduled)\n && !isRepliesChat\n && !forwardInfo.isLinkedChannelPost\n && !customShape\n );\n const isAlbum = Boolean(album) && album!.messages.length > 1;\n const isInDocumentGroupNotFirst = isInDocumentGroup && !isFirstInDocumentGroup;\n const isInDocumentGroupNotLast = isInDocumentGroup && !isLastInDocumentGroup;\n const isContextMenuShown = contextMenuPosition !== undefined;\n const canShowActionButton = (\n !(isContextMenuShown || isInSelectMode || isForwarding)\n && !isInDocumentGroupNotLast\n );\n const canForward = isChannel && !isScheduled;\n const canFocus = Boolean(isPinnedList\n || (forwardInfo\n && (forwardInfo.isChannelPost || (isChatWithSelf && !isOwn) || isRepliesChat)\n && forwardInfo.fromMessageId\n ));\n\n const withCommentButton = threadInfo && !isInDocumentGroupNotLast && messageListType === 'thread' && !noComments;\n const withQuickReactionButton = !IS_TOUCH_ENV && defaultReaction && !isInDocumentGroupNotLast;\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 avatarPeer = forwardInfo && (isChatWithSelf || isRepliesChat || !sender) ? originSender : sender;\n const senderPeer = forwardInfo ? originSender : sender;\n\n const {\n handleMouseDown,\n handleClick,\n handleContextMenu,\n handleDoubleClick,\n handleContentDoubleClick,\n handleMouseMove,\n handleSendQuickReaction,\n handleMouseLeave,\n isSwiped,\n isQuickReactionVisible,\n handleDocumentGroupMouseEnter,\n } = useOuterHandlers(\n selectMessage,\n ref,\n messageId,\n isAlbum,\n Boolean(isInSelectMode),\n Boolean(canReply),\n Boolean(isProtected),\n onContextMenu,\n handleBeforeContextMenu,\n chatId,\n isContextMenuShown,\n contentRef,\n isOwn,\n isInDocumentGroupNotLast,\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 asForwarded,\n 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 isProtected && 'is-protected',\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 Boolean(activeReaction) && 'has-active-reaction',\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\n const withAppendix = contentClassName.includes('has-appendix');\n const textParts = renderMessageText(message, highlight, isEmojiOnlyMessage(customShape));\n\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, webPage, invoice,\n } = getMessageContent(message);\n\n let metaPosition!: MetaPosition;\n if (isInDocumentGroupNotLast) {\n metaPosition = 'none';\n } else if (textParts && !hasAnimatedEmoji && !webPage) {\n metaPosition = 'in-text';\n } else {\n metaPosition = 'standalone';\n }\n\n let reactionsPosition!: ReactionsPosition;\n if (areReactionsInMeta) {\n reactionsPosition = 'in-meta';\n } else if (reactionMessage?.reactions && !areReactionsEmpty(reactionMessage.reactions)) {\n if (customShape || ((photo || video || hasAnimatedEmoji) && !textParts)) {\n reactionsPosition = 'outside';\n } else if (asForwarded) {\n metaPosition = 'standalone';\n reactionsPosition = 'inside';\n } else {\n reactionsPosition = 'inside';\n }\n } else {\n reactionsPosition = 'none';\n }\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 const signature = (isChannel && message.adminTitle) || (!asForwarded && forwardInfo?.adminTitle) || undefined;\n const metaSafeAuthorWidth = useMemo(() => {\n return signature ? calculateAuthorWidth(signature) : undefined;\n }, [signature]);\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 renderReactionsAndMeta() {\n const meta = (\n \n );\n\n if (reactionsPosition !== 'inside') {\n return meta;\n }\n\n return (\n \n );\n }\n\n function renderContent() {\n const className = buildClassName(\n 'content-inner',\n asForwarded && 'forwarded-message',\n hasReply && 'reply-message',\n noMediaCorners && 'no-media-corners',\n );\n const hasCustomAppendix = isLastInGroup && !textParts && !asForwarded && !hasThread;\n const textContentClass = buildClassName(\n 'text-content',\n metaPosition === 'in-text' && '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 {localSticker && (\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 {!hasAnimatedEmoji && textParts && (\n

\n {textParts}\n {metaPosition === 'in-text' && renderReactionsAndMeta()}\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 ) && !isInDocumentGroupNotFirst && !(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 && !isInDocumentGroupNotFirst && (\n
{lang('ForwardedMessage')}
\n )}\n {renderContent()}\n {!isInDocumentGroupNotLast && metaPosition === 'standalone' && renderReactionsAndMeta()}\n {canShowActionButton && canForward ? (\n \n \n \n ) : canShowActionButton && canFocus ? (\n \n \n \n ) : undefined}\n {withCommentButton && }\n {withAppendix && (\n
\n )}\n {withQuickReactionButton && (\n \n \n
\n )}\n \n {message.inlineButtons && (\n \n )}\n {reactionsPosition === 'outside' && (\n \n )}\n \n {contextMenuPosition && (\n \n )}\n \n );\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, isLastInDocumentGroup,\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 const isInDocumentGroup = Boolean(message.groupedId) && !message.isInAlbum;\n const documentGroupFirstMessageId = isInDocumentGroup\n ? selectMessageIdsByGroupId(global, chatId, message.groupedId!)![0]\n : undefined;\n const reactionMessage = isInDocumentGroup ? (\n isLastInDocumentGroup ? selectChatMessage(global, chatId, documentGroupFirstMessageId!) : undefined\n ) : message;\n\n const localSticker = singleEmoji ? selectLocalAnimatedEmoji(global, singleEmoji) : 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 isInDocumentGroup,\n isProtected: selectIsMessageProtected(global, message),\n isFocused,\n isForwarding,\n reactionMessage,\n isChatWithSelf,\n isRepliesChat,\n isChannel,\n canReply,\n lastSyncTime,\n highlight,\n isSingleEmoji: Boolean(singleEmoji),\n animatedEmoji: singleEmoji ? selectAnimatedEmoji(global, singleEmoji) : undefined,\n animatedEmojiEffect: singleEmoji && isUserId(chatId) ? selectAnimatedEmojiEffect(global, singleEmoji) : undefined,\n animatedEmojiSoundId: singleEmoji ? selectAnimatedEmojiSound(global, singleEmoji) : undefined,\n localSticker,\n localEffect: localSticker && isUserId(chatId) ? selectLocalAnimatedEmojiEffect(localSticker) : 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 availableReactions: global.availableReactions,\n defaultReaction: selectDefaultReaction(global, chatId),\n activeReaction: global.activeReactions[id],\n activeEmojiInteraction: global.activeEmojiInteraction,\n ...(isOutgoing && { outgoingStatus: selectOutgoingStatus(global, message, messageListType === 'scheduled') }),\n ...(typeof uploadProgress === 'number' && { uploadProgress }),\n ...(isFocused && { focusDirection, noFocusHighlight, isResizingContainer }),\n };\n },\n)(Message));\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 asForwarded?: 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 (asForwarded && 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 }, [\n asForwarded, focusMessage, forwardInfo, lang, openChat, openUserInfo, senderPeer, showNotification,\n ]);\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, {\n FC, memo, useEffect, useRef,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiSponsoredMessage, ApiUser } from '../../../api/types';\n\nimport { renderTextWithEntities } from '../../common/helpers/renderMessageText';\nimport { selectChat, selectSponsoredMessage, selectUser } from '../../../modules/selectors';\nimport { getChatTitle, getUserFullName } from '../../../modules/helpers';\nimport renderText from '../../common/helpers/renderText';\nimport useLang from '../../../hooks/useLang';\nimport { useIntersectionObserver } from '../../../hooks/useIntersectionObserver';\n\nimport Button from '../../ui/Button';\n\nimport './SponsoredMessage.scss';\n\ntype OwnProps = {\n chatId: string;\n containerRef: RefObject;\n};\n\ntype StateProps = {\n message?: ApiSponsoredMessage;\n bot?: ApiUser;\n channel?: ApiChat;\n};\n\nconst INTERSECTION_DEBOUNCE_MS = 200;\n\nconst SponsoredMessage: FC = ({\n chatId,\n message,\n containerRef,\n bot,\n channel,\n}) => {\n const {\n viewSponsoredMessage,\n openChat,\n openChatByInvite,\n startBot,\n focusMessage,\n } = getDispatch();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const contentRef = useRef(null);\n const shouldObserve = Boolean(message);\n const {\n observe: observeIntersection,\n } = useIntersectionObserver({\n rootRef: containerRef,\n debounceMs: INTERSECTION_DEBOUNCE_MS,\n threshold: 1,\n });\n\n useEffect(() => {\n return shouldObserve ? observeIntersection(contentRef.current!, (target) => {\n if (target.isIntersecting) {\n viewSponsoredMessage({ chatId });\n }\n }) : undefined;\n }, [chatId, shouldObserve, observeIntersection, viewSponsoredMessage]);\n\n if (!message) {\n return undefined;\n }\n\n const handleClick = () => {\n if (message.chatInviteHash) {\n openChatByInvite({ hash: message.chatInviteHash });\n } else if (message.channelPostId) {\n focusMessage({ chatId: message.chatId, messageId: message.channelPostId });\n } else {\n openChat({ id: message.chatId });\n\n if (message.startParam) {\n startBot({\n botId: message.chatId,\n param: message.startParam,\n });\n }\n }\n };\n\n return (\n
\n
\n
\n
\n {bot && renderText(getUserFullName(bot) || '')}\n {channel && renderText(message.chatInviteTitle || getChatTitle(lang, channel, bot) || '')}\n
\n\n

\n \n {renderTextWithEntities(message.text.text, message.text.entities)}\n \n\n \n {lang('SponsoredMessage')}\n \n

\n\n \n
\n
\n
\n );\n};\n\nexport default memo(withGlobal(\n (global, { chatId }): StateProps => {\n const message = selectSponsoredMessage(global, chatId);\n const { chatId: fromChatId, isBot } = message || {};\n\n return {\n message,\n bot: fromChatId && isBot ? selectUser(global, fromChatId) : undefined,\n channel: !isBot && fromChatId ? selectChat(global, fromChatId) : undefined,\n };\n },\n)(SponsoredMessage));\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 SponsoredMessage from './message/SponsoredMessage';\nimport ActionMessage from './ActionMessage';\nimport { getDispatch } from '../../lib/teact/teactn';\n\ninterface OwnProps {\n chatId: string;\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 areReactionsInMeta: 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}\n\nconst UNREAD_DIVIDER_CLASS = 'unread-divider';\n\nconst MessageListContent: FC = ({\n chatId,\n messageIds,\n messageGroups,\n isViewportNewest,\n isUnread,\n withUsers,\n areReactionsInMeta,\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}) => {\n const { openHistoryCalendar } = getDispatch();\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 {isViewportNewest && }\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 if (!containerRef.current) {\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiSticker, ApiUpdateConnectionStateType } from '../../api/types';\n\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\nconst INTERSECTION_DEBOUNCE_MS = 200;\n\nconst ContactGreeting: FC = ({\n sticker,\n connectionState,\n lastUnreadMessageId,\n}) => {\n const {\n loadGreetingStickers,\n sendMessage,\n markMessageListRead,\n } = getDispatch();\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)(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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiMessage, ApiRestrictionReason, MAIN_THREAD_ID,\n} from '../../api/types';\nimport { 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 } 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';\nimport useInterval from '../../hooks/useInterval';\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 lastSyncTime?: number;\n};\n\nconst MESSAGE_REACTIONS_POLLING_INTERVAL = 15 * 1000;\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 lastMessage,\n botDescription,\n threadTopMessageId,\n hasLinkedChat,\n lastSyncTime,\n withBottomShift,\n}) => {\n const {\n loadViewportMessages, setScrollOffset, loadSponsoredMessages, loadMessageReactions,\n } = getDispatch();\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 useOnChange(() => {\n if (isChannelChat && isReady && lastSyncTime) {\n loadSponsoredMessages({ chatId });\n }\n }, [chatId, isReady, isChannelChat, lastSyncTime]);\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 useInterval(() => {\n if (!messageIds || !messagesById) {\n return;\n }\n const ids = messageIds.filter((l) => messagesById[l]?.reactions);\n\n if (!ids.length) return;\n\n loadMessageReactions({ chatId, ids });\n }, MESSAGE_REACTIONS_POLLING_INTERVAL);\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) {\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]);\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 lastSyncTime: global.lastSyncTime,\n ...(withLastMessageWhenPreloading && { lastMessage }),\n };\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, true);\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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { 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 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\nconst FOCUS_MARGIN = 20;\n\nconst ScrollDownButton: FC = ({\n isShown,\n canPost,\n messageListType,\n unreadCount,\n withExtraShift,\n}) => {\n const { focusNextReply } = getDispatch();\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)(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 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';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiFormattedText, ApiMessage } from '../../../../api/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) => {\n const { saveDraft, clearDraft } = getDispatch();\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 { useState } from '../lib/teact/teact';\n\nimport useDebounce from './useDebounce';\nimport useOnChange from './useOnChange';\nimport useHeavyAnimationCheck from './useHeavyAnimationCheck';\nimport useFlag from './useFlag';\n\nexport default function useDebouncedMemo(\n resolverFn: () => R, ms: number, dependencies: D,\n): R | undefined {\n const runDebounced = useDebounce(ms, true);\n const [value, setValue] = useState();\n const [isFrozen, freeze, unfreeze] = useFlag();\n\n useHeavyAnimationCheck(freeze, unfreeze);\n\n useOnChange(() => {\n if (isFrozen) {\n return;\n }\n\n runDebounced(() => {\n setValue(resolverFn());\n });\n }, [...dependencies, isFrozen]);\n\n return value;\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';\nimport useDebouncedMemo from '../../../../hooks/useDebouncedMemo';\n\nconst DEBOUNCE_MS = 300;\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\nconst tempEl = document.createElement('div');\n\nexport default function useInlineBotTooltip(\n isAllowed: boolean,\n chatId: string,\n html: string,\n inlineBots?: Record,\n) {\n const { queryInlineBot, resetInlineBot } = getDispatch();\n\n const [isOpen, markIsOpen, unmarkIsOpen] = useFlag();\n const {\n username, query, canShowHelp, usernameLowered,\n } = useDebouncedMemo(() => parseBotQuery(html), DEBOUNCE_MS, [html]) || {};\n const prevQuery = usePrevious(query);\n const prevUsername = usePrevious(username);\n const inlineBotData = usernameLowered ? inlineBots?.[usernameLowered] : undefined;\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 id: botId,\n isGallery,\n switchPm,\n results,\n closeTooltip: unmarkIsOpen,\n help: canShowHelp && help ? `@${username} ${help}` : undefined,\n loadMore,\n };\n}\n\nfunction parseBotQuery(html: string) {\n const text = getPlainText(html);\n const result = text.match(INLINE_BOT_QUERY_REGEXP);\n if (!result) {\n return {\n username: '',\n query: '',\n canShowHelp: false,\n usernameLowered: '',\n };\n }\n\n return {\n username: result[1],\n query: result[2],\n canShowHelp: result[2] === '' && !text.match(HAS_NEW_LINE),\n usernameLowered: result[1].toLowerCase(),\n };\n}\n\nfunction getPlainText(html: string) {\n tempEl.innerHTML = html.replace(/
/g, '\\n');\n\n return tempEl.innerText;\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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../api/types';\n\nimport { IS_TOUCH_ENV } from '../../../util/environment';\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\nconst BotKeyboardMenu: FC = ({\n isOpen, message, onClose,\n}) => {\n const { clickInlineButton } = getDispatch();\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?.keyboardButtons]);\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)(BotKeyboardMenu));\n","import React, {\n FC, memo, useCallback, useEffect,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 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\nconst FORWARD_RENDERING_DELAY = 300;\n\nconst ComposerEmbeddedMessage: FC = ({\n replyingToId,\n editingId,\n message,\n sender,\n shouldAnimate,\n forwardedMessagesCount,\n}) => {\n const {\n setReplyingToId,\n setEditingId,\n focusMessage,\n exitForwardMode,\n } = getDispatch();\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)(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, { FC, memo, useEffect } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\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 parseMessageInput from '../../../util/parseMessageInput';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useShowTransition from '../../../hooks/useShowTransition';\nimport useCurrentOrPrev from '../../../hooks/useCurrentOrPrev';\nimport useDebouncedMemo from '../../../hooks/useDebouncedMemo';\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};\n\nconst DEBOUNCE_MS = 300;\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}) => {\n const {\n loadWebPagePreview,\n clearWebPagePreview,\n toggleMessageWebPage,\n } = getDispatch();\n\n const link = useDebouncedMemo(() => {\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 }, DEBOUNCE_MS, [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)(WebPagePreview));\n","import React, { FC, memo } from '../../../lib/teact/teact';\nimport { OwnProps } from './SendAsMenu';\nimport { Bundles } from '../../../util/moduleLoader';\n\nimport useModuleLoader from '../../../hooks/useModuleLoader';\n\nconst SendAsMenuAsync: FC = (props) => {\n const { isOpen } = props;\n const SendAsMenu = useModuleLoader(Bundles.Extra, 'SendAsMenu', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return SendAsMenu ? : undefined;\n};\n\nexport default memo(SendAsMenuAsync);\n","import React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState,\n} from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { 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, SEND_MESSAGE_ACTION_INTERVAL,\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 isChatSuperGroup,\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 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 usePrevious from '../../../hooks/usePrevious';\nimport useStickerTooltip from './hooks/useStickerTooltip';\nimport useContextMenuHandlers from '../../../hooks/useContextMenuHandlers';\nimport useLang from '../../../hooks/useLang';\nimport useSendMessageAction from '../../../hooks/useSendMessageAction';\nimport useInterval from '../../../hooks/useInterval';\nimport useOnChange from '../../../hooks/useOnChange';\nimport useVoiceRecording from './hooks/useVoiceRecording';\nimport useClipboardPaste from './hooks/useClipboardPaste';\nimport useDraft from './hooks/useDraft';\nimport useEditing from './hooks/useEditing';\nimport useEmojiTooltip from './hooks/useEmojiTooltip';\nimport useMentionTooltip from './hooks/useMentionTooltip';\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';\nimport SendAsMenu from './SendAsMenu.async';\nimport Avatar from '../../common/Avatar';\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 sendAsUser?: ApiUser;\n sendAsChat?: ApiChat;\n sendAsId?: string;\n }\n & Pick;\n\nenum MainButtonState {\n Send = 'send',\n Record = 'record',\n Edit = 'edit',\n Schedule = 'schedule',\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 sendAsUser,\n sendAsChat,\n sendAsId,\n}) => {\n const {\n sendMessage,\n clearDraft,\n showDialog,\n setStickerSearchQuery,\n setGifSearchQuery,\n forwardMessages,\n openPollModal,\n closePollModal,\n loadScheduledHistory,\n openChat,\n addRecentEmoji,\n sendInlineBotResult,\n loadSendAs,\n } = getDispatch();\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 const sendAsIds = chat?.sendAsIds;\n const sendMessageAction = useSendMessageAction(chatId, threadId);\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 useEffect(() => {\n if (chatId && chat && lastSyncTime && !sendAsIds && isReady && isChatSuperGroup(chat)) {\n loadSendAs({ chatId });\n }\n }, [chat, chatId, isReady, lastSyncTime, loadSendAs, sendAsIds]);\n\n const shouldAnimateSendAsButtonRef = useRef(false);\n useOnChange(([prevChatId, prevSendAsIds]) => {\n // We only animate send-as button if `sendAsIds` was missing when opening the chat\n shouldAnimateSendAsButtonRef.current = Boolean(chatId === prevChatId && sendAsIds && !prevSendAsIds);\n }, [chatId, sendAsIds]);\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 [isSendAsMenuOpen, openSendAsMenu, closeSendAsMenu] = 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 useInterval(() => {\n sendMessageAction({ type: 'recordAudio' });\n }, activeVoiceRecording && SEND_MESSAGE_ACTION_INTERVAL);\n\n useEffect(() => {\n if (!activeVoiceRecording) {\n sendMessageAction({ type: 'cancel' });\n }\n }, [activeVoiceRecording, sendMessageAction]);\n\n const mainButtonState = editingMessage ? MainButtonState.Edit\n : (!IS_VOICE_RECORDING_SUPPORTED || activeVoiceRecording || (html && !attachments.length) || isForwarding)\n ? (shouldSchedule ? MainButtonState.Schedule : 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);\n useDraft(draft, chatId, threadId, html, htmlRef, setHtml, editingMessage);\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 closeSendAsMenu();\n openSymbolMenu();\n }, [closeBotCommandMenu, closeSendAsMenu, 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 handleSendAsMenuOpen = useCallback(() => {\n const messageInput = document.getElementById(EDITABLE_INPUT_ID)!;\n\n if (!IS_SINGLE_COLUMN_LAYOUT || messageInput !== document.activeElement) {\n closeBotCommandMenu();\n closeSymbolMenu();\n openSendAsMenu();\n return;\n }\n\n messageInput.blur();\n setTimeout(() => {\n closeBotCommandMenu();\n closeSymbolMenu();\n openSendAsMenu();\n }, MOBILE_KEYBOARD_HIDE_DELAY_MS);\n }, [closeBotCommandMenu, closeSymbolMenu, openSendAsMenu]);\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 handleSend();\n break;\n case MainButtonState.Record:\n void startRecordingVoice();\n break;\n case MainButtonState.Edit:\n handleEditComplete();\n break;\n case MainButtonState.Schedule:\n if (activeVoiceRecording) {\n pauseRecordingVoice();\n }\n openCalendar();\n break;\n default:\n break;\n }\n }, [\n mainButtonState, handleSend, startRecordingVoice, handleEditComplete,\n activeVoiceRecording, openCalendar, pauseRecordingVoice,\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 : mainButtonState === MainButtonState.Schedule ? openCalendar\n : 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
\n {isChatWithBot && botCommands !== false && !activeVoiceRecording && !editingMessage && (\n \n \n \n )}\n {!!sendAsIds?.length && (sendAsUser || sendAsChat) && (\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 \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 const usersById = global.users.byId;\n const chatsById = global.chats.byId;\n const { currentUserId } = global;\n const sendAsId = chat?.fullInfo ? chat?.fullInfo?.sendAsId || currentUserId : undefined;\n const sendAsUser = sendAsId ? usersById?.[sendAsId] : undefined;\n const sendAsChat = !sendAsUser && sendAsId ? chatsById?.[sendAsId] : 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,\n usersById,\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 sendAsUser,\n sendAsChat,\n sendAsId,\n };\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({\n emoji: IS_EMOJI_SUPPORTED ? cleanHtml : cleanHtml.match(/alt=\"(.+)\"/)?.[1],\n });\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';\nimport { getDispatch } from '../../../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../../../api/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) => {\n const { editMessage } = getDispatch();\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, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './EmojiInteractionAnimation';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst EmojiInteractionAnimationAsync: FC = (props) => {\n const { emojiInteraction } = props;\n const EmojiInteractionAnimation = useModuleLoader(Bundles.Extra, 'EmojiInteractionAnimation', !emojiInteraction);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return EmojiInteractionAnimation ? : undefined;\n};\n\nexport default memo(EmojiInteractionAnimationAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { OwnProps } from './ReactorListModal';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst ReactorListModalAsync: FC = (props) => {\n const { isOpen } = props;\n const ReactorListModal = useModuleLoader(Bundles.Extra, 'ReactorListModal', !isOpen);\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return ReactorListModal ? : undefined;\n};\n\nexport default memo(ReactorListModalAsync);\n","import React, {\n FC, useEffect, useState, memo, useMemo, useCallback,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChatBannedRights, MAIN_THREAD_ID } from '../../api/types';\nimport {\n MessageListType,\n MessageList as GlobalMessageList,\n ActiveEmojiInteraction,\n} 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 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 useForceUpdate from '../../hooks/useForceUpdate';\nimport useOnChange from '../../hooks/useOnChange';\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';\nimport EmojiInteractionAnimation from './EmojiInteractionAnimation.async';\nimport ReactorListModal from './ReactorListModal.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 isReactorListModalOpen: 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 activeEmojiInteraction?: ActiveEmojiInteraction;\n};\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 isReactorListModalOpen,\n animationLevel,\n shouldSkipHistoryAnimations,\n currentTransitionKey,\n isChannel,\n canSubscribe,\n canStartBot,\n canRestartBot,\n activeEmojiInteraction,\n}) => {\n const {\n openChat,\n unpinAllMessages,\n loadUser,\n closeLocalTextSearch,\n exitMessageSelectMode,\n closePaymentModal,\n clearReceipt,\n joinChannel,\n sendBotCommand,\n restartBot,\n } = getDispatch();\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\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\n const cleanupExceptionKey = (\n prevTransitionKey !== undefined && prevTransitionKey < currentTransitionKey ? prevTransitionKey : undefined\n );\n\n const { isReady, handleOpenEnd, handleSlideStop } = useIsReady(\n animationLevel, currentTransitionKey, prevTransitionKey, chatId,\n );\n\n useEffect(() => {\n return chatId\n ? captureEscKeyListener(() => {\n openChat({ id: undefined });\n })\n : undefined;\n }, [chatId, openChat]);\n\n useOnChange(() => {\n setDropAreaState(DropAreaState.None);\n setIsFabShown(undefined);\n setIsNotchShown(undefined);\n }, [chatId]);\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 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 \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
\n {IS_SINGLE_COLUMN_LAYOUT && }\n \n )}\n {chatId && (\n \n )}\n {activeEmojiInteraction && (\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 }, activeEmojiInteraction } = 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 isReactorListModalOpen: Boolean(global.reactorModal),\n animationLevel: global.settings.byKey.animationLevel,\n currentTransitionKey: Math.max(0, global.messages.messageLists.length - 1),\n activeEmojiInteraction,\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)(MiddleColumn));\n\nfunction useIsReady(\n animationLevel?: number,\n currentTransitionKey?: number,\n prevTransitionKey?: number,\n chatId?: string,\n) {\n const [isReady, setIsReady] = useState(!IS_SINGLE_COLUMN_LAYOUT);\n const forceUpdate = useForceUpdate();\n\n const willSwitchMessageList = prevTransitionKey !== undefined && prevTransitionKey !== currentTransitionKey;\n if (willSwitchMessageList) {\n if (animationLevel !== ANIMATION_LEVEL_MIN) {\n setIsReady(false);\n } else {\n forceUpdate();\n }\n }\n\n useOnChange(() => {\n if (animationLevel === ANIMATION_LEVEL_MIN) {\n setIsReady(true);\n }\n }, [animationLevel]);\n\n function handleOpenEnd(e: React.TransitionEvent) {\n if (e.propertyName === 'transform' && e.target === e.currentTarget) {\n setIsReady(Boolean(chatId));\n }\n }\n\n function handleSlideStop() {\n setIsReady(true);\n }\n\n return {\n isReady: isReady && !willSwitchMessageList,\n handleOpenEnd: animationLevel !== ANIMATION_LEVEL_MIN ? handleOpenEnd : undefined,\n handleSlideStop: animationLevel !== ANIMATION_LEVEL_MIN ? handleSlideStop : undefined,\n };\n}\n","import React, {\n FC, memo, useCallback, useEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ManagementScreens, ProfileState } from '../../types';\n\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { debounce } from '../../util/schedulers';\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, isChatAdmin, isChatChannel, 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 isEditingInvite?: boolean;\n};\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 ManageGroupNewAdminRights,\n ManageGroupMembers,\n ManageGroupAddAdmins,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n ManageInvites,\n ManageEditInvite,\n ManageReactions,\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 shouldSkipAnimation,\n isEditingInvite,\n}) => {\n const {\n setLocalTextSearchQuery,\n setStickerSearchQuery,\n setGifSearchQuery,\n searchTextMessagesLocal,\n toggleManagement,\n openHistoryCalendar, addContact,\n } = getDispatch();\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.ChatNewAdminRights ? (\n HeaderContent.ManageGroupNewAdminRights\n ) : managementScreen === ManagementScreens.GroupMembers ? (\n HeaderContent.ManageGroupMembers\n ) : managementScreen === ManagementScreens.Invites ? (\n HeaderContent.ManageInvites\n ) : managementScreen === ManagementScreens.EditInvite ? (\n HeaderContent.ManageEditInvite\n ) : managementScreen === ManagementScreens.GroupAddAdmins ? (\n HeaderContent.ManageGroupAddAdmins\n ) : managementScreen === ManagementScreens.Reactions ? (\n HeaderContent.ManageReactions\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(isChannel ? 'ChannelAddSubscribers' : '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.ManageGroupNewAdminRights:\n return

{lang('SetAsAdmin')}

;\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.ManageInvites:\n return

{lang('lng_group_invite_title')}

;\n case HeaderContent.ManageEditInvite:\n return

{isEditingInvite ? lang('EditLink') : lang('NewLink')}

;\n case HeaderContent.ManageGroupAddAdmins:\n return

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

;\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 case HeaderContent.ManageReactions:\n return

{lang('Reactions')}

;\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 const isEditingInvite = Boolean(chatId && global.management.byChatId[chatId]?.editingInvite);\n\n return {\n canManage,\n canAddContact,\n isChannel,\n userId: user?.id,\n messageSearchQuery,\n stickerSearchQuery,\n gifSearchQuery,\n isEditingInvite,\n };\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 { getDispatch, 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 {\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 { 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 isChatProtected?: boolean;\n};\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 isChatProtected,\n}) => {\n const {\n setLocalMediaSearchType,\n loadMoreMembers,\n loadCommonChats,\n openChat,\n searchMediaMessagesLocal,\n openMediaViewer,\n openAudioPlayer,\n openUserInfo,\n focusMessage,\n loadProfilePhotos,\n setNewChatMembersDialogState,\n } = getDispatch();\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 isChatProtected: chat?.isProtected,\n ...(hasMembersTab && members && { members }),\n ...(hasCommonChatsTab && user && { commonChatIds: user.commonChats?.ids }),\n };\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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiChatMember, ApiUpdateConnectionStateType,\n} from '../../api/types';\nimport { NewChatMembersProgress } from '../../types';\n\nimport { 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\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 onClose,\n isActive,\n}) => {\n const { setUserSearchQuery, loadContactList } = getDispatch();\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)(AddChatMembers));\n","import React, {\n FC, memo, useCallback, useEffect, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\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 {\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\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 shouldSkipHistoryAnimations,\n}) => {\n const {\n toggleChatInfo,\n toggleManagement,\n openUserInfo,\n closeLocalTextSearch,\n setStickerSearchQuery,\n setGifSearchQuery,\n closePollResults,\n addChatMembers,\n setNewChatMembersDialogState,\n setEditingExportedInvite,\n } = getDispatch();\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 case ManagementScreens.Invites:\n case ManagementScreens.Reactions:\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.ChatNewAdminRights:\n case ManagementScreens.GroupAddAdmins:\n case ManagementScreens.GroupRecentActions:\n setManagementScreen(ManagementScreens.ChatAdministrators);\n break;\n case ManagementScreens.EditInvite:\n setManagementScreen(ManagementScreens.Invites);\n setEditingExportedInvite({ chatId, invite: undefined });\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 setEditingExportedInvite, chatId,\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { 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';\n\ntype StateProps = {\n activeDownloads: Record;\n messages: Record;\n threadsById: Record;\n }>;\n};\n\nconst startedDownloads = new Set();\n\nconst DownloadManager: FC = ({\n activeDownloads,\n messages,\n}) => {\n const { cancelMessageMediaDownload } = getDispatch();\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)(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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { LangCode } from '../../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 {\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 stopEvent from '../../util/stopEvent';\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 addedSetIds?: string[];\n};\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 addedSetIds,\n}) => {\n const {\n loadAnimatedEmojis,\n loadNotificationSettings,\n loadNotificationExceptions,\n updateIsOnline,\n loadTopInlineBots,\n loadEmojiKeywords,\n loadCountryList,\n loadAvailableReactions,\n loadStickerSets,\n loadAddedStickers,\n loadFavoriteStickers,\n ensureTimeFormat,\n openStickerSetShortName,\n checkVersionNotification,\n loadAppConfig,\n } = getDispatch();\n const isSynced = Boolean(lastSyncTime);\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 loadAppConfig();\n loadAvailableReactions();\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, loadAvailableReactions, loadAppConfig,\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 // Sticker sets\n useEffect(() => {\n if (isSynced) {\n if (!addedSetIds) {\n loadStickerSets();\n loadFavoriteStickers();\n } else {\n loadAddedStickers();\n }\n }\n }, [isSynced, addedSetIds, loadStickerSets, loadFavoriteStickers, loadAddedStickers]);\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 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 addedSetIds: global.stickers.added.setIds,\n };\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","reactorModal","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","noWebPage","selectNoWebPage","sendAs","selectSendAs","clearWebPagePreview","value","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","currentUserId","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","sendAsId","sendAsChat","selectUser","fullInfo","sendAsIds","updateSponsoredMessage","selectSponsoredMessage","random","randomId","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","animatedEmojiEffects","loadAnimatedEmojiEffects","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","invite","editingInvite","loadAndReplaceArchivedChats","CHAT_LIST_LOAD_SLICE","archived","withPinned","updateUsers","addUserStatuses","userStatusesById","updateChats","replaceChatListIds","updateChatListSecondaryInfo","loadAndUpdateUsers","contactIds","contactList","updatedUsers","loadTopMessages","afterSyncCallback","DEBUG","console","log","savedUsers","lastLocalServiceMessage","selectLastServiceNotification","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","deleteContact","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","MAX_MESSAGES_LIST_WIDTH","SIDE_COLUMN_MAX_WIDTH","MIN_LEFT_COLUMN_WIDTH","subtractXForEmojiInteraction","x","windowWidth","windowSize","width","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","min","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","availableReaction","aroundAnimation","mediaLoader","ApiMediaFormat","centerIcon","availableReactions","y","localEffect","startSize","isReversed","activeEmojiInteraction","animatedEffect","interactions","startX","startY","emoticon","selectLocalAnimatedEmojiEffectByName","timestamps","endX","endY","reaction","selectDefaultReaction","sendReaction","reactions","some","isChosen","animationLevel","settings","byKey","ANIMATION_LEVEL_MAX","activeReactions","omit","recentReactions","canSeeList","addMessageReaction","appConfig","defaultReaction","reactors","runThrottledForUpdateAppBadge","update","noTopChatsRequest","selectIsChatListed","loadTopChats","newProfilePhoto","closeMessageNotifications","listType","selectChatListType","updateChatListIds","isNotJoined","requestChatUpdate","leaveChat","typingStatus","senderId","isFromScheduled","hasUnreadMention","unreadMentionsCount","notifyAboutNewMessage","messageUpdate","channelId","selectCommonBoxChatId","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","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","localEmoji","selectLocalAnimatedEmoji","selectLocalAnimatedEmojiEffect","scheduledIds","selectScheduledIds","selectIsChatWithBot","selectScheduledMessages","deleteChatScheduledMessages","thread","markMessageListRead","currentPinnedIds","selectPinnedIds","newPinnedIds","newTheadInfo","messagesById","loadFullChat","scheduledMessages","deleteScheduledMessages","pollId","pollUpdate","selectChatMessageByPollId","updatedPoll","updatedResults","chosenAnswers","chosenAnswer","chosenAnswerIndex","recentVoterIds","totalVoters","newRecentVoterIds","newTotalVoters","targetOption","targetOptionIndex","updatedOption","votersCount","selectIsServiceChatReady","flushStatusUpdatesThrottled","pendingStatusUpdates","statusUpdate","status","targetUser","isBlocked","addBlockedContact","privacy","key","rules","updateNotifySettings","peerType","shouldShowPreviews","addNotifyException","twoFaSettings","call","connectionState","groupCalls","activeGroupCallId","leaveGroupCall","shouldRemove","removeGroupCall","updateGroupCall","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","globalSearchChatId","searchDate","theme","selectTheme","contactsFilter","onSearchQuery","onSelectSettings","onSelectContacts","onSelectArchived","onReset","shouldSkipTransition","openTipsChat","setGlobalSearchDate","setSettingOption","setGlobalSearchChatId","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","handleAnimationLevelChange","newLevel","_","body","classList","toggle","isSearchFocused","searchInputPlaceholder","DropdownMenu","trigger","footer","APP_NAME","MenuItem","icon","Switcher","label","checked","noAnimation","toLowerCase","langCode","href","FEEDBACK_URL","setPermanentWebVersion","clearWebsync","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","ALL_FOLDER_ID","handleSwitchTab","forceOnHeavyAnimation","current","captureEvents","selectorToPreventScroll","onSwipe","SwipeDirection","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","IS_MAC_OS","metaKey","getKeyFromEvent","initResize","resetResize","handleMouseUp","elementRef","onResize","initialWidth","markIsActive","unmarkIsActive","initialMouseX","setInitialMouseX","initialElementWidth","setInitialElementWidth","style","remove","handleMouseMove","event","newWidth","ceil","clientX","stopDrag","offsetWidth","add","useResize","handleSettingsScreenSelect","screen","LAYERS_ANIMATION_NAME","currentScreen","isChannel","onMouseDown","onMouseUp","onDoubleClick","setSize","handleResize","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","right","bottom","handleHeaderMenuClose","handleHeaderMenuHide","handleSubscribeClick","handleStartBot","handleRestartBot","handleSearchClick","focus","searchInput","IS_PWA","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","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","useWindowSize","isLeftColumnHideable","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","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","getRatios","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","QUICK_REACTION_AREA_WIDTH","QUICK_REACTION_AREA_HEIGHT","GROUP_MESSAGE_HOVER_ATTRIBUTE","useOuterHandlers","selectMessage","isInSelectMode","canReply","isProtected","onContextMenu","handleBeforeContextMenu","isContextMenuShown","contentRef","shouldHandleMouseLeave","sendDefaultReaction","isQuickReactionVisible","markQuickReactionVisible","unmarkQuickReactionVisible","isSwiped","markSwiped","unmarkSwiped","doubleTapTimeoutRef","startedAt","onRelease","handleMouseDown","preventMessageInputBlur","clearInterval","pageX","pageY","handleDoubleTap","target","contains","handleTap","handleContextMenu","stopEvent","matches","handleDoubleClick","handleContentDoubleClick","container","clientY","isVisibleX","isVisibleY","handleSendQuickReaction","currentTarget","lastGroupElement","getLastElementInDocumentGroup","removeAttribute","handleDocumentGroupMouseLeave","handleDocumentGroupMouseEnter","setAttribute","nextElementSibling","ContextMenuContainer","targetUserIds","targetChatId","targetMessageId","targetMessage","selectIsMessageFocused","focusedMessage","observeIntersection","isEmbedded","appearanceOrder","isLastInList","useOnIntersect","noAppearanceAnimation","markShown","targetUsers","renderActionMessageText","asPlain","isContextMenuOpen","contextMenuPosition","handleContextMenuClose","handleContextMenuHide","useContextMenuHandlers","customText","isIntersecting","useIsIntersecting","pictogramId","isRoundVideo","getMessageRoundVideo","senderTitle","draggable","activeReaction","isInMeta","stopActiveReaction","r","centerIconId","effectId","mediaDataCenterIcon","mediaDataEffect","shouldPlay","shouldRenderAnimation","animationClassNames","handleEnded","isAnimationLoaded","markAnimationLoaded","unmarkAnimationLoaded","shouldRenderStatic","ReactionStaticEmoji","AnimatedSticker","animationData","play","noLoop","onLoad","onEnded","outgoingStatus","signature","withReactions","withReactionOffset","isActivated","markActivated","createDateTime","formatDateTimeToString","editDateTime","isEdited","editDate","forwardedDateTime","replace","views","formatTime","MessageOutgoingStatus","observeIntersectionForPlaying","shouldLoop","isModalOpen","openModal","closeModal","isAnimated","isMemojiSticker","MEMOJI_STICKER_ID","shouldLoad","mediaHash","getMessageMediaFormat","isMediaLoaded","isMediaReady","useMediaTransition","getStickerDimensions","thumbClassName","stickerClassName","fromSticker","useBlurredMediaThumbRef","fullMediaData","useCanvasBlur","IS_CANVAS_FILTER_SUPPORTED","SELECTED_APPENDIX_COLORS","dark","outgoing","incoming","light","canAutoLoad","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","ProgressSpinner","useVideoAutoPause","playerRef","canPlay","wasPlaying","paused","canPlayRef","freezePlaying","unfreezePlaying","safePlay","unfreezePlayingOnRaf","fastRaf","useBackgroundMode","canAutoPlay","videoRef","getMessageWebPageVideo","isPlayAllowed","setIsPlayAllowed","previewClassNames","isInline","isBuffered","bufferingHandlers","useBuffering","shouldRenderPlayButton","playButtonClassNames","playProgress","setPlayProgress","handleTimeUpdate","currentTime","duration","useVideoCleanup","cancelMessageMediaDownload","autoPlay","muted","loop","playsInline","onTimeUpdate","isGif","formatMediaDuration","contact","countryList","phoneCodes","phoneCodeList","openUserInfo","formatPhoneNumberWithCode","getPercentage","toFixed","answer","voteResults","maxVotersCount","correctResults","shouldAnimate","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","setIsActivated","setProgress","svgCenter","ROUND_VIDEO_DIMENSIONS_PX","playerEl","playingProgressEl","stopPlaying","capturePlaying","stopCurrentAudio","videoClassName","recentReplierIds","recentRepliers","hasUnread","recentReactors","recentReaction","isOutside","metaChildren","localSticker","soundId","playKey","useAnimatedEmoji","localStickerAnimationData","setLocalStickerAnimationData","getAnimationData","quality","APPENDIX_OWN","__html","APPENDIX_NOT_OWN","withSenderName","withAvatar","isLastInDocumentGroup","viaBotId","replyToChatId","isRepliesChat","isChatWithRepliesBot","chatUsername","forceSenderName","isAnonymousOwnMessage","canShowSender","originSender","botSender","threadTopMessageId","isThreadTop","shouldHideReply","replyMessageSender","selectUploadProgress","isForwarding","highlight","singleEmoji","getMessageSingleEmoji","every","selectIsDownloading","actualThreadInfo","isInDocumentGroup","documentGroupFirstMessageId","reactionMessage","selectIsMessageProtected","isSingleEmoji","animatedEmoji","selectAnimatedEmoji","animatedEmojiEffect","selectAnimatedEmojiEffect","animatedEmojiSoundId","selectAnimatedEmojiSound","isGroupSelected","selectIsDocumentGroupSelected","isPinnedList","canAutoLoadMedia","canAutoPlayMedia","autoLoadFileMaxSizeMb","shouldLoopStickers","selectShouldLoopStickers","selectOutgoingStatus","observeIntersectionForBottom","observeIntersectionForMedia","observeIntersectionForAnimatedStickers","areReactionsInMeta","noComments","isFirstInGroup","isLastInGroup","isFirstInDocumentGroup","clickInlineButton","bottomMarkerRef","isLocal","hasReply","isReplyMessage","hasThread","getMessageCustomShape","hasAnimatedEmoji","asForwarded","isLinkedChannelPost","isInDocumentGroupNotFirst","isInDocumentGroupNotLast","canShowActionButton","canForward","canFocus","isChannelPost","fromMessageId","withCommentButton","withQuickReactionButton","avatarPeer","senderPeer","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","withAppendix","textParts","renderMessageText","metaPosition","reactionsPosition","areReactionsEmpty","calculatedWidth","noMediaCorners","extraPadding","adminTitle","metaSafeAuthorWidth","renderReactionsAndMeta","meta","onMouseMove","isAvatarPeerUser","avatarUser","avatarChat","hiddenName","renderAvatar","textContentClass","senderColor","getUserColorKey","renderSenderName","AnimatedEmoji","effect","forceLoadPreview","Audio","AudioOrigin","isSelectable","onPlay","onReadMedia","Document","renderContent","dangerouslySetInnerHTML","isBot","channel","viewSponsoredMessage","openChatByInvite","startBot","shouldObserve","observe","useIntersectionObserver","rootRef","debounceMs","threshold","getUserFullName","chatInviteTitle","chatInviteHash","messageGroups","isViewportNewest","withUsers","anchorIdRef","memoUnreadDividerBeforeIdRef","memoFirstUnreadIdRef","isScrollingRef","isScrollPatchNeededRef","hasLinkedChat","isSchedule","onFabToggle","onNotchToggle","openHistoryCalendar","observeIntersectionForReading","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","handleStickerSelect","selectedSticker","StickerButton","isGroupChatJustCreated","renderScheduled","renderSavedMessages","renderGroup","runDebouncedForScroll","selectCurrentMessageIds","restrictionReason","focusingId","withLastMessageWhenPreloading","chatBot","botDescription","isChatLoaded","isChannelChat","isGroupChat","isChatGroup","threadFirstMessageId","selectFirstMessageId","linkedChatId","hasTools","canPost","withBottomShift","setScrollOffset","loadSponsoredMessages","loadMessageReactions","scrollOffsetRef","selectScrollOffset","anchorTopRef","listItemElementsRef","memoFocusingIdRef","isScrollTopJustUpdatedRef","shouldAnimateAppearanceRef","setContainerHeight","onTickEnd","listedMessages","orderBy","useInterval","loadMoreAround","isScrolled","updateStickyDates","markIsScrolled","runDebounced","useDebounce","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","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","useDebouncedMemo","INLINE_BOT_QUERY_REGEXP","HAS_NEW_LINE","tempEl","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","SendAsMenu","MainButtonState","chatUser","selectChatUser","REPLIES_USER_ID","messageWithActualBotKeyboard","selectNewestMessageWithBotKeyboardButtons","shouldSuggestStickers","baseEmojiKeywords","BASE_EMOJI_KEYWORD_LANG","botKeyboardMessageId","keyboardMessage","sendAsUser","editingMessage","canScheduleUntilOnline","selectUserStatus","wasOnline","withScheduledButton","shouldSchedule","botKeyboardPlaceholder","keyboardPlaceholder","stickersForEmoji","groupChatMembers","topInlineBotIds","isInlineBotLoading","chatBotCommands","botCommands","dropAreaState","onDropHide","clearDraft","setStickerSearchQuery","setGifSearchQuery","closePollModal","addRecentEmoji","sendInlineBotResult","loadSendAs","appendixRef","html","setHtml","lastMessageSendTimeSeconds","prevDropAreaState","isCalendarOpen","openCalendar","closeCalendar","scheduledMessageArgs","setScheduledMessageArgs","sendMessageAction","useSendMessageAction","htmlRef","shouldAnimateSendAsButtonRef","prevChatId","prevSendAsIds","setAttachments","isBotKeyboardOpen","openBotKeyboard","closeBotKeyboard","isBotCommandMenuOpen","openBotCommandMenu","closeBotCommandMenu","isAttachMenuOpen","openAttachMenu","closeAttachMenu","isSymbolMenuOpen","openSymbolMenu","closeSymbolMenu","isSendAsMenuOpen","openSendAsMenu","closeSendAsMenu","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","SEND_MESSAGE_ACTION_INTERVAL","mainButtonState","Edit","Schedule","Send","Record","canShowCustomSendMenu","isMentionTooltipOpen","closeMentionTooltip","insertMention","mentionFilteredUsers","useMentionTooltip","isInlineBotTooltipOpen","inlineBotId","isInlineBotTooltipGallery","inlineBotSwitchPm","inlineBotResults","closeTooltip","closeInlineBotTooltip","inlineBotHelp","loadMore","loadMoreForInlineBot","queryInlineBot","resetInlineBot","markIsOpen","unmarkIsOpen","canShowHelp","usernameLowered","innerText","getPlainText","parseBotQuery","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","editMessage","hasMessageMedia","useEditing","saveDraft","updateDraft","draftChatId","draftThreadId","runDebouncedForSaveDraft","DRAFT_DEBOUNCE","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","handleSendAsMenuOpen","handleAllScheduledClick","mainButtonHandler","areVoiceMessagesNotAllowed","canAttachMedia","prevEditedMessage","renderedEditedMessage","scheduledDefaultDate","setSeconds","setMilliseconds","scheduledMaxDate","setFullYear","getFullYear","sendButtonAriaLabel","symbolMenuButtonClassName","onSend","Portal","DropAreaState","withQuick","onHide","onFileSelect","caption","onCaptionUpdate","onFileAppend","onClear","selectedSendAsId","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","emojiInteraction","EmojiInteractionAnimation","ReactorListModal","CLOSE_ANIMATION_DURATION","isImage","isBlurred","isBackgroundBlurred","background","customBackground","backgroundColor","patternColor","themes","isMobileSearchActive","isReceiptModalOpen","isSeenByModalOpen","isReactorListModalOpen","getCanPostInChat","isBotNotStarted","isPinnedMessageList","isScheduledMessageList","currentUserBannedRights","defaultBannedRights","hasPinnedOrAudioPlayer","loadUser","closePaymentModal","clearReceipt","setDropAreaState","isFabShown","setIsFabShown","isNotchShown","setIsNotchShown","isUnpinModalOpen","setIsUnpinModalOpen","renderingChatId","usePrevDuringAnimation","renderingThreadId","renderingMessageListType","renderingCanSubscribe","renderingCanStartBot","renderingCanRestartBot","renderingCanPost","renderingHasTools","renderingIsFabShown","renderingIsChannel","prevTransitionKey","handleOpenEnd","handleSlideStop","setIsReady","forceUpdate","useForceUpdate","willSwitchMessageList","ANIMATION_LEVEL_MIN","propertyName","useIsReady","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","DARK_THEME_BG_COLOR","LIGHT_THEME_BG_COLOR","onDragEnter","onStop","onUnpin","HeaderContent","isProfile","isManagement","messageSearchQuery","stickerSearchQuery","selectCurrentStickerSearch","gifSearchQuery","selectCurrentGifSearch","canAddContact","getCanAddContact","canManage","isEditingInvite","isColumnOpen","isSearch","isStickerSearch","isGifSearch","isPollResults","isAddingChatMembers","profileState","managementScreen","shouldSkipAnimation","setLocalTextSearchQuery","searchTextMessagesLocal","toggleManagement","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","ManageGroupNewAdminRights","ManageGroupMembers","ManageInvites","ManageEditInvite","ManageGroupAddAdmins","ManageReactions","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","isChatProtected","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","setEditingExportedInvite","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","loadAvailableReactions","loadAddedStickers","ensureTimeFormat","openStickerSetShortName","checkVersionNotification","loadAppConfig","isSynced","LOCATION_HASH","processDeepLink","decodeURIComponent","middleColumnTransitionClassNames","rightColumnTransitionClassNames","prevIsLeftColumnShown","dispatchHeavyAnimationEnd","waitForTransitionEnd","prevIsRightColumnShown","initialUnread","setInterval","INACTIVE_MARKER","newUnread","PAGE_TITLE","handleStickerSetModalClose","usePreventPinchZoomGesture","onDrop","onDragOver","initApi"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/802.ad1608fd78ee08b3bcb1.js b/dist/802.ad1608fd78ee08b3bcb1.js new file mode 100644 index 000000000..eb3fc38b3 --- /dev/null +++ b/dist/802.ad1608fd78ee08b3bcb1.js @@ -0,0 +1,3 @@ +/*! For license information please see 802.ad1608fd78ee08b3bcb1.js.LICENSE.txt */ +(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[802],{5802:function(e,t){!function(e){"use strict";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,s=0;for(;0!==i;){s=i>2e3?2e3:i,i-=s;do{a=a+t[n++]|0,r=r+a|0}while(--s);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,s=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,s,o,l,d,h,c,f,u,w,b,k,m,_,g,v,p,x,y,E,A;const R=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,A=e.output,r=a-(t-e.avail_out),s=a+(e.avail_out-257),o=R.dmax,l=R.wsize,d=R.whave,h=R.wnext,c=R.window,f=R.hold,u=R.bits,w=R.lencode,b=R.distcode,k=(1<>>24,f>>>=g,u-=g,g=_>>>16&255,0===g)A[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(f&(1<>>=g,u-=g),u<15&&(f+=E[i++]<>>24,f>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(f&(1<o){e.msg="invalid distance too far back",R.mode=30;break e}if(f>>>=g,u-=g,g=a-r,p>g){if(g=p-g,g>d&&R.sane){e.msg="invalid distance too far back",R.mode=30;break e}if(x=0,y=c,0===h){if(x+=l-g,g2;)A[a++]=y[x++],A[a++]=y[x++],A[a++]=y[x++],v-=3;v&&(A[a++]=y[x++],v>1&&(A[a++]=y[x++]))}else{x=a-p;do{A[a++]=A[x++],A[a++]=A[x++],A[a++]=A[x++],v-=3}while(v>2);v&&(A[a++]=A[x++],v>1&&(A[a++]=A[x++]))}break}}break}}while(i>3,i-=v,u-=v<<3,f&=(1<{const u=f.bits;let w,b,k,m,_,g,v=0,p=0,x=0,y=0,E=0,A=0,R=0,Z=0,S=0,T=0,O=null,U=0;const D=new Uint16Array(16),B=new Uint16Array(16);let C,N,I,z=null,F=0;for(v=0;v<=r;v++)D[v]=0;for(p=0;p=1&&0===D[y];y--);if(E>y&&(E=y),0===y)return a[h++]=20971520,a[h++]=20971520,f.bits=1,0;for(x=1;x0&&(0===e||1!==y))return-1;for(B[1]=0,v=1;v852||2===e&&S>592)return 1;for(;;){C=v-R,c[p]g?(N=z[F+c[p]],I=O[U+c[p]]):(N=96,I=0),w=1<>R)+b]=C<<24|N<<16|I|0}while(0!==b);for(w=1<>=1;if(0!==w?(T&=w-1,T+=w):T=0,p++,0==--D[v]){if(v===y)break;v=t[i+c[p]]}if(v>E&&(T&m)!==k){for(0===R&&(R=E),_+=x,A=v-R,Z=1<852||2===e&&S>592)return 1;k=T&m,a[k]=E<<24|A<<16|_-h|0}}return 0!==T&&(a[_+T]=v-R<<24|64<<16|0),f.bits=E,0},c={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:f,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:v,Z_BUF_ERROR:p,Z_DEFLATED:x}=c,y=12,E=30,A=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function R(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},T=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},O=(e,t)=>{if(!e)return _;const i=new R;e.state=i,i.window=null;const n=T(e,t);return n!==b&&(e.state=null),n};let U,D,B=!0;const C=e=>{if(B){U=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(h(1,e.lens,0,288,U,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;h(2,e.lens,0,32,D,0,e.work,{bits:5}),B=!1}e.lencode=U,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whave{let r,s,o,l,d,c,R,Z,S,T,O,U,D,B,I,z,F,L,M,H,j,P,K=0;const Y=new Uint8Array(4);let X,G;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===y&&(r.mode=13),d=e.next_out,o=e.output,R=e.avail_out,l=e.next_in,s=e.input,c=e.avail_in,Z=r.hold,S=r.bits,T=c,O=R,P=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===c)break e;c--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg="incorrect header check",r.mode=E;break}if((15&Z)!==x){e.msg="unknown compression method",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg="invalid window size",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===c)break e;c--,Z+=s[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===c)break e;c--,Z+=s[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===c)break e;c--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(U=r.length,U>c&&(U=c),U&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(l,l+U),j)),512&r.flags&&(r.check=n(r.check,s,U,l)),c-=U,l+=U,r.length-=U),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===c)break e;U=0;do{j=s[l+U++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&U>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=y;break;case 10:for(;S<32;){if(0===c)break e;c--,Z+=s[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===c)break e;c--,Z+=s[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(C(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg="invalid block type",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===c)break e;c--,Z+=s[l++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(U=r.length,U){if(U>c&&(U=c),U>R&&(U=R),0===U)break e;o.set(s.subarray(l,l+U),d),c-=U,l+=U,R-=U,d+=U,r.length-=U;break}r.mode=y;break;case 17:for(;S<14;){if(0===c)break e;c--,Z+=s[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,X={bits:r.lenbits},P=h(0,r.lens,0,19,r.lencode,0,r.work,X),r.lenbits=X.bits,P){e.msg="invalid code lengths set",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=K>>>16&255,F=65535&K,!(I<=S);){if(0===c)break e;c--,Z+=s[l++]<>>=I,S-=I,r.lens[r.have++]=F;else{if(16===F){for(G=I+2;S>>=I,S-=I,0===r.have){e.msg="invalid bit length repeat",r.mode=E;break}j=r.lens[r.have-1],U=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(G=I+3;S>>=I,S-=I,j=0,U=3+(7&Z),Z>>>=3,S-=3}else{for(G=I+7;S>>=I,S-=I,j=0,U=11+(127&Z),Z>>>=7,S-=7}if(r.have+U>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=E;break}for(;U--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=E;break}if(r.lenbits=9,X={bits:r.lenbits},P=h(1,r.lens,0,r.nlen,r.lencode,0,r.work,X),r.lenbits=X.bits,P){e.msg="invalid literal/lengths set",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,X={bits:r.distbits},P=h(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,X),r.distbits=X.bits,P){e.msg="invalid distances set",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(c>=6&&R>=258){e.next_out=d,e.avail_out=R,e.next_in=l,e.avail_in=c,r.hold=Z,r.bits=S,a(e,O),d=e.next_out,o=e.output,R=e.avail_out,l=e.next_in,s=e.input,c=e.avail_in,Z=r.hold,S=r.bits,r.mode===y&&(r.back=-1);break}for(r.back=0;K=r.lencode[Z&(1<>>24,z=K>>>16&255,F=65535&K,!(I<=S);){if(0===c)break e;c--,Z+=s[l++]<>L)],I=K>>>24,z=K>>>16&255,F=65535&K,!(L+I<=S);){if(0===c)break e;c--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=I,S-=I,r.back+=I,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=y;break}if(64&z){e.msg="invalid literal/length code",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(G=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;K=r.distcode[Z&(1<>>24,z=K>>>16&255,F=65535&K,!(I<=S);){if(0===c)break e;c--,Z+=s[l++]<>L)],I=K>>>24,z=K>>>16&255,F=65535&K,!(L+I<=S);){if(0===c)break e;c--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=I,S-=I,r.back+=I,64&z){e.msg="invalid distance code",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(G=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=E;break}r.mode=25;case 25:if(0===R)break e;if(U=O-R,r.offset>U){if(U=r.offset-U,U>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=E;break}U>r.wnext?(U-=r.wnext,D=r.wsize-U):D=r.wnext-U,U>r.length&&(U=r.length),B=r.window}else B=o,D=d-r.offset,U=r.length;U>R&&(U=R),R-=U,r.length-=U;do{o[d++]=B[D++]}while(--U);0===r.length&&(r.mode=21);break;case 26:if(0===R)break e;o[d++]=r.length,R--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===c)break e;c--,Z|=s[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},M=(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},H=(e,i)=>{const n=i.length;let a,r,s;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(s=N(e,i,n,n),s?(a.mode=31,v):(a.havedict=1,b))):_};const j=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var P=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const t in i)j(i,t)&&(e[t]=i[t])}}return e},K=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;X[254]=X[254]=1;var G=e=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,i,n,a,r,s=e.length,o=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},W=(e,t)=>{const i=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let n,a;const r=new Array(2*i);for(a=0,n=0;n4)r[a++]=65533,n+=s-1;else{for(t&=2===s?31:3===s?15:7;s>1&&n1?r[a++]=65533:t<65536?r[a++]=t:(t-=65536,r[a++]=55296|t>>10&1023,r[a++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&Y)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+X[e[i]]>t?i:t},J={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"};var Q=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};var V=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const $=Object.prototype.toString,{Z_NO_FLUSH:ee,Z_FINISH:te,Z_OK:ie,Z_STREAM_END:ne,Z_NEED_DICT:ae,Z_STREAM_ERROR:re,Z_DATA_ERROR:se,Z_MEM_ERROR:oe}=c;function le(e){this.options=P({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new Q,this.strm.avail_out=0;let i=z(this.strm,t.windowBits);if(i!==ie)throw new Error(J[i]);if(this.header=new V,M(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=G(t.dictionary):"[object ArrayBuffer]"===$.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=H(this.strm,t.dictionary),i!==ie)))throw new Error(J[i])}function de(e,t){const i=new le(t);if(i.push(e),i.err)throw i.msg||J[i.err];return i.result}le.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=t===~~t?t:!0===t?te:ee,"[object ArrayBuffer]"===$.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=F(i,s),r===ae&&a&&(r=H(i,a),r===ie?r=F(i,s):r===se&&(r=ae));i.avail_in>0&&r===ne&&i.state.wrap>0&&0!==e[i.next_in];)I(i),r=F(i,s);switch(r){case re:case se:case ae:case oe:return this.onEnd(r),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||r===ne))if("string"===this.options.to){let e=q(i.output,i.next_out),t=i.next_out-e,a=W(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==ie||0!==o){if(r===ne)return r=L(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},le.prototype.onData=function(e){this.chunks.push(e)},le.prototype.onEnd=function(e){e===ie&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=K(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var he=le,ce=de,fe=function(e,t){return(t=t||{}).raw=!0,de(e,t)},ue=de,we=c,be={Inflate:he,inflate:ce,inflateRaw:fe,ungzip:ue,constants:we};e.Inflate=he,e.constants=we,e.default=be,e.inflate=ce,e.inflateRaw=fe,e.ungzip=ue,Object.defineProperty(e,"__esModule",{value:!0})}(t)}}]); +//# sourceMappingURL=802.ad1608fd78ee08b3bcb1.js.map \ No newline at end of file diff --git a/dist/802.ad1608fd78ee08b3bcb1.js.LICENSE.txt b/dist/802.ad1608fd78ee08b3bcb1.js.LICENSE.txt new file mode 100644 index 000000000..c935087f6 --- /dev/null +++ b/dist/802.ad1608fd78ee08b3bcb1.js.LICENSE.txt @@ -0,0 +1 @@ +/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */ diff --git a/dist/802.ad1608fd78ee08b3bcb1.js.map b/dist/802.ad1608fd78ee08b3bcb1.js.map new file mode 100644 index 000000000..867e380bd --- /dev/null +++ b/dist/802.ad1608fd78ee08b3bcb1.js.map @@ -0,0 +1 @@ +{"version":3,"file":"802.ad1608fd78ee08b3bcb1.js","mappings":"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","sources":["webpack://telegram-t/./node_modules/pako/dist/pako_inflate.js"],"sourcesContent":["\n/*! pako 2.0.4 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.pako = {}));\n}(this, (function (exports) { 'use strict';\n\n // Note: adler32 takes 12% for level 0 and 2% for level 6.\n // It isn't worth it to make additional optimizations as in original.\n // Small size is preferable.\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n const adler32 = (adler, buf, len, pos) => {\n let s1 = (adler & 0xffff) |0,\n s2 = ((adler >>> 16) & 0xffff) |0,\n n = 0;\n\n while (len !== 0) {\n // Set limit ~ twice less than 5552, to keep\n // s2 in 31-bits, because we force signed ints.\n // in other case %= will fail.\n n = len > 2000 ? 2000 : len;\n len -= n;\n\n do {\n s1 = (s1 + buf[pos++]) |0;\n s2 = (s2 + s1) |0;\n } while (--n);\n\n s1 %= 65521;\n s2 %= 65521;\n }\n\n return (s1 | (s2 << 16)) |0;\n };\n\n\n var adler32_1 = adler32;\n\n // Note: we can't get significant speed boost here.\n // So write code to minimize size - no pregenerated tables\n // and array tools dependencies.\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n // Use ordinary array, since untyped makes no boost here\n const makeTable = () => {\n let c, table = [];\n\n for (var n = 0; n < 256; n++) {\n c = n;\n for (var k = 0; k < 8; k++) {\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n }\n table[n] = c;\n }\n\n return table;\n };\n\n // Create table on load. Just 255 signed longs. Not a problem.\n const crcTable = new Uint32Array(makeTable());\n\n\n const crc32 = (crc, buf, len, pos) => {\n const t = crcTable;\n const end = pos + len;\n\n crc ^= -1;\n\n for (let i = pos; i < end; i++) {\n crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n }\n\n return (crc ^ (-1)); // >>> 0;\n };\n\n\n var crc32_1 = crc32;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n // See state defs from inflate.js\n const BAD$1 = 30; /* got a data error -- remain here until reset */\n const TYPE$1 = 12; /* i: waiting for type bits, including last-flag bit */\n\n /*\n Decode literal, length, and distance codes and write out the resulting\n literal and match bytes until either not enough input or output is\n available, an end-of-block is encountered, or a data error is encountered.\n When large enough input and output buffers are supplied to inflate(), for\n example, a 16K input buffer and a 64K output buffer, more than 95% of the\n inflate execution time is spent in this routine.\n\n Entry assumptions:\n\n state.mode === LEN\n strm.avail_in >= 6\n strm.avail_out >= 258\n start >= strm.avail_out\n state.bits < 8\n\n On return, state.mode is one of:\n\n LEN -- ran out of enough output space or enough available input\n TYPE -- reached end of block code, inflate() to interpret next block\n BAD -- error in block data\n\n Notes:\n\n - The maximum input bits used by a length/distance pair is 15 bits for the\n length code, 5 bits for the length extra, 15 bits for the distance code,\n and 13 bits for the distance extra. This totals 48 bits, or six bytes.\n Therefore if strm.avail_in >= 6, then there is enough input to avoid\n checking for available input while decoding.\n\n - The maximum bytes that a single length/distance pair can output is 258\n bytes, which is the maximum length that can be coded. inflate_fast()\n requires strm.avail_out >= 258 for each loop to avoid checking for\n output space.\n */\n var inffast = function inflate_fast(strm, start) {\n let _in; /* local strm.input */\n let last; /* have enough input while in < last */\n let _out; /* local strm.output */\n let beg; /* inflate()'s initial strm.output */\n let end; /* while out < end, enough space available */\n //#ifdef INFLATE_STRICT\n let dmax; /* maximum distance from zlib header */\n //#endif\n let wsize; /* window size or zero if not using window */\n let whave; /* valid bytes in the window */\n let wnext; /* window write index */\n // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n let s_window; /* allocated sliding window, if wsize != 0 */\n let hold; /* local strm.hold */\n let bits; /* local strm.bits */\n let lcode; /* local strm.lencode */\n let dcode; /* local strm.distcode */\n let lmask; /* mask for first level of length codes */\n let dmask; /* mask for first level of distance codes */\n let here; /* retrieved table entry */\n let op; /* code bits, operation, extra bits, or */\n /* window position, window bytes to copy */\n let len; /* match length, unused bytes */\n let dist; /* match distance */\n let from; /* where to copy match from */\n let from_source;\n\n\n let input, output; // JS specific, because we have no pointers\n\n /* copy state to local variables */\n const state = strm.state;\n //here = state.here;\n _in = strm.next_in;\n input = strm.input;\n last = _in + (strm.avail_in - 5);\n _out = strm.next_out;\n output = strm.output;\n beg = _out - (start - strm.avail_out);\n end = _out + (strm.avail_out - 257);\n //#ifdef INFLATE_STRICT\n dmax = state.dmax;\n //#endif\n wsize = state.wsize;\n whave = state.whave;\n wnext = state.wnext;\n s_window = state.window;\n hold = state.hold;\n bits = state.bits;\n lcode = state.lencode;\n dcode = state.distcode;\n lmask = (1 << state.lenbits) - 1;\n dmask = (1 << state.distbits) - 1;\n\n\n /* decode literals and length/distances until end-of-block or not enough\n input data or output space */\n\n top:\n do {\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n\n here = lcode[hold & lmask];\n\n dolen:\n for (;;) { // Goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n if (op === 0) { /* literal */\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n output[_out++] = here & 0xffff/*here.val*/;\n }\n else if (op & 16) { /* length base */\n len = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (op) {\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n len += hold & ((1 << op) - 1);\n hold >>>= op;\n bits -= op;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", len));\n if (bits < 15) {\n hold += input[_in++] << bits;\n bits += 8;\n hold += input[_in++] << bits;\n bits += 8;\n }\n here = dcode[hold & dmask];\n\n dodist:\n for (;;) { // goto emulation\n op = here >>> 24/*here.bits*/;\n hold >>>= op;\n bits -= op;\n op = (here >>> 16) & 0xff/*here.op*/;\n\n if (op & 16) { /* distance base */\n dist = here & 0xffff/*here.val*/;\n op &= 15; /* number of extra bits */\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n if (bits < op) {\n hold += input[_in++] << bits;\n bits += 8;\n }\n }\n dist += hold & ((1 << op) - 1);\n //#ifdef INFLATE_STRICT\n if (dist > dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n //#endif\n hold >>>= op;\n bits -= op;\n //Tracevv((stderr, \"inflate: distance %u\\n\", dist));\n op = _out - beg; /* max distance in output */\n if (dist > op) { /* see if copy from window */\n op = dist - op; /* distance back in window */\n if (op > whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD$1;\n break top;\n }\n\n // (!) This block is disabled in zlib defaults,\n // don't enable it for binary compatibility\n //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n // if (len <= op - whave) {\n // do {\n // output[_out++] = 0;\n // } while (--len);\n // continue top;\n // }\n // len -= op - whave;\n // do {\n // output[_out++] = 0;\n // } while (--op > whave);\n // if (op === 0) {\n // from = _out - dist;\n // do {\n // output[_out++] = output[from++];\n // } while (--len);\n // continue top;\n // }\n //#endif\n }\n from = 0; // window index\n from_source = s_window;\n if (wnext === 0) { /* very common case */\n from += wsize - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n else if (wnext < op) { /* wrap around window */\n from += wsize + wnext - op;\n op -= wnext;\n if (op < len) { /* some from end of window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = 0;\n if (wnext < len) { /* some from start of window */\n op = wnext;\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n }\n else { /* contiguous in window */\n from += wnext - op;\n if (op < len) { /* some from window */\n len -= op;\n do {\n output[_out++] = s_window[from++];\n } while (--op);\n from = _out - dist; /* rest from output */\n from_source = output;\n }\n }\n while (len > 2) {\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n output[_out++] = from_source[from++];\n len -= 3;\n }\n if (len) {\n output[_out++] = from_source[from++];\n if (len > 1) {\n output[_out++] = from_source[from++];\n }\n }\n }\n else {\n from = _out - dist; /* copy direct from output */\n do { /* minimum length is three */\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n output[_out++] = output[from++];\n len -= 3;\n } while (len > 2);\n if (len) {\n output[_out++] = output[from++];\n if (len > 1) {\n output[_out++] = output[from++];\n }\n }\n }\n }\n else if ((op & 64) === 0) { /* 2nd level distance code */\n here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dodist;\n }\n else {\n strm.msg = 'invalid distance code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n }\n else if ((op & 64) === 0) { /* 2nd level length code */\n here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n continue dolen;\n }\n else if (op & 32) { /* end-of-block */\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.mode = TYPE$1;\n break top;\n }\n else {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD$1;\n break top;\n }\n\n break; // need to emulate goto via \"continue\"\n }\n } while (_in < last && _out < end);\n\n /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n len = bits >> 3;\n _in -= len;\n bits -= len << 3;\n hold &= (1 << bits) - 1;\n\n /* update state and return */\n strm.next_in = _in;\n strm.next_out = _out;\n strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n state.hold = hold;\n state.bits = bits;\n return;\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n const MAXBITS = 15;\n const ENOUGH_LENS$1 = 852;\n const ENOUGH_DISTS$1 = 592;\n //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\n const CODES$1 = 0;\n const LENS$1 = 1;\n const DISTS$1 = 2;\n\n const lbase = new Uint16Array([ /* Length codes 257..285 base */\n 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n ]);\n\n const lext = new Uint8Array([ /* Length codes 257..285 extra */\n 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n ]);\n\n const dbase = new Uint16Array([ /* Distance codes 0..29 base */\n 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n 8193, 12289, 16385, 24577, 0, 0\n ]);\n\n const dext = new Uint8Array([ /* Distance codes 0..29 extra */\n 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n 28, 28, 29, 29, 64, 64\n ]);\n\n const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) =>\n {\n const bits = opts.bits;\n //here = opts.here; /* table entry for duplication */\n\n let len = 0; /* a code's length in bits */\n let sym = 0; /* index of code symbols */\n let min = 0, max = 0; /* minimum and maximum code lengths */\n let root = 0; /* number of index bits for root table */\n let curr = 0; /* number of index bits for current table */\n let drop = 0; /* code bits to drop for sub-table */\n let left = 0; /* number of prefix codes available */\n let used = 0; /* code entries in table used */\n let huff = 0; /* Huffman code */\n let incr; /* for incrementing code, index */\n let fill; /* index for replicating entries */\n let low; /* low bits for current root entry */\n let mask; /* mask for low root bits */\n let next; /* next available space in table */\n let base = null; /* base value table to use */\n let base_index = 0;\n // let shoextra; /* extra bits table to use */\n let end; /* use base and extra for symbol > end */\n const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */\n const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */\n let extra = null;\n let extra_index = 0;\n\n let here_bits, here_op, here_val;\n\n /*\n Process a set of code lengths to create a canonical Huffman code. The\n code lengths are lens[0..codes-1]. Each length corresponds to the\n symbols 0..codes-1. The Huffman code is generated by first sorting the\n symbols by length from short to long, and retaining the symbol order\n for codes with equal lengths. Then the code starts with all zero bits\n for the first code of the shortest length, and the codes are integer\n increments for the same length, and zeros are appended as the length\n increases. For the deflate format, these bits are stored backwards\n from their more natural integer increment ordering, and so when the\n decoding tables are built in the large loop below, the integer codes\n are incremented backwards.\n\n This routine assumes, but does not check, that all of the entries in\n lens[] are in the range 0..MAXBITS. The caller must assure this.\n 1..MAXBITS is interpreted as that code length. zero means that that\n symbol does not occur in this code.\n\n The codes are sorted by computing a count of codes for each length,\n creating from that a table of starting indices for each length in the\n sorted table, and then entering the symbols in order in the sorted\n table. The sorted table is work[], with that space being provided by\n the caller.\n\n The length counts are used for other purposes as well, i.e. finding\n the minimum and maximum length codes, determining if there are any\n codes at all, checking for a valid set of lengths, and looking ahead\n at length counts to determine sub-table sizes when building the\n decoding tables.\n */\n\n /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n for (len = 0; len <= MAXBITS; len++) {\n count[len] = 0;\n }\n for (sym = 0; sym < codes; sym++) {\n count[lens[lens_index + sym]]++;\n }\n\n /* bound code lengths, force root to be within code lengths */\n root = bits;\n for (max = MAXBITS; max >= 1; max--) {\n if (count[max] !== 0) { break; }\n }\n if (root > max) {\n root = max;\n }\n if (max === 0) { /* no symbols to code at all */\n //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */\n //table.bits[opts.table_index] = 1; //here.bits = (var char)1;\n //table.val[opts.table_index++] = 0; //here.val = (var short)0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n //table.op[opts.table_index] = 64;\n //table.bits[opts.table_index] = 1;\n //table.val[opts.table_index++] = 0;\n table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n opts.bits = 1;\n return 0; /* no symbols, but wait for decoding to report error */\n }\n for (min = 1; min < max; min++) {\n if (count[min] !== 0) { break; }\n }\n if (root < min) {\n root = min;\n }\n\n /* check for an over-subscribed or incomplete set of lengths */\n left = 1;\n for (len = 1; len <= MAXBITS; len++) {\n left <<= 1;\n left -= count[len];\n if (left < 0) {\n return -1;\n } /* over-subscribed */\n }\n if (left > 0 && (type === CODES$1 || max !== 1)) {\n return -1; /* incomplete set */\n }\n\n /* generate offsets into symbol table for each length for sorting */\n offs[1] = 0;\n for (len = 1; len < MAXBITS; len++) {\n offs[len + 1] = offs[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (sym = 0; sym < codes; sym++) {\n if (lens[lens_index + sym] !== 0) {\n work[offs[lens[lens_index + sym]]++] = sym;\n }\n }\n\n /*\n Create and fill in decoding tables. In this loop, the table being\n filled is at next and has curr index bits. The code being used is huff\n with length len. That code is converted to an index by dropping drop\n bits off of the bottom. For codes where len is less than drop + curr,\n those top drop + curr - len bits are incremented through all values to\n fill the table with replicated entries.\n\n root is the number of index bits for the root table. When len exceeds\n root, sub-tables are created pointed to by the root entry with an index\n of the low root bits of huff. This is saved in low to check for when a\n new sub-table should be started. drop is zero when the root table is\n being filled, and drop is root when sub-tables are being filled.\n\n When a new sub-table is needed, it is necessary to look ahead in the\n code lengths to determine what size sub-table is needed. The length\n counts are used for this, and so count[] is decremented as codes are\n entered in the tables.\n\n used keeps track of how many table entries have been allocated from the\n provided *table space. It is checked for LENS and DIST tables against\n the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n the initial root table size constants. See the comments in inftrees.h\n for more information.\n\n sym increments through all symbols, and the loop terminates when\n all codes of length max, i.e. all codes, have been processed. This\n routine permits incomplete codes, so another loop after this one fills\n in the rest of the decoding tables with invalid code markers.\n */\n\n /* set up for code type */\n // poor man optimization - use if-else instead of switch,\n // to avoid deopts in old v8\n if (type === CODES$1) {\n base = extra = work; /* dummy value--not used */\n end = 19;\n\n } else if (type === LENS$1) {\n base = lbase;\n base_index -= 257;\n extra = lext;\n extra_index -= 257;\n end = 256;\n\n } else { /* DISTS */\n base = dbase;\n extra = dext;\n end = -1;\n }\n\n /* initialize opts for loop */\n huff = 0; /* starting code */\n sym = 0; /* starting code symbol */\n len = min; /* starting code length */\n next = table_index; /* current table to fill in */\n curr = root; /* current table index bits */\n drop = 0; /* current bits to drop from code for index */\n low = -1; /* trigger new sub-table when len > root */\n used = 1 << root; /* use root table entries */\n mask = used - 1; /* mask for comparing low */\n\n /* check available table space */\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* process all codes and make table entries */\n for (;;) {\n /* create table entry */\n here_bits = len - drop;\n if (work[sym] < end) {\n here_op = 0;\n here_val = work[sym];\n }\n else if (work[sym] > end) {\n here_op = extra[extra_index + work[sym]];\n here_val = base[base_index + work[sym]];\n }\n else {\n here_op = 32 + 64; /* end of block */\n here_val = 0;\n }\n\n /* replicate for those indices with low len bits equal to huff */\n incr = 1 << (len - drop);\n fill = 1 << curr;\n min = fill; /* save offset to next table */\n do {\n fill -= incr;\n table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n } while (fill !== 0);\n\n /* backwards increment the len-bit code huff */\n incr = 1 << (len - 1);\n while (huff & incr) {\n incr >>= 1;\n }\n if (incr !== 0) {\n huff &= incr - 1;\n huff += incr;\n } else {\n huff = 0;\n }\n\n /* go to next symbol, update count, len */\n sym++;\n if (--count[len] === 0) {\n if (len === max) { break; }\n len = lens[lens_index + work[sym]];\n }\n\n /* create new sub-table if needed */\n if (len > root && (huff & mask) !== low) {\n /* if first time, transition to sub-tables */\n if (drop === 0) {\n drop = root;\n }\n\n /* increment past last table */\n next += min; /* here min is 1 << curr */\n\n /* determine length of next table */\n curr = len - drop;\n left = 1 << curr;\n while (curr + drop < max) {\n left -= count[curr + drop];\n if (left <= 0) { break; }\n curr++;\n left <<= 1;\n }\n\n /* check for enough space */\n used += 1 << curr;\n if ((type === LENS$1 && used > ENOUGH_LENS$1) ||\n (type === DISTS$1 && used > ENOUGH_DISTS$1)) {\n return 1;\n }\n\n /* point entry in root table to sub-table */\n low = huff & mask;\n /*table.op[low] = curr;\n table.bits[low] = root;\n table.val[low] = next - opts.table_index;*/\n table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n }\n }\n\n /* fill in remaining table entry if code is incomplete (guaranteed to have\n at most one remaining entry, since if the code is incomplete, the\n maximum code length that was allowed to get this far is one bit) */\n if (huff !== 0) {\n //table.op[next + huff] = 64; /* invalid code marker */\n //table.bits[next + huff] = len - drop;\n //table.val[next + huff] = 0;\n table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n }\n\n /* set return parameters */\n //opts.table_index += used;\n opts.bits = root;\n return 0;\n };\n\n\n var inftrees = inflate_table;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n var constants$1 = {\n\n /* Allowed flush values; see deflate() and inflate() below for details */\n Z_NO_FLUSH: 0,\n Z_PARTIAL_FLUSH: 1,\n Z_SYNC_FLUSH: 2,\n Z_FULL_FLUSH: 3,\n Z_FINISH: 4,\n Z_BLOCK: 5,\n Z_TREES: 6,\n\n /* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\n Z_OK: 0,\n Z_STREAM_END: 1,\n Z_NEED_DICT: 2,\n Z_ERRNO: -1,\n Z_STREAM_ERROR: -2,\n Z_DATA_ERROR: -3,\n Z_MEM_ERROR: -4,\n Z_BUF_ERROR: -5,\n //Z_VERSION_ERROR: -6,\n\n /* compression levels */\n Z_NO_COMPRESSION: 0,\n Z_BEST_SPEED: 1,\n Z_BEST_COMPRESSION: 9,\n Z_DEFAULT_COMPRESSION: -1,\n\n\n Z_FILTERED: 1,\n Z_HUFFMAN_ONLY: 2,\n Z_RLE: 3,\n Z_FIXED: 4,\n Z_DEFAULT_STRATEGY: 0,\n\n /* Possible values of the data_type field (though see inflate()) */\n Z_BINARY: 0,\n Z_TEXT: 1,\n //Z_ASCII: 1, // = Z_TEXT (deprecated)\n Z_UNKNOWN: 2,\n\n /* The deflate compression method */\n Z_DEFLATED: 8\n //Z_NULL: null // Use -1 or null inline, depending on var type\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n\n\n\n\n\n const CODES = 0;\n const LENS = 1;\n const DISTS = 2;\n\n /* Public constants ==========================================================*/\n /* ===========================================================================*/\n\n const {\n Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,\n Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,\n Z_DEFLATED\n } = constants$1;\n\n\n /* STATES ====================================================================*/\n /* ===========================================================================*/\n\n\n const HEAD = 1; /* i: waiting for magic header */\n const FLAGS = 2; /* i: waiting for method and flags (gzip) */\n const TIME = 3; /* i: waiting for modification time (gzip) */\n const OS = 4; /* i: waiting for extra flags and operating system (gzip) */\n const EXLEN = 5; /* i: waiting for extra length (gzip) */\n const EXTRA = 6; /* i: waiting for extra bytes (gzip) */\n const NAME = 7; /* i: waiting for end of file name (gzip) */\n const COMMENT = 8; /* i: waiting for end of comment (gzip) */\n const HCRC = 9; /* i: waiting for header crc (gzip) */\n const DICTID = 10; /* i: waiting for dictionary check value */\n const DICT = 11; /* waiting for inflateSetDictionary() call */\n const TYPE = 12; /* i: waiting for type bits, including last-flag bit */\n const TYPEDO = 13; /* i: same, but skip check to exit inflate on new block */\n const STORED = 14; /* i: waiting for stored size (length and complement) */\n const COPY_ = 15; /* i/o: same as COPY below, but only first time in */\n const COPY = 16; /* i/o: waiting for input or output to copy stored block */\n const TABLE = 17; /* i: waiting for dynamic block table lengths */\n const LENLENS = 18; /* i: waiting for code length code lengths */\n const CODELENS = 19; /* i: waiting for length/lit and distance code lengths */\n const LEN_ = 20; /* i: same as LEN below, but only first time in */\n const LEN = 21; /* i: waiting for length/lit/eob code */\n const LENEXT = 22; /* i: waiting for length extra bits */\n const DIST = 23; /* i: waiting for distance code */\n const DISTEXT = 24; /* i: waiting for distance extra bits */\n const MATCH = 25; /* o: waiting for output space to copy string */\n const LIT = 26; /* o: waiting for output space to write literal */\n const CHECK = 27; /* i: waiting for 32-bit check value */\n const LENGTH = 28; /* i: waiting for 32-bit length (gzip) */\n const DONE = 29; /* finished check, done -- remain here until reset */\n const BAD = 30; /* got a data error -- remain here until reset */\n const MEM = 31; /* got an inflate() memory error -- remain here until reset */\n const SYNC = 32; /* looking for synchronization bytes to restart inflate() */\n\n /* ===========================================================================*/\n\n\n\n const ENOUGH_LENS = 852;\n const ENOUGH_DISTS = 592;\n //const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\n const MAX_WBITS = 15;\n /* 32K LZ77 window */\n const DEF_WBITS = MAX_WBITS;\n\n\n const zswap32 = (q) => {\n\n return (((q >>> 24) & 0xff) +\n ((q >>> 8) & 0xff00) +\n ((q & 0xff00) << 8) +\n ((q & 0xff) << 24));\n };\n\n\n function InflateState() {\n this.mode = 0; /* current inflate mode */\n this.last = false; /* true if processing last block */\n this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */\n this.havedict = false; /* true if dictionary provided */\n this.flags = 0; /* gzip header method and flags (0 if zlib) */\n this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */\n this.check = 0; /* protected copy of check value */\n this.total = 0; /* protected copy of output count */\n // TODO: may be {}\n this.head = null; /* where to save gzip header information */\n\n /* sliding window */\n this.wbits = 0; /* log base 2 of requested window size */\n this.wsize = 0; /* window size or zero if not using window */\n this.whave = 0; /* valid bytes in the window */\n this.wnext = 0; /* window write index */\n this.window = null; /* allocated sliding window, if needed */\n\n /* bit accumulator */\n this.hold = 0; /* input bit accumulator */\n this.bits = 0; /* number of bits in \"in\" */\n\n /* for string and stored block copying */\n this.length = 0; /* literal or length of data to copy */\n this.offset = 0; /* distance back to copy string from */\n\n /* for table and code decoding */\n this.extra = 0; /* extra bits needed */\n\n /* fixed and dynamic code tables */\n this.lencode = null; /* starting table for length/literal codes */\n this.distcode = null; /* starting table for distance codes */\n this.lenbits = 0; /* index bits for lencode */\n this.distbits = 0; /* index bits for distcode */\n\n /* dynamic table building */\n this.ncode = 0; /* number of code length code lengths */\n this.nlen = 0; /* number of length code lengths */\n this.ndist = 0; /* number of distance code lengths */\n this.have = 0; /* number of code lengths in lens[] */\n this.next = null; /* next available space in codes[] */\n\n this.lens = new Uint16Array(320); /* temporary storage for code lengths */\n this.work = new Uint16Array(288); /* work area for code table building */\n\n /*\n because we don't have pointers in js, we use lencode and distcode directly\n as buffers so we don't need codes\n */\n //this.codes = new Int32Array(ENOUGH); /* space for code tables */\n this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */\n this.distdyn = null; /* dynamic table for distance codes (JS specific) */\n this.sane = 0; /* if false, allow invalid distance too far */\n this.back = 0; /* bits back of last unprocessed length/lit */\n this.was = 0; /* initial length of match */\n }\n\n\n const inflateResetKeep = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n strm.total_in = strm.total_out = state.total = 0;\n strm.msg = ''; /*Z_NULL*/\n if (state.wrap) { /* to support ill-conceived Java test suite */\n strm.adler = state.wrap & 1;\n }\n state.mode = HEAD;\n state.last = 0;\n state.havedict = 0;\n state.dmax = 32768;\n state.head = null/*Z_NULL*/;\n state.hold = 0;\n state.bits = 0;\n //state.lencode = state.distcode = state.next = state.codes;\n state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS);\n state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS);\n\n state.sane = 1;\n state.back = -1;\n //Tracev((stderr, \"inflate: reset\\n\"));\n return Z_OK$1;\n };\n\n\n const inflateReset = (strm) => {\n\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n state.wsize = 0;\n state.whave = 0;\n state.wnext = 0;\n return inflateResetKeep(strm);\n\n };\n\n\n const inflateReset2 = (strm, windowBits) => {\n let wrap;\n\n /* get the state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n\n /* extract wrap request from windowBits parameter */\n if (windowBits < 0) {\n wrap = 0;\n windowBits = -windowBits;\n }\n else {\n wrap = (windowBits >> 4) + 1;\n if (windowBits < 48) {\n windowBits &= 15;\n }\n }\n\n /* set number of window bits, free window if different */\n if (windowBits && (windowBits < 8 || windowBits > 15)) {\n return Z_STREAM_ERROR$1;\n }\n if (state.window !== null && state.wbits !== windowBits) {\n state.window = null;\n }\n\n /* update state and reset the rest of it */\n state.wrap = wrap;\n state.wbits = windowBits;\n return inflateReset(strm);\n };\n\n\n const inflateInit2 = (strm, windowBits) => {\n\n if (!strm) { return Z_STREAM_ERROR$1; }\n //strm.msg = Z_NULL; /* in case we return an error */\n\n const state = new InflateState();\n\n //if (state === Z_NULL) return Z_MEM_ERROR;\n //Tracev((stderr, \"inflate: allocated\\n\"));\n strm.state = state;\n state.window = null/*Z_NULL*/;\n const ret = inflateReset2(strm, windowBits);\n if (ret !== Z_OK$1) {\n strm.state = null/*Z_NULL*/;\n }\n return ret;\n };\n\n\n const inflateInit = (strm) => {\n\n return inflateInit2(strm, DEF_WBITS);\n };\n\n\n /*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding. Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter. This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time. However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\n let virgin = true;\n\n let lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\n\n const fixedtables = (state) => {\n\n /* build fixed huffman tables if first call (may not be thread safe) */\n if (virgin) {\n lenfix = new Int32Array(512);\n distfix = new Int32Array(32);\n\n /* literal/length table */\n let sym = 0;\n while (sym < 144) { state.lens[sym++] = 8; }\n while (sym < 256) { state.lens[sym++] = 9; }\n while (sym < 280) { state.lens[sym++] = 7; }\n while (sym < 288) { state.lens[sym++] = 8; }\n\n inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });\n\n /* distance table */\n sym = 0;\n while (sym < 32) { state.lens[sym++] = 5; }\n\n inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });\n\n /* do this just once */\n virgin = false;\n }\n\n state.lencode = lenfix;\n state.lenbits = 9;\n state.distcode = distfix;\n state.distbits = 5;\n };\n\n\n /*\n Update the window with the last wsize (normally 32K) bytes written before\n returning. If window does not exist yet, create it. This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\n const updatewindow = (strm, src, end, copy) => {\n\n let dist;\n const state = strm.state;\n\n /* if it hasn't been done already, allocate space for the window */\n if (state.window === null) {\n state.wsize = 1 << state.wbits;\n state.wnext = 0;\n state.whave = 0;\n\n state.window = new Uint8Array(state.wsize);\n }\n\n /* copy state->wsize or less output bytes into the circular window */\n if (copy >= state.wsize) {\n state.window.set(src.subarray(end - state.wsize, end), 0);\n state.wnext = 0;\n state.whave = state.wsize;\n }\n else {\n dist = state.wsize - state.wnext;\n if (dist > copy) {\n dist = copy;\n }\n //zmemcpy(state->window + state->wnext, end - copy, dist);\n state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext);\n copy -= dist;\n if (copy) {\n //zmemcpy(state->window, end - copy, copy);\n state.window.set(src.subarray(end - copy, end), 0);\n state.wnext = copy;\n state.whave = state.wsize;\n }\n else {\n state.wnext += dist;\n if (state.wnext === state.wsize) { state.wnext = 0; }\n if (state.whave < state.wsize) { state.whave += dist; }\n }\n }\n return 0;\n };\n\n\n const inflate$1 = (strm, flush) => {\n\n let state;\n let input, output; // input/output buffers\n let next; /* next input INDEX */\n let put; /* next output INDEX */\n let have, left; /* available input and output */\n let hold; /* bit buffer */\n let bits; /* bits in bit buffer */\n let _in, _out; /* save starting available input and output */\n let copy; /* number of stored or match bytes to copy */\n let from; /* where to copy match bytes from */\n let from_source;\n let here = 0; /* current decoding table entry */\n let here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n //let last; /* parent table entry */\n let last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n let len; /* length to copy for repeats, bits to drop */\n let ret; /* return code */\n const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */\n let opts;\n\n let n; // temporary variable for NEED_BITS\n\n const order = /* permutation of code lengths */\n new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]);\n\n\n if (!strm || !strm.state || !strm.output ||\n (!strm.input && strm.avail_in !== 0)) {\n return Z_STREAM_ERROR$1;\n }\n\n state = strm.state;\n if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */\n\n\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n _in = have;\n _out = left;\n ret = Z_OK$1;\n\n inf_leave: // goto emulation\n for (;;) {\n switch (state.mode) {\n case HEAD:\n if (state.wrap === 0) {\n state.mode = TYPEDO;\n break;\n }\n //=== NEEDBITS(16);\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */\n state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = FLAGS;\n break;\n }\n state.flags = 0; /* expect zlib header */\n if (state.head) {\n state.head.done = false;\n }\n if (!(state.wrap & 1) || /* check if zlib header allowed */\n (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n strm.msg = 'incorrect header check';\n state.mode = BAD;\n break;\n }\n if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n len = (hold & 0x0f)/*BITS(4)*/ + 8;\n if (state.wbits === 0) {\n state.wbits = len;\n }\n else if (len > state.wbits) {\n strm.msg = 'invalid window size';\n state.mode = BAD;\n break;\n }\n\n // !!! pako patch. Force use `options.windowBits` if passed.\n // Required to always use max window size by default.\n state.dmax = 1 << state.wbits;\n //state.dmax = 1 << len;\n\n //Tracev((stderr, \"inflate: zlib header ok\\n\"));\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = hold & 0x200 ? DICTID : TYPE;\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n break;\n case FLAGS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.flags = hold;\n if ((state.flags & 0xff) !== Z_DEFLATED) {\n strm.msg = 'unknown compression method';\n state.mode = BAD;\n break;\n }\n if (state.flags & 0xe000) {\n strm.msg = 'unknown header flags set';\n state.mode = BAD;\n break;\n }\n if (state.head) {\n state.head.text = ((hold >> 8) & 1);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = TIME;\n /* falls through */\n case TIME:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.time = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC4(state.check, hold)\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n hbuf[2] = (hold >>> 16) & 0xff;\n hbuf[3] = (hold >>> 24) & 0xff;\n state.check = crc32_1(state.check, hbuf, 4, 0);\n //===\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = OS;\n /* falls through */\n case OS:\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (state.head) {\n state.head.xflags = (hold & 0xff);\n state.head.os = (hold >> 8);\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = EXLEN;\n /* falls through */\n case EXLEN:\n if (state.flags & 0x0400) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length = hold;\n if (state.head) {\n state.head.extra_len = hold;\n }\n if (state.flags & 0x0200) {\n //=== CRC2(state.check, hold);\n hbuf[0] = hold & 0xff;\n hbuf[1] = (hold >>> 8) & 0xff;\n state.check = crc32_1(state.check, hbuf, 2, 0);\n //===//\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n else if (state.head) {\n state.head.extra = null/*Z_NULL*/;\n }\n state.mode = EXTRA;\n /* falls through */\n case EXTRA:\n if (state.flags & 0x0400) {\n copy = state.length;\n if (copy > have) { copy = have; }\n if (copy) {\n if (state.head) {\n len = state.head.extra_len - state.length;\n if (!state.head.extra) {\n // Use untyped array for more convenient processing later\n state.head.extra = new Uint8Array(state.head.extra_len);\n }\n state.head.extra.set(\n input.subarray(\n next,\n // extra field is limited to 65536 bytes\n // - no need for additional size check\n next + copy\n ),\n /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n len\n );\n //zmemcpy(state.head.extra + len, next,\n // len + copy > state.head.extra_max ?\n // state.head.extra_max - len : copy);\n }\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n state.length -= copy;\n }\n if (state.length) { break inf_leave; }\n }\n state.length = 0;\n state.mode = NAME;\n /* falls through */\n case NAME:\n if (state.flags & 0x0800) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n // TODO: 2 or 1 bytes?\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.name_max*/)) {\n state.head.name += String.fromCharCode(len);\n }\n } while (len && copy < have);\n\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.name = null;\n }\n state.length = 0;\n state.mode = COMMENT;\n /* falls through */\n case COMMENT:\n if (state.flags & 0x1000) {\n if (have === 0) { break inf_leave; }\n copy = 0;\n do {\n len = input[next + copy++];\n /* use constant limit because in js we should not preallocate memory */\n if (state.head && len &&\n (state.length < 65536 /*state.head.comm_max*/)) {\n state.head.comment += String.fromCharCode(len);\n }\n } while (len && copy < have);\n if (state.flags & 0x0200) {\n state.check = crc32_1(state.check, input, copy, next);\n }\n have -= copy;\n next += copy;\n if (len) { break inf_leave; }\n }\n else if (state.head) {\n state.head.comment = null;\n }\n state.mode = HCRC;\n /* falls through */\n case HCRC:\n if (state.flags & 0x0200) {\n //=== NEEDBITS(16); */\n while (bits < 16) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.check & 0xffff)) {\n strm.msg = 'header crc mismatch';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n }\n if (state.head) {\n state.head.hcrc = ((state.flags >> 9) & 1);\n state.head.done = true;\n }\n strm.adler = state.check = 0;\n state.mode = TYPE;\n break;\n case DICTID:\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n strm.adler = state.check = zswap32(hold);\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = DICT;\n /* falls through */\n case DICT:\n if (state.havedict === 0) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n return Z_NEED_DICT$1;\n }\n strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n state.mode = TYPE;\n /* falls through */\n case TYPE:\n if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case TYPEDO:\n if (state.last) {\n //--- BYTEBITS() ---//\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n state.mode = CHECK;\n break;\n }\n //=== NEEDBITS(3); */\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.last = (hold & 0x01)/*BITS(1)*/;\n //--- DROPBITS(1) ---//\n hold >>>= 1;\n bits -= 1;\n //---//\n\n switch ((hold & 0x03)/*BITS(2)*/) {\n case 0: /* stored block */\n //Tracev((stderr, \"inflate: stored block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = STORED;\n break;\n case 1: /* fixed block */\n fixedtables(state);\n //Tracev((stderr, \"inflate: fixed codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = LEN_; /* decode codes */\n if (flush === Z_TREES) {\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break inf_leave;\n }\n break;\n case 2: /* dynamic block */\n //Tracev((stderr, \"inflate: dynamic codes block%s\\n\",\n // state.last ? \" (last)\" : \"\"));\n state.mode = TABLE;\n break;\n case 3:\n strm.msg = 'invalid block type';\n state.mode = BAD;\n }\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n break;\n case STORED:\n //--- BYTEBITS() ---// /* go to byte boundary */\n hold >>>= bits & 7;\n bits -= bits & 7;\n //---//\n //=== NEEDBITS(32); */\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n strm.msg = 'invalid stored block lengths';\n state.mode = BAD;\n break;\n }\n state.length = hold & 0xffff;\n //Tracev((stderr, \"inflate: stored length %u\\n\",\n // state.length));\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n state.mode = COPY_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case COPY_:\n state.mode = COPY;\n /* falls through */\n case COPY:\n copy = state.length;\n if (copy) {\n if (copy > have) { copy = have; }\n if (copy > left) { copy = left; }\n if (copy === 0) { break inf_leave; }\n //--- zmemcpy(put, next, copy); ---\n output.set(input.subarray(next, next + copy), put);\n //---//\n have -= copy;\n next += copy;\n left -= copy;\n put += copy;\n state.length -= copy;\n break;\n }\n //Tracev((stderr, \"inflate: stored end\\n\"));\n state.mode = TYPE;\n break;\n case TABLE:\n //=== NEEDBITS(14); */\n while (bits < 14) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n //--- DROPBITS(5) ---//\n hold >>>= 5;\n bits -= 5;\n //---//\n state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n //--- DROPBITS(4) ---//\n hold >>>= 4;\n bits -= 4;\n //---//\n //#ifndef PKZIP_BUG_WORKAROUND\n if (state.nlen > 286 || state.ndist > 30) {\n strm.msg = 'too many length or distance symbols';\n state.mode = BAD;\n break;\n }\n //#endif\n //Tracev((stderr, \"inflate: table sizes ok\\n\"));\n state.have = 0;\n state.mode = LENLENS;\n /* falls through */\n case LENLENS:\n while (state.have < state.ncode) {\n //=== NEEDBITS(3);\n while (bits < 3) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n while (state.have < 19) {\n state.lens[order[state.have++]] = 0;\n }\n // We have separate tables & no pointers. 2 commented lines below not needed.\n //state.next = state.codes;\n //state.lencode = state.next;\n // Switch to use dynamic table\n state.lencode = state.lendyn;\n state.lenbits = 7;\n\n opts = { bits: state.lenbits };\n ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n state.lenbits = opts.bits;\n\n if (ret) {\n strm.msg = 'invalid code lengths set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, \"inflate: code lengths ok\\n\"));\n state.have = 0;\n state.mode = CODELENS;\n /* falls through */\n case CODELENS:\n while (state.have < state.nlen + state.ndist) {\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_val < 16) {\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.lens[state.have++] = here_val;\n }\n else {\n if (here_val === 16) {\n //=== NEEDBITS(here.bits + 2);\n n = here_bits + 2;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n if (state.have === 0) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n len = state.lens[state.have - 1];\n copy = 3 + (hold & 0x03);//BITS(2);\n //--- DROPBITS(2) ---//\n hold >>>= 2;\n bits -= 2;\n //---//\n }\n else if (here_val === 17) {\n //=== NEEDBITS(here.bits + 3);\n n = here_bits + 3;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 3 + (hold & 0x07);//BITS(3);\n //--- DROPBITS(3) ---//\n hold >>>= 3;\n bits -= 3;\n //---//\n }\n else {\n //=== NEEDBITS(here.bits + 7);\n n = here_bits + 7;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n len = 0;\n copy = 11 + (hold & 0x7f);//BITS(7);\n //--- DROPBITS(7) ---//\n hold >>>= 7;\n bits -= 7;\n //---//\n }\n if (state.have + copy > state.nlen + state.ndist) {\n strm.msg = 'invalid bit length repeat';\n state.mode = BAD;\n break;\n }\n while (copy--) {\n state.lens[state.have++] = len;\n }\n }\n }\n\n /* handle error breaks in while */\n if (state.mode === BAD) { break; }\n\n /* check for end-of-block code (better have one) */\n if (state.lens[256] === 0) {\n strm.msg = 'invalid code -- missing end-of-block';\n state.mode = BAD;\n break;\n }\n\n /* build code tables -- note: do not change the lenbits or distbits\n values here (9 and 6) without reading the comments in inftrees.h\n concerning the ENOUGH constants, which depend on those values */\n state.lenbits = 9;\n\n opts = { bits: state.lenbits };\n ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.lenbits = opts.bits;\n // state.lencode = state.next;\n\n if (ret) {\n strm.msg = 'invalid literal/lengths set';\n state.mode = BAD;\n break;\n }\n\n state.distbits = 6;\n //state.distcode.copy(state.codes);\n // Switch to use dynamic table\n state.distcode = state.distdyn;\n opts = { bits: state.distbits };\n ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n // We have separate tables & no pointers. 2 commented lines below not needed.\n // state.next_index = opts.table_index;\n state.distbits = opts.bits;\n // state.distcode = state.next;\n\n if (ret) {\n strm.msg = 'invalid distances set';\n state.mode = BAD;\n break;\n }\n //Tracev((stderr, 'inflate: codes ok\\n'));\n state.mode = LEN_;\n if (flush === Z_TREES) { break inf_leave; }\n /* falls through */\n case LEN_:\n state.mode = LEN;\n /* falls through */\n case LEN:\n if (have >= 6 && left >= 258) {\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n inffast(strm, _out);\n //--- LOAD() ---\n put = strm.next_out;\n output = strm.output;\n left = strm.avail_out;\n next = strm.next_in;\n input = strm.input;\n have = strm.avail_in;\n hold = state.hold;\n bits = state.bits;\n //---\n\n if (state.mode === TYPE) {\n state.back = -1;\n }\n break;\n }\n state.back = 0;\n for (;;) {\n here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if (here_bits <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if (here_op && (here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.lencode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n state.length = here_val;\n if (here_op === 0) {\n //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n // \"inflate: literal '%c'\\n\" :\n // \"inflate: literal 0x%02x\\n\", here.val));\n state.mode = LIT;\n break;\n }\n if (here_op & 32) {\n //Tracevv((stderr, \"inflate: end of block\\n\"));\n state.back = -1;\n state.mode = TYPE;\n break;\n }\n if (here_op & 64) {\n strm.msg = 'invalid literal/length code';\n state.mode = BAD;\n break;\n }\n state.extra = here_op & 15;\n state.mode = LENEXT;\n /* falls through */\n case LENEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //Tracevv((stderr, \"inflate: length %u\\n\", state.length));\n state.was = state.length;\n state.mode = DIST;\n /* falls through */\n case DIST:\n for (;;) {\n here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n if ((here_op & 0xf0) === 0) {\n last_bits = here_bits;\n last_op = here_op;\n last_val = here_val;\n for (;;) {\n here = state.distcode[last_val +\n ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n here_bits = here >>> 24;\n here_op = (here >>> 16) & 0xff;\n here_val = here & 0xffff;\n\n if ((last_bits + here_bits) <= bits) { break; }\n //--- PULLBYTE() ---//\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n //---//\n }\n //--- DROPBITS(last.bits) ---//\n hold >>>= last_bits;\n bits -= last_bits;\n //---//\n state.back += last_bits;\n }\n //--- DROPBITS(here.bits) ---//\n hold >>>= here_bits;\n bits -= here_bits;\n //---//\n state.back += here_bits;\n if (here_op & 64) {\n strm.msg = 'invalid distance code';\n state.mode = BAD;\n break;\n }\n state.offset = here_val;\n state.extra = (here_op) & 15;\n state.mode = DISTEXT;\n /* falls through */\n case DISTEXT:\n if (state.extra) {\n //=== NEEDBITS(state.extra);\n n = state.extra;\n while (bits < n) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n //--- DROPBITS(state.extra) ---//\n hold >>>= state.extra;\n bits -= state.extra;\n //---//\n state.back += state.extra;\n }\n //#ifdef INFLATE_STRICT\n if (state.offset > state.dmax) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n //#endif\n //Tracevv((stderr, \"inflate: distance %u\\n\", state.offset));\n state.mode = MATCH;\n /* falls through */\n case MATCH:\n if (left === 0) { break inf_leave; }\n copy = _out - left;\n if (state.offset > copy) { /* copy from window */\n copy = state.offset - copy;\n if (copy > state.whave) {\n if (state.sane) {\n strm.msg = 'invalid distance too far back';\n state.mode = BAD;\n break;\n }\n // (!) This block is disabled in zlib defaults,\n // don't enable it for binary compatibility\n //#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n // Trace((stderr, \"inflate.c too far\\n\"));\n // copy -= state.whave;\n // if (copy > state.length) { copy = state.length; }\n // if (copy > left) { copy = left; }\n // left -= copy;\n // state.length -= copy;\n // do {\n // output[put++] = 0;\n // } while (--copy);\n // if (state.length === 0) { state.mode = LEN; }\n // break;\n //#endif\n }\n if (copy > state.wnext) {\n copy -= state.wnext;\n from = state.wsize - copy;\n }\n else {\n from = state.wnext - copy;\n }\n if (copy > state.length) { copy = state.length; }\n from_source = state.window;\n }\n else { /* copy from output */\n from_source = output;\n from = put - state.offset;\n copy = state.length;\n }\n if (copy > left) { copy = left; }\n left -= copy;\n state.length -= copy;\n do {\n output[put++] = from_source[from++];\n } while (--copy);\n if (state.length === 0) { state.mode = LEN; }\n break;\n case LIT:\n if (left === 0) { break inf_leave; }\n output[put++] = state.length;\n left--;\n state.mode = LEN;\n break;\n case CHECK:\n if (state.wrap) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n // Use '|' instead of '+' to make sure that result is signed\n hold |= input[next++] << bits;\n bits += 8;\n }\n //===//\n _out -= left;\n strm.total_out += _out;\n state.total += _out;\n if (_out) {\n strm.adler = state.check =\n /*UPDATE(state.check, put - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out));\n\n }\n _out = left;\n // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n strm.msg = 'incorrect data check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: check matches trailer\\n\"));\n }\n state.mode = LENGTH;\n /* falls through */\n case LENGTH:\n if (state.wrap && state.flags) {\n //=== NEEDBITS(32);\n while (bits < 32) {\n if (have === 0) { break inf_leave; }\n have--;\n hold += input[next++] << bits;\n bits += 8;\n }\n //===//\n if (hold !== (state.total & 0xffffffff)) {\n strm.msg = 'incorrect length check';\n state.mode = BAD;\n break;\n }\n //=== INITBITS();\n hold = 0;\n bits = 0;\n //===//\n //Tracev((stderr, \"inflate: length matches trailer\\n\"));\n }\n state.mode = DONE;\n /* falls through */\n case DONE:\n ret = Z_STREAM_END$1;\n break inf_leave;\n case BAD:\n ret = Z_DATA_ERROR$1;\n break inf_leave;\n case MEM:\n return Z_MEM_ERROR$1;\n case SYNC:\n /* falls through */\n default:\n return Z_STREAM_ERROR$1;\n }\n }\n\n // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n /*\n Return from inflate(), updating the total counts and the check value.\n If there was no progress during the inflate() call, return a buffer\n error. Call updatewindow() to create and/or update the window state.\n Note: a memory error from inflate() is non-recoverable.\n */\n\n //--- RESTORE() ---\n strm.next_out = put;\n strm.avail_out = left;\n strm.next_in = next;\n strm.avail_in = have;\n state.hold = hold;\n state.bits = bits;\n //---\n\n if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n (state.mode < CHECK || flush !== Z_FINISH$1))) {\n if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ;\n }\n _in -= strm.avail_in;\n _out -= strm.avail_out;\n strm.total_in += _in;\n strm.total_out += _out;\n state.total += _out;\n if (state.wrap && _out) {\n strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out));\n }\n strm.data_type = state.bits + (state.last ? 64 : 0) +\n (state.mode === TYPE ? 128 : 0) +\n (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {\n ret = Z_BUF_ERROR;\n }\n return ret;\n };\n\n\n const inflateEnd = (strm) => {\n\n if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n return Z_STREAM_ERROR$1;\n }\n\n let state = strm.state;\n if (state.window) {\n state.window = null;\n }\n strm.state = null;\n return Z_OK$1;\n };\n\n\n const inflateGetHeader = (strm, head) => {\n\n /* check state */\n if (!strm || !strm.state) { return Z_STREAM_ERROR$1; }\n const state = strm.state;\n if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; }\n\n /* save header structure */\n state.head = head;\n head.done = false;\n return Z_OK$1;\n };\n\n\n const inflateSetDictionary = (strm, dictionary) => {\n const dictLength = dictionary.length;\n\n let state;\n let dictid;\n let ret;\n\n /* check state */\n if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR$1; }\n state = strm.state;\n\n if (state.wrap !== 0 && state.mode !== DICT) {\n return Z_STREAM_ERROR$1;\n }\n\n /* check for correct dictionary identifier */\n if (state.mode === DICT) {\n dictid = 1; /* adler32(0, null, 0)*/\n /* dictid = adler32(dictid, dictionary, dictLength); */\n dictid = adler32_1(dictid, dictionary, dictLength, 0);\n if (dictid !== state.check) {\n return Z_DATA_ERROR$1;\n }\n }\n /* copy dictionary to window using updatewindow(), which will amend the\n existing dictionary if appropriate */\n ret = updatewindow(strm, dictionary, dictLength, dictLength);\n if (ret) {\n state.mode = MEM;\n return Z_MEM_ERROR$1;\n }\n state.havedict = 1;\n // Tracev((stderr, \"inflate: dictionary set\\n\"));\n return Z_OK$1;\n };\n\n\n var inflateReset_1 = inflateReset;\n var inflateReset2_1 = inflateReset2;\n var inflateResetKeep_1 = inflateResetKeep;\n var inflateInit_1 = inflateInit;\n var inflateInit2_1 = inflateInit2;\n var inflate_2$1 = inflate$1;\n var inflateEnd_1 = inflateEnd;\n var inflateGetHeader_1 = inflateGetHeader;\n var inflateSetDictionary_1 = inflateSetDictionary;\n var inflateInfo = 'pako inflate (from Nodeca project)';\n\n /* Not implemented\n module.exports.inflateCopy = inflateCopy;\n module.exports.inflateGetDictionary = inflateGetDictionary;\n module.exports.inflateMark = inflateMark;\n module.exports.inflatePrime = inflatePrime;\n module.exports.inflateSync = inflateSync;\n module.exports.inflateSyncPoint = inflateSyncPoint;\n module.exports.inflateUndermine = inflateUndermine;\n */\n\n var inflate_1$1 = {\n \tinflateReset: inflateReset_1,\n \tinflateReset2: inflateReset2_1,\n \tinflateResetKeep: inflateResetKeep_1,\n \tinflateInit: inflateInit_1,\n \tinflateInit2: inflateInit2_1,\n \tinflate: inflate_2$1,\n \tinflateEnd: inflateEnd_1,\n \tinflateGetHeader: inflateGetHeader_1,\n \tinflateSetDictionary: inflateSetDictionary_1,\n \tinflateInfo: inflateInfo\n };\n\n const _has = (obj, key) => {\n return Object.prototype.hasOwnProperty.call(obj, key);\n };\n\n var assign = function (obj /*from1, from2, from3, ...*/) {\n const sources = Array.prototype.slice.call(arguments, 1);\n while (sources.length) {\n const source = sources.shift();\n if (!source) { continue; }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be non-object');\n }\n\n for (const p in source) {\n if (_has(source, p)) {\n obj[p] = source[p];\n }\n }\n }\n\n return obj;\n };\n\n\n // Join array of chunks to single array.\n var flattenChunks = (chunks) => {\n // calculate data length\n let len = 0;\n\n for (let i = 0, l = chunks.length; i < l; i++) {\n len += chunks[i].length;\n }\n\n // join chunks\n const result = new Uint8Array(len);\n\n for (let i = 0, pos = 0, l = chunks.length; i < l; i++) {\n let chunk = chunks[i];\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result;\n };\n\n var common = {\n \tassign: assign,\n \tflattenChunks: flattenChunks\n };\n\n // String encode/decode helpers\n\n\n // Quick check if we can use fast array to bin string conversion\n //\n // - apply(Array) can fail on Android 2.2\n // - apply(Uint8Array) can fail on iOS 5.1 Safari\n //\n let STR_APPLY_UIA_OK = true;\n\n try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n // Table with utf8 lengths (calculated by first byte of sequence)\n // Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n // because max possible codepoint is 0x10ffff\n const _utf8len = new Uint8Array(256);\n for (let q = 0; q < 256; q++) {\n _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n }\n _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n // convert string to array (typed, when possible)\n var string2buf = (str) => {\n if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) {\n return new TextEncoder().encode(str);\n }\n\n let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n // count binary size\n for (m_pos = 0; m_pos < str_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n }\n\n // allocate buffer\n buf = new Uint8Array(buf_len);\n\n // convert\n for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n c = str.charCodeAt(m_pos);\n if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n c2 = str.charCodeAt(m_pos + 1);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n m_pos++;\n }\n }\n if (c < 0x80) {\n /* one byte */\n buf[i++] = c;\n } else if (c < 0x800) {\n /* two bytes */\n buf[i++] = 0xC0 | (c >>> 6);\n buf[i++] = 0x80 | (c & 0x3f);\n } else if (c < 0x10000) {\n /* three bytes */\n buf[i++] = 0xE0 | (c >>> 12);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n } else {\n /* four bytes */\n buf[i++] = 0xf0 | (c >>> 18);\n buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n buf[i++] = 0x80 | (c & 0x3f);\n }\n }\n\n return buf;\n };\n\n // Helper\n const buf2binstring = (buf, len) => {\n // On Chrome, the arguments in a function call that are allowed is `65534`.\n // If the length of the buffer is smaller than that, we can use this optimization,\n // otherwise we will take a slower path.\n if (len < 65534) {\n if (buf.subarray && STR_APPLY_UIA_OK) {\n return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len));\n }\n }\n\n let result = '';\n for (let i = 0; i < len; i++) {\n result += String.fromCharCode(buf[i]);\n }\n return result;\n };\n\n\n // convert array to string\n var buf2string = (buf, max) => {\n const len = max || buf.length;\n\n if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) {\n return new TextDecoder().decode(buf.subarray(0, max));\n }\n\n let i, out;\n\n // Reserve max possible length (2 words per char)\n // NB: by unknown reasons, Array is significantly faster for\n // String.fromCharCode.apply than Uint16Array.\n const utf16buf = new Array(len * 2);\n\n for (out = 0, i = 0; i < len;) {\n let c = buf[i++];\n // quick process ascii\n if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n let c_len = _utf8len[c];\n // skip 5 & 6 byte codes\n if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n // apply mask on first byte\n c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n // join the rest\n while (c_len > 1 && i < len) {\n c = (c << 6) | (buf[i++] & 0x3f);\n c_len--;\n }\n\n // terminated by end of string?\n if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n if (c < 0x10000) {\n utf16buf[out++] = c;\n } else {\n c -= 0x10000;\n utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n }\n }\n\n return buf2binstring(utf16buf, out);\n };\n\n\n // Calculate max possible position in utf8 buffer,\n // that will not break sequence. If that's not possible\n // - (very small limits) return max size as is.\n //\n // buf[] - utf8 bytes array\n // max - length limit (mandatory);\n var utf8border = (buf, max) => {\n\n max = max || buf.length;\n if (max > buf.length) { max = buf.length; }\n\n // go back from last position, until start of sequence found\n let pos = max - 1;\n while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n // Very small and broken sequence,\n // return max, because we should return something anyway.\n if (pos < 0) { return max; }\n\n // If we came to start of buffer - that means buffer is too small,\n // return max too.\n if (pos === 0) { return max; }\n\n return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n };\n\n var strings = {\n \tstring2buf: string2buf,\n \tbuf2string: buf2string,\n \tutf8border: utf8border\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n var messages = {\n 2: 'need dictionary', /* Z_NEED_DICT 2 */\n 1: 'stream end', /* Z_STREAM_END 1 */\n 0: '', /* Z_OK 0 */\n '-1': 'file error', /* Z_ERRNO (-1) */\n '-2': 'stream error', /* Z_STREAM_ERROR (-2) */\n '-3': 'data error', /* Z_DATA_ERROR (-3) */\n '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */\n '-5': 'buffer error', /* Z_BUF_ERROR (-5) */\n '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */\n };\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n function ZStream() {\n /* next input byte */\n this.input = null; // JS specific, because we have no pointers\n this.next_in = 0;\n /* number of bytes available at input */\n this.avail_in = 0;\n /* total number of input bytes read so far */\n this.total_in = 0;\n /* next output byte should be put there */\n this.output = null; // JS specific, because we have no pointers\n this.next_out = 0;\n /* remaining free space at output */\n this.avail_out = 0;\n /* total number of bytes output so far */\n this.total_out = 0;\n /* last error message, NULL if no error */\n this.msg = ''/*Z_NULL*/;\n /* not visible by applications */\n this.state = null;\n /* best guess about the data type: binary or text */\n this.data_type = 2/*Z_UNKNOWN*/;\n /* adler32 value of the uncompressed data */\n this.adler = 0;\n }\n\n var zstream = ZStream;\n\n // (C) 1995-2013 Jean-loup Gailly and Mark Adler\n // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n //\n // This software is provided 'as-is', without any express or implied\n // warranty. In no event will the authors be held liable for any damages\n // arising from the use of this software.\n //\n // Permission is granted to anyone to use this software for any purpose,\n // including commercial applications, and to alter it and redistribute it\n // freely, subject to the following restrictions:\n //\n // 1. The origin of this software must not be misrepresented; you must not\n // claim that you wrote the original software. If you use this software\n // in a product, an acknowledgment in the product documentation would be\n // appreciated but is not required.\n // 2. Altered source versions must be plainly marked as such, and must not be\n // misrepresented as being the original software.\n // 3. This notice may not be removed or altered from any source distribution.\n\n function GZheader() {\n /* true if compressed data believed to be text */\n this.text = 0;\n /* modification time */\n this.time = 0;\n /* extra flags (not used when writing a gzip file) */\n this.xflags = 0;\n /* operating system */\n this.os = 0;\n /* pointer to extra field or Z_NULL if none */\n this.extra = null;\n /* extra field length (valid if extra != Z_NULL) */\n this.extra_len = 0; // Actually, we don't need it in JS,\n // but leave for few code modifications\n\n //\n // Setup limits is not necessary because in js we should not preallocate memory\n // for inflate use constant limit in 65536 bytes\n //\n\n /* space at extra (only when reading header) */\n // this.extra_max = 0;\n /* pointer to zero-terminated file name or Z_NULL */\n this.name = '';\n /* space at name (only when reading header) */\n // this.name_max = 0;\n /* pointer to zero-terminated comment or Z_NULL */\n this.comment = '';\n /* space at comment (only when reading header) */\n // this.comm_max = 0;\n /* true if there was or will be a header crc */\n this.hcrc = 0;\n /* true when done reading gzip header (not used when writing a gzip file) */\n this.done = false;\n }\n\n var gzheader = GZheader;\n\n const toString = Object.prototype.toString;\n\n /* Public constants ==========================================================*/\n /* ===========================================================================*/\n\n const {\n Z_NO_FLUSH, Z_FINISH,\n Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR\n } = constants$1;\n\n /* ===========================================================================*/\n\n\n /**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n /* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n /**\n * Inflate.result -> Uint8Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param).\n **/\n\n /**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n /**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n /**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako')\n * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9])\n * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * const inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true); // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\n function Inflate(options) {\n this.options = common.assign({\n chunkSize: 1024 * 64,\n windowBits: 15,\n to: ''\n }, options || {});\n\n const opt = this.options;\n\n // Force window size for `raw` data, if not set directly,\n // because we have no header for autodetect.\n if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n opt.windowBits = -opt.windowBits;\n if (opt.windowBits === 0) { opt.windowBits = -15; }\n }\n\n // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n !(options && options.windowBits)) {\n opt.windowBits += 32;\n }\n\n // Gzip header has no info about windows size, we can do autodetect only\n // for deflate. So, if window size not set, force it to max when gzip possible\n if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n // bit 3 (16) -> gzipped data\n // bit 4 (32) -> autodetect gzip/deflate\n if ((opt.windowBits & 15) === 0) {\n opt.windowBits |= 15;\n }\n }\n\n this.err = 0; // error code, if happens (0 = Z_OK)\n this.msg = ''; // error message\n this.ended = false; // used to avoid multiple onEnd() calls\n this.chunks = []; // chunks of compressed data\n\n this.strm = new zstream();\n this.strm.avail_out = 0;\n\n let status = inflate_1$1.inflateInit2(\n this.strm,\n opt.windowBits\n );\n\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n\n this.header = new gzheader();\n\n inflate_1$1.inflateGetHeader(this.strm, this.header);\n\n // Setup dictionary\n if (opt.dictionary) {\n // Convert data if needed\n if (typeof opt.dictionary === 'string') {\n opt.dictionary = strings.string2buf(opt.dictionary);\n } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n opt.dictionary = new Uint8Array(opt.dictionary);\n }\n if (opt.raw) { //In raw mode we need to set the dictionary early\n status = inflate_1$1.inflateSetDictionary(this.strm, opt.dictionary);\n if (status !== Z_OK) {\n throw new Error(messages[status]);\n }\n }\n }\n }\n\n /**\n * Inflate#push(data[, flush_mode]) -> Boolean\n * - data (Uint8Array|ArrayBuffer): input data\n * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE\n * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH,\n * `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. If end of stream detected,\n * [[Inflate#onEnd]] will be called.\n *\n * `flush_mode` is not needed for normal operation, because end of stream\n * detected automatically. You may try to use it for advanced things, but\n * this functionality was not tested.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true); // push last chunk\n * ```\n **/\n Inflate.prototype.push = function (data, flush_mode) {\n const strm = this.strm;\n const chunkSize = this.options.chunkSize;\n const dictionary = this.options.dictionary;\n let status, _flush_mode, last_avail_out;\n\n if (this.ended) return false;\n\n if (flush_mode === ~~flush_mode) _flush_mode = flush_mode;\n else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH;\n\n // Convert data if needed\n if (toString.call(data) === '[object ArrayBuffer]') {\n strm.input = new Uint8Array(data);\n } else {\n strm.input = data;\n }\n\n strm.next_in = 0;\n strm.avail_in = strm.input.length;\n\n for (;;) {\n if (strm.avail_out === 0) {\n strm.output = new Uint8Array(chunkSize);\n strm.next_out = 0;\n strm.avail_out = chunkSize;\n }\n\n status = inflate_1$1.inflate(strm, _flush_mode);\n\n if (status === Z_NEED_DICT && dictionary) {\n status = inflate_1$1.inflateSetDictionary(strm, dictionary);\n\n if (status === Z_OK) {\n status = inflate_1$1.inflate(strm, _flush_mode);\n } else if (status === Z_DATA_ERROR) {\n // Replace code with more verbose\n status = Z_NEED_DICT;\n }\n }\n\n // Skip snyc markers if more data follows and not raw mode\n while (strm.avail_in > 0 &&\n status === Z_STREAM_END &&\n strm.state.wrap > 0 &&\n data[strm.next_in] !== 0)\n {\n inflate_1$1.inflateReset(strm);\n status = inflate_1$1.inflate(strm, _flush_mode);\n }\n\n switch (status) {\n case Z_STREAM_ERROR:\n case Z_DATA_ERROR:\n case Z_NEED_DICT:\n case Z_MEM_ERROR:\n this.onEnd(status);\n this.ended = true;\n return false;\n }\n\n // Remember real `avail_out` value, because we may patch out buffer content\n // to align utf8 strings boundaries.\n last_avail_out = strm.avail_out;\n\n if (strm.next_out) {\n if (strm.avail_out === 0 || status === Z_STREAM_END) {\n\n if (this.options.to === 'string') {\n\n let next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n let tail = strm.next_out - next_out_utf8;\n let utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n // move tail & realign counters\n strm.next_out = tail;\n strm.avail_out = chunkSize - tail;\n if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0);\n\n this.onData(utf8str);\n\n } else {\n this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));\n }\n }\n }\n\n // Must repeat iteration if out buffer is full\n if (status === Z_OK && last_avail_out === 0) continue;\n\n // Finalize if end of stream reached.\n if (status === Z_STREAM_END) {\n status = inflate_1$1.inflateEnd(this.strm);\n this.onEnd(status);\n this.ended = true;\n return true;\n }\n\n if (strm.avail_in === 0) break;\n }\n\n return true;\n };\n\n\n /**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|String): output data. When string output requested,\n * each chunk will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\n Inflate.prototype.onData = function (chunk) {\n this.chunks.push(chunk);\n };\n\n\n /**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n * other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH). By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\n Inflate.prototype.onEnd = function (status) {\n // On success - join\n if (status === Z_OK) {\n if (this.options.to === 'string') {\n this.result = this.chunks.join('');\n } else {\n this.result = common.flattenChunks(this.chunks);\n }\n }\n this.chunks = [];\n this.err = status;\n this.msg = this.strm.msg;\n };\n\n\n /**\n * inflate(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n * negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n * from utf8 to utf16 (javascript) string. When string output requested,\n * chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * const pako = require('pako');\n * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9]));\n * let output;\n *\n * try {\n * output = pako.inflate(input);\n * } catch (err) {\n * console.log(err);\n * }\n * ```\n **/\n function inflate(input, options) {\n const inflator = new Inflate(options);\n\n inflator.push(input);\n\n // That will never happens, if you don't cheat with options :)\n if (inflator.err) throw inflator.msg || messages[inflator.err];\n\n return inflator.result;\n }\n\n\n /**\n * inflateRaw(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\n function inflateRaw(input, options) {\n options = options || {};\n options.raw = true;\n return inflate(input, options);\n }\n\n\n /**\n * ungzip(data[, options]) -> Uint8Array|String\n * - data (Uint8Array): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\n var Inflate_1 = Inflate;\n var inflate_2 = inflate;\n var inflateRaw_1 = inflateRaw;\n var ungzip = inflate;\n var constants = constants$1;\n\n var inflate_1 = {\n \tInflate: Inflate_1,\n \tinflate: inflate_2,\n \tinflateRaw: inflateRaw_1,\n \tungzip: ungzip,\n \tconstants: constants\n };\n\n exports.Inflate = Inflate_1;\n exports.constants = constants;\n exports['default'] = inflate_1;\n exports.inflate = inflate_2;\n exports.inflateRaw = inflateRaw_1;\n exports.ungzip = ungzip;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"],"names":["exports","adler32_1","adler","buf","len","pos","s1","s2","n","crcTable","Uint32Array","c","table","k","makeTable","crc32_1","crc","t","end","i","inffast","strm","start","_in","last","_out","beg","dmax","wsize","whave","wnext","s_window","hold","bits","lcode","dcode","lmask","dmask","here","op","dist","from","from_source","input","output","state","next_in","avail_in","next_out","avail_out","window","lencode","distcode","lenbits","distbits","top","dolen","mode","msg","dodist","sane","MAXBITS","lbase","Uint16Array","lext","Uint8Array","dbase","dext","inftrees","type","lens","lens_index","codes","table_index","work","opts","incr","fill","low","mask","next","sym","min","max","root","curr","drop","left","used","huff","base","base_index","count","offs","here_bits","here_op","here_val","extra","extra_index","constants$1","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","Z_FINISH$1","Z_OK$1","Z_STREAM_END$1","Z_NEED_DICT$1","Z_STREAM_ERROR$1","Z_DATA_ERROR$1","Z_MEM_ERROR$1","TYPE","BAD","zswap32","q","InflateState","this","wrap","havedict","flags","check","total","head","wbits","length","offset","ncode","nlen","ndist","have","lendyn","distdyn","back","was","inflateResetKeep","total_in","total_out","Int32Array","inflateReset","inflateReset2","windowBits","inflateInit2","ret","lenfix","distfix","virgin","fixedtables","updatewindow","src","copy","set","subarray","inflate_1$1","flush","put","last_bits","last_op","last_val","hbuf","order","inf_leave","done","text","time","xflags","os","extra_len","name","String","fromCharCode","comment","hcrc","data_type","dictionary","dictLength","dictid","_has","obj","key","Object","prototype","hasOwnProperty","call","common","sources","Array","slice","arguments","source","shift","TypeError","p","chunks","l","result","chunk","STR_APPLY_UIA_OK","apply","__","_utf8len","strings","str","TextEncoder","encode","c2","m_pos","str_len","buf_len","charCodeAt","TextDecoder","decode","out","utf16buf","c_len","buf2binstring","messages","zstream","gzheader","toString","Inflate","options","chunkSize","to","opt","raw","err","ended","status","Error","header","inflate","inflator","push","data","flush_mode","_flush_mode","last_avail_out","onEnd","next_out_utf8","tail","utf8str","onData","join","Inflate_1","inflate_2","inflateRaw_1","ungzip","constants","inflate_1","inflateRaw","defineProperty","value","factory"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/830.40ad866af0cfa6029267.js b/dist/830.40ad866af0cfa6029267.js deleted file mode 100644 index 2fe0a5ea0..000000000 --- a/dist/830.40ad866af0cfa6029267.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[830],{7799:(e,t,n)=>{n.d(t,{Z:()=>u});var o=n(4050),r=n(9118),c=n(6752),s=n(8674),a=n(5332);let l,i;async function d(){return l||(l=n.e(941).then(n.bind(n,7941)),i=(await l).default),l}setTimeout(d,5e3);const u=(0,o.X$)((({className:e,id:t,animationData:n,play:l,playSegment:u,speed:m,noLoop:p,size:f,quality:g,isLowPriority:h,onLoad:v,color:w,onEnded:Z})=>{const[b,y]=(0,o.eJ)(),C=(0,o.sO)(null),E=(0,o.sO)(!1),k=(0,o.sO)(!1),T=(0,o.sO)(!0),x=(0,o.sO)();x.current=l;const P=(0,o.sO)();P.current=u,(0,o.d4)((()=>{if(b||!n)return;const e=()=>{if(!C.current)return;const e=new i(t,C.current,n,{noLoop:p,size:f,quality:g,isLowPriority:h},v,w,Z);m&&e.setSpeed(m),y(e)};i?e():d().then((()=>{(0,r.T2)((()=>{C.current&&e()}))}))}),[w,b,n,t,h,p,v,g,f,m,Z]),(0,o.d4)((()=>{b&&b.setColor(w)}),[w,b]),(0,o.d4)((()=>()=>{b&&b.destroy()}),[b]);const I=(0,o.I4)(((e=!1)=>{b&&(x.current||P.current)&&(P.current?b.playSegment(P.current):e?b.goToAndPlay(0):b.play())}),[b]),A=(0,o.I4)((()=>{b&&b.pause()}),[b]),N=(0,o.I4)((()=>{k.current=!0,b&&(E.current||(E.current=b.isPlaying()),A())}),[b,A]),S=(0,o.I4)((()=>{E.current&&I(),E.current=!1,k.current=!1}),[I]),L=(0,o.I4)((()=>{(0,r.T2)(S)}),[S]);(0,o.d4)((()=>{b&&(l||u?k.current?E.current=!0:I(p):k.current?E.current=!1:A())}),[b,l,u,p,I,A]),(0,o.d4)((()=>{b&&(T.current?T.current=!1:(b.changeData(n),I()))}),[I,b,n]),(0,s.ZP)(N,S),(0,a.Z)(N,L);const B=(0,c.Z)("AnimatedSticker",e),O=f?`width: ${f}px; height: ${f}px;`:void 0;return o.ZP.createElement("div",{ref:C,className:B,style:O})}))},172:(e,t,n)=>{n.d(t,{Z:()=>p});var o=n(4050),r=n(6137),c=n(3716),s=n(2858),a=n(2155),l=n(6752),i=n(2340),d=n(6202),u=n(1212),m=n(9107);const p=(0,o.X$)((({className:e,size:t="large",chat:n,user:p,photo:f,userStatus:g,text:h,isSavedMessages:v,lastSyncTime:w,onClick:Z})=>{const b=p&&(0,s.NB)(p),y=p&&(0,s.pK)(p.id);let C;v||b||(p?C=(0,s.RT)(p):n?C=(0,s.RT)(n):f&&(C=`photo${f.id}?size=m`));const E=(0,d.Z)(C,!1,r.IU.BlobUrl,w),k=Boolean(E),{transitionClassNames:T}=(0,u.Z)(k,void 0,k,"slow"),x=(0,m.Z)();let P="";if(v)P=o.ZP.createElement("i",{className:"icon-avatar-saved-messages"});else if(b)P=o.ZP.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)P=o.ZP.createElement("i",{className:"icon-reply-filled"});else if(E)P=o.ZP.createElement("img",{src:E,className:(0,l.Z)("avatar-media",T),alt:"",decoding:"async"});else if(p){const e=(0,s.Js)(p);P=e?(0,a.Xv)(e,2):void 0}else if(n){const e=(0,s.U)(x,n);P=e&&(0,a.Xv)(e,(0,s.YC)(n.id)?2:1)}else h&&(P=(0,a.Xv)(h,2));const I=!v&&p&&g&&(0,s.kM)(p,g),A=(0,l.Z)(`Avatar size-${t}`,e,`color-bg-${(0,s.Rs)(p||n)}`,v&&"saved-messages",b&&"deleted-account",y&&"replies-bot-account",I&&"online",Z&&"interactive",!v&&!E&&"no-photo"),N=Boolean(v||E),S=(0,o.I4)((e=>{Z&&Z(e,N)}),[Z,N]),L=(p||n)&&(p||n).id;return o.ZP.createElement("div",{className:A,onClick:S,"data-test-sender-id":c.Cg?L:void 0},"string"==typeof P?(0,i.Z)(P,["jumbo"===t?"hq_emoji":"emoji"]):P)}))},7324:(e,t,n)=>{n.d(t,{x:()=>c,Z:()=>s});var o=n(6137),r=n(647);const c={MonkeyIdle:n(8760),MonkeyTracking:n(2750),MonkeyClose:n(6257),MonkeyPeek:n(7785),FoldersAll:n(9356),FoldersNew:n(5485),DiscussionGroups:n(6978),CameraFlip:n(5665),HandFilled:n(2456),HandOutline:n(5667),Speaker:n(8763),VoiceAllowTalk:n(401),VoiceMini:n(5106),VoiceMuted:n(487),VoiceOutlined:n(5740),Peach:n(3677),Eggplant:n(5435),Cumshot:n(1879)};function s(e){const t=c[e].replace(window.location.origin,"");return r.he(`file${t}`,o.IU.Lottie)}},7551:(e,t,n)=>{n.d(t,{Z:()=>a});var o=n(4050),r=n(9107),c=n(3103),s=n(231);const a=(0,o.X$)((({isOpen:e,onClose:t,onCloseAnimationEnd:n,title:a,header:l,text:i,textParts:d,confirmLabel:u="Confirm",confirmHandler:m,confirmIsDestructive:p,isButtonsInOneRow:f,children:g})=>{const h=(0,r.Z)();return o.ZP.createElement(c.Z,{className:"confirm",title:a,header:l,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:m},i&&i.split("\\n").map((e=>o.ZP.createElement("p",null,e))),d||g,o.ZP.createElement("div",{className:f?"dialog-buttons mt-2":""},o.ZP.createElement(s.Z,{className:"confirm-dialog-button",isText:!0,onClick:m,color:p?"danger":"primary"},u),o.ZP.createElement(s.Z,{className:"confirm-dialog-button",isText:!0,onClick:t},h("Cancel"))))}))},1273:(e,t,n)=>{n.d(t,{Z:()=>a});var o=n(1713),r=n(4050),c=n(9118),s=n(7675);const a=({ref:e,className:t,onLoadMore:n,onScroll:a,onKeyDown:l,items:i,itemSelector:d=".ListItem",preloadBackwards:u=20,sensitiveArea:m=800,noScrollRestore:p=!1,noScrollRestoreOnTop:f=!1,noFastList:g,cacheBuster:h,children:v})=>{let w=(0,r.sO)(null);e&&(w=e);const Z=(0,r.sO)({}),[b,y]=(0,r.Ye)((()=>n?[(0,c.Ds)(((e=!1)=>{n({direction:o.Uq.Backwards,noScroll:e})}),1e3,!0,!1),(0,c.Ds)((()=>{n({direction:o.Uq.Forwards})}),1e3,!0,!1)]:[]),[n,i]);(0,r.d4)((()=>{if(!b)return;if(u>0&&(!i||i.length{const e=w.current,t=Z.current;let n;if(t.listItemElements=e.querySelectorAll(d),t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:o}=e;n=o+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}p||f&&0===e.scrollTop||((0,s.Z)(e,n),t.isScrollTopJustUpdated=!0)}),[i,d,p,f,h]);const C=(0,r.I4)((e=>{if(y&&b){const{isScrollTopJustUpdated:e,currentAnchor:t,currentAnchorTop:n}=Z.current,o=Z.current.listItemElements;if(e)return void(Z.current.isScrollTopJustUpdated=!1);const r=o.length,c=w.current,{scrollTop:s,scrollHeight:a,offsetHeight:l}=c,i=s<=(r?o[0].offsetTop:0)+m,d=(r?o[r-1].offsetTop+o[r-1].offsetHeight:a)-(s+l)<=m;let u=!1;if(i){const e=o[0];if(e){const o=e.getBoundingClientRect().top,r=null!=t&&t.offsetParent&&t!==e?t.getBoundingClientRect().top:o;t&&void 0!==n&&r>n&&(Z.current.currentAnchor=e,Z.current.currentAnchorTop=o,u=!0,y())}}if(d){const e=o[r-1];if(e){const o=e.getBoundingClientRect().top,r=null!=t&&t.offsetParent&&t!==e?t.getBoundingClientRect().top:o;t&&void 0!==n&&r{n.d(t,{Z:()=>p});var o=n(4050),r=n(517),c=n(6752),s=n(8674),a=n(1212),l=n(274),i=n(9107),d=n(6590),u=n(231),m=n(2898);const p=({dialogRef:e,title:t,className:n,isOpen:p,header:f,hasCloseButton:g,noBackdrop:h,children:v,onClose:w,onCloseAnimationEnd:Z,onEnter:b,shouldSkipHistoryAnimations:y})=>{const{shouldRender:C,transitionClassNames:E}=(0,a.Z)(p,Z,y,void 0,y),k=(0,o.sO)(null);(0,o.d4)((()=>p?(0,r.Z)({onEsc:w,onEnter:b}):void 0),[p,w,b]),(0,o.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 o=n.findIndex((e=>e.isSameNode(document.activeElement)));let r=0;o>=0&&(r=t.shiftKey?o>0?o-1:n.length-1:o{document.removeEventListener("keydown",t,!1)}}(k.current):void 0),[p]);const{forceClose:T}=(0,d.ZP)(p,w);(0,o.d4)((()=>()=>{p&&T()}),[]),(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 x=(0,i.Z)();if(!C)return;const P=(0,c.Z)("Modal",n,E,h&&"transparent-backdrop");return o.ZP.createElement(m.Z,null,o.ZP.createElement("div",{ref:k,className:P,tabIndex:-1,role:"dialog"},o.ZP.createElement("div",{className:"modal-container"},o.ZP.createElement("div",{className:"modal-backdrop",onClick:w}),o.ZP.createElement("div",{className:"modal-dialog",ref:e},f||(t?o.ZP.createElement("div",{className:"modal-header"},g&&o.ZP.createElement(u.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:x("Close"),onClick:w},o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement("div",{className:"modal-title"},t)):void 0),o.ZP.createElement("div",{className:"modal-content custom-scroll"},v)))))}},2898:(e,t,n)=>{n.d(t,{Z:()=>c});var o=n(4050),r=n(2916);const c=({containerId:e,className:t,children:n})=>{const c=(0,o.sO)();return c.current||(c.current=document.createElement("div")),(0,o.bt)((()=>{const n=document.querySelector(e||"#portals");if(!n)return;const o=c.current;return t&&o.classList.add(t),n.appendChild(o),()=>{r.Z.render(void 0,o),n.removeChild(o)}}),[t,e]),r.Z.render(n,c.current)}},5332:(e,t,n)=>{n.d(t,{Z:()=>r});var o=n(4050);function r(e,t){(0,o.d4)((()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)})),[e,t])}},8360:(e,t,n)=>{n.d(t,{Z:()=>r});var o=n(7204);function r(e,t=!1,n=!1){const r=(0,o.Z)(e,t);return n||null!=e?e:r}},7407:(e,t,n)=>{n.d(t,{Z:()=>l});var o=n(4050),r=n(1713),c=n(782),s=n(5326),a=n(7204);const l=(e,t,n=!1,l=30,d=!1)=>{const u=(0,o.sO)(),m=(0,o.sO)((()=>{if(!t||u.current)return;const{newViewportIds:e}=i(t,r.Uq.Forwards,l,t[0]);return e})()),p=(0,s.Z)(),f=(0,a.Z)(t),g=(0,a.Z)(n);if(t&&!n&&(t!==f||n!==g)){const{offsetId:e=t[0],direction:n=r.Uq.Forwards}=u.current||{},{newViewportIds:o}=i(t,n,l,e);m.current&&(0,c.et)(m.current,o)||(m.current=o)}(0,o.d4)((()=>{if(t&&!n&&e&&d){const t=m.current;e({offsetId:t[t.length-1]})}}),[t,n,e,d]);const h=(0,o.I4)((({direction:n,noScroll:o})=>{const s=m.current,a=s?n===r.Uq.Backwards?s[s.length-1]:s[0]:void 0;if(!t)return void(e&&e({offsetId:a}));o||(u.current={...u.current,direction:n,offsetId:a});const{newViewportIds:d,areSomeLocal:f,areAllLocal:g}=i(t,n,l,a);!f||s&&(0,c.et)(s,d)||(m.current=d,p()),!g&&e&&e({offsetId:a})}),[t,l,e,p]);return n?[t]:[m.current,h]};function i(e,t,n,o){const{length:c}=e,s=o?e.indexOf(o):0,a=t===r.Uq.Forwards?s:s+1||c,l=Math.max(0,a-n),i=a+n-1,d=e.slice(Math.max(0,l),i+1);let u,m;switch(t){case r.Uq.Forwards:u=a>0,m=l>=0;break;case r.Uq.Backwards:u=a{n.d(t,{Z:()=>a});var o=n(4050),r=n(6137),c=n(647),s=n(5326);const a=(e,t=!1,n=r.IU.BlobUrl,a,l)=>{const i=e?c.UV(e):void 0,d=(0,s.Z)();return(0,o.d4)((()=>{if(!t&&e&&!i){const t=Date.now();c.he(e,n).then((()=>{const e=Date.now()-t;!l||e>=l?d():setTimeout(d,l-e)}))}}),[t,e,i,n,a,d,l]),i}},4319:(e,t,n)=>{n.d(t,{yl:()=>r,TE:()=>s,VP:()=>a});var o=n(3716);const r=navigator.clipboard&&window.ClipboardItem,c=document.createElement("textarea");c.setAttribute("readonly",""),c.tabIndex=-1,c.className="visually-hidden";const s=e=>{c.value=e,document.body.appendChild(c);const t=document.getSelection();if(t){const e=t.rangeCount>0&&t.getRangeAt(0);c.select(),document.execCommand("copy"),e&&(t.removeAllRanges(),t.addRange(e))}document.body.removeChild(c)},a=e=>{if(!e)return;const t=document.createElement("canvas"),n=t.getContext("2d"),o=new Image;o.onload=e=>{if(n&&e.currentTarget){const o=e.currentTarget;t.width=o.width,t.height=o.height,n.drawImage(o,0,0,o.width,o.height),t.toBlob(l,"image/png",1)}},o.src=e};async function l(e){if(e&&r)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){o.eM&&console.error(e)}}},2972:(e,t,n)=>{function o(e){e.offsetWidth}n.d(t,{Z:()=>o})},7675:(e,t,n)=>{n.d(t,{Z:()=>c,z:()=>s});var o=n(7361),r=n(2972);const c=(e,t)=>{o.cj&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),o.cj&&(e.style.overflow="")};function s(e){e.style.display="none",(0,r.Z)(e),e.style.display=""}},4753:(e,t,n)=>{n.d(t,{Z:()=>r});var o=n(3716);const r=e=>{e.play().catch((t=>{o.eM&&console.warn(t,e)}))}},1879:(e,t,n)=>{e.exports=n.p+"Cumshot.7a17984a6b80787dab34..tgs"},5435:(e,t,n)=>{e.exports=n.p+"Eggplant.7693d877087b802d04be..tgs"},3677:(e,t,n)=>{e.exports=n.p+"Peach.a289b2c54c563f11208f..tgs"},5665:(e,t,n)=>{e.exports=n.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},2456:(e,t,n)=>{e.exports=n.p+"HandFilled.f87939d160f1dc288586..tgs"},5667:(e,t,n)=>{e.exports=n.p+"HandOutline.f9831751ba60df30c484..tgs"},8763:(e,t,n)=>{e.exports=n.p+"Speaker.04bb3743412b41ff83c5..tgs"},401:(e,t,n)=>{e.exports=n.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},5106:(e,t,n)=>{e.exports=n.p+"VoiceMini.bf00ffdf69625c579569..tgs"},487:(e,t,n)=>{e.exports=n.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},5740:(e,t,n)=>{e.exports=n.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"},6257:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},8760:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},7785:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},2750:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6978:(e,t,n)=>{e.exports=n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},9356:(e,t,n)=>{e.exports=n.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},5485:(e,t,n)=>{e.exports=n.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"}}]); -//# sourceMappingURL=830.40ad866af0cfa6029267.js.map \ No newline at end of file diff --git a/dist/830.40ad866af0cfa6029267.js.map b/dist/830.40ad866af0cfa6029267.js.map deleted file mode 100644 index 847b7188a..000000000 --- a/dist/830.40ad866af0cfa6029267.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"830.40ad866af0cfa6029267.js","mappings":"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","sources":["webpack://telegram-t/./src/components/common/AnimatedSticker.tsx","webpack://telegram-t/./src/components/common/Avatar.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/ui/ConfirmDialog.tsx","webpack://telegram-t/./src/components/ui/InfiniteScroll.tsx","webpack://telegram-t/./src/components/ui/Modal.tsx","webpack://telegram-t/./src/util/trapFocus.ts","webpack://telegram-t/./src/components/ui/Portal.ts","webpack://telegram-t/./src/hooks/useBackgroundMode.ts","webpack://telegram-t/./src/hooks/useCurrentOrPrev.ts","webpack://telegram-t/./src/hooks/useInfiniteScroll.ts","webpack://telegram-t/./src/hooks/useMedia.ts","webpack://telegram-t/./src/util/clipboard.ts","webpack://telegram-t/./src/util/forceReflow.ts","webpack://telegram-t/./src/util/resetScroll.ts","webpack://telegram-t/./src/util/safePlay.ts"],"sourcesContent":["import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData: AnyLiteral;\n play?: boolean | string;\n playSegment?: [number, number];\n speed?: number;\n noLoop?: boolean;\n size: number;\n quality?: number;\n isLowPriority?: boolean;\n onLoad?: NoneToVoidFunction;\n color?: [number, number, number];\n onEnded?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n onLoad,\n color,\n onEnded,\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 onEnded,\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, onEnded]);\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 { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser, ApiUserStatus,\n} from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getUserColorKey,\n getUserFullName,\n isUserId,\n isChatWithRepliesBot,\n isDeletedUser,\n isUserOnline,\n} from '../../modules/helpers';\nimport { getFirstLetters } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport './Avatar.scss';\n\ntype OwnProps = {\n className?: string;\n size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n chat?: ApiChat;\n user?: ApiUser;\n photo?: ApiPhoto;\n userStatus?: ApiUserStatus;\n text?: string;\n isSavedMessages?: boolean;\n lastSyncTime?: number;\n onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void;\n};\n\nconst Avatar: FC = ({\n className,\n size = 'large',\n chat,\n user,\n photo,\n userStatus,\n text,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const isDeleted = user && isDeletedUser(user);\n const isReplies = user && isChatWithRepliesBot(user.id);\n let imageHash: string | undefined;\n\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n imageHash = getChatAvatarHash(user);\n } else if (chat) {\n imageHash = getChatAvatarHash(chat);\n } else if (photo) {\n imageHash = `photo${photo.id}?size=m`;\n }\n }\n\n const blobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const hasBlobUrl = Boolean(blobUrl);\n const { transitionClassNames } = useShowTransition(hasBlobUrl, undefined, hasBlobUrl, 'slow');\n\n const lang = useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (isReplies) {\n content = ;\n } else if (blobUrl) {\n content = (\n \"\"\n );\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isUserId(chat.id) ? 2 : 1);\n } else if (text) {\n content = getFirstLetters(text, 2);\n }\n\n const isOnline = !isSavedMessages && user && userStatus && isUserOnline(user, userStatus);\n const fullClassName = buildClassName(\n `Avatar size-${size}`,\n className,\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n isReplies && 'replies-bot-account',\n isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !blobUrl) && 'no-photo',\n );\n\n const hasImage = Boolean(isSavedMessages || blobUrl);\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (onClick) {\n onClick(e, hasImage);\n }\n }, [onClick, hasImage]);\n\n const senderId = (user || chat) && (user || chat)!.id;\n\n return (\n
\n {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content}\n
\n );\n};\n\nexport default memo(Avatar);\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/tgs/settings/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/tgs/settings/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/tgs/settings/DiscussionGroupsDucks.tgs';\n// @ts-ignore\nimport CameraFlip from '../../../assets/tgs/calls/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/tgs/calls/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/tgs/calls/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/tgs/calls/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/tgs/calls/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/tgs/calls/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/tgs/calls/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/tgs/calls/VoiceOutlined.tgs';\n// @ts-ignore\nimport Peach from '../../../assets/tgs/animatedEmojis/Peach.tgs';\n// @ts-ignore\nimport Eggplant from '../../../assets/tgs/animatedEmojis/Eggplant.tgs';\n// @ts-ignore\nimport Cumshot from '../../../assets/tgs/animatedEmojis/Cumshot.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 Peach,\n Eggplant,\n Cumshot,\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, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport Modal from './Modal';\nimport Button from './Button';\n\ntype OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n title?: string;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n children?: any;\n};\n\nconst ConfirmDialog: FC = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n title,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n children,\n}) => {\n const lang = useLang();\n\n return (\n \n {text && text.split('\\\\n').map((textPart) => (\n

{textPart}

\n ))}\n {textParts || children}\n
\n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default memo(ConfirmDialog);\n","import { RefObject, UIEvent } from 'react';\nimport { LoadMoreDirection } from '../../types';\n\nimport React, {\n FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport resetScroll from '../../util/resetScroll';\n\ntype OwnProps = {\n ref?: RefObject;\n className?: string;\n onLoadMore?: ({ direction }: { direction: LoadMoreDirection; noScroll?: boolean }) => void;\n onScroll?: (e: UIEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n noScrollRestore?: boolean;\n noScrollRestoreOnTop?: boolean;\n noFastList?: boolean;\n cacheBuster?: any;\n children: any;\n};\n\nconst DEFAULT_LIST_SELECTOR = '.ListItem';\nconst DEFAULT_PRELOAD_BACKWARDS = 20;\nconst DEFAULT_SENSITIVE_AREA = 800;\n\nconst InfiniteScroll: FC = ({\n ref,\n className,\n onLoadMore,\n onScroll,\n onKeyDown,\n items,\n itemSelector = DEFAULT_LIST_SELECTOR,\n preloadBackwards = DEFAULT_PRELOAD_BACKWARDS,\n sensitiveArea = DEFAULT_SENSITIVE_AREA,\n // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists)\n noScrollRestore = false,\n noScrollRestoreOnTop = false,\n noFastList,\n // Used to re-query `listItemElements` if rendering is delayed by transition\n cacheBuster,\n children,\n}: OwnProps) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const stateRef = useRef<{\n listItemElements?: NodeListOf;\n isScrollTopJustUpdated?: boolean;\n currentAnchor?: HTMLDivElement | undefined;\n currentAnchorTop?: number;\n }>({});\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce((noScroll = false) => {\n onLoadMore({ direction: LoadMoreDirection.Backwards, noScroll });\n }, 1000, true, false),\n debounce(() => {\n onLoadMore({ direction: LoadMoreDirection.Forwards });\n }, 1000, true, false),\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore, items]);\n\n // Initial preload\n useEffect(() => {\n if (!loadMoreBackwards) {\n return;\n }\n\n if (preloadBackwards > 0 && (!items || items.length < preloadBackwards)) {\n loadMoreBackwards(true);\n return;\n }\n\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\n }\n }, [items, loadMoreBackwards, preloadBackwards]);\n\n // Restore `scrollTop` after adding items\n useLayoutEffect(() => {\n const container = containerRef.current!;\n const state = stateRef.current;\n\n state.listItemElements = container.querySelectorAll(itemSelector);\n\n let newScrollTop;\n\n if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) {\n const { scrollTop } = container;\n const newAnchorTop = state.currentAnchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop!);\n } else {\n const nextAnchor = state.listItemElements[0];\n if (nextAnchor) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n if (noScrollRestore) {\n return;\n }\n\n if (noScrollRestoreOnTop && container.scrollTop === 0) {\n return;\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [items, itemSelector, noScrollRestore, noScrollRestoreOnTop, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n const listItemElements = stateRef.current.listItemElements!;\n\n if (isScrollTopJustUpdated) {\n stateRef.current.isScrollTopJustUpdated = false;\n return;\n }\n\n const listLength = listItemElements.length;\n const container = containerRef.current!;\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const top = listLength ? listItemElements[0].offsetTop : 0;\n const isNearTop = scrollTop <= top + sensitiveArea;\n const bottom = listLength\n ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight\n : scrollHeight;\n const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea;\n let isUpdated = false;\n\n if (isNearTop) {\n const nextAnchor = listItemElements[0];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor?.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingUp = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop\n );\n\n if (isMovingUp) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n loadMoreForwards();\n }\n }\n }\n\n if (isNearBottom) {\n const nextAnchor = listItemElements[listLength - 1];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor?.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingDown = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop\n );\n\n if (isMovingDown) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n loadMoreBackwards();\n }\n }\n }\n\n if (!isUpdated) {\n if (currentAnchor?.offsetParent) {\n stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top;\n } else {\n const nextAnchor = listItemElements[0];\n\n if (nextAnchor) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n }\n }\n\n if (onScroll) {\n onScroll(e);\n }\n }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default InfiniteScroll;\n","import { RefObject } from 'react';\nimport React, {\n FC, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string | TextPart[];\n className?: string;\n isOpen?: boolean;\n header?: any;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n dialogRef?: RefObject;\n};\n\ntype StateProps = {\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst Modal: FC = ({\n dialogRef,\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n shouldSkipHistoryAnimations,\n}) => {\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(\n isOpen, onCloseAnimationEnd, shouldSkipHistoryAnimations, undefined, shouldSkipHistoryAnimations,\n );\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n const { forceClose } = useHistoryBack(isOpen, onClose);\n\n // For modals that are closed by unmounting without changing `isOpen` to `false`\n useEffect(() => {\n return () => {\n if (isOpen) {\n forceClose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef();\n if (!elementRef.current) {\n elementRef.current = document.createElement('div');\n }\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current!;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\nimport { LoadMoreDirection } from '../types';\n\nimport { areSortedArraysEqual } from '../util/iteratees';\nimport useForceUpdate from './useForceUpdate';\nimport usePrevious from './usePrevious';\n\ntype GetMore = (args: { direction: LoadMoreDirection }) => void;\ntype LoadMoreBackwards = (args: { offsetId?: string | number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default (\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: ListId[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [ListId[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: ListId;\n }>();\n\n const viewportIdsRef = useRef((() => {\n // Only run once to initialize\n if (!listIds || lastParamsRef.current) {\n return undefined;\n }\n\n const { newViewportIds } = getViewportSlice(listIds, LoadMoreDirection.Forwards, listSlice, listIds[0]);\n return newViewportIds;\n })());\n\n const forceUpdate = useForceUpdate();\n\n const prevListIds = usePrevious(listIds);\n const prevIsDisabled = usePrevious(isDisabled);\n if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {\n const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};\n const { newViewportIds } = getViewportSlice(listIds, direction, listSlice, offsetId);\n\n if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {\n viewportIdsRef.current = newViewportIds;\n }\n }\n\n useEffect(() => {\n if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) {\n const viewportIds = viewportIdsRef.current!;\n loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] });\n }\n }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]);\n\n const getMore: GetMore = useCallback(({\n direction,\n noScroll,\n }: { direction: LoadMoreDirection; noScroll?: boolean }) => {\n const viewportIds = viewportIdsRef.current;\n\n const offsetId = viewportIds\n ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0]\n : undefined;\n\n if (!listIds) {\n if (loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n\n return;\n }\n\n if (!noScroll) {\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n }\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, direction, listSlice, offsetId);\n\n if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) {\n viewportIdsRef.current = newViewportIds;\n forceUpdate();\n }\n\n if (!areAllLocal && loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n }, [listIds, listSlice, loadMoreBackwards, forceUpdate]);\n\n return isDisabled ? [listIds] : [viewportIdsRef.current, getMore];\n};\n\nfunction getViewportSlice(\n sourceIds: ListId[],\n direction: LoadMoreDirection,\n listSlice: number,\n offsetId?: ListId,\n) {\n const { length } = sourceIds;\n const index = offsetId ? sourceIds.indexOf(offsetId) : 0;\n const isForwards = direction === LoadMoreDirection.Forwards;\n const indexForDirection = isForwards ? index : (index + 1) || length;\n const from = Math.max(0, indexForDirection - listSlice);\n const to = indexForDirection + listSlice - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (\n mediaHash: string | false | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl?: string) => {\n if (!imageUrl) return;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","// Used before applying CSS transition\nexport default function forceReflow(element: HTMLElement) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n element.offsetWidth;\n}\n","import { IS_IOS } from './environment';\nimport forceReflow from './forceReflow';\n\nexport default (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n\n// Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=1264266\nexport function patchChromiumScroll(element: HTMLElement) {\n element.style.display = 'none';\n forceReflow(element);\n element.style.display = '';\n}\n","import { DEBUG } from '../config';\n\nexport default (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err, mediaEl);\n }\n });\n};\n"],"names":["lottiePromise","RLottie","async","ensureLottie","default","setTimeout","memo","className","id","animationData","play","playSegment","speed","noLoop","size","quality","isLowPriority","onLoad","color","onEnded","animation","setAnimation","useState","container","useRef","wasPlaying","isFrozen","isFirstRender","playRef","current","playSegmentRef","useEffect","exec","newAnimation","setSpeed","then","fastRaf","setColor","destroy","playAnimation","useCallback","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","changeData","useHeavyAnimationCheck","useBackgroundMode","fullClassName","buildClassName","style","undefined","ref","chat","user","photo","userStatus","text","isSavedMessages","lastSyncTime","onClick","isDeleted","isDeletedUser","isReplies","isChatWithRepliesBot","imageHash","getChatAvatarHash","blobUrl","useMedia","ApiMediaFormat","hasBlobUrl","Boolean","transitionClassNames","useShowTransition","lang","useLang","content","src","alt","decoding","userFullName","getUserFullName","getFirstLetters","title","getChatTitle","isUserId","isOnline","isUserOnline","getUserColorKey","hasImage","handleClick","e","senderId","IS_TEST","renderText","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","Peach","Eggplant","Cumshot","getAnimationData","name","path","replace","window","location","origin","mediaLoader","isOpen","onClose","onCloseAnimationEnd","header","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","children","onEnter","split","map","textPart","isText","onLoadMore","onScroll","onKeyDown","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","cacheBuster","containerRef","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","debounce","noScroll","direction","LoadMoreDirection","length","scrollHeight","clientHeight","useLayoutEffect","state","newScrollTop","listItemElements","querySelectorAll","currentAnchor","Array","from","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","offsetParent","teactFastList","dialogRef","hasCloseButton","noBackdrop","shouldSkipHistoryAnimations","shouldRender","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","preventDefault","stopPropagation","focusableElements","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","focus","addEventListener","removeEventListener","trapFocus","forceClose","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","tabIndex","role","Button","round","ariaLabel","containerId","elementRef","createElement","querySelector","add","appendChild","TeactDOM","removeChild","onBlur","onFocus","hasFocus","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","usePrevious","listIds","isDisabled","listSlice","forceFullPreload","lastParamsRef","viewportIdsRef","newViewportIds","getViewportSlice","forceUpdate","useForceUpdate","prevListIds","prevIsDisabled","offsetId","areSortedArraysEqual","viewportIds","getMore","areSomeLocal","areAllLocal","sourceIds","index","indexOf","indexForDirection","Math","max","to","slice","mediaHash","noLoad","mediaFormat","delay","mediaData","startedAt","Date","now","spentTime","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","setAttribute","copyTextToClipboard","str","value","selection","getSelection","rangeToRestore","rangeCount","getRangeAt","select","execCommand","removeAllRanges","addRange","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","currentTarget","img","width","height","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","type","error","DEBUG","console","forceReflow","offsetWidth","IS_IOS","overflow","patchChromiumScroll","display","mediaEl","catch","err","warn"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/830.73181e239801042afb0c.js b/dist/830.73181e239801042afb0c.js new file mode 100644 index 000000000..bc77874cb --- /dev/null +++ b/dist/830.73181e239801042afb0c.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[830],{7799:(e,t,n)=>{n.d(t,{Z:()=>u});var o=n(4050),r=n(9118),c=n(6752),s=n(8674),a=n(5332);let l,i;async function d(){return l||(l=n.e(941).then(n.bind(n,7941)),i=(await l).default),l}setTimeout(d,5e3);const u=(0,o.X$)((({className:e,id:t,animationData:n,play:l,playSegment:u,speed:m,noLoop:p,size:f,quality:g,isLowPriority:h,color:v,forceOnHeavyAnimation:w,onLoad:Z,onEnded:b})=>{const[y,C]=(0,o.eJ)(),E=(0,o.sO)(null),k=(0,o.sO)(!1),T=(0,o.sO)(!1),x=(0,o.sO)(!0),P=(0,o.sO)();P.current=l;const A=(0,o.sO)();A.current=u,(0,o.d4)((()=>{if(y||!n)return;const e=()=>{if(!E.current)return;const e=new i(t,E.current,n,{noLoop:p,size:f,quality:g,isLowPriority:h},Z,v,b);m&&e.setSpeed(m),C(e)};i?e():d().then((()=>{(0,r.T2)((()=>{E.current&&e()}))}))}),[v,y,n,t,h,p,Z,g,f,m,b]),(0,o.d4)((()=>{y&&y.setColor(v)}),[v,y]),(0,o.d4)((()=>()=>{y&&y.destroy()}),[y]);const I=(0,o.I4)(((e=!1)=>{y&&(P.current||A.current)&&(A.current?y.playSegment(A.current):e?y.goToAndPlay(0):y.play())}),[y]),N=(0,o.I4)((()=>{y&&y.pause()}),[y]),S=(0,o.I4)((()=>{T.current=!0,y&&(k.current||(k.current=y.isPlaying()),N())}),[y,N]),L=(0,o.I4)((()=>{k.current&&I(),k.current=!1,T.current=!1}),[I]),O=(0,o.I4)((()=>{(0,r.T2)(L)}),[L]);(0,o.d4)((()=>{y&&(l||u?T.current?k.current=!0:I(p):T.current?k.current=!1:N())}),[y,l,u,p,I,N]),(0,o.d4)((()=>{y&&(x.current?x.current=!1:n&&(y.changeData(n),I()))}),[I,y,n]),(0,s.ZP)(S,L,w),(0,a.Z)(S,O);const B=(0,c.Z)("AnimatedSticker",e),F=f?`width: ${f}px; height: ${f}px;`:void 0;return o.ZP.createElement("div",{ref:E,className:B,style:F})}))},172:(e,t,n)=>{n.d(t,{Z:()=>p});var o=n(4050),r=n(6137),c=n(3716),s=n(2858),a=n(2155),l=n(6752),i=n(2340),d=n(6202),u=n(1212),m=n(9107);const p=(0,o.X$)((({className:e,size:t="large",chat:n,user:p,photo:f,userStatus:g,text:h,isSavedMessages:v,lastSyncTime:w,onClick:Z})=>{const b=p&&(0,s.NB)(p),y=p&&(0,s.pK)(p.id);let C;v||b||(p?C=(0,s.RT)(p):n?C=(0,s.RT)(n):f&&(C=`photo${f.id}?size=m`));const E=(0,d.Z)(C,!1,r.IU.BlobUrl,w),k=Boolean(E),{transitionClassNames:T}=(0,u.Z)(k,void 0,k,"slow"),x=(0,m.Z)();let P="";if(v)P=o.ZP.createElement("i",{className:"icon-avatar-saved-messages"});else if(b)P=o.ZP.createElement("i",{className:"icon-avatar-deleted-account"});else if(y)P=o.ZP.createElement("i",{className:"icon-reply-filled"});else if(E)P=o.ZP.createElement("img",{src:E,className:(0,l.Z)("avatar-media",T),alt:"",decoding:"async"});else if(p){const e=(0,s.Js)(p);P=e?(0,a.Xv)(e,2):void 0}else if(n){const e=(0,s.U)(x,n);P=e&&(0,a.Xv)(e,(0,s.YC)(n.id)?2:1)}else h&&(P=(0,a.Xv)(h,2));const A=!v&&p&&g&&(0,s.kM)(p,g),I=(0,l.Z)(`Avatar size-${t}`,e,`color-bg-${(0,s.Rs)(p||n)}`,v&&"saved-messages",b&&"deleted-account",y&&"replies-bot-account",A&&"online",Z&&"interactive",!v&&!E&&"no-photo"),N=Boolean(v||E),S=(0,o.I4)((e=>{Z&&Z(e,N)}),[Z,N]),L=(p||n)&&(p||n).id;return o.ZP.createElement("div",{className:I,onClick:S,"data-test-sender-id":c.Cg?L:void 0},"string"==typeof P?(0,i.Z)(P,["jumbo"===t?"hq_emoji":"emoji"]):P)}))},7324:(e,t,n)=>{n.d(t,{x:()=>c,Z:()=>s});var o=n(6137),r=n(647);const c={MonkeyIdle:n(8760),MonkeyTracking:n(2750),MonkeyClose:n(6257),MonkeyPeek:n(7785),FoldersAll:n(9356),FoldersNew:n(5485),DiscussionGroups:n(6978),CameraFlip:n(5665),HandFilled:n(2456),HandOutline:n(5667),Speaker:n(8763),VoiceAllowTalk:n(401),VoiceMini:n(5106),VoiceMuted:n(487),VoiceOutlined:n(5740),Peach:n(3677),Eggplant:n(5435),Cumshot:n(1879)};function s(e){const t=c[e].replace(window.location.origin,"");return r.he(`file${t}`,o.IU.Lottie)}},7551:(e,t,n)=>{n.d(t,{Z:()=>a});var o=n(4050),r=n(9107),c=n(3103),s=n(231);const a=(0,o.X$)((({isOpen:e,onClose:t,onCloseAnimationEnd:n,title:a,header:l,text:i,textParts:d,confirmLabel:u="Confirm",confirmHandler:m,confirmIsDestructive:p,isButtonsInOneRow:f,children:g})=>{const h=(0,r.Z)();return o.ZP.createElement(c.Z,{className:"confirm",title:a,header:l,isOpen:e,onClose:t,onCloseAnimationEnd:n,onEnter:m},i&&i.split("\\n").map((e=>o.ZP.createElement("p",null,e))),d||g,o.ZP.createElement("div",{className:f?"dialog-buttons mt-2":""},o.ZP.createElement(s.Z,{className:"confirm-dialog-button",isText:!0,onClick:m,color:p?"danger":"primary"},u),o.ZP.createElement(s.Z,{className:"confirm-dialog-button",isText:!0,onClick:t},h("Cancel"))))}))},1273:(e,t,n)=>{n.d(t,{Z:()=>a});var o=n(1713),r=n(4050),c=n(9118),s=n(7675);const a=({ref:e,className:t,onLoadMore:n,onScroll:a,onKeyDown:l,items:i,itemSelector:d=".ListItem",preloadBackwards:u=20,sensitiveArea:m=800,noScrollRestore:p=!1,noScrollRestoreOnTop:f=!1,noFastList:g,cacheBuster:h,children:v})=>{let w=(0,r.sO)(null);e&&(w=e);const Z=(0,r.sO)({}),[b,y]=(0,r.Ye)((()=>n?[(0,c.Ds)(((e=!1)=>{n({direction:o.Uq.Backwards,noScroll:e})}),1e3,!0,!1),(0,c.Ds)((()=>{n({direction:o.Uq.Forwards})}),1e3,!0,!1)]:[]),[n,i]);(0,r.d4)((()=>{if(!b)return;if(u>0&&(!i||i.length{const e=w.current,t=Z.current;let n;if(t.listItemElements=e.querySelectorAll(d),t.currentAnchor&&Array.from(t.listItemElements).includes(t.currentAnchor)){const{scrollTop:o}=e;n=o+(t.currentAnchor.getBoundingClientRect().top-t.currentAnchorTop)}else{const e=t.listItemElements[0];e&&(t.currentAnchor=e,t.currentAnchorTop=e.getBoundingClientRect().top)}p||f&&0===e.scrollTop||((0,s.Z)(e,n),t.isScrollTopJustUpdated=!0)}),[i,d,p,f,h]);const C=(0,r.I4)((e=>{if(y&&b){const{isScrollTopJustUpdated:e,currentAnchor:t,currentAnchorTop:n}=Z.current,o=Z.current.listItemElements;if(e)return void(Z.current.isScrollTopJustUpdated=!1);const r=o.length,c=w.current,{scrollTop:s,scrollHeight:a,offsetHeight:l}=c,i=s<=(r?o[0].offsetTop:0)+m,d=(r?o[r-1].offsetTop+o[r-1].offsetHeight:a)-(s+l)<=m;let u=!1;if(i){const e=o[0];if(e){const o=e.getBoundingClientRect().top,r=null!=t&&t.offsetParent&&t!==e?t.getBoundingClientRect().top:o;t&&void 0!==n&&r>n&&(Z.current.currentAnchor=e,Z.current.currentAnchorTop=o,u=!0,y())}}if(d){const e=o[r-1];if(e){const o=e.getBoundingClientRect().top,r=null!=t&&t.offsetParent&&t!==e?t.getBoundingClientRect().top:o;t&&void 0!==n&&r{n.d(t,{Z:()=>p});var o=n(4050),r=n(517),c=n(6752),s=n(8674),a=n(1212),l=n(274),i=n(9107),d=n(6590),u=n(231),m=n(2898);const p=({dialogRef:e,title:t,className:n,isOpen:p,header:f,hasCloseButton:g,noBackdrop:h,children:v,onClose:w,onCloseAnimationEnd:Z,onEnter:b,shouldSkipHistoryAnimations:y})=>{const{shouldRender:C,transitionClassNames:E}=(0,a.Z)(p,Z,y,void 0,y),k=(0,o.sO)(null);(0,o.d4)((()=>p?(0,r.Z)({onEsc:w,onEnter:b}):void 0),[p,w,b]),(0,o.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 o=n.findIndex((e=>e.isSameNode(document.activeElement)));let r=0;o>=0&&(r=t.shiftKey?o>0?o-1:n.length-1:o{document.removeEventListener("keydown",t,!1)}}(k.current):void 0),[p]);const{forceClose:T}=(0,d.ZP)(p,w);(0,o.d4)((()=>()=>{p&&T()}),[]),(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 x=(0,i.Z)();if(!C)return;const P=(0,c.Z)("Modal",n,E,h&&"transparent-backdrop");return o.ZP.createElement(m.Z,null,o.ZP.createElement("div",{ref:k,className:P,tabIndex:-1,role:"dialog"},o.ZP.createElement("div",{className:"modal-container"},o.ZP.createElement("div",{className:"modal-backdrop",onClick:w}),o.ZP.createElement("div",{className:"modal-dialog",ref:e},f||(t?o.ZP.createElement("div",{className:"modal-header"},g&&o.ZP.createElement(u.Z,{round:!0,color:"translucent",size:"smaller",ariaLabel:x("Close"),onClick:w},o.ZP.createElement("i",{className:"icon-close"})),o.ZP.createElement("div",{className:"modal-title"},t)):void 0),o.ZP.createElement("div",{className:"modal-content custom-scroll"},v)))))}},2898:(e,t,n)=>{n.d(t,{Z:()=>c});var o=n(4050),r=n(2916);const c=({containerId:e,className:t,children:n})=>{const c=(0,o.sO)();return c.current||(c.current=document.createElement("div")),(0,o.bt)((()=>{const n=document.querySelector(e||"#portals");if(!n)return;const o=c.current;return t&&o.classList.add(t),n.appendChild(o),()=>{r.Z.render(void 0,o),n.removeChild(o)}}),[t,e]),r.Z.render(n,c.current)}},5332:(e,t,n)=>{n.d(t,{Z:()=>r});var o=n(4050);function r(e,t){(0,o.d4)((()=>(e&&!document.hasFocus()&&e(),e&&window.addEventListener("blur",e),t&&window.addEventListener("focus",t),()=>{t&&window.removeEventListener("focus",t),e&&window.removeEventListener("blur",e)})),[e,t])}},8360:(e,t,n)=>{n.d(t,{Z:()=>r});var o=n(7204);function r(e,t=!1,n=!1){const r=(0,o.Z)(e,t);return n||null!=e?e:r}},7407:(e,t,n)=>{n.d(t,{Z:()=>l});var o=n(4050),r=n(1713),c=n(782),s=n(5326),a=n(7204);const l=(e,t,n=!1,l=30,d=!1)=>{const u=(0,o.sO)(),m=(0,o.sO)((()=>{if(!t||u.current)return;const{newViewportIds:e}=i(t,r.Uq.Forwards,l,t[0]);return e})()),p=(0,s.Z)(),f=(0,a.Z)(t),g=(0,a.Z)(n);if(t&&!n&&(t!==f||n!==g)){const{offsetId:e=t[0],direction:n=r.Uq.Forwards}=u.current||{},{newViewportIds:o}=i(t,n,l,e);m.current&&(0,c.et)(m.current,o)||(m.current=o)}(0,o.d4)((()=>{if(t&&!n&&e&&d){const t=m.current;e({offsetId:t[t.length-1]})}}),[t,n,e,d]);const h=(0,o.I4)((({direction:n,noScroll:o})=>{const s=m.current,a=s?n===r.Uq.Backwards?s[s.length-1]:s[0]:void 0;if(!t)return void(e&&e({offsetId:a}));o||(u.current={...u.current,direction:n,offsetId:a});const{newViewportIds:d,areSomeLocal:f,areAllLocal:g}=i(t,n,l,a);!f||s&&(0,c.et)(s,d)||(m.current=d,p()),!g&&e&&e({offsetId:a})}),[t,l,e,p]);return n?[t]:[m.current,h]};function i(e,t,n,o){const{length:c}=e,s=o?e.indexOf(o):0,a=t===r.Uq.Forwards?s:s+1||c,l=Math.max(0,a-n),i=a+n-1,d=e.slice(Math.max(0,l),i+1);let u,m;switch(t){case r.Uq.Forwards:u=a>0,m=l>=0;break;case r.Uq.Backwards:u=a{n.d(t,{Z:()=>a});var o=n(4050),r=n(6137),c=n(647),s=n(5326);const a=(e,t=!1,n=r.IU.BlobUrl,a,l)=>{const i=e?c.UV(e):void 0,d=(0,s.Z)();return(0,o.d4)((()=>{if(!t&&e&&!i){const t=Date.now();c.he(e,n).then((()=>{const e=Date.now()-t;!l||e>=l?d():setTimeout(d,l-e)}))}}),[t,e,i,n,a,d,l]),i}},4319:(e,t,n)=>{n.d(t,{yl:()=>r,TE:()=>s,VP:()=>a});var o=n(3716);const r=navigator.clipboard&&window.ClipboardItem,c=document.createElement("textarea");c.setAttribute("readonly",""),c.tabIndex=-1,c.className="visually-hidden";const s=e=>{c.value=e,document.body.appendChild(c);const t=document.getSelection();if(t){const e=t.rangeCount>0&&t.getRangeAt(0);c.select(),document.execCommand("copy"),e&&(t.removeAllRanges(),t.addRange(e))}document.body.removeChild(c)},a=e=>{if(!e)return;const t=document.createElement("canvas"),n=t.getContext("2d"),o=new Image;o.onload=e=>{if(n&&e.currentTarget){const o=e.currentTarget;t.width=o.width,t.height=o.height,n.drawImage(o,0,0,o.width,o.height),t.toBlob(l,"image/png",1)}},o.src=e};async function l(e){if(e&&r)try{await navigator.clipboard.write([new window.ClipboardItem({[e.type]:e})])}catch(e){o.eM&&console.error(e)}}},2972:(e,t,n)=>{function o(e){e.offsetWidth}n.d(t,{Z:()=>o})},7675:(e,t,n)=>{n.d(t,{Z:()=>c,z:()=>s});var o=n(7361),r=n(2972);const c=(e,t)=>{o.cj&&(e.style.overflow="hidden"),void 0!==t&&(e.scrollTop=t),o.cj&&(e.style.overflow="")};function s(e){e.style.display="none",(0,r.Z)(e),e.style.display=""}},4753:(e,t,n)=>{n.d(t,{Z:()=>r});var o=n(3716);const r=e=>{e.play().catch((t=>{o.eM&&console.warn(t,e)}))}},1879:(e,t,n)=>{e.exports=n.p+"Cumshot.7a17984a6b80787dab34..tgs"},5435:(e,t,n)=>{e.exports=n.p+"Eggplant.7693d877087b802d04be..tgs"},3677:(e,t,n)=>{e.exports=n.p+"Peach.a289b2c54c563f11208f..tgs"},5665:(e,t,n)=>{e.exports=n.p+"CameraFlip.1a9fe44cf01fcb22347d..tgs"},2456:(e,t,n)=>{e.exports=n.p+"HandFilled.f87939d160f1dc288586..tgs"},5667:(e,t,n)=>{e.exports=n.p+"HandOutline.f9831751ba60df30c484..tgs"},8763:(e,t,n)=>{e.exports=n.p+"Speaker.04bb3743412b41ff83c5..tgs"},401:(e,t,n)=>{e.exports=n.p+"VoiceAllowTalk.a9cc7c39ec438973ddc9..tgs"},5106:(e,t,n)=>{e.exports=n.p+"VoiceMini.bf00ffdf69625c579569..tgs"},487:(e,t,n)=>{e.exports=n.p+"VoiceMuted.a4b4ec6bfd7c6c5fb275..tgs"},5740:(e,t,n)=>{e.exports=n.p+"VoiceOutlined.91b394ab3562cdfad6bc..tgs"},6257:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyClose.604c4c833d322b7e6c3e..tgs"},8760:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyIdle.dea4a492c144df84ddab..tgs"},7785:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyPeek.1905436b042520363d7e..tgs"},2750:(e,t,n)=>{e.exports=n.p+"TwoFactorSetupMonkeyTracking.eb5a7a6f166fb7589c12..tgs"},6978:(e,t,n)=>{e.exports=n.p+"DiscussionGroupsDucks.9ea453d1be9d1b0ee77a..tgs"},9356:(e,t,n)=>{e.exports=n.p+"FoldersAll.3f9f9e243d19f0fbf9aa..tgs"},5485:(e,t,n)=>{e.exports=n.p+"FoldersNew.9a40d71c0c8be70f5bd1..tgs"}}]); +//# sourceMappingURL=830.73181e239801042afb0c.js.map \ No newline at end of file diff --git a/dist/830.73181e239801042afb0c.js.map b/dist/830.73181e239801042afb0c.js.map new file mode 100644 index 000000000..5b38f55ef --- /dev/null +++ b/dist/830.73181e239801042afb0c.js.map @@ -0,0 +1 @@ +{"version":3,"file":"830.73181e239801042afb0c.js","mappings":"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","sources":["webpack://telegram-t/./src/components/common/AnimatedSticker.tsx","webpack://telegram-t/./src/components/common/Avatar.tsx","webpack://telegram-t/./src/components/common/helpers/animatedAssets.ts","webpack://telegram-t/./src/components/ui/ConfirmDialog.tsx","webpack://telegram-t/./src/components/ui/InfiniteScroll.tsx","webpack://telegram-t/./src/components/ui/Modal.tsx","webpack://telegram-t/./src/util/trapFocus.ts","webpack://telegram-t/./src/components/ui/Portal.ts","webpack://telegram-t/./src/hooks/useBackgroundMode.ts","webpack://telegram-t/./src/hooks/useCurrentOrPrev.ts","webpack://telegram-t/./src/hooks/useInfiniteScroll.ts","webpack://telegram-t/./src/hooks/useMedia.ts","webpack://telegram-t/./src/util/clipboard.ts","webpack://telegram-t/./src/util/forceReflow.ts","webpack://telegram-t/./src/util/resetScroll.ts","webpack://telegram-t/./src/util/safePlay.ts"],"sourcesContent":["import React, {\n FC, useEffect, useRef, memo, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport { fastRaf } from '../../util/schedulers';\nimport buildClassName from '../../util/buildClassName';\nimport useHeavyAnimationCheck from '../../hooks/useHeavyAnimationCheck';\nimport useBackgroundMode from '../../hooks/useBackgroundMode';\n\ntype OwnProps = {\n className?: string;\n id: string;\n animationData?: string;\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 forceOnHeavyAnimation?: boolean;\n color?: [number, number, number];\n onEnded?: NoneToVoidFunction;\n};\n\ntype RLottieClass = typeof import('../../lib/rlottie/RLottie').default;\ntype RLottieInstance = import('../../lib/rlottie/RLottie').default;\nlet lottiePromise: Promise;\nlet RLottie: RLottieClass;\n\n// Time supposed for judges to measure \"Transferred Size\" in Dev Tools\nconst LOTTIE_LOAD_DELAY = 5000;\n\nasync function ensureLottie() {\n if (!lottiePromise) {\n lottiePromise = import('../../lib/rlottie/RLottie') as unknown as Promise;\n RLottie = (await lottiePromise as any).default;\n }\n\n return lottiePromise;\n}\n\nsetTimeout(ensureLottie, LOTTIE_LOAD_DELAY);\n\nconst AnimatedSticker: FC = ({\n className,\n id,\n animationData,\n play,\n playSegment,\n speed,\n noLoop,\n size,\n quality,\n isLowPriority,\n color,\n forceOnHeavyAnimation,\n onLoad,\n onEnded,\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 onEnded,\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, onEnded]);\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 if (animationData) {\n animation.changeData(animationData);\n playAnimation();\n }\n }\n }, [playAnimation, animation, animationData]);\n\n useHeavyAnimationCheck(freezeAnimation, unfreezeAnimation, forceOnHeavyAnimation);\n // Pausing frame may not happen in background\n // so we need to make sure it happens right after focusing,\n // then we can play again.\n useBackgroundMode(freezeAnimation, unfreezeAnimationOnRaf);\n\n const fullClassName = buildClassName('AnimatedSticker', className);\n\n const style = size ? `width: ${size}px; height: ${size}px;` : undefined;\n\n return (\n \n );\n};\n\nexport default memo(AnimatedSticker);\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport {\n ApiChat, ApiMediaFormat, ApiPhoto, ApiUser, ApiUserStatus,\n} from '../../api/types';\n\nimport { IS_TEST } from '../../config';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getUserColorKey,\n getUserFullName,\n isUserId,\n isChatWithRepliesBot,\n isDeletedUser,\n isUserOnline,\n} from '../../modules/helpers';\nimport { getFirstLetters } from '../../util/textFormat';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from './helpers/renderText';\nimport useMedia from '../../hooks/useMedia';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useLang from '../../hooks/useLang';\n\nimport './Avatar.scss';\n\ntype OwnProps = {\n className?: string;\n size?: 'micro' | 'tiny' | 'small' | 'medium' | 'large' | 'jumbo';\n chat?: ApiChat;\n user?: ApiUser;\n photo?: ApiPhoto;\n userStatus?: ApiUserStatus;\n text?: string;\n isSavedMessages?: boolean;\n lastSyncTime?: number;\n onClick?: (e: ReactMouseEvent, hasPhoto: boolean) => void;\n};\n\nconst Avatar: FC = ({\n className,\n size = 'large',\n chat,\n user,\n photo,\n userStatus,\n text,\n isSavedMessages,\n lastSyncTime,\n onClick,\n}) => {\n const isDeleted = user && isDeletedUser(user);\n const isReplies = user && isChatWithRepliesBot(user.id);\n let imageHash: string | undefined;\n\n if (!isSavedMessages && !isDeleted) {\n if (user) {\n imageHash = getChatAvatarHash(user);\n } else if (chat) {\n imageHash = getChatAvatarHash(chat);\n } else if (photo) {\n imageHash = `photo${photo.id}?size=m`;\n }\n }\n\n const blobUrl = useMedia(imageHash, false, ApiMediaFormat.BlobUrl, lastSyncTime);\n const hasBlobUrl = Boolean(blobUrl);\n const { transitionClassNames } = useShowTransition(hasBlobUrl, undefined, hasBlobUrl, 'slow');\n\n const lang = useLang();\n\n let content: string | undefined = '';\n\n if (isSavedMessages) {\n content = ;\n } else if (isDeleted) {\n content = ;\n } else if (isReplies) {\n content = ;\n } else if (blobUrl) {\n content = (\n \"\"\n );\n } else if (user) {\n const userFullName = getUserFullName(user);\n content = userFullName ? getFirstLetters(userFullName, 2) : undefined;\n } else if (chat) {\n const title = getChatTitle(lang, chat);\n content = title && getFirstLetters(title, isUserId(chat.id) ? 2 : 1);\n } else if (text) {\n content = getFirstLetters(text, 2);\n }\n\n const isOnline = !isSavedMessages && user && userStatus && isUserOnline(user, userStatus);\n const fullClassName = buildClassName(\n `Avatar size-${size}`,\n className,\n `color-bg-${getUserColorKey(user || chat)}`,\n isSavedMessages && 'saved-messages',\n isDeleted && 'deleted-account',\n isReplies && 'replies-bot-account',\n isOnline && 'online',\n onClick && 'interactive',\n (!isSavedMessages && !blobUrl) && 'no-photo',\n );\n\n const hasImage = Boolean(isSavedMessages || blobUrl);\n const handleClick = useCallback((e: ReactMouseEvent) => {\n if (onClick) {\n onClick(e, hasImage);\n }\n }, [onClick, hasImage]);\n\n const senderId = (user || chat) && (user || chat)!.id;\n\n return (\n
\n {typeof content === 'string' ? renderText(content, [size === 'jumbo' ? 'hq_emoji' : 'emoji']) : content}\n
\n );\n};\n\nexport default memo(Avatar);\n","import { ApiMediaFormat } from '../../../api/types';\n\nimport * as mediaLoader from '../../../util/mediaLoader';\n\n// @ts-ignore\nimport MonkeyIdle from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyIdle.tgs';\n// @ts-ignore\nimport MonkeyTracking from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyTracking.tgs';\n// @ts-ignore\nimport MonkeyClose from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyClose.tgs';\n// @ts-ignore\nimport MonkeyPeek from '../../../assets/tgs/monkeys/TwoFactorSetupMonkeyPeek.tgs';\n// @ts-ignore\nimport FoldersAll from '../../../assets/tgs/settings/FoldersAll.tgs';\n// @ts-ignore\nimport FoldersNew from '../../../assets/tgs/settings/FoldersNew.tgs';\n// @ts-ignore\nimport DiscussionGroups from '../../../assets/tgs/settings/DiscussionGroupsDucks.tgs';\n// @ts-ignore\nimport CameraFlip from '../../../assets/tgs/calls/CameraFlip.tgs';\n// @ts-ignore\nimport HandFilled from '../../../assets/tgs/calls/HandFilled.tgs';\n// @ts-ignore\nimport HandOutline from '../../../assets/tgs/calls/HandOutline.tgs';\n// @ts-ignore\nimport Speaker from '../../../assets/tgs/calls/Speaker.tgs';\n// @ts-ignore\nimport VoiceAllowTalk from '../../../assets/tgs/calls/VoiceAllowTalk.tgs';\n// @ts-ignore\nimport VoiceMini from '../../../assets/tgs/calls/VoiceMini.tgs';\n// @ts-ignore\nimport VoiceMuted from '../../../assets/tgs/calls/VoiceMuted.tgs';\n// @ts-ignore\nimport VoiceOutlined from '../../../assets/tgs/calls/VoiceOutlined.tgs';\n// @ts-ignore\nimport Peach from '../../../assets/tgs/animatedEmojis/Peach.tgs';\n// @ts-ignore\nimport Eggplant from '../../../assets/tgs/animatedEmojis/Eggplant.tgs';\n// @ts-ignore\nimport Cumshot from '../../../assets/tgs/animatedEmojis/Cumshot.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 Peach,\n Eggplant,\n Cumshot,\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, { FC, memo } from '../../lib/teact/teact';\n\nimport useLang from '../../hooks/useLang';\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport Modal from './Modal';\nimport Button from './Button';\n\ntype OwnProps = {\n isOpen: boolean;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n title?: string;\n header?: FC;\n textParts?: TextPart[];\n text?: string;\n confirmLabel?: string;\n confirmHandler: () => void;\n confirmIsDestructive?: boolean;\n isButtonsInOneRow?: boolean;\n children?: any;\n};\n\nconst ConfirmDialog: FC = ({\n isOpen,\n onClose,\n onCloseAnimationEnd,\n title,\n header,\n text,\n textParts,\n confirmLabel = 'Confirm',\n confirmHandler,\n confirmIsDestructive,\n isButtonsInOneRow,\n children,\n}) => {\n const lang = useLang();\n\n return (\n \n {text && text.split('\\\\n').map((textPart) => (\n

{textPart}

\n ))}\n {textParts || children}\n
\n \n {confirmLabel}\n \n \n
\n \n );\n};\n\nexport default memo(ConfirmDialog);\n","import { RefObject, UIEvent } from 'react';\nimport { LoadMoreDirection } from '../../types';\n\nimport React, {\n FC, useCallback, useEffect, useLayoutEffect, useMemo, useRef,\n} from '../../lib/teact/teact';\n\nimport { debounce } from '../../util/schedulers';\nimport resetScroll from '../../util/resetScroll';\n\ntype OwnProps = {\n ref?: RefObject;\n className?: string;\n onLoadMore?: ({ direction }: { direction: LoadMoreDirection; noScroll?: boolean }) => void;\n onScroll?: (e: UIEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n items?: any[];\n itemSelector?: string;\n preloadBackwards?: number;\n sensitiveArea?: number;\n noScrollRestore?: boolean;\n noScrollRestoreOnTop?: boolean;\n noFastList?: boolean;\n cacheBuster?: any;\n children: any;\n};\n\nconst DEFAULT_LIST_SELECTOR = '.ListItem';\nconst DEFAULT_PRELOAD_BACKWARDS = 20;\nconst DEFAULT_SENSITIVE_AREA = 800;\n\nconst InfiniteScroll: FC = ({\n ref,\n className,\n onLoadMore,\n onScroll,\n onKeyDown,\n items,\n itemSelector = DEFAULT_LIST_SELECTOR,\n preloadBackwards = DEFAULT_PRELOAD_BACKWARDS,\n sensitiveArea = DEFAULT_SENSITIVE_AREA,\n // Used to turn off restoring scroll position (e.g. for frequently re-ordered chat or user lists)\n noScrollRestore = false,\n noScrollRestoreOnTop = false,\n noFastList,\n // Used to re-query `listItemElements` if rendering is delayed by transition\n cacheBuster,\n children,\n}: OwnProps) => {\n // eslint-disable-next-line no-null/no-null\n let containerRef = useRef(null);\n if (ref) {\n containerRef = ref;\n }\n\n const stateRef = useRef<{\n listItemElements?: NodeListOf;\n isScrollTopJustUpdated?: boolean;\n currentAnchor?: HTMLDivElement | undefined;\n currentAnchorTop?: number;\n }>({});\n\n const [loadMoreBackwards, loadMoreForwards] = useMemo(() => {\n if (!onLoadMore) {\n return [];\n }\n\n return [\n debounce((noScroll = false) => {\n onLoadMore({ direction: LoadMoreDirection.Backwards, noScroll });\n }, 1000, true, false),\n debounce(() => {\n onLoadMore({ direction: LoadMoreDirection.Forwards });\n }, 1000, true, false),\n ];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [onLoadMore, items]);\n\n // Initial preload\n useEffect(() => {\n if (!loadMoreBackwards) {\n return;\n }\n\n if (preloadBackwards > 0 && (!items || items.length < preloadBackwards)) {\n loadMoreBackwards(true);\n return;\n }\n\n const { scrollHeight, clientHeight } = containerRef.current!;\n if (clientHeight && scrollHeight <= clientHeight) {\n loadMoreBackwards();\n }\n }, [items, loadMoreBackwards, preloadBackwards]);\n\n // Restore `scrollTop` after adding items\n useLayoutEffect(() => {\n const container = containerRef.current!;\n const state = stateRef.current;\n\n state.listItemElements = container.querySelectorAll(itemSelector);\n\n let newScrollTop;\n\n if (state.currentAnchor && Array.from(state.listItemElements).includes(state.currentAnchor)) {\n const { scrollTop } = container;\n const newAnchorTop = state.currentAnchor.getBoundingClientRect().top;\n newScrollTop = scrollTop + (newAnchorTop - state.currentAnchorTop!);\n } else {\n const nextAnchor = state.listItemElements[0];\n if (nextAnchor) {\n state.currentAnchor = nextAnchor;\n state.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n\n if (noScrollRestore) {\n return;\n }\n\n if (noScrollRestoreOnTop && container.scrollTop === 0) {\n return;\n }\n\n resetScroll(container, newScrollTop);\n\n state.isScrollTopJustUpdated = true;\n }, [items, itemSelector, noScrollRestore, noScrollRestoreOnTop, cacheBuster]);\n\n const handleScroll = useCallback((e: UIEvent) => {\n if (loadMoreForwards && loadMoreBackwards) {\n const {\n isScrollTopJustUpdated, currentAnchor, currentAnchorTop,\n } = stateRef.current;\n const listItemElements = stateRef.current.listItemElements!;\n\n if (isScrollTopJustUpdated) {\n stateRef.current.isScrollTopJustUpdated = false;\n return;\n }\n\n const listLength = listItemElements.length;\n const container = containerRef.current!;\n const { scrollTop, scrollHeight, offsetHeight } = container;\n const top = listLength ? listItemElements[0].offsetTop : 0;\n const isNearTop = scrollTop <= top + sensitiveArea;\n const bottom = listLength\n ? listItemElements[listLength - 1].offsetTop + listItemElements[listLength - 1].offsetHeight\n : scrollHeight;\n const isNearBottom = bottom - (scrollTop + offsetHeight) <= sensitiveArea;\n let isUpdated = false;\n\n if (isNearTop) {\n const nextAnchor = listItemElements[0];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor?.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingUp = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop > currentAnchorTop\n );\n\n if (isMovingUp) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n loadMoreForwards();\n }\n }\n }\n\n if (isNearBottom) {\n const nextAnchor = listItemElements[listLength - 1];\n if (nextAnchor) {\n const nextAnchorTop = nextAnchor.getBoundingClientRect().top;\n const newAnchorTop = currentAnchor?.offsetParent && currentAnchor !== nextAnchor\n ? currentAnchor.getBoundingClientRect().top\n : nextAnchorTop;\n const isMovingDown = (\n currentAnchor && currentAnchorTop !== undefined && newAnchorTop < currentAnchorTop\n );\n\n if (isMovingDown) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchorTop;\n isUpdated = true;\n loadMoreBackwards();\n }\n }\n }\n\n if (!isUpdated) {\n if (currentAnchor?.offsetParent) {\n stateRef.current.currentAnchorTop = currentAnchor.getBoundingClientRect().top;\n } else {\n const nextAnchor = listItemElements[0];\n\n if (nextAnchor) {\n stateRef.current.currentAnchor = nextAnchor;\n stateRef.current.currentAnchorTop = nextAnchor.getBoundingClientRect().top;\n }\n }\n }\n }\n\n if (onScroll) {\n onScroll(e);\n }\n }, [loadMoreBackwards, loadMoreForwards, onScroll, sensitiveArea]);\n\n return (\n \n {children}\n \n );\n};\n\nexport default InfiniteScroll;\n","import { RefObject } from 'react';\nimport React, {\n FC, useEffect, useRef,\n} from '../../lib/teact/teact';\n\nimport { TextPart } from '../common/helpers/renderMessageText';\n\nimport captureKeyboardListeners from '../../util/captureKeyboardListeners';\nimport trapFocus from '../../util/trapFocus';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport useLang from '../../hooks/useLang';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport Button from './Button';\nimport Portal from './Portal';\n\nimport './Modal.scss';\n\nconst ANIMATION_DURATION = 200;\n\ntype OwnProps = {\n title?: string | TextPart[];\n className?: string;\n isOpen?: boolean;\n header?: any;\n hasCloseButton?: boolean;\n noBackdrop?: boolean;\n children: any;\n onClose: () => void;\n onCloseAnimationEnd?: () => void;\n onEnter?: () => void;\n dialogRef?: RefObject;\n};\n\ntype StateProps = {\n shouldSkipHistoryAnimations?: boolean;\n};\n\nconst Modal: FC = ({\n dialogRef,\n title,\n className,\n isOpen,\n header,\n hasCloseButton,\n noBackdrop,\n children,\n onClose,\n onCloseAnimationEnd,\n onEnter,\n shouldSkipHistoryAnimations,\n}) => {\n const {\n shouldRender,\n transitionClassNames,\n } = useShowTransition(\n isOpen, onCloseAnimationEnd, shouldSkipHistoryAnimations, undefined, shouldSkipHistoryAnimations,\n );\n // eslint-disable-next-line no-null/no-null\n const modalRef = useRef(null);\n\n useEffect(() => (isOpen\n ? captureKeyboardListeners({ onEsc: onClose, onEnter })\n : undefined), [isOpen, onClose, onEnter]);\n useEffect(() => (isOpen && modalRef.current ? trapFocus(modalRef.current) : undefined), [isOpen]);\n\n const { forceClose } = useHistoryBack(isOpen, onClose);\n\n // For modals that are closed by unmounting without changing `isOpen` to `false`\n useEffect(() => {\n return () => {\n if (isOpen) {\n forceClose();\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n document.body.classList.toggle('has-open-dialog', isOpen);\n if (isOpen || (!isOpen && prevIsOpen !== undefined)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n\n return () => {\n document.body.classList.remove('has-open-dialog');\n };\n }, [isOpen]);\n\n const lang = useLang();\n\n if (!shouldRender) {\n return undefined;\n }\n\n function renderHeader() {\n if (header) {\n return header;\n }\n\n if (!title) {\n return undefined;\n }\n\n return (\n
\n {hasCloseButton && (\n \n \n \n )}\n
{title}
\n
\n );\n }\n\n const fullClassName = buildClassName(\n 'Modal',\n className,\n transitionClassNames,\n noBackdrop && 'transparent-backdrop',\n );\n\n return (\n \n \n
\n
\n
\n {renderHeader()}\n
\n {children}\n
\n
\n
\n
\n
\n );\n};\n\nexport default Modal;\n","export default function trapFocus(element: HTMLElement) {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const focusableElements = Array.from(\n element.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ) as HTMLElement[];\n if (!focusableElements.length) {\n return;\n }\n\n const currentFocusedIndex = focusableElements.findIndex((em) => em.isSameNode(document.activeElement));\n let newFocusedIndex = 0;\n if (currentFocusedIndex >= 0) {\n if (e.shiftKey) {\n newFocusedIndex = currentFocusedIndex > 0\n ? currentFocusedIndex - 1\n : focusableElements.length - 1;\n } else {\n newFocusedIndex = currentFocusedIndex < focusableElements.length - 1\n ? currentFocusedIndex + 1\n : 0;\n }\n }\n\n focusableElements[newFocusedIndex].focus();\n }\n\n document.addEventListener('keydown', handleKeyDown, false);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, false);\n };\n}\n","import { FC, useRef, useLayoutEffect } from '../../lib/teact/teact';\nimport TeactDOM from '../../lib/teact/teact-dom';\n\ntype OwnProps = {\n containerId?: string;\n className?: string;\n children: any;\n};\n\nconst Portal: FC = ({ containerId, className, children }) => {\n const elementRef = useRef();\n if (!elementRef.current) {\n elementRef.current = document.createElement('div');\n }\n\n useLayoutEffect(() => {\n const container = document.querySelector(containerId || '#portals');\n if (!container) {\n return undefined;\n }\n\n const element = elementRef.current!;\n if (className) {\n element.classList.add(className);\n }\n\n container.appendChild(element);\n\n return () => {\n TeactDOM.render(undefined, element);\n container.removeChild(element);\n };\n }, [className, containerId]);\n\n return TeactDOM.render(children, elementRef.current);\n};\n\nexport default Portal;\n","import { useEffect } from '../lib/teact/teact';\n\nexport default function useBackgroundMode(\n onBlur?: AnyToVoidFunction,\n onFocus?: AnyToVoidFunction,\n) {\n useEffect(() => {\n if (onBlur && !document.hasFocus()) {\n onBlur();\n }\n\n if (onBlur) {\n window.addEventListener('blur', onBlur);\n }\n\n if (onFocus) {\n window.addEventListener('focus', onFocus);\n }\n\n return () => {\n if (onFocus) {\n window.removeEventListener('focus', onFocus);\n }\n\n if (onBlur) {\n window.removeEventListener('blur', onBlur);\n }\n };\n }, [onBlur, onFocus]);\n}\n","import usePrevious from './usePrevious';\n\nexport default function useCurrentOrPrev(\n current: T, shouldSkipUndefined = false, shouldForceCurrent = false,\n): T | undefined {\n const prev = usePrevious(current, shouldSkipUndefined);\n\n // eslint-disable-next-line no-null/no-null\n return shouldForceCurrent || (current !== null && current !== undefined) ? current : prev;\n}\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\nimport { LoadMoreDirection } from '../types';\n\nimport { areSortedArraysEqual } from '../util/iteratees';\nimport useForceUpdate from './useForceUpdate';\nimport usePrevious from './usePrevious';\n\ntype GetMore = (args: { direction: LoadMoreDirection }) => void;\ntype LoadMoreBackwards = (args: { offsetId?: string | number }) => void;\n\nconst DEFAULT_LIST_SLICE = 30;\n\nexport default (\n loadMoreBackwards?: LoadMoreBackwards,\n listIds?: ListId[],\n isDisabled = false,\n listSlice = DEFAULT_LIST_SLICE,\n forceFullPreload = false,\n): [ListId[]?, GetMore?] => {\n const lastParamsRef = useRef<{\n direction?: LoadMoreDirection;\n offsetId?: ListId;\n }>();\n\n const viewportIdsRef = useRef((() => {\n // Only run once to initialize\n if (!listIds || lastParamsRef.current) {\n return undefined;\n }\n\n const { newViewportIds } = getViewportSlice(listIds, LoadMoreDirection.Forwards, listSlice, listIds[0]);\n return newViewportIds;\n })());\n\n const forceUpdate = useForceUpdate();\n\n const prevListIds = usePrevious(listIds);\n const prevIsDisabled = usePrevious(isDisabled);\n if (listIds && !isDisabled && (listIds !== prevListIds || isDisabled !== prevIsDisabled)) {\n const { offsetId = listIds[0], direction = LoadMoreDirection.Forwards } = lastParamsRef.current || {};\n const { newViewportIds } = getViewportSlice(listIds, direction, listSlice, offsetId);\n\n if (!viewportIdsRef.current || !areSortedArraysEqual(viewportIdsRef.current, newViewportIds)) {\n viewportIdsRef.current = newViewportIds;\n }\n }\n\n useEffect(() => {\n if (listIds && !isDisabled && loadMoreBackwards && forceFullPreload) {\n const viewportIds = viewportIdsRef.current!;\n loadMoreBackwards({ offsetId: viewportIds[viewportIds.length - 1] });\n }\n }, [listIds, isDisabled, loadMoreBackwards, forceFullPreload]);\n\n const getMore: GetMore = useCallback(({\n direction,\n noScroll,\n }: { direction: LoadMoreDirection; noScroll?: boolean }) => {\n const viewportIds = viewportIdsRef.current;\n\n const offsetId = viewportIds\n ? direction === LoadMoreDirection.Backwards ? viewportIds[viewportIds.length - 1] : viewportIds[0]\n : undefined;\n\n if (!listIds) {\n if (loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n\n return;\n }\n\n if (!noScroll) {\n lastParamsRef.current = { ...lastParamsRef.current, direction, offsetId };\n }\n\n const {\n newViewportIds, areSomeLocal, areAllLocal,\n } = getViewportSlice(listIds, direction, listSlice, offsetId);\n\n if (areSomeLocal && !(viewportIds && areSortedArraysEqual(viewportIds, newViewportIds))) {\n viewportIdsRef.current = newViewportIds;\n forceUpdate();\n }\n\n if (!areAllLocal && loadMoreBackwards) {\n loadMoreBackwards({ offsetId });\n }\n }, [listIds, listSlice, loadMoreBackwards, forceUpdate]);\n\n return isDisabled ? [listIds] : [viewportIdsRef.current, getMore];\n};\n\nfunction getViewportSlice(\n sourceIds: ListId[],\n direction: LoadMoreDirection,\n listSlice: number,\n offsetId?: ListId,\n) {\n const { length } = sourceIds;\n const index = offsetId ? sourceIds.indexOf(offsetId) : 0;\n const isForwards = direction === LoadMoreDirection.Forwards;\n const indexForDirection = isForwards ? index : (index + 1) || length;\n const from = Math.max(0, indexForDirection - listSlice);\n const to = indexForDirection + listSlice - 1;\n const newViewportIds = sourceIds.slice(Math.max(0, from), to + 1);\n\n let areSomeLocal;\n let areAllLocal;\n switch (direction) {\n case LoadMoreDirection.Forwards:\n areSomeLocal = indexForDirection > 0;\n areAllLocal = from >= 0;\n break;\n case LoadMoreDirection.Backwards:\n areSomeLocal = indexForDirection < length;\n areAllLocal = to <= length - 1;\n break;\n }\n\n return { newViewportIds, areSomeLocal, areAllLocal };\n}\n","import { useEffect } from '../lib/teact/teact';\n\nimport { ApiMediaFormat } from '../api/types';\n\nimport * as mediaLoader from '../util/mediaLoader';\nimport useForceUpdate from './useForceUpdate';\n\nexport default (\n mediaHash: string | false | undefined,\n noLoad = false,\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n mediaFormat: T = ApiMediaFormat.BlobUrl,\n cacheBuster?: number,\n delay?: number | false,\n) => {\n const mediaData = mediaHash ? mediaLoader.getFromMemory(mediaHash) : undefined;\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!noLoad && mediaHash && !mediaData) {\n const startedAt = Date.now();\n\n mediaLoader.fetch(mediaHash, mediaFormat).then(() => {\n const spentTime = Date.now() - startedAt;\n if (!delay || spentTime >= delay) {\n forceUpdate();\n } else {\n setTimeout(forceUpdate, delay - spentTime);\n }\n });\n }\n }, [noLoad, mediaHash, mediaData, mediaFormat, cacheBuster, forceUpdate, delay]);\n\n return mediaData;\n};\n","import { DEBUG } from '../config';\n\nexport const CLIPBOARD_ITEM_SUPPORTED = navigator.clipboard && window.ClipboardItem;\n\nconst textCopyEl = document.createElement('textarea');\ntextCopyEl.setAttribute('readonly', '');\ntextCopyEl.tabIndex = -1;\ntextCopyEl.className = 'visually-hidden';\n\nexport const copyTextToClipboard = (str: string): void => {\n textCopyEl.value = str;\n document.body.appendChild(textCopyEl);\n const selection = document.getSelection();\n\n if (selection) {\n // Store previous selection\n const rangeToRestore = selection.rangeCount > 0 && selection.getRangeAt(0);\n textCopyEl.select();\n document.execCommand('copy');\n // Restore the original selection\n if (rangeToRestore) {\n selection.removeAllRanges();\n selection.addRange(rangeToRestore);\n }\n }\n\n document.body.removeChild(textCopyEl);\n};\n\nexport const copyImageToClipboard = (imageUrl?: string) => {\n if (!imageUrl) return;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const imageEl = new Image();\n imageEl.onload = (e: Event) => {\n if (ctx && e.currentTarget) {\n const img = e.currentTarget as HTMLImageElement;\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0, img.width, img.height);\n canvas.toBlob(copyBlobToClipboard, 'image/png', 1);\n }\n };\n\n imageEl.src = imageUrl;\n};\n\nasync function copyBlobToClipboard(pngBlob: Blob | null) {\n if (!pngBlob || !CLIPBOARD_ITEM_SUPPORTED) {\n return;\n }\n\n try {\n await navigator.clipboard.write([\n new window.ClipboardItem({\n [pngBlob.type]: pngBlob,\n }),\n ]);\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(error);\n }\n }\n}\n","// Used before applying CSS transition\nexport default function forceReflow(element: HTMLElement) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n element.offsetWidth;\n}\n","import { IS_IOS } from './environment';\nimport forceReflow from './forceReflow';\n\nexport default (container: HTMLDivElement, scrollTop?: number) => {\n if (IS_IOS) {\n container.style.overflow = 'hidden';\n }\n\n if (scrollTop !== undefined) {\n container.scrollTop = scrollTop;\n }\n\n if (IS_IOS) {\n container.style.overflow = '';\n }\n};\n\n// Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=1264266\nexport function patchChromiumScroll(element: HTMLElement) {\n element.style.display = 'none';\n forceReflow(element);\n element.style.display = '';\n}\n","import { DEBUG } from '../config';\n\nexport default (mediaEl: HTMLMediaElement) => {\n mediaEl.play().catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err, mediaEl);\n }\n });\n};\n"],"names":["lottiePromise","RLottie","async","ensureLottie","default","setTimeout","memo","className","id","animationData","play","playSegment","speed","noLoop","size","quality","isLowPriority","color","forceOnHeavyAnimation","onLoad","onEnded","animation","setAnimation","useState","container","useRef","wasPlaying","isFrozen","isFirstRender","playRef","current","playSegmentRef","useEffect","exec","newAnimation","setSpeed","then","fastRaf","setColor","destroy","playAnimation","useCallback","shouldRestart","goToAndPlay","pauseAnimation","pause","freezeAnimation","isPlaying","unfreezeAnimation","unfreezeAnimationOnRaf","changeData","useHeavyAnimationCheck","useBackgroundMode","fullClassName","buildClassName","style","undefined","ref","chat","user","photo","userStatus","text","isSavedMessages","lastSyncTime","onClick","isDeleted","isDeletedUser","isReplies","isChatWithRepliesBot","imageHash","getChatAvatarHash","blobUrl","useMedia","ApiMediaFormat","hasBlobUrl","Boolean","transitionClassNames","useShowTransition","lang","useLang","content","src","alt","decoding","userFullName","getUserFullName","getFirstLetters","title","getChatTitle","isUserId","isOnline","isUserOnline","getUserColorKey","hasImage","handleClick","e","senderId","IS_TEST","renderText","ANIMATED_STICKERS_PATHS","MonkeyIdle","MonkeyTracking","MonkeyClose","MonkeyPeek","FoldersAll","FoldersNew","DiscussionGroups","CameraFlip","HandFilled","HandOutline","Speaker","VoiceAllowTalk","VoiceMini","VoiceMuted","VoiceOutlined","Peach","Eggplant","Cumshot","getAnimationData","name","path","replace","window","location","origin","mediaLoader","isOpen","onClose","onCloseAnimationEnd","header","textParts","confirmLabel","confirmHandler","confirmIsDestructive","isButtonsInOneRow","children","onEnter","split","map","textPart","isText","onLoadMore","onScroll","onKeyDown","items","itemSelector","preloadBackwards","sensitiveArea","noScrollRestore","noScrollRestoreOnTop","noFastList","cacheBuster","containerRef","stateRef","loadMoreBackwards","loadMoreForwards","useMemo","debounce","noScroll","direction","LoadMoreDirection","length","scrollHeight","clientHeight","useLayoutEffect","state","newScrollTop","listItemElements","querySelectorAll","currentAnchor","Array","from","includes","scrollTop","getBoundingClientRect","top","currentAnchorTop","nextAnchor","resetScroll","isScrollTopJustUpdated","handleScroll","listLength","offsetHeight","isNearTop","offsetTop","isNearBottom","isUpdated","nextAnchorTop","newAnchorTop","offsetParent","teactFastList","dialogRef","hasCloseButton","noBackdrop","shouldSkipHistoryAnimations","shouldRender","modalRef","captureKeyboardListeners","onEsc","element","handleKeyDown","key","preventDefault","stopPropagation","focusableElements","currentFocusedIndex","findIndex","em","isSameNode","document","activeElement","newFocusedIndex","shiftKey","focus","addEventListener","removeEventListener","trapFocus","forceClose","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","body","classList","toggle","dispatchHeavyAnimationEvent","remove","Portal","tabIndex","role","Button","round","ariaLabel","containerId","elementRef","createElement","querySelector","add","appendChild","TeactDOM","removeChild","onBlur","onFocus","hasFocus","useCurrentOrPrev","shouldSkipUndefined","shouldForceCurrent","prev","usePrevious","listIds","isDisabled","listSlice","forceFullPreload","lastParamsRef","viewportIdsRef","newViewportIds","getViewportSlice","forceUpdate","useForceUpdate","prevListIds","prevIsDisabled","offsetId","areSortedArraysEqual","viewportIds","getMore","areSomeLocal","areAllLocal","sourceIds","index","indexOf","indexForDirection","Math","max","to","slice","mediaHash","noLoad","mediaFormat","delay","mediaData","startedAt","Date","now","spentTime","CLIPBOARD_ITEM_SUPPORTED","navigator","clipboard","ClipboardItem","textCopyEl","setAttribute","copyTextToClipboard","str","value","selection","getSelection","rangeToRestore","rangeCount","getRangeAt","select","execCommand","removeAllRanges","addRange","copyImageToClipboard","imageUrl","canvas","ctx","getContext","imageEl","Image","onload","currentTarget","img","width","height","drawImage","toBlob","copyBlobToClipboard","pngBlob","write","type","error","DEBUG","console","forceReflow","offsetWidth","IS_IOS","overflow","patchChromiumScroll","display","mediaEl","catch","err","warn"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/884.68ff64c281399c107bd4.js b/dist/884.c8f1b9920de862fb45af.js similarity index 99% rename from dist/884.68ff64c281399c107bd4.js rename to dist/884.c8f1b9920de862fb45af.js index 8de3e66a0..7ee79ebc1 100644 --- a/dist/884.68ff64c281399c107bd4.js +++ b/dist/884.c8f1b9920de862fb45af.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[884],{2275:(t,e,a)=>{a.d(e,{Z:()=>h});var s=a(4050),n=a(5116),o=a(1638),i=a(2858),d=a(2340),r=a(9107),c=a(3103),l=a(231);const h=(0,s.X$)((0,n.c$)(((t,{userId:e})=>{const a=(0,o.jr)(t),s=e&&(0,o.dy)(t,e);return{chat:a,contactName:s?(0,i.Vl)(s):void 0}}))((({isOpen:t,chat:e,userId:a,contactName:o,onClose:i})=>{const{deleteChatMember:h}=(0,n.uC)(),u=(0,r.Z)(),p=(0,s.I4)((()=>{h({chatId:e.id,userId:a}),i()}),[e,h,i,a]);if(e&&a)return s.ZP.createElement(c.Z,{isOpen:t,onClose:i,onEnter:p,className:"delete",title:u("GroupRemoved.Remove")},s.ZP.createElement("p",null,(0,d.Z)(u("PeerInfo.Confirm.RemovePeer",o))),s.ZP.createElement(l.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:p},u("lng_box_remove")),s.ZP.createElement(l.Z,{className:"confirm-dialog-button",isText:!0,onClick:i},u("Cancel")))})))},6071:(t,e,a)=>{a.d(e,{Z:()=>o});var s=a(4050),n=a(9118);const o=(t,e=!1)=>(0,s.Ye)((()=>(0,n.P2)((t=>t()),t,!e)),[t,e])},6204:(t,e,a)=>{a.d(e,{f:()=>y,C:()=>b});var s=a(5116),n=a(6137),o=a(1713),i=a(3716),d=a(1226),r=a(9959),c=a(1638),l=a(782),h=a(9118),u=a(2858),p=a(3551),f=a(4446),C=a(2607);const I=(0,h.P2)((t=>t()),300,!0),m=(0,h.P2)((t=>t()),3e3,!0),v=(0,h.Ds)((t=>t()),500,!1,!0);async function g(t,e,a){var o;let h=(0,s.Rd)();const u=await(0,d.t9)("fetchChats",{limit:i.Ov,offsetDate:a,archived:"archived"===t,withPinned:void 0===h.chats.orderedPinnedIds[t],serverTimeOffset:h.serverTimeOffset,lastLocalServiceMessage:null===(o=(0,c.VF)(h))||void 0===o?void 0:o.message});if(!u)return;const{chatIds:p}=u;p.length>0&&p[0]===e&&p.shift(),h=(0,s.Rd)(),h=(0,r.Sh)(h,(0,l.ee)(u.users,"id")),h=(0,r.zn)(h,u.userStatusesById),h=(0,r.GL)(h,(0,l.ee)(u.chats,"id")),h=(0,r.B1)(h,t,p),h=(0,r.vv)(h,t,u),Object.keys(u.draftsById).forEach((t=>{h=(0,r.pf)(h,t,n._f,"draft",u.draftsById[t])})),Object.keys(u.replyingToById).forEach((t=>{h=(0,r.pf)(h,t,n._f,"replyingToId",u.replyingToById[t])})),0!==p.length||h.chats.isFullyLoaded[t]||(h={...h,chats:{...h.chats,isFullyLoaded:{...h.chats.isFullyLoaded,[t]:!0}}}),(0,s.R3)(h)}async function y(t){const e=await(0,d.t9)("fetchFullChat",t);if(!e)return;const{users:a,fullInfo:n,groupCall:o}=e;let i=(0,s.Rd)();if(a&&(i=(0,r.Sh)(i,(0,l.ee)(a,"id"))),o){const t=(0,C.$5)(i,o.id);i=(0,f.AH)(i,o.id,(0,l.CE)(o,["connectionState"]),void 0,t?void 0:o.participantsCount)}return i=(0,r.a4)(i,t.id,{fullInfo:n}),(0,s.R3)(i),e}async function b(t){const e=(0,s.Rd)(),a=(0,c.DI)(e,t);if(a&&!a.isMin)return a;const n=await(0,d.t9)("getChatByUsername",t);return n?((0,s.R3)((0,r.a4)((0,s.Rd)(),n.id,n)),n):void 0}(0,s.Q6)("preloadTopChatMessages",((t,e)=>{(async()=>{const a=[];for(let o=0;ot!==r&&!a.includes(t)));if(!f)return;a.push(f.id),e.loadViewportMessages({chatId:f.id,threadId:n._f})}})()})),(0,s.Q6)("openChat",((t,e,a)=>{const{id:s,threadId:o}=a,{currentUserId:i}=t,r=(0,c.Z1)(t,s);if(null!=r&&r.hasUnreadMark&&e.toggleChatUnread({id:s}),r&&r.lastMessage&&r.lastMessage.threadInfo&&e.requestThreadInfoUpdate({chatId:r.lastMessage.threadInfo.chatId,threadId:r.lastMessage.threadInfo.threadId}),r)(0,u.Hp)(r)&&!r.isMin&&e.requestChatUpdate({chatId:s});else if(s===i)(0,d.t9)("fetchChat",{type:"self"});else{const e=(0,c.dy)(t,s);e&&(0,d.t9)("fetchChat",{type:"user",user:e})}o!==n._f&&((0,c.qS)(t,s,o)||e.requestThreadInfoUpdate({chatId:s,threadId:o}))})),(0,s.Q6)("openLinkedChat",((t,e,a)=>{const{id:s}=a,n=(0,c.Z1)(t,s);n&&(async()=>{var t;const a=await(0,d.t9)("fetchFullChat",n);null!=a&&null!==(t=a.fullInfo)&&void 0!==t&&t.linkedChatId&&e.openChat({id:a.fullInfo.linkedChatId})})()})),(0,s.Q6)("focusMessageInComments",((t,e,a)=>{const{chatId:s,threadId:n,messageId:o}=a,i=(0,c.Z1)(t,s);i&&(async()=>{await(0,d.t9)("requestThreadInfoUpdate",{chat:i,threadId:n})&&e.focusMessage({chatId:s,threadId:n,messageId:o})})()})),(0,s.Q6)("openSupportChat",((t,e)=>{const a=(0,c.P_)(t);a?e.openChat({id:a.id,shouldReplaceHistory:!0}):(e.openChat({id:i.AJ,shouldReplaceHistory:!0}),(async()=>{const t=await(0,d.t9)("fetchChat",{type:"support"});t&&e.openChat({id:t.chatId,shouldReplaceHistory:!0})})())})),(0,s.Q6)("openTipsChat",((t,e,a)=>{const{langCode:s}=a,n="pt-br"===s?"BR":i.Db.includes(s)?s.toUpperCase():"";e.openChatByUsername({username:`${i.vi}${n}`})})),(0,s.Q6)("loadMoreChats",((t,e,a)=>{const{listType:s="active"}=a,n=t.chats.listIds[s];if(t.chats.isFullyLoaded[s])return;const o=n?n.map((e=>t.chats.byId[e])).filter((e=>Boolean(null==e?void 0:e.lastMessage)&&!(0,c.ep)(t,e.id))).sort(((t,e)=>t.lastMessage.date-e.lastMessage.date))[0]:void 0;I(o?()=>g(s,o.id,o.lastMessage.date):()=>g(s))})),(0,s.Q6)("preloadArchivedChats",(()=>{(async()=>{for(;!(0,s.Rd)().chats.isFullyLoaded.archived;){const t=(0,s.Rd)(),e=t.chats.listIds.archived,a=e?e.map((e=>t.chats.byId[e])).filter((e=>Boolean(null==e?void 0:e.lastMessage)&&!(0,c.ep)(t,e.id))).sort(((t,e)=>t.lastMessage.date-e.lastMessage.date))[0]:void 0;await g("archived",null==a?void 0:a.id,null==a?void 0:a.lastMessage.date),await(0,h.wO)(300)}})()})),(0,s.Q6)("loadFullChat",((t,e,a)=>{const{chatId:s,force:n}=a,o=(0,c.Z1)(t,s);o&&(n?y(o):v((()=>y(o))))})),(0,s.Q6)("loadTopChats",(()=>{m((()=>g("active")))})),(0,s.Q6)("requestChatUpdate",((t,e,a)=>{var s;const{serverTimeOffset:n}=t,{chatId:o}=a,r=(0,c.Z1)(t,o);r&&(0,d.t9)("requestChatUpdate",{chat:r,serverTimeOffset:n,...o===i.aw&&{lastLocalMessage:null===(s=(0,c.VF)(t))||void 0===s?void 0:s.message}})})),(0,s.Q6)("updateChatMutedState",((t,e,a)=>{const{serverTimeOffset:n}=t,{chatId:o,isMuted:i}=a,l=(0,c.Z1)(t,o);l&&((0,s.R3)((0,r.a4)(t,o,{isMuted:i})),(0,d.t9)("updateChatMutedState",{chat:l,isMuted:i,serverTimeOffset:n}))})),(0,s.Q6)("createChannel",((t,e,a)=>{const{title:n,about:i,photo:l,memberIds:h}=a;!async function(t,e,a,n){(0,s.R3)({...(0,s.Rd)(),chatCreation:{progress:o.Nh.InProgress}});const i=await(0,d.t9)("createChannel",{title:t,about:a,users:e});if(!i)return;const{id:c,accessHash:l}=i;let h=(0,s.Rd)();h=(0,r.a4)(h,c,i),h={...h,chatCreation:{...h.chatCreation,progress:i?o.Nh.Complete:o.Nh.Error}},(0,s.R3)(h),(0,s.uC)().openChat({id:c,shouldReplaceHistory:!0}),c&&l&&n&&await(0,d.t9)("editChatPhoto",{chatId:c,accessHash:l,photo:n})}(n,h.map((e=>(0,c.dy)(t,e))).filter(Boolean),i,l)})),(0,s.Q6)("joinChannel",((t,e,a)=>{const{chatId:s}=a,n=(0,c.Z1)(t,s);if(!n)return;const{id:o,accessHash:i}=n;o&&i&&(0,d.t9)("joinChannel",{channelId:o,accessHash:i})})),(0,s.Q6)("deleteChatUser",((t,e,a)=>{var n;const{chatId:o,userId:i}=a,l=(0,c.Z1)(t,o),h=(0,c.dy)(t,i);l&&h&&(t=(0,r.Dd)(t,o),(0,s.R3)(t),(null===(n=(0,c.Bt)(t))||void 0===n?void 0:n.chatId)===o&&e.openChat({id:void 0}),(0,d.t9)("deleteChatUser",{chat:l,user:h}))})),(0,s.Q6)("deleteChat",((t,e,a)=>{var n;const{chatId:o}=a,i=(0,c.Z1)(t,o);i&&(t=(0,r.Dd)(t,o),(0,s.R3)(t),(null===(n=(0,c.Bt)(t))||void 0===n?void 0:n.chatId)===o&&e.openChat({id:void 0}),(0,d.t9)("deleteChat",{chatId:i.id}))})),(0,s.Q6)("leaveChannel",((t,e,a)=>{var n;const{chatId:o}=a,i=(0,c.Z1)(t,o);if(!i)return;t=(0,r.Dd)(t,o),(0,s.R3)(t),(null===(n=(0,c.Bt)(t))||void 0===n?void 0:n.chatId)===o&&e.openChat({id:void 0});const{id:l,accessHash:h}=i;l&&h&&(0,d.t9)("leaveChannel",{channelId:l,accessHash:h})})),(0,s.Q6)("deleteChannel",((t,e,a)=>{var n;const{chatId:o}=a,i=(0,c.Z1)(t,o);if(!i)return;t=(0,r.Dd)(t,o),(0,s.R3)(t),(null===(n=(0,c.Bt)(t))||void 0===n?void 0:n.chatId)===o&&e.openChat({id:void 0});const{id:l,accessHash:h}=i;l&&h&&(0,d.t9)("deleteChannel",{channelId:l,accessHash:h})})),(0,s.Q6)("createGroupChat",((t,e,a)=>{const{title:n,memberIds:i,photo:l}=a;!async function(t,e,a){(0,s.R3)({...(0,s.Rd)(),chatCreation:{progress:o.Nh.InProgress}});try{const n=await(0,d.t9)("createGroupChat",{title:t,users:e});if(!n)return;const{id:i}=n;let c=(0,s.Rd)();c=(0,r.a4)(c,i,n),c={...c,chatCreation:{...c.chatCreation,progress:n?o.Nh.Complete:o.Nh.Error}},(0,s.R3)(c),(0,s.uC)().openChat({id:i,shouldReplaceHistory:!0}),i&&a&&await(0,d.t9)("editChatPhoto",{chatId:i,photo:a})}catch(t){if("USERS_TOO_FEW"===t.message){const t=(0,s.Rd)();(0,s.R3)({...t,chatCreation:{...t.chatCreation,progress:o.Nh.Error,error:"CreateGroupError"}})}}}(n,i.map((e=>(0,c.dy)(t,e))).filter(Boolean),l)})),(0,s.Q6)("toggleChatPinned",((t,e,a)=>{const{id:s,folderId:n}=a,o=(0,c.Z1)(t,s);if(o)if(n){const e=(0,c.Mw)(t,n);if(e){const a=!(0,c.ep)(t,s,n),{pinnedChatIds:o,includedChatIds:i}=e,r=a?[s,...o||[]]:(o||[]).filter((t=>t!==s)),l=[s,...i];(0,d.t9)("editChatFolder",{id:n,folderUpdate:{...e,pinnedChatIds:r,includedChatIds:l}})}}else{const e=(0,c.Ek)(t,s),a=(0,c.ep)(t,s,"archived"===e?i.WS:void 0);(0,d.t9)("toggleChatPinned",{chat:o,shouldBePinned:!a})}})),(0,s.Q6)("toggleChatArchived",((t,e,a)=>{const{id:s}=a,n=(0,c.Z1)(t,s);n&&(0,d.t9)("toggleChatArchived",{chat:n,folderId:(0,u.pE)(n)?0:i.WS})})),(0,s.Q6)("loadChatFolders",(()=>{!async function(){const t=await(0,d.t9)("fetchChatFolders");if(t){const e=(0,s.Rd)();(0,s.R3)({...e,chatFolders:{...e.chatFolders,...t}})}}()})),(0,s.Q6)("loadRecommendedChatFolders",(()=>{!async function(){const t=await(0,d.t9)("fetchRecommendedChatFolders");if(t){const e=(0,s.Rd)();(0,s.R3)({...e,chatFolders:{...e.chatFolders,recommended:t}})}}()})),(0,s.Q6)("editChatFolders",((t,e,a)=>{const{chatId:s,idsToRemove:n,idsToAdd:o}=a;n.forEach((async e=>{const a=(0,c.Mw)(t,e);var n;a&&await(0,d.t9)("editChatFolder",{id:e,folderUpdate:{...a,pinnedChatIds:null===(n=a.pinnedChatIds)||void 0===n?void 0:n.filter((t=>t!==s)),includedChatIds:a.includedChatIds.filter((t=>t!==s))}})})),o.forEach((async e=>{const a=(0,c.Mw)(t,e);a&&await(0,d.t9)("editChatFolder",{id:e,folderUpdate:{...a,includedChatIds:a.includedChatIds.concat(s)}})}))})),(0,s.Q6)("editChatFolder",((t,e,a)=>{const{id:s,folderUpdate:n}=a,o=(0,c.Mw)(t,s);o&&(0,d.t9)("editChatFolder",{id:s,folderUpdate:{id:s,emoticon:o.emoticon,pinnedChatIds:o.pinnedChatIds,...n}})})),(0,s.Q6)("addChatFolder",((t,e,a)=>{const{folder:n}=a,{orderedIds:o}=t.chatFolders;!async function(t,e){const{id:a,description:n,...o}=t;if(await(0,d.t9)("editChatFolder",{id:e+1,folderUpdate:{id:e+1,...o}}),!n)return;const i=(0,s.Rd)(),{recommended:r}=i.chatFolders;r&&(0,s.R3)({...i,chatFolders:{...i.chatFolders,recommended:r.filter((({id:t})=>t!==a))}})}(n,null!=o&&o.length?Math.max.apply(Math.max,o):i.WS)})),(0,s.Q6)("deleteChatFolder",((t,e,a)=>{const{id:s}=a;(0,c.Mw)(t,s)&&async function(t){await(0,d.t9)("deleteChatFolder",t)}(s)})),(0,s.Q6)("toggleChatUnread",((t,e,a)=>{const{id:s}=a,{serverTimeOffset:o}=t,i=(0,c.Z1)(t,s);i&&(i.unreadCount?(0,d.t9)("markMessageListRead",{serverTimeOffset:o,chat:i,threadId:n._f}):(0,d.t9)("toggleDialogUnread",{chat:i,hasUnreadMark:!i.hasUnreadMark}))})),(0,s.Q6)("openChatByInvite",((t,e,a)=>{const{hash:s}=a;(async()=>{const t=await(0,d.t9)("openChatByInvite",s);t&&e.openChat({id:t.chatId})})()})),(0,s.Q6)("openTelegramLink",((t,e,a)=>{const{url:s}=a;if(s.match(i.g$))return void(0,p.o)(s.match(i.g$)[0]);const n=new URL(s.startsWith("http")?s:`https://${s}`),[o,d,r]=n.pathname.split("/").filter(Boolean).map((t=>decodeURI(t))),l=Object.fromEntries(n.searchParams);let h;if("joinchat"===o&&(h=d),(o.startsWith(" ")||o.startsWith("+"))&&(h=o.substr(1,o.length-1)),h)return void e.openChatByInvite({hash:h});if("addstickers"===o)return void e.openStickerSetShortName({stickerSetShortName:d});const u=d||void 0,f=r?Number(r):void 0,C=l.comment?Number(l.comment):void 0;if(l.hasOwnProperty("voicechat")||l.hasOwnProperty("livestream"))e.joinVoiceChatByLink({username:o,inviteHash:l.voicechat||l.livestream});else if("c"===o&&u&&f){const a=`-${u}`;if(!(0,c.Z1)(t,a))return void e.showNotification({message:"Chat does not exist"});e.focusMessage({chatId:a,messageId:f})}else e.openChatByUsername({username:o,messageId:f||Number(u),commentId:C,startParam:l.start})})),(0,s.Q6)("acceptInviteConfirmation",((t,e,a)=>{const{hash:s}=a;(async()=>{const t=await(0,d.t9)("importChatInvite",{hash:s});t&&e.openChat({id:t.id})})()})),(0,s.Q6)("loadExportedChatInvites",((t,e,a)=>{const{chatId:n,adminId:o,isRevoked:i,limit:l}=a,h=(0,c.Z1)(t,n),u=(0,c.dy)(t,o||t.currentUserId);h&&u&&(async()=>{const t=await(0,d.t9)("fetchExportedChatInvites",{peer:h,admin:u,isRevoked:i,limit:l});t&&(0,s.R3)((0,r.fw)((0,s.Rd)(),n,{invites:t}))})()})),(0,s.Q6)("editExportedChatInvite",((t,e,a)=>{const{chatId:n,link:o,isRevoked:i,expireDate:l,usageLimit:h,isRequestNeeded:u,title:p}=a,f=(0,c.Z1)(t,n);f&&(async()=>{const e=await(0,d.t9)("editExportedChatInvite",{peer:f,link:o,isRevoked:i,expireDate:l,usageLimit:h,isRequestNeeded:u,title:p});if(!e)return;let a=(t=(0,s.Rd)()).management.byChatId[n].invites||[];const{oldInvite:c,newInvite:C}=e;a=a.filter((t=>t.link!==c.link)),(0,s.R3)((0,r.fw)(t,n,{invites:[...a,C]}))})()})),(0,s.Q6)("exportChatInvite",((t,e,a)=>{const{chatId:n,expireDate:o,usageLimit:i,isRequestNeeded:l,title:h}=a,u=(0,c.Z1)(t,n);u&&(async()=>{const e=await(0,d.t9)("exportChatInvite",{peer:u,expireDate:o,usageLimit:i,isRequestNeeded:l,title:h});if(!e)return;const a=(t=(0,s.Rd)()).management.byChatId[n].invites||[];(0,s.R3)((0,r.fw)(t,n,{invites:[...a,e]}))})()})),(0,s.Q6)("openChatByUsername",((t,e,a)=>{const{username:n,messageId:o,commentId:r,startParam:l}=a;(async()=>{const a=(0,c.jr)(t);if(!r)return a&&a.username===n?void e.focusMessage({chatId:a.id,messageId:o}):void await async function(t,e,a,s){t.openChat({id:i.AJ});const n=await b(e);if(!n)return t.openPreviousChat(),void t.showNotification({message:"User does not exist"});a?t.focusMessage({chatId:n.id,messageId:a}):t.openChat({id:n.id}),s&&t.startBot({botId:n.id,param:s})}(e,n,o,l);const{chatId:h,type:u}=(0,c.Bt)(t)||{},p=(0,c.DI)(t,n);if(h&&p&&"thread"===u){const a=(0,c.tZ)(t,h,o);if(a&&a.chatId===h)return void e.focusMessage({chatId:a.chatId,threadId:a.threadId,messageId:r})}o&&await async function(t,e,a,n){t.openChat({id:i.AJ});const o=await b(e);if(!o)return;const r=(0,s.Rd)(),l=(0,c.tZ)(r,o.id,a);let h;if(l)h=l.chatId;else{const t=await(0,d.t9)("requestThreadInfoUpdate",{chat:o,threadId:a});if(!t)return;h=t.discussionChatId}h&&t.focusMessage({chatId:h,threadId:a,messageId:Number(n)})}(e,n,o,r)})()})),(0,s.Q6)("togglePreHistoryHidden",((t,e,a)=>{const{chatId:s,isEnabled:n}=a;let o=(0,c.Z1)(t,s);o&&(async()=>{if((0,u.G9)(o)){if(o=await(0,d.t9)("migrateChat",o),!o)return;e.openChat({id:o.id})}(0,d.t9)("togglePreHistoryHidden",{chat:o,isEnabled:n})})()})),(0,s.Q6)("updateChatDefaultBannedRights",((t,e,a)=>{const{chatId:s,bannedRights:n}=a,o=(0,c.Z1)(t,s);o&&(0,d.t9)("updateChatDefaultBannedRights",{chat:o,bannedRights:n})})),(0,s.Q6)("updateChatMemberBannedRights",((t,e,a)=>{const{chatId:n,userId:o,bannedRights:i}=a;let l=(0,c.Z1)(t,n);const h=(0,c.dy)(t,o);l&&h&&(async()=>{if((0,u.G9)(l)){if(l=await(0,d.t9)("migrateChat",l),!l)return;e.openChat({id:l.id})}await(0,d.t9)("updateChatMemberBannedRights",{chat:l,user:h,bannedRights:i});const t=(0,s.Rd)(),a=(0,c.Z1)(t,n);if(!a||!a.fullInfo)return;const{members:p,kickedMembers:f}=a.fullInfo,C=!!i.viewMessages,I=!Object.keys(i).length;(0,s.R3)((0,r.a4)(t,n,{fullInfo:{...a.fullInfo,...p&&C&&{members:p.filter((t=>t.userId!==o))},...p&&!C&&{members:p.map((t=>t.userId===o?{...t,bannedRights:i}:t))},...I&&f&&{kickedMembers:f.filter((t=>t.userId!==o))}}}))})()})),(0,s.Q6)("updateChatAdmin",((t,e,a)=>{const{chatId:n,userId:o,adminRights:i,customTitle:l}=a;let h=(0,c.Z1)(t,n);const p=(0,c.dy)(t,o);h&&p&&(async()=>{if((0,u.G9)(h)){if(h=await(0,d.t9)("migrateChat",h),!h)return;e.openChat({id:h.id})}await(0,d.t9)("updateChatAdmin",{chat:h,user:p,adminRights:i,customTitle:l});const t=await(0,d.t9)("fetchFullChat",h),a=(0,s.Rd)();if(!t||!t.fullInfo)return;const{adminMembers:c}=t.fullInfo,f=!Object.keys(i).length;(0,s.R3)((0,r.a4)(a,n,{fullInfo:{...t.fullInfo,...c&&f&&{adminMembers:c.filter((t=>t.userId!==o))},...c&&!f&&{adminMembers:c.map((t=>t.userId===o?{...t,adminRights:i,customTitle:l}:t))}}}))})()})),(0,s.Q6)("updateChat",((t,e,a)=>{const{chatId:n,title:i,about:l,photo:h}=a,u=(0,c.Z1)(t,n);u&&(async()=>{(0,s.R3)((0,r.H9)((0,s.Rd)(),o.wv.InProgress)),await Promise.all([u.title!==i?(0,d.t9)("updateChatTitle",u,i):void 0,u.fullInfo&&u.fullInfo.about!==l?(0,d.t9)("updateChatAbout",u,l):void 0,h?(0,d.t9)("editChatPhoto",{chatId:n,accessHash:u.accessHash,photo:h}):void 0]),(0,s.R3)((0,r.H9)((0,s.Rd)(),o.wv.Complete))})()})),(0,s.Q6)("toggleSignatures",((t,e,a)=>{const{chatId:s,isEnabled:n}=a,o=(0,c.Z1)(t,s);o&&(0,d.t9)("toggleSignatures",{chat:o,isEnabled:n})})),(0,s.Q6)("loadGroupsForDiscussion",(()=>{(async()=>{const t=await(0,d.t9)("fetchGroupsForDiscussion");if(!t)return;const e=t.reduce(((t,e)=>(e&&(t[e.id]=e),t)),{}),a=(0,r.fZ)((0,s.Rd)(),e);(0,s.R3)({...a,chats:{...a.chats,forDiscussionIds:Object.keys(e)}})})()})),(0,s.Q6)("linkDiscussionGroup",((t,e,a)=>{const{channelId:s,chatId:n}=a,o=(0,c.Z1)(t,s);let i=(0,c.Z1)(t,n);o&&i&&(async()=>{if((0,u.G9)(i)){if(i=await(0,d.t9)("migrateChat",i),!i)return;e.openChat({id:i.id})}let{fullInfo:t}=i;if(!t){const e=await(0,d.t9)("fetchFullChat",i);if(!e)return;t=e.fullInfo}t.isPreHistoryHidden&&await(0,d.t9)("togglePreHistoryHidden",{chat:i,isEnabled:!1}),(0,d.t9)("setDiscussionGroup",{channel:o,chat:i})})()})),(0,s.Q6)("unlinkDiscussionGroup",((t,e,a)=>{var s;const{channelId:n}=a,o=(0,c.Z1)(t,n);if(!o)return;let i;null!==(s=o.fullInfo)&&void 0!==s&&s.linkedChatId&&(i=(0,c.Z1)(t,o.fullInfo.linkedChatId)),(async()=>{await(0,d.t9)("setDiscussionGroup",{channel:o}),i&&y(i)})()})),(0,s.Q6)("setActiveChatFolder",((t,e,a)=>({...t,chatFolders:{...t.chatFolders,activeChatFolder:a}}))),(0,s.Q6)("loadMoreMembers",(t=>{(async()=>{var e,a;const{chatId:n}=(0,c.Bt)(t)||{},o=n?(0,c.Z1)(t,n):void 0;if(!o||(0,u.G9)(o))return;const i=(null===(e=o.fullInfo)||void 0===e||null===(a=e.members)||void 0===a?void 0:a.length)||void 0,h=await(0,d.t9)("fetchMembers",o.id,o.accessHash,"recent",i);if(!h)return;const{members:p,users:f}=h;p&&p.length&&(t=(0,s.Rd)(),t=(0,r.Sh)(t,(0,l.ee)(f,"id")),t=(0,r.a4)(t,o.id,{fullInfo:{...o.fullInfo,members:[...(o.fullInfo||{}).members||[],...p||[]]}}),(0,s.R3)(t))})()})),(0,s.Q6)("addChatMembers",((t,e,a)=>{const{chatId:s,memberIds:n}=a,i=(0,c.Z1)(t,s),r=n.map((e=>(0,c.dy)(t,e))).filter(Boolean);i&&r.length&&(e.setNewChatMembersDialogState(o.WB.Loading),(async()=>{await(0,d.t9)("addChatMembers",i,r),e.setNewChatMembersDialogState(o.WB.Closed),y(i)})())})),(0,s.Q6)("deleteChatMember",((t,e,a)=>{const{chatId:s,userId:n}=a,o=(0,c.Z1)(t,s),i=(0,c.dy)(t,n);o&&i&&(async()=>{await(0,d.t9)("deleteChatMember",o,i),y(o)})()})),(0,s.Q6)("toggleIsProtected",((t,e,a)=>{const{chatId:s,isProtected:n}=a,o=(0,c.Z1)(t,s);o&&(0,d.t9)("toggleIsProtected",{chat:o,isProtected:n})})),(0,s.Q6)("setChatEnabledReactions",((t,e,a)=>{const{chatId:s,enabledReactions:n}=a,o=(0,c.Z1)(t,s);o&&(async()=>{await(0,d.t9)("setChatEnabledReactions",{chat:o,enabledReactions:n}),await y(o)})()}))},1689:(t,e,a)=>{a.d(e,{FF:()=>M,NH:()=>k,Mt:()=>Q});var s=a(5116),n=a(2607),o=a(1226),i=a(1638),d=a(4319),r=a(4446),c=a(782),l=a(9959),h=a(6204),u=a(4753),p=a(7361),f=a(663);let C,I;const m=new Audio("./voicechat_join.mp3"),v=new Audio("./voicechat_connecting.mp3");v.loop=!0;const g=new Audio("./voicechat_leave.mp3"),y={join:m,allowTalk:new Audio("./voicechat_onallowtalk.mp3"),leave:g,connecting:v};let b=Promise.resolve();async function w(t){const e=await(0,o.t9)("getGroupCall",{call:t});if(!e)return;let a=(0,s.Rd)();const i=(0,n.$5)(a,t.id);return a=(0,r.AH)(a,t.id,(0,c.CE)(e.groupCall,["connectionState"]),void 0,null!=i&&i.isLoaded?void 0:e.groupCall.participantsCount),a=(0,l.Sh)(a,(0,c.ee)(e.users,"id")),a=(0,l.fZ)(a,(0,c.ee)(e.chats,"id")),(0,s.R3)(a),e.groupCall}async function R(t,e){const a=await(0,o.t9)("fetchGroupCallParticipants",{call:t,offset:e});if(!a)return;let n=(0,s.Rd)();n=(0,l.Sh)(n,(0,c.ee)(a.users,"id")),n=(0,l.fZ)(n,(0,c.ee)(a.chats,"id")),(0,s.R3)(n)}function M(){return C}function k(){return I}function Q(){var t;null===(t=C)||void 0===t||t.pause(),I=void 0,C=void 0}(0,s.Q6)("toggleGroupCallPanel",(t=>({...t,groupCalls:{...t.groupCalls,isGroupCallPanelHidden:!t.groupCalls.isGroupCallPanelHidden}}))),(0,s.Q6)("subscribeToGroupCallUpdates",((t,e,a)=>{const{subscribed:s,id:i}=a,d=(0,n.$5)(t,i);d&&(async()=>{s&&(await w(d),await R(d)),await(0,o.t9)("toggleGroupCallStartSubscription",{subscribed:s,call:d})})()})),(0,s.Q6)("createGroupCall",((t,e,a)=>{const{chatId:n}=a,d=(0,i.Z1)(t,n);d&&(async()=>{const a=await(0,o.t9)("createGroupCall",{peer:d});a&&(t=(0,s.Rd)(),(0,s.R3)((0,r.AH)(t,a.id,{...a,chatId:n})),e.joinGroupCall({id:a.id,accessHash:a.accessHash}))})()})),(0,s.Q6)("createGroupCallInviteLink",((t,e)=>{const a=(0,n.mU)(t);if(!a||!a.chatId)return;const s=(0,i.Z1)(t,a.chatId);if(!s)return;const r=!!s&&!!s.username;(async()=>{let{inviteLink:t}=s.fullInfo;r&&(t=await(0,o.t9)("exportGroupCallInvite",{call:a,canSelfUnmute:!1})),t&&((0,d.TE)(t),e.showNotification({message:"Link copied to clipboard"}))})()})),(0,s.Q6)("joinVoiceChatByLink",((t,e,a)=>{const{username:s,inviteHash:n}=a;(async()=>{const t=await(0,h.C)(s);if(!t)return void e.showNotification({message:f.i0("NoUsernameFound")});const a=await(0,h.f)(t);null!=a&&a.groupCall&&e.joinGroupCall({id:a.groupCall.id,accessHash:a.groupCall.accessHash,inviteHash:n})})()})),(0,s.Q6)("joinGroupCall",((t,e,a)=>{if(!p.Bi)return;const{chatId:o,id:i,accessHash:d,inviteHash:c}=a;!function(){const t=new(window.AudioContext||window.webkitAudioContext);C=new Audio,I=t,C.srcObject=(t=>{const e=t.createOscillator(),a=e.connect(t.createMediaStreamDestination());return e.start(),new MediaStream([Object.assign(a.stream.getAudioTracks()[0],{enabled:!1})])})(t),(0,u.Z)(C)}(),(async()=>{var l;await(b?(b=Promise.all(Object.values(y).map((t=>(t.muted=!0,t.volume=1e-4,t.play().then((()=>{t.pause(),t.volume=1,t.currentTime=0,t.muted=!1})))))).then((()=>{b=void 0})),b):Promise.resolve());const{groupCalls:{activeGroupCallId:h}}=t;let u=i?(0,n.$5)(t,i):(0,n.Bj)(t,o);(null===(l=u)||void 0===l?void 0:l.id)!==h?h?e.leaveGroupCall({rejoin:a}):u&&h===u.id?e.toggleGroupCallPanel():(u||i&&d||(u=await w({id:i,accessHash:d})),u&&(t=(0,s.Rd)(),t=(0,r.AH)(t,u.id,{...u,inviteHash:c},void 0,u.participantsCount+1),(0,s.R3)({...t,groupCalls:{...t.groupCalls,activeGroupCallId:u.id,isGroupCallPanelHidden:!1}}))):e.toggleGroupCallPanel()})()})),(0,s.Q6)("playGroupCallSound",((t,e,a)=>{const{sound:s}=a;y[s]&&(b?b.then((()=>{(0,u.Z)(y[s])})):("connecting"!==s&&y.connecting.pause(),(0,u.Z)(y[s])))})),(0,s.Q6)("loadMoreGroupCallParticipants",(t=>{const e=(0,n.mU)(t);e&&R(e,e.nextOffset)})),(0,s.Q6)("openCallFallbackConfirm",(t=>({...t,groupCalls:{...t.groupCalls,isFallbackConfirmOpen:!0}}))),(0,s.Q6)("closeCallFallbackConfirm",(t=>({...t,groupCalls:{...t.groupCalls,isFallbackConfirmOpen:!1}})))},4446:(t,e,a)=>{a.d(e,{AH:()=>d,dc:()=>r,Ic:()=>c,B6:()=>l});var s=a(2607),n=a(782),o=a(6788),i=a(1638);function d(t,e,a,s,o){var i;const d=Object.values({...null===(i=t.groupCalls.byId[e])||void 0===i?void 0:i.participants,...a.participants}).filter((t=>!t.isLeft)).reduce(((t,e)=>(t[e.id]=e,t)),{});return{...t,groupCalls:{...t.groupCalls,byId:{...t.groupCalls.byId,[e]:{...t.groupCalls.byId[e],...(0,n.CE)(a,["participantsCount"]),...s&&{participantsCount:t.groupCalls.byId[e].participantsCount+s},...void 0!==o&&{participantsCount:o},participants:d}}}}}function r(t,e){const a=(0,s.$5)(t,e);if(a&&a.chatId){const e=(0,i.Z1)(t,a.chatId);e&&(t=(0,o.a4)(t,a.chatId,{fullInfo:{...e.fullInfo,groupCallId:void 0}}))}return{...t,groupCalls:{...t.groupCalls,byId:{...(0,n.CE)(t.groupCalls.byId,[e.toString()])}}}}function c(t,e,a){return t.groupCalls.activeGroupCallId?d(t,t.groupCalls.activeGroupCallId,e,void 0,a):t}function l(t,e,a,n,o=!1){const i=(0,s.$5)(t,e);return i?d(t,e,{participants:{...i.participants,[a]:{...i.participants[a],...n}}},n.isLeft?o?0:-1:i.participants[a]||o?0:1):t}},2607:(t,e,a)=>{a.d(e,{Bj:()=>i,$5:()=>d,GU:()=>r,Ht:()=>c,mU:()=>l,oq:()=>h});var s=a(8857),n=a(2858),o=a(6376);function i(t,e){const a=(0,s.Z1)(t,e);if(a&&a.fullInfo&&a.fullInfo.groupCallId)return d(t,a.fullInfo.groupCallId)}function d(t,e){return t.groupCalls.byId[e]}function r(t,e,a){var s;return null===(s=d(t,e))||void 0===s?void 0:s.participants[a]}function c(t){var e,a;const o=null===(e=l(t))||void 0===e?void 0:e.chatId;if(!o)return!1;const i=(0,s.Z1)(t,o);return!!i&&((0,n.G9)(i)&&i.isCreator||!(null===(a=i.adminRights)||void 0===a||!a.manageCall))}function l(t){const{groupCalls:{activeGroupCallId:e}}=t;if(e)return d(t,e)}function h(t){const e=(0,o.dy)(t,t.currentUserId);return`Calls: ${(0,n.Js)(e)}`}},3551:(t,e,a)=>{a.d(e,{o:()=>o});var s=a(5116),n=a(7361);const o=t=>{const{protocol:e,searchParams:a,pathname:o,hostname:i}=new URL(t);if("tg:"!==e)return;const{openChatByInvite:d,openChatByUsername:r,openStickerSetShortName:c,focusMessage:l,joinVoiceChatByLink:h}=(0,s.uC)(),u=(n.s$?i:o).replace(/^\/\//,""),p={};switch(a.forEach(((t,e)=>{p[e]=t})),u){case"resolve":{const{domain:t,post:e,comment:a,voicechat:s,livestream:n,start:o}=p;"telegrampassport"!==t&&(p.hasOwnProperty("voicechat")||p.hasOwnProperty("livestream")?h({username:t,inviteHash:s||n}):r({username:t,messageId:Number(e),commentId:Number(a),startParam:o}));break}case"privatepost":{const{post:t,channel:e}=p;l({chatId:`-${e}`,id:t});break}case"bg":break;case"join":{const{invite:t}=p;d({hash:t});break}case"addstickers":{const{set:t}=p;c({stickerSetShortName:t});break}}}}}]); -//# sourceMappingURL=884.68ff64c281399c107bd4.js.map \ No newline at end of file +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[884],{2275:(t,e,a)=>{a.d(e,{Z:()=>h});var s=a(4050),n=a(5116),o=a(1638),i=a(2858),d=a(2340),r=a(9107),c=a(3103),l=a(231);const h=(0,s.X$)((0,n.c$)(((t,{userId:e})=>{const a=(0,o.jr)(t),s=e&&(0,o.dy)(t,e);return{chat:a,contactName:s?(0,i.Vl)(s):void 0}}))((({isOpen:t,chat:e,userId:a,contactName:o,onClose:i})=>{const{deleteChatMember:h}=(0,n.uC)(),u=(0,r.Z)(),p=(0,s.I4)((()=>{h({chatId:e.id,userId:a}),i()}),[e,h,i,a]);if(e&&a)return s.ZP.createElement(c.Z,{isOpen:t,onClose:i,onEnter:p,className:"delete",title:u("GroupRemoved.Remove")},s.ZP.createElement("p",null,(0,d.Z)(u("PeerInfo.Confirm.RemovePeer",o))),s.ZP.createElement(l.Z,{color:"danger",className:"confirm-dialog-button",isText:!0,onClick:p},u("lng_box_remove")),s.ZP.createElement(l.Z,{className:"confirm-dialog-button",isText:!0,onClick:i},u("Cancel")))})))},6071:(t,e,a)=>{a.d(e,{Z:()=>o});var s=a(4050),n=a(9118);const o=(t,e=!1)=>(0,s.Ye)((()=>(0,n.P2)((t=>t()),t,!e)),[t,e])},6204:(t,e,a)=>{a.d(e,{f:()=>y,C:()=>b});var s=a(5116),n=a(6137),o=a(1713),i=a(3716),d=a(1226),r=a(9959),c=a(1638),l=a(782),h=a(9118),u=a(2858),p=a(3551),f=a(4446),C=a(2607);const I=(0,h.P2)((t=>t()),300,!0),m=(0,h.P2)((t=>t()),3e3,!0),v=(0,h.Ds)((t=>t()),500,!1,!0);async function g(t,e,a){var o;let h=(0,s.Rd)();const u=await(0,d.t9)("fetchChats",{limit:i.Ov,offsetDate:a,archived:"archived"===t,withPinned:void 0===h.chats.orderedPinnedIds[t],serverTimeOffset:h.serverTimeOffset,lastLocalServiceMessage:null===(o=(0,c.VF)(h))||void 0===o?void 0:o.message});if(!u)return;const{chatIds:p}=u;p.length>0&&p[0]===e&&p.shift(),h=(0,s.Rd)(),h=(0,r.Sh)(h,(0,l.ee)(u.users,"id")),h=(0,r.zn)(h,u.userStatusesById),h=(0,r.GL)(h,(0,l.ee)(u.chats,"id")),h=(0,r.B1)(h,t,p),h=(0,r.vv)(h,t,u),Object.keys(u.draftsById).forEach((t=>{h=(0,r.pf)(h,t,n._f,"draft",u.draftsById[t])})),Object.keys(u.replyingToById).forEach((t=>{h=(0,r.pf)(h,t,n._f,"replyingToId",u.replyingToById[t])})),0!==p.length||h.chats.isFullyLoaded[t]||(h={...h,chats:{...h.chats,isFullyLoaded:{...h.chats.isFullyLoaded,[t]:!0}}}),(0,s.R3)(h)}async function y(t){const e=await(0,d.t9)("fetchFullChat",t);if(!e)return;const{users:a,fullInfo:n,groupCall:o}=e;let i=(0,s.Rd)();if(a&&(i=(0,r.Sh)(i,(0,l.ee)(a,"id"))),o){const t=(0,C.$5)(i,o.id);i=(0,f.AH)(i,o.id,(0,l.CE)(o,["connectionState"]),void 0,t?void 0:o.participantsCount)}return i=(0,r.a4)(i,t.id,{fullInfo:n}),(0,s.R3)(i),e}async function b(t){const e=(0,s.Rd)(),a=(0,c.DI)(e,t);if(a&&!a.isMin)return a;const n=await(0,d.t9)("getChatByUsername",t);return n?((0,s.R3)((0,r.a4)((0,s.Rd)(),n.id,n)),n):void 0}(0,s.Q6)("preloadTopChatMessages",((t,e)=>{(async()=>{const a=[];for(let o=0;ot!==r&&!a.includes(t)));if(!f)return;a.push(f.id),e.loadViewportMessages({chatId:f.id,threadId:n._f})}})()})),(0,s.Q6)("openChat",((t,e,a)=>{const{id:s,threadId:o}=a,{currentUserId:i}=t,r=(0,c.Z1)(t,s);if(null!=r&&r.hasUnreadMark&&e.toggleChatUnread({id:s}),r&&r.lastMessage&&r.lastMessage.threadInfo&&e.requestThreadInfoUpdate({chatId:r.lastMessage.threadInfo.chatId,threadId:r.lastMessage.threadInfo.threadId}),r)(0,u.Hp)(r)&&!r.isMin&&e.requestChatUpdate({chatId:s});else if(s===i)(0,d.t9)("fetchChat",{type:"self"});else{const e=(0,c.dy)(t,s);e&&(0,d.t9)("fetchChat",{type:"user",user:e})}o!==n._f&&((0,c.qS)(t,s,o)||e.requestThreadInfoUpdate({chatId:s,threadId:o}))})),(0,s.Q6)("openLinkedChat",((t,e,a)=>{const{id:s}=a,n=(0,c.Z1)(t,s);n&&(async()=>{var t;const a=await(0,d.t9)("fetchFullChat",n);null!=a&&null!==(t=a.fullInfo)&&void 0!==t&&t.linkedChatId&&e.openChat({id:a.fullInfo.linkedChatId})})()})),(0,s.Q6)("focusMessageInComments",((t,e,a)=>{const{chatId:s,threadId:n,messageId:o}=a,i=(0,c.Z1)(t,s);i&&(async()=>{await(0,d.t9)("requestThreadInfoUpdate",{chat:i,threadId:n})&&e.focusMessage({chatId:s,threadId:n,messageId:o})})()})),(0,s.Q6)("openSupportChat",((t,e)=>{const a=(0,c.P_)(t);a?e.openChat({id:a.id,shouldReplaceHistory:!0}):(e.openChat({id:i.AJ,shouldReplaceHistory:!0}),(async()=>{const t=await(0,d.t9)("fetchChat",{type:"support"});t&&e.openChat({id:t.chatId,shouldReplaceHistory:!0})})())})),(0,s.Q6)("openTipsChat",((t,e,a)=>{const{langCode:s}=a,n="pt-br"===s?"BR":i.Db.includes(s)?s.toUpperCase():"";e.openChatByUsername({username:`${i.vi}${n}`})})),(0,s.Q6)("loadMoreChats",((t,e,a)=>{const{listType:s="active"}=a,n=t.chats.listIds[s];if(t.chats.isFullyLoaded[s])return;const o=n?n.map((e=>t.chats.byId[e])).filter((e=>Boolean(null==e?void 0:e.lastMessage)&&!(0,c.ep)(t,e.id))).sort(((t,e)=>t.lastMessage.date-e.lastMessage.date))[0]:void 0;I(o?()=>g(s,o.id,o.lastMessage.date):()=>g(s))})),(0,s.Q6)("preloadArchivedChats",(()=>{(async()=>{for(;!(0,s.Rd)().chats.isFullyLoaded.archived;){const t=(0,s.Rd)(),e=t.chats.listIds.archived,a=e?e.map((e=>t.chats.byId[e])).filter((e=>Boolean(null==e?void 0:e.lastMessage)&&!(0,c.ep)(t,e.id))).sort(((t,e)=>t.lastMessage.date-e.lastMessage.date))[0]:void 0;await g("archived",null==a?void 0:a.id,null==a?void 0:a.lastMessage.date),await(0,h.wO)(300)}})()})),(0,s.Q6)("loadFullChat",((t,e,a)=>{const{chatId:s,force:n}=a,o=(0,c.Z1)(t,s);o&&(n?y(o):v((()=>y(o))))})),(0,s.Q6)("loadTopChats",(()=>{m((()=>g("active")))})),(0,s.Q6)("requestChatUpdate",((t,e,a)=>{var s;const{serverTimeOffset:n}=t,{chatId:o}=a,r=(0,c.Z1)(t,o);r&&(0,d.t9)("requestChatUpdate",{chat:r,serverTimeOffset:n,...o===i.aw&&{lastLocalMessage:null===(s=(0,c.VF)(t))||void 0===s?void 0:s.message}})})),(0,s.Q6)("updateChatMutedState",((t,e,a)=>{const{serverTimeOffset:n}=t,{chatId:o,isMuted:i}=a,l=(0,c.Z1)(t,o);l&&((0,s.R3)((0,r.a4)(t,o,{isMuted:i})),(0,d.t9)("updateChatMutedState",{chat:l,isMuted:i,serverTimeOffset:n}))})),(0,s.Q6)("createChannel",((t,e,a)=>{const{title:n,about:i,photo:l,memberIds:h}=a;!async function(t,e,a,n){(0,s.R3)({...(0,s.Rd)(),chatCreation:{progress:o.Nh.InProgress}});const i=await(0,d.t9)("createChannel",{title:t,about:a,users:e});if(!i)return;const{id:c,accessHash:l}=i;let h=(0,s.Rd)();h=(0,r.a4)(h,c,i),h={...h,chatCreation:{...h.chatCreation,progress:i?o.Nh.Complete:o.Nh.Error}},(0,s.R3)(h),(0,s.uC)().openChat({id:c,shouldReplaceHistory:!0}),c&&l&&n&&await(0,d.t9)("editChatPhoto",{chatId:c,accessHash:l,photo:n})}(n,h.map((e=>(0,c.dy)(t,e))).filter(Boolean),i,l)})),(0,s.Q6)("joinChannel",((t,e,a)=>{const{chatId:s}=a,n=(0,c.Z1)(t,s);if(!n)return;const{id:o,accessHash:i}=n;o&&i&&(0,d.t9)("joinChannel",{channelId:o,accessHash:i})})),(0,s.Q6)("deleteChatUser",((t,e,a)=>{var n;const{chatId:o,userId:i}=a,l=(0,c.Z1)(t,o),h=(0,c.dy)(t,i);l&&h&&(t=(0,r.Dd)(t,o),(0,s.R3)(t),(null===(n=(0,c.Bt)(t))||void 0===n?void 0:n.chatId)===o&&e.openChat({id:void 0}),(0,d.t9)("deleteChatUser",{chat:l,user:h}))})),(0,s.Q6)("deleteChat",((t,e,a)=>{var n;const{chatId:o}=a,i=(0,c.Z1)(t,o);i&&(t=(0,r.Dd)(t,o),(0,s.R3)(t),(null===(n=(0,c.Bt)(t))||void 0===n?void 0:n.chatId)===o&&e.openChat({id:void 0}),(0,d.t9)("deleteChat",{chatId:i.id}))})),(0,s.Q6)("leaveChannel",((t,e,a)=>{var n;const{chatId:o}=a,i=(0,c.Z1)(t,o);if(!i)return;t=(0,r.Dd)(t,o),(0,s.R3)(t),(null===(n=(0,c.Bt)(t))||void 0===n?void 0:n.chatId)===o&&e.openChat({id:void 0});const{id:l,accessHash:h}=i;l&&h&&(0,d.t9)("leaveChannel",{channelId:l,accessHash:h})})),(0,s.Q6)("deleteChannel",((t,e,a)=>{var n;const{chatId:o}=a,i=(0,c.Z1)(t,o);if(!i)return;t=(0,r.Dd)(t,o),(0,s.R3)(t),(null===(n=(0,c.Bt)(t))||void 0===n?void 0:n.chatId)===o&&e.openChat({id:void 0});const{id:l,accessHash:h}=i;l&&h&&(0,d.t9)("deleteChannel",{channelId:l,accessHash:h})})),(0,s.Q6)("createGroupChat",((t,e,a)=>{const{title:n,memberIds:i,photo:l}=a;!async function(t,e,a){(0,s.R3)({...(0,s.Rd)(),chatCreation:{progress:o.Nh.InProgress}});try{const n=await(0,d.t9)("createGroupChat",{title:t,users:e});if(!n)return;const{id:i}=n;let c=(0,s.Rd)();c=(0,r.a4)(c,i,n),c={...c,chatCreation:{...c.chatCreation,progress:n?o.Nh.Complete:o.Nh.Error}},(0,s.R3)(c),(0,s.uC)().openChat({id:i,shouldReplaceHistory:!0}),i&&a&&await(0,d.t9)("editChatPhoto",{chatId:i,photo:a})}catch(t){if("USERS_TOO_FEW"===t.message){const t=(0,s.Rd)();(0,s.R3)({...t,chatCreation:{...t.chatCreation,progress:o.Nh.Error,error:"CreateGroupError"}})}}}(n,i.map((e=>(0,c.dy)(t,e))).filter(Boolean),l)})),(0,s.Q6)("toggleChatPinned",((t,e,a)=>{const{id:s,folderId:n}=a,o=(0,c.Z1)(t,s);if(o)if(n){const e=(0,c.Mw)(t,n);if(e){const a=!(0,c.ep)(t,s,n),{pinnedChatIds:o,includedChatIds:i}=e,r=a?[s,...o||[]]:(o||[]).filter((t=>t!==s)),l=[s,...i];(0,d.t9)("editChatFolder",{id:n,folderUpdate:{...e,pinnedChatIds:r,includedChatIds:l}})}}else{const e=(0,c.Ek)(t,s),a=(0,c.ep)(t,s,"archived"===e?i.WS:void 0);(0,d.t9)("toggleChatPinned",{chat:o,shouldBePinned:!a})}})),(0,s.Q6)("toggleChatArchived",((t,e,a)=>{const{id:s}=a,n=(0,c.Z1)(t,s);n&&(0,d.t9)("toggleChatArchived",{chat:n,folderId:(0,u.pE)(n)?0:i.WS})})),(0,s.Q6)("loadChatFolders",(()=>{!async function(){const t=await(0,d.t9)("fetchChatFolders");if(t){const e=(0,s.Rd)();(0,s.R3)({...e,chatFolders:{...e.chatFolders,...t}})}}()})),(0,s.Q6)("loadRecommendedChatFolders",(()=>{!async function(){const t=await(0,d.t9)("fetchRecommendedChatFolders");if(t){const e=(0,s.Rd)();(0,s.R3)({...e,chatFolders:{...e.chatFolders,recommended:t}})}}()})),(0,s.Q6)("editChatFolders",((t,e,a)=>{const{chatId:s,idsToRemove:n,idsToAdd:o}=a;n.forEach((async e=>{const a=(0,c.Mw)(t,e);var n;a&&await(0,d.t9)("editChatFolder",{id:e,folderUpdate:{...a,pinnedChatIds:null===(n=a.pinnedChatIds)||void 0===n?void 0:n.filter((t=>t!==s)),includedChatIds:a.includedChatIds.filter((t=>t!==s))}})})),o.forEach((async e=>{const a=(0,c.Mw)(t,e);a&&await(0,d.t9)("editChatFolder",{id:e,folderUpdate:{...a,includedChatIds:a.includedChatIds.concat(s)}})}))})),(0,s.Q6)("editChatFolder",((t,e,a)=>{const{id:s,folderUpdate:n}=a,o=(0,c.Mw)(t,s);o&&(0,d.t9)("editChatFolder",{id:s,folderUpdate:{id:s,emoticon:o.emoticon,pinnedChatIds:o.pinnedChatIds,...n}})})),(0,s.Q6)("addChatFolder",((t,e,a)=>{const{folder:n}=a,{orderedIds:o}=t.chatFolders;!async function(t,e){const{id:a,description:n,...o}=t;if(await(0,d.t9)("editChatFolder",{id:e+1,folderUpdate:{id:e+1,...o}}),!n)return;const i=(0,s.Rd)(),{recommended:r}=i.chatFolders;r&&(0,s.R3)({...i,chatFolders:{...i.chatFolders,recommended:r.filter((({id:t})=>t!==a))}})}(n,null!=o&&o.length?Math.max.apply(Math.max,o):i.WS)})),(0,s.Q6)("deleteChatFolder",((t,e,a)=>{const{id:s}=a;(0,c.Mw)(t,s)&&async function(t){await(0,d.t9)("deleteChatFolder",t)}(s)})),(0,s.Q6)("toggleChatUnread",((t,e,a)=>{const{id:s}=a,{serverTimeOffset:o}=t,i=(0,c.Z1)(t,s);i&&(i.unreadCount?(0,d.t9)("markMessageListRead",{serverTimeOffset:o,chat:i,threadId:n._f}):(0,d.t9)("toggleDialogUnread",{chat:i,hasUnreadMark:!i.hasUnreadMark}))})),(0,s.Q6)("openChatByInvite",((t,e,a)=>{const{hash:s}=a;(async()=>{const t=await(0,d.t9)("openChatByInvite",s);t&&e.openChat({id:t.chatId})})()})),(0,s.Q6)("openTelegramLink",((t,e,a)=>{const{url:s}=a;if(s.match(i.g$))return void(0,p.o)(s.match(i.g$)[0]);const n=new URL(s.startsWith("http")?s:`https://${s}`),[o,d,r]=n.pathname.split("/").filter(Boolean).map((t=>decodeURI(t))),l=Object.fromEntries(n.searchParams);let h;if("joinchat"===o&&(h=d),(o.startsWith(" ")||o.startsWith("+"))&&(h=o.substr(1,o.length-1)),h)return void e.openChatByInvite({hash:h});if("addstickers"===o)return void e.openStickerSetShortName({stickerSetShortName:d});const u=d||void 0,f=r?Number(r):void 0,C=l.comment?Number(l.comment):void 0;if(l.hasOwnProperty("voicechat")||l.hasOwnProperty("livestream"))e.joinVoiceChatByLink({username:o,inviteHash:l.voicechat||l.livestream});else if("c"===o&&u&&f){const a=`-${u}`;if(!(0,c.Z1)(t,a))return void e.showNotification({message:"Chat does not exist"});e.focusMessage({chatId:a,messageId:f})}else e.openChatByUsername({username:o,messageId:f||Number(u),commentId:C,startParam:l.start})})),(0,s.Q6)("acceptInviteConfirmation",((t,e,a)=>{const{hash:s}=a;(async()=>{const t=await(0,d.t9)("importChatInvite",{hash:s});t&&e.openChat({id:t.id})})()})),(0,s.Q6)("loadExportedChatInvites",((t,e,a)=>{const{chatId:n,adminId:o,isRevoked:i,limit:l}=a,h=(0,c.Z1)(t,n),u=(0,c.dy)(t,o||t.currentUserId);h&&u&&(async()=>{const t=await(0,d.t9)("fetchExportedChatInvites",{peer:h,admin:u,isRevoked:i,limit:l});t&&(0,s.R3)((0,r.fw)((0,s.Rd)(),n,{invites:t}))})()})),(0,s.Q6)("editExportedChatInvite",((t,e,a)=>{const{chatId:n,link:o,isRevoked:i,expireDate:l,usageLimit:h,isRequestNeeded:u,title:p}=a,f=(0,c.Z1)(t,n);f&&(async()=>{const e=await(0,d.t9)("editExportedChatInvite",{peer:f,link:o,isRevoked:i,expireDate:l,usageLimit:h,isRequestNeeded:u,title:p});if(!e)return;let a=(t=(0,s.Rd)()).management.byChatId[n].invites||[];const{oldInvite:c,newInvite:C}=e;a=a.filter((t=>t.link!==c.link)),(0,s.R3)((0,r.fw)(t,n,{invites:[...a,C]}))})()})),(0,s.Q6)("exportChatInvite",((t,e,a)=>{const{chatId:n,expireDate:o,usageLimit:i,isRequestNeeded:l,title:h}=a,u=(0,c.Z1)(t,n);u&&(async()=>{const e=await(0,d.t9)("exportChatInvite",{peer:u,expireDate:o,usageLimit:i,isRequestNeeded:l,title:h});if(!e)return;const a=(t=(0,s.Rd)()).management.byChatId[n].invites||[];(0,s.R3)((0,r.fw)(t,n,{invites:[...a,e]}))})()})),(0,s.Q6)("openChatByUsername",((t,e,a)=>{const{username:n,messageId:o,commentId:r,startParam:l}=a;(async()=>{const a=(0,c.jr)(t);if(!r)return a&&a.username===n?void e.focusMessage({chatId:a.id,messageId:o}):void await async function(t,e,a,s){t.openChat({id:i.AJ});const n=await b(e);if(!n)return t.openPreviousChat(),void t.showNotification({message:"User does not exist"});a?t.focusMessage({chatId:n.id,messageId:a}):t.openChat({id:n.id}),s&&t.startBot({botId:n.id,param:s})}(e,n,o,l);const{chatId:h,type:u}=(0,c.Bt)(t)||{},p=(0,c.DI)(t,n);if(h&&p&&"thread"===u){const a=(0,c.tZ)(t,h,o);if(a&&a.chatId===h)return void e.focusMessage({chatId:a.chatId,threadId:a.threadId,messageId:r})}o&&await async function(t,e,a,n){t.openChat({id:i.AJ});const o=await b(e);if(!o)return;const r=(0,s.Rd)(),l=(0,c.tZ)(r,o.id,a);let h;if(l)h=l.chatId;else{const t=await(0,d.t9)("requestThreadInfoUpdate",{chat:o,threadId:a});if(!t)return;h=t.discussionChatId}h&&t.focusMessage({chatId:h,threadId:a,messageId:Number(n)})}(e,n,o,r)})()})),(0,s.Q6)("togglePreHistoryHidden",((t,e,a)=>{const{chatId:s,isEnabled:n}=a;let o=(0,c.Z1)(t,s);o&&(async()=>{if((0,u.G9)(o)){if(o=await(0,d.t9)("migrateChat",o),!o)return;e.openChat({id:o.id})}(0,d.t9)("togglePreHistoryHidden",{chat:o,isEnabled:n})})()})),(0,s.Q6)("updateChatDefaultBannedRights",((t,e,a)=>{const{chatId:s,bannedRights:n}=a,o=(0,c.Z1)(t,s);o&&(0,d.t9)("updateChatDefaultBannedRights",{chat:o,bannedRights:n})})),(0,s.Q6)("updateChatMemberBannedRights",((t,e,a)=>{const{chatId:n,userId:o,bannedRights:i}=a;let l=(0,c.Z1)(t,n);const h=(0,c.dy)(t,o);l&&h&&(async()=>{if((0,u.G9)(l)){if(l=await(0,d.t9)("migrateChat",l),!l)return;e.openChat({id:l.id})}await(0,d.t9)("updateChatMemberBannedRights",{chat:l,user:h,bannedRights:i});const t=(0,s.Rd)(),a=(0,c.Z1)(t,n);if(!a||!a.fullInfo)return;const{members:p,kickedMembers:f}=a.fullInfo,C=!!i.viewMessages,I=!Object.keys(i).length;(0,s.R3)((0,r.a4)(t,n,{fullInfo:{...a.fullInfo,...p&&C&&{members:p.filter((t=>t.userId!==o))},...p&&!C&&{members:p.map((t=>t.userId===o?{...t,bannedRights:i}:t))},...I&&f&&{kickedMembers:f.filter((t=>t.userId!==o))}}}))})()})),(0,s.Q6)("updateChatAdmin",((t,e,a)=>{const{chatId:n,userId:o,adminRights:i,customTitle:l}=a;let h=(0,c.Z1)(t,n);const p=(0,c.dy)(t,o);h&&p&&(async()=>{if((0,u.G9)(h)){if(h=await(0,d.t9)("migrateChat",h),!h)return;e.openChat({id:h.id})}await(0,d.t9)("updateChatAdmin",{chat:h,user:p,adminRights:i,customTitle:l});const t=await(0,d.t9)("fetchFullChat",h),a=(0,s.Rd)();if(!t||!t.fullInfo)return;const{adminMembers:c}=t.fullInfo,f=!Object.keys(i).length;(0,s.R3)((0,r.a4)(a,n,{fullInfo:{...t.fullInfo,...c&&f&&{adminMembers:c.filter((t=>t.userId!==o))},...c&&!f&&{adminMembers:c.map((t=>t.userId===o?{...t,adminRights:i,customTitle:l}:t))}}}))})()})),(0,s.Q6)("updateChat",((t,e,a)=>{const{chatId:n,title:i,about:l,photo:h}=a,u=(0,c.Z1)(t,n);u&&(async()=>{(0,s.R3)((0,r.H9)((0,s.Rd)(),o.wv.InProgress)),await Promise.all([u.title!==i?(0,d.t9)("updateChatTitle",u,i):void 0,u.fullInfo&&u.fullInfo.about!==l?(0,d.t9)("updateChatAbout",u,l):void 0,h?(0,d.t9)("editChatPhoto",{chatId:n,accessHash:u.accessHash,photo:h}):void 0]),(0,s.R3)((0,r.H9)((0,s.Rd)(),o.wv.Complete))})()})),(0,s.Q6)("toggleSignatures",((t,e,a)=>{const{chatId:s,isEnabled:n}=a,o=(0,c.Z1)(t,s);o&&(0,d.t9)("toggleSignatures",{chat:o,isEnabled:n})})),(0,s.Q6)("loadGroupsForDiscussion",(()=>{(async()=>{const t=await(0,d.t9)("fetchGroupsForDiscussion");if(!t)return;const e=t.reduce(((t,e)=>(e&&(t[e.id]=e),t)),{}),a=(0,r.fZ)((0,s.Rd)(),e);(0,s.R3)({...a,chats:{...a.chats,forDiscussionIds:Object.keys(e)}})})()})),(0,s.Q6)("linkDiscussionGroup",((t,e,a)=>{const{channelId:s,chatId:n}=a,o=(0,c.Z1)(t,s);let i=(0,c.Z1)(t,n);o&&i&&(async()=>{if((0,u.G9)(i)){if(i=await(0,d.t9)("migrateChat",i),!i)return;e.openChat({id:i.id})}let{fullInfo:t}=i;if(!t){const e=await(0,d.t9)("fetchFullChat",i);if(!e)return;t=e.fullInfo}t.isPreHistoryHidden&&await(0,d.t9)("togglePreHistoryHidden",{chat:i,isEnabled:!1}),(0,d.t9)("setDiscussionGroup",{channel:o,chat:i})})()})),(0,s.Q6)("unlinkDiscussionGroup",((t,e,a)=>{var s;const{channelId:n}=a,o=(0,c.Z1)(t,n);if(!o)return;let i;null!==(s=o.fullInfo)&&void 0!==s&&s.linkedChatId&&(i=(0,c.Z1)(t,o.fullInfo.linkedChatId)),(async()=>{await(0,d.t9)("setDiscussionGroup",{channel:o}),i&&y(i)})()})),(0,s.Q6)("setActiveChatFolder",((t,e,a)=>({...t,chatFolders:{...t.chatFolders,activeChatFolder:a}}))),(0,s.Q6)("loadMoreMembers",(t=>{(async()=>{var e,a;const{chatId:n}=(0,c.Bt)(t)||{},o=n?(0,c.Z1)(t,n):void 0;if(!o||(0,u.G9)(o))return;const i=(null===(e=o.fullInfo)||void 0===e||null===(a=e.members)||void 0===a?void 0:a.length)||void 0,h=await(0,d.t9)("fetchMembers",o.id,o.accessHash,"recent",i);if(!h)return;const{members:p,users:f}=h;p&&p.length&&(t=(0,s.Rd)(),t=(0,r.Sh)(t,(0,l.ee)(f,"id")),t=(0,r.a4)(t,o.id,{fullInfo:{...o.fullInfo,members:[...(o.fullInfo||{}).members||[],...p||[]]}}),(0,s.R3)(t))})()})),(0,s.Q6)("addChatMembers",((t,e,a)=>{const{chatId:s,memberIds:n}=a,i=(0,c.Z1)(t,s),r=n.map((e=>(0,c.dy)(t,e))).filter(Boolean);i&&r.length&&(e.setNewChatMembersDialogState(o.WB.Loading),(async()=>{await(0,d.t9)("addChatMembers",i,r),e.setNewChatMembersDialogState(o.WB.Closed),y(i)})())})),(0,s.Q6)("deleteChatMember",((t,e,a)=>{const{chatId:s,userId:n}=a,o=(0,c.Z1)(t,s),i=(0,c.dy)(t,n);o&&i&&(async()=>{await(0,d.t9)("deleteChatMember",o,i),y(o)})()})),(0,s.Q6)("toggleIsProtected",((t,e,a)=>{const{chatId:s,isProtected:n}=a,o=(0,c.Z1)(t,s);o&&(0,d.t9)("toggleIsProtected",{chat:o,isProtected:n})})),(0,s.Q6)("setChatEnabledReactions",((t,e,a)=>{const{chatId:s,enabledReactions:n}=a,o=(0,c.Z1)(t,s);o&&(async()=>{await(0,d.t9)("setChatEnabledReactions",{chat:o,enabledReactions:n}),await y(o)})()}))},1689:(t,e,a)=>{a.d(e,{FF:()=>M,NH:()=>k,Mt:()=>Q});var s=a(5116),n=a(2607),o=a(1226),i=a(1638),d=a(4319),r=a(4446),c=a(782),l=a(9959),h=a(6204),u=a(4753),p=a(7361),f=a(711);let C,I;const m=new Audio("./voicechat_join.mp3"),v=new Audio("./voicechat_connecting.mp3");v.loop=!0;const g=new Audio("./voicechat_leave.mp3"),y={join:m,allowTalk:new Audio("./voicechat_onallowtalk.mp3"),leave:g,connecting:v};let b=Promise.resolve();async function w(t){const e=await(0,o.t9)("getGroupCall",{call:t});if(!e)return;let a=(0,s.Rd)();const i=(0,n.$5)(a,t.id);return a=(0,r.AH)(a,t.id,(0,c.CE)(e.groupCall,["connectionState"]),void 0,null!=i&&i.isLoaded?void 0:e.groupCall.participantsCount),a=(0,l.Sh)(a,(0,c.ee)(e.users,"id")),a=(0,l.fZ)(a,(0,c.ee)(e.chats,"id")),(0,s.R3)(a),e.groupCall}async function R(t,e){const a=await(0,o.t9)("fetchGroupCallParticipants",{call:t,offset:e});if(!a)return;let n=(0,s.Rd)();n=(0,l.Sh)(n,(0,c.ee)(a.users,"id")),n=(0,l.fZ)(n,(0,c.ee)(a.chats,"id")),(0,s.R3)(n)}function M(){return C}function k(){return I}function Q(){var t;null===(t=C)||void 0===t||t.pause(),I=void 0,C=void 0}(0,s.Q6)("toggleGroupCallPanel",(t=>({...t,groupCalls:{...t.groupCalls,isGroupCallPanelHidden:!t.groupCalls.isGroupCallPanelHidden}}))),(0,s.Q6)("subscribeToGroupCallUpdates",((t,e,a)=>{const{subscribed:s,id:i}=a,d=(0,n.$5)(t,i);d&&(async()=>{s&&(await w(d),await R(d)),await(0,o.t9)("toggleGroupCallStartSubscription",{subscribed:s,call:d})})()})),(0,s.Q6)("createGroupCall",((t,e,a)=>{const{chatId:n}=a,d=(0,i.Z1)(t,n);d&&(async()=>{const a=await(0,o.t9)("createGroupCall",{peer:d});a&&(t=(0,s.Rd)(),(0,s.R3)((0,r.AH)(t,a.id,{...a,chatId:n})),e.joinGroupCall({id:a.id,accessHash:a.accessHash}))})()})),(0,s.Q6)("createGroupCallInviteLink",((t,e)=>{const a=(0,n.mU)(t);if(!a||!a.chatId)return;const s=(0,i.Z1)(t,a.chatId);if(!s)return;const r=!!s&&!!s.username;(async()=>{let{inviteLink:t}=s.fullInfo;r&&(t=await(0,o.t9)("exportGroupCallInvite",{call:a,canSelfUnmute:!1})),t&&((0,d.TE)(t),e.showNotification({message:"Link copied to clipboard"}))})()})),(0,s.Q6)("joinVoiceChatByLink",((t,e,a)=>{const{username:s,inviteHash:n}=a;(async()=>{const t=await(0,h.C)(s);if(!t)return void e.showNotification({message:f.i0("NoUsernameFound")});const a=await(0,h.f)(t);null!=a&&a.groupCall&&e.joinGroupCall({id:a.groupCall.id,accessHash:a.groupCall.accessHash,inviteHash:n})})()})),(0,s.Q6)("joinGroupCall",((t,e,a)=>{if(!p.Bi)return;const{chatId:o,id:i,accessHash:d,inviteHash:c}=a;!function(){const t=new(window.AudioContext||window.webkitAudioContext);C=new Audio,I=t,C.srcObject=(t=>{const e=t.createOscillator(),a=e.connect(t.createMediaStreamDestination());return e.start(),new MediaStream([Object.assign(a.stream.getAudioTracks()[0],{enabled:!1})])})(t),(0,u.Z)(C)}(),(async()=>{var l;await(b?(b=Promise.all(Object.values(y).map((t=>(t.muted=!0,t.volume=1e-4,t.play().then((()=>{t.pause(),t.volume=1,t.currentTime=0,t.muted=!1})))))).then((()=>{b=void 0})),b):Promise.resolve());const{groupCalls:{activeGroupCallId:h}}=t;let u=i?(0,n.$5)(t,i):(0,n.Bj)(t,o);(null===(l=u)||void 0===l?void 0:l.id)!==h?h?e.leaveGroupCall({rejoin:a}):u&&h===u.id?e.toggleGroupCallPanel():(u||i&&d||(u=await w({id:i,accessHash:d})),u&&(t=(0,s.Rd)(),t=(0,r.AH)(t,u.id,{...u,inviteHash:c},void 0,u.participantsCount+1),(0,s.R3)({...t,groupCalls:{...t.groupCalls,activeGroupCallId:u.id,isGroupCallPanelHidden:!1}}))):e.toggleGroupCallPanel()})()})),(0,s.Q6)("playGroupCallSound",((t,e,a)=>{const{sound:s}=a;y[s]&&(b?b.then((()=>{(0,u.Z)(y[s])})):("connecting"!==s&&y.connecting.pause(),(0,u.Z)(y[s])))})),(0,s.Q6)("loadMoreGroupCallParticipants",(t=>{const e=(0,n.mU)(t);e&&R(e,e.nextOffset)})),(0,s.Q6)("openCallFallbackConfirm",(t=>({...t,groupCalls:{...t.groupCalls,isFallbackConfirmOpen:!0}}))),(0,s.Q6)("closeCallFallbackConfirm",(t=>({...t,groupCalls:{...t.groupCalls,isFallbackConfirmOpen:!1}})))},4446:(t,e,a)=>{a.d(e,{AH:()=>d,dc:()=>r,Ic:()=>c,B6:()=>l});var s=a(2607),n=a(782),o=a(6788),i=a(1638);function d(t,e,a,s,o){var i;const d=Object.values({...null===(i=t.groupCalls.byId[e])||void 0===i?void 0:i.participants,...a.participants}).filter((t=>!t.isLeft)).reduce(((t,e)=>(t[e.id]=e,t)),{});return{...t,groupCalls:{...t.groupCalls,byId:{...t.groupCalls.byId,[e]:{...t.groupCalls.byId[e],...(0,n.CE)(a,["participantsCount"]),...s&&{participantsCount:t.groupCalls.byId[e].participantsCount+s},...void 0!==o&&{participantsCount:o},participants:d}}}}}function r(t,e){const a=(0,s.$5)(t,e);if(a&&a.chatId){const e=(0,i.Z1)(t,a.chatId);e&&(t=(0,o.a4)(t,a.chatId,{fullInfo:{...e.fullInfo,groupCallId:void 0}}))}return{...t,groupCalls:{...t.groupCalls,byId:{...(0,n.CE)(t.groupCalls.byId,[e.toString()])}}}}function c(t,e,a){return t.groupCalls.activeGroupCallId?d(t,t.groupCalls.activeGroupCallId,e,void 0,a):t}function l(t,e,a,n,o=!1){const i=(0,s.$5)(t,e);return i?d(t,e,{participants:{...i.participants,[a]:{...i.participants[a],...n}}},n.isLeft?o?0:-1:i.participants[a]||o?0:1):t}},2607:(t,e,a)=>{a.d(e,{Bj:()=>i,$5:()=>d,GU:()=>r,Ht:()=>c,mU:()=>l,oq:()=>h});var s=a(8857),n=a(2858),o=a(6376);function i(t,e){const a=(0,s.Z1)(t,e);if(a&&a.fullInfo&&a.fullInfo.groupCallId)return d(t,a.fullInfo.groupCallId)}function d(t,e){return t.groupCalls.byId[e]}function r(t,e,a){var s;return null===(s=d(t,e))||void 0===s?void 0:s.participants[a]}function c(t){var e,a;const o=null===(e=l(t))||void 0===e?void 0:e.chatId;if(!o)return!1;const i=(0,s.Z1)(t,o);return!!i&&((0,n.G9)(i)&&i.isCreator||!(null===(a=i.adminRights)||void 0===a||!a.manageCall))}function l(t){const{groupCalls:{activeGroupCallId:e}}=t;if(e)return d(t,e)}function h(t){const e=(0,o.dy)(t,t.currentUserId);return`Calls: ${(0,n.Js)(e)}`}},3551:(t,e,a)=>{a.d(e,{o:()=>o});var s=a(5116),n=a(7361);const o=t=>{const{protocol:e,searchParams:a,pathname:o,hostname:i}=new URL(t);if("tg:"!==e)return;const{openChatByInvite:d,openChatByUsername:r,openStickerSetShortName:c,focusMessage:l,joinVoiceChatByLink:h}=(0,s.uC)(),u=(n.s$?i:o).replace(/^\/\//,""),p={};switch(a.forEach(((t,e)=>{p[e]=t})),u){case"resolve":{const{domain:t,post:e,comment:a,voicechat:s,livestream:n,start:o}=p;"telegrampassport"!==t&&(p.hasOwnProperty("voicechat")||p.hasOwnProperty("livestream")?h({username:t,inviteHash:s||n}):r({username:t,messageId:Number(e),commentId:Number(a),startParam:o}));break}case"privatepost":{const{post:t,channel:e}=p;l({chatId:`-${e}`,id:t});break}case"bg":break;case"join":{const{invite:t}=p;d({hash:t});break}case"addstickers":{const{set:t}=p;c({stickerSetShortName:t});break}}}}}]); +//# sourceMappingURL=884.c8f1b9920de862fb45af.js.map \ No newline at end of file diff --git a/dist/884.68ff64c281399c107bd4.js.map b/dist/884.c8f1b9920de862fb45af.js.map similarity index 99% rename from dist/884.68ff64c281399c107bd4.js.map rename to dist/884.c8f1b9920de862fb45af.js.map index b8d06401f..c46a9735a 100644 --- a/dist/884.68ff64c281399c107bd4.js.map +++ b/dist/884.c8f1b9920de862fb45af.js.map @@ -1 +1 @@ -{"version":3,"file":"884.68ff64c281399c107bd4.js","mappings":"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","sources":["webpack://telegram-t/./src/components/right/DeleteMemberModal.tsx","webpack://telegram-t/./src/hooks/useThrottle.ts","webpack://telegram-t/./src/modules/actions/api/chats.ts","webpack://telegram-t/./src/modules/actions/ui/calls.ts","webpack://telegram-t/./src/modules/reducers/calls.ts","webpack://telegram-t/./src/modules/selectors/calls.ts","webpack://telegram-t/./src/util/deeplink.ts"],"sourcesContent":["import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\n\nimport { selectCurrentChat, selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n userId?: string;\n onClose: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n contactName?: string;\n};\n\nconst DeleteMemberModal: FC = ({\n isOpen,\n chat,\n userId,\n contactName,\n onClose,\n}) => {\n const { deleteChatMember } = getDispatch();\n\n const lang = useLang();\n\n const handleDeleteChatMember = useCallback(() => {\n deleteChatMember({ chatId: chat!.id, userId });\n onClose();\n }, [chat, deleteChatMember, onClose, userId]);\n\n if (!chat || !userId) {\n return undefined;\n }\n\n return (\n \n

{renderText(lang('PeerInfo.Confirm.RemovePeer', contactName))}

\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const chat = selectCurrentChat(global);\n const user = userId && selectUser(global, userId);\n const contactName = user ? getUserFirstOrLastName(user) : undefined;\n\n return {\n chat,\n contactName,\n };\n },\n)(DeleteMemberModal));\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number, noFirst = false) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms, !noFirst);\n }, [ms, noFirst]);\n};\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NewChatMembersProgress, ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n TIPS_USERNAME,\n LOCALIZED_TIPS,\n RE_TG_LINK,\n SERVICE_NOTIFICATIONS_USER_ID,\n TMP_CHAT_ID,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats,\n addUsers,\n addUserStatuses,\n replaceThreadParam,\n updateChatListIds,\n updateChats,\n updateChat,\n updateChatListSecondaryInfo,\n updateManagementProgress,\n leaveChat,\n updateManagement,\n} from '../../reducers';\nimport {\n selectChat,\n selectUser,\n selectChatListType,\n selectIsChatPinned,\n selectChatFolder,\n selectSupportChat,\n selectChatByUsername,\n selectThreadTopMessageId,\n selectCurrentMessageList,\n selectThreadInfo, selectCurrentChat, selectLastServiceNotification,\n} from '../../selectors';\nimport { buildCollectionByKey, omit } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup,\n} from '../../helpers';\nimport { processDeepLink } from '../../../util/deeplink';\nimport { updateGroupCall } from '../../reducers/calls';\nimport { selectGroupCall } from '../../selectors/calls';\n\nconst TOP_CHAT_MESSAGES_PRELOAD_INTERVAL = 100;\nconst CHATS_PRELOAD_INTERVAL = 300;\n\nconst runThrottledForLoadChats = throttle((cb) => cb(), CHATS_PRELOAD_INTERVAL, true);\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForLoadFullChat = debounce((cb) => cb(), 500, false, true);\n\naddReducer('preloadTopChatMessages', (global, actions) => {\n (async () => {\n const preloadedChatIds: string[] = [];\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHAT_MESSAGES_PRELOAD_INTERVAL);\n\n const {\n byId,\n listIds: { active: listIds },\n orderedPinnedIds: { active: orderedPinnedIds },\n } = getGlobal().chats;\n if (!listIds) {\n return;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds, 'all', true);\n const topChats = [...pinnedChats, ...otherChats];\n const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id));\n if (!chatToPreload) {\n return;\n }\n\n preloadedChatIds.push(chatToPreload.id);\n\n actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID });\n }\n })();\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const { id, threadId } = payload!;\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat?.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n // Please telegram send us some updates about linked chat 🙏\n if (chat && chat.lastMessage && chat.lastMessage.threadInfo) {\n actions.requestThreadInfoUpdate({\n chatId: chat.lastMessage.threadInfo.chatId,\n threadId: chat.lastMessage.threadInfo.threadId,\n });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddReducer('openLinkedChat', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n (async () => {\n const chatFullInfo = await callApi('fetchFullChat', chat);\n\n if (chatFullInfo?.fullInfo?.linkedChatId) {\n actions.openChat({ id: chatFullInfo.fullInfo.linkedChatId });\n }\n })();\n});\n\naddReducer('focusMessageInComments', (global, actions, payload) => {\n const { chatId, threadId, messageId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('requestThreadInfoUpdate', { chat, threadId });\n if (!result) {\n return;\n }\n\n actions.focusMessage({ chatId, threadId, messageId });\n })();\n});\n\naddReducer('openSupportChat', (global, actions) => {\n const chat = selectSupportChat(global);\n if (chat) {\n actions.openChat({ id: chat.id, shouldReplaceHistory: true });\n return;\n }\n\n actions.openChat({ id: TMP_CHAT_ID, shouldReplaceHistory: true });\n\n (async () => {\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId, shouldReplaceHistory: true });\n }\n })();\n});\n\naddReducer('openTipsChat', (global, actions, payload) => {\n const { langCode } = payload;\n\n const usernamePostfix = langCode === 'pt-br'\n ? 'BR'\n : LOCALIZED_TIPS.includes(langCode) ? (langCode as string).toUpperCase() : '';\n\n actions.openChatByUsername({ username: `${TIPS_USERNAME}${usernamePostfix}` });\n});\n\naddReducer('loadMoreChats', (global, actions, payload) => {\n const { listType = 'active' } = payload!;\n const listIds = global.chats.listIds[listType as ('active' | 'archived')];\n const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')];\n\n if (isFullyLoaded) {\n return;\n }\n\n const oldestChat = listIds\n ? listIds\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat?.lastMessage) && !selectIsChatPinned(global, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n if (oldestChat) {\n runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date));\n } else {\n runThrottledForLoadChats(() => loadChats(listType));\n }\n});\n\naddReducer('preloadArchivedChats', () => {\n (async () => {\n while (!getGlobal().chats.isFullyLoaded.archived) {\n const currentGlobal = getGlobal();\n const listIds = currentGlobal.chats.listIds.archived;\n const oldestChat = listIds\n ? listIds\n .map((id) => currentGlobal.chats.byId[id])\n .filter((chat) => Boolean(chat?.lastMessage) && !selectIsChatPinned(currentGlobal, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n await loadChats('archived', oldestChat?.id, oldestChat?.lastMessage!.date);\n await pause(CHATS_PRELOAD_INTERVAL);\n }\n })();\n});\n\naddReducer('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForLoadFullChat(() => loadFullChat(chat));\n }\n});\n\naddReducer('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddReducer('requestChatUpdate', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', {\n chat,\n serverTimeOffset,\n ...(chatId === SERVICE_NOTIFICATIONS_USER_ID && {\n lastLocalMessage: selectLastServiceNotification(global)?.message,\n }),\n });\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n setGlobal(updateChat(global, chatId, { isMuted }));\n void callApi('updateChatMutedState', { chat, isMuted, serverTimeOffset });\n});\n\naddReducer('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as string[])\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddReducer('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChatUser', (global, actions, payload) => {\n const { chatId, userId }: { chatId: string; userId: string } = payload!;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n if (!chat || !user) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n void callApi('deleteChatUser', { chat, user });\n});\n\naddReducer('deleteChat', (global, actions, payload) => {\n const { chatId }: { chatId: string } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n void callApi('deleteChat', { chatId: chat.id });\n});\n\naddReducer('leaveChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n const { id: channelId, accessHash } = chat;\n if (channelId && accessHash) {\n void callApi('leaveChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n const { id: channelId, accessHash } = chat;\n if (channelId && accessHash) {\n void callApi('deleteChannel', { channelId, accessHash });\n }\n});\n\naddReducer('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as string[])\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddReducer('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddReducer('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddReducer('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddReducer('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddReducer('editChatFolders', (global, actions, payload) => {\n const { chatId, idsToRemove, idsToAdd } = payload!;\n\n (idsToRemove as number[]).forEach(async (id) => {\n const folder = selectChatFolder(global, id);\n if (folder) {\n await callApi('editChatFolder', {\n id,\n folderUpdate: {\n ...folder,\n pinnedChatIds: folder.pinnedChatIds?.filter((pinnedId) => pinnedId !== chatId),\n includedChatIds: folder.includedChatIds.filter((includedId) => includedId !== chatId),\n },\n });\n }\n });\n\n (idsToAdd as number[]).forEach(async (id) => {\n const folder = selectChatFolder(global, id);\n if (folder) {\n await callApi('editChatFolder', {\n id,\n folderUpdate: {\n ...folder,\n includedChatIds: folder.includedChatIds.concat(chatId),\n },\n });\n }\n });\n});\n\naddReducer('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddReducer('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds?.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddReducer('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddReducer('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const { serverTimeOffset } = global;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { serverTimeOffset, chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddReducer('openChatByInvite', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('openChatByInvite', hash);\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.chatId });\n })();\n});\n\naddReducer('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n if (url.match(RE_TG_LINK)) {\n processDeepLink(url.match(RE_TG_LINK)[0]);\n return;\n }\n\n const uri = new URL(url.startsWith('http') ? url : `https://${url}`);\n const [part1, part2, part3] = uri.pathname.split('/').filter(Boolean).map((l) => decodeURI(l));\n const params = Object.fromEntries(uri.searchParams);\n\n let hash: string | undefined;\n if (part1 === 'joinchat') {\n hash = part2;\n }\n\n if (part1.startsWith(' ') || part1.startsWith('+')) {\n hash = part1.substr(1, part1.length - 1);\n }\n\n if (hash) {\n actions.openChatByInvite({ hash });\n return;\n }\n\n if (part1 === 'addstickers') {\n actions.openStickerSetShortName({\n stickerSetShortName: part2,\n });\n return;\n }\n\n const chatOrChannelPostId = part2 || undefined;\n const messageId = part3 ? Number(part3) : undefined;\n const commentId = params.comment ? Number(params.comment) : undefined;\n\n if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) {\n actions.joinVoiceChatByLink({\n username: part1,\n inviteHash: params.voicechat || params.livestream,\n });\n } else if (part1 === 'c' && chatOrChannelPostId && messageId) {\n const chatId = `-${chatOrChannelPostId}`;\n const chat = selectChat(global, chatId);\n if (!chat) {\n actions.showNotification({ message: 'Chat does not exist' });\n return;\n }\n\n actions.focusMessage({\n chatId,\n messageId,\n });\n } else {\n actions.openChatByUsername({\n username: part1,\n messageId: messageId || Number(chatOrChannelPostId),\n commentId,\n startParam: params.start,\n });\n }\n});\n\naddReducer('acceptInviteConfirmation', (global, actions, payload) => {\n const { hash } = payload!;\n (async () => {\n const result = await callApi('importChatInvite', { hash });\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.id });\n })();\n});\n\naddReducer('loadExportedChatInvites', (global, actions, payload) => {\n const {\n chatId, adminId, isRevoked, limit,\n } = payload!;\n const peer = selectChat(global, chatId);\n const admin = selectUser(global, adminId || global.currentUserId);\n if (!peer || !admin) return;\n\n (async () => {\n const result = await callApi('fetchExportedChatInvites', {\n peer, admin, isRevoked, limit,\n });\n if (!result) {\n return;\n }\n\n setGlobal(updateManagement(getGlobal(), chatId, { invites: result }));\n })();\n});\n\naddReducer('editExportedChatInvite', (global, actions, payload) => {\n const {\n chatId, link, isRevoked, expireDate, usageLimit, isRequestNeeded, title,\n } = payload!;\n const peer = selectChat(global, chatId);\n if (!peer) return;\n\n (async () => {\n const result = await callApi('editExportedChatInvite', {\n peer,\n link,\n isRevoked,\n expireDate,\n usageLimit,\n isRequestNeeded,\n title,\n });\n if (!result) {\n return;\n }\n global = getGlobal();\n let invites = global.management.byChatId[chatId].invites || [];\n const { oldInvite, newInvite } = result;\n invites = invites.filter((current) => current.link !== oldInvite.link);\n setGlobal(updateManagement(global, chatId, {\n invites: [...invites, newInvite],\n }));\n })();\n});\n\naddReducer('exportChatInvite', (global, actions, payload) => {\n const {\n chatId, expireDate, usageLimit, isRequestNeeded, title,\n } = payload!;\n const peer = selectChat(global, chatId);\n if (!peer) return;\n\n (async () => {\n const result = await callApi('exportChatInvite', {\n peer,\n expireDate,\n usageLimit,\n isRequestNeeded,\n title,\n });\n if (!result) {\n return;\n }\n global = getGlobal();\n const invites = global.management.byChatId[chatId].invites || [];\n setGlobal(updateManagement(global, chatId, {\n invites: [...invites, result],\n }));\n })();\n});\n\naddReducer('openChatByUsername', (global, actions, payload) => {\n const {\n username, messageId, commentId, startParam,\n } = payload!;\n\n (async () => {\n const chat = selectCurrentChat(global);\n\n if (!commentId) {\n if (chat && chat.username === username) {\n actions.focusMessage({ chatId: chat.id, messageId });\n return;\n }\n await openChatByUsername(actions, username, messageId, startParam);\n return;\n }\n\n const { chatId, type } = selectCurrentMessageList(global) || {};\n const usernameChat = selectChatByUsername(global, username);\n if (chatId && usernameChat && type === 'thread') {\n const threadInfo = selectThreadInfo(global, chatId, messageId);\n\n if (threadInfo && threadInfo.chatId === chatId) {\n actions.focusMessage({\n chatId: threadInfo.chatId,\n threadId: threadInfo.threadId,\n messageId: commentId,\n });\n return;\n }\n }\n\n if (!messageId) return;\n\n await openCommentsByUsername(actions, username, messageId, commentId);\n })();\n});\n\naddReducer('togglePreHistoryHidden', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n let chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n })();\n});\n\naddReducer('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddReducer('updateChatMemberBannedRights', (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = !!bannedRights.viewMessages;\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChatAdmin', (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const chatAfterUpdate = await callApi('fetchFullChat', chat);\n const newGlobal = getGlobal();\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n\n const isDismissed = !Object.keys(adminRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChat', (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n })();\n});\n\naddReducer('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddReducer('loadGroupsForDiscussion', () => {\n (async () => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record);\n\n const global = addChats(getGlobal(), addedById);\n setGlobal({\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById),\n },\n });\n })();\n});\n\naddReducer('linkDiscussionGroup', (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo!.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n })();\n});\n\naddReducer('unlinkDiscussionGroup', (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo?.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n (async () => {\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n })();\n});\n\naddReducer('setActiveChatFolder', (global, actions, payload) => {\n return {\n ...global,\n chatFolders: {\n ...global.chatFolders,\n activeChatFolder: payload,\n },\n };\n});\n\naddReducer('loadMoreMembers', (global) => {\n (async () => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n if (!chat || isChatBasicGroup(chat)) {\n return;\n }\n\n const offset = (chat.fullInfo?.members?.length) || undefined;\n const result = await callApi('fetchMembers', chat.id, chat.accessHash!, 'recent', offset);\n if (!result) {\n return;\n }\n\n const { members, users } = result;\n if (!members || !members.length) {\n return;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateChat(global, chat.id, {\n fullInfo: {\n ...chat.fullInfo,\n members: [\n ...((chat.fullInfo || {}).members || []),\n ...(members || []),\n ],\n },\n });\n setGlobal(global);\n })();\n});\n\naddReducer('addChatMembers', (global, actions, payload) => {\n const { chatId, memberIds } = payload;\n const chat = selectChat(global, chatId);\n const users = (memberIds as string[]).map((userId) => selectUser(global, userId)).filter(Boolean as any);\n\n if (!chat || !users.length) {\n return;\n }\n\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Loading);\n (async () => {\n await callApi('addChatMembers', chat, users);\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n loadFullChat(chat);\n })();\n});\n\naddReducer('deleteChatMember', (global, actions, payload) => {\n const { chatId, userId } = payload;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n await callApi('deleteChatMember', chat, user);\n loadFullChat(chat);\n })();\n});\n\naddReducer('toggleIsProtected', (global, actions, payload) => {\n const { chatId, isProtected } = payload;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleIsProtected', { chat, isProtected });\n});\n\naddReducer('setChatEnabledReactions', (global, actions, payload) => {\n const { chatId, enabledReactions } = payload;\n const chat = selectChat(global, chatId);\n\n if (!chat) return;\n\n (async () => {\n await callApi('setChatEnabledReactions', {\n chat,\n enabledReactions,\n });\n\n await loadFullChat(chat);\n })();\n});\n\nasync function loadChats(listType: 'active' | 'archived', offsetId?: string, offsetDate?: number) {\n let global = getGlobal();\n\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: global.chats.orderedPinnedIds[listType] === undefined,\n serverTimeOffset: global.serverTimeOffset,\n lastLocalServiceMessage: selectLastServiceNotification(global)?.message,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addUserStatuses(global, result.userStatusesById);\n\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nexport async function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return undefined;\n }\n\n const { users, fullInfo, groupCall } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (groupCall) {\n const existingGroupCall = selectGroupCall(global, groupCall.id!);\n global = updateGroupCall(\n global,\n groupCall.id!,\n omit(groupCall, ['connectionState']),\n undefined,\n existingGroupCall ? undefined : groupCall.participantsCount,\n );\n }\n\n global = updateChat(global, chat.id, { fullInfo });\n\n setGlobal(global);\n\n return result;\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: channelId, shouldReplaceHistory: true });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n try {\n const createdChat = await callApi('createGroupChat', {\n title,\n users,\n });\n\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch()\n .openChat({\n id: chatId,\n shouldReplaceHistory: true,\n });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', {\n chatId,\n photo,\n });\n }\n } catch (e) {\n if (e.message === 'USERS_TOO_FEW') {\n const global = getGlobal();\n setGlobal({\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: ChatCreationProgress.Error,\n error: 'CreateGroupError',\n },\n });\n }\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nexport async function fetchChatByUsername(\n username: string,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n return localChat;\n }\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n return undefined;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n return chat;\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n startParam?: string,\n) {\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await fetchChatByUsername(username);\n\n if (!chat) {\n actions.openPreviousChat();\n actions.showNotification({ message: 'User does not exist' });\n return;\n }\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n if (startParam) {\n actions.startBot({ botId: chat.id, param: startParam });\n }\n}\n\nasync function openCommentsByUsername(\n actions: GlobalActions,\n username: string,\n messageId: number,\n commentId: number,\n) {\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await fetchChatByUsername(username);\n\n if (!chat) return;\n\n const global = getGlobal();\n\n const threadInfo = selectThreadInfo(global, chat.id, messageId);\n let discussionChatId: string | undefined;\n\n if (!threadInfo) {\n const result = await callApi('requestThreadInfoUpdate', { chat, threadId: messageId });\n if (!result) return;\n\n discussionChatId = result.discussionChatId;\n } else {\n discussionChatId = threadInfo.chatId;\n }\n\n if (!discussionChatId) return;\n\n actions.focusMessage({\n chatId: discussionChatId,\n threadId: messageId,\n messageId: Number(commentId),\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\nimport { selectActiveGroupCall, selectChatGroupCall, selectGroupCall } from '../../selectors/calls';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat } from '../../selectors';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport { ApiGroupCall } from '../../../api/types';\nimport { updateGroupCall } from '../../reducers/calls';\nimport { buildCollectionByKey, omit } from '../../../util/iteratees';\nimport { addChats, addUsers } from '../../reducers';\nimport { fetchChatByUsername, loadFullChat } from '../api/chats';\nimport safePlay from '../../../util/safePlay';\nimport { ARE_CALLS_SUPPORTED } from '../../../util/environment';\nimport * as langProvider from '../../../util/langProvider';\n\n// Workaround for Safari not playing audio without user interaction\nlet audioElement: HTMLAudioElement | undefined;\nlet audioContext: AudioContext | undefined;\n\nconst joinAudio = new Audio('./voicechat_join.mp3');\nconst connectingAudio = new Audio('./voicechat_connecting.mp3');\nconnectingAudio.loop = true;\nconst leaveAudio = new Audio('./voicechat_leave.mp3');\nconst allowTalkAudio = new Audio('./voicechat_onallowtalk.mp3');\n\nconst sounds: Record = {\n join: joinAudio,\n allowTalk: allowTalkAudio,\n leave: leaveAudio,\n connecting: connectingAudio,\n};\n\nlet initializationPromise: Promise | undefined = Promise.resolve();\n\nconst initializeSoundsForSafari = () => {\n if (!initializationPromise) return Promise.resolve();\n\n initializationPromise = Promise.all(Object.values(sounds).map((l) => {\n l.muted = true;\n l.volume = 0.0001;\n return l.play().then(() => {\n l.pause();\n l.volume = 1;\n l.currentTime = 0;\n l.muted = false;\n });\n })).then(() => {\n initializationPromise = undefined;\n });\n\n return initializationPromise;\n};\n\nasync function fetchGroupCall(groupCall: Partial) {\n const result = await callApi('getGroupCall', {\n call: groupCall,\n });\n\n if (!result) return undefined;\n\n let global = getGlobal();\n\n const existingGroupCall = selectGroupCall(global, groupCall.id!);\n\n global = updateGroupCall(\n global,\n groupCall.id!,\n omit(result.groupCall, ['connectionState']),\n undefined,\n existingGroupCall?.isLoaded ? undefined : result.groupCall.participantsCount,\n );\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addChats(global, buildCollectionByKey(result.chats, 'id'));\n\n setGlobal(global);\n\n return result.groupCall;\n}\n\nasync function fetchGroupCallParticipants(groupCall: Partial, nextOffset?: string) {\n const result = await callApi('fetchGroupCallParticipants', {\n call: groupCall as ApiGroupCall,\n offset: nextOffset,\n });\n\n if (!result) return;\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addChats(global, buildCollectionByKey(result.chats, 'id'));\n\n setGlobal(global);\n}\n\naddReducer('toggleGroupCallPanel', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isGroupCallPanelHidden: !global.groupCalls.isGroupCallPanelHidden,\n },\n };\n});\n\naddReducer('subscribeToGroupCallUpdates', (global, actions, payload) => {\n const { subscribed, id } = payload!;\n const groupCall = selectGroupCall(global, id);\n\n if (!groupCall) return;\n\n (async () => {\n if (subscribed) {\n await fetchGroupCall(groupCall);\n await fetchGroupCallParticipants(groupCall);\n }\n\n await callApi('toggleGroupCallStartSubscription', {\n subscribed,\n call: groupCall,\n });\n })();\n});\n\naddReducer('createGroupCall', (global, actions, payload) => {\n const { chatId } = payload;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('createGroupCall', {\n peer: chat,\n });\n\n if (!result) return;\n\n global = getGlobal();\n setGlobal(updateGroupCall(global, result.id, {\n ...result,\n chatId,\n }));\n\n actions.joinGroupCall({ id: result.id, accessHash: result.accessHash });\n })();\n});\n\naddReducer('createGroupCallInviteLink', (global, actions) => {\n const groupCall = selectActiveGroupCall(global);\n\n if (!groupCall || !groupCall.chatId) {\n return;\n }\n\n const chat = selectChat(global, groupCall.chatId);\n if (!chat) {\n return;\n }\n\n const canInvite = !!chat && !!chat.username;\n\n (async () => {\n let { inviteLink } = chat.fullInfo!;\n if (canInvite) {\n inviteLink = await callApi('exportGroupCallInvite', {\n call: groupCall,\n canSelfUnmute: false,\n });\n }\n\n if (!inviteLink) {\n return;\n }\n\n copyTextToClipboard(inviteLink);\n actions.showNotification({\n message: 'Link copied to clipboard',\n });\n })();\n});\n\naddReducer('joinVoiceChatByLink', (global, actions, payload) => {\n const { username, inviteHash } = payload!;\n\n (async () => {\n const chat = await fetchChatByUsername(username);\n\n if (!chat) {\n actions.showNotification({ message: langProvider.getTranslation('NoUsernameFound') });\n return;\n }\n\n const full = await loadFullChat(chat);\n\n if (full?.groupCall) {\n actions.joinGroupCall({ id: full.groupCall.id, accessHash: full.groupCall.accessHash, inviteHash });\n }\n })();\n});\n\naddReducer('joinGroupCall', (global, actions, payload) => {\n if (!ARE_CALLS_SUPPORTED) return;\n\n const {\n chatId, id, accessHash, inviteHash,\n } = payload;\n\n createAudioElement();\n\n (async () => {\n await initializeSoundsForSafari();\n const { groupCalls: { activeGroupCallId } } = global;\n let groupCall = id ? selectGroupCall(global, id) : selectChatGroupCall(global, chatId);\n\n if (groupCall?.id === activeGroupCallId) {\n actions.toggleGroupCallPanel();\n return;\n }\n\n if (activeGroupCallId) {\n actions.leaveGroupCall({\n rejoin: payload,\n });\n return;\n }\n\n if (groupCall && activeGroupCallId === groupCall.id) {\n actions.toggleGroupCallPanel();\n return;\n }\n\n if (!groupCall && (!id || !accessHash)) {\n groupCall = await fetchGroupCall({\n id,\n accessHash,\n });\n }\n\n if (!groupCall) return;\n\n global = getGlobal();\n\n global = updateGroupCall(\n global,\n groupCall.id,\n {\n ...groupCall,\n inviteHash,\n },\n undefined,\n groupCall.participantsCount + 1,\n );\n\n setGlobal({\n ...global,\n groupCalls: {\n ...global.groupCalls,\n activeGroupCallId: groupCall.id,\n isGroupCallPanelHidden: false,\n },\n });\n })();\n});\n\naddReducer('playGroupCallSound', (global, actions, payload) => {\n const { sound } = payload!;\n\n if (!sounds[sound]) {\n return;\n }\n\n if (initializationPromise) {\n initializationPromise.then(() => {\n safePlay(sounds[sound]);\n });\n } else {\n if (sound !== 'connecting') {\n sounds.connecting.pause();\n }\n safePlay(sounds[sound]);\n }\n});\n\naddReducer('loadMoreGroupCallParticipants', (global) => {\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) {\n return;\n }\n\n void fetchGroupCallParticipants(groupCall, groupCall.nextOffset);\n});\n\nfunction createAudioContext() {\n return (new (window.AudioContext || (window as any).webkitAudioContext)());\n}\n\nconst silence = (ctx: AudioContext) => {\n const oscillator = ctx.createOscillator();\n const dst = oscillator.connect(ctx.createMediaStreamDestination());\n oscillator.start();\n return new MediaStream([Object.assign((dst as any).stream.getAudioTracks()[0], { enabled: false })]);\n};\n\nfunction createAudioElement() {\n const ctx = createAudioContext();\n audioElement = new Audio();\n audioContext = ctx;\n audioElement.srcObject = silence(ctx);\n safePlay(audioElement);\n}\n\nexport function getGroupCallAudioElement() {\n return audioElement;\n}\n\nexport function getGroupCallAudioContext() {\n return audioContext;\n}\n\nexport function removeGroupCallAudioElement() {\n audioElement?.pause();\n audioContext = undefined;\n audioElement = undefined;\n}\n\naddReducer('openCallFallbackConfirm', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isFallbackConfirmOpen: true,\n },\n };\n});\n\naddReducer('closeCallFallbackConfirm', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isFallbackConfirmOpen: false,\n },\n };\n});\n","import { GroupCallParticipant } from '../../lib/secret-sauce';\nimport { GlobalState } from '../../global/types';\nimport { ApiGroupCall } from '../../api/types';\nimport { selectGroupCall } from '../selectors/calls';\nimport { omit } from '../../util/iteratees';\nimport { updateChat } from './chats';\nimport { selectChat } from '../selectors';\n\nexport function updateGroupCall(\n global: GlobalState,\n groupCallId: string,\n groupCallUpdate: Partial,\n addToParticipantCount?: number,\n resetParticipantCount?: number,\n): GlobalState {\n const unfiltered = Object.values({\n ...global.groupCalls.byId[groupCallId]?.participants,\n ...groupCallUpdate.participants,\n });\n const filtered = unfiltered.filter((l) => !l.isLeft);\n const participants = filtered.reduce((acc: Record, el) => {\n acc[el.id] = el;\n return acc;\n }, {});\n\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n byId: {\n ...global.groupCalls.byId,\n [groupCallId]: {\n ...global.groupCalls.byId[groupCallId],\n ...omit(groupCallUpdate, ['participantsCount']),\n ...(addToParticipantCount && {\n participantsCount: global.groupCalls.byId[groupCallId].participantsCount + addToParticipantCount,\n }),\n ...(resetParticipantCount !== undefined && {\n participantsCount: resetParticipantCount,\n }),\n participants,\n },\n },\n },\n };\n}\n\nexport function removeGroupCall(\n global: GlobalState,\n groupCallId: string,\n): GlobalState {\n const groupCall = selectGroupCall(global, groupCallId);\n if (groupCall && groupCall.chatId) {\n const chat = selectChat(global, groupCall.chatId);\n if (chat) {\n global = updateChat(global, groupCall.chatId, {\n fullInfo: {\n ...chat.fullInfo,\n groupCallId: undefined,\n },\n });\n }\n }\n\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n byId: {\n ...omit(global.groupCalls.byId, [groupCallId.toString()]),\n },\n },\n };\n}\n\nexport function updateActiveGroupCall(\n global: GlobalState,\n groupCallUpdate: Partial,\n resetParticipantCount?: number,\n): GlobalState {\n if (!global.groupCalls.activeGroupCallId) {\n return global;\n }\n\n return updateGroupCall(global,\n global.groupCalls.activeGroupCallId,\n groupCallUpdate,\n undefined,\n resetParticipantCount);\n}\n\nexport function updateGroupCallParticipant(\n global: GlobalState,\n groupCallId: string,\n userId: string,\n participantUpdate: Partial,\n noUpdateCount = false,\n) {\n const groupCall = selectGroupCall(global, groupCallId);\n if (!groupCall) {\n return global;\n }\n\n return updateGroupCall(global, groupCallId, {\n participants: {\n ...groupCall.participants,\n [userId]: {\n ...groupCall.participants[userId],\n ...participantUpdate,\n },\n },\n }, participantUpdate.isLeft\n ? (noUpdateCount ? 0 : -1)\n : (groupCall.participants[userId] || noUpdateCount ? 0 : 1));\n}\n","import { GlobalState } from '../../global/types';\nimport { selectChat } from './chats';\nimport { getUserFullName, isChatBasicGroup } from '../helpers';\nimport { selectUser } from './users';\n\nexport function selectChatGroupCall(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.fullInfo || !chat.fullInfo.groupCallId) return undefined;\n\n return selectGroupCall(global, chat.fullInfo.groupCallId);\n}\n\nexport function selectGroupCall(global: GlobalState, groupCallId: string) {\n return global.groupCalls.byId[groupCallId];\n}\n\nexport function selectGroupCallParticipant(global: GlobalState, groupCallId: string, participantId: string) {\n return selectGroupCall(global, groupCallId)?.participants[participantId];\n}\n\nexport function selectIsAdminInActiveGroupCall(global: GlobalState): boolean {\n const chatId = selectActiveGroupCall(global)?.chatId;\n\n if (!chatId) return false;\n\n const chat = selectChat(global, chatId);\n if (!chat) return false;\n\n return (isChatBasicGroup(chat) && chat.isCreator) || !!chat.adminRights?.manageCall;\n}\n\nexport function selectActiveGroupCall(global: GlobalState) {\n const { groupCalls: { activeGroupCallId } } = global;\n if (!activeGroupCallId) {\n return undefined;\n }\n\n return selectGroupCall(global, activeGroupCallId);\n}\n\nexport function selectCallFallbackChannelTitle(global: GlobalState) {\n const currentUser = selectUser(global, global.currentUserId!);\n\n return `Calls: ${getUserFullName(currentUser!)}`;\n}\n","import { getDispatch } from '../lib/teact/teactn';\nimport { IS_SAFARI } from './environment';\n\ntype DeepLinkMethod = 'resolve' | 'login' | 'passport' | 'settings' | 'join' | 'addstickers' | 'setlanguage' |\n'addtheme' | 'confirmphone' | 'socks' | 'proxy' | 'privatepost' | 'bg' | 'share' | 'msg' | 'msg_url';\n\nexport const processDeepLink = (url: string) => {\n const {\n protocol, searchParams, pathname, hostname,\n } = new URL(url);\n\n if (protocol !== 'tg:') return;\n\n const {\n openChatByInvite,\n openChatByUsername,\n openStickerSetShortName,\n focusMessage,\n joinVoiceChatByLink,\n } = getDispatch();\n\n // Safari thinks the path in tg://path links is hostname for some reason\n const method = (IS_SAFARI ? hostname : pathname).replace(/^\\/\\//, '') as DeepLinkMethod;\n const params: Record = {};\n searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n switch (method) {\n case 'resolve': {\n const {\n domain, post, comment, voicechat, livestream, start,\n } = params;\n\n if (domain !== 'telegrampassport') {\n if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) {\n joinVoiceChatByLink({\n username: domain,\n inviteHash: voicechat || livestream,\n });\n } else {\n openChatByUsername({\n username: domain,\n messageId: Number(post),\n commentId: Number(comment),\n startParam: start,\n });\n }\n }\n break;\n }\n case 'privatepost': {\n const {\n post, channel,\n } = params;\n\n focusMessage({\n chatId: `-${channel}`,\n id: post,\n });\n break;\n }\n case 'bg': {\n // const {\n // slug, color, rotation, mode, intensity, bg_color: bgColor, gradient,\n // } = params;\n break;\n }\n case 'join': {\n const { invite } = params;\n\n openChatByInvite({ hash: invite });\n break;\n }\n case 'addstickers': {\n const { set } = params;\n\n openStickerSetShortName({\n stickerSetShortName: set,\n });\n break;\n }\n case 'share':\n case 'msg': {\n // const { url, text } = params;\n break;\n }\n case 'login': {\n // const { code, token } = params;\n break;\n }\n default:\n // Unsupported deeplink\n\n break;\n }\n};\n"],"names":["memo","withGlobal","global","userId","chat","selectCurrentChat","user","selectUser","contactName","getUserFirstOrLastName","undefined","isOpen","onClose","deleteChatMember","getDispatch","lang","useLang","handleDeleteChatMember","useCallback","chatId","id","onEnter","className","title","renderText","color","isText","onClick","ms","noFirst","useMemo","throttle","cb","runThrottledForLoadChats","runThrottledForLoadTopChats","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetId","offsetDate","getGlobal","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","chats","orderedPinnedIds","serverTimeOffset","lastLocalServiceMessage","selectLastServiceNotification","message","chatIds","length","shift","addUsers","buildCollectionByKey","users","addUserStatuses","userStatusesById","updateChats","updateChatListIds","updateChatListSecondaryInfo","Object","keys","draftsById","forEach","replaceThreadParam","MAIN_THREAD_ID","replyingToById","isFullyLoaded","setGlobal","loadFullChat","fullInfo","groupCall","existingGroupCall","selectGroupCall","updateGroupCall","omit","participantsCount","updateChat","fetchChatByUsername","username","localChat","selectChatByUsername","isMin","addReducer","actions","preloadedChatIds","i","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","byId","listIds","active","currentChatId","selectCurrentMessageList","pinnedChats","otherChats","prepareChatList","chatToPreload","find","includes","push","loadViewportMessages","threadId","payload","currentUserId","selectChat","hasUnreadMark","toggleChatUnread","lastMessage","threadInfo","requestThreadInfoUpdate","isChatSummaryOnly","requestChatUpdate","type","selectThreadTopMessageId","chatFullInfo","linkedChatId","openChat","messageId","focusMessage","selectSupportChat","shouldReplaceHistory","TMP_CHAT_ID","langCode","usernamePostfix","LOCALIZED_TIPS","toUpperCase","openChatByUsername","TIPS_USERNAME","oldestChat","map","filter","Boolean","selectIsChatPinned","sort","chat1","chat2","date","currentGlobal","force","SERVICE_NOTIFICATIONS_USER_ID","lastLocalMessage","isMuted","about","photo","memberIds","chatCreation","progress","ChatCreationProgress","createdChannel","channelId","accessHash","createChannel","leaveChat","createdChat","e","error","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","idsToRemove","idsToAdd","includedId","concat","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","hash","url","match","RE_TG_LINK","processDeepLink","uri","URL","startsWith","part1","part2","part3","pathname","split","l","decodeURI","params","fromEntries","searchParams","substr","openChatByInvite","openStickerSetShortName","stickerSetShortName","chatOrChannelPostId","Number","commentId","comment","hasOwnProperty","joinVoiceChatByLink","inviteHash","voicechat","livestream","showNotification","startParam","start","adminId","isRevoked","peer","admin","updateManagement","invites","link","expireDate","usageLimit","isRequestNeeded","management","byChatId","oldInvite","newInvite","current","channelPostId","openPreviousChat","startBot","botId","param","usernameChat","selectThreadInfo","discussionChatId","openCommentsByUsername","isEnabled","isChatBasicGroup","bannedRights","newGlobal","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","activeChatFolder","offset","setNewChatMembersDialogState","NewChatMembersProgress","isProtected","enabledReactions","audioElement","audioContext","joinAudio","Audio","connectingAudio","loop","leaveAudio","sounds","join","allowTalk","leave","connecting","initializationPromise","resolve","fetchGroupCall","call","isLoaded","fetchGroupCallParticipants","nextOffset","getGroupCallAudioElement","getGroupCallAudioContext","removeGroupCallAudioElement","groupCalls","isGroupCallPanelHidden","subscribed","joinGroupCall","selectActiveGroupCall","canInvite","inviteLink","canSelfUnmute","copyTextToClipboard","langProvider","full","ARE_CALLS_SUPPORTED","ctx","window","AudioContext","webkitAudioContext","srcObject","oscillator","createOscillator","dst","connect","createMediaStreamDestination","MediaStream","assign","stream","getAudioTracks","enabled","silence","safePlay","createAudioElement","values","muted","volume","play","then","currentTime","activeGroupCallId","selectChatGroupCall","leaveGroupCall","rejoin","toggleGroupCallPanel","sound","isFallbackConfirmOpen","groupCallId","groupCallUpdate","addToParticipantCount","resetParticipantCount","participants","isLeft","acc","el","removeGroupCall","toString","updateActiveGroupCall","updateGroupCallParticipant","participantUpdate","noUpdateCount","selectGroupCallParticipant","participantId","selectIsAdminInActiveGroupCall","isCreator","manageCall","selectCallFallbackChannelTitle","currentUser","getUserFullName","protocol","hostname","method","IS_SAFARI","replace","value","key","domain","post","invite","set"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"884.c8f1b9920de862fb45af.js","mappings":"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","sources":["webpack://telegram-t/./src/components/right/DeleteMemberModal.tsx","webpack://telegram-t/./src/hooks/useThrottle.ts","webpack://telegram-t/./src/modules/actions/api/chats.ts","webpack://telegram-t/./src/modules/actions/ui/calls.ts","webpack://telegram-t/./src/modules/reducers/calls.ts","webpack://telegram-t/./src/modules/selectors/calls.ts","webpack://telegram-t/./src/util/deeplink.ts"],"sourcesContent":["import React, { FC, useCallback, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiChat } from '../../api/types';\n\nimport { selectCurrentChat, selectUser } from '../../modules/selectors';\nimport { getUserFirstOrLastName } from '../../modules/helpers';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\n\nimport Modal from '../ui/Modal';\nimport Button from '../ui/Button';\n\nexport type OwnProps = {\n isOpen: boolean;\n userId?: string;\n onClose: () => void;\n};\n\ntype StateProps = {\n chat?: ApiChat;\n contactName?: string;\n};\n\nconst DeleteMemberModal: FC = ({\n isOpen,\n chat,\n userId,\n contactName,\n onClose,\n}) => {\n const { deleteChatMember } = getDispatch();\n\n const lang = useLang();\n\n const handleDeleteChatMember = useCallback(() => {\n deleteChatMember({ chatId: chat!.id, userId });\n onClose();\n }, [chat, deleteChatMember, onClose, userId]);\n\n if (!chat || !userId) {\n return undefined;\n }\n\n return (\n \n

{renderText(lang('PeerInfo.Confirm.RemovePeer', contactName))}

\n \n \n \n );\n};\n\nexport default memo(withGlobal(\n (global, { userId }): StateProps => {\n const chat = selectCurrentChat(global);\n const user = userId && selectUser(global, userId);\n const contactName = user ? getUserFirstOrLastName(user) : undefined;\n\n return {\n chat,\n contactName,\n };\n },\n)(DeleteMemberModal));\n","import { useMemo } from '../lib/teact/teact';\n\nimport { throttle } from '../util/schedulers';\n\nexport default (ms: number, noFirst = false) => {\n return useMemo(() => {\n return throttle((cb) => cb(), ms, !noFirst);\n }, [ms, noFirst]);\n};\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport {\n ApiChat, ApiUser, ApiChatFolder, MAIN_THREAD_ID,\n} from '../../../api/types';\nimport { NewChatMembersProgress, ChatCreationProgress, ManagementProgress } from '../../../types';\nimport { GlobalActions } from '../../../global/types';\n\nimport {\n ARCHIVED_FOLDER_ID,\n TOP_CHAT_MESSAGES_PRELOAD_LIMIT,\n CHAT_LIST_LOAD_SLICE,\n TIPS_USERNAME,\n LOCALIZED_TIPS,\n RE_TG_LINK,\n SERVICE_NOTIFICATIONS_USER_ID,\n TMP_CHAT_ID,\n} from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport {\n addChats,\n addUsers,\n addUserStatuses,\n replaceThreadParam,\n updateChatListIds,\n updateChats,\n updateChat,\n updateChatListSecondaryInfo,\n updateManagementProgress,\n leaveChat,\n updateManagement,\n} from '../../reducers';\nimport {\n selectChat,\n selectUser,\n selectChatListType,\n selectIsChatPinned,\n selectChatFolder,\n selectSupportChat,\n selectChatByUsername,\n selectThreadTopMessageId,\n selectCurrentMessageList,\n selectThreadInfo, selectCurrentChat, selectLastServiceNotification,\n} from '../../selectors';\nimport { buildCollectionByKey, omit } from '../../../util/iteratees';\nimport { debounce, pause, throttle } from '../../../util/schedulers';\nimport {\n isChatSummaryOnly, isChatArchived, prepareChatList, isChatBasicGroup,\n} from '../../helpers';\nimport { processDeepLink } from '../../../util/deeplink';\nimport { updateGroupCall } from '../../reducers/calls';\nimport { selectGroupCall } from '../../selectors/calls';\n\nconst TOP_CHAT_MESSAGES_PRELOAD_INTERVAL = 100;\nconst CHATS_PRELOAD_INTERVAL = 300;\n\nconst runThrottledForLoadChats = throttle((cb) => cb(), CHATS_PRELOAD_INTERVAL, true);\nconst runThrottledForLoadTopChats = throttle((cb) => cb(), 3000, true);\nconst runDebouncedForLoadFullChat = debounce((cb) => cb(), 500, false, true);\n\naddReducer('preloadTopChatMessages', (global, actions) => {\n (async () => {\n const preloadedChatIds: string[] = [];\n\n for (let i = 0; i < TOP_CHAT_MESSAGES_PRELOAD_LIMIT; i++) {\n await pause(TOP_CHAT_MESSAGES_PRELOAD_INTERVAL);\n\n const {\n byId,\n listIds: { active: listIds },\n orderedPinnedIds: { active: orderedPinnedIds },\n } = getGlobal().chats;\n if (!listIds) {\n return;\n }\n\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const { pinnedChats, otherChats } = prepareChatList(byId, listIds, orderedPinnedIds, 'all', true);\n const topChats = [...pinnedChats, ...otherChats];\n const chatToPreload = topChats.find(({ id }) => id !== currentChatId && !preloadedChatIds.includes(id));\n if (!chatToPreload) {\n return;\n }\n\n preloadedChatIds.push(chatToPreload.id);\n\n actions.loadViewportMessages({ chatId: chatToPreload.id, threadId: MAIN_THREAD_ID });\n }\n })();\n});\n\naddReducer('openChat', (global, actions, payload) => {\n const { id, threadId } = payload!;\n const { currentUserId } = global;\n const chat = selectChat(global, id);\n\n if (chat?.hasUnreadMark) {\n actions.toggleChatUnread({ id });\n }\n\n // Please telegram send us some updates about linked chat 🙏\n if (chat && chat.lastMessage && chat.lastMessage.threadInfo) {\n actions.requestThreadInfoUpdate({\n chatId: chat.lastMessage.threadInfo.chatId,\n threadId: chat.lastMessage.threadInfo.threadId,\n });\n }\n\n if (!chat) {\n if (id === currentUserId) {\n void callApi('fetchChat', { type: 'self' });\n } else {\n const user = selectUser(global, id);\n if (user) {\n void callApi('fetchChat', { type: 'user', user });\n }\n }\n } else if (isChatSummaryOnly(chat) && !chat.isMin) {\n actions.requestChatUpdate({ chatId: id });\n }\n\n if (threadId !== MAIN_THREAD_ID) {\n const topMessageId = selectThreadTopMessageId(global, id, threadId);\n if (!topMessageId) {\n actions.requestThreadInfoUpdate({ chatId: id, threadId });\n }\n }\n});\n\naddReducer('openLinkedChat', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n (async () => {\n const chatFullInfo = await callApi('fetchFullChat', chat);\n\n if (chatFullInfo?.fullInfo?.linkedChatId) {\n actions.openChat({ id: chatFullInfo.fullInfo.linkedChatId });\n }\n })();\n});\n\naddReducer('focusMessageInComments', (global, actions, payload) => {\n const { chatId, threadId, messageId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('requestThreadInfoUpdate', { chat, threadId });\n if (!result) {\n return;\n }\n\n actions.focusMessage({ chatId, threadId, messageId });\n })();\n});\n\naddReducer('openSupportChat', (global, actions) => {\n const chat = selectSupportChat(global);\n if (chat) {\n actions.openChat({ id: chat.id, shouldReplaceHistory: true });\n return;\n }\n\n actions.openChat({ id: TMP_CHAT_ID, shouldReplaceHistory: true });\n\n (async () => {\n const result = await callApi('fetchChat', { type: 'support' });\n if (result) {\n actions.openChat({ id: result.chatId, shouldReplaceHistory: true });\n }\n })();\n});\n\naddReducer('openTipsChat', (global, actions, payload) => {\n const { langCode } = payload;\n\n const usernamePostfix = langCode === 'pt-br'\n ? 'BR'\n : LOCALIZED_TIPS.includes(langCode) ? (langCode as string).toUpperCase() : '';\n\n actions.openChatByUsername({ username: `${TIPS_USERNAME}${usernamePostfix}` });\n});\n\naddReducer('loadMoreChats', (global, actions, payload) => {\n const { listType = 'active' } = payload!;\n const listIds = global.chats.listIds[listType as ('active' | 'archived')];\n const isFullyLoaded = global.chats.isFullyLoaded[listType as ('active' | 'archived')];\n\n if (isFullyLoaded) {\n return;\n }\n\n const oldestChat = listIds\n ? listIds\n .map((id) => global.chats.byId[id])\n .filter((chat) => Boolean(chat?.lastMessage) && !selectIsChatPinned(global, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n if (oldestChat) {\n runThrottledForLoadChats(() => loadChats(listType, oldestChat.id, oldestChat.lastMessage!.date));\n } else {\n runThrottledForLoadChats(() => loadChats(listType));\n }\n});\n\naddReducer('preloadArchivedChats', () => {\n (async () => {\n while (!getGlobal().chats.isFullyLoaded.archived) {\n const currentGlobal = getGlobal();\n const listIds = currentGlobal.chats.listIds.archived;\n const oldestChat = listIds\n ? listIds\n .map((id) => currentGlobal.chats.byId[id])\n .filter((chat) => Boolean(chat?.lastMessage) && !selectIsChatPinned(currentGlobal, chat.id))\n .sort((chat1, chat2) => (chat1.lastMessage!.date - chat2.lastMessage!.date))[0]\n : undefined;\n\n await loadChats('archived', oldestChat?.id, oldestChat?.lastMessage!.date);\n await pause(CHATS_PRELOAD_INTERVAL);\n }\n })();\n});\n\naddReducer('loadFullChat', (global, actions, payload) => {\n const { chatId, force } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n if (force) {\n loadFullChat(chat);\n } else {\n runDebouncedForLoadFullChat(() => loadFullChat(chat));\n }\n});\n\naddReducer('loadTopChats', () => {\n runThrottledForLoadTopChats(() => loadChats('active'));\n});\n\naddReducer('requestChatUpdate', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n void callApi('requestChatUpdate', {\n chat,\n serverTimeOffset,\n ...(chatId === SERVICE_NOTIFICATIONS_USER_ID && {\n lastLocalMessage: selectLastServiceNotification(global)?.message,\n }),\n });\n});\n\naddReducer('updateChatMutedState', (global, actions, payload) => {\n const { serverTimeOffset } = global;\n const { chatId, isMuted } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n setGlobal(updateChat(global, chatId, { isMuted }));\n void callApi('updateChatMutedState', { chat, isMuted, serverTimeOffset });\n});\n\naddReducer('createChannel', (global, actions, payload) => {\n const {\n title, about, photo, memberIds,\n } = payload!;\n\n const members = (memberIds as string[])\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createChannel(title, members, about, photo);\n});\n\naddReducer('joinChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n const { id: channelId, accessHash } = chat;\n\n if (channelId && accessHash) {\n void callApi('joinChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChatUser', (global, actions, payload) => {\n const { chatId, userId }: { chatId: string; userId: string } = payload!;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n if (!chat || !user) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n void callApi('deleteChatUser', { chat, user });\n});\n\naddReducer('deleteChat', (global, actions, payload) => {\n const { chatId }: { chatId: string } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n void callApi('deleteChat', { chatId: chat.id });\n});\n\naddReducer('leaveChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n const { id: channelId, accessHash } = chat;\n if (channelId && accessHash) {\n void callApi('leaveChannel', { channelId, accessHash });\n }\n});\n\naddReducer('deleteChannel', (global, actions, payload) => {\n const { chatId } = payload!;\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n global = leaveChat(global, chatId);\n setGlobal(global);\n\n if (selectCurrentMessageList(global)?.chatId === chatId) {\n actions.openChat({ id: undefined });\n }\n\n const { id: channelId, accessHash } = chat;\n if (channelId && accessHash) {\n void callApi('deleteChannel', { channelId, accessHash });\n }\n});\n\naddReducer('createGroupChat', (global, actions, payload) => {\n const { title, memberIds, photo } = payload!;\n const members = (memberIds as string[])\n .map((id) => selectUser(global, id))\n .filter(Boolean as any);\n\n void createGroupChat(title, members, photo);\n});\n\naddReducer('toggleChatPinned', (global, actions, payload) => {\n const { id, folderId } = payload!;\n const chat = selectChat(global, id);\n if (!chat) {\n return;\n }\n\n if (folderId) {\n const folder = selectChatFolder(global, folderId);\n if (folder) {\n const shouldBePinned = !selectIsChatPinned(global, id, folderId);\n\n const { pinnedChatIds, includedChatIds } = folder;\n const newPinnedIds = shouldBePinned\n ? [id, ...(pinnedChatIds || [])]\n : (pinnedChatIds || []).filter((pinnedId) => pinnedId !== id);\n\n // With both Pin and Unpin we need to re-add a user to the included group\n const newIncludedChatIds = [id, ...includedChatIds];\n\n void callApi('editChatFolder', {\n id: folderId,\n folderUpdate: {\n ...folder,\n pinnedChatIds: newPinnedIds,\n includedChatIds: newIncludedChatIds,\n },\n });\n }\n } else {\n const listType = selectChatListType(global, id);\n const isPinned = selectIsChatPinned(global, id, listType === 'archived' ? ARCHIVED_FOLDER_ID : undefined);\n void callApi('toggleChatPinned', { chat, shouldBePinned: !isPinned });\n }\n});\n\naddReducer('toggleChatArchived', (global, actions, payload) => {\n const { id } = payload!;\n const chat = selectChat(global, id);\n if (chat) {\n void callApi('toggleChatArchived', {\n chat,\n folderId: isChatArchived(chat) ? 0 : ARCHIVED_FOLDER_ID,\n });\n }\n});\n\naddReducer('loadChatFolders', () => {\n void loadChatFolders();\n});\n\naddReducer('loadRecommendedChatFolders', () => {\n void loadRecommendedChatFolders();\n});\n\naddReducer('editChatFolders', (global, actions, payload) => {\n const { chatId, idsToRemove, idsToAdd } = payload!;\n\n (idsToRemove as number[]).forEach(async (id) => {\n const folder = selectChatFolder(global, id);\n if (folder) {\n await callApi('editChatFolder', {\n id,\n folderUpdate: {\n ...folder,\n pinnedChatIds: folder.pinnedChatIds?.filter((pinnedId) => pinnedId !== chatId),\n includedChatIds: folder.includedChatIds.filter((includedId) => includedId !== chatId),\n },\n });\n }\n });\n\n (idsToAdd as number[]).forEach(async (id) => {\n const folder = selectChatFolder(global, id);\n if (folder) {\n await callApi('editChatFolder', {\n id,\n folderUpdate: {\n ...folder,\n includedChatIds: folder.includedChatIds.concat(chatId),\n },\n });\n }\n });\n});\n\naddReducer('editChatFolder', (global, actions, payload) => {\n const { id, folderUpdate } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void callApi('editChatFolder', {\n id,\n folderUpdate: {\n id,\n emoticon: folder.emoticon,\n pinnedChatIds: folder.pinnedChatIds,\n ...folderUpdate,\n },\n });\n }\n});\n\naddReducer('addChatFolder', (global, actions, payload) => {\n const { folder } = payload!;\n const { orderedIds } = global.chatFolders;\n const maxId = orderedIds?.length ? Math.max.apply(Math.max, orderedIds) : ARCHIVED_FOLDER_ID;\n\n void createChatFolder(folder, maxId);\n});\n\naddReducer('deleteChatFolder', (global, actions, payload) => {\n const { id } = payload!;\n const folder = selectChatFolder(global, id);\n\n if (folder) {\n void deleteChatFolder(id);\n }\n});\n\naddReducer('toggleChatUnread', (global, actions, payload) => {\n const { id } = payload!;\n const { serverTimeOffset } = global;\n const chat = selectChat(global, id);\n if (chat) {\n if (chat.unreadCount) {\n void callApi('markMessageListRead', { serverTimeOffset, chat, threadId: MAIN_THREAD_ID });\n } else {\n void callApi('toggleDialogUnread', {\n chat,\n hasUnreadMark: !chat.hasUnreadMark,\n });\n }\n }\n});\n\naddReducer('openChatByInvite', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('openChatByInvite', hash);\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.chatId });\n })();\n});\n\naddReducer('openTelegramLink', (global, actions, payload) => {\n const { url } = payload!;\n if (url.match(RE_TG_LINK)) {\n processDeepLink(url.match(RE_TG_LINK)[0]);\n return;\n }\n\n const uri = new URL(url.startsWith('http') ? url : `https://${url}`);\n const [part1, part2, part3] = uri.pathname.split('/').filter(Boolean).map((l) => decodeURI(l));\n const params = Object.fromEntries(uri.searchParams);\n\n let hash: string | undefined;\n if (part1 === 'joinchat') {\n hash = part2;\n }\n\n if (part1.startsWith(' ') || part1.startsWith('+')) {\n hash = part1.substr(1, part1.length - 1);\n }\n\n if (hash) {\n actions.openChatByInvite({ hash });\n return;\n }\n\n if (part1 === 'addstickers') {\n actions.openStickerSetShortName({\n stickerSetShortName: part2,\n });\n return;\n }\n\n const chatOrChannelPostId = part2 || undefined;\n const messageId = part3 ? Number(part3) : undefined;\n const commentId = params.comment ? Number(params.comment) : undefined;\n\n if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) {\n actions.joinVoiceChatByLink({\n username: part1,\n inviteHash: params.voicechat || params.livestream,\n });\n } else if (part1 === 'c' && chatOrChannelPostId && messageId) {\n const chatId = `-${chatOrChannelPostId}`;\n const chat = selectChat(global, chatId);\n if (!chat) {\n actions.showNotification({ message: 'Chat does not exist' });\n return;\n }\n\n actions.focusMessage({\n chatId,\n messageId,\n });\n } else {\n actions.openChatByUsername({\n username: part1,\n messageId: messageId || Number(chatOrChannelPostId),\n commentId,\n startParam: params.start,\n });\n }\n});\n\naddReducer('acceptInviteConfirmation', (global, actions, payload) => {\n const { hash } = payload!;\n (async () => {\n const result = await callApi('importChatInvite', { hash });\n if (!result) {\n return;\n }\n\n actions.openChat({ id: result.id });\n })();\n});\n\naddReducer('loadExportedChatInvites', (global, actions, payload) => {\n const {\n chatId, adminId, isRevoked, limit,\n } = payload!;\n const peer = selectChat(global, chatId);\n const admin = selectUser(global, adminId || global.currentUserId);\n if (!peer || !admin) return;\n\n (async () => {\n const result = await callApi('fetchExportedChatInvites', {\n peer, admin, isRevoked, limit,\n });\n if (!result) {\n return;\n }\n\n setGlobal(updateManagement(getGlobal(), chatId, { invites: result }));\n })();\n});\n\naddReducer('editExportedChatInvite', (global, actions, payload) => {\n const {\n chatId, link, isRevoked, expireDate, usageLimit, isRequestNeeded, title,\n } = payload!;\n const peer = selectChat(global, chatId);\n if (!peer) return;\n\n (async () => {\n const result = await callApi('editExportedChatInvite', {\n peer,\n link,\n isRevoked,\n expireDate,\n usageLimit,\n isRequestNeeded,\n title,\n });\n if (!result) {\n return;\n }\n global = getGlobal();\n let invites = global.management.byChatId[chatId].invites || [];\n const { oldInvite, newInvite } = result;\n invites = invites.filter((current) => current.link !== oldInvite.link);\n setGlobal(updateManagement(global, chatId, {\n invites: [...invites, newInvite],\n }));\n })();\n});\n\naddReducer('exportChatInvite', (global, actions, payload) => {\n const {\n chatId, expireDate, usageLimit, isRequestNeeded, title,\n } = payload!;\n const peer = selectChat(global, chatId);\n if (!peer) return;\n\n (async () => {\n const result = await callApi('exportChatInvite', {\n peer,\n expireDate,\n usageLimit,\n isRequestNeeded,\n title,\n });\n if (!result) {\n return;\n }\n global = getGlobal();\n const invites = global.management.byChatId[chatId].invites || [];\n setGlobal(updateManagement(global, chatId, {\n invites: [...invites, result],\n }));\n })();\n});\n\naddReducer('openChatByUsername', (global, actions, payload) => {\n const {\n username, messageId, commentId, startParam,\n } = payload!;\n\n (async () => {\n const chat = selectCurrentChat(global);\n\n if (!commentId) {\n if (chat && chat.username === username) {\n actions.focusMessage({ chatId: chat.id, messageId });\n return;\n }\n await openChatByUsername(actions, username, messageId, startParam);\n return;\n }\n\n const { chatId, type } = selectCurrentMessageList(global) || {};\n const usernameChat = selectChatByUsername(global, username);\n if (chatId && usernameChat && type === 'thread') {\n const threadInfo = selectThreadInfo(global, chatId, messageId);\n\n if (threadInfo && threadInfo.chatId === chatId) {\n actions.focusMessage({\n chatId: threadInfo.chatId,\n threadId: threadInfo.threadId,\n messageId: commentId,\n });\n return;\n }\n }\n\n if (!messageId) return;\n\n await openCommentsByUsername(actions, username, messageId, commentId);\n })();\n});\n\naddReducer('togglePreHistoryHidden', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n let chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n void callApi('togglePreHistoryHidden', { chat, isEnabled });\n })();\n});\n\naddReducer('updateChatDefaultBannedRights', (global, actions, payload) => {\n const { chatId, bannedRights } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('updateChatDefaultBannedRights', { chat, bannedRights });\n});\n\naddReducer('updateChatMemberBannedRights', (global, actions, payload) => {\n const { chatId, userId, bannedRights } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatMemberBannedRights', { chat, user, bannedRights });\n\n const newGlobal = getGlobal();\n const chatAfterUpdate = selectChat(newGlobal, chatId);\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { members, kickedMembers } = chatAfterUpdate.fullInfo;\n\n const isBanned = !!bannedRights.viewMessages;\n const isUnblocked = !Object.keys(bannedRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(members && isBanned && {\n members: members.filter((m) => m.userId !== userId),\n }),\n ...(members && !isBanned && {\n members: members.map((m) => (\n m.userId === userId\n ? { ...m, bannedRights }\n : m\n )),\n }),\n ...(isUnblocked && kickedMembers && {\n kickedMembers: kickedMembers.filter((m) => m.userId !== userId),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChatAdmin', (global, actions, payload) => {\n const {\n chatId, userId, adminRights, customTitle,\n } = payload!;\n let chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n await callApi('updateChatAdmin', {\n chat, user, adminRights, customTitle,\n });\n\n const chatAfterUpdate = await callApi('fetchFullChat', chat);\n const newGlobal = getGlobal();\n\n if (!chatAfterUpdate || !chatAfterUpdate.fullInfo) {\n return;\n }\n\n const { adminMembers } = chatAfterUpdate.fullInfo;\n\n const isDismissed = !Object.keys(adminRights).length;\n\n setGlobal(updateChat(newGlobal, chatId, {\n fullInfo: {\n ...chatAfterUpdate.fullInfo,\n ...(adminMembers && isDismissed && {\n adminMembers: adminMembers.filter((m) => m.userId !== userId),\n }),\n ...(adminMembers && !isDismissed && {\n adminMembers: adminMembers.map((m) => (\n m.userId === userId\n ? { ...m, adminRights, customTitle }\n : m\n )),\n }),\n },\n }));\n })();\n});\n\naddReducer('updateChat', (global, actions, payload) => {\n const {\n chatId, title, about, photo,\n } = payload!;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.InProgress));\n\n await Promise.all([\n chat.title !== title\n ? callApi('updateChatTitle', chat, title)\n : undefined,\n chat.fullInfo && chat.fullInfo.about !== about\n ? callApi('updateChatAbout', chat, about)\n : undefined,\n photo\n ? callApi('editChatPhoto', { chatId, accessHash: chat.accessHash, photo })\n : undefined,\n ]);\n\n setGlobal(updateManagementProgress(getGlobal(), ManagementProgress.Complete));\n })();\n});\n\naddReducer('toggleSignatures', (global, actions, payload) => {\n const { chatId, isEnabled } = payload!;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleSignatures', { chat, isEnabled });\n});\n\naddReducer('loadGroupsForDiscussion', () => {\n (async () => {\n const groups = await callApi('fetchGroupsForDiscussion');\n if (!groups) {\n return;\n }\n\n const addedById = groups.reduce((result, group) => {\n if (group) {\n result[group.id] = group;\n }\n\n return result;\n }, {} as Record);\n\n const global = addChats(getGlobal(), addedById);\n setGlobal({\n ...global,\n chats: {\n ...global.chats,\n forDiscussionIds: Object.keys(addedById),\n },\n });\n })();\n});\n\naddReducer('linkDiscussionGroup', (global, actions, payload) => {\n const { channelId, chatId } = payload!;\n\n const channel = selectChat(global, channelId);\n let chat = selectChat(global, chatId);\n if (!channel || !chat) {\n return;\n }\n\n (async () => {\n if (isChatBasicGroup(chat)) {\n chat = await callApi('migrateChat', chat);\n\n if (!chat) {\n return;\n }\n\n actions.openChat({ id: chat.id });\n }\n\n let { fullInfo } = chat;\n if (!fullInfo) {\n const fullChat = await callApi('fetchFullChat', chat);\n if (!fullChat) {\n return;\n }\n\n fullInfo = fullChat.fullInfo;\n }\n\n if (fullInfo!.isPreHistoryHidden) {\n await callApi('togglePreHistoryHidden', { chat, isEnabled: false });\n }\n\n void callApi('setDiscussionGroup', { channel, chat });\n })();\n});\n\naddReducer('unlinkDiscussionGroup', (global, actions, payload) => {\n const { channelId } = payload!;\n\n const channel = selectChat(global, channelId);\n if (!channel) {\n return;\n }\n\n let chat: ApiChat | undefined;\n if (channel.fullInfo?.linkedChatId) {\n chat = selectChat(global, channel.fullInfo.linkedChatId);\n }\n\n (async () => {\n await callApi('setDiscussionGroup', { channel });\n if (chat) {\n loadFullChat(chat);\n }\n })();\n});\n\naddReducer('setActiveChatFolder', (global, actions, payload) => {\n return {\n ...global,\n chatFolders: {\n ...global.chatFolders,\n activeChatFolder: payload,\n },\n };\n});\n\naddReducer('loadMoreMembers', (global) => {\n (async () => {\n const { chatId } = selectCurrentMessageList(global) || {};\n const chat = chatId ? selectChat(global, chatId) : undefined;\n if (!chat || isChatBasicGroup(chat)) {\n return;\n }\n\n const offset = (chat.fullInfo?.members?.length) || undefined;\n const result = await callApi('fetchMembers', chat.id, chat.accessHash!, 'recent', offset);\n if (!result) {\n return;\n }\n\n const { members, users } = result;\n if (!members || !members.length) {\n return;\n }\n\n global = getGlobal();\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n global = updateChat(global, chat.id, {\n fullInfo: {\n ...chat.fullInfo,\n members: [\n ...((chat.fullInfo || {}).members || []),\n ...(members || []),\n ],\n },\n });\n setGlobal(global);\n })();\n});\n\naddReducer('addChatMembers', (global, actions, payload) => {\n const { chatId, memberIds } = payload;\n const chat = selectChat(global, chatId);\n const users = (memberIds as string[]).map((userId) => selectUser(global, userId)).filter(Boolean as any);\n\n if (!chat || !users.length) {\n return;\n }\n\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Loading);\n (async () => {\n await callApi('addChatMembers', chat, users);\n actions.setNewChatMembersDialogState(NewChatMembersProgress.Closed);\n loadFullChat(chat);\n })();\n});\n\naddReducer('deleteChatMember', (global, actions, payload) => {\n const { chatId, userId } = payload;\n const chat = selectChat(global, chatId);\n const user = selectUser(global, userId);\n\n if (!chat || !user) {\n return;\n }\n\n (async () => {\n await callApi('deleteChatMember', chat, user);\n loadFullChat(chat);\n })();\n});\n\naddReducer('toggleIsProtected', (global, actions, payload) => {\n const { chatId, isProtected } = payload;\n const chat = selectChat(global, chatId);\n\n if (!chat) {\n return;\n }\n\n void callApi('toggleIsProtected', { chat, isProtected });\n});\n\naddReducer('setChatEnabledReactions', (global, actions, payload) => {\n const { chatId, enabledReactions } = payload;\n const chat = selectChat(global, chatId);\n\n if (!chat) return;\n\n (async () => {\n await callApi('setChatEnabledReactions', {\n chat,\n enabledReactions,\n });\n\n await loadFullChat(chat);\n })();\n});\n\nasync function loadChats(listType: 'active' | 'archived', offsetId?: string, offsetDate?: number) {\n let global = getGlobal();\n\n const result = await callApi('fetchChats', {\n limit: CHAT_LIST_LOAD_SLICE,\n offsetDate,\n archived: listType === 'archived',\n withPinned: global.chats.orderedPinnedIds[listType] === undefined,\n serverTimeOffset: global.serverTimeOffset,\n lastLocalServiceMessage: selectLastServiceNotification(global)?.message,\n });\n\n if (!result) {\n return;\n }\n\n const { chatIds } = result;\n\n if (chatIds.length > 0 && chatIds[0] === offsetId) {\n chatIds.shift();\n }\n\n global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addUserStatuses(global, result.userStatusesById);\n\n global = updateChats(global, buildCollectionByKey(result.chats, 'id'));\n global = updateChatListIds(global, listType, chatIds);\n global = updateChatListSecondaryInfo(global, listType, result);\n\n Object.keys(result.draftsById).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'draft', result.draftsById[chatId],\n );\n });\n\n Object.keys(result.replyingToById).forEach((chatId) => {\n global = replaceThreadParam(\n global, chatId, MAIN_THREAD_ID, 'replyingToId', result.replyingToById[chatId],\n );\n });\n\n if (chatIds.length === 0 && !global.chats.isFullyLoaded[listType]) {\n global = {\n ...global,\n chats: {\n ...global.chats,\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [listType]: true,\n },\n },\n };\n }\n\n setGlobal(global);\n}\n\nexport async function loadFullChat(chat: ApiChat) {\n const result = await callApi('fetchFullChat', chat);\n if (!result) {\n return undefined;\n }\n\n const { users, fullInfo, groupCall } = result;\n\n let global = getGlobal();\n if (users) {\n global = addUsers(global, buildCollectionByKey(users, 'id'));\n }\n\n if (groupCall) {\n const existingGroupCall = selectGroupCall(global, groupCall.id!);\n global = updateGroupCall(\n global,\n groupCall.id!,\n omit(groupCall, ['connectionState']),\n undefined,\n existingGroupCall ? undefined : groupCall.participantsCount,\n );\n }\n\n global = updateChat(global, chat.id, { fullInfo });\n\n setGlobal(global);\n\n return result;\n}\n\nasync function createChannel(title: string, users: ApiUser[], about?: string, photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n const createdChannel = await callApi('createChannel', { title, about, users });\n if (!createdChannel) {\n return;\n }\n\n const { id: channelId, accessHash } = createdChannel;\n\n let global = getGlobal();\n global = updateChat(global, channelId, createdChannel);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChannel ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch().openChat({ id: channelId, shouldReplaceHistory: true });\n\n if (channelId && accessHash && photo) {\n await callApi('editChatPhoto', { chatId: channelId, accessHash, photo });\n }\n}\n\nasync function createGroupChat(title: string, users: ApiUser[], photo?: File) {\n setGlobal({\n ...getGlobal(),\n chatCreation: {\n progress: ChatCreationProgress.InProgress,\n },\n });\n\n try {\n const createdChat = await callApi('createGroupChat', {\n title,\n users,\n });\n\n if (!createdChat) {\n return;\n }\n\n const { id: chatId } = createdChat;\n\n let global = getGlobal();\n global = updateChat(global, chatId, createdChat);\n global = {\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: createdChat ? ChatCreationProgress.Complete : ChatCreationProgress.Error,\n },\n };\n setGlobal(global);\n getDispatch()\n .openChat({\n id: chatId,\n shouldReplaceHistory: true,\n });\n\n if (chatId && photo) {\n await callApi('editChatPhoto', {\n chatId,\n photo,\n });\n }\n } catch (e) {\n if (e.message === 'USERS_TOO_FEW') {\n const global = getGlobal();\n setGlobal({\n ...global,\n chatCreation: {\n ...global.chatCreation,\n progress: ChatCreationProgress.Error,\n error: 'CreateGroupError',\n },\n });\n }\n }\n}\n\nasync function loadChatFolders() {\n const chatFolders = await callApi('fetchChatFolders');\n\n if (chatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n ...chatFolders,\n },\n });\n }\n}\n\nasync function loadRecommendedChatFolders() {\n const recommendedChatFolders = await callApi('fetchRecommendedChatFolders');\n\n if (recommendedChatFolders) {\n const global = getGlobal();\n\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommendedChatFolders,\n },\n });\n }\n}\n\nasync function createChatFolder(folder: ApiChatFolder, maxId: number) {\n // Clear fields from recommended folders\n const { id: recommendedId, description, ...newFolder } = folder;\n\n await callApi('editChatFolder', {\n id: maxId + 1,\n folderUpdate: {\n id: maxId + 1,\n ...newFolder,\n },\n });\n\n if (!description) {\n return;\n }\n\n const global = getGlobal();\n const { recommended } = global.chatFolders;\n\n if (recommended) {\n setGlobal({\n ...global,\n chatFolders: {\n ...global.chatFolders,\n recommended: recommended.filter(({ id }) => id !== recommendedId),\n },\n });\n }\n}\n\nasync function deleteChatFolder(id: number) {\n await callApi('deleteChatFolder', id);\n}\n\nexport async function fetchChatByUsername(\n username: string,\n) {\n const global = getGlobal();\n const localChat = selectChatByUsername(global, username);\n if (localChat && !localChat.isMin) {\n return localChat;\n }\n\n const chat = await callApi('getChatByUsername', username);\n if (!chat) {\n return undefined;\n }\n\n setGlobal(updateChat(getGlobal(), chat.id, chat));\n\n return chat;\n}\n\nasync function openChatByUsername(\n actions: GlobalActions,\n username: string,\n channelPostId?: number,\n startParam?: string,\n) {\n // Open temporary empty chat to make the click response feel faster\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await fetchChatByUsername(username);\n\n if (!chat) {\n actions.openPreviousChat();\n actions.showNotification({ message: 'User does not exist' });\n return;\n }\n\n if (channelPostId) {\n actions.focusMessage({ chatId: chat.id, messageId: channelPostId });\n } else {\n actions.openChat({ id: chat.id });\n }\n if (startParam) {\n actions.startBot({ botId: chat.id, param: startParam });\n }\n}\n\nasync function openCommentsByUsername(\n actions: GlobalActions,\n username: string,\n messageId: number,\n commentId: number,\n) {\n actions.openChat({ id: TMP_CHAT_ID });\n\n const chat = await fetchChatByUsername(username);\n\n if (!chat) return;\n\n const global = getGlobal();\n\n const threadInfo = selectThreadInfo(global, chat.id, messageId);\n let discussionChatId: string | undefined;\n\n if (!threadInfo) {\n const result = await callApi('requestThreadInfoUpdate', { chat, threadId: messageId });\n if (!result) return;\n\n discussionChatId = result.discussionChatId;\n } else {\n discussionChatId = threadInfo.chatId;\n }\n\n if (!discussionChatId) return;\n\n actions.focusMessage({\n chatId: discussionChatId,\n threadId: messageId,\n messageId: Number(commentId),\n });\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\nimport { selectActiveGroupCall, selectChatGroupCall, selectGroupCall } from '../../selectors/calls';\nimport { callApi } from '../../../api/gramjs';\nimport { selectChat } from '../../selectors';\nimport { copyTextToClipboard } from '../../../util/clipboard';\nimport { ApiGroupCall } from '../../../api/types';\nimport { updateGroupCall } from '../../reducers/calls';\nimport { buildCollectionByKey, omit } from '../../../util/iteratees';\nimport { addChats, addUsers } from '../../reducers';\nimport { fetchChatByUsername, loadFullChat } from '../api/chats';\nimport safePlay from '../../../util/safePlay';\nimport { ARE_CALLS_SUPPORTED } from '../../../util/environment';\nimport * as langProvider from '../../../util/langProvider';\n\n// Workaround for Safari not playing audio without user interaction\nlet audioElement: HTMLAudioElement | undefined;\nlet audioContext: AudioContext | undefined;\n\nconst joinAudio = new Audio('./voicechat_join.mp3');\nconst connectingAudio = new Audio('./voicechat_connecting.mp3');\nconnectingAudio.loop = true;\nconst leaveAudio = new Audio('./voicechat_leave.mp3');\nconst allowTalkAudio = new Audio('./voicechat_onallowtalk.mp3');\n\nconst sounds: Record = {\n join: joinAudio,\n allowTalk: allowTalkAudio,\n leave: leaveAudio,\n connecting: connectingAudio,\n};\n\nlet initializationPromise: Promise | undefined = Promise.resolve();\n\nconst initializeSoundsForSafari = () => {\n if (!initializationPromise) return Promise.resolve();\n\n initializationPromise = Promise.all(Object.values(sounds).map((l) => {\n l.muted = true;\n l.volume = 0.0001;\n return l.play().then(() => {\n l.pause();\n l.volume = 1;\n l.currentTime = 0;\n l.muted = false;\n });\n })).then(() => {\n initializationPromise = undefined;\n });\n\n return initializationPromise;\n};\n\nasync function fetchGroupCall(groupCall: Partial) {\n const result = await callApi('getGroupCall', {\n call: groupCall,\n });\n\n if (!result) return undefined;\n\n let global = getGlobal();\n\n const existingGroupCall = selectGroupCall(global, groupCall.id!);\n\n global = updateGroupCall(\n global,\n groupCall.id!,\n omit(result.groupCall, ['connectionState']),\n undefined,\n existingGroupCall?.isLoaded ? undefined : result.groupCall.participantsCount,\n );\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addChats(global, buildCollectionByKey(result.chats, 'id'));\n\n setGlobal(global);\n\n return result.groupCall;\n}\n\nasync function fetchGroupCallParticipants(groupCall: Partial, nextOffset?: string) {\n const result = await callApi('fetchGroupCallParticipants', {\n call: groupCall as ApiGroupCall,\n offset: nextOffset,\n });\n\n if (!result) return;\n\n let global = getGlobal();\n\n global = addUsers(global, buildCollectionByKey(result.users, 'id'));\n global = addChats(global, buildCollectionByKey(result.chats, 'id'));\n\n setGlobal(global);\n}\n\naddReducer('toggleGroupCallPanel', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isGroupCallPanelHidden: !global.groupCalls.isGroupCallPanelHidden,\n },\n };\n});\n\naddReducer('subscribeToGroupCallUpdates', (global, actions, payload) => {\n const { subscribed, id } = payload!;\n const groupCall = selectGroupCall(global, id);\n\n if (!groupCall) return;\n\n (async () => {\n if (subscribed) {\n await fetchGroupCall(groupCall);\n await fetchGroupCallParticipants(groupCall);\n }\n\n await callApi('toggleGroupCallStartSubscription', {\n subscribed,\n call: groupCall,\n });\n })();\n});\n\naddReducer('createGroupCall', (global, actions, payload) => {\n const { chatId } = payload;\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return;\n }\n\n (async () => {\n const result = await callApi('createGroupCall', {\n peer: chat,\n });\n\n if (!result) return;\n\n global = getGlobal();\n setGlobal(updateGroupCall(global, result.id, {\n ...result,\n chatId,\n }));\n\n actions.joinGroupCall({ id: result.id, accessHash: result.accessHash });\n })();\n});\n\naddReducer('createGroupCallInviteLink', (global, actions) => {\n const groupCall = selectActiveGroupCall(global);\n\n if (!groupCall || !groupCall.chatId) {\n return;\n }\n\n const chat = selectChat(global, groupCall.chatId);\n if (!chat) {\n return;\n }\n\n const canInvite = !!chat && !!chat.username;\n\n (async () => {\n let { inviteLink } = chat.fullInfo!;\n if (canInvite) {\n inviteLink = await callApi('exportGroupCallInvite', {\n call: groupCall,\n canSelfUnmute: false,\n });\n }\n\n if (!inviteLink) {\n return;\n }\n\n copyTextToClipboard(inviteLink);\n actions.showNotification({\n message: 'Link copied to clipboard',\n });\n })();\n});\n\naddReducer('joinVoiceChatByLink', (global, actions, payload) => {\n const { username, inviteHash } = payload!;\n\n (async () => {\n const chat = await fetchChatByUsername(username);\n\n if (!chat) {\n actions.showNotification({ message: langProvider.getTranslation('NoUsernameFound') });\n return;\n }\n\n const full = await loadFullChat(chat);\n\n if (full?.groupCall) {\n actions.joinGroupCall({ id: full.groupCall.id, accessHash: full.groupCall.accessHash, inviteHash });\n }\n })();\n});\n\naddReducer('joinGroupCall', (global, actions, payload) => {\n if (!ARE_CALLS_SUPPORTED) return;\n\n const {\n chatId, id, accessHash, inviteHash,\n } = payload;\n\n createAudioElement();\n\n (async () => {\n await initializeSoundsForSafari();\n const { groupCalls: { activeGroupCallId } } = global;\n let groupCall = id ? selectGroupCall(global, id) : selectChatGroupCall(global, chatId);\n\n if (groupCall?.id === activeGroupCallId) {\n actions.toggleGroupCallPanel();\n return;\n }\n\n if (activeGroupCallId) {\n actions.leaveGroupCall({\n rejoin: payload,\n });\n return;\n }\n\n if (groupCall && activeGroupCallId === groupCall.id) {\n actions.toggleGroupCallPanel();\n return;\n }\n\n if (!groupCall && (!id || !accessHash)) {\n groupCall = await fetchGroupCall({\n id,\n accessHash,\n });\n }\n\n if (!groupCall) return;\n\n global = getGlobal();\n\n global = updateGroupCall(\n global,\n groupCall.id,\n {\n ...groupCall,\n inviteHash,\n },\n undefined,\n groupCall.participantsCount + 1,\n );\n\n setGlobal({\n ...global,\n groupCalls: {\n ...global.groupCalls,\n activeGroupCallId: groupCall.id,\n isGroupCallPanelHidden: false,\n },\n });\n })();\n});\n\naddReducer('playGroupCallSound', (global, actions, payload) => {\n const { sound } = payload!;\n\n if (!sounds[sound]) {\n return;\n }\n\n if (initializationPromise) {\n initializationPromise.then(() => {\n safePlay(sounds[sound]);\n });\n } else {\n if (sound !== 'connecting') {\n sounds.connecting.pause();\n }\n safePlay(sounds[sound]);\n }\n});\n\naddReducer('loadMoreGroupCallParticipants', (global) => {\n const groupCall = selectActiveGroupCall(global);\n if (!groupCall) {\n return;\n }\n\n void fetchGroupCallParticipants(groupCall, groupCall.nextOffset);\n});\n\nfunction createAudioContext() {\n return (new (window.AudioContext || (window as any).webkitAudioContext)());\n}\n\nconst silence = (ctx: AudioContext) => {\n const oscillator = ctx.createOscillator();\n const dst = oscillator.connect(ctx.createMediaStreamDestination());\n oscillator.start();\n return new MediaStream([Object.assign((dst as any).stream.getAudioTracks()[0], { enabled: false })]);\n};\n\nfunction createAudioElement() {\n const ctx = createAudioContext();\n audioElement = new Audio();\n audioContext = ctx;\n audioElement.srcObject = silence(ctx);\n safePlay(audioElement);\n}\n\nexport function getGroupCallAudioElement() {\n return audioElement;\n}\n\nexport function getGroupCallAudioContext() {\n return audioContext;\n}\n\nexport function removeGroupCallAudioElement() {\n audioElement?.pause();\n audioContext = undefined;\n audioElement = undefined;\n}\n\naddReducer('openCallFallbackConfirm', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isFallbackConfirmOpen: true,\n },\n };\n});\n\naddReducer('closeCallFallbackConfirm', (global) => {\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n isFallbackConfirmOpen: false,\n },\n };\n});\n","import { GroupCallParticipant } from '../../lib/secret-sauce';\nimport { GlobalState } from '../../global/types';\nimport { ApiGroupCall } from '../../api/types';\nimport { selectGroupCall } from '../selectors/calls';\nimport { omit } from '../../util/iteratees';\nimport { updateChat } from './chats';\nimport { selectChat } from '../selectors';\n\nexport function updateGroupCall(\n global: GlobalState,\n groupCallId: string,\n groupCallUpdate: Partial,\n addToParticipantCount?: number,\n resetParticipantCount?: number,\n): GlobalState {\n const unfiltered = Object.values({\n ...global.groupCalls.byId[groupCallId]?.participants,\n ...groupCallUpdate.participants,\n });\n const filtered = unfiltered.filter((l) => !l.isLeft);\n const participants = filtered.reduce((acc: Record, el) => {\n acc[el.id] = el;\n return acc;\n }, {});\n\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n byId: {\n ...global.groupCalls.byId,\n [groupCallId]: {\n ...global.groupCalls.byId[groupCallId],\n ...omit(groupCallUpdate, ['participantsCount']),\n ...(addToParticipantCount && {\n participantsCount: global.groupCalls.byId[groupCallId].participantsCount + addToParticipantCount,\n }),\n ...(resetParticipantCount !== undefined && {\n participantsCount: resetParticipantCount,\n }),\n participants,\n },\n },\n },\n };\n}\n\nexport function removeGroupCall(\n global: GlobalState,\n groupCallId: string,\n): GlobalState {\n const groupCall = selectGroupCall(global, groupCallId);\n if (groupCall && groupCall.chatId) {\n const chat = selectChat(global, groupCall.chatId);\n if (chat) {\n global = updateChat(global, groupCall.chatId, {\n fullInfo: {\n ...chat.fullInfo,\n groupCallId: undefined,\n },\n });\n }\n }\n\n return {\n ...global,\n groupCalls: {\n ...global.groupCalls,\n byId: {\n ...omit(global.groupCalls.byId, [groupCallId.toString()]),\n },\n },\n };\n}\n\nexport function updateActiveGroupCall(\n global: GlobalState,\n groupCallUpdate: Partial,\n resetParticipantCount?: number,\n): GlobalState {\n if (!global.groupCalls.activeGroupCallId) {\n return global;\n }\n\n return updateGroupCall(global,\n global.groupCalls.activeGroupCallId,\n groupCallUpdate,\n undefined,\n resetParticipantCount);\n}\n\nexport function updateGroupCallParticipant(\n global: GlobalState,\n groupCallId: string,\n userId: string,\n participantUpdate: Partial,\n noUpdateCount = false,\n) {\n const groupCall = selectGroupCall(global, groupCallId);\n if (!groupCall) {\n return global;\n }\n\n return updateGroupCall(global, groupCallId, {\n participants: {\n ...groupCall.participants,\n [userId]: {\n ...groupCall.participants[userId],\n ...participantUpdate,\n },\n },\n }, participantUpdate.isLeft\n ? (noUpdateCount ? 0 : -1)\n : (groupCall.participants[userId] || noUpdateCount ? 0 : 1));\n}\n","import { GlobalState } from '../../global/types';\nimport { selectChat } from './chats';\nimport { getUserFullName, isChatBasicGroup } from '../helpers';\nimport { selectUser } from './users';\n\nexport function selectChatGroupCall(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.fullInfo || !chat.fullInfo.groupCallId) return undefined;\n\n return selectGroupCall(global, chat.fullInfo.groupCallId);\n}\n\nexport function selectGroupCall(global: GlobalState, groupCallId: string) {\n return global.groupCalls.byId[groupCallId];\n}\n\nexport function selectGroupCallParticipant(global: GlobalState, groupCallId: string, participantId: string) {\n return selectGroupCall(global, groupCallId)?.participants[participantId];\n}\n\nexport function selectIsAdminInActiveGroupCall(global: GlobalState): boolean {\n const chatId = selectActiveGroupCall(global)?.chatId;\n\n if (!chatId) return false;\n\n const chat = selectChat(global, chatId);\n if (!chat) return false;\n\n return (isChatBasicGroup(chat) && chat.isCreator) || !!chat.adminRights?.manageCall;\n}\n\nexport function selectActiveGroupCall(global: GlobalState) {\n const { groupCalls: { activeGroupCallId } } = global;\n if (!activeGroupCallId) {\n return undefined;\n }\n\n return selectGroupCall(global, activeGroupCallId);\n}\n\nexport function selectCallFallbackChannelTitle(global: GlobalState) {\n const currentUser = selectUser(global, global.currentUserId!);\n\n return `Calls: ${getUserFullName(currentUser!)}`;\n}\n","import { getDispatch } from '../lib/teact/teactn';\nimport { IS_SAFARI } from './environment';\n\ntype DeepLinkMethod = 'resolve' | 'login' | 'passport' | 'settings' | 'join' | 'addstickers' | 'setlanguage' |\n'addtheme' | 'confirmphone' | 'socks' | 'proxy' | 'privatepost' | 'bg' | 'share' | 'msg' | 'msg_url';\n\nexport const processDeepLink = (url: string) => {\n const {\n protocol, searchParams, pathname, hostname,\n } = new URL(url);\n\n if (protocol !== 'tg:') return;\n\n const {\n openChatByInvite,\n openChatByUsername,\n openStickerSetShortName,\n focusMessage,\n joinVoiceChatByLink,\n } = getDispatch();\n\n // Safari thinks the path in tg://path links is hostname for some reason\n const method = (IS_SAFARI ? hostname : pathname).replace(/^\\/\\//, '') as DeepLinkMethod;\n const params: Record = {};\n searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n switch (method) {\n case 'resolve': {\n const {\n domain, post, comment, voicechat, livestream, start,\n } = params;\n\n if (domain !== 'telegrampassport') {\n if (params.hasOwnProperty('voicechat') || params.hasOwnProperty('livestream')) {\n joinVoiceChatByLink({\n username: domain,\n inviteHash: voicechat || livestream,\n });\n } else {\n openChatByUsername({\n username: domain,\n messageId: Number(post),\n commentId: Number(comment),\n startParam: start,\n });\n }\n }\n break;\n }\n case 'privatepost': {\n const {\n post, channel,\n } = params;\n\n focusMessage({\n chatId: `-${channel}`,\n id: post,\n });\n break;\n }\n case 'bg': {\n // const {\n // slug, color, rotation, mode, intensity, bg_color: bgColor, gradient,\n // } = params;\n break;\n }\n case 'join': {\n const { invite } = params;\n\n openChatByInvite({ hash: invite });\n break;\n }\n case 'addstickers': {\n const { set } = params;\n\n openStickerSetShortName({\n stickerSetShortName: set,\n });\n break;\n }\n case 'share':\n case 'msg': {\n // const { url, text } = params;\n break;\n }\n case 'login': {\n // const { code, token } = params;\n break;\n }\n default:\n // Unsupported deeplink\n\n break;\n }\n};\n"],"names":["memo","withGlobal","global","userId","chat","selectCurrentChat","user","selectUser","contactName","getUserFirstOrLastName","undefined","isOpen","onClose","deleteChatMember","getDispatch","lang","useLang","handleDeleteChatMember","useCallback","chatId","id","onEnter","className","title","renderText","color","isText","onClick","ms","noFirst","useMemo","throttle","cb","runThrottledForLoadChats","runThrottledForLoadTopChats","runDebouncedForLoadFullChat","debounce","async","loadChats","listType","offsetId","offsetDate","getGlobal","result","callApi","limit","CHAT_LIST_LOAD_SLICE","archived","withPinned","chats","orderedPinnedIds","serverTimeOffset","lastLocalServiceMessage","selectLastServiceNotification","message","chatIds","length","shift","addUsers","buildCollectionByKey","users","addUserStatuses","userStatusesById","updateChats","updateChatListIds","updateChatListSecondaryInfo","Object","keys","draftsById","forEach","replaceThreadParam","MAIN_THREAD_ID","replyingToById","isFullyLoaded","setGlobal","loadFullChat","fullInfo","groupCall","existingGroupCall","selectGroupCall","updateGroupCall","omit","participantsCount","updateChat","fetchChatByUsername","username","localChat","selectChatByUsername","isMin","addReducer","actions","preloadedChatIds","i","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","pause","byId","listIds","active","currentChatId","selectCurrentMessageList","pinnedChats","otherChats","prepareChatList","chatToPreload","find","includes","push","loadViewportMessages","threadId","payload","currentUserId","selectChat","hasUnreadMark","toggleChatUnread","lastMessage","threadInfo","requestThreadInfoUpdate","isChatSummaryOnly","requestChatUpdate","type","selectThreadTopMessageId","chatFullInfo","linkedChatId","openChat","messageId","focusMessage","selectSupportChat","shouldReplaceHistory","TMP_CHAT_ID","langCode","usernamePostfix","LOCALIZED_TIPS","toUpperCase","openChatByUsername","TIPS_USERNAME","oldestChat","map","filter","Boolean","selectIsChatPinned","sort","chat1","chat2","date","currentGlobal","force","SERVICE_NOTIFICATIONS_USER_ID","lastLocalMessage","isMuted","about","photo","memberIds","chatCreation","progress","ChatCreationProgress","createdChannel","channelId","accessHash","createChannel","leaveChat","createdChat","e","error","createGroupChat","folderId","folder","selectChatFolder","shouldBePinned","pinnedChatIds","includedChatIds","newPinnedIds","pinnedId","newIncludedChatIds","folderUpdate","selectChatListType","isPinned","ARCHIVED_FOLDER_ID","isChatArchived","chatFolders","loadChatFolders","recommendedChatFolders","recommended","loadRecommendedChatFolders","idsToRemove","idsToAdd","includedId","concat","emoticon","orderedIds","maxId","recommendedId","description","newFolder","createChatFolder","Math","max","apply","deleteChatFolder","unreadCount","hash","url","match","RE_TG_LINK","processDeepLink","uri","URL","startsWith","part1","part2","part3","pathname","split","l","decodeURI","params","fromEntries","searchParams","substr","openChatByInvite","openStickerSetShortName","stickerSetShortName","chatOrChannelPostId","Number","commentId","comment","hasOwnProperty","joinVoiceChatByLink","inviteHash","voicechat","livestream","showNotification","startParam","start","adminId","isRevoked","peer","admin","updateManagement","invites","link","expireDate","usageLimit","isRequestNeeded","management","byChatId","oldInvite","newInvite","current","channelPostId","openPreviousChat","startBot","botId","param","usernameChat","selectThreadInfo","discussionChatId","openCommentsByUsername","isEnabled","isChatBasicGroup","bannedRights","newGlobal","chatAfterUpdate","members","kickedMembers","isBanned","viewMessages","isUnblocked","m","adminRights","customTitle","adminMembers","isDismissed","updateManagementProgress","ManagementProgress","Promise","all","groups","addedById","reduce","group","addChats","forDiscussionIds","channel","fullChat","isPreHistoryHidden","activeChatFolder","offset","setNewChatMembersDialogState","NewChatMembersProgress","isProtected","enabledReactions","audioElement","audioContext","joinAudio","Audio","connectingAudio","loop","leaveAudio","sounds","join","allowTalk","leave","connecting","initializationPromise","resolve","fetchGroupCall","call","isLoaded","fetchGroupCallParticipants","nextOffset","getGroupCallAudioElement","getGroupCallAudioContext","removeGroupCallAudioElement","groupCalls","isGroupCallPanelHidden","subscribed","joinGroupCall","selectActiveGroupCall","canInvite","inviteLink","canSelfUnmute","copyTextToClipboard","langProvider","full","ARE_CALLS_SUPPORTED","ctx","window","AudioContext","webkitAudioContext","srcObject","oscillator","createOscillator","dst","connect","createMediaStreamDestination","MediaStream","assign","stream","getAudioTracks","enabled","silence","safePlay","createAudioElement","values","muted","volume","play","then","currentTime","activeGroupCallId","selectChatGroupCall","leaveGroupCall","rejoin","toggleGroupCallPanel","sound","isFallbackConfirmOpen","groupCallId","groupCallUpdate","addToParticipantCount","resetParticipantCount","participants","isLeft","acc","el","removeGroupCall","toString","updateActiveGroupCall","updateGroupCallParticipant","participantUpdate","noUpdateCount","selectGroupCallParticipant","participantId","selectIsAdminInActiveGroupCall","isCreator","manageCall","selectCallFallbackChannelTitle","currentUser","getUserFullName","protocol","hostname","method","IS_SAFARI","replace","value","key","domain","post","invite","set"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/941.257681469163c1c58f3b.js b/dist/941.257681469163c1c58f3b.js new file mode 100644 index 000000000..091ab1a15 --- /dev/null +++ b/dist/941.257681469163c1c58f3b.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[941],{7941:(t,i,e)=>{e.r(i),e.d(i,{default:()=>p});var s=e(7361),n=e(6926);function a(t,i,e){return i in t?Object.defineProperty(t,i,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[i]=e,t}class h{constructor(t){this.worker=t,a(this,"requestStates",new Map),a(this,"requestStatesByCallback",new Map),this.subscribe()}request(t){const{worker:i,requestStates:e,requestStatesByCallback:s}=this,a=(0,n.Z)(e),h={type:"callMethod",messageId:a,...t},r={messageId:a},o=new Promise(((t,i)=>{Object.assign(r,{resolve:t,reject:i})}));if("function"==typeof h.args[h.args.length-1]){const t=h.args.pop();r.callback=t,s.set(t,r)}return e.set(a,r),o.catch((()=>{})).finally((()=>{e.delete(a),r.callback&&s.delete(r.callback)})),i.postMessage(h),o}cancelCallback(t){t.isCanceled=!0;const{messageId:i}=this.requestStatesByCallback.get(t)||{};i&&this.worker.postMessage({type:"cancelProgress",messageId:i})}subscribe(){const{worker:t,requestStates:i}=this;t.addEventListener("message",(({data:t})=>{if("methodResponse"===t.type){const e=i.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){var e;const s=i.get(t.messageId);null==s||null===(e=s.callback)||void 0===e||e.call(s,...t.callbackArgs)}else if("unhandledError"===t.type){var s;throw new Error(null===(s=t.error)||void 0===s?void 0:s.message)}}))}}var r=e(9933),o=e(3570);function d(t,i,e){return i in t?Object.defineProperty(t,i,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[i]=e,t}const c=s.wB?.75:1,u=.75,l=s.s$?2:4,m=new Array(4).fill(void 0).map((()=>new h(new Worker(new URL(e.p+e.u(354),e.b)))));let g=-1;const p=class{constructor(t,i,e,s={},n,a,h){this.id=t,this.container=i,this.animationData=e,this.params=s,this.onLoad=n,this.customColor=a,this.onEnded=h,d(this,"imgSize",void 0),d(this,"key",void 0),d(this,"msPerFrame",1e3/60),d(this,"reduceFactor",1),d(this,"cacheModulo",void 0),d(this,"chunkSize",void 0),d(this,"workerIndex",void 0),d(this,"chunks",[]),d(this,"framesCount",void 0),d(this,"chunksCount",void 0),d(this,"canvas",document.createElement("canvas")),d(this,"ctx",this.canvas.getContext("2d")),d(this,"isAnimating",!1),d(this,"isWaiting",!0),d(this,"isOnLoadFired",!1),d(this,"isDestroyed",!1),d(this,"approxFrameIndex",0),d(this,"prevFrameIndex",-1),d(this,"stopFrameIndex",0),d(this,"speed",1),d(this,"direction",1),d(this,"lastRenderAt",void 0),this.initContainer(),this.initConfig(),this.initRenderer()}isPlaying(){return this.isAnimating||this.isWaiting}play(){this.stopFrameIndex=void 0,this.direction=1,this.doPlay()}pause(){this.isWaiting?this.stopFrameIndex=this.approxFrameIndex:this.isAnimating=!1;const t=this.getChunkIndex(this.approxFrameIndex);this.chunks=this.chunks.map(((i,e)=>e===t?i:void 0))}goToAndPlay(t){this.approxFrameIndex=Math.floor(t/this.reduceFactor),this.stopFrameIndex=void 0,this.direction=1,this.doPlay()}goToAndStop(t){this.approxFrameIndex=Math.floor(t/this.reduceFactor),this.stopFrameIndex=Math.floor(t/this.reduceFactor),this.direction=1,this.doPlay()}playSegment([t,i]){this.approxFrameIndex=Math.floor(t/this.reduceFactor),this.stopFrameIndex=Math.floor(i/this.reduceFactor),this.direction=t{if(this.isDestroyed)return!1;if(!this.isAnimating&&this.isOnLoadFired)return!1;const t=Math.round(this.approxFrameIndex),i=this.getChunkIndex(t),e=this.chunks[i];if(!e||0===e.length)return this.requestChunk(i),this.isAnimating=!1,this.isWaiting=!0,!1;if(this.cacheModulo&&i%this.cacheModulo==0&&this.cleanupPrevChunk(i),t!==this.prevFrameIndex){const i=this.getFrame(t);if(!i)return this.isAnimating=!1,this.isWaiting=!0,!1;const e=new Uint8ClampedArray(i);if(this.customColor)for(let t=0;t0&&(t===this.framesCount-1||h>this.framesCount-1)){var r;if(this.params.noLoop)return this.isAnimating=!1,null===(r=this.onEnded)||void 0===r||r.call(this),!1;this.approxFrameIndex=0}else if(a<0&&(0===t||h<0)){var o;if(this.params.noLoop)return this.isAnimating=!1,null===(o=this.onEnded)||void 0===o||o.call(this),!1;this.approxFrameIndex=this.framesCount-1}else{if(void 0!==this.stopFrameIndex&&(t===this.stopFrameIndex||a>0&&h>this.stopFrameIndex||a<0&&h{function s(t,i){return i-Math.floor(i/t)*t}e.d(i,{Z:()=>s})}}]); +//# sourceMappingURL=941.257681469163c1c58f3b.js.map \ No newline at end of file diff --git a/dist/941.257681469163c1c58f3b.js.map b/dist/941.257681469163c1c58f3b.js.map new file mode 100644 index 000000000..7705736db --- /dev/null +++ b/dist/941.257681469163c1c58f3b.js.map @@ -0,0 +1 @@ +{"version":3,"file":"941.257681469163c1c58f3b.js","mappings":"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","sources":["webpack://telegram-t/./src/util/WorkerConnector.ts","webpack://telegram-t/./src/lib/rlottie/RLottie.ts","webpack://telegram-t/./src/util/cycleRestrict.ts"],"sourcesContent":["import generateIdFor from './generateIdFor';\n\nexport interface CancellableCallback {\n (\n ...args: any[]\n ): void;\n\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n}\n\ntype CallMethodData = {\n type: 'callMethod';\n messageId?: string;\n name: string;\n args: any;\n};\n\ntype OriginMessageData = CallMethodData | {\n type: 'cancelProgress';\n messageId: string;\n};\n\nexport interface OriginMessageEvent {\n data: OriginMessageData;\n}\n\nexport type WorkerMessageData = {\n type: 'methodResponse';\n messageId: string;\n response?: any;\n error?: { message: string };\n} | {\n type: 'methodCallback';\n messageId: string;\n callbackArgs: any[];\n} | {\n type: 'unhandledError';\n error?: { message: string };\n};\n\nexport interface WorkerMessageEvent {\n data: WorkerMessageData;\n}\n\ninterface RequestStates {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback: AnyToVoidFunction;\n}\n\n// TODO Replace `any` with proper generics\nexport default class WorkerConnector {\n private requestStates = new Map();\n\n private requestStatesByCallback = new Map();\n\n constructor(private worker: Worker) {\n this.subscribe();\n }\n\n request(messageData: { name: string; args: any }) {\n const { worker, requestStates, requestStatesByCallback } = this;\n\n const messageId = generateIdFor(requestStates);\n const payload: CallMethodData = {\n type: 'callMethod',\n messageId,\n ...messageData,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[payload.args.length - 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\n cancelCallback(progressCallback: CancellableCallback) {\n progressCallback.isCanceled = true;\n\n const { messageId } = this.requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n this.worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n }\n\n private subscribe() {\n const { worker, requestStates } = this;\n\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n requestState?.callback?.(...data.callbackArgs);\n } else if (data.type === 'unhandledError') {\n throw new Error(data.error?.message);\n }\n });\n }\n}\n","import {\n DPR,\n IS_SINGLE_COLUMN_LAYOUT,\n IS_SAFARI,\n} from '../../util/environment';\nimport WorkerConnector from '../../util/WorkerConnector';\nimport { animate } from '../../util/animation';\nimport cycleRestrict from '../../util/cycleRestrict';\n\ninterface Params {\n noLoop?: boolean;\n size?: number;\n quality?: number;\n isLowPriority?: boolean;\n}\n\ntype Frames = ArrayBuffer[];\ntype Chunks = (Frames | undefined)[];\n\n// TODO Consider removing chunks\nconst CHUNK_SIZE = 1;\nconst MAX_WORKERS = 4;\nconst HIGH_PRIORITY_QUALITY = IS_SINGLE_COLUMN_LAYOUT ? 0.75 : 1;\nconst LOW_PRIORITY_QUALITY = 0.75;\nconst HIGH_PRIORITY_CACHE_MODULO = IS_SAFARI ? 2 : 4;\nconst LOW_PRIORITY_CACHE_MODULO = 0;\n\nconst workers = new Array(MAX_WORKERS).fill(undefined).map(\n () => new WorkerConnector(new Worker(new URL('./rlottie.worker.ts', import.meta.url))),\n);\nlet lastWorkerIndex = -1;\n\nclass RLottie {\n // Config\n\n private imgSize!: number;\n\n private key!: string;\n\n private msPerFrame = 1000 / 60;\n\n private reduceFactor = 1;\n\n private cacheModulo!: number;\n\n private chunkSize!: number;\n\n private workerIndex!: number;\n\n private chunks: Chunks = [];\n\n private framesCount?: number;\n\n private chunksCount?: number;\n\n // Container\n\n private canvas = document.createElement('canvas');\n\n private ctx = this.canvas.getContext('2d')!;\n\n // State\n\n private isAnimating = false;\n\n private isWaiting = true;\n\n private isOnLoadFired = false;\n\n private isDestroyed = false;\n\n private approxFrameIndex = 0;\n\n private prevFrameIndex = -1;\n\n private stopFrameIndex? = 0;\n\n private speed = 1;\n\n private direction: 1 | -1 = 1;\n\n private lastRenderAt?: number;\n\n constructor(\n private id: string,\n private container: HTMLDivElement,\n private animationData: string,\n private params: Params = {},\n private onLoad?: () => void,\n private customColor?: [number, number, number],\n private onEnded?: (isDestroyed?: boolean) => void,\n ) {\n this.initContainer();\n this.initConfig();\n this.initRenderer();\n }\n\n isPlaying() {\n return this.isAnimating || this.isWaiting;\n }\n\n play() {\n this.stopFrameIndex = undefined;\n this.direction = 1;\n this.doPlay();\n }\n\n pause() {\n if (this.isWaiting) {\n this.stopFrameIndex = this.approxFrameIndex;\n } else {\n this.isAnimating = false;\n }\n\n const currentChunkIndex = this.getChunkIndex(this.approxFrameIndex);\n this.chunks = this.chunks.map((chunk, i) => (i === currentChunkIndex ? chunk : undefined));\n }\n\n goToAndPlay(frameIndex: number) {\n this.approxFrameIndex = Math.floor(frameIndex / this.reduceFactor);\n this.stopFrameIndex = undefined;\n this.direction = 1;\n this.doPlay();\n }\n\n goToAndStop(frameIndex: number) {\n this.approxFrameIndex = Math.floor(frameIndex / this.reduceFactor);\n this.stopFrameIndex = Math.floor(frameIndex / this.reduceFactor);\n this.direction = 1;\n this.doPlay();\n }\n\n playSegment([startFrameIndex, stopFrameIndex]: [number, number]) {\n this.approxFrameIndex = Math.floor(startFrameIndex / this.reduceFactor);\n this.stopFrameIndex = Math.floor(stopFrameIndex / this.reduceFactor);\n this.direction = startFrameIndex < stopFrameIndex ? 1 : -1;\n this.doPlay();\n }\n\n setSpeed(speed: number) {\n this.speed = speed;\n }\n\n destroy() {\n this.isDestroyed = true;\n this.pause();\n this.destroyRenderer();\n this.destroyContainer();\n }\n\n private initContainer() {\n if (!(this.container.parentNode instanceof HTMLElement)) {\n throw new Error('[RLottie] Container is not mounted');\n }\n\n let { size } = this.params;\n\n if (!size) {\n size = (\n this.container.offsetWidth\n || parseInt(this.container.style.width, 10)\n || this.container.parentNode.offsetWidth\n );\n\n if (!size) {\n throw new Error('[RLottie] Failed to detect width from container');\n }\n }\n\n this.canvas.style.width = `${size}px`;\n this.canvas.style.height = `${size}px`;\n\n const { isLowPriority, quality = isLowPriority ? LOW_PRIORITY_QUALITY : HIGH_PRIORITY_QUALITY } = this.params;\n // Reduced quality only looks acceptable on high DPR screens\n const imgSize = Math.round(size * Math.max(DPR * quality, 1));\n\n this.canvas.width = imgSize;\n this.canvas.height = imgSize;\n\n this.container.appendChild(this.canvas);\n\n this.imgSize = imgSize;\n }\n\n private initConfig() {\n this.key = `${this.id}_${this.imgSize}`;\n\n const { isLowPriority } = this.params;\n\n this.cacheModulo = isLowPriority ? LOW_PRIORITY_CACHE_MODULO : HIGH_PRIORITY_CACHE_MODULO;\n this.chunkSize = CHUNK_SIZE;\n }\n\n private destroyContainer() {\n this.canvas.remove();\n }\n\n setColor(newColor: [number, number, number] | undefined) {\n this.customColor = newColor;\n\n // TODO Remove?\n if (this.customColor) {\n const imageData = this.ctx.getImageData(0, 0, this.imgSize, this.imgSize);\n const arr = imageData.data;\n for (let i = 0; i < arr.length; i += 4) {\n /* eslint-disable prefer-destructuring */\n arr[i] = this.customColor[0];\n arr[i + 1] = this.customColor[1];\n arr[i + 2] = this.customColor[2];\n /* eslint-enable prefer-destructuring */\n }\n this.ctx.putImageData(imageData, 0, 0);\n }\n }\n\n private initRenderer() {\n this.workerIndex = cycleRestrict(MAX_WORKERS, ++lastWorkerIndex);\n\n workers[this.workerIndex].request({\n name: 'init',\n args: [\n this.key,\n this.animationData,\n this.imgSize,\n this.params.isLowPriority,\n this.onRendererInit.bind(this),\n ],\n });\n }\n\n private destroyRenderer() {\n workers[this.workerIndex].request({\n name: 'destroy',\n args: [this.key],\n });\n }\n\n private onRendererInit(reduceFactor: number, msPerFrame: number, framesCount: number) {\n this.reduceFactor = reduceFactor;\n this.msPerFrame = msPerFrame;\n this.framesCount = framesCount;\n this.chunksCount = Math.ceil(framesCount / this.chunkSize);\n\n if (this.isWaiting) {\n this.doPlay();\n }\n }\n\n changeData(animationData: string) {\n this.pause();\n this.animationData = animationData;\n this.initConfig();\n\n workers[this.workerIndex].request({\n name: 'changeData',\n args: [\n this.key,\n this.animationData,\n this.params.isLowPriority,\n this.onChangeData.bind(this),\n ],\n });\n }\n\n private onChangeData(reduceFactor: number, msPerFrame: number, framesCount: number) {\n this.reduceFactor = reduceFactor;\n this.msPerFrame = msPerFrame;\n this.framesCount = framesCount;\n this.chunksCount = Math.ceil(framesCount / this.chunkSize);\n this.isWaiting = false;\n this.isAnimating = false;\n\n this.doPlay();\n }\n\n private doPlay() {\n if (!this.framesCount) {\n return;\n }\n\n if (this.isDestroyed) {\n return;\n }\n\n if (this.isAnimating) {\n return;\n }\n\n if (!this.isWaiting) {\n this.lastRenderAt = undefined;\n }\n\n this.isAnimating = true;\n this.isWaiting = false;\n\n animate(() => {\n if (this.isDestroyed) {\n return false;\n }\n\n // Paused from outside\n if (!this.isAnimating && this.isOnLoadFired) {\n return false;\n }\n\n const frameIndex = Math.round(this.approxFrameIndex);\n const chunkIndex = this.getChunkIndex(frameIndex);\n const chunk = this.chunks[chunkIndex];\n\n if (!chunk || chunk.length === 0) {\n this.requestChunk(chunkIndex);\n this.isAnimating = false;\n this.isWaiting = true;\n return false;\n }\n\n if (this.cacheModulo && chunkIndex % this.cacheModulo === 0) {\n this.cleanupPrevChunk(chunkIndex);\n }\n\n if (frameIndex !== this.prevFrameIndex) {\n const frame = this.getFrame(frameIndex);\n if (!frame) {\n this.isAnimating = false;\n this.isWaiting = true;\n return false;\n }\n\n const arr = new Uint8ClampedArray(frame);\n if (this.customColor) {\n for (let i = 0; i < arr.length; i += 4) {\n /* eslint-disable prefer-destructuring */\n arr[i] = this.customColor[0];\n arr[i + 1] = this.customColor[1];\n arr[i + 2] = this.customColor[2];\n /* eslint-enable prefer-destructuring */\n }\n }\n const imageData = new ImageData(arr, this.imgSize, this.imgSize);\n this.ctx.putImageData(imageData, 0, 0);\n\n if (this.onLoad && !this.isOnLoadFired) {\n this.isOnLoadFired = true;\n this.onLoad();\n }\n\n this.prevFrameIndex = frameIndex;\n }\n\n const now = Date.now();\n const currentSpeed = this.lastRenderAt ? this.msPerFrame / (now - this.lastRenderAt) : 1;\n const delta = Math.min(1, (this.direction * this.speed) / currentSpeed);\n const expectedNextFrameIndex = Math.round(this.approxFrameIndex + delta);\n\n this.lastRenderAt = now;\n\n // Forward animation finished\n if (delta > 0 && (frameIndex === this.framesCount! - 1 || expectedNextFrameIndex > this.framesCount! - 1)) {\n if (this.params.noLoop) {\n this.isAnimating = false;\n this.onEnded?.();\n return false;\n }\n\n this.approxFrameIndex = 0;\n\n // Backward animation finished\n } else if (delta < 0 && (frameIndex === 0 || expectedNextFrameIndex < 0)) {\n if (this.params.noLoop) {\n this.isAnimating = false;\n this.onEnded?.();\n return false;\n }\n\n this.approxFrameIndex = this.framesCount! - 1;\n\n // Stop frame reached\n } else if (\n this.stopFrameIndex !== undefined\n && (frameIndex === this.stopFrameIndex\n || (\n (delta > 0 && expectedNextFrameIndex > this.stopFrameIndex)\n || (delta < 0 && expectedNextFrameIndex < this.stopFrameIndex)\n ))\n ) {\n this.stopFrameIndex = undefined;\n this.isAnimating = false;\n return false;\n\n // Preparing next frame\n } else {\n this.approxFrameIndex += delta;\n }\n\n const nextFrameIndex = Math.round(this.approxFrameIndex);\n\n if (!this.getFrame(nextFrameIndex)) {\n this.requestChunk(this.getChunkIndex(nextFrameIndex));\n this.isWaiting = true;\n this.isAnimating = false;\n return false;\n }\n\n return true;\n });\n }\n\n private getFrame(frameIndex: number) {\n const chunkIndex = this.getChunkIndex(frameIndex);\n const indexInChunk = this.getFrameIndexInChunk(frameIndex);\n const chunk = this.chunks[chunkIndex];\n if (!chunk) {\n return undefined;\n }\n\n return chunk[indexInChunk];\n }\n\n private getFrameIndexInChunk(frameIndex: number) {\n const chunkIndex = this.getChunkIndex(frameIndex);\n return frameIndex - chunkIndex * this.chunkSize;\n }\n\n private getChunkIndex(frameIndex: number) {\n return Math.floor(frameIndex / this.chunkSize);\n }\n\n private requestChunk(chunkIndex: number) {\n if (this.chunks[chunkIndex] && this.chunks[chunkIndex]?.length !== 0) {\n return;\n }\n\n this.chunks[chunkIndex] = [];\n\n const fromIndex = chunkIndex * this.chunkSize;\n const toIndex = Math.min(fromIndex + this.chunkSize - 1, this.framesCount! - 1);\n\n workers[this.workerIndex].request({\n name: 'renderFrames',\n args: [this.key, fromIndex, toIndex, this.onFrameLoad.bind(this)],\n });\n }\n\n private cleanupPrevChunk(chunkIndex: number) {\n if (this.chunksCount! < 3) {\n return;\n }\n\n const prevChunkIndex = cycleRestrict(this.chunksCount!, chunkIndex - 1);\n this.chunks[prevChunkIndex] = undefined;\n }\n\n private requestNextChunk(chunkIndex: number) {\n if (this.chunksCount === 1) {\n return;\n }\n\n const nextChunkIndex = cycleRestrict(this.chunksCount!, chunkIndex + 1);\n\n if (!this.chunks[nextChunkIndex]) {\n this.requestChunk(nextChunkIndex);\n }\n }\n\n private onFrameLoad(frameIndex: number, arrayBuffer: ArrayBuffer) {\n const chunkIndex = this.getChunkIndex(frameIndex);\n const chunk = this.chunks[chunkIndex];\n // Frame can be skipped and chunk can be already cleaned up\n if (!chunk) {\n return;\n }\n\n chunk[this.getFrameIndexInChunk(frameIndex)] = arrayBuffer;\n\n if (this.isWaiting) {\n this.doPlay();\n }\n }\n}\n\nexport default RLottie;\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n"],"names":["WorkerConnector","constructor","worker","Map","this","subscribe","request","messageData","requestStates","requestStatesByCallback","messageId","generateIdFor","payload","type","requestState","promise","Promise","resolve","reject","Object","assign","args","length","callback","pop","set","catch","finally","delete","postMessage","cancelCallback","progressCallback","isCanceled","get","addEventListener","data","error","response","callbackArgs","Error","message","HIGH_PRIORITY_QUALITY","IS_SINGLE_COLUMN_LAYOUT","LOW_PRIORITY_QUALITY","HIGH_PRIORITY_CACHE_MODULO","IS_SAFARI","workers","Array","fill","undefined","map","Worker","URL","lastWorkerIndex","id","container","animationData","params","onLoad","customColor","onEnded","document","createElement","canvas","getContext","initContainer","initConfig","initRenderer","isPlaying","isAnimating","isWaiting","play","stopFrameIndex","direction","doPlay","pause","approxFrameIndex","currentChunkIndex","getChunkIndex","chunks","chunk","i","goToAndPlay","frameIndex","Math","floor","reduceFactor","goToAndStop","playSegment","startFrameIndex","setSpeed","speed","destroy","isDestroyed","destroyRenderer","destroyContainer","parentNode","HTMLElement","size","offsetWidth","parseInt","style","width","height","isLowPriority","quality","imgSize","round","max","DPR","appendChild","key","cacheModulo","chunkSize","remove","setColor","newColor","imageData","ctx","getImageData","arr","putImageData","workerIndex","cycleRestrict","name","onRendererInit","bind","msPerFrame","framesCount","chunksCount","ceil","changeData","onChangeData","lastRenderAt","animate","isOnLoadFired","chunkIndex","requestChunk","cleanupPrevChunk","prevFrameIndex","frame","getFrame","Uint8ClampedArray","ImageData","now","Date","currentSpeed","delta","min","expectedNextFrameIndex","noLoop","nextFrameIndex","indexInChunk","getFrameIndexInChunk","fromIndex","toIndex","onFrameLoad","prevChunkIndex","requestNextChunk","nextChunkIndex","arrayBuffer","index"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/941.732a2a999d50a3fa51ba.js b/dist/941.732a2a999d50a3fa51ba.js deleted file mode 100644 index 7a5251758..000000000 --- a/dist/941.732a2a999d50a3fa51ba.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunktelegram_t=self.webpackChunktelegram_t||[]).push([[941],{7941:(t,i,e)=>{e.r(i),e.d(i,{default:()=>p});var s=e(7361),n=e(6926);function a(t,i,e){return i in t?Object.defineProperty(t,i,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[i]=e,t}class h{constructor(t){this.worker=t,a(this,"requestStates",new Map),a(this,"requestStatesByCallback",new Map),this.subscribe()}request(t){const{worker:i,requestStates:e,requestStatesByCallback:s}=this,a=(0,n.Z)(e),h={type:"callMethod",messageId:a,...t},r={messageId:a},o=new Promise(((t,i)=>{Object.assign(r,{resolve:t,reject:i})}));if("function"==typeof h.args[h.args.length-1]){const t=h.args.pop();r.callback=t,s.set(t,r)}return e.set(a,r),o.catch((()=>{})).finally((()=>{e.delete(a),r.callback&&s.delete(r.callback)})),i.postMessage(h),o}cancelCallback(t){t.isCanceled=!0;const{messageId:i}=this.requestStatesByCallback.get(t)||{};i&&this.worker.postMessage({type:"cancelProgress",messageId:i})}subscribe(){const{worker:t,requestStates:i}=this;t.addEventListener("message",(({data:t})=>{if("methodResponse"===t.type){const e=i.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){var e;const s=i.get(t.messageId);null==s||null===(e=s.callback)||void 0===e||e.call(s,...t.callbackArgs)}else if("unhandledError"===t.type){var s;throw new Error(null===(s=t.error)||void 0===s?void 0:s.message)}}))}}var r=e(9933),o=e(3570);function d(t,i,e){return i in t?Object.defineProperty(t,i,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[i]=e,t}const c=s.wB?.75:1,u=.75,l=s.s$?2:4,m=new Array(4).fill(void 0).map((()=>new h(new Worker(new URL(e.p+e.u(354),e.b)))));let g=-1;const p=class{constructor(t,i,e,s={},n,a,h){this.id=t,this.container=i,this.animationData=e,this.params=s,this.onLoad=n,this.customColor=a,this.onEnded=h,d(this,"imgSize",void 0),d(this,"key",void 0),d(this,"msPerFrame",void 0),d(this,"reduceFactor",void 0),d(this,"cacheModulo",void 0),d(this,"chunkSize",void 0),d(this,"workerIndex",void 0),d(this,"chunks",[]),d(this,"framesCount",void 0),d(this,"chunksCount",void 0),d(this,"canvas",document.createElement("canvas")),d(this,"ctx",this.canvas.getContext("2d")),d(this,"isAnimating",!1),d(this,"isWaiting",!0),d(this,"isOnLoadFired",!1),d(this,"isDestroyed",!1),d(this,"approxFrameIndex",0),d(this,"prevFrameIndex",-1),d(this,"stopFrameIndex",0),d(this,"speed",1),d(this,"direction",1),d(this,"lastRenderAt",void 0),this.initContainer(),this.initConfig(),this.initRenderer()}isPlaying(){return this.isAnimating||this.isWaiting}play(){this.stopFrameIndex=void 0,this.direction=1,this.doPlay()}pause(){this.isWaiting?this.stopFrameIndex=this.approxFrameIndex:this.isAnimating=!1;const t=this.getChunkIndex(this.approxFrameIndex);this.chunks=this.chunks.map(((i,e)=>e===t?i:void 0))}goToAndPlay(t){this.approxFrameIndex=Math.floor(t/this.reduceFactor),this.stopFrameIndex=void 0,this.direction=1,this.doPlay()}goToAndStop(t){this.approxFrameIndex=Math.floor(t/this.reduceFactor),this.stopFrameIndex=Math.floor(t/this.reduceFactor),this.direction=1,this.doPlay()}playSegment([t,i]){this.approxFrameIndex=Math.floor(t/this.reduceFactor),this.stopFrameIndex=Math.floor(i/this.reduceFactor),this.direction=t{if(this.isDestroyed)return!1;if(!this.isAnimating&&this.isOnLoadFired)return!1;const t=Math.round(this.approxFrameIndex),i=this.getChunkIndex(t),e=this.chunks[i];if(!e||0===e.length)return this.requestChunk(i),this.isAnimating=!1,this.isWaiting=!0,!1;if(this.cacheModulo&&i%this.cacheModulo==0&&this.cleanupPrevChunk(i),this.requestNextChunk(i),t!==this.prevFrameIndex){const i=this.getFrame(t);if(!i)return this.isAnimating=!1,this.isWaiting=!0,!1;const e=new Uint8ClampedArray(i);if(this.customColor)for(let t=0;t0&&(t===this.framesCount-1||h>this.framesCount-1)){var r;if(this.params.noLoop)return this.isAnimating=!1,null===(r=this.onEnded)||void 0===r||r.call(this),!1;this.approxFrameIndex=0}else if(a<0&&(0===t||h<0)){var o;if(this.params.noLoop)return this.isAnimating=!1,null===(o=this.onEnded)||void 0===o||o.call(this),!1;this.approxFrameIndex=this.framesCount-1}else{if(void 0!==this.stopFrameIndex&&(t===this.stopFrameIndex||a>0&&h>this.stopFrameIndex||a<0&&h{function s(t,i){return i-Math.floor(i/t)*t}e.d(i,{Z:()=>s})}}]); -//# sourceMappingURL=941.732a2a999d50a3fa51ba.js.map \ No newline at end of file diff --git a/dist/941.732a2a999d50a3fa51ba.js.map b/dist/941.732a2a999d50a3fa51ba.js.map deleted file mode 100644 index 9c2be0c08..000000000 --- a/dist/941.732a2a999d50a3fa51ba.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"941.732a2a999d50a3fa51ba.js","mappings":"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","sources":["webpack://telegram-t/./src/util/WorkerConnector.ts","webpack://telegram-t/./src/lib/rlottie/RLottie.ts","webpack://telegram-t/./src/util/cycleRestrict.ts"],"sourcesContent":["import generateIdFor from './generateIdFor';\n\nexport interface CancellableCallback {\n (\n ...args: any[]\n ): void;\n\n isCanceled?: boolean;\n acceptsBuffer?: boolean;\n}\n\ntype CallMethodData = {\n type: 'callMethod';\n messageId?: string;\n name: string;\n args: any;\n};\n\ntype OriginMessageData = CallMethodData | {\n type: 'cancelProgress';\n messageId: string;\n};\n\nexport interface OriginMessageEvent {\n data: OriginMessageData;\n}\n\nexport type WorkerMessageData = {\n type: 'methodResponse';\n messageId: string;\n response?: any;\n error?: { message: string };\n} | {\n type: 'methodCallback';\n messageId: string;\n callbackArgs: any[];\n} | {\n type: 'unhandledError';\n error?: { message: string };\n};\n\nexport interface WorkerMessageEvent {\n data: WorkerMessageData;\n}\n\ninterface RequestStates {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback: AnyToVoidFunction;\n}\n\n// TODO Replace `any` with proper generics\nexport default class WorkerConnector {\n private requestStates = new Map();\n\n private requestStatesByCallback = new Map();\n\n constructor(private worker: Worker) {\n this.subscribe();\n }\n\n request(messageData: { name: string; args: any }) {\n const { worker, requestStates, requestStatesByCallback } = this;\n\n const messageId = generateIdFor(requestStates);\n const payload: CallMethodData = {\n type: 'callMethod',\n messageId,\n ...messageData,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (typeof payload.args[payload.args.length - 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\n cancelCallback(progressCallback: CancellableCallback) {\n progressCallback.isCanceled = true;\n\n const { messageId } = this.requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n this.worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n }\n\n private subscribe() {\n const { worker, requestStates } = this;\n\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n const requestState = requestStates.get(data.messageId);\n requestState?.callback?.(...data.callbackArgs);\n } else if (data.type === 'unhandledError') {\n throw new Error(data.error?.message);\n }\n });\n }\n}\n","import {\n DPR,\n IS_SINGLE_COLUMN_LAYOUT,\n IS_SAFARI,\n} from '../../util/environment';\nimport WorkerConnector from '../../util/WorkerConnector';\nimport { animate } from '../../util/animation';\nimport cycleRestrict from '../../util/cycleRestrict';\n\ninterface Params {\n noLoop?: boolean;\n size?: number;\n quality?: number;\n isLowPriority?: boolean;\n}\n\ntype Frames = ArrayBuffer[];\ntype Chunks = (Frames | undefined)[];\n\n// TODO Consider removing chunks\nconst CHUNK_SIZE = 1;\nconst MAX_WORKERS = 4;\nconst HIGH_PRIORITY_QUALITY = IS_SINGLE_COLUMN_LAYOUT ? 0.75 : 1;\nconst LOW_PRIORITY_QUALITY = 0.75;\nconst HIGH_PRIORITY_MAX_FPS = 60;\nconst LOW_PRIORITY_MAX_FPS = 30;\nconst HIGH_PRIORITY_CACHE_MODULO = IS_SAFARI ? 2 : 4;\nconst LOW_PRIORITY_CACHE_MODULO = 0;\n\nconst workers = new Array(MAX_WORKERS).fill(undefined).map(\n () => new WorkerConnector(new Worker(new URL('./rlottie.worker.ts', import.meta.url))),\n);\nlet lastWorkerIndex = -1;\n\nclass RLottie {\n // Config\n\n private imgSize!: number;\n\n private key!: string;\n\n private msPerFrame!: number;\n\n private reduceFactor!: number;\n\n private cacheModulo!: number;\n\n private chunkSize!: number;\n\n private workerIndex!: number;\n\n private chunks: Chunks = [];\n\n private framesCount?: number;\n\n private chunksCount?: number;\n\n // Container\n\n private canvas = document.createElement('canvas');\n\n private ctx = this.canvas.getContext('2d')!;\n\n // State\n\n private isAnimating = false;\n\n private isWaiting = true;\n\n private isOnLoadFired = false;\n\n private isDestroyed = false;\n\n private approxFrameIndex = 0;\n\n private prevFrameIndex = -1;\n\n private stopFrameIndex? = 0;\n\n private speed = 1;\n\n private direction: 1 | -1 = 1;\n\n private lastRenderAt?: number;\n\n constructor(\n private id: string,\n private container: HTMLDivElement,\n private animationData: AnyLiteral,\n private params: Params = {},\n private onLoad?: () => void,\n private customColor?: [number, number, number],\n private onEnded?: (isDestroyed?: boolean) => void,\n ) {\n this.initContainer();\n this.initConfig();\n this.initRenderer();\n }\n\n isPlaying() {\n return this.isAnimating || this.isWaiting;\n }\n\n play() {\n this.stopFrameIndex = undefined;\n this.direction = 1;\n this.doPlay();\n }\n\n pause() {\n if (this.isWaiting) {\n this.stopFrameIndex = this.approxFrameIndex;\n } else {\n this.isAnimating = false;\n }\n\n const currentChunkIndex = this.getChunkIndex(this.approxFrameIndex);\n this.chunks = this.chunks.map((chunk, i) => (i === currentChunkIndex ? chunk : undefined));\n }\n\n goToAndPlay(frameIndex: number) {\n this.approxFrameIndex = Math.floor(frameIndex / this.reduceFactor);\n this.stopFrameIndex = undefined;\n this.direction = 1;\n this.doPlay();\n }\n\n goToAndStop(frameIndex: number) {\n this.approxFrameIndex = Math.floor(frameIndex / this.reduceFactor);\n this.stopFrameIndex = Math.floor(frameIndex / this.reduceFactor);\n this.direction = 1;\n this.doPlay();\n }\n\n playSegment([startFrameIndex, stopFrameIndex]: [number, number]) {\n this.approxFrameIndex = Math.floor(startFrameIndex / this.reduceFactor);\n this.stopFrameIndex = Math.floor(stopFrameIndex / this.reduceFactor);\n this.direction = startFrameIndex < stopFrameIndex ? 1 : -1;\n this.doPlay();\n }\n\n setSpeed(speed: number) {\n this.speed = speed;\n }\n\n destroy() {\n this.isDestroyed = true;\n this.pause();\n this.destroyRenderer();\n this.destroyContainer();\n }\n\n private initContainer() {\n if (!(this.container.parentNode instanceof HTMLElement)) {\n throw new Error('[RLottie] Container is not mounted');\n }\n\n let { size } = this.params;\n\n if (!size) {\n size = (\n this.container.offsetWidth\n || parseInt(this.container.style.width, 10)\n || this.container.parentNode.offsetWidth\n );\n\n if (!size) {\n throw new Error('[RLottie] Failed to detect width from container');\n }\n }\n\n this.canvas.style.width = `${size}px`;\n this.canvas.style.height = `${size}px`;\n\n const { isLowPriority, quality = isLowPriority ? LOW_PRIORITY_QUALITY : HIGH_PRIORITY_QUALITY } = this.params;\n // Reduced quality only looks acceptable on high DPR screens\n const imgSize = Math.round(size * Math.max(DPR * quality, 1));\n\n this.canvas.width = imgSize;\n this.canvas.height = imgSize;\n\n this.container.appendChild(this.canvas);\n\n this.imgSize = imgSize;\n }\n\n private initConfig() {\n this.key = `${this.id}_${this.imgSize}`;\n\n const { isLowPriority } = this.params;\n\n const maxFps = isLowPriority ? LOW_PRIORITY_MAX_FPS : HIGH_PRIORITY_MAX_FPS;\n const sourceFps = this.animationData.fr || maxFps;\n this.reduceFactor = sourceFps % maxFps === 0 ? sourceFps / maxFps : 1;\n this.msPerFrame = 1000 / (sourceFps / this.reduceFactor);\n this.cacheModulo = isLowPriority ? LOW_PRIORITY_CACHE_MODULO : HIGH_PRIORITY_CACHE_MODULO;\n this.chunkSize = CHUNK_SIZE;\n }\n\n private destroyContainer() {\n this.canvas.remove();\n }\n\n private onChangeData(framesCount: number) {\n this.isWaiting = false;\n this.framesCount = framesCount;\n this.chunksCount = Math.ceil(framesCount / this.chunkSize);\n this.isAnimating = false;\n\n this.doPlay();\n }\n\n setColor(newColor: [number, number, number] | undefined) {\n this.customColor = newColor;\n if (this.customColor) {\n const imageData = this.ctx.getImageData(0, 0, this.imgSize, this.imgSize);\n const arr = imageData.data;\n for (let i = 0; i < arr.length; i += 4) {\n /* eslint-disable prefer-destructuring */\n arr[i] = this.customColor[0];\n arr[i + 1] = this.customColor[1];\n arr[i + 2] = this.customColor[2];\n /* eslint-enable prefer-destructuring */\n }\n this.ctx.putImageData(imageData, 0, 0);\n }\n }\n\n changeData(animationData: AnyLiteral) {\n this.pause();\n this.animationData = animationData;\n this.initConfig();\n\n workers[this.workerIndex].request({\n name: 'changeData',\n args: [\n this.key,\n this.animationData,\n this.onChangeData.bind(this),\n ],\n });\n }\n\n private initRenderer() {\n this.workerIndex = cycleRestrict(MAX_WORKERS, ++lastWorkerIndex);\n\n workers[this.workerIndex].request({\n name: 'init',\n args: [\n this.key,\n this.animationData,\n this.imgSize,\n this.params.isLowPriority,\n this.reduceFactor,\n this.onRendererInit.bind(this),\n ],\n });\n }\n\n private destroyRenderer() {\n workers[this.workerIndex].request({\n name: 'destroy',\n args: [this.key],\n });\n }\n\n private onRendererInit(framesCount: number) {\n this.framesCount = framesCount;\n this.chunksCount = Math.ceil(framesCount / this.chunkSize);\n\n if (this.isWaiting) {\n this.doPlay();\n }\n }\n\n private doPlay() {\n if (!this.framesCount) {\n return;\n }\n\n if (this.isDestroyed) {\n return;\n }\n\n if (this.isAnimating) {\n return;\n }\n\n if (!this.isWaiting) {\n this.lastRenderAt = undefined;\n }\n\n this.isAnimating = true;\n this.isWaiting = false;\n\n animate(() => {\n if (this.isDestroyed) {\n return false;\n }\n\n // Paused from outside\n if (!this.isAnimating && this.isOnLoadFired) {\n return false;\n }\n\n const frameIndex = Math.round(this.approxFrameIndex);\n const chunkIndex = this.getChunkIndex(frameIndex);\n const chunk = this.chunks[chunkIndex];\n\n if (!chunk || chunk.length === 0) {\n this.requestChunk(chunkIndex);\n this.isAnimating = false;\n this.isWaiting = true;\n return false;\n }\n\n if (this.cacheModulo && chunkIndex % this.cacheModulo === 0) {\n this.cleanupPrevChunk(chunkIndex);\n }\n\n this.requestNextChunk(chunkIndex);\n\n if (frameIndex !== this.prevFrameIndex) {\n const frame = this.getFrame(frameIndex);\n if (!frame) {\n this.isAnimating = false;\n this.isWaiting = true;\n return false;\n }\n\n const arr = new Uint8ClampedArray(frame);\n if (this.customColor) {\n for (let i = 0; i < arr.length; i += 4) {\n /* eslint-disable prefer-destructuring */\n arr[i] = this.customColor[0];\n arr[i + 1] = this.customColor[1];\n arr[i + 2] = this.customColor[2];\n /* eslint-enable prefer-destructuring */\n }\n }\n const imageData = new ImageData(arr, this.imgSize, this.imgSize);\n this.ctx.putImageData(imageData, 0, 0);\n\n if (this.onLoad && !this.isOnLoadFired) {\n this.isOnLoadFired = true;\n this.onLoad();\n }\n\n this.prevFrameIndex = frameIndex;\n }\n\n const now = Date.now();\n const currentSpeed = this.lastRenderAt ? this.msPerFrame / (now - this.lastRenderAt) : 1;\n const delta = Math.min(1, (this.direction * this.speed) / currentSpeed);\n const expectedNextFrameIndex = Math.round(this.approxFrameIndex + delta);\n\n this.lastRenderAt = now;\n\n // Forward animation finished\n if (delta > 0 && (frameIndex === this.framesCount! - 1 || expectedNextFrameIndex > this.framesCount! - 1)) {\n if (this.params.noLoop) {\n this.isAnimating = false;\n this.onEnded?.();\n return false;\n }\n\n this.approxFrameIndex = 0;\n\n // Backward animation finished\n } else if (delta < 0 && (frameIndex === 0 || expectedNextFrameIndex < 0)) {\n if (this.params.noLoop) {\n this.isAnimating = false;\n this.onEnded?.();\n return false;\n }\n\n this.approxFrameIndex = this.framesCount! - 1;\n\n // Stop frame reached\n } else if (\n this.stopFrameIndex !== undefined\n && (frameIndex === this.stopFrameIndex\n || (\n (delta > 0 && expectedNextFrameIndex > this.stopFrameIndex)\n || (delta < 0 && expectedNextFrameIndex < this.stopFrameIndex)\n ))\n ) {\n this.stopFrameIndex = undefined;\n this.isAnimating = false;\n return false;\n\n // Preparing next frame\n } else {\n this.approxFrameIndex += delta;\n }\n\n const nextFrameIndex = Math.round(this.approxFrameIndex);\n\n if (!this.getFrame(nextFrameIndex)) {\n this.requestChunk(this.getChunkIndex(nextFrameIndex));\n this.isWaiting = true;\n this.isAnimating = false;\n return false;\n }\n\n return true;\n });\n }\n\n private getFrame(frameIndex: number) {\n const chunkIndex = this.getChunkIndex(frameIndex);\n const indexInChunk = this.getFrameIndexInChunk(frameIndex);\n const chunk = this.chunks[chunkIndex];\n if (!chunk) {\n return undefined;\n }\n\n return chunk[indexInChunk];\n }\n\n private getFrameIndexInChunk(frameIndex: number) {\n const chunkIndex = this.getChunkIndex(frameIndex);\n return frameIndex - chunkIndex * this.chunkSize;\n }\n\n private getChunkIndex(frameIndex: number) {\n return Math.floor(frameIndex / this.chunkSize);\n }\n\n private requestChunk(chunkIndex: number) {\n if (this.chunks[chunkIndex] && this.chunks[chunkIndex]?.length !== 0) {\n return;\n }\n\n this.chunks[chunkIndex] = [];\n\n const fromIndex = chunkIndex * this.chunkSize;\n const toIndex = Math.min(fromIndex + this.chunkSize - 1, this.framesCount! - 1);\n\n workers[this.workerIndex].request({\n name: 'renderFrames',\n args: [this.key, fromIndex, toIndex, this.onFrameLoad.bind(this)],\n });\n }\n\n private cleanupPrevChunk(chunkIndex: number) {\n if (this.chunksCount! < 3) {\n return;\n }\n\n const prevChunkIndex = cycleRestrict(this.chunksCount!, chunkIndex - 1);\n this.chunks[prevChunkIndex] = undefined;\n }\n\n private requestNextChunk(chunkIndex: number) {\n if (this.chunksCount === 1) {\n return;\n }\n\n const nextChunkIndex = cycleRestrict(this.chunksCount!, chunkIndex + 1);\n\n if (!this.chunks[nextChunkIndex]) {\n this.requestChunk(nextChunkIndex);\n }\n }\n\n private onFrameLoad(frameIndex: number, arrayBuffer: ArrayBuffer) {\n const chunkIndex = this.getChunkIndex(frameIndex);\n const chunk = this.chunks[chunkIndex];\n // Frame can be skipped and chunk can be already cleaned up\n if (!chunk) {\n return;\n }\n\n chunk[this.getFrameIndexInChunk(frameIndex)] = arrayBuffer;\n\n if (this.isWaiting) {\n this.doPlay();\n }\n }\n}\n\nexport default RLottie;\n","export default function cycleRestrict(length: number, index: number) {\n return index - Math.floor(index / length) * length;\n}\n"],"names":["WorkerConnector","constructor","worker","Map","this","subscribe","request","messageData","requestStates","requestStatesByCallback","messageId","generateIdFor","payload","type","requestState","promise","Promise","resolve","reject","Object","assign","args","length","callback","pop","set","catch","finally","delete","postMessage","cancelCallback","progressCallback","isCanceled","get","addEventListener","data","error","response","callbackArgs","Error","message","HIGH_PRIORITY_QUALITY","IS_SINGLE_COLUMN_LAYOUT","LOW_PRIORITY_QUALITY","HIGH_PRIORITY_CACHE_MODULO","IS_SAFARI","workers","Array","fill","undefined","map","Worker","URL","lastWorkerIndex","id","container","animationData","params","onLoad","customColor","onEnded","document","createElement","canvas","getContext","initContainer","initConfig","initRenderer","isPlaying","isAnimating","isWaiting","play","stopFrameIndex","direction","doPlay","pause","approxFrameIndex","currentChunkIndex","getChunkIndex","chunks","chunk","i","goToAndPlay","frameIndex","Math","floor","reduceFactor","goToAndStop","playSegment","startFrameIndex","setSpeed","speed","destroy","isDestroyed","destroyRenderer","destroyContainer","parentNode","HTMLElement","size","offsetWidth","parseInt","style","width","height","isLowPriority","quality","imgSize","round","max","DPR","appendChild","key","maxFps","sourceFps","fr","msPerFrame","cacheModulo","chunkSize","remove","onChangeData","framesCount","chunksCount","ceil","setColor","newColor","imageData","ctx","getImageData","arr","putImageData","changeData","workerIndex","name","bind","cycleRestrict","onRendererInit","lastRenderAt","animate","isOnLoadFired","chunkIndex","requestChunk","cleanupPrevChunk","requestNextChunk","prevFrameIndex","frame","getFrame","Uint8ClampedArray","ImageData","now","Date","currentSpeed","delta","min","expectedNextFrameIndex","noLoop","nextFrameIndex","indexInChunk","getFrameIndexInChunk","fromIndex","toIndex","onFrameLoad","prevChunkIndex","nextChunkIndex","arrayBuffer","index"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index 244150a51..30928b075 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.14caf56e367ebee7bda8.js b/dist/main.14caf56e367ebee7bda8.js deleted file mode 100644 index 0f4669a53..000000000 --- a/dist/main.14caf56e367ebee7bda8.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,r,o,d,a={1226:(e,t,n)=>{n.d(t,{t9:()=>c,u3:()=>l,g8:()=>i});var r=n(3716),o=n(6926),d=n(9118);let a;const u=new Map,s=new Map;function i(e,t){return a||(r.eM&&console.log(">>> START LOAD WORKER"),a=new Worker(new URL(n.p+n.u(626),n.b)),function(e){a.addEventListener("message",(({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=u.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){var n,r;null===(n=u.get(t.messageId))||void 0===n||null===(r=n.callback)||void 0===r||r.call(n,...t.callbackArgs)}else if("unhandledError"===t.type){var o;throw new Error(null===(o=t.error)||void 0===o?void 0:o.message)}}))}(e),"iOS"===t.platform&&window.addEventListener("focus",(async()=>{try{await Promise.race([f({type:"ping"}),(0,d.wO)(150).then((()=>Promise.reject(new Error("HEALTH_CHECK_TIMEOUT"))))])}catch(e){console.error(e),Date.now()-h>=5e3&&window.location.reload()}}))),f({type:"initApi",args:[t]})}function c(e,...t){if(!a)return void(r.eM&&console.warn("API is not initialized"));const n=f({type:"callMethod",name:e,args:t});return r.eM&&(async()=>{try{await n}catch(e){}})(),n}function l(e){e.isCanceled=!0;const{messageId:t}=s.get(e)||{};t&&a.postMessage({type:"cancelProgress",messageId:t})}function f(e){const t=(0,o.Z)(u),n={messageId:t,...e},r={messageId:t},d=new Promise(((e,t)=>{Object.assign(r,{resolve:e,reject:t})}));if("args"in n&&"function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,s.set(e,r)}return u.set(t,r),d.catch((()=>{})).finally((()=>{u.delete(t),r.callback&&s.delete(r.callback)})),a.postMessage(n),d}const h=Date.now()},6137:(e,t,n)=>{n.d(t,{Vv:()=>r.Vv,_f:()=>r._f,_Q:()=>r._Q,IU:()=>o.I});var r=n(4746),o=n(9077)},9077:(e,t,n)=>{let r;n.d(t,{I:()=>r}),function(e){e[e.BlobUrl=0]="BlobUrl",e[e.Lottie=1]="Lottie",e[e.Progressive=2]="Progressive",e[e.Stream=3]="Stream"}(r||(r={}))},4746:(e,t,n)=>{let r;n.d(t,{Vv:()=>r,_f:()=>o,_Q:()=>d}),function(e){e.Bold="MessageEntityBold",e.Blockquote="MessageEntityBlockquote",e.BotCommand="MessageEntityBotCommand",e.Cashtag="MessageEntityCashtag",e.Code="MessageEntityCode",e.Email="MessageEntityEmail",e.Hashtag="MessageEntityHashtag",e.Italic="MessageEntityItalic",e.MentionName="MessageEntityMentionName",e.Mention="MessageEntityMention",e.Phone="MessageEntityPhone",e.Pre="MessageEntityPre",e.Strike="MessageEntityStrike",e.TextUrl="MessageEntityTextUrl",e.Url="MessageEntityUrl",e.Underline="MessageEntityUnderline",e.Unknown="MessageEntityUnknown"}(r||(r={}));const o=-1,d="MESSAGE_DELETED"},88:(e,t,n)=>{n.d(t,{Z:()=>h});var r=n(4050),o=n(5116);const d=36,a=2147483647;function u(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=d)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function s(e,t){const n=[],r=[],o=e.length;let s,i,c,l,f,h,m,p,g,y,v,b,w;for(s=128,c=0,l=72,f=e.lastIndexOf("-"),f<0&&(f=0),h=0;h=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(h))}for(m=f>0?f+1:0;m=o)throw RangeError("punycode_bad_input(1)");if(v=(I=e.charCodeAt(m++))-48<10?I-22:I-65<26?I-65:I-97<26?I-97:d,v>=d)throw RangeError("punycode_bad_input(2)");if(v>Math.floor((a-c)/g))throw RangeError("punycode_overflow(1)");if(c+=v*g,b=y<=l?1:y>=l+26?26:y-l,vMath.floor(a/(d-b)))throw RangeError("punycode_overflow(2)");g*=d-b}if(i=n.length+1,l=u(c-p,i,0===p),Math.floor(c/i)>a-s)throw RangeError("punycode_overflow(3)");s+=Math.floor(c/i),c%=i,t&&r.splice(c,0,e.charCodeAt(m-1)-65<26),n.splice(c,0,s),c++}var I;if(t)for(c=0,w=n.length;c{const t=[];let n=0;const r=e.length;let o;for(;n65535&&(o-=65536,t.push(String.fromCharCode(o>>>10&1023|55296)),o=56320|1023&o),t.push(String.fromCharCode(o))}return t.join("")})(n)}var i=n(3716),c=n(6752),l=n(1396);function f(e){if(!e)return;const t=(0,l.X)(e);if(t)try{let e=decodeURI(t);const n=e.match(/^https?:\/\/([^/:?#]+)(?:[/:?#]|$)/i);if(!n)return;const r=n[1];return e=e.replace(r,function(e){const t=e.split("."),n=[];for(let e=0;e{const{toggleSafeLinkModal:u,openTelegramLink:s}=(0,o.uC)(),h=d||t,m=e!==h,p=(0,r.I4)((t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.FS)&&!e.match(i.g$)?!m||(u({url:e}),t.preventDefault(),!1):(t.preventDefault(),s({url:e}),!1)),[m,s,u,e]);if(!e)return;const g=(0,c.Z)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.ZP.createElement("a",{href:(0,l.X)(e),title:f(e),target:"_blank",rel:"noopener noreferrer",className:g,onClick:p,dir:a?"rtl":"auto"},h)}))},5376:(e,t,n)=>{n.d(t,{yW:()=>r,K2:()=>o,mD:()=>d,Oh:()=>a,v6:()=>u});function r(e){return e>536870912?`${(e/1073741824).toFixed(1)} GB`:e>524288?`${(e/1048576).toFixed(1)} MB`:`${(e/1024).toFixed(1)} KB`}function o(e){const{fileName:t,mimeType:n}=e;return d(t,n)}function d(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function a(e){switch(e){case"apk":case"xls":case"xlsx":return"green";case"zip":case"rar":case"7z":case"tar":case"gz":case"ppt":case"pptx":return"orange";case"pdf":case"xps":return"red";default:return"default"}}function u(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},4784:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(3681);const o=new RegExp(`^(?:${r.Z.source})+$`,""),d=e=>{if(e.length>24)return!1;if(!Boolean(e.match(o)))return!1;let t=0;for(;r.Z.exec(e);)if(t++,t>3)return r.Z.lastIndex=0,!1;return t}},8005:(e,t,n)=>{n.d(t,{D:()=>p});var r=n(4050),o=n(2858),d=n(8035),a=n(9937),u=n(2340),s=n(6752),i=n(8033),c=n(5116);const l=({className:e,sender:t,children:n})=>{const{openUserInfo:o}=(0,c.uC)(),d=(0,r.I4)((()=>{t&&o({id:t.id})}),[t,o]);return t?r.ZP.createElement(i.Z,{className:(0,s.Z)("UserLink",e),onClick:d},n):n},f=({className:e,message:t,children:n})=>{const{focusMessage:o}=(0,c.uC)(),d=(0,r.I4)((()=>{t&&o({chatId:t.chatId,messageId:t.id})}),[o,t]);return t?r.ZP.createElement(i.Z,{className:(0,s.Z)("MessageLink",e),onClick:d},n):n},h=({className:e,chatId:t,children:n})=>{const{openChat:o}=(0,c.uC)(),d=(0,r.I4)((()=>{t&&o({id:t})}),[t,o]);return t?r.ZP.createElement(i.Z,{className:(0,s.Z)("ChatLink",e),onClick:d},n):n},m=({className:e,groupCall:t,children:n})=>{const{joinGroupCall:o}=(0,c.uC)(),d=(0,r.I4)((()=>{t&&o({id:t.id,accessHash:t.accessHash})}),[t,o]);return t?r.ZP.createElement(i.Z,{className:(0,s.Z)("GroupCallLink",e),onClick:d},n):n};function p(e,t,n,s,i,c,l={}){if(!t.content.action)return[];const{text:p,translationValues:v,amount:b,currency:w,call:I}=t.content.action,C=[],S={...l,maxTextLength:32};let E,P=e("Chat.Service.Group.UpdatedPinnedMessage1"!==p||i?p:"Message.PinnedGenericMessage",v&&v.length?v:void 0);return P.includes("%payment_amount%")&&(E=y(P,"%payment_amount%",(0,a.x)(b,w,e.code)),P=E.pop(),C.push(...E)),E=y(P,"%action_origin%",n?!l.isEmbedded&&function(e,t,n){return(0,o.YC)(t.id)?g(t,n):function(e,t,n){const a=(0,d.Z)((0,o.U)(e,t));return n?a:r.ZP.createElement(h,{className:"action-link",chatId:t.id},t&&(0,u.Z)(a))}(e,t,n)}(e,n,l.asPlain)||" ":"User"),P=E.pop(),C.push(...E),E=y(P,"%target_user%",s?s.map((e=>g(e,l.asPlain))).filter(Boolean):"User"),P=E.pop(),C.push(...E),E=y(P,"%message%",i?function(e,t,n={}){const a=(0,o.MK)(e,t),{photo:s,video:i,document:c,sticker:l}=(0,o.qp)(t),{maxTextLength:h,isEmbedded:m,asPlain:p}=n,g=m&&a&&!s&&!i&&!c&&!l;let y=(0,d.Z)(a,h);return m&&(s?y="a photo":i?y=i.isGif?"a GIF":"a video":c?y="a document":l&&(y=a)),p?g?`«${y}»`:y:g?r.ZP.createElement("span",null,"«",r.ZP.createElement(f,{className:"action-link",message:t},(0,u.Z)(y)),"»"):r.ZP.createElement(f,{className:"action-link",message:t},(0,u.Z)(y))}(e,i,S):"a message"),P=E.pop(),C.push(...E),E=y(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=y(P,"%target_chat%",c?function(e,t){const n="another chat";return t?n:r.ZP.createElement(h,{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(m,{groupCall:e},t)}(I,C):C}function g(e,t){const n=(0,d.Z)((0,o.Js)(e));return t?n:r.ZP.createElement(l,{className:"action-link",sender:e},e&&(0,u.Z)(n))}function y(e,t,n){const r=e.indexOf(t);if(r<0||!n)return[e];const o=[];return o.push(e.substring(0,r)),Array.isArray(n)?n.forEach(((e,t)=>{o.push(e),t+1{n.d(t,{Z:()=>h});var r=n(4050),o=n(3681),d=n(3716),a=n(7361),u=n(4284),s=n(6752),i=n(7373),c=n(88);const l=/^[\d\wа-яё]$/i,f=/(\*\*|__).+?\1/g;function h(e,t=["emoji"],n){return"string"!=typeof e?[e]:t.reduce(((e,t)=>{switch(t){case"escape_html":return function(e){const t=document.createElement("div");return e.reduce(((e,n)=>"string"!=typeof n?(e.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,a=n.highlight,d.reduce(((e,t)=>{if("string"!=typeof t||!a)return e.push(t),e;const n=t.toLowerCase(),o=n.indexOf(a.toLowerCase()),d=n[o+a.length];if(o<0||d&&d.match(l))return e.push(t),e;const u=[];return u.push(t.substring(0,o)),u.push(r.ZP.createElement("span",{className:"matching-text-highlight"},t.substring(o,o+a.length))),u.push(t.substring(o+a.length)),[...e,...u]}),[]);case"links":return function(e){return e.reduce(((e,t)=>{if("string"!=typeof t)return e.push(t),e;const n=t.match(g);if(!n||!n.length)return e.push(t),e;const o=[];let d=n.shift(),a=0;for(;d;){const e=t.indexOf(d,a);o.push(t.substring(a,e)),d.startsWith("@")?o.push(r.ZP.createElement(i.Z,{username:d},d)):(d.endsWith("?")&&(d=d.slice(0,d.length-1)),o.push(r.ZP.createElement(c.Z,{text:d,url:d}))),a=e+d.length,d=n.shift()}return o.push(t.substring(a)),[...e,...o]}),[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,a;return e}),[e])}function m(e,t,n){return a.op?e:e.reduce(((e,d)=>{if("string"!=typeof d)return e.push(d),e;const a=(d=(0,u.g6)(d)).split(o.Z),i=d.match(o.Z)||[];return e.push(a[0]),i.reduce(((e,d,i)=>{const c=(0,u.U_)((0,o.l)(d));if(!c)return e;const l=(0,s.Z)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(r.ZP.createElement("img",{className:l,src:`./img-apple-${"big"===t?"160":"64"}/${c}.png`,alt:d})),"html"===n&&e.push(`${d}`);const f=2*i+2;return a[f]&&e.push(a[f]),e}),e)}),[])}function p(e,t){return e.reduce(((e,n)=>{if("string"!=typeof n)return e.push(n),e;const o=n.split(/\r\n|\r|\n/g).reduce(((e,n,o,d)=>{const a=n.trimLeft(),u=n.length-a.length;return e.push(String.fromCharCode(160).repeat(u)+a),o!==d.length-1&&e.push("jsx"===t?r.ZP.createElement("br",null):"
"),e}),[]);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 a=2*d+2;return o[a]&&e.push(o[a]),e}),e)}),[])}},386:(e,t,n)=>{n.d(t,{q:()=>d,b:()=>a});var r=n(3716),o=n(7361);function d(e,t=!1){o.cj||!document.activeElement||document.activeElement.id!==r.R2||!t&&e.target!==e.currentTarget||e.preventDefault()}function a(e){d(e,!0)}},7373:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(5116),d=n(1638);const a=(0,o.c$)(((e,{userId:t})=>({userOrChat:t?(0,d.dy)(e,t):void 0})))((({username:e,userOrChat:t,children:n})=>{const{openChat:d,openChatByUsername:a}=(0,o.uC)();return r.ZP.createElement("a",{onClick:()=>{t?d({id:t.id}):e&&a({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n)}))},231:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(6752),d=n(9204),a=n(8512);const u=({ref:e,type:t="button",onClick:n,onContextMenu:u,onMouseDown:s,onMouseEnter:i,onMouseLeave:c,onFocus:l,children:f,size:h="default",color:m="primary",backgroundImage:p,className:g,round:y,pill:v,fluid:b,isText:w,isLoading:I,ariaLabel:C,href:S,download:E,disabled:P,ripple:M,faded:A,tabIndex:k,isRtl:T,withClickPropagation:N})=>{let L=(0,r.sO)(null);e&&(L=e);const[R,D]=(0,r.eJ)(!1),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(a.Z,null)):r.ZP.createElement("button",{ref:L,type:t,className:O,onClick:Z,onContextMenu:u,onMouseDown:x,onMouseEnter:i&&!P?i:void 0,onMouseLeave:c&&!P?c:void 0,onFocus:l&&!P?l:void 0,"aria-label":C,title:C,tabIndex:k,dir:T?"rtl":void 0,style:p?`background-image: url(${p})`:void 0},I?r.ZP.createElement("div",null,r.ZP.createElement("span",{dir:T?"auto":void 0},"Please wait..."),r.ZP.createElement(d.Z,{color:w?"blue":"white"})):f,!P&&M&&r.ZP.createElement(a.Z,null))}},4605:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(4050),o=n(6752),d=n(9107),a=n(2340),u=n(9204);const s=(0,r.X$)((({id:e,name:t,value:n,label:s,subLabel:i,checked:c,disabled:l,round:f,blocking:h,isLoading:m,onChange:p,onCheck:g})=>{const y=(0,d.Z)(),v=(0,r.I4)((e=>{p&&p(e),g&&g(e.currentTarget.checked)}),[p,g]),b=(0,o.Z)("Checkbox",l&&"disabled",f&&"round",m&&"loading",h&&"blocking");return r.ZP.createElement("label",{className:b,dir:y.isRtl?"rtl":void 0},r.ZP.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:c,disabled:l,onChange:v}),r.ZP.createElement("div",{className:"Checkbox-main"},r.ZP.createElement("span",{className:"label",dir:"auto"},(0,a.Z)(s)),i&&r.ZP.createElement("span",{className:"subLabel",dir:"auto"},(0,a.Z)(i))),m&&r.ZP.createElement(u.Z,null))}))},3106:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(2328);const d=({trigger:e,className:t,children:n,positionX:d="left",positionY:a="top",footer:u,forceOpen:s,onOpen:i,onClose:c})=>{const l=(0,r.sO)(null),f=(0,r.sO)(null),[h,m]=(0,r.eJ)(!1);return r.ZP.createElement("div",{ref:f,className:`DropdownMenu ${t||""}`,onKeyDown:e=>{const t=l.current;if(!h||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{m(!h),h?c&&c():i&&i()},isOpen:h}),r.ZP.createElement(o.Z,{ref:l,containerRef:f,isOpen:h||!!s,className:t||"",positionX:d,positionY:a,footer:u,autoClose:!0,onClose:()=>{m(!1),c&&c()},shouldSkipTransition:s},n))}},7687:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(6752),d=n(9107);const a=(0,r.X$)((({ref:e,id:t,className:n,value:a,label:u,error:s,success:i,disabled:c,readOnly:l,placeholder:f,autoComplete:h,inputMode:m,maxLength:p,onChange:g,onInput:y,onKeyPress:v,onKeyDown:b,onBlur:w,onPaste:I})=>{const C=(0,d.Z)(),S=s||i||u,E=(0,o.Z)("input-group",a&&"touched",s?"error":i&&"success",c&&"disabled",l&&"disabled",S&&"with-label",n);return r.ZP.createElement("div",{className:E,dir:C.isRtl?"rtl":void 0},r.ZP.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:a||"",placeholder:f,maxLength:p,autoComplete:h,inputMode:m,disabled:c,readOnly:l,onChange:g,onInput:y,onKeyPress:v,onKeyDown:b,onBlur:w,onPaste:I}),S&&r.ZP.createElement("label",{htmlFor:t},S))}))},8033:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=({children:e,className:t,isRtl:n,onClick:d})=>{const a=(0,r.I4)((e=>{e.preventDefault(),d(e)}),[d]);return r.ZP.createElement("a",{href:"#",className:(0,o.Z)("Link",t),dir:n?"rtl":"auto",onClick:d?a:void 0},e)}},4288:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(9204);const d=(0,r.X$)((({color:e="blue"})=>r.ZP.createElement("div",{className:"Loading"},r.ZP.createElement(o.Z,{color:e,withBackground:"white"===e}))))},2328:(e,t,n)=>{n.d(t,{Z:()=>h});var r=n(4050),o=n(1212),d=n(2313),a=n(8758),u=n(274),s=n(3989),i=n(6752),c=n(8674),l=n(6590),f=n(386);const h=({ref:e,containerRef:t,isOpen:n,className:h,style:m,menuStyle:p,children:g,positionX:y="left",positionY:v="top",autoClose:b=!1,footer:w,noCloseOnBackdrop:I=!1,onCloseAnimationEnd:C,onClose:S,onMouseEnter:E,onMouseLeave:P,shouldSkipTransition:M})=>{let A=(0,r.sO)(null);e&&(A=e);const k=t||A,{transitionClassNames:T}=(0,o.Z)(n,C,M,void 0,M);(0,r.d4)((()=>n&&S?(0,s.Z)(S):void 0),[n,S]),(0,l.ZP)(n,S,void 0,void 0,b),(0,u.Z)((([e])=>{void 0!==e&&(0,c.YW)(200)}),[n]);const N=(0,d.Z)(A,n,b?S:void 0,void 0,!0);(0,a.Z)(n,k,I?void 0:S);const L=(0,i.Z)("bubble menu-container custom-scroll",v,y,w&&"with-footer",T);return r.ZP.createElement("div",{className:(0,i.Z)("Menu no-selection",h),onKeyDown:n?N:void 0,onMouseEnter:E,onMouseLeave:n?P:void 0,style:m},n&&r.ZP.createElement("div",{className:"backdrop",onMouseDown:f.b}),r.ZP.createElement("div",{ref:A,className:L,style:`transform-origin: ${v} ${y};${p||""}`,onClick:b?S:void 0},g,w&&r.ZP.createElement("div",{className:"footer"},w)))}},8964:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(6752),d=n(9107);const a=e=>{const{icon:t,className:n,children:a,onClick:u,href:s,download:i,disabled:c,destructive:l,ariaLabel:f}=e,h=(0,d.Z)(),m=(0,r.I4)((e=>{if(c||!u)return e.stopPropagation(),void e.preventDefault();u(e)}),[c,u]),p=(0,r.I4)((e=>{if(13===e.keyCode||32===e.keyCode)return c||!u?(e.stopPropagation(),void e.preventDefault()):void u(e)}),[c,u]),g=(0,o.Z)("MenuItem",n,c&&"disabled",l&&"destructive"),y=r.ZP.createElement(r.ZP.Fragment,null,t&&r.ZP.createElement("i",{className:`icon-${t}`,"data-char":t.startsWith("char-")?t.replace("char-",""):void 0}),a);return s?r.ZP.createElement("a",{tabIndex:0,className:g,href:s,download:i,"aria-label":f,title:f,target:s.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer",dir:h.isRtl?"rtl":void 0,onClick:u},y):r.ZP.createElement("div",{role:"button",tabIndex:0,className:g,onClick:m,onKeyDown:p,"aria-label":f,title:f,dir:h.isRtl?"rtl":void 0},y)}},8512:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(9118);const d=(0,r.X$)((()=>{const[e,t]=(0,r.eJ)([]),n=(0,r.Ye)((()=>(0,o.Ds)((()=>{t([])}),700,!1)),[]),d=(0,r.I4)((r=>{if(0!==r.button)return;const o=r.currentTarget,d=o.getBoundingClientRect(),a=o.offsetWidth/2;t([...e,{x:r.clientX-d.x-a/2,y:r.clientY-d.y-a/2,size:a}]),requestAnimationFrame((()=>{n()}))}),[e,n]);return r.ZP.createElement("div",{className:"ripple-container",onMouseDown:d},e.map((({x:e,y:t,size:n})=>r.ZP.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`}))))}))},9204:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=({color:e="blue",withBackground:t})=>r.ZP.createElement("div",{className:(0,o.Z)("Spinner",e,t&&"with-background")},r.ZP.createElement("div",null))},3716:(e,t,n)=>{n.d(t,{Ti:()=>r,ou:()=>o,iC:()=>d,Ji:()=>a,eM:()=>u,ZT:()=>s,Cg:()=>i,S:()=>c,b_:()=>l,Vx:()=>f,sd:()=>h,Uh:()=>m,gJ:()=>p,lO:()=>g,Cy:()=>y,lW:()=>v,SG:()=>b,lF:()=>w,fo:()=>I,ee:()=>C,by:()=>S,lo:()=>P,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:()=>j,CX:()=>W,xS:()=>G,b6:()=>V,AR:()=>H,r_:()=>z,o_:()=>Q,R2:()=>K,nY:()=>J,QU:()=>q,jT:()=>Y,_m:()=>X,ks:()=>ee,l3:()=>te,u_:()=>ne,rO:()=>re,AE:()=>oe,AJ:()=>de,fK:()=>ae,V$:()=>ue,bK:()=>se,ck:()=>ie,xn:()=>ce,K7:()=>le,w7:()=>fe,z7:()=>he,qp:()=>me,Q:()=>pe,Mw:()=>ge,DC:()=>ye,Y7:()=>ve,yK:()=>be,K2:()=>we,bM:()=>Ie,ku:()=>Ce,zq:()=>Se,n:()=>Ee,pR:()=>Pe,kU:()=>Me,Y:()=>Ae,Ng:()=>ke,oG:()=>Te,wG:()=>Ne,dI:()=>Le,VC:()=>Re,FM:()=>De,uW:()=>Oe,g$:()=>Ze,FS:()=>xe,FD:()=>_e,aw:()=>Fe,FV:()=>Be,Nf:()=>$e,WS:()=>Ue,DU:()=>je,EG:()=>We,t4:()=>Ge,sR:()=>Ve,$O:()=>He,Bg:()=>ze,vi:()=>Qe,Db:()=>Ke,mU:()=>Je,p3:()=>qe,It:()=>Ye,Vv:()=>Xe,g:()=>et,Hc:()=>tt,EH:()=>nt,Ro:()=>rt,aC:()=>ot,LH:()=>dt});const r="Telegram",o=" [Inactive]",d="Telegram WebZ",a="1.30.2",u=!1,s=!1,i=!1,c="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",l="user_auth",f="GramJs:sessionId",h=!1,m="tt-global-state",p=30,g=5e3,y=!1,v="tt-media",b="tt-media-avatars",w="tt-media-progressive",I="tt-custom-bg",C="tt-lang-packs-v7",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,j=2,W=j,G=16,V=17,H=15,z=1e4,Q=3e3,K="editable-message-text",J="editable-message-text-modal",q=1440,Y=1150,X=1275,ee=925,te=600,ne=950,re=450,oe=1e9,de="0",ae=100,ue=1500,se=250,ie=600,ce=500,le=(Math.round((se+ie)/2),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),13),fe=11,he=160,me=120,pe=64,ge=48,ye=32,ve=64,be=64,we=160,Ie=140,Ce=80,Se=100,Ee="MEMOJI_STICKER",Pe="en",Me=200,Ae=450,ke="video/quicktime",Te=new Set(["image/png","image/gif","image/jpeg"]),Ne=new Set(["video/mp4"]),Le=new Set([...Te,...Ne]),Re="The message is not supported on this version of Telegram.",De="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,63})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",Oe="(@[\\w\\d_-]+)",Ze=/^tg:(\/\/)?([?=&\d\w_-]+)?/gm,xe=/^(?:https?:\/\/)?(?:t\.me\/)/gm,_e=new Set(["AU","BD","CA","CO","EG","HN","IE","IN","JO","MX","MY","NI","NZ","PH","PK","SA","SV","US"]),Fe="777000",Be="1271266957",$e=0,Ue=1,je=10,We=5,Ge=2147483646,Ve="en",He="android",ze=["android","ios","tdesktop","macos"],Qe="TelegramTips",Ke=["ar","pt-br","id","it","ko","ms","pl","es","tr"],Je="https://bugs.telegram.org/?tag_ids=41&sort=time",qe="#A2AF8E",Ye="#0F0F0F",Xe="#0a0a0a8c",et="rgba(90, 110, 70, 0.6)",tt=50,nt=604680,rt=100,ot=100*rt,dt=!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 a,u=!1;const s=(e,t)=>{(0,r.d4)((()=>(u&&e(),document.addEventListener(o,e),document.addEventListener(d,t),()=>{document.removeEventListener(d,t),document.removeEventListener(o,e)})),[t,e])};function i(){return u}function c(e=1e3){function t(){a&&(clearTimeout(a),a=void 0),u=!1,document.dispatchEvent(new Event(d))}return u||(u=!0,document.dispatchEvent(new Event(o))),a&&(clearTimeout(a),a=void 0),a=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),a=n(5116),u=n(782);const s=window.location.hash,i=`${window.location.pathname}${window.location.search}`,c={currentIndex:0,nextStateIndexToReplace:-1,isHistoryAltered:!1,isDisabled:!1,isEdge:!1,currentIndexes:[]},l=()=>{c.isDisabled=!0},f=()=>{c.isEdge&&setTimeout((()=>{c.isEdge=!1}),350)};function h(e,t,n,o,s=!1,l){const f=(0,r.sO)(-1),h=(0,r.sO)(!1),m=(0,d.Z)(e),p=(0,r.sO)(!0),g=(0,r.sO)([]),y=(0,d.Z)(l),v=(0,r.sO)(!1),b=(0,r.I4)(((t=!1)=>{if(l){const e=y||[];if(e.length{const e=++c.currentIndex;c.currentIndexes.push(e),window.history.pushState({index:e,state:o},"",`#${l[l.length-1]}`),g.current.push({index:e,hash:l[l.length-1]})}),0);else{const t=e.length-l.length;if(v.current)v.current=!1;else{if(l.length!==g.current.length&&t>0){const e=g.current[g.current.length-t-1];let n=t;if(e){const t=c.currentIndexes.findIndex((t=>t===e.index));n=c.currentIndexes.length-t-1}c.isHistoryAltered=!0,window.history.go(-n),g.current.splice(g.current.length-t-1,t).forEach((({index:e})=>{c.currentIndexes.splice(c.currentIndexes.indexOf(e),1)}))}l.length>0&&setTimeout((()=>{const e=++c.currentIndex;c.currentIndexes[c.currentIndexes.length-1]=e,window.history.replaceState({index:e,state:o},"",`${i}#${l[l.length-1]}`),g.current[g.current.length-1]={index:e,hash:l[l.length-1]}}),0)}}}else e&&!t&&(p.current=!1,h.current?(h.current=!1,c.currentIndexes.push(f.current)):setTimeout((()=>{const e=++c.currentIndex;c.currentIndexes.push(e),window.history[c.currentIndexes.includes(c.nextStateIndexToReplace-1)&&0!==window.history.state.index&&c.nextStateIndexToReplace===e&&!s?"replaceState":"pushState"]({index:e,state:o},""),f.current=e,s&&(c.nextStateIndexToReplace=c.currentIndex+1)}),0)),!t&&e||p.current||(f.current!==c.currentIndex&&s||(c.isHistoryAltered=!0,window.history.back(),setTimeout((()=>{c.nextStateIndexToReplace=-1}),400)),c.currentIndexes.splice(c.currentIndexes.indexOf(f.current),1),p.current=!0)}),[o,l,e,y,s]);return(0,r.d4)((()=>{const r=e=>{if(c.isHistoryAltered)return void setTimeout((()=>{c.isHistoryAltered=!1}),0);const{index:r}=e.state,o=r||0;try{const r=l?g.current[g.current.length-1].index:f.current,d=c.currentIndexes[c.currentIndexes.indexOf(r)-1];if(c.isDisabled)return;!p.current&&(0===o||o===d)||l&&(0===o||o===d)?(l&&(v.current=!0,g.current.pop()),c.currentIndexes.splice(c.currentIndexes.indexOf(r),1),t&&(c.isEdge&&(0,a.uC)().disableHistoryAnimations(),t(!c.isEdge),p.current=!0)):o===r&&p.current&&n&&!l&&(h.current=!0,c.isEdge&&(0,a.uC)().disableHistoryAnimations(),n(e.state.state))}catch(e){}},o=l?!y||!(0,u.et)(y,l):m!==e;return!c.isDisabled&&o&&b(),window.addEventListener("popstate",r),()=>window.removeEventListener("popstate",r)}),[o,b,l,e,t,n,y,m,s]),{forceClose:()=>b(!0)}}o.cj&&(window.addEventListener("touchstart",(e=>{const t=e.touches[0].pageX;(t<=300||t>=window.innerWidth-300)&&(c.isEdge=!0)})),window.addEventListener("touchend",f),window.addEventListener("popstate",f)),window.history.replaceState({index:c.currentIndex},"",i)},2313:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=(e,t,n,o,d)=>{const[a,u]=(0,r.eJ)(-1);return(0,r.d4)((()=>{u(-1);const n=e.current;t&&n&&!d&&(n.tabIndex=-1,n.focus())}),[e,t,d]),(0,r.I4)((t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(a);if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,s=Array.from(o?r.querySelectorAll(o):r.children);let i=d&&s.indexOf(d)||a;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{n.d(t,{Z:()=>a});var r=n(663),o=n(5326),d=n(9290);const a=()=>{const e=(0,o.Z)();return(0,d.Z)((()=>r.ll(e)),[e]),r.i0}},8778:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(9203),d=n(5326);const a=(e,t,n=!1,a=!1)=>{const u=(0,o.o5)(e,t),s=(0,d.Z)();return a&&(0,o.Qt)(s),(0,r.d4)((()=>{n||u||(0,o.$y)(e,t).then(s)}),[e,s,u,t,n]),u}},9290:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7204);const o=(e,t)=>{const n=(0,r.Z)(t);n&&!t.some(((e,t)=>e!==n[t]))||e(n||[])}},7204:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=function(e,t){const n=(0,r.sO)(),{current:o}=n;return t&&void 0===e||(n.current=e),o}},1212:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=(e=!1,t,n=!1,d="fast",a=!1)=>{const[u,s]=(0,r.eJ)(!e),i=(0,r.sO)(),[c,l]=(0,r.eJ)(e&&n);e?(s(!1),l(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0)):(l(!1),u||i.current||(i.current=window.setTimeout((()=>{s(!0),t&&t(),i.current=void 0}),a?0:350)));const f=c&&!(a&&!e),h=Boolean(i.current),m=e||h;return{shouldRender:m,transitionClassNames:(0,o.Z)(d&&"opacity-transition",d,f&&"open",m&&"shown",h&&"closing")}}},8758:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);function o(e,t,n){(0,r.d4)((()=>{const r=e=>{const r=t.current,o=e.target;r&&o&&(r.contains(e.target)&&!o.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}}),[e,t,n])}},5247:(e,t,n)=>{n.d(t,{Oo:()=>s,xg:()=>i,lQ:()=>h});var r=n(3716);const o=new Set(["scroll","mouseenter","mouseleave"]),d={},a={},u=new Map;function s(e,t,n,r=!1){const o=c(t,e);l(o,e,r)?function(e,t,n){d[e]||(d[e]=0,document.addEventListener(e,m)),function(e){return a[e]||(a[e]=new Map),a[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),d[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){d[e]--,d[e]||document.removeEventListener(e,m),a[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=a[e.type];if(t){let n=!1,r=e.target;const o=()=>{n=!0},d=()=>{e.preventDefault()},a=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?o:"preventDefault"===t?d:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(a),n))return;r=r.parentNode}}}r.eM&&document.addEventListener("dblclick",(()=>{const e=Object.keys(d).length,t=Object.values(d).reduce(((e,t)=>e+t),0),n=Object.keys(a).length,r=Object.values(a).reduce(((e,t)=>e+t.size),0),o=u.size,s=Array.from(u.values()).reduce(((e,t)=>e+t.size),0);console.warn("DELEGATED EVENTS STATS",{delegatedHandlersCount1:t,delegatedHandlersCount2:r,delegatedEventTypesCount:s,delegationRegistriesCount:n,delegationElementsCount:o,documentListenersCount:e})}))},2916:(e,t,n)=>{n.d(t,{Z:()=>y});var r=n(4050),o=n(6926),d=n(3716),a=n(5247);const u=new Set(["key","ref","teactFastList","teactOrderKey"]),s=new Set(["dir","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),f=(0,r.U9)(t);if(o||((0,r.CD)(n,f),(0,r.CD)(t,void 0),"props"in t&&"props"in n&&(n.props.ref=t.props.ref)),(0,r.O_)(t)&&(0,r.O_)(n)){if(w){const t=f,n=e.childNodes["up"===w?c:c+1];n?e.insertBefore(t,n):(b||e).appendChild(t)}o||function(e,t,n){const r=Object.keys(e.props),o=Object.keys(t.props);r.forEach((r=>{const o=e.props[r],d=t.props[r];void 0!==o&&(void 0===d||o!==d&&r.startsWith("on"))&&function(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":"dangerouslySetInnerHTML"===t?e.innerHTML="":t.startsWith("on")?(0,a.xg)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||t.startsWith("aria-")||s.has(t)?e.removeAttribute(t):u.has(t)||delete e[i[t]||t]}(n,r,o)})),o.forEach((r=>{const o=e.props[r],d=t.props[r];void 0!==d&&d!==o&&g(n,r,d)}))}(t,n,f),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 a=0;const u=e.children.reduce(((e,r,d)=>{let u="props"in r?r.props.key:void 0;const s=null!=u;if(s&&!o.has(u))return l(n,r,void 0,t,-1),e;if(!s){const o=t.children[d],a=o&&"props"in o?o.props.key:void 0;if(!o||a)return l(n,r,void 0,t,-1),e;u=`__indexKey#${d}`}return e[u]={$element:r,index:a++,order:"props"in r?r.props.teactOrderKey:void 0},e}),{});let s,i,c=[],f=0;return t.children.forEach(((e,r)=>{const o="props"in e?e.props.key:`__indexKey#${r}`,d=u[o];if(!d)return s||(s=[],i=r),void s.push(e);s&&(c=c.concat(p(s,i,n,t)),i=void 0,s=void 0);const a="props"in e?e.props.teactOrderKey:void 0,h=d.index!==f&&d.order!==a,m=h&&f>d.index;h&&!m||f++,c.push(l(n,d.$element,e,t,r,{forceIndex:!0,...h&&{moveDirection:m?"down":"up"}}))})),s&&(c=c.concat(p(s,i,n,t))),c}(e,t,n);const o=Math.max(e.children.length,t.children.length),a=[],u=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:u}:void 0);o&&a.push(o)}return u&&n.appendChild(u),a}(t,n,o?e:f)}}return n}function f(e,t,n,o){if(!(0,r.op)(e))return e;const{componentInstance:d}=e;if(!d.isMounted){h(e=(0,r.Hb)(d),t,n,o);const a=e.children[0];(0,r.op)(a)&&(e.children=[f(a,e,0,o)]),d.isMounted=!0}return e}function h(e,t,n,r){const{componentInstance:o}=e;o.onUpdate=()=>{t.children[n]=l(r,t.children[n],o.$element,t,n,{skipComponentUpdate:!0})}}function m(e){if((0,r.V2)(e))return document.createTextNode("");if((0,r.iB)(e))return document.createTextNode(e.value);if((0,r.op)(e))return m(e.children[0]);const{tag:t,props:n,children:o=[]}=e,d=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=d),Object.keys(n).forEach((e=>{void 0!==n[e]&&g(d,e,n[e])})),e.children=o.map(((t,n)=>l(d,void 0,t,e,n))),d}function p(e,t,n,r){if(1===e.length)return[l(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const o=document.createDocumentFragment(),d=e.map((e=>l(n,void 0,e,r,t,{fragment:o})));return n.childNodes[t]?n.insertBefore(o,n.childNodes[t]):n.appendChild(o),d}throw new Error("Unexpected input")}function g(e,t,n){"className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:"dangerouslySetInnerHTML"===t?e.innerHTML=n.__html:t.startsWith("on")?(0,a.Oo)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||t.startsWith("aria-")||s.has(t)?e.setAttribute(t,n):u.has(t)||(e[i[t]||t]=n)}const y={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=(0,o.Z)(c),c[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=c[n];r.children=[l(t,r.children[0],e,r,0)]}}},4050:(e,t,n)=>{n.d(t,{V2:()=>f,iB:()=>h,op:()=>p,O_:()=>g,SO:()=>S,k:()=>E,Zb:()=>P,Hb:()=>M,U9:()=>T,CD:()=>N,eJ:()=>L,d4:()=>D,bt:()=>O,Ye:()=>Z,I4:()=>x,sO:()=>_,X$:()=>F,ZP:()=>B});var r=n(3716),o=n(9118),d=n(782),a=n(275),u=n(3592),s=n(5247);let i;!function(e){e[e.Empty=0]="Empty",e[e.Text=1]="Text",e[e.Tag=2]="Tag",e[e.Component=3]="Component"}(i||(i={}));const c=Symbol("Fragment");let l;function f(e){return e.type===i.Empty}function h(e){return e.type===i.Text}function m(e){return e.type===i.Tag}function p(e){return e.type===i.Component}function g(e){return m(e)||p(e)}function y(e,t,...n){return t||(t={}),n=(0,d.xH)(n),e===c?n:"function"==typeof e?function(e,t,n){let r;0===n.length?r=void 0:1===n.length?[r]=n:r=n;const o={$element:{},Component:e,name:e.name,props:{...t,...r&&{children:r}},isMounted:!1,hooks:{state:{cursor:0,byCursor:[]},effects:{cursor:0,byCursor:[]},memos:{cursor:0,byCursor:[]}}};return o.$element=v(o),o.$element}(e,t,n):function(e,t,n){return{type:i.Tag,tag:e,props:t,children:b(n).map(I)}}(e,t,n)}function v(e,t=[]){const{props:n}=e;return{componentInstance:e,type:i.Component,props:n,children:t}}function b(e){let t=e.length-1;for(;t>=0&&w(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),C[n].renderTimes.push(t),C[n].renderCount++}}catch(t){(0,u.S)(t),o=e.renderedValue}if(e.isMounted&&o===e.renderedValue)return e.$element;e.renderedValue=o;const d=I(o);return e.$element=v(e,[d]),e.$element}function E(e,t){return typeof e!=typeof t||e.type!==t.type||(h(e)&&h(t)?e.value!==t.value:m(e)&&m(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!p(e)||!p(t)||e.componentInstance.Component===t.componentInstance.Component&&e.props.key===t.props.key))}function P(e){if(p(e))(t=e.componentInstance).isMounted&&(t.hooks.memos.byCursor.forEach((e=>{e.current=void 0})),t.hooks.effects.byCursor.forEach((({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){(0,u.S)(e)}})),t.isMounted=!1,function(e){e.hooks.effects.byCursor.forEach((e=>{e.cleanup=void 0,e.effect=void 0,e.dependencies=void 0})),e.hooks.state.byCursor.forEach((e=>{e.value=void 0,e.nextValue=void 0,e.setter=void 0})),e.hooks.memos.byCursor.forEach((e=>{e.dependencies=void 0})),e.hooks=void 0,e.$element=void 0,e.renderedValue=void 0,e.Component=void 0,e.props=void 0,e.forceUpdate=void 0,e.onUpdate=void 0}(t));else if(m(e)&&(e.target&&(0,s.lQ)(e.target),e.props.ref&&(e.props.ref.current=void 0)),e.target&&(e.target=void 0),!g(e))return;var t;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:a,byCursor:s}=l.hooks.effects,i=l;function c(){if(!i.isMounted)return;const{cleanup:e}=s[a];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 #${a}: ${n}, ${Math.round(e)} ms`)}}catch(e){(0,u.S)(e)}}function f(){if(!i.isMounted)return;let e;if(r.eM&&(e=performance.now()),s[a].cleanup=n(),r.eM){const t=performance.now()-e,n=i.name;t>7&&console.warn(`[Teact] Slow effect at cursor #${a}: ${n}, ${Math.round(t)} ms`)}}if(void 0!==s[a]&&o&&s[a].dependencies){if(o.some(((e,t)=>e!==s[a].dependencies[t]))){if(d){const e=o.reduce(((e,t,n)=>{const r=s[a].dependencies[n];return t!==r&&e.push(`${n}: ${r} => ${t}`),e}),[]);console.log(`[Teact] Effect "${d}" caused by dependencies.`,e.join(", "))}t(c),e(f)}}else d&&console.log(`[Teact] Effect "${d}" caused by missing dependencies.`),t(c),e(f);s[a]={effect:n,dependencies:o,cleanup:s[a]?s[a].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:u}=d[o]||{};return(void 0===d[o]||t.some(((e,t)=>e!==d[o].dependencies[t])))&&(r.eM&&n&&console.log(`[Teact.useMemo] ${l.name} (${n}): Update is caused by:`,d[o]?(0,a.c)(t,d[o].dependencies).join(", "):"[first render]"),u=e()),d[o]={current:u,dependencies:t},l.hooks.memos.cursor++,u}function x(e,t,n){return Z((()=>e),t,n)}function _(e){return Z((()=>({current:e})),[])}function F(e,t=a.Z,n){return function(o){const d=_(o),u=_();return(!u.current||d.current&&!t(d.current,o))&&(r.eM&&n&&console.log(`[Teact.memo] ${e.name} (${n}): Update is caused by:`,(0,a.c)(d.current,o).join(", ")),d.current=o,u.current=y(e,o)),u.current}}document.addEventListener("dblclick",(()=>{console.warn("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),a=n(6926),u=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,u.$6)(w);function w(e=!1){e||!(0,l.zG)()?g.forEach((e=>e(m))):(0,u.T2)(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=(()=>({}))){return t=>function n(o){n.DEBUG_contentComponentName=t.name;const[u]=(0,r.eJ)((0,a.Z)(v)),i=(0,d.Z)();(0,r.d4)((()=>()=>{v.delete(u)}),[u]);let l=v.get(u);if(l||(l={mapStateToProps:e,ownProps:o,areMappedPropsChanged:!1,forceUpdate:i,DEBUG_updates:0,DEBUG_componentName:t.name},v.set(u,l)),l.areMappedPropsChanged&&(l.areMappedPropsChanged=!1),!l.mappedProps||!(0,s.Z)(l.ownProps,o)){l.ownProps=o;try{l.mappedProps=e(m,o)}catch(e){(0,c.S)(e)}}return r.ZP.createElement(t,f({},l.mappedProps,o))}}o.eM&&(window.getGlobal=C,document.addEventListener("dblclick",(()=>{console.warn("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:()=>a});const r=/\uFE0F/g,o=String.fromCharCode(8205);function d(e){return e.indexOf(o)<0?e.replace(r,""):e}const a=/(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g},1363:(e,t,n)=>{var r=n(5116),o=n(1226),d=n(3716),a=n(7361),u=n(8406),s=n(9524),i=n(7358),c=n(4688),l=n(1622);(0,r.Q6)("initApi",((e,t)=>{(async()=>{d.Cg||(await(0,c.Qw)(),(0,c.f3)()),(0,o.g8)(t.apiUpdate,{userAgent:navigator.userAgent,platform:a.Lt,sessionData:(0,c.K8)(),isTest:window.location.search.includes("test"),isMovSupported:a.pA})})()})),(0,r.Q6)("setAuthPhoneNumber",((e,t,n)=>{const{phoneNumber:r}=n;return(0,o.t9)("provideAuthPhoneNumber",r.replace(/[^\d]/g,"")),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("setAuthCode",((e,t,n)=>{const{code:r}=n;return(0,o.t9)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("setAuthPassword",((e,t,n)=>{const{password:r}=n;return(0,o.t9)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("uploadProfilePhoto",((e,t,n)=>{const{file:r}=n;(0,o.t9)("uploadProfilePhoto",r)})),(0,r.Q6)("signUp",((e,t,n)=>{const{firstName:r,lastName:d}=n;return(0,o.t9)("provideAuthRegistration",{firstName:r,lastName:d}),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("returnToAuthPhoneNumber",(e=>((0,o.t9)("restartAuth"),{...e,authError:void 0}))),(0,r.Q6)("goToAuthQrCode",(e=>((0,o.t9)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0}))),(0,r.Q6)("saveSession",((e,t,n)=>{const{sessionData:r}=n;r?(0,c.wX)(n.sessionData,e.currentUserId):(0,c.jv)()})),(0,r.Q6)("signOut",(()=>{(async()=>{try{await(0,u.r1)(),await(0,o.t9)("destroy"),await(0,l.IT)(!1)}catch(e){}(0,r.uC)().reset()})()})),(0,r.Q6)("reset",(()=>{(0,c.jv)(),s.clear(d.lW),s.clear(d.SG),s.clear(d.lF),s.clear(d.fo);const e=d.ee.replace(/\d+$/,""),t=(d.ee.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await(0,o.t9)("disconnect")})()})),(0,r.Q6)("loadNearestCountry",(e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await(0,o.t9)("fetchNearestCountry");(0,r.R3)({...(0,r.Rd)(),authNearestCountry:e})})()})),(0,r.Q6)("setDeviceToken",((e,t,n)=>{(0,r.R3)({...e,push:{deviceToken:n,subscribedAt:Date.now()}})})),(0,r.Q6)("deleteDeviceToken",(e=>{const t={...e};delete t.push,(0,r.R3)(t)}))},9667:(e,t,n)=>{var r=n(5116),o=n(1713),d=n(3716),a=n(1226),u=n(782),s=n(8406),i=n(663),c=n(1638),l=n(9959),f=n(2858);function h(e,{visibility:t,allowedIds:n,deniedIds:r}){const{users:{byId:o},chats:{byId:d}}=e,a={visibility:t};let u,s;const i=e=>{if(!(0,f.YC)(e))return;const{id:t,accessHash:n}=o[e]||{};return t?{id:t,accessHash:n}:void 0},c=e=>{if((0,f.YC)(e))return;const t=d[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(u=n.map(i).filter(Boolean),s=n.map(c).filter(Boolean),u.length>0&&(a.allowedUsers=u),s.length>0&&(a.allowedChats=s)),"everybody"!==t&&"contacts"!==t||(u=r.map(i).filter(Boolean),s=r.map(c).filter(Boolean),u.length>0&&(a.blockedUsers=u),s.length>0&&(a.blockedChats=s)),a}(0,r.Q6)("updateProfile",((e,t,n)=>{const{photo:d,firstName:u,lastName:s,bio:i,username:f}=n;(async()=>{const{currentUserId:t}=e;if(t){if((0,r.R3)({...(0,r.Rd)(),profileEdit:{progress:o.rN.InProgress}}),d&&await(0,a.t9)("updateProfilePhoto",d),(u||s||i)&&await(0,a.t9)("updateProfile",{firstName:u,lastName:s,about:i})){e=(0,r.Rd)();const n=t&&(0,c.dy)(e,t);n&&(0,r.R3)((0,l.Nq)(e,n.id,{firstName:u,lastName:s,fullInfo:{...n.fullInfo,bio:i}}))}f&&await(0,a.t9)("updateUsername",f)&&t&&(0,r.R3)((0,l.Nq)((0,r.Rd)(),t,{username:f})),(0,r.R3)({...(0,r.Rd)(),profileEdit:{progress:o.rN.Complete}})}})()})),(0,r.Q6)("checkUsername",((e,t,n)=>{const{username:d}=n;(async()=>{if(e.profileEdit&&e.profileEdit.progress===o.rN.InProgress)return;(0,r.R3)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:o.rN.Idle,isUsernameAvailable:void 0}});const t=await(0,a.t9)("checkUsername",d);e=(0,r.Rd)(),(0,r.R3)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()})),(0,r.Q6)("loadWallpapers",(()=>{(async()=>{const e=await(0,a.t9)("fetchWallpapers");if(!e)return;const t=(0,r.Rd)();(0,r.R3)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()})),(0,r.Q6)("uploadWallpaper",((e,t,n)=>{const d=n,u=URL.createObjectURL(d);(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[{slug:o.mp,document:{fileName:"",size:d.size,mimeType:d.type,previewBlobUrl:u}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await(0,a.t9)("uploadWallpaper",d);if(!t)return;const{wallpaper:n}=t;if(!(e=(0,r.Rd)()).settings.loadedWallpapers)return;const s=e.settings.loadedWallpapers[0];if(!s||s.slug!==o.mp)return;const i={...n,document:{...n.document,previewBlobUrl:u}};(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[i,...e.settings.loadedWallpapers.slice(1)]}})})()})),(0,r.Q6)("loadBlockedContacts",(()=>{(async()=>{var e,t;const n=await(0,a.t9)("fetchBlockedContacts");if(!n)return;let o=(0,r.Rd)();null!==(e=n.users)&&void 0!==e&&e.length&&(o=(0,l.Sh)(o,(0,u.ee)(n.users,"id"))),null!==(t=n.chats)&&void 0!==t&&t.length&&(o=(0,l.GL)(o,(0,u.ee)(n.chats,"id"))),o={...o,blocked:{...o.blocked,ids:[...o.blocked.ids||[],...n.blockedIds],totalCount:n.totalCount}},(0,r.R3)(o)})()})),(0,r.Q6)("blockContact",((e,t,n)=>{const{contactId:o,accessHash:d}=n;(async()=>{if(!await(0,a.t9)("blockContact",o,d))return;const e=(0,r.Rd)();(0,r.R3)((0,l.O4)(e,o))})()})),(0,r.Q6)("unblockContact",((e,t,n)=>{const{contactId:o}=n;let d;if((0,f.YC)(o)){const t=(0,c.dy)(e,o);if(!t)return;d=t.accessHash}(async()=>{if(!await(0,a.t9)("unblockContact",o,d))return;const e=(0,r.Rd)();(0,r.R3)((0,l.rB)(e,o))})()})),(0,r.Q6)("loadAuthorizations",(()=>{(async()=>{const e=await(0,a.t9)("fetchAuthorizations");e&&(0,r.R3)({...(0,r.Rd)(),activeSessions:e})})()})),(0,r.Q6)("terminateAuthorization",((e,t,n)=>{const{hash:o}=n;(async()=>{if(!await(0,a.t9)("terminateAuthorization",o))return;const e=(0,r.Rd)();(0,r.R3)({...e,activeSessions:e.activeSessions.filter((e=>e.hash!==o))})})()})),(0,r.Q6)("terminateAllAuthorizations",(()=>{(async()=>{if(!await(0,a.t9)("terminateAllAuthorizations"))return;const e=(0,r.Rd)();(0,r.R3)({...e,activeSessions:e.activeSessions.filter((e=>e.isCurrent))})})()})),(0,r.Q6)("loadNotificationExceptions",(e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await(0,a.t9)("fetchNotificationExceptions",{serverTimeOffset:t});e&&(0,r.R3)((0,l.aJ)((0,r.Rd)(),e))})()})),(0,r.Q6)("loadNotificationSettings",(e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await(0,a.t9)("fetchNotificationSettings",{serverTimeOffset:t});e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),e))})()})),(0,r.Q6)("updateNotificationSettings",((e,t,n)=>{const{peerType:o,isSilent:d,shouldShowPreviews:u}=n;(async()=>{await(0,a.t9)("updateNotificationSettings",o,{isSilent:d,shouldShowPreviews:u})&&(0,r.R3)((0,l.HN)((0,r.Rd)(),o,d,u))})()})),(0,r.Q6)("updateWebNotificationSettings",((e,t,n)=>{(async()=>{(0,r.R3)((0,l.BI)((0,r.Rd)(),n));const e=(0,r.Rd)(),{hasPushNotifications:t,hasWebNotifications:o}=e.settings.byKey;o&&t?await(0,s.Ld)():await(0,s.r1)()})()})),(0,r.Q6)("updateContactSignUpNotification",((e,t,n)=>{const{isSilent:o}=n;(async()=>{await(0,a.t9)("updateContactSignUpNotification",o)&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{hasContactJoinedNotifications:!o}))})()})),(0,r.Q6)("loadLanguages",(()=>{(async()=>{const e=await(0,a.t9)("fetchLanguages");e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{languages:e}))})()})),(0,r.Q6)("loadPrivacySettings",(()=>{(async()=>{const[e,t,n,o,d]=await Promise.all([(0,a.t9)("fetchPrivacySettings","phoneNumber"),(0,a.t9)("fetchPrivacySettings","lastSeen"),(0,a.t9)("fetchPrivacySettings","profilePhoto"),(0,a.t9)("fetchPrivacySettings","forwards"),(0,a.t9)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&n&&o&&d))return;const u=(0,r.Rd)();u.settings.privacy.phoneNumber=e,u.settings.privacy.lastSeen=t,u.settings.privacy.profilePhoto=n,u.settings.privacy.forwards=o,u.settings.privacy.chatInvite=d,(0,r.R3)(u)})()})),(0,r.Q6)("setPrivacyVisibility",((e,t,n)=>{const{privacyKey:o,visibility:d}=n,{privacy:{[o]:u}}=e.settings;if(!u)return;const s=h(e,{visibility:d,allowedIds:[...u.allowUserIds,...u.allowChatIds],deniedIds:[...u.blockUserIds,...u.blockChatIds]});(async()=>{const e=await(0,a.t9)("setPrivacySettings",o,s);if(e){const t=(0,r.Rd)();t.settings.privacy[o]=e,(0,r.R3)(t)}})()})),(0,r.Q6)("setPrivacySettings",((e,t,n)=>{const{privacyKey:o,isAllowList:d,contactsIds:u}=n,{privacy:{[o]:s}}=e.settings;if(!s)return;const i=h(e,{visibility:s.visibility,allowedIds:d?u:[...s.allowUserIds,...s.allowChatIds],deniedIds:d?[...s.blockUserIds,...s.blockChatIds]:u});(async()=>{const e=await(0,a.t9)("setPrivacySettings",o,i);if(e){const t=(0,r.Rd)();t.settings.privacy[o]=e,(0,r.R3)(t)}})()})),(0,r.Q6)("updateIsOnline",((e,t,n)=>{(0,a.t9)("updateIsOnline",n)})),(0,r.Q6)("loadContentSettings",(()=>{(async()=>{const e=await(0,a.t9)("fetchContentSettings");e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),e))})()})),(0,r.Q6)("updateContentSettings",((e,t,n)=>{(async()=>{(0,r.R3)((0,l.BI)((0,r.Rd)(),{isSensitiveEnabled:n})),await(0,a.t9)("updateContentSettings",n)||(0,r.R3)((0,l.BI)((0,r.Rd)(),{isSensitiveEnabled:!n}))})()})),(0,r.Q6)("loadCountryList",((e,t,n={})=>{let{langCode:o}=n;o||(o=e.settings.byKey.language),(async()=>{const e=await(0,a.t9)("fetchCountryList",{langCode:o});e&&(0,r.R3)({...(0,r.Rd)(),countryList:e})})()})),(0,r.Q6)("ensureTimeFormat",((e,t)=>{if(e.authNearestCountry){const n=d.FD.has(e.authNearestCountry.toUpperCase())?"12h":"24h";t.setSettingOption({timeFormat:n}),(0,i.qf)(n)}(async()=>{if((0,r.Rd)().settings.byKey.wasTimeFormatSetManually)return;const e=await(0,a.t9)("fetchNearestCountry");if(e){const n=d.FD.has(e.toUpperCase())?"12h":"24h";t.setSettingOption({timeFormat:n}),(0,i.qf)(n)}})()})),(0,r.Q6)("loadAppConfig",(()=>{(async()=>{const e=await(0,a.t9)("fetchAppConfig");e&&(0,r.R3)({...(0,r.Rd)(),appConfig:e})})()}))},4907:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(8406),a=n(9959),u=n(663),s=n(1638),i=n(1622),c=n(1947);(0,r.Q6)("apiUpdate",((e,t,n)=>{switch(o.eM&&"updateUserStatus"!==n["@type"]&&"updateServerTimeOffset"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){const{hasWebNotifications:t,hasPushNotifications:n}=(0,s.dZ)(e);t&&n&&(0,d.Ld)(),(0,u.m0)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=(0,r.Rd)();const n="authorizationStateReady"===t.authState,o=e.authorizationState;switch((0,r.R3)({...t,authState:o,authIsLoading:!1}),t=(0,r.Rd)(),o){case"authorizationStateLoggingOut":(0,i.IT)(!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.IT)(!0),(0,r.R3)({...t,isLoggingOut:!1,lastSyncTime:Date.now()})}}(n);break;case"updateAuthorizationError":!function(e){(0,r.R3)({...(0,r.Rd)(),authError:e.message})}(n);break;case"updateConnectionState":!function(e){const{connectionState:t}=e,n=(0,r.Rd)();(0,r.R3)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?(0,r.uC)().sync():"connectionStateBroken"===t&&(0,r.uC)().signOut()}(n);break;case"updateSession":!function(e){const{sessionData:t}=e,{authRememberMe:n,authState:o}=(0,r.Rd)(),d=!t||!t.mainDcId;n&&"authorizationStateReady"===o&&!d&&(0,r.uC)().saveSession({sessionData:t})}(n);break;case"updateServerTimeOffset":!function(e){const t=(0,r.Rd)();t.serverTimeOffset!==e.serverTimeOffset&&(0,r.R3)({...t,serverTimeOffset:e.serverTimeOffset})}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;(0,r.R3)({...(0,a.Nq)((0,r.Rd)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(o.b_);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(o.b_,JSON.stringify(n))}(t.id)}(n);break;case"error":{"SESSION_REVOKED"===n.error.message&&t.signOut();const e=(0,c.J_)(n.error);e?t.addPaymentError({error:e}):t.showDialog&&t.showDialog({data:n.error});break}}}))},7895:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(7361),a=n(663),u=n(6917),s=n(1638),i=n(1622),c=n(7926);!function(){function e(){const e=document.documentElement.className.match(/theme-(\w+)/),t=e?e[1]:"light",n=(0,r.Rd)(),d=(0,s.Pu)(n),{animationLevel:a}=n.settings.byKey;d!==t&&((0,u.Z)(d,a===o.zy),(0,r.R3)({...n}))}const t=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof t.addEventListener?t.addEventListener("change",e):"function"==typeof t.addListener&&t.addListener(e)}(),(0,r.Q6)("init",(e=>{const{animationLevel:t,messageTextSize:n,language:r}=e.settings.byKey,l=(0,s.Pu)(e);(0,a.m0)(r,void 0,!0),document.documentElement.style.setProperty("--composer-text-size",`${Math.max(n,d.cj?16:15)}px`),document.documentElement.style.setProperty("--message-meta-height",`${Math.floor(1.3125*n)}px`),document.documentElement.style.setProperty("--message-text-size",`${n}px`),document.documentElement.setAttribute("data-message-text-size",n.toString()),document.body.classList.add("initial"),document.body.classList.add(`animation-level-${t}`),document.body.classList.add(d.$b?"is-touch-env":"is-pointer-env"),(0,u.Z)(l,t===o.zy),(0,c.$)(),(0,i.px)(),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(9959);(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:()=>j,ih:()=>W,$l:()=>G});var r=n(6137),o=n(3716),d=n(782),a=n(5527),u=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,a,u,s){if(!e.isListed)return!1;const{id:i,type:c,unreadMentionsCount:l}=e;if(null!=a&&a.has(i))return!1;if(null!=u&&u.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,a,u,s,i)})),r.pinnedChatIds]}function _(e,t,n,r="all",o=!1){const a=new Set(t),u=n?new Set(n):void 0,s=(null==n?void 0:n.reduce(((t,n)=>{const o=e[n];return o&&a.has(o.id)&&F(o,r)&&t.push(o),t}),[]))||[],i=t.reduce(((t,n)=>{const o=e[n];return!o||u&&u.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[a]=x(e,t,n,r,o,d);let u=!1;return{unreadDialogsCount:a.reduce(((e,n)=>{const r=t[n];if(null==r||!r.lastMessage||null!=r&&r.isRestricted||null!=r&&r.isNotJoined)return e;const a=r.unreadCount||r.hasUnreadMark;return a&&e++,!u&&(r.unreadMentionsCount||a&&!D(r,o,d))&&(u=!0),e}),0),hasActiveDialogs:u}}function U(e,t,n,r,o,d,a){const{id:u,title:s,emoticon:i,description:c,pinnedChatIds:l,excludedChatIds:f,includedChatIds:h,excludeArchived:m,excludeMuted:p,excludeRead:g,...y}=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[a,u]=x(e,t,n,r,o,d),{pinnedChats:s,otherChats:i}=_(t,a,u,"folder",!0);return s.length+i.length}(t,n,r,o,d,a)):y.bots?e("FilterBots"):y.groups?e("FilterGroups"):y.channels?e("FilterChannels"):y.contacts?e("FilterContacts"):y.nonContacts?e("FilterNonContacts"):void 0}function j(e,t,n){if(n&&!c(t))return n.isSelf?e("FromYou"):(0,a.Vl)(n)}function W(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,{JE:()=>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:()=>y,SB:()=>o.SB,Fu:()=>o.Fu,VE:()=>o.VE,XV:()=>se,Sc:()=>ae,N5:()=>x,oP:()=>_,qp:()=>L,w6:()=>k,R5:()=>ue,$D:()=>p,aE:()=>$,ep:()=>X,c0:()=>ee,eO:()=>G,Tp:()=>c,kG:()=>Y,Ti:()=>K,DH:()=>Q,KK:()=>f,O$:()=>D,t9:()=>W,Y5:()=>Z,zF:()=>o.zF,q8:()=>o.q8,_O:()=>g,bf:()=>B,MK:()=>h,UD:()=>m,b7:()=>O,kd:()=>F,s1:()=>V,F$:()=>H,Cg:()=>z,bV:()=>re,HV:()=>oe,zX:()=>o.zX,OU:()=>E,RI:()=>P,Ow:()=>le,Rs:()=>r.Rs,Vl:()=>r.Vl,Js:()=>r.Js,db:()=>r.db,Tq:()=>r.Tq,jC:()=>de,BM:()=>te,u8:()=>R,Lo:()=>I,Ul:()=>S,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:()=>w,CD:()=>A,rl:()=>U,hC:()=>j,CI:()=>M,B4:()=>v,ss:()=>b,jM:()=>C,cS:()=>r.cS,YC:()=>o.YC,kM:()=>r.kM,Mg:()=>o.Mg,Ak:()=>l,O:()=>o.O,P4:()=>o.P4,wG:()=>o.wG,i4:()=>o.i4,Sm:()=>o.Sm,ih:()=>o.ih,Z0:()=>r.Z0});var r=n(5527),o=n(8332),d=n(6137),a=n(3716),u=n(7361),s=n(4784);const i=new RegExp(a.FM,"i");function c(e){const{chatId:t,id:n}=e;return function(e,t){return`msg${e}-${t}`}(t,n)}function l(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:t[1],messageId:Number(t[2])}}function f(e){return e.previousLocalId||e.id}function h(e,t,n=!1){const{text:r,photo:o,video:d,audio:u,voice:s,document:i,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")}`:s?`${n?"":"🎤 "}${m||e("AttachAudio")}`:i?`${n?"":"📎 "}${m||i.fileName}`:l?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:h?"Invoice":r?m:a.VC}function m(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:u,document:s,poll:i,webPage:c,contact:l,invoice:f}=e.content;return t?t.text:n||r||o||d||u||s||l||i||c||f?void 0:a.VC}function p(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:a,document:u,poll:i,webPage:c,contact:l}=e.content;return!!(n||null!=o&&o.isRound)||!(!t||r||o||d||a||u||i||c||l)&&((0,s.Z)(t.text)||!1)}function g(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===p(e))return t.text}function y(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(i)),!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(i)}}if(!n&&t&&(n=t.text.match(i)),n)return{url:n[0],domain:n[3]}}function v(e){return e.isOutgoing}function b(e){return Boolean(e.replyToMessageId)}function w(e){return Boolean(e.forwardInfo)}function I(e){return!!e.content.action}function C(e){return e.chatId===a.aw&&Math.round(e.id)!==e.id}function S(e){return Boolean(e.senderId)&&!(0,o.YC)(e.senderId)&&v(e)}function E(e,t){return(0,o.YC)(t.id)?(0,r.Js)(t):(0,o.U)(e,t)}function P(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function M(e){return e.id>=a.AE}function A(e){return e.content.action&&"historyClear"===e.content.action.type}function k(e){const{content:t}=e,n=t.webPage?t.webPage.video:t.video,r=t.webPage?t.webPage.photo:t.photo,o=t.webPage?t.webPage.document:t.document;if(o)return o.fileName;if(n)return n.fileName;if(t.sticker){const e=t.sticker.isAnimated?"tgs":(0,u.on)()?"webp":"png";return`${t.sticker.id}.${e}`}if(t.audio)return t.audio.fileName;const d=c(e);return r?`${d}.jpg`:t.voice?u.m5?`${d}.ogg`:`${d}.wav`:d}function T(e){return!e.results.some((e=>e.count>0))}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)||W(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 j(e){const t=$(e);return t?"video"===t.mediaType:void 0}function W(e){return e.content.poll}function G(e){return e.content.invoice}function V(e){return e.content.webPage}function H(e){var t;return null===(t=V(e))||void 0===t?void 0:t.photo}function z(e){var t;return null===(t=V(e))||void 0===t?void 0:t.video}function Q(e){var t;return null===(t=function(e){const t=D(e)||O(e)||$(e)||B(e)||H(e)||z(e);if(t)return t.thumbnail}(e))||void 0===t?void 0:t.dataUri}function K(e,t){const{photo:n,video:r,sticker:o,audio:d,voice:a,document:u}=e.content,s=H(e),i=z(e),l=r||i,f=n||s;if(!(f||l||o||d||a||u))return;const h=(f||l||o||d||a||u).id,m=`${c(e)}${h?`:${h}`:""}`;if(l)switch(t){case"micro":case"pictogram":return`${m}?size=m`;case"inline":return te(e)?void 0:J(l,m);case"viewerPreview":return`${m}?size=m`;case"viewerFull":return J(l,m);case"download":return`${m}?download`}if(f)switch(t){case"micro":case"pictogram":return`${m}?size=m`;case"inline":return te(e)?void 0:`${m}?size=x`;case"viewerPreview":return`${m}?size=x`;case"viewerFull":case"download":return`${m}?size=z`}if(u)switch(t){case"micro":case"pictogram":case"inline":case"viewerPreview":if(!(0,N.v6)(u)||te(e))return;return`${m}?size=m`;case"viewerFull":case"download":return m}if(o)switch(t){case"micro":return;case"pictogram":return`${m}?size=m`;case"inline":return m;case"download":return`${m}?download`}if(d)switch(t){case"micro":case"pictogram":return q(d)?`${m}?size=m`:void 0;case"inline":return J(d,m);case"download":return`${m}?download`}if(a)switch(t){case"micro":case"pictogram":return;case"inline":return m;case"download":return`${m}?download`}}function J(e,t){return u.I_&&u.s$?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function q(e){return e.thumbnailSizes&&e.thumbnailSizes.length>0}function Y(e,t){const{sticker:n,video:r,audio:o,voice:a}=e.content,s=r||z(e);return n&&"inline"===t&&n.isAnimated?d.IU.Lottie:s&&u.I_&&("viewerFull"===t||"inline"===t)?d.IU.Progressive:o||a?a&&!u.m5?d.IU.BlobUrl:d.IU.Progressive:d.IU.BlobUrl}function X(e){const{photo:t,video:n,document:r}=e.content,o=H(e),d=z(e);if(t||o)return`photo${e.date}.jpeg`;const{fileName:a}=n||d||r||{};return a}function ee(e){const{video:t,document:n}=e.content,r=z(e),{size:o}=t||r||n||{};return o}function te(e){const{photo:t,video:n,document:r}=e.content;return(null==t?void 0:t.blobUrl)||(null==n?void 0:n.blobUrl)||(null==r?void 0:r.previewBlobUrl)}function ne(e,t,n=!1){const r=ue(e,t,n?"media":"inlineMedia");return n?r.reverse():r}function re(e){return e.sizes.find((e=>"z"===e.type))||e.sizes.find((e=>"y"===e.type))||oe(e)}function oe(e){return e.sizes.find((e=>"x"===e.type))||e.sizes.find((e=>"m"===e.type))||e.sizes.find((e=>"s"===e.type))||e.thumbnail}function de(e){if(e.width&&e.height)return e}function ae(e,t,n=!1){const r=M(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ue(e,t,n){let r;switch(n){case"media":r=e=>{const t=O(e);return D(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=$;break;case"links":r=e=>V(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(i);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)||j(e)};break;default:return[]}return t.reduce(((t,n)=>(e[n]&&r(e[n])&&t.push(n),t)),[])}function se(e){const{audio:t,voice:n,video:r}=L(e),o=t||n||r||z(e);if(o)return o.duration}function ie(e,t){return`${e}_${t}`}const ce={missing_payment_information:{field:"cardNumber",message:"Incorrect card number"},invalid_number:{field:"cardNumber",message:"Incorrect card number"},number:{field:"cardNumber",message:"Incorrect card number"},exp_year:{field:"expiry",message:"Incorrect year"},exp_month:{field:"expiry",message:"Incorrect month"},invalid_expiry_year:{field:"expiry",message:"Incorrect year"},invalid_expiry_month:{field:"expiry",message:"Incorrect month"},cvc:{field:"cvv",message:"Incorrect CVV"},invalid_cvc:{field:"cvv",message:"Incorrect CVV"}};function le(e){const{message:t,code:n,param:r}=e,{field:o,message:d}=r?ce[r]:ce[n];return{field:o,message:d,description:t}}},5527:(e,t,n)=>{n.d(t,{Vl:()=>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),a=n(2267),u=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),a=new Date(1e3*t);if(a>=r)return e("LastSeen.JustNow");const u=new Date(r.getTime()-a.getTime());if(u.getTime()/1e3<60)return e("LastSeen.JustNow");if(u.getTime()/1e3<3600)return e("LastSeen.MinutesAgo",Math.floor(u.getTime()/1e3/60));const s=new Date;if(s.setHours(0,0,0,0),a>new Date(s.getTime()+1e3*d))return u.getTime()/1e3<21600?e("LastSeen.HoursAgo",Math.floor(u.getTime()/1e3/60/60)):e("LastSeen.TodayAt",(0,o.mr)(e,a));const i=new Date;return i.setDate(r.getDate()-1),i.setHours(0,0,0,0),a>new Date(i.getTime()+1e3*d)?e("LastSeen.YesterdayAt",(0,o.mr)(e,a)):e("LastSeen.AtDate",(0,o.Tu)(e,a))}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,a.b)(o);if(r&&r.includes(e))return d+172800-(r.length-r.indexOf(e));const u=t[e],s=n[e];if(!u||!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,r,o){if(!n)return e;const d=(0,u.W)(n);return e.filter((e=>{const n=t[e];if(!n)return!1;const a=e===r?o:c(n);return a&&d(a)||d(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:()=>a,B1:()=>u,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 a(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function u(e,t,n){const{[t]:r}=e.chats.listIds,o=null!=r&&r.length?n.filter((e=>!r.includes(e))):n;return r&&!o.length?e:a(e,t,[...r||[],...o])}function s(e,t){return{...e,chats:{...e.chats,byId:t}}}function i(e,t,n,r){const{byId: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,a=d[t],u=n.isMin&&a&&!a.isMin,s={...a,...u?(0,o.CE)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...a.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=a(e,n,r.filter((e=>e!==t)))),i(e,t,{isNotJoined:!0})}},9959:(e,t,n)=>{n.d(t,{O4:()=>Q,c_:()=>o.c_,fZ:()=>r.fZ,m6:()=>o.m6,aK:()=>H,aJ:()=>V,zn:()=>M,Sh:()=>v,$S:()=>o.$S,bp:()=>oe,WY:()=>de,K4:()=>o.K4,bV:()=>o.bV,GK:()=>I,M6:()=>o.M6,i9:()=>o.i9,Dd:()=>r.Dd,vy:()=>f,rB:()=>K,g_:()=>c,Mg:()=>r.Mg,SL:()=>r.SL,Pb:()=>Z,w3:()=>o.w3,BI:()=>W,lr:()=>G,pf:()=>o.pf,ps:()=>P,s5:()=>m,y9:()=>o.y9,nA:()=>ee,_7:()=>ne,Q$:()=>X,Dq:()=>re,vT:()=>Y,QH:()=>te,Ob:()=>o.Ob,a4:()=>r.a4,B1:()=>r.B1,vv:()=>r.vv,Pi:()=>r.Pi,cY:()=>o.cY,GL:()=>r.GL,Wy:()=>o.Wy,wV:()=>o.wV,cq:()=>o.cq,rq:()=>i,No:()=>k,Og:()=>T,xv:()=>L,px:()=>N,xj:()=>o.xj,c1:()=>B,z5:()=>F,qr:()=>O,dx:()=>x,fw:()=>j,H9:()=>U,HN:()=>z,ff:()=>o.ff,P4:()=>o.P4,x1:()=>w,TM:()=>q,Fn:()=>o.Fn,Rg:()=>s,z3:()=>u,IM:()=>l,Xg:()=>o.Xg,j6:()=>o.j6,lG:()=>o.lG,IE:()=>J,Nq:()=>g,Lm:()=>C,Q3:()=>S,eD:()=>y});var r=n(6788),o=n(3495),d=n(782),a=n(1638);function u(e,t,n,r,o){const a=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,d.ee)(a,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:o}:{setIds:r.map((({id:e})=>e))}}}}}function s(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function i(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 c(e,t){return{...e,animatedEmojis:t}}function l(e,t,n,r){const o=[...(0,a.Pk)(e,t),...n||[]],u=(0,d.Tw)(o.map((({id:e})=>e))),s=(0,d.ee)(o,"id"),i=u.map((e=>s[e]));return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:i,hash:r}}}}function f(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?l(e,t,n,r):e}var h=n(735);function m(e,t){return{...e,users:{...e.users,byId:t}}}function p(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 g(e,t,n){const{byId:r}=e.users,o=b(e,t,n);return o?m(e=p(e,[o]),{...r,[t]:o}):e}function y(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=b(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=p(e=m(e,{...e.users.byId,...n}),Object.values(n))}function v(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=b(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r?e=p(e=m(e,{...n,...o}),Object.values(o)):e}function b(e,t,n){const{byId:r}=e.users,o=r[t],a=n.isMin&&o&&!o.isMin,u={...o,...a?(0,d.CE)(n,["isMin","accessHash"]):n};if(u.id&&u.type)return u}function w(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function I(e,t){const{byId:n}=e.users,{userIds:r}=e.contactList||{};return m(e={...e,contactList:{userIds:r?r.filter((e=>e!==t)):h.D}},{...n,[t]:{...n[t],isContact:void 0}})}function C(e,t){return{...e,userSearch:{...e.userSearch,...t}}}function S(e,t){return C(e,{fetchingStatus:t})}function E(e,t,n){const{byId:r}=e.users,o=r[t];return o&&o.fullInfo?g(e,t,{...o,fullInfo:{...o.fullInfo,isBlocked:n}}):e}function P(e,t){return{...e,users:{...e.users,statusesById:t}}}function M(e,t){const{statusesById:n}=e.users,r=Object.keys(t).filter((e=>!n[e]));return r.length?e=P(e,{...n,...(0,d.ei)(t,r)}):e}const A=e=>`${e.chatId}_${e.id}`;function k(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function T(e,t){return k(e,{currentContent:t})}function N(e,t,n,r,o){var a;const{resultsByType:u}=e.globalSearch||{},s=t.reduce(((e,t)=>(e[A(t)]=t,e)),{}),i=null==u||null===(a=u[r])||void 0===a?void 0:a.foundIds;if(void 0!==i&&Object.keys(s).every((e=>i.includes(A(s[e])))))return L(e,{messages:!1});const c=i||[],l=t.map((e=>A(e))),f=Array.prototype.concat(c,l),h=(0,d.et)(c,f)?c:f;return k(e=L(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:h}}})}function L(e,t){return k(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var R=n(2858);function D(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function O(e,t,n,r,o){const d=(0,R.uw)(t,n);return D(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:o})}function Z(e,t,n,r,o,d){const a=(0,R.uw)(t,n);return D(e,a,{...e.localTextSearch.byChatThreadKey[a],results:{foundIds:r,totalCount:o,nextOffsetId:d}})}function x(e,t,n,r,o,a){const u=(0,R.uw)(t,n),{results:s}=e.localTextSearch.byChatThreadKey[u]||{},i=(null==s?void 0:s.foundIds)||[],c=$((0,d.Tw)(Array.prototype.concat(i,r)));return Z(e,t,n,(0,d.et)(i,c)?i:c,o,a)}function _(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function F(e,t,n){return _(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function B(e,t,n,r,o,a){const{resultsByType:u}=e.localMediaSearch.byChatId[t]||{},s=null!=u&&u[n]?u[n].foundIds:[],i=$((0,d.Tw)(Array.prototype.concat(s,r)));return function(e,t,n,r,o,d){return _(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:o,nextOffsetId:d}}})}(e,t,n,(0,d.et)(s,i)?s:i,o,a)}function $(e){return e.sort(((e,t)=>e-t))}function U(e,t){return{...e,management:{...e.management,progress:t}}}function j(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function W(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function G(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function V(e,t){return t.forEach((t=>{const{chatId:n,...r}=t;e=H(e,n,r)})),e}function H(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function z(e,t,n,r){switch(t){case"contact":return W(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return W(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return W(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function Q(e,t){return e=E(e,t,!0),{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function K(e,t){return e=E(e,t,!1),{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter((e=>e!==t)),totalCount:e.blocked.totalCount-1}}}function J(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function q(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Y(e,t){return{...e,payment:{...e.payment,requestId:t}}}function X(e,t){return{...e,payment:{...e.payment,step:t}}}function ee(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,amount:o,currency:d,isTest:a,photoUrl:u}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,photoUrl:u,amount:o,currency:d,isTest:a}}}}function te(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function ne(e,t){return{...e,payment:{...e.payment,...t}}}function re(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:o,text:d,title:a}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:o,text:d,title:a}}}}function oe(e){return{...e,payment:{}}}function de(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},3495:(e,t,n)=>{n.d(t,{Wy:()=>u,pf:()=>c,m6:()=>l,c_:()=>f,cY:()=>h,P4:()=>m,K4:()=>p,bV:()=>g,xj:()=>y,ff:()=>v,$S:()=>w,y9:()=>I,Xg:()=>C,j6:()=>S,w3:()=>E,cq:()=>P,Fn:()=>M,wV:()=>A,M6:()=>k,Ob:()=>T,i9:()=>N,lG:()=>L});var r=n(6137),o=n(3716),d=n(1638),a=n(782);function u(e,t,n=r._f,d="thread",a){const{messageLists:u}=e.messages;let s=u;if(a||o.Cg)s=t?[{chatId:t,threadId:n,type:d}]:[];else if(t){const e=u[u.length-1];e&&e.chatId===t&&e.threadId===n&&e.type===d||(s=e&&e.chatId===o.AJ?[...u.slice(0,-1),{chatId:t,threadId:n,type:d}]:[...u,{chatId:t,threadId:n,type:d}])}else s=u.slice(0,-1);return{...e,messages:{...e.messages,messageLists:s}}}function s(e,t,n){return i(e,t,{byId:n})}function i(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function c(e,t,n,r,o){return function(e,t,n,r){const o=e.messages.byChatId[t];return i(e,t,{threadsById:{...null==o?void 0:o.threadsById,[n]:{...null==o?void 0:o.threadsById[n],...r}}})}(e,t,n,{[r]:o})}function l(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=f(e,t,n[t])})),e}function f(e,t,n){const r=(0,d.Zw)(e,t);return r&&Object.keys(n).every((e=>Boolean(r[Number(e)])))?e:s(e,t,{...n,...r})}function h(e,t,n,r){const o=(0,d.Zw)(e,t)||{},a={...o[n],...r};return a.id?s(e,t,{...o,[n]:a}):e}function m(e,t,n,r){const o=(0,d.Fn)(e,t)||{},a={...o[n],...r};return a.id?E(e,t,{...o,[n]:a}):e}function p(e,t,n){const r=(0,d.Zw)(e,t);if(!r)return e;const o=(0,a.CE)(r,n),i=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,d.tZ)(e,t,r);let a=(0,d.gb)(e,t,r),u=(0,d.qC)(e,t,r),s=(0,d.Cb)(e,t,r),i=(0,d.KB)(e,t),l=null==o?void 0:o.messagesCount;n.forEach((e=>{a&&a.includes(e)&&(a=a.filter((t=>t!==e)),void 0!==l&&(l-=1)),u&&u.includes(e)&&(u=u.filter((t=>t!==e))),s&&s.includes(e)&&(s=s.filter((t=>t!==e))),i&&i.includes(e)&&(i=i.filter((t=>t!==e)))})),e=c(e,t,r,"listedIds",a),e=c(e,t,r,"outlyingIds",u),e=c(e,t,r,"viewportIds",s),e=c(e,t,r,"pinnedIds",i),o&&void 0!==l&&(e=c(e,t,r,"threadInfo",{...o,messagesCount:l}))})),i.length){const n=(0,d.Bt)(e),r=n&&n.chatId===t&&"thread"===n.type,o=null==n?void 0:n.threadId;i.forEach((n=>{const{fromChatId:a,fromMessageId:s}=n.forwardInfo,i=(0,d.hj)(e,a,s);r&&o===s&&(e=u(e,t)),i&&(e=h(e,a,s,{threadInfo:void 0}))}))}return e=s(e,t,o)}function g(e,t,n){const o=(0,d.Fn)(e,t);if(!o)return e;const u=(0,a.CE)(o,n);let s=(0,d.qy)(e,t);return s&&(n.forEach((e=>{s.includes(e)&&(s=s.filter((t=>t!==e)))})),e=c(e,t,r._f,"scheduledIds",s)),E(e,t,u)}function y(e,t,n,r){const o=(0,d.gb)(e,t,n),a=null!=o&&o.length?r.filter((e=>!o.includes(e))):r;return o&&!a.length?e:c(e,t,n,"listedIds",b([...o||[],...a]))}function v(e,t,n,r){const o=(0,d.qC)(e,t,n),a=null!=o&&o.length?r.filter((e=>!o.includes(e))):r;return o&&!a.length?e:c(e,t,n,"outlyingIds",b([...o||[],...a]))}function b(e){return e.sort(((e,t)=>e-t))}function w(e,t,n,r){const a=(0,d.Cb)(e,t,n)||[];return a.includes(r)?e:c(e,t,n,"viewportIds",b([...a.length{e=C(e,t.chatId,t.threadId,t)})),e}function E(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 P(e,t,n,r=!1,o=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r,isResizingContainer:o}}}function M(e,t,n){return{...e,messages:{...e.messages,sponsoredByChatId:{...e.messages.sponsoredByChatId,[t]:n}}}}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,u,s,i=!1){const{selectedMessages:c}=e;u&&(s=(0,d.xH)(e,t,u));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 u=(0,d.$W)(e,t,n,r),s=u.indexOf(f[f.length-1]),i=u.indexOf(o),c=Math.min(s,i),l=Math.max(s,i),m=u.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:a,fromChatId:u}=t.forwardInfo||{};if(a&&u){const t=(0,d.tZ)(e,n,a);t&&(e=c(e,n,a,"threadInfo",{...t,lastMessageId:r,messagesCount:t.messagesCount+(o?-1:1)}))}return e}},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,_5:()=>E});var r=n(6137),o=n(2858),d=n(6376),a=n(3716),u=n(2913);function s(e,t){return e.chats.byId[t]}function i(e,t){const n=(0,o.zX)(t);return!!n&&(0,d.dy)(e,n)}function c(e,t){return t===e.currentUserId}function l(e,t){const n=i(e,t);return n&&(0,o.cS)(n)}function f(e){return Object.values(e.chats.byId).find((({isSupport:e})=>e))}function h(e,t){if(!(0,o.YC)(t.id)&&!(0,o.eA)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==a.mo?t.fullInfo.members.reduce(((t,{userId:n})=>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),a=r&&(0,d.dy)(e,r);if(a&&(0,o.cS)(a))return a}function p(e,t){const n=s(e,t),d=m(e,t);if(!n||!d)return!1;if(n.lastMessage&&(0,o.CD)(n.lastMessage))return!0;const a=e.messages.byChatId[t];if(!a)return!1;const{listedIds:u}=a.threadsById[r._f]||{};return u&&!u.length}function g(e){return Boolean(e.chats.listIds.active)}function y(e,t,n){const{listIds:r}=e.chats;if(n){const e=r[n];return Boolean(e&&e.includes(t))}return Object.values(r).some((e=>e&&e.includes(t)))}function v(e,t){const n=s(e,t);if(n&&y(e,t))return n.folderId===a.WS?"archived":"active"}function b(e,t){return e.chatFolders.byId[t]}function w(e,t,n=a.Nf){const{active:r,archived:o}=e.chats.orderedPinnedIds;if(n===a.Nf)return!!r&&r.includes(t);if(n===a.WS)return!!o&&o.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:u}=d[n]||{};return!!u&&u.includes(t)}function I(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find((e=>e.username&&e.username.toLowerCase()===n))}function C(e){const t=e.chats.listIds.active;if(!t)return 0;const n=e.chats.byId,r=(0,u.d)(e),d=(0,u.N)(e);return t.reduce(((e,t)=>{const a=n[t];return!(a&&a.unreadCount&&a.isListed)||a.isNotJoined||a.isRestricted||!a.unreadMentionsCount&&(0,o.i4)(a,r,d)?e:e+a.unreadCount}),0)}function S(e){return Boolean(s(e,a.aw))}function E(e,t){var n;const r=s(e,t);if(!r)return;const o=null==r||null===(n=r.fullInfo)||void 0===n?void 0:n.sendAsId;return o?(0,d.dy)(e,o)||s(e,o):void 0}},1638:(e,t,n)=>{n.d(t,{hg:()=>Q,xs:()=>ce,_k:()=>de,zB:()=>y,tH:()=>v,Oh:()=>b,g4:()=>u.g4,bH:()=>Se,__:()=>Pe,xl:()=>ae,Nu:()=>se,nB:()=>ue,Z1:()=>u.Z1,IK:()=>u.IK,DI:()=>u.DI,Mw:()=>u.Mw,Ek:()=>u.Ek,hj:()=>J,ZB:()=>X,Zw:()=>A,YK:()=>u.YK,Dg:()=>u.Dg,X5:()=>pe,A1:()=>u.A1,jr:()=>M,yN:()=>f,JX:()=>Ue,pP:()=>xe,we:()=>Oe,og:()=>De,$W:()=>R,Bt:()=>P,y5:()=>l,n5:()=>Re,q6:()=>Le,Ms:()=>$,_$:()=>F,kK:()=>Y,wU:()=>B,yZ:()=>W,It:()=>he,G$:()=>ee,y8:()=>ve,cv:()=>oe,ku:()=>Te,pk:()=>u.pk,N:()=>u.N,ep:()=>u.ep,xo:()=>u.xo,FM:()=>u.FM,a6:()=>we,te:()=>ie,Ev:()=>me,CA:()=>ge,zQ:()=>_e,_X:()=>te,EV:()=>ke,vk:()=>ye,Jf:()=>Be,UW:()=>u.UW,s4:()=>s.s4,b9:()=>K,VF:()=>Ae,gb:()=>N,CP:()=>w,cu:()=>I,ji:()=>C,aW:()=>Ze,xH:()=>be,FT:()=>Ce,tV:()=>U,NJ:()=>Qe.N,dZ:()=>Qe.d,dT:()=>ne,qC:()=>L,gx:()=>je,eh:()=>Ge,Mz:()=>We,sp:()=>Ve,KB:()=>O,$$:()=>He,rd:()=>fe,p9:()=>G,Yy:()=>_,Wq:()=>Fe,qy:()=>Z,Tm:()=>q,Fn:()=>k,Vt:()=>x,D7:()=>Ie,_5:()=>u._5,Ur:()=>re,yB:()=>Me,fS:()=>Ne,Ny:()=>h,E_:()=>m,Pk:()=>p,i3:()=>ze,P_:()=>u.P_,Pu:()=>$e,Db:()=>z,tZ:()=>j,Cm:()=>V,qS:()=>H,uZ:()=>le,dy:()=>s.dy,ss:()=>s.ss,Cb:()=>D});var r=n(1713),o=n(7361),d=n(6137),a=n(3716),u=n(8857),s=n(6376),i=n(2858),c=n(782);function l(e){return e.stickers.search}function f(e){return e.gifs.search}function h(e,t){return e.stickers.setsById[t]}function m(e,t){return Object.values(e.stickers.setsById).find((e=>e.shortName.toLowerCase()===t.toLowerCase()))}function p(e,t){const n=Object.values(e.stickers.setsById);let r=[];return e.stickers.favorite.stickers.forEach((e=>{e.emoji===t&&r.push(e)})),n.forEach((({packs:e})=>{if(!e)return;const n=e[t];n&&(r=r.concat(n))})),r}function g(e){return e.replace("️","")}function y(e,t){const{animatedEmojis:n}=e;if(!n||!n.stickers)return;const r=g(t);return n.stickers.find((e=>e.emoji===t||e.emoji===r))}function v(e,t){const{animatedEmojiEffects:n}=e;if(!n||!n.stickers)return;const r=g(t);return n.stickers.find((e=>e.emoji===t||e.emoji===r))}function b(e,t){var n;return null==e||null===(n=e.appConfig)||void 0===n?void 0:n.emojiSounds[g(t)]}function w(e,t){const n=g(t);return"🍑"===n?"Peach":"🍆"===n?"Eggplant":void 0}function I(e){return"Eggplant"===e?"Cumshot":void 0}function C(e){return"Cumshot"===e?"🍆":void 0}var S=n(2267),E=n(735);function P(e){const{messageLists:t}=e.messages;if(t.length)return t[t.length-1]}function M(e){const{chatId:t}=P(e)||{};return t?(0,u.Z1)(e,t):void 0}function A(e,t){var n;return null===(n=e.messages.byChatId[t])||void 0===n?void 0:n.byId}function k(e,t){var n;return null===(n=e.scheduledMessages.byChatId[t])||void 0===n?void 0:n.byId}function T(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 N(e,t,n){return T(e,t,n,"listedIds")}function L(e,t,n){return T(e,t,n,"outlyingIds")}function R(e,t,n,r){switch(r){case"thread":return D(e,t,n);case"pinned":return O(e,t);case"scheduled":return Z(e,t)}}function D(e,t,n){return T(e,t,n,"viewportIds")}function O(e,t){return T(e,t,d._f,"pinnedIds")}function Z(e,t){return T(e,t,d._f,"scheduledIds")}function x(e,t,n){return T(e,t,n,"scrollOffset")}function _(e,t,n){return T(e,t,n,"replyingToId")}function F(e,t,n){return T(e,t,n,"editingId")}function B(e,t){return T(e,t,d._f,"editingScheduledId")}function $(e,t,n){return T(e,t,n,"draft")}function U(e,t,n){return T(e,t,n,"noWebPage")}function j(e,t,n){return T(e,t,n,"threadInfo")}function W(e,t,n){return T(e,t,n,"firstMessageId")}function G(e,t,n){return T(e,t,n,"replyStack")}function V(e,t,n){if(n===d._f)return(0,u.Z1)(e,t);const r=j(e,t,n);return r?(0,u.Z1)(e,r.originChannelId||t):void 0}function H(e,t,n){if(n===d._f)return;const r=j(e,t,n);return r?r.topMessageId:void 0}function z(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 Q(e,t,n){const r=P(e);if(!r)return!1;const{threadInfo:o}=z(e,t,n)||{};return t===r.chatId&&(r.threadId===d._f||o&&r.threadId===o.threadId)}function K(e,t,n){const r=D(e,t,n);if(!r||!r.length)return!0;let o;if(n===d._f){const n=(0,u.Z1)(e,t);if(!n||!n.lastMessage)return!0;o=n.lastMessage.id}else{const r=j(e,t,n);if(!r||!r.lastMessageId)return;o=r.lastMessageId}return o>=a.AE&&!J(e,t,o)||r[r.length-1]>=o}function J(e,t,n){const r=A(e,t);return r?r[n]:void 0}function q(e,t,n){const r=k(e,t);return r?r[n]:void 0}function Y(e,t,n,r){if("scheduled"===r){const n=B(e,t);return n?q(e,t,n):void 0}{const r=F(e,t,n);return r?J(e,t,r):void 0}}function X(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 ee(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function te(e,t){const n=ee(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function ne(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=(0,u.Z1)(e,t.chatId)||{};return(0,i.CI)(t)||!n||ne===t.id))}(e,t.content.sticker),Z=!v&&R&&!D,x=!v&&D,_=!v,F=!v&&(m||h),B=!v,$=Boolean((null===(o=b.webPage)||void 0===o?void 0:o.document)||(null===(d=b.webPage)||void 0===d?void 0:d.video)||(null===(a=b.webPage)||void 0===a?void 0:a.photo)||b.audio||b.voice||b.photo||b.video||b.document||b.sticker);return{noOptions:[I,N,E,P,k,A,T,L,Z,x,_,F,B,$].every((e=>!e)),canReply:I,canEdit:N,canPin:E,canUnpin:P,canReport:k,canDelete:A,canDeleteForAll:T,canForward:L,canFaveSticker:Z,canUnfaveSticker:x,canCopy:_,canCopyLink:F,canSelect:B,canDownload:$}}function ae(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=P(e)||{},o=n&&A(e,n);if(!o||!t||!r)return{};const d=t.map((t=>o[t]&&de(e,o[t],r))).filter(Boolean);return{canDelete:d.every((e=>e.canDelete)),canDeleteForAll:d.every((e=>e.canDeleteForAll))}}function ue(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=P(e)||{},o=n&&A(e,n);return!!(o&&t&&r)&&t.map((t=>o[t]&&de(e,o[t],r))).filter(Boolean).every((e=>e.canReport))}function se(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=P(e)||{},o=n&&A(e,n);return!!(o&&t&&r)&&t.map((t=>o[t]&&de(e,o[t],r))).filter(Boolean).some((e=>e.canDownload))}function ie(e,t){const n=e.activeDownloads.byChatId[t.chatId];return!!n&&n.includes(t.id)}function ce(e,t){return e.activeDownloads.byChatId[t]||E.D}function le(e,t){var n;return null===(n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id])||void 0===n?void 0:n.progress}function fe(e,t,n){if(n===d._f){const n=(0,u.Z1)(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?(0,i.CI)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=j(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function he(e,t,n){const r=(0,u.Z1)(e,t);if(n===d._f){if(!r)return}else{const r=j(e,t,n);if(!r||void 0!==r.lastMessageId&&r.lastMessageId===r.lastReadInboxMessageId)return}const o=L(e,t,n),s=N(e,t,n),i=A(e,t);if(!i||!o&&!s)return;const c=fe(e,t,n);if(!c&&r&&r.isNotJoined)return;const l=t===a.aw?e.serviceNotifications.reduce(((e,t)=>!t.isUnread&&t.id>e?t.id:e),-1):-1;function f(e){return e.find((e=>(!c||e>c)&&i[e]&&(!i[e].isOutgoing||i[e].isFromScheduled)&&e>l))}if(o){const e=f(o);if(e)return e}if(s){const e=f(s);if(e)return e}}function me(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function pe(e,t){const n=Object.values(e.chats.byId).find((e=>(0,i.Ru)(e)&&e.lastMessage&&e.lastMessage.id===t));if(n)return n.id;const{byChatId:r}=e.messages;return Object.keys(r).find((n=>{const o=(0,u.Z1)(e,n);return o&&(0,i.Ru)(o)&&r[o.id].byId[t]}))}function ge(e){const{selectedMessages:t}=e;return Boolean(t)}function ye(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function ve(e,t,n){const r=A(e,t);if(r)return Object.values(r).filter((e=>e.groupedId===n&&e.forwardInfo)).map((({forwardInfo:e})=>e.fromMessageId))}function be(e,t,n){const r=A(e,t);if(r)return Object.keys(r).map(Number).filter((e=>r[e].groupedId===n))}function we(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const o=be(e,t,n);return o&&o.every((e=>r.includes(e)))}function Ie(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Ce(e,t){const n=(0,u.Z1)(e,t);if(!n)return;if(!(0,u.xo)(e,n))return;const r=A(e,t),o=D(e,t,d._f);if(!r||!o)return;const a=(0,c.dF)(o,(e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons))),s=(0,c.dF)(o,(e=>Boolean(r[e].shouldHideKeyboardButtons)));return a&&s&&s>a?void 0:a?r[a]:void 0}function Se(e,t){const n=(0,u.Z1)(e,t.chatId);if(!n)return;const r=re(e,t),o=Boolean((0,i.O$)(t)||(0,i.F$)(t)),d=Boolean((0,i.b7)(t)||(0,i.Cg)(t)),a=Boolean((0,i.oP)(t)||(0,i.kd)(t)||(0,i.aE)(t)),{canAutoLoadPhotoFromContacts:s,canAutoLoadPhotoInPrivateChats:c,canAutoLoadPhotoInGroups:l,canAutoLoadPhotoInChannels:f,canAutoLoadVideoFromContacts:h,canAutoLoadVideoInPrivateChats:m,canAutoLoadVideoInGroups:p,canAutoLoadVideoInChannels:g,canAutoLoadFileFromContacts:y,canAutoLoadFileInPrivateChats:v,canAutoLoadFileInGroups:b,canAutoLoadFileInChannels:w}=e.settings.byKey;return o?Ee({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:s,canAutoLoadMediaInPrivateChats:c,canAutoLoadMediaInGroups:l,canAutoLoadMediaInChannels:f}):d?Ee({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:h,canAutoLoadMediaInPrivateChats:m,canAutoLoadMediaInGroups:p,canAutoLoadMediaInChannels:g}):!a||Ee({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:y,canAutoLoadMediaInPrivateChats:v,canAutoLoadMediaInGroups:b,canAutoLoadMediaInChannels:w})}function Ee({global:e,chat:t,sender:n,canAutoLoadMediaFromContacts:r,canAutoLoadMediaInPrivateChats:o,canAutoLoadMediaInGroups:d,canAutoLoadMediaInChannels:a}){const u=Boolean(n&&(n.id===e.currentUserId||(0,s.nM)(e,n)));return Boolean(u&&r||!u&&o&&(0,i.YC)(t.id)||d&&(0,i.Bf)(t)||a&&(0,i.eA)(t))}function Pe(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 Me(e){return e.settings.byKey.shouldLoopStickers}function Ae(e){const{serviceNotifications:t}=e,n=Math.max(...t.map((({id:e})=>e)));return t.find((({id:e})=>e===n))}function ke(e,t){var n;return!!t&&(t.isProtected||(null===(n=(0,u.Z1)(e,t.chatId))||void 0===n?void 0:n.isProtected))}function Te(e,t,n){var r;if(null!==(r=(0,u.Z1)(e,t))&&void 0!==r&&r.isProtected)return!0;if(!n)return!1;const o=A(e,t);return n.some((e=>{var t;return null===(t=o[e])||void 0===t?void 0:t.isProtected}))}function Ne(e,t){const n=(0,u.Z1)(e,t),r=n&&(0,i.eA)(n)?e.messages.sponsoredByChatId[t]:void 0;return r&&r.expiresAt>=Math.round(Date.now()/1e3)?r:void 0}function Le(e,t){var n,r,o;if(t===a.aw)return;const d=(0,i.YC)(t),s=null===(n=e.appConfig)||void 0===n?void 0:n.defaultReaction,{availableReactions:c}=e;if(!s||null==c||!c.some((e=>e.reaction===s&&!e.isInactive)))return;if(d)return s;const l=null===(r=(0,u.Z1)(e,t))||void 0===r||null===(o=r.fullInfo)||void 0===o?void 0:o.enabledReactions;return null!=l&&l.includes(s)?s:void 0}function Re(e){const{chatId:t,threadId:n}=P(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 De(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=P(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Oe(e){const t=De(e);if(t)return e.localMediaSearch.byChatId[t]}function Ze(e,t){return e.management.byChatId[t]}function xe(e){const{chatId:t,threadId:n}=P(e)||{};if(!t||!n)return;if((0,i.YC)(t))return"user";const r=(0,u.Z1)(e,t);return r?(0,i.Bf)(r)?"group":"channel":void 0}function _e(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Fe(e){const{users:t,isChatInfoShown:n,newChatMembersProgress:d}=e,a=d!==r.WB.Closed,s=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),i=Boolean(!o.wB&&Re(e)),c=function(e){const{chatId:t,threadId:n}=P(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}=P(e)||{},g=t.selectedId,y=(0,u.g4)(e),v=Boolean(g&&y),b=Boolean(p&&y)&&n;return s?r.qt.PollResults:i?r.qt.Search:c?r.qt.Management:h?r.qt.StickerSearch:m?r.qt.GifSearch:a?r.qt.AddingMembers:v?r.qt.UserInfo:b?r.qt.ChatInfo:void 0}function Be(e){return void 0!==Fe(e)}function $e(e){const{theme:t,shouldUseSystemTheme:n}=e.settings.byKey;return n?(0,o.vn)():t}function Ue(e){return e.globalSearch.query}function je(e){return e.payment.chatId}function We(e){return e.payment.messageId}function Ge(e){return e.payment.formId}function Ve(e){return e.payment.requestId}function He(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function ze(e){return e.payment.stripeCredentials}var Qe=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 a(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}n.d(t,{dy:()=>r,ss:()=>o,s4:()=>d,nM:()=>a})},1713:(e,t,n)=>{let r,o,d,a,u,s,i,c,l,f,h,m,p,g;n.d(t,{Uq:()=>r,fo:()=>o,MT:()=>d,du:()=>a,nJ:()=>u,qt:()=>s,bZ:()=>i,Cr:()=>c,Nh:()=>l,rN:()=>f,wv:()=>h,WB:()=>m,vi:()=>p,KB:()=>g,mp:()=>y,u1:()=>v}),function(e){e[e.Backwards=0]="Backwards",e[e.Forwards=1]="Forwards",e[e.Around=2]="Around"}(r||(r={})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(o||(o={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.DataStorage=3]="DataStorage",e[e.Language=4]="Language",e[e.General=5]="General",e[e.GeneralChatBackground=6]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=7]="GeneralChatBackgroundColor",e[e.Privacy=8]="Privacy",e[e.PrivacyPhoneNumber=9]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=10]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=11]="PrivacyProfilePhoto",e[e.PrivacyForwarding=12]="PrivacyForwarding",e[e.PrivacyGroupChats=13]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=14]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=15]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=16]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=17]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=18]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=19]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=20]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=21]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=22]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=23]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=24]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=25]="PrivacyBlockedUsers",e[e.Folders=26]="Folders",e[e.FoldersCreateFolder=27]="FoldersCreateFolder",e[e.FoldersEditFolder=28]="FoldersEditFolder",e[e.FoldersEditFolderFromChatList=29]="FoldersEditFolderFromChatList",e[e.FoldersIncludedChats=30]="FoldersIncludedChats",e[e.FoldersIncludedChatsFromChatList=31]="FoldersIncludedChatsFromChatList",e[e.FoldersExcludedChats=32]="FoldersExcludedChats",e[e.FoldersExcludedChatsFromChatList=33]="FoldersExcludedChatsFromChatList",e[e.TwoFaDisabled=34]="TwoFaDisabled",e[e.TwoFaNewPassword=35]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=36]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=37]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=38]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=39]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=40]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=41]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=42]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=43]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=44]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=45]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=46]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=47]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=48]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=49]="TwoFaCongratulations",e[e.QuickReaction=50]="QuickReaction"}(d||(d={})),function(e){e[e.ChatList=0]="ChatList",e[e.GlobalSearch=1]="GlobalSearch",e[e.Settings=2]="Settings",e[e.Contacts=3]="Contacts",e[e.Archived=4]="Archived",e[e.NewChannelStep1=5]="NewChannelStep1",e[e.NewChannelStep2=6]="NewChannelStep2",e[e.NewGroupStep1=7]="NewGroupStep1",e[e.NewGroupStep2=8]="NewGroupStep2"}(a||(a={})),function(e){e[e.ChatList=0]="ChatList",e[e.Media=1]="Media",e[e.Links=2]="Links",e[e.Files=3]="Files",e[e.Music=4]="Music",e[e.Voice=5]="Voice"}(u||(u={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.StickerSearch=4]="StickerSearch",e[e.GifSearch=5]="GifSearch",e[e.PollResults=6]="PollResults",e[e.AddingMembers=7]="AddingMembers"}(s||(s={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.SettingsAvatar=4]="SettingsAvatar",e[e.MiddleHeaderAvatar=5]="MiddleHeaderAvatar",e[e.Album=6]="Album",e[e.ScheduledAlbum=7]="ScheduledAlbum",e[e.SearchResult=8]="SearchResult"}(i||(i={})),function(e){e[e.Inline=0]="Inline",e[e.SharedMedia=1]="SharedMedia",e[e.Search=2]="Search"}(c||(c={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(l||(l={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(f||(f={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(h||(h={})),function(e){e[e.Closed=0]="Closed",e[e.InProgress=1]="InProgress",e[e.Loading=2]="Loading"}(m||(m={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(p||(p={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(g||(g={}));const y="UPLOADING_WALLPAPER_SLUG";let v;!function(e){e[e.Initial=0]="Initial",e[e.ChatPrivacyType=1]="ChatPrivacyType",e[e.Discussion=2]="Discussion",e[e.ChannelSubscribers=3]="ChannelSubscribers",e[e.GroupType=4]="GroupType",e[e.GroupPermissions=5]="GroupPermissions",e[e.GroupRemovedUsers=6]="GroupRemovedUsers",e[e.GroupUserPermissionsCreate=7]="GroupUserPermissionsCreate",e[e.GroupUserPermissions=8]="GroupUserPermissions",e[e.ChatAdministrators=9]="ChatAdministrators",e[e.GroupRecentActions=10]="GroupRecentActions",e[e.ChatAdminRights=11]="ChatAdminRights",e[e.ChatNewAdminRights=12]="ChatNewAdminRights",e[e.GroupMembers=13]="GroupMembers",e[e.GroupAddAdmins=14]="GroupAddAdmins",e[e.Invites=15]="Invites",e[e.EditInvite=16]="EditInvite",e[e.Reactions=17]="Reactions"}(v||(v={}))},9933:(e,t,n)=>{n.d(t,{cK:()=>d,jt:()=>a,M8:()=>u,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 a(e){(0,r.T2)((()=>{e()&&a(e)}))}const u={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=u.linear,onUpdate:t,duration:n,onEnd:r,from:o,to:d}){const s=Date.now();let i=!1;return a((()=>{if(i)return!1;let a=(Date.now()-s)/n;a>1&&(a=1);const u=e(a);if("number"==typeof o&&"number"==typeof d)t(o+(d-o)*u);else if(Array.isArray(o)&&Array.isArray(d)){const e=o.map(((e,t)=>e+(d[t]-e)*u));t(e)}return 1===a&&r&&r(),a<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:()=>a,clear:()=>u});const r=self.caches;let o;async function d(e,t,n,d=!1){if(r)try{const a=new Request(t.replace(/:/g,"_")),u=await r.open(e),s=await u.match(a);if(!s)return;const i=s.headers.get("Content-Type");switch(n){case o.Text:return await s.text();case o.Blob:{if(t.startsWith("avatar")&&i&&i.startsWith("text"))return;const e=await s.blob();if(t.startsWith("sticker"))return new Blob([e],{type:"image/webp"});const n=!e.type||!d&&e.type.includes("html");let r=e.type||i;return n&&r?(d||(r=r.replace(/html/gi,"")),new Blob([e],{type:r})):e}case o.Json:return await s.json();default:return}}catch(e){return void console.warn(e)}}async function a(e,t,n){if(r)try{const o="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t.replace(/:/g,"_")),a=new Response(o),u=await r.open(e);return await u.put(d,a)}catch(e){return void console.warn(e)}}async function u(e){try{if(!r)return;return await r.delete(e)}catch(e){return void console.warn(e)}}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(o||(o={}))},3989:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(517);function o(e){return(0,r.Z)({onEsc:e})}},517:(e,t,n)=>{n.d(t,{Z:()=>d});const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",ArrowLeft:"onLeft",ArrowRight:"onRight",Tab:"onTab"},o={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onLeft:[],onRight:[],onTab:[]};function d(e){return a()||document.addEventListener("keydown",u,!0),Object.keys(e).forEach((t=>{const n=e[t];if(!n)return;const r=o[t];r&&r.push(n)})),()=>{!function(e){Object.keys(e).forEach((t=>{const n=e[t],r=o[t];if(r){const e=r.findIndex((e=>e===n));-1!==e&&r.splice(e,1)}})),a()||document.removeEventListener("keydown",u,!1)}(e)}}function a(){return Object.values(o).some((e=>Boolean(e.length)))}function u(e){const t=r[e.key];if(!t)return;const{length:n}=o[t];n&&(e.stopPropagation(),(0,o[t][n-1])(e))}},790:(e,t,n)=>{n.d(t,{xR:()=>a,$Y:()=>u,_F:()=>s,kj:()=>i,mr:()=>l,VX:()=>f,Tu:()=>h,np:()=>m,D:()=>p,j1:()=>g,ZK:()=>v,k9:()=>b,rM:()=>w,xH:()=>I,SA:()=>C,xk:()=>E,IS:()=>P});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())),a=864e5;function u(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function s(e){return u(e).getTime()}function i(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function c(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function l(e,t){const n="number"==typeof t?new Date(t):t,r=e.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 f(e,t){const n="number"==typeof t?new Date(t):t,o=u(new Date);if(n>=o)return l(e,n);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 y(e,n,s)}function h(e,t){const n="number"==typeof t?new Date(t):t,r=e("formatterYearMax")||"dd.MM.yyyy";return y(e,n,r)}function m(e,t,n=!1){const r=e(n?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy";return y(e,t,r)}function p(e,t){const n=Math.floor(t/a);return t<0?0:n<1?b(t/1e3):n<7?e("Days",n):n<30?e("Weeks",Math.floor(n/7)):n<365?e("Months",Math.floor(n/30)):e("Years",Math.floor(n/365))}function g(e,t,n=!1,o=!1,d){const a="number"==typeof t?new Date(t):t,s=u(new Date);if(!o){if(c(a)===c(s))return(d||!n?A:M)(e("Weekday.Today"));const t=new Date(s);if(t.setDate(s.getDate()-1),c(a)===c(t))return(d||!n?A:M)(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?A:M)(e(n?`Weekday.Short${t}`:`Weekday.${t}`))}}const i=a.getFullYear()!==s.getFullYear(),l=e(n?i?"formatDateScheduleYear":"formatDateSchedule":i?"chatFullDate":"chatDate")||"d MMMM yyyy";return(d||!n?A:M)(y(e,a,l))}function y(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())).replace(/'de'/g,"de")}function v(e,t,n){const r="number"==typeof t?new Date(t):t;return`${g(e,r,!0,void 0,n)}, ${l(e,r)}`}function b(e,t){const n=Math.floor(e/3600),r=Math.floor(e%3600/60),o=Math.floor(e%3600%60),d=t?Math.floor(t/3600):0,a=t?Math.floor(t%3600/60):0;let u="";return n>0||d>0?(u+=`${String(n).padStart(2,"0")}:`,u+=`${String(r).padStart(2,"0")}:`):u+=a>=10?`${String(r).padStart(2,"0")}:`:`${String(r)}:`,u+=String(o).padStart(2,"0"),u}function w(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 I(e,t="en-US"){return("number"==typeof e?new Date(e):e).toLocaleString(t,{year:"numeric",month:"short",day:"numeric"})}function C(e,t="en-US"){return("number"==typeof e?new Date(e):e).toLocaleString(t,{year:"numeric",month:"short",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric"})}function S(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 E(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||!S(t,n-1,r||void 0)?void 0:`${r?`${r}-`:""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const o=e.split(" "),a=t?o[0]:o[1],u=(t?o[1]:o[0]).toLowerCase(),s=d.findIndex((e=>e.startsWith(u)));return-1!==s&&S(Number(a),s)?`${String(s+1).padStart(2,"0")}-${String(a).padStart(2,"0")}`:void 0}function P(e){return e+a/1e3}function M(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function A(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},4284:(e,t,n)=>{n.d(t,{g6:()=>u,U_:()=>s,NM:()=>i,Wg:()=>c});var r=n(3681);const o=["female_sign","male_sign","medical_symbol"],d=[[/\u{1f3f3}\u200d\u{1f308}/gu,"🏳️‍🌈"],[/\u{1f3f3}\u200d\u26a7\ufe0f/gu,"🏳️‍⚧️"],[/\u{1f937}\u200d\u2642[^\ufe0f]/gu,"🤷‍♂️"]];function a(e){const t=e.split("-").map((e=>parseInt(e,16)));return String.fromCodePoint(...t)}function u(e){if(!e.match(r.Z))return e;for(const[t,n]of d)e=e.replace(t,n);return e}function s(e){let t;if(1===e.length)t=e.charCodeAt(0).toString(16).padStart(4,"0");else{const n=[];for(let t=0;t=55296&&e.charCodeAt(t)<=56319?e.charCodeAt(t+1)>=56320&&e.charCodeAt(t+1)<=57343&&n.push(1024*(e.charCodeAt(t)-55296)+(e.charCodeAt(t+1)-56320)+65536):(e.charCodeAt(t)<55296||e.charCodeAt(t)>57343)&&n.push(e.charCodeAt(t));t=n.map((e=>e.toString(16).padStart(4,"0"))).join("-")}return t}function i(e){const t={categories:[],emojis:{}};for(let n=0;ne.codePointAt(0)+127397));return String.fromCodePoint(...n)}},1396:(e,t,n)=>{function r(e){if(e)return e.includes("://")?e:`http://${e}`}n.d(t,{X:()=>r})},7361:(e,t,n)=>{n.d(t,{Bi:()=>k,cL:()=>R,wZ:()=>p,vX:()=>M,op:()=>C,cj:()=>m,jm:()=>h,pA:()=>L,m5:()=>P,I_:()=>E,fl:()=>y,t0:()=>A,s$:()=>g,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 a,u;new Promise((e=>{const t=new Image;t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";const n=()=>{e(2===t.height)};t.onload=n,t.onerror=n})).then((e=>{o=e}));let s=null!==(a=(u=window).matchMedia)&&void 0!==a&&a.call(u,"(prefers-color-scheme: dark)").matches?"dark":"light";function i(){return s}function c(e){s=e.matches?"dark":"light"}const l=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof l.addEventListener?l.addEventListener("change",c):"function"==typeof l.addListener&&l.addListener(c);const f=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="macOS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}(),h="macOS"===f,m="iOS"===f,p="Android"===f,g=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),y=window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone||document.referrer.includes("android-app://"),v=window.matchMedia("(pointer: coarse)").matches,b=window.innerWidth<=r.l3||window.innerWidth<=r.u_&&window.innerHeight<=r.rO,w=!b&&window.innerWidth<=r.ks,I=Boolean(navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext)),C=(document.documentElement.style,f&&(h||m)),S="serviceWorker"in navigator,E=S,P=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),M=!r.Cg&&"filter"in(document.createElement("canvas").getContext("2d")||{}),A="requestFullscreen"in document.createElement("div"),k=!navigator.userAgent.includes("Firefox"),T=p?"slide-fade":m?"slide-layers":"push-slide",N=document.createElement("video"),L=Boolean(N.canPlayType(r.Ng).replace("no","")||m);L&&r.wG.add(r.Ng);const R=window.devicePixelRatio||1,D=!0,O=!h&&!m&&!p,Z=O?300:750},1394:(e,t,n)=>{n.d(t,{A9:()=>d,YJ:()=>a,hl:()=>u,pt:()=>s,jj:()=>i,ud:()=>c,gm:()=>l,dc:()=>f,ao:()=>h});var r=n(9118);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let o=r.length;const d=new Uint8Array(o);for(;o--;)d[o]=r.charCodeAt(o);return new Blob([d],{type:n})}function a(e){return new Promise(((t,n)=>{const r=new FileReader;r.onload=e=>{const{result:r}=e.target||{};"string"==typeof r&&t(r),n(new Error("Failed to read blob"))},r.onerror=n,r.readAsDataURL(e)}))}function u(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function s(e){return new Promise(((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=n,r.src=e}))}function i(e){return new Promise(((t,n)=>{const r=document.createElement("video");r.volume=0,r.onloadedmetadata=()=>t(r),r.onerror=n,r.src=e}))}async function c(e){const t=await i(e);return Promise.race([(0,r.wO)(2e3),new Promise(((e,n)=>{t.onseeked=()=>{t.videoWidth&&t.videoHeight||e(void 0);const n=document.createElement("canvas");n.width=t.videoWidth,n.height=t.videoHeight,n.getContext("2d").drawImage(t,0,0),e(n.toDataURL("image/jpeg"))},t.onerror=n,t.currentTime=Math.min(t.duration,1)}))])}async function l(e){return(await fetch(e)).blob()}async function f(e,t){return u(await l(e),t)}function h(e){const t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),o(this,"name",void 0),Object.assign(this,r)}else super(e),o(this,"name",void 0);this.name=t}})},9937:(e,t,n)=>{function r(e,t,n="en"){return new Intl.NumberFormat(n,{style:"currency",currency:t}).format("JPY"===t?e:e/100)}n.d(t,{x:()=>r})},6926:(e,t,n)=>{n.d(t,{Z:()=>r});const r=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},1947:(e,t,n)=>{n.d(t,{ZP:()=>d,J_:()=>a});const r={CHAT_RESTRICTED:"You can't send messages in this chat, you were restricted",CHAT_WRITE_FORBIDDEN:"You can't write in this chat",CHAT_SEND_POLL_FORBIDDEN:"You can't create polls in this chat",CHAT_SEND_STICKERS_FORBIDDEN:"You can't send stickers in this chat",CHAT_SEND_GIFS_FORBIDDEN:"You can't send gifs in this chat",CHAT_SEND_MEDIA_FORBIDDEN:"You can't send media in this chat",CHAT_LINK_EXISTS:"The chat is public, you can't hide the history to new users",SLOWMODE_WAIT_X:"Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.",USER_BANNED_IN_CHANNEL:"You're banned from sending messages in supergroups / channels",USER_IS_BLOCKED:"You were blocked by this user",YOU_BLOCKED_USER:"You blocked this user",IMAGE_PROCESS_FAILED:"Failure while processing image",MEDIA_EMPTY:"The provided media object is invalid",MEDIA_INVALID:"Media invalid",PHOTO_EXT_INVALID:"The extension of the photo is invalid",PHOTO_INVALID_DIMENSIONS:"The photo dimensions are invalid",PHOTO_SAVE_FILE_INVALID:"Internal issues, try again later",MESSAGE_DELETE_FORBIDDEN:"You can't delete one of the messages you tried to delete, most likely because it is a service message.",MESSAGE_POLL_CLOSED:"Poll closed",MESSAGE_EDIT_TIME_EXPIRED:"You can't edit this message anymore.",CHAT_ADMIN_REQUIRED:"You must be an admin in this chat to do this",PINNED_DIALOGS_TOO_MUCH:"Sorry, you can only pin 5 chats to the top",DIALOG_FILTERS_TOO_MUCH:"Sorry, you can't have more than 10 folders",CHANNEL_PRIVATE:"This channel is private",MEDIA_CAPTION_TOO_LONG:"The provided caption is too long",ADDRESS_STREET_LINE1_INVALID:"The address you provided is not valid",ADDRESS_STREET_LINE2_INVALID:"The address you provided is not valid",ADDRESS_CITY_INVALID:"The city you provided is not valid",ADDRESS_COUNTRY_INVALID:"The country you provided is not valid",ADDRESS_POSTCODE_INVALID:"The postcode you provided is not valid",ADDRESS_STATE_INVALID:"The state you provided is not valid",REQ_INFO_NAME_INVALID:"The name you provided is not valid",REQ_INFO_PHONE_INVALID:"The phone you provided is not valid",REQ_INFO_EMAIL_INVALID:"The email you provided is not valid",LINK_NOT_MODIFIED:"This discussion is already linked to the channel",MESSAGE_TOO_LONG:"Message is too long",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided message is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.",FRESH_RESET_AUTHORISATION_FORBIDDEN:"You can’t logout other sessions if less than 24 hours have passed since you logged on the current session",BOTS_TOO_MUCH:"There are too many bots in this chat/channel",BOT_GROUPS_BLOCKED:"This bot can't be added to groups",USERS_TOO_MUCH:"The maximum number of users has been exceeded",USER_CHANNELS_TOO_MUCH:"One of the users you tried to add is already in too many channels/supergroups",USER_KICKED:"This user was kicked from this supergroup/channel",USER_NOT_MUTUAL_CONTACT:"The provided user is not a mutual contact",USER_PRIVACY_RESTRICTED:"The user's privacy settings do not allow you to do this",INVITE_HASH_EMPTY:"The invite hash is empty",INVITE_HASH_EXPIRED:"The invite link has expired",INVITE_HASH_INVALID:"The invite hash is invalid",CHANNELS_TOO_MUCH:"You have joined too many channels/supergroups",USER_ALREADY_PARTICIPANT:"You already in the group",SCHEDULE_DATE_INVALID:"Invalid schedule date provided",WALLPAPER_DIMENSIONS_INVALID:"The wallpaper dimensions are invalid, please select another file",ADMINS_TOO_MUCH:"There are too many admins",ADMIN_RANK_EMOJI_NOT_ALLOWED:"An admin rank cannot contain emojis",ADMIN_RANK_INVALID:"The specified admin rank is invalid",FRESH_CHANGE_ADMINS_FORBIDDEN:"You were just elected admin, you can't add or modify other admins yet",INPUT_USER_DEACTIVATED:"The specified user was deleted"},o={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",message:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",message:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",message:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",message:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",message:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",message:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",message:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",message:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",message:"Incorrect email"}};function d(e){const{message:t,isSlowMode:n,textParams:o}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let d=r[t];return d&&o&&(d=Object.keys(o).reduce(((e,t)=>e.replace(t,o[t])),d)),d}function a(e){return o[e.message]}},3592:(e,t,n)=>{n.d(t,{S:()=>d}),n(3716);var r=n(9118);function o(e){e.preventDefault(),d(e instanceof ErrorEvent?e.error:e.reason)}function d(e){console.error(e)}window.addEventListener("error",o),window.addEventListener("unhandledrejection",o),(0,r.P2)(window.alert,1e3)},782:(e,t,n)=>{function r(e,t){return e.reduce(((e,n)=>(e[n[t]]=n,e)),{})}function o(e,t){return Object.keys(e).reduce(((n,r,o)=>(n[r]=t(e[r],r,o,e),n)),{})}function d(e,t){return t.reduce(((t,n)=>(t[n]=e[n],t)),{})}function a(e,t){return t.reduce(((t,n)=>(e[n]&&(t[n]=e[n]),t)),{})}function u(e,t){const n=new Set(t.map(String));return d(e,Object.keys(e).filter((e=>!n.has(e))))}function s(e,t,n="asc"){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],[a,u]=t,s="asc"===o,i="asc"===d;return e.sort(((e,t)=>r(e,t,a,s)||r(e,t,u,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:()=>a,CE:()=>u,Xo:()=>s,xH:()=>i,Tw:()=>c,oA:()=>l,et:()=>f,YE:()=>h,eL:()=>m,Vl:()=>p,Xh:()=>g,dF:()=>y})},663:(e,t,n)=>{n.d(t,{ll:()=>m,i0:()=>b,Pn:()=>w,m0:()=>I,qf:()=>C});var r=n(5116),o=n(3716),d=n(9524),a=n(1226),u=n(2155);const s=/%\d?\$?[sdf@]/g,i=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],c={en:e=>1!==e?6:2,ar:e=>0===e?1:1===e?2:2===e?3:e%100>=3&&e%100<=10?4:e%100>=11?5:6,ca:e=>1!==e?6:2,de:e=>1!==e?6:2,es:e=>1!==e?6:2,fa:e=>e>1?6:2,fr:e=>e>1?6:2,id:()=>0,it:e=>1!==e?6:2,ko:()=>0,ms:()=>0,nl:e=>1!==e?6:2,pl:e=>1===e?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,pt_BR:e=>e>1?6:2,ru:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,tr:e=>e>1?6:2,uk:e=>e%10==1&&e%100!=11?2:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?4:5,uz:e=>e>1?6:2},l=new Map;let f,h;const{addCallback:m,removeCallback:p,runCallbacks:g}=function(){const e=[];function t(t){const n=e.indexOf(t);-1!==n&&e.splice(n,1)}return{runCallbacks:function(...t){e.forEach((e=>{e(...t)}))},addCallback:function(n){return e.push(n),()=>{t(n)}},removeCallback:t}}();let y,v;const b=(e,t,n)=>{var r,o;if(void 0!==t){const r=Array.isArray(t)?JSON.stringify(t):t,o=l.get(`${e}_${r}_${n}`);if(o)return o}if(!f&&!h)return e;const d=(null===(r=f)||void 0===r?void 0:r[e])||(null===(o=h)||void 0===o?void 0:o[e]);return d?E(d,e,t,n):(h||S(),e)};async function w(e,t){let n=await d.fetch(o.ee,`${o.$O}_${e}_${t}`,d.Type.Json);return n||(n=await async function(e,t,n){const r=await(0,a.t9)("fetchLangStrings",{langPack:e,langCode:t,keys:[n]});if(null!=r&&r.length)return await d.save(o.ee,`${e}_${t}_${n}`,r[0]),r[0]}(o.$O,e,t)),E(n,t)}async function I(e,t,n=!1){if(f&&e===y)return void(t&&t());let u=await d.fetch(o.ee,e,d.Type.Json);if(!u&&(n&&await S(),u=await async function(e){const t=await(0,a.t9)("fetchLangPack",{sourceLangPacks:o.Bg,langCode:e});if(t)return await d.save(o.ee,e,t.langPack),t.langPack}(e),!u))return;l.clear(),y=e,f=u,document.documentElement.lang=e;const{languages:s,timeFormat:i}=(0,r.Rd)().settings.byKey,c=null==s?void 0:s.find((t=>t.langCode===e));b.isRtl=Boolean(null==c?void 0:c.rtl),b.code=e,b.timeFormat=i,t&&t(),g()}function C(e){e&&e===v||(v=e,b.timeFormat=e,g())}async function S(){h||(h=(await n.e(915).then(n.bind(n,1915))).default,g())}function E(e,t,n,r){const d=e?e["number"==typeof n?function(e){const t=y||o.sR,n=c[t]?c[t](e):0;return i[n]}(n):"value"]:void 0;if(!d||!d.trim()){const e=t.split(".");return e[e.length-1]}if(void 0!==n){const e=function(e,t){t=Array.isArray(t)?t:[t];const n=e.split(s),r=n.shift();return n.reduce(((e,n,r)=>`${e}${String(t[r]||"")}${n}`),r||"")}(d,"i"===r?(0,u.kh)(n):n),o=Array.isArray(n)?JSON.stringify(n):n;return l.set(`${t}_${o}_${r}`,e),e}return d}},647:(e,t,n)=>{n.d(t,{cC:()=>b,he:()=>y,UV:()=>v,Iq:()=>w});var r=n(6137),o=n(3716),d=n(1226),a=n(9524),u=n(1394),s=n(7361);const i=48e3;async function c(e){const t=await new Response(e).arrayBuffer();return new Promise((e=>{const r=new Uint8Array(t);let o=new Worker(new URL(n.p+n.u(745),n.b)),d=new Worker(new URL(n.p+n.u(993),n.b));o.onmessage=e=>{null===e.data?d.postMessage({command:"done"}):d.postMessage({command:"encode",buffers:e.data},e.data.map((({buffer:e})=>e)))},d.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),o.terminate(),o=void 0,d.terminate(),d=void 0)},d.postMessage({command:"init",wavBitDepth:16,wavSampleRate:i}),o.postMessage({command:"init",decoderSampleRate:i,outputBufferSampleRate:i}),o.postMessage({command:"decode",pages:r},[r.buffer])}))}var l=n(862);const f={[r.IU.BlobUrl]:a.Type.Blob,[r.IU.Lottie]:a.Type.Json,[r.IU.Progressive]:void 0,[r.IU.Stream]:void 0},h=new Map,m=new Map,p=new Map,g=new Map;function y(e,t,n=!1,i,v){if(t===r.IU.Progressive)return s.I_?function(e){const t=`./progressive/${e}`;return h.set(e,t),Promise.resolve(t)}(e):y(e,r.IU.BlobUrl,n,i,v);if(!m.has(e)){const i=async function(e,t,n){if(!o.Cy){const r=e.startsWith("avatar")?o.SG:o.lW,d=await a.fetch(r,e,f[t],n);if(d){let t=d;if("audio/ogg"!==d.type||s.m5||(t=await c(t)),"image/webp"===d.type&&!(0,s.on)()&&t){const n=await(0,l._y)(e,t);n&&(t=n)}const n=C(t);return h.set(e,n),n}}if(t===r.IU.Stream){const n=new MediaSource,r=URL.createObjectURL(n);let o=!1;return n.addEventListener("sourceopen",(()=>{if(o)return;o=!0;const r=n.addSourceBuffer("audio/mpeg"),a=I(e,n,r);g.set(e,a),(0,d.t9)("downloadMedia",{url:e,mediaFormat:t},a)})),h.set(e,r),r}const i=I(e);g.set(e,i);const m=await(0,d.t9)("downloadMedia",{url:e,mediaFormat:t,isHtmlAllowed:n},i);if(!m)throw new Error(`Failed to fetch media ${e}`);let{prepared:p,mimeType:y}=m;if("audio/ogg"===y&&!s.m5){const e=await(0,u.gm)(p);URL.revokeObjectURL(p);const t=await c(e);p=C(t),y=t.type}if("image/webp"===y&&!(0,s.on)()){const t=await(0,u.gm)(p);URL.revokeObjectURL(p);const n=await(0,l._y)(e,t);n&&(p=C(n))}return h.set(e,p),p}(e,t,n).catch((e=>{o.eM&&console.warn(e)})).finally((()=>{m.delete(e),p.delete(e),g.delete(e)}));m.set(e,i)}if(i&&v){let t=p.get(e);t||(t=new Map,p.set(e,t)),t.set(v,i)}return m.get(e)}function v(e){return h.get(e)}function b(e){p.forEach(((t,n)=>{t.forEach((t=>{if(t===e){const e=g.get(n);if(!e)return;(0,d.u3)(e),g.delete(n),p.delete(n)}}))}))}function w(e,t){const n=p.get(e);n&&n.delete(t)}function I(e,t,n){const r=(o,d)=>{var a;null===(a=p.get(e))||void 0===a||a.forEach((e=>{e(o),e.isCanceled&&(r.isCanceled=!0)})),1===o&&(null==t||t.endOfStream()),d&&(null==n||n.appendBuffer(d))};return r}function C(e){return e instanceof Blob?URL.createObjectURL(e):e}s.I_&&navigator.serviceWorker.addEventListener("message",(async e=>{const{type:t,messageId:n,params:o}=e.data;if("requestPart"!==t)return;const a=await(0,d.t9)("downloadMedia",{mediaFormat:r.IU.Progressive,...o});if(!a)return;const{arrayBuffer:u,mimeType:s,fullSize:i}=a;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:u,mimeType:s,fullSize:i}},[u])}))},735:(e,t,n)=>{n.d(t,{D:()=>r});const r=[]},9203:(e,t,n)=>{n.d(t,{gl:()=>o,$y:()=>u,o5:()=>s,Qt:()=>c});var r=n(3716);let o;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra",e[e.Calls=3]="Calls"}(o||(o={}));const d={},a={};async function u(e,t){if(!d[e]){switch(e){case o.Auth:d[o.Auth]=n.e(133).then(n.bind(n,1133));break;case o.Main:r.eM&&console.log(">>> START LOAD MAIN BUNDLE"),d[o.Main]=Promise.all([n.e(830),n.e(11),n.e(884),n.e(700)]).then(n.bind(n,4700));break;case o.Extra:d[o.Extra]=Promise.all([n.e(830),n.e(11),n.e(442)]).then(n.bind(n,1442));break;case o.Calls:d[o.Calls]=Promise.all([n.e(830),n.e(884),n.e(532)]).then(n.bind(n,7936))}d[e].then(l)}const u=await d[e];return a[e]||(a[e]=u),s(e,t)}function s(e,t){const n=a[e];if(n)return n[t]}const i=[];function c(e){i.includes(e)||i.push(e)}function l(){i.forEach((e=>{e()}))}},8406:(e,t,n)=>{n.d(t,{q3:()=>v,Nz:()=>b,r1:()=>C,Ld:()=>E,zP:()=>P,Vr:()=>M,KC:()=>A});var r=n(1226),o=n(6137),d=n(8005),a=n(3716),u=n(5116),s=n(2858),i=n(663),c=n(9959),l=n(1638),f=n(7361),h=n(647),m=n(9118);function p(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function g(){return!!f.Mc&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(a.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(a.eM&&console.warn("[PUSH] Push messaging isn't supported."),!1):(a.eM&&console.warn("[PUSH] Push notifications aren't supported."),!1))}const y=new Set;async function v(e,t){if(void 0!==e&&y.has(e))return;const{notificationSoundVolume:n}=(0,l.dZ)((0,u.Rd)()),r=t?t/10:n/10;if(0===r)return;const o=new Audio("./notification.mp3");o.volume=r,o.setAttribute("mozaudiochannel","notification"),void 0!==e&&(o.addEventListener("ended",(()=>{y.add(e)}),{once:!0}),setTimeout((()=>{y.delete(e)}),3e3));try{await o.play()}catch(e){a.eM&&console.warn("[PUSH] Unable to play notification sound")}}const b=(0,m.Ds)(v,1e3,!0,!1);async function w(){"Notification"in window&&(["granted","denied"].includes(Notification.permission)||await Notification.requestPermission())}async function I(e){const t=(0,u.Rd)(),n=(0,u.uC)();if(e)try{const t=p(e);return await(0,r.t9)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){a.eM&&console.log("[PUSH] Unable to unsubscribe from push.",e)}t.push&&(await(0,r.t9)("unregisterDevice",t.push.deviceToken),n.deleteDeviceToken())}async function C(){if(!g())return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();await I(t)}let S=!1;async function E(){if(!g())return void await w();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=(0,u.Rd)();return!t.push||!e||p(e)!==t.push.deviceToken||Date.now()-t.push.subscribedAt>432e5}(t)){await I(t);try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=p(t);a.eM&&console.log("[PUSH] Received push subscription: ",n),await(0,r.t9)("registerDevice",n),(0,u.uC)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?a.eM&&console.warn("[PUSH] The user has blocked push notifications."):a.eM&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await w())}}}async function P({chat:e,message:t}){const{hasWebNotifications:n}=await async function(){if(S)return(0,l.dZ)((0,u.Rd)());const[e,t]=await Promise.all([(0,r.t9)("fetchNotificationSettings",{serverTimeOffset:(0,u.Rd)().serverTimeOffset}),(0,r.t9)("fetchNotificationExceptions",{serverTimeOffset:(0,u.Rd)().serverTimeOffset})]);if(!e)return(0,l.dZ)((0,u.Rd)());let n=(0,c.BI)((0,u.Rd)(),e);return t&&(n=(0,c.aJ)(n,t)),(0,u.R3)(n),S=!0,(0,l.dZ)(n)}();if(!function(e){if(!S)return!1;const t=(0,u.Rd)();return!((0,s.i4)(e,(0,l.dZ)(t),(0,l.NJ)(t))||e.isNotJoined||!e.isListed||document.hasFocus())}(e))return;const f="Notification"in window?"denied"!==Notification.permission||(a.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):(a.eM&&console.warn("[PUSH] This browser does not support desktop notification"),!1);if(!n||!f)return void b(String(t.id)||e.id);if(!f)return;if(!t.id)return;const{title:m,body:p}=function(e,t){const n=(0,u.Rd)(),{senderId:r,replyToMessageId:o}=t,a=r?(0,l.dy)(n,r):void 0,c=(0,s.N5)(t),f=c&&o?(0,l.hj)(n,e.id,o):void 0,{targetUserIds:h,targetChatId:m}=c||{},p=h?h.map((e=>(0,l.dy)(n,e))).filter(Boolean):void 0,g=(0,s.zX)(e),y=g?(0,l.dy)(n,g):void 0;let v;if((0,s.Sm)(e,(0,l.dZ)(n),(0,l.NJ)(n)))if((0,s.Lo)(t)){const n=e&&((0,s.eA)(e)||t.senderId===t.chatId)?e:a;v=(0,d.D)(i.i0,t,n,p,f,m,{asPlain:!0})}else{const n=(0,s.zF)(i.i0,e.id,a),r=(0,s.MK)(i.i0,t);v=n?`${n}: ${r}`:r}else v="New message";return{title:(0,s.U)(i.i0,e,y),body:v}}(e,t),y=await async function(e){const t=(0,s.RT)(e);if(!t)return;let n=h.UV(t);return n||(await h.he(t,o.IU.BlobUrl),n=h.UV(t)),n}(e);if(g()){var v;null!==(v=navigator.serviceWorker)&&void 0!==v&&v.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:m,body:p,icon:y,chatId:e.id,messageId:t.id}})}else{const n=(0,u.uC)(),r={body:p,icon:y,badge:y,tag:String(t.id)};"vibrate"in navigator&&(r.vibrate=[200,100,200]);const o=new Notification(m,r);o.onclick=()=>{o.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()},o.onshow=()=>{b(String(t.id)||e.id)}}}function M(e){var t;!a.Cg&&null!==(t=navigator.serviceWorker)&&void 0!==t&&t.controller&&navigator.serviceWorker.controller.postMessage({type:"closeMessageNotifications",payload:e})}function A(){var e;null!==(e=navigator.serviceWorker)&&void 0!==e&&e.controller&&navigator.serviceWorker.controller.postMessage({type:"clientReady"})}},7926:(e,t,n)=>{n.d(t,{L:()=>d,$:()=>a});const r="kz_version",o=["Z","K"];function d(e){localStorage.setItem(r,JSON.stringify(e))}function a(){(function(){const e=localStorage.getItem(r);if(!e)return!1;try{const t=JSON.parse(e);return o.includes(t)}catch(e){return!1}})()||d("Z")}},6272:(e,t,n)=>{n.d(t,{U9:()=>a,g3:()=>u,un:()=>s,WZ:()=>i});var r=n(782);const o="X",d="XXX XXX XXX XXX";function a(e,t){return e.filter((e=>e.iso2===t))}function u(e,t=""){var n;let o=t.replace(/[^\d+]+/g,"");o.startsWith("+")&&(o=o.substr(1));const d=e.filter((e=>o.startsWith(e.countryCode))),a=(0,r.xH)(d.map((e=>(e.prefixes||[""]).map((t=>({code:`${e.countryCode}${t}`,country:e})))))).filter((({code:e})=>o.startsWith(e))).sort(((e,t)=>e.code.length-t.code.length));return null===(n=a[a.length-1])||void 0===n?void 0:n.country}function s(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.countryCode.length);else if(e.startsWith("+"))return e;const r=function(e,t){if(!t||0===t.length)return d;if(1===t.length)return t[0];const n=t.find((e=>e.startsWith(o)))||d,r=t.filter((t=>{const n=t.replace(/[^\dX]+/g,"");if(n.startsWith(o))return!1;for(let t=0;tn.length-1||n[t]!==o&&n[t]!==e[t])return!1;return!0}));return 1===r.length?r[0]:n}(n,null==t?void 0:t.patterns),a=[];let u=0;for(let e=0;e{n.d(t,{q:()=>o,V:()=>d});var r=n(6137);const o=e=>e.chatId.toString()+("thread"!==e.type?`_${e.type}`:-1!==e.threadId?`_${e.threadId}`:""),d=e=>{if(!e)return;const[t,n]=e.replace(/^#/,"").split("_");if(!t)return;const o=["thread","pinned","scheduled"].includes(n);return{chatId:t,type:n&&o?n:"thread",threadId:n&&!o?Number(n):r._f}}},9118:(e,t,n)=>{function r(e,t,n=!0,r=!0){let o;return(...d)=>{o?(clearTimeout(o),o=void 0):n&&e(...d),o=self.setTimeout((()=>{r&&e(...d),o=void 0}),t)}}function o(e,t,n=!0){let r,o,d;return(...a)=>{o=!0,d=a,r||(n&&(o=!1,e(...d)),r=self.setInterval((()=>{if(!o)return self.clearInterval(r),void(r=void 0);o=!1,e(...d)}),t))}}function d(e){return s(y,e)}function a(e){return s(v,e)}function u(e){return s(b,e)}function s(e,t){let n,r=!1;return(...o)=>{n=o,r||(r=!0,e((()=>{r=!1,t(...n)})))}}function i(e,t){self.requestIdleCallback?self.requestIdleCallback(e,{timeout:t}):b(e)}n.d(t,{Ds:()=>r,P2:()=>o,mS:()=>d,wT:()=>a,$6:()=>u,Q8:()=>i,wO:()=>c,Pn:()=>l,T2:()=>y,D0:()=>v,R3:()=>b,zD:()=>w,Gq:()=>I});const c=e=>new Promise((t=>{setTimeout((()=>t()),e)}));function l(){return new Promise((e=>{y(e)}))}let f,h,m,p,g;function y(e,t=!1){f?t?h.push(e):f.push(e):(f=t?[]:[e],h=t?[e]:[],requestAnimationFrame((()=>{const e=f,t=h;f=void 0,h=void 0,t.forEach((e=>e())),e.forEach((e=>e()))})))}function v(e){y(e,!0)}function b(e,t=!1){m?t?p.push(e):m.push(e):(m=t?[]:[e],p=t?[e]:[],Promise.resolve().then((()=>{const e=m,t=p;m=void 0,p=void 0,t.forEach((e=>e())),e.forEach((e=>e()))})))}function w(e){b(e,!0)}function I(e,t=!1){return g||(g=[],self.addEventListener("beforeunload",(()=>{g.forEach((e=>e()))}))),t?g.push(e):g.unshift(e),()=>{g=g.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 a=n(3716),u=n(9524);const s=[1,2,3,4,5];function i(e=!1){if(e&&localStorage.getItem(a.Vx))return!0;const t=localStorage.getItem(a.b_);if(!t)return!1;try{const e=JSON.parse(t);return Boolean(e&&e.id&&e.dcID)}catch(e){return!1}}function c(e,t){const{mainDcId:n,keys:r,hashes:o}=e;localStorage.setItem(a.b_,JSON.stringify({dcID:n,id:t})),localStorage.setItem("dc",String(n)),Object.keys(r).map(Number).forEach((e=>{localStorage.setItem(`dc${e}_auth_key`,JSON.stringify(r[e]))})),o&&Object.keys(o).map(Number).forEach((e=>{localStorage.setItem(`dc${e}_hash`,JSON.stringify(o[e]))}))}function l(){[a.b_,"dc",...s.map((e=>`dc${e}_auth_key`)),...s.map((e=>`dc${e}_hash`))].forEach((e=>{localStorage.removeItem(e)}))}function f(){if(!i())return;const e=JSON.parse(localStorage.getItem(a.b_)),t=Number(e.dcID),n={},r={};return s.forEach((e=>{try{const t=localStorage.getItem(`dc${e}_auth_key`);t&&(n[e]=JSON.parse(t));const o=localStorage.getItem(`dc${e}_hash`);o&&(r[e]=JSON.parse(o))}catch(e){a.eM&&console.warn("Failed to load stored session",e)}})),Object.keys(n).length?{mainDcId:t,keys:n,hashes:r}:void 0}async function h(){const e=localStorage.getItem(a.Vx);if(!e)return;const t=await function(e,t=d()){return t("readonly",(t=>r(t.get(e))))}(`GramJs:${e}`);try{c(JSON.parse(t))}catch(e){a.eM&&console.warn("Failed to load legacy session",e)}}async function m(){localStorage.removeItem(a.Vx);const e=await function(e=d()){const t=[];return function(e,t){return e("readonly",(e=>(e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},r(e.transaction))))}(e,(e=>t.push(e.key))).then((()=>t))}();await Promise.all([u.clear("GramJs"),...e.filter((e=>"string"==typeof e&&e.startsWith("GramJs:GramJs-session-"))).map((e=>function(e,t=d()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}(e)))])}},6917:(e,t,n)=>{n.d(t,{Z:()=>c});var r=n(9933);const o=JSON.parse('{"--color-primary":["#3390EC","#8774E1"],"--color-primary-opacity":["#50A2E980","#8378DB80"],"--color-primary-shade":["#4a95d6","#7b71c6"],"--color-background":["#FFFFFF","#212121"],"--color-background-secondary":["#f4f4f5","#0F0F0F"],"--color-background-secondary-accent":["#E4E4E5","#100f10"],"--color-background-own":["#EEFFDE","#8774E1"],"--color-background-own-apple":["#DCF8C5","#8774E1"],"--color-background-selected":["#F4F4F5","#2C2C2C"],"--color-background-own-selected":["#d0ffac","#6549d4"],"--color-chat-hover":["#F4F4F5","#2C2C2C"],"--color-chat-active":["#3390EC","#8774E1"],"--color-item-active":["#ededed","#292929"],"--color-text":["#000000","#FFFFFF"],"--color-text-secondary":["#707579","#AAAAAA"],"--color-text-secondary-apple":["#8E8E92","#AAAAAA"],"--color-borders":["#DADCE0","#303030"],"--color-borders-input":["#DADCE0","#5B5B5A"],"--color-dividers":["#C8C6CC","#404040"],"--color-links":["#3390EC","#8774E1"],"--color-gray":["#C4C9CC","#717579"],"--color-pinned":["#C4C9CC","#707579"],"--color-default-shadow":["#72727240","#1010109c"],"--color-light-shadow":["#7272722B","#00000040"],"--color-green":["#00C73E","#8774E1"],"--color-text-meta-colored":["#4DCD5E","#8378DB"],"--color-reply-hover":["#F4F4F4","#272727"],"--color-reply-active":["#E8E9E9","#2E2F2F"],"--color-reply-own-hover":["#D9F5CE","#7d6bca"],"--color-reply-own-hover-apple":["#cbefb7","#7d6bca"],"--color-reply-own-active":["#C5ECBE","#7264b6"],"--color-reply-own-active-apple":["#bae6a8","#7264b6"],"--color-accent-own":["#45AF54","#FFFFFF"],"--color-message-meta-own":["#4FAE4EFF","#FFFFFF88"],"--color-own-links":["#3390EC","#FFFFFF"],"--color-code":["#4a729a","#8774E1"],"--color-code-own":["#3c7940","#FFFFFF"],"--color-code-bg":["#70757914","#ffffff26"],"--color-code-own-bg":["#70757914","#ffffff26"],"--color-composer-button":["#707579CC","#AAAAAACC"],"--color-message-reaction":["#ebf3fd","#2b2a35"],"--color-message-reaction-hover":["#c5def9","#343147"],"--color-message-reaction-own":["#cef0ba","#7a68ca"],"--color-message-reaction-hover-own":["#b5e0a4","#7567bc"]}');let d=!1;const a=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,u=new Set(["--color-primary-shade","--color-text-secondary"]),s=(e,t,n)=>(1-n)*e+n*t,i=Object.keys(o).map((e=>({property:e,colors:[l(o[e][0]),l(o[e][1])]}))),c=(e,t)=>{const n="dark"===e,o=d&&t,a=n?0:1,u=n?1:0,s=Date.now(),i=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),d&&document.documentElement.classList.add("no-animations"),document.documentElement.classList.add(`theme-${e}`),i&&i.setAttribute("content",n?"#212121":"#fff"),setTimeout((()=>{document.documentElement.classList.remove("no-animations")}),500),d=!0,o?(0,r.cK)((()=>{const e=Math.min((Date.now()-s)/200,1);return f(a,u,function(e){return 1-(1-e)**3.5}(e)),e<1})):f(a,u)};function l(e){const t=a.exec(e);return{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16),a:void 0!==t[4]?parseInt(t[4],16):void 0}}function f(e,t,n=1){i.forEach((({property:r,colors:o})=>{const d=Math.round(s(o[e].r,o[t].r,n)),a=Math.round(s(o[e].g,o[t].g,n)),i=Math.round(s(o[e].b,o[t].b,n)),c=void 0!==o[e].a?Math.round(s(o[e].a,o[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==c?`rgba(${d},${a},${i},${c/255})`:`rgb(${d},${a},${i})`),u.has(r)&&document.documentElement.style.setProperty(`${r}-rgb`,`${d},${a},${i}`)}))}},2155:(e,t,n)=>{n.d(t,{kh:()=>d,bi:()=>u,Xv:()=>s});var r=n(3681),o=n(4284);function d(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function a(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function u(e){return e<1e3?e:e<1e6?`${a(e/1e3)}K`:`${a(e/1e6)}M`}function s(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map((e=>{if(!e.length)return"";const t=(e=(0,o.g6)(e)).match(r.Z);return t&&e.startsWith(t[0])?t[0]:e.match(/./u)[0].toUpperCase()})).join("")}},8035:(e,t,n)=>{function r(e,t=30){return!e||e.length<=t?e:`${e.substr(0,t)}...`}n.d(t,{Z:()=>r})},862:(e,t,n)=>{n.d(t,{Hu:()=>s,_y:()=>i,p6:()=>c});var r=n(7361),o=n(1394),d=n(9118);let a,u;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function i(e,t){for(l();!u.wasmReady;)await(0,d.wO)(2e3);const{result:n,width:r,height:o}=await function(e,t){return new Promise((n=>{u.requests||(u.requests=new Map),u.requests.set(e,n),u.postMessage({id:e,blob:t})}))}(e,t);if(r&&o)return function({result:e,width:t,height:n}){return a||(a=document.createElement("canvas")),new Promise((r=>{const o=new ImageData(e,t,n);a.width=t,a.height=n,a.getContext("2d").putImageData(o,0,0),a.toBlob((e=>{r(null!=e?e:void 0)}),"image/png",1)}))}({result:n,width:r,height:o})}async function c(e,t){if((0,r.on)()||"data:image/webp"!==t.substr(0,15))return t;l();const n=await i(e,(0,o.A9)(t));if(!n)throw new Error(`Can't convert webp to png. Url: ${t}`);return(0,o.YJ)(n)}function l(){u||(u=new Worker(new URL(n.p+n.u(536),n.b)),u.wasmReady=!1,u.onmessage=f)}function f(e){const{id:t}=e.data;switch(e.data.type){case"initialized":u.wasmReady=!0;break;case"result":if(u.requests.has(t)){const n=u.requests.get(t);u.requests.delete(t),n(e.data)}}}},1622:(e,t,n)=>{n.d(t,{IT:()=>l,px:()=>f,W8:()=>h});var r=n(3716),o=n(5116),d=n(4688);const a=["t.me","telegram.me"].map((e=>`//${e}/_websync_?`)),u=`${r.Ji} Z`,s="tgme_sync",i=()=>Math.floor(Number(new Date)/1e3);let c;const l=e=>{const t=i(),{canRedirect:n,ts:r}=JSON.parse(localStorage.getItem(s)||"{}");return n!==e||r+86400<=t?Promise.all(a.map((t=>new Promise(((n,r)=>{const o=document.createElement("script"),d=()=>!!document.body.removeChild(o);o.src=t+new URLSearchParams({authed:Number(e).toString(),version:u}),document.body.appendChild(o),o.onload=()=>{(e=>{const t=i();localStorage.setItem(s,JSON.stringify({canRedirect:e,ts:t}))})(e),d(),c&&(clearTimeout(c),c=void 0),f(),n()},o.onerror=()=>{d(),r()}}))))):Promise.resolve()};function f(){if(r.eM)return;if(void 0!==c)return;const e=i(),{ts:t}=JSON.parse(localStorage.getItem(s)||"{}"),n=86400-(e-t);c=setTimeout((()=>{const{authState:e}=(0,o.Rd)(),t="authorizationStateReady"===e||(0,d.ti)(!0);l(t)}),Math.max(0,1e3*n))}function h(){localStorage.removeItem(s)}},3858:(e,t,n)=>{n.d(t,{z:()=>l,Z:()=>h});var r=n(9118),o=n(3716),d=n(7361);const a=d.wB&&f(),u=window.innerHeight;let s=l(),i=!1;const c=(0,r.P2)((()=>{s=l(),!i&&((s.width<=o.l3||s.width<=o.u_&&s.height<=o.rO)!==d.wB||d.wB&&a!==f())&&window.location.reload()}),250,!0);function l(){let e;e=d.cj?window.visualViewport.height+window.visualViewport.pageTop:window.innerHeight;const t=.01*e;return document.documentElement.style.setProperty("--vh",`${t}px`),{width:window.innerWidth,height:window.innerHeight}}function f(){return d.cj?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("orientationchange",c),d.cj?window.visualViewport.addEventListener("resize",c):window.addEventListener("resize",c);const h={get:()=>s,getIsKeyboardVisible:()=>u>s.height,disableRefresh:function(){i=!0},enableRefresh:function(){i=!1}}},5359:(e,t,n)=>{e.exports=n.p+"app-inactive.bc7953c2dfebcabce2c4..png"},2162:(e,t,n)=>{e.exports=n.p+"monkey.a3d5fcdc50b18dc55695..svg"},4128:(e,t,n)=>{e.exports=n.p+"telegram-logo.1b2bb5b107f046ea9325..svg"}},u={};function s(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return a[e].call(n.exports,n,n.exports,s),n.exports}s.m=a,s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,s.t=function(n,r){if(1&r&&(n=this(n)),8&r)return n;if("object"==typeof n&&n){if(4&r&&n.__esModule)return n;if(16&r&&"function"==typeof n.then)return n}var o=Object.create(null);s.r(o);var d={};e=e||[null,t({}),t([]),t(t)];for(var a=2&r&&n;"object"==typeof a&&!~e.indexOf(a);a=t(a))Object.getOwnPropertyNames(a).forEach((e=>d[e]=()=>n[e]));return d.default=()=>n,s.d(o,d),o},s.d=(e,t)=>{for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce(((t,n)=>(s.f[n](e,t),t)),[])),s.u=e=>e+"."+{11:"58cedc04083d3a8f14c7",99:"f03a947e6e336feffec8",133:"672f7d0ddf0d82cbe667",161:"286d0207d962142ad548",354:"c55fdff947ef87368301",442:"8bbf7947a0dd02949ce6",472:"21e5264f606f2b525030",501:"72ce4b6e27f459e194cd",524:"4a5a09d66c985b7d1074",532:"a30fdabaf6a4ec59d8a7",536:"55dc7dd4ab42a2c9f037",626:"6fb6e12fcd2217f1e254",700:"f057ed004e34fabd3032",745:"9316c5c2b711c39a20a5",830:"40ad866af0cfa6029267",884:"68ff64c281399c107bd4",915:"0588cdc78683d0e9bbbc",941:"732a2a999d50a3fa51ba",993:"f0aad9f6787f211b4e51"}[e]+".js",s.miniCssF=e=>e+"."+{11:"58cedc04083d3a8f14c7",133:"672f7d0ddf0d82cbe667",442:"8bbf7947a0dd02949ce6",472:"21e5264f606f2b525030",532:"a30fdabaf6a4ec59d8a7",700:"f057ed004e34fabd3032"}[e]+".css",s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n={},r="telegram-t:",s.l=(e,t,o,d)=>{if(n[e])n[e].push(t);else{var a,u;if(void 0!==o)for(var i=document.getElementsByTagName("script"),c=0;c{a.onerror=a.onload=null,clearTimeout(h);var o=n[e];if(delete n[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(r))),t)return t(r)},h=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),u&&document.head.appendChild(a)}},s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;s.g.importScripts&&(e=s.g.location+"");var t=s.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),s.p=e})(),o=e=>new Promise(((t,n)=>{var r=s.miniCssF(e),o=s.p+r;if(((e,t)=>{for(var n=document.getElementsByTagName("link"),r=0;r{var o=document.createElement("link");o.rel="stylesheet",o.type="text/css",o.onerror=o.onload=d=>{if(o.onerror=o.onload=null,"load"===d.type)n();else{var a=d&&("load"===d.type?"missing":d.type),u=d&&d.target&&d.target.href||t,s=new Error("Loading CSS chunk "+e+" failed.\n("+u+")");s.code="CSS_CHUNK_LOAD_FAILED",s.type=a,s.request=u,o.parentNode.removeChild(o),r(s)}},o.href=t,document.head.appendChild(o)})(e,o,t,n)})),d={179:0},s.f.miniCss=(e,t)=>{d[e]?t.push(d[e]):0!==d[e]&&{11:1,133:1,442:1,472:1,532:1,700:1}[e]&&t.push(d[e]=o(e).then((()=>{d[e]=0}),(t=>{throw delete d[e],t})))},(()=>{s.b=document.baseURI||self.location.href;var e={179:0};s.f.j=(t,n)=>{var r=s.o(e,t)?e[t]:void 0;if(0!==r)if(r)n.push(r[2]);else{var o=new Promise(((n,o)=>r=e[t]=[n,o]));n.push(r[2]=o);var d=s.p+s.u(t),a=new Error;s.l(d,(n=>{if(s.o(e,t)&&(0!==(r=e[t])&&(e[t]=void 0),r)){var o=n&&("load"===n.type?"missing":n.type),d=n&&n.target&&n.target.src;a.message="Loading chunk "+t+" failed.\n("+o+": "+d+")",a.name="ChunkLoadError",a.type=o,a.request=d,r[1](a)}}),"chunk-"+t,t)}};var t=(t,n)=>{var r,o,[d,a,u]=n,i=0;if(d.some((t=>0!==e[t]))){for(r in a)s.o(a,r)&&(s.m[r]=a[r]);u&&u(s)}for(t&&t(n);i{s(3592);var e=s(3716),t=s(5116),n=s(7361),r=s(8406);function o(n){const o=n.data;if(e.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 a=s(2916);const u={isLeftColumnShown:!0,isChatInfoShown:!1,newChatMembersProgress:s(1713).WB.Closed,uiReadyState:0,serverTimeOffset:0,authRememberMe:!0,countryList:{phoneCodes:[],general:[]},blocked:{ids:[],totalCount:0},users:{byId:{},statusesById:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{},messageLists:[],sponsoredByChatId:{}},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:{},activeReactions:{},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={...u,...(0,f.ei)(n,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","topPeers","topInlineBots","recentEmojis","push","shouldShowContextMenuHint","leftColumnWidth","serviceNotifications"]),audioPlayer:{volume:n.audioPlayer.volume,playbackRate:n.audioPlayer.playbackRate,isMuted:n.audioPlayer.isMuted},isChatInfoShown: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),availableReactions:L(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),a=Object.keys(n),u=d.concat(a).slice(0,e.lO);return{byId:(0,f.ei)(n,u),statusesById:(0,f.ei)(r,u),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:[],sponsoredByChatId:{}}}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}}function L(e){var t;return null===(t=e.availableReactions)||void 0===t?void 0:t.map((e=>(0,f.ei)(e,["reaction","staticIcon","title","isInactive"])))}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)(u);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:a,...u}=t.settings.byKey;t.settings.byKey={...u,canAutoLoadPhotoFromContacts:e,canAutoLoadVideoFromContacts:e,canAutoLoadPhotoInPrivateChats:n,canAutoLoadVideoInPrivateChats:n,canAutoLoadPhotoInGroups:r,canAutoLoadVideoInGroups:r,canAutoLoadPhotoInChannels:o,canAutoLoadVideoInChannels:o,canAutoPlayVideos:d,canAutoPlayGifs:a}}t.settings.byKey={...n.settings.byKey,...t.settings.byKey},t.settings.themes={...n.settings.themes,...t.settings.themes},t.chatFolders={...n.chatFolders,...t.chatFolders},t.stickers.greeting||(t.stickers.greeting=n.stickers.greeting),t.activeDownloads||(t.activeDownloads={byChatId:{}}),t.serviceNotifications||(t.serviceNotifications=[]),void 0===t.audioPlayer.volume&&(t.audioPlayer.volume=e.Qx),void 0===t.audioPlayer.playbackRate&&(t.audioPlayer.playbackRate=e.mw),t.groupCalls||(t.groupCalls=n.groupCalls),t.users.statusesById||(t.users.statusesById={}),t.messages.sponsoredByChatId||(t.messages.sponsoredByChatId={}),t.activeReactions||(t.activeReactions={})}(o,t);const d={...t,...o},a=n.wB?void 0:(0,p.V)(g.Oy);return{...d,messages:{...d.messages,messageLists:a?[a]:[]}}}(t)):void C()}(t)||t}));var R=s(4050),D=s(3858);const O="tt-active-tab",Z=String(Date.now()+Math.random());let x;localStorage.setItem(O,Z);const _=window.setInterval((()=>{x&&localStorage.getItem(O)!==Z&&(x(),clearInterval(_))}),2e3);var F=s(706),B=(s(7895),s(3781),s(1363),s(9667),s(4907),s(8332)),$=s(1212),U=s(1394);const j=["400 1em Roboto","500 1em Roboto"];function W(){if("fonts"in document)return Promise.all(j.map((e=>document.fonts.load(e))))}var G=s(647),V=s(9203),H=s(6752),z=s(4128),Q=s(2162);function K(){const{listIds:e,byId:n}=(0,t.Rd)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map((e=>{const t=n[e];if(!t)return;const r=(0,B.RT)(t);return r?G.he(r,i.IU.BlobUrl):void 0})))}const J={main:()=>Promise.all([(0,V.$y)(V.gl.Main,"Main").then(W),K()]),authPhoneNumber:()=>Promise.all([W(),(0,U.pt)(z)]),authCode:()=>(0,U.pt)(Q),authPassword:()=>(0,U.pt)(Q),authQrCode:W},q=(0,t.c$)((e=>{const t=(0,h.Pu)(e),{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:(0,h.Jf)(e),leftColumnWidth:e.leftColumnWidth}}))((({page:e,children:n,hasCustomBackground:r,hasCustomBackgroundColor:o,isRightColumnShown:d,shouldSkipHistoryAnimations:a,leftColumnWidth:u})=>{const{setIsUiReady:s}=(0,t.uC)(),[i,l]=(0,F.Z)(),{shouldRender:f,transitionClassNames:h}=(0,$.Z)(!i,void 0,!0);return(0,R.d4)((()=>{let t;return Promise.race([(0,c.wO)(700),(async()=>{try{await J[e]()}catch(e){}})()]).then((()=>{l(),s({uiReadyState:1}),t=window.setTimeout((()=>{s({uiReadyState:2})}),1e3)})),()=>{t&&(clearTimeout(t),t=void 0),s({uiReadyState:0})}}),[]),R.ZP.createElement("div",{id:"UiLoader"},n,f&&!a&&R.ZP.createElement("div",{className:(0,H.Z)("mask",h)},"main"===e?R.ZP.createElement(R.ZP.Fragment,null,R.ZP.createElement("div",{className:"left",style:u?`width: ${u}px`:void 0}),R.ZP.createElement("div",{className:(0,H.Z)("middle",r&&"custom-bg-image",o&&"custom-bg-color",d&&"with-right-column")}),d&&R.ZP.createElement("div",{className:"right"})):R.ZP.createElement("div",{className:"blank"})))}));var Y=s(6272),X=s(663),ee=s(9107);const te=(e,t)=>{const[n,r]=(0,R.eJ)();return e&&X.Pn(e,t).then(r),n};function ne(){let e=navigator.language;return e&&"pt-br"!==e&&(e=e.substr(0,2)),e}var re=s(231),oe=s(4605),de=s(7687),ae=s(4288),ue=s(5765),se=s(2340),ie=s(4284),ce=s(9290),le=s(3106),fe=s(8964),he=s(9204);const me=200+e.fK,pe=(0,R.X$)((0,t.c$)((e=>{const{countryList:{phoneCodes:t}}=e;return{phoneCodeList:t}}))((({id:e,value:t,isLoading:n,onChange:r,phoneCodeList:o})=>{const d=(0,ee.Z)(),a=(0,R.sO)(null),[u,s]=(0,R.eJ)(),[i,c]=(0,R.eJ)([]),l=(0,R.I4)((e=>{s(e),c(function(e,t=""){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,ce.Z)((([e])=>{0===(null==e?void 0:e.length)&&o.length>0&&l(u)}),[o,l]);const f=(0,R.I4)((e=>{r(e),setTimeout((()=>l(void 0)),me)}),[r,l]),h=(0,R.I4)((e=>{l(e.currentTarget.value)}),[l]),m=(0,R.I4)((e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===u&&(n.value=""),l(n.value)}),[u,l,t]);return R.ZP.createElement(le.Z,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const s=()=>{if(o)return;setTimeout((()=>{a.current.select()}),50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},i=null!=u?u:(null==t?void 0:t.name)||(null==t?void 0:t.defaultName)||"";return R.ZP.createElement("div",{className:(0,H.Z)("input-group",t&&"touched")},R.ZP.createElement("input",{ref:a,className:(0,H.Z)("form-control",o&&"focus"),type:"text",id:e,value:i,autoComplete:"off",onClick:s,onFocus:s,onInput:e=>{h(e),s()},onKeyDown:m}),R.ZP.createElement("label",null,d("Login.SelectCountry.Title")),n?R.ZP.createElement(he.Z,{color:"black"}):R.ZP.createElement("i",{onClick:s,className:(0,H.Z)("css-icon-down",o&&"open")}))}},i.map((e=>R.ZP.createElement(fe.Z,{key:e.iso2,className:t&&e.iso2===t.iso2?"selected":"",onClick:()=>f(e)},R.ZP.createElement("span",{className:"country-flag"},(0,se.Z)((0,ie.Wg)(e.iso2),["hq_emoji"])),R.ZP.createElement("span",{className:"country-name"},e.name||e.defaultName),R.ZP.createElement("span",{className:"country-code"},e.countryCode)))),!i.length&&R.ZP.createElement(fe.Z,{key:"no-results",className:"no-results",disabled:!0},R.ZP.createElement("span",null,d("lng_country_none"))))})));let ge=!1;const ye=(0,R.X$)((0,t.c$)((e=>{const{settings:{byKey:{language:t}},countryList:{phoneCodes:n}}=e;return{...(0,f.ei)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),language:t,phoneCodeList:n}}))((({connectionState:e,authState:r,authPhoneNumber:o,authIsLoading:d,authIsLoadingQrCode:a,authError:u,authRememberMe:s,authNearestCountry:i,phoneCodeList:c,language:l})=>{const{setAuthPhoneNumber:f,setAuthRememberMe:h,loadNearestCountry:m,loadCountryList:p,clearAuthError:g,goToAuthQrCode:y,setSettingOption:v}=(0,t.uC)(),b=(0,ee.Z)(),w=(0,R.sO)(null),I=ne(),C=te(I,"ContinueOnThisLanguage"),[S,E]=(0,R.eJ)(),[P,M]=(0,R.eJ)(),[A,k]=(0,R.eJ)(!1),[T,N]=(0,R.eJ)(),[L,D,O]=(0,F.Z)(),Z=S?`+${S.countryCode} ${P||""}`:P,x=Z&&Z.replace(/[^\d]+/g,"").length>=7;(0,R.d4)((()=>{n.$b||w.current.focus()}),[S]),(0,R.d4)((()=>{"connectionStateReady"!==e||i||m()}),[e,i,m]),(0,R.d4)((()=>{"connectionStateReady"===e&&p({langCode:l})}),[e,l,p]),(0,R.d4)((()=>{i&&c&&!S&&!A&&E((0,Y.U9)(c,i)[0])}),[S,i,A,c]);const _=(0,R.I4)((e=>{e.length||M("");const t=c&&(0,Y.g3)(c,e),n=!S||t&&t.iso2!==S.iso2||!t&&e.length?t:S;(!S||!n||n&&n.iso2!==S.iso2)&&E(n),M((0,Y.un)(e,n))}),[c,S]),B=(0,R.I4)((()=>{D(),(0,X.m0)(I,(()=>{O(),v({language:I})}))}),[D,v,I,O]);(0,R.d4)((()=>{void 0===P&&o&&_(o)}),[o,P,_]),(0,R.bt)((()=>{w.current&&T&&w.current.setSelectionRange(...T)}),[T]);const $=(0,R.sO)(!1),j=(0,R.I4)((()=>{$.current=!0,requestAnimationFrame((()=>{$.current=!1}))}),[]),G=(0,R.I4)((e=>{E(e),M("")}),[]),V=(0,R.I4)((e=>{u&&g(),ge||(ge=!0,W(),(0,U.pt)(Q));const{value:t,selectionStart:r,selectionEnd:o}=e.target;N(r&&o&&o1&&!$.current;_(d?`${S.countryCode} ${t}`:t)}),[u,g,S,Z,_]),H=(0,R.I4)((e=>{h(e.target.checked)}),[h]),z="authorizationStateWaitPhoneNumber"===r;return R.ZP.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},R.ZP.createElement("div",{className:"auth-form"},R.ZP.createElement("div",{id:"logo"}),R.ZP.createElement("h2",null,"Telegram"),R.ZP.createElement("p",{className:"note"},b("StartText")),R.ZP.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),d||x&&f({phoneNumber:Z})}},R.ZP.createElement(pe,{id:"sign-in-phone-code",value:S,isLoading:!i&&!S,onChange:G}),R.ZP.createElement(de.Z,{ref:w,id:"sign-in-phone-number",label:b("Login.PhonePlaceholder"),value:Z,error:u&&b(u),inputMode:"tel",onChange:V,onPaste:n.s$?j:void 0}),R.ZP.createElement(oe.Z,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(s),onChange:H}),x&&(z?R.ZP.createElement(re.Z,{type:"submit",ripple:!0,isLoading:d},b("Login.Next")):R.ZP.createElement(ae.Z,null)),z&&R.ZP.createElement(re.Z,{isText:!0,ripple:!0,isLoading:a,onClick:y},b("Login.QR.Login")),I&&I!==l&&C&&R.ZP.createElement(re.Z,{isText:!0,isLoading:L,onClick:B},C))))})));var ve=s(8778);const be=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthCode");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)})),we=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthPassword");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)})),Ie=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthRegister");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)}));let Ce=null;class Se{}Se.render=function(e,t){Ce(e,t)},self.QrCreator=Se,function(e){function t(t,n,r,o){var d={},a=e(r,n);a.u(t),a.J(),o=o||0;var u=a.h(),s=a.h()+2*o;return d.text=t,d.level=n,d.version=r,d.O=s,d.a=function(e,t){return t-=o,!(0>(e-=o)||e>=u||0>t||t>=u)&&a.a(e,t)},d}function n(e,t,n,r,o,d,a,u,s,i){function c(t,n,r,o,a,u,s){t?(e.lineTo(n+u,r+s),e.arcTo(n,r,o,a,d)):e.lineTo(n,r)}a?e.moveTo(t+d,n):e.moveTo(t,n),c(u,r,n,r,o,-d,0),c(s,r,o,t,o,0,-d),c(i,t,o,t,n,d,0),c(a,t,n,r,n,0,d)}function r(e,t,n,r,o,d,a,u,s,i){function c(t,n,r,o){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+o),e.arcTo(t,n,t+r,n,d)}a&&c(t,n,d,d),u&&c(r,n,-d,d),s&&c(r,o,-d,-d),i&&c(t,o,d,-d)}function o(e,o){e:{var d=o.text,a=o.v,u=o.N,s=o.K,i=o.P;for(u=Math.max(1,u||1),s=Math.min(40,s||40);u<=s;u+=1)try{var c=t(d,a,u,i);break e}catch(e){}c=void 0}if(!c)return null;for(d=e.getContext("2d"),o.background&&(d.fillStyle=o.background,d.fillRect(o.left,o.top,o.size,o.size)),a=c.O,s=o.size/a,d.beginPath(),i=0;iMath.round(e*t.size))),"linear-gradient"===r)var d=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");d=e.createRadialGradient.apply(e,n)}o.forEach((([e,t])=>{d.addColorStop(e,t)})),e.fillStyle=d}}(d,o),d.fill(),e}var d={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};Ce=function(e,t){var n={};Object.assign(n,d,e),n.N=n.minVersion,n.K=n.maxVersion,n.v=n.ecLevel,n.left=n.left,n.top=n.top,n.size=n.size,n.fill=n.fill,n.background=n.background,n.text=n.text,n.R=n.radius,n.P=n.quiet,t instanceof HTMLCanvasElement?(t.width===n.size&&t.height===n.size||(t.width=n.size,t.height=n.size),t.getContext("2d").clearRect(0,0,t.width,t.height),o(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=o(e,n),t.appendChild(n))}}(function(){function e(o,a){function u(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||l<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||l<=t+r||(c[e+n][t+r]=0<=n&&6>=n&&(0==r||6==r)||0<=r&&6>=r&&(0==n||6==n)||2<=n&&4>=n&&2<=r&&4>=r)}function s(e,n){for(var a=l=4*o+17,s=Array(a),m=0;m=y;y+=1)for(var v=-2;2>=v;v+=1)c[p+y][g+v]=-2==y||2==y||-2==v||2==v||0==y&&0==v}for(a=8;as;s+=1)m=!e&&1==(a>>s&1),c[6>s?s:8>s?s+1:l-15+s][8]=m,c[8][8>s?l-s-1:9>s?15-s:14-s]=m;if(c[l-8][8]=!e,7<=o){for(a=r.A(o),s=0;18>s;s+=1)m=!e&&1==(a>>s&1),c[Math.floor(s/3)][s%3+l-8-3]=m;for(s=0;18>s;s+=1)m=!e&&1==(a>>s&1),c[s%3+l-8-3][Math.floor(s/3)]=m}if(null==f){for(e=d.I(o,i),a=function(){var e=[],t=0,n={B:function(){return e},c:function(t){return 1==(e[Math.floor(t/8)]>>>7-t%8&1)},put:function(e,t){for(var r=0;r>>t-r-1&1))},f:function(){return t},m:function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1}};return n}(),s=0;s8*m)throw Error("code length overflow. ("+a.f()+">"+8*m+")");for(a.f()+4<=8*m&&a.put(0,4);0!=a.f()%8;)a.m(!1);for(;!(a.f()>=8*m||(a.put(236,8),a.f()>=8*m));)a.put(17,8);var b=0;for(m=s=0,p=Array(e.length),g=Array(e.length),y=0;yy;y+=1)null==c[s][g-y]&&(v=!1,p>>m&1)),n(s,g-y)&&(v=!v),c[s][g-y]=v,-1==--m&&(p+=1,m=7));if(0>(s+=a)||l<=s){s-=a,a=-a;break}}}var i=n[a],c=null,l=0,f=null,h=[],m={u:function(t){t=function(t){var n=e.s(t);return{S:function(){return 4},b:function(){return n.length},write:function(e){for(var t=0;te||l<=e||0>t||l<=t)throw Error(e+","+t);return c[e][t]},h:function(){return l},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){s(!0,n);var o=r.D(m);(0==n||e>o)&&(e=o,t=n)}s(!1,t)}};return m}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;td.b()-e.b())return d;for(var n=o.g(d.c(0))-o.g(e.c(0)),r=Array(d.b()),a=0;ar?t.push(r):2048>r?t.push(192|r>>6,128|63&r):55296>r||57344<=r?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t};var n={L:1,M:0,Q:3,H:2},r=function(){function e(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t}var n=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];return{w:function(t){for(var n=t<<10;0<=e(n)-e(1335);)n^=1335<t||40t?8:16},D:function(e){for(var t=e.h(),n=0,r=0;r=u;u+=1)if(!(0>r+u||t<=r+u))for(var s=-1;1>=s;s+=1)0>o+s||t<=o+s||(0!=u||0!=s)&&a==e.a(r+u,o+s)&&(d+=1);5n;n+=1)e[n]=1<n;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(n=0;255>n;n+=1)t[e[n]]=n;return{g:function(e){if(1>e)throw Error("glog("+e+")");return t[e]},i:function(t){for(;0>t;)t+=255;for(;256<=t;)t-=255;return e[t]}}}(),d=function(){function e(e,r){switch(r){case n.L:return t[4*(e-1)];case n.M:return t[4*(e-1)+1];case n.Q:return t[4*(e-1)+2];case n.H:return t[4*(e-1)+3]}}var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];return{I:function(t,n){var r=e(t,n);if(void 0===r)throw Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+n);t=r.length/3,n=[];for(var o=0;o{const{connectionState:t,authState:n,authQrCode:r,settings:{byKey:{language:o}}}=e;return{connectionState:t,authState:n,authQrCode:r,language:o}}))((({connectionState:n,authState:r,authQrCode:o,language:d})=>{const{returnToAuthPhoneNumber:a,setSettingOption:u}=(0,t.uC)(),s=ne(),i=(0,ee.Z)(),c=(0,R.sO)(null),l=te(s,"ContinueOnThisLanguage"),[f,h,m]=(0,F.Z)();(0,R.d4)((()=>{if(!o||"connectionStateReady"!==n)return;const e=c.current;e.innerHTML="",e.classList.remove("pre-animate"),Ee.render({text:`tg://login?token=${o.token}`,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},e)}),[n,o]),(0,R.d4)((()=>{"connectionStateReady"===n&&(0,X.m0)(e.sR)}),[n]);const p=(0,R.I4)((()=>{h(),(0,X.m0)(s,(()=>{m(),u({language:s})}))}),[h,u,s,m]),g="authorizationStateWaitQrCode"===r;return R.ZP.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},R.ZP.createElement("div",{className:"auth-form qr"},o?R.ZP.createElement("div",{key:"qr-container",className:"qr-container pre-animate",ref:c}):R.ZP.createElement("div",{key:"qr-loading",className:"qr-loading"},R.ZP.createElement(ae.Z,null)),R.ZP.createElement("h3",null,i("Login.QR.Title")),R.ZP.createElement("ol",null,R.ZP.createElement("li",null,R.ZP.createElement("span",null,i("Login.QR.Help1"))),R.ZP.createElement("li",null,R.ZP.createElement("span",null,(0,se.Z)(i("Login.QR.Help2"),["simple_markdown"]))),R.ZP.createElement("li",null,R.ZP.createElement("span",null,i("Login.QR.Help3")))),g&&R.ZP.createElement(re.Z,{isText:!0,onClick:a},i("Login.QR.Cancel")),s&&s!==d&&l&&R.ZP.createElement(re.Z,{isText:!0,isLoading:f,onClick:p},l)))}))),Me=(0,R.X$)((0,t.c$)((e=>(0,f.ei)(e,["authState"])))((({authState:e})=>{const{reset:r,initApi:o,returnToAuthPhoneNumber:d,goToAuthQrCode:a}=(0,t.uC)();(0,R.d4)((()=>{r(),o()}),[r,o]);const u="iOS"===n.Lt||"Android"===n.Lt;switch((0,g.ZP)(!u&&"authorizationStateWaitPhoneNumber"===e||u&&"authorizationStateWaitQrCode"===e,(()=>{u?d():a()})),(0,R.d4)((()=>(D.Z.disableRefresh(),()=>{D.Z.enableRefresh()})),[]),e){case"authorizationStateWaitCode":return R.ZP.createElement(q,{page:"authCode",key:"authCode"},R.ZP.createElement(be,null));case"authorizationStateWaitPassword":return R.ZP.createElement(q,{page:"authPassword",key:"authPassword"},R.ZP.createElement(we,null));case"authorizationStateWaitRegistration":return R.ZP.createElement(Ie,null);case"authorizationStateWaitPhoneNumber":return R.ZP.createElement(q,{page:"authPhoneNumber",key:"authPhoneNumber"},R.ZP.createElement(ye,null));case"authorizationStateWaitQrCode":return R.ZP.createElement(q,{page:"authQrCode",key:"authQrCode"},R.ZP.createElement(Pe,null));default:return u?R.ZP.createElement(q,{page:"authPhoneNumber",key:"authPhoneNumber"},R.ZP.createElement(ye,null)):R.ZP.createElement(q,{page:"authQrCode",key:"authQrCode"},R.ZP.createElement(Pe,null))}}))),Ae=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Main,"Main");return e?R.ZP.createElement(e,null):void 0}));var ke=s(5359);const Te=()=>R.ZP.createElement("div",{id:"AppInactive"},R.ZP.createElement("div",{className:"content"},R.ZP.createElement("img",{src:ke,alt:""}),R.ZP.createElement("h3",{className:"title"},"Such error, many tabs"),R.ZP.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",R.ZP.createElement("br",null),"Please reload this page to continue using this tab or close it."),R.ZP.createElement("div",{className:"actions"},R.ZP.createElement(re.Z,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function Ne(){return t.ZP.createElement(q,{page:"main",key:"main"},t.ZP.createElement(Ae,null))}const Le=(0,t.c$)((e=>(0,f.ei)(e,["authState"])))((({authState:n})=>{const{disconnect:r}=(0,t.uC)(),[o,d]=(0,F.Z)(!1);if((0,R.d4)((()=>{(0,D.z)(),x=()=>{r(),document.title=`${e.Ti}${e.ou}`,d()}}),[r,d]),o)return t.ZP.createElement(Te,null);if(n)switch(n){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return t.ZP.createElement(Me,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return Ne()}return(0,m.ti)(!0)?Ne():t.ZP.createElement(Me,null)}));e.eM&&console.log(">>> INIT"),(0,t.uC)().init(),e.eM&&console.log(">>> START INITIAL RENDER"),a.Z.render(t.ZP.createElement(Le,null),document.getElementById("root")),e.eM&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",(()=>{console.warn("GLOBAL STATE",(0,t.Rd)())}))})()})(); -//# sourceMappingURL=main.14caf56e367ebee7bda8.js.map \ No newline at end of file diff --git a/dist/main.14caf56e367ebee7bda8.js.map b/dist/main.14caf56e367ebee7bda8.js.map deleted file mode 100644 index ba4b1100d..000000000 --- a/dist/main.14caf56e367ebee7bda8.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.14caf56e367ebee7bda8.js","mappings":"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AAE,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,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/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/reducers/messages.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/permanentWebVersion.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 = {\"11\":1,\"133\":1,\"442\":1,\"472\":1,\"532\":1,\"700\":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 { Api } from '../../../lib/gramjs';\nimport { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, 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 const promise = makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n });\n\n // Some TypeScript magic to make sure `VirtualClass` is never returned from any method\n if (DEBUG) {\n (async () => {\n try {\n type ForbiddenTypes =\n Api.VirtualClass\n | (Api.VirtualClass | undefined)[];\n type ForbiddenResponses =\n ForbiddenTypes\n | (AnyLiteral & { [k: string]: ForbiddenTypes });\n\n // Unwrap all chained promises\n const response = await promise;\n // Make sure responses do not include `VirtualClass` instances\n const allowedResponse: Exclude = response;\n // Suppress \"unused variable\" constraint\n void allowedResponse;\n } catch (err) {\n // Do noting\n }\n })();\n }\n\n return promise 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 new Error(data.error?.message);\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 id: string;\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 id: string;\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 date: number;\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 editDate?: number;\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 isProtected?: boolean;\n reactors?: {\n nextOffset?: string;\n count: number;\n reactions: ApiUserReaction[];\n };\n reactions?: ApiReactions;\n}\n\nexport interface ApiReactions {\n canSeeList?: boolean;\n results: ApiReactionCount[];\n recentReactions?: ApiUserReaction[];\n}\n\nexport interface ApiUserReaction {\n userId: string;\n reaction: string;\n}\n\nexport interface ApiReactionCount {\n isChosen?: boolean;\n count: number;\n reaction: string;\n}\n\nexport interface ApiAvailableReaction {\n selectAnimation?: ApiDocument;\n staticIcon?: ApiDocument;\n centerIcon?: ApiDocument;\n aroundAnimation?: ApiDocument;\n reaction: string;\n title: string;\n isInactive?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: string;\n topMessageId?: number;\n originChannelId?: string;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: string[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport type ApiSponsoredMessage = {\n chatId?: string;\n randomId: string;\n isBot?: boolean;\n channelPostId?: number;\n startParam?: string;\n chatInviteHash?: string;\n chatInviteTitle?: string;\n text: ApiFormattedText;\n expiresAt: number;\n};\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'requestSelfContact' | '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 type ApiSendMessageAction = {\n type: 'cancel' | 'typing' | 'recordAudio' | 'chooseSticker';\n};\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';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getDispatch } from '../../lib/teact/teactn';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\nconst UserLink: FC = ({\n className, sender, children,\n}) => {\n const { openUserInfo } = getDispatch();\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 UserLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\n\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\nconst MessageLink: FC = ({\n className, message, children,\n}) => {\n const { focusMessage } = getDispatch();\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 MessageLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\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\nconst ChatLink: FC = ({\n className, chatId, children,\n}) => {\n const { openChat } = getDispatch();\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 ChatLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport { ApiGroupCall } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getDispatch } from '../../lib/teact/teactn';\n\ntype OwnProps = {\n className?: string;\n groupCall?: Partial;\n children: any;\n};\n\nconst GroupCallLink: FC = ({\n className, groupCall, children,\n}) => {\n const { joinGroupCall } = getDispatch();\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 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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\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\nconst MentionLink: FC = ({\n username,\n userOrChat,\n children,\n}) => {\n const {\n openChat,\n openChatByUsername,\n } = getDispatch();\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)(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 {\n ChangeEvent, FormEvent, RefObject,\n} 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-v7';\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;\nexport const REACTION_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\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\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\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\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\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;\ntype DelegationRegistry = Map;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst documentEventCounters: Record = {};\nconst delegationRegistryByEventType: Record = {};\nconst delegatedEventTypesByElement = new Map>();\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n addDelegatedListener(eventType, element, handler);\n } else {\n element.addEventListener(eventType, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n removeDelegatedListener(eventType, element);\n } else {\n element.removeEventListener(eventType, handler, asCapture);\n }\n}\n\nfunction resolveEventType(propName: string, element: HTMLElement) {\n const eventType = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventType === '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 (eventType === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventType === 'focus') {\n return 'focusin';\n }\n\n if (eventType === 'blur') {\n return 'focusout';\n }\n\n return eventType;\n}\n\nfunction canUseEventDelegation(realEventType: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventType)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventType: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventType]) {\n documentEventCounters[eventType] = 0;\n document.addEventListener(eventType, handleEvent);\n }\n\n resolveDelegationRegistry(eventType).set(element, handler);\n resolveDelegatedEventTypes(element).add(eventType);\n documentEventCounters[eventType]++;\n}\n\nfunction removeDelegatedListener(eventType: string, element: HTMLElement) {\n documentEventCounters[eventType]--;\n if (!documentEventCounters[eventType]) {\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(eventType, handleEvent);\n }\n\n delegationRegistryByEventType[eventType].delete(element);\n delegatedEventTypesByElement.get(element)!.delete(eventType);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventTypes = delegatedEventTypesByElement.get(element);\n if (!eventTypes) {\n return;\n }\n\n eventTypes.forEach((eventType) => removeDelegatedListener(eventType, element));\n delegatedEventTypesByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistryByEventType[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 resolveDelegationRegistry(eventType: string) {\n if (!delegationRegistryByEventType[eventType]) {\n delegationRegistryByEventType[eventType] = new Map();\n }\n\n return delegationRegistryByEventType[eventType];\n}\n\nfunction resolveDelegatedEventTypes(element: HTMLElement) {\n const existing = delegatedEventTypesByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set();\n delegatedEventTypesByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n const documentListenersCount = Object.keys(documentEventCounters).length;\n const delegatedHandlersCount1 = Object.values(documentEventCounters)\n .reduce((acc, counter) => acc + counter, 0);\n const delegationRegistriesCount = Object.keys(delegationRegistryByEventType).length;\n const delegatedHandlersCount2 = Object.values(delegationRegistryByEventType)\n .reduce((acc, delegationRegistry) => acc + delegationRegistry.size, 0);\n const delegationElementsCount = delegatedEventTypesByElement.size;\n const delegatedEventTypesCount = Array.from(delegatedEventTypesByElement.values())\n .reduce((acc, eventTypes) => acc + eventTypes.size, 0);\n\n // eslint-disable-next-line no-console\n console.warn('DELEGATED EVENTS STATS', {\n delegatedHandlersCount1,\n delegatedHandlersCount2,\n delegatedEventTypesCount,\n delegationRegistriesCount,\n delegationElementsCount,\n documentListenersCount,\n });\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 const currentTarget = getTarget($current);\n\n if (!areComponents) {\n setTarget($new, currentTarget!);\n setTarget($current, undefined as any); // Help GC\n\n if ('props' in $current && 'props' in $new) {\n $new.props.ref = $current.props.ref;\n }\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = currentTarget!;\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, currentTarget as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : currentTarget 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.warn('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 (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else {\n if (isTagElement($element)) {\n if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n }\n\n if ($element.props.ref) {\n $element.props.ref.current = undefined; // Help GC\n }\n }\n\n if ($element.target) {\n $element.target = undefined; // Help GC\n }\n\n if (!isRealElement($element)) {\n return;\n }\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 // We need to clean refs before running effect cleanups\n componentInstance.hooks.memos.byCursor.forEach((memoContainer) => {\n memoContainer.current = undefined;\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 componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = undefined;\n hook.effect = undefined as any;\n hook.dependencies = undefined;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = undefined;\n hook.nextValue = undefined;\n hook.setter = undefined as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = undefined as any;\n });\n\n componentInstance.hooks = undefined as any;\n componentInstance.$element = undefined as any;\n componentInstance.renderedValue = undefined;\n componentInstance.Component = undefined as any;\n componentInstance.props = undefined as any;\n componentInstance.forceUpdate = undefined;\n componentInstance.onUpdate = undefined;\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(`[Teact] Effect \"${debugKey}\" caused by dependencies.`, causedBy.join(', '));\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n } else {\n if (debugKey) {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Effect \"${debugKey}\" caused by missing dependencies.`);\n }\n\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 { fastRaf, throttleWithTickEnd } 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);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nconst runCallbacksThrottled = throttleWithTickEnd(runCallbacks);\n\nfunction runCallbacks(forceOnHeavyAnimation = false) {\n if (!forceOnHeavyAnimation && isHeavyAnimating()) {\n fastRaf(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, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = mapStateToProps(currentGlobal, ownProps);\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) {\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 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 = mapStateToProps(currentGlobal, props);\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.warn(\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\naddReducer('loadAppConfig', () => {\n (async () => {\n const appConfig = await callApi('fetchAppConfig');\n\n if (!appConfig) return;\n\n setGlobal({\n ...getGlobal(),\n appConfig,\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';\nimport { ensurePermanentWebVersion } from '../../../util/permanentWebVersion';\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\n switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\n\n ensurePermanentWebVersion();\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(lang, untilDate * 1000)],\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, ApiReactions, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport {\n LOCAL_MESSAGE_ID_BASE,\n SERVICE_NOTIFICATIONS_USER_ID,\n RE_LINK_TEMPLATE,\n CONTENT_NOT_SUPPORTED,\n} 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 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\nexport function areReactionsEmpty(reactions: ApiReactions) {\n return !reactions.results.some((l) => l.count > 0);\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 mediaId = (messagePhoto || messageVideo || sticker || audio || voice || document)!.id;\n const base = `${getMessageKey(message)}${mediaId ? `:${mediaId}` : ''}`;\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(lang, wasOnlineDate));\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(lang, wasOnlineDate));\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(\n userIds: string[],\n usersById: Record,\n query?: string,\n currentUserId?: string,\n savedMessagesLang?: string,\n) {\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 = id === currentUserId ? savedMessagesLang : 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 { 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 deleteContact(global: GlobalState, userId: string): GlobalState {\n const { byId } = global.users;\n const { userIds } = global.contactList || {};\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, {\n ...byId,\n [userId]: {\n ...byId[userId],\n isContact: undefined,\n },\n });\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, ManagementState } from '../../types';\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 {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../../global/types';\nimport {\n ApiMessage, ApiSponsoredMessage, ApiThreadInfo, MAIN_THREAD_ID,\n} 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 updateSponsoredMessage(\n global: GlobalState, chatId: string, message: ApiSponsoredMessage,\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n sponsoredByChatId: {\n ...global.messages.sponsoredByChatId,\n [chatId]: message,\n },\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 { 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\nexport function selectSendAs(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n if (!chat) return undefined;\n\n const id = chat?.fullInfo?.sendAsId;\n if (!id) return undefined;\n\n return selectUser(global, id) || selectChat(global, 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 // Favorites\n global.stickers.favorite.stickers.forEach((sticker) => {\n if (sticker.emoji === emoji) stickersForEmoji.push(sticker);\n });\n\n // Added sets\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\nfunction cleanEmoji(emoji: string) {\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n return emoji.replace('\\ufe0f', '');\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiEffect(global: GlobalState, emoji: string) {\n const { animatedEmojiEffects } = global;\n if (!animatedEmojiEffects || !animatedEmojiEffects.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojiEffects.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiSound(global: GlobalState, emoji: string) {\n return global?.appConfig?.emojiSounds[cleanEmoji(emoji)];\n}\n\nexport function selectLocalAnimatedEmoji(global: GlobalState, emoji: string) {\n const cleanedEmoji = cleanEmoji(emoji);\n\n return cleanedEmoji === '🍑' ? 'Peach' : (cleanedEmoji === '🍆' ? 'Eggplant' : undefined);\n}\n\nexport function selectLocalAnimatedEmojiEffect(emoji: string) {\n return emoji === 'Eggplant' ? 'Cumshot' : undefined;\n}\n\nexport function selectLocalAnimatedEmojiEffectByName(name: string) {\n return name === 'Cumshot' ? '🍆' : undefined;\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\nexport function selectIsMessageProtected(global: GlobalState, message?: ApiMessage) {\n return message ? message.isProtected || selectChat(global, message.chatId)?.isProtected : false;\n}\n\nexport function selectHasProtectedMessage(global: GlobalState, chatId: string, messageIds?: number[]) {\n if (selectChat(global, chatId)?.isProtected) {\n return true;\n }\n\n if (!messageIds) {\n return false;\n }\n\n const messages = selectChatMessages(global, chatId);\n\n return messageIds.some((messageId) => messages[messageId]?.isProtected);\n}\n\nexport function selectSponsoredMessage(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n const message = chat && isChatChannel(chat) ? global.messages.sponsoredByChatId[chatId] : undefined;\n\n return message && message.expiresAt >= Math.round(Date.now() / 1000) ? message : undefined;\n}\n\nexport function selectDefaultReaction(global: GlobalState, chatId: string) {\n if (chatId === SERVICE_NOTIFICATIONS_USER_ID) return undefined;\n\n const isPrivate = isUserId(chatId);\n const defaultReaction = global.appConfig?.defaultReaction;\n const { availableReactions } = global;\n if (!defaultReaction || !availableReactions?.some(\n (l) => l.reaction === defaultReaction && !l.isInactive,\n )) {\n return undefined;\n }\n\n if (isPrivate) {\n return defaultReaction;\n }\n\n const enabledReactions = selectChat(global, chatId)?.fullInfo?.enabledReactions;\n if (!enabledReactions?.includes(defaultReaction)) {\n return undefined;\n }\n\n return defaultReaction;\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 ApiExportedInvite,\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 QuickReaction,\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 interface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n invites?: ApiExportedInvite[];\n editingInvite?: ApiExportedInvite;\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 ChatNewAdminRights,\n GroupMembers,\n GroupAddAdmins,\n Invites,\n EditInvite,\n Reactions,\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(lang: LangFn, datetime: number | Date) {\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(lang, date);\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 formatCountdown(\n lang: LangFn,\n msLeft: number,\n) {\n const days = Math.floor(msLeft / MILLISECONDS_IN_DAY);\n if (msLeft < 0) {\n return 0;\n } else if (days < 1) {\n return formatMediaDuration(msLeft / 1000);\n } else if (days < 7) {\n return lang('Days', days);\n } else if (days < 30) {\n return lang('Weeks', Math.floor(days / 7));\n } else if (days < 365) {\n return lang('Months', Math.floor(days / 30));\n } else {\n return lang('Years', Math.floor(days / 365));\n }\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 // Workaround for https://bugs.telegram.org/c/5777\n .replace(/'de'/g, 'de');\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(lang, date)}`;\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(datetime: Date | number, locale = 'en-US') {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nexport function formatDateTimeToString(datetime: Date | number, locale = 'en-US') {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: '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[^\\ufe0f]/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 ADMINS_TOO_MUCH: 'There are too many admins',\n ADMIN_RANK_EMOJI_NOT_ALLOWED: 'An admin rank cannot contain emojis',\n ADMIN_RANK_INVALID: 'The specified admin rank is invalid',\n FRESH_CHANGE_ADMINS_FORBIDDEN: 'You were just elected admin, you can\\'t add or modify other admins yet',\n INPUT_USER_DEACTIVATED: 'The specified user was deleted',\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","const PERMANENT_VERSION_KEY = 'kz_version';\nconst AVAILABLE_VERSIONS = ['Z', 'K'] as const;\nconst DEFAULT_VERSION = 'Z';\n\nexport function setPermanentWebVersion(version: typeof AVAILABLE_VERSIONS[number]) {\n localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify(version));\n}\n\nexport function ensurePermanentWebVersion() {\n if (!hasPermanentWebVersion()) {\n setPermanentWebVersion(DEFAULT_VERSION);\n }\n}\n\nfunction hasPermanentWebVersion() {\n const json = localStorage.getItem(PERMANENT_VERSION_KEY);\n if (!json) {\n return false;\n }\n\n try {\n const version = JSON.parse(json);\n return AVAILABLE_VERSIONS.includes(version);\n } catch (err) {\n return false;\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\nexport function clearWebsync() {\n localStorage.removeItem(WEBSYNC_KEY);\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 + \".\" + {\"11\":\"58cedc04083d3a8f14c7\",\"99\":\"f03a947e6e336feffec8\",\"133\":\"672f7d0ddf0d82cbe667\",\"161\":\"286d0207d962142ad548\",\"354\":\"c55fdff947ef87368301\",\"442\":\"8bbf7947a0dd02949ce6\",\"472\":\"21e5264f606f2b525030\",\"501\":\"72ce4b6e27f459e194cd\",\"524\":\"4a5a09d66c985b7d1074\",\"532\":\"a30fdabaf6a4ec59d8a7\",\"536\":\"55dc7dd4ab42a2c9f037\",\"626\":\"6fb6e12fcd2217f1e254\",\"700\":\"f057ed004e34fabd3032\",\"745\":\"9316c5c2b711c39a20a5\",\"830\":\"40ad866af0cfa6029267\",\"884\":\"68ff64c281399c107bd4\",\"915\":\"0588cdc78683d0e9bbbc\",\"941\":\"732a2a999d50a3fa51ba\",\"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 + \".\" + {\"11\":\"58cedc04083d3a8f14c7\",\"133\":\"672f7d0ddf0d82cbe667\",\"442\":\"8bbf7947a0dd02949ce6\",\"472\":\"21e5264f606f2b525030\",\"532\":\"a30fdabaf6a4ec59d8a7\",\"700\":\"f057ed004e34fabd3032\"}[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 sponsoredByChatId: {},\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 activeReactions: {},\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 if (!cached.messages.sponsoredByChatId) {\n cached.messages.sponsoredByChatId = {};\n }\n\n if (!cached.activeReactions) {\n cached.activeReactions = {};\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 availableReactions: reduceAvailableReactions(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 sponsoredByChatId: {},\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction reduceGroupCalls(global: GlobalState): GlobalState['groupCalls'] {\n return {\n ...global.groupCalls,\n byId: {},\n activeGroupCallId: undefined,\n isGroupCallPanelHidden: undefined,\n isFallbackConfirmOpen: undefined,\n };\n}\n\nfunction reduceAvailableReactions(global: GlobalState): GlobalState['availableReactions'] {\n return global.availableReactions\n ?.map((r) => pick(r, ['reaction', 'staticIcon', 'title', 'isInactive']));\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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { 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 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 =\n Pick\n & {\n hasCustomBackground?: boolean;\n hasCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n leftColumnWidth?: number;\n };\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}) => {\n const { setIsUiReady } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { 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};\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}) => {\n const {\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n loadCountryList,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n } = getDispatch();\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)(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 & {\n language?: LangCode;\n };\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState,\n authState,\n authQrCode,\n language,\n}) => {\n const {\n returnToAuthPhoneNumber,\n setSettingOption,\n } = getDispatch();\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)(AuthCode));\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { 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;\n\nconst Auth: FC = ({\n authState,\n}) => {\n const {\n reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n } = getDispatch();\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)(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, { getDispatch, withGlobal } from './lib/teact/teactn';\n\nimport { 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;\n\nconst App: FC = ({ authState }) => {\n const { disconnect } = getDispatch();\n\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)(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","Error","message","subscribeToWorker","platform","window","async","Promise","race","makeRequest","pause","then","err","Date","now","startedAt","location","reload","args","callApi","fnName","warn","promise","name","cancelApiProgress","progressCallback","isCanceled","postMessage","generateIdFor","payload","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","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","undefined","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","withGlobal","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","SEND_MESSAGE_ACTION_INTERVAL","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","CONTENT_NOT_SUPPORTED","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","documentEventCounters","delegationRegistryByEventType","delegatedEventTypesByElement","propName","handler","asCapture","eventType","resolveEventType","canUseEventDelegation","resolveDelegationRegistry","existing","newSet","resolveDelegatedEventTypes","add","addDelegatedListener","removeDelegatedListener","tagName","realEventType","has","removeAllDelegatedListeners","eventTypes","realEvent","events","furtherCallsPrevented","Proxy","p","Reflect","body","parentNode","documentListenersCount","keys","delegatedHandlersCount1","values","acc","counter","delegationRegistriesCount","delegatedHandlersCount2","delegationRegistry","delegationElementsCount","delegatedEventTypesCount","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","newKeys","key","currentValue","newValue","cssText","removeAttribute","setAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$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","memoContainer","cleanup","hook","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","React","currentGlobal","reducers","callbacks","containers","mapStateToProps","ownProps","mappedProps","newMappedProps","Number","isNaN","DEBUG_componentName","areMappedPropsChanged","DEBUG_updates","updateTime","actions","runCallbacksThrottled","throttleWithTickEnd","runCallbacks","forceOnHeavyAnimation","setGlobal","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","appConfig","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","ensurePermanentWebVersion","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","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","areReactionsEmpty","reactions","results","count","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","mediaId","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","savedMessagesLang","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","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","stickers","setsById","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","nextOffset","currentResults","gifs","newResults","currentIds","gif","replaceAnimatedEmojis","animatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","selectStickersForEmoji","uniqueIds","unique","forEmoji","rebuildStickersForEmoji","replaceUsers","updateContactList","updatedUsers","contactUserIds","contactList","newContactUserIds","userUpdate","updatedUser","getUpdatedUser","updateUsers","updateSelectedUserId","selectedId","deleteContact","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","isBlocked","replaceUserStatuses","statusesById","addUserStatuses","pick","getComplexKey","updateGlobalSearch","globalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","every","newId","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","prototype","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","localTextSearch","byChatThreadKey","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","localMediaSearch","byChatId","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","sort","a","b","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","updateCurrentMessageList","shouldReplaceHistory","messageLists","newMessageLists","replaceChatMessages","updateMessageStore","threadsById","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","selectChatMessages","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","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","scheduledMessages","updateScheduledMessages","updateFocusedMessage","noHighlight","isResizingContainer","focusedMessage","updateSponsoredMessage","sponsoredByChatId","updateFocusDirection","direction","enterMessageSelectMode","selectedMessages","toggleMessageSelection","messageListType","childMessageIds","withShift","oldSelectedMessages","selectMessageIdsByGroupId","selectedMessageIds","newMessageIds","newSelectedMessageIds","selectCurrentMessageIds","prevIndex","min","to","exitMessageSelectMode","updateThreadUnreadFromForwardedMessage","originMessage","lastMessageId","isDeleting","channelPostId","threadInfoOld","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","selectSendAs","sendAsId","selectCurrentStickerSearch","selectCurrentGifSearch","selectStickerSet","selectStickerSetByShortName","shortName","stickerSets","stickersForEmoji","favorite","packs","cleanEmoji","selectAnimatedEmoji","cleanedEmoji","selectAnimatedEmojiEffect","animatedEmojiEffects","selectAnimatedEmojiSound","emojiSounds","selectLocalAnimatedEmoji","selectLocalAnimatedEmojiEffect","selectLocalAnimatedEmojiEffectByName","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","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","selectIsMessageProtected","isProtected","selectHasProtectedMessage","selectSponsoredMessage","expiresAt","selectDefaultReaction","defaultReaction","availableReactions","reaction","isInactive","enabledReactions","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","MILLISECONDS_IN_DAY","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","hours","getHours","marker","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","format","formatDate","formatMonthAndYear","isShort","formatCountdown","msLeft","days","formatMediaDuration","formatHumanDate","noWeekdays","isUpperFirst","upperFirst","lowerFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","maxValue","minutes","seconds","maxHours","maxMinutes","string","formatVoiceRecordDuration","durationInMs","milliseconds","locale","toLocaleString","year","formatDateTimeToString","hour","minute","second","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","timestampPlusDay","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","ADMINS_TOO_MUCH","ADMIN_RANK_EMOJI_NOT_ALLOWED","ADMIN_RANK_INVALID","FRESH_CHANGE_ADMINS_FORBIDDEN","INPUT_USER_DEACTIVATED","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","PERMANENT_VERSION_KEY","AVAILABLE_VERSIONS","setPermanentWebVersion","version","hasPermanentWebVersion","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","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","saveSync","clearWebsync","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","activeReactions","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","setupCaching","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","reduceAvailableReactions","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","markInactive","TeactDOM"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/main.d457636534c2b59dd7f6.js b/dist/main.d457636534c2b59dd7f6.js new file mode 100644 index 000000000..15b3b2542 --- /dev/null +++ b/dist/main.d457636534c2b59dd7f6.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,r,o,d,a={1226:(e,t,n)=>{n.d(t,{t9:()=>c,u3:()=>l,g8:()=>i});var r=n(3716),o=n(6926),d=n(9118);let a;const u=new Map,s=new Map;function i(e,t){return a||(r.eM&&console.log(">>> START LOAD WORKER"),a=new Worker(new URL(n.p+n.u(626),n.b)),function(e){a.addEventListener("message",(({data:t})=>{if("update"===t.type)e(t.update);else if("methodResponse"===t.type){const e=u.get(t.messageId);e&&(t.error?e.reject(t.error):e.resolve(t.response))}else if("methodCallback"===t.type){var n,r;null===(n=u.get(t.messageId))||void 0===n||null===(r=n.callback)||void 0===r||r.call(n,...t.callbackArgs)}else if("unhandledError"===t.type){var o;throw new Error(null===(o=t.error)||void 0===o?void 0:o.message)}}))}(e),"iOS"===t.platform&&window.addEventListener("focus",(()=>{m(),setTimeout((()=>m()),1e3)}))),f({type:"initApi",args:[t]})}function c(e,...t){if(!a)return void(r.eM&&console.warn("API is not initialized"));const n=f({type:"callMethod",name:e,args:t});return r.eM&&(async()=>{try{await n}catch(e){}})(),n}function l(e){e.isCanceled=!0;const{messageId:t}=s.get(e)||{};t&&a.postMessage({type:"cancelProgress",messageId:t})}function f(e){const t=(0,o.Z)(u),n={messageId:t,...e},r={messageId:t},d=new Promise(((e,t)=>{Object.assign(r,{resolve:e,reject:t})}));if("args"in n&&"function"==typeof n.args[1]){const e=n.args.pop();r.callback=e,s.set(e,r)}return u.set(t,r),d.catch((()=>{})).finally((()=>{u.delete(t),r.callback&&s.delete(r.callback)})),a.postMessage(n),d}const h=Date.now();async function m(){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()}}},6137:(e,t,n)=>{n.d(t,{Vv:()=>r.Vv,_f:()=>r._f,_Q:()=>r._Q,IU:()=>o.I});var r=n(4746),o=n(9077)},9077:(e,t,n)=>{let r;n.d(t,{I:()=>r}),function(e){e[e.BlobUrl=0]="BlobUrl",e[e.Lottie=1]="Lottie",e[e.Progressive=2]="Progressive",e[e.Stream=3]="Stream"}(r||(r={}))},4746:(e,t,n)=>{let r;n.d(t,{Vv:()=>r,_f:()=>o,_Q:()=>d}),function(e){e.Bold="MessageEntityBold",e.Blockquote="MessageEntityBlockquote",e.BotCommand="MessageEntityBotCommand",e.Cashtag="MessageEntityCashtag",e.Code="MessageEntityCode",e.Email="MessageEntityEmail",e.Hashtag="MessageEntityHashtag",e.Italic="MessageEntityItalic",e.MentionName="MessageEntityMentionName",e.Mention="MessageEntityMention",e.Phone="MessageEntityPhone",e.Pre="MessageEntityPre",e.Strike="MessageEntityStrike",e.TextUrl="MessageEntityTextUrl",e.Url="MessageEntityUrl",e.Underline="MessageEntityUnderline",e.Unknown="MessageEntityUnknown"}(r||(r={}));const o=-1,d="MESSAGE_DELETED"},88:(e,t,n)=>{n.d(t,{Z:()=>h});var r=n(4050),o=n(5116);const d=36,a=2147483647;function u(e,t,n){let r;for(e=n?Math.floor(e/700):e>>1,e+=Math.floor(e/t),r=0;e>455;r+=d)e=Math.floor(e/35);return Math.floor(r+36*e/(e+38))}function s(e,t){const n=[],r=[],o=e.length;let s,i,c,l,f,h,m,p,g,y,v,b,w;for(s=128,c=0,l=72,f=e.lastIndexOf("-"),f<0&&(f=0),h=0;h=128)throw new RangeError("Illegal input >= 0x80");n.push(e.charCodeAt(h))}for(m=f>0?f+1:0;m=o)throw RangeError("punycode_bad_input(1)");if(v=(I=e.charCodeAt(m++))-48<10?I-22:I-65<26?I-65:I-97<26?I-97:d,v>=d)throw RangeError("punycode_bad_input(2)");if(v>Math.floor((a-c)/g))throw RangeError("punycode_overflow(1)");if(c+=v*g,b=y<=l?1:y>=l+26?26:y-l,vMath.floor(a/(d-b)))throw RangeError("punycode_overflow(2)");g*=d-b}if(i=n.length+1,l=u(c-p,i,0===p),Math.floor(c/i)>a-s)throw RangeError("punycode_overflow(3)");s+=Math.floor(c/i),c%=i,t&&r.splice(c,0,e.charCodeAt(m-1)-65<26),n.splice(c,0,s),c++}var I;if(t)for(c=0,w=n.length;c{const t=[];let n=0;const r=e.length;let o;for(;n65535&&(o-=65536,t.push(String.fromCharCode(o>>>10&1023|55296)),o=56320|1023&o),t.push(String.fromCharCode(o))}return t.join("")})(n)}var i=n(3716),c=n(6752),l=n(1396);function f(e){if(!e)return;const t=(0,l.X)(e);if(t)try{let e=decodeURI(t);const n=e.match(/^https?:\/\/([^/:?#]+)(?:[/:?#]|$)/i);if(!n)return;const r=n[1];return e=e.replace(r,function(e){const t=e.split("."),n=[];for(let e=0;e{const{toggleSafeLinkModal:u,openTelegramLink:s}=(0,o.uC)(),h=d||t,m=e!==h,p=(0,r.I4)((t=>t.ctrlKey||t.altKey||t.shiftKey||t.metaKey||!e||!e.match(i.FS)&&!e.match(i.g$)?!m||(u({url:e}),t.preventDefault(),!1):(t.preventDefault(),s({url:e}),!1)),[m,s,u,e]);if(!e)return;const g=(0,c.Z)(n||"text-entity-link",t.length>50&&"long-word-break-all");return r.ZP.createElement("a",{href:(0,l.X)(e),title:f(e),target:"_blank",rel:"noopener noreferrer",className:g,onClick:p,dir:a?"rtl":"auto"},h)}))},5376:(e,t,n)=>{n.d(t,{yW:()=>r,K2:()=>o,mD:()=>d,Oh:()=>a,v6:()=>u});function r(e){return e>536870912?`${(e/1073741824).toFixed(1)} GB`:e>524288?`${(e/1048576).toFixed(1)} MB`:`${(e/1024).toFixed(1)} KB`}function o(e){const{fileName:t,mimeType:n}=e;return d(t,n)}function d(e,t){return e&&-1!==e.indexOf(".")?e.split(".").pop():t.split("/").pop()}function a(e){switch(e){case"apk":case"xls":case"xlsx":return"green";case"zip":case"rar":case"7z":case"tar":case"gz":case"ppt":case"pptx":return"orange";case"pdf":case"xps":return"red";default:return"default"}}function u(e){return Boolean(e.previewBlobUrl||e.thumbnail)}},4784:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(3681);const o=new RegExp(`^(?:${r.Z.source})+$`,""),d=e=>{if(e.length>24)return!1;if(!Boolean(e.match(o)))return!1;let t=0;for(;r.Z.exec(e);)if(t++,t>3)return r.Z.lastIndex=0,!1;return t}},8005:(e,t,n)=>{n.d(t,{D:()=>p});var r=n(4050),o=n(2858),d=n(8035),a=n(9937),u=n(2340),s=n(6752),i=n(8033),c=n(5116);const l=({className:e,sender:t,children:n})=>{const{openUserInfo:o}=(0,c.uC)(),d=(0,r.I4)((()=>{t&&o({id:t.id})}),[t,o]);return t?r.ZP.createElement(i.Z,{className:(0,s.Z)("UserLink",e),onClick:d},n):n},f=({className:e,message:t,children:n})=>{const{focusMessage:o}=(0,c.uC)(),d=(0,r.I4)((()=>{t&&o({chatId:t.chatId,messageId:t.id})}),[o,t]);return t?r.ZP.createElement(i.Z,{className:(0,s.Z)("MessageLink",e),onClick:d},n):n},h=({className:e,chatId:t,children:n})=>{const{openChat:o}=(0,c.uC)(),d=(0,r.I4)((()=>{t&&o({id:t})}),[t,o]);return t?r.ZP.createElement(i.Z,{className:(0,s.Z)("ChatLink",e),onClick:d},n):n},m=({className:e,groupCall:t,children:n})=>{const{joinGroupCall:o}=(0,c.uC)(),d=(0,r.I4)((()=>{t&&o({id:t.id,accessHash:t.accessHash})}),[t,o]);return t?r.ZP.createElement(i.Z,{className:(0,s.Z)("GroupCallLink",e),onClick:d},n):n};function p(e,t,n,s,i,c,l={}){if(!t.content.action)return[];const{text:p,translationValues:v,amount:b,currency:w,call:I}=t.content.action,C=[],S={...l,maxTextLength:32};let E,P=e("Chat.Service.Group.UpdatedPinnedMessage1"!==p||i?p:"Message.PinnedGenericMessage",v&&v.length?v:void 0);return P.includes("%payment_amount%")&&(E=y(P,"%payment_amount%",(0,a.x)(b,w,e.code)),P=E.pop(),C.push(...E)),E=y(P,"%action_origin%",n?!l.isEmbedded&&function(e,t,n){return(0,o.YC)(t.id)?g(t,n):function(e,t,n){const a=(0,d.Z)((0,o.U)(e,t));return n?a:r.ZP.createElement(h,{className:"action-link",chatId:t.id},t&&(0,u.Z)(a))}(e,t,n)}(e,n,l.asPlain)||" ":"User"),P=E.pop(),C.push(...E),E=y(P,"%target_user%",s?s.map((e=>g(e,l.asPlain))).filter(Boolean):"User"),P=E.pop(),C.push(...E),E=y(P,"%message%",i?function(e,t,n={}){const a=(0,o.MK)(e,t),{photo:s,video:i,document:c,sticker:l}=(0,o.qp)(t),{maxTextLength:h,isEmbedded:m,asPlain:p}=n,g=m&&a&&!s&&!i&&!c&&!l;let y=(0,d.Z)(a,h);return m&&(s?y="a photo":i?y=i.isGif?"a GIF":"a video":c?y="a document":l&&(y=a)),p?g?`«${y}»`:y:g?r.ZP.createElement("span",null,"«",r.ZP.createElement(f,{className:"action-link",message:t},(0,u.Z)(y)),"»"):r.ZP.createElement(f,{className:"action-link",message:t},(0,u.Z)(y))}(e,i,S):"a message"),P=E.pop(),C.push(...E),E=y(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=y(P,"%target_chat%",c?function(e,t){const n="another chat";return t?n:r.ZP.createElement(h,{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(m,{groupCall:e},t)}(I,C):C}function g(e,t){const n=(0,d.Z)((0,o.Js)(e));return t?n:r.ZP.createElement(l,{className:"action-link",sender:e},e&&(0,u.Z)(n))}function y(e,t,n){const r=e.indexOf(t);if(r<0||!n)return[e];const o=[];return o.push(e.substring(0,r)),Array.isArray(n)?n.forEach(((e,t)=>{o.push(e),t+1{n.d(t,{Z:()=>h});var r=n(4050),o=n(3681),d=n(3716),a=n(7361),u=n(4284),s=n(6752),i=n(7373),c=n(88);const l=/^[\d\wа-яё]$/i,f=/(\*\*|__).+?\1/g;function h(e,t=["emoji"],n){return"string"!=typeof e?[e]:t.reduce(((e,t)=>{switch(t){case"escape_html":return function(e){const t=document.createElement("div");return e.reduce(((e,n)=>"string"!=typeof n?(e.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,a=n.highlight,d.reduce(((e,t)=>{if("string"!=typeof t||!a)return e.push(t),e;const n=t.toLowerCase(),o=n.indexOf(a.toLowerCase()),d=n[o+a.length];if(o<0||d&&d.match(l))return e.push(t),e;const u=[];return u.push(t.substring(0,o)),u.push(r.ZP.createElement("span",{className:"matching-text-highlight"},t.substring(o,o+a.length))),u.push(t.substring(o+a.length)),[...e,...u]}),[]);case"links":return function(e){return e.reduce(((e,t)=>{if("string"!=typeof t)return e.push(t),e;const n=t.match(g);if(!n||!n.length)return e.push(t),e;const o=[];let d=n.shift(),a=0;for(;d;){const e=t.indexOf(d,a);o.push(t.substring(a,e)),d.startsWith("@")?o.push(r.ZP.createElement(i.Z,{username:d},d)):(d.endsWith("?")&&(d=d.slice(0,d.length-1)),o.push(r.ZP.createElement(c.Z,{text:d,url:d}))),a=e+d.length,d=n.shift()}return o.push(t.substring(a)),[...e,...o]}),[])}(e);case"simple_markdown":return y(e,"jsx");case"simple_markdown_html":return y(e,"html")}var d,a;return e}),[e])}function m(e,t,n){return a.op?e:e.reduce(((e,d)=>{if("string"!=typeof d)return e.push(d),e;const a=(d=(0,u.g6)(d)).split(o.Z),i=d.match(o.Z)||[];return e.push(a[0]),i.reduce(((e,d,i)=>{const c=(0,u.U_)((0,o.l)(d));if(!c)return e;const l=(0,s.Z)("emoji","small"===t&&"emoji-small");"jsx"===n&&e.push(r.ZP.createElement("img",{className:l,src:`./img-apple-${"big"===t?"160":"64"}/${c}.png`,alt:d})),"html"===n&&e.push(`${d}`);const f=2*i+2;return a[f]&&e.push(a[f]),e}),e)}),[])}function p(e,t){return e.reduce(((e,n)=>{if("string"!=typeof n)return e.push(n),e;const o=n.split(/\r\n|\r|\n/g).reduce(((e,n,o,d)=>{const a=n.trimLeft(),u=n.length-a.length;return e.push(String.fromCharCode(160).repeat(u)+a),o!==d.length-1&&e.push("jsx"===t?r.ZP.createElement("br",null):"
"),e}),[]);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 a=2*d+2;return o[a]&&e.push(o[a]),e}),e)}),[])}},386:(e,t,n)=>{n.d(t,{q:()=>d,b:()=>a});var r=n(3716),o=n(7361);function d(e,t=!1){o.cj||!document.activeElement||document.activeElement.id!==r.R2||!t&&e.target!==e.currentTarget||e.preventDefault()}function a(e){d(e,!0)}},7373:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(5116),d=n(1638);const a=(0,o.c$)(((e,{userId:t})=>({userOrChat:t?(0,d.dy)(e,t):void 0})))((({username:e,userOrChat:t,children:n})=>{const{openChat:d,openChatByUsername:a}=(0,o.uC)();return r.ZP.createElement("a",{onClick:()=>{t?d({id:t.id}):e&&a({username:e.substring(1)})},className:"text-entity-link",dir:"auto"},n)}))},231:(e,t,n)=>{n.d(t,{Z:()=>u});var r=n(4050),o=n(6752),d=n(9204),a=n(8512);const u=({ref:e,type:t="button",onClick:n,onContextMenu:u,onMouseDown:s,onMouseEnter:i,onMouseLeave:c,onFocus:l,children:f,size:h="default",color:m="primary",backgroundImage:p,className:g,round:y,pill:v,fluid:b,isText:w,isLoading:I,ariaLabel:C,href:S,download:E,disabled:P,ripple:M,faded:A,tabIndex:k,isRtl:T,withClickPropagation:N})=>{let L=(0,r.sO)(null);e&&(L=e);const[R,D]=(0,r.eJ)(!1),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]),_=(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(a.Z,null)):r.ZP.createElement("button",{ref:L,type:t,className:O,onClick:Z,onContextMenu:u,onMouseDown:_,onMouseEnter:i&&!P?i:void 0,onMouseLeave:c&&!P?c:void 0,onFocus:l&&!P?l:void 0,"aria-label":C,title:C,tabIndex:k,dir:T?"rtl":void 0,style:p?`background-image: url(${p})`:void 0},I?r.ZP.createElement("div",null,r.ZP.createElement("span",{dir:T?"auto":void 0},"Please wait..."),r.ZP.createElement(d.Z,{color:w?"blue":"white"})):f,!P&&M&&r.ZP.createElement(a.Z,null))}},4605:(e,t,n)=>{n.d(t,{Z:()=>s});var r=n(4050),o=n(6752),d=n(9107),a=n(2340),u=n(9204);const s=(0,r.X$)((({id:e,name:t,value:n,label:s,subLabel:i,checked:c,disabled:l,round:f,blocking:h,isLoading:m,onChange:p,onCheck:g})=>{const y=(0,d.Z)(),v=(0,r.I4)((e=>{p&&p(e),g&&g(e.currentTarget.checked)}),[p,g]),b=(0,o.Z)("Checkbox",l&&"disabled",f&&"round",m&&"loading",h&&"blocking");return r.ZP.createElement("label",{className:b,dir:y.isRtl?"rtl":void 0},r.ZP.createElement("input",{type:"checkbox",id:e,name:t,value:n,checked:c,disabled:l,onChange:v}),r.ZP.createElement("div",{className:"Checkbox-main"},r.ZP.createElement("span",{className:"label",dir:"auto"},(0,a.Z)(s)),i&&r.ZP.createElement("span",{className:"subLabel",dir:"auto"},(0,a.Z)(i))),m&&r.ZP.createElement(u.Z,null))}))},3106:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(2328);const d=({trigger:e,className:t,children:n,positionX:d="left",positionY:a="top",footer:u,forceOpen:s,onOpen:i,onClose:c})=>{const l=(0,r.sO)(null),f=(0,r.sO)(null),[h,m]=(0,r.eJ)(!1);return r.ZP.createElement("div",{ref:f,className:`DropdownMenu ${t||""}`,onKeyDown:e=>{const t=l.current;if(!h||40!==e.keyCode||!t)return;const n=document.activeElement,r=Array.from(t.children);n&&-1!==r.indexOf(n)||r[0].focus()}},e({onTrigger:()=>{m(!h),h?c&&c():i&&i()},isOpen:h}),r.ZP.createElement(o.Z,{ref:l,containerRef:f,isOpen:h||!!s,className:t||"",positionX:d,positionY:a,footer:u,autoClose:!0,onClose:()=>{m(!1),c&&c()},shouldSkipTransition:s},n))}},7687:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(6752),d=n(9107);const a=(0,r.X$)((({ref:e,id:t,className:n,value:a,label:u,error:s,success:i,disabled:c,readOnly:l,placeholder:f,autoComplete:h,inputMode:m,maxLength:p,onChange:g,onInput:y,onKeyPress:v,onKeyDown:b,onBlur:w,onPaste:I})=>{const C=(0,d.Z)(),S=s||i||u,E=(0,o.Z)("input-group",a&&"touched",s?"error":i&&"success",c&&"disabled",l&&"disabled",S&&"with-label",n);return r.ZP.createElement("div",{className:E,dir:C.isRtl?"rtl":void 0},r.ZP.createElement("input",{ref:e,className:"form-control",type:"text",id:t,dir:"auto",value:a||"",placeholder:f,maxLength:p,autoComplete:h,inputMode:m,disabled:c,readOnly:l,onChange:g,onInput:y,onKeyPress:v,onKeyDown:b,onBlur:w,onPaste:I}),S&&r.ZP.createElement("label",{htmlFor:t},S))}))},8033:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=({children:e,className:t,isRtl:n,onClick:d})=>{const a=(0,r.I4)((e=>{e.preventDefault(),d(e)}),[d]);return r.ZP.createElement("a",{href:"#",className:(0,o.Z)("Link",t),dir:n?"rtl":"auto",onClick:d?a:void 0},e)}},4288:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(9204);const d=(0,r.X$)((({color:e="blue"})=>r.ZP.createElement("div",{className:"Loading"},r.ZP.createElement(o.Z,{color:e,withBackground:"white"===e}))))},2328:(e,t,n)=>{n.d(t,{Z:()=>h});var r=n(4050),o=n(1212),d=n(2313),a=n(8758),u=n(274),s=n(3989),i=n(6752),c=n(8674),l=n(6590),f=n(386);const h=({ref:e,containerRef:t,isOpen:n,className:h,style:m,bubbleStyle:p,children:g,positionX:y="left",positionY:v="top",autoClose:b=!1,footer:w,noCloseOnBackdrop:I=!1,onCloseAnimationEnd:C,onClose:S,onMouseEnter:E,onMouseLeave:P,shouldSkipTransition:M})=>{let A=(0,r.sO)(null);e&&(A=e);const k=t||A,{transitionClassNames:T}=(0,o.Z)(n,C,M,void 0,M);(0,r.d4)((()=>n&&S?(0,s.Z)(S):void 0),[n,S]),(0,l.ZP)(n,S,void 0,void 0,b),(0,u.Z)((([e])=>{(n||!n&&!0===e)&&(0,c.YW)(200)}),[n]);const N=(0,d.Z)(A,n,b?S:void 0,void 0,!0);(0,a.Z)(n,k,I?void 0:S);const L=(0,i.Z)("bubble menu-container custom-scroll",v,y,w&&"with-footer",T);return r.ZP.createElement("div",{className:(0,i.Z)("Menu no-selection",h),onKeyDown:n?N:void 0,onMouseEnter:E,onMouseLeave:n?P:void 0,style:m},n&&r.ZP.createElement("div",{className:"backdrop",onMouseDown:f.b}),r.ZP.createElement("div",{ref:A,className:L,style:`transform-origin: ${v} ${y};${p||""}`,onClick:b?S:void 0},g,w&&r.ZP.createElement("div",{className:"footer"},w)))}},8964:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(6752),d=n(9107);const a=e=>{const{icon:t,className:n,children:a,onClick:u,href:s,download:i,disabled:c,destructive:l,ariaLabel:f}=e,h=(0,d.Z)(),m=(0,r.I4)((e=>{if(c||!u)return e.stopPropagation(),void e.preventDefault();u(e)}),[c,u]),p=(0,r.I4)((e=>{if(13===e.keyCode||32===e.keyCode)return c||!u?(e.stopPropagation(),void e.preventDefault()):void u(e)}),[c,u]),g=(0,o.Z)("MenuItem",n,c&&"disabled",l&&"destructive"),y=r.ZP.createElement(r.ZP.Fragment,null,t&&r.ZP.createElement("i",{className:`icon-${t}`,"data-char":t.startsWith("char-")?t.replace("char-",""):void 0}),a);return s?r.ZP.createElement("a",{tabIndex:0,className:g,href:s,download:i,"aria-label":f,title:f,target:s.startsWith(window.location.origin)?"_self":"_blank",rel:"noopener noreferrer",dir:h.isRtl?"rtl":void 0,onClick:u},y):r.ZP.createElement("div",{role:"button",tabIndex:0,className:g,onClick:m,onKeyDown:p,"aria-label":f,title:f,dir:h.isRtl?"rtl":void 0},y)}},8512:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(9118);const d=(0,r.X$)((()=>{const[e,t]=(0,r.eJ)([]),n=(0,r.Ye)((()=>(0,o.Ds)((()=>{t([])}),700,!1)),[]),d=(0,r.I4)((r=>{if(0!==r.button)return;const o=r.currentTarget,d=o.getBoundingClientRect(),a=o.offsetWidth/2;t([...e,{x:r.clientX-d.x-a/2,y:r.clientY-d.y-a/2,size:a}]),requestAnimationFrame((()=>{n()}))}),[e,n]);return r.ZP.createElement("div",{className:"ripple-container",onMouseDown:d},e.map((({x:e,y:t,size:n})=>r.ZP.createElement("span",{style:`left: ${e}px; top: ${t}px; width: ${n}px; height: ${n}px;`}))))}))},9204:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=({color:e="blue",withBackground:t})=>r.ZP.createElement("div",{className:(0,o.Z)("Spinner",e,t&&"with-background")},r.ZP.createElement("div",null))},3716:(e,t,n)=>{n.d(t,{Ti:()=>r,ou:()=>o,iC:()=>d,Ji:()=>a,eM:()=>u,ZT:()=>s,Cg:()=>i,S:()=>c,b_:()=>l,Vx:()=>f,sd:()=>h,Uh:()=>m,gJ:()=>p,lO:()=>g,Cy:()=>y,lW:()=>v,SG:()=>b,lF:()=>w,fo:()=>I,ee:()=>C,by:()=>S,lo:()=>P,hT:()=>M,YQ:()=>A,rS:()=>k,t_:()=>T,Ov:()=>N,EN:()=>L,pn:()=>R,Hk:()=>D,Vk:()=>O,mo:()=>Z,qU:()=>_,ul:()=>x,NM:()=>F,Qx:()=>B,mw:()=>$,oB:()=>U,zy:()=>j,CX:()=>W,xS:()=>G,b6:()=>V,AR:()=>H,r_:()=>z,o_:()=>Q,R2:()=>K,nY:()=>J,QU:()=>q,jT:()=>Y,_m:()=>X,ks:()=>ee,l3:()=>te,u_:()=>ne,rO:()=>re,AE:()=>oe,AJ:()=>de,fK:()=>ae,V$:()=>ue,bK:()=>se,ck:()=>ie,xn:()=>ce,K7:()=>le,w7:()=>fe,z7:()=>he,qp:()=>me,Q:()=>pe,Mw:()=>ge,DC:()=>ye,Y7:()=>ve,yK:()=>be,K2:()=>we,bM:()=>Ie,ku:()=>Ce,zq:()=>Se,n:()=>Ee,pR:()=>Pe,kU:()=>Me,Y:()=>Ae,Ng:()=>ke,oG:()=>Te,wG:()=>Ne,dI:()=>Le,VC:()=>Re,FM:()=>De,uW:()=>Oe,g$:()=>Ze,FS:()=>_e,FD:()=>xe,aw:()=>Fe,FV:()=>Be,Nf:()=>$e,WS:()=>Ue,DU:()=>je,EG:()=>We,t4:()=>Ge,sR:()=>Ve,$O:()=>He,Bg:()=>ze,vi:()=>Qe,Db:()=>Ke,mU:()=>Je,p3:()=>qe,It:()=>Ye,Vv:()=>Xe,g:()=>et,Hc:()=>tt,EH:()=>nt,Ro:()=>rt,aC:()=>ot,LH:()=>dt});const r="Telegram",o=" [Inactive]",d="Telegram WebZ",a="1.30.3",u=!1,s=!1,i=!1,c="Shoot!\nSomething went wrong, please see the error details in Dev Tools Console.",l="user_auth",f="GramJs:sessionId",h=!1,m="tt-global-state",p=30,g=5e3,y=!1,v="tt-media",b="tt-media-avatars",w="tt-media-progressive",I="tt-custom-bg",C="tt-lang-packs-v7",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,_=500,x=20,F=!1,B=1,$=1,U=0,j=2,W=j,G=16,V=17,H=15,z=1e4,Q=3e3,K="editable-message-text",J="editable-message-text-modal",q=1440,Y=1150,X=1275,ee=925,te=600,ne=950,re=450,oe=1e9,de="0",ae=100,ue=1500,se=250,ie=600,ce=500,le=(Math.round((se+ie)/2),new Set(["newMessage","newScheduledMessage","deleteMessages","deleteScheduledMessages","deleteHistory"]),13),fe=11,he=160,me=120,pe=64,ge=48,ye=32,ve=64,be=64,we=160,Ie=140,Ce=80,Se=100,Ee="MEMOJI_STICKER",Pe="en",Me=200,Ae=450,ke="video/quicktime",Te=new Set(["image/png","image/gif","image/jpeg"]),Ne=new Set(["video/mp4"]),Le=new Set([...Te,...Ne]),Re="The message is not supported on this version of Telegram.",De="((ftp|https?):\\/\\/)?((www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,63})\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)",Oe="(@[\\w\\d_-]+)",Ze=/^tg:(\/\/)?([?=&\d\w_-]+)?/gm,_e=/^(?: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"]),Fe="777000",Be="1271266957",$e=0,Ue=1,je=10,We=5,Ge=2147483646,Ve="en",He="android",ze=["android","ios","tdesktop","macos"],Qe="TelegramTips",Ke=["ar","pt-br","id","it","ko","ms","pl","es","tr"],Je="https://bugs.telegram.org/?tag_ids=41&sort=time",qe="#A2AF8E",Ye="#0F0F0F",Xe="#0a0a0a8c",et="rgba(90, 110, 70, 0.6)",tt=50,nt=604680,rt=100,ot=100*rt,dt=!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 a,u=!1;const s=(e,t,n=!1)=>{(0,r.d4)((()=>{if(!n)return u&&e(),document.addEventListener(o,e),document.addEventListener(d,t),()=>{document.removeEventListener(d,t),document.removeEventListener(o,e)}}),[n,t,e])};function i(){return u}function c(e=1e3){function t(){a&&(clearTimeout(a),a=void 0),u=!1,document.dispatchEvent(new Event(d))}return u||(u=!0,document.dispatchEvent(new Event(o))),a&&(clearTimeout(a),a=void 0),a=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),a=n(5116),u=n(782);const s=window.location.hash,i=`${window.location.pathname}${window.location.search}`,c={currentIndex:0,nextStateIndexToReplace:-1,isHistoryAltered:!1,isDisabled:!1,isEdge:!1,currentIndexes:[]},l=()=>{c.isDisabled=!0},f=()=>{c.isEdge&&setTimeout((()=>{c.isEdge=!1}),350)};function h(e,t,n,o,s=!1,l){const f=(0,r.sO)(-1),h=(0,r.sO)(!1),m=(0,d.Z)(e),p=(0,r.sO)(!0),g=(0,r.sO)([]),y=(0,d.Z)(l),v=(0,r.sO)(!1),b=(0,r.I4)(((t=!1)=>{if(l){const e=y||[];if(e.length{const e=++c.currentIndex;c.currentIndexes.push(e),window.history.pushState({index:e,state:o},"",`#${l[l.length-1]}`),g.current.push({index:e,hash:l[l.length-1]})}),0);else{const t=e.length-l.length;if(v.current)v.current=!1;else{if(l.length!==g.current.length&&t>0){const e=g.current[g.current.length-t-1];let n=t;if(e){const t=c.currentIndexes.findIndex((t=>t===e.index));n=c.currentIndexes.length-t-1}c.isHistoryAltered=!0,window.history.go(-n),g.current.splice(g.current.length-t-1,t).forEach((({index:e})=>{c.currentIndexes.splice(c.currentIndexes.indexOf(e),1)}))}l.length>0&&setTimeout((()=>{const e=++c.currentIndex;c.currentIndexes[c.currentIndexes.length-1]=e,window.history.replaceState({index:e,state:o},"",`${i}#${l[l.length-1]}`),g.current[g.current.length-1]={index:e,hash:l[l.length-1]}}),0)}}}else e&&!t&&(p.current=!1,h.current?(h.current=!1,c.currentIndexes.push(f.current)):setTimeout((()=>{const e=++c.currentIndex;c.currentIndexes.push(e),window.history[c.currentIndexes.includes(c.nextStateIndexToReplace-1)&&0!==window.history.state.index&&c.nextStateIndexToReplace===e&&!s?"replaceState":"pushState"]({index:e,state:o},""),f.current=e,s&&(c.nextStateIndexToReplace=c.currentIndex+1)}),0)),!t&&e||p.current||(f.current!==c.currentIndex&&s||(c.isHistoryAltered=!0,window.history.back(),setTimeout((()=>{c.nextStateIndexToReplace=-1}),400)),c.currentIndexes.splice(c.currentIndexes.indexOf(f.current),1),p.current=!0)}),[o,l,e,y,s]);return(0,r.d4)((()=>{const r=e=>{if(c.isHistoryAltered)return void setTimeout((()=>{c.isHistoryAltered=!1}),0);const{index:r}=e.state,o=r||0;try{const r=l?g.current[g.current.length-1].index:f.current,d=c.currentIndexes[c.currentIndexes.indexOf(r)-1];if(c.isDisabled)return;!p.current&&(0===o||o===d)||l&&(0===o||o===d)?(l&&(v.current=!0,g.current.pop()),c.currentIndexes.splice(c.currentIndexes.indexOf(r),1),t&&(c.isEdge&&(0,a.uC)().disableHistoryAnimations(),t(!c.isEdge),p.current=!0)):o===r&&p.current&&n&&!l&&(h.current=!0,c.isEdge&&(0,a.uC)().disableHistoryAnimations(),n(e.state.state))}catch(e){}},o=l?!y||!(0,u.et)(y,l):m!==e;return!c.isDisabled&&o&&b(),window.addEventListener("popstate",r),()=>window.removeEventListener("popstate",r)}),[o,b,l,e,t,n,y,m,s]),{forceClose:()=>b(!0)}}o.cj&&(window.addEventListener("touchstart",(e=>{const t=e.touches[0].pageX;(t<=300||t>=window.innerWidth-300)&&(c.isEdge=!0)})),window.addEventListener("touchend",f),window.addEventListener("popstate",f)),window.history.replaceState({index:c.currentIndex},"",i)},2313:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=(e,t,n,o,d)=>{const[a,u]=(0,r.eJ)(-1);return(0,r.d4)((()=>{u(-1);const n=e.current;t&&n&&!d&&(n.tabIndex=-1,n.focus())}),[e,t,d]),(0,r.I4)((t=>{const r=e.current;if(!r)return;if(13===t.keyCode&&n)return void n(a);if(38!==t.keyCode&&40!==t.keyCode)return;const d=document.activeElement,s=Array.from(o?r.querySelectorAll(o):r.children);let i=d&&s.indexOf(d)||a;if(38===t.keyCode&&i>0)i--;else if(40===t.keyCode&&i{n.d(t,{Z:()=>a});var r=n(711),o=n(5326),d=n(9290);const a=()=>{const e=(0,o.Z)();return(0,d.Z)((()=>r.ll(e)),[e]),r.i0}},8778:(e,t,n)=>{n.d(t,{Z:()=>a});var r=n(4050),o=n(9203),d=n(5326);const a=(e,t,n=!1,a=!1)=>{const u=(0,o.o5)(e,t),s=(0,d.Z)();return(0,r.d4)((()=>{if(a)return(0,o.Qt)(s)}),[a,s]),(0,r.d4)((()=>{n||u||(0,o.$y)(e,t).then(s)}),[e,s,u,t,n]),u}},9290:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(7204);const o=(e,t)=>{const n=(0,r.Z)(t);n&&!t.some(((e,t)=>e!==n[t]))||e(n||[])}},7204:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);const o=function(e,t){const n=(0,r.sO)(),{current:o}=n;return t&&void 0===e||(n.current=e),o}},1212:(e,t,n)=>{n.d(t,{Z:()=>d});var r=n(4050),o=n(6752);const d=(e=!1,t,n=!1,d="fast",a=!1)=>{const[u,s]=(0,r.eJ)(!e),i=(0,r.sO)(),[c,l]=(0,r.eJ)(e&&n);if(e)s(!1),l(!0),i.current&&(window.clearTimeout(i.current),i.current=void 0);else if(l(!1),!u&&!i.current){const e=()=>{s(!0),t&&t(),i.current=void 0};a?e():i.current=window.setTimeout(e,350)}const f=c&&!(a&&!e),h=Boolean(i.current),m=e||h;return{shouldRender:m,transitionClassNames:(0,o.Z)(d&&"opacity-transition",d,f&&"open",m&&"shown",h&&"closing")}}},8758:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(4050);function o(e,t,n){(0,r.d4)((()=>{const r=e=>{const r=t.current,o=e.target;r&&o&&(r.contains(e.target)&&!o.classList.contains("backdrop")||(e.preventDefault(),e.stopPropagation(),n&&n()))};return e&&n&&document.addEventListener("mousedown",r),()=>{document.removeEventListener("mousedown",r)}}),[e,t,n])}},5247:(e,t,n)=>{n.d(t,{Oo:()=>s,xg:()=>i,lQ:()=>h});var r=n(3716);const o=new Set(["scroll","mouseenter","mouseleave"]),d={},a={},u=new Map;function s(e,t,n,r=!1){const o=c(t,e);l(o,e,r)?function(e,t,n){d[e]||(d[e]=0,document.addEventListener(e,m)),function(e){return a[e]||(a[e]=new Map),a[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),d[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){d[e]--,d[e]||document.removeEventListener(e,m),a[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=a[e.type];if(t){let n=!1,r=e.target;const o=()=>{n=!0},d=()=>{e.preventDefault()},a=new Proxy(e,{get:(e,t)=>"currentTarget"===t?r:"stopPropagation"===t||"stopImmediatePropagation"===t?o:"preventDefault"===t?d:Reflect.get(e,t)});for(;r&&r!==document.body;){const e=t.get(r);if(e&&(e(a),n))return;r=r.parentNode}}}r.eM&&document.addEventListener("dblclick",(()=>{const e=Object.keys(d).length,t=Object.values(d).reduce(((e,t)=>e+t),0),n=Object.keys(a).length,r=Object.values(a).reduce(((e,t)=>e+t.size),0),o=u.size,s=Array.from(u.values()).reduce(((e,t)=>e+t.size),0);console.warn("DELEGATED EVENTS STATS",{delegatedHandlersCount1:t,delegatedHandlersCount2:r,delegatedEventTypesCount:s,delegationRegistriesCount:n,delegationElementsCount:o,documentListenersCount:e})}))},2916:(e,t,n)=>{n.d(t,{Z:()=>y});var r=n(4050),o=n(6926),d=n(3716),a=n(5247);const u=new Set(["key","ref","teactFastList","teactOrderKey"]),s=new Set(["dir","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),f=(0,r.U9)(t);if(o||((0,r.CD)(n,f),(0,r.CD)(t,void 0),"props"in t&&"props"in n&&(n.props.ref=t.props.ref)),(0,r.O_)(t)&&(0,r.O_)(n)){if(w){const t=f,n=e.childNodes["up"===w?c:c+1];n?e.insertBefore(t,n):(b||e).appendChild(t)}o||function(e,t,n){const r=Object.keys(e.props),o=Object.keys(t.props);r.forEach((r=>{const o=e.props[r],d=t.props[r];void 0!==o&&(void 0===d||o!==d&&r.startsWith("on"))&&function(e,t,n){"className"===t?e.className="":"value"===t?e.value="":"style"===t?e.style.cssText="":"dangerouslySetInnerHTML"===t?e.innerHTML="":t.startsWith("on")?(0,a.xg)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||t.startsWith("aria-")||s.has(t)?e.removeAttribute(t):u.has(t)||delete e[i[t]||t]}(n,r,o)})),o.forEach((r=>{const o=e.props[r],d=t.props[r];void 0!==d&&d!==o&&g(n,r,d)}))}(t,n,f),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 a=0;const u=e.children.reduce(((e,r,d)=>{let u="props"in r?r.props.key:void 0;const s=null!=u;if(s&&!o.has(u))return l(n,r,void 0,t,-1),e;if(!s){const o=t.children[d],a=o&&"props"in o?o.props.key:void 0;if(!o||a)return l(n,r,void 0,t,-1),e;u=`__indexKey#${d}`}return e[u]={$element:r,index:a++,order:"props"in r?r.props.teactOrderKey:void 0},e}),{});let s,i,c=[],f=0;return t.children.forEach(((e,r)=>{const o="props"in e?e.props.key:`__indexKey#${r}`,d=u[o];if(!d)return s||(s=[],i=r),void s.push(e);s&&(c=c.concat(p(s,i,n,t)),i=void 0,s=void 0);const a="props"in e?e.props.teactOrderKey:void 0,h=d.index!==f&&d.order!==a,m=h&&f>d.index;h&&!m||f++,c.push(l(n,d.$element,e,t,r,{forceIndex:!0,...h&&{moveDirection:m?"down":"up"}}))})),s&&(c=c.concat(p(s,i,n,t))),c}(e,t,n);const o=Math.max(e.children.length,t.children.length),a=[],u=t.children.length>e.children.length+1?document.createDocumentFragment():void 0;for(let r=0;r=e.children.length?{fragment:u}:void 0);o&&a.push(o)}return u&&n.appendChild(u),a}(t,n,o?e:f)}}return n}function f(e,t,n,o){if(!(0,r.op)(e))return e;const{componentInstance:d}=e;if(!d.isMounted){h(e=(0,r.Hb)(d),t,n,o);const a=e.children[0];(0,r.op)(a)&&(e.children=[f(a,e,0,o)]),d.isMounted=!0}return e}function h(e,t,n,r){const{componentInstance:o}=e;o.onUpdate=()=>{t.children[n]=l(r,t.children[n],o.$element,t,n,{skipComponentUpdate:!0})}}function m(e){if((0,r.V2)(e))return document.createTextNode("");if((0,r.iB)(e))return document.createTextNode(e.value);if((0,r.op)(e))return m(e.children[0]);const{tag:t,props:n,children:o=[]}=e,d=document.createElement(t);return"object"==typeof n.ref&&(n.ref.current=d),Object.keys(n).forEach((e=>{void 0!==n[e]&&g(d,e,n[e])})),e.children=o.map(((t,n)=>l(d,void 0,t,e,n))),d}function p(e,t,n,r){if(1===e.length)return[l(n,void 0,e[0],r,t,{forceIndex:!0})];if(e.length>1){const o=document.createDocumentFragment(),d=e.map((e=>l(n,void 0,e,r,t,{fragment:o})));return n.childNodes[t]?n.insertBefore(o,n.childNodes[t]):n.appendChild(o),d}throw new Error("Unexpected input")}function g(e,t,n){"className"===t?e.className=n:"value"===t?e.value=n:"style"===t?e.style.cssText=n:"dangerouslySetInnerHTML"===t?e.innerHTML=n.__html:t.startsWith("on")?(0,a.Oo)(e,t,n,t.endsWith("Capture")):t.startsWith("data-")||t.startsWith("aria-")||s.has(t)?e.setAttribute(t,n):u.has(t)||(e[i[t]||t]=n)}const y={render:function(e,t){if(!t)return;let n=t.getAttribute("data-teact-head-id");n||(n=(0,o.Z)(c),c[n]={children:[]},t.setAttribute("data-teact-head-id",n));const r=c[n];r.children=[l(t,r.children[0],e,r,0)]}}},4050:(e,t,n)=>{n.d(t,{V2:()=>h,iB:()=>m,op:()=>g,O_:()=>y,SO:()=>E,k:()=>P,Zb:()=>M,Hb:()=>A,U9:()=>N,CD:()=>L,eJ:()=>R,d4:()=>O,bt:()=>Z,Ye:()=>_,I4:()=>x,sO:()=>F,X$:()=>B,ZP:()=>$});var r=n(3716),o=n(9118),d=n(782),a=n(275),u=n(3592),s=n(5247);let i;!function(e){e[e.Empty=0]="Empty",e[e.Text=1]="Text",e[e.Tag=2]="Tag",e[e.Component=3]="Component"}(i||(i={}));const c=Symbol("Fragment"),l=new Set(["TeactMemoWrapper","TeactNContainer","Button","ListItem","MenuItem"]);let f;function h(e){return e.type===i.Empty}function m(e){return e.type===i.Text}function p(e){return e.type===i.Tag}function g(e){return e.type===i.Component}function y(e){return p(e)||g(e)}function v(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=b(o),o.$element}(e,t,n):function(e,t,n){return{type:i.Tag,tag:e,props:t,children:w(n).map(C)}}(e,t,n)}function b(e,t=[]){const{props:n}=e;return{componentInstance:e,type:i.Component,props:n,children:t}}function w(e){let t=e.length-1;for(;t>=0&&I(e[t]);t--);return t+17&&console.warn(`[Teact] Slow component render: ${n}, ${Math.round(t)} ms`),S[n].renderTimes.push(t),S[n].renderCount++}}catch(t){(0,u.S)(t),o=e.renderedValue}if(e.isMounted&&o===e.renderedValue)return e.$element;e.renderedValue=o;const d=C(o);return e.$element=b(e,[d]),e.$element}function P(e,t){return typeof e!=typeof t||e.type!==t.type||(m(e)&&m(t)?e.value!==t.value:p(e)&&p(t)?e.tag!==t.tag||e.props.key!==t.props.key:!(!g(e)||!g(t)||e.componentInstance.Component===t.componentInstance.Component&&e.props.key===t.props.key))}function M(e){if(g(e))(t=e.componentInstance).isMounted&&(t.hooks.memos.byCursor.forEach((e=>{e.current=void 0})),t.hooks.effects.byCursor.forEach((({cleanup:e})=>{if("function"==typeof e)try{e()}catch(e){(0,u.S)(e)}})),t.isMounted=!1,function(e){e.hooks.effects.byCursor.forEach((e=>{e.cleanup=void 0,e.effect=void 0,e.dependencies=void 0})),e.hooks.state.byCursor.forEach((e=>{e.value=void 0,e.nextValue=void 0,e.setter=void 0})),e.hooks.memos.byCursor.forEach((e=>{e.dependencies=void 0})),e.hooks=void 0,e.$element=void 0,e.renderedValue=void 0,e.Component=void 0,e.props=void 0,e.forceUpdate=void 0,e.onUpdate=void 0}(t));else if(p(e)&&(e.target&&(0,s.lQ)(e.target),e.props.ref&&(e.props.ref.current=void 0)),e.target&&(e.target=void 0),!y(e))return;var t;e.children.forEach(M)}function A(e){return E(e),e.isMounted=!0,e.$element}function k(e){e.isMounted&&(e.hooks.state.byCursor.forEach((e=>{e.value=e.nextValue})),e.prepareForFrame=(0,o.wT)((()=>k(e))),e.forceUpdate=(0,o.mS)((()=>T(e))))}function T(e){if(!e.isMounted||!e.onUpdate)return;const t=e.$element;E(e),e.$element!==t&&e.onUpdate()}function N(e){return g(e)?N(e.children[0]):e.target}function L(e,t){g(e)?L(e.children[0],t):e.target=t}function R(e){const{cursor:t,byCursor:n}=f.hooks.state;var d;return void 0===n[t]&&(n[t]={value:e,nextValue:e,setter:(d=f,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)((()=>k(d))),d.forceUpdate=(0,o.mS)((()=>T(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))})}),f.hooks.state.cursor++,[n[t].value,n[t].setter]}function D(e,t,n,o,d){const{cursor:a,byCursor:s}=f.hooks.effects,i=f;function c(){if(!i.isMounted)return;const{cleanup:e}=s[a];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 #${a}: ${n}, ${Math.round(e)} ms`)}}catch(e){(0,u.S)(e)}}function l(){if(!i.isMounted)return;let e;if(r.eM&&(e=performance.now()),s[a].cleanup=n(),r.eM){const t=performance.now()-e,n=i.name;t>7&&console.warn(`[Teact] Slow effect at cursor #${a}: ${n}, ${Math.round(t)} ms`)}}if(void 0!==s[a]&&o&&s[a].dependencies){if(o.some(((e,t)=>e!==s[a].dependencies[t]))){if(d){const e=o.reduce(((e,t,n)=>{const r=s[a].dependencies[n];return t!==r&&e.push(`${n}: ${r} => ${t}`),e}),[]);console.log(`[Teact] Effect "${d}" caused by dependencies.`,e.join(", "))}t(c),e(l)}}else d&&console.log(`[Teact] Effect "${d}" caused by missing dependencies.`),t(c),e(l);s[a]={effect:n,dependencies:o,cleanup:s[a]?s[a].cleanup:void 0},f.hooks.effects.cursor++}function O(e,t,n){return D(o.T2,o.D0,e,t,n)}function Z(e,t,n){return D(o.R3,o.zD,e,t,n)}function _(e,t,n){const{cursor:o,byCursor:d}=f.hooks.memos;let{current:u}=d[o]||{};return(void 0===d[o]||t.some(((e,t)=>e!==d[o].dependencies[t])))&&(r.eM&&n&&console.log(`[Teact.useMemo] ${f.name} (${n}): Update is caused by:`,d[o]?(0,a.c)(t,d[o].dependencies).join(", "):"[first render]"),u=e()),d[o]={current:u,dependencies:t},f.hooks.memos.cursor++,u}function x(e,t,n){return _((()=>e),t,n)}function F(e){return _((()=>({current:e})),[])}function B(e,t=a.Z,n){return function(o){const d=F(o),u=F();return(!u.current||d.current&&!t(d.current,o))&&(r.eM&&n&&console.log(`[Teact.memo] ${e.name} (${n}): Update is caused by:`,(0,a.c)(d.current,o).join(", ")),d.current=o,u.current=v(e,o)),u.current}}document.addEventListener("dblclick",(()=>{console.warn("COMPONENTS",(0,d.Xo)(Object.values(S),"renderCount","desc"))}));const $={createElement:v,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),a=n(6926),u=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,u.$6)(w);function w(e=!1){e||!(0,l.zG)()?g.forEach((e=>e(m))):(0,u.T2)(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=(()=>({}))){return t=>function n(o){n.DEBUG_contentComponentName=t.name;const[u]=(0,r.eJ)((0,a.Z)(v)),i=(0,d.Z)();(0,r.d4)((()=>()=>{v.delete(u)}),[u]);let l=v.get(u);if(l||(l={mapStateToProps:e,ownProps:o,areMappedPropsChanged:!1,forceUpdate:i,DEBUG_updates:0,DEBUG_componentName:t.name},v.set(u,l)),l.areMappedPropsChanged&&(l.areMappedPropsChanged=!1),!l.mappedProps||!(0,s.Z)(l.ownProps,o)){l.ownProps=o;try{l.mappedProps=e(m,o)}catch(e){(0,c.S)(e)}}return r.ZP.createElement(t,f({},l.mappedProps,o))}}o.eM&&(window.getGlobal=C,document.addEventListener("dblclick",(()=>{console.warn("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:()=>a});const r=/\uFE0F/g,o=String.fromCharCode(8205);function d(e){return e.indexOf(o)<0?e.replace(r,""):e}const a=/(?:\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83d\udc68\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83d\udc69\ud83c[\udffb-\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffc-\udfff]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffd-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb\udffc\udffe\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffd\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\u2764\ufe0f\u200d\ud83e\uddd1\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d\udc8f\ud83c[\udffb-\udfff]|\ud83d\udc91\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83d\ude36\u200d\ud83c\udf2b\ufe0f|\u2764\ufe0f\u200d\ud83d\udd25|\u2764\ufe0f\u200d\ud83e\ude79|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83d\ude2e\u200d\ud83d\udca8|\ud83d\ude35\u200d\ud83d\udcab|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g},1363:(e,t,n)=>{var r=n(5116),o=n(1226),d=n(3716),a=n(7361),u=n(8406),s=n(9524),i=n(7358),c=n(4688),l=n(1622);(0,r.Q6)("initApi",((e,t)=>{(async()=>{d.Cg||(await(0,c.Qw)(),(0,c.f3)()),(0,o.g8)(t.apiUpdate,{userAgent:navigator.userAgent,platform:a.Lt,sessionData:(0,c.K8)(),isTest:window.location.search.includes("test"),isMovSupported:a.pA})})()})),(0,r.Q6)("setAuthPhoneNumber",((e,t,n)=>{const{phoneNumber:r}=n;return(0,o.t9)("provideAuthPhoneNumber",r.replace(/[^\d]/g,"")),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("setAuthCode",((e,t,n)=>{const{code:r}=n;return(0,o.t9)("provideAuthCode",r),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("setAuthPassword",((e,t,n)=>{const{password:r}=n;return(0,o.t9)("provideAuthPassword",r),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("uploadProfilePhoto",((e,t,n)=>{const{file:r}=n;(0,o.t9)("uploadProfilePhoto",r)})),(0,r.Q6)("signUp",((e,t,n)=>{const{firstName:r,lastName:d}=n;return(0,o.t9)("provideAuthRegistration",{firstName:r,lastName:d}),{...e,authIsLoading:!0,authError:void 0}})),(0,r.Q6)("returnToAuthPhoneNumber",(e=>((0,o.t9)("restartAuth"),{...e,authError:void 0}))),(0,r.Q6)("goToAuthQrCode",(e=>((0,o.t9)("restartAuthWithQr"),{...e,authIsLoadingQrCode:!0,authError:void 0}))),(0,r.Q6)("saveSession",((e,t,n)=>{const{sessionData:r}=n;r?(0,c.wX)(n.sessionData,e.currentUserId):(0,c.jv)()})),(0,r.Q6)("signOut",(()=>{(async()=>{try{await(0,u.r1)(),await(0,o.t9)("destroy"),await(0,l.IT)(!1)}catch(e){}(0,r.uC)().reset()})()})),(0,r.Q6)("reset",(()=>{(0,c.jv)(),s.clear(d.lW),s.clear(d.SG),s.clear(d.lF),s.clear(d.fo);const e=d.ee.replace(/\d+$/,""),t=(d.ee.match(/\d+$/)||[0])[0];for(let n=0;n{(async()=>{await(0,o.t9)("disconnect")})()})),(0,r.Q6)("loadNearestCountry",(e=>{"connectionStateReady"===e.connectionState&&(async()=>{const e=await(0,o.t9)("fetchNearestCountry");(0,r.R3)({...(0,r.Rd)(),authNearestCountry:e})})()})),(0,r.Q6)("setDeviceToken",((e,t,n)=>{(0,r.R3)({...e,push:{deviceToken:n,subscribedAt:Date.now()}})})),(0,r.Q6)("deleteDeviceToken",(e=>{const t={...e};delete t.push,(0,r.R3)(t)}))},9667:(e,t,n)=>{var r=n(5116),o=n(1713),d=n(3716),a=n(1226),u=n(782),s=n(8406),i=n(711),c=n(1638),l=n(9959),f=n(2858);function h(e,{visibility:t,allowedIds:n,deniedIds:r}){const{users:{byId:o},chats:{byId:d}}=e,a={visibility:t};let u,s;const i=e=>{if(!(0,f.YC)(e))return;const{id:t,accessHash:n}=o[e]||{};return t?{id:t,accessHash:n}:void 0},c=e=>{if((0,f.YC)(e))return;const t=d[e];return t?{id:t.id}:void 0};return"contacts"!==t&&"nobody"!==t||(u=n.map(i).filter(Boolean),s=n.map(c).filter(Boolean),u.length>0&&(a.allowedUsers=u),s.length>0&&(a.allowedChats=s)),"everybody"!==t&&"contacts"!==t||(u=r.map(i).filter(Boolean),s=r.map(c).filter(Boolean),u.length>0&&(a.blockedUsers=u),s.length>0&&(a.blockedChats=s)),a}(0,r.Q6)("updateProfile",((e,t,n)=>{const{photo:d,firstName:u,lastName:s,bio:i,username:f}=n;(async()=>{const{currentUserId:t}=e;if(t){if((0,r.R3)({...(0,r.Rd)(),profileEdit:{progress:o.rN.InProgress}}),d&&await(0,a.t9)("updateProfilePhoto",d),(u||s||i)&&await(0,a.t9)("updateProfile",{firstName:u,lastName:s,about:i})){e=(0,r.Rd)();const n=t&&(0,c.dy)(e,t);n&&(0,r.R3)((0,l.Nq)(e,n.id,{firstName:u,lastName:s,fullInfo:{...n.fullInfo,bio:i}}))}f&&await(0,a.t9)("updateUsername",f)&&t&&(0,r.R3)((0,l.Nq)((0,r.Rd)(),t,{username:f})),(0,r.R3)({...(0,r.Rd)(),profileEdit:{progress:o.rN.Complete}})}})()})),(0,r.Q6)("checkUsername",((e,t,n)=>{const{username:d}=n;(async()=>{if(e.profileEdit&&e.profileEdit.progress===o.rN.InProgress)return;(0,r.R3)({...e,profileEdit:{progress:e.profileEdit?e.profileEdit.progress:o.rN.Idle,isUsernameAvailable:void 0}});const t=await(0,a.t9)("checkUsername",d);e=(0,r.Rd)(),(0,r.R3)({...e,profileEdit:{...e.profileEdit,isUsernameAvailable:t}})})()})),(0,r.Q6)("loadWallpapers",(()=>{(async()=>{const e=await(0,a.t9)("fetchWallpapers");if(!e)return;const t=(0,r.Rd)();(0,r.R3)({...t,settings:{...t.settings,loadedWallpapers:e.wallpapers}})})()})),(0,r.Q6)("uploadWallpaper",((e,t,n)=>{const d=n,u=URL.createObjectURL(d);(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[{slug:o.mp,document:{fileName:"",size:d.size,mimeType:d.type,previewBlobUrl:u}},...e.settings.loadedWallpapers||[]]}}),(async()=>{const t=await(0,a.t9)("uploadWallpaper",d);if(!t)return;const{wallpaper:n}=t;if(!(e=(0,r.Rd)()).settings.loadedWallpapers)return;const s=e.settings.loadedWallpapers[0];if(!s||s.slug!==o.mp)return;const i={...n,document:{...n.document,previewBlobUrl:u}};(0,r.R3)({...e,settings:{...e.settings,loadedWallpapers:[i,...e.settings.loadedWallpapers.slice(1)]}})})()})),(0,r.Q6)("loadBlockedContacts",(()=>{(async()=>{var e,t;const n=await(0,a.t9)("fetchBlockedContacts");if(!n)return;let o=(0,r.Rd)();null!==(e=n.users)&&void 0!==e&&e.length&&(o=(0,l.Sh)(o,(0,u.ee)(n.users,"id"))),null!==(t=n.chats)&&void 0!==t&&t.length&&(o=(0,l.GL)(o,(0,u.ee)(n.chats,"id"))),o={...o,blocked:{...o.blocked,ids:[...o.blocked.ids||[],...n.blockedIds],totalCount:n.totalCount}},(0,r.R3)(o)})()})),(0,r.Q6)("blockContact",((e,t,n)=>{const{contactId:o,accessHash:d}=n;(async()=>{if(!await(0,a.t9)("blockContact",o,d))return;const e=(0,r.Rd)();(0,r.R3)((0,l.O4)(e,o))})()})),(0,r.Q6)("unblockContact",((e,t,n)=>{const{contactId:o}=n;let d;if((0,f.YC)(o)){const t=(0,c.dy)(e,o);if(!t)return;d=t.accessHash}(async()=>{if(!await(0,a.t9)("unblockContact",o,d))return;const e=(0,r.Rd)();(0,r.R3)((0,l.rB)(e,o))})()})),(0,r.Q6)("loadAuthorizations",(()=>{(async()=>{const e=await(0,a.t9)("fetchAuthorizations");e&&(0,r.R3)({...(0,r.Rd)(),activeSessions:e})})()})),(0,r.Q6)("terminateAuthorization",((e,t,n)=>{const{hash:o}=n;(async()=>{if(!await(0,a.t9)("terminateAuthorization",o))return;const e=(0,r.Rd)();(0,r.R3)({...e,activeSessions:e.activeSessions.filter((e=>e.hash!==o))})})()})),(0,r.Q6)("terminateAllAuthorizations",(()=>{(async()=>{if(!await(0,a.t9)("terminateAllAuthorizations"))return;const e=(0,r.Rd)();(0,r.R3)({...e,activeSessions:e.activeSessions.filter((e=>e.isCurrent))})})()})),(0,r.Q6)("loadNotificationExceptions",(e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await(0,a.t9)("fetchNotificationExceptions",{serverTimeOffset:t});e&&(0,r.R3)((0,l.aJ)((0,r.Rd)(),e))})()})),(0,r.Q6)("loadNotificationSettings",(e=>{const{serverTimeOffset:t}=e;(async()=>{const e=await(0,a.t9)("fetchNotificationSettings",{serverTimeOffset:t});e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),e))})()})),(0,r.Q6)("updateNotificationSettings",((e,t,n)=>{const{peerType:o,isSilent:d,shouldShowPreviews:u}=n;(async()=>{await(0,a.t9)("updateNotificationSettings",o,{isSilent:d,shouldShowPreviews:u})&&(0,r.R3)((0,l.HN)((0,r.Rd)(),o,d,u))})()})),(0,r.Q6)("updateWebNotificationSettings",((e,t,n)=>{(async()=>{(0,r.R3)((0,l.BI)((0,r.Rd)(),n));const e=(0,r.Rd)(),{hasPushNotifications:t,hasWebNotifications:o}=e.settings.byKey;o&&t?await(0,s.Ld)():await(0,s.r1)()})()})),(0,r.Q6)("updateContactSignUpNotification",((e,t,n)=>{const{isSilent:o}=n;(async()=>{await(0,a.t9)("updateContactSignUpNotification",o)&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{hasContactJoinedNotifications:!o}))})()})),(0,r.Q6)("loadLanguages",(()=>{(async()=>{const e=await(0,a.t9)("fetchLanguages");e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),{languages:e}))})()})),(0,r.Q6)("loadPrivacySettings",(()=>{(async()=>{const[e,t,n,o,d]=await Promise.all([(0,a.t9)("fetchPrivacySettings","phoneNumber"),(0,a.t9)("fetchPrivacySettings","lastSeen"),(0,a.t9)("fetchPrivacySettings","profilePhoto"),(0,a.t9)("fetchPrivacySettings","forwards"),(0,a.t9)("fetchPrivacySettings","chatInvite")]);if(!(e&&t&&n&&o&&d))return;const u=(0,r.Rd)();u.settings.privacy.phoneNumber=e,u.settings.privacy.lastSeen=t,u.settings.privacy.profilePhoto=n,u.settings.privacy.forwards=o,u.settings.privacy.chatInvite=d,(0,r.R3)(u)})()})),(0,r.Q6)("setPrivacyVisibility",((e,t,n)=>{const{privacyKey:o,visibility:d}=n,{privacy:{[o]:u}}=e.settings;if(!u)return;const s=h(e,{visibility:d,allowedIds:[...u.allowUserIds,...u.allowChatIds],deniedIds:[...u.blockUserIds,...u.blockChatIds]});(async()=>{const e=await(0,a.t9)("setPrivacySettings",o,s);if(e){const t=(0,r.Rd)();t.settings.privacy[o]=e,(0,r.R3)(t)}})()})),(0,r.Q6)("setPrivacySettings",((e,t,n)=>{const{privacyKey:o,isAllowList:d,contactsIds:u}=n,{privacy:{[o]:s}}=e.settings;if(!s)return;const i=h(e,{visibility:s.visibility,allowedIds:d?u:[...s.allowUserIds,...s.allowChatIds],deniedIds:d?[...s.blockUserIds,...s.blockChatIds]:u});(async()=>{const e=await(0,a.t9)("setPrivacySettings",o,i);if(e){const t=(0,r.Rd)();t.settings.privacy[o]=e,(0,r.R3)(t)}})()})),(0,r.Q6)("updateIsOnline",((e,t,n)=>{(0,a.t9)("updateIsOnline",n)})),(0,r.Q6)("loadContentSettings",(()=>{(async()=>{const e=await(0,a.t9)("fetchContentSettings");e&&(0,r.R3)((0,l.BI)((0,r.Rd)(),e))})()})),(0,r.Q6)("updateContentSettings",((e,t,n)=>{(async()=>{(0,r.R3)((0,l.BI)((0,r.Rd)(),{isSensitiveEnabled:n})),await(0,a.t9)("updateContentSettings",n)||(0,r.R3)((0,l.BI)((0,r.Rd)(),{isSensitiveEnabled:!n}))})()})),(0,r.Q6)("loadCountryList",((e,t,n={})=>{let{langCode:o}=n;o||(o=e.settings.byKey.language),(async()=>{const e=await(0,a.t9)("fetchCountryList",{langCode:o});e&&(0,r.R3)({...(0,r.Rd)(),countryList:e})})()})),(0,r.Q6)("ensureTimeFormat",((e,t)=>{if(e.authNearestCountry){const n=d.FD.has(e.authNearestCountry.toUpperCase())?"12h":"24h";t.setSettingOption({timeFormat:n}),(0,i.qf)(n)}(async()=>{if((0,r.Rd)().settings.byKey.wasTimeFormatSetManually)return;const e=await(0,a.t9)("fetchNearestCountry");if(e){const n=d.FD.has(e.toUpperCase())?"12h":"24h";t.setSettingOption({timeFormat:n}),(0,i.qf)(n)}})()})),(0,r.Q6)("loadAppConfig",(()=>{(async()=>{const e=await(0,a.t9)("fetchAppConfig");e&&(0,r.R3)({...(0,r.Rd)(),appConfig:e})})()}))},4907:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(8406),a=n(9959),u=n(711),s=n(1638),i=n(1622),c=n(1947);(0,r.Q6)("apiUpdate",((e,t,n)=>{switch(o.eM&&"updateUserStatus"!==n["@type"]&&"updateServerTimeOffset"!==n["@type"]&&console.log("[GramJs] UPDATE",n["@type"],{update:n}),n["@type"]){case"updateApiReady":!function(e){const{hasWebNotifications:t,hasPushNotifications:n}=(0,s.dZ)(e);t&&n&&(0,d.Ld)(),(0,u.m0)(e.settings.byKey.language)}(e);break;case"updateAuthorizationState":!function(e){let t=(0,r.Rd)();const n="authorizationStateReady"===t.authState,o=e.authorizationState;switch((0,r.R3)({...t,authState:o,authIsLoading:!1}),t=(0,r.Rd)(),o){case"authorizationStateLoggingOut":(0,i.IT)(!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.IT)(!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)();t!==n.connectionState&&((0,r.R3)({...n,connectionState:t}),"connectionStateReady"===t&&"authorizationStateReady"===n.authState?(0,r.uC)().sync():"connectionStateBroken"===t&&(0,r.uC)().signOut())}(n);break;case"updateSession":!function(e){const{sessionData:t}=e,{authRememberMe:n,authState:o}=(0,r.Rd)(),d=!t||!t.mainDcId;n&&"authorizationStateReady"===o&&!d&&(0,r.uC)().saveSession({sessionData:t})}(n);break;case"updateServerTimeOffset":!function(e){const t=(0,r.Rd)();t.serverTimeOffset!==e.serverTimeOffset&&(0,r.R3)({...t,serverTimeOffset:e.serverTimeOffset})}(n);break;case"updateCurrentUser":!function(e){const{currentUser:t}=e;(0,r.R3)({...(0,a.Nq)((0,r.Rd)(),t.id,t),currentUserId:t.id}),function(e){const t=localStorage.getItem(o.b_);if(!t)return;const n=JSON.parse(t);n.id=e,localStorage.setItem(o.b_,JSON.stringify(n))}(t.id)}(n);break;case"error":{"SESSION_REVOKED"===n.error.message&&t.signOut();const e=(0,c.J_)(n.error);e?t.addPaymentError({error:e}):t.showDialog&&t.showDialog({data:n.error});break}}}))},7895:(e,t,n)=>{var r=n(5116),o=n(3716),d=n(7361),a=n(711),u=n(6917),s=n(1638),i=n(1622),c=n(7926);!function(){function e(){const e=document.documentElement.className.match(/theme-(\w+)/),t=e?e[1]:"light",n=(0,r.Rd)(),d=(0,s.Pu)(n),{animationLevel:a}=n.settings.byKey;d!==t&&((0,u.Z)(d,a===o.zy),(0,r.R3)({...n}))}const t=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof t.addEventListener?t.addEventListener("change",e):"function"==typeof t.addListener&&t.addListener(e)}(),(0,r.Q6)("init",(e=>{const{animationLevel:t,messageTextSize:n,language:r}=e.settings.byKey,l=(0,s.Pu)(e);(0,a.m0)(r,void 0,!0),document.documentElement.style.setProperty("--composer-text-size",`${Math.max(n,d.cj?16:15)}px`),document.documentElement.style.setProperty("--message-meta-height",`${Math.floor(1.3125*n)}px`),document.documentElement.style.setProperty("--message-text-size",`${n}px`),document.documentElement.setAttribute("data-message-text-size",n.toString()),document.body.classList.add("initial"),document.body.classList.add(`animation-level-${t}`),document.body.classList.add(d.$b?"is-touch-env":"is-pointer-env"),(0,u.Z)(l,t===o.zy),(0,c.$)(),(0,i.px)(),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(9959);(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:()=>_,O:()=>x,wG:()=>B,Fu:()=>$,SB:()=>U,zF:()=>j,ih:()=>W,$l:()=>G});var r=n(6137),o=n(3716),d=n(782),a=n(5527),u=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,a,u,s){if(!e.isListed)return!1;const{id:i,type:c,unreadMentionsCount:l}=e;if(null!=a&&a.has(i))return!1;if(null!=u&&u.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,a,u,s,i)})),r.pinnedChatIds]}function x(e,t,n,r="all",o=!1){const a=new Set(t),u=n?new Set(n):void 0,s=(null==n?void 0:n.reduce(((t,n)=>{const o=e[n];return o&&a.has(o.id)&&F(o,r)&&t.push(o),t}),[]))||[],i=t.reduce(((t,n)=>{const o=e[n];return!o||u&&u.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[a]=_(e,t,n,r,o,d);let u=!1;return{unreadDialogsCount:a.reduce(((e,n)=>{const r=t[n];if(null==r||!r.lastMessage||null!=r&&r.isRestricted||null!=r&&r.isNotJoined)return e;const a=r.unreadCount||r.hasUnreadMark;return a&&e++,!u&&(r.unreadMentionsCount||a&&!D(r,o,d))&&(u=!0),e}),0),hasActiveDialogs:u}}function U(e,t,n,r,o,d,a){const{id:u,title:s,emoticon:i,description:c,pinnedChatIds:l,excludedChatIds:f,includedChatIds:h,excludeArchived:m,excludeMuted:p,excludeRead:g,...y}=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[a,u]=_(e,t,n,r,o,d),{pinnedChats:s,otherChats:i}=x(t,a,u,"folder",!0);return s.length+i.length}(t,n,r,o,d,a)):y.bots?e("FilterBots"):y.groups?e("FilterGroups"):y.channels?e("FilterChannels"):y.contacts?e("FilterContacts"):y.nonContacts?e("FilterNonContacts"):void 0}function j(e,t,n){if(n&&!c(t))return n.isSelf?e("FromYou"):(0,a.Vl)(n)}function W(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,{JE:()=>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:()=>y,SB:()=>o.SB,Fu:()=>o.Fu,VE:()=>o.VE,XV:()=>se,Sc:()=>ae,N5:()=>_,oP:()=>x,qp:()=>L,w6:()=>k,R5:()=>ue,$D:()=>p,aE:()=>$,ep:()=>X,c0:()=>ee,eO:()=>G,Tp:()=>c,kG:()=>Y,Ti:()=>K,DH:()=>Q,KK:()=>f,O$:()=>D,t9:()=>W,Y5:()=>Z,zF:()=>o.zF,q8:()=>o.q8,_O:()=>g,bf:()=>B,MK:()=>h,UD:()=>m,b7:()=>O,kd:()=>F,s1:()=>V,F$:()=>H,Cg:()=>z,bV:()=>re,HV:()=>oe,zX:()=>o.zX,OU:()=>E,RI:()=>P,Ow:()=>le,Rs:()=>r.Rs,Vl:()=>r.Vl,Js:()=>r.Js,db:()=>r.db,Tq:()=>r.Tq,jC:()=>de,BM:()=>te,u8:()=>R,Lo:()=>I,Ul:()=>S,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:()=>w,CD:()=>A,rl:()=>U,hC:()=>j,CI:()=>M,B4:()=>v,ss:()=>b,jM:()=>C,cS:()=>r.cS,YC:()=>o.YC,kM:()=>r.kM,Mg:()=>o.Mg,Ak:()=>l,O:()=>o.O,P4:()=>o.P4,wG:()=>o.wG,i4:()=>o.i4,Sm:()=>o.Sm,ih:()=>o.ih,Z0:()=>r.Z0});var r=n(5527),o=n(8332),d=n(6137),a=n(3716),u=n(7361),s=n(4784);const i=new RegExp(a.FM,"i");function c(e){const{chatId:t,id:n}=e;return function(e,t){return`msg${e}-${t}`}(t,n)}function l(e){const t=e.match(/^msg(-?\d+)-(\d+)/);return{chatId:t[1],messageId:Number(t[2])}}function f(e){return e.previousLocalId||e.id}function h(e,t,n=!1){const{text:r,photo:o,video:d,audio:u,voice:s,document:i,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")}`:s?`${n?"":"🎤 "}${m||e("AttachAudio")}`:i?`${n?"":"📎 "}${m||i.fileName}`:l?e("AttachContact"):f?`${n?"":"📊 "}${f.summary.question}`:h?"Invoice":r?m:a.VC}function m(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:u,document:s,poll:i,webPage:c,contact:l,invoice:f}=e.content;return t?t.text:n||r||o||d||u||s||l||i||c||f?void 0:a.VC}function p(e){const{text:t,sticker:n,photo:r,video:o,audio:d,voice:a,document:u,poll:i,webPage:c,contact:l}=e.content;return!!(n||null!=o&&o.isRound)||!(!t||r||o||d||a||u||i||c||l)&&((0,s.Z)(t.text)||!1)}function g(e){const{text:t}=e.content;if(t&&t.text.length<=6&&1===p(e))return t.text}function y(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(i)),!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(i)}}if(!n&&t&&(n=t.text.match(i)),n)return{url:n[0],domain:n[3]}}function v(e){return e.isOutgoing}function b(e){return Boolean(e.replyToMessageId)}function w(e){return Boolean(e.forwardInfo)}function I(e){return!!e.content.action}function C(e){return e.chatId===a.aw&&Math.round(e.id)!==e.id}function S(e){return Boolean(e.senderId)&&!(0,o.YC)(e.senderId)&&v(e)}function E(e,t){return(0,o.YC)(t.id)?(0,r.Js)(t):(0,o.U)(e,t)}function P(e){return e.sendingState?"messageSendingStateFailed"===e.sendingState?"failed":"pending":"succeeded"}function M(e){return e.id>=a.AE}function A(e){return e.content.action&&"historyClear"===e.content.action.type}function k(e){const{content:t}=e,n=t.webPage?t.webPage.video:t.video,r=t.webPage?t.webPage.photo:t.photo,o=t.webPage?t.webPage.document:t.document;if(o)return o.fileName;if(n)return n.fileName;if(t.sticker){const e=t.sticker.isAnimated?"tgs":(0,u.on)()?"webp":"png";return`${t.sticker.id}.${e}`}if(t.audio)return t.audio.fileName;const d=c(e);return r?`${d}.jpg`:t.voice?u.m5?`${d}.ogg`:`${d}.wav`:d}function T(e){return!e.results.some((e=>e.count>0))}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)||W(e)||_(e)||x(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 _(e){return e.content.action}function x(e){return e.content.audio}function F(e){return e.content.voice}function B(e){return e.content.sticker}function $(e){return e.content.document}function U(e){const t=$(e);return t?"photo"===t.mediaType:void 0}function j(e){const t=$(e);return t?"video"===t.mediaType:void 0}function W(e){return e.content.poll}function G(e){return e.content.invoice}function V(e){return e.content.webPage}function H(e){var t;return null===(t=V(e))||void 0===t?void 0:t.photo}function z(e){var t;return null===(t=V(e))||void 0===t?void 0:t.video}function Q(e){var t;return null===(t=function(e){const t=D(e)||O(e)||$(e)||B(e)||H(e)||z(e);if(t)return t.thumbnail}(e))||void 0===t?void 0:t.dataUri}function K(e,t){const{photo:n,video:r,sticker:o,audio:d,voice:a,document:u}=e.content,s=H(e),i=z(e),l=r||i,f=n||s;if(!(f||l||o||d||a||u))return;const h=(f||l||o||d||a||u).id,m=`${c(e)}${h?`:${h}`:""}`;if(l)switch(t){case"micro":case"pictogram":return`${m}?size=m`;case"inline":return te(e)?void 0:J(l,m);case"viewerPreview":return`${m}?size=m`;case"viewerFull":return J(l,m);case"download":return`${m}?download`}if(f)switch(t){case"micro":case"pictogram":return`${m}?size=m`;case"inline":return te(e)?void 0:`${m}?size=x`;case"viewerPreview":return`${m}?size=x`;case"viewerFull":case"download":return`${m}?size=z`}if(u)switch(t){case"micro":case"pictogram":case"inline":case"viewerPreview":if(!(0,N.v6)(u)||te(e))return;return`${m}?size=m`;case"viewerFull":case"download":return m}if(o)switch(t){case"micro":return;case"pictogram":return`${m}?size=m`;case"inline":return m;case"download":return`${m}?download`}if(d)switch(t){case"micro":case"pictogram":return q(d)?`${m}?size=m`:void 0;case"inline":return J(d,m);case"download":return`${m}?download`}if(a)switch(t){case"micro":case"pictogram":return;case"inline":return m;case"download":return`${m}?download`}}function J(e,t){return u.I_&&u.s$?`${t}?fileSize=${e.size}&mimeType=${e.mimeType}`:t}function q(e){return e.thumbnailSizes&&e.thumbnailSizes.length>0}function Y(e,t){const{sticker:n,video:r,audio:o,voice:a}=e.content,s=r||z(e);return n&&"inline"===t&&n.isAnimated?d.IU.Lottie:s&&u.I_&&("viewerFull"===t||"inline"===t)?d.IU.Progressive:o||a?a&&!u.m5?d.IU.BlobUrl:d.IU.Progressive:d.IU.BlobUrl}function X(e){const{photo:t,video:n,document:r}=e.content,o=H(e),d=z(e);if(t||o)return`photo${e.date}.jpeg`;const{fileName:a}=n||d||r||{};return a}function ee(e){const{video:t,document:n}=e.content,r=z(e),{size:o}=t||r||n||{};return o}function te(e){const{photo:t,video:n,document:r}=e.content;return(null==t?void 0:t.blobUrl)||(null==n?void 0:n.blobUrl)||(null==r?void 0:r.previewBlobUrl)}function ne(e,t,n=!1){const r=ue(e,t,n?"media":"inlineMedia");return n?r.reverse():r}function re(e){return e.sizes.find((e=>"z"===e.type))||e.sizes.find((e=>"y"===e.type))||oe(e)}function oe(e){return e.sizes.find((e=>"x"===e.type))||e.sizes.find((e=>"m"===e.type))||e.sizes.find((e=>"s"===e.type))||e.thumbnail}function de(e){if(e.width&&e.height)return e}function ae(e,t,n=!1){const r=M(e);return{isUploading:r,isTransferring:r||n,transferProgress:Number(t)}}function ue(e,t,n){let r;switch(n){case"media":r=e=>{const t=O(e);return D(e)||t&&!t.isRound&&!t.isGif};break;case"documents":r=$;break;case"links":r=e=>V(e)||function(e){const{text:t}=e.content,n=t&&t.text.match(i);if(n)return{url:n[0],domain:n[3]}}(e);break;case"audio":r=x;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)||j(e)};break;default:return[]}return t.reduce(((t,n)=>(e[n]&&r(e[n])&&t.push(n),t)),[])}function se(e){const{audio:t,voice:n,video:r}=L(e),o=t||n||r||z(e);if(o)return o.duration}function ie(e,t){return`${e}_${t}`}const ce={missing_payment_information:{field:"cardNumber",message:"Incorrect card number"},invalid_number:{field:"cardNumber",message:"Incorrect card number"},number:{field:"cardNumber",message:"Incorrect card number"},exp_year:{field:"expiry",message:"Incorrect year"},exp_month:{field:"expiry",message:"Incorrect month"},invalid_expiry_year:{field:"expiry",message:"Incorrect year"},invalid_expiry_month:{field:"expiry",message:"Incorrect month"},cvc:{field:"cvv",message:"Incorrect CVV"},invalid_cvc:{field:"cvv",message:"Incorrect CVV"}};function le(e){const{message:t,code:n,param:r}=e,{field:o,message:d}=r?ce[r]:ce[n];return{field:o,message:d,description:t}}},5527:(e,t,n)=>{n.d(t,{Vl:()=>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),a=n(2267),u=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),a=new Date(1e3*t);if(a>=r)return e("LastSeen.JustNow");const u=new Date(r.getTime()-a.getTime());if(u.getTime()/1e3<60)return e("LastSeen.JustNow");if(u.getTime()/1e3<3600)return e("LastSeen.MinutesAgo",Math.floor(u.getTime()/1e3/60));const s=new Date;if(s.setHours(0,0,0,0),a>new Date(s.getTime()+1e3*d))return u.getTime()/1e3<21600?e("LastSeen.HoursAgo",Math.floor(u.getTime()/1e3/60/60)):e("LastSeen.TodayAt",(0,o.mr)(e,a));const i=new Date;return i.setDate(r.getDate()-1),i.setHours(0,0,0,0),a>new Date(i.getTime()+1e3*d)?e("LastSeen.YesterdayAt",(0,o.mr)(e,a)):e("LastSeen.AtDate",(0,o.Tu)(e,a))}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,a.b)(o);if(r&&r.includes(e))return d+172800-(r.length-r.indexOf(e));const u=t[e],s=n[e];if(!u||!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,r,o){if(!n)return e;const d=(0,u.W)(n);return e.filter((e=>{const n=t[e];if(!n)return!1;const a=e===r?o:c(n);return a&&d(a)||d(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:()=>a,B1:()=>u,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 a(e,t,n){return{...e,chats:{...e.chats,listIds:{...e.chats.listIds,[t]:n}}}}function u(e,t,n){const{[t]:r}=e.chats.listIds,o=null!=r&&r.length?n.filter((e=>!r.includes(e))):n;return r&&!o.length?e:a(e,t,[...r||[],...o])}function s(e,t){return{...e,chats:{...e.chats,byId:t}}}function i(e,t,n,r){const{byId: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,a=d[t],u=n.isMin&&a&&!a.isMin,s={...a,...u?(0,o.CE)(n,["isMin","accessHash"]):n,...r&&{photos:[r,...a.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=a(e,n,r.filter((e=>e!==t)))),i(e,t,{isNotJoined:!0})}},9959:(e,t,n)=>{n.d(t,{O4:()=>Q,c_:()=>o.c_,fZ:()=>r.fZ,m6:()=>o.m6,aK:()=>H,aJ:()=>V,zn:()=>M,Sh:()=>v,$S:()=>o.$S,bp:()=>oe,WY:()=>de,K4:()=>o.K4,bV:()=>o.bV,GK:()=>I,M6:()=>o.M6,i9:()=>o.i9,Dd:()=>r.Dd,vy:()=>f,rB:()=>K,g_:()=>c,Mg:()=>r.Mg,SL:()=>r.SL,Pb:()=>Z,w3:()=>o.w3,BI:()=>W,lr:()=>G,pf:()=>o.pf,ps:()=>P,s5:()=>m,y9:()=>o.y9,nA:()=>ee,_7:()=>ne,Q$:()=>X,Dq:()=>re,vT:()=>Y,QH:()=>te,Ob:()=>o.Ob,a4:()=>r.a4,B1:()=>r.B1,vv:()=>r.vv,Pi:()=>r.Pi,cY:()=>o.cY,GL:()=>r.GL,Wy:()=>o.Wy,wV:()=>o.wV,cq:()=>o.cq,rq:()=>i,No:()=>k,Og:()=>T,xv:()=>L,px:()=>N,xj:()=>o.xj,c1:()=>B,z5:()=>F,qr:()=>O,dx:()=>_,fw:()=>j,H9:()=>U,HN:()=>z,ff:()=>o.ff,P4:()=>o.P4,x1:()=>w,TM:()=>q,Fn:()=>o.Fn,Rg:()=>s,z3:()=>u,IM:()=>l,Xg:()=>o.Xg,j6:()=>o.j6,lG:()=>o.lG,IE:()=>J,Nq:()=>g,Lm:()=>C,Q3:()=>S,eD:()=>y});var r=n(6788),o=n(3495),d=n(782),a=n(1638);function u(e,t,n,r,o){const a=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,d.ee)(a,"id")},[t]:{...e.stickers[t],hash:n,..."search"===t?{resultIds:o}:{setIds:r.map((({id:e})=>e))}}}}}function s(e,t,n){const r=e.stickers.setsById[t]||{};return{...e,stickers:{...e.stickers,setsById:{...e.stickers.setsById,[t]:{...r,...n}}}}}function i(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 c(e,t){return{...e,animatedEmojis:t}}function l(e,t,n,r){const o=[...(0,a.Pk)(e,t),...n||[]],u=(0,d.Tw)(o.map((({id:e})=>e))),s=(0,d.ee)(o,"id"),i=u.map((e=>s[e]));return{...e,stickers:{...e.stickers,forEmoji:{emoji:t,stickers:i,hash:r}}}}function f(e){const{emoji:t,stickers:n,hash:r}=e.stickers.forEmoji||{};return t?l(e,t,n,r):e}var h=n(735);function m(e,t){return{...e,users:{...e.users,byId:t}}}function p(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 g(e,t,n){const{byId:r}=e.users,o=b(e,t,n);return o?m(e=p(e,[o]),{...r,[t]:o}):e}function y(e,t){const n=Object.keys(t).reduce(((n,r)=>{const o=b(e,r,t[r]);return o&&(n[r]=o),n}),{});return e=p(e=m(e,{...e.users.byId,...n}),Object.values(n))}function v(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=b(e,d,t[d]);n&&(o[d]=n,r||(r=!0))}return o}),{});return r?e=p(e=m(e,{...n,...o}),Object.values(o)):e}function b(e,t,n){const{byId:r}=e.users,o=r[t],a=n.isMin&&o&&!o.isMin,u={...o,...a?(0,d.CE)(n,["isMin","accessHash"]):n};if(u.id&&u.type)return u}function w(e,t){return e.users.selectedId===t?e:{...e,users:{...e.users,selectedId:t}}}function I(e,t){const{byId:n}=e.users,{userIds:r}=e.contactList||{};return m(e={...e,contactList:{userIds:r?r.filter((e=>e!==t)):h.D}},{...n,[t]:{...n[t],isContact:void 0}})}function C(e,t){return{...e,userSearch:{...e.userSearch,...t}}}function S(e,t){return C(e,{fetchingStatus:t})}function E(e,t,n){const{byId:r}=e.users,o=r[t];return o&&o.fullInfo?g(e,t,{...o,fullInfo:{...o.fullInfo,isBlocked:n}}):e}function P(e,t){return{...e,users:{...e.users,statusesById:t}}}function M(e,t){const{statusesById:n}=e.users,r=Object.keys(t).filter((e=>!n[e]));return r.length?e=P(e,{...n,...(0,d.ei)(t,r)}):e}const A=e=>`${e.chatId}_${e.id}`;function k(e,t){return{...e,globalSearch:{...e.globalSearch,...t}}}function T(e,t){return k(e,{currentContent:t})}function N(e,t,n,r,o){var a;const{resultsByType:u}=e.globalSearch||{},s=t.reduce(((e,t)=>(e[A(t)]=t,e)),{}),i=null==u||null===(a=u[r])||void 0===a?void 0:a.foundIds;if(void 0!==i&&Object.keys(s).every((e=>i.includes(A(s[e])))))return L(e,{messages:!1});const c=i||[],l=t.map((e=>A(e))),f=Array.prototype.concat(c,l),h=(0,d.et)(c,f)?c:f;return k(e=L(e,{messages:!1}),{resultsByType:{...(e.globalSearch||{}).resultsByType,[r]:{totalCount:n,nextOffsetId:o,foundIds:h}}})}function L(e,t){return k(e,{fetchingStatus:{...e.globalSearch.fetchingStatus,...t}})}var R=n(2858);function D(e,t,n){return{...e,localTextSearch:{byChatThreadKey:{...e.localTextSearch.byChatThreadKey,[t]:n}}}}function O(e,t,n,r,o){const d=(0,R.uw)(t,n);return D(e,d,{...e.localTextSearch.byChatThreadKey[d],isActive:r,query:o})}function Z(e,t,n,r,o,d){const a=(0,R.uw)(t,n);return D(e,a,{...e.localTextSearch.byChatThreadKey[a],results:{foundIds:r,totalCount:o,nextOffsetId:d}})}function _(e,t,n,r,o,a){const u=(0,R.uw)(t,n),{results:s}=e.localTextSearch.byChatThreadKey[u]||{},i=(null==s?void 0:s.foundIds)||[],c=$((0,d.Tw)(Array.prototype.concat(i,r)));return Z(e,t,n,(0,d.et)(i,c)?i:c,o,a)}function x(e,t,n){return{...e,localMediaSearch:{byChatId:{...e.localMediaSearch.byChatId,[t]:n}}}}function F(e,t,n){return x(e,t,{...e.localMediaSearch.byChatId[t],currentType:n})}function B(e,t,n,r,o,a){const{resultsByType:u}=e.localMediaSearch.byChatId[t]||{},s=null!=u&&u[n]?u[n].foundIds:[],i=$((0,d.Tw)(Array.prototype.concat(s,r)));return function(e,t,n,r,o,d){return x(e,t,{...e.localMediaSearch.byChatId[t],resultsByType:{...(e.localMediaSearch.byChatId[t]||{}).resultsByType,[n]:{foundIds:r,totalCount:o,nextOffsetId:d}}})}(e,t,n,(0,d.et)(s,i)?s:i,o,a)}function $(e){return e.sort(((e,t)=>e-t))}function U(e,t){return{...e,management:{...e.management,progress:t}}}function j(e,t,n){return{...e,management:{...e.management,byChatId:{...e.management.byChatId,[t]:{...e.management.byChatId[t]||{},...n}}}}}function W(e,t){return{...e,settings:{...e.settings,byKey:{...e.settings.byKey,...t}}}}function G(e,t,n){return{...e,settings:{...e.settings,themes:{...e.settings.themes,[t]:{...e.settings.themes[t]||{},...n}}}}}function V(e,t){return t.forEach((t=>{const{chatId:n,...r}=t;e=H(e,n,r)})),e}function H(e,t,n){return{...e,settings:{...e.settings,notifyExceptions:{...e.settings.notifyExceptions,[t]:n}}}}function z(e,t,n,r){switch(t){case"contact":return W(e,{...void 0!==n&&{hasPrivateChatsNotifications:!n},...void 0!==r&&{hasPrivateChatsMessagePreview:r}});case"group":return W(e,{...void 0!==n&&{hasGroupNotifications:!n},...void 0!==r&&{hasGroupMessagePreview:r}});case"broadcast":return W(e,{...void 0!==n&&{hasBroadcastNotifications:!n},...void 0!==r&&{hasBroadcastMessagePreview:r}});default:return}}function Q(e,t){return e=E(e,t,!0),{...e,blocked:{...e.blocked,ids:[t,...e.blocked.ids],totalCount:e.blocked.totalCount+1}}}function K(e,t){return e=E(e,t,!1),{...e,blocked:{...e.blocked,ids:e.blocked.ids.filter((e=>e!==t)),totalCount:e.blocked.totalCount-1}}}function J(e,t){return{...e,twoFaSettings:{...e.twoFaSettings,...t}}}function q(e,t){return{...e,payment:{...e.payment,shippingOptions:t}}}function Y(e,t){return{...e,payment:{...e.payment,requestId:t}}}function X(e,t){return{...e,payment:{...e.payment,step:t}}}function ee(e,t){if(!t.content||!t.content.invoice)return e;const{title:n,text:r,amount:o,currency:d,isTest:a,photoUrl:u}=t.content.invoice;return{...e,payment:{...e.payment,invoiceContent:{title:n,text:r,photoUrl:u,amount:o,currency:d,isTest:a}}}}function te(e,t){return{...e,payment:{...e.payment,stripeCredentials:{...t}}}}function ne(e,t){return{...e,payment:{...e.payment,...t}}}function re(e,t,n){if(!t||!n)return{...e,payment:{...e.payment,receipt:void 0}};const{invoice:r}=n.content,{photoUrl:o,text:d,title:a}=r||{};return{...e,payment:{...e.payment,receipt:{...t,photoUrl:o,text:d,title:a}}}}function oe(e){return{...e,payment:{}}}function de(e){return{...e,payment:{...e.payment,isPaymentModalOpen:!1}}}},3495:(e,t,n)=>{n.d(t,{Wy:()=>u,pf:()=>c,m6:()=>l,c_:()=>f,cY:()=>h,P4:()=>m,K4:()=>p,bV:()=>g,xj:()=>y,ff:()=>v,$S:()=>w,y9:()=>I,Xg:()=>C,j6:()=>S,w3:()=>E,cq:()=>P,Fn:()=>M,wV:()=>A,M6:()=>k,Ob:()=>T,i9:()=>N,lG:()=>L});var r=n(6137),o=n(3716),d=n(1638),a=n(782);function u(e,t,n=r._f,d="thread",a){const{messageLists:u}=e.messages;let s=u;if(a||o.Cg)s=t?[{chatId:t,threadId:n,type:d}]:[];else if(t){const e=u[u.length-1];e&&e.chatId===t&&e.threadId===n&&e.type===d||(s=e&&e.chatId===o.AJ?[...u.slice(0,-1),{chatId:t,threadId:n,type:d}]:[...u,{chatId:t,threadId:n,type:d}])}else s=u.slice(0,-1);return{...e,messages:{...e.messages,messageLists:s}}}function s(e,t,n){return i(e,t,{byId:n})}function i(e,t,n){const r=e.messages.byChatId[t]||{byId:{},threadsById:{}};return{...e,messages:{...e.messages,byChatId:{...e.messages.byChatId,[t]:{...r,...n}}}}}function c(e,t,n,r,o){return function(e,t,n,r){const o=e.messages.byChatId[t];return i(e,t,{threadsById:{...null==o?void 0:o.threadsById,[n]:{...null==o?void 0:o.threadsById[n],...r}}})}(e,t,n,{[r]:o})}function l(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=f(e,t,n[t])})),e}function f(e,t,n){const r=(0,d.Zw)(e,t);return r&&Object.keys(n).every((e=>Boolean(r[Number(e)])))?e:s(e,t,{...n,...r})}function h(e,t,n,r){const o=(0,d.Zw)(e,t)||{},a={...o[n],...r};return a.id?s(e,t,{...o,[n]:a}):e}function m(e,t,n,r){const o=(0,d.Fn)(e,t)||{},a={...o[n],...r};return a.id?E(e,t,{...o,[n]:a}):e}function p(e,t,n){const r=(0,d.Zw)(e,t);if(!r)return e;const o=(0,a.CE)(r,n),i=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,d.tZ)(e,t,r);let a=(0,d.gb)(e,t,r),u=(0,d.qC)(e,t,r),s=(0,d.Cb)(e,t,r),i=(0,d.KB)(e,t),l=null==o?void 0:o.messagesCount;n.forEach((e=>{a&&a.includes(e)&&(a=a.filter((t=>t!==e)),void 0!==l&&(l-=1)),u&&u.includes(e)&&(u=u.filter((t=>t!==e))),s&&s.includes(e)&&(s=s.filter((t=>t!==e))),i&&i.includes(e)&&(i=i.filter((t=>t!==e)))})),e=c(e,t,r,"listedIds",a),e=c(e,t,r,"outlyingIds",u),e=c(e,t,r,"viewportIds",s),e=c(e,t,r,"pinnedIds",i),o&&void 0!==l&&(e=c(e,t,r,"threadInfo",{...o,messagesCount:l}))})),i.length){const n=(0,d.Bt)(e),r=n&&n.chatId===t&&"thread"===n.type,o=null==n?void 0:n.threadId;i.forEach((n=>{const{fromChatId:a,fromMessageId:s}=n.forwardInfo,i=(0,d.hj)(e,a,s);r&&o===s&&(e=u(e,t)),i&&(e=h(e,a,s,{threadInfo:void 0}))}))}return e=s(e,t,o)}function g(e,t,n){const o=(0,d.Fn)(e,t);if(!o)return e;const u=(0,a.CE)(o,n);let s=(0,d.qy)(e,t);return s&&(n.forEach((e=>{s.includes(e)&&(s=s.filter((t=>t!==e)))})),e=c(e,t,r._f,"scheduledIds",s)),E(e,t,u)}function y(e,t,n,r){const o=(0,d.gb)(e,t,n),a=null!=o&&o.length?r.filter((e=>!o.includes(e))):r;return o&&!a.length?e:c(e,t,n,"listedIds",b([...o||[],...a]))}function v(e,t,n,r){const o=(0,d.qC)(e,t,n),a=null!=o&&o.length?r.filter((e=>!o.includes(e))):r;return o&&!a.length?e:c(e,t,n,"outlyingIds",b([...o||[],...a]))}function b(e){return e.sort(((e,t)=>e-t))}function w(e,t,n,r){const a=(0,d.Cb)(e,t,n)||[];return a.includes(r)?e:c(e,t,n,"viewportIds",b([...a.length{e=C(e,t.chatId,t.threadId,t)})),e}function E(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 P(e,t,n,r=!1,o=!1){return{...e,focusedMessage:{...e.focusedMessage,chatId:t,messageId:n,noHighlight:r,isResizingContainer:o}}}function M(e,t,n){return{...e,messages:{...e.messages,sponsoredByChatId:{...e.messages.sponsoredByChatId,[t]:n}}}}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,u,s,i=!1){const{selectedMessages:c}=e;u&&(s=(0,d.xH)(e,t,u));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 u=(0,d.$W)(e,t,n,r),s=u.indexOf(f[f.length-1]),i=u.indexOf(o),c=Math.min(s,i),l=Math.max(s,i),m=u.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:a,fromChatId:u}=t.forwardInfo||{};if(a&&u){const t=(0,d.tZ)(e,n,a);t&&(e=c(e,n,a,"threadInfo",{...t,lastMessageId:r,messagesCount:t.messagesCount+(o?-1:1)}))}return e}},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,_5:()=>E});var r=n(6137),o=n(2858),d=n(6376),a=n(3716),u=n(2913);function s(e,t){return e.chats.byId[t]}function i(e,t){const n=(0,o.zX)(t);return!!n&&(0,d.dy)(e,n)}function c(e,t){return t===e.currentUserId}function l(e,t){const n=i(e,t);return n&&(0,o.cS)(n)}function f(e){return Object.values(e.chats.byId).find((({isSupport:e})=>e))}function h(e,t){if(!(0,o.YC)(t.id)&&!(0,o.eA)(t)&&t.fullInfo)return t.fullInfo.members&&t.fullInfo.members.length!==a.mo?t.fullInfo.members.reduce(((t,{userId:n})=>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),a=r&&(0,d.dy)(e,r);if(a&&(0,o.cS)(a))return a}function p(e,t){const n=s(e,t),d=m(e,t);if(!n||!d)return!1;if(n.lastMessage&&(0,o.CD)(n.lastMessage))return!0;const a=e.messages.byChatId[t];if(!a)return!1;const{listedIds:u}=a.threadsById[r._f]||{};return u&&!u.length}function g(e){return Boolean(e.chats.listIds.active)}function y(e,t,n){const{listIds:r}=e.chats;if(n){const e=r[n];return Boolean(e&&e.includes(t))}return Object.values(r).some((e=>e&&e.includes(t)))}function v(e,t){const n=s(e,t);if(n&&y(e,t))return n.folderId===a.WS?"archived":"active"}function b(e,t){return e.chatFolders.byId[t]}function w(e,t,n=a.Nf){const{active:r,archived:o}=e.chats.orderedPinnedIds;if(n===a.Nf)return!!r&&r.includes(t);if(n===a.WS)return!!o&&o.includes(t);const{byId:d}=e.chatFolders,{pinnedChatIds:u}=d[n]||{};return!!u&&u.includes(t)}function I(e,t){const n=t.toLowerCase();return Object.values(e.chats.byId).find((e=>e.username&&e.username.toLowerCase()===n))}function C(e){const t=e.chats.listIds.active;if(!t)return 0;const n=e.chats.byId,r=(0,u.d)(e),d=(0,u.N)(e);return t.reduce(((e,t)=>{const a=n[t];return!(a&&a.unreadCount&&a.isListed)||a.isNotJoined||a.isRestricted||!a.unreadMentionsCount&&(0,o.i4)(a,r,d)?e:e+a.unreadCount}),0)}function S(e){return Boolean(s(e,a.aw))}function E(e,t){var n;const r=s(e,t);if(!r)return;const o=null==r||null===(n=r.fullInfo)||void 0===n?void 0:n.sendAsId;return o?(0,d.dy)(e,o)||s(e,o):void 0}},1638:(e,t,n)=>{n.d(t,{hg:()=>Q,xs:()=>ce,_k:()=>de,zB:()=>y,tH:()=>v,Oh:()=>b,g4:()=>u.g4,bH:()=>Se,__:()=>Pe,xl:()=>ae,Nu:()=>se,nB:()=>ue,Z1:()=>u.Z1,IK:()=>u.IK,DI:()=>u.DI,Mw:()=>u.Mw,Ek:()=>u.Ek,hj:()=>J,ZB:()=>X,Zw:()=>A,YK:()=>u.YK,Dg:()=>u.Dg,X5:()=>pe,A1:()=>u.A1,jr:()=>M,yN:()=>f,JX:()=>Ue,pP:()=>_e,we:()=>Oe,og:()=>De,$W:()=>R,Bt:()=>P,y5:()=>l,n5:()=>Re,q6:()=>Le,Ms:()=>$,_$:()=>F,kK:()=>Y,wU:()=>B,yZ:()=>W,It:()=>he,G$:()=>ee,y8:()=>ve,cv:()=>oe,ku:()=>Te,pk:()=>u.pk,N:()=>u.N,ep:()=>u.ep,xo:()=>u.xo,FM:()=>u.FM,a6:()=>we,te:()=>ie,Ev:()=>me,CA:()=>ge,zQ:()=>xe,_X:()=>te,EV:()=>ke,vk:()=>ye,Jf:()=>Be,UW:()=>u.UW,s4:()=>s.s4,b9:()=>K,VF:()=>Ae,gb:()=>N,CP:()=>w,cu:()=>I,ji:()=>C,aW:()=>Ze,xH:()=>be,FT:()=>Ce,tV:()=>U,NJ:()=>Qe.N,dZ:()=>Qe.d,dT:()=>ne,qC:()=>L,gx:()=>je,eh:()=>Ge,Mz:()=>We,sp:()=>Ve,KB:()=>O,$$:()=>He,rd:()=>fe,p9:()=>G,Yy:()=>x,Wq:()=>Fe,qy:()=>Z,Tm:()=>q,Fn:()=>k,Vt:()=>_,D7:()=>Ie,_5:()=>u._5,Ur:()=>re,yB:()=>Me,fS:()=>Ne,Ny:()=>h,E_:()=>m,Pk:()=>p,i3:()=>ze,P_:()=>u.P_,Pu:()=>$e,Db:()=>z,tZ:()=>j,Cm:()=>V,qS:()=>H,uZ:()=>le,dy:()=>s.dy,ss:()=>s.ss,Cb:()=>D});var r=n(1713),o=n(7361),d=n(6137),a=n(3716),u=n(8857),s=n(6376),i=n(2858),c=n(782);function l(e){return e.stickers.search}function f(e){return e.gifs.search}function h(e,t){return e.stickers.setsById[t]}function m(e,t){return Object.values(e.stickers.setsById).find((e=>e.shortName.toLowerCase()===t.toLowerCase()))}function p(e,t){const n=Object.values(e.stickers.setsById);let r=[];return e.stickers.favorite.stickers.forEach((e=>{e.emoji===t&&r.push(e)})),n.forEach((({packs:e})=>{if(!e)return;const n=e[t];n&&(r=r.concat(n))})),r}function g(e){return e.replace("️","")}function y(e,t){const{animatedEmojis:n}=e;if(!n||!n.stickers)return;const r=g(t);return n.stickers.find((e=>e.emoji===t||e.emoji===r))}function v(e,t){const{animatedEmojiEffects:n}=e;if(!n||!n.stickers)return;const r=g(t);return n.stickers.find((e=>e.emoji===t||e.emoji===r))}function b(e,t){var n;return null==e||null===(n=e.appConfig)||void 0===n?void 0:n.emojiSounds[g(t)]}function w(e,t){const n=g(t);return"🍑"===n?"Peach":"🍆"===n?"Eggplant":void 0}function I(e){return"Eggplant"===e?"Cumshot":void 0}function C(e){return"Cumshot"===e?"🍆":void 0}var S=n(2267),E=n(735);function P(e){const{messageLists:t}=e.messages;if(t.length)return t[t.length-1]}function M(e){const{chatId:t}=P(e)||{};return t?(0,u.Z1)(e,t):void 0}function A(e,t){var n;return null===(n=e.messages.byChatId[t])||void 0===n?void 0:n.byId}function k(e,t){var n;return null===(n=e.scheduledMessages.byChatId[t])||void 0===n?void 0:n.byId}function T(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 N(e,t,n){return T(e,t,n,"listedIds")}function L(e,t,n){return T(e,t,n,"outlyingIds")}function R(e,t,n,r){switch(r){case"thread":return D(e,t,n);case"pinned":return O(e,t);case"scheduled":return Z(e,t)}}function D(e,t,n){return T(e,t,n,"viewportIds")}function O(e,t){return T(e,t,d._f,"pinnedIds")}function Z(e,t){return T(e,t,d._f,"scheduledIds")}function _(e,t,n){return T(e,t,n,"scrollOffset")}function x(e,t,n){return T(e,t,n,"replyingToId")}function F(e,t,n){return T(e,t,n,"editingId")}function B(e,t){return T(e,t,d._f,"editingScheduledId")}function $(e,t,n){return T(e,t,n,"draft")}function U(e,t,n){return T(e,t,n,"noWebPage")}function j(e,t,n){return T(e,t,n,"threadInfo")}function W(e,t,n){return T(e,t,n,"firstMessageId")}function G(e,t,n){return T(e,t,n,"replyStack")}function V(e,t,n){if(n===d._f)return(0,u.Z1)(e,t);const r=j(e,t,n);return r?(0,u.Z1)(e,r.originChannelId||t):void 0}function H(e,t,n){if(n===d._f)return;const r=j(e,t,n);return r?r.topMessageId:void 0}function z(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 Q(e,t,n){const r=P(e);if(!r)return!1;const{threadInfo:o}=z(e,t,n)||{};return t===r.chatId&&(r.threadId===d._f||o&&r.threadId===o.threadId)}function K(e,t,n){const r=D(e,t,n);if(!r||!r.length)return!0;let o;if(n===d._f){const n=(0,u.Z1)(e,t);if(!n||!n.lastMessage)return!0;o=n.lastMessage.id}else{const r=j(e,t,n);if(!r||!r.lastMessageId)return;o=r.lastMessageId}return o>=a.AE&&!J(e,t,o)||r[r.length-1]>=o}function J(e,t,n){const r=A(e,t);return r?r[n]:void 0}function q(e,t,n){const r=k(e,t);return r?r[n]:void 0}function Y(e,t,n,r){if("scheduled"===r){const n=B(e,t);return n?q(e,t,n):void 0}{const r=F(e,t,n);return r?J(e,t,r):void 0}}function X(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 ee(e,t){const{chatId:n,messageId:r}=e.focusedMessage||{};return n===t?r:void 0}function te(e,t){const n=ee(e,t.chatId);return!!n&&(n===t.id||n===t.previousLocalId)}function ne(e,t,n=!1){return function(e,t){const{lastReadOutboxMessageId:n}=(0,u.Z1)(e,t.chatId)||{};return(0,i.CI)(t)||!n||ne===t.id))}(e,t.content.sticker),Z=!v&&R&&!D,_=!v&&D,x=!v,F=!v&&(m||h),B=!v,$=Boolean((null===(o=b.webPage)||void 0===o?void 0:o.document)||(null===(d=b.webPage)||void 0===d?void 0:d.video)||(null===(a=b.webPage)||void 0===a?void 0:a.photo)||b.audio||b.voice||b.photo||b.video||b.document||b.sticker);return{noOptions:[I,N,E,P,k,A,T,L,Z,_,x,F,B,$].every((e=>!e)),canReply:I,canEdit:N,canPin:E,canUnpin:P,canReport:k,canDelete:A,canDeleteForAll:T,canForward:L,canFaveSticker:Z,canUnfaveSticker:_,canCopy:x,canCopyLink:F,canSelect:B,canDownload:$}}function ae(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=P(e)||{},o=n&&A(e,n);if(!o||!t||!r)return{};const d=t.map((t=>o[t]&&de(e,o[t],r))).filter(Boolean);return{canDelete:d.every((e=>e.canDelete)),canDeleteForAll:d.every((e=>e.canDeleteForAll))}}function ue(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=P(e)||{},o=n&&A(e,n);return!!(o&&t&&r)&&t.map((t=>o[t]&&de(e,o[t],r))).filter(Boolean).every((e=>e.canReport))}function se(e){const{messageIds:t}=e.selectedMessages||{},{chatId:n,threadId:r}=P(e)||{},o=n&&A(e,n);return!!(o&&t&&r)&&t.map((t=>o[t]&&de(e,o[t],r))).filter(Boolean).some((e=>e.canDownload))}function ie(e,t){const n=e.activeDownloads.byChatId[t.chatId];return!!n&&n.includes(t.id)}function ce(e,t){return e.activeDownloads.byChatId[t]||E.D}function le(e,t){var n;return null===(n=e.fileUploads.byMessageLocalId[t.previousLocalId||t.id])||void 0===n?void 0:n.progress}function fe(e,t,n){if(n===d._f){const n=(0,u.Z1)(e,t);if(!n)return;if(!n.lastReadInboxMessageId)return;return n.lastMessage?(0,i.CI)(n.lastMessage)?n.lastMessage.id:Math.min(n.lastMessage.id,n.lastReadInboxMessageId):n.lastReadInboxMessageId}{const r=j(e,t,n);if(!r)return;return r.lastReadInboxMessageId?Math.min(r.lastReadInboxMessageId,r.lastMessageId||1/0):r.topMessageId}}function he(e,t,n){const r=(0,u.Z1)(e,t);if(n===d._f){if(!r)return}else{const r=j(e,t,n);if(!r||void 0!==r.lastMessageId&&r.lastMessageId===r.lastReadInboxMessageId)return}const o=L(e,t,n),s=N(e,t,n),i=A(e,t);if(!i||!o&&!s)return;const c=fe(e,t,n);if(!c&&r&&r.isNotJoined)return;const l=t===a.aw?e.serviceNotifications.reduce(((e,t)=>!t.isUnread&&t.id>e?t.id:e),-1):-1;function f(e){return e.find((e=>(!c||e>c)&&i[e]&&(!i[e].isOutgoing||i[e].isFromScheduled)&&e>l))}if(o){const e=f(o);if(e)return e}if(s){const e=f(s);if(e)return e}}function me(e){const{forwardMessages:t}=e;return Boolean(t.isModalShown)}function pe(e,t){const n=Object.values(e.chats.byId).find((e=>(0,i.Ru)(e)&&e.lastMessage&&e.lastMessage.id===t));if(n)return n.id;const{byChatId:r}=e.messages;return Object.keys(r).find((n=>{const o=(0,u.Z1)(e,n);return o&&(0,i.Ru)(o)&&r[o.id].byId[t]}))}function ge(e){const{selectedMessages:t}=e;return Boolean(t)}function ye(e,t){const{messageIds:n}=e.selectedMessages||{};return!!n&&n.includes(t)}function ve(e,t,n){const r=A(e,t);if(r)return Object.values(r).filter((e=>e.groupedId===n&&e.forwardInfo)).map((({forwardInfo:e})=>e.fromMessageId))}function be(e,t,n){const r=A(e,t);if(r)return Object.keys(r).map(Number).filter((e=>r[e].groupedId===n))}function we(e,t,n){const{messageIds:r}=e.selectedMessages||{};if(!r)return!1;const o=be(e,t,n);return o&&o.every((e=>r.includes(e)))}function Ie(e){const{messageIds:t}=e.selectedMessages||{};return t?t.length:0}function Ce(e,t){const n=(0,u.Z1)(e,t);if(!n)return;if(!(0,u.xo)(e,n))return;const r=A(e,t),o=D(e,t,d._f);if(!r||!o)return;const a=(0,c.dF)(o,(e=>!r[e].isOutgoing&&Boolean(r[e].keyboardButtons))),s=(0,c.dF)(o,(e=>Boolean(r[e].shouldHideKeyboardButtons)));return a&&s&&s>a?void 0:a?r[a]:void 0}function Se(e,t){const n=(0,u.Z1)(e,t.chatId);if(!n)return;const r=re(e,t),o=Boolean((0,i.O$)(t)||(0,i.F$)(t)),d=Boolean((0,i.b7)(t)||(0,i.Cg)(t)),a=Boolean((0,i.oP)(t)||(0,i.kd)(t)||(0,i.aE)(t)),{canAutoLoadPhotoFromContacts:s,canAutoLoadPhotoInPrivateChats:c,canAutoLoadPhotoInGroups:l,canAutoLoadPhotoInChannels:f,canAutoLoadVideoFromContacts:h,canAutoLoadVideoInPrivateChats:m,canAutoLoadVideoInGroups:p,canAutoLoadVideoInChannels:g,canAutoLoadFileFromContacts:y,canAutoLoadFileInPrivateChats:v,canAutoLoadFileInGroups:b,canAutoLoadFileInChannels:w}=e.settings.byKey;return o?Ee({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:s,canAutoLoadMediaInPrivateChats:c,canAutoLoadMediaInGroups:l,canAutoLoadMediaInChannels:f}):d?Ee({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:h,canAutoLoadMediaInPrivateChats:m,canAutoLoadMediaInGroups:p,canAutoLoadMediaInChannels:g}):!a||Ee({global:e,chat:n,sender:r,canAutoLoadMediaFromContacts:y,canAutoLoadMediaInPrivateChats:v,canAutoLoadMediaInGroups:b,canAutoLoadMediaInChannels:w})}function Ee({global:e,chat:t,sender:n,canAutoLoadMediaFromContacts:r,canAutoLoadMediaInPrivateChats:o,canAutoLoadMediaInGroups:d,canAutoLoadMediaInChannels:a}){const u=Boolean(n&&(n.id===e.currentUserId||(0,s.nM)(e,n)));return Boolean(u&&r||!u&&o&&(0,i.YC)(t.id)||d&&(0,i.Bf)(t)||a&&(0,i.eA)(t))}function Pe(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 Me(e){return e.settings.byKey.shouldLoopStickers}function Ae(e){const{serviceNotifications:t}=e,n=Math.max(...t.map((({id:e})=>e)));return t.find((({id:e})=>e===n))}function ke(e,t){var n;return!!t&&(t.isProtected||(null===(n=(0,u.Z1)(e,t.chatId))||void 0===n?void 0:n.isProtected))}function Te(e,t,n){var r;if(null!==(r=(0,u.Z1)(e,t))&&void 0!==r&&r.isProtected)return!0;if(!n)return!1;const o=A(e,t);return n.some((e=>{var t;return null===(t=o[e])||void 0===t?void 0:t.isProtected}))}function Ne(e,t){const n=(0,u.Z1)(e,t),r=n&&(0,i.eA)(n)?e.messages.sponsoredByChatId[t]:void 0;return r&&r.expiresAt>=Math.round(Date.now()/1e3)?r:void 0}function Le(e,t){var n,r,o;if(t===a.aw)return;const d=(0,i.YC)(t),s=null===(n=e.appConfig)||void 0===n?void 0:n.defaultReaction,{availableReactions:c}=e;if(!s||null==c||!c.some((e=>e.reaction===s&&!e.isInactive)))return;if(d)return s;const l=null===(r=(0,u.Z1)(e,t))||void 0===r||null===(o=r.fullInfo)||void 0===o?void 0:o.enabledReactions;return null!=l&&l.includes(s)?s:void 0}function Re(e){const{chatId:t,threadId:n}=P(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 De(e){const{byChatId:t}=e.localMediaSearch,{chatId:n}=P(e)||{},r=e.users.selectedId;return r&&t[r]?r:n}function Oe(e){const t=De(e);if(t)return e.localMediaSearch.byChatId[t]}function Ze(e,t){return e.management.byChatId[t]}function _e(e){const{chatId:t,threadId:n}=P(e)||{};if(!t||!n)return;if((0,i.YC)(t))return"user";const r=(0,u.Z1)(e,t);return r?(0,i.Bf)(r)?"group":"channel":void 0}function xe(e){const{mediaViewer:t}=e;return Boolean(t.messageId||t.avatarOwnerId)}function Fe(e){const{users:t,isChatInfoShown:n,newChatMembersProgress:d}=e,a=d!==r.WB.Closed,s=function(e){const{pollResults:t}=e;return Boolean(t.messageId)}(e),i=Boolean(!o.wB&&Re(e)),c=function(e){const{chatId:t,threadId:n}=P(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}=P(e)||{},g=t.selectedId,y=(0,u.g4)(e),v=Boolean(g&&y),b=Boolean(p&&y)&&n;return s?r.qt.PollResults:i?r.qt.Search:c?r.qt.Management:h?r.qt.StickerSearch:m?r.qt.GifSearch:a?r.qt.AddingMembers:v?r.qt.UserInfo:b?r.qt.ChatInfo:void 0}function Be(e){return void 0!==Fe(e)}function $e(e){const{theme:t,shouldUseSystemTheme:n}=e.settings.byKey;return n?(0,o.vn)():t}function Ue(e){return e.globalSearch.query}function je(e){return e.payment.chatId}function We(e){return e.payment.messageId}function Ge(e){return e.payment.formId}function Ve(e){return e.payment.requestId}function He(e){return e.payment.nativeParams?e.payment.nativeParams.publishableKey:void 0}function ze(e){return e.payment.stripeCredentials}var Qe=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 a(e,t){return e.contactList&&e.contactList.userIds.includes(t.id)}n.d(t,{dy:()=>r,ss:()=>o,s4:()=>d,nM:()=>a})},1713:(e,t,n)=>{let r,o,d,a,u,s,i,c,l,f,h,m,p,g;n.d(t,{Uq:()=>r,fo:()=>o,MT:()=>d,du:()=>a,nJ:()=>u,qt:()=>s,bZ:()=>i,Cr:()=>c,Nh:()=>l,rN:()=>f,wv:()=>h,WB:()=>m,vi:()=>p,KB:()=>g,mp:()=>y,u1:()=>v}),function(e){e[e.Backwards=0]="Backwards",e[e.Forwards=1]="Forwards",e[e.Around=2]="Around"}(r||(r={})),function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(o||(o={})),function(e){e[e.Main=0]="Main",e[e.EditProfile=1]="EditProfile",e[e.Notifications=2]="Notifications",e[e.DataStorage=3]="DataStorage",e[e.Language=4]="Language",e[e.General=5]="General",e[e.GeneralChatBackground=6]="GeneralChatBackground",e[e.GeneralChatBackgroundColor=7]="GeneralChatBackgroundColor",e[e.Privacy=8]="Privacy",e[e.PrivacyPhoneNumber=9]="PrivacyPhoneNumber",e[e.PrivacyLastSeen=10]="PrivacyLastSeen",e[e.PrivacyProfilePhoto=11]="PrivacyProfilePhoto",e[e.PrivacyForwarding=12]="PrivacyForwarding",e[e.PrivacyGroupChats=13]="PrivacyGroupChats",e[e.PrivacyPhoneNumberAllowedContacts=14]="PrivacyPhoneNumberAllowedContacts",e[e.PrivacyPhoneNumberDeniedContacts=15]="PrivacyPhoneNumberDeniedContacts",e[e.PrivacyLastSeenAllowedContacts=16]="PrivacyLastSeenAllowedContacts",e[e.PrivacyLastSeenDeniedContacts=17]="PrivacyLastSeenDeniedContacts",e[e.PrivacyProfilePhotoAllowedContacts=18]="PrivacyProfilePhotoAllowedContacts",e[e.PrivacyProfilePhotoDeniedContacts=19]="PrivacyProfilePhotoDeniedContacts",e[e.PrivacyForwardingAllowedContacts=20]="PrivacyForwardingAllowedContacts",e[e.PrivacyForwardingDeniedContacts=21]="PrivacyForwardingDeniedContacts",e[e.PrivacyGroupChatsAllowedContacts=22]="PrivacyGroupChatsAllowedContacts",e[e.PrivacyGroupChatsDeniedContacts=23]="PrivacyGroupChatsDeniedContacts",e[e.PrivacyActiveSessions=24]="PrivacyActiveSessions",e[e.PrivacyBlockedUsers=25]="PrivacyBlockedUsers",e[e.Folders=26]="Folders",e[e.FoldersCreateFolder=27]="FoldersCreateFolder",e[e.FoldersEditFolder=28]="FoldersEditFolder",e[e.FoldersEditFolderFromChatList=29]="FoldersEditFolderFromChatList",e[e.FoldersIncludedChats=30]="FoldersIncludedChats",e[e.FoldersIncludedChatsFromChatList=31]="FoldersIncludedChatsFromChatList",e[e.FoldersExcludedChats=32]="FoldersExcludedChats",e[e.FoldersExcludedChatsFromChatList=33]="FoldersExcludedChatsFromChatList",e[e.TwoFaDisabled=34]="TwoFaDisabled",e[e.TwoFaNewPassword=35]="TwoFaNewPassword",e[e.TwoFaNewPasswordConfirm=36]="TwoFaNewPasswordConfirm",e[e.TwoFaNewPasswordHint=37]="TwoFaNewPasswordHint",e[e.TwoFaNewPasswordEmail=38]="TwoFaNewPasswordEmail",e[e.TwoFaNewPasswordEmailCode=39]="TwoFaNewPasswordEmailCode",e[e.TwoFaEnabled=40]="TwoFaEnabled",e[e.TwoFaChangePasswordCurrent=41]="TwoFaChangePasswordCurrent",e[e.TwoFaChangePasswordNew=42]="TwoFaChangePasswordNew",e[e.TwoFaChangePasswordConfirm=43]="TwoFaChangePasswordConfirm",e[e.TwoFaChangePasswordHint=44]="TwoFaChangePasswordHint",e[e.TwoFaTurnOff=45]="TwoFaTurnOff",e[e.TwoFaRecoveryEmailCurrentPassword=46]="TwoFaRecoveryEmailCurrentPassword",e[e.TwoFaRecoveryEmail=47]="TwoFaRecoveryEmail",e[e.TwoFaRecoveryEmailCode=48]="TwoFaRecoveryEmailCode",e[e.TwoFaCongratulations=49]="TwoFaCongratulations",e[e.QuickReaction=50]="QuickReaction"}(d||(d={})),function(e){e[e.ChatList=0]="ChatList",e[e.GlobalSearch=1]="GlobalSearch",e[e.Settings=2]="Settings",e[e.Contacts=3]="Contacts",e[e.Archived=4]="Archived",e[e.NewChannelStep1=5]="NewChannelStep1",e[e.NewChannelStep2=6]="NewChannelStep2",e[e.NewGroupStep1=7]="NewGroupStep1",e[e.NewGroupStep2=8]="NewGroupStep2"}(a||(a={})),function(e){e[e.ChatList=0]="ChatList",e[e.Media=1]="Media",e[e.Links=2]="Links",e[e.Files=3]="Files",e[e.Music=4]="Music",e[e.Voice=5]="Voice"}(u||(u={})),function(e){e[e.ChatInfo=0]="ChatInfo",e[e.UserInfo=1]="UserInfo",e[e.Search=2]="Search",e[e.Management=3]="Management",e[e.StickerSearch=4]="StickerSearch",e[e.GifSearch=5]="GifSearch",e[e.PollResults=6]="PollResults",e[e.AddingMembers=7]="AddingMembers"}(s||(s={})),function(e){e[e.Inline=0]="Inline",e[e.ScheduledInline=1]="ScheduledInline",e[e.SharedMedia=2]="SharedMedia",e[e.ProfileAvatar=3]="ProfileAvatar",e[e.SettingsAvatar=4]="SettingsAvatar",e[e.MiddleHeaderAvatar=5]="MiddleHeaderAvatar",e[e.Album=6]="Album",e[e.ScheduledAlbum=7]="ScheduledAlbum",e[e.SearchResult=8]="SearchResult"}(i||(i={})),function(e){e[e.Inline=0]="Inline",e[e.SharedMedia=1]="SharedMedia",e[e.Search=2]="Search"}(c||(c={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(l||(l={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(f||(f={})),function(e){e[e.Idle=0]="Idle",e[e.InProgress=1]="InProgress",e[e.Complete=2]="Complete",e[e.Error=3]="Error"}(h||(h={})),function(e){e[e.Closed=0]="Closed",e[e.InProgress=1]="InProgress",e[e.Loading=2]="Loading"}(m||(m={})),function(e){e[e.Profile=0]="Profile",e[e.SharedMedia=1]="SharedMedia",e[e.MemberList=2]="MemberList"}(p||(p={})),function(e){e[e.ShippingInfo=0]="ShippingInfo",e[e.Shipping=1]="Shipping",e[e.PaymentInfo=2]="PaymentInfo",e[e.Checkout=3]="Checkout"}(g||(g={}));const y="UPLOADING_WALLPAPER_SLUG";let v;!function(e){e[e.Initial=0]="Initial",e[e.ChatPrivacyType=1]="ChatPrivacyType",e[e.Discussion=2]="Discussion",e[e.ChannelSubscribers=3]="ChannelSubscribers",e[e.GroupType=4]="GroupType",e[e.GroupPermissions=5]="GroupPermissions",e[e.GroupRemovedUsers=6]="GroupRemovedUsers",e[e.GroupUserPermissionsCreate=7]="GroupUserPermissionsCreate",e[e.GroupUserPermissions=8]="GroupUserPermissions",e[e.ChatAdministrators=9]="ChatAdministrators",e[e.GroupRecentActions=10]="GroupRecentActions",e[e.ChatAdminRights=11]="ChatAdminRights",e[e.ChatNewAdminRights=12]="ChatNewAdminRights",e[e.GroupMembers=13]="GroupMembers",e[e.GroupAddAdmins=14]="GroupAddAdmins",e[e.Invites=15]="Invites",e[e.EditInvite=16]="EditInvite",e[e.Reactions=17]="Reactions"}(v||(v={}))},9933:(e,t,n)=>{n.d(t,{cK:()=>d,jt:()=>a,M8:()=>u,vr:()=>s});var r=n(9118);let o;function d(e,t){t||(o&&!o.isCancelled&&(o.isCancelled=!0),o=t={isCancelled:!1}),!t.isCancelled&&e()&&(0,r.T2)((()=>{d(e,t)}))}function a(e){e()&&(0,r.T2)((()=>{a(e)}))}const u={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=u.linear,onUpdate:t,duration:n,onEnd:r,from:o,to:d}){const s=Date.now();let i=!1;return a((()=>{if(i)return!1;let a=(Date.now()-s)/n;a>1&&(a=1);const u=e(a);if("number"==typeof o&&"number"==typeof d)t(o+(d-o)*u);else if(Array.isArray(o)&&Array.isArray(d)){const e=o.map(((e,t)=>e+(d[t]-e)*u));t(e)}return 1===a&&r&&r(),a<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:()=>a,clear:()=>u});const r=self.caches;let o;async function d(e,t,n,d=!1){if(r)try{const a=new Request(t.replace(/:/g,"_")),u=await r.open(e),s=await u.match(a);if(!s)return;const i=s.headers.get("Content-Type");switch(n){case o.Text:return await s.text();case o.Blob:{if(t.startsWith("avatar")&&i&&i.startsWith("text"))return;const e=await s.blob(),n=!e.type||!d&&e.type.includes("html");let r=e.type||i;return n&&r?(d||(r=r.replace(/html/gi,"")),new Blob([e],{type:r})):e}case o.Json:return await s.json();default:return}}catch(e){return void console.warn(e)}}async function a(e,t,n){if(r)try{const o="string"==typeof n||n instanceof Blob?n:JSON.stringify(n),d=new Request(t.replace(/:/g,"_")),a=new Response(o),u=await r.open(e);return await u.put(d,a)}catch(e){return void console.warn(e)}}async function u(e){try{if(!r)return;return await r.delete(e)}catch(e){return void console.warn(e)}}!function(e){e[e.Text=0]="Text",e[e.Blob=1]="Blob",e[e.Json=2]="Json"}(o||(o={}))},6063:(e,t,n)=>{function r(){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}}n.d(t,{_:()=>r})},3989:(e,t,n)=>{n.d(t,{Z:()=>o});var r=n(517);function o(e){return(0,r.Z)({onEsc:e})}},517:(e,t,n)=>{n.d(t,{Z:()=>d});const r={Enter:"onEnter",Backspace:"onBackspace",Delete:"onDelete",Esc:"onEsc",Escape:"onEsc",ArrowUp:"onUp",ArrowDown:"onDown",ArrowLeft:"onLeft",ArrowRight:"onRight",Tab:"onTab"},o={onEnter:[],onDelete:[],onBackspace:[],onEsc:[],onUp:[],onDown:[],onLeft:[],onRight:[],onTab:[]};function d(e){return a()||document.addEventListener("keydown",u,!0),Object.keys(e).forEach((t=>{const n=e[t];if(!n)return;const r=o[t];r&&r.push(n)})),()=>{!function(e){Object.keys(e).forEach((t=>{const n=e[t],r=o[t];if(r){const e=r.findIndex((e=>e===n));-1!==e&&r.splice(e,1)}})),a()||document.removeEventListener("keydown",u,!1)}(e)}}function a(){return Object.values(o).some((e=>Boolean(e.length)))}function u(e){const t=r[e.key];if(!t)return;const{length:n}=o[t];n&&(e.stopPropagation(),(0,o[t][n-1])(e))}},790:(e,t,n)=>{n.d(t,{xR:()=>a,$Y:()=>u,_F:()=>s,kj:()=>i,mr:()=>l,VX:()=>f,Tu:()=>h,np:()=>m,D:()=>p,j1:()=>g,ZK:()=>v,k9:()=>b,rM:()=>w,xH:()=>I,SA:()=>C,xk:()=>E,IS:()=>P});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())),a=864e5;function u(e){const t=new Date(e);return t.setHours(0,0,0,0),t}function s(e){return u(e).getTime()}function i(e){const t=new Date(1e3*e);return`${t.getFullYear()}-${t.getMonth()}`}function c(e){return`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`}function l(e,t){const n="number"==typeof t?new Date(t):t,r=e.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 f(e,t){const n="number"==typeof t?new Date(t):t,o=u(new Date);if(n>=o)return l(e,n);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 y(e,n,s)}function h(e,t){const n="number"==typeof t?new Date(t):t,r=e("formatterYearMax")||"dd.MM.yyyy";return y(e,n,r)}function m(e,t,n=!1){const r=e(n?"formatterMonthYear2":"formatterMonthYear")||"MMM yyyy";return y(e,t,r)}function p(e,t){const n=Math.floor(t/a);return t<0?0:n<1?b(t/1e3):n<7?e("Days",n):n<30?e("Weeks",Math.floor(n/7)):n<365?e("Months",Math.floor(n/30)):e("Years",Math.floor(n/365))}function g(e,t,n=!1,o=!1,d){const a="number"==typeof t?new Date(t):t,s=u(new Date);if(!o){if(c(a)===c(s))return(d||!n?A:M)(e("Weekday.Today"));const t=new Date(s);if(t.setDate(s.getDate()-1),c(a)===c(t))return(d||!n?A:M)(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?A:M)(e(n?`Weekday.Short${t}`:`Weekday.${t}`))}}const i=a.getFullYear()!==s.getFullYear(),l=e(n?i?"formatDateScheduleYear":"formatDateSchedule":i?"chatFullDate":"chatDate")||"d MMMM yyyy";return(d||!n?A:M)(y(e,a,l))}function y(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())).replace(/'de'/g,"de")}function v(e,t,n){const r="number"==typeof t?new Date(t):t;return`${g(e,r,!0,void 0,n)}, ${l(e,r)}`}function b(e,t){const n=Math.floor(e/3600),r=Math.floor(e%3600/60),o=Math.floor(e%3600%60),d=t?Math.floor(t/3600):0,a=t?Math.floor(t%3600/60):0;let u="";return n>0||d>0?(u+=`${String(n).padStart(2,"0")}:`,u+=`${String(r).padStart(2,"0")}:`):u+=a>=10?`${String(r).padStart(2,"0")}:`:`${String(r)}:`,u+=String(o).padStart(2,"0"),u}function w(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 I(e,t="en-US"){return("number"==typeof e?new Date(e):e).toLocaleString(t,{year:"numeric",month:"short",day:"numeric"})}function C(e,t="en-US"){return("number"==typeof e?new Date(e):e).toLocaleString(t,{year:"numeric",month:"short",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric"})}function S(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 E(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||!S(t,n-1,r||void 0)?void 0:`${r?`${r}-`:""}${String(n).padStart(2,"0")}-${String(t).padStart(2,"0")}`}const o=e.split(" "),a=t?o[0]:o[1],u=(t?o[1]:o[0]).toLowerCase(),s=d.findIndex((e=>e.startsWith(u)));return-1!==s&&S(Number(a),s)?`${String(s+1).padStart(2,"0")}-${String(a).padStart(2,"0")}`:void 0}function P(e){return e+a/1e3}function M(e){return`${e[0].toLowerCase()}${e.slice(1)}`}function A(e){return`${e[0].toUpperCase()}${e.slice(1)}`}},4284:(e,t,n)=>{n.d(t,{g6:()=>u,U_:()=>s,NM:()=>i,Wg:()=>c});var r=n(3681);const o=["female_sign","male_sign","medical_symbol"],d=[[/\u{1f3f3}\u200d\u{1f308}/gu,"🏳️‍🌈"],[/\u{1f3f3}\u200d\u26a7\ufe0f/gu,"🏳️‍⚧️"],[/\u{1f937}\u200d\u2642[^\ufe0f]/gu,"🤷‍♂️"]];function a(e){const t=e.split("-").map((e=>parseInt(e,16)));return String.fromCodePoint(...t)}function u(e){if(!e.match(r.Z))return e;for(const[t,n]of d)e=e.replace(t,n);return e}function s(e){let t;if(1===e.length)t=e.charCodeAt(0).toString(16).padStart(4,"0");else{const n=[];for(let t=0;t=55296&&e.charCodeAt(t)<=56319?e.charCodeAt(t+1)>=56320&&e.charCodeAt(t+1)<=57343&&n.push(1024*(e.charCodeAt(t)-55296)+(e.charCodeAt(t+1)-56320)+65536):(e.charCodeAt(t)<55296||e.charCodeAt(t)>57343)&&n.push(e.charCodeAt(t));t=n.map((e=>e.toString(16).padStart(4,"0"))).join("-")}return t}function i(e){const t={categories:[],emojis:{}};for(let n=0;ne.codePointAt(0)+127397));return String.fromCodePoint(...n)}},1396:(e,t,n)=>{function r(e){if(e)return e.includes("://")?e:`http://${e}`}n.d(t,{X:()=>r})},7361:(e,t,n)=>{n.d(t,{Bi:()=>k,cL:()=>R,wZ:()=>p,vX:()=>M,op:()=>C,cj:()=>m,jm:()=>h,pA:()=>L,m5:()=>P,I_:()=>E,fl:()=>y,t0:()=>A,s$:()=>g,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 a,u;new Promise((e=>{const t=new Image;t.src="data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";const n=()=>{e(2===t.height)};t.onload=n,t.onerror=n})).then((e=>{o=e}));let s=null!==(a=(u=window).matchMedia)&&void 0!==a&&a.call(u,"(prefers-color-scheme: dark)").matches?"dark":"light";function i(){return s}function c(e){s=e.matches?"dark":"light"}const l=window.matchMedia("(prefers-color-scheme: dark)");"function"==typeof l.addEventListener?l.addEventListener("change",c):"function"==typeof l.addListener&&l.addListener(c);const f=function(){const{userAgent:e,platform:t}=window.navigator;let n;return-1!==["Macintosh","MacIntel","MacPPC","Mac68K"].indexOf(t)?n="macOS":-1!==["iPhone","iPad","iPod"].indexOf(t)?n="iOS":-1!==["Win32","Win64","Windows","WinCE"].indexOf(t)?n="Windows":/Android/.test(e)?n="Android":/Linux/.test(t)&&(n="Linux"),n}(),h="macOS"===f,m="iOS"===f,p="Android"===f,g=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),y=window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone||document.referrer.includes("android-app://"),v=window.matchMedia("(pointer: coarse)").matches,b=window.innerWidth<=r.l3||window.innerWidth<=r.u_&&window.innerHeight<=r.rO,w=!b&&window.innerWidth<=r.ks,I=Boolean(navigator.mediaDevices&&"getUserMedia"in navigator.mediaDevices&&(window.AudioContext||window.webkitAudioContext)),C=(document.documentElement.style,f&&(h||m)),S="serviceWorker"in navigator,E=S,P=(window,Boolean((new Audio).canPlayType("audio/ogg; codecs=opus"))),M=!r.Cg&&"filter"in(document.createElement("canvas").getContext("2d")||{}),A="requestFullscreen"in document.createElement("div"),k=!navigator.userAgent.includes("Firefox"),T=p?"slide-fade":m?"slide-layers":"push-slide",N=document.createElement("video"),L=Boolean(N.canPlayType(r.Ng).replace("no","")||m);L&&r.wG.add(r.Ng);const R=window.devicePixelRatio||1,D=!0,O=!h&&!m&&!p,Z=O?300:750},1394:(e,t,n)=>{n.d(t,{A9:()=>d,YJ:()=>a,hl:()=>u,pt:()=>s,jj:()=>i,ud:()=>c,gm:()=>l,dc:()=>f,ao:()=>h});var r=n(9118);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],r=atob(t[1]);let o=r.length;const d=new Uint8Array(o);for(;o--;)d[o]=r.charCodeAt(o);return new Blob([d],{type:n})}function a(e){return new Promise(((t,n)=>{const r=new FileReader;r.onload=e=>{const{result:r}=e.target||{};"string"==typeof r&&t(r),n(new Error("Failed to read blob"))},r.onerror=n,r.readAsDataURL(e)}))}function u(e,t){return new File([e],t,{lastModified:Date.now(),type:e.type})}function s(e){return new Promise(((t,n)=>{const r=new Image;r.onload=()=>t(r),r.onerror=n,r.src=e}))}function i(e){return new Promise(((t,n)=>{const r=document.createElement("video");r.volume=0,r.onloadedmetadata=()=>t(r),r.onerror=n,r.src=e}))}async function c(e){const t=await i(e);return Promise.race([(0,r.wO)(2e3),new Promise(((e,n)=>{t.onseeked=()=>{t.videoWidth&&t.videoHeight||e(void 0);const n=document.createElement("canvas");n.width=t.videoWidth,n.height=t.videoHeight,n.getContext("2d").drawImage(t,0,0),e(n.toDataURL("image/jpeg"))},t.onerror=n,t.currentTime=Math.min(t.duration,1)}))])}async function l(e){return(await fetch(e)).blob()}async function f(e,t){return u(await l(e),t)}function h(e){const t=document.createElement("canvas");return t.width=e.width,t.height=e.height,t.getContext("2d").drawImage(e,0,0),t}"undefined"==typeof File&&(self.File=class extends Blob{constructor(e,t,n){if(n){const{type:t,...r}=n;super(e,{type:t}),o(this,"name",void 0),Object.assign(this,r)}else super(e),o(this,"name",void 0);this.name=t}})},9937:(e,t,n)=>{function r(e,t,n="en"){return new Intl.NumberFormat(n,{style:"currency",currency:t}).format("JPY"===t?e:e/100)}n.d(t,{x:()=>r})},6926:(e,t,n)=>{n.d(t,{Z:()=>r});const r=e=>{let t;do{t=String(Math.random()).replace("0.","id")}while(e.hasOwnProperty(t));return t}},1947:(e,t,n)=>{n.d(t,{ZP:()=>d,J_:()=>a});const r={CHAT_RESTRICTED:"You can't send messages in this chat, you were restricted",CHAT_WRITE_FORBIDDEN:"You can't write in this chat",CHAT_SEND_POLL_FORBIDDEN:"You can't create polls in this chat",CHAT_SEND_STICKERS_FORBIDDEN:"You can't send stickers in this chat",CHAT_SEND_GIFS_FORBIDDEN:"You can't send gifs in this chat",CHAT_SEND_MEDIA_FORBIDDEN:"You can't send media in this chat",CHAT_LINK_EXISTS:"The chat is public, you can't hide the history to new users",SLOWMODE_WAIT_X:"Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.",USER_BANNED_IN_CHANNEL:"You're banned from sending messages in supergroups / channels",USER_IS_BLOCKED:"You were blocked by this user",YOU_BLOCKED_USER:"You blocked this user",IMAGE_PROCESS_FAILED:"Failure while processing image",MEDIA_EMPTY:"The provided media object is invalid",MEDIA_INVALID:"Media invalid",PHOTO_EXT_INVALID:"The extension of the photo is invalid",PHOTO_INVALID_DIMENSIONS:"The photo dimensions are invalid",PHOTO_SAVE_FILE_INVALID:"Internal issues, try again later",MESSAGE_DELETE_FORBIDDEN:"You can't delete one of the messages you tried to delete, most likely because it is a service message.",MESSAGE_POLL_CLOSED:"Poll closed",MESSAGE_EDIT_TIME_EXPIRED:"You can't edit this message anymore.",CHAT_ADMIN_REQUIRED:"You must be an admin in this chat to do this",PINNED_DIALOGS_TOO_MUCH:"Sorry, you can only pin 5 chats to the top",DIALOG_FILTERS_TOO_MUCH:"Sorry, you can't have more than 10 folders",CHANNEL_PRIVATE:"This channel is private",MEDIA_CAPTION_TOO_LONG:"The provided caption is too long",ADDRESS_STREET_LINE1_INVALID:"The address you provided is not valid",ADDRESS_STREET_LINE2_INVALID:"The address you provided is not valid",ADDRESS_CITY_INVALID:"The city you provided is not valid",ADDRESS_COUNTRY_INVALID:"The country you provided is not valid",ADDRESS_POSTCODE_INVALID:"The postcode you provided is not valid",ADDRESS_STATE_INVALID:"The state you provided is not valid",REQ_INFO_NAME_INVALID:"The name you provided is not valid",REQ_INFO_PHONE_INVALID:"The phone you provided is not valid",REQ_INFO_EMAIL_INVALID:"The email you provided is not valid",LINK_NOT_MODIFIED:"This discussion is already linked to the channel",MESSAGE_TOO_LONG:"Message is too long",SERVICE_WORKER_DISABLED:"Service Worker is disabled. Please reload the page without holding key.",MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS:"The provided message is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.",FRESH_RESET_AUTHORISATION_FORBIDDEN:"You can’t logout other sessions if less than 24 hours have passed since you logged on the current session",BOTS_TOO_MUCH:"There are too many bots in this chat/channel",BOT_GROUPS_BLOCKED:"This bot can't be added to groups",USERS_TOO_MUCH:"The maximum number of users has been exceeded",USER_CHANNELS_TOO_MUCH:"One of the users you tried to add is already in too many channels/supergroups",USER_KICKED:"This user was kicked from this supergroup/channel",USER_NOT_MUTUAL_CONTACT:"The provided user is not a mutual contact",USER_PRIVACY_RESTRICTED:"The user's privacy settings do not allow you to do this",INVITE_HASH_EMPTY:"The invite hash is empty",INVITE_HASH_EXPIRED:"The invite link has expired",INVITE_HASH_INVALID:"The invite hash is invalid",CHANNELS_TOO_MUCH:"You have joined too many channels/supergroups",USER_ALREADY_PARTICIPANT:"You already in the group",SCHEDULE_DATE_INVALID:"Invalid schedule date provided",WALLPAPER_DIMENSIONS_INVALID:"The wallpaper dimensions are invalid, please select another file",ADMINS_TOO_MUCH:"There are too many admins",ADMIN_RANK_EMOJI_NOT_ALLOWED:"An admin rank cannot contain emojis",ADMIN_RANK_INVALID:"The specified admin rank is invalid",FRESH_CHANGE_ADMINS_FORBIDDEN:"You were just elected admin, you can't add or modify other admins yet",INPUT_USER_DEACTIVATED:"The specified user was deleted"},o={ADDRESS_STREET_LINE1_INVALID:{field:"streetLine1",message:"Incorrect street address"},ADDRESS_STREET_LINE2_INVALID:{field:"streetLine2",message:"Incorrect street address"},ADDRESS_CITY_INVALID:{field:"city",message:"Incorrect city"},ADDRESS_COUNTRY_INVALID:{field:"countryIso2",message:"Incorrect country"},ADDRESS_POSTCODE_INVALID:{field:"postCode",message:"Incorrect post code"},ADDRESS_STATE_INVALID:{field:"state",message:"Incorrect state"},REQ_INFO_NAME_INVALID:{field:"fullName",message:"Incorrect name"},REQ_INFO_PHONE_INVALID:{field:"phone",message:"Incorrect phone"},REQ_INFO_EMAIL_INVALID:{field:"email",message:"Incorrect email"}};function d(e){const{message:t,isSlowMode:n,textParams:o}=e;if(n){const e=t.indexOf(" (caused by");return e>0?t.substring(0,e):t}let d=r[t];return d&&o&&(d=Object.keys(o).reduce(((e,t)=>e.replace(t,o[t])),d)),d}function a(e){return o[e.message]}},3592:(e,t,n)=>{n.d(t,{S:()=>d}),n(3716);var r=n(9118);function o(e){e.preventDefault(),d(e instanceof ErrorEvent?e.error:e.reason)}function d(e){console.error(e)}window.addEventListener("error",o),window.addEventListener("unhandledrejection",o),(0,r.P2)(window.alert,1e3)},782:(e,t,n)=>{function r(e,t){return e.reduce(((e,n)=>(e[n[t]]=n,e)),{})}function o(e,t){return Object.keys(e).reduce(((n,r,o)=>(n[r]=t(e[r],r,o,e),n)),{})}function d(e,t){return t.reduce(((t,n)=>(t[n]=e[n],t)),{})}function a(e,t){return t.reduce(((t,n)=>(e[n]&&(t[n]=e[n]),t)),{})}function u(e,t){const n=new Set(t.map(String));return d(e,Object.keys(e).filter((e=>!n.has(e))))}function s(e,t,n="asc"){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],[a,u]=t,s="asc"===o,i="asc"===d;return e.sort(((e,t)=>r(e,t,a,s)||r(e,t,u,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:()=>a,CE:()=>u,Xo:()=>s,xH:()=>i,Tw:()=>c,oA:()=>l,et:()=>f,YE:()=>h,eL:()=>m,Vl:()=>p,Xh:()=>g,dF:()=>y})},711:(e,t,n)=>{n.d(t,{ll:()=>p,i0:()=>w,Pn:()=>I,m0:()=>C,qf:()=>S});var r=n(5116),o=n(3716),d=n(9524),a=n(1226),u=n(6063),s=n(2155);const i=/%\d?\$?[sdf@]/g,c=["value","zeroValue","oneValue","twoValue","fewValue","manyValue","otherValue"],l={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},f=new Map;let h,m;const{addCallback:p,removeCallback:g,runCallbacks:y}=(0,u._)();let v,b;const w=(e,t,n)=>{var r,o;if(void 0!==t){const r=Array.isArray(t)?JSON.stringify(t):t,o=f.get(`${e}_${r}_${n}`);if(o)return o}if(!h&&!m)return e;const d=(null===(r=h)||void 0===r?void 0:r[e])||(null===(o=m)||void 0===o?void 0:o[e]);return d?P(d,e,t,n):(m||E(),e)};async function I(e,t){let n=await d.fetch(o.ee,`${o.$O}_${e}_${t}`,d.Type.Json);return n||(n=await async function(e,t,n){const r=await(0,a.t9)("fetchLangStrings",{langPack:e,langCode:t,keys:[n]});if(null!=r&&r.length)return await d.save(o.ee,`${e}_${t}_${n}`,r[0]),r[0]}(o.$O,e,t)),P(n,t)}async function C(e,t,n=!1){if(h&&e===v)return void(t&&t());let u=await d.fetch(o.ee,e,d.Type.Json);if(!u&&(n&&await E(),u=await async function(e){const t=await(0,a.t9)("fetchLangPack",{sourceLangPacks:o.Bg,langCode:e});if(t)return await d.save(o.ee,e,t.langPack),t.langPack}(e),!u))return;f.clear(),v=e,h=u,document.documentElement.lang=e;const{languages:s,timeFormat:i}=(0,r.Rd)().settings.byKey,c=null==s?void 0:s.find((t=>t.langCode===e));w.isRtl=Boolean(null==c?void 0:c.rtl),w.code=e,w.timeFormat=i,t&&t(),y()}function S(e){e&&e===b||(b=e,w.timeFormat=e,y())}async function E(){m||(m=(await n.e(915).then(n.bind(n,1915))).default,y())}function P(e,t,n,r){const d=e?e["number"==typeof n?function(e){const t=v||o.sR,n=l[t]?l[t](e):0;return c[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(i),r=n.shift();return n.reduce(((e,n,r)=>`${e}${String(t[r]||"")}${n}`),r||"")}(d,"i"===r?(0,s.kh)(n):n),o=Array.isArray(n)?JSON.stringify(n):n;return f.set(`${t}_${o}_${r}`,e),e}return d}},647:(e,t,n)=>{n.d(t,{cC:()=>b,he:()=>y,UV:()=>v,Iq:()=>w});var r=n(6137),o=n(3716),d=n(1226),a=n(9524),u=n(1394),s=n(7361);const i=48e3;async function c(e){const t=await new Response(e).arrayBuffer();return new Promise((e=>{const r=new Uint8Array(t);let o=new Worker(new URL(n.p+n.u(745),n.b)),d=new Worker(new URL(n.p+n.u(993),n.b));o.onmessage=e=>{null===e.data?d.postMessage({command:"done"}):d.postMessage({command:"encode",buffers:e.data},e.data.map((({buffer:e})=>e)))},d.onmessage=t=>{"page"===t.data.message&&(e(new Blob([t.data.page],{type:"audio/wav"})),o.terminate(),o=void 0,d.terminate(),d=void 0)},d.postMessage({command:"init",wavBitDepth:16,wavSampleRate:i}),o.postMessage({command:"init",decoderSampleRate:i,outputBufferSampleRate:i}),o.postMessage({command:"decode",pages:r},[r.buffer])}))}var l=n(862);const f={[r.IU.BlobUrl]:a.Type.Blob,[r.IU.Lottie]:a.Type.Blob,[r.IU.Progressive]:void 0,[r.IU.Stream]:void 0},h=new Map,m=new Map,p=new Map,g=new Map;function y(e,t,n=!1,i,v){if(t===r.IU.Progressive)return s.I_?function(e){const t=`./progressive/${e}`;return h.set(e,t),Promise.resolve(t)}(e):y(e,r.IU.BlobUrl,n,i,v);if(!m.has(e)){const i=async function(e,t,n){if(!o.Cy){const r=e.startsWith("avatar")?o.SG:o.lW,d=await a.fetch(r,e,f[t],n);if(d){let t=d;if("audio/ogg"!==d.type||s.m5||(t=await c(t)),"image/webp"===d.type&&!(0,s.on)()&&t){const n=await(0,l._y)(e,t);n&&(t=n)}const n=C(t);return h.set(e,n),n}}if(t===r.IU.Stream){const n=new MediaSource,r=URL.createObjectURL(n);let o=!1;return n.addEventListener("sourceopen",(()=>{if(o)return;o=!0;const r=n.addSourceBuffer("audio/mpeg"),a=I(e,n,r);g.set(e,a),(0,d.t9)("downloadMedia",{url:e,mediaFormat:t},a)})),h.set(e,r),r}const i=I(e);g.set(e,i);const m=await(0,d.t9)("downloadMedia",{url:e,mediaFormat:t,isHtmlAllowed:n},i);if(!m)throw new Error(`Failed to fetch media ${e}`);let{prepared:p,mimeType:y}=m;if("audio/ogg"===y&&!s.m5){const e=await(0,u.gm)(p);URL.revokeObjectURL(p);const t=await c(e);p=C(t),y=t.type}if("image/webp"===y&&!(0,s.on)()){const t=await(0,u.gm)(p);URL.revokeObjectURL(p);const n=await(0,l._y)(e,t);n&&(p=C(n))}return h.set(e,p),p}(e,t,n).catch((e=>{o.eM&&console.warn(e)})).finally((()=>{m.delete(e),p.delete(e),g.delete(e)}));m.set(e,i)}if(i&&v){let t=p.get(e);t||(t=new Map,p.set(e,t)),t.set(v,i)}return m.get(e)}function v(e){return h.get(e)}function b(e){p.forEach(((t,n)=>{t.forEach((t=>{if(t===e){const e=g.get(n);if(!e)return;(0,d.u3)(e),g.delete(n),p.delete(n)}}))}))}function w(e,t){const n=p.get(e);n&&n.delete(t)}function I(e,t,n){const r=(o,d)=>{var a;null===(a=p.get(e))||void 0===a||a.forEach((e=>{e(o),e.isCanceled&&(r.isCanceled=!0)})),1===o&&(null==t||t.endOfStream()),d&&(null==n||n.appendBuffer(d))};return r}function C(e){return e instanceof Blob?URL.createObjectURL(e):e}s.I_&&navigator.serviceWorker.addEventListener("message",(async e=>{const{type:t,messageId:n,params:o}=e.data;if("requestPart"!==t)return;const a=await(0,d.t9)("downloadMedia",{mediaFormat:r.IU.Progressive,...o});if(!a)return;const{arrayBuffer:u,mimeType:s,fullSize:i}=a;navigator.serviceWorker.controller.postMessage({type:"partResponse",messageId:n,result:{arrayBuffer:u,mimeType:s,fullSize:i}},[u])}))},735:(e,t,n)=>{n.d(t,{D:()=>r});const r=[]},9203:(e,t,n)=>{n.d(t,{gl:()=>d,$y:()=>c,o5:()=>l,Qt:()=>f});var r=n(3716),o=n(6063);let d;!function(e){e[e.Auth=0]="Auth",e[e.Main=1]="Main",e[e.Extra=2]="Extra",e[e.Calls=3]="Calls"}(d||(d={}));const a={},u={},{addCallback:s,runCallbacks:i}=(0,o._)();async function c(e,t){if(!a[e]){switch(e){case d.Auth:a[d.Auth]=n.e(133).then(n.bind(n,1133));break;case d.Main:r.eM&&console.log(">>> START LOAD MAIN BUNDLE"),a[d.Main]=Promise.all([n.e(830),n.e(37),n.e(884),n.e(163)]).then(n.bind(n,4163));break;case d.Extra:a[d.Extra]=Promise.all([n.e(830),n.e(37),n.e(442)]).then(n.bind(n,1442));break;case d.Calls:a[d.Calls]=Promise.all([n.e(830),n.e(884),n.e(532)]).then(n.bind(n,7936))}a[e].then(i)}const o=await a[e];return u[e]||(u[e]=o),l(e,t)}function l(e,t){const n=u[e];if(n)return n[t]}const f=s},8406:(e,t,n)=>{n.d(t,{q3:()=>v,Nz:()=>b,r1:()=>C,Ld:()=>E,zP:()=>P,Vr:()=>M,KC:()=>A});var r=n(1226),o=n(6137),d=n(8005),a=n(3716),u=n(5116),s=n(2858),i=n(711),c=n(9959),l=n(1638),f=n(7361),h=n(647),m=n(9118);function p(e){const t=e.toJSON();return JSON.stringify({endpoint:t.endpoint,keys:t.keys})}function g(){return!!f.Mc&&("showNotification"in ServiceWorkerRegistration.prototype?"denied"===Notification.permission?(a.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):"PushManager"in window||(a.eM&&console.warn("[PUSH] Push messaging isn't supported."),!1):(a.eM&&console.warn("[PUSH] Push notifications aren't supported."),!1))}const y=new Set;async function v(e,t){if(void 0!==e&&y.has(e))return;const{notificationSoundVolume:n}=(0,l.dZ)((0,u.Rd)()),r=t?t/10:n/10;if(0===r)return;const o=new Audio("./notification.mp3");o.volume=r,o.setAttribute("mozaudiochannel","notification"),void 0!==e&&(o.addEventListener("ended",(()=>{y.add(e)}),{once:!0}),setTimeout((()=>{y.delete(e)}),3e3));try{await o.play()}catch(e){a.eM&&console.warn("[PUSH] Unable to play notification sound")}}const b=(0,m.Ds)(v,1e3,!0,!1);async function w(){"Notification"in window&&(["granted","denied"].includes(Notification.permission)||await Notification.requestPermission())}async function I(e){const t=(0,u.Rd)(),n=(0,u.uC)();if(e)try{const t=p(e);return await(0,r.t9)("unregisterDevice",t),await e.unsubscribe(),void n.deleteDeviceToken()}catch(e){a.eM&&console.log("[PUSH] Unable to unsubscribe from push.",e)}t.push&&(await(0,r.t9)("unregisterDevice",t.push.deviceToken),n.deleteDeviceToken())}async function C(){if(!g())return;const e=await navigator.serviceWorker.ready,t=await e.pushManager.getSubscription();await I(t)}let S=!1;async function E(){if(!g())return void await w();const e=await navigator.serviceWorker.ready;let t=await e.pushManager.getSubscription();if(function(e){const t=(0,u.Rd)();return!t.push||!e||p(e)!==t.push.deviceToken||Date.now()-t.push.subscribedAt>432e5}(t)){await I(t);try{t=await e.pushManager.subscribe({userVisibleOnly:!0});const n=p(t);a.eM&&console.log("[PUSH] Received push subscription: ",n),await(0,r.t9)("registerDevice",n),(0,u.uC)().setDeviceToken(n)}catch(e){"denied"===Notification.permission?a.eM&&console.warn("[PUSH] The user has blocked push notifications."):a.eM&&(console.log("[PUSH] Unable to subscribe to push.",e),e.code===DOMException.ABORT_ERR&&await w())}}}async function P({chat:e,message:t}){const{hasWebNotifications:n}=await async function(){if(S)return(0,l.dZ)((0,u.Rd)());const[e,t]=await Promise.all([(0,r.t9)("fetchNotificationSettings",{serverTimeOffset:(0,u.Rd)().serverTimeOffset}),(0,r.t9)("fetchNotificationExceptions",{serverTimeOffset:(0,u.Rd)().serverTimeOffset})]);if(!e)return(0,l.dZ)((0,u.Rd)());let n=(0,c.BI)((0,u.Rd)(),e);return t&&(n=(0,c.aJ)(n,t)),(0,u.R3)(n),S=!0,(0,l.dZ)(n)}();if(!function(e){if(!S)return!1;const t=(0,u.Rd)();return!((0,s.i4)(e,(0,l.dZ)(t),(0,l.NJ)(t))||e.isNotJoined||!e.isListed||document.hasFocus())}(e))return;const f="Notification"in window?"denied"!==Notification.permission||(a.eM&&console.warn("[PUSH] The user has blocked push notifications."),!1):(a.eM&&console.warn("[PUSH] This browser does not support desktop notification"),!1);if(!n||!f)return void b(String(t.id)||e.id);if(!f)return;if(!t.id)return;const{title:m,body:p}=function(e,t){const n=(0,u.Rd)(),{senderId:r,replyToMessageId:o}=t,a=r?(0,l.dy)(n,r):void 0,c=(0,s.N5)(t),f=c&&o?(0,l.hj)(n,e.id,o):void 0,{targetUserIds:h,targetChatId:m}=c||{},p=h?h.map((e=>(0,l.dy)(n,e))).filter(Boolean):void 0,g=(0,s.zX)(e),y=g?(0,l.dy)(n,g):void 0;let v;if((0,s.Sm)(e,(0,l.dZ)(n),(0,l.NJ)(n)))if((0,s.Lo)(t)){const n=e&&((0,s.eA)(e)||t.senderId===t.chatId)?e:a;v=(0,d.D)(i.i0,t,n,p,f,m,{asPlain:!0})}else{const n=(0,s.zF)(i.i0,e.id,a),r=(0,s.MK)(i.i0,t);v=n?`${n}: ${r}`:r}else v="New message";return{title:(0,s.U)(i.i0,e,y),body:v}}(e,t),y=await async function(e){const t=(0,s.RT)(e);if(!t)return;let n=h.UV(t);return n||(await h.he(t,o.IU.BlobUrl),n=h.UV(t)),n}(e);if(g()){var v;null!==(v=navigator.serviceWorker)&&void 0!==v&&v.controller&&navigator.serviceWorker.controller.postMessage({type:"newMessageNotification",payload:{title:m,body:p,icon:y,chatId:e.id,messageId:t.id}})}else{const n=(0,u.uC)(),r={body:p,icon:y,badge:y,tag:String(t.id)};"vibrate"in navigator&&(r.vibrate=[200,100,200]);const o=new Notification(m,r);o.onclick=()=>{o.close(),n.focusMessage({chatId:e.id,messageId:t.id}),window.focus&&window.focus()},o.onshow=()=>{b(String(t.id)||e.id)}}}function M(e){var t;!a.Cg&&null!==(t=navigator.serviceWorker)&&void 0!==t&&t.controller&&navigator.serviceWorker.controller.postMessage({type:"closeMessageNotifications",payload:e})}function A(){var e;null!==(e=navigator.serviceWorker)&&void 0!==e&&e.controller&&navigator.serviceWorker.controller.postMessage({type:"clientReady"})}},7926:(e,t,n)=>{n.d(t,{L:()=>d,$:()=>a});const r="kz_version",o=["Z","K"];function d(e){localStorage.setItem(r,JSON.stringify(e))}function a(){(function(){const e=localStorage.getItem(r);if(!e)return!1;try{const t=JSON.parse(e);return o.includes(t)}catch(e){return!1}})()||d("Z")}},6272:(e,t,n)=>{n.d(t,{U9:()=>a,g3:()=>u,un:()=>s,WZ:()=>i});var r=n(782);const o="X",d="XXX XXX XXX XXX";function a(e,t){return e.filter((e=>e.iso2===t))}function u(e,t=""){var n;let o=t.replace(/[^\d+]+/g,"");o.startsWith("+")&&(o=o.substr(1));const d=e.filter((e=>o.startsWith(e.countryCode))),a=(0,r.xH)(d.map((e=>(e.prefixes||[""]).map((t=>({code:`${e.countryCode}${t}`,country:e})))))).filter((({code:e})=>o.startsWith(e))).sort(((e,t)=>e.code.length-t.code.length));return null===(n=a[a.length-1])||void 0===n?void 0:n.country}function s(e,t){let n=e.replace(/[^\d]+/g,"");if(t)n=n.substr(t.countryCode.length);else if(e.startsWith("+"))return e;const r=function(e,t){if(!t||0===t.length)return d;if(1===t.length)return t[0];const n=t.find((e=>e.startsWith(o)))||d,r=t.filter((t=>{const n=t.replace(/[^\dX]+/g,"");if(n.startsWith(o))return!1;for(let t=0;tn.length-1||n[t]!==o&&n[t]!==e[t])return!1;return!0}));return 1===r.length?r[0]:n}(n,null==t?void 0:t.patterns),a=[];let u=0;for(let e=0;e{n.d(t,{q:()=>o,V:()=>d});var r=n(6137);const o=e=>e.chatId.toString()+("thread"!==e.type?`_${e.type}`:-1!==e.threadId?`_${e.threadId}`:""),d=e=>{if(!e)return;const[t,n]=e.replace(/^#/,"").split("_");if(!t)return;const o=["thread","pinned","scheduled"].includes(n);return{chatId:t,type:n&&o?n:"thread",threadId:n&&!o?Number(n):r._f}}},9118:(e,t,n)=>{function r(e,t,n=!0,r=!0){let o;return(...d)=>{o?(clearTimeout(o),o=void 0):n&&e(...d),o=self.setTimeout((()=>{r&&e(...d),o=void 0}),t)}}function o(e,t,n=!0){let r,o,d;return(...a)=>{o=!0,d=a,r||(n&&(o=!1,e(...d)),r=self.setInterval((()=>{if(!o)return self.clearInterval(r),void(r=void 0);o=!1,e(...d)}),t))}}function d(e){return s(y,e)}function a(e){return s(v,e)}function u(e){return s(b,e)}function s(e,t){let n,r=!1;return(...o)=>{n=o,r||(r=!0,e((()=>{r=!1,t(...n)})))}}function i(e,t){self.requestIdleCallback?self.requestIdleCallback(e,{timeout:t}):b(e)}n.d(t,{Ds:()=>r,P2:()=>o,mS:()=>d,wT:()=>a,$6:()=>u,Q8:()=>i,wO:()=>c,Pn:()=>l,T2:()=>y,D0:()=>v,R3:()=>b,zD:()=>w,Gq:()=>I});const c=e=>new Promise((t=>{setTimeout((()=>t()),e)}));function l(){return new Promise((e=>{y(e)}))}let f,h,m,p,g;function y(e,t=!1){f?t?h.push(e):f.push(e):(f=t?[]:[e],h=t?[e]:[],requestAnimationFrame((()=>{const e=f,t=h;f=void 0,h=void 0,t.forEach((e=>e())),e.forEach((e=>e()))})))}function v(e){y(e,!0)}function b(e,t=!1){m?t?p.push(e):m.push(e):(m=t?[]:[e],p=t?[e]:[],Promise.resolve().then((()=>{const e=m,t=p;m=void 0,p=void 0,t.forEach((e=>e())),e.forEach((e=>e()))})))}function w(e){b(e,!0)}function I(e,t=!1){return g||(g=[],self.addEventListener("beforeunload",(()=>{g.forEach((e=>e()))}))),t?g.push(e):g.unshift(e),()=>{g=g.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 a=n(3716),u=n(9524);const s=[1,2,3,4,5];function i(e=!1){if(e&&localStorage.getItem(a.Vx))return!0;const t=localStorage.getItem(a.b_);if(!t)return!1;try{const e=JSON.parse(t);return Boolean(e&&e.id&&e.dcID)}catch(e){return!1}}function c(e,t){const{mainDcId:n,keys:r,hashes:o}=e;localStorage.setItem(a.b_,JSON.stringify({dcID:n,id:t})),localStorage.setItem("dc",String(n)),Object.keys(r).map(Number).forEach((e=>{localStorage.setItem(`dc${e}_auth_key`,JSON.stringify(r[e]))})),o&&Object.keys(o).map(Number).forEach((e=>{localStorage.setItem(`dc${e}_hash`,JSON.stringify(o[e]))}))}function l(){[a.b_,"dc",...s.map((e=>`dc${e}_auth_key`)),...s.map((e=>`dc${e}_hash`))].forEach((e=>{localStorage.removeItem(e)}))}function f(){if(!i())return;const e=JSON.parse(localStorage.getItem(a.b_)),t=Number(e.dcID),n={},r={};return s.forEach((e=>{try{const t=localStorage.getItem(`dc${e}_auth_key`);t&&(n[e]=JSON.parse(t));const o=localStorage.getItem(`dc${e}_hash`);o&&(r[e]=JSON.parse(o))}catch(e){a.eM&&console.warn("Failed to load stored session",e)}})),Object.keys(n).length?{mainDcId:t,keys:n,hashes:r}:void 0}async function h(){const e=localStorage.getItem(a.Vx);if(!e)return;const t=await function(e,t=d()){return t("readonly",(t=>r(t.get(e))))}(`GramJs:${e}`);try{c(JSON.parse(t))}catch(e){a.eM&&console.warn("Failed to load legacy session",e)}}async function m(){localStorage.removeItem(a.Vx);const e=await function(e=d()){const t=[];return function(e,t){return e("readonly",(e=>(e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},r(e.transaction))))}(e,(e=>t.push(e.key))).then((()=>t))}();await Promise.all([u.clear("GramJs"),...e.filter((e=>"string"==typeof e&&e.startsWith("GramJs:GramJs-session-"))).map((e=>function(e,t=d()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}(e)))])}},6917:(e,t,n)=>{n.d(t,{Z:()=>l});var r=n(9933),o=n(9118);const d=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"],"--color-message-reaction":["#ebf3fd","#2b2a35"],"--color-message-reaction-hover":["#c5def9","#343147"],"--color-message-reaction-own":["#cef0ba","#7a68ca"],"--color-message-reaction-hover-own":["#b5e0a4","#7567bc"]}');let a=!1;const u=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i,s=new Set(["--color-primary-shade","--color-text-secondary"]),i=(e,t,n)=>(1-n)*e+n*t,c=Object.keys(d).map((e=>({property:e,colors:[f(d[e][0]),f(d[e][1])]}))),l=(e,t)=>{const n="dark"===e,d=a&&t,u=n?0:1,s=n?1:0,i=Date.now(),c=document.querySelector('meta[name="theme-color"]');document.documentElement.classList.remove("theme-"+(n?"light":"dark")),a&&document.documentElement.classList.add("no-animations"),document.documentElement.classList.add(`theme-${e}`),c&&c.setAttribute("content",n?"#212121":"#fff"),setTimeout((()=>{document.documentElement.classList.remove("no-animations")}),500),a=!0,d?(0,o.T2)((()=>{(0,r.cK)((()=>{const e=Math.min((Date.now()-i)/200,1);return h(u,s,function(e){return 1-(1-e)**3.5}(e)),e<1}))})):h(u,s)};function f(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 h(e,t,n=1){c.forEach((({property:r,colors:o})=>{const d=Math.round(i(o[e].r,o[t].r,n)),a=Math.round(i(o[e].g,o[t].g,n)),u=Math.round(i(o[e].b,o[t].b,n)),c=void 0!==o[e].a?Math.round(i(o[e].a,o[t].a,n)):void 0;document.documentElement.style.setProperty(r,void 0!==c?`rgba(${d},${a},${u},${c/255})`:`rgb(${d},${a},${u})`),s.has(r)&&document.documentElement.style.setProperty(`${r}-rgb`,`${d},${a},${u}`)}))}},2155:(e,t,n)=>{n.d(t,{kh:()=>d,bi:()=>u,Xv:()=>s});var r=n(3681),o=n(4284);function d(e){return String(e).replace(/\d(?=(\d{3})+$)/g,"$& ")}function a(e){return".0"===String(e.toFixed(1)).substr(-2)?Math.round(e):e.toFixed(1).replace(".",",")}function u(e){return e<1e3?e:e<1e6?`${a(e/1e3)}K`:`${a(e/1e6)}M`}function s(e,t=2){return e.replace(/[.,!@#$%^&*()_+=\-`~[\]/\\{}:"|<>?]+/gi,"").trim().split(/\s+/).slice(0,t).map((e=>{if(!e.length)return"";const t=(e=(0,o.g6)(e)).match(r.Z);return t&&e.startsWith(t[0])?t[0]:e.match(/./u)[0].toUpperCase()})).join("")}},8035:(e,t,n)=>{function r(e,t=30){return!e||e.length<=t?e:`${e.substr(0,t)}...`}n.d(t,{Z:()=>r})},862:(e,t,n)=>{n.d(t,{Hu:()=>s,_y:()=>i,p6:()=>c});var r=n(7361),o=n(1394),d=n(9118);let a,u;const s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";async function i(e,t){for(l();!u.wasmReady;)await(0,d.wO)(2e3);const{result:n,width:r,height:o}=await function(e,t){return new Promise((n=>{u.requests||(u.requests=new Map),u.requests.set(e,n),u.postMessage({id:e,blob:t})}))}(e,t);if(r&&o)return function({result:e,width:t,height:n}){return a||(a=document.createElement("canvas")),new Promise((r=>{const o=new ImageData(e,t,n);a.width=t,a.height=n,a.getContext("2d").putImageData(o,0,0),a.toBlob((e=>{r(null!=e?e:void 0)}),"image/png",1)}))}({result:n,width:r,height:o})}async function c(e,t){if((0,r.on)()||"data:image/webp"!==t.substr(0,15))return t;l();const n=await i(e,(0,o.A9)(t));if(!n)throw new Error(`Can't convert webp to png. Url: ${t}`);return(0,o.YJ)(n)}function l(){u||(u=new Worker(new URL(n.p+n.u(536),n.b)),u.wasmReady=!1,u.onmessage=f)}function f(e){const{id:t}=e.data;switch(e.data.type){case"initialized":u.wasmReady=!0;break;case"result":if(u.requests.has(t)){const n=u.requests.get(t);u.requests.delete(t),n(e.data)}}}},1622:(e,t,n)=>{n.d(t,{IT:()=>l,px:()=>f,W8:()=>h});var r=n(3716),o=n(5116),d=n(4688);const a=["t.me","telegram.me"].map((e=>`//${e}/_websync_?`)),u=`${r.Ji} Z`,s="tgme_sync",i=()=>Math.floor(Number(new Date)/1e3);let c;const l=e=>{const t=i(),{canRedirect:n,ts:r}=JSON.parse(localStorage.getItem(s)||"{}");return n!==e||r+86400<=t?Promise.all(a.map((t=>new Promise(((n,r)=>{const o=document.createElement("script"),d=()=>!!document.body.removeChild(o);o.src=t+new URLSearchParams({authed:Number(e).toString(),version:u}),document.body.appendChild(o),o.onload=()=>{(e=>{const t=i();localStorage.setItem(s,JSON.stringify({canRedirect:e,ts:t}))})(e),d(),c&&(clearTimeout(c),c=void 0),f(),n()},o.onerror=()=>{d(),r()}}))))):Promise.resolve()};function f(){if(r.eM)return;if(void 0!==c)return;const e=i(),{ts:t}=JSON.parse(localStorage.getItem(s)||"{}"),n=86400-(e-t);c=setTimeout((()=>{const{authState:e}=(0,o.Rd)(),t="authorizationStateReady"===e||(0,d.ti)(!0);l(t)}),Math.max(0,1e3*n))}function h(){localStorage.removeItem(s)}},3858:(e,t,n)=>{n.d(t,{z:()=>l,Z:()=>h});var r=n(9118),o=n(3716),d=n(7361);const a=d.wB&&f(),u=window.innerHeight;let s=l(),i=!1;const c=(0,r.P2)((()=>{s=l(),!i&&((s.width<=o.l3||s.width<=o.u_&&s.height<=o.rO)!==d.wB||d.wB&&a!==f())&&window.location.reload()}),250,!0);function l(){let e;e=d.cj?window.visualViewport.height+window.visualViewport.pageTop:window.innerHeight;const t=.01*e;return document.documentElement.style.setProperty("--vh",`${t}px`),{width:window.innerWidth,height:window.innerHeight}}function f(){return d.cj?window.matchMedia("(orientation: landscape)").matches:window.matchMedia("screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)").matches}window.addEventListener("orientationchange",c),d.cj?window.visualViewport.addEventListener("resize",c):window.addEventListener("resize",c);const h={get:()=>s,getIsKeyboardVisible:()=>u>s.height,disableRefresh:function(){i=!0},enableRefresh:function(){i=!1}}},5359:(e,t,n)=>{e.exports=n.p+"app-inactive.bc7953c2dfebcabce2c4..png"},2162:(e,t,n)=>{e.exports=n.p+"monkey.a3d5fcdc50b18dc55695..svg"},4128:(e,t,n)=>{e.exports=n.p+"telegram-logo.1b2bb5b107f046ea9325..svg"}},u={};function s(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return a[e].call(n.exports,n,n.exports,s),n.exports}s.m=a,s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,s.t=function(n,r){if(1&r&&(n=this(n)),8&r)return n;if("object"==typeof n&&n){if(4&r&&n.__esModule)return n;if(16&r&&"function"==typeof n.then)return n}var o=Object.create(null);s.r(o);var d={};e=e||[null,t({}),t([]),t(t)];for(var a=2&r&&n;"object"==typeof a&&!~e.indexOf(a);a=t(a))Object.getOwnPropertyNames(a).forEach((e=>d[e]=()=>n[e]));return d.default=()=>n,s.d(o,d),o},s.d=(e,t)=>{for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce(((t,n)=>(s.f[n](e,t),t)),[])),s.u=e=>e+"."+{37:"9e975e031ef296075093",99:"f03a947e6e336feffec8",133:"9dfaaf583ccedfce4e17",161:"286d0207d962142ad548",163:"c69a8648aa1c99ba6248",354:"1679b9bab979435e8c49",442:"f81b4eb30975dff27660",472:"21e5264f606f2b525030",501:"72ce4b6e27f459e194cd",524:"4f91b5e8a34fdeca4cde",532:"a137aefcf87d9a57c87e",536:"55dc7dd4ab42a2c9f037",626:"78013a2baf2a84ee2a6e",745:"9316c5c2b711c39a20a5",830:"73181e239801042afb0c",884:"c8f1b9920de862fb45af",915:"0588cdc78683d0e9bbbc",941:"257681469163c1c58f3b",993:"f0aad9f6787f211b4e51"}[e]+".js",s.miniCssF=e=>e+"."+{37:"9e975e031ef296075093",133:"9dfaaf583ccedfce4e17",163:"c69a8648aa1c99ba6248",442:"f81b4eb30975dff27660",472:"21e5264f606f2b525030",532:"a137aefcf87d9a57c87e"}[e]+".css",s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n={},r="telegram-t:",s.l=(e,t,o,d)=>{if(n[e])n[e].push(t);else{var a,u;if(void 0!==o)for(var i=document.getElementsByTagName("script"),c=0;c{a.onerror=a.onload=null,clearTimeout(h);var o=n[e];if(delete n[e],a.parentNode&&a.parentNode.removeChild(a),o&&o.forEach((e=>e(r))),t)return t(r)},h=setTimeout(f.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=f.bind(null,a.onerror),a.onload=f.bind(null,a.onload),u&&document.head.appendChild(a)}},s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;s.g.importScripts&&(e=s.g.location+"");var t=s.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),s.p=e})(),o=e=>new Promise(((t,n)=>{var r=s.miniCssF(e),o=s.p+r;if(((e,t)=>{for(var n=document.getElementsByTagName("link"),r=0;r{var o=document.createElement("link");o.rel="stylesheet",o.type="text/css",o.onerror=o.onload=d=>{if(o.onerror=o.onload=null,"load"===d.type)n();else{var a=d&&("load"===d.type?"missing":d.type),u=d&&d.target&&d.target.href||t,s=new Error("Loading CSS chunk "+e+" failed.\n("+u+")");s.code="CSS_CHUNK_LOAD_FAILED",s.type=a,s.request=u,o.parentNode.removeChild(o),r(s)}},o.href=t,document.head.appendChild(o)})(e,o,t,n)})),d={179:0},s.f.miniCss=(e,t)=>{d[e]?t.push(d[e]):0!==d[e]&&{37:1,133:1,163:1,442:1,472:1,532:1}[e]&&t.push(d[e]=o(e).then((()=>{d[e]=0}),(t=>{throw delete d[e],t})))},(()=>{s.b=document.baseURI||self.location.href;var e={179:0};s.f.j=(t,n)=>{var r=s.o(e,t)?e[t]:void 0;if(0!==r)if(r)n.push(r[2]);else{var o=new Promise(((n,o)=>r=e[t]=[n,o]));n.push(r[2]=o);var d=s.p+s.u(t),a=new Error;s.l(d,(n=>{if(s.o(e,t)&&(0!==(r=e[t])&&(e[t]=void 0),r)){var o=n&&("load"===n.type?"missing":n.type),d=n&&n.target&&n.target.src;a.message="Loading chunk "+t+" failed.\n("+o+": "+d+")",a.name="ChunkLoadError",a.type=o,a.request=d,r[1](a)}}),"chunk-"+t,t)}};var t=(t,n)=>{var r,o,[d,a,u]=n,i=0;if(d.some((t=>0!==e[t]))){for(r in a)s.o(a,r)&&(s.m[r]=a[r]);u&&u(s)}for(t&&t(n);i{s(3592);var e=s(3716),t=s(5116),n=s(7361),r=s(8406);function o(n){const o=n.data;if(e.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 a=s(2916);const u={isLeftColumnShown:!0,isChatInfoShown:!1,newChatMembersProgress:s(1713).WB.Closed,uiReadyState:0,serverTimeOffset:0,authRememberMe:!0,countryList:{phoneCodes:[],general:[]},blocked:{ids:[],totalCount:0},users:{byId:{},statusesById:{}},chats:{listIds:{},isFullyLoaded:{},orderedPinnedIds:{},totalCount:{},byId:{}},messages:{byChatId:{},messageLists:[],sponsoredByChatId:{}},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:{},activeReactions:{},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={...u,...(0,f.ei)(n,["authState","authPhoneNumber","authRememberMe","authNearestCountry","currentUserId","contactList","topPeers","topInlineBots","recentEmojis","push","shouldShowContextMenuHint","leftColumnWidth","serviceNotifications"]),audioPlayer:{volume:n.audioPlayer.volume,playbackRate:n.audioPlayer.playbackRate,isMuted:n.audioPlayer.isMuted},isChatInfoShown: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),availableReactions:L(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),a=Object.keys(n),u=d.concat(a).slice(0,e.lO);return{byId:(0,f.ei)(n,u),statusesById:(0,f.ei)(r,u),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:[],sponsoredByChatId:{}}}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}}function L(e){var t;return null===(t=e.availableReactions)||void 0===t?void 0:t.map((e=>(0,f.ei)(e,["reaction","staticIcon","title","isInactive"])))}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)(u);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:a,...u}=t.settings.byKey;t.settings.byKey={...u,canAutoLoadPhotoFromContacts:e,canAutoLoadVideoFromContacts:e,canAutoLoadPhotoInPrivateChats:n,canAutoLoadVideoInPrivateChats:n,canAutoLoadPhotoInGroups:r,canAutoLoadVideoInGroups:r,canAutoLoadPhotoInChannels:o,canAutoLoadVideoInChannels:o,canAutoPlayVideos:d,canAutoPlayGifs:a}}t.settings.byKey={...n.settings.byKey,...t.settings.byKey},t.settings.themes={...n.settings.themes,...t.settings.themes},t.chatFolders={...n.chatFolders,...t.chatFolders},t.stickers.greeting||(t.stickers.greeting=n.stickers.greeting),t.activeDownloads||(t.activeDownloads={byChatId:{}}),t.serviceNotifications||(t.serviceNotifications=[]),void 0===t.audioPlayer.volume&&(t.audioPlayer.volume=e.Qx),void 0===t.audioPlayer.playbackRate&&(t.audioPlayer.playbackRate=e.mw),t.groupCalls||(t.groupCalls=n.groupCalls),t.users.statusesById||(t.users.statusesById={}),t.messages.sponsoredByChatId||(t.messages.sponsoredByChatId={}),t.activeReactions||(t.activeReactions={})}(o,t);const d={...t,...o},a=n.wB?void 0:(0,p.V)(g.Oy);return{...d,messages:{...d.messages,messageLists:a?[a]:[]}}}(t)):void C()}(t)||t}));var R=s(4050),D=s(3858);const O="tt-active-tab",Z=String(Date.now()+Math.random());let _;localStorage.setItem(O,Z);const x=window.setInterval((()=>{_&&localStorage.getItem(O)!==Z&&(_(),clearInterval(x))}),2e3);var F=s(706),B=(s(7895),s(3781),s(1363),s(9667),s(4907),s(8332)),$=s(1212),U=s(1394);const j=["400 1em Roboto","500 1em Roboto"];function W(){if("fonts"in document)return Promise.all(j.map((e=>document.fonts.load(e))))}var G=s(647),V=s(9203),H=s(6752),z=s(4128),Q=s(2162);function K(){const{listIds:e,byId:n}=(0,t.Rd)().chats;if(e.active)return Promise.all(e.active.slice(0,10).map((e=>{const t=n[e];if(!t)return;const r=(0,B.RT)(t);return r?G.he(r,i.IU.BlobUrl):void 0})))}const J={main:()=>Promise.all([(0,V.$y)(V.gl.Main,"Main").then(W),K()]),authPhoneNumber:()=>Promise.all([W(),(0,U.pt)(z)]),authCode:()=>(0,U.pt)(Q),authPassword:()=>(0,U.pt)(Q),authQrCode:W},q=(0,t.c$)((e=>{const t=(0,h.Pu)(e),{background:n,backgroundColor:r}=e.settings.themes[t]||{};return{shouldSkipHistoryAnimations:e.shouldSkipHistoryAnimations,uiReadyState:e.uiReadyState,hasCustomBackground:Boolean(n),hasCustomBackgroundColor:Boolean(r),isRightColumnShown:(0,h.Jf)(e),leftColumnWidth:e.leftColumnWidth}}))((({page:e,children:n,hasCustomBackground:r,hasCustomBackgroundColor:o,isRightColumnShown:d,shouldSkipHistoryAnimations:a,leftColumnWidth:u})=>{const{setIsUiReady:s}=(0,t.uC)(),[i,l]=(0,F.Z)(),{shouldRender:f,transitionClassNames:h}=(0,$.Z)(!i,void 0,!0);return(0,R.d4)((()=>{let t;return Promise.race([(0,c.wO)(700),(async()=>{try{await J[e]()}catch(e){}})()]).then((()=>{l(),s({uiReadyState:1}),t=window.setTimeout((()=>{s({uiReadyState:2})}),1e3)})),()=>{t&&(clearTimeout(t),t=void 0),s({uiReadyState:0})}}),[]),R.ZP.createElement("div",{id:"UiLoader"},n,f&&!a&&R.ZP.createElement("div",{className:(0,H.Z)("mask",h)},"main"===e?R.ZP.createElement(R.ZP.Fragment,null,R.ZP.createElement("div",{className:"left",style:u?`width: ${u}px`:void 0}),R.ZP.createElement("div",{className:(0,H.Z)("middle",r&&"custom-bg-image",o&&"custom-bg-color",d&&"with-right-column")}),d&&R.ZP.createElement("div",{className:"right"})):R.ZP.createElement("div",{className:"blank"})))}));var Y=s(6272),X=s(711),ee=s(9107);const te=(e,t)=>{const[n,r]=(0,R.eJ)();return e&&X.Pn(e,t).then(r),n};function ne(){let e=navigator.language;return e&&"pt-br"!==e&&(e=e.substr(0,2)),e}var re=s(231),oe=s(4605),de=s(7687),ae=s(4288),ue=s(5765),se=s(2340),ie=s(4284),ce=s(9290),le=s(3106),fe=s(8964),he=s(9204);const me=200+e.fK,pe=(0,R.X$)((0,t.c$)((e=>{const{countryList:{phoneCodes:t}}=e;return{phoneCodeList:t}}))((({id:e,value:t,isLoading:n,onChange:r,phoneCodeList:o})=>{const d=(0,ee.Z)(),a=(0,R.sO)(null),[u,s]=(0,R.eJ)(),[i,c]=(0,R.eJ)([]),l=(0,R.I4)((e=>{s(e),c(function(e,t=""){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,ce.Z)((([e])=>{0===(null==e?void 0:e.length)&&o.length>0&&l(u)}),[o,l]);const f=(0,R.I4)((e=>{r(e),setTimeout((()=>l(void 0)),me)}),[r,l]),h=(0,R.I4)((e=>{l(e.currentTarget.value)}),[l]),m=(0,R.I4)((e=>{if(8!==e.keyCode)return;const n=e.currentTarget;t&&void 0===u&&(n.value=""),l(n.value)}),[u,l,t]);return R.ZP.createElement(le.Z,{className:"CountryCodeInput",trigger:({onTrigger:r,isOpen:o})=>{const s=()=>{if(o)return;setTimeout((()=>{a.current.select()}),50),r();const e=document.getElementById("auth-phone-number-form");e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},i=null!=u?u:(null==t?void 0:t.name)||(null==t?void 0:t.defaultName)||"";return R.ZP.createElement("div",{className:(0,H.Z)("input-group",t&&"touched")},R.ZP.createElement("input",{ref:a,className:(0,H.Z)("form-control",o&&"focus"),type:"text",id:e,value:i,autoComplete:"off",onClick:s,onFocus:s,onInput:e=>{h(e),s()},onKeyDown:m}),R.ZP.createElement("label",null,d("Login.SelectCountry.Title")),n?R.ZP.createElement(he.Z,{color:"black"}):R.ZP.createElement("i",{onClick:s,className:(0,H.Z)("css-icon-down",o&&"open")}))}},i.map((e=>R.ZP.createElement(fe.Z,{key:e.iso2,className:t&&e.iso2===t.iso2?"selected":"",onClick:()=>f(e)},R.ZP.createElement("span",{className:"country-flag"},(0,se.Z)((0,ie.Wg)(e.iso2),["hq_emoji"])),R.ZP.createElement("span",{className:"country-name"},e.name||e.defaultName),R.ZP.createElement("span",{className:"country-code"},e.countryCode)))),!i.length&&R.ZP.createElement(fe.Z,{key:"no-results",className:"no-results",disabled:!0},R.ZP.createElement("span",null,d("lng_country_none"))))})));let ge=!1;const ye=(0,R.X$)((0,t.c$)((e=>{const{settings:{byKey:{language:t}},countryList:{phoneCodes:n}}=e;return{...(0,f.ei)(e,["connectionState","authState","authPhoneNumber","authIsLoading","authIsLoadingQrCode","authError","authRememberMe","authNearestCountry"]),language:t,phoneCodeList:n}}))((({connectionState:e,authState:r,authPhoneNumber:o,authIsLoading:d,authIsLoadingQrCode:a,authError:u,authRememberMe:s,authNearestCountry:i,phoneCodeList:c,language:l})=>{const{setAuthPhoneNumber:f,setAuthRememberMe:h,loadNearestCountry:m,loadCountryList:p,clearAuthError:g,goToAuthQrCode:y,setSettingOption:v}=(0,t.uC)(),b=(0,ee.Z)(),w=(0,R.sO)(null),I=ne(),C=te(I,"ContinueOnThisLanguage"),[S,E]=(0,R.eJ)(),[P,M]=(0,R.eJ)(),[A,k]=(0,R.eJ)(!1),[T,N]=(0,R.eJ)(),[L,D,O]=(0,F.Z)(),Z=S?`+${S.countryCode} ${P||""}`:P,_=Z&&Z.replace(/[^\d]+/g,"").length>=7;(0,R.d4)((()=>{n.$b||w.current.focus()}),[S]),(0,R.d4)((()=>{"connectionStateReady"!==e||i||m()}),[e,i,m]),(0,R.d4)((()=>{"connectionStateReady"===e&&p({langCode:l})}),[e,l,p]),(0,R.d4)((()=>{i&&c&&!S&&!A&&E((0,Y.U9)(c,i)[0])}),[S,i,A,c]);const x=(0,R.I4)((e=>{e.length||M("");const t=c&&(0,Y.g3)(c,e),n=!S||t&&t.iso2!==S.iso2||!t&&e.length?t:S;(!S||!n||n&&n.iso2!==S.iso2)&&E(n),M((0,Y.un)(e,n))}),[c,S]),B=(0,R.I4)((()=>{D(),(0,X.m0)(I,(()=>{O(),v({language:I})}))}),[D,v,I,O]);(0,R.d4)((()=>{void 0===P&&o&&x(o)}),[o,P,x]),(0,R.bt)((()=>{w.current&&T&&w.current.setSelectionRange(...T)}),[T]);const $=(0,R.sO)(!1),j=(0,R.I4)((()=>{$.current=!0,requestAnimationFrame((()=>{$.current=!1}))}),[]),G=(0,R.I4)((e=>{E(e),M("")}),[]),V=(0,R.I4)((e=>{u&&g(),ge||(ge=!0,W(),(0,U.pt)(Q));const{value:t,selectionStart:r,selectionEnd:o}=e.target;N(r&&o&&o1&&!$.current;x(d?`${S.countryCode} ${t}`:t)}),[u,g,S,Z,x]),H=(0,R.I4)((e=>{h(e.target.checked)}),[h]),z="authorizationStateWaitPhoneNumber"===r;return R.ZP.createElement("div",{id:"auth-phone-number-form",className:"custom-scroll"},R.ZP.createElement("div",{className:"auth-form"},R.ZP.createElement("div",{id:"logo"}),R.ZP.createElement("h2",null,"Telegram"),R.ZP.createElement("p",{className:"note"},b("StartText")),R.ZP.createElement("form",{action:"",onSubmit:function(e){e.preventDefault(),d||_&&f({phoneNumber:Z})}},R.ZP.createElement(pe,{id:"sign-in-phone-code",value:S,isLoading:!i&&!S,onChange:G}),R.ZP.createElement(de.Z,{ref:w,id:"sign-in-phone-number",label:b("Login.PhonePlaceholder"),value:Z,error:u&&b(u),inputMode:"tel",onChange:V,onPaste:n.s$?j:void 0}),R.ZP.createElement(oe.Z,{id:"sign-in-keep-session",label:"Keep me signed in",checked:Boolean(s),onChange:H}),_&&(z?R.ZP.createElement(re.Z,{type:"submit",ripple:!0,isLoading:d},b("Login.Next")):R.ZP.createElement(ae.Z,null)),z&&R.ZP.createElement(re.Z,{isText:!0,ripple:!0,isLoading:a,onClick:y},b("Login.QR.Login")),I&&I!==l&&C&&R.ZP.createElement(re.Z,{isText:!0,isLoading:L,onClick:B},C))))})));var ve=s(8778);const be=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthCode");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)})),we=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthPassword");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)})),Ie=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Auth,"AuthRegister");return e?R.ZP.createElement(e,null):R.ZP.createElement(ae.Z,null)}));let Ce=null;class Se{}Se.render=function(e,t){Ce(e,t)},self.QrCreator=Se,function(e){function t(t,n,r,o){var d={},a=e(r,n);a.u(t),a.J(),o=o||0;var u=a.h(),s=a.h()+2*o;return d.text=t,d.level=n,d.version=r,d.O=s,d.a=function(e,t){return t-=o,!(0>(e-=o)||e>=u||0>t||t>=u)&&a.a(e,t)},d}function n(e,t,n,r,o,d,a,u,s,i){function c(t,n,r,o,a,u,s){t?(e.lineTo(n+u,r+s),e.arcTo(n,r,o,a,d)):e.lineTo(n,r)}a?e.moveTo(t+d,n):e.moveTo(t,n),c(u,r,n,r,o,-d,0),c(s,r,o,t,o,0,-d),c(i,t,o,t,n,d,0),c(a,t,n,r,n,0,d)}function r(e,t,n,r,o,d,a,u,s,i){function c(t,n,r,o){e.moveTo(t+r,n),e.lineTo(t,n),e.lineTo(t,n+o),e.arcTo(t,n,t+r,n,d)}a&&c(t,n,d,d),u&&c(r,n,-d,d),s&&c(r,o,-d,-d),i&&c(t,o,d,-d)}function o(e,o){e:{var d=o.text,a=o.v,u=o.N,s=o.K,i=o.P;for(u=Math.max(1,u||1),s=Math.min(40,s||40);u<=s;u+=1)try{var c=t(d,a,u,i);break e}catch(e){}c=void 0}if(!c)return null;for(d=e.getContext("2d"),o.background&&(d.fillStyle=o.background,d.fillRect(o.left,o.top,o.size,o.size)),a=c.O,s=o.size/a,d.beginPath(),i=0;iMath.round(e*t.size))),"linear-gradient"===r)var d=e.createLinearGradient.apply(e,n);else{if("radial-gradient"!==r)throw Error("Unsupported fill");d=e.createRadialGradient.apply(e,n)}o.forEach((([e,t])=>{d.addColorStop(e,t)})),e.fillStyle=d}}(d,o),d.fill(),e}var d={minVersion:1,maxVersion:40,ecLevel:"L",left:0,top:0,size:200,fill:"#000",background:null,text:"no text",radius:.5,quiet:0};Ce=function(e,t){var n={};Object.assign(n,d,e),n.N=n.minVersion,n.K=n.maxVersion,n.v=n.ecLevel,n.left=n.left,n.top=n.top,n.size=n.size,n.fill=n.fill,n.background=n.background,n.text=n.text,n.R=n.radius,n.P=n.quiet,t instanceof HTMLCanvasElement?(t.width===n.size&&t.height===n.size||(t.width=n.size,t.height=n.size),t.getContext("2d").clearRect(0,0,t.width,t.height),o(t,n)):((e=document.createElement("canvas")).width=n.size,e.height=n.size,n=o(e,n),t.appendChild(n))}}(function(){function e(o,a){function u(e,t){for(var n=-1;7>=n;n+=1)if(!(-1>=e+n||l<=e+n))for(var r=-1;7>=r;r+=1)-1>=t+r||l<=t+r||(c[e+n][t+r]=0<=n&&6>=n&&(0==r||6==r)||0<=r&&6>=r&&(0==n||6==n)||2<=n&&4>=n&&2<=r&&4>=r)}function s(e,n){for(var a=l=4*o+17,s=Array(a),m=0;m=y;y+=1)for(var v=-2;2>=v;v+=1)c[p+y][g+v]=-2==y||2==y||-2==v||2==v||0==y&&0==v}for(a=8;as;s+=1)m=!e&&1==(a>>s&1),c[6>s?s:8>s?s+1:l-15+s][8]=m,c[8][8>s?l-s-1:9>s?15-s:14-s]=m;if(c[l-8][8]=!e,7<=o){for(a=r.A(o),s=0;18>s;s+=1)m=!e&&1==(a>>s&1),c[Math.floor(s/3)][s%3+l-8-3]=m;for(s=0;18>s;s+=1)m=!e&&1==(a>>s&1),c[s%3+l-8-3][Math.floor(s/3)]=m}if(null==f){for(e=d.I(o,i),a=function(){var e=[],t=0,n={B:function(){return e},c:function(t){return 1==(e[Math.floor(t/8)]>>>7-t%8&1)},put:function(e,t){for(var r=0;r>>t-r-1&1))},f:function(){return t},m:function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1}};return n}(),s=0;s8*m)throw Error("code length overflow. ("+a.f()+">"+8*m+")");for(a.f()+4<=8*m&&a.put(0,4);0!=a.f()%8;)a.m(!1);for(;!(a.f()>=8*m||(a.put(236,8),a.f()>=8*m));)a.put(17,8);var b=0;for(m=s=0,p=Array(e.length),g=Array(e.length),y=0;yy;y+=1)null==c[s][g-y]&&(v=!1,p>>m&1)),n(s,g-y)&&(v=!v),c[s][g-y]=v,-1==--m&&(p+=1,m=7));if(0>(s+=a)||l<=s){s-=a,a=-a;break}}}var i=n[a],c=null,l=0,f=null,h=[],m={u:function(t){t=function(t){var n=e.s(t);return{S:function(){return 4},b:function(){return n.length},write:function(e){for(var t=0;te||l<=e||0>t||l<=t)throw Error(e+","+t);return c[e][t]},h:function(){return l},J:function(){for(var e=0,t=0,n=0;8>n;n+=1){s(!0,n);var o=r.D(m);(0==n||e>o)&&(e=o,t=n)}s(!1,t)}};return m}function t(e,n){if(void 0===e.length)throw Error(e.length+"/"+n);var r=function(){for(var t=0;td.b()-e.b())return d;for(var n=o.g(d.c(0))-o.g(e.c(0)),r=Array(d.b()),a=0;ar?t.push(r):2048>r?t.push(192|r>>6,128|63&r):55296>r||57344<=r?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t};var n={L:1,M:0,Q:3,H:2},r=function(){function e(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t}var n=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]];return{w:function(t){for(var n=t<<10;0<=e(n)-e(1335);)n^=1335<t||40t?8:16},D:function(e){for(var t=e.h(),n=0,r=0;r=u;u+=1)if(!(0>r+u||t<=r+u))for(var s=-1;1>=s;s+=1)0>o+s||t<=o+s||(0!=u||0!=s)&&a==e.a(r+u,o+s)&&(d+=1);5n;n+=1)e[n]=1<n;n+=1)e[n]=e[n-4]^e[n-5]^e[n-6]^e[n-8];for(n=0;255>n;n+=1)t[e[n]]=n;return{g:function(e){if(1>e)throw Error("glog("+e+")");return t[e]},i:function(t){for(;0>t;)t+=255;for(;256<=t;)t-=255;return e[t]}}}(),d=function(){function e(e,r){switch(r){case n.L:return t[4*(e-1)];case n.M:return t[4*(e-1)+1];case n.Q:return t[4*(e-1)+2];case n.H:return t[4*(e-1)+3]}}var t=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];return{I:function(t,n){var r=e(t,n);if(void 0===r)throw Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+n);t=r.length/3,n=[];for(var o=0;o{const{connectionState:t,authState:n,authQrCode:r,settings:{byKey:{language:o}}}=e;return{connectionState:t,authState:n,authQrCode:r,language:o}}))((({connectionState:n,authState:r,authQrCode:o,language:d})=>{const{returnToAuthPhoneNumber:a,setSettingOption:u}=(0,t.uC)(),s=ne(),i=(0,ee.Z)(),c=(0,R.sO)(null),l=te(s,"ContinueOnThisLanguage"),[f,h,m]=(0,F.Z)();(0,R.d4)((()=>{if(!o||"connectionStateReady"!==n)return;const e=c.current;e.innerHTML="",e.classList.remove("pre-animate"),Ee.render({text:`tg://login?token=${o.token}`,radius:.5,ecLevel:"M",fill:"#4E96D4",size:280},e)}),[n,o]),(0,R.d4)((()=>{"connectionStateReady"===n&&(0,X.m0)(e.sR)}),[n]);const p=(0,R.I4)((()=>{h(),(0,X.m0)(s,(()=>{m(),u({language:s})}))}),[h,u,s,m]),g="authorizationStateWaitQrCode"===r;return R.ZP.createElement("div",{id:"auth-qr-form",className:"custom-scroll"},R.ZP.createElement("div",{className:"auth-form qr"},o?R.ZP.createElement("div",{key:"qr-container",className:"qr-container pre-animate",ref:c}):R.ZP.createElement("div",{key:"qr-loading",className:"qr-loading"},R.ZP.createElement(ae.Z,null)),R.ZP.createElement("h3",null,i("Login.QR.Title")),R.ZP.createElement("ol",null,R.ZP.createElement("li",null,R.ZP.createElement("span",null,i("Login.QR.Help1"))),R.ZP.createElement("li",null,R.ZP.createElement("span",null,(0,se.Z)(i("Login.QR.Help2"),["simple_markdown"]))),R.ZP.createElement("li",null,R.ZP.createElement("span",null,i("Login.QR.Help3")))),g&&R.ZP.createElement(re.Z,{isText:!0,onClick:a},i("Login.QR.Cancel")),s&&s!==d&&l&&R.ZP.createElement(re.Z,{isText:!0,isLoading:f,onClick:p},l)))}))),Me=(0,R.X$)((0,t.c$)((e=>(0,f.ei)(e,["authState"])))((({authState:e})=>{const{reset:r,initApi:o,returnToAuthPhoneNumber:d,goToAuthQrCode:a}=(0,t.uC)();(0,R.d4)((()=>{r(),o()}),[r,o]);const u="iOS"===n.Lt||"Android"===n.Lt;switch((0,g.ZP)(!u&&"authorizationStateWaitPhoneNumber"===e||u&&"authorizationStateWaitQrCode"===e,(()=>{u?d():a()})),(0,R.d4)((()=>(D.Z.disableRefresh(),()=>{D.Z.enableRefresh()})),[]),e){case"authorizationStateWaitCode":return R.ZP.createElement(q,{page:"authCode",key:"authCode"},R.ZP.createElement(be,null));case"authorizationStateWaitPassword":return R.ZP.createElement(q,{page:"authPassword",key:"authPassword"},R.ZP.createElement(we,null));case"authorizationStateWaitRegistration":return R.ZP.createElement(Ie,null);case"authorizationStateWaitPhoneNumber":return R.ZP.createElement(q,{page:"authPhoneNumber",key:"authPhoneNumber"},R.ZP.createElement(ye,null));case"authorizationStateWaitQrCode":return R.ZP.createElement(q,{page:"authQrCode",key:"authQrCode"},R.ZP.createElement(Pe,null));default:return u?R.ZP.createElement(q,{page:"authPhoneNumber",key:"authPhoneNumber"},R.ZP.createElement(ye,null)):R.ZP.createElement(q,{page:"authQrCode",key:"authQrCode"},R.ZP.createElement(Pe,null))}}))),Ae=(0,R.X$)((()=>{const e=(0,ve.Z)(V.gl.Main,"Main");return e?R.ZP.createElement(e,null):void 0}));var ke=s(5359);const Te=()=>R.ZP.createElement("div",{id:"AppInactive"},R.ZP.createElement("div",{className:"content"},R.ZP.createElement("img",{src:ke,alt:""}),R.ZP.createElement("h3",{className:"title"},"Such error, many tabs"),R.ZP.createElement("div",{className:"description"},"Telegram supports only one active tab with the app.",R.ZP.createElement("br",null),"Please reload this page to continue using this tab or close it."),R.ZP.createElement("div",{className:"actions"},R.ZP.createElement(re.Z,{isText:!0,ripple:!0,onClick:()=>{window.location.reload()}},"Reload app"))));function Ne(){return t.ZP.createElement(q,{page:"main",key:"main"},t.ZP.createElement(Ae,null))}const Le=(0,t.c$)((e=>(0,f.ei)(e,["authState"])))((({authState:n})=>{const{disconnect:r}=(0,t.uC)(),[o,d]=(0,F.Z)(!1);if((0,R.d4)((()=>{(0,D.z)(),_=()=>{r(),document.title=`${e.Ti}${e.ou}`,d()}}),[r,d]),o)return t.ZP.createElement(Te,null);if(n)switch(n){case"authorizationStateWaitPhoneNumber":case"authorizationStateWaitCode":case"authorizationStateWaitPassword":case"authorizationStateWaitRegistration":case"authorizationStateWaitQrCode":return t.ZP.createElement(Me,null);case"authorizationStateClosed":case"authorizationStateClosing":case"authorizationStateLoggingOut":case"authorizationStateReady":return Ne()}return(0,m.ti)(!0)?Ne():t.ZP.createElement(Me,null)}));e.eM&&console.log(">>> INIT"),(0,t.uC)().init(),e.eM&&console.log(">>> START INITIAL RENDER"),a.Z.render(t.ZP.createElement(Le,null),document.getElementById("root")),e.eM&&console.log(">>> FINISH INITIAL RENDER"),document.addEventListener("dblclick",(()=>{console.warn("GLOBAL STATE",(0,t.Rd)())}))})()})(); +//# sourceMappingURL=main.d457636534c2b59dd7f6.js.map \ No newline at end of file diff --git a/dist/main.d457636534c2b59dd7f6.js.map b/dist/main.d457636534c2b59dd7f6.js.map new file mode 100644 index 000000000..e4c552698 --- /dev/null +++ b/dist/main.d457636534c2b59dd7f6.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.d457636534c2b59dd7f6.js","mappings":"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AAC,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,GA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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/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/reducers/messages.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/callbacks.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/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/permanentWebVersion.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 = {\"37\":1,\"133\":1,\"163\":1,\"442\":1,\"472\":1,\"532\":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 { Api } from '../../../lib/gramjs';\nimport { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, 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 const promise = makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n });\n\n // Some TypeScript magic to make sure `VirtualClass` is never returned from any method\n if (DEBUG) {\n (async () => {\n try {\n type ForbiddenTypes =\n Api.VirtualClass\n | (Api.VirtualClass | undefined)[];\n type ForbiddenResponses =\n ForbiddenTypes\n | (AnyLiteral & { [k: string]: ForbiddenTypes });\n\n // Unwrap all chained promises\n const response = await promise;\n // Make sure responses do not include `VirtualClass` instances\n const allowedResponse: Exclude = response;\n // Suppress \"unused variable\" constraint\n void allowedResponse;\n } catch (err) {\n // Do noting\n }\n })();\n }\n\n return promise 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 new Error(data.error?.message);\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\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', () => {\n void ensureWorkerPing();\n // Sometimes a single check is not enough\n setTimeout(() => ensureWorkerPing(), 1000);\n });\n}\n\nasync function ensureWorkerPing() {\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","// 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 | ArrayBuffer;\nexport type ApiPreparedMedia = 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 id: string;\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 id: string;\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 date: number;\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 editDate?: number;\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 isProtected?: boolean;\n reactors?: {\n nextOffset?: string;\n count: number;\n reactions: ApiUserReaction[];\n };\n reactions?: ApiReactions;\n}\n\nexport interface ApiReactions {\n canSeeList?: boolean;\n results: ApiReactionCount[];\n recentReactions?: ApiUserReaction[];\n}\n\nexport interface ApiUserReaction {\n userId: string;\n reaction: string;\n}\n\nexport interface ApiReactionCount {\n isChosen?: boolean;\n count: number;\n reaction: string;\n}\n\nexport interface ApiAvailableReaction {\n selectAnimation?: ApiDocument;\n staticIcon?: ApiDocument;\n centerIcon?: ApiDocument;\n aroundAnimation?: ApiDocument;\n reaction: string;\n title: string;\n isInactive?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: string;\n topMessageId?: number;\n originChannelId?: string;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: string[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport type ApiSponsoredMessage = {\n chatId?: string;\n randomId: string;\n isBot?: boolean;\n channelPostId?: number;\n startParam?: string;\n chatInviteHash?: string;\n chatInviteTitle?: string;\n text: ApiFormattedText;\n expiresAt: number;\n};\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'requestSelfContact' | '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 type ApiSendMessageAction = {\n type: 'cancel' | 'typing' | 'recordAudio' | 'chooseSticker';\n};\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';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getDispatch } from '../../lib/teact/teactn';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\nconst UserLink: FC = ({\n className, sender, children,\n}) => {\n const { openUserInfo } = getDispatch();\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 UserLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\n\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\nconst MessageLink: FC = ({\n className, message, children,\n}) => {\n const { focusMessage } = getDispatch();\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 MessageLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\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\nconst ChatLink: FC = ({\n className, chatId, children,\n}) => {\n const { openChat } = getDispatch();\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 ChatLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport { ApiGroupCall } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getDispatch } from '../../lib/teact/teactn';\n\ntype OwnProps = {\n className?: string;\n groupCall?: Partial;\n children: any;\n};\n\nconst GroupCallLink: FC = ({\n className, groupCall, children,\n}) => {\n const { joinGroupCall } = getDispatch();\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 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 { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\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\nconst MentionLink: FC = ({\n username,\n userOrChat,\n children,\n}) => {\n const {\n openChat,\n openChatByUsername,\n } = getDispatch();\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)(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 {\n ChangeEvent, FormEvent, RefObject,\n} 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 bubbleStyle?: 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 bubbleStyle,\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 (isOpen || (!isOpen && prevIsOpen === true)) {\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-v7';\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;\nexport const REACTION_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\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\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\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\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\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 isDisabled = false,\n) => {\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\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 }, [isDisabled, 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 useEffect(() => {\n if (!autoUpdate) {\n return undefined;\n }\n\n return addLoadListener(forceUpdate);\n }, [autoUpdate, forceUpdate]);\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 const exec = () => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n };\n\n if (noCloseTransition) {\n exec();\n } else {\n closeTimeoutRef.current = window.setTimeout(exec, CLOSE_DURATION);\n }\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;\ntype DelegationRegistry = Map;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst documentEventCounters: Record = {};\nconst delegationRegistryByEventType: Record = {};\nconst delegatedEventTypesByElement = new Map>();\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n addDelegatedListener(eventType, element, handler);\n } else {\n element.addEventListener(eventType, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n removeDelegatedListener(eventType, element);\n } else {\n element.removeEventListener(eventType, handler, asCapture);\n }\n}\n\nfunction resolveEventType(propName: string, element: HTMLElement) {\n const eventType = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventType === '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 (eventType === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventType === 'focus') {\n return 'focusin';\n }\n\n if (eventType === 'blur') {\n return 'focusout';\n }\n\n return eventType;\n}\n\nfunction canUseEventDelegation(realEventType: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventType)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventType: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventType]) {\n documentEventCounters[eventType] = 0;\n document.addEventListener(eventType, handleEvent);\n }\n\n resolveDelegationRegistry(eventType).set(element, handler);\n resolveDelegatedEventTypes(element).add(eventType);\n documentEventCounters[eventType]++;\n}\n\nfunction removeDelegatedListener(eventType: string, element: HTMLElement) {\n documentEventCounters[eventType]--;\n if (!documentEventCounters[eventType]) {\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(eventType, handleEvent);\n }\n\n delegationRegistryByEventType[eventType].delete(element);\n delegatedEventTypesByElement.get(element)!.delete(eventType);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventTypes = delegatedEventTypesByElement.get(element);\n if (!eventTypes) {\n return;\n }\n\n eventTypes.forEach((eventType) => removeDelegatedListener(eventType, element));\n delegatedEventTypesByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistryByEventType[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 resolveDelegationRegistry(eventType: string) {\n if (!delegationRegistryByEventType[eventType]) {\n delegationRegistryByEventType[eventType] = new Map();\n }\n\n return delegationRegistryByEventType[eventType];\n}\n\nfunction resolveDelegatedEventTypes(element: HTMLElement) {\n const existing = delegatedEventTypesByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set();\n delegatedEventTypesByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n const documentListenersCount = Object.keys(documentEventCounters).length;\n const delegatedHandlersCount1 = Object.values(documentEventCounters)\n .reduce((acc, counter) => acc + counter, 0);\n const delegationRegistriesCount = Object.keys(delegationRegistryByEventType).length;\n const delegatedHandlersCount2 = Object.values(delegationRegistryByEventType)\n .reduce((acc, delegationRegistry) => acc + delegationRegistry.size, 0);\n const delegationElementsCount = delegatedEventTypesByElement.size;\n const delegatedEventTypesCount = Array.from(delegatedEventTypesByElement.values())\n .reduce((acc, eventTypes) => acc + eventTypes.size, 0);\n\n // eslint-disable-next-line no-console\n console.warn('DELEGATED EVENTS STATS', {\n delegatedHandlersCount1,\n delegatedHandlersCount2,\n delegatedEventTypesCount,\n delegationRegistriesCount,\n delegationElementsCount,\n documentListenersCount,\n });\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 const currentTarget = getTarget($current);\n\n if (!areComponents) {\n setTarget($new, currentTarget!);\n setTarget($current, undefined as any); // Help GC\n\n if ('props' in $current && 'props' in $new) {\n $new.props.ref = $current.props.ref;\n }\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = currentTarget!;\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, currentTarget as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : currentTarget 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;\nconst DEBUG_SILENT_RENDERS_FOR = new Set(['TeactMemoWrapper', 'TeactNContainer', 'Button', 'ListItem', 'MenuItem']);\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.warn('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 (!DEBUG_SILENT_RENDERS_FOR.has(componentName)) {\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 (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else {\n if (isTagElement($element)) {\n if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n }\n\n if ($element.props.ref) {\n $element.props.ref.current = undefined; // Help GC\n }\n }\n\n if ($element.target) {\n $element.target = undefined; // Help GC\n }\n\n if (!isRealElement($element)) {\n return;\n }\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 // We need to clean refs before running effect cleanups\n componentInstance.hooks.memos.byCursor.forEach((memoContainer) => {\n memoContainer.current = undefined;\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 componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = undefined;\n hook.effect = undefined as any;\n hook.dependencies = undefined;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = undefined;\n hook.nextValue = undefined;\n hook.setter = undefined as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = undefined as any;\n });\n\n componentInstance.hooks = undefined as any;\n componentInstance.$element = undefined as any;\n componentInstance.renderedValue = undefined;\n componentInstance.Component = undefined as any;\n componentInstance.props = undefined as any;\n componentInstance.forceUpdate = undefined;\n componentInstance.onUpdate = undefined;\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(`[Teact] Effect \"${debugKey}\" caused by dependencies.`, causedBy.join(', '));\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n } else {\n if (debugKey) {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Effect \"${debugKey}\" caused by missing dependencies.`);\n }\n\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 { fastRaf, throttleWithTickEnd } 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);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nconst runCallbacksThrottled = throttleWithTickEnd(runCallbacks);\n\nfunction runCallbacks(forceOnHeavyAnimation = false) {\n if (!forceOnHeavyAnimation && isHeavyAnimating()) {\n fastRaf(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, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = mapStateToProps(currentGlobal, ownProps);\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) {\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 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 = mapStateToProps(currentGlobal, props);\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.warn(\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\naddReducer('loadAppConfig', () => {\n (async () => {\n const appConfig = await callApi('fetchAppConfig');\n\n if (!appConfig) return;\n\n setGlobal({\n ...getGlobal(),\n appConfig,\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 if (connectionState === global.connectionState) {\n return;\n }\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';\nimport { ensurePermanentWebVersion } from '../../../util/permanentWebVersion';\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\n switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\n\n ensurePermanentWebVersion();\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(lang, untilDate * 1000)],\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, ApiReactions, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport {\n LOCAL_MESSAGE_ID_BASE,\n SERVICE_NOTIFICATIONS_USER_ID,\n RE_LINK_TEMPLATE,\n CONTENT_NOT_SUPPORTED,\n} 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 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\nexport function areReactionsEmpty(reactions: ApiReactions) {\n return !reactions.results.some((l) => l.count > 0);\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 mediaId = (messagePhoto || messageVideo || sticker || audio || voice || document)!.id;\n const base = `${getMessageKey(message)}${mediaId ? `:${mediaId}` : ''}`;\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): 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(lang, wasOnlineDate));\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(lang, wasOnlineDate));\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(\n userIds: string[],\n usersById: Record,\n query?: string,\n currentUserId?: string,\n savedMessagesLang?: string,\n) {\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 = id === currentUserId ? savedMessagesLang : 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 { 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 deleteContact(global: GlobalState, userId: string): GlobalState {\n const { byId } = global.users;\n const { userIds } = global.contactList || {};\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, {\n ...byId,\n [userId]: {\n ...byId[userId],\n isContact: undefined,\n },\n });\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, ManagementState } from '../../types';\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 {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../../global/types';\nimport {\n ApiMessage, ApiSponsoredMessage, ApiThreadInfo, MAIN_THREAD_ID,\n} 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 updateSponsoredMessage(\n global: GlobalState, chatId: string, message: ApiSponsoredMessage,\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n sponsoredByChatId: {\n ...global.messages.sponsoredByChatId,\n [chatId]: message,\n },\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 { 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\nexport function selectSendAs(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n if (!chat) return undefined;\n\n const id = chat?.fullInfo?.sendAsId;\n if (!id) return undefined;\n\n return selectUser(global, id) || selectChat(global, 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 // Favorites\n global.stickers.favorite.stickers.forEach((sticker) => {\n if (sticker.emoji === emoji) stickersForEmoji.push(sticker);\n });\n\n // Added sets\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\nfunction cleanEmoji(emoji: string) {\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n return emoji.replace('\\ufe0f', '');\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiEffect(global: GlobalState, emoji: string) {\n const { animatedEmojiEffects } = global;\n if (!animatedEmojiEffects || !animatedEmojiEffects.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojiEffects.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiSound(global: GlobalState, emoji: string) {\n return global?.appConfig?.emojiSounds[cleanEmoji(emoji)];\n}\n\nexport function selectLocalAnimatedEmoji(global: GlobalState, emoji: string) {\n const cleanedEmoji = cleanEmoji(emoji);\n\n return cleanedEmoji === '🍑' ? 'Peach' : (cleanedEmoji === '🍆' ? 'Eggplant' : undefined);\n}\n\nexport function selectLocalAnimatedEmojiEffect(emoji: string) {\n return emoji === 'Eggplant' ? 'Cumshot' : undefined;\n}\n\nexport function selectLocalAnimatedEmojiEffectByName(name: string) {\n return name === 'Cumshot' ? '🍆' : undefined;\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\nexport function selectIsMessageProtected(global: GlobalState, message?: ApiMessage) {\n return message ? message.isProtected || selectChat(global, message.chatId)?.isProtected : false;\n}\n\nexport function selectHasProtectedMessage(global: GlobalState, chatId: string, messageIds?: number[]) {\n if (selectChat(global, chatId)?.isProtected) {\n return true;\n }\n\n if (!messageIds) {\n return false;\n }\n\n const messages = selectChatMessages(global, chatId);\n\n return messageIds.some((messageId) => messages[messageId]?.isProtected);\n}\n\nexport function selectSponsoredMessage(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n const message = chat && isChatChannel(chat) ? global.messages.sponsoredByChatId[chatId] : undefined;\n\n return message && message.expiresAt >= Math.round(Date.now() / 1000) ? message : undefined;\n}\n\nexport function selectDefaultReaction(global: GlobalState, chatId: string) {\n if (chatId === SERVICE_NOTIFICATIONS_USER_ID) return undefined;\n\n const isPrivate = isUserId(chatId);\n const defaultReaction = global.appConfig?.defaultReaction;\n const { availableReactions } = global;\n if (!defaultReaction || !availableReactions?.some(\n (l) => l.reaction === defaultReaction && !l.isInactive,\n )) {\n return undefined;\n }\n\n if (isPrivate) {\n return defaultReaction;\n }\n\n const enabledReactions = selectChat(global, chatId)?.fullInfo?.enabledReactions;\n if (!enabledReactions?.includes(defaultReaction)) {\n return undefined;\n }\n\n return defaultReaction;\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 ApiExportedInvite,\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 QuickReaction,\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 interface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n invites?: ApiExportedInvite[];\n editingInvite?: ApiExportedInvite;\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 ChatNewAdminRights,\n GroupMembers,\n GroupAddAdmins,\n Invites,\n EditInvite,\n Reactions,\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 if (!instance!.isCancelled && tick()) {\n fastRaf(() => {\n animateSingle(tick, instance);\n });\n }\n}\n\nexport function animate(tick: Function) {\n if (tick()) {\n fastRaf(() => {\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 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","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\n}\n","import 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(lang: LangFn, datetime: number | Date) {\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(lang, date);\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 formatCountdown(\n lang: LangFn,\n msLeft: number,\n) {\n const days = Math.floor(msLeft / MILLISECONDS_IN_DAY);\n if (msLeft < 0) {\n return 0;\n } else if (days < 1) {\n return formatMediaDuration(msLeft / 1000);\n } else if (days < 7) {\n return lang('Days', days);\n } else if (days < 30) {\n return lang('Weeks', Math.floor(days / 7));\n } else if (days < 365) {\n return lang('Months', Math.floor(days / 30));\n } else {\n return lang('Years', Math.floor(days / 365));\n }\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 // Workaround for https://bugs.telegram.org/c/5777\n .replace(/'de'/g, 'de');\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(lang, date)}`;\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(datetime: Date | number, locale = 'en-US') {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nexport function formatDateTimeToString(datetime: Date | number, locale = 'en-US') {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: '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[^\\ufe0f]/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 ADMINS_TOO_MUCH: 'There are too many admins',\n ADMIN_RANK_EMOJI_NOT_ALLOWED: 'An admin rank cannot contain emojis',\n ADMIN_RANK_INVALID: 'The specified admin rank is invalid',\n FRESH_CHANGE_ADMINS_FORBIDDEN: 'You were just elected admin, you can\\'t add or modify other admins yet',\n INPUT_USER_DEACTIVATED: 'The specified user was deleted',\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","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 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.Blob,\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 ApiPreparedMedia;\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: Exclude): 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';\nimport { createCallbackManager } from './callbacks';\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\nconst { addCallback, runCallbacks } = createCallbackManager();\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(runCallbacks);\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\nexport const addLoadListener = addCallback;\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","const PERMANENT_VERSION_KEY = 'kz_version';\nconst AVAILABLE_VERSIONS = ['Z', 'K'] as const;\nconst DEFAULT_VERSION = 'Z';\n\nexport function setPermanentWebVersion(version: typeof AVAILABLE_VERSIONS[number]) {\n localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify(version));\n}\n\nexport function ensurePermanentWebVersion() {\n if (!hasPermanentWebVersion()) {\n setPermanentWebVersion(DEFAULT_VERSION);\n }\n}\n\nfunction hasPermanentWebVersion() {\n const json = localStorage.getItem(PERMANENT_VERSION_KEY);\n if (!json) {\n return false;\n }\n\n try {\n const version = JSON.parse(json);\n return AVAILABLE_VERSIONS.includes(version);\n } catch (err) {\n return false;\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';\nimport { fastRaf } from './schedulers';\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 fastRaf(() => {\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 });\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\nexport function clearWebsync() {\n localStorage.removeItem(WEBSYNC_KEY);\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 + \".\" + {\"37\":\"9e975e031ef296075093\",\"99\":\"f03a947e6e336feffec8\",\"133\":\"9dfaaf583ccedfce4e17\",\"161\":\"286d0207d962142ad548\",\"163\":\"c69a8648aa1c99ba6248\",\"354\":\"1679b9bab979435e8c49\",\"442\":\"f81b4eb30975dff27660\",\"472\":\"21e5264f606f2b525030\",\"501\":\"72ce4b6e27f459e194cd\",\"524\":\"4f91b5e8a34fdeca4cde\",\"532\":\"a137aefcf87d9a57c87e\",\"536\":\"55dc7dd4ab42a2c9f037\",\"626\":\"78013a2baf2a84ee2a6e\",\"745\":\"9316c5c2b711c39a20a5\",\"830\":\"73181e239801042afb0c\",\"884\":\"c8f1b9920de862fb45af\",\"915\":\"0588cdc78683d0e9bbbc\",\"941\":\"257681469163c1c58f3b\",\"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 + \".\" + {\"37\":\"9e975e031ef296075093\",\"133\":\"9dfaaf583ccedfce4e17\",\"163\":\"c69a8648aa1c99ba6248\",\"442\":\"f81b4eb30975dff27660\",\"472\":\"21e5264f606f2b525030\",\"532\":\"a137aefcf87d9a57c87e\"}[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 sponsoredByChatId: {},\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 activeReactions: {},\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 if (!cached.messages.sponsoredByChatId) {\n cached.messages.sponsoredByChatId = {};\n }\n\n if (!cached.activeReactions) {\n cached.activeReactions = {};\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 availableReactions: reduceAvailableReactions(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 sponsoredByChatId: {},\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction reduceGroupCalls(global: GlobalState): GlobalState['groupCalls'] {\n return {\n ...global.groupCalls,\n byId: {},\n activeGroupCallId: undefined,\n isGroupCallPanelHidden: undefined,\n isFallbackConfirmOpen: undefined,\n };\n}\n\nfunction reduceAvailableReactions(global: GlobalState): GlobalState['availableReactions'] {\n return global.availableReactions\n ?.map((r) => pick(r, ['reaction', 'staticIcon', 'title', 'isInactive']));\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 { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { 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 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 =\n Pick\n & {\n hasCustomBackground?: boolean;\n hasCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n leftColumnWidth?: number;\n };\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}) => {\n const { setIsUiReady } = getDispatch();\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)(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 { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { 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};\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}) => {\n const {\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n loadCountryList,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n } = getDispatch();\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)(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 & {\n language?: LangCode;\n };\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC = ({\n connectionState,\n authState,\n authQrCode,\n language,\n}) => {\n const {\n returnToAuthPhoneNumber,\n setSettingOption,\n } = getDispatch();\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)(AuthCode));\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { 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;\n\nconst Auth: FC = ({\n authState,\n}) => {\n const {\n reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n } = getDispatch();\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)(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, { getDispatch, withGlobal } from './lib/teact/teactn';\n\nimport { 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;\n\nconst App: FC = ({ authState }) => {\n const { disconnect } = getDispatch();\n\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)(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","Error","message","subscribeToWorker","platform","window","ensureWorkerPing","setTimeout","makeRequest","args","callApi","fnName","warn","promise","name","err","cancelApiProgress","progressCallback","isCanceled","postMessage","generateIdFor","payload","Promise","Object","assign","pop","set","catch","finally","delete","startedAt","Date","now","async","race","pause","then","location","reload","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","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","undefined","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","withGlobal","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","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","bubbleStyle","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","SEND_MESSAGE_ACTION_INTERVAL","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","CONTENT_NOT_SUPPORTED","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","isDisabled","removeEventListener","isHeavyAnimating","duration","onEnd","clearTimeout","dispatchEvent","Event","LOCATION_HASH","hash","PATH_BASE","pathname","search","historyState","currentIndex","nextStateIndexToReplace","isHistoryAltered","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","exec","shouldHaveOpenClassName","isClosing","shouldRender","handleEvent","contains","classList","NON_BUBBLEABLE_EVENTS","documentEventCounters","delegationRegistryByEventType","delegatedEventTypesByElement","propName","handler","asCapture","eventType","resolveEventType","canUseEventDelegation","resolveDelegationRegistry","existing","newSet","resolveDelegatedEventTypes","add","addDelegatedListener","removeDelegatedListener","tagName","realEventType","has","removeAllDelegatedListeners","eventTypes","realEvent","events","furtherCallsPrevented","Proxy","p","Reflect","body","parentNode","documentListenersCount","keys","delegatedHandlersCount1","values","acc","counter","delegationRegistriesCount","delegatedHandlersCount2","delegationRegistry","delegationElementsCount","delegatedEventTypesCount","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","newKeys","key","currentValue","newValue","cssText","removeAttribute","setAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","$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","DEBUG_SILENT_RENDERS_FOR","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","memoContainer","cleanup","hook","effect","nextValue","setter","helpGc","prepareComponentForFrame","prepareForFrame","throttleWithPrimaryRaf","throttleWithRaf","forceUpdateComponent","currentElement","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","primarySchedulerFn","execCleanup","dependency","causedBy","res","prevValue","fastRaf","fastRafPrimary","useLayoutEffect","onTickEnd","onTickEndPrimary","resolver","getUnequalProps","newCallback","areEqual","arePropsShallowEqual","propsRef","renderedRef","orderBy","React","currentGlobal","reducers","callbacks","containers","mapStateToProps","ownProps","mappedProps","newMappedProps","Number","isNaN","DEBUG_componentName","areMappedPropsChanged","DEBUG_updates","updateTime","actions","runCallbacksThrottled","throttleWithTickEnd","runCallbacks","forceOnHeavyAnimation","setGlobal","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","appConfig","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","ensurePermanentWebVersion","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","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","areReactionsEmpty","reactions","results","count","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","mediaId","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","savedMessagesLang","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","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","stickers","setsById","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","nextOffset","currentResults","gifs","newResults","currentIds","gif","replaceAnimatedEmojis","animatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","selectStickersForEmoji","uniqueIds","unique","forEmoji","rebuildStickersForEmoji","replaceUsers","updateContactList","updatedUsers","contactUserIds","contactList","newContactUserIds","userUpdate","updatedUser","getUpdatedUser","updateUsers","updateSelectedUserId","selectedId","deleteContact","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","isBlocked","replaceUserStatuses","statusesById","addUserStatuses","pick","getComplexKey","updateGlobalSearch","globalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","every","newId","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","prototype","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","localTextSearch","byChatThreadKey","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","localMediaSearch","byChatId","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","sort","a","b","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","updateCurrentMessageList","shouldReplaceHistory","messageLists","newMessageLists","replaceChatMessages","updateMessageStore","threadsById","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","selectChatMessages","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","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","scheduledMessages","updateScheduledMessages","updateFocusedMessage","noHighlight","isResizingContainer","focusedMessage","updateSponsoredMessage","sponsoredByChatId","updateFocusDirection","direction","enterMessageSelectMode","selectedMessages","toggleMessageSelection","messageListType","childMessageIds","withShift","oldSelectedMessages","selectMessageIdsByGroupId","selectedMessageIds","newMessageIds","newSelectedMessageIds","selectCurrentMessageIds","prevIndex","min","to","exitMessageSelectMode","updateThreadUnreadFromForwardedMessage","originMessage","lastMessageId","isDeleting","channelPostId","threadInfoOld","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","selectSendAs","sendAsId","selectCurrentStickerSearch","selectCurrentGifSearch","selectStickerSet","selectStickerSetByShortName","shortName","stickerSets","stickersForEmoji","favorite","packs","cleanEmoji","selectAnimatedEmoji","cleanedEmoji","selectAnimatedEmojiEffect","animatedEmojiEffects","selectAnimatedEmojiSound","emojiSounds","selectLocalAnimatedEmoji","selectLocalAnimatedEmojiEffect","selectLocalAnimatedEmojiEffectByName","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","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","selectIsMessageProtected","isProtected","selectHasProtectedMessage","selectSponsoredMessage","expiresAt","selectDefaultReaction","defaultReaction","availableReactions","reaction","isInactive","enabledReactions","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","createCallbackManager","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","MILLISECONDS_IN_DAY","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","hours","getHours","marker","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","format","formatDate","formatMonthAndYear","isShort","formatCountdown","msLeft","days","formatMediaDuration","formatHumanDate","noWeekdays","isUpperFirst","upperFirst","lowerFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","maxValue","minutes","seconds","maxHours","maxMinutes","string","formatVoiceRecordDuration","durationInMs","milliseconds","locale","toLocaleString","year","formatDateTimeToString","hour","minute","second","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","timestampPlusDay","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","ADMINS_TOO_MUCH","ADMIN_RANK_EMOJI_NOT_ALLOWED","ADMIN_RANK_INVALID","FRESH_CHANGE_ADMINS_FORBIDDEN","INPUT_USER_DEACTIVATED","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","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","bundle","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","PERMANENT_VERSION_KEY","AVAILABLE_VERSIONS","setPermanentWebVersion","version","hasPermanentWebVersion","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","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","saveSync","clearWebsync","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","activeReactions","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","setupCaching","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","reduceAvailableReactions","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","markInactive","TeactDOM"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/report.html b/dist/report.html index 0d2300213..26cbcdc15 100644 --- a/dist/report.html +++ b/dist/report.html @@ -3,7 +3,7 @@ - telegram-t [23 Jan 2022 at 02:41] + telegram-t [24 Jan 2022 at 04:57]