tweb/public/25.481fbe1a27468243ce6c.chunk.js.map
Eduard Kuzmenko 5625eda42b Build
2022-08-20 13:32:46 +02:00

1 line
42 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"25.481fbe1a27468243ce6c.chunk.js","mappings":"uIAmBA,MA2BA,EA3Be,CAACA,EAAmBC,EAAyB,MAC1D,MAAMC,EAA4BC,SAASC,cAAcH,EAAQI,MAAQ,MAAQ,UAuBjF,OAtBAH,EAAOF,UAAYA,GAAaC,EAAQK,KAAO,UAAYL,EAAQK,KAAO,IAEtEL,EAAQM,WACPN,EAAQO,cACTN,EAAOO,UAAUC,IAAI,cAGvB,OAAOR,IAGND,EAAQU,YACTT,EAAOO,UAAUC,IAAI,kBAGpBT,EAAQW,UACTV,EAAOW,aAAa,WAAY,QAG/BZ,EAAQa,MACTZ,EAAOa,QAAO,QAAKd,EAAQa,OAGtBZ,I,cCnCF,SAASc,EAAaC,EAAeC,GAAY,GACtD,MAAMC,EAAO,wMAKb,GAAGD,EAAW,CACZ,MAAME,EAAMjB,SAASC,cAAc,OAQnC,OAPAgB,EAAIX,UAAUC,IAAI,aAClBU,EAAIC,UAAYF,EAEbF,GACDA,EAAKK,YAAYF,GAGZA,EAIT,OADAH,EAAKM,mBAAmB,YAAaJ,GAC9BF,EAAKO,iBAKP,SAASC,EAAgBR,EAAyBX,EAAO,SAK9D,OAJAW,EAAKR,UAAUiB,OAAO,SAAWpB,GACjCW,EAAKL,UAAW,EAChBI,EAAaC,GAEN,KACLA,EAAKI,UAAY,GACjBJ,EAAKR,UAAUC,IAAI,SAAWJ,GAC9BW,EAAKU,gBAAgB,a,gCAVzB,gBAA8BX,G,sFClB9B,IAAIY,EAAgB,EACL,SAASC,EACtBZ,EACAa,EAAoD,KAAMC,QAAQC,WAClEC,EAA8B,KAC9BC,GAAU,EACVC,EAAmBlB,GAGnB,GAAGA,EAAKmB,cAAc,aAAc,OACpCnB,EAAKR,UAAUC,IAAI,MAEnB,MAAM2B,EAAIlC,SAASC,cAAc,OAUjC,IAAIkC,EATJD,EAAE5B,UAAUC,IAAI,YAECO,EAAKR,UAAU8B,SAAS,cAEvCF,EAAE5B,UAAUC,IAAI,aAGlBO,EAAKiB,EAAU,UAAY,UAAUG,GAIrC,MAAMG,EAAa,CAACC,EAAiBC,KACnC,MAAMC,EAAYC,KAAKC,MACjB5B,EAAOd,SAASC,cAAc,OAE9B0C,EAAUlB,IAIVmB,EAAgG,KAApFC,OAAOC,iBAAiBZ,GAAGa,iBAAiB,qBAAqBC,QAAQ,IAAK,IAGhGb,EAAU,KAMR,MAAMc,EAAcR,KAAKC,MAAQF,EAC3BU,EAAK,KAET,YAAqB,KACnBpC,EAAKS,YAGJO,GAAOA,EAAMa,IAElB,GAAGM,EAAcL,EAAU,CACzB,MAAMO,EAAQC,KAAKC,IAAIT,EAAWK,EAAaL,EAAW,GAC1DU,YAAW,IAAMxC,EAAKR,UAAUC,IAAI,WAAW6C,KAAKC,IAAIF,EAAQP,EAAW,EAAG,IAE9EU,WAAWJ,EAAIC,QAEfrC,EAAKR,UAAUC,IAAI,UACnB+C,WAAWJ,EAAIN,EAAW,GAGxB,KACFC,OAAOU,oBAAoB,cAAepB,GAG5CA,EAAU,KACVqB,GAAkB,GAIpB7B,GAAYA,EAASgB,GAerBE,OAAOY,uBAAsB,KAC3B,MAAMC,EAAOxB,EAAEyB,wBACf7C,EAAKR,UAAUC,IAAI,oBAEnB,MAAMqD,EAAStB,EAAUoB,EAAKG,KACxBC,EAASvB,EAAUmB,EAAKK,IAGxBC,EADSZ,KAAKa,KAAK,SAACb,KAAKc,IAAIJ,EAASJ,EAAKS,OAAS,GAAKT,EAAKS,OAAS,EAAM,GAAI,SAACf,KAAKc,IAAIN,EAASF,EAAKU,MAAQ,GAAKV,EAAKU,MAAQ,EAAM,IAIzIC,EAAIT,EAASI,EAAO,EACpBM,EAAIR,EAASE,EAAO,EAI1BlD,EAAKyD,MAAMH,MAAQtD,EAAKyD,MAAMJ,OAASH,EAAO,KAC9ClD,EAAKyD,MAAMV,KAAOQ,EAAI,KACtBvD,EAAKyD,MAAMR,IAAMO,EAAI,KAgBrBpC,EAAEtB,OAAOE,OAQP0D,EAAoBC,GAAaA,EAAEC,SAAW5D,IAClD,CAAC,SAAU,KAAK6D,SAAUF,EAAEC,OAAuBE,WACjD,OAAgBH,EAAEC,OAAuB,cAAgBxC,KAE3DF,IAAqBlB,KAClB,OAAc2D,EAAEC,OAAuB1C,IAI5C,IAAIwB,GAAkB,EACtB,GAAG,IAAoB,CACrB,MAAMqB,EAAW,KACf1C,GAAWA,KAGbH,EAAiB8C,iBAAiB,cAAeL,IAC/C,IAAI,+BACF,OAIF,GAAGA,EAAEM,QAAQC,OAAS,GAAKxB,GAAmBgB,EAAiBC,GAC7D,OAIFjB,GAAkB,EAElB,MAAM,QAAClB,EAAO,QAAEC,GAAWkC,EAAEM,QAAQ,GACrC1C,EAAWC,EAASC,GACpBP,EAAiB8C,iBAAiB,WAAYD,EAAU,CAACI,MAAM,IAE/DpC,OAAOiC,iBAAiB,aAAcL,IACpCA,EAAES,cAAe,EACjBT,EAAEU,kBACFN,IACA7C,EAAiBuB,oBAAoB,WAAYsB,KAChD,CAACI,MAAM,MACT,CAACG,SAAS,SAEbpD,EAAiB8C,iBAAiB,aAAcL,IAC9C,IAAI,CAAC,EAAG,GAAGE,SAASF,EAAE1E,QACpB,OAGF,IAAI,+BACF,OAIF,GAAuC,MAApCiC,EAAiBqD,QAAQ3D,QAAkB8C,EAAiBC,GAC7D,OACK,GAAGjB,EAER,YADAA,GAAkB,GAIpB,MAAM,QAAClB,EAAO,QAAEC,GAAWkC,EAC3BpC,EAAWC,EAASC,GACpBM,OAAOiC,iBAAiB,UAAW3C,EAAS,CAAC8C,MAAM,EAAMG,SAAS,IAClEvC,OAAOiC,iBAAiB,cAAe3C,EAAS,CAAC8C,MAAM,EAAMG,SAAS,MACrE,CAACA,SAAS,M,gGChJjB,MAAME,E,QAAkBC,WAAa,IAAM,GAEpC,MAAMC,EAuBXC,YAAmBC,EAAiBC,EAAY,GAAWC,EAAyB5F,SAASC,cAAc,QAAxF,KAAAyF,GAAAA,EAAwC,KAAAE,UAAAA,EAnBpD,KAAAC,gBAA0B,EAE1B,KAAAC,mBAA6B,EAC7B,KAAAC,oBAA8B,EAM9B,KAAAC,4BAA6B,EAC1B,KAAAC,yBAA0B,EAgG7B,KAAAC,SAAW,KAOhB,GAAGC,KAAKH,2BAGN,OAFAG,KAAKC,qBACLD,KAAKF,yBAA0B,IAK5BE,KAAKE,eAAkBF,KAAKG,kBAAsBH,KAAKI,SAAYJ,KAAKK,sBAC1EL,KAAKN,kBAGRM,KAAKN,gBAAkBhD,OAAOS,YAAW,KACvC6C,KAAKN,gBAAkB,EAEvB,MAAMY,EAAiBN,KAAKP,UAAUO,KAAKO,gBAC3CP,KAAKJ,oBAAsBI,KAAKL,qBAAuBW,EAAiB,EAAKN,KAAKL,mBAAqBW,EAAiB,GAAK,EAC7HN,KAAKL,mBAAqBW,EAGvBN,KAAKK,oBACNL,KAAKK,qBAGJL,KAAKQ,kBACNR,KAAKQ,qBAGNrB,MAxHHa,KAAKP,UAAUtF,UAAUC,IAAI,cAE7B4F,KAAKS,KAAM,QAAO,UAAYjB,EAAY,IAAMA,EAAY,IAAK,YAE9DD,IACDmB,MAAMC,KAAKpB,EAAGqB,UAAUC,SAASC,GAAMd,KAAKP,UAAUhF,OAAOqG,KAE7DvB,EAAG9E,OAAOuF,KAAKP,YAKZsB,oBACFf,KAAKgB,sBAIRhB,KAAKgB,qBAAsB,EAC3BhB,KAAKP,UAAUd,iBAAiB,SAAUqB,KAAKD,SAAU,CAACd,SAAS,EAAMgC,SAAS,KAG7EC,uBACDlB,KAAKgB,sBAIThB,KAAKgB,qBAAsB,EAC3BhB,KAAKP,UAAUrC,oBAAoB,SAAU4C,KAAKD,SAAU,CAACkB,SAAS,KAGjEE,eACFnB,KAAKoB,+BAIR1E,OAAOiC,iBAAiB,SAAUqB,KAAKD,SAAU,CAACd,SAAS,IAC3De,KAAKe,oBAELf,KAAKoB,8BAA+B,SAAuB,KACzDpB,KAAKH,4BAA6B,EAE/BG,KAAKN,kBACNM,KAAKC,gBACLD,KAAKF,yBAA0B,MAEhC,KACDE,KAAKH,4BAA6B,EAE/BG,KAAKF,0BACNE,KAAKD,WACLC,KAAKF,yBAA0B,OAK9BuB,kBACDrB,KAAKoB,+BAIT1E,OAAOU,oBAAoB,SAAU4C,KAAKD,UAC1CC,KAAKkB,uBAELlB,KAAKoB,+BACLpB,KAAKoB,kCAA+BE,GAG/BC,UACLvB,KAAKqB,kBACLrB,KAAKK,wBAAqBiB,EAC1BtB,KAAKE,mBAAgBoB,EACrBtB,KAAKG,sBAAmBmB,EAGnB7G,OAAO+G,GACZxB,KAAKP,UAAUhF,OAAO+G,GAGjBC,kBAAkB9H,GAEvB,OAAO,OAAiB,OAAD,wBAClBA,GAAO,CACV8F,UAAWO,KAAKP,aAyCbQ,gBACFD,KAAKN,kBAENgC,aAAa1B,KAAKN,iBAClBM,KAAKN,gBAAkB,IAQd,MAAMiC,UAAmBtC,EAKtCC,YAAYC,EAAiBC,EAAY,GAAWoC,EAAiB,IAAKC,GACxEC,MAAMvC,EAAIC,GADwC,KAAAoC,eAAAA,EAF7C,KAAAG,UAAiC,CAACnE,KAAK,EAAMoE,QAAQ,GAsBrD,KAAAxB,iBAAmB,KACxB,IAAKR,KAAKE,gBAAkBF,KAAKG,iBAAmB,OAEpD,GAAGH,KAAKH,2BAEN,YADAG,KAAKD,WAIP,MAAMkC,EAAejC,KAAKP,UAAUwC,aACpC,IAAIA,EACF,OAGF,MACMC,EAAeD,EADAjC,KAAKP,UAAU0C,aAE9BC,EAAYpC,KAAKL,mBAIpBK,KAAKE,eAAiBkC,GAAapC,KAAK4B,gBAAkB5B,KAAKJ,qBAAuB,GACvFI,KAAKE,gBAGJF,KAAKG,kBAAqB+B,EAAeE,GAAcpC,KAAK4B,gBAAkB5B,KAAKJ,qBAAuB,GAC3GI,KAAKG,oBAlCPH,KAAKP,UAAUtF,UAAUC,IAAI,gBAC7B4F,KAAKmB,eACLnB,KAAKO,eAAiB,YAGjB8B,oBAAoB9C,GACzBS,KAAKI,QAAUb,EACfS,KAAKS,IAAI,uBAAwBlB,EAAIS,MA+BhCpE,WAAW0G,IACftC,KAAKI,SAAWJ,KAAKuC,SAAWvC,KAAKP,WAAW7D,WAAW0G,GAGvD7H,UAAU6H,IACdtC,KAAKI,SAAWJ,KAAKuC,SAAWvC,KAAKP,WAAWhF,UAAU6H,GAGtDE,mBACL,OAAOxC,KAAKiC,aAAehF,KAAKwF,MAAMzC,KAAKoC,UAAYpC,KAAKP,UAAUiD,cAGpEC,qBACF,OAAO3C,KAAKwC,oBAAsB,EAGhCJ,cAAUjE,GACZ6B,KAAKP,UAAU2C,UAAYjE,EAGzBiE,gBAEF,OAAOpC,KAAKP,UAAU2C,UAGjBQ,qBAAqBC,GAC1B7C,KAAKL,mBAAqBkD,EAC1B7C,KAAK8C,wBAEL9C,KAAKoC,UAAYS,EAGZC,wBACF9C,KAAKoB,+BACNpB,KAAKkB,uBACLlB,KAAKP,UAAUd,iBAAiB,UAAWL,KACzC,OAAYA,GACZ0B,KAAKe,sBACJ,CAACE,SAAS,EAAMhC,SAAS,EAAOH,MAAM,KAIzCmD,mBACF,OAAOjC,KAAKP,UAAUwC,cAInB,MAAMc,UAAoB1D,EAC/BC,YAAYC,EAAiBC,EAAY,GAAWoC,EAAiB,IAAYoB,EAAa,GAAWvD,EAAyB5F,SAASC,cAAc,QAKvJ,GAJAgI,MAAMvC,EAAIC,EAAWC,GAD6B,KAAAmC,eAAAA,EAA6B,KAAAoB,WAAAA,EAAwB,KAAAvD,UAAAA,EAGvGO,KAAKP,UAAUtF,UAAUC,IAAI,iBAEzB,IAAoB,CACtB,MAAM6I,EAAsB3E,KACtBA,EAAE4E,QAAUlD,KAAKP,UAAU0D,YAAcnD,KAAKP,UAAU2D,cAC1DpD,KAAKP,UAAU4D,YAAc/E,EAAEgF,OAAS,GACxC,OAAYhF,KAIhB0B,KAAKP,UAAUd,iBAAiB,QAASsE,EAAoB,CAAChE,SAAS,IAGzEe,KAAKO,eAAiB,gB,2ECjQ1B,MAAMgD,EAAgB,IAjEtB,oBACU,KAAAC,SAGH,GACG,KAAAC,IAAM,UAAa,MACnB,KAAAC,WAAY,EAEZC,GAAGC,EAAuCpI,GAChD,IAAIqI,EAAU7D,KAAKwD,SAASI,GAU5B,OATIC,IACF7D,KAAK8D,gBACLD,EAAU7D,KAAKwD,SAASI,IAAQ,eAGlBtC,IAAb9F,GACDqI,EAAQE,MAAK,IAAMvI,MAGdqI,EAGFG,QAAQxI,GACb,OAAOwE,KAAK2D,GAAG,OAAQnI,GAGlByI,OAAOzI,GACZ,OAAOwE,KAAK2D,GAAG,QAASnI,GAQnB0I,cAAc1C,EAAsBhG,GACzC,MAAM2I,GAAc,OAAQ3C,GACtBqC,EAAUM,EAAcnE,KAAKiE,SAAWxI,QAAQC,UAUtD,YARgB4F,IAAb9F,IACE2I,EACD3I,IAEAqI,EAAQE,MAAK,IAAMvI,OAIhBqI,EAGDC,gBACF9D,KAAK0D,YACP1D,KAAK0D,WAAY,EAEjB1D,KAAKyD,KAAI,KACPzD,KAAKwD,SAASY,MAAQpE,KAAKwD,SAASY,KAAK1I,UACzCsE,KAAKwD,SAASa,OAASrE,KAAKwD,SAASa,MAAM3I,UAE3CsE,KAAK0D,WAAY,EACjB1D,KAAKwD,SAAW,SAOxB,OAAmB,mBAA+BD,GAClD,W,8CCtEe,MAAMe,EAQnBhF,YAAY3F,GAMVqG,KAAKwB,QAAU3H,SAAS0K,KAAKzI,cAAc,IAAMnC,EAAQD,WAIzDsG,KAAKP,UAAY5F,SAASC,cAAc,OACxCkG,KAAKP,UAAU/F,UAAY,yBAE3BsG,KAAKwE,SAAW3K,SAASC,cAAc,OACvCkG,KAAKwE,SAAS9K,UAAY,aAE1BsG,KAAKyE,MAAQ5K,SAASC,cAAc,MACjCH,EAAQ+K,cACT1E,KAAKyE,MAAMhK,QAAO,QAAKd,EAAQ+K,eAGjC1E,KAAK2E,SAAW9K,SAASC,cAAc,KACvCkG,KAAK2E,SAASjL,UAAY,WACvBC,EAAQiL,iBACT5E,KAAK2E,SAASlK,QAAO,QAAKd,EAAQiL,kBAGpC5E,KAAKP,UAAUhF,OAAOuF,KAAKwE,SAAUxE,KAAKyE,MAAOzE,KAAK2E,UAEnDhL,EAAQkL,mBACT7E,KAAK8E,aAAejL,SAASC,cAAc,OAC3CkG,KAAK8E,aAAapL,UAAY,gBAC9BsG,KAAKP,UAAUhF,OAAOuF,KAAK8E,eAG7B9E,KAAKwB,QAAQ/G,OAAOuF,KAAKP,c,uKC7B7B,IAAIsF,EAAyC,KAE7C,MAoJA,EANa,IAAI,IAAK,eAAe,GA9IhB,KACnB,MAAMC,EAAO,IAAI,IAAU,CACzBtL,UAAW,cACXmL,kBAAkB,EAClBH,aAAc,WACdE,gBAAiB,4BAGnBI,EAAKR,SAASrK,UAAUC,IAAI,eAE5B4K,EAAKP,MAAMtK,UAAUC,IAAI,YAEzB,MAAM6K,EAAgBpL,SAASC,cAAc,UAC7CmL,EAAcC,GAAK,gBACnBD,EAAcvL,UAAY,qBAE1B,MAAMyL,EAAStL,SAASC,cAAc,QAKtC,IAAIsL,EAJJD,EAAOzL,UAAY,wBAEnBsL,EAAKR,SAAS/J,OAAOwK,EAAeE,GAGpCH,EAAKR,SAAS7F,iBAAiB,SAAS,KACtC,gBAAyB,KAAa0G,KAAKJ,GAAgBK,IACzDF,EAAeE,QAInB,MAAMC,EAAejH,IACnB,MAAMkH,EAAOC,EAAe5C,OAAS,GAC/B6C,EAAWC,EAAmB9C,OAAS,GAEvC+C,EAAWJ,GAAQE,GACtBF,EAAO,IAAME,GAAUG,OACxB,GAECD,GAAU,OAAeZ,EAAKP,OAAO,OAAcmB,KACjD,OAAeZ,EAAKP,OAAO,QAAK,cAiBjCgB,EAAiB,IAAI,IAAW,CACpCK,MAAO,YACPC,UAAW,KAGPJ,EAAqB,IAAI,IAAW,CACxCG,MAAO,WACPC,UAAW,KAGPC,GAAY,OAAO,iCACnBC,EAAU,IAAI,iBAAiB,CAACC,IAAK,mBAwE3C,OAvEAF,EAAUvL,OAAOwL,EAAQzE,SAEzBwD,EAAKF,aAAarK,OAAOgL,EAAehG,UAAWkG,EAAmBlG,UAAWuG,GAEjFP,EAAeU,MAAMxH,iBAAiB,QAAS4G,GAC/CI,EAAmBQ,MAAMxH,iBAAiB,QAAS4G,GAEnDS,EAAUrH,iBAAiB,SAAS,SAAiCL,GACnE,GAAGmH,EAAeU,MAAMhM,UAAU8B,SAAS,UAAY0J,EAAmBQ,MAAMhM,UAAU8B,SAAS,SACjG,OAAO,EAGT,IAAIwJ,EAAe5C,MAAMhE,OAEvB,OADA4G,EAAeU,MAAMhM,UAAUC,IAAI,UAC5B,EAGT4F,KAAK1F,UAAW,EAEhB,MAAMkL,EAAOC,EAAe5C,MAAMgD,OAC5BH,EAAWC,EAAmB9C,MAAMgD,OAEpCO,EAAS,CACbC,aAActB,EAASsB,aACvBC,gBAAiBvB,EAASuB,gBAC1BC,WAAYf,EACZgB,UAAWd,GAKbO,EAAQQ,OAAO,CAACP,IAAK,eACrB,MAAMQ,GAAY,OAAa1G,MAE/B,kCAAwC,cAAeoG,GACtDrC,MAAM4C,IAIE,uBADAA,EAASC,GAEZ,gCAAsCD,EAASE,MAlE9B,IAAIpL,SAAc,CAACC,EAASoL,KACnD,IAAI1B,EAEF,OAAO1J,IAIT0J,IAAerB,MAAMgD,IAGnB,kDAAwDA,GAAWhD,KAAKrI,EAASoL,KAChFA,MAyDgBE,SAAQ,KACnB,8BAAmBjD,MAAMkD,IACvBA,EAAEC,QAAQC,gBAMdlB,EAAQQ,OAAO,CAACP,IAAKS,EAASC,IAC9B5G,KAAK3E,gBAAgB,YACrBqL,EAAUtL,aAMbgM,OAAOC,IACRrH,KAAK3E,gBAAgB,YACrBqL,EAAUtL,SAEHiM,EAAIC,KAEPrB,EAAQQ,OAAO,CAACP,IAAKmB,EAAIC,cAMjC,SACO,IAAI7L,SAASC,IAClBgB,OAAOY,sBAAsB5B,SAIyB6L,IACxDxC,EAAWwC,EAEX,yCAA+C,YAAa,CAACX,EAAG,kBAAmB7B,SAAUwC","sources":["webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/pages/loginPage.ts","webpack://tweb/./src/pages/pageSignUp.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {i18n, LangPackKey} from '../lib/langPack';\r\nimport ripple from './ripple';\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true,\r\n onlyMobile: true,\r\n icon: string,\r\n rippleSquare: true,\r\n text: LangPackKey,\r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"preloader-circular\" viewBox=\"25 25 50 50\">\r\n <circle class=\"preloader-path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-miterlimit=\"10\"/>\r\n </svg>`;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n\r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf<HTMLElement>) {\r\n Array.from(elements).forEach((el) => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport rootScope from '../lib/rootScope';\r\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\r\n\r\nlet rippleClickId = 0;\r\nexport default function ripple(\r\n elem: HTMLElement,\r\n callback: (id: number) => Promise<boolean | void> = () => Promise.resolve(),\r\n onEnd: (id: number) => void = null,\r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n // return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n\r\n const r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n // let animationEndPromise: Promise<number>;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n\r\n // console.log('ripple drawRipple');\r\n\r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n // console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n // handler = () => animationEndPromise.then((duration) => {\r\n // console.log('ripple animation was:', duration);\r\n\r\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n // return;\r\n const elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n\r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n const delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n // });\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n // console.log('ripple after promise', Date.now() - startTime);\r\n // console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n\r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n // r.classList.add('active');\r\n // handler();\r\n });\r\n // });\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\r\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem ||\r\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n const touchEnd = () => {\r\n handler && handler();\r\n };\r\n\r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n // console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n\r\n // console.log('touchstart', e);\r\n touchStartFired = true;\r\n\r\n const {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n\r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n\r\n const {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\r\nimport {logger, LogTypes} from '../lib/logger';\r\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\r\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\r\nimport cancelEvent from '../helpers/dom/cancelEvent';\r\nimport {IS_ANDROID} from '../environment/userAgent';\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\r\n //_el.style.display = '';\r\n //return;\r\n\r\n let el = _el.parentElement;\r\n let height = el.scrollHeight;\r\n let width = el.scrollWidth;\r\n el.style.width = width + 'px';\r\n el.style.height = height + 'px';\r\n _el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map<HTMLElement, Scrollable> = new Map();\r\nconst scrollsIntersector = new IntersectionObserver((entries) => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nconst SCROLL_THROTTLE = IS_ANDROID ? 200 : 24;\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType<typeof logger>;\r\n\r\n public splitUp: HTMLElement;\r\n public onScrollMeasure: number = 0;\r\n\r\n public lastScrollPosition: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n public checkForTriggers?: () => void;\r\n\r\n public scrollProperty: 'scrollTop' | 'scrollLeft';\r\n\r\n protected removeHeavyAnimationListener: () => void;\r\n protected addedScrollListener: boolean;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach((c) => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n // this.onScroll();\r\n }\r\n\r\n public addScrollListener() {\r\n if(this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = true;\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n }\r\n\r\n public removeScrollListener() {\r\n if(!this.addedScrollListener) {\r\n return;\r\n }\r\n\r\n this.addedScrollListener = false;\r\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\r\n }\r\n\r\n public setListeners() {\r\n if(this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.addScrollListener();\r\n\r\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public removeListeners() {\r\n if(!this.removeHeavyAnimationListener) {\r\n return;\r\n }\r\n\r\n window.removeEventListener('resize', this.onScroll);\r\n this.removeScrollListener();\r\n\r\n this.removeHeavyAnimationListener();\r\n this.removeHeavyAnimationListener = undefined;\r\n }\r\n\r\n public destroy() {\r\n this.removeListeners();\r\n this.onAdditionalScroll = undefined;\r\n this.onScrolledTop = undefined;\r\n this.onScrolledBottom = undefined;\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit<ScrollOptions, 'container'>) {\r\n // return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n\r\n public onScroll = () => {\r\n // if(this.debug) {\r\n // this.log('onScroll call', this.onScrollMeasure);\r\n // }\r\n\r\n // return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.cancelMeasure();\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) return;\r\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = window.setTimeout(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollPosition = this.container[this.scrollProperty];\r\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollPosition = scrollPosition;\r\n\r\n // lastScrollDirection check is useless here, every callback should decide on its own\r\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\r\n this.onAdditionalScroll();\r\n }\r\n\r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n // });\r\n }, SCROLL_THROTTLE);\r\n };\r\n\r\n public cancelMeasure() {\r\n if(this.onScrollMeasure) {\r\n // window.cancelAnimationFrame(this.onScrollMeasure);\r\n clearTimeout(this.onScrollMeasure);\r\n this.onScrollMeasure = 0;\r\n }\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public padding: HTMLElement;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n this.scrollProperty = 'scrollTop';\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollPosition;\r\n\r\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n\r\n get scrollTop() {\r\n // this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n\r\n public setScrollTopSilently(value: number) {\r\n this.lastScrollPosition = value;\r\n this.ignoreNextScrollEvent();\r\n\r\n this.scrollTop = value;\r\n }\r\n\r\n public ignoreNextScrollEvent() {\r\n if(this.removeHeavyAnimationListener) {\r\n this.removeScrollListener();\r\n this.container.addEventListener('scroll', (e) => {\r\n cancelEvent(e);\r\n this.addScrollListener();\r\n }, {capture: true, passive: false, once: true});\r\n }\r\n }\r\n\r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n\r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n\r\n this.scrollProperty = 'scrollLeft';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {fastRaf} from './schedulers';\r\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\r\nimport {MOUNT_CLASS_TO} from '../config/debug';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise<void>,\r\n write: CancellablePromise<void>\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise<void>();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element\r\n * @param callback\r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const isConnected = isInDOM(element);\r\n const promise = isConnected ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n if(isConnected) {\r\n callback();\r\n } else {\r\n promise.then(() => callback());\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport {LangPackKey, i18n} from '../lib/langPack';\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n // this.element = document.createElement('div');\r\n // this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n\r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\r\nimport type {InputFile} from '../layer';\r\nimport type {AuthState} from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport {putPreloader} from '../components/putPreloader';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport I18n, {i18n} from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport PopupElement from '../components/popups';\r\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\r\nimport rootScope from '../lib/rootScope';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n\r\n let uploadAvatar: () => CancellablePromise<InputFile>;\r\n page.imageDiv.addEventListener('click', () => {\r\n PopupElement.createPopup(PopupAvatar).open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName ?\r\n (name + ' ' + lastName).trim() :\r\n '';\r\n\r\n if(fullName) replaceContent(page.title, wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n const sendAvatar = () => new Promise<void>((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n // console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n // console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n // console.log('uploaded smthn', inputFile);\r\n\r\n rootScope.managers.appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n // console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n rootScope.managers.apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n // console.log('auth.signUp response:', response);\r\n\r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n rootScope.managers.apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then((m) => {\r\n m.default.mount();\r\n });\r\n });\r\n\r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch((err) => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n};\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n rootScope.managers.appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","remove","removeAttribute","rippleClickId","ripple","callback","Promise","resolve","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","e","target","includes","tagName","touchEnd","addEventListener","touches","length","once","cancelBubble","stopPropagation","passive","dataset","SCROLL_THROTTLE","IS_ANDROID","ScrollableBase","constructor","el","logPrefix","container","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","onScroll","this","cancelMeasure","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollPosition","scrollProperty","checkForTriggers","log","Array","from","children","forEach","c","addScrollListener","addedScrollListener","capture","removeScrollListener","setListeners","removeHeavyAnimationListener","removeListeners","undefined","destroy","element","scrollIntoViewNew","clearTimeout","Scrollable","onScrollOffset","withPaddingContainer","super","loadedAll","bottom","scrollHeight","maxScrollTop","clientHeight","scrollTop","setVirtualContainer","elements","padding","getDistanceToEnd","round","offsetHeight","isScrolledDown","setScrollTopSilently","value","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","clientWidth","scrollLeft","deltaY","sequentialDom","promises","raf","scheduled","do","kind","promise","scheduleFlush","then","measure","mutate","mutateElement","isConnected","read","write","LoginPage","body","imageDiv","title","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","authCode","page","avatarPreview","id","addIco","uploadAvatar","open","_uploadAvatar","handleInput","name","nameInputField","lastName","lastNameInputField","fullName","trim","label","maxLength","btnSignUp","btnI18n","key","input","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","response","_","user","reject","inputFile","finally","m","default","mount","catch","err","type","_authCode"],"sourceRoot":""}