1 line
42 KiB
Plaintext
1 line
42 KiB
Plaintext
{"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":""} |