VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /opt/mattermost/client/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //opt/mattermost/client/4446.48b3a9bdca24c9dbd111.js.map
{"version":3,"file":"4446.48b3a9bdca24c9dbd111.js","mappings":"qRA8BA,MAAMA,EAAeC,IAMR,IANS,KAClBC,EAAI,MACJC,EAAK,SACLC,EAAQ,SACRC,EAAQ,KACRC,EAAO,IACHL,EACAM,EAAgB,SAATL,EAAkBM,IAAAA,cAACC,EAAAA,gBAAe,CAACH,KAAMA,IAAUE,IAAAA,cAACE,EAAAA,uBAAsB,CAACJ,KAAMA,IAC5F,MAAMK,EAAYR,IAASS,EAAAA,EAAAA,IAAiBT,GACtCU,GAAgBC,EAAAA,EAAAA,cAAaC,GAA0D,UAAnCC,EAAAA,EAAAA,IAAUD,GAAOE,gBAyB3E,OAvBIN,EACAJ,EACIC,IAAAA,cAACU,EAAAA,EAAW,CACRP,UAAWA,EACXL,KAAMA,IAGPF,EACPG,EACIC,IAAAA,cAACW,EAAe,CACZC,KAAKC,EAAAA,EAAAA,IAAYjB,EAAUS,GAC3BP,KAAMA,IAGPD,IACPE,EACIC,IAAAA,cAACc,EAAAA,EAAa,CACVjB,SAAUA,EACVkB,gBAAgB,KAMxBf,IAAAA,cAACgB,EAAI,CAACC,MAAOnB,GACRC,EACE,EAEbP,EAAA0B,UAAA,CA7CEvB,MAAKwB,IAAAA,OACLvB,SAAQuB,IAAAA,OAERrB,KAAIqB,IAAAA,MAAA,CAAG,GAAK,MA4ChB,UAEMH,EAAOI,IAAAA,IAAUC,WAAA,CAAAC,YAAA,QAAVF,CAAU,4JAONG,IAAA,IAAEN,MAAOnB,GAAKyB,EAAA,OAAKzB,CAAI,IACtB0B,IAAA,IAAEP,MAAOnB,GAAK0B,EAAA,OAAK1B,CAAI,IACd2B,IAAA,IAAER,MAAOnB,GAAK2B,EAAA,MAAY,GAAP3B,CAAU,IAAM4B,IAAA,IAAET,MAAOnB,GAAK4B,EAAA,OAAK5B,CAAI,IAM/Ea,EAAkBS,IAAAA,IAAUC,WAAA,CAAAC,YAAA,mBAAVF,CAAU,+BACrBO,IAAA,IAAC,KAAC7B,GAAK6B,EAAA,OAAK7B,CAAI,IACf8B,IAAA,IAAC,KAAC9B,GAAK8B,EAAA,OAAK9B,CAAI,G,8VCvD9B,MAAM+B,EAAuBpC,IAahB,IAAA8B,EAAA,IAbiB,UAC1BO,EAAS,KACTpC,EAAI,SACJE,EAAQ,SACRC,EAAQ,MACRF,EAAK,SACLoC,EAAQ,YACRC,EAAW,YACXV,EAAW,eACXW,EAAc,gBACdC,EAAe,mBACfC,EAAkB,sBAClBC,GACI3C,EACJ,MAAM,cAAC4C,IAAiBC,EAAAA,EAAAA,WAElBC,GAAYC,EAAAA,EAAAA,QAA0B,MAGtCzC,EACFC,IAAAA,cAACR,EAAAA,EAAY,CACTE,KAAMA,EACNI,KAAM,GACNH,MAAOA,EACPE,SAAUA,EACVD,SAAUA,IAIZ6C,EAAqBA,KAClBF,EAAUG,SAIfC,SAASC,cAAc,IAAIC,YACvBC,EAAAA,GAAqBC,MAAO,CACxBC,OAAQ,CACJC,OAAQV,EAAUG,QAClBQ,cAAc,KAGxB,EAYAC,EAAmBA,KACrBpB,EAAS,GAAG,EAQVqB,GAA8DC,EAAAA,EAAAA,cAAaC,IAC7ErB,EAAeqB,EAAEC,cAAcC,MAAM,GACtC,IAeH,OACIxD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACyD,EAAW,KACPvB,GACGlC,IAAAA,cAAC0D,EAAAA,EAAkB,CACfT,OAnECU,IAAMpB,EAAUG,QAoEjBkB,KAAM1B,EACN2B,OA7BKC,KACrB3B,GAAmB,GACnBM,GAAoB,EA4BJsB,aAzCMC,IACtB7B,GAAmB,GACnB,MAAMhC,EAAa,eAAgB6D,EAAiBA,EAAcC,WAAaD,EAAcE,KAC7FnC,EAAS,IAADoC,OAAKhE,EAAS,MACtBsC,GAAoB,EAsCJ2B,UAAU,QACVhC,sBAAuBA,IAI/BpC,IAAAA,cAAA,UACIqE,IAAK9B,EACL7C,KAAK,SACL4E,QApDUC,IAAMpC,GAAoBqC,IAAUA,IAqD9CC,UA/BYnB,KACpBoB,EAAAA,EAAAA,GAAapB,EAAGqB,EAAAA,GAAUC,SAASC,QACnCvB,EAAEwB,iBACN,EA6BY,aAAYzC,EAAc,CAAC0C,GAAI,4CAA6CC,eAAgB,oBAC5F,gBAAe9C,EAAkB,OAAS,QAE1C+C,UAAU,wFAETlF,EACDC,IAAAA,cAACkF,EAAAA,gBAAe,CAACpF,KAAM,UAE3BE,IAAAA,cAACmF,EAAAA,EAAK,CACFrD,UAAWA,EACXpC,KAAK,OACLwE,KAAK,wBACLkB,SAAUhC,EACVI,MAAiC,QAA5BjC,EAAED,QAAAA,EAAeU,SAAW,IAAAT,EAAAA,EAAI,GACrCS,YAAaA,EACb,cAAY,aACZqD,WAAW,IAEfrF,IAAAA,cAACsF,EAAK,CACFC,QAASC,QAAQ7F,GACjB8F,SAAU,EACVnB,QAASnB,EACTsB,UAhDiBnB,MACzBoB,EAAAA,EAAAA,GAAapB,EAAGqB,EAAAA,GAAUC,SAASC,SAAUH,EAAAA,EAAAA,GAAapB,EAAGqB,EAAAA,GAAUC,SAASc,UAChFpC,EAAEwB,kBACF3B,IACJ,GA8CYnD,IAAAA,cAAC2F,EAAAA,iBAAgB,CACbZ,GAAG,mDACHC,eAAe,mBAI5B,EAETnD,EAAAX,UAAA,CA/IEY,UAASX,IAAAA,OAAAyE,WAST1D,gBAAef,IAAAA,KAAAyE,WAEfxD,sBAAqBjB,IAAAA,MAsIzB,MAAMmE,EAAQlE,IAAAA,EAAQC,WAAA,CAAAC,YAAA,SAARF,CAAQ,oCAEJI,IAAA,IAAC,QAAC+D,GAAQ/D,EAAA,OAAM+D,EAAU,UAAY,QAAQ,IAG1D9B,EAAcrC,IAAAA,IAAUC,WAAA,CAAAC,YAAA,eAAVF,CAAU,4VAiC9B,I,eCrJA,SAASyE,EAA0BpG,GAQzB,IAAA8B,EAAAuE,EAAAC,EAAAC,EAAA,IAR0B,SAChCC,EAAQ,aACRC,EACAC,KAAMC,EAAY,UAClBC,EAAS,SACTC,EAAQ,UACRC,EAAS,OACT1C,GACIpE,EACJ,MAAM,cAAC4C,IAAiBC,EAAAA,EAAAA,WAClBkE,GAAWC,EAAAA,EAAAA,eAGX/G,EAAqC,QAAjC6B,EAAiB,QAAjBuE,EAAGG,aAAQ,EAARA,EAAUvG,YAAI,IAAAoG,EAAAA,EAAII,SAAY,IAAA3E,EAAAA,EAAI,QACxCW,EAAiBC,IAAsBuE,EAAAA,EAAAA,WAAS,IAChD/G,EAAOoC,IAAY2E,EAAAA,EAAAA,UAAwB,QAAhBX,EAACE,aAAQ,EAARA,EAAUtG,aAAK,IAAAoG,EAAAA,EAAI,KAC/CzE,EAAaW,IAAkByE,EAAAA,EAAAA,UAA6BT,aAAQ,EAARA,EAAUU,eACtEC,EAAmBC,IAAwBH,EAAAA,EAAAA,aAC3CI,EAAQC,IAAaL,EAAAA,EAAAA,WAAS,IAC9BM,EAAWC,KAAgBP,EAAAA,EAAAA,UAAS,IAErCQ,IAAgB7D,EAAAA,EAAAA,cAAa8D,KAC3BzC,EAAAA,EAAAA,GAAayC,EAAOxC,EAAAA,GAAUC,SAASwC,UAAYlF,GACnD2B,GACJ,GACD,CAAC3B,EAAiB2B,KAErBwD,EAAAA,EAAAA,YAAU,KACN1E,SAAS2E,iBAAiB,UAAWJ,IAE9B,KACHvE,SAAS4E,oBAAoB,UAAWL,GAAc,IAE3D,CAACA,KAGJ,MAAMnH,GAAOkG,aAAQ,EAARA,EAAUuB,WAChBC,GAAMC,KAAgBhB,EAAAA,EAAAA,UAA2B,QAAnBV,EAACC,aAAQ,EAARA,EAAU0B,gBAAQ,IAAA3B,EAAAA,EAAI,IACtD4B,IAAWpF,EAAAA,EAAAA,QAAOiF,KACjBI,GAAeC,KAAoBpB,EAAAA,EAAAA,YACpCqB,IAAU1E,EAAAA,EAAAA,cAAaG,IACzBkE,IAAcM,IACVJ,GAASlF,QAAUsF,EACZxE,KAENA,GACDsE,QAAiBG,EACrB,GACD,KAEIC,IAAYC,QAASC,GAAcC,WAAYC,KAAoBC,EAA0Bd,KAASG,GAASlF,QAAU,GAAK+E,IAAM,CAACI,EAAeW,KAClJA,GACDV,GAAiBD,GAErB,MAAMY,GAASC,EAAAA,EAAAA,IAAab,GAC5BhB,EAAqB4B,GACrBxG,EAAewG,EAAO,IAGpBE,IAAmBtF,EAAAA,EAAAA,cAAaC,IAClC,MAAM,MAACE,GAASF,EAAEL,OAClB8E,GAAQvE,EAAM,GACf,IAGGoF,IAAiBC,EAAAA,EAAAA,OAChBC,GAAaC,KAAkBrC,EAAAA,EAAAA,aAC/BsC,GAAWC,KAAgBvC,EAAAA,EAAAA,UAAS,KACpCwC,GAAQC,KAAazC,EAAAA,EAAAA,UAAST,aAAQ,EAARA,EAAUmD,SACzCC,IAAmB7G,EAAAA,EAAAA,UACnB3C,IAAiCS,EAAAA,EAAAA,cAAaC,GAAwB2I,KAAUI,EAAAA,EAAAA,IAAQ/I,EAAO2I,UAAYjB,IAE3GsB,IAAcjJ,EAAAA,EAAAA,cAAaC,IAC7B,MAAMiJ,GAAShJ,EAAAA,EAAAA,IAAUD,GACzB,OAAOkJ,SAASD,EAAOE,aAAe,GAAI,GAAG,IAE3CC,GAAgBJ,GAAc,QAiB9BK,IAAoBvG,EAAAA,EAAAA,cAAaC,IAAqC,IAAAuG,EACxE,MAAM1D,EAAqB,QAAjB0D,EAAGvG,EAAEL,OAAO6G,aAAK,IAAAD,OAAA,EAAdA,EAAiB,GACzB1D,GAIL4D,GAAa5D,EAAK,GACnB,IASG6D,IAAexH,EAAAA,EAAAA,QAAyB,MACxCyH,GACFjK,IAAAA,cAAA,SACIN,KAAK,OACLqF,GAAG,sCACHE,UAAU,6BACVZ,IAAK2F,GACL5E,SAAUwE,KAIZM,GAAwCC,IAC1CpB,GAAeoB,EAAQ,EAErBC,GAAqC5I,IAA6B,IAA3B6I,WAAYC,GAAU9I,EAC/DuH,GAAe,MACf,MAAMwB,EAAoBD,aAAS,EAATA,EAAY,GAClCC,GACApB,GAAUoB,EAAQxF,IAEtBkE,GAAa,GAAG,EAEduB,GAAiCA,KACnCzB,GAAe,MACfE,GAAa5G,EAAc,CAAC0C,GAAI,iCAAkCC,eAAgB,6CAA6C,EAG7HyF,GAAmBnJ,GAAesF,IAA+B,SAATlH,EAAkBG,cAAQ,EAARA,GAAUqE,KAAO+B,aAAQ,EAARA,EAAU0B,WAAa,GAElHoC,GAAgB5D,IAIlB,GAHA4C,GAAe,MACfI,GAAU,IAENhD,EAAKrG,KAAOyJ,GAMZ,YALAN,GAAa5G,EAAc,CACvB0C,GAAI,wBACJC,eAAgB,wDACjB,CAAC0F,IAAKf,GAAegB,SAAUxE,EAAKjC,QAK3C,GAAkB,IAAdiC,EAAKrG,KAML,YALAmJ,GAAa5G,EAAc,CACvB0C,GAAI,4BACJC,eAAgB,+CACjB,CAAC2F,SAAUxE,EAAKjC,QAKvB+E,GAAa,IACTwB,MAAqB5K,cAAQ,EAARA,GAAUqE,OAC/BjC,EAAekE,EAAKjC,MAExB2C,EAAqBV,EAAKjC,MAE1B,MAAM0G,GAAWC,EAAAA,EAAAA,MAEjBxB,GAAiB3G,QAAU8D,GAASsE,EAAAA,EAAAA,GAAW,CAC3C3E,OACAjC,KAAMiC,EAAKjC,KACXxE,KAAMyG,EAAKzG,KACXqL,OAAQ,GACR1E,YACAuE,WACAV,cACAE,aACAI,aACD,GAAmC,GAG1CnD,EAAAA,EAAAA,YAAU,KACFjB,GACA2D,GAAa3D,EACjB,GACD,CAACA,IAEJ,MAAM4E,IAAiB3H,EAAAA,EAAAA,cAAY,KAAM,IAAA4H,EACb,QAAxBA,EAAA5B,GAAiB3G,eAAO,IAAAuI,GAAxBA,EAA0BC,QAC1B5E,SAAAA,GAAY,GACb,CAACA,IAGE6E,GACEV,MAAqBxE,aAAQ,EAARA,EAAUU,mBAI9BhH,GAASsG,SAAAA,EAAUtG,QAAUA,KAAUsG,aAAQ,EAARA,EAAUtG,WAIzC,SAATD,IACIwJ,IAAUA,MAAWjD,aAAQ,EAARA,EAAUmD,WAK1B,SAAT1J,GACO8F,QAAQiC,IAAQA,MAASxB,aAAQ,EAARA,EAAU0B,WAK5CyD,GAAU,MACZ,GAAa,SAAT1L,EAAiB,CACjB,IAAK+H,IAAQS,GACT,OAAO,EAEX,GAAIT,IAAQa,GACR,OAAO,EAGX,GAAIT,IAAiBJ,MAASxB,aAAQ,EAARA,EAAU0B,UACpC,OAAO,CAEf,CAEA,GAAa,SAATjI,EACA,SAAKG,KAAa4K,IAAoBzB,GAQ7C,EAvBe,GAyBVqC,IAAShI,EAAAA,EAAAA,cAAY,KACF,IAAAiI,EAAR,SAAT5L,IACwB,QAAxB4L,EAAAjC,GAAiB3G,eAAO,IAAA4I,GAAxBA,EAA0BJ,QAC9B,GACD,CAACxL,IAEE6L,IAAUlI,EAAAA,EAAAA,cAAYmI,UAExB,GADAzE,GAAU,GACG,SAATrH,EAAiB,CACjB,MAAM+L,EAAMC,EAAajE,IAEzB,IAAKgE,EAED,YADAxE,GAAa5E,EAAcsJ,EAAIC,cAInC,IAAIC,EAAYJ,EAAIK,WAEhBD,EAAUE,SAAS,OACnBF,EAAYA,EAAUG,MAAM,GAAI,IAGpC,MAAOC,KAAMC,SAAiB3F,EAAU,CACpCiB,UAAWzH,GACX4H,SAAUkE,EACVlM,QACAgH,aAAc8D,GACd/K,KAAM,SAGVqH,GAAU,GAENmF,GACAjF,GAAa,IACbpD,KAEAoD,GAAa5E,EAAcsJ,EAAI3E,WAEvC,MAAO,GAAInH,GAAU,CACjB,MAAOoM,KAAMC,SAAiB3F,EAAU,CACpC6C,QAASvJ,GAASkF,GAClB4B,aAAc8D,GACd/K,KAAM,OACNC,UAGAuM,GACAjF,GAAa,IACbpD,KAEAoD,GAAa5E,EAAcsJ,EAAI3E,WAEvC,IACD,CAACtH,EAAM+H,GAAMlB,EAAW1C,EAAQhE,GAAU4K,GAAkB9K,EAAOI,KAEhEoM,GAAkBrF,IAAWsE,KAAYD,GAE/C,IAAIiB,GACAhE,GAEAgE,GAAsBpM,IAAAA,cAACqM,EAAAA,EAAc,MAC9BxE,KAAkBK,KAEzBkE,GAAsBE,GAG1B,IAAIC,GAAclK,EAAcsJ,EAAIa,iBACpC,GAAIlE,GAAiB,CACjB,MAAMmD,EAAMC,EAAajE,IACrBgE,IACAc,GAAclK,EAAcsJ,EAAIc,mBAAoB,CAAChF,KAAMgE,EAAIK,aAEvE,CAEA,OACI9L,IAAAA,cAAC0M,EAAAA,GAAY,CACTC,cAAezK,EACf0K,gBAAgB,EAChB3H,UAAU,iCACV4H,gBAAiBxK,EAAc4D,EAAW0F,EAAImB,YAAcnB,EAAIoB,SAChEC,kBAAmB3K,EAAc4D,EAAW0F,EAAIsB,SAAWtB,EAAIuB,iBAC/DC,aAAc9B,GACd+B,cAAe7B,GACf8B,qBAAuBlB,IAAmBZ,SAAYtD,EACtD3B,SAAU0E,GACVsC,eAAe,EACfC,kBAAmBpB,GACnBqB,0BAA0B,EAC1BC,UAAWzG,GAEXhH,IAAAA,cAAAA,IAAAA,SAAA,KACc,SAATN,EACGM,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACmF,EAAAA,EAAK,CACFrD,UA9VJ,KA+VIpC,KAAK,OACLwE,KAAK,gBACLwJ,mBAAmB,YACnB1L,YAAaK,EAAcsJ,EAAIgC,iBAC/BvI,SAAUuD,GACViF,SAAUpI,QAAQ0C,IAClB1E,MAAOiE,GACP,cAAY,YACZoG,WAAW,EACXC,MAAO1B,GACP2B,cAAe7F,GAAY,CAACxI,KAAM,QAAS8D,MAAO0E,IAAa,CAAC1E,MAAO+I,OAI/EvM,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACgO,EAAU,KACPhO,IAAAA,cAAC2F,EAAAA,iBAAgB,CACbZ,GAAG,4CACHC,eAAe,gBAGvBhF,IAAAA,cAACiO,EAAkB,CACfxI,SAAU,EACVyI,KAAK,SACLC,UAAWvF,GACXtE,QAAUsE,IAzRLtF,KAAkC,IAAA8K,EAC3D,MAAMC,EAAa1L,SAAS2L,cAAc,wJAKtCD,IAAe/K,EAAEL,QACjBoL,SAAAA,EAAYE,SAASjL,EAAEL,SAKP,QAApBmL,EAAApE,GAAatH,eAAO,IAAA0L,GAApBA,EAAsBI,OAAO,SA6Q2CvG,IAElDa,IAAejJ,IACbG,IAAAA,cAACyO,EAAiB,KACdzO,IAAAA,cAAC0O,EAAAA,EAAc,CACXC,IAAK9O,GAASkF,GACdlF,SAAUA,GACV+O,MAAO,KAIlB9F,IACG9I,IAAAA,cAAC6O,EAAAA,EAAmB,CAChBF,IAAK7F,GAAY8B,SACjBA,SAAU9B,GAAY8B,SACtB/K,SAAUiJ,GACVgG,aAjRPC,KAAM,IAAAC,EAC3BjG,GAAe,MACfI,GAAUlD,aAAQ,EAARA,EAAUmD,SACpBvC,OAAqBoB,GACG,QAAxB+G,EAAA3F,GAAiB3G,eAAO,IAAAsM,GAAxBA,EAA0B9D,OAAO,KAgRXrL,KAAaiJ,IACX9I,IAAAA,cAAA,OAAKiF,UAAU,kCAEnBjF,IAAAA,cAACiP,EAAY,KACTjP,IAAAA,cAACkP,EAAAA,kBAAiB,CAACpP,KAAM,KACxBuC,EAAcsJ,EAAIwD,gBAEtBlF,IAEJjB,IACGhJ,IAAAA,cAAA,OAAKiF,UAAU,uCACXjF,IAAAA,cAAA,KAAGiF,UAAU,yCACbjF,IAAAA,cAAA,YAAOgJ,MAOvBhJ,IAAAA,cAACoP,EAAY,KACTpP,IAAAA,cAACgO,EAAU,KACPhO,IAAAA,cAAC2F,EAAAA,iBAAgB,CACbZ,GAAG,6CACHC,eAAe,WAGvBhF,IAAAA,cAAC6B,EAAoB,CACjBC,UAraC,GAsaDpC,KAAMA,EACNE,SAAUG,GACVF,SAAUiJ,IAAejJ,GACzBF,MAAOA,EACPoC,SAAUA,EACVT,YAAaA,aAAW,EAAXA,EAAa+N,UAAU,EA3anC,IA4aDrN,YAAayI,cAAgB,EAAhBA,GAAkB4E,UAAU,EA5axC,IA6aDpN,eAAgBA,EAChBG,sBAAuByB,EACvB3B,gBAAiBA,EACjBC,mBAAoBA,MAM5C,CAAC0D,EAAA3E,UAAA,CAnbGmF,UAASlF,IAAAA,OAAAyE,WAGTU,SAAQnF,IAAAA,KAAAyE,WACR/B,OAAM1C,IAAAA,KAAAyE,YAibV,UAEMwJ,EAAehO,IAAAA,IAAUC,WAAA,CAAAC,YAAA,gBAAVF,CAAU,sBAIzBkO,EAAelO,IAAAA,KAAWC,WAAA,CAAAC,YAAA,gBAAXF,CAAW,uDAM1BkL,EACFtM,IAAAA,cAACsP,EAAY,KACTtP,IAAAA,cAACuP,EAAAA,UAAS,CACNzP,KAAM,GACN0P,MAAM,iCAKZxB,EAAa5M,IAAAA,KAAWC,WAAA,CAAAC,YAAA,cAAXF,CAAW,sJAWxB6N,EAAe7N,IAAAA,IAAUC,WAAA,CAAAC,YAAA,gBAAVF,CAAU,mNAazB6M,EAAqB7M,IAAAA,IAAUC,WAAA,CAAAC,YAAA,sBAAVF,CAAU,wjBAe3B6N,GAuDJQ,EAAkBrO,IAAAA,EAAQC,WAAA,CAAAC,YAAA,mBAARF,CAAQ,uDAK1BqN,EAAoBrN,IAAAA,IAAUC,WAAA,CAAAC,YAAA,qBAAVF,CAAU,4DAU9BuK,GAAM+D,EAAAA,EAAAA,gBAAe,CACvB3C,QAAS,CAAChI,GAAI,iCAAkCC,eAAgB,kBAChE8H,YAAa,CAAC/H,GAAI,sCAAuCC,eAAgB,iBACzE2I,gBAAiB,CAAC5I,GAAI,4CAA6CC,eAAgB,QACnFwH,gBAAiB,CAACzH,GAAI,qCAAsCC,eAAgB,sDAC5EyH,mBAAoB,CAAC1H,GAAI,+DAAgEC,eAAgB,yCACzGkI,gBAAiB,CAACnI,GAAI,8CAA+CC,eAAgB,gBACrFiI,SAAU,CAAClI,GAAI,+CAAgDC,eAAgB,iBAC/EmK,cAAe,CAACpK,GAAI,2CAA4CC,eAAgB,QAChF4G,YAAa,CAAC7G,GAAI,6CAA8CC,eAAgB,uDAChFgC,UAAW,CAACjC,GAAI,8CAA+CC,eAAgB,qDAKtEuD,EAA4BA,CAACd,EAAckI,KACpD,MAAM,cAACtN,IAAiBC,EAAAA,EAAAA,YAEjB6F,EAASyH,IAAclJ,EAAAA,EAAAA,aACvBmJ,EAAOC,IAAYpJ,EAAAA,EAAAA,aACnB2B,EAAY0H,IAAiBrJ,EAAAA,EAAAA,WAAS,GACvCwE,GAAQ1I,EAAAA,EAAAA,UAERwN,GAAQ3M,EAAAA,EAAAA,cAAaoI,IACvBmE,EAAWnE,GACXqE,OAAS7H,GACT8H,GAAc,GACd7E,EAAMxI,QAAU,IAAIuN,gBACb/E,EAAMxI,QAAQwN,SACtB,IAEG7E,GAAShI,EAAAA,EAAAA,cAAY,KAAM,IAAA8M,EAChB,QAAbA,EAAAjF,EAAMxI,eAAO,IAAAyN,GAAbA,EAAejF,MAAM,iBACrBA,EAAMxI,aAAUuF,EAChB2H,OAAW3H,EAAU,GACtB,IAgDH,OA9CAZ,EAAAA,EAAAA,YAAU,KACN,MAAM+I,EAAUC,YAAW7E,UAEvB,GADAH,KACK5D,EACD,OAGJ,MAAMgE,EAAMC,EAAajE,GAEzB,IAAKgE,EAGD,OAFAqE,EAASzN,EAAcsJ,EAAIC,YAAa,CAACnE,eACzCmI,OAAW3H,GAIf,MAAMiI,EAASF,EAAMvE,GAErB,UACU6E,MAAM7E,EAAK,CACb8E,KAAM,UACNL,OAAQM,YAAYC,IAAI,CAACP,EAAQM,YAAYE,QA3CzC,SA6CRf,EAAYlI,EAChB,CAAE,MAAOkJ,GAAK,IAAAC,EACNV,KAAwB,QAAlBU,EAAK1F,EAAMxI,eAAO,IAAAkO,OAAA,EAAbA,EAAeV,SAC1BJ,EAtGOe,EAACpF,EAAUF,IAE9BvL,IAAAA,cAAC2F,EAAAA,iBAAgB,CACbZ,GAAG,6DACHC,eAAe,2FACf8L,OAAQ,CACJrF,IAAKA,EAAIK,WACTiF,QAAUpF,GACN3L,IAAAA,cAACyP,EAAe,CACZhK,SAAU,EACVnB,QAASiH,EACT9G,UAAYnB,IACM,UAAVA,EAAEqL,KACFpD,GACJ,GAGHI,MAqFIkF,CAAmBpF,GAAK,KAC7BkE,EAAYlI,GAAM,GAClBsI,GAAc,GACdD,OAAS7H,EAAU,IAG/B,CAAE,QACE2H,GAAYoB,IACR,GAAIA,IAAevF,EAEf,OAAOuF,CAGK,GAExB,IAhEY,KAmEhB,MAAO,IAAMC,aAAab,EAAQ,GACnC,CAAC3I,EAAMuI,EAAO3E,IAEV,CAACwE,EAAO,CAAC1H,QAAS3C,QAAQ2C,GAAUE,cAAY,EAG9CqD,EAAgBwF,IACzB,MAAMC,GAAMC,EAAAA,EAAAA,IAAUF,GAEtB,IAAKC,KAAQE,EAAAA,EAAAA,IAAWF,GACpB,OAAO,KAGX,IAAI1F,EACJ,IACIA,EAAM,IAAI6F,IAAIH,EAClB,CAAE,MAAAI,GACE,OAAO,IACX,CAEA,OAAO9F,CAAG,C,6OCvqBd,SAAS+F,EAAa/R,GAKC,IALA,UACnB4G,EAAS,aACToL,EAAY,aACZC,EAAY,eACZ9I,GACiBnJ,EACjB,MAAM,cAAC4C,IAAiBC,EAAAA,EAAAA,WAClBqP,GAAaF,GAEb,iBAACG,EAAgB,iBAAEC,GAAoBC,EAAsBzL,GAC7D0L,GAASC,EAAAA,EAAAA,IAA6B3L,EAAW,OAEjD4L,EAAmB5P,EAAc,CAAC0C,GAAI,gCAAiCC,eAAgB,mBAEvFkN,EAA0B7P,EAAc,CAAC0C,GAAI,4CAA6CC,eAAgB,0CAA2C,CAACmN,MAAOC,EAAAA,KACnK,IAAIC,EAEAX,EACAW,EAAyBH,EAClBT,IACPY,EAAyBJ,GAG7B,MAAMK,EAAejQ,EAAc,CAAC0C,GAAI,4BAA6BC,eAAgB,eAC/EuN,EAAkBlQ,EAAc,CAAC0C,GAAI,+BAAgCC,eAAgB,kBAE3F,OAAK+M,EAKD/R,IAAAA,cAACwS,EAAmB,CAChBC,UAAWd,GAEX3R,IAAAA,cAAC0S,EAAAA,GAAc,CACXC,aAAc,CAACC,SAAU,SAAUC,WAAY,QAC/CC,gBAAiB,CAACF,SAAU,MAAOC,WAAY,QAC/CE,WAAY,CACRhO,GAAI,iCACJiO,MAAOC,IAAW,6BAA8B,CAACR,UAAWd,EAAWxD,SAAUuD,IACjFwB,SACIlT,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACmT,EAAAA,SAAQ,CAACrT,KAAM6R,EAAY,GAAK,KAChCA,GAAa3R,IAAAA,cAAA,YAAOiS,IAG7B,aAAcA,EACd9D,SAAUuD,GAEd0B,KAAM,CACFrO,GAAI,oCAERsO,kBAAmBhB,EAAyB,CACxCiB,KAAMjB,QACNpK,GAEJjI,IAAAA,cAAC0S,EAAAA,GAAS,CACN/D,IAAI,0BACJ5J,GAAG,0BACHT,QAASsN,EACT2B,eAAgBvT,IAAAA,cAACwT,EAAAA,gBAAe,CAAC1T,KAAM,KACvC2T,OAAQzT,IAAAA,cAAA,YAAOsS,KAElB1J,GACG5I,IAAAA,cAAC0S,EAAAA,GAAS,CACN/D,IAAI,6BACJ5J,GAAG,6BACHT,QAASuN,EACT0B,eAAgBvT,IAAAA,cAAC0T,EAAAA,cAAa,CAAC5T,KAAM,KACrC2T,OAAQzT,IAAAA,cAAA,YAAOuS,OA1CxB,IAgDf,CAACf,EAAAtQ,UAAA,CA/EGmF,UAASlF,IAAAA,OAAAyE,WACT6L,aAAYtQ,IAAAA,KAAAyE,WACZ8L,aAAYvQ,IAAAA,KAAAyE,WACZgD,eAAczH,IAAAA,KAAAyE,YA8ElB,SAAe+N,EAAAA,EAAAA,MAAKnC,GAEdgB,EAAsBpR,IAAAA,IAAUC,WAAA,CAAAC,YAAA,uBAAVF,CAAU,uJAGhCG,IAAA,IAAC,UAACkR,GAAUlR,EAAA,OAAMkR,IAAamB,EAAAA,EAAAA,KAAG,oBAAkB,IAI7C9B,EAAyBzL,IAClC,MAAMG,GAAWC,EAAAA,EAAAA,eAEXoN,GAAexQ,EAAAA,EAAAA,cAAa8C,IAC9BK,GAASsN,EAAAA,EAAAA,GAAU,CACfC,QAASC,EAAAA,GAAiBC,wBAC1BC,WAAYrO,EAAAA,GACZsO,YAAa,CACT9N,YACAH,aAAcC,EAAO,OAAS,OAC9BA,OACAI,UAAWiF,SAAuChF,GAAS4N,EAAAA,EAAAA,IAAe/N,EAAW4F,OAE1F,GACJ,CAAC5F,EAAWG,IA0Bf,MAAO,CAACoL,kBAxBiBvO,EAAAA,EAAAA,cAAY,KACjCwQ,GAAc,GACf,CAACA,IAsBsBhC,kBApBDxO,EAAAA,EAAAA,cAAY,KAAM,IAAAgR,EACvC,MAAMnD,EAA0BvO,SAAS2R,cAAc,SACvDpD,EAAMxR,KAAO,OACbwR,EAAMnM,GAAK,6BACXmM,EAAMqD,QAAS,EAEfrD,EAAM5J,iBAAiB,UAAU,KAAM,IAAAkN,EACnC,MAAMrO,EAAkB,QAAdqO,EAAGtD,EAAMpH,aAAK,IAAA0K,OAAA,EAAXA,EAAc,GACvBrO,GACA0N,EAAa1N,GAEjB+K,EAAMuD,QAAQ,IAElBvD,EAAM5J,iBAAiB,SAAU4J,EAAMuD,QAED,QAAtCJ,EAAA1R,SAAS+R,eAAe,sBAAc,IAAAL,GAAtCA,EAAwCM,YAAYzD,GAEpDA,EAAM1C,OAAO,GACd,CAACqF,IAEuC,C","sources":["webpack://mattermost-webapp/./src/components/channel_bookmarks/bookmark_icon.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/create_modal_name_input.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/channel_bookmarks_create_modal.tsx","webpack://mattermost-webapp/./src/components/channel_bookmarks/channel_bookmarks_menu.tsx"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {FileGenericOutlineIcon, BookOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {ChannelBookmark} from '@mattermost/types/channel_bookmarks';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport RenderEmoji from 'components/emoji/render_emoji';\nimport FileThumbnail from 'components/file_attachment/file_thumbnail';\nimport type {FilePreviewInfo} from 'components/file_preview/file_preview';\n\nimport {trimmedEmojiName} from 'utils/emoji_utils';\nimport {getImageSrc} from 'utils/post_utils';\n\nimport type {GlobalState} from 'types/store';\n\ntype Props = {\n    type: ChannelBookmark['type'];\n    emoji?: string;\n    imageUrl?: string;\n    fileInfo?: FileInfo | FilePreviewInfo;\n    size?: 16 | 24;\n}\n\nconst BookmarkIcon = ({\n    type,\n    emoji,\n    imageUrl,\n    fileInfo,\n    size = 16,\n}: Props) => {\n    let icon = type === 'link' ? <BookOutlineIcon size={size}/> : <FileGenericOutlineIcon size={size}/>;\n    const emojiName = emoji && trimmedEmojiName(emoji);\n    const hasImageProxy = useSelector((state: GlobalState) => getConfig(state).HasImageProxy === 'true');\n\n    if (emojiName) {\n        icon = (\n            <RenderEmoji\n                emojiName={emojiName}\n                size={size}\n            />\n        );\n    } else if (imageUrl) {\n        icon = (\n            <BookmarkIconImg\n                src={getImageSrc(imageUrl, hasImageProxy)}\n                size={size}\n            />\n        );\n    } else if (fileInfo) {\n        icon = (\n            <FileThumbnail\n                fileInfo={fileInfo}\n                disablePreview={true}\n            />\n        );\n    }\n\n    return (\n        <Icon $size={size}>\n            {icon}\n        </Icon>\n    );\n};\n\nexport default BookmarkIcon;\n\nconst Icon = styled.div<{$size: number}>`\n    padding: 3px 1px 3px 2px;\n    flex-shrink: 0;\n    display: flex;\n    align-items: center;\n\n    .file-icon {\n        width: ${({$size: size}) => size}px;\n        height: ${({$size: size}) => size}px;\n        background-size: ${({$size: size}) => size * 0.8}px ${({$size: size}) => size}px;\n        margin-top: 1px;\n    }\n\n`;\n\nconst BookmarkIconImg = styled.img<{size: number}>`\n    width: ${({size}) => size}px;\n    height: ${({size}) => size}px;\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ComponentProps} from 'react';\nimport React, {useCallback, useRef} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport styled from 'styled-components';\n\nimport {ChevronDownIcon} from '@mattermost/compass-icons/components';\nimport type {ChannelBookmark} from '@mattermost/types/channel_bookmarks';\nimport type {Emoji} from '@mattermost/types/emojis';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport EmojiPickerOverlay from 'components/emoji_picker/emoji_picker_overlay';\nimport Input from 'components/widgets/inputs/input/input';\n\nimport Constants, {A11yCustomEventTypes, type A11yFocusEventDetail} from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\n\nimport BookmarkIcon from './bookmark_icon';\n\ntype Props = {\n    maxLength: number;\n    type: ChannelBookmark['type'];\n    fileInfo: FileInfo | undefined;\n    imageUrl: string | undefined;\n    emoji: string | undefined;\n    setEmoji: React.Dispatch<React.SetStateAction<string>>;\n    placeholder: string | undefined;\n    displayName: string | undefined;\n    setDisplayName: React.Dispatch<React.SetStateAction<string | undefined>>;\n    showEmojiPicker: boolean;\n    setShowEmojiPicker: React.Dispatch<React.SetStateAction<boolean>>;\n    onAddCustomEmojiClick?: () => void;\n}\nconst CreateModalNameInput = ({\n    maxLength,\n    type,\n    imageUrl,\n    fileInfo,\n    emoji,\n    setEmoji,\n    placeholder,\n    displayName,\n    setDisplayName,\n    showEmojiPicker,\n    setShowEmojiPicker,\n    onAddCustomEmojiClick,\n}: Props) => {\n    const {formatMessage} = useIntl();\n\n    const targetRef = useRef<HTMLButtonElement>(null);\n    const getTargetRef = () => targetRef.current;\n\n    const icon = (\n        <BookmarkIcon\n            type={type}\n            size={24}\n            emoji={emoji}\n            fileInfo={fileInfo}\n            imageUrl={imageUrl}\n        />\n    );\n\n    const refocusEmojiButton = () => {\n        if (!targetRef.current) {\n            return;\n        }\n\n        document.dispatchEvent(new CustomEvent<A11yFocusEventDetail>(\n            A11yCustomEventTypes.FOCUS, {\n                detail: {\n                    target: targetRef.current,\n                    keyboardOnly: true,\n                },\n            },\n        ));\n    };\n\n    const toggleEmojiPicker = () => setShowEmojiPicker((prev) => !prev);\n\n    const handleEmojiClick = (selectedEmoji: Emoji) => {\n        setShowEmojiPicker(false);\n        const emojiName = ('short_name' in selectedEmoji) ? selectedEmoji.short_name : selectedEmoji.name;\n        setEmoji(`:${emojiName}:`);\n        refocusEmojiButton();\n    };\n\n    const handleEmojiClear = () => {\n        setEmoji('');\n    };\n\n    const handleEmojiClose = () => {\n        setShowEmojiPicker(false);\n        refocusEmojiButton();\n    };\n\n    const handleInputChange: ComponentProps<typeof Input>['onChange'] = useCallback((e) => {\n        setDisplayName(e.currentTarget.value);\n    }, []);\n\n    const handleEmojiKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n        if (isKeyPressed(e, Constants.KeyCodes.ENTER)) {\n            e.stopPropagation();\n        }\n    };\n\n    const handleEmojiResetKeyDown = (e: React.KeyboardEvent<HTMLAnchorElement>) => {\n        if (isKeyPressed(e, Constants.KeyCodes.ENTER) || isKeyPressed(e, Constants.KeyCodes.SPACE)) {\n            e.stopPropagation();\n            handleEmojiClear();\n        }\n    };\n\n    return (\n        <>\n            <NameWrapper>\n                {showEmojiPicker && (\n                    <EmojiPickerOverlay\n                        target={getTargetRef}\n                        show={showEmojiPicker}\n                        onHide={handleEmojiClose}\n                        onEmojiClick={handleEmojiClick}\n                        placement='right'\n                        onAddCustomEmojiClick={onAddCustomEmojiClick}\n                    />\n\n                )}\n                <button\n                    ref={targetRef}\n                    type='button'\n                    onClick={toggleEmojiPicker}\n                    onKeyDown={handleEmojiKeyDown}\n                    aria-label={formatMessage({id: 'emoji_picker.emojiPicker.button.ariaLabel', defaultMessage: 'select an emoji'})}\n                    aria-expanded={showEmojiPicker ? 'true' : 'false'}\n\n                    className='channelBookmarksMenuButton emoji-picker__container BookmarkCreateModal__emoji-button'\n                >\n                    {icon}\n                    <ChevronDownIcon size={'12px'}/>\n                </button>\n                <Input\n                    maxLength={maxLength}\n                    type='text'\n                    name='bookmark-display-name'\n                    onChange={handleInputChange}\n                    value={displayName ?? placeholder ?? ''}\n                    placeholder={placeholder}\n                    data-testid='titleInput'\n                    useLegend={false}\n                />\n                <Clear\n                    visible={Boolean(emoji)}\n                    tabIndex={0}\n                    onClick={handleEmojiClear}\n                    onKeyDown={handleEmojiResetKeyDown}\n                >\n                    <FormattedMessage\n                        id='channel_bookmarks.create.title_input.clear_emoji'\n                        defaultMessage='Remove emoji'\n                    />\n                </Clear>\n            </NameWrapper>\n        </>\n    );\n};\n\nconst Clear = styled.a<{visible: boolean}>`\n    font-size: 12px;\n    visibility: ${({visible}) => (visible ? 'visible' : 'hidden')};\n`;\n\nconst NameWrapper = styled.div`\n    position: relative;\n\n    > button {\n        position: absolute;\n        left: 1px;\n        top: 1px;\n        z-index: 5;\n        width: 57px;\n        height: 44px;\n        border-radius: 4px 0 0 4px;\n        border-right: 1px solid rgba(var(--center-channel-color-rgb), 0.16);\n\n        align-items: center;\n        justify-content: center;\n        gap: 0;\n        padding-left: 6px;\n        padding-right: 2px;\n\n        svg {\n            flex-shrink: 0;\n        }\n    }\n\n    .Input_container {\n\n    }\n\n    .Input_wrapper {\n        padding-left: 7rem;\n    }\n`;\n\nexport default CreateModalNameInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent, MouseEvent, ReactNode} from 'react';\nimport React, {useCallback, useEffect, useRef, useState} from 'react';\nimport {FormattedMessage, defineMessages, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\nimport styled from 'styled-components';\n\nimport {PencilOutlineIcon, CheckIcon} from '@mattermost/compass-icons/components';\nimport {GenericModal} from '@mattermost/components';\nimport type {ChannelBookmark, ChannelBookmarkCreate, ChannelBookmarkPatch} from '@mattermost/types/channel_bookmarks';\nimport type {FileInfo} from '@mattermost/types/files';\n\nimport {getFile} from 'mattermost-redux/selectors/entities/files';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport type {UploadFile} from 'actions/file_actions';\nimport {uploadFile} from 'actions/file_actions';\n\nimport FileAttachment from 'components/file_attachment';\nimport type {FilePreviewInfo} from 'components/file_preview/file_preview';\nimport FileProgressPreview from 'components/file_preview/file_progress_preview';\nimport Input from 'components/widgets/inputs/input/input';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\nimport Constants from 'utils/constants';\nimport {isKeyPressed} from 'utils/keyboard';\nimport {isValidUrl, parseLink, removeScheme} from 'utils/url';\nimport {generateId} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport './bookmark_create_modal.scss';\n\nimport CreateModalNameInput from './create_modal_name_input';\nimport {useCanUploadFiles} from './utils';\n\nconst MAX_LINK_LENGTH = 1024;\nconst MAX_TITLE_LENGTH = 64;\n\ntype Props = {\n    channelId: string;\n    bookmarkType?: ChannelBookmark['type'];\n    file?: File;\n    onExited: () => void;\n    onHide: () => void;\n} & ({\n    bookmark: ChannelBookmark;\n    onConfirm: (data: ChannelBookmarkPatch) => Promise<ActionResult<boolean, any>> | ActionResult<boolean, any>;\n} | {\n    bookmark?: never;\n    onConfirm: (data: ChannelBookmarkCreate) => Promise<ActionResult<boolean, any>> | ActionResult<boolean, any>;\n});\n\nfunction ChannelBookmarkCreateModal({\n    bookmark,\n    bookmarkType,\n    file: promptedFile,\n    channelId,\n    onExited,\n    onConfirm,\n    onHide,\n}: Props) {\n    const {formatMessage} = useIntl();\n    const dispatch = useDispatch();\n\n    // common\n    const type = bookmark?.type ?? bookmarkType ?? 'link';\n    const [showEmojiPicker, setShowEmojiPicker] = useState(false);\n    const [emoji, setEmoji] = useState(bookmark?.emoji ?? '');\n    const [displayName, setDisplayName] = useState<string | undefined>(bookmark?.display_name);\n    const [parsedDisplayName, setParsedDisplayName] = useState<string | undefined>();\n    const [saving, setSaving] = useState(false);\n    const [saveError, setSaveError] = useState('');\n\n    const handleKeyDown = useCallback((event: KeyboardEvent) => {\n        if (isKeyPressed(event, Constants.KeyCodes.ESCAPE) && !showEmojiPicker) {\n            onHide();\n        }\n    }, [showEmojiPicker, onHide]);\n\n    useEffect(() => {\n        document.addEventListener('keydown', handleKeyDown);\n\n        return () => {\n            document.removeEventListener('keydown', handleKeyDown);\n        };\n    }, [handleKeyDown]);\n\n    // type === 'link'\n    const icon = bookmark?.image_url;\n    const [link, setLinkInner] = useState(bookmark?.link_url ?? '');\n    const prevLink = useRef(link);\n    const [validatedLink, setValidatedLink] = useState<string>();\n    const setLink = useCallback((value: string) => {\n        setLinkInner((currentLink) => {\n            prevLink.current = currentLink;\n            return value;\n        });\n        if (!value) {\n            setValidatedLink(undefined);\n        }\n    }, []);\n\n    const [linkError, {loading: checkingLink, suppressed: linkErrorBypass}] = useBookmarkLinkValidation(link === prevLink.current ? '' : link, (validatedLink, forced) => {\n        if (!forced) {\n            setValidatedLink(validatedLink);\n        }\n        const parsed = removeScheme(validatedLink);\n        setParsedDisplayName(parsed);\n        setDisplayName(parsed);\n    });\n\n    const handleLinkChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n        const {value} = e.target;\n        setLink(value);\n    }, []);\n\n    // type === 'file'\n    const canUploadFiles = useCanUploadFiles();\n    const [pendingFile, setPendingFile] = useState<FilePreviewInfo | null>();\n    const [fileError, setFileError] = useState('');\n    const [fileId, setFileId] = useState(bookmark?.file_id);\n    const uploadRequestRef = useRef<XMLHttpRequest>();\n    const fileInfo: FileInfo | undefined = useSelector((state: GlobalState) => (fileId && getFile(state, fileId)) || undefined);\n\n    const maxFileSize = useSelector((state: GlobalState) => {\n        const config = getConfig(state);\n        return parseInt(config.MaxFileSize || '', 10);\n    });\n    const maxFileSizeMB = maxFileSize / 1048576;\n\n    const handleEditFileClick = (e: MouseEvent<HTMLDivElement>) => {\n        const innerClick = document.querySelector(`\n            .channel-bookmarks-create-modal .post-image__download a,\n            .channel-bookmarks-create-modal a.file-preview__remove\n        `);\n        if (\n            innerClick === e.target ||\n            innerClick?.contains(e.target as HTMLElement)\n        ) {\n            return;\n        }\n\n        fileInputRef.current?.click();\n    };\n\n    const handleFileChanged = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n        const file = e.target.files?.[0];\n        if (!file) {\n            return;\n        }\n\n        doUploadFile(file);\n    }, []);\n\n    const handleFileRemove = () => {\n        setPendingFile(null);\n        setFileId(bookmark?.file_id);\n        setParsedDisplayName(undefined);\n        uploadRequestRef.current?.abort();\n    };\n\n    const fileInputRef = useRef<HTMLInputElement>(null);\n    const fileInput = (\n        <input\n            type='file'\n            id='bookmark-create-file-input-in-modal'\n            className='bookmark-create-file-input'\n            ref={fileInputRef}\n            onChange={handleFileChanged}\n        />\n    );\n\n    const onProgress: UploadFile['onProgress'] = (preview) => {\n        setPendingFile(preview);\n    };\n    const onSuccess: UploadFile['onSuccess'] = ({file_infos: fileInfos}) => {\n        setPendingFile(null);\n        const newFile: FileInfo = fileInfos?.[0];\n        if (newFile) {\n            setFileId(newFile.id);\n        }\n        setFileError('');\n    };\n    const onError: UploadFile['onError'] = () => {\n        setPendingFile(null);\n        setFileError(formatMessage({id: 'file_upload.generic_error_file', defaultMessage: 'There was a problem uploading your file.'}));\n    };\n\n    const displayNameValue = displayName || parsedDisplayName || (type === 'file' ? fileInfo?.name : bookmark?.link_url) || '';\n\n    const doUploadFile = (file: File) => {\n        setPendingFile(null);\n        setFileId('');\n\n        if (file.size > maxFileSize) {\n            setFileError(formatMessage({\n                id: 'file_upload.fileAbove',\n                defaultMessage: 'File above {max}MB could not be uploaded: {filename}',\n            }, {max: maxFileSizeMB, filename: file.name}));\n\n            return;\n        }\n\n        if (file.size === 0) {\n            setFileError(formatMessage({\n                id: 'file_upload.zeroBytesFile',\n                defaultMessage: 'You are uploading an empty file: {filename}',\n            }, {filename: file.name}));\n\n            return;\n        }\n\n        setFileError('');\n        if (displayNameValue === fileInfo?.name) {\n            setDisplayName(file.name);\n        }\n        setParsedDisplayName(file.name);\n\n        const clientId = generateId();\n\n        uploadRequestRef.current = dispatch(uploadFile({\n            file,\n            name: file.name,\n            type: file.type,\n            rootId: '',\n            channelId,\n            clientId,\n            onProgress,\n            onSuccess,\n            onError,\n        }, true)) as unknown as XMLHttpRequest;\n    };\n\n    useEffect(() => {\n        if (promptedFile) {\n            doUploadFile(promptedFile);\n        }\n    }, [promptedFile]);\n\n    const handleOnExited = useCallback(() => {\n        uploadRequestRef.current?.abort();\n        onExited?.();\n    }, [onExited]);\n\n    // controls logic\n    const hasChanges = (() => {\n        if (displayNameValue !== bookmark?.display_name) {\n            return true;\n        }\n\n        if ((emoji || bookmark?.emoji) && emoji !== bookmark?.emoji) {\n            return true;\n        }\n\n        if (type === 'file') {\n            if (fileId && fileId !== bookmark?.file_id) {\n                return true;\n            }\n        }\n\n        if (type === 'link') {\n            return Boolean(link && link !== bookmark?.link_url);\n        }\n\n        return false;\n    })();\n    const isValid = (() => {\n        if (type === 'link') {\n            if (!link || linkError) {\n                return false;\n            }\n            if (link && linkErrorBypass) {\n                return true;\n            }\n\n            if (validatedLink || link === bookmark?.link_url) {\n                return true;\n            }\n        }\n\n        if (type === 'file') {\n            if (!fileInfo || !displayNameValue || fileError) {\n                return false;\n            }\n\n            return true;\n        }\n\n        return undefined;\n    })();\n\n    const cancel = useCallback(() => {\n        if (type === 'file') {\n            uploadRequestRef.current?.abort();\n        }\n    }, [type]);\n\n    const confirm = useCallback(async () => {\n        setSaving(true);\n        if (type === 'link') {\n            const url = validHttpUrl(link);\n\n            if (!url) {\n                setSaveError(formatMessage(msg.linkInvalid));\n                return;\n            }\n\n            let validLink = url.toString();\n\n            if (validLink.endsWith('/')) {\n                validLink = validLink.slice(0, -1);\n            }\n\n            const {data: success} = await onConfirm({\n                image_url: icon,\n                link_url: validLink,\n                emoji,\n                display_name: displayNameValue,\n                type: 'link',\n            });\n\n            setSaving(false);\n\n            if (success) {\n                setSaveError('');\n                onHide();\n            } else {\n                setSaveError(formatMessage(msg.saveError));\n            }\n        } else if (fileInfo) {\n            const {data: success} = await onConfirm({\n                file_id: fileInfo.id,\n                display_name: displayNameValue,\n                type: 'file',\n                emoji,\n            });\n\n            if (success) {\n                setSaveError('');\n                onHide();\n            } else {\n                setSaveError(formatMessage(msg.saveError));\n            }\n        }\n    }, [type, link, onConfirm, onHide, fileInfo, displayNameValue, emoji, icon]);\n\n    const confirmDisabled = saving || !isValid || !hasChanges;\n\n    let linkStatusIndicator;\n    if (checkingLink) {\n        // loading\n        linkStatusIndicator = <LoadingSpinner/>;\n    } else if (validatedLink && !linkError) {\n        // validated\n        linkStatusIndicator = checkedIcon;\n    }\n\n    let linkMessage = formatMessage(msg.linkInfoMessage);\n    if (linkErrorBypass) {\n        const url = validHttpUrl(link);\n        if (url) {\n            linkMessage = formatMessage(msg.invalidLinkMessage, {link: url.toString()});\n        }\n    }\n\n    return (\n        <GenericModal\n            enforceFocus={!showEmojiPicker}\n            keyboardEscape={false}\n            className='channel-bookmarks-create-modal'\n            modalHeaderText={formatMessage(bookmark ? msg.editHeading : msg.heading)}\n            confirmButtonText={formatMessage(bookmark ? msg.saveText : msg.addBookmarkText)}\n            handleCancel={cancel}\n            handleConfirm={confirm}\n            handleEnterKeyPress={(!confirmDisabled && confirm) || undefined}\n            onExited={handleOnExited}\n            compassDesign={true}\n            isConfirmDisabled={confirmDisabled}\n            autoCloseOnConfirmButton={false}\n            errorText={saveError}\n        >\n            <>\n                {type === 'link' ? (\n                    <>\n                        <Input\n                            maxLength={MAX_LINK_LENGTH}\n                            type='text'\n                            name='bookmark-link'\n                            containerClassName='linkInput'\n                            placeholder={formatMessage(msg.linkPlaceholder)}\n                            onChange={handleLinkChange}\n                            hasError={Boolean(linkError)}\n                            value={link}\n                            data-testid='linkInput'\n                            autoFocus={true}\n                            addon={linkStatusIndicator}\n                            customMessage={linkError ? {type: 'error', value: linkError} : {value: linkMessage}}\n                        />\n                    </>\n                ) : (\n                    <>\n                        <FieldLabel>\n                            <FormattedMessage\n                                id='channel_bookmarks.create.file_input.label'\n                                defaultMessage='Attachment'\n                            />\n                        </FieldLabel>\n                        <FileInputContainer\n                            tabIndex={0}\n                            role='button'\n                            disabled={!canUploadFiles}\n                            onClick={(canUploadFiles && handleEditFileClick) || undefined}\n                        >\n                            {!pendingFile && fileInfo && (\n                                <FileItemContainer>\n                                    <FileAttachment\n                                        key={fileInfo.id}\n                                        fileInfo={fileInfo}\n                                        index={0}\n                                    />\n                                </FileItemContainer>\n                            )}\n                            {pendingFile && (\n                                <FileProgressPreview\n                                    key={pendingFile.clientId}\n                                    clientId={pendingFile.clientId}\n                                    fileInfo={pendingFile}\n                                    handleRemove={handleFileRemove}\n                                />\n                            )}\n                            {!fileInfo && !pendingFile && (\n                                <div className='file-preview__container empty'/>\n                            )}\n                            <VisualButton>\n                                <PencilOutlineIcon size={24}/>\n                                {formatMessage(msg.fileInputEdit)}\n                            </VisualButton>\n                            {fileInput}\n                        </FileInputContainer>\n                        {fileError && (\n                            <div className='Input___customMessage Input___error'>\n                                <i className='icon error icon-alert-circle-outline'/>\n                                <span>{fileError}</span>\n                            </div>\n                        )}\n                    </>\n\n                )}\n\n                <TitleWrapper>\n                    <FieldLabel>\n                        <FormattedMessage\n                            id='channel_bookmarks.create.title_input.label'\n                            defaultMessage='Title'\n                        />\n                    </FieldLabel>\n                    <CreateModalNameInput\n                        maxLength={MAX_TITLE_LENGTH}\n                        type={type}\n                        imageUrl={icon}\n                        fileInfo={pendingFile || fileInfo}\n                        emoji={emoji}\n                        setEmoji={setEmoji}\n                        displayName={displayName?.substring(0, MAX_TITLE_LENGTH)}\n                        placeholder={displayNameValue?.substring(0, MAX_TITLE_LENGTH)}\n                        setDisplayName={setDisplayName}\n                        onAddCustomEmojiClick={onHide}\n                        showEmojiPicker={showEmojiPicker}\n                        setShowEmojiPicker={setShowEmojiPicker}\n                    />\n                </TitleWrapper>\n            </>\n        </GenericModal>\n    );\n}\n\nexport default ChannelBookmarkCreateModal;\n\nconst TitleWrapper = styled.div`\n    margin-top: 20px;\n`;\n\nconst CheckWrapper = styled.span`\n    padding: 0px 12px;\n    display: flex;\n    align-items: center;\n`;\n\nconst checkedIcon = (\n    <CheckWrapper>\n        <CheckIcon\n            size={20}\n            color='var(--sys-online-indicator)'\n        />\n    </CheckWrapper>\n);\n\nconst FieldLabel = styled.span`\n    display: inline-block;\n    margin-bottom: 8px;\n    font-family: Open Sans;\n    font-size: 14px;\n    line-height: 16px;\n    font-style: normal;\n    font-weight: 600;\n    line-height: 20px;\n`;\n\nconst VisualButton = styled.div`\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    gap: 4px;\n    padding: 10px 24px;\n    color: rgba(var(--center-channel-color-rgb), 0.56);\n    font-size: 11px;\n    font-weight: 600;\n    font-family: Open Sans;\n`;\n\nconst FileInputContainer = styled.div`\n    display: block;\n    background: rgba(var(--center-channel-color-rgb), 0.04);\n    padding: 12px;\n    border-radius: 8px;\n    display: flex;\n\n    &:hover:not([disabled]) {\n        background: rgba(var(--center-channel-color-rgb), 0.08);\n        color: rgba(var(--center-channel-color-rgb), 0.72);\n        cursor: pointer;\n    }\n\n    &:disabled {\n        cursor: default;\n        ${VisualButton} {\n            opacity: 0.4;\n        }\n    }\n\n    input[type=\"file\"] {\n        opacity: 0;\n        width: 0;\n        height: 0;\n    }\n\n    .file-preview__container,\n    .file-preview {\n        width: auto;\n        height: auto;\n        flex: 1 1 auto;\n        padding: 0;\n\n        &.empty {\n            border: 2px dashed rgba(var(--center-channel-color-rgb), 0.16);\n            border-radius : 4px;\n        }\n\n        .post-image__column {\n            width: 100%;\n            margin: 0;\n        }\n    }\n`;\n\nconst continuableLinkErr = (url: URL, confirm: () => void) => {\n    return (\n        <FormattedMessage\n            id='channel_bookmarks.create.error.invalid_url.continue_anyway'\n            defaultMessage='Could not find: {url}. Please enter a valid link, or <Confirm>continue anyway</Confirm>.'\n            values={{\n                url: url.toString(),\n                Confirm: (msg) => (\n                    <LinkErrContinue\n                        tabIndex={0}\n                        onClick={confirm}\n                        onKeyDown={(e) => {\n                            if (e.key === 'Enter') {\n                                confirm();\n                            }\n                        }}\n                    >\n                        {msg}\n                    </LinkErrContinue>\n                ),\n            }}\n        />\n    );\n};\n\nconst LinkErrContinue = styled.a`\n    color: unset !important;\n    text-decoration: underline;\n`;\n\nconst FileItemContainer = styled.div`\n    display: flex;\n    flex: 1 1 auto;\n\n    > div {\n        width: 100%;\n        margin: 0;\n    }\n`;\n\nconst msg = defineMessages({\n    heading: {id: 'channel_bookmarks.create.title', defaultMessage: 'Add a bookmark'},\n    editHeading: {id: 'channel_bookmarks.create.edit.title', defaultMessage: 'Edit bookmark'},\n    linkPlaceholder: {id: 'channel_bookmarks.create.link_placeholder', defaultMessage: 'Link'},\n    linkInfoMessage: {id: 'channel_bookmarks.create.link_info', defaultMessage: 'Add a link to any post, file, or any external link'},\n    invalidLinkMessage: {id: 'channel_bookmarks.create.error.invalid_url.continuing_anyway', defaultMessage: 'This may not be a valid link: {link}.'},\n    addBookmarkText: {id: 'channel_bookmarks.create.confirm_add.button', defaultMessage: 'Add bookmark'},\n    saveText: {id: 'channel_bookmarks.create.confirm_save.button', defaultMessage: 'Save bookmark'},\n    fileInputEdit: {id: 'channel_bookmarks.create.file_input.edit', defaultMessage: 'Edit'},\n    linkInvalid: {id: 'channel_bookmarks.create.error.invalid_url', defaultMessage: 'Please enter a valid link. Could not parse: {link}.'},\n    saveError: {id: 'channel_bookmarks.create.error.generic_save', defaultMessage: 'There was an error trying to save the bookmark.'},\n});\n\nconst TYPING_DELAY_MS = 250;\nconst REQUEST_TIMEOUT = 10000;\nexport const useBookmarkLinkValidation = (link: string, onValidated: (validatedLink: string, forced?: boolean) => void) => {\n    const {formatMessage} = useIntl();\n\n    const [loading, setLoading] = useState<URL>();\n    const [error, setError] = useState<ReactNode>();\n    const [suppressed, setSuppressed] = useState(false);\n    const abort = useRef<AbortController>();\n\n    const start = useCallback((url: URL) => {\n        setLoading(url);\n        setError(undefined);\n        setSuppressed(false);\n        abort.current = new AbortController();\n        return abort.current.signal;\n    }, []);\n\n    const cancel = useCallback(() => {\n        abort.current?.abort('stale request');\n        abort.current = undefined;\n        setLoading(undefined);\n    }, []);\n\n    useEffect(() => {\n        const handler = setTimeout(async () => {\n            cancel();\n            if (!link) {\n                return;\n            }\n\n            const url = validHttpUrl(link);\n\n            if (!url) {\n                setError(formatMessage(msg.linkInvalid, {link}));\n                setLoading(undefined);\n                return;\n            }\n\n            const signal = start(url);\n\n            try {\n                await fetch(url, {\n                    mode: 'no-cors',\n                    signal: AbortSignal.any([signal, AbortSignal.timeout(REQUEST_TIMEOUT)]),\n                });\n                onValidated(link);\n            } catch (err) {\n                if (signal === abort.current?.signal) {\n                    setError(continuableLinkErr(url, () => {\n                        onValidated(link, true);\n                        setSuppressed(true);\n                        setError(undefined);\n                    }));\n                }\n            } finally {\n                setLoading((currentUrl) => {\n                    if (currentUrl !== url) {\n                        // trailing effect of cancelled\n                        return currentUrl;\n                    }\n\n                    return undefined;\n                });\n            }\n        }, TYPING_DELAY_MS);\n\n        return () => clearTimeout(handler);\n    }, [link, start, cancel]);\n\n    return [error, {loading: Boolean(loading), suppressed}] as const;\n};\n\nexport const validHttpUrl = (input: string) => {\n    const val = parseLink(input);\n\n    if (!val || !isValidUrl(val)) {\n        return null;\n    }\n\n    let url;\n    try {\n        url = new URL(val);\n    } catch {\n        return null;\n    }\n\n    return url;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React, {memo, useCallback} from 'react';\nimport {useIntl} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport styled, {css} from 'styled-components';\n\nimport {\n    LinkVariantIcon,\n    PaperclipIcon,\n    PlusIcon,\n} from '@mattermost/compass-icons/components';\nimport type {ChannelBookmarkCreate} from '@mattermost/types/channel_bookmarks';\n\nimport {createBookmark} from 'actions/channel_bookmarks';\nimport {openModal} from 'actions/views/modals';\n\nimport * as Menu from 'components/menu';\n\nimport {ModalIdentifiers} from 'utils/constants';\n\nimport ChannelBookmarkCreateModal from './channel_bookmarks_create_modal';\nimport {MAX_BOOKMARKS_PER_CHANNEL, useChannelBookmarkPermission} from './utils';\n\ntype BookmarksMenuProps = {\n    channelId: string;\n    hasBookmarks: boolean;\n    limitReached: boolean;\n    canUploadFiles: boolean;};\nfunction BookmarksMenu({\n    channelId,\n    hasBookmarks,\n    limitReached,\n    canUploadFiles,\n}: BookmarksMenuProps) {\n    const {formatMessage} = useIntl();\n    const showLabel = !hasBookmarks;\n\n    const {handleCreateLink, handleCreateFile} = useBookmarkAddActions(channelId);\n    const canAdd = useChannelBookmarkPermission(channelId, 'add');\n\n    const addBookmarkLabel = formatMessage({id: 'channel_bookmarks.addBookmark', defaultMessage: 'Add a bookmark'});\n\n    const addBookmarkLimitReached = formatMessage({id: 'channel_bookmarks.addBookmarkLimitReached', defaultMessage: 'Cannot add more than {limit} bookmarks'}, {limit: MAX_BOOKMARKS_PER_CHANNEL});\n    let addBookmarkTooltipText;\n\n    if (limitReached) {\n        addBookmarkTooltipText = addBookmarkLimitReached;\n    } else if (hasBookmarks) {\n        addBookmarkTooltipText = addBookmarkLabel;\n    }\n\n    const addLinkLabel = formatMessage({id: 'channel_bookmarks.addLink', defaultMessage: 'Add a link'});\n    const attachFileLabel = formatMessage({id: 'channel_bookmarks.attachFile', defaultMessage: 'Attach a file'});\n\n    if (!canAdd) {\n        return null;\n    }\n\n    return (\n        <MenuButtonContainer\n            withLabel={showLabel}\n        >\n            <Menu.Container\n                anchorOrigin={{vertical: 'bottom', horizontal: 'left'}}\n                transformOrigin={{vertical: 'top', horizontal: 'left'}}\n                menuButton={{\n                    id: 'channelBookmarksPlusMenuButton',\n                    class: classNames('channelBookmarksMenuButton', {withLabel: showLabel, disabled: limitReached}),\n                    children: (\n                        <>\n                            <PlusIcon size={showLabel ? 16 : 18}/>\n                            {showLabel && <span>{addBookmarkLabel}</span>}\n                        </>\n                    ),\n                    'aria-label': addBookmarkLabel,\n                    disabled: limitReached,\n                }}\n                menu={{\n                    id: 'channelBookmarksPlusMenuDropdown',\n                }}\n                menuButtonTooltip={addBookmarkTooltipText ? {\n                    text: addBookmarkTooltipText,\n                } : undefined}\n            >\n                <Menu.Item\n                    key='channelBookmarksAddLink'\n                    id='channelBookmarksAddLink'\n                    onClick={handleCreateLink}\n                    leadingElement={<LinkVariantIcon size={18}/>}\n                    labels={<span>{addLinkLabel}</span>}\n                />\n                {canUploadFiles && (\n                    <Menu.Item\n                        key='channelBookmarksAttachFile'\n                        id='channelBookmarksAttachFile'\n                        onClick={handleCreateFile}\n                        leadingElement={<PaperclipIcon size={18}/>}\n                        labels={<span>{attachFileLabel}</span>}\n                    />\n                )}\n            </Menu.Container>\n        </MenuButtonContainer>\n    );\n}\n\nexport default memo(BookmarksMenu);\n\nconst MenuButtonContainer = styled.div<{withLabel: boolean}>`\n    position: sticky;\n    right: 0;\n    ${({withLabel}) => !withLabel && css`padding: 0 1rem;`}\n    background: linear-gradient(to right, rgba(var(--center-channel-bg-rgb), .16), rgba(var(--center-channel-bg-rgb), 1) 25%);\n`;\n\nexport const useBookmarkAddActions = (channelId: string) => {\n    const dispatch = useDispatch();\n\n    const handleCreate = useCallback((file?: File) => {\n        dispatch(openModal({\n            modalId: ModalIdentifiers.CHANNEL_BOOKMARK_CREATE,\n            dialogType: ChannelBookmarkCreateModal,\n            dialogProps: {\n                channelId,\n                bookmarkType: file ? 'file' : 'link',\n                file,\n                onConfirm: async (data: ChannelBookmarkCreate) => dispatch(createBookmark(channelId, data)),\n            },\n        }));\n    }, [channelId, dispatch]);\n\n    const handleCreateLink = useCallback(() => {\n        handleCreate();\n    }, [handleCreate]);\n\n    const handleCreateFile = useCallback(() => {\n        const input: HTMLInputElement = document.createElement('input');\n        input.type = 'file';\n        input.id = 'bookmark-create-file-input';\n        input.hidden = true;\n\n        input.addEventListener('change', () => {\n            const file = input.files?.[0];\n            if (file) {\n                handleCreate(file);\n            }\n            input.remove();\n        });\n        input.addEventListener('cancel', input.remove);\n\n        document.getElementById('root-portal')?.appendChild(input);\n\n        input.click();\n    }, [handleCreate]);\n\n    return {handleCreateLink, handleCreateFile};\n};\n"],"names":["BookmarkIcon","_ref","type","emoji","imageUrl","fileInfo","size","icon","React","BookOutlineIcon","FileGenericOutlineIcon","emojiName","trimmedEmojiName","hasImageProxy","useSelector","state","getConfig","HasImageProxy","RenderEmoji","BookmarkIconImg","src","getImageSrc","FileThumbnail","disablePreview","Icon","$size","propTypes","_pt","styled","withConfig","displayName","_ref2","_ref3","_ref4","_ref5","_ref6","_ref7","CreateModalNameInput","maxLength","setEmoji","placeholder","setDisplayName","showEmojiPicker","setShowEmojiPicker","onAddCustomEmojiClick","formatMessage","useIntl","targetRef","useRef","refocusEmojiButton","current","document","dispatchEvent","CustomEvent","A11yCustomEventTypes","FOCUS","detail","target","keyboardOnly","handleEmojiClear","handleInputChange","useCallback","e","currentTarget","value","NameWrapper","EmojiPickerOverlay","getTargetRef","show","onHide","handleEmojiClose","onEmojiClick","selectedEmoji","short_name","name","concat","placement","ref","onClick","toggleEmojiPicker","prev","onKeyDown","isKeyPressed","Constants","KeyCodes","ENTER","stopPropagation","id","defaultMessage","className","ChevronDownIcon","Input","onChange","useLegend","Clear","visible","Boolean","tabIndex","SPACE","FormattedMessage","isRequired","ChannelBookmarkCreateModal","_bookmark$type","_bookmark$emoji","_bookmark$link_url","bookmark","bookmarkType","file","promptedFile","channelId","onExited","onConfirm","dispatch","useDispatch","useState","display_name","parsedDisplayName","setParsedDisplayName","saving","setSaving","saveError","setSaveError","handleKeyDown","event","ESCAPE","useEffect","addEventListener","removeEventListener","image_url","link","setLinkInner","link_url","prevLink","validatedLink","setValidatedLink","setLink","currentLink","undefined","linkError","loading","checkingLink","suppressed","linkErrorBypass","useBookmarkLinkValidation","forced","parsed","removeScheme","handleLinkChange","canUploadFiles","useCanUploadFiles","pendingFile","setPendingFile","fileError","setFileError","fileId","setFileId","file_id","uploadRequestRef","getFile","maxFileSize","config","parseInt","MaxFileSize","maxFileSizeMB","handleFileChanged","_e$target$files","files","doUploadFile","fileInputRef","fileInput","onProgress","preview","onSuccess","file_infos","fileInfos","newFile","onError","displayNameValue","max","filename","clientId","generateId","uploadFile","rootId","handleOnExited","_uploadRequestRef$cur2","abort","hasChanges","isValid","cancel","_uploadRequestRef$cur3","confirm","async","url","validHttpUrl","msg","linkInvalid","validLink","toString","endsWith","slice","data","success","confirmDisabled","linkStatusIndicator","LoadingSpinner","checkedIcon","linkMessage","linkInfoMessage","invalidLinkMessage","GenericModal","enforceFocus","keyboardEscape","modalHeaderText","editHeading","heading","confirmButtonText","saveText","addBookmarkText","handleCancel","handleConfirm","handleEnterKeyPress","compassDesign","isConfirmDisabled","autoCloseOnConfirmButton","errorText","containerClassName","linkPlaceholder","hasError","autoFocus","addon","customMessage","FieldLabel","FileInputContainer","role","disabled","_fileInputRef$current","innerClick","querySelector","contains","click","FileItemContainer","FileAttachment","key","index","FileProgressPreview","handleRemove","handleFileRemove","_uploadRequestRef$cur","VisualButton","PencilOutlineIcon","fileInputEdit","TitleWrapper","substring","CheckWrapper","CheckIcon","color","LinkErrContinue","defineMessages","onValidated","setLoading","error","setError","setSuppressed","start","AbortController","signal","_abort$current","handler","setTimeout","fetch","mode","AbortSignal","any","timeout","err","_abort$current2","continuableLinkErr","values","Confirm","currentUrl","clearTimeout","input","val","parseLink","isValidUrl","URL","_unused","BookmarksMenu","hasBookmarks","limitReached","showLabel","handleCreateLink","handleCreateFile","useBookmarkAddActions","canAdd","useChannelBookmarkPermission","addBookmarkLabel","addBookmarkLimitReached","limit","MAX_BOOKMARKS_PER_CHANNEL","addBookmarkTooltipText","addLinkLabel","attachFileLabel","MenuButtonContainer","withLabel","Menu","anchorOrigin","vertical","horizontal","transformOrigin","menuButton","class","classNames","children","PlusIcon","menu","menuButtonTooltip","text","leadingElement","LinkVariantIcon","labels","PaperclipIcon","memo","css","handleCreate","openModal","modalId","ModalIdentifiers","CHANNEL_BOOKMARK_CREATE","dialogType","dialogProps","createBookmark","_document$getElementB","createElement","hidden","_input$files","remove","getElementById","appendChild"],"sourceRoot":""}

VaKeR 2022