From ff552c51511e80ebaaafcad9a8c06bb6120428d5 Mon Sep 17 00:00:00 2001 From: sadposter Date: Wed, 29 Jan 2020 10:56:34 +0000 Subject: [PATCH] FE --- .../activity_pub/mrf/gab_rewrite_policy.ex | 53 ------------------ priv/static/index.html | 2 +- .../static/font/fontello.1579191413379.woff | Bin 13324 -> 0 bytes .../static/font/fontello.1579191413379.woff2 | Bin 11276 -> 0 bytes ...1413379.eot => fontello.1579191725174.eot} | Bin 21916 -> 21784 bytes ...1413379.svg => fontello.1579191725174.svg} | 2 - ...1413379.ttf => fontello.1579191725174.ttf} | Bin 21748 -> 21616 bytes .../static/font/fontello.1579191725174.woff | Bin 0 -> 13236 bytes .../static/font/fontello.1579191725174.woff2 | Bin 0 -> 11208 bytes ...1413379.css => fontello.1579191725174.css} | 14 ++--- priv/static/static/fontello.json | 6 -- ...a8016391a.js => 2.7eaed4ad0d253fad6f55.js} | 4 +- ...a.js.map => 2.7eaed4ad0d253fad6f55.js.map} | 2 +- .../static/js/app.6fc3537f2985f0a2e06a.js | 2 + .../static/js/app.6fc3537f2985f0a2e06a.js.map | 1 + .../static/js/app.eb7444df7c8e44e553de.js | 2 - .../static/js/app.eb7444df7c8e44e553de.js.map | 1 - .../vendors~app.86bc6d5e06d2e17976c5.js.map | 1 - ...js => vendors~app.ef669266eac4d086d74e.js} | 14 ++--- .../vendors~app.ef669266eac4d086d74e.js.map | 1 + priv/static/static/styles.json | 1 - priv/static/static/terms-of-service.html | 42 +++++++++++++- priv/static/sw-pleroma.js | 2 +- 23 files changed, 62 insertions(+), 88 deletions(-) delete mode 100644 lib/pleroma/web/activity_pub/mrf/gab_rewrite_policy.ex delete mode 100644 priv/static/static/font/fontello.1579191413379.woff delete mode 100644 priv/static/static/font/fontello.1579191413379.woff2 rename priv/static/static/font/{fontello.1579191413379.eot => fontello.1579191725174.eot} (88%) rename priv/static/static/font/{fontello.1579191413379.svg => fontello.1579191725174.svg} (99%) rename priv/static/static/font/{fontello.1579191413379.ttf => fontello.1579191725174.ttf} (88%) create mode 100644 priv/static/static/font/fontello.1579191725174.woff create mode 100644 priv/static/static/font/fontello.1579191725174.woff2 rename priv/static/static/{fontello.1579191413379.css => fontello.1579191725174.css} (87%) rename priv/static/static/js/{2.8896ea39a0ea8016391a.js => 2.7eaed4ad0d253fad6f55.js} (91%) rename priv/static/static/js/{2.8896ea39a0ea8016391a.js.map => 2.7eaed4ad0d253fad6f55.js.map} (98%) create mode 100644 priv/static/static/js/app.6fc3537f2985f0a2e06a.js create mode 100644 priv/static/static/js/app.6fc3537f2985f0a2e06a.js.map delete mode 100644 priv/static/static/js/app.eb7444df7c8e44e553de.js delete mode 100644 priv/static/static/js/app.eb7444df7c8e44e553de.js.map delete mode 100644 priv/static/static/js/vendors~app.86bc6d5e06d2e17976c5.js.map rename priv/static/static/js/{vendors~app.86bc6d5e06d2e17976c5.js => vendors~app.ef669266eac4d086d74e.js} (92%) create mode 100644 priv/static/static/js/vendors~app.ef669266eac4d086d74e.js.map diff --git a/lib/pleroma/web/activity_pub/mrf/gab_rewrite_policy.ex b/lib/pleroma/web/activity_pub/mrf/gab_rewrite_policy.ex deleted file mode 100644 index fe48b848e..000000000 --- a/lib/pleroma/web/activity_pub/mrf/gab_rewrite_policy.ex +++ /dev/null @@ -1,53 +0,0 @@ -defmodule Pleroma.Web.ActivityPub.MRF.GABRewritePolicy do - @moduledoc "Adds stupid quotes to gab users" - @behaviour Pleroma.Web.ActivityPub.MRF - @domain "gab.com" - @appends [ - "Sent from AOL Mobile Mail", - "John had surgery Friday and he's with the lord now.", - "Lovely pics as alway, Janice. I have terminal brain cancer.", - "DISCUSTING", - "I DID NOT POST THAT! SOMEONE HAS HACKED MY ACCOUNT", - "LOVE ETHYL", - "Just got back from the doctor. I have Ebola. See you at church on Sunday!", - "ADULT ONLY", - "Are you my grandson?", - "http://m.facebook.com", - "WISH GOD WOULD TAKE ME.", - "YOU SURE ARE A LONG BABY", - "REFURBISHD +OK?", - "THIS EMAIL IS INTENDED FOR THE RECIPIENT ONLY. PLEASE THINK ABOUT THE ENVIRONMENT BEFORE YOU PRINT THIS MESSAGE", - "AC/DC is my favourite band", - "BRAD'S WIFE!", - "Order corn!", - "Yim yum", - "My 49 year old son, Shane, died this morning.", - "I called Mr uber", - "Coconut oil.", - "price for apple sauce at walmart", - "no SWEARING on my timeline!", - "MILK TRUK JUST ARRIVE", - "Also my catheter bag is full.", - "Go finish your yoghurt", - "I am going to slap your mouth grandson." - ] - - def add(%{"object" => %{"content" => content}} = object) do - put_in(object, ["object", "content"], content <> " " <> Enum.random(@appends)) - end - - @impl true - def describe, do: {:ok, %{}} - - @impl true - def filter(%{"type" => "Create", "actor" => actor} = object) do - actor_info = URI.parse(actor) - if String.contains?(actor_info.host, @domain) do - {:ok, add(object)} - else - {:ok, object} - end - end - - def filter(object), do: {:ok, object} -end diff --git a/priv/static/index.html b/priv/static/index.html index a4c1578db..539ff68a0 100644 --- a/priv/static/index.html +++ b/priv/static/index.html @@ -1 +1 @@ -Pleroma
\ No newline at end of file +Pleroma
\ No newline at end of file diff --git a/priv/static/static/font/fontello.1579191413379.woff b/priv/static/static/font/fontello.1579191413379.woff deleted file mode 100644 index 32c2f86bad7ce2590c582f76cbce5d24b359be6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13324 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∾Qu(g%(wvnzU*#F;z7Zta21ZKvgoBh5J{; zRlf-fc5Q<78!4Fq6H_b|yx;D(=^&MgKz{vfO zqm$wYQ^VhrSe~T%n=e8;2Y^We7a?JZq z>bu)BBX}y57D}D?V)v+Th|0ozVFpmkDc91t1xa#}QIn!sbQI|zoa1^SMiXpbZPcKa zge!(^$hm$6W~G_h2e;o9ubt_3ca?l~!4CGImMa;hT6N{8DtSUuB|?#`Y0y%b>O*t9 zKic2h-dtZ!#-l-}-MqiPDpOHjD88VKjrP9w%!a`;px8!H?G#jA-Vbt7F)Hm!DzbeP z@(0>-o*K7GDtEDK{m>kTO;nY$AjXD=mEa-y5CN3HAw&ri3}G>@1|Zf)i`}VA`)Z<< zA}H+sOil_r8v(owjUj3nLjuEk{WK4Bv2t7tHbz8{7>00|UJyDKywlEl)$mM-(ATTU zCYKOYI(`l%`Pho#MvFm%+aWHpYR2czYhseK+1PIJ(*2peklH4Hk7qUz7Ys9oA#!2GJhQ}N<+ZY93+P-*@7lNFw|dqq zu!UPfFDW&?rn3)tapZgGE_Jr>wyyFXrc#0^s09Y3AU19g94&L%?PPCsEikk}cw~!B zHiDa3!4Kv`CN6fKF+qqaGKKLE@tFvr9KB~{oYjZuGWJKnW zMf)uoAZJpwLl>en$s6WcFi)`O4GvSc0p3}tGQ5D%h|K1*!8LYON6vVea1NDvm)r>0XFo%_22?<#m*)2#S#r4B!Yg1gV9glSRRvlPvlu zSafepd+qw|)#a(#@48i^x!|nFYde!4429TS6P4t3Mr6*5%;_d0=Ezpr4;o1h(SjPl ziQ|==j2J~TobeZRR5l+A0*2A~4uXh519j}E2Y@J$j~+t(3Ph~0+U}RHt`?({r9Jhh z&s;?<-lnd+!kocE z_t2R#nW~hmn}C+XG=hX%D71u=@z_ev?{a@rb0U_#mJu`?kBvrN@gt4Mx|ASc=$^Xg z$e3qb@Umo6(Q$ERPDoX+H<7 za3x44oSq6l@=e@FCX(tyS(<_KUO{$=SKuNPc8R&!AfV2=Fdy|~j43XUFcc*AwXx7T zh$&V`nyNq_LTPx<=Q5J-jBmVWomLO}j58Iz$40ZnF>M5w#Wb!PTsubRWo|mOxL?yD*HK-^b5|&3bBY)gDA=Z z|@vzrzHP6jqw`?mp9_1;cQFcRO zYWie{2!O!mk8&ULnhPO3~sjV)0Wc$24!G0$NKnUs6)rDc?yZkbnP&Q_;(U{&NR2JK8w=@#;qx_`)fZ za8`4Q^Ow}gTxUL<{pq$G*@uVI91b^@jeA^G&MtF9@4(F8Ld@CQYuZ@L)Lx`Ay@Jo> zsZeu9Ew<9J!aM(7%L@21b*!47FP46({$0Q9!>5ke4k5^gn?Sj&BrnkpOO2Mtz>Vu5=oSb)8}*)+sH|KCFC{qF zCWxxK@Y=y}hfZz8kX-|*e>a6-Sy44z7&g1J_ApgLf>dnj&@a z-bPVf4IL0^*pFx?{C6H1BF>Op^fwc1kbv6TmW*2K+}1ky!LnUtmc zYT~SE2>w#71&JIrX}qUW0LPQkph(+3tcyl@Wv1MdH~)0715^O2`y((< zYRCKt5(C|Wr?ZLf^ZETMuIR_Efk$YdZYO^2ivEl)-u_ps?HAt4#k@a#t(o@LD(C`^ C%%)EO diff --git a/priv/static/static/font/fontello.1579191413379.eot b/priv/static/static/font/fontello.1579191725174.eot similarity index 88% rename from priv/static/static/font/fontello.1579191413379.eot rename to priv/static/static/font/fontello.1579191725174.eot index aeb870f7ca16897d097378cd338986adb7574a59..90f9bdb795ef0130bea634de77557a0cf28946d6 100644 GIT binary patch delta 681 zcmZXRTS!x30LTB|c68E=h1qs?DQ7KnX)SABFp;*&oKHm&SUuEmH*9MM9kL$6f*wk& zw$6h_3wn@{dI|O-5jE&Z$hRK4K=hEZN9{rpq5aR!W9Q>{e&7GQp7VXBXJY=TsFTkE zO0lk2^7Spu6;I4hUkd%Y0Ek6EdNDSYbJuTe{s1DQ0Ne>BnVBgT&N1f!vyzNXDs11u ze2Q*JrmrS$d}@+_`WSG0Zz>**$#TU41a7gvC&dQSvc&O$3bQAb$>m>{wmvX_Wqy~= zj*Ucbib4hmF0mnd&x2r#TD*~#3Z^W=FT+{`?nOvIJd zK*vkqOjUg>-gx^VI1j=PW3ARnZ{x^*NTPuq9=IVvs3~Uv=GJvNURI8?I|_KK^n^dMKuk0#$;2v|oqYVEwKR_S5%t&_*xo-~jza2kkUZ zL<3%WRR;&@?>gw9H+9enY&7YN;t(r5Aq^a+2X)}113EZD^8_`}MaOi&58vQs8aM`g z;}2+nlx0(Ed-;LSywf$e(C52o8TbjavC2+-3=eX_n!D6Wuvc`ezk_$w+o6JYZP%2w z**al;Z;ROe$g}n~`+a-Wk#l@@_BivdJ+8Ig#oEPmm%~G5BPX679xuNd7D9a+d0xIY H($e@3W)82y delta 813 zcmZXSOH30{6o&shcUn-22-q^bLcuDJ@=&2u5*q^rvBXDQpwW${LZQKyPD({wk+9Jy zh|RbliiR`|A-XZC3lj;6vXKQF<3f!Q7C^cziit4>Jnhw$bMxh!|77mDkIeKlHuIbr zW-b8RQG-)XF2>bp+w@p!y%hkP2jq9XBN3}{cV`>$e4(PXUmFPCjXtm2{Y3dZ z<&S|-Z@2g9_~Zo8QA35Hpm$Vb_j2bbPgAxId4s-{Cq)Y7SAevlg@z-yhtAR&y6#Xu zt%ZHsM!S6h=n3evY^l}-M)SZ_@XT91c`tqGg3QRU!3r62vPz$jLKS|b$6#gz@ZZo& z_;rJWx*7E-|E16JJ$a^dcZv3!c^rvH@?$nu1tbX^Bp(ydLP)j{-93i(0aFpCB0Bv}y zPk?4JEtUqf`EP%LBVo#_thti8T0SMcL>_Eym7JlIF-XwBC5iWdbLkQ!E}c10SdcFp z6gx9FXH_>lS{j+r+@e}7yh2-D(_+c^CUbAH#@5x<)<{g63&+;!xCwhxZef`kUrb)j zbNxULr{4(p+~q3&XT8VmWU4;lp5(KDu5?5j+RPU7oTbweE6Oe!RqB+5;)}&^OO%p$ z>Auqb()qG;<(Bd{G(Wv{HSxY9hf{;EU4s&HCOoGY%Qbn!;n2;7-W%Z&U!UIXd6D?( Hv6}t>QUK2~ diff --git a/priv/static/static/font/fontello.1579191413379.svg b/priv/static/static/font/fontello.1579191725174.svg similarity index 99% rename from priv/static/static/font/fontello.1579191413379.svg rename to priv/static/static/font/fontello.1579191725174.svg index 44beba9a2..98111ac20 100644 --- a/priv/static/static/font/fontello.1579191413379.svg +++ b/priv/static/static/font/fontello.1579191725174.svg @@ -74,8 +74,6 @@ - - diff --git a/priv/static/static/font/fontello.1579191413379.ttf b/priv/static/static/font/fontello.1579191725174.ttf similarity index 88% rename from priv/static/static/font/fontello.1579191413379.ttf rename to priv/static/static/font/fontello.1579191725174.ttf index 6a81cee8d8a8d5e2c352ee8b9ca96affffb5122d..5cd2c1417411f40a31be03c1761fa1495a0b76b6 100644 GIT binary patch delta 652 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 literal 0 HcmV?d00001 diff --git a/priv/static/static/font/fontello.1579191725174.woff2 b/priv/static/static/font/fontello.1579191725174.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..75dd7d17a2e628ce41317d516dff24f81b9beb68 GIT binary patch literal 11208 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 m?EkuM;TByQS+u?o*)zQP{BA9)ZvJ^^!v4l tag\n\n// load the styles\nvar content = require(\"!!../../../node_modules/css-loader/index.js?minimize!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!../../../node_modules/sass-loader/lib/loader.js!../../../node_modules/vue-loader/lib/selector.js?type=styles&index=0!./sticker_picker.vue\");\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"cc6cdea4\", content, true, {});","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".sticker-picker{width:100%}.sticker-picker .contents{min-height:250px}.sticker-picker .contents .sticker-picker-content{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0 4px}.sticker-picker .contents .sticker-picker-content .sticker{display:-ms-flexbox;display:flex;-ms-flex:1 1 auto;flex:1 1 auto;margin:4px;width:56px;height:56px}.sticker-picker .contents .sticker-picker-content .sticker img{height:100%}.sticker-picker .contents .sticker-picker-content .sticker img:hover{filter:drop-shadow(0 0 5px var(--link,#d8a070))}\", \"\"]);\n\n// exports\n","/* eslint-env browser */\nimport statusPosterService from '../../services/status_poster/status_poster.service.js'\nimport TabSwitcher from '../tab_switcher/tab_switcher.js'\n\nconst StickerPicker = {\n components: {\n TabSwitcher\n },\n data () {\n return {\n meta: {\n stickers: []\n },\n path: ''\n }\n },\n computed: {\n pack () {\n return this.$store.state.instance.stickers || []\n }\n },\n methods: {\n clear () {\n this.meta = {\n stickers: []\n }\n },\n pick (sticker, name) {\n const store = this.$store\n // TODO remove this workaround by finding a way to bypass reuploads\n fetch(sticker)\n .then((res) => {\n res.blob().then((blob) => {\n var file = new File([blob], name, { mimetype: 'image/png' })\n var formData = new FormData()\n formData.append('file', file)\n statusPosterService.uploadMedia({ store, formData })\n .then((fileData) => {\n this.$emit('uploaded', fileData)\n this.clear()\n }, (error) => {\n console.warn(\"Can't attach sticker\")\n console.warn(error)\n this.$emit('upload-failed', 'default')\n })\n })\n })\n }\n }\n}\n\nexport default StickerPicker\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./sticker_picker.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./sticker_picker.js\"\nimport __vue_script__ from \"!!babel-loader!./sticker_picker.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-772c11f7\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./sticker_picker.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"sticker-picker\"},[_c('tab-switcher',{staticClass:\"tab-switcher\",attrs:{\"render-only-focused\":true,\"scrollable-tabs\":\"\"}},_vm._l((_vm.pack),function(stickerpack){return _c('div',{key:stickerpack.path,staticClass:\"sticker-picker-content\",attrs:{\"image-tooltip\":stickerpack.meta.title,\"image\":stickerpack.path + stickerpack.meta.tabIcon}},_vm._l((stickerpack.meta.stickers),function(sticker){return _c('div',{key:sticker,staticClass:\"sticker\",on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();_vm.pick(stickerpack.path + sticker, stickerpack.meta.title)}}},[_c('img',{attrs:{\"src\":stickerpack.path + sticker}})])}),0)}),0)],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/components/sticker_picker/sticker_picker.vue?d6cd","webpack:///./src/components/sticker_picker/sticker_picker.vue?d5ea","webpack:///./src/components/sticker_picker/sticker_picker.js","webpack:///./src/components/sticker_picker/sticker_picker.vue","webpack:///./src/components/sticker_picker/sticker_picker.vue?53f6"],"names":["content","__webpack_require__","module","i","locals","exports","add","default","push","StickerPicker","components","TabSwitcher","data","meta","stickers","path","computed","pack","this","$store","state","instance","methods","clear","pick","sticker","name","_this","store","fetch","then","res","blob","file","File","mimetype","formData","FormData","append","statusPosterService","uploadMedia","fileData","$emit","error","console","warn","__vue_styles__","context","Component","Object","component_normalizer","sticker_picker","_vm","_h","$createElement","_c","_self","staticClass","attrs","render-only-focused","scrollable-tabs","_l","stickerpack","key","image-tooltip","title","image","tabIcon","on","click","$event","stopPropagation","preventDefault","src","__webpack_exports__"],"mappings":"6EAGA,IAAAA,EAAcC,EAAQ,KACtB,iBAAAD,MAAA,EAA4CE,EAAAC,EAASH,EAAA,MACrDA,EAAAI,SAAAF,EAAAG,QAAAL,EAAAI,SAGAE,EADUL,EAAQ,GAAgEM,SAClF,WAAAP,GAAA,4BCRAE,EAAAG,QAA2BJ,EAAQ,EAARA,EAA0D,IAKrFO,KAAA,CAAcN,EAAAC,EAAS,0iBAA0iB,0DC8CljBM,EA/CO,CACpBC,WAAY,CACVC,qBAEFC,KAJoB,WAKlB,MAAO,CACLC,KAAM,CACJC,SAAU,IAEZC,KAAM,KAGVC,SAAU,CACRC,KADQ,WAEN,OAAOC,KAAKC,OAAOC,MAAMC,SAASP,UAAY,KAGlDQ,QAAS,CACPC,MADO,WAELL,KAAKL,KAAO,CACVC,SAAU,KAGdU,KANO,SAMDC,EAASC,GAAM,IAAAC,EAAAT,KACbU,EAAQV,KAAKC,OAEnBU,MAAMJ,GACHK,KAAK,SAACC,GACLA,EAAIC,OAAOF,KAAK,SAACE,GACf,IAAIC,EAAO,IAAIC,KAAK,CAACF,GAAON,EAAM,CAAES,SAAU,cAC1CC,EAAW,IAAIC,SACnBD,EAASE,OAAO,OAAQL,GACxBM,IAAoBC,YAAY,CAAEZ,QAAOQ,aACtCN,KAAK,SAACW,GACLd,EAAKe,MAAM,WAAYD,GACvBd,EAAKJ,SACJ,SAACoB,GACFC,QAAQC,KAAK,wBACbD,QAAQC,KAAKF,GACbhB,EAAKe,MAAM,gBAAiB,2BCnC5C,IAEAI,EAVA,SAAAC,GACE9C,EAAQ,MAeV+C,EAAgBC,OAAAC,EAAA,EAAAD,CACdE,ECjBF,WAA0B,IAAAC,EAAAlC,KAAamC,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,kBAA6B,CAAAF,EAAA,gBAAqBE,YAAA,eAAAC,MAAA,CAAkCC,uBAAA,EAAAC,kBAAA,KAAiDR,EAAAS,GAAAT,EAAA,cAAAU,GAAyC,OAAAP,EAAA,OAAiBQ,IAAAD,EAAA/C,KAAA0C,YAAA,yBAAAC,MAAA,CAAiEM,gBAAAF,EAAAjD,KAAAoD,MAAAC,MAAAJ,EAAA/C,KAAA+C,EAAAjD,KAAAsD,UAA4Ff,EAAAS,GAAAC,EAAAjD,KAAA,kBAAAY,GAAsD,OAAA8B,EAAA,OAAiBQ,IAAAtC,EAAAgC,YAAA,UAAAW,GAAA,CAAsCC,MAAA,SAAAC,GAAyBA,EAAAC,kBAAyBD,EAAAE,iBAAwBpB,EAAA5B,KAAAsC,EAAA/C,KAAAU,EAAAqC,EAAAjD,KAAAoD,UAA+D,CAAAV,EAAA,OAAYG,MAAA,CAAOe,IAAAX,EAAA/C,KAAAU,SAAsC,KAAK,QAC1vB,IDOA,EAaAqB,EATA,KAEA,MAYe4B,EAAA,QAAA1B,EAAiB","file":"static/js/2.7eaed4ad0d253fad6f55.js","sourcesContent":["// style-loader: Adds some css to the DOM by adding a \n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./checkbox.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./checkbox.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./checkbox.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-58c9b3c4\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./checkbox.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{staticClass:\"checkbox\",class:{ disabled: _vm.disabled, indeterminate: _vm.indeterminate }},[_c('input',{attrs:{\"type\":\"checkbox\",\"disabled\":_vm.disabled},domProps:{\"checked\":_vm.checked,\"indeterminate\":_vm.indeterminate},on:{\"change\":function($event){_vm.$emit('change', $event.target.checked)}}}),_vm._v(\" \"),_c('i',{staticClass:\"checkbox-indicator\"}),_vm._v(\" \"),(!!_vm.$slots.default)?_c('span',{staticClass:\"label\"},[_vm._t(\"default\")],2):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","// TODO this func might as well take the entire file and use its mimetype\n// or the entire service could be just mimetype service that only operates\n// on mimetypes and not files. Currently the naming is confusing.\nconst fileType = mimetype => {\n if (mimetype.match(/text\\/html/)) {\n return 'html'\n }\n\n if (mimetype.match(/image/)) {\n return 'image'\n }\n\n if (mimetype.match(/video/)) {\n return 'video'\n }\n\n if (mimetype.match(/audio/)) {\n return 'audio'\n }\n\n return 'unknown'\n}\n\nconst fileMatchesSomeType = (types, file) =>\n types.some(type => fileType(file.mimetype) === type)\n\nconst fileTypeService = {\n fileType,\n fileMatchesSomeType\n}\n\nexport default fileTypeService\n","const DialogModal = {\n props: {\n darkOverlay: {\n default: true,\n type: Boolean\n },\n onCancel: {\n default: () => {},\n type: Function\n }\n }\n}\n\nexport default DialogModal\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./dialog_modal.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./dialog_modal.js\"\nimport __vue_script__ from \"!!babel-loader!./dialog_modal.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-eafd78a6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./dialog_modal.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{class:{ 'dark-overlay': _vm.darkOverlay },on:{\"click\":function($event){if($event.target !== $event.currentTarget){ return null; }$event.stopPropagation();_vm.onCancel()}}},[_c('div',{staticClass:\"dialog-modal panel panel-default\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',{staticClass:\"panel-heading dialog-modal-heading\"},[_c('div',{staticClass:\"title\"},[_vm._t(\"header\")],2)]),_vm._v(\" \"),_c('div',{staticClass:\"dialog-modal-content\"},[_vm._t(\"default\")],2),_vm._v(\" \"),_c('div',{staticClass:\"dialog-modal-footer user-interactions panel-footer\"},[_vm._t(\"footer\")],2)])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import DialogModal from '../dialog_modal/dialog_modal.vue'\n\nconst FORCE_NSFW = 'mrf_tag:media-force-nsfw'\nconst STRIP_MEDIA = 'mrf_tag:media-strip'\nconst FORCE_UNLISTED = 'mrf_tag:force-unlisted'\nconst DISABLE_REMOTE_SUBSCRIPTION = 'mrf_tag:disable-remote-subscription'\nconst DISABLE_ANY_SUBSCRIPTION = 'mrf_tag:disable-any-subscription'\nconst SANDBOX = 'mrf_tag:sandbox'\nconst QUARANTINE = 'mrf_tag:quarantine'\n\nconst ModerationTools = {\n props: [\n 'user'\n ],\n data () {\n return {\n showDropDown: false,\n tags: {\n FORCE_NSFW,\n STRIP_MEDIA,\n FORCE_UNLISTED,\n DISABLE_REMOTE_SUBSCRIPTION,\n DISABLE_ANY_SUBSCRIPTION,\n SANDBOX,\n QUARANTINE\n },\n showDeleteUserDialog: false\n }\n },\n components: {\n DialogModal\n },\n computed: {\n tagsSet () {\n return new Set(this.user.tags)\n },\n hasTagPolicy () {\n return this.$store.state.instance.tagPolicyAvailable\n }\n },\n methods: {\n hasTag (tagName) {\n return this.tagsSet.has(tagName)\n },\n toggleTag (tag) {\n const store = this.$store\n if (this.tagsSet.has(tag)) {\n store.state.api.backendInteractor.untagUser(this.user, tag).then(response => {\n if (!response.ok) { return }\n store.commit('untagUser', { user: this.user, tag })\n })\n } else {\n store.state.api.backendInteractor.tagUser(this.user, tag).then(response => {\n if (!response.ok) { return }\n store.commit('tagUser', { user: this.user, tag })\n })\n }\n },\n toggleRight (right) {\n const store = this.$store\n if (this.user.rights[right]) {\n store.state.api.backendInteractor.deleteRight(this.user, right).then(response => {\n if (!response.ok) { return }\n store.commit('updateRight', { user: this.user, right: right, value: false })\n })\n } else {\n store.state.api.backendInteractor.addRight(this.user, right).then(response => {\n if (!response.ok) { return }\n store.commit('updateRight', { user: this.user, right: right, value: true })\n })\n }\n },\n toggleActivationStatus () {\n this.$store.dispatch('toggleActivationStatus', this.user)\n },\n deleteUserDialog (show) {\n this.showDeleteUserDialog = show\n },\n deleteUser () {\n const store = this.$store\n const user = this.user\n const { id, name } = user\n store.state.api.backendInteractor.deleteUser(user)\n .then(e => {\n this.$store.dispatch('markStatusesAsDeleted', status => user.id === status.user.id)\n const isProfile = this.$route.name === 'external-user-profile' || this.$route.name === 'user-profile'\n const isTargetUser = this.$route.params.name === name || this.$route.params.id === id\n if (isProfile && isTargetUser) {\n window.history.back()\n }\n })\n }\n }\n}\n\nexport default ModerationTools\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./moderation_tools.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./moderation_tools.js\"\nimport __vue_script__ from \"!!babel-loader!./moderation_tools.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-756a6c4e\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./moderation_tools.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-popover',{staticClass:\"moderation-tools-popover\",attrs:{\"trigger\":\"click\",\"placement\":\"bottom-end\"},on:{\"show\":function($event){_vm.showDropDown = true},\"hide\":function($event){_vm.showDropDown = false}}},[_c('div',{attrs:{\"slot\":\"popover\"},slot:\"popover\"},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.user.is_local)?_c('span',[_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleRight(\"admin\")}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.rights.admin ? 'user_card.admin_menu.revoke_admin' : 'user_card.admin_menu.grant_admin'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleRight(\"moderator\")}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.rights.moderator ? 'user_card.admin_menu.revoke_moderator' : 'user_card.admin_menu.grant_moderator'))+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}})]):_vm._e(),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleActivationStatus()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(!!_vm.user.deactivated ? 'user_card.admin_menu.activate_account' : 'user_card.admin_menu.deactivate_account'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.deleteUserDialog(true)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_account'))+\"\\n \")]),_vm._v(\" \"),(_vm.hasTagPolicy)?_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}}):_vm._e(),_vm._v(\" \"),(_vm.hasTagPolicy)?_c('span',[_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleTag(_vm.tags.FORCE_NSFW)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.force_nsfw'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.FORCE_NSFW) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleTag(_vm.tags.STRIP_MEDIA)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.strip_media'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.STRIP_MEDIA) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleTag(_vm.tags.FORCE_UNLISTED)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.force_unlisted'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.FORCE_UNLISTED) }})]),_vm._v(\" \"),_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleTag(_vm.tags.SANDBOX)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.sandbox'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.SANDBOX) }})]),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleTag(_vm.tags.DISABLE_REMOTE_SUBSCRIPTION)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.disable_remote_subscription'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.DISABLE_REMOTE_SUBSCRIPTION) }})]):_vm._e(),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleTag(_vm.tags.DISABLE_ANY_SUBSCRIPTION)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.disable_any_subscription'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.DISABLE_ANY_SUBSCRIPTION) }})]):_vm._e(),_vm._v(\" \"),(_vm.user.is_local)?_c('button',{staticClass:\"dropdown-item\",on:{\"click\":function($event){_vm.toggleTag(_vm.tags.QUARANTINE)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.quarantine'))+\"\\n \"),_c('span',{staticClass:\"menu-checkbox\",class:{ 'menu-checkbox-checked': _vm.hasTag(_vm.tags.QUARANTINE) }})]):_vm._e()]):_vm._e()])]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default btn-block\",class:{ pressed: _vm.showDropDown }},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.moderation'))+\"\\n \")])]),_vm._v(\" \"),_c('portal',{attrs:{\"to\":\"modal\"}},[(_vm.showDeleteUserDialog)?_c('DialogModal',{attrs:{\"on-cancel\":_vm.deleteUserDialog.bind(this, false)}},[_c('template',{slot:\"header\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_user'))+\"\\n \")]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('user_card.admin_menu.delete_user_confirmation')))]),_vm._v(\" \"),_c('template',{slot:\"footer\"},[_c('button',{staticClass:\"btn btn-default\",on:{\"click\":function($event){_vm.deleteUserDialog(false)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.cancel'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default danger\",on:{\"click\":function($event){_vm.deleteUser()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.admin_menu.delete_user'))+\"\\n \")])])],2):_vm._e()],1)],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import ProgressButton from '../progress_button/progress_button.vue'\n\nconst AccountActions = {\n props: [\n 'user'\n ],\n data () {\n return { }\n },\n components: {\n ProgressButton\n },\n methods: {\n showRepeats () {\n this.$store.dispatch('showReblogs', this.user.id)\n },\n hideRepeats () {\n this.$store.dispatch('hideReblogs', this.user.id)\n },\n blockUser () {\n this.$store.dispatch('blockUser', this.user.id)\n },\n unblockUser () {\n this.$store.dispatch('unblockUser', this.user.id)\n },\n reportUser () {\n this.$store.dispatch('openUserReportingModal', this.user.id)\n }\n }\n}\n\nexport default AccountActions\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./account_actions.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./account_actions.js\"\nimport __vue_script__ from \"!!babel-loader!./account_actions.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3967dbf7\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./account_actions.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"account-actions\"},[_c('v-popover',{staticClass:\"account-tools-popover\",attrs:{\"trigger\":\"click\",\"container\":false,\"placement\":\"bottom-end\",\"offset\":5}},[_c('div',{attrs:{\"slot\":\"popover\"},slot:\"popover\"},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.user.following)?[(_vm.user.showing_reblogs)?_c('button',{staticClass:\"btn btn-default dropdown-item\",on:{\"click\":_vm.hideRepeats}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.hide_repeats'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(!_vm.user.showing_reblogs)?_c('button',{staticClass:\"btn btn-default dropdown-item\",on:{\"click\":_vm.showRepeats}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.show_repeats'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"dropdown-divider\",attrs:{\"role\":\"separator\"}})]:_vm._e(),_vm._v(\" \"),(_vm.user.statusnet_blocking)?_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.unblockUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.unblock'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.blockUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.block'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default btn-block dropdown-item\",on:{\"click\":_vm.reportUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.report'))+\"\\n \")])],2)]),_vm._v(\" \"),_c('div',{staticClass:\"btn btn-default ellipsis-button\"},[_c('i',{staticClass:\"icon-ellipsis trigger-button\"})])])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import UserAvatar from '../user_avatar/user_avatar.vue'\nimport RemoteFollow from '../remote_follow/remote_follow.vue'\nimport ProgressButton from '../progress_button/progress_button.vue'\nimport FollowButton from '../follow_button/follow_button.vue'\nimport ModerationTools from '../moderation_tools/moderation_tools.vue'\nimport AccountActions from '../account_actions/account_actions.vue'\nimport { hex2rgb } from '../../services/color_convert/color_convert.js'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\nimport { mapGetters } from 'vuex'\n\nexport default {\n props: [\n 'user', 'switcher', 'selected', 'hideBio', 'rounded', 'bordered', 'allowZoomingAvatar'\n ],\n data () {\n return {\n followRequestInProgress: false,\n betterShadow: this.$store.state.interface.browserSupport.cssFilter\n }\n },\n created () {\n this.$store.dispatch('fetchUserRelationship', this.user.id)\n },\n computed: {\n classes () {\n return [{\n 'user-card-rounded-t': this.rounded === 'top', // set border-top-left-radius and border-top-right-radius\n 'user-card-rounded': this.rounded === true, // set border-radius for all sides\n 'user-card-bordered': this.bordered === true // set border for all sides\n }]\n },\n style () {\n const color = this.$store.getters.mergedConfig.customTheme.colors\n ? this.$store.getters.mergedConfig.customTheme.colors.bg // v2\n : this.$store.getters.mergedConfig.colors.bg // v1\n\n if (color) {\n const rgb = (typeof color === 'string') ? hex2rgb(color) : color\n const tintColor = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .5)`\n\n return {\n backgroundColor: `rgb(${Math.floor(rgb.r * 0.53)}, ${Math.floor(rgb.g * 0.56)}, ${Math.floor(rgb.b * 0.59)})`,\n backgroundImage: [\n `linear-gradient(to bottom, ${tintColor}, ${tintColor})`,\n `url(${this.user.cover_photo})`\n ].join(', ')\n }\n }\n },\n isOtherUser () {\n return this.user.id !== this.$store.state.users.currentUser.id\n },\n subscribeUrl () {\n // eslint-disable-next-line no-undef\n const serverUrl = new URL(this.user.statusnet_profile_url)\n return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`\n },\n loggedIn () {\n return this.$store.state.users.currentUser\n },\n dailyAvg () {\n const days = Math.ceil((new Date() - new Date(this.user.created_at)) / (60 * 60 * 24 * 1000))\n return Math.round(this.user.statuses_count / days)\n },\n userHighlightType: {\n get () {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n return (data && data.type) || 'disabled'\n },\n set (type) {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n if (type !== 'disabled') {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color: (data && data.color) || '#FFFFFF', type })\n } else {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color: undefined })\n }\n },\n ...mapGetters(['mergedConfig'])\n },\n userHighlightColor: {\n get () {\n const data = this.$store.getters.mergedConfig.highlight[this.user.screen_name]\n return data && data.color\n },\n set (color) {\n this.$store.dispatch('setHighlight', { user: this.user.screen_name, color })\n }\n },\n visibleRole () {\n const rights = this.user.rights\n if (!rights) { return }\n const validRole = rights.admin || rights.moderator\n const roleTitle = rights.admin ? 'admin' : 'moderator'\n return validRole && roleTitle\n },\n hideFollowsCount () {\n return this.isOtherUser && this.user.hide_follows_count\n },\n hideFollowersCount () {\n return this.isOtherUser && this.user.hide_followers_count\n },\n ...mapGetters(['mergedConfig'])\n },\n components: {\n UserAvatar,\n RemoteFollow,\n ModerationTools,\n AccountActions,\n ProgressButton,\n FollowButton\n },\n methods: {\n muteUser () {\n this.$store.dispatch('muteUser', this.user.id)\n },\n unmuteUser () {\n this.$store.dispatch('unmuteUser', this.user.id)\n },\n subscribeUser () {\n return this.$store.dispatch('subscribeUser', this.user.id)\n },\n unsubscribeUser () {\n return this.$store.dispatch('unsubscribeUser', this.user.id)\n },\n setProfileView (v) {\n if (this.switcher) {\n const store = this.$store\n store.commit('setProfileView', { v })\n }\n },\n linkClicked ({ target }) {\n if (target.tagName === 'SPAN') {\n target = target.parentNode\n }\n if (target.tagName === 'A') {\n window.open(target.href, '_blank')\n }\n },\n userProfileLink (user) {\n return generateProfileLink(\n user.id, user.screen_name,\n this.$store.state.instance.restrictedNicknames\n )\n },\n zoomAvatar () {\n const attachment = {\n url: this.user.profile_image_url_original,\n mimetype: 'image'\n }\n this.$store.dispatch('setMedia', [attachment])\n this.$store.dispatch('setCurrent', attachment)\n },\n mentionUser () {\n this.$store.dispatch('openPostStatusModal', { replyTo: true, repliedUser: this.user })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./user_card.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./user_card.js\"\nimport __vue_script__ from \"!!babel-loader!./user_card.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-d0b51e66\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./user_card.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"user-card\",class:_vm.classes},[_c('div',{staticClass:\"background-image\",class:{ 'hide-bio': _vm.hideBio },style:(_vm.style)}),_vm._v(\" \"),_c('div',{staticClass:\"panel-heading\"},[_c('div',{staticClass:\"user-info\"},[_c('div',{staticClass:\"container\"},[(_vm.allowZoomingAvatar)?_c('a',{staticClass:\"user-info-avatar-link\",on:{\"click\":_vm.zoomAvatar}},[_c('UserAvatar',{attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.user}}),_vm._v(\" \"),_vm._m(0)],1):_c('router-link',{attrs:{\"to\":_vm.userProfileLink(_vm.user)}},[_c('UserAvatar',{attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.user}})],1),_vm._v(\" \"),_c('div',{staticClass:\"user-summary\"},[_c('div',{staticClass:\"top-line\"},[(_vm.user.name_html)?_c('div',{staticClass:\"user-name\",attrs:{\"title\":_vm.user.name},domProps:{\"innerHTML\":_vm._s(_vm.user.name_html)}}):_c('div',{staticClass:\"user-name\",attrs:{\"title\":_vm.user.name}},[_vm._v(\"\\n \"+_vm._s(_vm.user.name)+\"\\n \")]),_vm._v(\" \"),(!_vm.isOtherUser)?_c('router-link',{attrs:{\"to\":{ name: 'user-settings' }}},[_c('i',{staticClass:\"button-icon icon-wrench usersettings\",attrs:{\"title\":_vm.$t('tool_tip.user_settings')}})]):_vm._e(),_vm._v(\" \"),(_vm.isOtherUser && !_vm.user.is_local)?_c('a',{attrs:{\"href\":_vm.user.statusnet_profile_url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"icon-link-ext usersettings\"})]):_vm._e(),_vm._v(\" \"),(_vm.isOtherUser && _vm.loggedIn)?_c('AccountActions',{attrs:{\"user\":_vm.user}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"bottom-line\"},[_c('router-link',{staticClass:\"user-screen-name\",attrs:{\"to\":_vm.userProfileLink(_vm.user)}},[_vm._v(\"\\n @\"+_vm._s(_vm.user.screen_name)+\"\\n \")]),_vm._v(\" \"),(!_vm.hideBio && !!_vm.visibleRole)?_c('span',{staticClass:\"alert staff\"},[_vm._v(_vm._s(_vm.visibleRole))]):_vm._e(),_vm._v(\" \"),(_vm.user.locked)?_c('span',[_c('i',{staticClass:\"icon icon-lock\"})]):_vm._e(),_vm._v(\" \"),(!_vm.mergedConfig.hideUserStats && !_vm.hideBio)?_c('span',{staticClass:\"dailyAvg\"},[_vm._v(_vm._s(_vm.dailyAvg)+\" \"+_vm._s(_vm.$t('user_card.per_day')))]):_vm._e()],1)])],1),_vm._v(\" \"),_c('div',{staticClass:\"user-meta\"},[(_vm.user.follows_you && _vm.loggedIn && _vm.isOtherUser)?_c('div',{staticClass:\"following\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.follows_you'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.isOtherUser && (_vm.loggedIn || !_vm.switcher))?_c('div',{staticClass:\"highlighter\"},[(_vm.userHighlightType !== 'disabled')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightColor),expression:\"userHighlightColor\"}],staticClass:\"userHighlightText\",attrs:{\"id\":'userHighlightColorTx'+_vm.user.id,\"type\":\"text\"},domProps:{\"value\":(_vm.userHighlightColor)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.userHighlightColor=$event.target.value}}}):_vm._e(),_vm._v(\" \"),(_vm.userHighlightType !== 'disabled')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightColor),expression:\"userHighlightColor\"}],staticClass:\"userHighlightCl\",attrs:{\"id\":'userHighlightColor'+_vm.user.id,\"type\":\"color\"},domProps:{\"value\":(_vm.userHighlightColor)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.userHighlightColor=$event.target.value}}}):_vm._e(),_vm._v(\" \"),_c('label',{staticClass:\"userHighlightSel select\",attrs:{\"for\":\"style-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.userHighlightType),expression:\"userHighlightType\"}],staticClass:\"userHighlightSel\",attrs:{\"id\":'userHighlightSel'+_vm.user.id},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.userHighlightType=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},[_c('option',{attrs:{\"value\":\"disabled\"}},[_vm._v(\"No highlight\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"solid\"}},[_vm._v(\"Solid bg\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"striped\"}},[_vm._v(\"Striped bg\")]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"side\"}},[_vm._v(\"Side stripe\")])]),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]):_vm._e()]),_vm._v(\" \"),(_vm.loggedIn && _vm.isOtherUser)?_c('div',{staticClass:\"user-interactions\"},[_c('div',{staticClass:\"btn-group\"},[_c('FollowButton',{attrs:{\"user\":_vm.user}}),_vm._v(\" \"),(_vm.user.following)?[(!_vm.user.subscribed)?_c('ProgressButton',{staticClass:\"btn btn-default\",attrs:{\"click\":_vm.subscribeUser,\"title\":_vm.$t('user_card.subscribe')}},[_c('i',{staticClass:\"icon-bell-alt\"})]):_c('ProgressButton',{staticClass:\"btn btn-default pressed\",attrs:{\"click\":_vm.unsubscribeUser,\"title\":_vm.$t('user_card.unsubscribe')}},[_c('i',{staticClass:\"icon-bell-ringing-o\"})])]:_vm._e()],2),_vm._v(\" \"),_c('div',[(_vm.user.muted)?_c('button',{staticClass:\"btn btn-default btn-block pressed\",on:{\"click\":_vm.unmuteUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.muted'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default btn-block\",on:{\"click\":_vm.muteUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.mute'))+\"\\n \")])]),_vm._v(\" \"),_c('div',[_c('button',{staticClass:\"btn btn-default btn-block\",on:{\"click\":_vm.mentionUser}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('user_card.mention'))+\"\\n \")])]),_vm._v(\" \"),(_vm.loggedIn.role === \"admin\")?_c('ModerationTools',{attrs:{\"user\":_vm.user}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.loggedIn && _vm.user.is_local)?_c('div',{staticClass:\"user-interactions\"},[_c('RemoteFollow',{attrs:{\"user\":_vm.user}})],1):_vm._e()])]),_vm._v(\" \"),(!_vm.hideBio)?_c('div',{staticClass:\"panel-body\"},[(!_vm.mergedConfig.hideUserStats && _vm.switcher)?_c('div',{staticClass:\"user-counts\"},[_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();_vm.setProfileView('statuses')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.statuses')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.user.statuses_count)+\" \"),_c('br')])]),_vm._v(\" \"),_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();_vm.setProfileView('friends')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.followees')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.hideFollowsCount ? _vm.$t('user_card.hidden') : _vm.user.friends_count))])]),_vm._v(\" \"),_c('div',{staticClass:\"user-count\",on:{\"click\":function($event){$event.preventDefault();_vm.setProfileView('followers')}}},[_c('h5',[_vm._v(_vm._s(_vm.$t('user_card.followers')))]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.hideFollowersCount ? _vm.$t('user_card.hidden') : _vm.user.followers_count))])])]):_vm._e(),_vm._v(\" \"),(!_vm.hideBio && _vm.user.description_html)?_c('p',{staticClass:\"user-card-bio\",domProps:{\"innerHTML\":_vm._s(_vm.user.description_html)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}):(!_vm.hideBio)?_c('p',{staticClass:\"user-card-bio\"},[_vm._v(\"\\n \"+_vm._s(_vm.user.description)+\"\\n \")]):_vm._e()]):_vm._e()])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"user-info-avatar-link-overlay\"},[_c('i',{staticClass:\"button-icon icon-zoom-in\"})])}]\nexport { render, staticRenderFns }","import StillImage from '../still-image/still-image.vue'\nimport VideoAttachment from '../video_attachment/video_attachment.vue'\nimport nsfwImage from '../../assets/nsfw.png'\nimport fileTypeService from '../../services/file_type/file_type.service.js'\n\nconst Attachment = {\n props: [\n 'attachment',\n 'nsfw',\n 'statusId',\n 'size',\n 'allowPlay',\n 'setMedia',\n 'naturalSizeLoad'\n ],\n data () {\n return {\n nsfwImage: this.$store.state.instance.nsfwCensorImage || nsfwImage,\n hideNsfwLocal: this.$store.getters.mergedConfig.hideNsfw,\n preloadImage: this.$store.getters.mergedConfig.preloadImage,\n loading: false,\n img: fileTypeService.fileType(this.attachment.mimetype) === 'image' && document.createElement('img'),\n modalOpen: false,\n showHidden: false\n }\n },\n components: {\n StillImage,\n VideoAttachment\n },\n computed: {\n usePlaceHolder () {\n return this.size === 'hide' || this.type === 'unknown'\n },\n referrerpolicy () {\n return this.$store.state.instance.mediaProxyAvailable ? '' : 'no-referrer'\n },\n type () {\n return fileTypeService.fileType(this.attachment.mimetype)\n },\n hidden () {\n return this.nsfw && this.hideNsfwLocal && !this.showHidden\n },\n isEmpty () {\n return (this.type === 'html' && !this.attachment.oembed) || this.type === 'unknown'\n },\n isSmall () {\n return this.size === 'small'\n },\n fullwidth () {\n return this.type === 'html' || this.type === 'audio'\n }\n },\n methods: {\n linkClicked ({ target }) {\n if (target.tagName === 'A') {\n window.open(target.href, '_blank')\n }\n },\n openModal (event) {\n const modalTypes = this.$store.getters.mergedConfig.playVideosInModal\n ? ['image', 'video']\n : ['image']\n if (fileTypeService.fileMatchesSomeType(modalTypes, this.attachment) ||\n this.usePlaceHolder\n ) {\n event.stopPropagation()\n event.preventDefault()\n this.setMedia()\n this.$store.dispatch('setCurrent', this.attachment)\n }\n },\n toggleHidden (event) {\n if (this.$store.getters.mergedConfig.useOneClickNsfw && !this.showHidden) {\n this.openModal(event)\n return\n }\n if (this.img && !this.preloadImage) {\n if (this.img.onload) {\n this.img.onload()\n } else {\n this.loading = true\n this.img.src = this.attachment.url\n this.img.onload = () => {\n this.loading = false\n this.showHidden = !this.showHidden\n }\n }\n } else {\n this.showHidden = !this.showHidden\n }\n },\n onImageLoad (image) {\n const width = image.naturalWidth\n const height = image.naturalHeight\n this.naturalSizeLoad && this.naturalSizeLoad({ width, height })\n }\n }\n}\n\nexport default Attachment\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./attachment.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./attachment.js\"\nimport __vue_script__ from \"!!babel-loader!./attachment.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-47ab0ca0\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./attachment.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {\nvar _obj;\nvar _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.usePlaceHolder)?_c('div',{on:{\"click\":_vm.openModal}},[(_vm.type !== 'html')?_c('a',{staticClass:\"placeholder\",attrs:{\"target\":\"_blank\",\"href\":_vm.attachment.url}},[_vm._v(\"\\n [\"+_vm._s(_vm.nsfw ? \"NSFW/\" : \"\")+_vm._s(_vm.type.toUpperCase())+\"]\\n \")]):_vm._e()]):_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.isEmpty),expression:\"!isEmpty\"}],staticClass:\"attachment\",class:( _obj = {}, _obj[_vm.type] = true, _obj.loading = _vm.loading, _obj['fullwidth'] = _vm.fullwidth, _obj['nsfw-placeholder'] = _vm.hidden, _obj )},[(_vm.hidden)?_c('a',{staticClass:\"image-attachment\",attrs:{\"href\":_vm.attachment.url},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleHidden($event)}}},[_c('img',{key:_vm.nsfwImage,staticClass:\"nsfw\",class:{'small': _vm.isSmall},attrs:{\"src\":_vm.nsfwImage}}),_vm._v(\" \"),(_vm.type === 'video')?_c('i',{staticClass:\"play-icon icon-play-circled\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.nsfw && _vm.hideNsfwLocal && !_vm.hidden)?_c('div',{staticClass:\"hider\"},[_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleHidden($event)}}},[_vm._v(\"Hide\")])]):_vm._e(),_vm._v(\" \"),(_vm.type === 'image' && (!_vm.hidden || _vm.preloadImage))?_c('a',{staticClass:\"image-attachment\",class:{'hidden': _vm.hidden && _vm.preloadImage },attrs:{\"href\":_vm.attachment.url,\"target\":\"_blank\",\"title\":_vm.attachment.description},on:{\"click\":_vm.openModal}},[_c('StillImage',{attrs:{\"referrerpolicy\":_vm.referrerpolicy,\"mimetype\":_vm.attachment.mimetype,\"src\":_vm.attachment.large_thumb_url || _vm.attachment.url,\"image-load-handler\":_vm.onImageLoad}})],1):_vm._e(),_vm._v(\" \"),(_vm.type === 'video' && !_vm.hidden)?_c('a',{staticClass:\"video-container\",class:{'small': _vm.isSmall},attrs:{\"href\":_vm.allowPlay ? undefined : _vm.attachment.url},on:{\"click\":_vm.openModal}},[_c('VideoAttachment',{staticClass:\"video\",attrs:{\"attachment\":_vm.attachment,\"controls\":_vm.allowPlay}}),_vm._v(\" \"),(!_vm.allowPlay)?_c('i',{staticClass:\"play-icon icon-play-circled\"}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.type === 'audio')?_c('audio',{attrs:{\"src\":_vm.attachment.url,\"controls\":\"\"}}):_vm._e(),_vm._v(\" \"),(_vm.type === 'html' && _vm.attachment.oembed)?_c('div',{staticClass:\"oembed\",on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}},[(_vm.attachment.thumb_url)?_c('div',{staticClass:\"image\"},[_c('img',{attrs:{\"src\":_vm.attachment.thumb_url}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"text\"},[_c('h1',[_c('a',{attrs:{\"href\":_vm.attachment.url}},[_vm._v(_vm._s(_vm.attachment.oembed.title))])]),_vm._v(\" \"),_c('div',{domProps:{\"innerHTML\":_vm._s(_vm.attachment.oembed.oembedHTML)}})])]):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { mapGetters } from 'vuex'\n\nconst FavoriteButton = {\n props: ['status', 'loggedIn'],\n data () {\n return {\n animated: false\n }\n },\n methods: {\n favorite () {\n if (!this.status.favorited) {\n this.$store.dispatch('favorite', { id: this.status.id })\n } else {\n this.$store.dispatch('unfavorite', { id: this.status.id })\n }\n this.animated = true\n setTimeout(() => {\n this.animated = false\n }, 500)\n }\n },\n computed: {\n classes () {\n return {\n 'icon-star-empty': !this.status.favorited,\n 'icon-star': this.status.favorited,\n 'animate-spin': this.animated\n }\n },\n ...mapGetters(['mergedConfig'])\n }\n}\n\nexport default FavoriteButton\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./favorite_button.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./favorite_button.js\"\nimport __vue_script__ from \"!!babel-loader!./favorite_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2ced002f\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./favorite_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.loggedIn)?_c('div',[_c('i',{staticClass:\"button-icon favorite-button fav-active\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.favorite')},on:{\"click\":function($event){$event.preventDefault();_vm.favorite()}}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.fave_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.fave_num))]):_vm._e()]):_c('div',[_c('i',{staticClass:\"button-icon favorite-button\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.favorite')}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.fave_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.fave_num))]):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { mapGetters } from 'vuex'\n\nconst RetweetButton = {\n props: ['status', 'loggedIn', 'visibility'],\n data () {\n return {\n animated: false\n }\n },\n methods: {\n retweet () {\n if (!this.status.repeated) {\n this.$store.dispatch('retweet', { id: this.status.id })\n } else {\n this.$store.dispatch('unretweet', { id: this.status.id })\n }\n this.animated = true\n setTimeout(() => {\n this.animated = false\n }, 500)\n }\n },\n computed: {\n classes () {\n return {\n 'retweeted': this.status.repeated,\n 'retweeted-empty': !this.status.repeated,\n 'animate-spin': this.animated\n }\n },\n ...mapGetters(['mergedConfig'])\n }\n}\n\nexport default RetweetButton\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./retweet_button.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./retweet_button.js\"\nimport __vue_script__ from \"!!babel-loader!./retweet_button.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-538410cc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./retweet_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.loggedIn)?_c('div',[(_vm.visibility !== 'private' && _vm.visibility !== 'direct')?[_c('i',{staticClass:\"button-icon retweet-button icon-retweet rt-active\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.repeat')},on:{\"click\":function($event){$event.preventDefault();_vm.retweet()}}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.repeat_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.repeat_num))]):_vm._e()]:[_c('i',{staticClass:\"button-icon icon-lock\",class:_vm.classes,attrs:{\"title\":_vm.$t('timeline.no_retweet_hint')}})]],2):(!_vm.loggedIn)?_c('div',[_c('i',{staticClass:\"button-icon icon-retweet\",class:_vm.classes,attrs:{\"title\":_vm.$t('tool_tip.repeat')}}),_vm._v(\" \"),(!_vm.mergedConfig.hidePostStats && _vm.status.repeat_num > 0)?_c('span',[_vm._v(_vm._s(_vm.status.repeat_num))]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Timeago from '../timeago/timeago.vue'\nimport { forEach, map } from 'lodash'\n\nexport default {\n name: 'Poll',\n props: ['basePoll'],\n components: { Timeago },\n data () {\n return {\n loading: false,\n choices: []\n }\n },\n created () {\n if (!this.$store.state.polls.pollsObject[this.pollId]) {\n this.$store.dispatch('mergeOrAddPoll', this.basePoll)\n }\n this.$store.dispatch('trackPoll', this.pollId)\n },\n destroyed () {\n this.$store.dispatch('untrackPoll', this.pollId)\n },\n computed: {\n pollId () {\n return this.basePoll.id\n },\n poll () {\n const storePoll = this.$store.state.polls.pollsObject[this.pollId]\n return storePoll || {}\n },\n options () {\n return (this.poll && this.poll.options) || []\n },\n expiresAt () {\n return (this.poll && this.poll.expires_at) || 0\n },\n expired () {\n return (this.poll && this.poll.expired) || false\n },\n loggedIn () {\n return this.$store.state.users.currentUser\n },\n showResults () {\n return this.poll.voted || this.expired || !this.loggedIn\n },\n totalVotesCount () {\n return this.poll.votes_count\n },\n containerClass () {\n return {\n loading: this.loading\n }\n },\n choiceIndices () {\n // Convert array of booleans into an array of indices of the\n // items that were 'true', so [true, false, false, true] becomes\n // [0, 3].\n return this.choices\n .map((entry, index) => entry && index)\n .filter(value => typeof value === 'number')\n },\n isDisabled () {\n const noChoice = this.choiceIndices.length === 0\n return this.loading || noChoice\n }\n },\n methods: {\n percentageForOption (count) {\n return this.totalVotesCount === 0 ? 0 : Math.round(count / this.totalVotesCount * 100)\n },\n resultTitle (option) {\n return `${option.votes_count}/${this.totalVotesCount} ${this.$t('polls.votes')}`\n },\n fetchPoll () {\n this.$store.dispatch('refreshPoll', { id: this.statusId, pollId: this.poll.id })\n },\n activateOption (index) {\n // forgive me father: doing checking the radio/checkboxes\n // in code because of customized input elements need either\n // a) an extra element for the actual graphic, or b) use a\n // pseudo element for the label. We use b) which mandates\n // using \"for\" and \"id\" matching which isn't nice when the\n // same poll appears multiple times on the site (notifs and\n // timeline for example). With code we can make sure it just\n // works without altering the pseudo element implementation.\n const allElements = this.$el.querySelectorAll('input')\n const clickedElement = this.$el.querySelector(`input[value=\"${index}\"]`)\n if (this.poll.multiple) {\n // Checkboxes, toggle only the clicked one\n clickedElement.checked = !clickedElement.checked\n } else {\n // Radio button, uncheck everything and check the clicked one\n forEach(allElements, element => { element.checked = false })\n clickedElement.checked = true\n }\n this.choices = map(allElements, e => e.checked)\n },\n optionId (index) {\n return `poll${this.poll.id}-${index}`\n },\n vote () {\n if (this.choiceIndices.length === 0) return\n this.loading = true\n this.$store.dispatch(\n 'votePoll',\n { id: this.statusId, pollId: this.poll.id, choices: this.choiceIndices }\n ).then(poll => {\n this.loading = false\n })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./poll.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./poll.js\"\nimport __vue_script__ from \"!!babel-loader!./poll.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6feb4525\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./poll.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"poll\",class:_vm.containerClass},[_vm._l((_vm.options),function(option,index){return _c('div',{key:index,staticClass:\"poll-option\"},[(_vm.showResults)?_c('div',{staticClass:\"option-result\",attrs:{\"title\":_vm.resultTitle(option)}},[_c('div',{staticClass:\"option-result-label\"},[_c('span',{staticClass:\"result-percentage\"},[_vm._v(\"\\n \"+_vm._s(_vm.percentageForOption(option.votes_count))+\"%\\n \")]),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(option.title))])]),_vm._v(\" \"),_c('div',{staticClass:\"result-fill\",style:({ 'width': ((_vm.percentageForOption(option.votes_count)) + \"%\") })})]):_c('div',{on:{\"click\":function($event){_vm.activateOption(index)}}},[(_vm.poll.multiple)?_c('input',{attrs:{\"type\":\"checkbox\",\"disabled\":_vm.loading},domProps:{\"value\":index}}):_c('input',{attrs:{\"type\":\"radio\",\"disabled\":_vm.loading},domProps:{\"value\":index}}),_vm._v(\" \"),_c('label',{staticClass:\"option-vote\"},[_c('div',[_vm._v(_vm._s(option.title))])])])])}),_vm._v(\" \"),_c('div',{staticClass:\"footer faint\"},[(!_vm.showResults)?_c('button',{staticClass:\"btn btn-default poll-vote-button\",attrs:{\"type\":\"button\",\"disabled\":_vm.isDisabled},on:{\"click\":_vm.vote}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('polls.vote'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"total\"},[_vm._v(\"\\n \"+_vm._s(_vm.totalVotesCount)+\" \"+_vm._s(_vm.$t(\"polls.votes\"))+\" · \\n \")]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":_vm.expired ? 'polls.expired' : 'polls.expires_in'}},[_c('Timeago',{attrs:{\"time\":_vm.expiresAt,\"auto-update\":60,\"now-threshold\":0}})],1)],1)],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const ExtraButtons = {\n props: [ 'status' ],\n methods: {\n deleteStatus () {\n const confirmed = window.confirm(this.$t('status.delete_confirm'))\n if (confirmed) {\n this.$store.dispatch('deleteStatus', { id: this.status.id })\n }\n },\n pinStatus () {\n this.$store.dispatch('pinStatus', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n unpinStatus () {\n this.$store.dispatch('unpinStatus', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n muteConversation () {\n this.$store.dispatch('muteConversation', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n },\n unmuteConversation () {\n this.$store.dispatch('unmuteConversation', this.status.id)\n .then(() => this.$emit('onSuccess'))\n .catch(err => this.$emit('onError', err.error.error))\n }\n },\n computed: {\n currentUser () { return this.$store.state.users.currentUser },\n canDelete () {\n if (!this.currentUser) { return }\n const superuser = this.currentUser.rights.moderator || this.currentUser.rights.admin\n return superuser || this.status.user.id === this.currentUser.id\n },\n ownStatus () {\n return this.status.user.id === this.currentUser.id\n },\n canPin () {\n return this.ownStatus && (this.status.visibility === 'public' || this.status.visibility === 'unlisted')\n },\n canMute () {\n return !!this.currentUser\n }\n }\n}\n\nexport default ExtraButtons\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./extra_buttons.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./extra_buttons.js\"\nimport __vue_script__ from \"!!babel-loader!./extra_buttons.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-0caa0403\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./extra_buttons.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.canDelete || _vm.canMute || _vm.canPin)?_c('v-popover',{staticClass:\"extra-button-popover\",attrs:{\"trigger\":\"click\",\"placement\":\"top\"}},[_c('div',{attrs:{\"slot\":\"popover\"},slot:\"popover\"},[_c('div',{staticClass:\"dropdown-menu\"},[(_vm.canMute && !_vm.status.thread_muted)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.muteConversation($event)}}},[_c('i',{staticClass:\"icon-eye-off\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.mute_conversation\")))])]):_vm._e(),_vm._v(\" \"),(_vm.canMute && _vm.status.thread_muted)?_c('button',{staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.unmuteConversation($event)}}},[_c('i',{staticClass:\"icon-eye-off\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.unmute_conversation\")))])]):_vm._e(),_vm._v(\" \"),(!_vm.status.pinned && _vm.canPin)?_c('button',{directives:[{name:\"close-popover\",rawName:\"v-close-popover\"}],staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.pinStatus($event)}}},[_c('i',{staticClass:\"icon-pin\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.pin\")))])]):_vm._e(),_vm._v(\" \"),(_vm.status.pinned && _vm.canPin)?_c('button',{directives:[{name:\"close-popover\",rawName:\"v-close-popover\"}],staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.unpinStatus($event)}}},[_c('i',{staticClass:\"icon-pin\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.unpin\")))])]):_vm._e(),_vm._v(\" \"),(_vm.canDelete)?_c('button',{directives:[{name:\"close-popover\",rawName:\"v-close-popover\"}],staticClass:\"dropdown-item dropdown-item-icon\",on:{\"click\":function($event){$event.preventDefault();return _vm.deleteStatus($event)}}},[_c('i',{staticClass:\"icon-cancel\"}),_c('span',[_vm._v(_vm._s(_vm.$t(\"status.delete\")))])]):_vm._e()])]),_vm._v(\" \"),_c('div',{staticClass:\"button-icon\"},[_c('i',{staticClass:\"icon-ellipsis\"})])]):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Attachment from '../attachment/attachment.vue'\nimport { chunk, last, dropRight, sumBy } from 'lodash'\n\nconst Gallery = {\n props: [\n 'attachments',\n 'nsfw',\n 'setMedia'\n ],\n data () {\n return {\n sizes: {}\n }\n },\n components: { Attachment },\n computed: {\n rows () {\n if (!this.attachments) {\n return []\n }\n const rows = chunk(this.attachments, 3)\n if (last(rows).length === 1 && rows.length > 1) {\n // if 1 attachment on last row -> add it to the previous row instead\n const lastAttachment = last(rows)[0]\n const allButLastRow = dropRight(rows)\n last(allButLastRow).push(lastAttachment)\n return allButLastRow\n }\n return rows\n },\n useContainFit () {\n return this.$store.getters.mergedConfig.useContainFit\n }\n },\n methods: {\n onNaturalSizeLoad (id, size) {\n this.$set(this.sizes, id, size)\n },\n rowStyle (itemsPerRow) {\n return { 'padding-bottom': `${(100 / (itemsPerRow + 0.6))}%` }\n },\n itemStyle (id, row) {\n const total = sumBy(row, item => this.getAspectRatio(item.id))\n return { flex: `${this.getAspectRatio(id) / total} 1 0%` }\n },\n getAspectRatio (id) {\n const size = this.sizes[id]\n return size ? size.width / size.height : 1\n }\n }\n}\n\nexport default Gallery\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./gallery.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./gallery.js\"\nimport __vue_script__ from \"!!babel-loader!./gallery.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-68a574b8\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./gallery.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"galleryContainer\",staticStyle:{\"width\":\"100%\"}},_vm._l((_vm.rows),function(row,index){return _c('div',{key:index,staticClass:\"gallery-row\",class:{ 'contain-fit': _vm.useContainFit, 'cover-fit': !_vm.useContainFit },style:(_vm.rowStyle(row.length))},[_c('div',{staticClass:\"gallery-row-inner\"},_vm._l((row),function(attachment){return _c('attachment',{key:attachment.id,style:(_vm.itemStyle(attachment.id, row)),attrs:{\"set-media\":_vm.setMedia,\"nsfw\":_vm.nsfw,\"attachment\":attachment,\"allow-play\":false,\"natural-size-load\":_vm.onNaturalSizeLoad.bind(null, attachment.id)}})}),1)])}),0)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const LinkPreview = {\n name: 'LinkPreview',\n props: [\n 'card',\n 'size',\n 'nsfw'\n ],\n data () {\n return {\n imageLoaded: false\n }\n },\n computed: {\n useImage () {\n // Currently BE shoudn't give cards if tagged NSFW, this is a bit paranoid\n // as it makes sure to hide the image if somehow NSFW tagged preview can\n // exist.\n return this.card.image && !this.nsfw && this.size !== 'hide'\n },\n useDescription () {\n return this.card.description && /\\S/.test(this.card.description)\n }\n },\n created () {\n if (this.useImage) {\n const newImg = new Image()\n newImg.onload = () => {\n this.imageLoaded = true\n }\n newImg.src = this.card.image\n }\n }\n}\n\nexport default LinkPreview\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./link-preview.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./link-preview.js\"\nimport __vue_script__ from \"!!babel-loader!./link-preview.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7c8d99ac\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./link-preview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('a',{staticClass:\"link-preview-card\",attrs:{\"href\":_vm.card.url,\"target\":\"_blank\",\"rel\":\"noopener\"}},[(_vm.useImage && _vm.imageLoaded)?_c('div',{staticClass:\"card-image\",class:{ 'small-image': _vm.size === 'small' }},[_c('img',{attrs:{\"src\":_vm.card.image}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"card-content\"},[_c('span',{staticClass:\"card-host faint\"},[_vm._v(_vm._s(_vm.card.provider_name))]),_vm._v(\" \"),_c('h4',{staticClass:\"card-title\"},[_vm._v(_vm._s(_vm.card.title))]),_vm._v(\" \"),(_vm.useDescription)?_c('p',{staticClass:\"card-description\"},[_vm._v(_vm._s(_vm.card.description))]):_vm._e()])])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import UserAvatar from '../user_avatar/user_avatar.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\n\nconst AvatarList = {\n props: ['users'],\n computed: {\n slicedUsers () {\n return this.users ? this.users.slice(0, 15) : []\n }\n },\n components: {\n UserAvatar\n },\n methods: {\n userProfileLink (user) {\n return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)\n }\n }\n}\n\nexport default AvatarList\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./avatar_list.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./avatar_list.js\"\nimport __vue_script__ from \"!!babel-loader!./avatar_list.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-4cea5bcf\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./avatar_list.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"avatars\"},_vm._l((_vm.slicedUsers),function(user){return _c('router-link',{key:user.id,staticClass:\"avatars-item\",attrs:{\"to\":_vm.userProfileLink(user)}},[_c('UserAvatar',{staticClass:\"avatar-small\",attrs:{\"user\":user}})],1)}),1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { find } from 'lodash'\n\nconst StatusPopover = {\n name: 'StatusPopover',\n props: [\n 'statusId'\n ],\n data () {\n return {\n popperOptions: {\n modifiers: {\n preventOverflow: { padding: { top: 50 }, boundariesElement: 'viewport' }\n }\n }\n }\n },\n computed: {\n status () {\n return find(this.$store.state.statuses.allStatuses, { id: this.statusId })\n }\n },\n components: {\n Status: () => import('../status/status.vue')\n },\n methods: {\n enter () {\n if (!this.status) {\n this.$store.dispatch('fetchStatus', this.statusId)\n }\n }\n }\n}\n\nexport default StatusPopover\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./status_popover.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./status_popover.js\"\nimport __vue_script__ from \"!!babel-loader!./status_popover.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ef621460\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./status_popover.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-popover',{attrs:{\"popover-class\":\"status-popover\",\"placement\":\"top-start\",\"popper-options\":_vm.popperOptions},on:{\"show\":function($event){_vm.enter()}}},[_c('template',{slot:\"popover\"},[(_vm.status)?_c('Status',{attrs:{\"is-preview\":true,\"statusoid\":_vm.status,\"compact\":true}}):_c('div',{staticClass:\"status-preview-loading\"},[_c('i',{staticClass:\"icon-spin4 animate-spin\"})])],1),_vm._v(\" \"),_vm._t(\"default\")],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Attachment from '../attachment/attachment.vue'\nimport FavoriteButton from '../favorite_button/favorite_button.vue'\nimport RetweetButton from '../retweet_button/retweet_button.vue'\nimport Poll from '../poll/poll.vue'\nimport ExtraButtons from '../extra_buttons/extra_buttons.vue'\nimport PostStatusForm from '../post_status_form/post_status_form.vue'\nimport UserCard from '../user_card/user_card.vue'\nimport UserAvatar from '../user_avatar/user_avatar.vue'\nimport Gallery from '../gallery/gallery.vue'\nimport LinkPreview from '../link-preview/link-preview.vue'\nimport AvatarList from '../avatar_list/avatar_list.vue'\nimport Timeago from '../timeago/timeago.vue'\nimport StatusPopover from '../status_popover/status_popover.vue'\nimport generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'\nimport fileType from 'src/services/file_type/file_type.service'\nimport { processHtml } from 'src/services/tiny_post_html_processor/tiny_post_html_processor.service.js'\nimport { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'\nimport { mentionMatchesUrl, extractTagFromUrl } from 'src/services/matcher/matcher.service.js'\nimport { filter, unescape, uniqBy } from 'lodash'\nimport { mapGetters, mapState } from 'vuex'\n\nconst Status = {\n name: 'Status',\n props: [\n 'statusoid',\n 'expandable',\n 'inConversation',\n 'focused',\n 'highlight',\n 'compact',\n 'replies',\n 'isPreview',\n 'noHeading',\n 'inlineExpanded',\n 'showPinned',\n 'inProfile',\n 'profileUserId'\n ],\n data () {\n return {\n replying: false,\n unmuted: false,\n userExpanded: false,\n showingTall: this.inConversation && this.focused,\n showingLongSubject: false,\n error: null,\n // not as computed because it sets the initial state which will be changed later\n expandingSubject: !this.$store.getters.mergedConfig.collapseMessageWithSubject\n }\n },\n computed: {\n localCollapseSubjectDefault () {\n return this.mergedConfig.collapseMessageWithSubject\n },\n muteWords () {\n return this.mergedConfig.muteWords\n },\n repeaterClass () {\n const user = this.statusoid.user\n return highlightClass(user)\n },\n userClass () {\n const user = this.retweet ? (this.statusoid.retweeted_status.user) : this.statusoid.user\n return highlightClass(user)\n },\n deleted () {\n return this.statusoid.deleted\n },\n repeaterStyle () {\n const user = this.statusoid.user\n const highlight = this.mergedConfig.highlight\n return highlightStyle(highlight[user.screen_name])\n },\n userStyle () {\n if (this.noHeading) return\n const user = this.retweet ? (this.statusoid.retweeted_status.user) : this.statusoid.user\n const highlight = this.mergedConfig.highlight\n return highlightStyle(highlight[user.screen_name])\n },\n hideAttachments () {\n return (this.mergedConfig.hideAttachments && !this.inConversation) ||\n (this.mergedConfig.hideAttachmentsInConv && this.inConversation)\n },\n userProfileLink () {\n return this.generateUserProfileLink(this.status.user.id, this.status.user.screen_name)\n },\n replyProfileLink () {\n if (this.isReply) {\n return this.generateUserProfileLink(this.status.in_reply_to_user_id, this.replyToName)\n }\n },\n retweet () { return !!this.statusoid.retweeted_status },\n retweeter () { return this.statusoid.user.name || this.statusoid.user.screen_name },\n retweeterHtml () { return this.statusoid.user.name_html },\n retweeterProfileLink () { return this.generateUserProfileLink(this.statusoid.user.id, this.statusoid.user.screen_name) },\n status () {\n if (this.retweet) {\n return this.statusoid.retweeted_status\n } else {\n return this.statusoid\n }\n },\n statusFromGlobalRepository () {\n // NOTE: Consider to replace status with statusFromGlobalRepository\n return this.$store.state.statuses.allStatusesObject[this.status.id]\n },\n loggedIn () {\n return !!this.currentUser\n },\n muteWordHits () {\n const statusText = this.status.text.toLowerCase()\n const statusSummary = this.status.summary.toLowerCase()\n const hits = filter(this.muteWords, (muteWord) => {\n return statusText.includes(muteWord.toLowerCase()) || statusSummary.includes(muteWord.toLowerCase())\n })\n\n return hits\n },\n muted () { return !this.unmuted && ((!(this.inProfile && this.status.user.id === this.profileUserId) && this.status.user.muted) || (!this.inConversation && this.status.thread_muted) || this.muteWordHits.length > 0) },\n hideFilteredStatuses () {\n return this.mergedConfig.hideFilteredStatuses\n },\n hideStatus () {\n return (this.hideReply || this.deleted) || (this.muted && this.hideFilteredStatuses)\n },\n isFocused () {\n // retweet or root of an expanded conversation\n if (this.focused) {\n return true\n } else if (!this.inConversation) {\n return false\n }\n // use conversation highlight only when in conversation\n return this.status.id === this.highlight\n },\n // This is a bit hacky, but we want to approximate post height before rendering\n // so we count newlines (masto uses

for paragraphs, GS uses
between them)\n // as well as approximate line count by counting characters and approximating ~80\n // per line.\n //\n // Using max-height + overflow: auto for status components resulted in false positives\n // very often with japanese characters, and it was very annoying.\n tallStatus () {\n const lengthScore = this.status.statusnet_html.split(/ 20\n },\n longSubject () {\n return this.status.summary.length > 900\n },\n isReply () {\n return !!(this.status.in_reply_to_status_id && this.status.in_reply_to_user_id)\n },\n replyToName () {\n if (this.status.in_reply_to_screen_name) {\n return this.status.in_reply_to_screen_name\n } else {\n const user = this.$store.getters.findUser(this.status.in_reply_to_user_id)\n return user && user.screen_name\n }\n },\n hideReply () {\n if (this.mergedConfig.replyVisibility === 'all') {\n return false\n }\n if (this.inConversation || !this.isReply) {\n return false\n }\n if (this.status.user.id === this.currentUser.id) {\n return false\n }\n if (this.status.type === 'retweet') {\n return false\n }\n const checkFollowing = this.mergedConfig.replyVisibility === 'following'\n for (var i = 0; i < this.status.attentions.length; ++i) {\n if (this.status.user.id === this.status.attentions[i].id) {\n continue\n }\n const taggedUser = this.$store.getters.findUser(this.status.attentions[i].id)\n if (checkFollowing && taggedUser && taggedUser.following) {\n return false\n }\n if (this.status.attentions[i].id === this.currentUser.id) {\n return false\n }\n }\n return this.status.attentions.length > 0\n },\n hideSubjectStatus () {\n if (this.tallStatus && !this.localCollapseSubjectDefault) {\n return false\n }\n return !this.expandingSubject && this.status.summary\n },\n hideTallStatus () {\n if (this.status.summary && this.localCollapseSubjectDefault) {\n return false\n }\n if (this.showingTall) {\n return false\n }\n return this.tallStatus\n },\n showingMore () {\n return (this.tallStatus && this.showingTall) || (this.status.summary && this.expandingSubject)\n },\n nsfwClickthrough () {\n if (!this.status.nsfw) {\n return false\n }\n if (this.status.summary && this.localCollapseSubjectDefault) {\n return false\n }\n return true\n },\n replySubject () {\n if (!this.status.summary) return ''\n const decodedSummary = unescape(this.status.summary)\n const behavior = this.mergedConfig.subjectLineBehavior\n const startsWithRe = decodedSummary.match(/^re[: ]/i)\n if ((behavior !== 'noop' && startsWithRe) || behavior === 'masto') {\n return decodedSummary\n } else if (behavior === 'email') {\n return 're: '.concat(decodedSummary)\n } else if (behavior === 'noop') {\n return ''\n }\n },\n attachmentSize () {\n if ((this.mergedConfig.hideAttachments && !this.inConversation) ||\n (this.mergedConfig.hideAttachmentsInConv && this.inConversation) ||\n (this.status.attachments.length > this.maxThumbnails)) {\n return 'hide'\n } else if (this.compact) {\n return 'small'\n }\n return 'normal'\n },\n galleryTypes () {\n if (this.attachmentSize === 'hide') {\n return []\n }\n return this.mergedConfig.playVideosInModal\n ? ['image', 'video']\n : ['image']\n },\n galleryAttachments () {\n return this.status.attachments.filter(\n file => fileType.fileMatchesSomeType(this.galleryTypes, file)\n )\n },\n nonGalleryAttachments () {\n return this.status.attachments.filter(\n file => !fileType.fileMatchesSomeType(this.galleryTypes, file)\n )\n },\n maxThumbnails () {\n return this.mergedConfig.maxThumbnails\n },\n postBodyHtml () {\n const html = this.status.statusnet_html\n\n if (this.mergedConfig.greentext) {\n try {\n if (html.includes('>')) {\n // This checks if post has '>' at the beginning, excluding mentions so that @mention >impying works\n return processHtml(html, (string) => {\n if (string.includes('>') &&\n string\n .replace(/<[^>]+?>/gi, '') // remove all tags\n .replace(/@\\w+/gi, '') // remove mentions (even failed ones)\n .trim()\n .startsWith('>')) {\n return `${string}`\n } else {\n return string\n }\n })\n } else {\n return html\n }\n } catch (e) {\n console.err('Failed to process status html', e)\n return html\n }\n } else {\n return html\n }\n },\n contentHtml () {\n if (!this.status.summary_html) {\n return this.postBodyHtml\n }\n return this.status.summary_html + '
' + this.postBodyHtml\n },\n combinedFavsAndRepeatsUsers () {\n // Use the status from the global status repository since favs and repeats are saved in it\n const combinedUsers = [].concat(\n this.statusFromGlobalRepository.favoritedBy,\n this.statusFromGlobalRepository.rebloggedBy\n )\n return uniqBy(combinedUsers, 'id')\n },\n ownStatus () {\n return this.status.user.id === this.currentUser.id\n },\n tags () {\n return this.status.tags.filter(tagObj => tagObj.hasOwnProperty('name')).map(tagObj => tagObj.name).join(' ')\n },\n hidePostStats () {\n return this.mergedConfig.hidePostStats\n },\n ...mapGetters(['mergedConfig']),\n ...mapState({\n betterShadow: state => state.interface.browserSupport.cssFilter,\n currentUser: state => state.users.currentUser\n })\n },\n components: {\n Attachment,\n FavoriteButton,\n RetweetButton,\n ExtraButtons,\n PostStatusForm,\n Poll,\n UserCard,\n UserAvatar,\n Gallery,\n LinkPreview,\n AvatarList,\n Timeago,\n StatusPopover\n },\n methods: {\n visibilityIcon (visibility) {\n switch (visibility) {\n case 'private':\n return 'icon-lock'\n case 'unlisted':\n return 'icon-lock-open-alt'\n case 'direct':\n return 'icon-mail-alt'\n default:\n return 'icon-globe'\n }\n },\n showError (error) {\n this.error = error\n },\n clearError () {\n this.error = undefined\n },\n linkClicked (event) {\n const target = event.target.closest('.status-content a')\n if (target) {\n if (target.className.match(/mention/)) {\n const href = target.href\n const attn = this.status.attentions.find(attn => mentionMatchesUrl(attn, href))\n if (attn) {\n event.stopPropagation()\n event.preventDefault()\n const link = this.generateUserProfileLink(attn.id, attn.screen_name)\n this.$router.push(link)\n return\n }\n }\n if (target.rel.match(/(?:^|\\s)tag(?:$|\\s)/) || target.className.match(/hashtag/)) {\n // Extract tag name from link url\n const tag = extractTagFromUrl(target.href)\n if (tag) {\n const link = this.generateTagLink(tag)\n this.$router.push(link)\n return\n }\n }\n window.open(target.href, '_blank')\n }\n },\n toggleReplying () {\n this.replying = !this.replying\n },\n gotoOriginal (id) {\n if (this.inConversation) {\n this.$emit('goto', id)\n }\n },\n toggleExpanded () {\n this.$emit('toggleExpanded')\n },\n toggleMute () {\n this.unmuted = !this.unmuted\n },\n toggleUserExpanded () {\n this.userExpanded = !this.userExpanded\n },\n toggleShowMore () {\n if (this.showingTall) {\n this.showingTall = false\n } else if (this.expandingSubject && this.status.summary) {\n this.expandingSubject = false\n } else if (this.hideTallStatus) {\n this.showingTall = true\n } else if (this.hideSubjectStatus && this.status.summary) {\n this.expandingSubject = true\n }\n },\n generateUserProfileLink (id, name) {\n return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames)\n },\n generateTagLink (tag) {\n return `/tag/${tag}`\n },\n setMedia () {\n const attachments = this.attachmentSize === 'hide' ? this.status.attachments : this.galleryAttachments\n return () => this.$store.dispatch('setMedia', attachments)\n }\n },\n watch: {\n 'highlight': function (id) {\n if (this.status.id === id) {\n let rect = this.$el.getBoundingClientRect()\n if (rect.top < 100) {\n // Post is above screen, match its top to screen top\n window.scrollBy(0, rect.top - 100)\n } else if (rect.height >= (window.innerHeight - 50)) {\n // Post we want to see is taller than screen so match its top to screen top\n window.scrollBy(0, rect.top - 100)\n } else if (rect.bottom > window.innerHeight - 50) {\n // Post is below screen, match its bottom to screen bottom\n window.scrollBy(0, rect.bottom - window.innerHeight + 50)\n }\n }\n },\n 'status.repeat_num': function (num) {\n // refetch repeats when repeat_num is changed in any way\n if (this.isFocused && this.statusFromGlobalRepository.rebloggedBy && this.statusFromGlobalRepository.rebloggedBy.length !== num) {\n this.$store.dispatch('fetchRepeats', this.status.id)\n }\n },\n 'status.fave_num': function (num) {\n // refetch favs when fave_num is changed in any way\n if (this.isFocused && this.statusFromGlobalRepository.favoritedBy && this.statusFromGlobalRepository.favoritedBy.length !== num) {\n this.$store.dispatch('fetchFavs', this.status.id)\n }\n }\n },\n filters: {\n capitalize: function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n }\n }\n}\n\nexport default Status\n","/**\n * This is a tiny purpose-built HTML parser/processor. This basically detects any type of visual newline and\n * allows it to be processed, useful for greentexting, mostly\n *\n * known issue: doesn't handle CDATA so nested CDATA might not work well\n *\n * @param {Object} input - input data\n * @param {(string) => string} processor - function that will be called on every line\n * @return {string} processed html\n */\nexport const processHtml = (html, processor) => {\n const handledTags = new Set(['p', 'br', 'div'])\n const openCloseTags = new Set(['p', 'div'])\n\n let buffer = '' // Current output buffer\n const level = [] // How deep we are in tags and which tags were there\n let textBuffer = '' // Current line content\n let tagBuffer = null // Current tag buffer, if null = we are not currently reading a tag\n\n // Extracts tag name from tag, i.e. => span\n const getTagName = (tag) => {\n const result = /(?:<\\/(\\w+)>|<(\\w+)\\s?[^/]*?\\/?>)/gi.exec(tag)\n return result && (result[1] || result[2])\n }\n\n const flush = () => { // Processes current line buffer, adds it to output buffer and clears line buffer\n if (textBuffer.trim().length > 0) {\n buffer += processor(textBuffer)\n } else {\n buffer += textBuffer\n }\n textBuffer = ''\n }\n\n const handleBr = (tag) => { // handles single newlines/linebreaks/selfclosing\n flush()\n buffer += tag\n }\n\n const handleOpen = (tag) => { // handles opening tags\n flush()\n buffer += tag\n level.push(tag)\n }\n\n const handleClose = (tag) => { // handles closing tags\n flush()\n buffer += tag\n if (level[level.length - 1] === tag) {\n level.pop()\n }\n }\n\n for (let i = 0; i < html.length; i++) {\n const char = html[i]\n if (char === '<' && tagBuffer === null) {\n tagBuffer = char\n } else if (char !== '>' && tagBuffer !== null) {\n tagBuffer += char\n } else if (char === '>' && tagBuffer !== null) {\n tagBuffer += char\n const tagFull = tagBuffer\n tagBuffer = null\n const tagName = getTagName(tagFull)\n if (handledTags.has(tagName)) {\n if (tagName === 'br') {\n handleBr(tagFull)\n } else if (openCloseTags.has(tagName)) {\n if (tagFull[1] === '/') {\n handleClose(tagFull)\n } else if (tagFull[tagFull.length - 2] === '/') {\n // self-closing\n handleBr(tagFull)\n } else {\n handleOpen(tagFull)\n }\n }\n } else {\n textBuffer += tagFull\n }\n } else if (char === '\\n') {\n handleBr(char)\n } else {\n textBuffer += char\n }\n }\n if (tagBuffer) {\n textBuffer += tagBuffer\n }\n\n flush()\n\n return buffer\n}\n","export const mentionMatchesUrl = (attention, url) => {\n if (url === attention.statusnet_profile_url) {\n return true\n }\n const [namepart, instancepart] = attention.screen_name.split('@')\n const matchstring = new RegExp('://' + instancepart + '/.*' + namepart + '$', 'g')\n\n return !!url.match(matchstring)\n}\n\n/**\n * Extract tag name from pleroma or mastodon url.\n * i.e https://bikeshed.party/tag/photo or https://quey.org/tags/sky\n * @param {string} url\n */\nexport const extractTagFromUrl = (url) => {\n const regex = /tag[s]*\\/(\\w+)$/g\n const result = regex.exec(url)\n if (!result) {\n return false\n }\n return result[1]\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./status.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./status.js\"\nimport __vue_script__ from \"!!babel-loader!./status.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1f7e2516\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./status.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.hideStatus)?_c('div',{staticClass:\"status-el\",class:[{ 'status-el_focused': _vm.isFocused }, { 'status-conversation': _vm.inlineExpanded }]},[(_vm.error)?_c('div',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.error)+\"\\n \"),_c('i',{staticClass:\"button-icon icon-cancel\",on:{\"click\":_vm.clearError}})]):_vm._e(),_vm._v(\" \"),(_vm.muted && !_vm.isPreview)?[_c('div',{staticClass:\"media status container muted\"},[_c('small',[_c('router-link',{attrs:{\"to\":_vm.userProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.screen_name)+\"\\n \")])],1),_vm._v(\" \"),_c('small',{staticClass:\"muteWords\"},[_vm._v(_vm._s(_vm.muteWordHits.join(', ')))]),_vm._v(\" \"),_c('a',{staticClass:\"unmute\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMute($event)}}},[_c('i',{staticClass:\"button-icon icon-eye-off\"})])])]:[(_vm.showPinned)?_c('div',{staticClass:\"status-pin\"},[_c('i',{staticClass:\"fa icon-pin faint\"}),_vm._v(\" \"),_c('span',{staticClass:\"faint\"},[_vm._v(_vm._s(_vm.$t('status.pinned')))])]):_vm._e(),_vm._v(\" \"),(_vm.retweet && !_vm.noHeading && !_vm.inConversation)?_c('div',{staticClass:\"media container retweet-info\",class:[_vm.repeaterClass, { highlighted: _vm.repeaterStyle }],style:([_vm.repeaterStyle])},[(_vm.retweet)?_c('UserAvatar',{staticClass:\"media-left\",attrs:{\"better-shadow\":_vm.betterShadow,\"user\":_vm.statusoid.user}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"media-body faint\"},[_c('span',{staticClass:\"user-name\"},[(_vm.retweeterHtml)?_c('router-link',{attrs:{\"to\":_vm.retweeterProfileLink},domProps:{\"innerHTML\":_vm._s(_vm.retweeterHtml)}}):_c('router-link',{attrs:{\"to\":_vm.retweeterProfileLink}},[_vm._v(_vm._s(_vm.retweeter))])],1),_vm._v(\" \"),_c('i',{staticClass:\"fa icon-retweet retweeted\",attrs:{\"title\":_vm.$t('tool_tip.repeat')}}),_vm._v(\"\\n \"+_vm._s(_vm.$t('timeline.repeated'))+\"\\n \")])],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"media status\",class:[_vm.userClass, { highlighted: _vm.userStyle, 'is-retweet': _vm.retweet && !_vm.inConversation }],style:([ _vm.userStyle ]),attrs:{\"data-tags\":_vm.tags}},[(!_vm.noHeading)?_c('div',{staticClass:\"media-left\"},[_c('router-link',{attrs:{\"to\":_vm.userProfileLink},nativeOn:{\"!click\":function($event){$event.stopPropagation();$event.preventDefault();return _vm.toggleUserExpanded($event)}}},[_c('UserAvatar',{attrs:{\"compact\":_vm.compact,\"better-shadow\":_vm.betterShadow,\"user\":_vm.status.user}})],1)],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.userExpanded)?_c('UserCard',{staticClass:\"status-usercard\",attrs:{\"user\":_vm.status.user,\"rounded\":true,\"bordered\":true}}):_vm._e(),_vm._v(\" \"),(!_vm.noHeading)?_c('div',{staticClass:\"media-heading\"},[_c('div',{staticClass:\"heading-name-row\"},[_c('div',{staticClass:\"name-and-account-name\"},[(_vm.status.user.name_html)?_c('h4',{staticClass:\"user-name\",domProps:{\"innerHTML\":_vm._s(_vm.status.user.name_html)}}):_c('h4',{staticClass:\"user-name\"},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.name)+\"\\n \")]),_vm._v(\" \"),_c('router-link',{staticClass:\"account-name\",attrs:{\"to\":_vm.userProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.status.user.screen_name)+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"heading-right\"},[_c('router-link',{staticClass:\"timeago faint-link\",attrs:{\"to\":{ name: 'conversation', params: { id: _vm.status.id } }}},[_c('Timeago',{attrs:{\"time\":_vm.status.created_at,\"auto-update\":60}})],1),_vm._v(\" \"),(_vm.status.visibility)?_c('div',{staticClass:\"button-icon visibility-icon\"},[_c('i',{class:_vm.visibilityIcon(_vm.status.visibility),attrs:{\"title\":_vm._f(\"capitalize\")(_vm.status.visibility)}})]):_vm._e(),_vm._v(\" \"),(!_vm.status.is_local && !_vm.isPreview)?_c('a',{staticClass:\"source_url\",attrs:{\"href\":_vm.status.external_url,\"target\":\"_blank\",\"title\":\"Source\"}},[_c('i',{staticClass:\"button-icon icon-link-ext-alt\"})]):_vm._e(),_vm._v(\" \"),(_vm.expandable && !_vm.isPreview)?[_c('a',{attrs:{\"href\":\"#\",\"title\":\"Expand\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleExpanded($event)}}},[_c('i',{staticClass:\"button-icon icon-plus-squared\"})])]:_vm._e(),_vm._v(\" \"),(_vm.unmuted)?_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleMute($event)}}},[_c('i',{staticClass:\"button-icon icon-eye-off\"})]):_vm._e()],2)]),_vm._v(\" \"),_c('div',{staticClass:\"heading-reply-row\"},[(_vm.isReply)?_c('div',{staticClass:\"reply-to-and-accountname\"},[(!_vm.isPreview)?_c('StatusPopover',{attrs:{\"status-id\":_vm.status.in_reply_to_status_id}},[_c('a',{staticClass:\"reply-to\",attrs:{\"href\":\"#\",\"aria-label\":_vm.$t('tool_tip.reply')},on:{\"click\":function($event){$event.preventDefault();_vm.gotoOriginal(_vm.status.in_reply_to_status_id)}}},[_c('i',{staticClass:\"button-icon icon-reply\"}),_vm._v(\" \"),_c('span',{staticClass:\"faint-link reply-to-text\"},[_vm._v(_vm._s(_vm.$t('status.reply_to')))])])]):_c('span',{staticClass:\"reply-to\"},[_c('span',{staticClass:\"reply-to-text\"},[_vm._v(_vm._s(_vm.$t('status.reply_to')))])]),_vm._v(\" \"),_c('router-link',{attrs:{\"to\":_vm.replyProfileLink}},[_vm._v(\"\\n \"+_vm._s(_vm.replyToName)+\"\\n \")]),_vm._v(\" \"),(_vm.replies && _vm.replies.length)?_c('span',{staticClass:\"faint replies-separator\"},[_vm._v(\"\\n -\\n \")]):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.inConversation && !_vm.isPreview && _vm.replies && _vm.replies.length)?_c('div',{staticClass:\"replies\"},[_c('span',{staticClass:\"faint\"},[_vm._v(_vm._s(_vm.$t('status.replies_list')))]),_vm._v(\" \"),_vm._l((_vm.replies),function(reply){return _c('StatusPopover',{key:reply.id,attrs:{\"status-id\":reply.id}},[_c('a',{staticClass:\"reply-link\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.gotoOriginal(reply.id)}}},[_vm._v(_vm._s(reply.name))])])})],2):_vm._e()])]):_vm._e(),_vm._v(\" \"),(_vm.longSubject)?_c('div',{staticClass:\"status-content-wrapper\",class:{ 'tall-status': !_vm.showingLongSubject }},[(!_vm.showingLongSubject)?_c('a',{staticClass:\"tall-status-hider\",class:{ 'tall-status-hider_focused': _vm.isFocused },attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.showingLongSubject=true}}},[_vm._v(_vm._s(_vm.$t(\"general.show_more\")))]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"status-content media-body\",domProps:{\"innerHTML\":_vm._s(_vm.contentHtml)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}),_vm._v(\" \"),(_vm.showingLongSubject)?_c('a',{staticClass:\"status-unhider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.showingLongSubject=false}}},[_vm._v(_vm._s(_vm.$t(\"general.show_less\")))]):_vm._e()]):_c('div',{staticClass:\"status-content-wrapper\",class:{'tall-status': _vm.hideTallStatus}},[(_vm.hideTallStatus)?_c('a',{staticClass:\"tall-status-hider\",class:{ 'tall-status-hider_focused': _vm.isFocused },attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(_vm._s(_vm.$t(\"general.show_more\")))]):_vm._e(),_vm._v(\" \"),(!_vm.hideSubjectStatus)?_c('div',{staticClass:\"status-content media-body\",domProps:{\"innerHTML\":_vm._s(_vm.contentHtml)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}):_c('div',{staticClass:\"status-content media-body\",domProps:{\"innerHTML\":_vm._s(_vm.status.summary_html)},on:{\"click\":function($event){$event.preventDefault();return _vm.linkClicked($event)}}}),_vm._v(\" \"),(_vm.hideSubjectStatus)?_c('a',{staticClass:\"cw-status-hider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(_vm._s(_vm.$t(\"general.show_more\")))]):_vm._e(),_vm._v(\" \"),(_vm.showingMore)?_c('a',{staticClass:\"status-unhider\",attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleShowMore($event)}}},[_vm._v(_vm._s(_vm.$t(\"general.show_less\")))]):_vm._e()]),_vm._v(\" \"),(_vm.status.poll && _vm.status.poll.options)?_c('div',[_c('poll',{attrs:{\"base-poll\":_vm.status.poll}})],1):_vm._e(),_vm._v(\" \"),(_vm.status.attachments && (!_vm.hideSubjectStatus || _vm.showingLongSubject))?_c('div',{staticClass:\"attachments media-body\"},[_vm._l((_vm.nonGalleryAttachments),function(attachment){return _c('attachment',{key:attachment.id,staticClass:\"non-gallery\",attrs:{\"size\":_vm.attachmentSize,\"nsfw\":_vm.nsfwClickthrough,\"attachment\":attachment,\"allow-play\":true,\"set-media\":_vm.setMedia()}})}),_vm._v(\" \"),(_vm.galleryAttachments.length > 0)?_c('gallery',{attrs:{\"nsfw\":_vm.nsfwClickthrough,\"attachments\":_vm.galleryAttachments,\"set-media\":_vm.setMedia()}}):_vm._e()],2):_vm._e(),_vm._v(\" \"),(_vm.status.card && !_vm.hideSubjectStatus && !_vm.noHeading)?_c('div',{staticClass:\"link-preview media-body\"},[_c('link-preview',{attrs:{\"card\":_vm.status.card,\"size\":_vm.attachmentSize,\"nsfw\":_vm.nsfwClickthrough}})],1):_vm._e(),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"fade\"}},[(!_vm.hidePostStats && _vm.isFocused && _vm.combinedFavsAndRepeatsUsers.length > 0)?_c('div',{staticClass:\"favs-repeated-users\"},[_c('div',{staticClass:\"stats\"},[(_vm.statusFromGlobalRepository.rebloggedBy && _vm.statusFromGlobalRepository.rebloggedBy.length > 0)?_c('div',{staticClass:\"stat-count\"},[_c('a',{staticClass:\"stat-title\"},[_vm._v(_vm._s(_vm.$t('status.repeats')))]),_vm._v(\" \"),_c('div',{staticClass:\"stat-number\"},[_vm._v(\"\\n \"+_vm._s(_vm.statusFromGlobalRepository.rebloggedBy.length)+\"\\n \")])]):_vm._e(),_vm._v(\" \"),(_vm.statusFromGlobalRepository.favoritedBy && _vm.statusFromGlobalRepository.favoritedBy.length > 0)?_c('div',{staticClass:\"stat-count\"},[_c('a',{staticClass:\"stat-title\"},[_vm._v(_vm._s(_vm.$t('status.favorites')))]),_vm._v(\" \"),_c('div',{staticClass:\"stat-number\"},[_vm._v(\"\\n \"+_vm._s(_vm.statusFromGlobalRepository.favoritedBy.length)+\"\\n \")])]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"avatar-row\"},[_c('AvatarList',{attrs:{\"users\":_vm.combinedFavsAndRepeatsUsers}})],1)])]):_vm._e()]),_vm._v(\" \"),(!_vm.noHeading && !_vm.isPreview)?_c('div',{staticClass:\"status-actions media-body\"},[_c('div',[(_vm.loggedIn)?_c('i',{staticClass:\"button-icon icon-reply\",class:{'button-icon-active': _vm.replying},attrs:{\"title\":_vm.$t('tool_tip.reply')},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleReplying($event)}}}):_c('i',{staticClass:\"button-icon button-icon-disabled icon-reply\",attrs:{\"title\":_vm.$t('tool_tip.reply')}}),_vm._v(\" \"),(_vm.status.replies_count > 0)?_c('span',[_vm._v(_vm._s(_vm.status.replies_count))]):_vm._e()]),_vm._v(\" \"),_c('retweet-button',{attrs:{\"visibility\":_vm.status.visibility,\"logged-in\":_vm.loggedIn,\"status\":_vm.status}}),_vm._v(\" \"),_c('favorite-button',{attrs:{\"logged-in\":_vm.loggedIn,\"status\":_vm.status}}),_vm._v(\" \"),_c('extra-buttons',{attrs:{\"status\":_vm.status},on:{\"onError\":_vm.showError,\"onSuccess\":_vm.clearError}})],1):_vm._e()],1)]),_vm._v(\" \"),(_vm.replying)?_c('div',{staticClass:\"container\"},[_c('PostStatusForm',{staticClass:\"reply-body\",attrs:{\"reply-to\":_vm.status.id,\"attentions\":_vm.status.attentions,\"replied-user\":_vm.status.user,\"copy-message-scope\":_vm.status.visibility,\"subject\":_vm.replySubject},on:{\"posted\":_vm.toggleReplying}})],1):_vm._e()]],2):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import StillImage from '../still-image/still-image.vue'\n\nconst UserAvatar = {\n props: [\n 'user',\n 'betterShadow',\n 'compact'\n ],\n data () {\n return {\n showPlaceholder: false\n }\n },\n components: {\n StillImage\n },\n computed: {\n imgSrc () {\n return this.showPlaceholder ? '/images/avi.png' : this.user.profile_image_url_original\n }\n },\n methods: {\n imageLoadError () {\n this.showPlaceholder = true\n }\n },\n watch: {\n src () {\n this.showPlaceholder = false\n }\n }\n}\n\nexport default UserAvatar\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./user_avatar.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./user_avatar.js\"\nimport __vue_script__ from \"!!babel-loader!./user_avatar.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-056a5e34\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./user_avatar.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('StillImage',{staticClass:\"avatar\",class:{ 'avatar-compact': _vm.compact, 'better-shadow': _vm.betterShadow },attrs:{\"alt\":_vm.user.screen_name,\"title\":_vm.user.screen_name,\"src\":_vm.imgSrc,\"image-load-error\":_vm.imageLoadError}})}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","export const SECOND = 1000\nexport const MINUTE = 60 * SECOND\nexport const HOUR = 60 * MINUTE\nexport const DAY = 24 * HOUR\nexport const WEEK = 7 * DAY\nexport const MONTH = 30 * DAY\nexport const YEAR = 365.25 * DAY\n\nexport const relativeTime = (date, nowThreshold = 1) => {\n if (typeof date === 'string') date = Date.parse(date)\n const round = Date.now() > date ? Math.floor : Math.ceil\n const d = Math.abs(Date.now() - date)\n let r = { num: round(d / YEAR), key: 'time.years' }\n if (d < nowThreshold * SECOND) {\n r.num = 0\n r.key = 'time.now'\n } else if (d < MINUTE) {\n r.num = round(d / SECOND)\n r.key = 'time.seconds'\n } else if (d < HOUR) {\n r.num = round(d / MINUTE)\n r.key = 'time.minutes'\n } else if (d < DAY) {\n r.num = round(d / HOUR)\n r.key = 'time.hours'\n } else if (d < WEEK) {\n r.num = round(d / DAY)\n r.key = 'time.days'\n } else if (d < MONTH) {\n r.num = round(d / WEEK)\n r.key = 'time.weeks'\n } else if (d < YEAR) {\n r.num = round(d / MONTH)\n r.key = 'time.months'\n }\n // Remove plural form when singular\n if (r.num === 1) r.key = r.key.slice(0, -1)\n return r\n}\n\nexport const relativeTimeShort = (date, nowThreshold = 1) => {\n const r = relativeTime(date, nowThreshold)\n r.key += '_short'\n return r\n}\n","import { hex2rgb } from '../color_convert/color_convert.js'\nconst highlightStyle = (prefs) => {\n if (prefs === undefined) return\n const { color, type } = prefs\n if (typeof color !== 'string') return\n const rgb = hex2rgb(color)\n if (rgb == null) return\n const solidColor = `rgb(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)})`\n const tintColor = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .1)`\n const tintColor2 = `rgba(${Math.floor(rgb.r)}, ${Math.floor(rgb.g)}, ${Math.floor(rgb.b)}, .2)`\n if (type === 'striped') {\n return {\n backgroundImage: [\n 'repeating-linear-gradient(135deg,',\n `${tintColor} ,`,\n `${tintColor} 20px,`,\n `${tintColor2} 20px,`,\n `${tintColor2} 40px`\n ].join(' '),\n backgroundPosition: '0 0'\n }\n } else if (type === 'solid') {\n return {\n backgroundColor: tintColor2\n }\n } else if (type === 'side') {\n return {\n backgroundImage: [\n 'linear-gradient(to right,',\n `${solidColor} ,`,\n `${solidColor} 2px,`,\n `transparent 6px`\n ].join(' '),\n backgroundPosition: '0 0'\n }\n }\n}\n\nconst highlightClass = (user) => {\n return 'USER____' + user.screen_name\n .replace(/\\./g, '_')\n .replace(/@/g, '_AT_')\n}\n\nexport {\n highlightClass,\n highlightStyle\n}\n","import Vue from 'vue'\n\nimport './tab_switcher.scss'\n\nexport default Vue.component('tab-switcher', {\n name: 'TabSwitcher',\n props: {\n renderOnlyFocused: {\n required: false,\n type: Boolean,\n default: false\n },\n onSwitch: {\n required: false,\n type: Function,\n default: undefined\n },\n activeTab: {\n required: false,\n type: String,\n default: undefined\n },\n scrollableTabs: {\n required: false,\n type: Boolean,\n default: false\n }\n },\n data () {\n return {\n active: this.$slots.default.findIndex(_ => _.tag)\n }\n },\n computed: {\n activeIndex () {\n // In case of controlled component\n if (this.activeTab) {\n return this.$slots.default.findIndex(slot => this.activeTab === slot.key)\n } else {\n return this.active\n }\n }\n },\n beforeUpdate () {\n const currentSlot = this.$slots.default[this.active]\n if (!currentSlot.tag) {\n this.active = this.$slots.default.findIndex(_ => _.tag)\n }\n },\n methods: {\n activateTab (index) {\n return (e) => {\n e.preventDefault()\n if (typeof this.onSwitch === 'function') {\n this.onSwitch.call(null, this.$slots.default[index].key)\n }\n this.active = index\n }\n }\n },\n render (h) {\n const tabs = this.$slots.default\n .map((slot, index) => {\n if (!slot.tag) return\n const classesTab = ['tab']\n const classesWrapper = ['tab-wrapper']\n\n if (this.activeIndex === index) {\n classesTab.push('active')\n classesWrapper.push('active')\n }\n if (slot.data.attrs.image) {\n return (\n

\n \n \n {slot.data.attrs.label ? '' : slot.data.attrs.label}\n \n
\n )\n }\n return (\n
\n \n {slot.data.attrs.label}\n
\n )\n })\n\n const contents = this.$slots.default.map((slot, index) => {\n if (!slot.tag) return\n const active = this.activeIndex === index\n if (this.renderOnlyFocused) {\n return active\n ?
{slot}
\n :
\n }\n return
{slot}
\n })\n\n return (\n
\n
\n {tabs}\n
\n
\n {contents}\n
\n
\n )\n }\n})\n","/* eslint-env browser */\nimport statusPosterService from '../../services/status_poster/status_poster.service.js'\nimport fileSizeFormatService from '../../services/file_size_format/file_size_format.js'\n\nconst mediaUpload = {\n data () {\n return {\n uploading: false,\n uploadReady: true\n }\n },\n methods: {\n uploadFile (file) {\n const self = this\n const store = this.$store\n if (file.size > store.state.instance.uploadlimit) {\n const filesize = fileSizeFormatService.fileSizeFormat(file.size)\n const allowedsize = fileSizeFormatService.fileSizeFormat(store.state.instance.uploadlimit)\n self.$emit('upload-failed', 'file_too_big', { filesize: filesize.num, filesizeunit: filesize.unit, allowedsize: allowedsize.num, allowedsizeunit: allowedsize.unit })\n return\n }\n const formData = new FormData()\n formData.append('file', file)\n\n self.$emit('uploading')\n self.uploading = true\n\n statusPosterService.uploadMedia({ store, formData })\n .then((fileData) => {\n self.$emit('uploaded', fileData)\n self.uploading = false\n }, (error) => { // eslint-disable-line handle-callback-err\n self.$emit('upload-failed', 'default')\n self.uploading = false\n })\n },\n fileDrop (e) {\n if (e.dataTransfer.files.length > 0) {\n e.preventDefault() // allow dropping text like before\n this.uploadFile(e.dataTransfer.files[0])\n }\n },\n fileDrag (e) {\n let types = e.dataTransfer.types\n if (types.contains('Files')) {\n e.dataTransfer.dropEffect = 'copy'\n } else {\n e.dataTransfer.dropEffect = 'none'\n }\n },\n clearFile () {\n this.uploadReady = false\n this.$nextTick(() => {\n this.uploadReady = true\n })\n },\n change ({ target }) {\n for (var i = 0; i < target.files.length; i++) {\n let file = target.files[i]\n this.uploadFile(file)\n }\n }\n },\n props: [\n 'dropFiles'\n ],\n watch: {\n 'dropFiles': function (fileInfos) {\n if (!this.uploading) {\n this.uploadFile(fileInfos[0])\n }\n }\n }\n}\n\nexport default mediaUpload\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./media_upload.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./media_upload.js\"\nimport __vue_script__ from \"!!babel-loader!./media_upload.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-74382032\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./media_upload.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"media-upload\",on:{\"drop\":[function($event){$event.preventDefault();},_vm.fileDrop],\"dragover\":function($event){$event.preventDefault();return _vm.fileDrag($event)}}},[_c('label',{staticClass:\"label\",attrs:{\"title\":_vm.$t('tool_tip.media_upload')}},[(_vm.uploading)?_c('i',{staticClass:\"progress-icon icon-spin4 animate-spin\"}):_vm._e(),_vm._v(\" \"),(!_vm.uploading)?_c('i',{staticClass:\"new-icon icon-upload\"}):_vm._e(),_vm._v(\" \"),(_vm.uploadReady)?_c('input',{staticStyle:{\"position\":\"fixed\",\"top\":\"-100em\"},attrs:{\"type\":\"file\",\"multiple\":\"true\"},on:{\"change\":_vm.change}}):_vm._e()])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import * as DateUtils from 'src/services/date_utils/date_utils.js'\nimport { uniq } from 'lodash'\n\nexport default {\n name: 'PollForm',\n props: ['visible'],\n data: () => ({\n pollType: 'single',\n options: ['', ''],\n expiryAmount: 10,\n expiryUnit: 'minutes'\n }),\n computed: {\n pollLimits () {\n return this.$store.state.instance.pollLimits\n },\n maxOptions () {\n return this.pollLimits.max_options\n },\n maxLength () {\n return this.pollLimits.max_option_chars\n },\n expiryUnits () {\n const allUnits = ['minutes', 'hours', 'days']\n const expiry = this.convertExpiryFromUnit\n return allUnits.filter(\n unit => this.pollLimits.max_expiration >= expiry(unit, 1)\n )\n },\n minExpirationInCurrentUnit () {\n return Math.ceil(\n this.convertExpiryToUnit(\n this.expiryUnit,\n this.pollLimits.min_expiration\n )\n )\n },\n maxExpirationInCurrentUnit () {\n return Math.floor(\n this.convertExpiryToUnit(\n this.expiryUnit,\n this.pollLimits.max_expiration\n )\n )\n }\n },\n methods: {\n clear () {\n this.pollType = 'single'\n this.options = ['', '']\n this.expiryAmount = 10\n this.expiryUnit = 'minutes'\n },\n nextOption (index) {\n const element = this.$el.querySelector(`#poll-${index + 1}`)\n if (element) {\n element.focus()\n } else {\n // Try adding an option and try focusing on it\n const addedOption = this.addOption()\n if (addedOption) {\n this.$nextTick(function () {\n this.nextOption(index)\n })\n }\n }\n },\n addOption () {\n if (this.options.length < this.maxOptions) {\n this.options.push('')\n return true\n }\n return false\n },\n deleteOption (index, event) {\n if (this.options.length > 2) {\n this.options.splice(index, 1)\n }\n },\n convertExpiryToUnit (unit, amount) {\n // Note: we want seconds and not milliseconds\n switch (unit) {\n case 'minutes': return (1000 * amount) / DateUtils.MINUTE\n case 'hours': return (1000 * amount) / DateUtils.HOUR\n case 'days': return (1000 * amount) / DateUtils.DAY\n }\n },\n convertExpiryFromUnit (unit, amount) {\n // Note: we want seconds and not milliseconds\n switch (unit) {\n case 'minutes': return 0.001 * amount * DateUtils.MINUTE\n case 'hours': return 0.001 * amount * DateUtils.HOUR\n case 'days': return 0.001 * amount * DateUtils.DAY\n }\n },\n expiryAmountChange () {\n this.expiryAmount =\n Math.max(this.minExpirationInCurrentUnit, this.expiryAmount)\n this.expiryAmount =\n Math.min(this.maxExpirationInCurrentUnit, this.expiryAmount)\n this.updatePollToParent()\n },\n updatePollToParent () {\n const expiresIn = this.convertExpiryFromUnit(\n this.expiryUnit,\n this.expiryAmount\n )\n\n const options = uniq(this.options.filter(option => option !== ''))\n if (options.length < 2) {\n this.$emit('update-poll', { error: this.$t('polls.not_enough_options') })\n return\n }\n this.$emit('update-poll', {\n options,\n multiple: this.pollType === 'multiple',\n expiresIn\n })\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./poll_form.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./poll_form.js\"\nimport __vue_script__ from \"!!babel-loader!./poll_form.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1f896331\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./poll_form.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.visible)?_c('div',{staticClass:\"poll-form\"},[_vm._l((_vm.options),function(option,index){return _c('div',{key:index,staticClass:\"poll-option\"},[_c('div',{staticClass:\"input-container\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.options[index]),expression:\"options[index]\"}],staticClass:\"poll-option-input\",attrs:{\"id\":(\"poll-\" + index),\"type\":\"text\",\"placeholder\":_vm.$t('polls.option'),\"maxlength\":_vm.maxLength},domProps:{\"value\":(_vm.options[index])},on:{\"change\":_vm.updatePollToParent,\"keydown\":function($event){if(!('button' in $event)&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.stopPropagation();$event.preventDefault();_vm.nextOption(index)},\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.options, index, $event.target.value)}}})]),_vm._v(\" \"),(_vm.options.length > 2)?_c('div',{staticClass:\"icon-container\"},[_c('i',{staticClass:\"icon-cancel\",on:{\"click\":function($event){_vm.deleteOption(index)}}})]):_vm._e()])}),_vm._v(\" \"),(_vm.options.length < _vm.maxOptions)?_c('a',{staticClass:\"add-option faint\",on:{\"click\":_vm.addOption}},[_c('i',{staticClass:\"icon-plus\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t(\"polls.add_option\"))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"poll-type-expiry\"},[_c('div',{staticClass:\"poll-type\",attrs:{\"title\":_vm.$t('polls.type')}},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"poll-type-selector\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.pollType),expression:\"pollType\"}],staticClass:\"select\",on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.pollType=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.updatePollToParent]}},[_c('option',{attrs:{\"value\":\"single\"}},[_vm._v(_vm._s(_vm.$t('polls.single_choice')))]),_vm._v(\" \"),_c('option',{attrs:{\"value\":\"multiple\"}},[_vm._v(_vm._s(_vm.$t('polls.multiple_choices')))])]),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"poll-expiry\",attrs:{\"title\":_vm.$t('polls.expiry')}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.expiryAmount),expression:\"expiryAmount\"}],staticClass:\"expiry-amount hide-number-spinner\",attrs:{\"type\":\"number\",\"min\":_vm.minExpirationInCurrentUnit,\"max\":_vm.maxExpirationInCurrentUnit},domProps:{\"value\":(_vm.expiryAmount)},on:{\"change\":_vm.expiryAmountChange,\"input\":function($event){if($event.target.composing){ return; }_vm.expiryAmount=$event.target.value}}}),_vm._v(\" \"),_c('label',{staticClass:\"expiry-unit select\"},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.expiryUnit),expression:\"expiryUnit\"}],on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.expiryUnit=$event.target.multiple ? $$selectedVal : $$selectedVal[0]},_vm.expiryAmountChange]}},_vm._l((_vm.expiryUnits),function(unit){return _c('option',{key:unit,domProps:{\"value\":unit}},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"time.\" + unit + \"_short\"), ['']))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])])])],2):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import statusPoster from '../../services/status_poster/status_poster.service.js'\nimport MediaUpload from '../media_upload/media_upload.vue'\nimport ScopeSelector from '../scope_selector/scope_selector.vue'\nimport EmojiInput from '../emoji_input/emoji_input.vue'\nimport PollForm from '../poll/poll_form.vue'\nimport fileTypeService from '../../services/file_type/file_type.service.js'\nimport { findOffset } from '../../services/offset_finder/offset_finder.service.js'\nimport { reject, map, uniqBy } from 'lodash'\nimport suggestor from '../emoji_input/suggestor.js'\nimport { mapGetters } from 'vuex'\nimport Checkbox from '../checkbox/checkbox.vue'\n\nconst buildMentionsString = ({ user, attentions = [] }, currentUser) => {\n let allAttentions = [...attentions]\n\n allAttentions.unshift(user)\n\n allAttentions = uniqBy(allAttentions, 'id')\n allAttentions = reject(allAttentions, { id: currentUser.id })\n\n let mentions = map(allAttentions, (attention) => {\n return `@${attention.screen_name}`\n })\n\n return mentions.length > 0 ? mentions.join(' ') + ' ' : ''\n}\n\nconst PostStatusForm = {\n props: [\n 'replyTo',\n 'repliedUser',\n 'attentions',\n 'copyMessageScope',\n 'subject'\n ],\n components: {\n MediaUpload,\n EmojiInput,\n PollForm,\n ScopeSelector,\n Checkbox\n },\n mounted () {\n this.resize(this.$refs.textarea)\n const textLength = this.$refs.textarea.value.length\n this.$refs.textarea.setSelectionRange(textLength, textLength)\n\n if (this.replyTo) {\n this.$refs.textarea.focus()\n }\n },\n data () {\n const preset = this.$route.query.message\n let statusText = preset || ''\n\n const { scopeCopy } = this.$store.getters.mergedConfig\n\n if (this.replyTo) {\n const currentUser = this.$store.state.users.currentUser\n statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)\n }\n\n const scope = ((this.copyMessageScope && scopeCopy) || this.copyMessageScope === 'direct')\n ? this.copyMessageScope\n : this.$store.state.users.currentUser.default_scope\n\n const { postContentType: contentType } = this.$store.getters.mergedConfig\n\n return {\n dropFiles: [],\n submitDisabled: false,\n error: null,\n posting: false,\n highlighted: 0,\n newStatus: {\n spoilerText: this.subject || '',\n status: statusText,\n nsfw: false,\n files: [],\n poll: {},\n visibility: scope,\n contentType\n },\n caret: 0,\n pollFormVisible: false\n }\n },\n computed: {\n users () {\n return this.$store.state.users.users\n },\n userDefaultScope () {\n return this.$store.state.users.currentUser.default_scope\n },\n showAllScopes () {\n return !this.mergedConfig.minimalScopesMode\n },\n emojiUserSuggestor () {\n return suggestor({\n emoji: [\n ...this.$store.state.instance.emoji,\n ...this.$store.state.instance.customEmoji\n ],\n users: this.$store.state.users.users,\n updateUsersList: (input) => this.$store.dispatch('searchUsers', input)\n })\n },\n emojiSuggestor () {\n return suggestor({\n emoji: [\n ...this.$store.state.instance.emoji,\n ...this.$store.state.instance.customEmoji\n ]\n })\n },\n emoji () {\n return this.$store.state.instance.emoji || []\n },\n customEmoji () {\n return this.$store.state.instance.customEmoji || []\n },\n statusLength () {\n return this.newStatus.status.length\n },\n spoilerTextLength () {\n return this.newStatus.spoilerText.length\n },\n statusLengthLimit () {\n return this.$store.state.instance.textlimit\n },\n hasStatusLengthLimit () {\n return this.statusLengthLimit > 0\n },\n charactersLeft () {\n return this.statusLengthLimit - (this.statusLength + this.spoilerTextLength)\n },\n isOverLengthLimit () {\n return this.hasStatusLengthLimit && (this.charactersLeft < 0)\n },\n minimalScopesMode () {\n return this.$store.state.instance.minimalScopesMode\n },\n alwaysShowSubject () {\n return this.mergedConfig.alwaysShowSubjectInput\n },\n postFormats () {\n return this.$store.state.instance.postFormats || []\n },\n safeDMEnabled () {\n return this.$store.state.instance.safeDM\n },\n pollsAvailable () {\n return this.$store.state.instance.pollsAvailable &&\n this.$store.state.instance.pollLimits.max_options >= 2\n },\n hideScopeNotice () {\n return this.$store.getters.mergedConfig.hideScopeNotice\n },\n pollContentError () {\n return this.pollFormVisible &&\n this.newStatus.poll &&\n this.newStatus.poll.error\n },\n ...mapGetters(['mergedConfig'])\n },\n methods: {\n postStatus (newStatus) {\n if (this.posting) { return }\n if (this.submitDisabled) { return }\n\n if (this.newStatus.status === '') {\n if (this.newStatus.files.length === 0) {\n this.error = 'Cannot post an empty status with no files'\n return\n }\n }\n\n const poll = this.pollFormVisible ? this.newStatus.poll : {}\n if (this.pollContentError) {\n this.error = this.pollContentError\n return\n }\n\n this.posting = true\n statusPoster.postStatus({\n status: newStatus.status,\n spoilerText: newStatus.spoilerText || null,\n visibility: newStatus.visibility,\n sensitive: newStatus.nsfw,\n media: newStatus.files,\n store: this.$store,\n inReplyToStatusId: this.replyTo,\n contentType: newStatus.contentType,\n poll\n }).then((data) => {\n if (!data.error) {\n this.newStatus = {\n status: '',\n spoilerText: '',\n files: [],\n visibility: newStatus.visibility,\n contentType: newStatus.contentType,\n poll: {}\n }\n this.pollFormVisible = false\n this.$refs.mediaUpload.clearFile()\n this.clearPollForm()\n this.$emit('posted')\n let el = this.$el.querySelector('textarea')\n el.style.height = 'auto'\n el.style.height = undefined\n this.error = null\n } else {\n this.error = data.error\n }\n this.posting = false\n })\n },\n addMediaFile (fileInfo) {\n this.newStatus.files.push(fileInfo)\n this.enableSubmit()\n },\n removeMediaFile (fileInfo) {\n let index = this.newStatus.files.indexOf(fileInfo)\n this.newStatus.files.splice(index, 1)\n },\n uploadFailed (errString, templateArgs) {\n templateArgs = templateArgs || {}\n this.error = this.$t('upload.error.base') + ' ' + this.$t('upload.error.' + errString, templateArgs)\n this.enableSubmit()\n },\n disableSubmit () {\n this.submitDisabled = true\n },\n enableSubmit () {\n this.submitDisabled = false\n },\n type (fileInfo) {\n return fileTypeService.fileType(fileInfo.mimetype)\n },\n paste (e) {\n this.resize(e)\n if (e.clipboardData.files.length > 0) {\n // prevent pasting of file as text\n e.preventDefault()\n // Strangely, files property gets emptied after event propagation\n // Trying to wrap it in array doesn't work. Plus I doubt it's possible\n // to hold more than one file in clipboard.\n this.dropFiles = [e.clipboardData.files[0]]\n }\n },\n fileDrop (e) {\n if (e.dataTransfer.files.length > 0) {\n e.preventDefault() // allow dropping text like before\n this.dropFiles = e.dataTransfer.files\n }\n },\n fileDrag (e) {\n e.dataTransfer.dropEffect = 'copy'\n },\n onEmojiInputInput (e) {\n this.$nextTick(() => {\n this.resize(this.$refs['textarea'])\n })\n },\n resize (e) {\n const target = e.target || e\n if (!(target instanceof window.Element)) { return }\n\n // Reset to default height for empty form, nothing else to do here.\n if (target.value === '') {\n target.style.height = null\n this.$refs['emoji-input'].resize()\n return\n }\n\n const formRef = this.$refs['form']\n const bottomRef = this.$refs['bottom']\n /* Scroller is either `window` (replies in TL), sidebar (main post form,\n * replies in notifs) or mobile post form. Note that getting and setting\n * scroll is different for `Window` and `Element`s\n */\n const bottomBottomPaddingStr = window.getComputedStyle(bottomRef)['padding-bottom']\n const bottomBottomPadding = Number(bottomBottomPaddingStr.substring(0, bottomBottomPaddingStr.length - 2))\n\n const scrollerRef = this.$el.closest('.sidebar-scroller') ||\n this.$el.closest('.post-form-modal-view') ||\n window\n\n // Getting info about padding we have to account for, removing 'px' part\n const topPaddingStr = window.getComputedStyle(target)['padding-top']\n const bottomPaddingStr = window.getComputedStyle(target)['padding-bottom']\n const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2))\n const bottomPadding = Number(bottomPaddingStr.substring(0, bottomPaddingStr.length - 2))\n const vertPadding = topPadding + bottomPadding\n\n /* Explanation:\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight\n * scrollHeight returns element's scrollable content height, i.e. visible\n * element + overscrolled parts of it. We use it to determine when text\n * inside the textarea exceeded its height, so we can set height to prevent\n * overscroll, i.e. make textarea grow with the text. HOWEVER, since we\n * explicitly set new height, scrollHeight won't go below that, so we can't\n * SHRINK the textarea when there's extra space. To workaround that we set\n * height to 'auto' which makes textarea tiny again, so that scrollHeight\n * will match text height again. HOWEVER, shrinking textarea can screw with\n * the scroll since there might be not enough padding around form-bottom to even\n * warrant a scroll, so it will jump to 0 and refuse to move anywhere,\n * so we check current scroll position before shrinking and then restore it\n * with needed delta.\n */\n\n // this part has to be BEFORE the content size update\n const currentScroll = scrollerRef === window\n ? scrollerRef.scrollY\n : scrollerRef.scrollTop\n const scrollerHeight = scrollerRef === window\n ? scrollerRef.innerHeight\n : scrollerRef.offsetHeight\n const scrollerBottomBorder = currentScroll + scrollerHeight\n\n // BEGIN content size update\n target.style.height = 'auto'\n const newHeight = target.scrollHeight - vertPadding\n target.style.height = `${newHeight}px`\n // END content size update\n\n // We check where the bottom border of form-bottom element is, this uses findOffset\n // to find offset relative to scrollable container (scroller)\n const bottomBottomBorder = bottomRef.offsetHeight + findOffset(bottomRef, scrollerRef).top + bottomBottomPadding\n\n const isBottomObstructed = scrollerBottomBorder < bottomBottomBorder\n const isFormBiggerThanScroller = scrollerHeight < formRef.offsetHeight\n const bottomChangeDelta = bottomBottomBorder - scrollerBottomBorder\n // The intention is basically this;\n // Keep form-bottom always visible so that submit button is in view EXCEPT\n // if form element bigger than scroller and caret isn't at the end, so that\n // if you scroll up and edit middle of text you won't get scrolled back to bottom\n const shouldScrollToBottom = isBottomObstructed &&\n !(isFormBiggerThanScroller &&\n this.$refs.textarea.selectionStart !== this.$refs.textarea.value.length)\n const totalDelta = shouldScrollToBottom ? bottomChangeDelta : 0\n const targetScroll = currentScroll + totalDelta\n\n if (scrollerRef === window) {\n scrollerRef.scroll(0, targetScroll)\n } else {\n scrollerRef.scrollTop = targetScroll\n }\n\n this.$refs['emoji-input'].resize()\n },\n showEmojiPicker () {\n this.$refs['textarea'].focus()\n this.$refs['emoji-input'].triggerShowPicker()\n },\n clearError () {\n this.error = null\n },\n changeVis (visibility) {\n this.newStatus.visibility = visibility\n },\n togglePollForm () {\n this.pollFormVisible = !this.pollFormVisible\n },\n setPoll (poll) {\n this.newStatus.poll = poll\n },\n clearPollForm () {\n if (this.$refs.pollForm) {\n this.$refs.pollForm.clear()\n }\n },\n dismissScopeNotice () {\n this.$store.dispatch('setOption', { name: 'hideScopeNotice', value: true })\n }\n }\n}\n\nexport default PostStatusForm\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./post_status_form.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./post_status_form.js\"\nimport __vue_script__ from \"!!babel-loader!./post_status_form.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-c2ba770c\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./post_status_form.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"form\",staticClass:\"post-status-form\"},[_c('form',{attrs:{\"autocomplete\":\"off\"},on:{\"submit\":function($event){$event.preventDefault();_vm.postStatus(_vm.newStatus)}}},[_c('div',{staticClass:\"form-group\"},[(!_vm.$store.state.users.currentUser.locked && _vm.newStatus.visibility == 'private')?_c('i18n',{staticClass:\"visibility-notice\",attrs:{\"path\":\"post_status.account_not_locked_warning\",\"tag\":\"p\"}},[_c('router-link',{attrs:{\"to\":{ name: 'user-settings' }}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.account_not_locked_warning_link'))+\"\\n \")])],1):_vm._e(),_vm._v(\" \"),(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'public')?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.public')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();_vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'unlisted')?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.unlisted')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();_vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(!_vm.hideScopeNotice && _vm.newStatus.visibility === 'private' && _vm.$store.state.users.currentUser.locked)?_c('p',{staticClass:\"visibility-notice notice-dismissible\"},[_c('span',[_vm._v(_vm._s(_vm.$t('post_status.scope_notice.private')))]),_vm._v(\" \"),_c('a',{staticClass:\"button-icon dismiss\",on:{\"click\":function($event){$event.preventDefault();_vm.dismissScopeNotice()}}},[_c('i',{staticClass:\"icon-cancel\"})])]):(_vm.newStatus.visibility === 'direct')?_c('p',{staticClass:\"visibility-notice\"},[(_vm.safeDMEnabled)?_c('span',[_vm._v(_vm._s(_vm.$t('post_status.direct_warning_to_first_only')))]):_c('span',[_vm._v(_vm._s(_vm.$t('post_status.direct_warning_to_all')))])]):_vm._e(),_vm._v(\" \"),(_vm.newStatus.spoilerText || _vm.alwaysShowSubject)?_c('EmojiInput',{staticClass:\"form-control\",attrs:{\"enable-emoji-picker\":\"\",\"suggest\":_vm.emojiSuggestor},model:{value:(_vm.newStatus.spoilerText),callback:function ($$v) {_vm.$set(_vm.newStatus, \"spoilerText\", $$v)},expression:\"newStatus.spoilerText\"}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.spoilerText),expression:\"newStatus.spoilerText\"}],staticClass:\"form-post-subject\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('post_status.content_warning')},domProps:{\"value\":(_vm.newStatus.spoilerText)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.newStatus, \"spoilerText\", $event.target.value)}}})]):_vm._e(),_vm._v(\" \"),_c('EmojiInput',{ref:\"emoji-input\",staticClass:\"form-control main-input\",attrs:{\"suggest\":_vm.emojiUserSuggestor,\"enable-emoji-picker\":\"\",\"hide-emoji-button\":\"\",\"enable-sticker-picker\":\"\"},on:{\"input\":_vm.onEmojiInputInput,\"sticker-uploaded\":_vm.addMediaFile,\"sticker-upload-failed\":_vm.uploadFailed},model:{value:(_vm.newStatus.status),callback:function ($$v) {_vm.$set(_vm.newStatus, \"status\", $$v)},expression:\"newStatus.status\"}},[_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.status),expression:\"newStatus.status\"}],ref:\"textarea\",staticClass:\"form-post-body\",attrs:{\"placeholder\":_vm.$t('post_status.default'),\"rows\":\"1\",\"disabled\":_vm.posting},domProps:{\"value\":(_vm.newStatus.status)},on:{\"keydown\":function($event){if(!('button' in $event)&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }if(!$event.metaKey){ return null; }_vm.postStatus(_vm.newStatus)},\"keyup\":function($event){if(!('button' in $event)&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }if(!$event.ctrlKey){ return null; }_vm.postStatus(_vm.newStatus)},\"drop\":_vm.fileDrop,\"dragover\":function($event){$event.preventDefault();return _vm.fileDrag($event)},\"input\":[function($event){if($event.target.composing){ return; }_vm.$set(_vm.newStatus, \"status\", $event.target.value)},_vm.resize],\"compositionupdate\":_vm.resize,\"paste\":_vm.paste}}),_vm._v(\" \"),(_vm.hasStatusLengthLimit)?_c('p',{staticClass:\"character-counter faint\",class:{ error: _vm.isOverLengthLimit }},[_vm._v(\"\\n \"+_vm._s(_vm.charactersLeft)+\"\\n \")]):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"visibility-tray\"},[_c('scope-selector',{attrs:{\"show-all\":_vm.showAllScopes,\"user-default\":_vm.userDefaultScope,\"original-scope\":_vm.copyMessageScope,\"initial-scope\":_vm.newStatus.visibility,\"on-scope-change\":_vm.changeVis}}),_vm._v(\" \"),(_vm.postFormats.length > 1)?_c('div',{staticClass:\"text-format\"},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"post-content-type\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.newStatus.contentType),expression:\"newStatus.contentType\"}],staticClass:\"form-control\",attrs:{\"id\":\"post-content-type\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.newStatus, \"contentType\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])}}},_vm._l((_vm.postFormats),function(postFormat){return _c('option',{key:postFormat,domProps:{\"value\":postFormat}},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"post_status.content_type[\\\"\" + postFormat + \"\\\"]\")))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]):_vm._e(),_vm._v(\" \"),(_vm.postFormats.length === 1 && _vm.postFormats[0] !== 'text/plain')?_c('div',{staticClass:\"text-format\"},[_c('span',{staticClass:\"only-format\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t((\"post_status.content_type[\\\"\" + (_vm.postFormats[0]) + \"\\\"]\")))+\"\\n \")])]):_vm._e()],1)],1),_vm._v(\" \"),(_vm.pollsAvailable)?_c('poll-form',{ref:\"pollForm\",attrs:{\"visible\":_vm.pollFormVisible},on:{\"update-poll\":_vm.setPoll}}):_vm._e(),_vm._v(\" \"),_c('div',{ref:\"bottom\",staticClass:\"form-bottom\"},[_c('div',{staticClass:\"form-bottom-left\"},[_c('media-upload',{ref:\"mediaUpload\",staticClass:\"media-upload-icon\",attrs:{\"drop-files\":_vm.dropFiles},on:{\"uploading\":_vm.disableSubmit,\"uploaded\":_vm.addMediaFile,\"upload-failed\":_vm.uploadFailed}}),_vm._v(\" \"),_c('div',{staticClass:\"emoji-icon\"},[_c('i',{staticClass:\"icon-smile btn btn-default\",attrs:{\"title\":_vm.$t('emoji.add_emoji')},on:{\"click\":_vm.showEmojiPicker}})]),_vm._v(\" \"),(_vm.pollsAvailable)?_c('div',{staticClass:\"poll-icon\",class:{ selected: _vm.pollFormVisible }},[_c('i',{staticClass:\"icon-chart-bar btn btn-default\",attrs:{\"title\":_vm.$t('polls.add_poll')},on:{\"click\":_vm.togglePollForm}})]):_vm._e()],1),_vm._v(\" \"),(_vm.posting)?_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.posting'))+\"\\n \")]):(_vm.isOverLengthLimit)?_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.submit'))+\"\\n \")]):_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":_vm.submitDisabled,\"type\":\"submit\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.submit'))+\"\\n \")])]),_vm._v(\" \"),(_vm.error)?_c('div',{staticClass:\"alert error\"},[_vm._v(\"\\n Error: \"+_vm._s(_vm.error)+\"\\n \"),_c('i',{staticClass:\"button-icon icon-cancel\",on:{\"click\":_vm.clearError}})]):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"attachments\"},_vm._l((_vm.newStatus.files),function(file){return _c('div',{key:file.url,staticClass:\"media-upload-wrapper\"},[_c('i',{staticClass:\"fa button-icon icon-cancel\",on:{\"click\":function($event){_vm.removeMediaFile(file)}}}),_vm._v(\" \"),_c('div',{staticClass:\"media-upload-container attachment\"},[(_vm.type(file) === 'image')?_c('img',{staticClass:\"thumbnail media-upload\",attrs:{\"src\":file.url}}):_vm._e(),_vm._v(\" \"),(_vm.type(file) === 'video')?_c('video',{attrs:{\"src\":file.url,\"controls\":\"\"}}):_vm._e(),_vm._v(\" \"),(_vm.type(file) === 'audio')?_c('audio',{attrs:{\"src\":file.url,\"controls\":\"\"}}):_vm._e(),_vm._v(\" \"),(_vm.type(file) === 'unknown')?_c('a',{attrs:{\"href\":file.url}},[_vm._v(_vm._s(file.url))]):_vm._e()])])}),0),_vm._v(\" \"),(_vm.newStatus.files.length > 0)?_c('div',{staticClass:\"upload_settings\"},[_c('Checkbox',{model:{value:(_vm.newStatus.nsfw),callback:function ($$v) {_vm.$set(_vm.newStatus, \"nsfw\", $$v)},expression:\"newStatus.nsfw\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('post_status.attachments_sensitive'))+\"\\n \")])],1):_vm._e()],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./progress_button.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./progress_button.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-9f751ae6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./progress_button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{attrs:{\"disabled\":_vm.progress || _vm.disabled},on:{\"click\":_vm.onClick}},[(_vm.progress && _vm.$slots.progress)?[_vm._t(\"progress\")]:[_vm._t(\"default\")]],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const StillImage = {\n props: [\n 'src',\n 'referrerpolicy',\n 'mimetype',\n 'imageLoadError',\n 'imageLoadHandler'\n ],\n data () {\n return {\n stopGifs: this.$store.getters.mergedConfig.stopGifs\n }\n },\n computed: {\n animated () {\n return this.stopGifs && (this.mimetype === 'image/gif' || this.src.endsWith('.gif'))\n }\n },\n methods: {\n onLoad () {\n this.imageLoadHandler && this.imageLoadHandler(this.$refs.src)\n const canvas = this.$refs.canvas\n if (!canvas) return\n const width = this.$refs.src.naturalWidth\n const height = this.$refs.src.naturalHeight\n canvas.width = width\n canvas.height = height\n canvas.getContext('2d').drawImage(this.$refs.src, 0, 0, width, height)\n },\n onError () {\n this.imageLoadError && this.imageLoadError()\n }\n }\n}\n\nexport default StillImage\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./still-image.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./still-image.js\"\nimport __vue_script__ from \"!!babel-loader!./still-image.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1bc509fc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./still-image.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"still-image\",class:{ animated: _vm.animated }},[(_vm.animated)?_c('canvas',{ref:\"canvas\"}):_vm._e(),_vm._v(\" \"),_c('img',{key:_vm.src,ref:\"src\",attrs:{\"src\":_vm.src,\"referrerpolicy\":_vm.referrerpolicy},on:{\"load\":_vm.onLoad,\"error\":_vm.onError}})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./timeago.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./timeago.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ac499830\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./timeago.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('time',{attrs:{\"datetime\":_vm.time,\"title\":_vm.localeDateString}},[_vm._v(\"\\n \"+_vm._s(_vm.$t(_vm.relativeTime.key, [_vm.relativeTime.num]))+\"\\n\")])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","const fileSizeFormat = (num) => {\n var exponent\n var unit\n var units = ['B', 'KiB', 'MiB', 'GiB', 'TiB']\n if (num < 1) {\n return num + ' ' + units[0]\n }\n\n exponent = Math.min(Math.floor(Math.log(num) / Math.log(1024)), units.length - 1)\n num = (num / Math.pow(1024, exponent)).toFixed(2) * 1\n unit = units[exponent]\n return { num: num, unit: unit }\n}\nconst fileSizeFormatService = {\n fileSizeFormat\n}\nexport default fileSizeFormatService\n","import { debounce } from 'lodash'\n/**\n * suggest - generates a suggestor function to be used by emoji-input\n * data: object providing source information for specific types of suggestions:\n * data.emoji - optional, an array of all emoji available i.e.\n * (state.instance.emoji + state.instance.customEmoji)\n * data.users - optional, an array of all known users\n * updateUsersList - optional, a function to search and append to users\n *\n * Depending on data present one or both (or none) can be present, so if field\n * doesn't support user linking you can just provide only emoji.\n */\n\nconst debounceUserSearch = debounce((data, input) => {\n data.updateUsersList(input)\n}, 500, { leading: true, trailing: false })\n\nexport default data => input => {\n const firstChar = input[0]\n if (firstChar === ':' && data.emoji) {\n return suggestEmoji(data.emoji)(input)\n }\n if (firstChar === '@' && data.users) {\n return suggestUsers(data)(input)\n }\n return []\n}\n\nexport const suggestEmoji = emojis => input => {\n const noPrefix = input.toLowerCase().substr(1)\n return emojis\n .filter(({ displayText }) => displayText.toLowerCase().startsWith(noPrefix))\n .sort((a, b) => {\n let aScore = 0\n let bScore = 0\n\n // Make custom emojis a priority\n aScore += a.imageUrl ? 10 : 0\n bScore += b.imageUrl ? 10 : 0\n\n // Sort alphabetically\n const alphabetically = a.displayText > b.displayText ? 1 : -1\n\n return bScore - aScore + alphabetically\n })\n}\n\nexport const suggestUsers = data => input => {\n const noPrefix = input.toLowerCase().substr(1)\n const users = data.users\n\n const newUsers = users.filter(\n user =>\n user.screen_name.toLowerCase().startsWith(noPrefix) ||\n user.name.toLowerCase().startsWith(noPrefix)\n\n /* taking only 20 results so that sorting is a bit cheaper, we display\n * only 5 anyway. could be inaccurate, but we ideally we should query\n * backend anyway\n */\n ).slice(0, 20).sort((a, b) => {\n let aScore = 0\n let bScore = 0\n\n // Matches on screen name (i.e. user@instance) makes a priority\n aScore += a.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0\n bScore += b.screen_name.toLowerCase().startsWith(noPrefix) ? 2 : 0\n\n // Matches on name takes second priority\n aScore += a.name.toLowerCase().startsWith(noPrefix) ? 1 : 0\n bScore += b.name.toLowerCase().startsWith(noPrefix) ? 1 : 0\n\n const diff = (bScore - aScore) * 10\n\n // Then sort alphabetically\n const nameAlphabetically = a.name > b.name ? 1 : -1\n const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1\n\n return diff + nameAlphabetically + screenNameAlphabetically\n /* eslint-disable camelcase */\n }).map(({ screen_name, name, profile_image_url_original }) => ({\n displayText: screen_name,\n detailText: name,\n imageUrl: profile_image_url_original,\n replacement: '@' + screen_name + ' '\n }))\n\n // BE search users if there are no matches\n if (newUsers.length === 0 && data.updateUsersList) {\n debounceUserSearch(data, noPrefix)\n }\n return newUsers\n /* eslint-enable camelcase */\n}\n","import { map } from 'lodash'\nimport apiService from '../api/api.service.js'\n\nconst postStatus = ({ store, status, spoilerText, visibility, sensitive, poll, media = [], inReplyToStatusId = undefined, contentType = 'text/plain' }) => {\n const mediaIds = map(media, 'id')\n\n return apiService.postStatus({\n credentials: store.state.users.currentUser.credentials,\n status,\n spoilerText,\n visibility,\n sensitive,\n mediaIds,\n inReplyToStatusId,\n contentType,\n poll })\n .then((data) => {\n if (!data.error) {\n store.dispatch('addNewStatuses', {\n statuses: [data],\n timeline: 'friends',\n showImmediately: true,\n noIdUpdate: true // To prevent missing notices on next pull.\n })\n }\n return data\n })\n .catch((err) => {\n return {\n error: err.message\n }\n })\n}\n\nconst uploadMedia = ({ store, formData }) => {\n const credentials = store.state.users.currentUser.credentials\n\n return apiService.uploadMedia({ credentials, formData })\n}\n\nconst statusPosterService = {\n postStatus,\n uploadMedia\n}\n\nexport default statusPosterService\n","export const findOffset = (child, parent, { top = 0, left = 0 } = {}, ignorePadding = true) => {\n const result = {\n top: top + child.offsetTop,\n left: left + child.offsetLeft\n }\n if (!ignorePadding && child !== window) {\n const { topPadding, leftPadding } = findPadding(child)\n result.top += ignorePadding ? 0 : topPadding\n result.left += ignorePadding ? 0 : leftPadding\n }\n\n if (child.offsetParent && (parent === window || parent.contains(child.offsetParent) || parent === child.offsetParent)) {\n return findOffset(child.offsetParent, parent, result, false)\n } else {\n if (parent !== window) {\n const { topPadding, leftPadding } = findPadding(parent)\n result.top += topPadding\n result.left += leftPadding\n }\n return result\n }\n}\n\nconst findPadding = (el) => {\n const topPaddingStr = window.getComputedStyle(el)['padding-top']\n const topPadding = Number(topPaddingStr.substring(0, topPaddingStr.length - 2))\n const leftPaddingStr = window.getComputedStyle(el)['padding-left']\n const leftPadding = Number(leftPaddingStr.substring(0, leftPaddingStr.length - 2))\n\n return { topPadding, leftPadding }\n}\n","import { reduce, find } from 'lodash'\n\nexport const replaceWord = (str, toReplace, replacement) => {\n return str.slice(0, toReplace.start) + replacement + str.slice(toReplace.end)\n}\n\nexport const wordAtPosition = (str, pos) => {\n const words = splitIntoWords(str)\n const wordsWithPosition = addPositionToWords(words)\n\n return find(wordsWithPosition, ({ start, end }) => start <= pos && end > pos)\n}\n\nexport const addPositionToWords = (words) => {\n return reduce(words, (result, word) => {\n const data = {\n word,\n start: 0,\n end: word.length\n }\n\n if (result.length > 0) {\n const previous = result.pop()\n\n data.start += previous.end\n data.end += previous.end\n\n result.push(previous)\n }\n\n result.push(data)\n\n return result\n }, [])\n}\n\nexport const splitIntoWords = (str) => {\n // Split at word boundaries\n const regex = /\\b/\n const triggers = /[@#:]+$/\n\n let split = str.split(regex)\n\n // Add trailing @ and # to the following word.\n const words = reduce(split, (result, word) => {\n if (result.length > 0) {\n let previous = result.pop()\n const matches = previous.match(triggers)\n if (matches) {\n previous = previous.replace(triggers, '')\n word = matches[0] + word\n }\n result.push(previous)\n }\n result.push(word)\n\n return result\n }, [])\n\n return words\n}\n\nconst completion = {\n wordAtPosition,\n addPositionToWords,\n splitIntoWords,\n replaceWord\n}\n\nexport default completion\n","import Checkbox from '../checkbox/checkbox.vue'\n\n// At widest, approximately 20 emoji are visible in a row,\n// loading 3 rows, could be overkill for narrow picker\nconst LOAD_EMOJI_BY = 60\n\n// When to start loading new batch emoji, in pixels\nconst LOAD_EMOJI_MARGIN = 64\n\nconst filterByKeyword = (list, keyword = '') => {\n return list.filter(x => x.displayText.includes(keyword))\n}\n\nconst EmojiPicker = {\n props: {\n enableStickerPicker: {\n required: false,\n type: Boolean,\n default: false\n }\n },\n data () {\n return {\n keyword: '',\n activeGroup: 'custom',\n showingStickers: false,\n groupsScrolledClass: 'scrolled-top',\n keepOpen: false,\n customEmojiBufferSlice: LOAD_EMOJI_BY,\n customEmojiTimeout: null,\n customEmojiLoadAllConfirmed: false\n }\n },\n components: {\n StickerPicker: () => import('../sticker_picker/sticker_picker.vue'),\n Checkbox\n },\n methods: {\n onStickerUploaded (e) {\n this.$emit('sticker-uploaded', e)\n },\n onStickerUploadFailed (e) {\n this.$emit('sticker-upload-failed', e)\n },\n onEmoji (emoji) {\n const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement\n this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen })\n },\n onScroll (e) {\n const target = (e && e.target) || this.$refs['emoji-groups']\n this.updateScrolledClass(target)\n this.scrolledGroup(target)\n this.triggerLoadMore(target)\n },\n highlight (key) {\n const ref = this.$refs['group-' + key]\n const top = ref[0].offsetTop\n this.setShowStickers(false)\n this.activeGroup = key\n this.$nextTick(() => {\n this.$refs['emoji-groups'].scrollTop = top + 1\n })\n },\n updateScrolledClass (target) {\n if (target.scrollTop <= 5) {\n this.groupsScrolledClass = 'scrolled-top'\n } else if (target.scrollTop >= target.scrollTopMax - 5) {\n this.groupsScrolledClass = 'scrolled-bottom'\n } else {\n this.groupsScrolledClass = 'scrolled-middle'\n }\n },\n triggerLoadMore (target) {\n const ref = this.$refs['group-end-custom'][0]\n if (!ref) return\n const bottom = ref.offsetTop + ref.offsetHeight\n\n const scrollerBottom = target.scrollTop + target.clientHeight\n const scrollerTop = target.scrollTop\n const scrollerMax = target.scrollHeight\n\n // Loads more emoji when they come into view\n const approachingBottom = bottom - scrollerBottom < LOAD_EMOJI_MARGIN\n // Always load when at the very top in case there's no scroll space yet\n const atTop = scrollerTop < 5\n // Don't load when looking at unicode category or at the very bottom\n const bottomAboveViewport = bottom < scrollerTop || scrollerBottom === scrollerMax\n if (!bottomAboveViewport && (approachingBottom || atTop)) {\n this.loadEmoji()\n }\n },\n scrolledGroup (target) {\n const top = target.scrollTop + 5\n this.$nextTick(() => {\n this.emojisView.forEach(group => {\n const ref = this.$refs['group-' + group.id]\n if (ref[0].offsetTop <= top) {\n this.activeGroup = group.id\n }\n })\n })\n },\n loadEmoji () {\n const allLoaded = this.customEmojiBuffer.length === this.filteredEmoji.length\n\n if (allLoaded) {\n return\n }\n\n this.customEmojiBufferSlice += LOAD_EMOJI_BY\n },\n startEmojiLoad (forceUpdate = false) {\n if (!forceUpdate) {\n this.keyword = ''\n }\n this.$nextTick(() => {\n this.$refs['emoji-groups'].scrollTop = 0\n })\n const bufferSize = this.customEmojiBuffer.length\n const bufferPrefilledAll = bufferSize === this.filteredEmoji.length\n if (bufferPrefilledAll && !forceUpdate) {\n return\n }\n this.customEmojiBufferSlice = LOAD_EMOJI_BY\n },\n toggleStickers () {\n this.showingStickers = !this.showingStickers\n },\n setShowStickers (value) {\n this.showingStickers = value\n }\n },\n watch: {\n keyword () {\n this.customEmojiLoadAllConfirmed = false\n this.onScroll()\n this.startEmojiLoad(true)\n }\n },\n computed: {\n activeGroupView () {\n return this.showingStickers ? '' : this.activeGroup\n },\n stickersAvailable () {\n if (this.$store.state.instance.stickers) {\n return this.$store.state.instance.stickers.length > 0\n }\n return 0\n },\n filteredEmoji () {\n return filterByKeyword(\n this.$store.state.instance.customEmoji || [],\n this.keyword\n )\n },\n customEmojiBuffer () {\n return this.filteredEmoji.slice(0, this.customEmojiBufferSlice)\n },\n emojis () {\n const standardEmojis = this.$store.state.instance.emoji || []\n const customEmojis = this.customEmojiBuffer\n\n return [\n {\n id: 'custom',\n text: this.$t('emoji.custom'),\n icon: 'icon-smile',\n emojis: customEmojis\n },\n {\n id: 'standard',\n text: this.$t('emoji.unicode'),\n icon: 'icon-picture',\n emojis: filterByKeyword(standardEmojis, this.keyword)\n }\n ]\n },\n emojisView () {\n return this.emojis.filter(value => value.emojis.length > 0)\n },\n stickerPickerEnabled () {\n return (this.$store.state.instance.stickers || []).length !== 0\n }\n }\n}\n\nexport default EmojiPicker\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./emoji_picker.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./emoji_picker.js\"\nimport __vue_script__ from \"!!babel-loader!./emoji_picker.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-47d21b3b\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./emoji_picker.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"emoji-picker panel panel-default panel-body\"},[_c('div',{staticClass:\"heading\"},[_c('span',{staticClass:\"emoji-tabs\"},_vm._l((_vm.emojis),function(group){return _c('span',{key:group.id,staticClass:\"emoji-tabs-item\",class:{\n active: _vm.activeGroupView === group.id,\n disabled: group.emojis.length === 0\n },attrs:{\"title\":group.text},on:{\"click\":function($event){$event.preventDefault();_vm.highlight(group.id)}}},[_c('i',{class:group.icon})])}),0),_vm._v(\" \"),(_vm.stickerPickerEnabled)?_c('span',{staticClass:\"additional-tabs\"},[_c('span',{staticClass:\"stickers-tab-icon additional-tabs-item\",class:{active: _vm.showingStickers},attrs:{\"title\":_vm.$t('emoji.stickers')},on:{\"click\":function($event){$event.preventDefault();return _vm.toggleStickers($event)}}},[_c('i',{staticClass:\"icon-star\"})])]):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('div',{staticClass:\"emoji-content\",class:{hidden: _vm.showingStickers}},[_c('div',{staticClass:\"emoji-search\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.keyword),expression:\"keyword\"}],staticClass:\"form-control\",attrs:{\"type\":\"text\",\"placeholder\":_vm.$t('emoji.search_emoji')},domProps:{\"value\":(_vm.keyword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.keyword=$event.target.value}}})]),_vm._v(\" \"),_c('div',{ref:\"emoji-groups\",staticClass:\"emoji-groups\",class:_vm.groupsScrolledClass,on:{\"scroll\":_vm.onScroll}},_vm._l((_vm.emojisView),function(group){return _c('div',{key:group.id,staticClass:\"emoji-group\"},[_c('h6',{ref:'group-' + group.id,refInFor:true,staticClass:\"emoji-group-title\"},[_vm._v(\"\\n \"+_vm._s(group.text)+\"\\n \")]),_vm._v(\" \"),_vm._l((group.emojis),function(emoji){return _c('span',{key:group.id + emoji.displayText,staticClass:\"emoji-item\",attrs:{\"title\":emoji.displayText},on:{\"click\":function($event){$event.stopPropagation();$event.preventDefault();_vm.onEmoji(emoji)}}},[(!emoji.imageUrl)?_c('span',[_vm._v(_vm._s(emoji.replacement))]):_c('img',{attrs:{\"src\":emoji.imageUrl}})])}),_vm._v(\" \"),_c('span',{ref:'group-end-' + group.id,refInFor:true})],2)}),0),_vm._v(\" \"),_c('div',{staticClass:\"keep-open\"},[_c('Checkbox',{model:{value:(_vm.keepOpen),callback:function ($$v) {_vm.keepOpen=$$v},expression:\"keepOpen\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.keep_open'))+\"\\n \")])],1)]),_vm._v(\" \"),(_vm.showingStickers)?_c('div',{staticClass:\"stickers-content\"},[_c('sticker-picker',{on:{\"uploaded\":_vm.onStickerUploaded,\"upload-failed\":_vm.onStickerUploadFailed}})],1):_vm._e()])])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import Completion from '../../services/completion/completion.js'\nimport EmojiPicker from '../emoji_picker/emoji_picker.vue'\nimport { take } from 'lodash'\nimport { findOffset } from '../../services/offset_finder/offset_finder.service.js'\n\n/**\n * EmojiInput - augmented inputs for emoji and autocomplete support in inputs\n * without having to give up the comfort of and