aboutsummaryrefslogtreecommitdiff
path: root/priv/static/packs/features
diff options
context:
space:
mode:
Diffstat (limited to 'priv/static/packs/features')
-rw-r--r--priv/static/packs/features/account_gallery.js2
-rw-r--r--priv/static/packs/features/account_gallery.js.map2
-rw-r--r--priv/static/packs/features/account_timeline.js2
-rw-r--r--priv/static/packs/features/account_timeline.js.map2
-rw-r--r--priv/static/packs/features/blocks.js2
-rw-r--r--priv/static/packs/features/blocks.js.map2
-rw-r--r--priv/static/packs/features/bookmarked_statuses.js2
-rw-r--r--priv/static/packs/features/bookmarked_statuses.js.map2
-rw-r--r--priv/static/packs/features/community_timeline.js2
-rw-r--r--priv/static/packs/features/community_timeline.js.map2
-rw-r--r--priv/static/packs/features/compose.js2
-rw-r--r--priv/static/packs/features/compose.js.map2
-rw-r--r--priv/static/packs/features/direct_timeline.js2
-rw-r--r--priv/static/packs/features/direct_timeline.js.map2
-rw-r--r--priv/static/packs/features/directory.js2
-rw-r--r--priv/static/packs/features/directory.js.map2
-rw-r--r--priv/static/packs/features/domain_blocks.js2
-rw-r--r--priv/static/packs/features/domain_blocks.js.map2
-rw-r--r--priv/static/packs/features/favourited_statuses.js2
-rw-r--r--priv/static/packs/features/favourited_statuses.js.map2
-rw-r--r--priv/static/packs/features/favourites.js2
-rw-r--r--priv/static/packs/features/favourites.js.map2
-rw-r--r--priv/static/packs/features/follow_requests.js2
-rw-r--r--priv/static/packs/features/follow_requests.js.map2
-rw-r--r--priv/static/packs/features/followers.js2
-rw-r--r--priv/static/packs/features/followers.js.map2
-rw-r--r--priv/static/packs/features/following.js2
-rw-r--r--priv/static/packs/features/following.js.map2
-rw-r--r--priv/static/packs/features/generic_not_found.js2
-rw-r--r--priv/static/packs/features/getting_started.js2
-rw-r--r--priv/static/packs/features/getting_started.js.map2
-rw-r--r--priv/static/packs/features/glitch/async/directory.js2
-rw-r--r--priv/static/packs/features/glitch/async/directory.js.map2
-rw-r--r--priv/static/packs/features/glitch/async/list_adder.js2
-rw-r--r--priv/static/packs/features/glitch/async/list_adder.js.map2
-rw-r--r--priv/static/packs/features/glitch/async/search.js2
-rw-r--r--priv/static/packs/features/hashtag_timeline.js2
-rw-r--r--priv/static/packs/features/hashtag_timeline.js.map2
-rw-r--r--priv/static/packs/features/home_timeline.js2
-rw-r--r--priv/static/packs/features/home_timeline.js.map2
-rw-r--r--priv/static/packs/features/keyboard_shortcuts.js2
-rw-r--r--priv/static/packs/features/keyboard_shortcuts.js.map2
-rw-r--r--priv/static/packs/features/list_adder.js2
-rw-r--r--priv/static/packs/features/list_adder.js.map2
-rw-r--r--priv/static/packs/features/list_editor.js2
-rw-r--r--priv/static/packs/features/list_editor.js.map2
-rw-r--r--priv/static/packs/features/list_timeline.js2
-rw-r--r--priv/static/packs/features/list_timeline.js.map2
-rw-r--r--priv/static/packs/features/lists.js2
-rw-r--r--priv/static/packs/features/lists.js.map2
-rw-r--r--priv/static/packs/features/mutes.js2
-rw-r--r--priv/static/packs/features/mutes.js.map2
-rw-r--r--priv/static/packs/features/notifications.js2
-rw-r--r--priv/static/packs/features/notifications.js.map2
-rw-r--r--priv/static/packs/features/pinned_statuses.js2
-rw-r--r--priv/static/packs/features/pinned_statuses.js.map2
-rw-r--r--priv/static/packs/features/public_timeline.js2
-rw-r--r--priv/static/packs/features/public_timeline.js.map2
-rw-r--r--priv/static/packs/features/reblogs.js2
-rw-r--r--priv/static/packs/features/reblogs.js.map2
-rw-r--r--priv/static/packs/features/search.js2
-rw-r--r--priv/static/packs/features/status.js2
-rw-r--r--priv/static/packs/features/status.js.map2
63 files changed, 63 insertions, 63 deletions
diff --git a/priv/static/packs/features/account_gallery.js b/priv/static/packs/features/account_gallery.js
index 19dbf1fec..6afdba220 100644
--- a/priv/static/packs/features/account_gallery.js
+++ b/priv/static/packs/features/account_gallery.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{837:function(e,t,a){"use strict";a.r(t);var o=a(0),n=a(2),i=a(7),c=a(1),s=a(3),r=a.n(s),l=a(13),d=a(14),p=a.n(d),u=a(5),h=a.n(u),b=a(25),m=a(33),O=a(300),g=a(731),f=a(738),j=a(18),v=a(206),y=a(211),_=a(12),I=a.n(_),M=a(26),L=a(20),w=a(116),x=function(e){function t(){for(var t,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return t=e.call.apply(e,[this].concat(o))||this,Object(c.a)(Object(n.a)(t),"state",{visible:"hide_all"!==L.g&&!t.props.attachment.getIn(["status","sensitive"])||"show_all"===L.g,loaded:!1}),Object(c.a)(Object(n.a)(t),"setCanvasRef",(function(e){t.canvas=e})),Object(c.a)(Object(n.a)(t),"handleImageLoad",(function(){t.setState({loaded:!0})})),Object(c.a)(Object(n.a)(t),"handleMouseEnter",(function(e){t.hoverToPlay()&&e.target.play()})),Object(c.a)(Object(n.a)(t),"handleMouseLeave",(function(e){t.hoverToPlay()&&(e.target.pause(),e.target.currentTime=0)})),Object(c.a)(Object(n.a)(t),"handleClick",(function(e){0!==e.button||e.ctrlKey||e.metaKey||(e.preventDefault(),t.state.visible?t.props.onOpenMedia(t.props.attachment):t.setState({visible:!0}))})),t}Object(i.a)(t,e);var a=t.prototype;return a.componentDidMount=function(){this.props.attachment.get("blurhash")&&this._decode()},a.componentDidUpdate=function(e){e.attachment.get("blurhash")!==this.props.attachment.get("blurhash")&&this.props.attachment.get("blurhash")&&this._decode()},a._decode=function(){var e=this.props.attachment.get("blurhash"),t=Object(y.decode)(e,32,32);if(t){var a=this.canvas.getContext("2d"),o=new ImageData(t,32,32);a.putImageData(o,0,0)}},a.hoverToPlay=function(){return!L.a&&-1!==["gifv","video"].indexOf(this.props.attachment.get("type"))},a.render=function(){var e,t=this.props,a=t.attachment,n=t.displayWidth,i=this.state,c=i.visible,s=i.loaded,l=Math.floor((n-4)/3)-4+"px",d=l,p=a.get("status"),u=p.get("spoiler_text")||a.get("description"),h="";if("unknown"===a.get("type"));else if("audio"===a.get("type"))h=Object(o.a)("span",{className:"account-gallery__item__icons"},void 0,Object(o.a)(M.a,{id:"music"}));else if("image"===a.get("type")){var b=100*((a.getIn(["meta","focus","x"])||0)/2+.5),m=100*((a.getIn(["meta","focus","y"])||0)/-2+.5);h=Object(o.a)("img",{src:a.get("preview_url"),alt:a.get("description"),title:a.get("description"),style:{objectPosition:b+"% "+m+"%"},onLoad:this.handleImageLoad})}else if(-1!==["gifv","video"].indexOf(a.get("type"))){var O=!Object(w.a)()&&L.a,g="video"===a.get("type")?Object(o.a)(M.a,{id:"play"}):"GIF";h=Object(o.a)("div",{className:I()("media-gallery__gifv",{autoplay:O})},void 0,Object(o.a)("video",{className:"media-gallery__item-gifv-thumbnail","aria-label":a.get("description"),title:a.get("description"),role:"application",src:a.get("url"),onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,autoPlay:O,loop:!0,muted:!0}),Object(o.a)("span",{className:"media-gallery__gifv__label"},void 0,g))}return c||(e=Object(o.a)("span",{className:"account-gallery__item__icons"},void 0,Object(o.a)(M.a,{id:"eye-slash"}))),Object(o.a)("div",{className:"account-gallery__item",style:{width:l,height:d}},void 0,Object(o.a)("a",{className:"media-gallery__item-thumbnail",href:p.get("url"),onClick:this.handleClick,title:u,target:"_blank",rel:"noopener noreferrer"},void 0,r.a.createElement("canvas",{width:32,height:32,ref:this.setCanvasRef,className:I()("media-gallery__preview",{"media-gallery__preview--hidden":c&&s})}),c&&h,!c&&e))},t}(j.a);Object(c.a)(x,"propTypes",{attachment:p.a.map.isRequired,displayWidth:h.a.number.isRequired,onOpenMedia:h.a.func.isRequired});var R,S,C,N=a(1057),T=a(467),A=a(1054),D=a(1030),k=a(47);a.d(t,"default",(function(){return E}));var q=function(e){function t(){for(var t,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return t=e.call.apply(e,[this].concat(o))||this,Object(c.a)(Object(n.a)(t),"handleLoadMore",(function(){t.props.onLoadMore(t.props.maxId)})),t}return Object(i.a)(t,e),t.prototype.render=function(){return Object(o.a)(A.a,{disabled:this.props.disabled,onClick:this.handleLoadMore})},t}(j.a);Object(c.a)(q,"propTypes",{shouldUpdateScroll:h.a.func,maxId:h.a.string,onLoadMore:h.a.func.isRequired});var E=Object(l.connect)((function(e,t){return{isAccount:!!e.getIn(["accounts",t.params.accountId]),attachments:Object(v.a)(e,t.params.accountId),isLoading:e.getIn(["timelines","account:"+t.params.accountId+":media","isLoading"]),hasMore:e.getIn(["timelines","account:"+t.params.accountId+":media","hasMore"])}}))((C=S=function(e){function t(){for(var t,a=arguments.length,o=new Array(a),i=0;i<a;i++)o[i]=arguments[i];return t=e.call.apply(e,[this].concat(o))||this,Object(c.a)(Object(n.a)(t),"state",{width:323}),Object(c.a)(Object(n.a)(t),"handleScrollToBottom",(function(){t.props.hasMore&&t.handleLoadMore(t.props.attachments.size>0?t.props.attachments.last().getIn(["status","id"]):void 0)})),Object(c.a)(Object(n.a)(t),"handleScroll",(function(e){var a=e.target,o=a.scrollTop;150>a.scrollHeight-o-a.clientHeight&&!t.props.isLoading&&t.handleScrollToBottom()})),Object(c.a)(Object(n.a)(t),"handleLoadMore",(function(e){t.props.dispatch(Object(m.p)(t.props.params.accountId,{maxId:e}))})),Object(c.a)(Object(n.a)(t),"handleLoadOlder",(function(e){e.preventDefault(),t.handleScrollToBottom()})),Object(c.a)(Object(n.a)(t),"handleOpenMedia",(function(e){if("video"===e.get("type"))t.props.dispatch(Object(k.d)("VIDEO",{media:e,status:e.get("status")}));else if("audio"===e.get("type"))t.props.dispatch(Object(k.d)("AUDIO",{media:e,status:e.get("status")}));else{var a=e.getIn(["status","media_attachments"]),o=a.findIndex((function(t){return t.get("id")===e.get("id")}));t.props.dispatch(Object(k.d)("MEDIA",{media:a,index:o,status:e.get("status")}))}})),Object(c.a)(Object(n.a)(t),"handleRef",(function(e){e&&t.setState({width:e.offsetWidth})})),t}Object(i.a)(t,e);var a=t.prototype;return a.componentDidMount=function(){this.props.dispatch(Object(b.A)(this.props.params.accountId)),this.props.dispatch(Object(m.p)(this.props.params.accountId))},a.componentWillReceiveProps=function(e){e.params.accountId!==this.props.params.accountId&&e.params.accountId&&(this.props.dispatch(Object(b.A)(e.params.accountId)),this.props.dispatch(Object(m.p)(this.props.params.accountId)))},a.render=function(){var e=this,t=this.props,a=t.attachments,n=t.shouldUpdateScroll,i=t.isLoading,c=t.hasMore,s=t.isAccount,l=t.multiColumn,d=this.state.width;if(!s)return Object(o.a)(g.a,{},void 0,Object(o.a)(D.a,{}));if(!a&&i)return Object(o.a)(g.a,{},void 0,Object(o.a)(O.a,{}));var p=null;return!c||i&&0===a.size||(p=Object(o.a)(A.a,{visible:!i,onClick:this.handleLoadOlder})),Object(o.a)(g.a,{},void 0,Object(o.a)(f.a,{multiColumn:l}),Object(o.a)(T.a,{scrollKey:"account_gallery",shouldUpdateScroll:n},void 0,Object(o.a)("div",{className:"scrollable scrollable--flex",onScroll:this.handleScroll},void 0,Object(o.a)(N.a,{accountId:this.props.params.accountId}),r.a.createElement("div",{role:"feed",className:"account-gallery__container",ref:this.handleRef},a.map((function(t,n){return null===t?Object(o.a)(q,{maxId:n>0?a.getIn(n-1,"id"):null,onLoadMore:e.handleLoadMore},"more:"+a.getIn(n+1,"id")):Object(o.a)(x,{attachment:t,displayWidth:d,onOpenMedia:e.handleOpenMedia},t.get("id"))})),p),i&&0===a.size&&Object(o.a)("div",{className:"scrollable__append"},void 0,Object(o.a)(O.a,{})))))},t}(j.a),Object(c.a)(S,"propTypes",{params:h.a.object.isRequired,dispatch:h.a.func.isRequired,attachments:p.a.list.isRequired,isLoading:h.a.bool,hasMore:h.a.bool,isAccount:h.a.bool,multiColumn:h.a.bool}),R=C))||R}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{863:function(t,e,a){"use strict";a.r(e),a.d(e,"default",(function(){return z}));var n=a(0),o=a(2),c=a(9),i=a(6),s=a(8),r=a(1),l=a(3),d=a.n(l),p=a(15),u=a(16),h=a.n(u),b=a(5),m=a.n(b),f=a(26),O=a(36),g=a(306),j=a(757),v=a(764),y=a(21),_=a(210),I=a(215),M=a(14),L=a.n(M),w=a(27),R=a(22),x=a(120);var S=function(t){Object(s.a)(a,t);var e;e=a;function a(){for(var e,a=arguments.length,n=new Array(a),c=0;c<a;c++)n[c]=arguments[c];return e=t.call.apply(t,[this].concat(n))||this,Object(r.a)(Object(o.a)(e),"state",{visible:"hide_all"!==R.g&&!e.props.attachment.getIn(["status","sensitive"])||"show_all"===R.g,loaded:!1}),Object(r.a)(Object(o.a)(e),"setCanvasRef",(function(t){e.canvas=t})),Object(r.a)(Object(o.a)(e),"handleImageLoad",(function(){e.setState({loaded:!0})})),Object(r.a)(Object(o.a)(e),"handleMouseEnter",(function(t){e.hoverToPlay()&&t.target.play()})),Object(r.a)(Object(o.a)(e),"handleMouseLeave",(function(t){e.hoverToPlay()&&(t.target.pause(),t.target.currentTime=0)})),Object(r.a)(Object(o.a)(e),"handleClick",(function(t){0!==t.button||t.ctrlKey||t.metaKey||(t.preventDefault(),e.state.visible?e.props.onOpenMedia(e.props.attachment):e.setState({visible:!0}))})),e}var c=a.prototype;return c.componentDidMount=function(){this.props.attachment.get("blurhash")&&this._decode()},c.componentDidUpdate=function(t){t.attachment.get("blurhash")!==this.props.attachment.get("blurhash")&&this.props.attachment.get("blurhash")&&this._decode()},c._decode=function(){var t=this.props.attachment.get("blurhash"),e=Object(I.decode)(t,32,32);if(e){var a=this.canvas.getContext("2d"),n=new ImageData(e,32,32);a.putImageData(n,0,0)}},c.hoverToPlay=function(){return!R.a&&-1!==["gifv","video"].indexOf(this.props.attachment.get("type"))},c.render=function(){var t,e=this.props,a=e.attachment,o=e.displayWidth,c=this.state,i=c.visible,s=c.loaded,r=Math.floor((o-4)/3)-4+"px",l=r,p=a.get("status"),u=p.get("spoiler_text")||a.get("description"),h="";if("unknown"===a.get("type"));else if("audio"===a.get("type"))h=Object(n.a)("span",{className:"account-gallery__item__icons"},void 0,Object(n.a)(w.a,{id:"music"}));else if("image"===a.get("type")){var b=100*((a.getIn(["meta","focus","x"])||0)/2+.5),m=100*((a.getIn(["meta","focus","y"])||0)/-2+.5);h=Object(n.a)("img",{src:a.get("preview_url"),alt:a.get("description"),title:a.get("description"),style:{objectPosition:b+"% "+m+"%"},onLoad:this.handleImageLoad})}else if(-1!==["gifv","video"].indexOf(a.get("type"))){var f=!Object(x.a)()&&R.a,O="video"===a.get("type")?Object(n.a)(w.a,{id:"play"}):"GIF";h=Object(n.a)("div",{className:L()("media-gallery__gifv",{autoplay:f})},void 0,Object(n.a)("video",{className:"media-gallery__item-gifv-thumbnail","aria-label":a.get("description"),title:a.get("description"),role:"application",src:a.get("url"),onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,autoPlay:f,loop:!0,muted:!0}),Object(n.a)("span",{className:"media-gallery__gifv__label"},void 0,O))}return i||(t=Object(n.a)("span",{className:"account-gallery__item__icons"},void 0,Object(n.a)(w.a,{id:"eye-slash"}))),Object(n.a)("div",{className:"account-gallery__item",style:{width:r,height:l}},void 0,Object(n.a)("a",{className:"media-gallery__item-thumbnail",href:p.get("url"),onClick:this.handleClick,title:u,target:"_blank",rel:"noopener noreferrer"},void 0,d.a.createElement("canvas",{width:32,height:32,ref:this.setCanvasRef,className:L()("media-gallery__preview",{"media-gallery__preview--hidden":i&&s})}),i&&h,!i&&t))},a}(y.a);Object(r.a)(S,"propTypes",{attachment:h.a.map.isRequired,displayWidth:m.a.number.isRequired,onOpenMedia:m.a.func.isRequired});var D,C,N,T=a(1084),A=a(472),k=a(1081),q=a(1057),E=a(48);function P(t){return function(){var e,a=Object(i.a)(t);if(U()){var n=Object(i.a)(this).constructor;e=Reflect.construct(a,arguments,n)}else e=a.apply(this,arguments);return Object(c.a)(this,e)}}function U(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(t){return!1}}var W=function(t){Object(s.a)(e,t);P(e);function e(){for(var e,a=arguments.length,n=new Array(a),c=0;c<a;c++)n[c]=arguments[c];return e=t.call.apply(t,[this].concat(n))||this,Object(r.a)(Object(o.a)(e),"handleLoadMore",(function(){e.props.onLoadMore(e.props.maxId)})),e}return e.prototype.render=function(){return Object(n.a)(k.a,{disabled:this.props.disabled,onClick:this.handleLoadMore})},e}(y.a);Object(r.a)(W,"propTypes",{shouldUpdateScroll:m.a.func,maxId:m.a.string,onLoadMore:m.a.func.isRequired});var z=Object(p.connect)((function(t,e){return{isAccount:!!t.getIn(["accounts",e.params.accountId]),attachments:Object(_.a)(t,e.params.accountId),isLoading:t.getIn(["timelines","account:"+e.params.accountId+":media","isLoading"]),hasMore:t.getIn(["timelines","account:"+e.params.accountId+":media","hasMore"])}}))((N=C=function(t){Object(s.a)(e,t);P(e);function e(){for(var e,a=arguments.length,n=new Array(a),c=0;c<a;c++)n[c]=arguments[c];return e=t.call.apply(t,[this].concat(n))||this,Object(r.a)(Object(o.a)(e),"state",{width:323}),Object(r.a)(Object(o.a)(e),"handleScrollToBottom",(function(){e.props.hasMore&&e.handleLoadMore(e.props.attachments.size>0?e.props.attachments.last().getIn(["status","id"]):void 0)})),Object(r.a)(Object(o.a)(e),"handleScroll",(function(t){var a=t.target,n=a.scrollTop;150>a.scrollHeight-n-a.clientHeight&&!e.props.isLoading&&e.handleScrollToBottom()})),Object(r.a)(Object(o.a)(e),"handleLoadMore",(function(t){e.props.dispatch(Object(O.p)(e.props.params.accountId,{maxId:t}))})),Object(r.a)(Object(o.a)(e),"handleLoadOlder",(function(t){t.preventDefault(),e.handleScrollToBottom()})),Object(r.a)(Object(o.a)(e),"handleOpenMedia",(function(t){if("video"===t.get("type"))e.props.dispatch(Object(E.d)("VIDEO",{media:t,status:t.get("status")}));else if("audio"===t.get("type"))e.props.dispatch(Object(E.d)("AUDIO",{media:t,status:t.get("status")}));else{var a=t.getIn(["status","media_attachments"]),n=a.findIndex((function(e){return e.get("id")===t.get("id")}));e.props.dispatch(Object(E.d)("MEDIA",{media:a,index:n,status:t.get("status")}))}})),Object(r.a)(Object(o.a)(e),"handleRef",(function(t){t&&e.setState({width:t.offsetWidth})})),e}var a=e.prototype;return a.componentDidMount=function(){this.props.dispatch(Object(f.A)(this.props.params.accountId)),this.props.dispatch(Object(O.p)(this.props.params.accountId))},a.componentWillReceiveProps=function(t){t.params.accountId!==this.props.params.accountId&&t.params.accountId&&(this.props.dispatch(Object(f.A)(t.params.accountId)),this.props.dispatch(Object(O.p)(this.props.params.accountId)))},a.render=function(){var t=this,e=this.props,a=e.attachments,o=e.shouldUpdateScroll,c=e.isLoading,i=e.hasMore,s=e.isAccount,r=e.multiColumn,l=this.state.width;if(!s)return Object(n.a)(j.a,{},void 0,Object(n.a)(q.a,{}));if(!a&&c)return Object(n.a)(j.a,{},void 0,Object(n.a)(g.a,{}));var p=null;return!i||c&&0===a.size||(p=Object(n.a)(k.a,{visible:!c,onClick:this.handleLoadOlder})),Object(n.a)(j.a,{},void 0,Object(n.a)(v.a,{multiColumn:r}),Object(n.a)(A.a,{scrollKey:"account_gallery",shouldUpdateScroll:o},void 0,Object(n.a)("div",{className:"scrollable scrollable--flex",onScroll:this.handleScroll},void 0,Object(n.a)(T.a,{accountId:this.props.params.accountId}),d.a.createElement("div",{role:"feed",className:"account-gallery__container",ref:this.handleRef},a.map((function(e,o){return null===e?Object(n.a)(W,{maxId:o>0?a.getIn(o-1,"id"):null,onLoadMore:t.handleLoadMore},"more:"+a.getIn(o+1,"id")):Object(n.a)(S,{attachment:e,displayWidth:l,onOpenMedia:t.handleOpenMedia},e.get("id"))})),p),c&&0===a.size&&Object(n.a)("div",{className:"scrollable__append"},void 0,Object(n.a)(g.a,{})))))},e}(y.a),Object(r.a)(C,"propTypes",{params:m.a.object.isRequired,dispatch:m.a.func.isRequired,attachments:h.a.list.isRequired,isLoading:m.a.bool,hasMore:m.a.bool,isAccount:m.a.bool,multiColumn:m.a.bool}),D=N))||D}}]);
//# sourceMappingURL=account_gallery.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/account_gallery.js.map b/priv/static/packs/features/account_gallery.js.map
index 6e91f9d92..6c6a30c94 100644
--- a/priv/static/packs/features/account_gallery.js.map
+++ b/priv/static/packs/features/account_gallery.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/account_gallery/components/media_item.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/account_gallery/index.js"],"names":["MediaItem","visible","displayMedia","props","attachment","getIn","loaded","c","canvas","setState","e","hoverToPlay","target","play","pause","currentTime","button","ctrlKey","metaKey","preventDefault","state","onOpenMedia","componentDidMount","this","get","_decode","componentDidUpdate","prevProps","hash","pixels","decode","ctx","getContext","imageData","ImageData","putImageData","autoPlayGif","indexOf","render","icon","displayWidth","width","Math","floor","height","status","title","thumbnail","className","id","x","y","src","alt","style","objectPosition","onLoad","handleImageLoad","autoPlay","isIOS","label","classNames","autoplay","aria-label","role","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","loop","muted","href","onClick","handleClick","rel","ref","setCanvasRef","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","number","func","LoadMoreMedia","onLoadMore","maxId","disabled","handleLoadMore","shouldUpdateScroll","string","AccountGallery","connect","isAccount","params","accountId","attachments","getAccountGallery","isLoading","hasMore","size","last","undefined","scrollTop","scrollHeight","clientHeight","handleScrollToBottom","dispatch","expandAccountMediaTimeline","openModal","media","index","findIndex","offsetWidth","fetchAccount","componentWillReceiveProps","nextProps","multiColumn","loadOlder","handleLoadOlder","scrollKey","onScroll","handleScroll","handleRef","handleOpenMedia","object","list","bool"],"mappings":"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","file":"features/account_gallery.js","sourcesContent":["import { decode } from 'blurhash';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\nimport { autoPlayGif, displayMedia } from 'mastodon/initial_state';\nimport { isIOS } from 'mastodon/is_mobile';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nexport default class MediaItem extends ImmutablePureComponent {\n\n static propTypes = {\n attachment: ImmutablePropTypes.map.isRequired,\n displayWidth: PropTypes.number.isRequired,\n onOpenMedia: PropTypes.func.isRequired,\n };\n\n state = {\n visible: displayMedia !== 'hide_all' && !this.props.attachment.getIn(['status', 'sensitive']) || displayMedia === 'show_all',\n loaded: false,\n };\n\n componentDidMount () {\n if (this.props.attachment.get('blurhash')) {\n this._decode();\n }\n }\n\n componentDidUpdate (prevProps) {\n if (prevProps.attachment.get('blurhash') !== this.props.attachment.get('blurhash') && this.props.attachment.get('blurhash')) {\n this._decode();\n }\n }\n\n _decode () {\n const hash = this.props.attachment.get('blurhash');\n const pixels = decode(hash, 32, 32);\n\n if (pixels) {\n const ctx = this.canvas.getContext('2d');\n const imageData = new ImageData(pixels, 32, 32);\n\n ctx.putImageData(imageData, 0, 0);\n }\n }\n\n setCanvasRef = c => {\n this.canvas = c;\n }\n\n handleImageLoad = () => {\n this.setState({ loaded: true });\n }\n\n handleMouseEnter = e => {\n if (this.hoverToPlay()) {\n e.target.play();\n }\n }\n\n handleMouseLeave = e => {\n if (this.hoverToPlay()) {\n e.target.pause();\n e.target.currentTime = 0;\n }\n }\n\n hoverToPlay () {\n return !autoPlayGif && ['gifv', 'video'].indexOf(this.props.attachment.get('type')) !== -1;\n }\n\n handleClick = e => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n\n if (this.state.visible) {\n this.props.onOpenMedia(this.props.attachment);\n } else {\n this.setState({ visible: true });\n }\n }\n }\n\n render () {\n const { attachment, displayWidth } = this.props;\n const { visible, loaded } = this.state;\n\n const width = `${Math.floor((displayWidth - 4) / 3) - 4}px`;\n const height = width;\n const status = attachment.get('status');\n const title = status.get('spoiler_text') || attachment.get('description');\n\n let thumbnail = '';\n let icon;\n\n if (attachment.get('type') === 'unknown') {\n // Skip\n } else if (attachment.get('type') === 'audio') {\n thumbnail = (\n <span className='account-gallery__item__icons'>\n <Icon id='music' />\n </span>\n );\n } else if (attachment.get('type') === 'image') {\n const focusX = attachment.getIn(['meta', 'focus', 'x']) || 0;\n const focusY = attachment.getIn(['meta', 'focus', 'y']) || 0;\n const x = ((focusX / 2) + .5) * 100;\n const y = ((focusY / -2) + .5) * 100;\n\n thumbnail = (\n <img\n src={attachment.get('preview_url')}\n alt={attachment.get('description')}\n title={attachment.get('description')}\n style={{ objectPosition: `${x}% ${y}%` }}\n onLoad={this.handleImageLoad}\n />\n );\n } else if (['gifv', 'video'].indexOf(attachment.get('type')) !== -1) {\n const autoPlay = !isIOS() && autoPlayGif;\n const label = attachment.get('type') === 'video' ? <Icon id='play' /> : 'GIF';\n\n thumbnail = (\n <div className={classNames('media-gallery__gifv', { autoplay: autoPlay })}>\n <video\n className='media-gallery__item-gifv-thumbnail'\n aria-label={attachment.get('description')}\n title={attachment.get('description')}\n role='application'\n src={attachment.get('url')}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n autoPlay={autoPlay}\n loop\n muted\n />\n\n <span className='media-gallery__gifv__label'>{label}</span>\n </div>\n );\n }\n\n if (!visible) {\n icon = (\n <span className='account-gallery__item__icons'>\n <Icon id='eye-slash' />\n </span>\n );\n }\n\n return (\n <div className='account-gallery__item' style={{ width, height }}>\n <a className='media-gallery__item-thumbnail' href={status.get('url')} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>\n <canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />\n {visible && thumbnail}\n {!visible && icon}\n </a>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { fetchAccount } from 'mastodon/actions/accounts';\nimport { expandAccountMediaTimeline } from '../../actions/timelines';\nimport LoadingIndicator from 'mastodon/components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButton from 'mastodon/components/column_back_button';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { getAccountGallery } from 'mastodon/selectors';\nimport MediaItem from './components/media_item';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport { ScrollContainer } from 'react-router-scroll-4';\nimport LoadMore from 'mastodon/components/load_more';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\nimport { openModal } from 'mastodon/actions/modal';\n\nconst mapStateToProps = (state, props) => ({\n isAccount: !!state.getIn(['accounts', props.params.accountId]),\n attachments: getAccountGallery(state, props.params.accountId),\n isLoading: state.getIn(['timelines', `account:${props.params.accountId}:media`, 'isLoading']),\n hasMore: state.getIn(['timelines', `account:${props.params.accountId}:media`, 'hasMore']),\n});\n\nclass LoadMoreMedia extends ImmutablePureComponent {\n\n static propTypes = {\n shouldUpdateScroll: PropTypes.func,\n maxId: PropTypes.string,\n onLoadMore: PropTypes.func.isRequired,\n };\n\n handleLoadMore = () => {\n this.props.onLoadMore(this.props.maxId);\n }\n\n render () {\n return (\n <LoadMore\n disabled={this.props.disabled}\n onClick={this.handleLoadMore}\n />\n );\n }\n\n}\n\nexport default @connect(mapStateToProps)\nclass AccountGallery extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n attachments: ImmutablePropTypes.list.isRequired,\n isLoading: PropTypes.bool,\n hasMore: PropTypes.bool,\n isAccount: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n state = {\n width: 323,\n };\n\n componentDidMount () {\n this.props.dispatch(fetchAccount(this.props.params.accountId));\n this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {\n this.props.dispatch(fetchAccount(nextProps.params.accountId));\n this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));\n }\n }\n\n handleScrollToBottom = () => {\n if (this.props.hasMore) {\n this.handleLoadMore(this.props.attachments.size > 0 ? this.props.attachments.last().getIn(['status', 'id']) : undefined);\n }\n }\n\n handleScroll = e => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n const offset = scrollHeight - scrollTop - clientHeight;\n\n if (150 > offset && !this.props.isLoading) {\n this.handleScrollToBottom();\n }\n }\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId, { maxId }));\n };\n\n handleLoadOlder = e => {\n e.preventDefault();\n this.handleScrollToBottom();\n }\n\n handleOpenMedia = attachment => {\n if (attachment.get('type') === 'video') {\n this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status') }));\n } else if (attachment.get('type') === 'audio') {\n this.props.dispatch(openModal('AUDIO', { media: attachment, status: attachment.get('status') }));\n } else {\n const media = attachment.getIn(['status', 'media_attachments']);\n const index = media.findIndex(x => x.get('id') === attachment.get('id'));\n\n this.props.dispatch(openModal('MEDIA', { media, index, status: attachment.get('status') }));\n }\n }\n\n handleRef = c => {\n if (c) {\n this.setState({ width: c.offsetWidth });\n }\n }\n\n render () {\n const { attachments, shouldUpdateScroll, isLoading, hasMore, isAccount, multiColumn } = this.props;\n const { width } = this.state;\n\n if (!isAccount) {\n return (\n <Column>\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!attachments && isLoading) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n let loadOlder = null;\n\n if (hasMore && !(isLoading && attachments.size === 0)) {\n loadOlder = <LoadMore visible={!isLoading} onClick={this.handleLoadOlder} />;\n }\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollContainer scrollKey='account_gallery' shouldUpdateScroll={shouldUpdateScroll}>\n <div className='scrollable scrollable--flex' onScroll={this.handleScroll}>\n <HeaderContainer accountId={this.props.params.accountId} />\n\n <div role='feed' className='account-gallery__container' ref={this.handleRef}>\n {attachments.map((attachment, index) => attachment === null ? (\n <LoadMoreMedia key={'more:' + attachments.getIn(index + 1, 'id')} maxId={index > 0 ? attachments.getIn(index - 1, 'id') : null} onLoadMore={this.handleLoadMore} />\n ) : (\n <MediaItem key={attachment.get('id')} attachment={attachment} displayWidth={width} onOpenMedia={this.handleOpenMedia} />\n ))}\n\n {loadOlder}\n </div>\n\n {isLoading && attachments.size === 0 && (\n <div className='scrollable__append'>\n <LoadingIndicator />\n </div>\n )}\n </div>\n </ScrollContainer>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/account_gallery/components/media_item.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/account_gallery/index.js"],"names":["MediaItem","visible","displayMedia","props","attachment","getIn","loaded","c","canvas","setState","e","hoverToPlay","target","play","pause","currentTime","button","ctrlKey","metaKey","preventDefault","state","onOpenMedia","componentDidMount","this","get","_decode","componentDidUpdate","prevProps","hash","pixels","decode","ctx","getContext","imageData","ImageData","putImageData","autoPlayGif","indexOf","render","icon","displayWidth","width","Math","floor","height","status","title","thumbnail","className","id","x","y","src","alt","style","objectPosition","onLoad","handleImageLoad","autoPlay","isIOS","label","classNames","autoplay","aria-label","role","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","loop","muted","href","onClick","handleClick","rel","ref","setCanvasRef","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","number","func","LoadMoreMedia","onLoadMore","maxId","disabled","handleLoadMore","shouldUpdateScroll","string","AccountGallery","connect","isAccount","params","accountId","attachments","getAccountGallery","isLoading","hasMore","size","last","undefined","scrollTop","scrollHeight","clientHeight","handleScrollToBottom","dispatch","expandAccountMediaTimeline","openModal","media","index","findIndex","offsetWidth","fetchAccount","componentWillReceiveProps","nextProps","multiColumn","loadOlder","handleLoadOlder","scrollKey","onScroll","handleScroll","handleRef","handleOpenMedia","object","list","bool"],"mappings":"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","file":"features/account_gallery.js","sourcesContent":["import { decode } from 'blurhash';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\nimport { autoPlayGif, displayMedia } from 'mastodon/initial_state';\nimport { isIOS } from 'mastodon/is_mobile';\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nexport default class MediaItem extends ImmutablePureComponent {\n\n static propTypes = {\n attachment: ImmutablePropTypes.map.isRequired,\n displayWidth: PropTypes.number.isRequired,\n onOpenMedia: PropTypes.func.isRequired,\n };\n\n state = {\n visible: displayMedia !== 'hide_all' && !this.props.attachment.getIn(['status', 'sensitive']) || displayMedia === 'show_all',\n loaded: false,\n };\n\n componentDidMount () {\n if (this.props.attachment.get('blurhash')) {\n this._decode();\n }\n }\n\n componentDidUpdate (prevProps) {\n if (prevProps.attachment.get('blurhash') !== this.props.attachment.get('blurhash') && this.props.attachment.get('blurhash')) {\n this._decode();\n }\n }\n\n _decode () {\n const hash = this.props.attachment.get('blurhash');\n const pixels = decode(hash, 32, 32);\n\n if (pixels) {\n const ctx = this.canvas.getContext('2d');\n const imageData = new ImageData(pixels, 32, 32);\n\n ctx.putImageData(imageData, 0, 0);\n }\n }\n\n setCanvasRef = c => {\n this.canvas = c;\n }\n\n handleImageLoad = () => {\n this.setState({ loaded: true });\n }\n\n handleMouseEnter = e => {\n if (this.hoverToPlay()) {\n e.target.play();\n }\n }\n\n handleMouseLeave = e => {\n if (this.hoverToPlay()) {\n e.target.pause();\n e.target.currentTime = 0;\n }\n }\n\n hoverToPlay () {\n return !autoPlayGif && ['gifv', 'video'].indexOf(this.props.attachment.get('type')) !== -1;\n }\n\n handleClick = e => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n\n if (this.state.visible) {\n this.props.onOpenMedia(this.props.attachment);\n } else {\n this.setState({ visible: true });\n }\n }\n }\n\n render () {\n const { attachment, displayWidth } = this.props;\n const { visible, loaded } = this.state;\n\n const width = `${Math.floor((displayWidth - 4) / 3) - 4}px`;\n const height = width;\n const status = attachment.get('status');\n const title = status.get('spoiler_text') || attachment.get('description');\n\n let thumbnail = '';\n let icon;\n\n if (attachment.get('type') === 'unknown') {\n // Skip\n } else if (attachment.get('type') === 'audio') {\n thumbnail = (\n <span className='account-gallery__item__icons'>\n <Icon id='music' />\n </span>\n );\n } else if (attachment.get('type') === 'image') {\n const focusX = attachment.getIn(['meta', 'focus', 'x']) || 0;\n const focusY = attachment.getIn(['meta', 'focus', 'y']) || 0;\n const x = ((focusX / 2) + .5) * 100;\n const y = ((focusY / -2) + .5) * 100;\n\n thumbnail = (\n <img\n src={attachment.get('preview_url')}\n alt={attachment.get('description')}\n title={attachment.get('description')}\n style={{ objectPosition: `${x}% ${y}%` }}\n onLoad={this.handleImageLoad}\n />\n );\n } else if (['gifv', 'video'].indexOf(attachment.get('type')) !== -1) {\n const autoPlay = !isIOS() && autoPlayGif;\n const label = attachment.get('type') === 'video' ? <Icon id='play' /> : 'GIF';\n\n thumbnail = (\n <div className={classNames('media-gallery__gifv', { autoplay: autoPlay })}>\n <video\n className='media-gallery__item-gifv-thumbnail'\n aria-label={attachment.get('description')}\n title={attachment.get('description')}\n role='application'\n src={attachment.get('url')}\n onMouseEnter={this.handleMouseEnter}\n onMouseLeave={this.handleMouseLeave}\n autoPlay={autoPlay}\n loop\n muted\n />\n\n <span className='media-gallery__gifv__label'>{label}</span>\n </div>\n );\n }\n\n if (!visible) {\n icon = (\n <span className='account-gallery__item__icons'>\n <Icon id='eye-slash' />\n </span>\n );\n }\n\n return (\n <div className='account-gallery__item' style={{ width, height }}>\n <a className='media-gallery__item-thumbnail' href={status.get('url')} onClick={this.handleClick} title={title} target='_blank' rel='noopener noreferrer'>\n <canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('media-gallery__preview', { 'media-gallery__preview--hidden': visible && loaded })} />\n {visible && thumbnail}\n {!visible && icon}\n </a>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { fetchAccount } from 'mastodon/actions/accounts';\nimport { expandAccountMediaTimeline } from '../../actions/timelines';\nimport LoadingIndicator from 'mastodon/components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButton from 'mastodon/components/column_back_button';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { getAccountGallery } from 'mastodon/selectors';\nimport MediaItem from './components/media_item';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport { ScrollContainer } from 'react-router-scroll-4';\nimport LoadMore from 'mastodon/components/load_more';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\nimport { openModal } from 'mastodon/actions/modal';\n\nconst mapStateToProps = (state, props) => ({\n isAccount: !!state.getIn(['accounts', props.params.accountId]),\n attachments: getAccountGallery(state, props.params.accountId),\n isLoading: state.getIn(['timelines', `account:${props.params.accountId}:media`, 'isLoading']),\n hasMore: state.getIn(['timelines', `account:${props.params.accountId}:media`, 'hasMore']),\n});\n\nclass LoadMoreMedia extends ImmutablePureComponent {\n\n static propTypes = {\n shouldUpdateScroll: PropTypes.func,\n maxId: PropTypes.string,\n onLoadMore: PropTypes.func.isRequired,\n };\n\n handleLoadMore = () => {\n this.props.onLoadMore(this.props.maxId);\n }\n\n render () {\n return (\n <LoadMore\n disabled={this.props.disabled}\n onClick={this.handleLoadMore}\n />\n );\n }\n\n}\n\nexport default @connect(mapStateToProps)\nclass AccountGallery extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n attachments: ImmutablePropTypes.list.isRequired,\n isLoading: PropTypes.bool,\n hasMore: PropTypes.bool,\n isAccount: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n state = {\n width: 323,\n };\n\n componentDidMount () {\n this.props.dispatch(fetchAccount(this.props.params.accountId));\n this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {\n this.props.dispatch(fetchAccount(nextProps.params.accountId));\n this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId));\n }\n }\n\n handleScrollToBottom = () => {\n if (this.props.hasMore) {\n this.handleLoadMore(this.props.attachments.size > 0 ? this.props.attachments.last().getIn(['status', 'id']) : undefined);\n }\n }\n\n handleScroll = e => {\n const { scrollTop, scrollHeight, clientHeight } = e.target;\n const offset = scrollHeight - scrollTop - clientHeight;\n\n if (150 > offset && !this.props.isLoading) {\n this.handleScrollToBottom();\n }\n }\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandAccountMediaTimeline(this.props.params.accountId, { maxId }));\n };\n\n handleLoadOlder = e => {\n e.preventDefault();\n this.handleScrollToBottom();\n }\n\n handleOpenMedia = attachment => {\n if (attachment.get('type') === 'video') {\n this.props.dispatch(openModal('VIDEO', { media: attachment, status: attachment.get('status') }));\n } else if (attachment.get('type') === 'audio') {\n this.props.dispatch(openModal('AUDIO', { media: attachment, status: attachment.get('status') }));\n } else {\n const media = attachment.getIn(['status', 'media_attachments']);\n const index = media.findIndex(x => x.get('id') === attachment.get('id'));\n\n this.props.dispatch(openModal('MEDIA', { media, index, status: attachment.get('status') }));\n }\n }\n\n handleRef = c => {\n if (c) {\n this.setState({ width: c.offsetWidth });\n }\n }\n\n render () {\n const { attachments, shouldUpdateScroll, isLoading, hasMore, isAccount, multiColumn } = this.props;\n const { width } = this.state;\n\n if (!isAccount) {\n return (\n <Column>\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!attachments && isLoading) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n let loadOlder = null;\n\n if (hasMore && !(isLoading && attachments.size === 0)) {\n loadOlder = <LoadMore visible={!isLoading} onClick={this.handleLoadOlder} />;\n }\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollContainer scrollKey='account_gallery' shouldUpdateScroll={shouldUpdateScroll}>\n <div className='scrollable scrollable--flex' onScroll={this.handleScroll}>\n <HeaderContainer accountId={this.props.params.accountId} />\n\n <div role='feed' className='account-gallery__container' ref={this.handleRef}>\n {attachments.map((attachment, index) => attachment === null ? (\n <LoadMoreMedia key={'more:' + attachments.getIn(index + 1, 'id')} maxId={index > 0 ? attachments.getIn(index - 1, 'id') : null} onLoadMore={this.handleLoadMore} />\n ) : (\n <MediaItem key={attachment.get('id')} attachment={attachment} displayWidth={width} onOpenMedia={this.handleOpenMedia} />\n ))}\n\n {loadOlder}\n </div>\n\n {isLoading && attachments.size === 0 && (\n <div className='scrollable__append'>\n <LoadingIndicator />\n </div>\n )}\n </div>\n </ScrollContainer>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/account_timeline.js b/priv/static/packs/features/account_timeline.js
index c8b46f89c..792bf05f0 100644
--- a/priv/static/packs/features/account_timeline.js
+++ b/priv/static/packs/features/account_timeline.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{793:function(t,a,e){"use strict";e.r(a),e.d(a,"default",(function(){return _}));var s,o,i,c=e(0),n=e(2),p=e(7),r=e(1),u=(e(3),e(13)),d=e(14),l=e.n(d),h=e(5),b=e.n(h),m=e(25),j=e(33),I=e(1038),O=e(300),f=e(731),w=e(1057),g=e(738),v=e(4),R=e(18),y=e(6),M=e(291),L=e(1030),S=Object(v.List)(),_=Object(u.connect)((function(t,a){var e=a.params.accountId,s=a.withReplies,o=void 0!==s&&s,i=o?e+":with_replies":e;return{isAccount:!!t.getIn(["accounts",e]),statusIds:t.getIn(["timelines","account:"+i,"items"],S),featuredStatusIds:o?Object(v.List)():t.getIn(["timelines","account:"+e+":pinned","items"],S),isLoading:t.getIn(["timelines","account:"+i,"isLoading"]),hasMore:t.getIn(["timelines","account:"+i,"hasMore"]),blockedBy:t.getIn(["relationships",e,"blocked_by"],!1)}}))((i=o=function(t){function a(){for(var a,e=arguments.length,s=new Array(e),o=0;o<e;o++)s[o]=arguments[o];return a=t.call.apply(t,[this].concat(s))||this,Object(r.a)(Object(n.a)(a),"handleLoadMore",(function(t){a.props.dispatch(Object(j.q)(a.props.params.accountId,{maxId:t,withReplies:a.props.withReplies}))})),a}Object(p.a)(a,t);var e=a.prototype;return e.componentWillMount=function(){var t=this.props,a=t.params.accountId,e=t.withReplies;this.props.dispatch(Object(m.A)(a)),this.props.dispatch(Object(M.d)(a)),e||this.props.dispatch(Object(j.o)(a)),this.props.dispatch(Object(j.q)(a,{withReplies:e}))},e.componentWillReceiveProps=function(t){(t.params.accountId!==this.props.params.accountId&&t.params.accountId||t.withReplies!==this.props.withReplies)&&(this.props.dispatch(Object(m.A)(t.params.accountId)),this.props.dispatch(Object(M.d)(t.params.accountId)),t.withReplies||this.props.dispatch(Object(j.o)(t.params.accountId)),this.props.dispatch(Object(j.q)(t.params.accountId,{withReplies:t.params.withReplies})))},e.render=function(){var t=this.props,a=t.shouldUpdateScroll,e=t.statusIds,s=t.featuredStatusIds,o=t.isLoading,i=t.hasMore,n=t.blockedBy,p=t.isAccount,r=t.multiColumn;if(!p)return Object(c.a)(f.a,{},void 0,Object(c.a)(g.a,{multiColumn:r}),Object(c.a)(L.a,{}));if(!e&&o)return Object(c.a)(f.a,{},void 0,Object(c.a)(O.a,{}));var u=n?Object(c.a)(y.b,{id:"empty_column.account_unavailable",defaultMessage:"Profile unavailable"}):Object(c.a)(y.b,{id:"empty_column.account_timeline",defaultMessage:"No toots here!"});return Object(c.a)(f.a,{},void 0,Object(c.a)(g.a,{multiColumn:r}),Object(c.a)(I.a,{prepend:Object(c.a)(w.a,{accountId:this.props.params.accountId}),alwaysPrepend:!0,scrollKey:"account_timeline",statusIds:n?S:e,featuredStatusIds:s,isLoading:o,hasMore:i,onLoadMore:this.handleLoadMore,shouldUpdateScroll:a,emptyMessage:u,bindToDocument:!r}))},a}(R.a),Object(r.a)(o,"propTypes",{params:b.a.object.isRequired,dispatch:b.a.func.isRequired,shouldUpdateScroll:b.a.func,statusIds:l.a.list,featuredStatusIds:l.a.list,isLoading:b.a.bool,hasMore:b.a.bool,withReplies:b.a.bool,blockedBy:b.a.bool,isAccount:b.a.bool,multiColumn:b.a.bool}),s=i))||s}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{819:function(t,a,e){"use strict";e.r(a),e.d(a,"default",(function(){return _}));var s,o,i,c=e(0),n=e(2),p=(e(9),e(6),e(8)),r=e(1),u=(e(3),e(15)),d=e(16),l=e.n(d),h=e(5),b=e.n(h),m=e(26),j=e(36),I=e(1065),O=e(306),f=e(757),w=e(1084),v=e(764),g=e(4),R=e(21),y=e(7),M=e(291),L=e(1057);var S=Object(g.List)(),_=Object(u.connect)((function(t,a){var e=a.params.accountId,s=a.withReplies,o=void 0!==s&&s,i=o?e+":with_replies":e;return{isAccount:!!t.getIn(["accounts",e]),statusIds:t.getIn(["timelines","account:"+i,"items"],S),featuredStatusIds:o?Object(g.List)():t.getIn(["timelines","account:"+e+":pinned","items"],S),isLoading:t.getIn(["timelines","account:"+i,"isLoading"]),hasMore:t.getIn(["timelines","account:"+i,"hasMore"]),blockedBy:t.getIn(["relationships",e,"blocked_by"],!1)}}))((i=o=function(t){Object(p.a)(e,t);var a;a=e;function e(){for(var a,e=arguments.length,s=new Array(e),o=0;o<e;o++)s[o]=arguments[o];return a=t.call.apply(t,[this].concat(s))||this,Object(r.a)(Object(n.a)(a),"handleLoadMore",(function(t){a.props.dispatch(Object(j.q)(a.props.params.accountId,{maxId:t,withReplies:a.props.withReplies}))})),a}var s=e.prototype;return s.componentWillMount=function(){var t=this.props,a=t.params.accountId,e=t.withReplies;this.props.dispatch(Object(m.A)(a)),this.props.dispatch(Object(M.d)(a)),e||this.props.dispatch(Object(j.o)(a)),this.props.dispatch(Object(j.q)(a,{withReplies:e}))},s.componentWillReceiveProps=function(t){(t.params.accountId!==this.props.params.accountId&&t.params.accountId||t.withReplies!==this.props.withReplies)&&(this.props.dispatch(Object(m.A)(t.params.accountId)),this.props.dispatch(Object(M.d)(t.params.accountId)),t.withReplies||this.props.dispatch(Object(j.o)(t.params.accountId)),this.props.dispatch(Object(j.q)(t.params.accountId,{withReplies:t.params.withReplies})))},s.render=function(){var t=this.props,a=t.shouldUpdateScroll,e=t.statusIds,s=t.featuredStatusIds,o=t.isLoading,i=t.hasMore,n=t.blockedBy,p=t.isAccount,r=t.multiColumn;if(!p)return Object(c.a)(f.a,{},void 0,Object(c.a)(v.a,{multiColumn:r}),Object(c.a)(L.a,{}));if(!e&&o)return Object(c.a)(f.a,{},void 0,Object(c.a)(O.a,{}));var u=n?Object(c.a)(y.b,{id:"empty_column.account_unavailable",defaultMessage:"Profile unavailable"}):Object(c.a)(y.b,{id:"empty_column.account_timeline",defaultMessage:"No toots here!"});return(Object(c.a)(f.a,{},void 0,Object(c.a)(v.a,{multiColumn:r}),Object(c.a)(I.a,{prepend:Object(c.a)(w.a,{accountId:this.props.params.accountId}),alwaysPrepend:!0,scrollKey:"account_timeline",statusIds:n?S:e,featuredStatusIds:s,isLoading:o,hasMore:i,onLoadMore:this.handleLoadMore,shouldUpdateScroll:a,emptyMessage:u,bindToDocument:!r,timelineId:"account"})))},e}(R.a),Object(r.a)(o,"propTypes",{params:b.a.object.isRequired,dispatch:b.a.func.isRequired,shouldUpdateScroll:b.a.func,statusIds:l.a.list,featuredStatusIds:l.a.list,isLoading:b.a.bool,hasMore:b.a.bool,withReplies:b.a.bool,blockedBy:b.a.bool,isAccount:b.a.bool,multiColumn:b.a.bool}),s=i))||s}}]);
//# sourceMappingURL=account_timeline.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/account_timeline.js.map b/priv/static/packs/features/account_timeline.js.map
index 779a67ad6..8766fb489 100644
--- a/priv/static/packs/features/account_timeline.js.map
+++ b/priv/static/packs/features/account_timeline.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/account_timeline/index.js"],"names":["emptyList","ImmutableList","AccountTimeline","connect","state","accountId","params","withReplies","path","isAccount","getIn","statusIds","featuredStatusIds","isLoading","hasMore","blockedBy","maxId","props","dispatch","expandAccountTimeline","componentWillMount","this","fetchAccount","fetchAccountIdentityProofs","expandAccountFeaturedTimeline","componentWillReceiveProps","nextProps","render","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","prepend","alwaysPrepend","scrollKey","onLoadMore","handleLoadMore","bindToDocument","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"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","file":"features/account_timeline.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { fetchAccount } from '../../actions/accounts';\nimport { expandAccountFeaturedTimeline, expandAccountTimeline } from '../../actions/timelines';\nimport StatusList from '../../components/status_list';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport HeaderContainer from './containers/header_container';\nimport ColumnBackButton from '../../components/column_back_button';\nimport { List as ImmutableList } from 'immutable';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { FormattedMessage } from 'react-intl';\nimport { fetchAccountIdentityProofs } from '../../actions/identity_proofs';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\n\nconst emptyList = ImmutableList();\n\nconst mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {\n const path = withReplies ? `${accountId}:with_replies` : accountId;\n\n return {\n isAccount: !!state.getIn(['accounts', accountId]),\n statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),\n featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], emptyList),\n isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),\n hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),\n blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),\n };\n};\n\nexport default @connect(mapStateToProps)\nclass AccountTimeline extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n statusIds: ImmutablePropTypes.list,\n featuredStatusIds: ImmutablePropTypes.list,\n isLoading: PropTypes.bool,\n hasMore: PropTypes.bool,\n withReplies: PropTypes.bool,\n blockedBy: PropTypes.bool,\n isAccount: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n const { params: { accountId }, withReplies } = this.props;\n\n this.props.dispatch(fetchAccount(accountId));\n this.props.dispatch(fetchAccountIdentityProofs(accountId));\n\n if (!withReplies) {\n this.props.dispatch(expandAccountFeaturedTimeline(accountId));\n }\n\n this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));\n }\n\n componentWillReceiveProps (nextProps) {\n if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {\n this.props.dispatch(fetchAccount(nextProps.params.accountId));\n this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));\n\n if (!nextProps.withReplies) {\n this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));\n }\n\n this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));\n }\n }\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandAccountTimeline(this.props.params.accountId, { maxId, withReplies: this.props.withReplies }));\n }\n\n render () {\n const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, isAccount, multiColumn } = this.props;\n\n if (!isAccount) {\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!statusIds && isLoading) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <StatusList\n prepend={<HeaderContainer accountId={this.props.params.accountId} />}\n alwaysPrepend\n scrollKey='account_timeline'\n statusIds={blockedBy ? emptyList : statusIds}\n featuredStatusIds={featuredStatusIds}\n isLoading={isLoading}\n hasMore={hasMore}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/account_timeline/index.js"],"names":["emptyList","ImmutableList","AccountTimeline","connect","state","accountId","params","withReplies","path","isAccount","getIn","statusIds","featuredStatusIds","isLoading","hasMore","blockedBy","maxId","props","dispatch","expandAccountTimeline","componentWillMount","this","fetchAccount","fetchAccountIdentityProofs","expandAccountFeaturedTimeline","componentWillReceiveProps","nextProps","render","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","prepend","alwaysPrepend","scrollKey","onLoadMore","handleLoadMore","bindToDocument","timelineId","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"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","file":"features/account_timeline.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { fetchAccount } from '../../actions/accounts';\nimport { expandAccountFeaturedTimeline, expandAccountTimeline } from '../../actions/timelines';\nimport StatusList from '../../components/status_list';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport HeaderContainer from './containers/header_container';\nimport ColumnBackButton from '../../components/column_back_button';\nimport { List as ImmutableList } from 'immutable';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { FormattedMessage } from 'react-intl';\nimport { fetchAccountIdentityProofs } from '../../actions/identity_proofs';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\n\nconst emptyList = ImmutableList();\n\nconst mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {\n const path = withReplies ? `${accountId}:with_replies` : accountId;\n\n return {\n isAccount: !!state.getIn(['accounts', accountId]),\n statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),\n featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], emptyList),\n isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),\n hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),\n blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),\n };\n};\n\nexport default @connect(mapStateToProps)\nclass AccountTimeline extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n statusIds: ImmutablePropTypes.list,\n featuredStatusIds: ImmutablePropTypes.list,\n isLoading: PropTypes.bool,\n hasMore: PropTypes.bool,\n withReplies: PropTypes.bool,\n blockedBy: PropTypes.bool,\n isAccount: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n const { params: { accountId }, withReplies } = this.props;\n\n this.props.dispatch(fetchAccount(accountId));\n this.props.dispatch(fetchAccountIdentityProofs(accountId));\n\n if (!withReplies) {\n this.props.dispatch(expandAccountFeaturedTimeline(accountId));\n }\n\n this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));\n }\n\n componentWillReceiveProps (nextProps) {\n if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {\n this.props.dispatch(fetchAccount(nextProps.params.accountId));\n this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));\n\n if (!nextProps.withReplies) {\n this.props.dispatch(expandAccountFeaturedTimeline(nextProps.params.accountId));\n }\n\n this.props.dispatch(expandAccountTimeline(nextProps.params.accountId, { withReplies: nextProps.params.withReplies }));\n }\n }\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandAccountTimeline(this.props.params.accountId, { maxId, withReplies: this.props.withReplies }));\n }\n\n render () {\n const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, isAccount, multiColumn } = this.props;\n\n if (!isAccount) {\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!statusIds && isLoading) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <StatusList\n prepend={<HeaderContainer accountId={this.props.params.accountId} />}\n alwaysPrepend\n scrollKey='account_timeline'\n statusIds={blockedBy ? emptyList : statusIds}\n featuredStatusIds={featuredStatusIds}\n isLoading={isLoading}\n hasMore={hasMore}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n timelineId='account'\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/blocks.js b/priv/static/packs/features/blocks.js
index 5aacfc455..b41df4ce4 100644
--- a/priv/static/packs/features/blocks.js
+++ b/priv/static/packs/features/blocks.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{801:function(e,t,o){"use strict";o.r(t),o.d(t,"default",(function(){return q}));var a,n,c,s=o(0),r=o(2),i=o(7),u=o(1),l=o(62),d=o.n(l),b=(o(3),o(13)),p=o(6),h=o(18),f=o(14),j=o.n(f),O=o(5),m=o.n(O),g=o(300),M=o(731),k=o(737),v=o(1026),y=o(226),w=o(1023),I=Object(p.f)({heading:{id:"column.blocks",defaultMessage:"Blocked users"}}),q=Object(b.connect)((function(e){return{accountIds:e.getIn(["user_lists","blocks","items"]),hasMore:!!e.getIn(["user_lists","blocks","next"])}}))(a=Object(p.g)((c=n=function(e){function t(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(u.a)(Object(r.a)(t),"handleLoadMore",d()((function(){t.props.dispatch(Object(y.d)())}),300,{leading:!0})),t}Object(i.a)(t,e);var o=t.prototype;return o.componentWillMount=function(){this.props.dispatch(Object(y.e)())},o.render=function(){var e=this.props,t=e.intl,o=e.accountIds,a=e.shouldUpdateScroll,n=e.hasMore,c=e.multiColumn;if(!o)return Object(s.a)(M.a,{},void 0,Object(s.a)(g.a,{}));var r=Object(s.a)(p.b,{id:"empty_column.blocks",defaultMessage:"You haven't blocked any users yet."});return Object(s.a)(M.a,{bindToDocument:!c,icon:"ban",heading:t.formatMessage(I.heading)},void 0,Object(s.a)(k.a,{}),Object(s.a)(w.a,{scrollKey:"blocks",onLoadMore:this.handleLoadMore,hasMore:n,shouldUpdateScroll:a,emptyMessage:r,bindToDocument:!c},void 0,o.map((function(e){return Object(s.a)(v.a,{id:e},e)}))))},t}(h.a),Object(u.a)(n,"propTypes",{params:m.a.object.isRequired,dispatch:m.a.func.isRequired,shouldUpdateScroll:m.a.func,accountIds:j.a.list,hasMore:m.a.bool,intl:m.a.object.isRequired,multiColumn:m.a.bool}),a=c))||a)||a}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{827:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return q}));var o,n,c,s=a(0),r=a(2),i=(a(9),a(6),a(8)),u=a(1),l=a(65),d=a.n(l),b=(a(3),a(15)),p=a(7),h=a(21),f=a(16),j=a.n(f),O=a(5),m=a.n(O),g=a(306),M=a(757),v=a(763),k=a(1053),y=a(230),w=a(1049);var I=Object(p.f)({heading:{id:"column.blocks",defaultMessage:"Blocked users"}}),q=Object(b.connect)((function(e){return{accountIds:e.getIn(["user_lists","blocks","items"]),hasMore:!!e.getIn(["user_lists","blocks","next"])}}))(o=Object(p.g)((c=n=function(e){Object(i.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(u.a)(Object(r.a)(t),"handleLoadMore",d()((function(){t.props.dispatch(Object(y.d)())}),300,{leading:!0})),t}var o=a.prototype;return o.componentWillMount=function(){this.props.dispatch(Object(y.e)())},o.render=function(){var e=this.props,t=e.intl,a=e.accountIds,o=e.shouldUpdateScroll,n=e.hasMore,c=e.multiColumn;if(!a)return Object(s.a)(M.a,{},void 0,Object(s.a)(g.a,{}));var r=Object(s.a)(p.b,{id:"empty_column.blocks",defaultMessage:"You haven't blocked any users yet."});return(Object(s.a)(M.a,{bindToDocument:!c,icon:"ban",heading:t.formatMessage(I.heading)},void 0,Object(s.a)(v.a,{}),Object(s.a)(w.a,{scrollKey:"blocks",onLoadMore:this.handleLoadMore,hasMore:n,shouldUpdateScroll:o,emptyMessage:r,bindToDocument:!c},void 0,a.map((function(e){return Object(s.a)(k.a,{id:e},e)})))))},a}(h.a),Object(u.a)(n,"propTypes",{params:m.a.object.isRequired,dispatch:m.a.func.isRequired,shouldUpdateScroll:m.a.func,accountIds:j.a.list,hasMore:m.a.bool,intl:m.a.object.isRequired,multiColumn:m.a.bool}),o=c))||o)||o}}]);
//# sourceMappingURL=blocks.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/blocks.js.map b/priv/static/packs/features/blocks.js.map
index 57ff7e878..3935acd77 100644
--- a/priv/static/packs/features/blocks.js.map
+++ b/priv/static/packs/features/blocks.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/blocks/index.js"],"names":["messages","defineMessages","heading","Blocks","connect","state","accountIds","getIn","hasMore","injectIntl","props","dispatch","expandBlocks","leading","componentWillMount","this","fetchBlocks","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","icon","formatMessage","scrollKey","onLoadMore","handleLoadMore","map","ImmutablePureComponent","params","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"wTAcMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,qDAUHC,EAFUC,mBALQ,SAAAC,GAAK,MAAK,CAChCC,WAAYD,EAAME,MAAM,CAAC,aAAc,SAAU,UACjDC,UAAWH,EAAME,MAAM,CAAC,aAAc,SAAU,Y,GAIjDE,a,mMAiBkB,KAAS,WACxB,EAAKC,MAAMC,SAASC,iBACnB,IAAK,CAAEC,SAAS,K,8CANnBC,mBAAA,WACEC,KAAKL,MAAMC,SAASK,gB,EAOtBC,OAAA,WAAW,IAAD,EAC+DF,KAAKL,MAApEQ,EADA,EACAA,KAAMZ,EADN,EACMA,WAAYa,EADlB,EACkBA,mBAAoBX,EADtC,EACsCA,QAASY,EAD/C,EAC+CA,YAEvD,IAAKd,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAe,YAAC,IAAD,CAAkBC,GAAG,sBAAsBC,eAAe,uCAE/E,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,EAAaK,KAAK,MAAMvB,QAASgB,EAAKQ,cAAc1B,EAASE,eAAtF,EACE,YAAC,IAAD,IACA,YAAC,IAAD,CACEyB,UAAU,SACVC,WAAYb,KAAKc,eACjBrB,QAASA,EACTW,mBAAoBA,EACpBE,aAAcA,EACdG,gBAAiBJ,QANnB,EAQGd,EAAWwB,KAAI,SAAAR,GAAE,OAChB,YAAC,IAAD,CAA2BA,GAAIA,GAARA,S,GA7CdS,K,0BAEA,CACjBC,OAAQC,IAAUC,OAAOC,WACzBxB,SAAUsB,IAAUG,KAAKD,WACzBhB,mBAAoBc,IAAUG,KAC9B9B,WAAY+B,IAAmBC,KAC/B9B,QAASyB,IAAUM,KACnBrB,KAAMe,IAAUC,OAAOC,WACvBf,YAAaa,IAAUM,O","file":"features/blocks.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport PropTypes from 'prop-types';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport AccountContainer from '../../containers/account_container';\nimport { fetchBlocks, expandBlocks } from '../../actions/blocks';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.blocks', defaultMessage: 'Blocked users' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'blocks', 'items']),\n hasMore: !!state.getIn(['user_lists', 'blocks', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Blocks extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n hasMore: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchBlocks());\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandBlocks());\n }, 300, { leading: true });\n\n render () {\n const { intl, accountIds, shouldUpdateScroll, hasMore, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.blocks' defaultMessage=\"You haven't blocked any users yet.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='ban' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <ScrollableList\n scrollKey='blocks'\n onLoadMore={this.handleLoadMore}\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountContainer key={id} id={id} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/blocks/index.js"],"names":["messages","defineMessages","heading","Blocks","connect","state","accountIds","getIn","hasMore","injectIntl","props","dispatch","expandBlocks","leading","componentWillMount","this","fetchBlocks","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","icon","formatMessage","scrollKey","onLoadMore","handleLoadMore","map","ImmutablePureComponent","params","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"oUAcA,IAAMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,qDAUHC,EAFUC,mBALQ,SAAAC,GAAK,MAAK,CAChCC,WAAYD,EAAME,MAAM,CAAC,aAAc,SAAU,UACjDC,UAAWH,EAAME,MAAM,CAAC,aAAc,SAAU,Y,GAIjDE,a,8NAiBkB,KAAS,WACxB,EAAKC,MAAMC,SAASC,iBACnB,IAAK,CAAEC,SAAS,K,6BANnBC,mBAAA,WACEC,KAAKL,MAAMC,SAASK,gB,EAOtBC,OAAA,WAAW,IAAD,EAC+DF,KAAKL,MAApEQ,EADA,EACAA,KAAMZ,EADN,EACMA,WAAYa,EADlB,EACkBA,mBAAoBX,EADtC,EACsCA,QAASY,EAD/C,EAC+CA,YAEvD,IAAKd,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAe,YAAC,IAAD,CAAkBC,GAAG,sBAAsBC,eAAe,uCAE/E,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,EAAaK,KAAK,MAAMvB,QAASgB,EAAKQ,cAAc1B,EAASE,eAAtF,EACE,YAAC,IAAD,IACA,YAAC,IAAD,CACEyB,UAAU,SACVC,WAAYb,KAAKc,eACjBrB,QAASA,EACTW,mBAAoBA,EACpBE,aAAcA,EACdG,gBAAiBJ,QANnB,EAQGd,EAAWwB,KAAI,SAAAR,GAAE,OAChB,YAAC,IAAD,CAA2BA,GAAIA,GAARA,U,GA7CdS,K,0BAEA,CACjBC,OAAQC,IAAUC,OAAOC,WACzBxB,SAAUsB,IAAUG,KAAKD,WACzBhB,mBAAoBc,IAAUG,KAC9B9B,WAAY+B,IAAmBC,KAC/B9B,QAASyB,IAAUM,KACnBrB,KAAMe,IAAUC,OAAOC,WACvBf,YAAaa,IAAUM,O","file":"features/blocks.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport PropTypes from 'prop-types';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport AccountContainer from '../../containers/account_container';\nimport { fetchBlocks, expandBlocks } from '../../actions/blocks';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.blocks', defaultMessage: 'Blocked users' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'blocks', 'items']),\n hasMore: !!state.getIn(['user_lists', 'blocks', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Blocks extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n hasMore: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchBlocks());\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandBlocks());\n }, 300, { leading: true });\n\n render () {\n const { intl, accountIds, shouldUpdateScroll, hasMore, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.blocks' defaultMessage=\"You haven't blocked any users yet.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='ban' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <ScrollableList\n scrollKey='blocks'\n onLoadMore={this.handleLoadMore}\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountContainer key={id} id={id} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/bookmarked_statuses.js b/priv/static/packs/features/bookmarked_statuses.js
index 7a2eb9ded..15ff22331 100644
--- a/priv/static/packs/features/bookmarked_statuses.js
+++ b/priv/static/packs/features/bookmarked_statuses.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{800:function(t,e,o){"use strict";o.r(e),o.d(e,"default",(function(){return C}));var a,n,s,i=o(0),c=o(2),l=o(7),r=o(1),d=o(62),u=o.n(d),b=o(3),h=o.n(b),p=o(13),m=o(5),k=o.n(m),O=o(14),f=o.n(O),j=o(205),g=o(731),M=o(733),I=o(250),v=o(1038),w=o(6),y=o(18),L=Object(w.f)({heading:{id:"column.bookmarks",defaultMessage:"Bookmarks"}}),C=Object(p.connect)((function(t){return{statusIds:t.getIn(["status_lists","bookmarks","items"]),isLoading:t.getIn(["status_lists","bookmarks","isLoading"],!0),hasMore:!!t.getIn(["status_lists","bookmarks","next"])}}))(a=Object(w.g)((s=n=function(t){function e(){for(var e,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return e=t.call.apply(t,[this].concat(a))||this,Object(r.a)(Object(c.a)(e),"handlePin",(function(){var t=e.props,o=t.columnId,a=t.dispatch;a(o?Object(I.h)(o):Object(I.e)("BOOKMARKS",{}))})),Object(r.a)(Object(c.a)(e),"handleMove",(function(t){var o=e.props,a=o.columnId;(0,o.dispatch)(Object(I.g)(a,t))})),Object(r.a)(Object(c.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(r.a)(Object(c.a)(e),"setRef",(function(t){e.column=t})),Object(r.a)(Object(c.a)(e),"handleLoadMore",u()((function(){e.props.dispatch(Object(j.g)())}),300,{leading:!0})),e}Object(l.a)(e,t);var o=e.prototype;return o.componentWillMount=function(){this.props.dispatch(Object(j.h)())},o.render=function(){var t=this.props,e=t.intl,o=t.shouldUpdateScroll,a=t.statusIds,n=t.columnId,s=t.multiColumn,c=t.hasMore,l=t.isLoading,r=!!n,d=Object(i.a)(w.b,{id:"empty_column.bookmarked_statuses",defaultMessage:"You don't have any bookmarked toots yet. When you bookmark one, it will show up here."});return h.a.createElement(g.a,{bindToDocument:!s,ref:this.setRef,label:e.formatMessage(L.heading)},Object(i.a)(M.a,{icon:"bookmark",title:e.formatMessage(L.heading),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:r,multiColumn:s,showBackButton:!0}),Object(i.a)(v.a,{trackScroll:!r,statusIds:a,scrollKey:"bookmarked_statuses-"+n,hasMore:c,isLoading:l,onLoadMore:this.handleLoadMore,shouldUpdateScroll:o,emptyMessage:d,bindToDocument:!s}))},e}(y.a),Object(r.a)(n,"propTypes",{dispatch:k.a.func.isRequired,shouldUpdateScroll:k.a.func,statusIds:f.a.list.isRequired,intl:k.a.object.isRequired,columnId:k.a.string,multiColumn:k.a.bool,hasMore:k.a.bool,isLoading:k.a.bool}),a=s))||a)||a}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{826:function(t,e,o){"use strict";o.r(e),o.d(e,"default",(function(){return C}));var a,n,s,i=o(0),c=o(2),r=(o(9),o(6),o(8)),l=o(1),d=o(65),u=o.n(d),b=o(3),h=o.n(b),p=o(15),m=o(5),k=o.n(m),O=o(16),f=o.n(O),j=o(209),g=o(757),M=o(759),v=o(253),I=o(1065),w=o(7),y=o(21);var L=Object(w.f)({heading:{id:"column.bookmarks",defaultMessage:"Bookmarks"}}),C=Object(p.connect)((function(t){return{statusIds:t.getIn(["status_lists","bookmarks","items"]),isLoading:t.getIn(["status_lists","bookmarks","isLoading"],!0),hasMore:!!t.getIn(["status_lists","bookmarks","next"])}}))(a=Object(w.g)((s=n=function(t){Object(r.a)(o,t);var e;e=o;function o(){for(var e,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return e=t.call.apply(t,[this].concat(a))||this,Object(l.a)(Object(c.a)(e),"handlePin",(function(){var t=e.props,o=t.columnId,a=t.dispatch;a(o?Object(v.h)(o):Object(v.e)("BOOKMARKS",{}))})),Object(l.a)(Object(c.a)(e),"handleMove",(function(t){var o=e.props,a=o.columnId;(0,o.dispatch)(Object(v.g)(a,t))})),Object(l.a)(Object(c.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(l.a)(Object(c.a)(e),"setRef",(function(t){e.column=t})),Object(l.a)(Object(c.a)(e),"handleLoadMore",u()((function(){e.props.dispatch(Object(j.g)())}),300,{leading:!0})),e}var a=o.prototype;return a.componentWillMount=function(){this.props.dispatch(Object(j.h)())},a.render=function(){var t=this.props,e=t.intl,o=t.shouldUpdateScroll,a=t.statusIds,n=t.columnId,s=t.multiColumn,c=t.hasMore,r=t.isLoading,l=!!n,d=Object(i.a)(w.b,{id:"empty_column.bookmarked_statuses",defaultMessage:"You don't have any bookmarked toots yet. When you bookmark one, it will show up here."});return h.a.createElement(g.a,{bindToDocument:!s,ref:this.setRef,label:e.formatMessage(L.heading)},Object(i.a)(M.a,{icon:"bookmark",title:e.formatMessage(L.heading),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:l,multiColumn:s,showBackButton:!0}),Object(i.a)(I.a,{trackScroll:!l,statusIds:a,scrollKey:"bookmarked_statuses-"+n,hasMore:c,isLoading:r,onLoadMore:this.handleLoadMore,shouldUpdateScroll:o,emptyMessage:d,bindToDocument:!s}))},o}(y.a),Object(l.a)(n,"propTypes",{dispatch:k.a.func.isRequired,shouldUpdateScroll:k.a.func,statusIds:f.a.list.isRequired,intl:k.a.object.isRequired,columnId:k.a.string,multiColumn:k.a.bool,hasMore:k.a.bool,isLoading:k.a.bool}),a=s))||a)||a}}]);
//# sourceMappingURL=bookmarked_statuses.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/bookmarked_statuses.js.map b/priv/static/packs/features/bookmarked_statuses.js.map
index d6ab7f248..01b5594a6 100644
--- a/priv/static/packs/features/bookmarked_statuses.js.map
+++ b/priv/static/packs/features/bookmarked_statuses.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/bookmarked_statuses/index.js"],"names":["messages","defineMessages","heading","Bookmarks","connect","state","statusIds","getIn","isLoading","hasMore","injectIntl","props","columnId","dispatch","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","expandBookmarkedStatuses","leading","componentWillMount","this","fetchBookmarkedStatuses","render","intl","shouldUpdateScroll","multiColumn","pinned","emptyMessage","id","defaultMessage","bindToDocument","ref","setRef","label","formatMessage","icon","title","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","showBackButton","trackScroll","scrollKey","onLoadMore","handleLoadMore","ImmutablePureComponent","PropTypes","func","isRequired","ImmutablePropTypes","list","object","string","bool"],"mappings":"uTAaMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,oDAWHC,EAFUC,mBANQ,SAAAC,GAAK,MAAK,CAChCC,UAAWD,EAAME,MAAM,CAAC,eAAgB,YAAa,UACrDC,UAAWH,EAAME,MAAM,CAAC,eAAgB,YAAa,cAAc,GACnEE,UAAWJ,EAAME,MAAM,CAAC,eAAgB,YAAa,Y,GAItDG,a,+LAkBa,WAAO,IAAD,EACe,EAAKC,MAA5BC,EADQ,EACRA,SAAUC,EADF,EACEA,SAGhBA,EADED,EACOE,YAAaF,GAEbG,YAAU,YAAa,Q,yCAIvB,SAACC,GAAS,IAAD,EACW,EAAKL,MAA5BC,EADY,EACZA,UACRC,EAFoB,EACFA,UACTI,YAAWL,EAAUI,O,gDAGZ,WAClB,EAAKE,OAAOC,e,qCAGL,SAAAC,GACP,EAAKF,OAASE,K,4CAGC,KAAS,WACxB,EAAKT,MAAME,SAASQ,iBACnB,IAAK,CAAEC,SAAS,K,8CA7BnBC,mBAAA,WACEC,KAAKb,MAAME,SAASY,gB,EA8BtBC,OAAA,WAAW,IAAD,EACmFF,KAAKb,MAAxFgB,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBtB,EAD1B,EAC0BA,UAAWM,EADrC,EACqCA,SAAUiB,EAD/C,EAC+CA,YAAapB,EAD5D,EAC4DA,QAASD,EADrE,EACqEA,UACvEsB,IAAWlB,EAEXmB,EAAe,YAAC,IAAD,CAAkBC,GAAG,mCAAmCC,eAAe,0FAE5F,OACE,kBAAC,IAAD,CAAQC,gBAAiBL,EAAaM,IAAKX,KAAKY,OAAQC,MAAOV,EAAKW,cAActC,EAASE,UACzF,YAAC,IAAD,CACEqC,KAAK,WACLC,MAAOb,EAAKW,cAActC,EAASE,SACnCuC,MAAOjB,KAAKkB,UACZC,OAAQnB,KAAKoB,WACbC,QAASrB,KAAKsB,kBACdhB,OAAQA,EACRD,YAAaA,EACbkB,gBAAc,IAGhB,YAAC,IAAD,CACEC,aAAclB,EACdxB,UAAWA,EACX2C,UAAS,uBAAyBrC,EAClCH,QAASA,EACTD,UAAWA,EACX0C,WAAY1B,KAAK2B,eACjBvB,mBAAoBA,EACpBG,aAAcA,EACdG,gBAAiBL,M,GAxEHuB,K,0BAEH,CACjBvC,SAAUwC,IAAUC,KAAKC,WACzB3B,mBAAoByB,IAAUC,KAC9BhD,UAAWkD,IAAmBC,KAAKF,WACnC5B,KAAM0B,IAAUK,OAAOH,WACvB3C,SAAUyC,IAAUM,OACpB9B,YAAawB,IAAUO,KACvBnD,QAAS4C,IAAUO,KACnBpD,UAAW6C,IAAUO,O","file":"features/bookmarked_statuses.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { fetchBookmarkedStatuses, expandBookmarkedStatuses } from '../../actions/bookmarks';\nimport Column from '../ui/components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport StatusList from '../../components/status_list';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { debounce } from 'lodash';\n\nconst messages = defineMessages({\n heading: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' },\n});\n\nconst mapStateToProps = state => ({\n statusIds: state.getIn(['status_lists', 'bookmarks', 'items']),\n isLoading: state.getIn(['status_lists', 'bookmarks', 'isLoading'], true),\n hasMore: !!state.getIn(['status_lists', 'bookmarks', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Bookmarks extends ImmutablePureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n statusIds: ImmutablePropTypes.list.isRequired,\n intl: PropTypes.object.isRequired,\n columnId: PropTypes.string,\n multiColumn: PropTypes.bool,\n hasMore: PropTypes.bool,\n isLoading: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchBookmarkedStatuses());\n }\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('BOOKMARKS', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandBookmarkedStatuses());\n }, 300, { leading: true })\n\n render () {\n const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props;\n const pinned = !!columnId;\n\n const emptyMessage = <FormattedMessage id='empty_column.bookmarked_statuses' defaultMessage=\"You don't have any bookmarked toots yet. When you bookmark one, it will show up here.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.heading)}>\n <ColumnHeader\n icon='bookmark'\n title={intl.formatMessage(messages.heading)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n showBackButton\n />\n\n <StatusList\n trackScroll={!pinned}\n statusIds={statusIds}\n scrollKey={`bookmarked_statuses-${columnId}`}\n hasMore={hasMore}\n isLoading={isLoading}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/bookmarked_statuses/index.js"],"names":["messages","defineMessages","heading","Bookmarks","connect","state","statusIds","getIn","isLoading","hasMore","injectIntl","props","columnId","dispatch","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","expandBookmarkedStatuses","leading","componentWillMount","this","fetchBookmarkedStatuses","render","intl","shouldUpdateScroll","multiColumn","pinned","emptyMessage","id","defaultMessage","bindToDocument","ref","setRef","label","formatMessage","icon","title","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","showBackButton","trackScroll","scrollKey","onLoadMore","handleLoadMore","ImmutablePureComponent","PropTypes","func","isRequired","ImmutablePropTypes","list","object","string","bool"],"mappings":"mUAaA,IAAMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,oDAWHC,EAFUC,mBANQ,SAAAC,GAAK,MAAK,CAChCC,UAAWD,EAAME,MAAM,CAAC,eAAgB,YAAa,UACrDC,UAAWH,EAAME,MAAM,CAAC,eAAgB,YAAa,cAAc,GACnEE,UAAWJ,EAAME,MAAM,CAAC,eAAgB,YAAa,Y,GAItDG,a,0NAkBa,WAAO,IAAD,EACe,EAAKC,MAA5BC,EADQ,EACRA,SAAUC,EADF,EACEA,SAGhBA,EADED,EACOE,YAAaF,GAEbG,YAAU,YAAa,Q,yCAIvB,SAACC,GAAS,IAAD,EACW,EAAKL,MAA5BC,EADY,EACZA,UACRC,EAFoB,EACFA,UACTI,YAAWL,EAAUI,O,gDAGZ,WAClB,EAAKE,OAAOC,e,qCAGL,SAAAC,GACP,EAAKF,OAASE,K,4CAGC,KAAS,WACxB,EAAKT,MAAME,SAASQ,iBACnB,IAAK,CAAEC,SAAS,K,6BA7BnBC,mBAAA,WACEC,KAAKb,MAAME,SAASY,gB,EA8BtBC,OAAA,WAAW,IAAD,EACmFF,KAAKb,MAAxFgB,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBtB,EAD1B,EAC0BA,UAAWM,EADrC,EACqCA,SAAUiB,EAD/C,EAC+CA,YAAapB,EAD5D,EAC4DA,QAASD,EADrE,EACqEA,UACvEsB,IAAWlB,EAEXmB,EAAe,YAAC,IAAD,CAAkBC,GAAG,mCAAmCC,eAAe,0FAE5F,OACE,kBAAC,IAAD,CAAQC,gBAAiBL,EAAaM,IAAKX,KAAKY,OAAQC,MAAOV,EAAKW,cAActC,EAASE,UACzF,YAAC,IAAD,CACEqC,KAAK,WACLC,MAAOb,EAAKW,cAActC,EAASE,SACnCuC,MAAOjB,KAAKkB,UACZC,OAAQnB,KAAKoB,WACbC,QAASrB,KAAKsB,kBACdhB,OAAQA,EACRD,YAAaA,EACbkB,gBAAc,IAGhB,YAAC,IAAD,CACEC,aAAclB,EACdxB,UAAWA,EACX2C,UAAS,uBAAyBrC,EAClCH,QAASA,EACTD,UAAWA,EACX0C,WAAY1B,KAAK2B,eACjBvB,mBAAoBA,EACpBG,aAAcA,EACdG,gBAAiBL,M,GAxEHuB,K,0BAEH,CACjBvC,SAAUwC,IAAUC,KAAKC,WACzB3B,mBAAoByB,IAAUC,KAC9BhD,UAAWkD,IAAmBC,KAAKF,WACnC5B,KAAM0B,IAAUK,OAAOH,WACvB3C,SAAUyC,IAAUM,OACpB9B,YAAawB,IAAUO,KACvBnD,QAAS4C,IAAUO,KACnBpD,UAAW6C,IAAUO,O","file":"features/bookmarked_statuses.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { fetchBookmarkedStatuses, expandBookmarkedStatuses } from '../../actions/bookmarks';\nimport Column from '../ui/components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport StatusList from '../../components/status_list';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { debounce } from 'lodash';\n\nconst messages = defineMessages({\n heading: { id: 'column.bookmarks', defaultMessage: 'Bookmarks' },\n});\n\nconst mapStateToProps = state => ({\n statusIds: state.getIn(['status_lists', 'bookmarks', 'items']),\n isLoading: state.getIn(['status_lists', 'bookmarks', 'isLoading'], true),\n hasMore: !!state.getIn(['status_lists', 'bookmarks', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Bookmarks extends ImmutablePureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n statusIds: ImmutablePropTypes.list.isRequired,\n intl: PropTypes.object.isRequired,\n columnId: PropTypes.string,\n multiColumn: PropTypes.bool,\n hasMore: PropTypes.bool,\n isLoading: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchBookmarkedStatuses());\n }\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('BOOKMARKS', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandBookmarkedStatuses());\n }, 300, { leading: true })\n\n render () {\n const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props;\n const pinned = !!columnId;\n\n const emptyMessage = <FormattedMessage id='empty_column.bookmarked_statuses' defaultMessage=\"You don't have any bookmarked toots yet. When you bookmark one, it will show up here.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.heading)}>\n <ColumnHeader\n icon='bookmark'\n title={intl.formatMessage(messages.heading)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n showBackButton\n />\n\n <StatusList\n trackScroll={!pinned}\n statusIds={statusIds}\n scrollKey={`bookmarked_statuses-${columnId}`}\n hasMore={hasMore}\n isLoading={isLoading}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/community_timeline.js b/priv/static/packs/features/community_timeline.js
index 88cb0bd86..69d215446 100644
--- a/priv/static/packs/features/community_timeline.js
+++ b/priv/static/packs/features/community_timeline.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{835:function(e,t,n){"use strict";n.r(t);var o,i,c,a=n(0),l=n(2),d=n(7),r=n(1),s=n(3),u=n.n(s),m=n(13),p=n(6),h=n(5),b=n.n(h),f=n(1036),y=n(736),j=n(733),O=n(33),M=n(250),g=n(1139),v=n(70),I=Object(m.connect)((function(e,t){var n=t.columnId,o=e.getIn(["settings","columns"]),i=o.findIndex((function(e){return e.get("uuid")===n}));return{settings:n&&i>=0?o.get(i).get("params"):e.getIn(["settings","community"])}}),(function(e,t){var n=t.columnId;return{onChange:function(t,o){e(n?Object(M.f)(n,t,o):Object(v.c)(["community"].concat(t),o))}}}))(g.a),C=n(740);n.d(t,"default",(function(){return U}));var w=Object(p.f)({title:{id:"column.community",defaultMessage:"Local timeline"}}),U=Object(m.connect)((function(e,t){var n=t.columnId,o=n,i=e.getIn(["settings","columns"]),c=i.findIndex((function(e){return e.get("uuid")===o})),a=n&&c>=0?i.get(c).getIn(["params","other","onlyMedia"]):e.getIn(["settings","community","other","onlyMedia"]),l=e.getIn(["timelines","community"+(a?":media":"")]);return{hasUnread:!!l&&l.get("unread")>0,onlyMedia:a}}))(o=Object(p.g)((c=i=function(e){function t(){for(var t,n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];return t=e.call.apply(e,[this].concat(o))||this,Object(r.a)(Object(l.a)(t),"handlePin",(function(){var e=t.props,n=e.columnId,o=e.dispatch,i=e.onlyMedia;o(n?Object(M.h)(n):Object(M.e)("COMMUNITY",{other:{onlyMedia:i}}))})),Object(r.a)(Object(l.a)(t),"handleMove",(function(e){var n=t.props,o=n.columnId;(0,n.dispatch)(Object(M.g)(o,e))})),Object(r.a)(Object(l.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(r.a)(Object(l.a)(t),"setRef",(function(e){t.column=e})),Object(r.a)(Object(l.a)(t),"handleLoadMore",(function(e){var n=t.props,o=n.dispatch,i=n.onlyMedia;o(Object(O.r)({maxId:e,onlyMedia:i}))})),t}Object(d.a)(t,e);var n=t.prototype;return n.componentDidMount=function(){var e=this.props,t=e.dispatch,n=e.onlyMedia;t(Object(O.r)({onlyMedia:n})),this.disconnect=t(Object(C.a)({onlyMedia:n}))},n.componentDidUpdate=function(e){if(e.onlyMedia!==this.props.onlyMedia){var t=this.props,n=t.dispatch,o=t.onlyMedia;this.disconnect(),n(Object(O.r)({onlyMedia:o})),this.disconnect=n(Object(C.a)({onlyMedia:o}))}},n.componentWillUnmount=function(){this.disconnect&&(this.disconnect(),this.disconnect=null)},n.render=function(){var e=this.props,t=e.intl,n=e.shouldUpdateScroll,o=e.hasUnread,i=e.columnId,c=e.multiColumn,l=e.onlyMedia,d=!!i;return u.a.createElement(y.a,{bindToDocument:!c,ref:this.setRef,label:t.formatMessage(w.title)},Object(a.a)(j.a,{icon:"users",active:o,title:t.formatMessage(w.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:d,multiColumn:c},void 0,Object(a.a)(I,{columnId:i})),Object(a.a)(f.a,{trackScroll:!d,scrollKey:"community_timeline-"+i,timelineId:"community"+(l?":media":""),onLoadMore:this.handleLoadMore,emptyMessage:Object(a.a)(p.b,{id:"empty_column.community",defaultMessage:"The local timeline is empty. Write something publicly to get the ball rolling!"}),shouldUpdateScroll:n,bindToDocument:!c}))},t}(u.a.PureComponent),Object(r.a)(i,"contextTypes",{router:b.a.object}),Object(r.a)(i,"defaultProps",{onlyMedia:!1}),o=c))||o)||o}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{861:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return U}));var o,i,c,a=n(0),l=n(2),d=(n(9),n(6),n(8)),r=n(1),s=n(3),u=n.n(s),m=n(15),p=n(7),h=n(5),b=n.n(h),f=n(1063),y=n(762),j=n(759),O=n(36),M=n(253),g=n(1172),v=n(74),I=Object(m.connect)((function(e,t){var n=t.columnId,o=e.getIn(["settings","columns"]),i=o.findIndex((function(e){return e.get("uuid")===n}));return{settings:n&&i>=0?o.get(i).get("params"):e.getIn(["settings","community"])}}),(function(e,t){var n=t.columnId;return{onChange:function(t,o){e(n?Object(M.f)(n,t,o):Object(v.c)(["community"].concat(t),o))}}}))(g.a),C=n(766);var w=Object(p.f)({title:{id:"column.community",defaultMessage:"Local timeline"}}),U=Object(m.connect)((function(e,t){var n=t.columnId,o=n,i=e.getIn(["settings","columns"]),c=i.findIndex((function(e){return e.get("uuid")===o})),a=n&&c>=0?i.get(c).getIn(["params","other","onlyMedia"]):e.getIn(["settings","community","other","onlyMedia"]),l=e.getIn(["timelines","community"+(a?":media":"")]);return{hasUnread:!!l&&l.get("unread")>0,onlyMedia:a}}))(o=Object(p.g)((c=i=function(e){Object(d.a)(n,e);var t;t=n;function n(){for(var t,n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];return t=e.call.apply(e,[this].concat(o))||this,Object(r.a)(Object(l.a)(t),"handlePin",(function(){var e=t.props,n=e.columnId,o=e.dispatch,i=e.onlyMedia;o(n?Object(M.h)(n):Object(M.e)("COMMUNITY",{other:{onlyMedia:i}}))})),Object(r.a)(Object(l.a)(t),"handleMove",(function(e){var n=t.props,o=n.columnId;(0,n.dispatch)(Object(M.g)(o,e))})),Object(r.a)(Object(l.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(r.a)(Object(l.a)(t),"setRef",(function(e){t.column=e})),Object(r.a)(Object(l.a)(t),"handleLoadMore",(function(e){var n=t.props,o=n.dispatch,i=n.onlyMedia;o(Object(O.r)({maxId:e,onlyMedia:i}))})),t}var o=n.prototype;return o.componentDidMount=function(){var e=this.props,t=e.dispatch,n=e.onlyMedia;t(Object(O.r)({onlyMedia:n})),this.disconnect=t(Object(C.a)({onlyMedia:n}))},o.componentDidUpdate=function(e){if(e.onlyMedia!==this.props.onlyMedia){var t=this.props,n=t.dispatch,o=t.onlyMedia;this.disconnect(),n(Object(O.r)({onlyMedia:o})),this.disconnect=n(Object(C.a)({onlyMedia:o}))}},o.componentWillUnmount=function(){this.disconnect&&(this.disconnect(),this.disconnect=null)},o.render=function(){var e=this.props,t=e.intl,n=e.shouldUpdateScroll,o=e.hasUnread,i=e.columnId,c=e.multiColumn,l=e.onlyMedia,d=!!i;return u.a.createElement(y.a,{bindToDocument:!c,ref:this.setRef,label:t.formatMessage(w.title)},Object(a.a)(j.a,{icon:"users",active:o,title:t.formatMessage(w.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:d,multiColumn:c},void 0,Object(a.a)(I,{columnId:i})),Object(a.a)(f.a,{trackScroll:!d,scrollKey:"community_timeline-"+i,timelineId:"community"+(l?":media":""),onLoadMore:this.handleLoadMore,emptyMessage:Object(a.a)(p.b,{id:"empty_column.community",defaultMessage:"The local timeline is empty. Write something publicly to get the ball rolling!"}),shouldUpdateScroll:n,bindToDocument:!c}))},n}(u.a.PureComponent),Object(r.a)(i,"contextTypes",{router:b.a.object}),Object(r.a)(i,"defaultProps",{onlyMedia:!1}),o=c))||o)||o}}]);
//# sourceMappingURL=community_timeline.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/community_timeline.js.map b/priv/static/packs/features/community_timeline.js.map
index 5f98a8561..66c4b57b4 100644
--- a/priv/static/packs/features/community_timeline.js.map
+++ b/priv/static/packs/features/community_timeline.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/community_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/community_timeline/index.js"],"names":["connect","state","uuid","columnId","columns","getIn","index","findIndex","c","get","settings","dispatch","onChange","key","checked","changeColumnParams","changeSetting","ColumnSettings","messages","defineMessages","title","CommunityTimeline","onlyMedia","timelineState","hasUnread","injectIntl","props","removeColumn","addColumn","other","dir","moveColumn","column","scrollTop","maxId","expandCommunityTimeline","componentDidMount","this","disconnect","connectCommunityStream","componentDidUpdate","prevProps","componentWillUnmount","render","intl","shouldUpdateScroll","multiColumn","pinned","bindToDocument","ref","setRef","label","formatMessage","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage","id","defaultMessage","React","PureComponent","router","PropTypes","object"],"mappings":"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","file":"features/community_timeline.js","sourcesContent":["import { connect } from 'react-redux';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { changeColumnParams } from '../../../actions/columns';\n\nconst mapStateToProps = (state, { columnId }) => {\n const uuid = columnId;\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === uuid);\n\n return {\n settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'community']),\n };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => {\n return {\n onChange (key, checked) {\n if (columnId) {\n dispatch(changeColumnParams(columnId, key, checked));\n } else {\n dispatch(changeSetting(['community', ...key], checked));\n }\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandCommunityTimeline } from '../../actions/timelines';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { connectCommunityStream } from '../../actions/streaming';\n\nconst messages = defineMessages({\n title: { id: 'column.community', defaultMessage: 'Local timeline' },\n});\n\nconst mapStateToProps = (state, { columnId }) => {\n const uuid = columnId;\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === uuid);\n const onlyMedia = (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']);\n const timelineState = state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`]);\n\n return {\n hasUnread: !!timelineState && timelineState.get('unread') > 0,\n onlyMedia,\n };\n};\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass CommunityTimeline extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static defaultProps = {\n onlyMedia: false,\n };\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n intl: PropTypes.object.isRequired,\n hasUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n onlyMedia: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch, onlyMedia } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('COMMUNITY', { other: { onlyMedia } }));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch, onlyMedia } = this.props;\n\n dispatch(expandCommunityTimeline({ onlyMedia }));\n this.disconnect = dispatch(connectCommunityStream({ onlyMedia }));\n }\n\n componentDidUpdate (prevProps) {\n if (prevProps.onlyMedia !== this.props.onlyMedia) {\n const { dispatch, onlyMedia } = this.props;\n\n this.disconnect();\n dispatch(expandCommunityTimeline({ onlyMedia }));\n this.disconnect = dispatch(connectCommunityStream({ onlyMedia }));\n }\n }\n\n componentWillUnmount () {\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n const { dispatch, onlyMedia } = this.props;\n\n dispatch(expandCommunityTimeline({ maxId, onlyMedia }));\n }\n\n render () {\n const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn, onlyMedia } = this.props;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='users'\n active={hasUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <ColumnSettingsContainer columnId={columnId} />\n </ColumnHeader>\n\n <StatusListContainer\n trackScroll={!pinned}\n scrollKey={`community_timeline-${columnId}`}\n timelineId={`community${onlyMedia ? ':media' : ''}`}\n onLoadMore={this.handleLoadMore}\n emptyMessage={<FormattedMessage id='empty_column.community' defaultMessage='The local timeline is empty. Write something publicly to get the ball rolling!' />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/community_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/community_timeline/index.js"],"names":["connect","state","uuid","columnId","columns","getIn","index","findIndex","c","get","settings","dispatch","onChange","key","checked","changeColumnParams","changeSetting","ColumnSettings","messages","defineMessages","title","CommunityTimeline","onlyMedia","timelineState","hasUnread","injectIntl","props","removeColumn","addColumn","other","dir","moveColumn","column","scrollTop","maxId","expandCommunityTimeline","componentDidMount","this","disconnect","connectCommunityStream","componentDidUpdate","prevProps","componentWillUnmount","render","intl","shouldUpdateScroll","multiColumn","pinned","bindToDocument","ref","setRef","label","formatMessage","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage","id","defaultMessage","React","PureComponent","router","PropTypes","object"],"mappings":"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","file":"features/community_timeline.js","sourcesContent":["import { connect } from 'react-redux';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { changeColumnParams } from '../../../actions/columns';\n\nconst mapStateToProps = (state, { columnId }) => {\n const uuid = columnId;\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === uuid);\n\n return {\n settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'community']),\n };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => {\n return {\n onChange (key, checked) {\n if (columnId) {\n dispatch(changeColumnParams(columnId, key, checked));\n } else {\n dispatch(changeSetting(['community', ...key], checked));\n }\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandCommunityTimeline } from '../../actions/timelines';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { connectCommunityStream } from '../../actions/streaming';\n\nconst messages = defineMessages({\n title: { id: 'column.community', defaultMessage: 'Local timeline' },\n});\n\nconst mapStateToProps = (state, { columnId }) => {\n const uuid = columnId;\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === uuid);\n const onlyMedia = (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'community', 'other', 'onlyMedia']);\n const timelineState = state.getIn(['timelines', `community${onlyMedia ? ':media' : ''}`]);\n\n return {\n hasUnread: !!timelineState && timelineState.get('unread') > 0,\n onlyMedia,\n };\n};\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass CommunityTimeline extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static defaultProps = {\n onlyMedia: false,\n };\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n intl: PropTypes.object.isRequired,\n hasUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n onlyMedia: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch, onlyMedia } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('COMMUNITY', { other: { onlyMedia } }));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch, onlyMedia } = this.props;\n\n dispatch(expandCommunityTimeline({ onlyMedia }));\n this.disconnect = dispatch(connectCommunityStream({ onlyMedia }));\n }\n\n componentDidUpdate (prevProps) {\n if (prevProps.onlyMedia !== this.props.onlyMedia) {\n const { dispatch, onlyMedia } = this.props;\n\n this.disconnect();\n dispatch(expandCommunityTimeline({ onlyMedia }));\n this.disconnect = dispatch(connectCommunityStream({ onlyMedia }));\n }\n }\n\n componentWillUnmount () {\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n const { dispatch, onlyMedia } = this.props;\n\n dispatch(expandCommunityTimeline({ maxId, onlyMedia }));\n }\n\n render () {\n const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn, onlyMedia } = this.props;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='users'\n active={hasUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <ColumnSettingsContainer columnId={columnId} />\n </ColumnHeader>\n\n <StatusListContainer\n trackScroll={!pinned}\n scrollKey={`community_timeline-${columnId}`}\n timelineId={`community${onlyMedia ? ':media' : ''}`}\n onLoadMore={this.handleLoadMore}\n emptyMessage={<FormattedMessage id='empty_column.community' defaultMessage='The local timeline is empty. Write something publicly to get the ball rolling!' />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/compose.js b/priv/static/packs/features/compose.js
index f6ebb3c06..fc3398284 100644
--- a/priv/static/packs/features/compose.js
+++ b/priv/static/packs/features/compose.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{401:function(e,t,o){"use strict";(function(e){o.d(t,"a",(function(){return u}));var n=o(0),a=o(7),s=o(3),i=o.n(s),c=o(79),r=o.n(c),l=e.env.CDN_HOST||"",u=function(e){function t(){return e.apply(this,arguments)||this}return Object(a.a)(t,e),t.prototype.render=function(){var e,t=this.props.emoji;if(t.custom)e=t.imageUrl;else{var o=r.a[t.native]||r.a[t.native.replace(/\uFE0F$/,"")];if(!o)return null;e=l+"/emoji/"+o.filename+".svg"}return Object(n.a)("div",{className:"autosuggest-emoji"},void 0,Object(n.a)("img",{className:"emojione",src:e,alt:t.native||t.colons}),t.colons)},t}(i.a.PureComponent)}).call(this,o(48))},577:function(e,t,o){"use strict";(function(e){o.d(t,"a",(function(){return N}));var n,a,s,i,c,r,l=o(0),u=o(2),d=o(7),p=o(1),g=o(3),b=o.n(g),m=o(6),f=o(41),h=o(115),j=o.n(h),O=o(12),v=o.n(O),y=o(63),_=o.n(y),C=o(52),k=Object(m.f)({emoji:{id:"emoji_button.label",defaultMessage:"Insert emoji"},emoji_search:{id:"emoji_button.search",defaultMessage:"Search..."},emoji_not_found:{id:"emoji_button.not_found",defaultMessage:"No emojos!! (╯°□°)╯︵ ┻━┻"},custom:{id:"emoji_button.custom",defaultMessage:"Custom"},recent:{id:"emoji_button.recent",defaultMessage:"Frequently used"},search_results:{id:"emoji_button.search_results",defaultMessage:"Search results"},people:{id:"emoji_button.people",defaultMessage:"People"},nature:{id:"emoji_button.nature",defaultMessage:"Nature"},food:{id:"emoji_button.food",defaultMessage:"Food & Drink"},activity:{id:"emoji_button.activity",defaultMessage:"Activity"},travel:{id:"emoji_button.travel",defaultMessage:"Travel & Places"},objects:{id:"emoji_button.objects",defaultMessage:"Objects"},symbols:{id:"emoji_button.symbols",defaultMessage:"Symbols"},flags:{id:"emoji_button.flags",defaultMessage:"Flags"}}),S=e.env.CDN_HOST||"",M=function(){return S+"/emoji/sheet_10.png"},w=!!_.a.hasSupport&&{passive:!0},x=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(p.a)(Object(u.a)(t),"handleClick",(function(e){t.props.onSelect(1*e.currentTarget.getAttribute("data-index"))})),Object(p.a)(Object(u.a)(t),"handleDocumentClick",(function(e){t.node&&!t.node.contains(e.target)&&t.props.onClose()})),Object(p.a)(Object(u.a)(t),"setRef",(function(e){t.node=e})),t}Object(d.a)(t,e);var o=t.prototype;return o.componentWillReceiveProps=function(e){e.active?this.attachListeners():this.removeListeners()},o.componentWillUnmount=function(){this.removeListeners()},o.attachListeners=function(){document.addEventListener("click",this.handleDocumentClick,!1),document.addEventListener("touchend",this.handleDocumentClick,w)},o.removeListeners=function(){document.removeEventListener("click",this.handleDocumentClick,!1),document.removeEventListener("touchend",this.handleDocumentClick,w)},o.render=function(){var e=this.props.active;return b.a.createElement("div",{className:"emoji-picker-dropdown__modifiers__menu",style:{display:e?"block":"none"},ref:this.setRef},Object(l.a)("button",{onClick:this.handleClick,"data-index":1},void 0,Object(l.a)(r,{emoji:"fist",set:"twitter",size:22,sheetSize:32,skin:1,backgroundImageFn:M})),Object(l.a)("button",{onClick:this.handleClick,"data-index":2},void 0,Object(l.a)(r,{emoji:"fist",set:"twitter",size:22,sheetSize:32,skin:2,backgroundImageFn:M})),Object(l.a)("button",{onClick:this.handleClick,"data-index":3},void 0,Object(l.a)(r,{emoji:"fist",set:"twitter",size:22,sheetSize:32,skin:3,backgroundImageFn:M})),Object(l.a)("button",{onClick:this.handleClick,"data-index":4},void 0,Object(l.a)(r,{emoji:"fist",set:"twitter",size:22,sheetSize:32,skin:4,backgroundImageFn:M})),Object(l.a)("button",{onClick:this.handleClick,"data-index":5},void 0,Object(l.a)(r,{emoji:"fist",set:"twitter",size:22,sheetSize:32,skin:5,backgroundImageFn:M})),Object(l.a)("button",{onClick:this.handleClick,"data-index":6},void 0,Object(l.a)(r,{emoji:"fist",set:"twitter",size:22,sheetSize:32,skin:6,backgroundImageFn:M})))},t}(b.a.PureComponent),T=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(p.a)(Object(u.a)(t),"handleClick",(function(){t.props.active?t.props.onClose():t.props.onOpen()})),Object(p.a)(Object(u.a)(t),"handleSelect",(function(e){t.props.onChange(e),t.props.onClose()})),t}return Object(d.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.active,o=e.modifier;return Object(l.a)("div",{className:"emoji-picker-dropdown__modifiers"},void 0,Object(l.a)(r,{emoji:"fist",set:"twitter",size:22,sheetSize:32,skin:o,onClick:this.handleClick,backgroundImageFn:M}),Object(l.a)(x,{active:t,onSelect:this.handleSelect,onClose:this.props.onClose}))},t}(b.a.PureComponent),D=Object(m.g)((s=a=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(p.a)(Object(u.a)(t),"state",{modifierOpen:!1,placement:null}),Object(p.a)(Object(u.a)(t),"handleDocumentClick",(function(e){t.node&&!t.node.contains(e.target)&&t.props.onClose()})),Object(p.a)(Object(u.a)(t),"setRef",(function(e){t.node=e})),Object(p.a)(Object(u.a)(t),"getI18n",(function(){var e=t.props.intl;return{search:e.formatMessage(k.emoji_search),notfound:e.formatMessage(k.emoji_not_found),categories:{search:e.formatMessage(k.search_results),recent:e.formatMessage(k.recent),people:e.formatMessage(k.people),nature:e.formatMessage(k.nature),foods:e.formatMessage(k.food),activity:e.formatMessage(k.activity),places:e.formatMessage(k.travel),objects:e.formatMessage(k.objects),symbols:e.formatMessage(k.symbols),flags:e.formatMessage(k.flags),custom:e.formatMessage(k.custom)}}})),Object(p.a)(Object(u.a)(t),"handleClick",(function(e){e.native||(e.native=e.colons),t.props.onClose(),t.props.onPick(e)})),Object(p.a)(Object(u.a)(t),"handleModifierOpen",(function(){t.setState({modifierOpen:!0})})),Object(p.a)(Object(u.a)(t),"handleModifierClose",(function(){t.setState({modifierOpen:!1})})),Object(p.a)(Object(u.a)(t),"handleModifierChange",(function(e){t.props.onSkinTone(e)})),t}Object(d.a)(t,e);var o=t.prototype;return o.componentDidMount=function(){document.addEventListener("click",this.handleDocumentClick,!1),document.addEventListener("touchend",this.handleDocumentClick,w)},o.componentWillUnmount=function(){document.removeEventListener("click",this.handleDocumentClick,!1),document.removeEventListener("touchend",this.handleDocumentClick,w)},o.render=function(){var e=this.props,t=e.loading,o=e.style,n=e.intl,a=e.custom_emojis,s=e.skinTone,i=e.frequentlyUsedEmojis;if(t)return Object(l.a)("div",{style:{width:299}});var r=n.formatMessage(k.emoji),u=this.state.modifierOpen,d=["recent","people","nature","foods","activity","places","objects","symbols","flags"];return d.splice.apply(d,[1,0].concat(Array.from(Object(C.categoriesFromEmojis)(a)).sort())),b.a.createElement("div",{className:v()("emoji-picker-dropdown__menu",{selecting:u}),style:o,ref:this.setRef},Object(l.a)(c,{perLine:8,emojiSize:22,sheetSize:32,custom:Object(C.buildCustomEmojis)(a),color:"",emoji:"",set:"twitter",title:r,i18n:this.getI18n(),onClick:this.handleClick,include:d,recent:i,skin:s,showPreview:!1,backgroundImageFn:M,autoFocus:!0,emojiTooltip:!0}),Object(l.a)(T,{active:u,modifier:s,onOpen:this.handleModifierOpen,onClose:this.handleModifierClose,onChange:this.handleModifierChange}))},t}(b.a.PureComponent),Object(p.a)(a,"defaultProps",{style:{},loading:!0,frequentlyUsedEmojis:[]}),n=s))||n,N=Object(m.g)(i=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(p.a)(Object(u.a)(t),"state",{active:!1,loading:!1}),Object(p.a)(Object(u.a)(t),"setRef",(function(e){t.dropdown=e})),Object(p.a)(Object(u.a)(t),"onShowDropdown",(function(e){var o=e.target;t.setState({active:!0}),c||(t.setState({loading:!0}),Object(f.m)().then((function(e){c=e.Picker,r=e.Emoji,t.setState({loading:!1})})).catch((function(){t.setState({loading:!1})})));var n=o.getBoundingClientRect().top;t.setState({placement:2*n<innerHeight?"bottom":"top"})})),Object(p.a)(Object(u.a)(t),"onHideDropdown",(function(){t.setState({active:!1})})),Object(p.a)(Object(u.a)(t),"onToggle",(function(e){t.state.loading||e.key&&"Enter"!==e.key||(t.state.active?t.onHideDropdown():t.onShowDropdown(e))})),Object(p.a)(Object(u.a)(t),"handleKeyDown",(function(e){"Escape"===e.key&&t.onHideDropdown()})),Object(p.a)(Object(u.a)(t),"setTargetRef",(function(e){t.target=e})),Object(p.a)(Object(u.a)(t),"findTarget",(function(){return t.target})),t}return Object(d.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.intl,o=e.onPickEmoji,n=e.onSkinTone,a=e.skinTone,s=e.frequentlyUsedEmojis,i=t.formatMessage(k.emoji),c=this.state,r=c.active,u=c.loading,d=c.placement;return Object(l.a)("div",{className:"emoji-picker-dropdown",onKeyDown:this.handleKeyDown},void 0,b.a.createElement("div",{ref:this.setTargetRef,className:"emoji-button",title:i,"aria-label":i,"aria-expanded":r,role:"button",onClick:this.onToggle,onKeyDown:this.onToggle,tabIndex:0},Object(l.a)("img",{className:v()("emojione",{"pulse-loading":r&&u}),alt:"🙂",src:S+"/emoji/1f602.svg"})),Object(l.a)(j.a,{show:r,placement:d,target:this.findTarget},void 0,Object(l.a)(D,{custom_emojis:this.props.custom_emojis,loading:u,onClose:this.onHideDropdown,onPick:o,onSkinTone:n,skinTone:a,frequentlyUsedEmojis:s})))},t}(b.a.PureComponent))||i}).call(this,o(48))},578:function(e,t,o){"use strict";var n,a,s,i=o(13),c=o(0),r=o(2),l=o(7),u=o(1),d=o(3),p=o.n(d),g=o(314),b=o(105),m=o(14),f=o.n(m),h=o(5),j=o.n(h),O=o(21),v=o(206),y=o(111),_=o(50),C=o(118),k=o(6),S=o(18),M=o(218),w=o(282),x=Object(k.f)({cancel:{id:"reply_indicator.cancel",defaultMessage:"Cancel"}}),T=Object(k.g)((s=a=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"handleClick",(function(){t.props.onCancel()})),Object(u.a)(Object(r.a)(t),"handleAccountClick",(function(e){0!==e.button||e.ctrlKey||e.metaKey||(e.preventDefault(),t.context.router.history.push("/accounts/"+t.props.status.getIn(["account","id"])))})),t}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.status,o=e.intl;if(!t)return null;var n={__html:t.get("contentHtml")},a={direction:Object(M.a)(t.get("search_index"))?"rtl":"ltr"};return Object(c.a)("div",{className:"reply-indicator"},void 0,Object(c.a)("div",{className:"reply-indicator__header"},void 0,Object(c.a)("div",{className:"reply-indicator__cancel"},void 0,Object(c.a)(_.a,{title:o.formatMessage(x.cancel),icon:"times",onClick:this.handleClick,inverted:!0})),Object(c.a)("a",{href:t.getIn(["account","url"]),onClick:this.handleAccountClick,className:"reply-indicator__display-name"},void 0,Object(c.a)("div",{className:"reply-indicator__display-avatar"},void 0,Object(c.a)(y.a,{account:t.get("account"),size:24})),Object(c.a)(C.a,{account:t.get("account")}))),Object(c.a)("div",{className:"reply-indicator__content",style:a,dangerouslySetInnerHTML:n}),t.get("media_attachments").size>0&&Object(c.a)(w.a,{compact:!0,media:t.get("media_attachments")}))},t}(S.a),Object(u.a)(a,"contextTypes",{router:j.a.object}),Object(u.a)(a,"propTypes",{status:f.a.map,onCancel:j.a.func.isRequired,intl:j.a.object.isRequired}),n=s))||n,D=Object(i.connect)((function(){var e=Object(v.f)();return function(t){return{status:e(t,{id:t.getIn(["compose","in_reply_to"])})}}}),(function(e){return{onCancel:function(){e(Object(O.M)())}}}))(T),N=function(e){function t(){return e.apply(this,arguments)||this}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props.account;return Object(c.a)("div",{className:"autosuggest-account",title:e.get("acct")},void 0,Object(c.a)("div",{className:"autosuggest-account-icon"},void 0,Object(c.a)(y.a,{account:e,size:18})),Object(c.a)(C.a,{account:e}))},t}(S.a);Object(u.a)(N,"propTypes",{account:f.a.map.isRequired});var I=Object(i.connect)((function(){var e=Object(v.d)();return function(t,o){var n=o.id;return{account:e(t,n)}}}))(N),R=o(401),P=o(418),F=function(e){function t(){return e.apply(this,arguments)||this}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props.tag,t=e.history&&Object(P.a)(e.history.reduce((function(e,t){return e+1*t.uses}),0));return Object(c.a)("div",{className:"autosuggest-hashtag"},void 0,Object(c.a)("div",{className:"autosuggest-hashtag__name"},void 0,"#",Object(c.a)("strong",{},void 0,e.name)),void 0!==e.history&&Object(c.a)("div",{className:"autosuggest-hashtag__uses"},void 0,Object(c.a)(k.b,{id:"autosuggest_hashtag.per_week",defaultMessage:"{count} per week",values:{count:t}})))},t}(p.a.PureComponent),E=o(146),q=o(12),A=o.n(q),K=function(e,t){var o,n=e.slice(0,t).search(/\S+$/),a=e.slice(t).search(/\s/);return!(o=a<0?e.slice(n):e.slice(n,a+t))||o.trim().length<3||-1===["@",":","#"].indexOf(o[0])?[null,null]:(o=o.trim().toLowerCase()).length>0?[n+1,o]:[null,null]},L=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"state",{suggestionsHidden:!0,focused:!1,selectedSuggestion:0,lastToken:null,tokenStart:0}),Object(u.a)(Object(r.a)(t),"onChange",(function(e){var o=K(e.target.value,e.target.selectionStart),n=o[0],a=o[1];null!==a&&t.state.lastToken!==a?(t.setState({lastToken:a,selectedSuggestion:0,tokenStart:n}),t.props.onSuggestionsFetchRequested(a)):null===a&&(t.setState({lastToken:null}),t.props.onSuggestionsClearRequested()),t.props.onChange(e)})),Object(u.a)(Object(r.a)(t),"onKeyDown",(function(e){var o=t.props,n=o.suggestions,a=o.disabled,s=t.state,i=s.selectedSuggestion,c=s.suggestionsHidden;if(a)e.preventDefault();else if(229!==e.which&&!e.isComposing){switch(e.key){case"Escape":0===n.size||c?document.querySelector(".ui").parentElement.focus():(e.preventDefault(),t.setState({suggestionsHidden:!0}));break;case"ArrowDown":n.size>0&&!c&&(e.preventDefault(),t.setState({selectedSuggestion:Math.min(i+1,n.size-1)}));break;case"ArrowUp":n.size>0&&!c&&(e.preventDefault(),t.setState({selectedSuggestion:Math.max(i-1,0)}));break;case"Enter":case"Tab":null!==t.state.lastToken&&n.size>0&&!c&&(e.preventDefault(),e.stopPropagation(),t.props.onSuggestionSelected(t.state.tokenStart,t.state.lastToken,n.get(i)))}!e.defaultPrevented&&t.props.onKeyDown&&t.props.onKeyDown(e)}})),Object(u.a)(Object(r.a)(t),"onBlur",(function(){t.setState({suggestionsHidden:!0,focused:!1})})),Object(u.a)(Object(r.a)(t),"onFocus",(function(e){t.setState({focused:!0}),t.props.onFocus&&t.props.onFocus(e)})),Object(u.a)(Object(r.a)(t),"onSuggestionClick",(function(e){var o=t.props.suggestions.get(e.currentTarget.getAttribute("data-index"));e.preventDefault(),t.props.onSuggestionSelected(t.state.tokenStart,t.state.lastToken,o),t.textarea.focus()})),Object(u.a)(Object(r.a)(t),"setTextarea",(function(e){t.textarea=e})),Object(u.a)(Object(r.a)(t),"onPaste",(function(e){e.clipboardData&&1===e.clipboardData.files.length&&(t.props.onPaste(e.clipboardData.files),e.preventDefault())})),Object(u.a)(Object(r.a)(t),"renderSuggestion",(function(e,o){var n,a,s=t.state.selectedSuggestion;return"emoji"===e.type?(n=Object(c.a)(R.a,{emoji:e}),a=e.id):"hashtag"===e.type?(n=Object(c.a)(F,{tag:e}),a=e.name):"account"===e.type&&(n=Object(c.a)(I,{id:e.id}),a=e.id),Object(c.a)("div",{role:"button",tabIndex:"0","data-index":o,className:A()("autosuggest-textarea__suggestions__item",{selected:o===s}),onMouseDown:t.onSuggestionClick},a,n)})),t}Object(l.a)(t,e);var o=t.prototype;return o.componentWillReceiveProps=function(e){e.suggestions!==this.props.suggestions&&e.suggestions.size>0&&this.state.suggestionsHidden&&this.state.focused&&this.setState({suggestionsHidden:!1})},o.render=function(){var e=this.props,t=e.value,o=e.suggestions,n=e.disabled,a=e.placeholder,s=e.onKeyUp,i=e.autoFocus,r=e.children,l=this.state.suggestionsHidden,u={direction:"ltr"};return Object(M.a)(t)&&(u.direction="rtl"),[Object(c.a)("div",{className:"compose-form__autosuggest-wrapper"},"autosuggest-wrapper",Object(c.a)("div",{className:"autosuggest-textarea"},void 0,Object(c.a)("label",{},void 0,Object(c.a)("span",{style:{display:"none"}},void 0,a),Object(c.a)(E.a,{inputRef:this.setTextarea,className:"autosuggest-textarea__textarea",disabled:n,placeholder:a,autoFocus:i,value:t,onChange:this.onChange,onKeyDown:this.onKeyDown,onKeyUp:s,onFocus:this.onFocus,onBlur:this.onBlur,onPaste:this.onPaste,style:u,"aria-autocomplete":"list"}))),r),Object(c.a)("div",{className:"autosuggest-textarea__suggestions-wrapper"},"suggestions-wrapper",Object(c.a)("div",{className:"autosuggest-textarea__suggestions "+(l||o.isEmpty()?"":"autosuggest-textarea__suggestions--visible")},void 0,o.map(this.renderSuggestion)))]},t}(S.a);Object(u.a)(L,"propTypes",{value:j.a.string,suggestions:f.a.list,disabled:j.a.bool,placeholder:j.a.string,onSuggestionSelected:j.a.func.isRequired,onSuggestionsClearRequested:j.a.func.isRequired,onSuggestionsFetchRequested:j.a.func.isRequired,onChange:j.a.func.isRequired,onKeyUp:j.a.func,onKeyDown:j.a.func,onPaste:j.a.func.isRequired,autoFocus:j.a.bool}),Object(u.a)(L,"defaultProps",{autoFocus:!0});var U,z=o(4),W=function(e,t,o){var n,a=e.slice(0,t).search(/\S+$/),s=e.slice(t).search(/\s/);return!(n=s<0?e.slice(a):e.slice(a,s+t))||n.trim().length<3||-1===o.indexOf(n[0])?[null,null]:(n=n.trim().toLowerCase()).length>0?[a+1,n]:[null,null]},H=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"state",{suggestionsHidden:!0,focused:!1,selectedSuggestion:0,lastToken:null,tokenStart:0}),Object(u.a)(Object(r.a)(t),"onChange",(function(e){var o=W(e.target.value,e.target.selectionStart,t.props.searchTokens),n=o[0],a=o[1];null!==a&&t.state.lastToken!==a?(t.setState({lastToken:a,selectedSuggestion:0,tokenStart:n}),t.props.onSuggestionsFetchRequested(a)):null===a&&(t.setState({lastToken:null}),t.props.onSuggestionsClearRequested()),t.props.onChange(e)})),Object(u.a)(Object(r.a)(t),"onKeyDown",(function(e){var o=t.props,n=o.suggestions,a=o.disabled,s=t.state,i=s.selectedSuggestion,c=s.suggestionsHidden;if(a)e.preventDefault();else if(229!==e.which&&!e.isComposing){switch(e.key){case"Escape":0===n.size||c?document.querySelector(".ui").parentElement.focus():(e.preventDefault(),t.setState({suggestionsHidden:!0}));break;case"ArrowDown":n.size>0&&!c&&(e.preventDefault(),t.setState({selectedSuggestion:Math.min(i+1,n.size-1)}));break;case"ArrowUp":n.size>0&&!c&&(e.preventDefault(),t.setState({selectedSuggestion:Math.max(i-1,0)}));break;case"Enter":case"Tab":null!==t.state.lastToken&&n.size>0&&!c&&(e.preventDefault(),e.stopPropagation(),t.props.onSuggestionSelected(t.state.tokenStart,t.state.lastToken,n.get(i)))}!e.defaultPrevented&&t.props.onKeyDown&&t.props.onKeyDown(e)}})),Object(u.a)(Object(r.a)(t),"onBlur",(function(){t.setState({suggestionsHidden:!0,focused:!1})})),Object(u.a)(Object(r.a)(t),"onFocus",(function(){t.setState({focused:!0})})),Object(u.a)(Object(r.a)(t),"onSuggestionClick",(function(e){var o=t.props.suggestions.get(e.currentTarget.getAttribute("data-index"));e.preventDefault(),t.props.onSuggestionSelected(t.state.tokenStart,t.state.lastToken,o),t.input.focus()})),Object(u.a)(Object(r.a)(t),"setInput",(function(e){t.input=e})),Object(u.a)(Object(r.a)(t),"renderSuggestion",(function(e,o){var n,a,s=t.state.selectedSuggestion;return"emoji"===e.type?(n=Object(c.a)(R.a,{emoji:e}),a=e.id):"hashtag"===e.type?(n=Object(c.a)(F,{tag:e}),a=e.name):"account"===e.type&&(n=Object(c.a)(I,{id:e.id}),a=e.id),Object(c.a)("div",{role:"button",tabIndex:"0","data-index":o,className:A()("autosuggest-textarea__suggestions__item",{selected:o===s}),onMouseDown:t.onSuggestionClick},a,n)})),t}Object(l.a)(t,e);var o=t.prototype;return o.componentWillReceiveProps=function(e){e.suggestions!==this.props.suggestions&&e.suggestions.size>0&&this.state.suggestionsHidden&&this.state.focused&&this.setState({suggestionsHidden:!1})},o.render=function(){var e=this.props,t=e.value,o=e.suggestions,n=e.disabled,a=e.placeholder,s=e.onKeyUp,i=e.autoFocus,r=e.className,l=e.id,u=e.maxLength,d=this.state.suggestionsHidden,g={direction:"ltr"};return Object(M.a)(t)&&(g.direction="rtl"),Object(c.a)("div",{className:"autosuggest-input"},void 0,Object(c.a)("label",{},void 0,Object(c.a)("span",{style:{display:"none"}},void 0,a),p.a.createElement("input",{type:"text",ref:this.setInput,disabled:n,placeholder:a,autoFocus:i,value:t,onChange:this.onChange,onKeyDown:this.onKeyDown,onKeyUp:s,onFocus:this.onFocus,onBlur:this.onBlur,style:g,"aria-autocomplete":"list",id:l,className:r,maxLength:u})),Object(c.a)("div",{className:"autosuggest-textarea__suggestions "+(d||o.isEmpty()?"":"autosuggest-textarea__suggestions--visible")},void 0,o.map(this.renderSuggestion)))},t}(S.a);Object(u.a)(H,"propTypes",{value:j.a.string,suggestions:f.a.list,disabled:j.a.bool,placeholder:j.a.string,onSuggestionSelected:j.a.func.isRequired,onSuggestionsClearRequested:j.a.func.isRequired,onSuggestionsFetchRequested:j.a.func.isRequired,onChange:j.a.func.isRequired,onKeyUp:j.a.func,onKeyDown:j.a.func,autoFocus:j.a.bool,className:j.a.string,id:j.a.string,searchTokens:j.a.arrayOf(j.a.string),maxLength:j.a.number}),Object(u.a)(H,"defaultProps",{autoFocus:!0,searchTokens:Object(z.List)(["@",":","#"])});var B,G,Y,X,V,J,Z,$,Q=Object(k.f)({add_poll:{id:"poll_button.add_poll",defaultMessage:"Add a poll"},remove_poll:{id:"poll_button.remove_poll",defaultMessage:"Remove poll"}}),ee={height:null,lineHeight:"27px"},te=Object(k.g)(U=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"handleClick",(function(){t.props.onClick()})),t}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.intl,o=e.active,n=e.unavailable,a=e.disabled;return n?null:Object(c.a)("div",{className:"compose-form__poll-button"},void 0,Object(c.a)(_.a,{icon:"tasks",title:t.formatMessage(o?Q.remove_poll:Q.add_poll),disabled:a,onClick:this.handleClick,className:"compose-form__poll-button-icon "+(o?"active":""),size:18,inverted:!0,style:ee}))},t}(p.a.PureComponent))||U,oe=Object(i.connect)((function(e){return{unavailable:e.getIn(["compose","is_uploading"])||e.getIn(["compose","media_attachments"]).size>0,active:null!==e.getIn(["compose","poll"])}}),(function(e){return{onClick:function(){e((function(t,o){o().getIn(["compose","poll"])?e(Object(O.eb)()):e(Object(O.K)())}))}}}))(te),ne=Object(k.f)({upload:{id:"upload_button.label",defaultMessage:"Add media ({formats})"}}),ae={height:null,lineHeight:"27px"},se=Object(i.connect)((function(){return function(e){return{acceptContentTypes:e.getIn(["media_attachments","accept_content_types"])}}}))(B=Object(k.g)((Y=G=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"handleChange",(function(e){e.target.files.length>0&&t.props.onSelectFile(e.target.files)})),Object(u.a)(Object(r.a)(t),"handleClick",(function(){t.fileElement.click()})),Object(u.a)(Object(r.a)(t),"setRef",(function(e){t.fileElement=e})),t}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.intl,o=e.resetFileKey,n=e.unavailable,a=e.disabled;e.acceptContentTypes;return n?null:Object(c.a)("div",{className:"compose-form__upload-button"},void 0,Object(c.a)(_.a,{icon:"paperclip",title:t.formatMessage(ne.upload,{formats:"JPEG, PNG, GIF, WebM, MP4, MOV, OGG, WAV, MP3, FLAC"}),disabled:a,onClick:this.handleClick,className:"compose-form__upload-button-icon",size:18,inverted:!0,style:ae}),Object(c.a)("label",{},void 0,Object(c.a)("span",{style:{display:"none"}},void 0,t.formatMessage(ne.upload,{formats:"JPEG, PNG, GIF, WebM, MP4, MOV, OGG, WAV, MP3, FLAC"})),p.a.createElement("input",{key:o,ref:this.setRef,type:"file",multiple:!0,onChange:this.handleChange,disabled:a,style:{display:"none"}})))},t}(S.a),Object(u.a)(G,"propTypes",{disabled:j.a.bool,unavailable:j.a.bool,onSelectFile:j.a.func.isRequired,style:j.a.object,resetFileKey:j.a.number,acceptContentTypes:f.a.listOf(j.a.string).isRequired,intl:j.a.object.isRequired}),B=Y))||B)||B,ie=Object(i.connect)((function(e){return{disabled:e.getIn(["compose","is_uploading"])||e.getIn(["compose","media_attachments"]).size+e.getIn(["compose","pending_media_attachments"])>3||e.getIn(["compose","media_attachments"]).some((function(e){return["video","audio"].includes(e.get("type"))})),unavailable:null!==e.getIn(["compose","poll"]),resetFileKey:e.getIn(["compose","resetFileKey"])}}),(function(e){return{onSelectFile:function(t){e(Object(O.mb)(t))}}}))(se),ce={height:null,lineHeight:"27px",width:"23.14285722px"},re=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"handleClick",(function(e){e.preventDefault(),t.props.onClick()})),t}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.label,o=e.title,n=e.active,a=e.ariaControls;return Object(c.a)("button",{title:o,"aria-label":o,className:"text-icon-button "+(n?"active":""),"aria-expanded":n,onClick:this.handleClick,"aria-controls":a,style:ce},void 0,t)},t}(p.a.PureComponent),le=Object(k.f)({marked:{id:"compose_form.spoiler.marked",defaultMessage:"Text is hidden behind warning"},unmarked:{id:"compose_form.spoiler.unmarked",defaultMessage:"Text is not hidden"}}),ue=Object(k.g)(Object(i.connect)((function(e,t){return{label:"CW",title:t.intl.formatMessage(e.getIn(["compose","spoiler"])?le.marked:le.unmarked),active:e.getIn(["compose","spoiler"]),ariaControls:"cw-spoiler-input"}}),(function(e){return{onClick:function(){e(Object(O.Q)())}}}))(re)),de=o(8),pe=o(115),ge=o.n(pe),be=o(97),me=o(34),fe=o.n(me),he=o(63),je=o.n(he),Oe=o(26),ve=Object(k.f)({public_short:{id:"privacy.public.short",defaultMessage:"Public"},public_long:{id:"privacy.public.long",defaultMessage:"Post to public timelines"},unlisted_short:{id:"privacy.unlisted.short",defaultMessage:"Unlisted"},unlisted_long:{id:"privacy.unlisted.long",defaultMessage:"Do not show in public timelines"},private_short:{id:"privacy.private.short",defaultMessage:"Followers-only"},private_long:{id:"privacy.private.long",defaultMessage:"Post to followers only"},direct_short:{id:"privacy.direct.short",defaultMessage:"Direct"},direct_long:{id:"privacy.direct.long",defaultMessage:"Post to mentioned users only"},change_privacy:{id:"privacy.change",defaultMessage:"Adjust status privacy"}}),ye=!!je.a.hasSupport&&{passive:!0},_e=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"state",{mounted:!1}),Object(u.a)(Object(r.a)(t),"handleDocumentClick",(function(e){t.node&&!t.node.contains(e.target)&&t.props.onClose()})),Object(u.a)(Object(r.a)(t),"handleKeyDown",(function(e){var o,n=t.props.items,a=e.currentTarget.getAttribute("data-index"),s=n.findIndex((function(e){return e.value===a}));switch(e.key){case"Escape":t.props.onClose();break;case"Enter":t.handleClick(e);break;case"ArrowDown":(o=t.node.childNodes[s+1])&&(o.focus(),t.props.onChange(o.getAttribute("data-index")));break;case"ArrowUp":(o=t.node.childNodes[s-1])&&(o.focus(),t.props.onChange(o.getAttribute("data-index")));break;case"Tab":(o=e.shiftKey?t.node.childNodes[s-1]||t.node.lastChild:t.node.childNodes[s+1]||t.node.firstChild)&&(o.focus(),t.props.onChange(o.getAttribute("data-index")),e.preventDefault(),e.stopPropagation());break;case"Home":(o=t.node.firstChild)&&(o.focus(),t.props.onChange(o.getAttribute("data-index")));break;case"End":(o=t.node.lastChild)&&(o.focus(),t.props.onChange(o.getAttribute("data-index")))}})),Object(u.a)(Object(r.a)(t),"handleClick",(function(e){var o=e.currentTarget.getAttribute("data-index");e.preventDefault(),t.props.onClose(),t.props.onChange(o)})),Object(u.a)(Object(r.a)(t),"setRef",(function(e){t.node=e})),Object(u.a)(Object(r.a)(t),"setFocusRef",(function(e){t.focusedItem=e})),t}Object(l.a)(t,e);var o=t.prototype;return o.componentDidMount=function(){document.addEventListener("click",this.handleDocumentClick,!1),document.addEventListener("touchend",this.handleDocumentClick,ye),this.focusedItem&&this.focusedItem.focus(),this.setState({mounted:!0})},o.componentWillUnmount=function(){document.removeEventListener("click",this.handleDocumentClick,!1),document.removeEventListener("touchend",this.handleDocumentClick,ye)},o.render=function(){var e=this,t=this.state.mounted,o=this.props,n=o.style,a=o.items,s=o.placement,i=o.value;return Object(c.a)(be.a,{defaultStyle:{opacity:0,scaleX:.85,scaleY:.75},style:{opacity:fe()(1,{damping:35,stiffness:400}),scaleX:fe()(1,{damping:35,stiffness:400}),scaleY:fe()(1,{damping:35,stiffness:400})}},void 0,(function(o){var r=o.opacity,l=o.scaleX,u=o.scaleY;return(p.a.createElement("div",{className:"privacy-dropdown__dropdown "+s,style:Object(de.default)({},n,{opacity:r,transform:t?"scale("+l+", "+u+")":null,zIndex:2}),role:"listbox",ref:e.setRef},a.map((function(t){return p.a.createElement("div",{role:"option",tabIndex:"0",key:t.value,"data-index":t.value,onKeyDown:e.handleKeyDown,onClick:e.handleClick,className:A()("privacy-dropdown__option",{active:t.value===i}),"aria-selected":t.value===i,ref:t.value===i?e.setFocusRef:null},Object(c.a)("div",{className:"privacy-dropdown__option__icon"},void 0,Object(c.a)(Oe.a,{id:t.icon,fixedWidth:!0})),Object(c.a)("div",{className:"privacy-dropdown__option__content"},void 0,Object(c.a)("strong",{},void 0,t.text),t.meta))}))))}))},t}(p.a.PureComponent),Ce=Object(k.g)(X=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"state",{open:!1,placement:"bottom"}),Object(u.a)(Object(r.a)(t),"handleToggle",(function(e){var o=e.target;if(t.props.isUserTouching())t.state.open?t.props.onModalClose():t.props.onModalOpen({actions:t.options.map((function(e){return Object(de.default)({},e,{active:e.value===t.props.value})})),onClick:t.handleModalActionClick});else{var n=o.getBoundingClientRect().top;t.state.open&&t.activeElement&&t.activeElement.focus(),t.setState({placement:2*n<innerHeight?"bottom":"top"}),t.setState({open:!t.state.open})}})),Object(u.a)(Object(r.a)(t),"handleModalActionClick",(function(e){e.preventDefault();var o=t.options[e.currentTarget.getAttribute("data-index")].value;t.props.onModalClose(),t.props.onChange(o)})),Object(u.a)(Object(r.a)(t),"handleKeyDown",(function(e){switch(e.key){case"Escape":t.handleClose()}})),Object(u.a)(Object(r.a)(t),"handleMouseDown",(function(){t.state.open||(t.activeElement=document.activeElement)})),Object(u.a)(Object(r.a)(t),"handleButtonKeyDown",(function(e){switch(e.key){case" ":case"Enter":t.handleMouseDown()}})),Object(u.a)(Object(r.a)(t),"handleClose",(function(){t.state.open&&t.activeElement&&t.activeElement.focus(),t.setState({open:!1})})),Object(u.a)(Object(r.a)(t),"handleChange",(function(e){t.props.onChange(e)})),t}Object(l.a)(t,e);var o=t.prototype;return o.componentWillMount=function(){var e=this.props.intl.formatMessage;this.options=[{icon:"globe",value:"public",text:e(ve.public_short),meta:e(ve.public_long)},{icon:"unlock",value:"unlisted",text:e(ve.unlisted_short),meta:e(ve.unlisted_long)},{icon:"lock",value:"private",text:e(ve.private_short),meta:e(ve.private_long)},{icon:"envelope",value:"direct",text:e(ve.direct_short),meta:e(ve.direct_long)}]},o.render=function(){var e=this.props,t=e.value,o=e.intl,n=this.state,a=n.open,s=n.placement,i=this.options.find((function(e){return e.value===t}));return Object(c.a)("div",{className:A()("privacy-dropdown",s,{active:a}),onKeyDown:this.handleKeyDown},void 0,Object(c.a)("div",{className:A()("privacy-dropdown__value",{active:this.options.indexOf(i)===("bottom"===s?0:this.options.length-1)})},void 0,Object(c.a)(_.a,{className:"privacy-dropdown__value-icon",icon:i.icon,title:o.formatMessage(ve.change_privacy),size:18,expanded:a,active:a,inverted:!0,onClick:this.handleToggle,onMouseDown:this.handleMouseDown,onKeyDown:this.handleButtonKeyDown,style:{height:null,lineHeight:"27px"}})),Object(c.a)(ge.a,{show:a,placement:s,target:this},void 0,Object(c.a)(_e,{items:this.options,value:t,onClose:this.handleClose,onChange:this.handleChange,placement:s})))},t}(p.a.PureComponent))||X,ke=o(47),Se=o(116),Me=Object(i.connect)((function(e){return{isModalOpen:"ACTIONS"===e.get("modal").modalType,value:e.getIn(["compose","privacy"])}}),(function(e){return{onChange:function(t){e(Object(O.R)(t))},isUserTouching:Se.c,onModalOpen:function(t){return e(Object(ke.d)("ACTIONS",t))},onModalClose:function(){return e(Object(ke.c)())}}}))(Ce),we=o(577),xe=o(70),Te=o(54),De=o(231),Ne=["+1","grinning","kissing_heart","heart_eyes","laughing","stuck_out_tongue_winking_eye","sweat_smile","joy","yum","disappointed","thinking_face","weary","sob","sunglasses","heart","ok_hand"],Ie=Object(Te.a)([function(e){return e.getIn(["settings","frequentlyUsedEmojis"],Object(z.Map)())}],(function(e){var t=e.keySeq().sort((function(t,o){return e.get(t)-e.get(o)})).reverse().slice(0,16).toArray();if(t.length<Ne.length){var o=Ne.filter((function(e){return!t.includes(e)}));t=t.concat(o.slice(0,Ne.length-t.length))}return t})),Re=Object(Te.a)([function(e){return e.get("custom_emojis")}],(function(e){return e.filter((function(e){return e.get("visible_in_picker")})).sort((function(e,t){var o=e.get("shortcode").toLowerCase(),n=t.get("shortcode").toLowerCase();return o<n?-1:o>n?1:0}))})),Pe=Object(i.connect)((function(e){return{custom_emojis:Re(e),skinTone:e.getIn(["settings","skinTone"]),frequentlyUsedEmojis:Ie(e)}}),(function(e,t){var o=t.onPickEmoji;return{onSkinTone:function(t){e(Object(xe.c)(["skinTone"],t))},onPickEmoji:function(t){e(Object(De.b)(t)),o&&o(t)}}}))(we.a),Fe=o(30),Ee=Object(k.f)({option_placeholder:{id:"compose_form.poll.option_placeholder",defaultMessage:"Choice {number}"},add_option:{id:"compose_form.poll.add_option",defaultMessage:"Add a choice"},remove_option:{id:"compose_form.poll.remove_option",defaultMessage:"Remove this choice"},poll_duration:{id:"compose_form.poll.duration",defaultMessage:"Poll duration"},switchToMultiple:{id:"compose_form.poll.switch_to_multiple",defaultMessage:"Change poll to allow multiple choices"},switchToSingle:{id:"compose_form.poll.switch_to_single",defaultMessage:"Change poll to allow for a single choice"},minutes:{id:"intervals.full.minutes",defaultMessage:"{number, plural, one {# minute} other {# minutes}}"},hours:{id:"intervals.full.hours",defaultMessage:"{number, plural, one {# hour} other {# hours}}"},days:{id:"intervals.full.days",defaultMessage:"{number, plural, one {# day} other {# days}}"}}),qe=Object(k.g)(V=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"handleOptionTitleChange",(function(e){t.props.onChange(t.props.index,e.target.value)})),Object(u.a)(Object(r.a)(t),"handleOptionRemove",(function(){t.props.onRemove(t.props.index)})),Object(u.a)(Object(r.a)(t),"handleToggleMultiple",(function(e){t.props.onToggleMultiple(),e.preventDefault(),e.stopPropagation()})),Object(u.a)(Object(r.a)(t),"handleCheckboxKeypress",(function(e){"Enter"!==e.key&&" "!==e.key||t.handleToggleMultiple(e)})),Object(u.a)(Object(r.a)(t),"onSuggestionsClearRequested",(function(){t.props.onClearSuggestions()})),Object(u.a)(Object(r.a)(t),"onSuggestionsFetchRequested",(function(e){t.props.onFetchSuggestions(e)})),Object(u.a)(Object(r.a)(t),"onSuggestionSelected",(function(e,o,n){t.props.onSuggestionSelected(e,o,n,["poll","options",t.props.index])})),t}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.isPollMultiple,o=e.title,n=e.index,a=e.intl;return Object(c.a)("li",{},void 0,Object(c.a)("label",{className:"poll__text editable"},void 0,Object(c.a)("span",{className:A()("poll__input",{checkbox:t}),onClick:this.handleToggleMultiple,onKeyPress:this.handleCheckboxKeypress,role:"button",tabIndex:"0",title:a.formatMessage(t?Ee.switchToSingle:Ee.switchToMultiple),"aria-label":a.formatMessage(t?Ee.switchToSingle:Ee.switchToMultiple)}),Object(c.a)(H,{placeholder:a.formatMessage(Ee.option_placeholder,{number:n+1}),maxLength:100,value:o,onChange:this.handleOptionTitleChange,suggestions:this.props.suggestions,onSuggestionsFetchRequested:this.onSuggestionsFetchRequested,onSuggestionsClearRequested:this.onSuggestionsClearRequested,onSuggestionSelected:this.onSuggestionSelected,searchTokens:[":"]})),Object(c.a)("div",{className:"poll__cancel"},void 0,Object(c.a)(_.a,{disabled:n<=1,title:a.formatMessage(Ee.remove_option),icon:"times",onClick:this.handleOptionRemove})))},t}(p.a.PureComponent))||V,Ae=Object(k.g)(($=Z=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"handleAddOption",(function(){t.props.onAddOption("")})),Object(u.a)(Object(r.a)(t),"handleSelectDuration",(function(e){t.props.onChangeSettings(e.target.value,t.props.isMultiple)})),Object(u.a)(Object(r.a)(t),"handleToggleMultiple",(function(){t.props.onChangeSettings(t.props.expiresIn,!t.props.isMultiple)})),t}return Object(l.a)(t,e),t.prototype.render=function(){var e=this,t=this.props,o=t.options,n=t.expiresIn,a=t.isMultiple,s=t.onChangeOption,i=t.onRemoveOption,r=t.intl,l=Object(Fe.default)(t,["options","expiresIn","isMultiple","onChangeOption","onRemoveOption","intl"]);return o?Object(c.a)("div",{className:"compose-form__poll-wrapper"},void 0,Object(c.a)("ul",{},void 0,o.map((function(t,o){return p.a.createElement(qe,Object(de.default)({title:t,key:o,index:o,onChange:s,onRemove:i,isPollMultiple:a,onToggleMultiple:e.handleToggleMultiple},l))}))),Object(c.a)("div",{className:"poll__footer"},void 0,Object(c.a)("button",{disabled:o.size>=5,className:"button button-secondary",onClick:this.handleAddOption},void 0,Object(c.a)(Oe.a,{id:"plus"})," ",p.a.createElement(k.b,Ee.add_option)),Object(c.a)("select",{value:n,onChange:this.handleSelectDuration},void 0,Object(c.a)("option",{value:300},void 0,r.formatMessage(Ee.minutes,{number:5})),Object(c.a)("option",{value:1800},void 0,r.formatMessage(Ee.minutes,{number:30})),Object(c.a)("option",{value:3600},void 0,r.formatMessage(Ee.hours,{number:1})),Object(c.a)("option",{value:21600},void 0,r.formatMessage(Ee.hours,{number:6})),Object(c.a)("option",{value:86400},void 0,r.formatMessage(Ee.days,{number:1})),Object(c.a)("option",{value:259200},void 0,r.formatMessage(Ee.days,{number:3})),Object(c.a)("option",{value:604800},void 0,r.formatMessage(Ee.days,{number:7}))))):null},t}(S.a),Object(u.a)(Z,"propTypes",{options:f.a.list,expiresIn:j.a.number,isMultiple:j.a.bool,onChangeOption:j.a.func.isRequired,onAddOption:j.a.func.isRequired,onRemoveOption:j.a.func.isRequired,onChangeSettings:j.a.func.isRequired,suggestions:f.a.list,onClearSuggestions:j.a.func.isRequired,onFetchSuggestions:j.a.func.isRequired,onSuggestionSelected:j.a.func.isRequired,intl:j.a.object.isRequired}),J=$))||J,Ke=Object(i.connect)((function(e){return{suggestions:e.getIn(["compose","suggestions"]),options:e.getIn(["compose","poll","options"]),expiresIn:e.getIn(["compose","poll","expires_in"]),isMultiple:e.getIn(["compose","poll","multiple"])}}),(function(e){return{onAddOption:function(t){e(Object(O.L)(t))},onRemoveOption:function(t){e(Object(O.fb)(t))},onChangeOption:function(t,o){e(Object(O.T)(t,o))},onChangeSettings:function(t,o){e(Object(O.U)(t,o))},onClearSuggestions:function(){e(Object(O.W)())},onFetchSuggestions:function(t){e(Object(O.Z)(t))},onSuggestionSelected:function(t,o,n,a){e(Object(O.ib)(t,o,n,a))}}}))(Ae),Le=o(313),Ue=Object(i.connect)((function(e){return{active:e.getIn(["compose","is_uploading"]),progress:e.getIn(["compose","progress"])}}))(Le.a),ze=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"handleUndoClick",(function(e){e.stopPropagation(),t.props.onUndo(t.props.media.get("id"))})),Object(u.a)(Object(r.a)(t),"handleFocalPointClick",(function(e){e.stopPropagation(),t.props.onOpenFocalPoint(t.props.media.get("id"))})),t}return Object(l.a)(t,e),t.prototype.render=function(){var e=this,t=this.props.media,o=t.getIn(["meta","focus","x"]),n=t.getIn(["meta","focus","y"]),a=100*(o/2+.5),s=100*(n/-2+.5);return Object(c.a)("div",{className:"compose-form__upload",tabIndex:"0",role:"button"},void 0,Object(c.a)(be.a,{defaultStyle:{scale:.8},style:{scale:fe()(1,{stiffness:180,damping:12})}},void 0,(function(o){var n=o.scale;return Object(c.a)("div",{className:"compose-form__upload-thumbnail",style:{transform:"scale("+n+")",backgroundImage:"url("+t.get("preview_url")+")",backgroundPosition:a+"% "+s+"%"}},void 0,Object(c.a)("div",{className:A()("compose-form__upload__actions",{active:!0})},void 0,Object(c.a)("button",{className:"icon-button",onClick:e.handleUndoClick},void 0,Object(c.a)(Oe.a,{id:"times"})," ",Object(c.a)(k.b,{id:"upload_form.undo",defaultMessage:"Delete"})),Object(c.a)("button",{className:"icon-button",onClick:e.handleFocalPointClick},void 0,Object(c.a)(Oe.a,{id:"pencil"})," ",Object(c.a)(k.b,{id:"upload_form.edit",defaultMessage:"Edit"}))))})))},t}(S.a);Object(u.a)(ze,"contextTypes",{router:j.a.object}),Object(u.a)(ze,"propTypes",{media:f.a.map.isRequired,onUndo:j.a.func.isRequired,onOpenFocalPoint:j.a.func.isRequired});var We=Object(i.connect)((function(e,t){var o=t.id;return{media:e.getIn(["compose","media_attachments"]).find((function(e){return e.get("id")===o}))}}),(function(e){return{onUndo:function(t){e(Object(O.kb)(t))},onOpenFocalPoint:function(t){e(Object(ke.d)("FOCAL_POINT",{id:t}))},onSubmit:function(t){e(Object(O.jb)(t))}}}))(ze),He=Object(k.f)({marked:{id:"compose_form.sensitive.marked",defaultMessage:"Media is marked as sensitive"},unmarked:{id:"compose_form.sensitive.unmarked",defaultMessage:"Media is not marked as sensitive"}}),Be=function(e){function t(){return e.apply(this,arguments)||this}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.active,o=e.disabled,n=e.onClick,a=e.intl;return Object(c.a)("div",{className:"compose-form__sensitive-button"},void 0,Object(c.a)("label",{className:A()("icon-button",{active:t}),title:a.formatMessage(t?He.marked:He.unmarked)},void 0,Object(c.a)("input",{name:"mark-sensitive",type:"checkbox",checked:t,onChange:n,disabled:o}),Object(c.a)("span",{className:A()("checkbox",{active:t})}),Object(c.a)(k.b,{id:"compose_form.sensitive.hide",defaultMessage:"Mark media as sensitive"})))},t}(p.a.PureComponent),Ge=Object(i.connect)((function(e){return{active:e.getIn(["compose","sensitive"]),disabled:e.getIn(["compose","spoiler"])}}),(function(e){return{onClick:function(){e(Object(O.O)())}}}))(Object(k.g)(Be)),Ye=function(e){function t(){return e.apply(this,arguments)||this}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props.mediaIds;return Object(c.a)("div",{className:"compose-form__upload-wrapper"},void 0,Object(c.a)(Ue,{icon:"upload",message:Object(c.a)(k.b,{id:"upload_progress.label",defaultMessage:"Uploading…"})}),Object(c.a)("div",{className:"compose-form__uploads-wrapper"},void 0,e.map((function(e){return Object(c.a)(We,{id:e},e)}))),!e.isEmpty()&&Object(c.a)(Ge,{}))},t}(S.a);Object(u.a)(Ye,"propTypes",{mediaIds:f.a.list.isRequired});var Xe,Ve,Je,Ze=Object(i.connect)((function(e){return{mediaIds:e.getIn(["compose","media_attachments"]).map((function(e){return e.get("id")}))}}))(Ye),$e=function(e){function t(){return e.apply(this,arguments)||this}return Object(l.a)(t,e),t.prototype.render=function(){var e=this.props.message;return Object(c.a)(be.a,{defaultStyle:{opacity:0,scaleX:.85,scaleY:.75},style:{opacity:fe()(1,{damping:35,stiffness:400}),scaleX:fe()(1,{damping:35,stiffness:400}),scaleY:fe()(1,{damping:35,stiffness:400})}},void 0,(function(t){var o=t.opacity,n=t.scaleX,a=t.scaleY;return Object(c.a)("div",{className:"compose-form__warning",style:{opacity:o,transform:"scale("+n+", "+a+")"}},void 0,e)}))},t}(p.a.PureComponent),Qe=o(20),et=/(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i,tt=Object(i.connect)((function(e){return{needsLockWarning:"private"===e.getIn(["compose","privacy"])&&!e.getIn(["accounts",Qe.n,"locked"]),hashtagWarning:"public"!==e.getIn(["compose","privacy"])&&et.test(e.getIn(["compose","text"])),directMessageWarning:"direct"===e.getIn(["compose","privacy"])}}))((function(e){var t=e.needsLockWarning,o=e.hashtagWarning,n=e.directMessageWarning;if(t)return Object(c.a)($e,{message:Object(c.a)(k.b,{id:"compose_form.lock_disclaimer",defaultMessage:"Your account is not {locked}. Anyone can follow you to view your follower-only posts.",values:{locked:Object(c.a)("a",{href:"/user-settings"},void 0,Object(c.a)(k.b,{id:"compose_form.lock_disclaimer.lock",defaultMessage:"locked"}))}})});if(o)return Object(c.a)($e,{message:Object(c.a)(k.b,{id:"compose_form.hashtag_warning",defaultMessage:"This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag."})});if(n){var a=Object(c.a)("span",{},void 0,Object(c.a)(k.b,{id:"compose_form.direct_message_warning",defaultMessage:"This toot will only be sent to all the mentioned users."})," ",Object(c.a)("a",{href:"/terms",target:"_blank"},void 0,Object(c.a)(k.b,{id:"compose_form.direct_message_warning_learn_more",defaultMessage:"Learn more"})));return Object(c.a)($e,{message:a})}return null})),ot=o(75),nt="><…                 \u2028\u2029\t\n\v\f\r",at=Object(k.f)({placeholder:{id:"compose_form.placeholder",defaultMessage:"What is on your mind?"},spoiler_placeholder:{id:"compose_form.spoiler_placeholder",defaultMessage:"Write your warning here"},publish:{id:"compose_form.publish",defaultMessage:"Toot"},publishLoud:{id:"compose_form.publish_loud",defaultMessage:"{publish}!"}}),st=Object(k.g)((Je=Ve=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(u.a)(Object(r.a)(t),"handleChange",(function(e){t.props.onChange(e.target.value)})),Object(u.a)(Object(r.a)(t),"handleKeyDown",(function(e){13===e.keyCode&&(e.ctrlKey||e.metaKey)&&t.handleSubmit()})),Object(u.a)(Object(r.a)(t),"handleSubmit",(function(){t.props.text!==t.autosuggestTextarea.textarea.value&&t.props.onChange(t.autosuggestTextarea.textarea.value);var e=t.props,o=e.isSubmitting,n=e.isChangingUpload,a=e.isUploading,s=e.anyMedia,i=[t.props.spoilerText,t.props.text].join("");o||a||n||Object(ot.length)(i)>Qe.m||0!==i.length&&0===i.trim().length&&!s||t.props.onSubmit(t.context.router?t.context.router.history:null)})),Object(u.a)(Object(r.a)(t),"onSuggestionsClearRequested",(function(){t.props.onClearSuggestions()})),Object(u.a)(Object(r.a)(t),"onSuggestionsFetchRequested",(function(e){t.props.onFetchSuggestions(e)})),Object(u.a)(Object(r.a)(t),"onSuggestionSelected",(function(e,o,n){t.props.onSuggestionSelected(e,o,n,["text"])})),Object(u.a)(Object(r.a)(t),"onSpoilerSuggestionSelected",(function(e,o,n){t.props.onSuggestionSelected(e,o,n,["spoiler_text"])})),Object(u.a)(Object(r.a)(t),"handleChangeSpoilerText",(function(e){t.props.onChangeSpoilerText(e.target.value)})),Object(u.a)(Object(r.a)(t),"handleFocus",(function(){if(t.composeForm&&!t.props.singleColumn){var e=t.composeForm.getBoundingClientRect(),o=e.left,n=e.right;(o<0||n>(window.innerWidth||document.documentElement.clientWidth))&&t.composeForm.scrollIntoView()}})),Object(u.a)(Object(r.a)(t),"setAutosuggestTextarea",(function(e){t.autosuggestTextarea=e})),Object(u.a)(Object(r.a)(t),"setSpoilerText",(function(e){t.spoilerText=e})),Object(u.a)(Object(r.a)(t),"setRef",(function(e){t.composeForm=e})),Object(u.a)(Object(r.a)(t),"handleEmojiPick",(function(e){var o=t.props.text,n=t.autosuggestTextarea.textarea.selectionStart,a=e.custom&&n>0&&!nt.includes(o[n-1]);t.props.onPickEmoji(n,e,a)})),t}Object(l.a)(t,e);var o=t.prototype;return o.componentDidUpdate=function(e){var t,o;this.props.focusDate!==e.focusDate?(this.props.preselectDate!==e.preselectDate?(t=this.props.text.length,o=this.props.text.search(/\s/)+1):"number"==typeof this.props.caretPosition?(o=this.props.caretPosition,t=this.props.caretPosition):o=t=this.props.text.length,this.autosuggestTextarea.textarea.setSelectionRange(o,t),this.autosuggestTextarea.textarea.focus()):e.isSubmitting&&!this.props.isSubmitting?this.autosuggestTextarea.textarea.focus():this.props.spoiler!==e.spoiler&&(this.props.spoiler?this.spoilerText.input.focus():this.autosuggestTextarea.textarea.focus())},o.render=function(){var e=this.props,t=e.intl,o=e.onPaste,n=e.showSearch,a=e.anyMedia,s=this.props.isSubmitting,i=[this.props.spoilerText,this.props.text].join(""),r=s||this.props.isUploading||this.props.isChangingUpload||Object(ot.length)(i)>Qe.m||0!==i.length&&0===i.trim().length&&!a,l="";return l="private"===this.props.privacy||"direct"===this.props.privacy?Object(c.a)("span",{className:"compose-form__publish-private"},void 0,Object(c.a)(Oe.a,{id:"lock"})," ",t.formatMessage(at.publish)):"unlisted"!==this.props.privacy?t.formatMessage(at.publishLoud,{publish:t.formatMessage(at.publish)}):t.formatMessage(at.publish),Object(c.a)("div",{className:"compose-form"},void 0,Object(c.a)(tt,{}),Object(c.a)(D,{}),p.a.createElement("div",{className:"spoiler-input "+(this.props.spoiler?"spoiler-input--visible":""),ref:this.setRef},p.a.createElement(H,{placeholder:t.formatMessage(at.spoiler_placeholder),value:this.props.spoilerText,onChange:this.handleChangeSpoilerText,onKeyDown:this.handleKeyDown,disabled:!this.props.spoiler,ref:this.setSpoilerText,suggestions:this.props.suggestions,onSuggestionsFetchRequested:this.onSuggestionsFetchRequested,onSuggestionsClearRequested:this.onSuggestionsClearRequested,onSuggestionSelected:this.onSpoilerSuggestionSelected,searchTokens:[":"],id:"cw-spoiler-input",className:"spoiler-input__input"})),p.a.createElement(L,{ref:this.setAutosuggestTextarea,placeholder:t.formatMessage(at.placeholder),disabled:s,value:this.props.text,onChange:this.handleChange,suggestions:this.props.suggestions,onFocus:this.handleFocus,onKeyDown:this.handleKeyDown,onSuggestionsFetchRequested:this.onSuggestionsFetchRequested,onSuggestionsClearRequested:this.onSuggestionsClearRequested,onSuggestionSelected:this.onSuggestionSelected,onPaste:o,autoFocus:!n&&!Object(Se.b)(window.innerWidth)},Object(c.a)(Pe,{onPickEmoji:this.handleEmojiPick}),Object(c.a)("div",{className:"compose-form__modifiers"},void 0,Object(c.a)(Ze,{}),Object(c.a)(Ke,{}))),Object(c.a)("div",{className:"compose-form__buttons-wrapper"},void 0,Object(c.a)("div",{className:"compose-form__buttons"},void 0,Object(c.a)(ie,{}),Object(c.a)(oe,{}),Object(c.a)(Me,{}),Object(c.a)(ue,{})),Object(c.a)("div",{className:"character-counter__wrapper"},void 0,Object(c.a)(g.a,{max:Qe.m,text:i}))),Object(c.a)("div",{className:"compose-form__publish"},void 0,Object(c.a)("div",{className:"compose-form__publish-button-wrapper"},void 0,Object(c.a)(b.a,{text:l,onClick:this.handleSubmit,disabled:r,block:!0}))))},t}(S.a),Object(u.a)(Ve,"contextTypes",{router:j.a.object}),Object(u.a)(Ve,"propTypes",{intl:j.a.object.isRequired,text:j.a.string.isRequired,suggestions:f.a.list,spoiler:j.a.bool,privacy:j.a.string,spoilerText:j.a.string,focusDate:j.a.instanceOf(Date),caretPosition:j.a.number,preselectDate:j.a.instanceOf(Date),isSubmitting:j.a.bool,isChangingUpload:j.a.bool,isUploading:j.a.bool,onChange:j.a.func.isRequired,onSubmit:j.a.func.isRequired,onClearSuggestions:j.a.func.isRequired,onFetchSuggestions:j.a.func.isRequired,onSuggestionSelected:j.a.func.isRequired,onChangeSpoilerText:j.a.func.isRequired,onPaste:j.a.func.isRequired,onPickEmoji:j.a.func.isRequired,showSearch:j.a.bool,anyMedia:j.a.bool,singleColumn:j.a.bool}),Object(u.a)(Ve,"defaultProps",{showSearch:!1}),Xe=Je))||Xe;t.a=Object(i.connect)((function(e){return{text:e.getIn(["compose","text"]),suggestions:e.getIn(["compose","suggestions"]),spoiler:e.getIn(["compose","spoiler"]),spoilerText:e.getIn(["compose","spoiler_text"]),privacy:e.getIn(["compose","privacy"]),focusDate:e.getIn(["compose","focusDate"]),caretPosition:e.getIn(["compose","caretPosition"]),preselectDate:e.getIn(["compose","preselectDate"]),isSubmitting:e.getIn(["compose","is_submitting"]),isChangingUpload:e.getIn(["compose","is_changing_upload"]),isUploading:e.getIn(["compose","is_uploading"]),showSearch:e.getIn(["search","submitted"])&&!e.getIn(["search","hidden"]),anyMedia:e.getIn(["compose","media_attachments"]).size>0}}),(function(e){return{onChange:function(t){e(Object(O.N)(t))},onSubmit:function(t){e(Object(O.jb)(t))},onClearSuggestions:function(){e(Object(O.W)())},onFetchSuggestions:function(t){e(Object(O.Z)(t))},onSuggestionSelected:function(t,o,n,a){e(Object(O.ib)(t,o,n,a))},onChangeSpoilerText:function(t){e(Object(O.P)(t))},onPaste:function(t){e(Object(O.mb)(t))},onPickEmoji:function(t,o,n){e(Object(O.bb)(t,o,n))}}}))(st)},761:function(e,t,o){"use strict";var n=o(13),a=o(6),s=o(756),i=o(711),c=o(47),r=o(20),l=Object(a.f)({logoutMessage:{id:"confirmations.logout.message",defaultMessage:"Are you sure you want to log out?"},logoutConfirm:{id:"confirmations.logout.confirm",defaultMessage:"Log out"}});t.a=Object(a.g)(Object(n.connect)((function(e){return{account:e.getIn(["accounts",r.n])}}),(function(e,t){var o=t.intl;return{onLogout:function(){e(Object(c.d)("CONFIRM",{message:o.formatMessage(l.logoutMessage),confirm:o.formatMessage(l.logoutConfirm),onConfirm:function(){return Object(i.a)()}}))}}}))(s.a))},787:function(e,t,o){"use strict";o.r(t),o.d(t,"default",(function(){return M}));var n,a=o(0),s=o(2),i=o(7),c=o(1),r=o(3),l=o.n(r),u=o(578),d=o(761),p=o(13),g=o(21),b=o(316),m=o(6),f=o(755),h=o(97),j=o(34),O=o.n(j),v=o(1145),y=o(47),_=o(20),C=o(26),k=o(711),S=Object(m.f)({start:{id:"getting_started.heading",defaultMessage:"Getting started"},home_timeline:{id:"tabs_bar.home",defaultMessage:"Home"},notifications:{id:"tabs_bar.notifications",defaultMessage:"Notifications"},public:{id:"navigation_bar.public_timeline",defaultMessage:"Federated timeline"},community:{id:"navigation_bar.community_timeline",defaultMessage:"Local timeline"},preferences:{id:"navigation_bar.preferences",defaultMessage:"Preferences"},logout:{id:"navigation_bar.logout",defaultMessage:"Logout"},compose:{id:"navigation_bar.compose",defaultMessage:"Compose new toot"},logoutMessage:{id:"confirmations.logout.message",defaultMessage:"Are you sure you want to log out?"},logoutConfirm:{id:"confirmations.logout.confirm",defaultMessage:"Log out"}}),M=Object(p.connect)((function(e,t){return{columns:e.getIn(["settings","columns"]),showSearch:t.multiColumn?e.getIn(["search","submitted"])&&!e.getIn(["search","hidden"]):t.isSearchPage}}))(n=Object(m.g)(n=function(e){function t(){for(var t,o=arguments.length,n=new Array(o),a=0;a<o;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(c.a)(Object(s.a)(t),"handleLogoutClick",(function(e){var o=t.props,n=o.dispatch,a=o.intl;return e.preventDefault(),e.stopPropagation(),n(Object(y.d)("CONFIRM",{message:a.formatMessage(S.logoutMessage),confirm:a.formatMessage(S.logoutConfirm),onConfirm:function(){return Object(k.a)()}})),!1})),Object(c.a)(Object(s.a)(t),"onFocus",(function(){t.props.dispatch(Object(g.S)(!0))})),Object(c.a)(Object(s.a)(t),"onBlur",(function(){t.props.dispatch(Object(g.S)(!1))})),t}Object(i.a)(t,e);var o=t.prototype;return o.componentDidMount=function(){this.props.isSearchPage||this.props.dispatch(Object(g.db)())},o.componentWillUnmount=function(){this.props.isSearchPage||this.props.dispatch(Object(g.lb)())},o.render=function(){var e=this.props,t=e.multiColumn,o=e.showSearch,n=e.isSearchPage,s=e.intl,i="";if(t){var c=this.props.columns;i=Object(a.a)("nav",{className:"drawer__header"},void 0,Object(a.a)(b.a,{to:"/getting-started",className:"drawer__tab",title:s.formatMessage(S.start),"aria-label":s.formatMessage(S.start)},void 0,Object(a.a)(C.a,{id:"bars",fixedWidth:!0})),!c.some((function(e){return"HOME"===e.get("id")}))&&Object(a.a)(b.a,{to:"/timelines/home",className:"drawer__tab",title:s.formatMessage(S.home_timeline),"aria-label":s.formatMessage(S.home_timeline)},void 0,Object(a.a)(C.a,{id:"home",fixedWidth:!0})),!c.some((function(e){return"NOTIFICATIONS"===e.get("id")}))&&Object(a.a)(b.a,{to:"/notifications",className:"drawer__tab",title:s.formatMessage(S.notifications),"aria-label":s.formatMessage(S.notifications)},void 0,Object(a.a)(C.a,{id:"bell",fixedWidth:!0})),!c.some((function(e){return"COMMUNITY"===e.get("id")}))&&Object(a.a)(b.a,{to:"/timelines/public/local",className:"drawer__tab",title:s.formatMessage(S.community),"aria-label":s.formatMessage(S.community)},void 0,Object(a.a)(C.a,{id:"users",fixedWidth:!0})),!c.some((function(e){return"PUBLIC"===e.get("id")}))&&Object(a.a)(b.a,{to:"/timelines/public",className:"drawer__tab",title:s.formatMessage(S.public),"aria-label":s.formatMessage(S.public)},void 0,Object(a.a)(C.a,{id:"globe",fixedWidth:!0})),Object(a.a)("a",{href:"/user-settings",className:"drawer__tab",title:s.formatMessage(S.preferences),"aria-label":s.formatMessage(S.preferences)},void 0,Object(a.a)(C.a,{id:"cog",fixedWidth:!0})),Object(a.a)("a",{href:"/auth/sign_out",className:"drawer__tab",title:s.formatMessage(S.logout),"aria-label":s.formatMessage(S.logout),onClick:this.handleLogoutClick},void 0,Object(a.a)(C.a,{id:"sign-out",fixedWidth:!0})))}return Object(a.a)("div",{className:"drawer",role:"region","aria-label":s.formatMessage(S.compose)},void 0,i,(t||n)&&Object(a.a)(f.a,{}),Object(a.a)("div",{className:"drawer__pager"},void 0,!n&&Object(a.a)("div",{className:"drawer__inner",onFocus:this.onFocus},void 0,Object(a.a)(d.a,{onClose:this.onBlur}),Object(a.a)(u.a,{}),Object(a.a)("div",{className:"drawer__inner__mastodon"},void 0,Object(a.a)("img",{alt:"",draggable:"false",src:_.l||elephantUIPlane}))),Object(a.a)(h.a,{defaultStyle:{x:n?0:-100},style:{x:O()(o||n?0:-100,{stiffness:210,damping:20})}},void 0,(function(e){var t=e.x;return Object(a.a)("div",{className:"drawer__inner darker",style:{transform:"translateX("+t+"%)",visibility:-100===t?"hidden":"visible"}},void 0,Object(a.a)(v.a,{}))}))))},t}(l.a.PureComponent))||n)||n}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{404:function(e,t,o){"use strict";(function(e){o.d(t,"a",(function(){return u}));var a=o(0),n=(o(9),o(6),o(8)),s=o(3),i=o.n(s),c=o(83),r=o.n(c);var l=e.env.CDN_HOST||"",u=function(e){Object(n.a)(o,e);var t;t=o;function o(){return e.apply(this,arguments)||this}return o.prototype.render=function(){var e,t=this.props.emoji;if(t.custom)e=t.imageUrl;else{var o=r.a[t.native]||r.a[t.native.replace(/\uFE0F$/,"")];if(!o)return null;e=l+"/emoji/"+o.filename+".svg"}return(Object(a.a)("div",{className:"autosuggest-emoji"},void 0,Object(a.a)("img",{className:"emojione",src:e,alt:t.native||t.colons}),t.colons))},o}(i.a.PureComponent)}).call(this,o(50))},588:function(e,t,o){"use strict";var a,n,s,i=o(15),c=o(0),r=o(2),l=o(9),u=o(6),p=o(8),d=o(1),g=o(3),b=o.n(g),f=o(320),m=o(110),h=o(16),O=o.n(h),v=o(5),j=o.n(v),y=o(23),_=o(210),C=o(115),S=o(53),M=o(122),k=o(7),w=o(21),x=o(222),T=o(282);var R=Object(k.f)({cancel:{id:"reply_indicator.cancel",defaultMessage:"Cancel"}}),N=Object(k.g)((s=n=function(e){Object(p.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"handleClick",(function(){t.props.onCancel()})),Object(d.a)(Object(r.a)(t),"handleAccountClick",(function(e){0!==e.button||e.ctrlKey||e.metaKey||(e.preventDefault(),t.context.router.history.push("/accounts/"+t.props.status.getIn(["account","id"])))})),t}return o.prototype.render=function(){var e=this.props,t=e.status,o=e.intl;if(!t)return null;var a={__html:t.get("contentHtml")},n={direction:Object(x.a)(t.get("search_index"))?"rtl":"ltr"};return Object(c.a)("div",{className:"reply-indicator"},void 0,Object(c.a)("div",{className:"reply-indicator__header"},void 0,Object(c.a)("div",{className:"reply-indicator__cancel"},void 0,Object(c.a)(S.a,{title:o.formatMessage(R.cancel),icon:"times",onClick:this.handleClick,inverted:!0})),Object(c.a)("a",{href:t.getIn(["account","url"]),onClick:this.handleAccountClick,className:"reply-indicator__display-name"},void 0,Object(c.a)("div",{className:"reply-indicator__display-avatar"},void 0,Object(c.a)(C.a,{account:t.get("account"),size:24})),Object(c.a)(M.a,{account:t.get("account")}))),Object(c.a)("div",{className:"reply-indicator__content",style:n,dangerouslySetInnerHTML:a}),t.get("media_attachments").size>0&&Object(c.a)(T.a,{compact:!0,media:t.get("media_attachments")}))},o}(w.a),Object(d.a)(n,"contextTypes",{router:j.a.object}),Object(d.a)(n,"propTypes",{status:O.a.map,onCancel:j.a.func.isRequired,intl:j.a.object.isRequired}),a=s))||a,D=Object(i.connect)((function(){var e=Object(_.f)();return function(t){return{status:e(t,{id:t.getIn(["compose","in_reply_to"])})}}}),(function(e){return{onCancel:function(){e(Object(y.M)())}}}))(N);var I=function(e){Object(p.a)(o,e);var t;t=o;function o(){return e.apply(this,arguments)||this}return o.prototype.render=function(){var e=this.props.account;return(Object(c.a)("div",{className:"autosuggest-account",title:e.get("acct")},void 0,Object(c.a)("div",{className:"autosuggest-account-icon"},void 0,Object(c.a)(C.a,{account:e,size:18})),Object(c.a)(M.a,{account:e})))},o}(w.a);Object(d.a)(I,"propTypes",{account:O.a.map.isRequired});var P=Object(i.connect)((function(){var e=Object(_.d)();return function(t,o){var a=o.id;return{account:e(t,a)}}}))(I),F=o(404),q=o(421);var A=function(e){Object(p.a)(o,e);var t;t=o;function o(){return e.apply(this,arguments)||this}return o.prototype.render=function(){var e=this.props.tag,t=e.history&&Object(q.a)(e.history.reduce((function(e,t){return e+1*t.uses}),0));return Object(c.a)("div",{className:"autosuggest-hashtag"},void 0,Object(c.a)("div",{className:"autosuggest-hashtag__name"},void 0,"#",Object(c.a)("strong",{},void 0,e.name)),void 0!==e.history&&Object(c.a)("div",{className:"autosuggest-hashtag__uses"},void 0,Object(c.a)(k.b,{id:"autosuggest_hashtag.per_week",defaultMessage:"{count} per week",values:{count:t}})))},o}(b.a.PureComponent),E=o(151),K=o(14),U=o.n(K);var W=function(e,t){var o,a=e.slice(0,t).search(/\S+$/),n=e.slice(t).search(/\s/);return!(o=n<0?e.slice(a):e.slice(a,n+t))||o.trim().length<3||-1===["@",":","#"].indexOf(o[0])?[null,null]:(o=o.trim().toLowerCase()).length>0?[a+1,o]:[null,null]},L=function(e){Object(p.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"state",{suggestionsHidden:!0,focused:!1,selectedSuggestion:0,lastToken:null,tokenStart:0}),Object(d.a)(Object(r.a)(t),"onChange",(function(e){var o=W(e.target.value,e.target.selectionStart),a=o[0],n=o[1];null!==n&&t.state.lastToken!==n?(t.setState({lastToken:n,selectedSuggestion:0,tokenStart:a}),t.props.onSuggestionsFetchRequested(n)):null===n&&(t.setState({lastToken:null}),t.props.onSuggestionsClearRequested()),t.props.onChange(e)})),Object(d.a)(Object(r.a)(t),"onKeyDown",(function(e){var o=t.props,a=o.suggestions,n=o.disabled,s=t.state,i=s.selectedSuggestion,c=s.suggestionsHidden;if(n)e.preventDefault();else if(229!==e.which&&!e.isComposing){switch(e.key){case"Escape":0===a.size||c?document.querySelector(".ui").parentElement.focus():(e.preventDefault(),t.setState({suggestionsHidden:!0}));break;case"ArrowDown":a.size>0&&!c&&(e.preventDefault(),t.setState({selectedSuggestion:Math.min(i+1,a.size-1)}));break;case"ArrowUp":a.size>0&&!c&&(e.preventDefault(),t.setState({selectedSuggestion:Math.max(i-1,0)}));break;case"Enter":case"Tab":null!==t.state.lastToken&&a.size>0&&!c&&(e.preventDefault(),e.stopPropagation(),t.props.onSuggestionSelected(t.state.tokenStart,t.state.lastToken,a.get(i)))}!e.defaultPrevented&&t.props.onKeyDown&&t.props.onKeyDown(e)}})),Object(d.a)(Object(r.a)(t),"onBlur",(function(){t.setState({suggestionsHidden:!0,focused:!1})})),Object(d.a)(Object(r.a)(t),"onFocus",(function(e){t.setState({focused:!0}),t.props.onFocus&&t.props.onFocus(e)})),Object(d.a)(Object(r.a)(t),"onSuggestionClick",(function(e){var o=t.props.suggestions.get(e.currentTarget.getAttribute("data-index"));e.preventDefault(),t.props.onSuggestionSelected(t.state.tokenStart,t.state.lastToken,o),t.textarea.focus()})),Object(d.a)(Object(r.a)(t),"setTextarea",(function(e){t.textarea=e})),Object(d.a)(Object(r.a)(t),"onPaste",(function(e){e.clipboardData&&1===e.clipboardData.files.length&&(t.props.onPaste(e.clipboardData.files),e.preventDefault())})),Object(d.a)(Object(r.a)(t),"renderSuggestion",(function(e,o){var a,n,s=t.state.selectedSuggestion;return"emoji"===e.type?(a=Object(c.a)(F.a,{emoji:e}),n=e.id):"hashtag"===e.type?(a=Object(c.a)(A,{tag:e}),n=e.name):"account"===e.type&&(a=Object(c.a)(P,{id:e.id}),n=e.id),Object(c.a)("div",{role:"button",tabIndex:"0","data-index":o,className:U()("autosuggest-textarea__suggestions__item",{selected:o===s}),onMouseDown:t.onSuggestionClick},n,a)})),t}var a=o.prototype;return a.componentWillReceiveProps=function(e){e.suggestions!==this.props.suggestions&&e.suggestions.size>0&&this.state.suggestionsHidden&&this.state.focused&&this.setState({suggestionsHidden:!1})},a.render=function(){var e=this.props,t=e.value,o=e.suggestions,a=e.disabled,n=e.placeholder,s=e.onKeyUp,i=e.autoFocus,r=e.children,l=this.state.suggestionsHidden,u={direction:"ltr"};return Object(x.a)(t)&&(u.direction="rtl"),[Object(c.a)("div",{className:"compose-form__autosuggest-wrapper"},"autosuggest-wrapper",Object(c.a)("div",{className:"autosuggest-textarea"},void 0,Object(c.a)("label",{},void 0,Object(c.a)("span",{style:{display:"none"}},void 0,n),Object(c.a)(E.a,{inputRef:this.setTextarea,className:"autosuggest-textarea__textarea",disabled:a,placeholder:n,autoFocus:i,value:t,onChange:this.onChange,onKeyDown:this.onKeyDown,onKeyUp:s,onFocus:this.onFocus,onBlur:this.onBlur,onPaste:this.onPaste,style:u,"aria-autocomplete":"list"}))),r),Object(c.a)("div",{className:"autosuggest-textarea__suggestions-wrapper"},"suggestions-wrapper",Object(c.a)("div",{className:"autosuggest-textarea__suggestions "+(l||o.isEmpty()?"":"autosuggest-textarea__suggestions--visible")},void 0,o.map(this.renderSuggestion)))]},o}(w.a);Object(d.a)(L,"propTypes",{value:j.a.string,suggestions:O.a.list,disabled:j.a.bool,placeholder:j.a.string,onSuggestionSelected:j.a.func.isRequired,onSuggestionsClearRequested:j.a.func.isRequired,onSuggestionsFetchRequested:j.a.func.isRequired,onChange:j.a.func.isRequired,onKeyUp:j.a.func,onKeyDown:j.a.func,onPaste:j.a.func.isRequired,autoFocus:j.a.bool}),Object(d.a)(L,"defaultProps",{autoFocus:!0});var H=o(4);var z,B=function(e,t,o){var a,n=e.slice(0,t).search(/\S+$/),s=e.slice(t).search(/\s/);return!(a=s<0?e.slice(n):e.slice(n,s+t))||a.trim().length<3||-1===o.indexOf(a[0])?[null,null]:(a=a.trim().toLowerCase()).length>0?[n+1,a]:[null,null]},G=function(e){Object(p.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"state",{suggestionsHidden:!0,focused:!1,selectedSuggestion:0,lastToken:null,tokenStart:0}),Object(d.a)(Object(r.a)(t),"onChange",(function(e){var o=B(e.target.value,e.target.selectionStart,t.props.searchTokens),a=o[0],n=o[1];null!==n&&t.state.lastToken!==n?(t.setState({lastToken:n,selectedSuggestion:0,tokenStart:a}),t.props.onSuggestionsFetchRequested(n)):null===n&&(t.setState({lastToken:null}),t.props.onSuggestionsClearRequested()),t.props.onChange(e)})),Object(d.a)(Object(r.a)(t),"onKeyDown",(function(e){var o=t.props,a=o.suggestions,n=o.disabled,s=t.state,i=s.selectedSuggestion,c=s.suggestionsHidden;if(n)e.preventDefault();else if(229!==e.which&&!e.isComposing){switch(e.key){case"Escape":0===a.size||c?document.querySelector(".ui").parentElement.focus():(e.preventDefault(),t.setState({suggestionsHidden:!0}));break;case"ArrowDown":a.size>0&&!c&&(e.preventDefault(),t.setState({selectedSuggestion:Math.min(i+1,a.size-1)}));break;case"ArrowUp":a.size>0&&!c&&(e.preventDefault(),t.setState({selectedSuggestion:Math.max(i-1,0)}));break;case"Enter":case"Tab":null!==t.state.lastToken&&a.size>0&&!c&&(e.preventDefault(),e.stopPropagation(),t.props.onSuggestionSelected(t.state.tokenStart,t.state.lastToken,a.get(i)))}!e.defaultPrevented&&t.props.onKeyDown&&t.props.onKeyDown(e)}})),Object(d.a)(Object(r.a)(t),"onBlur",(function(){t.setState({suggestionsHidden:!0,focused:!1})})),Object(d.a)(Object(r.a)(t),"onFocus",(function(){t.setState({focused:!0})})),Object(d.a)(Object(r.a)(t),"onSuggestionClick",(function(e){var o=t.props.suggestions.get(e.currentTarget.getAttribute("data-index"));e.preventDefault(),t.props.onSuggestionSelected(t.state.tokenStart,t.state.lastToken,o),t.input.focus()})),Object(d.a)(Object(r.a)(t),"setInput",(function(e){t.input=e})),Object(d.a)(Object(r.a)(t),"renderSuggestion",(function(e,o){var a,n,s=t.state.selectedSuggestion;return"emoji"===e.type?(a=Object(c.a)(F.a,{emoji:e}),n=e.id):"hashtag"===e.type?(a=Object(c.a)(A,{tag:e}),n=e.name):"account"===e.type&&(a=Object(c.a)(P,{id:e.id}),n=e.id),Object(c.a)("div",{role:"button",tabIndex:"0","data-index":o,className:U()("autosuggest-textarea__suggestions__item",{selected:o===s}),onMouseDown:t.onSuggestionClick},n,a)})),t}var a=o.prototype;return a.componentWillReceiveProps=function(e){e.suggestions!==this.props.suggestions&&e.suggestions.size>0&&this.state.suggestionsHidden&&this.state.focused&&this.setState({suggestionsHidden:!1})},a.render=function(){var e=this.props,t=e.value,o=e.suggestions,a=e.disabled,n=e.placeholder,s=e.onKeyUp,i=e.autoFocus,r=e.className,l=e.id,u=e.maxLength,p=this.state.suggestionsHidden,d={direction:"ltr"};return Object(x.a)(t)&&(d.direction="rtl"),Object(c.a)("div",{className:"autosuggest-input"},void 0,Object(c.a)("label",{},void 0,Object(c.a)("span",{style:{display:"none"}},void 0,n),b.a.createElement("input",{type:"text",ref:this.setInput,disabled:a,placeholder:n,autoFocus:i,value:t,onChange:this.onChange,onKeyDown:this.onKeyDown,onKeyUp:s,onFocus:this.onFocus,onBlur:this.onBlur,style:d,"aria-autocomplete":"list",id:l,className:r,maxLength:u})),Object(c.a)("div",{className:"autosuggest-textarea__suggestions "+(p||o.isEmpty()?"":"autosuggest-textarea__suggestions--visible")},void 0,o.map(this.renderSuggestion)))},o}(w.a);Object(d.a)(G,"propTypes",{value:j.a.string,suggestions:O.a.list,disabled:j.a.bool,placeholder:j.a.string,onSuggestionSelected:j.a.func.isRequired,onSuggestionsClearRequested:j.a.func.isRequired,onSuggestionsFetchRequested:j.a.func.isRequired,onChange:j.a.func.isRequired,onKeyUp:j.a.func,onKeyDown:j.a.func,autoFocus:j.a.bool,className:j.a.string,id:j.a.string,searchTokens:j.a.arrayOf(j.a.string),maxLength:j.a.number}),Object(d.a)(G,"defaultProps",{autoFocus:!0,searchTokens:Object(H.List)(["@",":","#"])});var V,Y,X,J=Object(k.f)({add_poll:{id:"poll_button.add_poll",defaultMessage:"Add a poll"},remove_poll:{id:"poll_button.remove_poll",defaultMessage:"Remove poll"}}),Z={height:null,lineHeight:"27px"},$=Object(k.g)(z=function(e){Object(p.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"handleClick",(function(){t.props.onClick()})),t}return o.prototype.render=function(){var e=this.props,t=e.intl,o=e.active,a=e.unavailable,n=e.disabled;return a?null:Object(c.a)("div",{className:"compose-form__poll-button"},void 0,Object(c.a)(S.a,{icon:"tasks",title:t.formatMessage(o?J.remove_poll:J.add_poll),disabled:n,onClick:this.handleClick,className:"compose-form__poll-button-icon "+(o?"active":""),size:18,inverted:!0,style:Z}))},o}(b.a.PureComponent))||z,Q=Object(i.connect)((function(e){return{unavailable:e.getIn(["compose","is_uploading"])||e.getIn(["compose","media_attachments"]).size>0,active:null!==e.getIn(["compose","poll"])}}),(function(e){return{onClick:function(){e((function(t,o){o().getIn(["compose","poll"])?e(Object(y.eb)()):e(Object(y.K)())}))}}}))($);var ee=Object(k.f)({upload:{id:"upload_button.label",defaultMessage:"Add media ({formats})"}}),te={height:null,lineHeight:"27px"},oe=Object(i.connect)((function(){return function(e){return{acceptContentTypes:e.getIn(["media_attachments","accept_content_types"])}}}))(V=Object(k.g)((X=Y=function(e){Object(p.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"handleChange",(function(e){e.target.files.length>0&&t.props.onSelectFile(e.target.files)})),Object(d.a)(Object(r.a)(t),"handleClick",(function(){t.fileElement.click()})),Object(d.a)(Object(r.a)(t),"setRef",(function(e){t.fileElement=e})),t}return o.prototype.render=function(){var e=this.props,t=e.intl,o=e.resetFileKey,a=e.unavailable,n=e.disabled;e.acceptContentTypes;return a?null:Object(c.a)("div",{className:"compose-form__upload-button"},void 0,Object(c.a)(S.a,{icon:"paperclip",title:t.formatMessage(ee.upload,{formats:"JPEG, PNG, GIF, WebM, MP4, MOV, OGG, WAV, MP3, FLAC"}),disabled:n,onClick:this.handleClick,className:"compose-form__upload-button-icon",size:18,inverted:!0,style:te}),Object(c.a)("label",{},void 0,Object(c.a)("span",{style:{display:"none"}},void 0,t.formatMessage(ee.upload,{formats:"JPEG, PNG, GIF, WebM, MP4, MOV, OGG, WAV, MP3, FLAC"})),b.a.createElement("input",{key:o,ref:this.setRef,type:"file",multiple:!0,onChange:this.handleChange,disabled:n,style:{display:"none"}})))},o}(w.a),Object(d.a)(Y,"propTypes",{disabled:j.a.bool,unavailable:j.a.bool,onSelectFile:j.a.func.isRequired,style:j.a.object,resetFileKey:j.a.number,acceptContentTypes:O.a.listOf(j.a.string).isRequired,intl:j.a.object.isRequired}),V=X))||V)||V,ae=Object(i.connect)((function(e){return{disabled:e.getIn(["compose","is_uploading"])||e.getIn(["compose","media_attachments"]).size+e.getIn(["compose","pending_media_attachments"])>3||e.getIn(["compose","media_attachments"]).some((function(e){return["video","audio"].includes(e.get("type"))})),unavailable:null!==e.getIn(["compose","poll"]),resetFileKey:e.getIn(["compose","resetFileKey"])}}),(function(e){return{onSelectFile:function(t){e(Object(y.mb)(t))}}}))(oe);var ne,se={height:null,lineHeight:"27px",width:"23.14285722px"},ie=function(e){Object(p.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"handleClick",(function(e){e.preventDefault(),t.props.onClick()})),t}return o.prototype.render=function(){var e=this.props,t=e.label,o=e.title,a=e.active,n=e.ariaControls;return(Object(c.a)("button",{title:o,"aria-label":o,className:"text-icon-button "+(a?"active":""),"aria-expanded":a,onClick:this.handleClick,"aria-controls":n,style:se},void 0,t))},o}(b.a.PureComponent),ce=Object(k.f)({marked:{id:"compose_form.spoiler.marked",defaultMessage:"Text is hidden behind warning"},unmarked:{id:"compose_form.spoiler.unmarked",defaultMessage:"Text is not hidden"}}),re=Object(k.g)(Object(i.connect)((function(e,t){return{label:"CW",title:t.intl.formatMessage(e.getIn(["compose","spoiler"])?ce.marked:ce.unmarked),active:e.getIn(["compose","spoiler"]),ariaControls:"cw-spoiler-input"}}),(function(e){return{onClick:function(){e(Object(y.Q)())}}}))(ie)),le=o(10),ue=o(119),pe=o.n(ue),de=o(101),ge=o(35),be=o.n(ge),fe=o(66),me=o.n(fe),he=o(27);function Oe(e){return function(){var t,o=Object(u.a)(e);if(ve()){var a=Object(u.a)(this).constructor;t=Reflect.construct(o,arguments,a)}else t=o.apply(this,arguments);return Object(l.a)(this,t)}}function ve(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var je,ye,_e,Ce,Se=Object(k.f)({public_short:{id:"privacy.public.short",defaultMessage:"Public"},public_long:{id:"privacy.public.long",defaultMessage:"Visible for all, shown in public timelines"},unlisted_short:{id:"privacy.unlisted.short",defaultMessage:"Unlisted"},unlisted_long:{id:"privacy.unlisted.long",defaultMessage:"Visible for all, but not in public timelines"},private_short:{id:"privacy.private.short",defaultMessage:"Followers-only"},private_long:{id:"privacy.private.long",defaultMessage:"Visible for followers only"},direct_short:{id:"privacy.direct.short",defaultMessage:"Direct"},direct_long:{id:"privacy.direct.long",defaultMessage:"Visible for mentioned users only"},change_privacy:{id:"privacy.change",defaultMessage:"Adjust status privacy"}}),Me=!!me.a.hasSupport&&{passive:!0},ke=function(e){Object(p.a)(t,e);Oe(t);function t(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"state",{mounted:!1}),Object(d.a)(Object(r.a)(t),"handleDocumentClick",(function(e){t.node&&!t.node.contains(e.target)&&t.props.onClose()})),Object(d.a)(Object(r.a)(t),"handleKeyDown",(function(e){var o,a=t.props.items,n=e.currentTarget.getAttribute("data-index"),s=a.findIndex((function(e){return e.value===n}));switch(e.key){case"Escape":t.props.onClose();break;case"Enter":t.handleClick(e);break;case"ArrowDown":(o=t.node.childNodes[s+1])&&(o.focus(),t.props.onChange(o.getAttribute("data-index")));break;case"ArrowUp":(o=t.node.childNodes[s-1])&&(o.focus(),t.props.onChange(o.getAttribute("data-index")));break;case"Tab":(o=e.shiftKey?t.node.childNodes[s-1]||t.node.lastChild:t.node.childNodes[s+1]||t.node.firstChild)&&(o.focus(),t.props.onChange(o.getAttribute("data-index")),e.preventDefault(),e.stopPropagation());break;case"Home":(o=t.node.firstChild)&&(o.focus(),t.props.onChange(o.getAttribute("data-index")));break;case"End":(o=t.node.lastChild)&&(o.focus(),t.props.onChange(o.getAttribute("data-index")))}})),Object(d.a)(Object(r.a)(t),"handleClick",(function(e){var o=e.currentTarget.getAttribute("data-index");e.preventDefault(),t.props.onClose(),t.props.onChange(o)})),Object(d.a)(Object(r.a)(t),"setRef",(function(e){t.node=e})),Object(d.a)(Object(r.a)(t),"setFocusRef",(function(e){t.focusedItem=e})),t}var o=t.prototype;return o.componentDidMount=function(){document.addEventListener("click",this.handleDocumentClick,!1),document.addEventListener("touchend",this.handleDocumentClick,Me),this.focusedItem&&this.focusedItem.focus(),this.setState({mounted:!0})},o.componentWillUnmount=function(){document.removeEventListener("click",this.handleDocumentClick,!1),document.removeEventListener("touchend",this.handleDocumentClick,Me)},o.render=function(){var e=this,t=this.state.mounted,o=this.props,a=o.style,n=o.items,s=o.placement,i=o.value;return Object(c.a)(de.a,{defaultStyle:{opacity:0,scaleX:.85,scaleY:.75},style:{opacity:be()(1,{damping:35,stiffness:400}),scaleX:be()(1,{damping:35,stiffness:400}),scaleY:be()(1,{damping:35,stiffness:400})}},void 0,(function(o){var r=o.opacity,l=o.scaleX,u=o.scaleY;return(b.a.createElement("div",{className:"privacy-dropdown__dropdown "+s,style:Object(le.default)({},a,{opacity:r,transform:t?"scale("+l+", "+u+")":null,zIndex:2}),role:"listbox",ref:e.setRef},n.map((function(t){return b.a.createElement("div",{role:"option",tabIndex:"0",key:t.value,"data-index":t.value,onKeyDown:e.handleKeyDown,onClick:e.handleClick,className:U()("privacy-dropdown__option",{active:t.value===i}),"aria-selected":t.value===i,ref:t.value===i?e.setFocusRef:null},Object(c.a)("div",{className:"privacy-dropdown__option__icon"},void 0,Object(c.a)(he.a,{id:t.icon,fixedWidth:!0})),Object(c.a)("div",{className:"privacy-dropdown__option__content"},void 0,Object(c.a)("strong",{},void 0,t.text),t.meta))}))))}))},t}(b.a.PureComponent),we=Object(k.g)(ne=function(e){Object(p.a)(t,e);Oe(t);function t(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"state",{open:!1,placement:"bottom"}),Object(d.a)(Object(r.a)(t),"handleToggle",(function(e){var o=e.target;if(t.props.isUserTouching())t.state.open?t.props.onModalClose():t.props.onModalOpen({actions:t.options.map((function(e){return Object(le.default)({},e,{active:e.value===t.props.value})})),onClick:t.handleModalActionClick});else{var a=o.getBoundingClientRect().top;t.state.open&&t.activeElement&&t.activeElement.focus(),t.setState({placement:2*a<innerHeight?"bottom":"top"}),t.setState({open:!t.state.open})}})),Object(d.a)(Object(r.a)(t),"handleModalActionClick",(function(e){e.preventDefault();var o=t.options[e.currentTarget.getAttribute("data-index")].value;t.props.onModalClose(),t.props.onChange(o)})),Object(d.a)(Object(r.a)(t),"handleKeyDown",(function(e){switch(e.key){case"Escape":t.handleClose()}})),Object(d.a)(Object(r.a)(t),"handleMouseDown",(function(){t.state.open||(t.activeElement=document.activeElement)})),Object(d.a)(Object(r.a)(t),"handleButtonKeyDown",(function(e){switch(e.key){case" ":case"Enter":t.handleMouseDown()}})),Object(d.a)(Object(r.a)(t),"handleClose",(function(){t.state.open&&t.activeElement&&t.activeElement.focus(),t.setState({open:!1})})),Object(d.a)(Object(r.a)(t),"handleChange",(function(e){t.props.onChange(e)})),t}var o=t.prototype;return o.componentWillMount=function(){var e=this.props.intl.formatMessage;this.options=[{icon:"globe",value:"public",text:e(Se.public_short),meta:e(Se.public_long)},{icon:"unlock",value:"unlisted",text:e(Se.unlisted_short),meta:e(Se.unlisted_long)},{icon:"lock",value:"private",text:e(Se.private_short),meta:e(Se.private_long)},{icon:"envelope",value:"direct",text:e(Se.direct_short),meta:e(Se.direct_long)}]},o.render=function(){var e=this.props,t=e.value,o=e.intl,a=this.state,n=a.open,s=a.placement,i=this.options.find((function(e){return e.value===t}));return Object(c.a)("div",{className:U()("privacy-dropdown",s,{active:n}),onKeyDown:this.handleKeyDown},void 0,Object(c.a)("div",{className:U()("privacy-dropdown__value",{active:this.options.indexOf(i)===("bottom"===s?0:this.options.length-1)})},void 0,Object(c.a)(S.a,{className:"privacy-dropdown__value-icon",icon:i.icon,title:o.formatMessage(Se.change_privacy),size:18,expanded:n,active:n,inverted:!0,onClick:this.handleToggle,onMouseDown:this.handleMouseDown,onKeyDown:this.handleButtonKeyDown,style:{height:null,lineHeight:"27px"}})),Object(c.a)(pe.a,{show:n,placement:s,target:this},void 0,Object(c.a)(ke,{items:this.options,value:t,onClose:this.handleClose,onChange:this.handleChange,placement:s})))},t}(b.a.PureComponent))||ne,xe=o(48),Te=o(120),Re=Object(i.connect)((function(e){return{isModalOpen:"ACTIONS"===e.get("modal").modalType,value:e.getIn(["compose","privacy"])}}),(function(e){return{onChange:function(t){e(Object(y.R)(t))},isUserTouching:Te.c,onModalOpen:function(t){return e(Object(xe.d)("ACTIONS",t))},onModalClose:function(){return e(Object(xe.c)())}}}))(we),Ne=o(546),De=o(32);function Ie(e){return function(){var t,o=Object(u.a)(e);if(Pe()){var a=Object(u.a)(this).constructor;t=Reflect.construct(o,arguments,a)}else t=o.apply(this,arguments);return Object(l.a)(this,t)}}function Pe(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var Fe=Object(k.f)({option_placeholder:{id:"compose_form.poll.option_placeholder",defaultMessage:"Choice {number}"},add_option:{id:"compose_form.poll.add_option",defaultMessage:"Add a choice"},remove_option:{id:"compose_form.poll.remove_option",defaultMessage:"Remove this choice"},poll_duration:{id:"compose_form.poll.duration",defaultMessage:"Poll duration"},switchToMultiple:{id:"compose_form.poll.switch_to_multiple",defaultMessage:"Change poll to allow multiple choices"},switchToSingle:{id:"compose_form.poll.switch_to_single",defaultMessage:"Change poll to allow for a single choice"},minutes:{id:"intervals.full.minutes",defaultMessage:"{number, plural, one {# minute} other {# minutes}}"},hours:{id:"intervals.full.hours",defaultMessage:"{number, plural, one {# hour} other {# hours}}"},days:{id:"intervals.full.days",defaultMessage:"{number, plural, one {# day} other {# days}}"}}),qe=Object(k.g)(je=function(e){Object(p.a)(t,e);Ie(t);function t(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"handleOptionTitleChange",(function(e){t.props.onChange(t.props.index,e.target.value)})),Object(d.a)(Object(r.a)(t),"handleOptionRemove",(function(){t.props.onRemove(t.props.index)})),Object(d.a)(Object(r.a)(t),"handleToggleMultiple",(function(e){t.props.onToggleMultiple(),e.preventDefault(),e.stopPropagation()})),Object(d.a)(Object(r.a)(t),"handleCheckboxKeypress",(function(e){"Enter"!==e.key&&" "!==e.key||t.handleToggleMultiple(e)})),Object(d.a)(Object(r.a)(t),"onSuggestionsClearRequested",(function(){t.props.onClearSuggestions()})),Object(d.a)(Object(r.a)(t),"onSuggestionsFetchRequested",(function(e){t.props.onFetchSuggestions(e)})),Object(d.a)(Object(r.a)(t),"onSuggestionSelected",(function(e,o,a){t.props.onSuggestionSelected(e,o,a,["poll","options",t.props.index])})),t}return t.prototype.render=function(){var e=this.props,t=e.isPollMultiple,o=e.title,a=e.index,n=e.intl;return(Object(c.a)("li",{},void 0,Object(c.a)("label",{className:"poll__option editable"},void 0,Object(c.a)("span",{className:U()("poll__input",{checkbox:t}),onClick:this.handleToggleMultiple,onKeyPress:this.handleCheckboxKeypress,role:"button",tabIndex:"0",title:n.formatMessage(t?Fe.switchToSingle:Fe.switchToMultiple),"aria-label":n.formatMessage(t?Fe.switchToSingle:Fe.switchToMultiple)}),Object(c.a)(G,{placeholder:n.formatMessage(Fe.option_placeholder,{number:a+1}),maxLength:100,value:o,onChange:this.handleOptionTitleChange,suggestions:this.props.suggestions,onSuggestionsFetchRequested:this.onSuggestionsFetchRequested,onSuggestionsClearRequested:this.onSuggestionsClearRequested,onSuggestionSelected:this.onSuggestionSelected,searchTokens:[":"]})),Object(c.a)("div",{className:"poll__cancel"},void 0,Object(c.a)(S.a,{disabled:a<=1,title:n.formatMessage(Fe.remove_option),icon:"times",onClick:this.handleOptionRemove}))))},t}(b.a.PureComponent))||je,Ae=Object(k.g)((Ce=_e=function(e){Object(p.a)(t,e);Ie(t);function t(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"handleAddOption",(function(){t.props.onAddOption("")})),Object(d.a)(Object(r.a)(t),"handleSelectDuration",(function(e){t.props.onChangeSettings(e.target.value,t.props.isMultiple)})),Object(d.a)(Object(r.a)(t),"handleToggleMultiple",(function(){t.props.onChangeSettings(t.props.expiresIn,!t.props.isMultiple)})),t}return t.prototype.render=function(){var e=this,t=this.props,o=t.options,a=t.expiresIn,n=t.isMultiple,s=t.onChangeOption,i=t.onRemoveOption,r=t.intl,l=Object(De.default)(t,["options","expiresIn","isMultiple","onChangeOption","onRemoveOption","intl"]);return o?Object(c.a)("div",{className:"compose-form__poll-wrapper"},void 0,Object(c.a)("ul",{},void 0,o.map((function(t,o){return b.a.createElement(qe,Object(le.default)({title:t,key:o,index:o,onChange:s,onRemove:i,isPollMultiple:n,onToggleMultiple:e.handleToggleMultiple},l))}))),Object(c.a)("div",{className:"poll__footer"},void 0,Object(c.a)("button",{disabled:o.size>=5,className:"button button-secondary",onClick:this.handleAddOption},void 0,Object(c.a)(he.a,{id:"plus"})," ",b.a.createElement(k.b,Fe.add_option)),Object(c.a)("select",{value:a,onChange:this.handleSelectDuration},void 0,Object(c.a)("option",{value:300},void 0,r.formatMessage(Fe.minutes,{number:5})),Object(c.a)("option",{value:1800},void 0,r.formatMessage(Fe.minutes,{number:30})),Object(c.a)("option",{value:3600},void 0,r.formatMessage(Fe.hours,{number:1})),Object(c.a)("option",{value:21600},void 0,r.formatMessage(Fe.hours,{number:6})),Object(c.a)("option",{value:86400},void 0,r.formatMessage(Fe.days,{number:1})),Object(c.a)("option",{value:259200},void 0,r.formatMessage(Fe.days,{number:3})),Object(c.a)("option",{value:604800},void 0,r.formatMessage(Fe.days,{number:7}))))):null},t}(w.a),Object(d.a)(_e,"propTypes",{options:O.a.list,expiresIn:j.a.number,isMultiple:j.a.bool,onChangeOption:j.a.func.isRequired,onAddOption:j.a.func.isRequired,onRemoveOption:j.a.func.isRequired,onChangeSettings:j.a.func.isRequired,suggestions:O.a.list,onClearSuggestions:j.a.func.isRequired,onFetchSuggestions:j.a.func.isRequired,onSuggestionSelected:j.a.func.isRequired,intl:j.a.object.isRequired}),ye=Ce))||ye,Ee=Object(i.connect)((function(e){return{suggestions:e.getIn(["compose","suggestions"]),options:e.getIn(["compose","poll","options"]),expiresIn:e.getIn(["compose","poll","expires_in"]),isMultiple:e.getIn(["compose","poll","multiple"])}}),(function(e){return{onAddOption:function(t){e(Object(y.L)(t))},onRemoveOption:function(t){e(Object(y.fb)(t))},onChangeOption:function(t,o){e(Object(y.T)(t,o))},onChangeSettings:function(t,o){e(Object(y.U)(t,o))},onClearSuggestions:function(){e(Object(y.W)())},onFetchSuggestions:function(t){e(Object(y.Z)(t))},onSuggestionSelected:function(t,o,a,n){e(Object(y.ib)(t,o,a,n))}}}))(Ae),Ke=o(319),Ue=Object(i.connect)((function(e){return{active:e.getIn(["compose","is_uploading"]),progress:e.getIn(["compose","progress"])}}))(Ke.a);var We=function(e){Object(p.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"handleUndoClick",(function(e){e.stopPropagation(),t.props.onUndo(t.props.media.get("id"))})),Object(d.a)(Object(r.a)(t),"handleFocalPointClick",(function(e){e.stopPropagation(),t.props.onOpenFocalPoint(t.props.media.get("id"))})),t}return o.prototype.render=function(){var e=this,t=this.props.media,o=t.getIn(["meta","focus","x"]),a=t.getIn(["meta","focus","y"]),n=100*(o/2+.5),s=100*(a/-2+.5);return Object(c.a)("div",{className:"compose-form__upload",tabIndex:"0",role:"button"},void 0,Object(c.a)(de.a,{defaultStyle:{scale:.8},style:{scale:be()(1,{stiffness:180,damping:12})}},void 0,(function(o){var a=o.scale;return(Object(c.a)("div",{className:"compose-form__upload-thumbnail",style:{transform:"scale("+a+")",backgroundImage:"url("+t.get("preview_url")+")",backgroundPosition:n+"% "+s+"%"}},void 0,Object(c.a)("div",{className:U()("compose-form__upload__actions",{active:!0})},void 0,Object(c.a)("button",{className:"icon-button",onClick:e.handleUndoClick},void 0,Object(c.a)(he.a,{id:"times"})," ",Object(c.a)(k.b,{id:"upload_form.undo",defaultMessage:"Delete"})),Object(c.a)("button",{className:"icon-button",onClick:e.handleFocalPointClick},void 0,Object(c.a)(he.a,{id:"pencil"})," ",Object(c.a)(k.b,{id:"upload_form.edit",defaultMessage:"Edit"})))))})))},o}(w.a);Object(d.a)(We,"contextTypes",{router:j.a.object}),Object(d.a)(We,"propTypes",{media:O.a.map.isRequired,onUndo:j.a.func.isRequired,onOpenFocalPoint:j.a.func.isRequired});var Le=Object(i.connect)((function(e,t){var o=t.id;return{media:e.getIn(["compose","media_attachments"]).find((function(e){return e.get("id")===o}))}}),(function(e){return{onUndo:function(t){e(Object(y.kb)(t))},onOpenFocalPoint:function(t){e(Object(xe.d)("FOCAL_POINT",{id:t}))},onSubmit:function(t){e(Object(y.jb)(t))}}}))(We);var He=Object(k.f)({marked:{id:"compose_form.sensitive.marked",defaultMessage:"Media is marked as sensitive"},unmarked:{id:"compose_form.sensitive.unmarked",defaultMessage:"Media is not marked as sensitive"}}),ze=function(e){Object(p.a)(o,e);var t;t=o;function o(){return e.apply(this,arguments)||this}return o.prototype.render=function(){var e=this.props,t=e.active,o=e.disabled,a=e.onClick,n=e.intl;return(Object(c.a)("div",{className:"compose-form__sensitive-button"},void 0,Object(c.a)("label",{className:U()("icon-button",{active:t}),title:n.formatMessage(t?He.marked:He.unmarked)},void 0,Object(c.a)("input",{name:"mark-sensitive",type:"checkbox",checked:t,onChange:a,disabled:o}),Object(c.a)("span",{className:U()("checkbox",{active:t})}),Object(c.a)(k.b,{id:"compose_form.sensitive.hide",defaultMessage:"Mark media as sensitive"}))))},o}(b.a.PureComponent),Be=Object(i.connect)((function(e){return{active:e.getIn(["compose","sensitive"]),disabled:e.getIn(["compose","spoiler"])}}),(function(e){return{onClick:function(){e(Object(y.O)())}}}))(Object(k.g)(ze));var Ge=function(e){Object(p.a)(o,e);var t;t=o;function o(){return e.apply(this,arguments)||this}return o.prototype.render=function(){var e=this.props.mediaIds;return(Object(c.a)("div",{className:"compose-form__upload-wrapper"},void 0,Object(c.a)(Ue,{icon:"upload",message:Object(c.a)(k.b,{id:"upload_progress.label",defaultMessage:"Uploading…"})}),Object(c.a)("div",{className:"compose-form__uploads-wrapper"},void 0,e.map((function(e){return Object(c.a)(Le,{id:e},e)}))),!e.isEmpty()&&Object(c.a)(Be,{})))},o}(w.a);Object(d.a)(Ge,"propTypes",{mediaIds:O.a.list.isRequired});var Ve=Object(i.connect)((function(e){return{mediaIds:e.getIn(["compose","media_attachments"]).map((function(e){return e.get("id")}))}}))(Ge);var Ye,Xe,Je,Ze=function(e){Object(p.a)(o,e);var t;t=o;function o(){return e.apply(this,arguments)||this}return o.prototype.render=function(){var e=this.props.message;return(Object(c.a)(de.a,{defaultStyle:{opacity:0,scaleX:.85,scaleY:.75},style:{opacity:be()(1,{damping:35,stiffness:400}),scaleX:be()(1,{damping:35,stiffness:400}),scaleY:be()(1,{damping:35,stiffness:400})}},void 0,(function(t){var o=t.opacity,a=t.scaleX,n=t.scaleY;return(Object(c.a)("div",{className:"compose-form__warning",style:{opacity:o,transform:"scale("+a+", "+n+")"}},void 0,e))})))},o}(b.a.PureComponent),$e=o(22),Qe=/(?:^|[^\/\)\w])#(\w*[a-zA-Z·]\w*)/i,et=Object(i.connect)((function(e){return{needsLockWarning:"private"===e.getIn(["compose","privacy"])&&!e.getIn(["accounts",$e.n,"locked"]),hashtagWarning:"public"!==e.getIn(["compose","privacy"])&&Qe.test(e.getIn(["compose","text"])),directMessageWarning:"direct"===e.getIn(["compose","privacy"])}}))((function(e){var t=e.needsLockWarning,o=e.hashtagWarning,a=e.directMessageWarning;if(t)return Object(c.a)(Ze,{message:Object(c.a)(k.b,{id:"compose_form.lock_disclaimer",defaultMessage:"Your account is not {locked}. Anyone can follow you to view your follower-only posts.",values:{locked:Object(c.a)("a",{href:"/user-settings"},void 0,Object(c.a)(k.b,{id:"compose_form.lock_disclaimer.lock",defaultMessage:"locked"}))}})});if(o)return Object(c.a)(Ze,{message:Object(c.a)(k.b,{id:"compose_form.hashtag_warning",defaultMessage:"This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag."})});if(a){var n=Object(c.a)("span",{},void 0,Object(c.a)(k.b,{id:"compose_form.direct_message_warning",defaultMessage:"This toot will only be sent to all the mentioned users."})," ",Object(c.a)("a",{href:"/terms",target:"_blank"},void 0,Object(c.a)(k.b,{id:"compose_form.direct_message_warning_learn_more",defaultMessage:"Learn more"})));return(Object(c.a)(Ze,{message:n}))}return null})),tt=o(79);var ot="><…                 \u2028\u2029\t\n\v\f\r",at=Object(k.f)({placeholder:{id:"compose_form.placeholder",defaultMessage:"What is on your mind?"},spoiler_placeholder:{id:"compose_form.spoiler_placeholder",defaultMessage:"Write your warning here"},publish:{id:"compose_form.publish",defaultMessage:"Toot"},publishLoud:{id:"compose_form.publish_loud",defaultMessage:"{publish}!"}}),nt=Object(k.g)((Je=Xe=function(e){Object(p.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(r.a)(t),"handleChange",(function(e){t.props.onChange(e.target.value)})),Object(d.a)(Object(r.a)(t),"handleKeyDown",(function(e){13===e.keyCode&&(e.ctrlKey||e.metaKey)&&t.handleSubmit()})),Object(d.a)(Object(r.a)(t),"handleSubmit",(function(){t.props.text!==t.autosuggestTextarea.textarea.value&&t.props.onChange(t.autosuggestTextarea.textarea.value);var e=t.props,o=e.isSubmitting,a=e.isChangingUpload,n=e.isUploading,s=e.anyMedia,i=[t.props.spoilerText,t.props.text].join("");o||n||a||Object(tt.length)(i)>$e.m||0!==i.length&&0===i.trim().length&&!s||t.props.onSubmit(t.context.router?t.context.router.history:null)})),Object(d.a)(Object(r.a)(t),"onSuggestionsClearRequested",(function(){t.props.onClearSuggestions()})),Object(d.a)(Object(r.a)(t),"onSuggestionsFetchRequested",(function(e){t.props.onFetchSuggestions(e)})),Object(d.a)(Object(r.a)(t),"onSuggestionSelected",(function(e,o,a){t.props.onSuggestionSelected(e,o,a,["text"])})),Object(d.a)(Object(r.a)(t),"onSpoilerSuggestionSelected",(function(e,o,a){t.props.onSuggestionSelected(e,o,a,["spoiler_text"])})),Object(d.a)(Object(r.a)(t),"handleChangeSpoilerText",(function(e){t.props.onChangeSpoilerText(e.target.value)})),Object(d.a)(Object(r.a)(t),"handleFocus",(function(){if(t.composeForm&&!t.props.singleColumn){var e=t.composeForm.getBoundingClientRect(),o=e.left,a=e.right;(o<0||a>(window.innerWidth||document.documentElement.clientWidth))&&t.composeForm.scrollIntoView()}})),Object(d.a)(Object(r.a)(t),"setAutosuggestTextarea",(function(e){t.autosuggestTextarea=e})),Object(d.a)(Object(r.a)(t),"setSpoilerText",(function(e){t.spoilerText=e})),Object(d.a)(Object(r.a)(t),"setRef",(function(e){t.composeForm=e})),Object(d.a)(Object(r.a)(t),"handleEmojiPick",(function(e){var o=t.props.text,a=t.autosuggestTextarea.textarea.selectionStart,n=e.custom&&a>0&&!ot.includes(o[a-1]);t.props.onPickEmoji(a,e,n)})),t}var a=o.prototype;return a.componentDidUpdate=function(e){var t,o;this.props.focusDate!==e.focusDate?(this.props.preselectDate!==e.preselectDate?(t=this.props.text.length,o=this.props.text.search(/\s/)+1):"number"==typeof this.props.caretPosition?(o=this.props.caretPosition,t=this.props.caretPosition):o=t=this.props.text.length,this.autosuggestTextarea.textarea.setSelectionRange(o,t),this.autosuggestTextarea.textarea.focus()):e.isSubmitting&&!this.props.isSubmitting?this.autosuggestTextarea.textarea.focus():this.props.spoiler!==e.spoiler&&(this.props.spoiler?this.spoilerText.input.focus():this.autosuggestTextarea.textarea.focus())},a.render=function(){var e=this.props,t=e.intl,o=e.onPaste,a=e.showSearch,n=e.anyMedia,s=this.props.isSubmitting,i=[this.props.spoilerText,this.props.text].join(""),r=s||this.props.isUploading||this.props.isChangingUpload||Object(tt.length)(i)>$e.m||0!==i.length&&0===i.trim().length&&!n,l="";return l="private"===this.props.privacy||"direct"===this.props.privacy?Object(c.a)("span",{className:"compose-form__publish-private"},void 0,Object(c.a)(he.a,{id:"lock"})," ",t.formatMessage(at.publish)):"unlisted"!==this.props.privacy?t.formatMessage(at.publishLoud,{publish:t.formatMessage(at.publish)}):t.formatMessage(at.publish),Object(c.a)("div",{className:"compose-form"},void 0,Object(c.a)(et,{}),Object(c.a)(D,{}),b.a.createElement("div",{className:"spoiler-input "+(this.props.spoiler?"spoiler-input--visible":""),ref:this.setRef},b.a.createElement(G,{placeholder:t.formatMessage(at.spoiler_placeholder),value:this.props.spoilerText,onChange:this.handleChangeSpoilerText,onKeyDown:this.handleKeyDown,disabled:!this.props.spoiler,ref:this.setSpoilerText,suggestions:this.props.suggestions,onSuggestionsFetchRequested:this.onSuggestionsFetchRequested,onSuggestionsClearRequested:this.onSuggestionsClearRequested,onSuggestionSelected:this.onSpoilerSuggestionSelected,searchTokens:[":"],id:"cw-spoiler-input",className:"spoiler-input__input"})),b.a.createElement(L,{ref:this.setAutosuggestTextarea,placeholder:t.formatMessage(at.placeholder),disabled:s,value:this.props.text,onChange:this.handleChange,suggestions:this.props.suggestions,onFocus:this.handleFocus,onKeyDown:this.handleKeyDown,onSuggestionsFetchRequested:this.onSuggestionsFetchRequested,onSuggestionsClearRequested:this.onSuggestionsClearRequested,onSuggestionSelected:this.onSuggestionSelected,onPaste:o,autoFocus:!a&&!Object(Te.b)(window.innerWidth)},Object(c.a)(Ne.a,{onPickEmoji:this.handleEmojiPick}),Object(c.a)("div",{className:"compose-form__modifiers"},void 0,Object(c.a)(Ve,{}),Object(c.a)(Ee,{}))),Object(c.a)("div",{className:"compose-form__buttons-wrapper"},void 0,Object(c.a)("div",{className:"compose-form__buttons"},void 0,Object(c.a)(ae,{}),Object(c.a)(Q,{}),Object(c.a)(Re,{}),Object(c.a)(re,{})),Object(c.a)("div",{className:"character-counter__wrapper"},void 0,Object(c.a)(f.a,{max:$e.m,text:i}))),Object(c.a)("div",{className:"compose-form__publish"},void 0,Object(c.a)("div",{className:"compose-form__publish-button-wrapper"},void 0,Object(c.a)(m.a,{text:l,onClick:this.handleSubmit,disabled:r,block:!0}))))},o}(w.a),Object(d.a)(Xe,"contextTypes",{router:j.a.object}),Object(d.a)(Xe,"propTypes",{intl:j.a.object.isRequired,text:j.a.string.isRequired,suggestions:O.a.list,spoiler:j.a.bool,privacy:j.a.string,spoilerText:j.a.string,focusDate:j.a.instanceOf(Date),caretPosition:j.a.number,preselectDate:j.a.instanceOf(Date),isSubmitting:j.a.bool,isChangingUpload:j.a.bool,isUploading:j.a.bool,onChange:j.a.func.isRequired,onSubmit:j.a.func.isRequired,onClearSuggestions:j.a.func.isRequired,onFetchSuggestions:j.a.func.isRequired,onSuggestionSelected:j.a.func.isRequired,onChangeSpoilerText:j.a.func.isRequired,onPaste:j.a.func.isRequired,onPickEmoji:j.a.func.isRequired,showSearch:j.a.bool,anyMedia:j.a.bool,singleColumn:j.a.bool}),Object(d.a)(Xe,"defaultProps",{showSearch:!1}),Ye=Je))||Ye;t.a=Object(i.connect)((function(e){return{text:e.getIn(["compose","text"]),suggestions:e.getIn(["compose","suggestions"]),spoiler:e.getIn(["compose","spoiler"]),spoilerText:e.getIn(["compose","spoiler_text"]),privacy:e.getIn(["compose","privacy"]),focusDate:e.getIn(["compose","focusDate"]),caretPosition:e.getIn(["compose","caretPosition"]),preselectDate:e.getIn(["compose","preselectDate"]),isSubmitting:e.getIn(["compose","is_submitting"]),isChangingUpload:e.getIn(["compose","is_changing_upload"]),isUploading:e.getIn(["compose","is_uploading"]),showSearch:e.getIn(["search","submitted"])&&!e.getIn(["search","hidden"]),anyMedia:e.getIn(["compose","media_attachments"]).size>0}}),(function(e){return{onChange:function(t){e(Object(y.N)(t))},onSubmit:function(t){e(Object(y.jb)(t))},onClearSuggestions:function(){e(Object(y.W)())},onFetchSuggestions:function(t){e(Object(y.Z)(t))},onSuggestionSelected:function(t,o,a,n){e(Object(y.ib)(t,o,a,n))},onChangeSpoilerText:function(t){e(Object(y.P)(t))},onPaste:function(t){e(Object(y.mb)(t))},onPickEmoji:function(t,o,a){e(Object(y.bb)(t,o,a))}}}))(nt)},787:function(e,t,o){"use strict";var a=o(15),n=o(7),s=o(782),i=o(724),c=o(48),r=o(22),l=Object(n.f)({logoutMessage:{id:"confirmations.logout.message",defaultMessage:"Are you sure you want to log out?"},logoutConfirm:{id:"confirmations.logout.confirm",defaultMessage:"Log out"}});t.a=Object(n.g)(Object(a.connect)((function(e){return{account:e.getIn(["accounts",r.n])}}),(function(e,t){var o=t.intl;return{onLogout:function(){e(Object(c.d)("CONFIRM",{message:o.formatMessage(l.logoutMessage),confirm:o.formatMessage(l.logoutConfirm),onConfirm:function(){return Object(i.a)()}}))}}}))(s.a))},813:function(e,t,o){"use strict";o.r(t),o.d(t,"default",(function(){return k}));var a,n=o(0),s=o(2),i=(o(9),o(6),o(8)),c=o(1),r=o(3),l=o.n(r),u=o(588),p=o(787),d=o(15),g=o(23),b=o(322),f=o(7),m=o(781),h=o(101),O=o(35),v=o.n(O),j=o(1178),y=o(48),_=o(22),C=o(27),S=o(724);var M=Object(f.f)({start:{id:"getting_started.heading",defaultMessage:"Getting started"},home_timeline:{id:"tabs_bar.home",defaultMessage:"Home"},notifications:{id:"tabs_bar.notifications",defaultMessage:"Notifications"},public:{id:"navigation_bar.public_timeline",defaultMessage:"Federated timeline"},community:{id:"navigation_bar.community_timeline",defaultMessage:"Local timeline"},preferences:{id:"navigation_bar.preferences",defaultMessage:"Preferences"},logout:{id:"navigation_bar.logout",defaultMessage:"Logout"},compose:{id:"navigation_bar.compose",defaultMessage:"Compose new toot"},logoutMessage:{id:"confirmations.logout.message",defaultMessage:"Are you sure you want to log out?"},logoutConfirm:{id:"confirmations.logout.confirm",defaultMessage:"Log out"}}),k=Object(d.connect)((function(e,t){return{columns:e.getIn(["settings","columns"]),showSearch:t.multiColumn?e.getIn(["search","submitted"])&&!e.getIn(["search","hidden"]):t.isSearchPage}}))(a=Object(f.g)(a=function(e){Object(i.a)(o,e);var t;t=o;function o(){for(var t,o=arguments.length,a=new Array(o),n=0;n<o;n++)a[n]=arguments[n];return t=e.call.apply(e,[this].concat(a))||this,Object(c.a)(Object(s.a)(t),"handleLogoutClick",(function(e){var o=t.props,a=o.dispatch,n=o.intl;return e.preventDefault(),e.stopPropagation(),a(Object(y.d)("CONFIRM",{message:n.formatMessage(M.logoutMessage),confirm:n.formatMessage(M.logoutConfirm),onConfirm:function(){return Object(S.a)()}})),!1})),Object(c.a)(Object(s.a)(t),"onFocus",(function(){t.props.dispatch(Object(g.S)(!0))})),Object(c.a)(Object(s.a)(t),"onBlur",(function(){t.props.dispatch(Object(g.S)(!1))})),t}var a=o.prototype;return a.componentDidMount=function(){this.props.isSearchPage||this.props.dispatch(Object(g.db)())},a.componentWillUnmount=function(){this.props.isSearchPage||this.props.dispatch(Object(g.lb)())},a.render=function(){var e=this.props,t=e.multiColumn,o=e.showSearch,a=e.isSearchPage,s=e.intl,i="";if(t){var c=this.props.columns;i=Object(n.a)("nav",{className:"drawer__header"},void 0,Object(n.a)(b.a,{to:"/getting-started",className:"drawer__tab",title:s.formatMessage(M.start),"aria-label":s.formatMessage(M.start)},void 0,Object(n.a)(C.a,{id:"bars",fixedWidth:!0})),!c.some((function(e){return"HOME"===e.get("id")}))&&Object(n.a)(b.a,{to:"/timelines/home",className:"drawer__tab",title:s.formatMessage(M.home_timeline),"aria-label":s.formatMessage(M.home_timeline)},void 0,Object(n.a)(C.a,{id:"home",fixedWidth:!0})),!c.some((function(e){return"NOTIFICATIONS"===e.get("id")}))&&Object(n.a)(b.a,{to:"/notifications",className:"drawer__tab",title:s.formatMessage(M.notifications),"aria-label":s.formatMessage(M.notifications)},void 0,Object(n.a)(C.a,{id:"bell",fixedWidth:!0})),!c.some((function(e){return"COMMUNITY"===e.get("id")}))&&Object(n.a)(b.a,{to:"/timelines/public/local",className:"drawer__tab",title:s.formatMessage(M.community),"aria-label":s.formatMessage(M.community)},void 0,Object(n.a)(C.a,{id:"users",fixedWidth:!0})),!c.some((function(e){return"PUBLIC"===e.get("id")}))&&Object(n.a)(b.a,{to:"/timelines/public",className:"drawer__tab",title:s.formatMessage(M.public),"aria-label":s.formatMessage(M.public)},void 0,Object(n.a)(C.a,{id:"globe",fixedWidth:!0})),Object(n.a)("a",{href:"/user-settings",className:"drawer__tab",title:s.formatMessage(M.preferences),"aria-label":s.formatMessage(M.preferences)},void 0,Object(n.a)(C.a,{id:"cog",fixedWidth:!0})),Object(n.a)("a",{href:"/auth/sign_out",className:"drawer__tab",title:s.formatMessage(M.logout),"aria-label":s.formatMessage(M.logout),onClick:this.handleLogoutClick},void 0,Object(n.a)(C.a,{id:"sign-out",fixedWidth:!0})))}return(Object(n.a)("div",{className:"drawer",role:"region","aria-label":s.formatMessage(M.compose)},void 0,i,(t||a)&&Object(n.a)(m.a,{}),Object(n.a)("div",{className:"drawer__pager"},void 0,!a&&Object(n.a)("div",{className:"drawer__inner",onFocus:this.onFocus},void 0,Object(n.a)(p.a,{onClose:this.onBlur}),Object(n.a)(u.a,{}),"mascot && ( ",Object(n.a)("div",{className:"drawer__inner__mastodon"},void 0,Object(n.a)("img",{alt:"",draggable:"false",src:_.l}))," )"),Object(n.a)(h.a,{defaultStyle:{x:a?0:-100},style:{x:v()(o||a?0:-100,{stiffness:210,damping:20})}},void 0,(function(e){var t=e.x;return(Object(n.a)("div",{className:"drawer__inner darker",style:{transform:"translateX("+t+"%)",visibility:-100===t?"hidden":"visible"}},void 0,Object(n.a)(j.a,{})))})))))},o}(l.a.PureComponent))||a)||a}}]);
//# sourceMappingURL=compose.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/compose.js.map b/priv/static/packs/features/compose.js.map
index 3397e47c7..c0c9b14bd 100644
--- a/priv/static/packs/features/compose.js.map
+++ b/priv/static/packs/features/compose.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_emoji.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/reply_indicator.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/autosuggest_account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/autosuggest_account_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_hashtag.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_textarea.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_input.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/poll_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/poll_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/text_icon_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/spoiler_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/privacy_dropdown.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/emoji_picker_dropdown_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/poll_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/poll_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_progress_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/sensitive_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/warning.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/warning_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/compose_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/compose_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/navigation_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/index.js"],"names":["assetHost","process","env","CDN_HOST","AutosuggestEmoji","render","url","emoji","this","props","custom","imageUrl","mapping","unicodeMapping","native","replace","filename","className","src","alt","colons","React","PureComponent","EmojiPicker","Emoji","messages","defineMessages","emoji_search","emoji_not_found","recent","search_results","people","nature","food","activity","travel","objects","symbols","flags","backgroundImageFn","listenerOptions","detectPassiveEvents","hasSupport","passive","ModifierPickerMenu","e","onSelect","currentTarget","getAttribute","node","contains","target","onClose","c","componentWillReceiveProps","nextProps","active","attachListeners","removeListeners","componentWillUnmount","document","addEventListener","handleDocumentClick","removeEventListener","style","display","ref","setRef","onClick","handleClick","data-index","set","size","sheetSize","skin","ModifierPicker","onOpen","modifier","onChange","handleSelect","EmojiPickerMenu","injectIntl","modifierOpen","placement","intl","search","formatMessage","notfound","categories","foods","places","onPick","setState","onSkinTone","componentDidMount","loading","custom_emojis","skinTone","frequentlyUsedEmojis","width","title","state","categoriesSort","splice","Array","from","categoriesFromEmojis","sort","classNames","selecting","perLine","emojiSize","buildCustomEmojis","color","i18n","getI18n","include","showPreview","autoFocus","emojiTooltip","handleModifierOpen","handleModifierClose","handleModifierChange","EmojiPickerDropdown","dropdown","EmojiPickerAsync","then","EmojiMart","Picker","catch","top","getBoundingClientRect","innerHeight","key","onHideDropdown","onShowDropdown","onPickEmoji","onKeyDown","handleKeyDown","setTargetRef","aria-label","aria-expanded","role","onToggle","tabIndex","show","findTarget","cancel","ReplyIndicator","onCancel","button","ctrlKey","metaKey","preventDefault","context","router","history","push","status","getIn","content","__html","get","direction","isRtl","icon","inverted","href","handleAccountClick","account","dangerouslySetInnerHTML","compact","media","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","connect","getStatus","makeGetStatus","id","dispatch","cancelReplyCompose","AutosuggestAccount","getAccount","makeGetAccount","AutosuggestHashtag","tag","weeklyUses","shortNumberFormat","reduce","total","day","uses","name","undefined","defaultMessage","values","count","textAtCursorMatchesToken","str","caretPosition","word","left","slice","right","trim","length","indexOf","toLowerCase","AutosuggestTextarea","suggestionsHidden","focused","selectedSuggestion","lastToken","tokenStart","value","selectionStart","token","onSuggestionsFetchRequested","onSuggestionsClearRequested","suggestions","disabled","which","isComposing","querySelector","parentElement","focus","Math","min","max","stopPropagation","onSuggestionSelected","defaultPrevented","onFocus","suggestion","textarea","clipboardData","files","onPaste","i","inner","type","selected","onMouseDown","onSuggestionClick","placeholder","onKeyUp","children","inputRef","setTextarea","onBlur","aria-autocomplete","isEmpty","renderSuggestion","string","list","bool","searchTokens","AutosuggestInput","input","maxLength","setInput","arrayOf","number","ImmutableList","add_poll","remove_poll","iconStyle","height","lineHeight","PollButton","unavailable","_","getState","removePoll","addPoll","upload","UploadButton","acceptContentTypes","onSelectFile","fileElement","click","resetFileKey","formats","multiple","handleChange","listOf","some","m","includes","uploadCompose","TextIconButton","label","ariaControls","aria-controls","marked","unmarked","changeComposeSpoilerness","public_short","public_long","unlisted_short","unlisted_long","private_short","private_long","direct_short","direct_long","change_privacy","PrivacyDropdownMenu","mounted","element","items","index","findIndex","item","childNodes","shiftKey","lastChild","firstChild","focusedItem","defaultStyle","opacity","scaleX","scaleY","spring","damping","stiffness","transform","zIndex","aria-selected","setFocusRef","fixedWidth","text","meta","PrivacyDropdown","open","isUserTouching","onModalClose","onModalOpen","actions","options","option","handleModalActionClick","activeElement","handleClose","handleMouseDown","componentWillMount","valueOption","find","expanded","handleToggle","handleButtonKeyDown","isModalOpen","modalType","changeComposeVisibility","openModal","closeModal","DEFAULTS","getFrequentlyUsedEmojis","createSelector","ImmutableMap","emojiCounters","emojis","keySeq","a","b","reverse","toArray","uniqueDefaults","filter","concat","getCustomEmojis","aShort","bShort","changeSetting","useEmoji","option_placeholder","add_option","remove_option","poll_duration","switchToMultiple","switchToSingle","minutes","hours","days","Option","onRemove","onToggleMultiple","handleToggleMultiple","onClearSuggestions","onFetchSuggestions","isPollMultiple","checkbox","onKeyPress","handleCheckboxKeypress","handleOptionTitleChange","handleOptionRemove","PollForm","onAddOption","onChangeSettings","isMultiple","expiresIn","onChangeOption","onRemoveOption","other","handleAddOption","handleSelectDuration","addPollOption","removePollOption","changePollOption","changePollSettings","clearComposeSuggestions","fetchComposeSuggestions","position","accountId","path","selectComposeSuggestion","progress","UploadProgress","Upload","onUndo","onOpenFocalPoint","focusX","focusY","x","y","scale","backgroundImage","backgroundPosition","handleUndoClick","handleFocalPointClick","undoUploadCompose","onSubmit","submitCompose","SensitiveButton","checked","changeComposeSensitivity","UploadForm","mediaIds","message","Warning","APPROX_HASHTAG_RE","needsLockWarning","me","hashtagWarning","test","directMessageWarning","locked","allowedAroundShortCode","spoiler_placeholder","publish","publishLoud","ComposeForm","keyCode","handleSubmit","autosuggestTextarea","isSubmitting","isChangingUpload","isUploading","anyMedia","fulltext","spoilerText","join","maxChars","onChangeSpoilerText","composeForm","singleColumn","window","innerWidth","documentElement","clientWidth","scrollIntoView","data","needsSpace","componentDidUpdate","prevProps","selectionEnd","focusDate","preselectDate","setSelectionRange","spoiler","showSearch","disabledButton","publishText","privacy","handleChangeSpoilerText","setSpoilerText","onSpoilerSuggestionSelected","setAutosuggestTextarea","handleFocus","isMobile","handleEmojiPick","block","instanceOf","Date","changeCompose","changeComposeSpoilerText","insertEmojiCompose","logoutMessage","logoutConfirm","onLogout","confirm","onConfirm","logOut","NavigationBar","start","home_timeline","notifications","public","community","preferences","logout","compose","Compose","ownProps","columns","multiColumn","isSearchPage","changeComposing","mountCompose","unmountCompose","header","to","column","handleLogoutClick","draggable","mascot","elephantUIPlane","visibility"],"mappings":"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","file":"features/compose.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport unicodeMapping from '../features/emoji/emoji_unicode_mapping_light';\n\nconst assetHost = process.env.CDN_HOST || '';\n\nexport default class AutosuggestEmoji extends React.PureComponent {\n\n static propTypes = {\n emoji: PropTypes.object.isRequired,\n };\n\n render () {\n const { emoji } = this.props;\n let url;\n\n if (emoji.custom) {\n url = emoji.imageUrl;\n } else {\n const mapping = unicodeMapping[emoji.native] || unicodeMapping[emoji.native.replace(/\\uFE0F$/, '')];\n\n if (!mapping) {\n return null;\n }\n\n url = `${assetHost}/emoji/${mapping.filename}.svg`;\n }\n\n return (\n <div className='autosuggest-emoji'>\n <img\n className='emojione'\n src={url}\n alt={emoji.native || emoji.colons}\n />\n\n {emoji.colons}\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { EmojiPicker as EmojiPickerAsync } from '../../ui/util/async-components';\nimport Overlay from 'react-overlays/lib/Overlay';\nimport classNames from 'classnames';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport detectPassiveEvents from 'detect-passive-events';\nimport { buildCustomEmojis, categoriesFromEmojis } from '../../emoji/emoji';\n\nconst messages = defineMessages({\n emoji: { id: 'emoji_button.label', defaultMessage: 'Insert emoji' },\n emoji_search: { id: 'emoji_button.search', defaultMessage: 'Search...' },\n emoji_not_found: { id: 'emoji_button.not_found', defaultMessage: 'No emojos!! (╯°□°)╯︵ ┻━┻' },\n custom: { id: 'emoji_button.custom', defaultMessage: 'Custom' },\n recent: { id: 'emoji_button.recent', defaultMessage: 'Frequently used' },\n search_results: { id: 'emoji_button.search_results', defaultMessage: 'Search results' },\n people: { id: 'emoji_button.people', defaultMessage: 'People' },\n nature: { id: 'emoji_button.nature', defaultMessage: 'Nature' },\n food: { id: 'emoji_button.food', defaultMessage: 'Food & Drink' },\n activity: { id: 'emoji_button.activity', defaultMessage: 'Activity' },\n travel: { id: 'emoji_button.travel', defaultMessage: 'Travel & Places' },\n objects: { id: 'emoji_button.objects', defaultMessage: 'Objects' },\n symbols: { id: 'emoji_button.symbols', defaultMessage: 'Symbols' },\n flags: { id: 'emoji_button.flags', defaultMessage: 'Flags' },\n});\n\nconst assetHost = process.env.CDN_HOST || '';\nlet EmojiPicker, Emoji; // load asynchronously\n\nconst backgroundImageFn = () => `${assetHost}/emoji/sheet_10.png`;\nconst listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;\n\nclass ModifierPickerMenu extends React.PureComponent {\n\n static propTypes = {\n active: PropTypes.bool,\n onSelect: PropTypes.func.isRequired,\n onClose: PropTypes.func.isRequired,\n };\n\n handleClick = e => {\n this.props.onSelect(e.currentTarget.getAttribute('data-index') * 1);\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.active) {\n this.attachListeners();\n } else {\n this.removeListeners();\n }\n }\n\n componentWillUnmount () {\n this.removeListeners();\n }\n\n handleDocumentClick = e => {\n if (this.node && !this.node.contains(e.target)) {\n this.props.onClose();\n }\n }\n\n attachListeners () {\n document.addEventListener('click', this.handleDocumentClick, false);\n document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\n }\n\n removeListeners () {\n document.removeEventListener('click', this.handleDocumentClick, false);\n document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);\n }\n\n setRef = c => {\n this.node = c;\n }\n\n render () {\n const { active } = this.props;\n\n return (\n <div className='emoji-picker-dropdown__modifiers__menu' style={{ display: active ? 'block' : 'none' }} ref={this.setRef}>\n <button onClick={this.handleClick} data-index={1}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={1} backgroundImageFn={backgroundImageFn} /></button>\n <button onClick={this.handleClick} data-index={2}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={2} backgroundImageFn={backgroundImageFn} /></button>\n <button onClick={this.handleClick} data-index={3}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={3} backgroundImageFn={backgroundImageFn} /></button>\n <button onClick={this.handleClick} data-index={4}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={4} backgroundImageFn={backgroundImageFn} /></button>\n <button onClick={this.handleClick} data-index={5}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={5} backgroundImageFn={backgroundImageFn} /></button>\n <button onClick={this.handleClick} data-index={6}><Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={6} backgroundImageFn={backgroundImageFn} /></button>\n </div>\n );\n }\n\n}\n\nclass ModifierPicker extends React.PureComponent {\n\n static propTypes = {\n active: PropTypes.bool,\n modifier: PropTypes.number,\n onChange: PropTypes.func,\n onClose: PropTypes.func,\n onOpen: PropTypes.func,\n };\n\n handleClick = () => {\n if (this.props.active) {\n this.props.onClose();\n } else {\n this.props.onOpen();\n }\n }\n\n handleSelect = modifier => {\n this.props.onChange(modifier);\n this.props.onClose();\n }\n\n render () {\n const { active, modifier } = this.props;\n\n return (\n <div className='emoji-picker-dropdown__modifiers'>\n <Emoji emoji='fist' set='twitter' size={22} sheetSize={32} skin={modifier} onClick={this.handleClick} backgroundImageFn={backgroundImageFn} />\n <ModifierPickerMenu active={active} onSelect={this.handleSelect} onClose={this.props.onClose} />\n </div>\n );\n }\n\n}\n\n@injectIntl\nclass EmojiPickerMenu extends React.PureComponent {\n\n static propTypes = {\n custom_emojis: ImmutablePropTypes.list,\n frequentlyUsedEmojis: PropTypes.arrayOf(PropTypes.string),\n loading: PropTypes.bool,\n onClose: PropTypes.func.isRequired,\n onPick: PropTypes.func.isRequired,\n style: PropTypes.object,\n placement: PropTypes.string,\n arrowOffsetLeft: PropTypes.string,\n arrowOffsetTop: PropTypes.string,\n intl: PropTypes.object.isRequired,\n skinTone: PropTypes.number.isRequired,\n onSkinTone: PropTypes.func.isRequired,\n };\n\n static defaultProps = {\n style: {},\n loading: true,\n frequentlyUsedEmojis: [],\n };\n\n state = {\n modifierOpen: false,\n placement: null,\n };\n\n handleDocumentClick = e => {\n if (this.node && !this.node.contains(e.target)) {\n this.props.onClose();\n }\n }\n\n componentDidMount () {\n document.addEventListener('click', this.handleDocumentClick, false);\n document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\n }\n\n componentWillUnmount () {\n document.removeEventListener('click', this.handleDocumentClick, false);\n document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);\n }\n\n setRef = c => {\n this.node = c;\n }\n\n getI18n = () => {\n const { intl } = this.props;\n\n return {\n search: intl.formatMessage(messages.emoji_search),\n notfound: intl.formatMessage(messages.emoji_not_found),\n categories: {\n search: intl.formatMessage(messages.search_results),\n recent: intl.formatMessage(messages.recent),\n people: intl.formatMessage(messages.people),\n nature: intl.formatMessage(messages.nature),\n foods: intl.formatMessage(messages.food),\n activity: intl.formatMessage(messages.activity),\n places: intl.formatMessage(messages.travel),\n objects: intl.formatMessage(messages.objects),\n symbols: intl.formatMessage(messages.symbols),\n flags: intl.formatMessage(messages.flags),\n custom: intl.formatMessage(messages.custom),\n },\n };\n }\n\n handleClick = emoji => {\n if (!emoji.native) {\n emoji.native = emoji.colons;\n }\n\n this.props.onClose();\n this.props.onPick(emoji);\n }\n\n handleModifierOpen = () => {\n this.setState({ modifierOpen: true });\n }\n\n handleModifierClose = () => {\n this.setState({ modifierOpen: false });\n }\n\n handleModifierChange = modifier => {\n this.props.onSkinTone(modifier);\n }\n\n render () {\n const { loading, style, intl, custom_emojis, skinTone, frequentlyUsedEmojis } = this.props;\n\n if (loading) {\n return <div style={{ width: 299 }} />;\n }\n\n const title = intl.formatMessage(messages.emoji);\n\n const { modifierOpen } = this.state;\n\n const categoriesSort = [\n 'recent',\n 'people',\n 'nature',\n 'foods',\n 'activity',\n 'places',\n 'objects',\n 'symbols',\n 'flags',\n ];\n\n categoriesSort.splice(1, 0, ...Array.from(categoriesFromEmojis(custom_emojis)).sort());\n\n return (\n <div className={classNames('emoji-picker-dropdown__menu', { selecting: modifierOpen })} style={style} ref={this.setRef}>\n <EmojiPicker\n perLine={8}\n emojiSize={22}\n sheetSize={32}\n custom={buildCustomEmojis(custom_emojis)}\n color=''\n emoji=''\n set='twitter'\n title={title}\n i18n={this.getI18n()}\n onClick={this.handleClick}\n include={categoriesSort}\n recent={frequentlyUsedEmojis}\n skin={skinTone}\n showPreview={false}\n backgroundImageFn={backgroundImageFn}\n autoFocus\n emojiTooltip\n />\n\n <ModifierPicker\n active={modifierOpen}\n modifier={skinTone}\n onOpen={this.handleModifierOpen}\n onClose={this.handleModifierClose}\n onChange={this.handleModifierChange}\n />\n </div>\n );\n }\n\n}\n\nexport default @injectIntl\nclass EmojiPickerDropdown extends React.PureComponent {\n\n static propTypes = {\n custom_emojis: ImmutablePropTypes.list,\n frequentlyUsedEmojis: PropTypes.arrayOf(PropTypes.string),\n intl: PropTypes.object.isRequired,\n onPickEmoji: PropTypes.func.isRequired,\n onSkinTone: PropTypes.func.isRequired,\n skinTone: PropTypes.number.isRequired,\n };\n\n state = {\n active: false,\n loading: false,\n };\n\n setRef = (c) => {\n this.dropdown = c;\n }\n\n onShowDropdown = ({ target }) => {\n this.setState({ active: true });\n\n if (!EmojiPicker) {\n this.setState({ loading: true });\n\n EmojiPickerAsync().then(EmojiMart => {\n EmojiPicker = EmojiMart.Picker;\n Emoji = EmojiMart.Emoji;\n\n this.setState({ loading: false });\n }).catch(() => {\n this.setState({ loading: false });\n });\n }\n\n const { top } = target.getBoundingClientRect();\n this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });\n }\n\n onHideDropdown = () => {\n this.setState({ active: false });\n }\n\n onToggle = (e) => {\n if (!this.state.loading && (!e.key || e.key === 'Enter')) {\n if (this.state.active) {\n this.onHideDropdown();\n } else {\n this.onShowDropdown(e);\n }\n }\n }\n\n handleKeyDown = e => {\n if (e.key === 'Escape') {\n this.onHideDropdown();\n }\n }\n\n setTargetRef = c => {\n this.target = c;\n }\n\n findTarget = () => {\n return this.target;\n }\n\n render () {\n const { intl, onPickEmoji, onSkinTone, skinTone, frequentlyUsedEmojis } = this.props;\n const title = intl.formatMessage(messages.emoji);\n const { active, loading, placement } = this.state;\n\n return (\n <div className='emoji-picker-dropdown' onKeyDown={this.handleKeyDown}>\n <div ref={this.setTargetRef} className='emoji-button' title={title} aria-label={title} aria-expanded={active} role='button' onClick={this.onToggle} onKeyDown={this.onToggle} tabIndex={0}>\n <img\n className={classNames('emojione', { 'pulse-loading': active && loading })}\n alt='🙂'\n src={`${assetHost}/emoji/1f602.svg`}\n />\n </div>\n\n <Overlay show={active} placement={placement} target={this.findTarget}>\n <EmojiPickerMenu\n custom_emojis={this.props.custom_emojis}\n loading={loading}\n onClose={this.onHideDropdown}\n onPick={onPickEmoji}\n onSkinTone={onSkinTone}\n skinTone={skinTone}\n frequentlyUsedEmojis={frequentlyUsedEmojis}\n />\n </Overlay>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Avatar from '../../../components/avatar';\nimport IconButton from '../../../components/icon_button';\nimport DisplayName from '../../../components/display_name';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { isRtl } from '../../../rtl';\nimport AttachmentList from 'mastodon/components/attachment_list';\n\nconst messages = defineMessages({\n cancel: { id: 'reply_indicator.cancel', defaultMessage: 'Cancel' },\n});\n\nexport default @injectIntl\nclass ReplyIndicator extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map,\n onCancel: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleClick = () => {\n this.props.onCancel();\n }\n\n handleAccountClick = (e) => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n }\n }\n\n render () {\n const { status, intl } = this.props;\n\n if (!status) {\n return null;\n }\n\n const content = { __html: status.get('contentHtml') };\n const style = {\n direction: isRtl(status.get('search_index')) ? 'rtl' : 'ltr',\n };\n\n return (\n <div className='reply-indicator'>\n <div className='reply-indicator__header'>\n <div className='reply-indicator__cancel'><IconButton title={intl.formatMessage(messages.cancel)} icon='times' onClick={this.handleClick} inverted /></div>\n\n <a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='reply-indicator__display-name'>\n <div className='reply-indicator__display-avatar'><Avatar account={status.get('account')} size={24} /></div>\n <DisplayName account={status.get('account')} />\n </a>\n </div>\n\n <div className='reply-indicator__content' style={style} dangerouslySetInnerHTML={content} />\n\n {status.get('media_attachments').size > 0 && (\n <AttachmentList\n compact\n media={status.get('media_attachments')}\n />\n )}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { cancelReplyCompose } from '../../../actions/compose';\nimport { makeGetStatus } from '../../../selectors';\nimport ReplyIndicator from '../components/reply_indicator';\n\nconst makeMapStateToProps = () => {\n const getStatus = makeGetStatus();\n\n const mapStateToProps = state => ({\n status: getStatus(state, { id: state.getIn(['compose', 'in_reply_to']) }),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = dispatch => ({\n\n onCancel () {\n dispatch(cancelReplyCompose());\n },\n\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ReplyIndicator);\n","import React from 'react';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nexport default class AutosuggestAccount extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n };\n\n render () {\n const { account } = this.props;\n\n return (\n <div className='autosuggest-account' title={account.get('acct')}>\n <div className='autosuggest-account-icon'><Avatar account={account} size={18} /></div>\n <DisplayName account={account} />\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport AutosuggestAccount from '../components/autosuggest_account';\nimport { makeGetAccount } from '../../../selectors';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { id }) => ({\n account: getAccount(state, id),\n });\n\n return mapStateToProps;\n};\n\nexport default connect(makeMapStateToProps)(AutosuggestAccount);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { shortNumberFormat } from 'mastodon/utils/numbers';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class AutosuggestHashtag extends React.PureComponent {\n\n static propTypes = {\n tag: PropTypes.shape({\n name: PropTypes.string.isRequired,\n url: PropTypes.string,\n history: PropTypes.array,\n }).isRequired,\n };\n\n render () {\n const { tag } = this.props;\n const weeklyUses = tag.history && shortNumberFormat(tag.history.reduce((total, day) => total + (day.uses * 1), 0));\n\n return (\n <div className='autosuggest-hashtag'>\n <div className='autosuggest-hashtag__name'>#<strong>{tag.name}</strong></div>\n {tag.history !== undefined && <div className='autosuggest-hashtag__uses'><FormattedMessage id='autosuggest_hashtag.per_week' defaultMessage='{count} per week' values={{ count: weeklyUses }} /></div>}\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container';\nimport AutosuggestEmoji from './autosuggest_emoji';\nimport AutosuggestHashtag from './autosuggest_hashtag';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { isRtl } from '../rtl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Textarea from 'react-textarea-autosize';\nimport classNames from 'classnames';\n\nconst textAtCursorMatchesToken = (str, caretPosition) => {\n let word;\n\n let left = str.slice(0, caretPosition).search(/\\S+$/);\n let right = str.slice(caretPosition).search(/\\s/);\n\n if (right < 0) {\n word = str.slice(left);\n } else {\n word = str.slice(left, right + caretPosition);\n }\n\n if (!word || word.trim().length < 3 || ['@', ':', '#'].indexOf(word[0]) === -1) {\n return [null, null];\n }\n\n word = word.trim().toLowerCase();\n\n if (word.length > 0) {\n return [left + 1, word];\n } else {\n return [null, null];\n }\n};\n\nexport default class AutosuggestTextarea extends ImmutablePureComponent {\n\n static propTypes = {\n value: PropTypes.string,\n suggestions: ImmutablePropTypes.list,\n disabled: PropTypes.bool,\n placeholder: PropTypes.string,\n onSuggestionSelected: PropTypes.func.isRequired,\n onSuggestionsClearRequested: PropTypes.func.isRequired,\n onSuggestionsFetchRequested: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onKeyUp: PropTypes.func,\n onKeyDown: PropTypes.func,\n onPaste: PropTypes.func.isRequired,\n autoFocus: PropTypes.bool,\n };\n\n static defaultProps = {\n autoFocus: true,\n };\n\n state = {\n suggestionsHidden: true,\n focused: false,\n selectedSuggestion: 0,\n lastToken: null,\n tokenStart: 0,\n };\n\n onChange = (e) => {\n const [ tokenStart, token ] = textAtCursorMatchesToken(e.target.value, e.target.selectionStart);\n\n if (token !== null && this.state.lastToken !== token) {\n this.setState({ lastToken: token, selectedSuggestion: 0, tokenStart });\n this.props.onSuggestionsFetchRequested(token);\n } else if (token === null) {\n this.setState({ lastToken: null });\n this.props.onSuggestionsClearRequested();\n }\n\n this.props.onChange(e);\n }\n\n onKeyDown = (e) => {\n const { suggestions, disabled } = this.props;\n const { selectedSuggestion, suggestionsHidden } = this.state;\n\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n if (e.which === 229 || e.isComposing) {\n // Ignore key events during text composition\n // e.key may be a name of the physical key even in this case (e.x. Safari / Chrome on Mac)\n return;\n }\n\n switch(e.key) {\n case 'Escape':\n if (suggestions.size === 0 || suggestionsHidden) {\n document.querySelector('.ui').parentElement.focus();\n } else {\n e.preventDefault();\n this.setState({ suggestionsHidden: true });\n }\n\n break;\n case 'ArrowDown':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) });\n }\n\n break;\n case 'ArrowUp':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) });\n }\n\n break;\n case 'Enter':\n case 'Tab':\n // Select suggestion\n if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion));\n }\n\n break;\n }\n\n if (e.defaultPrevented || !this.props.onKeyDown) {\n return;\n }\n\n this.props.onKeyDown(e);\n }\n\n onBlur = () => {\n this.setState({ suggestionsHidden: true, focused: false });\n }\n\n onFocus = (e) => {\n this.setState({ focused: true });\n if (this.props.onFocus) {\n this.props.onFocus(e);\n }\n }\n\n onSuggestionClick = (e) => {\n const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));\n e.preventDefault();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);\n this.textarea.focus();\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {\n this.setState({ suggestionsHidden: false });\n }\n }\n\n setTextarea = (c) => {\n this.textarea = c;\n }\n\n onPaste = (e) => {\n if (e.clipboardData && e.clipboardData.files.length === 1) {\n this.props.onPaste(e.clipboardData.files);\n e.preventDefault();\n }\n }\n\n renderSuggestion = (suggestion, i) => {\n const { selectedSuggestion } = this.state;\n let inner, key;\n\n if (suggestion.type === 'emoji') {\n inner = <AutosuggestEmoji emoji={suggestion} />;\n key = suggestion.id;\n } else if (suggestion.type === 'hashtag') {\n inner = <AutosuggestHashtag tag={suggestion} />;\n key = suggestion.name;\n } else if (suggestion.type === 'account') {\n inner = <AutosuggestAccountContainer id={suggestion.id} />;\n key = suggestion.id;\n }\n\n return (\n <div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>\n {inner}\n </div>\n );\n }\n\n render () {\n const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, children } = this.props;\n const { suggestionsHidden } = this.state;\n const style = { direction: 'ltr' };\n\n if (isRtl(value)) {\n style.direction = 'rtl';\n }\n\n return [\n <div className='compose-form__autosuggest-wrapper' key='autosuggest-wrapper'>\n <div className='autosuggest-textarea'>\n <label>\n <span style={{ display: 'none' }}>{placeholder}</span>\n\n <Textarea\n inputRef={this.setTextarea}\n className='autosuggest-textarea__textarea'\n disabled={disabled}\n placeholder={placeholder}\n autoFocus={autoFocus}\n value={value}\n onChange={this.onChange}\n onKeyDown={this.onKeyDown}\n onKeyUp={onKeyUp}\n onFocus={this.onFocus}\n onBlur={this.onBlur}\n onPaste={this.onPaste}\n style={style}\n aria-autocomplete='list'\n />\n </label>\n </div>\n {children}\n </div>,\n\n <div className='autosuggest-textarea__suggestions-wrapper' key='suggestions-wrapper'>\n <div className={`autosuggest-textarea__suggestions ${suggestionsHidden || suggestions.isEmpty() ? '' : 'autosuggest-textarea__suggestions--visible'}`}>\n {suggestions.map(this.renderSuggestion)}\n </div>\n </div>,\n ];\n }\n\n}\n","import React from 'react';\nimport AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container';\nimport AutosuggestEmoji from './autosuggest_emoji';\nimport AutosuggestHashtag from './autosuggest_hashtag';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { isRtl } from '../rtl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport classNames from 'classnames';\nimport { List as ImmutableList } from 'immutable';\n\nconst textAtCursorMatchesToken = (str, caretPosition, searchTokens) => {\n let word;\n\n let left = str.slice(0, caretPosition).search(/\\S+$/);\n let right = str.slice(caretPosition).search(/\\s/);\n\n if (right < 0) {\n word = str.slice(left);\n } else {\n word = str.slice(left, right + caretPosition);\n }\n\n if (!word || word.trim().length < 3 || searchTokens.indexOf(word[0]) === -1) {\n return [null, null];\n }\n\n word = word.trim().toLowerCase();\n\n if (word.length > 0) {\n return [left + 1, word];\n } else {\n return [null, null];\n }\n};\n\nexport default class AutosuggestInput extends ImmutablePureComponent {\n\n static propTypes = {\n value: PropTypes.string,\n suggestions: ImmutablePropTypes.list,\n disabled: PropTypes.bool,\n placeholder: PropTypes.string,\n onSuggestionSelected: PropTypes.func.isRequired,\n onSuggestionsClearRequested: PropTypes.func.isRequired,\n onSuggestionsFetchRequested: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onKeyUp: PropTypes.func,\n onKeyDown: PropTypes.func,\n autoFocus: PropTypes.bool,\n className: PropTypes.string,\n id: PropTypes.string,\n searchTokens: PropTypes.arrayOf(PropTypes.string),\n maxLength: PropTypes.number,\n };\n\n static defaultProps = {\n autoFocus: true,\n searchTokens: ImmutableList(['@', ':', '#']),\n };\n\n state = {\n suggestionsHidden: true,\n focused: false,\n selectedSuggestion: 0,\n lastToken: null,\n tokenStart: 0,\n };\n\n onChange = (e) => {\n const [ tokenStart, token ] = textAtCursorMatchesToken(e.target.value, e.target.selectionStart, this.props.searchTokens);\n\n if (token !== null && this.state.lastToken !== token) {\n this.setState({ lastToken: token, selectedSuggestion: 0, tokenStart });\n this.props.onSuggestionsFetchRequested(token);\n } else if (token === null) {\n this.setState({ lastToken: null });\n this.props.onSuggestionsClearRequested();\n }\n\n this.props.onChange(e);\n }\n\n onKeyDown = (e) => {\n const { suggestions, disabled } = this.props;\n const { selectedSuggestion, suggestionsHidden } = this.state;\n\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n if (e.which === 229 || e.isComposing) {\n // Ignore key events during text composition\n // e.key may be a name of the physical key even in this case (e.x. Safari / Chrome on Mac)\n return;\n }\n\n switch(e.key) {\n case 'Escape':\n if (suggestions.size === 0 || suggestionsHidden) {\n document.querySelector('.ui').parentElement.focus();\n } else {\n e.preventDefault();\n this.setState({ suggestionsHidden: true });\n }\n\n break;\n case 'ArrowDown':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) });\n }\n\n break;\n case 'ArrowUp':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) });\n }\n\n break;\n case 'Enter':\n case 'Tab':\n // Select suggestion\n if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion));\n }\n\n break;\n }\n\n if (e.defaultPrevented || !this.props.onKeyDown) {\n return;\n }\n\n this.props.onKeyDown(e);\n }\n\n onBlur = () => {\n this.setState({ suggestionsHidden: true, focused: false });\n }\n\n onFocus = () => {\n this.setState({ focused: true });\n }\n\n onSuggestionClick = (e) => {\n const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));\n e.preventDefault();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);\n this.input.focus();\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {\n this.setState({ suggestionsHidden: false });\n }\n }\n\n setInput = (c) => {\n this.input = c;\n }\n\n renderSuggestion = (suggestion, i) => {\n const { selectedSuggestion } = this.state;\n let inner, key;\n\n if (suggestion.type === 'emoji') {\n inner = <AutosuggestEmoji emoji={suggestion} />;\n key = suggestion.id;\n } else if (suggestion.type ==='hashtag') {\n inner = <AutosuggestHashtag tag={suggestion} />;\n key = suggestion.name;\n } else if (suggestion.type === 'account') {\n inner = <AutosuggestAccountContainer id={suggestion.id} />;\n key = suggestion.id;\n }\n\n return (\n <div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>\n {inner}\n </div>\n );\n }\n\n render () {\n const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength } = this.props;\n const { suggestionsHidden } = this.state;\n const style = { direction: 'ltr' };\n\n if (isRtl(value)) {\n style.direction = 'rtl';\n }\n\n return (\n <div className='autosuggest-input'>\n <label>\n <span style={{ display: 'none' }}>{placeholder}</span>\n\n <input\n type='text'\n ref={this.setInput}\n disabled={disabled}\n placeholder={placeholder}\n autoFocus={autoFocus}\n value={value}\n onChange={this.onChange}\n onKeyDown={this.onKeyDown}\n onKeyUp={onKeyUp}\n onFocus={this.onFocus}\n onBlur={this.onBlur}\n style={style}\n aria-autocomplete='list'\n id={id}\n className={className}\n maxLength={maxLength}\n />\n </label>\n\n <div className={`autosuggest-textarea__suggestions ${suggestionsHidden || suggestions.isEmpty() ? '' : 'autosuggest-textarea__suggestions--visible'}`}>\n {suggestions.map(this.renderSuggestion)}\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport IconButton from '../../../components/icon_button';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n add_poll: { id: 'poll_button.add_poll', defaultMessage: 'Add a poll' },\n remove_poll: { id: 'poll_button.remove_poll', defaultMessage: 'Remove poll' },\n});\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n};\n\nexport default\n@injectIntl\nclass PollButton extends React.PureComponent {\n\n static propTypes = {\n disabled: PropTypes.bool,\n unavailable: PropTypes.bool,\n active: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleClick = () => {\n this.props.onClick();\n }\n\n render () {\n const { intl, active, unavailable, disabled } = this.props;\n\n if (unavailable) {\n return null;\n }\n\n return (\n <div className='compose-form__poll-button'>\n <IconButton\n icon='tasks'\n title={intl.formatMessage(active ? messages.remove_poll : messages.add_poll)}\n disabled={disabled}\n onClick={this.handleClick}\n className={`compose-form__poll-button-icon ${active ? 'active' : ''}`}\n size={18}\n inverted\n style={iconStyle}\n />\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PollButton from '../components/poll_button';\nimport { addPoll, removePoll } from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n unavailable: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 0),\n active: state.getIn(['compose', 'poll']) !== null,\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch((_, getState) => {\n if (getState().getIn(['compose', 'poll'])) {\n dispatch(removePoll());\n } else {\n dispatch(addPoll());\n }\n });\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PollButton);\n","import React from 'react';\nimport IconButton from '../../../components/icon_button';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\n\nconst messages = defineMessages({\n upload: { id: 'upload_button.label', defaultMessage: 'Add media ({formats})' },\n});\n\nconst SUPPORTED_FORMATS = 'JPEG, PNG, GIF, WebM, MP4, MOV, OGG, WAV, MP3, FLAC';\n\nconst makeMapStateToProps = () => {\n const mapStateToProps = state => ({\n acceptContentTypes: state.getIn(['media_attachments', 'accept_content_types']),\n });\n\n return mapStateToProps;\n};\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n};\n\nexport default @connect(makeMapStateToProps)\n@injectIntl\nclass UploadButton extends ImmutablePureComponent {\n\n static propTypes = {\n disabled: PropTypes.bool,\n unavailable: PropTypes.bool,\n onSelectFile: PropTypes.func.isRequired,\n style: PropTypes.object,\n resetFileKey: PropTypes.number,\n acceptContentTypes: ImmutablePropTypes.listOf(PropTypes.string).isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleChange = (e) => {\n if (e.target.files.length > 0) {\n this.props.onSelectFile(e.target.files);\n }\n }\n\n handleClick = () => {\n this.fileElement.click();\n }\n\n setRef = (c) => {\n this.fileElement = c;\n }\n\n render () {\n const { intl, resetFileKey, unavailable, disabled, acceptContentTypes } = this.props;\n\n if (unavailable) {\n return null;\n }\n\n return (\n <div className='compose-form__upload-button'>\n <IconButton icon='paperclip' title={intl.formatMessage(messages.upload, { formats: SUPPORTED_FORMATS })} disabled={disabled} onClick={this.handleClick} className='compose-form__upload-button-icon' size={18} inverted style={iconStyle} />\n <label>\n <span style={{ display: 'none' }}>{intl.formatMessage(messages.upload, { formats: SUPPORTED_FORMATS })}</span>\n <input\n key={resetFileKey}\n ref={this.setRef}\n type='file'\n multiple\n onChange={this.handleChange}\n disabled={disabled}\n style={{ display: 'none' }}\n />\n </label>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport UploadButton from '../components/upload_button';\nimport { uploadCompose } from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size + state.getIn(['compose', 'pending_media_attachments']) > 3 || state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type')))),\n unavailable: state.getIn(['compose', 'poll']) !== null,\n resetFileKey: state.getIn(['compose', 'resetFileKey']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onSelectFile (files) {\n dispatch(uploadCompose(files));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UploadButton);\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n width: `${18 * 1.28571429}px`,\n};\n\nexport default class TextIconButton extends React.PureComponent {\n\n static propTypes = {\n label: PropTypes.string.isRequired,\n title: PropTypes.string,\n active: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n ariaControls: PropTypes.string,\n };\n\n handleClick = (e) => {\n e.preventDefault();\n this.props.onClick();\n }\n\n render () {\n const { label, title, active, ariaControls } = this.props;\n\n return (\n <button\n title={title}\n aria-label={title}\n className={`text-icon-button ${active ? 'active' : ''}`}\n aria-expanded={active}\n onClick={this.handleClick}\n aria-controls={ariaControls} style={iconStyle}\n >\n {label}\n </button>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport TextIconButton from '../components/text_icon_button';\nimport { changeComposeSpoilerness } from '../../../actions/compose';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nconst messages = defineMessages({\n marked: { id: 'compose_form.spoiler.marked', defaultMessage: 'Text is hidden behind warning' },\n unmarked: { id: 'compose_form.spoiler.unmarked', defaultMessage: 'Text is not hidden' },\n});\n\nconst mapStateToProps = (state, { intl }) => ({\n label: 'CW',\n title: intl.formatMessage(state.getIn(['compose', 'spoiler']) ? messages.marked : messages.unmarked),\n active: state.getIn(['compose', 'spoiler']),\n ariaControls: 'cw-spoiler-input',\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch(changeComposeSpoilerness());\n },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(TextIconButton));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, defineMessages } from 'react-intl';\nimport IconButton from '../../../components/icon_button';\nimport Overlay from 'react-overlays/lib/Overlay';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport detectPassiveEvents from 'detect-passive-events';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },\n public_long: { id: 'privacy.public.long', defaultMessage: 'Post to public timelines' },\n unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },\n unlisted_long: { id: 'privacy.unlisted.long', defaultMessage: 'Do not show in public timelines' },\n private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },\n private_long: { id: 'privacy.private.long', defaultMessage: 'Post to followers only' },\n direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },\n direct_long: { id: 'privacy.direct.long', defaultMessage: 'Post to mentioned users only' },\n change_privacy: { id: 'privacy.change', defaultMessage: 'Adjust status privacy' },\n});\n\nconst listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;\n\nclass PrivacyDropdownMenu extends React.PureComponent {\n\n static propTypes = {\n style: PropTypes.object,\n items: PropTypes.array.isRequired,\n value: PropTypes.string.isRequired,\n placement: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n };\n\n state = {\n mounted: false,\n };\n\n handleDocumentClick = e => {\n if (this.node && !this.node.contains(e.target)) {\n this.props.onClose();\n }\n }\n\n handleKeyDown = e => {\n const { items } = this.props;\n const value = e.currentTarget.getAttribute('data-index');\n const index = items.findIndex(item => {\n return (item.value === value);\n });\n let element;\n\n switch(e.key) {\n case 'Escape':\n this.props.onClose();\n break;\n case 'Enter':\n this.handleClick(e);\n break;\n case 'ArrowDown':\n element = this.node.childNodes[index + 1];\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'ArrowUp':\n element = this.node.childNodes[index - 1];\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'Tab':\n if (e.shiftKey) {\n element = this.node.childNodes[index - 1] || this.node.lastChild;\n } else {\n element = this.node.childNodes[index + 1] || this.node.firstChild;\n }\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n e.preventDefault();\n e.stopPropagation();\n }\n break;\n case 'Home':\n element = this.node.firstChild;\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'End':\n element = this.node.lastChild;\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n }\n }\n\n handleClick = e => {\n const value = e.currentTarget.getAttribute('data-index');\n\n e.preventDefault();\n\n this.props.onClose();\n this.props.onChange(value);\n }\n\n componentDidMount () {\n document.addEventListener('click', this.handleDocumentClick, false);\n document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\n if (this.focusedItem) this.focusedItem.focus();\n this.setState({ mounted: true });\n }\n\n componentWillUnmount () {\n document.removeEventListener('click', this.handleDocumentClick, false);\n document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);\n }\n\n setRef = c => {\n this.node = c;\n }\n\n setFocusRef = c => {\n this.focusedItem = c;\n }\n\n render () {\n const { mounted } = this.state;\n const { style, items, placement, value } = this.props;\n\n return (\n <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>\n {({ opacity, scaleX, scaleY }) => (\n // It should not be transformed when mounting because the resulting\n // size will be used to determine the coordinate of the menu by\n // react-overlays\n <div className={`privacy-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null, zIndex: 2 }} role='listbox' ref={this.setRef}>\n {items.map(item => (\n <div role='option' tabIndex='0' key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}>\n <div className='privacy-dropdown__option__icon'>\n <Icon id={item.icon} fixedWidth />\n </div>\n\n <div className='privacy-dropdown__option__content'>\n <strong>{item.text}</strong>\n {item.meta}\n </div>\n </div>\n ))}\n </div>\n )}\n </Motion>\n );\n }\n\n}\n\nexport default @injectIntl\nclass PrivacyDropdown extends React.PureComponent {\n\n static propTypes = {\n isUserTouching: PropTypes.func,\n isModalOpen: PropTypes.bool.isRequired,\n onModalOpen: PropTypes.func,\n onModalClose: PropTypes.func,\n value: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n state = {\n open: false,\n placement: 'bottom',\n };\n\n handleToggle = ({ target }) => {\n if (this.props.isUserTouching()) {\n if (this.state.open) {\n this.props.onModalClose();\n } else {\n this.props.onModalOpen({\n actions: this.options.map(option => ({ ...option, active: option.value === this.props.value })),\n onClick: this.handleModalActionClick,\n });\n }\n } else {\n const { top } = target.getBoundingClientRect();\n if (this.state.open && this.activeElement) {\n this.activeElement.focus();\n }\n this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });\n this.setState({ open: !this.state.open });\n }\n }\n\n handleModalActionClick = (e) => {\n e.preventDefault();\n\n const { value } = this.options[e.currentTarget.getAttribute('data-index')];\n\n this.props.onModalClose();\n this.props.onChange(value);\n }\n\n handleKeyDown = e => {\n switch(e.key) {\n case 'Escape':\n this.handleClose();\n break;\n }\n }\n\n handleMouseDown = () => {\n if (!this.state.open) {\n this.activeElement = document.activeElement;\n }\n }\n\n handleButtonKeyDown = (e) => {\n switch(e.key) {\n case ' ':\n case 'Enter':\n this.handleMouseDown();\n break;\n }\n }\n\n handleClose = () => {\n if (this.state.open && this.activeElement) {\n this.activeElement.focus();\n }\n this.setState({ open: false });\n }\n\n handleChange = value => {\n this.props.onChange(value);\n }\n\n componentWillMount () {\n const { intl: { formatMessage } } = this.props;\n\n this.options = [\n { icon: 'globe', value: 'public', text: formatMessage(messages.public_short), meta: formatMessage(messages.public_long) },\n { icon: 'unlock', value: 'unlisted', text: formatMessage(messages.unlisted_short), meta: formatMessage(messages.unlisted_long) },\n { icon: 'lock', value: 'private', text: formatMessage(messages.private_short), meta: formatMessage(messages.private_long) },\n { icon: 'envelope', value: 'direct', text: formatMessage(messages.direct_short), meta: formatMessage(messages.direct_long) },\n ];\n }\n\n render () {\n const { value, intl } = this.props;\n const { open, placement } = this.state;\n\n const valueOption = this.options.find(item => item.value === value);\n\n return (\n <div className={classNames('privacy-dropdown', placement, { active: open })} onKeyDown={this.handleKeyDown}>\n <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === (placement === 'bottom' ? 0 : (this.options.length - 1)) })}>\n <IconButton\n className='privacy-dropdown__value-icon'\n icon={valueOption.icon}\n title={intl.formatMessage(messages.change_privacy)}\n size={18}\n expanded={open}\n active={open}\n inverted\n onClick={this.handleToggle}\n onMouseDown={this.handleMouseDown}\n onKeyDown={this.handleButtonKeyDown}\n style={{ height: null, lineHeight: '27px' }}\n />\n </div>\n\n <Overlay show={open} placement={placement} target={this}>\n <PrivacyDropdownMenu\n items={this.options}\n value={value}\n onClose={this.handleClose}\n onChange={this.handleChange}\n placement={placement}\n />\n </Overlay>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PrivacyDropdown from '../components/privacy_dropdown';\nimport { changeComposeVisibility } from '../../../actions/compose';\nimport { openModal, closeModal } from '../../../actions/modal';\nimport { isUserTouching } from '../../../is_mobile';\n\nconst mapStateToProps = state => ({\n isModalOpen: state.get('modal').modalType === 'ACTIONS',\n value: state.getIn(['compose', 'privacy']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onChange (value) {\n dispatch(changeComposeVisibility(value));\n },\n\n isUserTouching,\n onModalOpen: props => dispatch(openModal('ACTIONS', props)),\n onModalClose: () => dispatch(closeModal()),\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PrivacyDropdown);\n","import { connect } from 'react-redux';\nimport EmojiPickerDropdown from '../components/emoji_picker_dropdown';\nimport { changeSetting } from '../../../actions/settings';\nimport { createSelector } from 'reselect';\nimport { Map as ImmutableMap } from 'immutable';\nimport { useEmoji } from '../../../actions/emojis';\n\nconst perLine = 8;\nconst lines = 2;\n\nconst DEFAULTS = [\n '+1',\n 'grinning',\n 'kissing_heart',\n 'heart_eyes',\n 'laughing',\n 'stuck_out_tongue_winking_eye',\n 'sweat_smile',\n 'joy',\n 'yum',\n 'disappointed',\n 'thinking_face',\n 'weary',\n 'sob',\n 'sunglasses',\n 'heart',\n 'ok_hand',\n];\n\nconst getFrequentlyUsedEmojis = createSelector([\n state => state.getIn(['settings', 'frequentlyUsedEmojis'], ImmutableMap()),\n], emojiCounters => {\n let emojis = emojiCounters\n .keySeq()\n .sort((a, b) => emojiCounters.get(a) - emojiCounters.get(b))\n .reverse()\n .slice(0, perLine * lines)\n .toArray();\n\n if (emojis.length < DEFAULTS.length) {\n let uniqueDefaults = DEFAULTS.filter(emoji => !emojis.includes(emoji));\n emojis = emojis.concat(uniqueDefaults.slice(0, DEFAULTS.length - emojis.length));\n }\n\n return emojis;\n});\n\nconst getCustomEmojis = createSelector([\n state => state.get('custom_emojis'),\n], emojis => emojis.filter(e => e.get('visible_in_picker')).sort((a, b) => {\n const aShort = a.get('shortcode').toLowerCase();\n const bShort = b.get('shortcode').toLowerCase();\n\n if (aShort < bShort) {\n return -1;\n } else if (aShort > bShort ) {\n return 1;\n } else {\n return 0;\n }\n}));\n\nconst mapStateToProps = state => ({\n custom_emojis: getCustomEmojis(state),\n skinTone: state.getIn(['settings', 'skinTone']),\n frequentlyUsedEmojis: getFrequentlyUsedEmojis(state),\n});\n\nconst mapDispatchToProps = (dispatch, { onPickEmoji }) => ({\n onSkinTone: skinTone => {\n dispatch(changeSetting(['skinTone'], skinTone));\n },\n\n onPickEmoji: emoji => {\n dispatch(useEmoji(emoji));\n\n if (onPickEmoji) {\n onPickEmoji(emoji);\n }\n },\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiPickerDropdown);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport IconButton from 'mastodon/components/icon_button';\nimport Icon from 'mastodon/components/icon';\nimport AutosuggestInput from 'mastodon/components/autosuggest_input';\nimport classNames from 'classnames';\n\nconst messages = defineMessages({\n option_placeholder: { id: 'compose_form.poll.option_placeholder', defaultMessage: 'Choice {number}' },\n add_option: { id: 'compose_form.poll.add_option', defaultMessage: 'Add a choice' },\n remove_option: { id: 'compose_form.poll.remove_option', defaultMessage: 'Remove this choice' },\n poll_duration: { id: 'compose_form.poll.duration', defaultMessage: 'Poll duration' },\n switchToMultiple: { id: 'compose_form.poll.switch_to_multiple', defaultMessage: 'Change poll to allow multiple choices' },\n switchToSingle: { id: 'compose_form.poll.switch_to_single', defaultMessage: 'Change poll to allow for a single choice' },\n minutes: { id: 'intervals.full.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}}' },\n hours: { id: 'intervals.full.hours', defaultMessage: '{number, plural, one {# hour} other {# hours}}' },\n days: { id: 'intervals.full.days', defaultMessage: '{number, plural, one {# day} other {# days}}' },\n});\n\n@injectIntl\nclass Option extends React.PureComponent {\n\n static propTypes = {\n title: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n isPollMultiple: PropTypes.bool,\n onChange: PropTypes.func.isRequired,\n onRemove: PropTypes.func.isRequired,\n onToggleMultiple: PropTypes.func.isRequired,\n suggestions: ImmutablePropTypes.list,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleOptionTitleChange = e => {\n this.props.onChange(this.props.index, e.target.value);\n };\n\n handleOptionRemove = () => {\n this.props.onRemove(this.props.index);\n };\n\n\n handleToggleMultiple = e => {\n this.props.onToggleMultiple();\n e.preventDefault();\n e.stopPropagation();\n };\n\n handleCheckboxKeypress = e => {\n if (e.key === 'Enter' || e.key === ' ') {\n this.handleToggleMultiple(e);\n }\n }\n\n onSuggestionsClearRequested = () => {\n this.props.onClearSuggestions();\n }\n\n onSuggestionsFetchRequested = (token) => {\n this.props.onFetchSuggestions(token);\n }\n\n onSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['poll', 'options', this.props.index]);\n }\n\n render () {\n const { isPollMultiple, title, index, intl } = this.props;\n\n return (\n <li>\n <label className='poll__text editable'>\n <span\n className={classNames('poll__input', { checkbox: isPollMultiple })}\n onClick={this.handleToggleMultiple}\n onKeyPress={this.handleCheckboxKeypress}\n role='button'\n tabIndex='0'\n title={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}\n aria-label={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}\n />\n\n <AutosuggestInput\n placeholder={intl.formatMessage(messages.option_placeholder, { number: index + 1 })}\n maxLength={100}\n value={title}\n onChange={this.handleOptionTitleChange}\n suggestions={this.props.suggestions}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSuggestionSelected}\n searchTokens={[':']}\n />\n </label>\n\n <div className='poll__cancel'>\n <IconButton disabled={index <= 1} title={intl.formatMessage(messages.remove_option)} icon='times' onClick={this.handleOptionRemove} />\n </div>\n </li>\n );\n }\n\n}\n\nexport default\n@injectIntl\nclass PollForm extends ImmutablePureComponent {\n\n static propTypes = {\n options: ImmutablePropTypes.list,\n expiresIn: PropTypes.number,\n isMultiple: PropTypes.bool,\n onChangeOption: PropTypes.func.isRequired,\n onAddOption: PropTypes.func.isRequired,\n onRemoveOption: PropTypes.func.isRequired,\n onChangeSettings: PropTypes.func.isRequired,\n suggestions: ImmutablePropTypes.list,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleAddOption = () => {\n this.props.onAddOption('');\n };\n\n handleSelectDuration = e => {\n this.props.onChangeSettings(e.target.value, this.props.isMultiple);\n };\n\n handleToggleMultiple = () => {\n this.props.onChangeSettings(this.props.expiresIn, !this.props.isMultiple);\n };\n\n render () {\n const { options, expiresIn, isMultiple, onChangeOption, onRemoveOption, intl, ...other } = this.props;\n\n if (!options) {\n return null;\n }\n\n return (\n <div className='compose-form__poll-wrapper'>\n <ul>\n {options.map((title, i) => <Option title={title} key={i} index={i} onChange={onChangeOption} onRemove={onRemoveOption} isPollMultiple={isMultiple} onToggleMultiple={this.handleToggleMultiple} {...other} />)}\n </ul>\n\n <div className='poll__footer'>\n <button disabled={options.size >= 5} className='button button-secondary' onClick={this.handleAddOption}><Icon id='plus' /> <FormattedMessage {...messages.add_option} /></button>\n\n <select value={expiresIn} onChange={this.handleSelectDuration}>\n <option value={300}>{intl.formatMessage(messages.minutes, { number: 5 })}</option>\n <option value={1800}>{intl.formatMessage(messages.minutes, { number: 30 })}</option>\n <option value={3600}>{intl.formatMessage(messages.hours, { number: 1 })}</option>\n <option value={21600}>{intl.formatMessage(messages.hours, { number: 6 })}</option>\n <option value={86400}>{intl.formatMessage(messages.days, { number: 1 })}</option>\n <option value={259200}>{intl.formatMessage(messages.days, { number: 3 })}</option>\n <option value={604800}>{intl.formatMessage(messages.days, { number: 7 })}</option>\n </select>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PollForm from '../components/poll_form';\nimport { addPollOption, removePollOption, changePollOption, changePollSettings } from '../../../actions/compose';\nimport {\n clearComposeSuggestions,\n fetchComposeSuggestions,\n selectComposeSuggestion,\n} from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n suggestions: state.getIn(['compose', 'suggestions']),\n options: state.getIn(['compose', 'poll', 'options']),\n expiresIn: state.getIn(['compose', 'poll', 'expires_in']),\n isMultiple: state.getIn(['compose', 'poll', 'multiple']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onAddOption(title) {\n dispatch(addPollOption(title));\n },\n\n onRemoveOption(index) {\n dispatch(removePollOption(index));\n },\n\n onChangeOption(index, title) {\n dispatch(changePollOption(index, title));\n },\n\n onChangeSettings(expiresIn, isMultiple) {\n dispatch(changePollSettings(expiresIn, isMultiple));\n },\n\n onClearSuggestions () {\n dispatch(clearComposeSuggestions());\n },\n\n onFetchSuggestions (token) {\n dispatch(fetchComposeSuggestions(token));\n },\n\n onSuggestionSelected (position, token, accountId, path) {\n dispatch(selectComposeSuggestion(position, token, accountId, path));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PollForm);\n","import { connect } from 'react-redux';\nimport UploadProgress from '../components/upload_progress';\n\nconst mapStateToProps = state => ({\n active: state.getIn(['compose', 'is_uploading']),\n progress: state.getIn(['compose', 'progress']),\n});\n\nexport default connect(mapStateToProps)(UploadProgress);\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { FormattedMessage } from 'react-intl';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nexport default class Upload extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n media: ImmutablePropTypes.map.isRequired,\n onUndo: PropTypes.func.isRequired,\n onOpenFocalPoint: PropTypes.func.isRequired,\n };\n\n handleUndoClick = e => {\n e.stopPropagation();\n this.props.onUndo(this.props.media.get('id'));\n }\n\n handleFocalPointClick = e => {\n e.stopPropagation();\n this.props.onOpenFocalPoint(this.props.media.get('id'));\n }\n\n render () {\n const { media } = this.props;\n const focusX = media.getIn(['meta', 'focus', 'x']);\n const focusY = media.getIn(['meta', 'focus', 'y']);\n const x = ((focusX / 2) + .5) * 100;\n const y = ((focusY / -2) + .5) * 100;\n\n return (\n <div className='compose-form__upload' tabIndex='0' role='button'>\n <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>\n {({ scale }) => (\n <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>\n <div className={classNames('compose-form__upload__actions', { active: true })}>\n <button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button>\n <button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>\n </div>\n </div>\n )}\n </Motion>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport Upload from '../components/upload';\nimport { undoUploadCompose } from '../../../actions/compose';\nimport { openModal } from '../../../actions/modal';\nimport { submitCompose } from '../../../actions/compose';\n\nconst mapStateToProps = (state, { id }) => ({\n media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onUndo: id => {\n dispatch(undoUploadCompose(id));\n },\n\n onOpenFocalPoint: id => {\n dispatch(openModal('FOCAL_POINT', { id }));\n },\n\n onSubmit (router) {\n dispatch(submitCompose(router));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Upload);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { changeComposeSensitivity } from 'mastodon/actions/compose';\nimport { injectIntl, defineMessages, FormattedMessage } from 'react-intl';\n\nconst messages = defineMessages({\n marked: { id: 'compose_form.sensitive.marked', defaultMessage: 'Media is marked as sensitive' },\n unmarked: { id: 'compose_form.sensitive.unmarked', defaultMessage: 'Media is not marked as sensitive' },\n});\n\nconst mapStateToProps = state => ({\n active: state.getIn(['compose', 'sensitive']),\n disabled: state.getIn(['compose', 'spoiler']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch(changeComposeSensitivity());\n },\n\n});\n\nclass SensitiveButton extends React.PureComponent {\n\n static propTypes = {\n active: PropTypes.bool,\n disabled: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { active, disabled, onClick, intl } = this.props;\n\n return (\n <div className='compose-form__sensitive-button'>\n <label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked)}>\n <input\n name='mark-sensitive'\n type='checkbox'\n checked={active}\n onChange={onClick}\n disabled={disabled}\n />\n\n <span className={classNames('checkbox', { active })} />\n\n <FormattedMessage id='compose_form.sensitive.hide' defaultMessage='Mark media as sensitive' />\n </label>\n </div>\n );\n }\n\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(injectIntl(SensitiveButton));\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport UploadProgressContainer from '../containers/upload_progress_container';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport UploadContainer from '../containers/upload_container';\nimport SensitiveButtonContainer from '../containers/sensitive_button_container';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class UploadForm extends ImmutablePureComponent {\n\n static propTypes = {\n mediaIds: ImmutablePropTypes.list.isRequired,\n };\n\n render () {\n const { mediaIds } = this.props;\n\n return (\n <div className='compose-form__upload-wrapper'>\n <UploadProgressContainer icon='upload' message={<FormattedMessage id='upload_progress.label' defaultMessage='Uploading…' />} />\n\n <div className='compose-form__uploads-wrapper'>\n {mediaIds.map(id => (\n <UploadContainer id={id} key={id} />\n ))}\n </div>\n\n {!mediaIds.isEmpty() && <SensitiveButtonContainer />}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport UploadForm from '../components/upload_form';\n\nconst mapStateToProps = state => ({\n mediaIds: state.getIn(['compose', 'media_attachments']).map(item => item.get('id')),\n});\n\nexport default connect(mapStateToProps)(UploadForm);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\n\nexport default class Warning extends React.PureComponent {\n\n static propTypes = {\n message: PropTypes.node.isRequired,\n };\n\n render () {\n const { message } = this.props;\n\n return (\n <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>\n {({ opacity, scaleX, scaleY }) => (\n <div className='compose-form__warning' style={{ opacity: opacity, transform: `scale(${scaleX}, ${scaleY})` }}>\n {message}\n </div>\n )}\n </Motion>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport Warning from '../components/warning';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from 'react-intl';\nimport { me } from '../../../initial_state';\n\nconst APPROX_HASHTAG_RE = /(?:^|[^\\/\\)\\w])#(\\w*[a-zA-Z·]\\w*)/i;\n\nconst mapStateToProps = state => ({\n needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']),\n hashtagWarning: state.getIn(['compose', 'privacy']) !== 'public' && APPROX_HASHTAG_RE.test(state.getIn(['compose', 'text'])),\n directMessageWarning: state.getIn(['compose', 'privacy']) === 'direct',\n});\n\nconst WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning }) => {\n if (needsLockWarning) {\n return <Warning message={<FormattedMessage id='compose_form.lock_disclaimer' defaultMessage='Your account is not {locked}. Anyone can follow you to view your follower-only posts.' values={{ locked: <a href='/user-settings'><FormattedMessage id='compose_form.lock_disclaimer.lock' defaultMessage='locked' /></a> }} />} />;\n }\n\n if (hashtagWarning) {\n return <Warning message={<FormattedMessage id='compose_form.hashtag_warning' defaultMessage=\"This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.\" />} />;\n }\n\n if (directMessageWarning) {\n const message = (\n <span>\n <FormattedMessage id='compose_form.direct_message_warning' defaultMessage='This toot will only be sent to all the mentioned users.' /> <a href='/terms' target='_blank'><FormattedMessage id='compose_form.direct_message_warning_learn_more' defaultMessage='Learn more' /></a>\n </span>\n );\n\n return <Warning message={message} />;\n }\n\n return null;\n};\n\nWarningWrapper.propTypes = {\n needsLockWarning: PropTypes.bool,\n hashtagWarning: PropTypes.bool,\n directMessageWarning: PropTypes.bool,\n};\n\nexport default connect(mapStateToProps)(WarningWrapper);\n","import React from 'react';\nimport CharacterCounter from './character_counter';\nimport Button from '../../../components/button';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport ReplyIndicatorContainer from '../containers/reply_indicator_container';\nimport AutosuggestTextarea from '../../../components/autosuggest_textarea';\nimport AutosuggestInput from '../../../components/autosuggest_input';\nimport PollButtonContainer from '../containers/poll_button_container';\nimport UploadButtonContainer from '../containers/upload_button_container';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport SpoilerButtonContainer from '../containers/spoiler_button_container';\nimport PrivacyDropdownContainer from '../containers/privacy_dropdown_container';\nimport EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';\nimport PollFormContainer from '../containers/poll_form_container';\nimport UploadFormContainer from '../containers/upload_form_container';\nimport WarningContainer from '../containers/warning_container';\nimport { isMobile } from '../../../is_mobile';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { length } from 'stringz';\nimport Icon from 'mastodon/components/icon';\nimport { maxChars } from '../../../initial_state';\n\nconst allowedAroundShortCode = '><\\u0085\\u0020\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\u0009\\u000a\\u000b\\u000c\\u000d';\n\nconst messages = defineMessages({\n placeholder: { id: 'compose_form.placeholder', defaultMessage: 'What is on your mind?' },\n spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' },\n publish: { id: 'compose_form.publish', defaultMessage: 'Toot' },\n publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' },\n});\n\nexport default @injectIntl\nclass ComposeForm extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n text: PropTypes.string.isRequired,\n suggestions: ImmutablePropTypes.list,\n spoiler: PropTypes.bool,\n privacy: PropTypes.string,\n spoilerText: PropTypes.string,\n focusDate: PropTypes.instanceOf(Date),\n caretPosition: PropTypes.number,\n preselectDate: PropTypes.instanceOf(Date),\n isSubmitting: PropTypes.bool,\n isChangingUpload: PropTypes.bool,\n isUploading: PropTypes.bool,\n onChange: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n onChangeSpoilerText: PropTypes.func.isRequired,\n onPaste: PropTypes.func.isRequired,\n onPickEmoji: PropTypes.func.isRequired,\n showSearch: PropTypes.bool,\n anyMedia: PropTypes.bool,\n singleColumn: PropTypes.bool,\n };\n\n static defaultProps = {\n showSearch: false,\n };\n\n handleChange = (e) => {\n this.props.onChange(e.target.value);\n }\n\n handleKeyDown = (e) => {\n if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {\n this.handleSubmit();\n }\n }\n\n handleSubmit = () => {\n if (this.props.text !== this.autosuggestTextarea.textarea.value) {\n // Something changed the text inside the textarea (e.g. browser extensions like Grammarly)\n // Update the state to match the current text\n this.props.onChange(this.autosuggestTextarea.textarea.value);\n }\n\n // Submit disabled:\n const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props;\n const fulltext = [this.props.spoilerText, this.props.text].join('');\n\n if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > maxChars || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) {\n return;\n }\n\n this.props.onSubmit(this.context.router ? this.context.router.history : null);\n }\n\n onSuggestionsClearRequested = () => {\n this.props.onClearSuggestions();\n }\n\n onSuggestionsFetchRequested = (token) => {\n this.props.onFetchSuggestions(token);\n }\n\n onSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['text']);\n }\n\n onSpoilerSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['spoiler_text']);\n }\n\n handleChangeSpoilerText = (e) => {\n this.props.onChangeSpoilerText(e.target.value);\n }\n\n handleFocus = () => {\n if (this.composeForm && !this.props.singleColumn) {\n const { left, right } = this.composeForm.getBoundingClientRect();\n if (left < 0 || right > (window.innerWidth || document.documentElement.clientWidth)) {\n this.composeForm.scrollIntoView();\n }\n }\n }\n\n componentDidUpdate (prevProps) {\n // This statement does several things:\n // - If we're beginning a reply, and,\n // - Replying to zero or one users, places the cursor at the end of the textbox.\n // - Replying to more than one user, selects any usernames past the first;\n // this provides a convenient shortcut to drop everyone else from the conversation.\n if (this.props.focusDate !== prevProps.focusDate) {\n let selectionEnd, selectionStart;\n\n if (this.props.preselectDate !== prevProps.preselectDate) {\n selectionEnd = this.props.text.length;\n selectionStart = this.props.text.search(/\\s/) + 1;\n } else if (typeof this.props.caretPosition === 'number') {\n selectionStart = this.props.caretPosition;\n selectionEnd = this.props.caretPosition;\n } else {\n selectionEnd = this.props.text.length;\n selectionStart = selectionEnd;\n }\n\n this.autosuggestTextarea.textarea.setSelectionRange(selectionStart, selectionEnd);\n this.autosuggestTextarea.textarea.focus();\n } else if(prevProps.isSubmitting && !this.props.isSubmitting) {\n this.autosuggestTextarea.textarea.focus();\n } else if (this.props.spoiler !== prevProps.spoiler) {\n if (this.props.spoiler) {\n this.spoilerText.input.focus();\n } else {\n this.autosuggestTextarea.textarea.focus();\n }\n }\n }\n\n setAutosuggestTextarea = (c) => {\n this.autosuggestTextarea = c;\n }\n\n setSpoilerText = (c) => {\n this.spoilerText = c;\n }\n\n setRef = c => {\n this.composeForm = c;\n };\n\n handleEmojiPick = (data) => {\n const { text } = this.props;\n const position = this.autosuggestTextarea.textarea.selectionStart;\n const needsSpace = data.custom && position > 0 && !allowedAroundShortCode.includes(text[position - 1]);\n\n this.props.onPickEmoji(position, data, needsSpace);\n }\n\n render () {\n const { intl, onPaste, showSearch, anyMedia } = this.props;\n const disabled = this.props.isSubmitting;\n const text = [this.props.spoilerText, this.props.text].join('');\n const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > maxChars || (text.length !== 0 && text.trim().length === 0 && !anyMedia);\n let publishText = '';\n\n if (this.props.privacy === 'private' || this.props.privacy === 'direct') {\n publishText = <span className='compose-form__publish-private'><Icon id='lock' /> {intl.formatMessage(messages.publish)}</span>;\n } else {\n publishText = this.props.privacy !== 'unlisted' ? intl.formatMessage(messages.publishLoud, { publish: intl.formatMessage(messages.publish) }) : intl.formatMessage(messages.publish);\n }\n\n return (\n <div className='compose-form'>\n <WarningContainer />\n\n <ReplyIndicatorContainer />\n\n <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`} ref={this.setRef}>\n <AutosuggestInput\n placeholder={intl.formatMessage(messages.spoiler_placeholder)}\n value={this.props.spoilerText}\n onChange={this.handleChangeSpoilerText}\n onKeyDown={this.handleKeyDown}\n disabled={!this.props.spoiler}\n ref={this.setSpoilerText}\n suggestions={this.props.suggestions}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSpoilerSuggestionSelected}\n searchTokens={[':']}\n id='cw-spoiler-input'\n className='spoiler-input__input'\n />\n </div>\n\n <AutosuggestTextarea\n ref={this.setAutosuggestTextarea}\n placeholder={intl.formatMessage(messages.placeholder)}\n disabled={disabled}\n value={this.props.text}\n onChange={this.handleChange}\n suggestions={this.props.suggestions}\n onFocus={this.handleFocus}\n onKeyDown={this.handleKeyDown}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSuggestionSelected}\n onPaste={onPaste}\n autoFocus={!showSearch && !isMobile(window.innerWidth)}\n >\n <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />\n <div className='compose-form__modifiers'>\n <UploadFormContainer />\n <PollFormContainer />\n </div>\n </AutosuggestTextarea>\n\n <div className='compose-form__buttons-wrapper'>\n <div className='compose-form__buttons'>\n <UploadButtonContainer />\n <PollButtonContainer />\n <PrivacyDropdownContainer />\n <SpoilerButtonContainer />\n </div>\n <div className='character-counter__wrapper'><CharacterCounter max={maxChars} text={text} /></div>\n </div>\n\n <div className='compose-form__publish'>\n <div className='compose-form__publish-button-wrapper'><Button text={publishText} onClick={this.handleSubmit} disabled={disabledButton} block /></div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ComposeForm from '../components/compose_form';\nimport {\n changeCompose,\n submitCompose,\n clearComposeSuggestions,\n fetchComposeSuggestions,\n selectComposeSuggestion,\n changeComposeSpoilerText,\n insertEmojiCompose,\n uploadCompose,\n} from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n text: state.getIn(['compose', 'text']),\n suggestions: state.getIn(['compose', 'suggestions']),\n spoiler: state.getIn(['compose', 'spoiler']),\n spoilerText: state.getIn(['compose', 'spoiler_text']),\n privacy: state.getIn(['compose', 'privacy']),\n focusDate: state.getIn(['compose', 'focusDate']),\n caretPosition: state.getIn(['compose', 'caretPosition']),\n preselectDate: state.getIn(['compose', 'preselectDate']),\n isSubmitting: state.getIn(['compose', 'is_submitting']),\n isChangingUpload: state.getIn(['compose', 'is_changing_upload']),\n isUploading: state.getIn(['compose', 'is_uploading']),\n showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),\n anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n\n onChange (text) {\n dispatch(changeCompose(text));\n },\n\n onSubmit (router) {\n dispatch(submitCompose(router));\n },\n\n onClearSuggestions () {\n dispatch(clearComposeSuggestions());\n },\n\n onFetchSuggestions (token) {\n dispatch(fetchComposeSuggestions(token));\n },\n\n onSuggestionSelected (position, token, suggestion, path) {\n dispatch(selectComposeSuggestion(position, token, suggestion, path));\n },\n\n onChangeSpoilerText (checked) {\n dispatch(changeComposeSpoilerText(checked));\n },\n\n onPaste (files) {\n dispatch(uploadCompose(files));\n },\n\n onPickEmoji (position, data, needsSpace) {\n dispatch(insertEmojiCompose(position, data, needsSpace));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ComposeForm);\n","import { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport NavigationBar from '../components/navigation_bar';\nimport { logOut } from 'mastodon/utils/log_out';\nimport { openModal } from 'mastodon/actions/modal';\nimport { me } from '../../../initial_state';\n\nconst messages = defineMessages({\n logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },\n logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },\n});\n\nconst mapStateToProps = state => {\n return {\n account: state.getIn(['accounts', me]),\n };\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n onLogout () {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.logoutMessage),\n confirm: intl.formatMessage(messages.logoutConfirm),\n onConfirm: () => logOut(),\n }));\n },\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(NavigationBar));\n","import React from 'react';\nimport ComposeFormContainer from './containers/compose_form_container';\nimport NavigationContainer from './containers/navigation_container';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport { mountCompose, unmountCompose } from '../../actions/compose';\nimport { Link } from 'react-router-dom';\nimport { injectIntl, defineMessages } from 'react-intl';\nimport SearchContainer from './containers/search_container';\nimport Motion from '../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport SearchResultsContainer from './containers/search_results_container';\nimport { changeComposing } from '../../actions/compose';\nimport { openModal } from 'mastodon/actions/modal';\nimport { mascot } from '../../initial_state';\nimport Icon from 'mastodon/components/icon';\nimport { logOut } from 'mastodon/utils/log_out';\n\nconst messages = defineMessages({\n start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },\n home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' },\n notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },\n public: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },\n community: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },\n preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },\n logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },\n compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new toot' },\n logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },\n logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },\n});\n\nconst mapStateToProps = (state, ownProps) => ({\n columns: state.getIn(['settings', 'columns']),\n showSearch: ownProps.multiColumn ? state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']) : ownProps.isSearchPage,\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Compose extends React.PureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n columns: ImmutablePropTypes.list.isRequired,\n multiColumn: PropTypes.bool,\n showSearch: PropTypes.bool,\n isSearchPage: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n };\n\n componentDidMount () {\n const { isSearchPage } = this.props;\n\n if (!isSearchPage) {\n this.props.dispatch(mountCompose());\n }\n }\n\n componentWillUnmount () {\n const { isSearchPage } = this.props;\n\n if (!isSearchPage) {\n this.props.dispatch(unmountCompose());\n }\n }\n\n handleLogoutClick = e => {\n const { dispatch, intl } = this.props;\n\n e.preventDefault();\n e.stopPropagation();\n\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.logoutMessage),\n confirm: intl.formatMessage(messages.logoutConfirm),\n onConfirm: () => logOut(),\n }));\n\n return false;\n }\n\n onFocus = () => {\n this.props.dispatch(changeComposing(true));\n }\n\n onBlur = () => {\n this.props.dispatch(changeComposing(false));\n }\n\n render () {\n const { multiColumn, showSearch, isSearchPage, intl } = this.props;\n\n let header = '';\n\n if (multiColumn) {\n const { columns } = this.props;\n header = (\n <nav className='drawer__header'>\n <Link to='/getting-started' className='drawer__tab' title={intl.formatMessage(messages.start)} aria-label={intl.formatMessage(messages.start)}><Icon id='bars' fixedWidth /></Link>\n {!columns.some(column => column.get('id') === 'HOME') && (\n <Link to='/timelines/home' className='drawer__tab' title={intl.formatMessage(messages.home_timeline)} aria-label={intl.formatMessage(messages.home_timeline)}><Icon id='home' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'NOTIFICATIONS') && (\n <Link to='/notifications' className='drawer__tab' title={intl.formatMessage(messages.notifications)} aria-label={intl.formatMessage(messages.notifications)}><Icon id='bell' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'COMMUNITY') && (\n <Link to='/timelines/public/local' className='drawer__tab' title={intl.formatMessage(messages.community)} aria-label={intl.formatMessage(messages.community)}><Icon id='users' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'PUBLIC') && (\n <Link to='/timelines/public' className='drawer__tab' title={intl.formatMessage(messages.public)} aria-label={intl.formatMessage(messages.public)}><Icon id='globe' fixedWidth /></Link>\n )}\n <a href='/user-settings' className='drawer__tab' title={intl.formatMessage(messages.preferences)} aria-label={intl.formatMessage(messages.preferences)}><Icon id='cog' fixedWidth /></a>\n <a href='/auth/sign_out' className='drawer__tab' title={intl.formatMessage(messages.logout)} aria-label={intl.formatMessage(messages.logout)} onClick={this.handleLogoutClick}><Icon id='sign-out' fixedWidth /></a>\n </nav>\n );\n }\n\n return (\n <div className='drawer' role='region' aria-label={intl.formatMessage(messages.compose)}>\n {header}\n\n {(multiColumn || isSearchPage) && <SearchContainer /> }\n\n <div className='drawer__pager'>\n {!isSearchPage && <div className='drawer__inner' onFocus={this.onFocus}>\n <NavigationContainer onClose={this.onBlur} />\n\n <ComposeFormContainer />\n\n <div className='drawer__inner__mastodon'>\n <img alt='' draggable='false' src={mascot || elephantUIPlane} />\n </div>\n </div>}\n\n <Motion defaultStyle={{ x: isSearchPage ? 0 : -100 }} style={{ x: spring(showSearch || isSearchPage ? 0 : -100, { stiffness: 210, damping: 20 }) }}>\n {({ x }) => (\n <div className='drawer__inner darker' style={{ transform: `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>\n <SearchResultsContainer />\n </div>\n )}\n </Motion>\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_emoji.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/reply_indicator.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/reply_indicator_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/autosuggest_account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/autosuggest_account_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_hashtag.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_textarea.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/autosuggest_input.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/poll_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/poll_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/text_icon_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/spoiler_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/privacy_dropdown.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/privacy_dropdown_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/poll_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/poll_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_progress_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/sensitive_button_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/upload_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/upload_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/warning.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/warning_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/components/compose_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/compose_form_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/containers/navigation_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/compose/index.js"],"names":["assetHost","process","env","CDN_HOST","AutosuggestEmoji","render","url","emoji","this","props","custom","imageUrl","mapping","unicodeMapping","native","replace","filename","className","src","alt","colons","React","PureComponent","messages","defineMessages","cancel","ReplyIndicator","injectIntl","onCancel","e","button","ctrlKey","metaKey","preventDefault","context","router","history","push","status","getIn","intl","content","__html","get","style","direction","isRtl","title","formatMessage","icon","onClick","handleClick","inverted","href","handleAccountClick","account","size","dangerouslySetInnerHTML","compact","media","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","connect","getStatus","makeGetStatus","state","id","dispatch","cancelReplyCompose","AutosuggestAccount","getAccount","makeGetAccount","AutosuggestHashtag","tag","weeklyUses","shortNumberFormat","reduce","total","day","uses","name","undefined","defaultMessage","values","count","textAtCursorMatchesToken","str","caretPosition","word","left","slice","search","right","trim","length","indexOf","toLowerCase","AutosuggestTextarea","suggestionsHidden","focused","selectedSuggestion","lastToken","tokenStart","target","value","selectionStart","token","setState","onSuggestionsFetchRequested","onSuggestionsClearRequested","onChange","suggestions","disabled","which","isComposing","key","document","querySelector","parentElement","focus","Math","min","max","stopPropagation","onSuggestionSelected","defaultPrevented","onKeyDown","onFocus","suggestion","currentTarget","getAttribute","textarea","c","clipboardData","files","onPaste","i","inner","type","role","tabIndex","data-index","classNames","selected","onMouseDown","onSuggestionClick","componentWillReceiveProps","nextProps","placeholder","onKeyUp","autoFocus","children","display","inputRef","setTextarea","onBlur","aria-autocomplete","isEmpty","renderSuggestion","string","list","bool","searchTokens","AutosuggestInput","input","maxLength","ref","setInput","arrayOf","number","ImmutableList","add_poll","remove_poll","iconStyle","height","lineHeight","PollButton","active","unavailable","_","getState","removePoll","addPoll","upload","UploadButton","acceptContentTypes","onSelectFile","fileElement","click","resetFileKey","formats","setRef","multiple","handleChange","listOf","some","m","includes","uploadCompose","width","TextIconButton","label","ariaControls","aria-label","aria-expanded","aria-controls","marked","unmarked","changeComposeSpoilerness","public_short","public_long","unlisted_short","unlisted_long","private_short","private_long","direct_short","direct_long","change_privacy","listenerOptions","detectPassiveEvents","hasSupport","passive","PrivacyDropdownMenu","mounted","node","contains","onClose","element","items","index","findIndex","item","childNodes","shiftKey","lastChild","firstChild","focusedItem","componentDidMount","addEventListener","handleDocumentClick","componentWillUnmount","removeEventListener","placement","defaultStyle","opacity","scaleX","scaleY","spring","damping","stiffness","transform","zIndex","handleKeyDown","aria-selected","setFocusRef","fixedWidth","text","meta","PrivacyDropdown","open","isUserTouching","onModalClose","onModalOpen","actions","options","option","handleModalActionClick","top","getBoundingClientRect","activeElement","innerHeight","handleClose","handleMouseDown","componentWillMount","valueOption","find","expanded","handleToggle","handleButtonKeyDown","show","isModalOpen","modalType","changeComposeVisibility","openModal","closeModal","option_placeholder","add_option","remove_option","poll_duration","switchToMultiple","switchToSingle","minutes","hours","days","Option","onRemove","onToggleMultiple","handleToggleMultiple","onClearSuggestions","onFetchSuggestions","isPollMultiple","checkbox","onKeyPress","handleCheckboxKeypress","handleOptionTitleChange","handleOptionRemove","PollForm","onAddOption","onChangeSettings","isMultiple","expiresIn","onChangeOption","onRemoveOption","other","handleAddOption","handleSelectDuration","addPollOption","removePollOption","changePollOption","changePollSettings","clearComposeSuggestions","fetchComposeSuggestions","position","accountId","path","selectComposeSuggestion","progress","UploadProgress","Upload","onUndo","onOpenFocalPoint","focusX","focusY","x","y","scale","backgroundImage","backgroundPosition","handleUndoClick","handleFocalPointClick","undoUploadCompose","onSubmit","submitCompose","SensitiveButton","checked","changeComposeSensitivity","UploadForm","mediaIds","message","Warning","APPROX_HASHTAG_RE","needsLockWarning","me","hashtagWarning","test","directMessageWarning","locked","allowedAroundShortCode","spoiler_placeholder","publish","publishLoud","ComposeForm","keyCode","handleSubmit","autosuggestTextarea","isSubmitting","isChangingUpload","isUploading","anyMedia","fulltext","spoilerText","join","maxChars","onChangeSpoilerText","composeForm","singleColumn","window","innerWidth","documentElement","clientWidth","scrollIntoView","data","needsSpace","onPickEmoji","componentDidUpdate","prevProps","selectionEnd","focusDate","preselectDate","setSelectionRange","spoiler","showSearch","disabledButton","publishText","privacy","handleChangeSpoilerText","setSpoilerText","onSpoilerSuggestionSelected","setAutosuggestTextarea","handleFocus","isMobile","handleEmojiPick","block","instanceOf","Date","changeCompose","changeComposeSpoilerText","insertEmojiCompose","logoutMessage","logoutConfirm","onLogout","confirm","onConfirm","logOut","NavigationBar","start","home_timeline","notifications","public","community","preferences","logout","compose","Compose","ownProps","columns","multiColumn","isSearchPage","changeComposing","mountCompose","unmountCompose","header","to","column","handleLogoutClick","draggable","mascot","visibility"],"mappings":"yMAIA,IAAMA,EAAYC,EAAQC,IAAIC,UAAY,GAErBC,E,4GAMnBC,OAAA,WAAW,IAELC,EADIC,EAAUC,KAAKC,MAAfF,MAGR,GAAIA,EAAMG,OACRJ,EAAMC,EAAMI,aACP,CACL,IAAMC,EAAUC,IAAeN,EAAMO,SAAWD,IAAeN,EAAMO,OAAOC,QAAQ,UAAW,KAE/F,IAAKH,EACH,OAAO,KAGTN,EAASN,EAAN,UAAyBY,EAAQI,SAAjC,OAGL,OACE,mBAAKC,UAAU,0BAAf,EACE,mBACEA,UAAU,WACVC,IAAKZ,EACLa,IAAKZ,EAAMO,QAAUP,EAAMa,SAG5Bb,EAAMa,U,GA9B+BC,IAAMC,iB,8PCKpD,IAAMC,EAAWC,YAAe,CAC9BC,OAAO,CAAD,uDAIFC,EADUC,a,4NAaA,WACZ,EAAKlB,MAAMmB,c,iDAGQ,SAACC,GACH,IAAbA,EAAEC,QAAkBD,EAAEE,SAAWF,EAAEG,UACrCH,EAAEI,iBACF,EAAKC,QAAQC,OAAOC,QAAQC,KAA5B,aAA8C,EAAK5B,MAAM6B,OAAOC,MAAM,CAAC,UAAW,Y,qBAItFlC,OAAA,WAAW,IAAD,EACiBG,KAAKC,MAAtB6B,EADA,EACAA,OAAQE,EADR,EACQA,KAEhB,IAAKF,EACH,OAAO,KAGT,IAAMG,EAAU,CAAEC,OAAQJ,EAAOK,IAAI,gBAC/BC,EAAU,CACdC,UAAWC,YAAMR,EAAOK,IAAI,iBAAmB,MAAQ,OAGzD,OACE,mBAAK1B,UAAU,wBAAf,EACE,mBAAKA,UAAU,gCAAf,EACE,mBAAKA,UAAU,gCAAf,EAAyC,YAAC,IAAD,CAAY8B,MAAOP,EAAKQ,cAAczB,EAASE,QAASwB,KAAK,QAAQC,QAAS1C,KAAK2C,YAAaC,UAAQ,KAEjJ,iBAAGC,KAAMf,EAAOC,MAAM,CAAC,UAAW,QAASW,QAAS1C,KAAK8C,mBAAoBrC,UAAU,sCAAvF,EACE,mBAAKA,UAAU,wCAAf,EAAiD,YAAC,IAAD,CAAQsC,QAASjB,EAAOK,IAAI,WAAYa,KAAM,MAC/F,YAAC,IAAD,CAAaD,QAASjB,EAAOK,IAAI,eAIrC,mBAAK1B,UAAU,2BAA2B2B,MAAOA,EAAOa,wBAAyBhB,IAEhFH,EAAOK,IAAI,qBAAqBa,KAAO,GACtC,YAAC,IAAD,CACEE,SAAO,EACPC,MAAOrB,EAAOK,IAAI,yB,GAnDDiB,K,6BAEL,CACpBzB,OAAQ0B,IAAUC,S,0BAGD,CACjBxB,OAAQyB,IAAmBC,IAC3BpC,SAAUiC,IAAUI,KAAKC,WACzB1B,KAAMqB,IAAUC,OAAOI,a,SCFZC,qBAlBa,WAC1B,IAAMC,EAAYC,cAMlB,OAJwB,SAAAC,GAAK,MAAK,CAChChC,OAAQ8B,EAAUE,EAAO,CAAEC,GAAID,EAAM/B,MAAM,CAAC,UAAW,uBAMhC,SAAAiC,GAAQ,MAAK,CAEtC5C,SAFsC,WAGpC4C,EAASC,mBAKEN,CAAiDzC,G,ICjB3CgD,E,4GAMnBrE,OAAA,WAAW,IACDkD,EAAY/C,KAAKC,MAAjB8C,QAER,OACE,mBAAKtC,UAAU,sBAAsB8B,MAAOQ,EAAQZ,IAAI,cAAxD,EACE,mBAAK1B,UAAU,iCAAf,EAA0C,YAAC,IAAD,CAAQsC,QAASA,EAASC,KAAM,MAC1E,YAAC,IAAD,CAAaD,QAASA,O,GAZkBK,K,YAA3Bc,E,YAEA,CACjBnB,QAASQ,IAAmBC,IAAIE,aCLpC,IAUeC,qBAVa,WAC1B,IAAMQ,EAAaC,cAMnB,OAJwB,SAACN,EAAD,OAAUC,EAAV,EAAUA,GAAV,MAAoB,CAC1ChB,QAASoB,EAAWL,EAAOC,OAMhBJ,CAA6BO,G,sBCTvBG,E,4GAUnBxE,OAAA,WAAW,IACDyE,EAAQtE,KAAKC,MAAbqE,IACFC,EAAaD,EAAI1C,SAAW4C,YAAkBF,EAAI1C,QAAQ6C,QAAO,SAACC,EAAOC,GAAR,OAAgBD,EAAoB,EAAXC,EAAIC,OAAW,IAE/G,OACE,mBAAKnE,UAAU,4BAAf,EACE,mBAAKA,UAAU,kCAAf,MAA4C,+BAAS6D,EAAIO,YACxCC,IAAhBR,EAAI1C,SAAyB,mBAAKnB,UAAU,kCAAf,EAA2C,YAAC,IAAD,CAAkBsD,GAAG,+BAA+BgB,eAAe,mBAAmBC,OAAQ,CAAEC,MAAOV,Q,GAjBxI1D,IAAMC,e,0BCMtD,IAAMoE,EAA2B,SAACC,EAAKC,GACrC,IAAIC,EAEAC,EAAQH,EAAII,MAAM,EAAGH,GAAeI,OAAO,QAC3CC,EAAQN,EAAII,MAAMH,GAAeI,OAAO,MAQ5C,QALEH,EADEI,EAAQ,EACHN,EAAII,MAAMD,GAEVH,EAAII,MAAMD,EAAMG,EAAQL,KAGpBC,EAAKK,OAAOC,OAAS,IAA2C,IAAtC,CAAC,IAAK,IAAK,KAAKC,QAAQP,EAAK,IAC3D,CAAC,KAAM,OAGhBA,EAAOA,EAAKK,OAAOG,eAEVF,OAAS,EACT,CAACL,EAAO,EAAGD,GAEX,CAAC,KAAM,OAIGS,E,iNAqBX,CACNC,mBAAmB,EACnBC,SAAS,EACTC,mBAAoB,EACpBC,UAAW,KACXC,WAAY,I,uCAGH,SAAC9E,GAAO,IAAD,EACc6D,EAAyB7D,EAAE+E,OAAOC,MAAOhF,EAAE+E,OAAOE,gBAAxEH,EADQ,KACII,EADJ,KAGF,OAAVA,GAAkB,EAAKzC,MAAMoC,YAAcK,GAC7C,EAAKC,SAAS,CAAEN,UAAWK,EAAON,mBAAoB,EAAGE,eACzD,EAAKlG,MAAMwG,4BAA4BF,IACpB,OAAVA,IACT,EAAKC,SAAS,CAAEN,UAAW,OAC3B,EAAKjG,MAAMyG,+BAGb,EAAKzG,MAAM0G,SAAStF,M,wCAGV,SAACA,GAAO,IAAD,EACiB,EAAKpB,MAA/B2G,EADS,EACTA,YAAaC,EADJ,EACIA,SADJ,EAEiC,EAAK/C,MAA/CmC,EAFS,EAETA,mBAAoBF,EAFX,EAEWA,kBAE5B,GAAIc,EACFxF,EAAEI,sBAIJ,GAAgB,MAAZJ,EAAEyF,QAAiBzF,EAAE0F,YAAzB,CAMA,OAAO1F,EAAE2F,KACT,IAAK,SACsB,IAArBJ,EAAY5D,MAAc+C,EAC5BkB,SAASC,cAAc,OAAOC,cAAcC,SAE5C/F,EAAEI,iBACF,EAAK+E,SAAS,CAAET,mBAAmB,KAGrC,MACF,IAAK,YACCa,EAAY5D,KAAO,IAAM+C,IAC3B1E,EAAEI,iBACF,EAAK+E,SAAS,CAAEP,mBAAoBoB,KAAKC,IAAIrB,EAAqB,EAAGW,EAAY5D,KAAO,MAG1F,MACF,IAAK,UACC4D,EAAY5D,KAAO,IAAM+C,IAC3B1E,EAAEI,iBACF,EAAK+E,SAAS,CAAEP,mBAAoBoB,KAAKE,IAAItB,EAAqB,EAAG,MAGvE,MACF,IAAK,QACL,IAAK,MAE0B,OAAzB,EAAKnC,MAAMoC,WAAsBU,EAAY5D,KAAO,IAAM+C,IAC5D1E,EAAEI,iBACFJ,EAAEmG,kBACF,EAAKvH,MAAMwH,qBAAqB,EAAK3D,MAAMqC,WAAY,EAAKrC,MAAMoC,UAAWU,EAAYzE,IAAI8D,MAM7F5E,EAAEqG,kBAAqB,EAAKzH,MAAM0H,WAItC,EAAK1H,MAAM0H,UAAUtG,O,qCAGd,WACP,EAAKmF,SAAS,CAAET,mBAAmB,EAAMC,SAAS,O,sCAG1C,SAAC3E,GACT,EAAKmF,SAAS,CAAER,SAAS,IACrB,EAAK/F,MAAM2H,SACb,EAAK3H,MAAM2H,QAAQvG,M,gDAIH,SAACA,GACnB,IAAMwG,EAAa,EAAK5H,MAAM2G,YAAYzE,IAAId,EAAEyG,cAAcC,aAAa,eAC3E1G,EAAEI,iBACF,EAAKxB,MAAMwH,qBAAqB,EAAK3D,MAAMqC,WAAY,EAAKrC,MAAMoC,UAAW2B,GAC7E,EAAKG,SAASZ,W,0CASF,SAACa,GACb,EAAKD,SAAWC,K,sCAGR,SAAC5G,GACLA,EAAE6G,eAAkD,IAAjC7G,EAAE6G,cAAcC,MAAMxC,SAC3C,EAAK1F,MAAMmI,QAAQ/G,EAAE6G,cAAcC,OACnC9G,EAAEI,qB,+CAIa,SAACoG,EAAYQ,GAAO,IAEjCC,EAAOtB,EADHf,EAAuB,EAAKnC,MAA5BmC,mBAcR,MAXwB,UAApB4B,EAAWU,MACbD,EAAQ,YAAC,IAAD,CAAkBvI,MAAO8H,IACjCb,EAAQa,EAAW9D,IACU,YAApB8D,EAAWU,MACpBD,EAAQ,YAAC,EAAD,CAAoBhE,IAAKuD,IACjCb,EAAQa,EAAWhD,MACU,YAApBgD,EAAWU,OACpBD,EAAQ,YAAC,EAAD,CAA6BvE,GAAI8D,EAAW9D,KACpDiD,EAAQa,EAAW9D,IAInB,mBAAKyE,KAAK,SAASC,SAAS,IAAcC,aAAYL,EAAG5H,UAAWkI,IAAW,0CAA2C,CAAEC,SAAUP,IAAMpC,IAAuB4C,YAAa,EAAKC,mBAAhJ9B,EAClCsB,M,6BAlCPS,0BAAA,SAA2BC,GACrBA,EAAUpC,cAAgB5G,KAAKC,MAAM2G,aAAeoC,EAAUpC,YAAY5D,KAAO,GAAKhD,KAAK8D,MAAMiC,mBAAqB/F,KAAK8D,MAAMkC,SACnIhG,KAAKwG,SAAS,CAAET,mBAAmB,K,EAqCvClG,OAAA,WAAW,IAAD,EAC4EG,KAAKC,MAAjFoG,EADA,EACAA,MAAOO,EADP,EACOA,YAAaC,EADpB,EACoBA,SAAUoC,EAD9B,EAC8BA,YAAaC,EAD3C,EAC2CA,QAASC,EADpD,EACoDA,UAAWC,EAD/D,EAC+DA,SAC/DrD,EAAsB/F,KAAK8D,MAA3BiC,kBACF3D,EAAQ,CAAEC,UAAW,OAM3B,OAJIC,YAAM+D,KACRjE,EAAMC,UAAY,OAGb,CACL,mBAAK5B,UAAU,qCAAwC,sBACrD,mBAAKA,UAAU,6BAAf,EACE,8BACE,oBAAM2B,MAAO,CAAEiH,QAAS,cAAxB,EAAmCJ,GAEnC,YAAC,IAAD,CACEK,SAAUtJ,KAAKuJ,YACf9I,UAAU,iCACVoG,SAAUA,EACVoC,YAAaA,EACbE,UAAWA,EACX9C,MAAOA,EACPM,SAAU3G,KAAK2G,SACfgB,UAAW3H,KAAK2H,UAChBuB,QAASA,EACTtB,QAAS5H,KAAK4H,QACd4B,OAAQxJ,KAAKwJ,OACbpB,QAASpI,KAAKoI,QACdhG,MAAOA,EACPqH,oBAAkB,WAIvBL,GAGH,mBAAK3I,UAAU,6CAAgD,sBAC7D,mBAAKA,UAAS,sCAAuCsF,GAAqBa,EAAY8C,UAAY,GAAK,oDAAvG,EACG9C,EAAYpD,IAAIxD,KAAK2J,sB,GApMiBvG,K,YAA5B0C,E,YAEA,CACjBO,MAAOhD,IAAUuG,OACjBhD,YAAarD,IAAmBsG,KAChChD,SAAUxD,IAAUyG,KACpBb,YAAa5F,IAAUuG,OACvBnC,qBAAsBpE,IAAUI,KAAKC,WACrCgD,4BAA6BrD,IAAUI,KAAKC,WAC5C+C,4BAA6BpD,IAAUI,KAAKC,WAC5CiD,SAAUtD,IAAUI,KAAKC,WACzBwF,QAAS7F,IAAUI,KACnBkE,UAAWtE,IAAUI,KACrB2E,QAAS/E,IAAUI,KAAKC,WACxByF,UAAW9F,IAAUyG,O,YAdJhE,E,eAiBG,CACpBqD,WAAW,I,WC3Cf,I,EAAMjE,EAA2B,SAACC,EAAKC,EAAe2E,GACpD,IAAI1E,EAEAC,EAAQH,EAAII,MAAM,EAAGH,GAAeI,OAAO,QAC3CC,EAAQN,EAAII,MAAMH,GAAeI,OAAO,MAQ5C,QALEH,EADEI,EAAQ,EACHN,EAAII,MAAMD,GAEVH,EAAII,MAAMD,EAAMG,EAAQL,KAGpBC,EAAKK,OAAOC,OAAS,IAAwC,IAAnCoE,EAAanE,QAAQP,EAAK,IACxD,CAAC,KAAM,OAGhBA,EAAOA,EAAKK,OAAOG,eAEVF,OAAS,EACT,CAACL,EAAO,EAAGD,GAEX,CAAC,KAAM,OAIG2E,E,iNAyBX,CACNjE,mBAAmB,EACnBC,SAAS,EACTC,mBAAoB,EACpBC,UAAW,KACXC,WAAY,I,uCAGH,SAAC9E,GAAO,IAAD,EACc6D,EAAyB7D,EAAE+E,OAAOC,MAAOhF,EAAE+E,OAAOE,eAAgB,EAAKrG,MAAM8J,cAAnG5D,EADQ,KACII,EADJ,KAGF,OAAVA,GAAkB,EAAKzC,MAAMoC,YAAcK,GAC7C,EAAKC,SAAS,CAAEN,UAAWK,EAAON,mBAAoB,EAAGE,eACzD,EAAKlG,MAAMwG,4BAA4BF,IACpB,OAAVA,IACT,EAAKC,SAAS,CAAEN,UAAW,OAC3B,EAAKjG,MAAMyG,+BAGb,EAAKzG,MAAM0G,SAAStF,M,wCAGV,SAACA,GAAO,IAAD,EACiB,EAAKpB,MAA/B2G,EADS,EACTA,YAAaC,EADJ,EACIA,SADJ,EAEiC,EAAK/C,MAA/CmC,EAFS,EAETA,mBAAoBF,EAFX,EAEWA,kBAE5B,GAAIc,EACFxF,EAAEI,sBAIJ,GAAgB,MAAZJ,EAAEyF,QAAiBzF,EAAE0F,YAAzB,CAMA,OAAO1F,EAAE2F,KACT,IAAK,SACsB,IAArBJ,EAAY5D,MAAc+C,EAC5BkB,SAASC,cAAc,OAAOC,cAAcC,SAE5C/F,EAAEI,iBACF,EAAK+E,SAAS,CAAET,mBAAmB,KAGrC,MACF,IAAK,YACCa,EAAY5D,KAAO,IAAM+C,IAC3B1E,EAAEI,iBACF,EAAK+E,SAAS,CAAEP,mBAAoBoB,KAAKC,IAAIrB,EAAqB,EAAGW,EAAY5D,KAAO,MAG1F,MACF,IAAK,UACC4D,EAAY5D,KAAO,IAAM+C,IAC3B1E,EAAEI,iBACF,EAAK+E,SAAS,CAAEP,mBAAoBoB,KAAKE,IAAItB,EAAqB,EAAG,MAGvE,MACF,IAAK,QACL,IAAK,MAE0B,OAAzB,EAAKnC,MAAMoC,WAAsBU,EAAY5D,KAAO,IAAM+C,IAC5D1E,EAAEI,iBACFJ,EAAEmG,kBACF,EAAKvH,MAAMwH,qBAAqB,EAAK3D,MAAMqC,WAAY,EAAKrC,MAAMoC,UAAWU,EAAYzE,IAAI8D,MAM7F5E,EAAEqG,kBAAqB,EAAKzH,MAAM0H,WAItC,EAAK1H,MAAM0H,UAAUtG,O,qCAGd,WACP,EAAKmF,SAAS,CAAET,mBAAmB,EAAMC,SAAS,O,sCAG1C,WACR,EAAKQ,SAAS,CAAER,SAAS,O,gDAGP,SAAC3E,GACnB,IAAMwG,EAAa,EAAK5H,MAAM2G,YAAYzE,IAAId,EAAEyG,cAAcC,aAAa,eAC3E1G,EAAEI,iBACF,EAAKxB,MAAMwH,qBAAqB,EAAK3D,MAAMqC,WAAY,EAAKrC,MAAMoC,UAAW2B,GAC7E,EAAKoC,MAAM7C,W,uCASF,SAACa,GACV,EAAKgC,MAAQhC,K,+CAGI,SAACJ,EAAYQ,GAAO,IAEjCC,EAAOtB,EADHf,EAAuB,EAAKnC,MAA5BmC,mBAcR,MAXwB,UAApB4B,EAAWU,MACbD,EAAQ,YAAC,IAAD,CAAkBvI,MAAO8H,IACjCb,EAAQa,EAAW9D,IACS,YAAnB8D,EAAWU,MACpBD,EAAQ,YAAC,EAAD,CAAoBhE,IAAKuD,IACjCb,EAAQa,EAAWhD,MACU,YAApBgD,EAAWU,OACpBD,EAAQ,YAAC,EAAD,CAA6BvE,GAAI8D,EAAW9D,KACpDiD,EAAQa,EAAW9D,IAInB,mBAAKyE,KAAK,SAASC,SAAS,IAAcC,aAAYL,EAAG5H,UAAWkI,IAAW,0CAA2C,CAAEC,SAAUP,IAAMpC,IAAuB4C,YAAa,EAAKC,mBAAhJ9B,EAClCsB,M,6BA3BPS,0BAAA,SAA2BC,GACrBA,EAAUpC,cAAgB5G,KAAKC,MAAM2G,aAAeoC,EAAUpC,YAAY5D,KAAO,GAAKhD,KAAK8D,MAAMiC,mBAAqB/F,KAAK8D,MAAMkC,SACnIhG,KAAKwG,SAAS,CAAET,mBAAmB,K,EA8BvClG,OAAA,WAAW,IAAD,EAC4FG,KAAKC,MAAjGoG,EADA,EACAA,MAAOO,EADP,EACOA,YAAaC,EADpB,EACoBA,SAAUoC,EAD9B,EAC8BA,YAAaC,EAD3C,EAC2CA,QAASC,EADpD,EACoDA,UAAW1I,EAD/D,EAC+DA,UAAWsD,EAD1E,EAC0EA,GAAImG,EAD9E,EAC8EA,UAC9EnE,EAAsB/F,KAAK8D,MAA3BiC,kBACF3D,EAAQ,CAAEC,UAAW,OAM3B,OAJIC,YAAM+D,KACRjE,EAAMC,UAAY,OAIlB,mBAAK5B,UAAU,0BAAf,EACE,8BACE,oBAAM2B,MAAO,CAAEiH,QAAS,cAAxB,EAAmCJ,GAEnC,2BACEV,KAAK,OACL4B,IAAKnK,KAAKoK,SACVvD,SAAUA,EACVoC,YAAaA,EACbE,UAAWA,EACX9C,MAAOA,EACPM,SAAU3G,KAAK2G,SACfgB,UAAW3H,KAAK2H,UAChBuB,QAASA,EACTtB,QAAS5H,KAAK4H,QACd4B,OAAQxJ,KAAKwJ,OACbpH,MAAOA,EACPqH,oBAAkB,OAClB1F,GAAIA,EACJtD,UAAWA,EACXyJ,UAAWA,KAIf,mBAAKzJ,UAAS,sCAAuCsF,GAAqBa,EAAY8C,UAAY,GAAK,oDAAvG,EACG9C,EAAYpD,IAAIxD,KAAK2J,qB,GA3LcvG,K,YAAzB4G,E,YAEA,CACjB3D,MAAOhD,IAAUuG,OACjBhD,YAAarD,IAAmBsG,KAChChD,SAAUxD,IAAUyG,KACpBb,YAAa5F,IAAUuG,OACvBnC,qBAAsBpE,IAAUI,KAAKC,WACrCgD,4BAA6BrD,IAAUI,KAAKC,WAC5C+C,4BAA6BpD,IAAUI,KAAKC,WAC5CiD,SAAUtD,IAAUI,KAAKC,WACzBwF,QAAS7F,IAAUI,KACnBkE,UAAWtE,IAAUI,KACrB0F,UAAW9F,IAAUyG,KACrBrJ,UAAW4C,IAAUuG,OACrB7F,GAAIV,IAAUuG,OACdG,aAAc1G,IAAUgH,QAAQhH,IAAUuG,QAC1CM,UAAW7G,IAAUiH,S,YAjBJN,E,eAoBG,CACpBb,WAAW,EACXY,aAAcQ,eAAc,CAAC,IAAK,IAAK,QCrD3C,I,MAAMxJ,EAAWC,YAAe,CAC9BwJ,SAAS,CAAD,uDACRC,YAAY,CAAD,6DAGPC,EAAY,CAChBC,OAAQ,KACRC,WAAY,QAKRC,EADL1J,Y,0NAWe,WACZ,EAAKlB,MAAMyC,a,qBAGb7C,OAAA,WAAW,IAAD,EACwCG,KAAKC,MAA7C+B,EADA,EACAA,KAAM8I,EADN,EACMA,OAAQC,EADd,EACcA,YAAalE,EAD3B,EAC2BA,SAEnC,OAAIkE,EACK,KAIP,mBAAKtK,UAAU,kCAAf,EACE,YAAC,IAAD,CACEgC,KAAK,QACLF,MAAOP,EAAKQ,cAAcsI,EAAS/J,EAAS0J,YAAc1J,EAASyJ,UACnE3D,SAAUA,EACVnE,QAAS1C,KAAK2C,YACdlC,UAAS,mCAAoCqK,EAAS,SAAW,IACjE9H,KAAM,GACNJ,UAAQ,EACRR,MAAOsI,M,GA/BQ7J,IAAMC,iB,ECMhB6C,qBAnBS,SAAAG,GAAK,MAAK,CAChCiH,YAAajH,EAAM/B,MAAM,CAAC,UAAW,kBAAqB+B,EAAM/B,MAAM,CAAC,UAAW,sBAAsBiB,KAAO,EAC/G8H,OAA6C,OAArChH,EAAM/B,MAAM,CAAC,UAAW,aAGP,SAAAiC,GAAQ,MAAK,CAEtCtB,QAFsC,WAGpCsB,GAAS,SAACgH,EAAGC,GACPA,IAAWlJ,MAAM,CAAC,UAAW,SAC/BiC,EAASkH,gBAETlH,EAASmH,sBAOFxH,CAA6CkH,GCf5D,IAAM9J,GAAWC,YAAe,CAC9BoK,OAAO,CAAD,mEAaFV,GAAY,CAChBC,OAAQ,KACRC,WAAY,QAKRS,GAFU1H,mBAbY,WAK1B,OAJwB,SAAAG,GAAK,MAAK,CAChCwH,mBAAoBxH,EAAM/B,MAAM,CAAC,oBAAqB,6B,GAYzDZ,a,6NAagB,SAACE,GACVA,EAAE+E,OAAO+B,MAAMxC,OAAS,GAC1B,EAAK1F,MAAMsL,aAAalK,EAAE+E,OAAO+B,U,0CAIvB,WACZ,EAAKqD,YAAYC,W,qCAGV,SAACxD,GACR,EAAKuD,YAAcvD,K,qBAGrBpI,OAAA,WAAW,IAAD,EACkEG,KAAKC,MAAvE+B,EADA,EACAA,KAAM0J,EADN,EACMA,aAAcX,EADpB,EACoBA,YAAalE,EADjC,EACiCA,SADjC,EAC2CyE,mBAEnD,OAAIP,EACK,KAIP,mBAAKtK,UAAU,oCAAf,EACE,YAAC,IAAD,CAAYgC,KAAK,YAAYF,MAAOP,EAAKQ,cAAczB,GAASqK,OAAQ,CAAEO,QApDxD,wDAoDuF9E,SAAUA,EAAUnE,QAAS1C,KAAK2C,YAAalC,UAAU,mCAAmCuC,KAAM,GAAIJ,UAAQ,EAACR,MAAOsI,KAC/N,8BACE,oBAAMtI,MAAO,CAAEiH,QAAS,cAAxB,EAAmCrH,EAAKQ,cAAczB,GAASqK,OAAQ,CAAEO,QAtDzD,yDAuDhB,2BACE3E,IAAK0E,EACLvB,IAAKnK,KAAK4L,OACVrD,KAAK,OACLsD,UAAQ,EACRlF,SAAU3G,KAAK8L,aACfjF,SAAUA,EACVzE,MAAO,CAAEiH,QAAS,a,GA7CHjG,K,0BAEN,CACjByD,SAAUxD,IAAUyG,KACpBiB,YAAa1H,IAAUyG,KACvByB,aAAclI,IAAUI,KAAKC,WAC7BtB,MAAOiB,IAAUC,OACjBoI,aAAcrI,IAAUiH,OACxBgB,mBAAoB/H,IAAmBwI,OAAO1I,IAAUuG,QAAQlG,WAChE1B,KAAMqB,IAAUC,OAAOI,a,aCpBZC,sBAdS,SAAAG,GAAK,MAAK,CAChC+C,SAAU/C,EAAM/B,MAAM,CAAC,UAAW,kBAAqB+B,EAAM/B,MAAM,CAAC,UAAW,sBAAsBiB,KAAOc,EAAM/B,MAAM,CAAC,UAAW,8BAAgC,GAAK+B,EAAM/B,MAAM,CAAC,UAAW,sBAAsBiK,MAAK,SAAAC,GAAC,MAAI,CAAC,QAAS,SAASC,SAASD,EAAE9J,IAAI,YACnQ4I,YAAkD,OAArCjH,EAAM/B,MAAM,CAAC,UAAW,SACrC2J,aAAc5H,EAAM/B,MAAM,CAAC,UAAW,qBAGb,SAAAiC,GAAQ,MAAK,CAEtCuH,aAFsC,SAExBpD,GACZnE,EAASmI,aAAchE,QAKZxE,CAA6C0H,ICf5D,I,GAAMX,GAAY,CAChBC,OAAQ,KACRC,WAAY,OACZwB,MAAU,iBAGSC,G,wNAUL,SAAChL,GACbA,EAAEI,iBACF,EAAKxB,MAAMyC,a,qBAGb7C,OAAA,WAAW,IAAD,EACuCG,KAAKC,MAA5CqM,EADA,EACAA,MAAO/J,EADP,EACOA,MAAOuI,EADd,EACcA,OAAQyB,EADtB,EACsBA,aAE9B,OACE,sBACEhK,MAAOA,EACPiK,aAAYjK,EACZ9B,UAAS,qBAAsBqK,EAAS,SAAW,IACnD2B,gBAAe3B,EACfpI,QAAS1C,KAAK2C,YACd+J,gBAAeH,EAAcnK,MAAOsI,SANtC,EAQG4B,K,GA3BmCzL,IAAMC,eCJ5CC,GAAWC,YAAe,CAC9B2L,OAAO,CAAD,iFACNC,SAAS,CAAD,0EAkBKzL,eAAWwC,mBAfF,SAACG,EAAD,SAAsB,CAC5CwI,MAAO,KACP/J,MAFsB,EAAUP,KAEpBQ,cAAcsB,EAAM/B,MAAM,CAAC,UAAW,YAAchB,GAAS4L,OAAS5L,GAAS6L,UAC3F9B,OAAQhH,EAAM/B,MAAM,CAAC,UAAW,YAChCwK,aAAc,uBAGW,SAAAvI,GAAQ,MAAK,CAEtCtB,QAFsC,WAGpCsB,EAAS6I,mBAKalJ,CAA6C0I,K,uhBCdvE,I,YAAMtL,GAAWC,YAAe,CAC9B8L,aAAa,CAAD,mDACZC,YAAY,CAAD,sFACXC,eAAe,CAAD,uDACdC,cAAc,CAAD,0FACbC,cAAc,CAAD,4DACbC,aAAa,CAAD,uEACZC,aAAa,CAAD,mDACZC,YAAY,CAAD,4EACXC,eAAe,CAAD,8DAGVC,KAAkBC,KAAoBC,YAAa,CAAEC,SAAS,GAE9DC,G,6MAWI,CACNC,SAAS,I,kDAGW,SAAAvM,GAChB,EAAKwM,OAAS,EAAKA,KAAKC,SAASzM,EAAE+E,SACrC,EAAKnG,MAAM8N,a,4CAIC,SAAA1M,GAAM,IAMhB2M,EALIC,EAAU,EAAKhO,MAAfgO,MACF5H,EAAQhF,EAAEyG,cAAcC,aAAa,cACrCmG,EAAQD,EAAME,WAAU,SAAAC,GAC5B,OAAQA,EAAK/H,QAAUA,KAIzB,OAAOhF,EAAE2F,KACT,IAAK,SACH,EAAK/G,MAAM8N,UACX,MACF,IAAK,QACH,EAAKpL,YAAYtB,GACjB,MACF,IAAK,aACH2M,EAAU,EAAKH,KAAKQ,WAAWH,EAAQ,MAErCF,EAAQ5G,QACR,EAAKnH,MAAM0G,SAASqH,EAAQjG,aAAa,gBAE3C,MACF,IAAK,WACHiG,EAAU,EAAKH,KAAKQ,WAAWH,EAAQ,MAErCF,EAAQ5G,QACR,EAAKnH,MAAM0G,SAASqH,EAAQjG,aAAa,gBAE3C,MACF,IAAK,OAEDiG,EADE3M,EAAEiN,SACM,EAAKT,KAAKQ,WAAWH,EAAQ,IAAM,EAAKL,KAAKU,UAE7C,EAAKV,KAAKQ,WAAWH,EAAQ,IAAM,EAAKL,KAAKW,cAGvDR,EAAQ5G,QACR,EAAKnH,MAAM0G,SAASqH,EAAQjG,aAAa,eACzC1G,EAAEI,iBACFJ,EAAEmG,mBAEJ,MACF,IAAK,QACHwG,EAAU,EAAKH,KAAKW,cAElBR,EAAQ5G,QACR,EAAKnH,MAAM0G,SAASqH,EAAQjG,aAAa,gBAE3C,MACF,IAAK,OACHiG,EAAU,EAAKH,KAAKU,aAElBP,EAAQ5G,QACR,EAAKnH,MAAM0G,SAASqH,EAAQjG,aAAa,oB,0CAMjC,SAAA1G,GACZ,IAAMgF,EAAQhF,EAAEyG,cAAcC,aAAa,cAE3C1G,EAAEI,iBAEF,EAAKxB,MAAM8N,UACX,EAAK9N,MAAM0G,SAASN,M,qCAeb,SAAA4B,GACP,EAAK4F,KAAO5F,K,0CAGA,SAAAA,GACZ,EAAKwG,YAAcxG,K,6BAjBrByG,kBAAA,WACEzH,SAAS0H,iBAAiB,QAAS3O,KAAK4O,qBAAqB,GAC7D3H,SAAS0H,iBAAiB,WAAY3O,KAAK4O,oBAAqBrB,IAC5DvN,KAAKyO,aAAazO,KAAKyO,YAAYrH,QACvCpH,KAAKwG,SAAS,CAAEoH,SAAS,K,EAG3BiB,qBAAA,WACE5H,SAAS6H,oBAAoB,QAAS9O,KAAK4O,qBAAqB,GAChE3H,SAAS6H,oBAAoB,WAAY9O,KAAK4O,oBAAqBrB,K,EAWrE1N,OAAA,WAAW,IAAD,OACA+N,EAAY5N,KAAK8D,MAAjB8J,QADA,EAEmC5N,KAAKC,MAAxCmC,EAFA,EAEAA,MAAO6L,EAFP,EAEOA,MAAOc,EAFd,EAEcA,UAAW1I,EAFzB,EAEyBA,MAEjC,OACE,YAAC,KAAD,CAAQ2I,aAAc,CAAEC,QAAS,EAAGC,OAAQ,IAAMC,OAAQ,KAAQ/M,MAAO,CAAE6M,QAASG,KAAO,EAAG,CAAEC,QAAS,GAAIC,UAAW,MAAQJ,OAAQE,KAAO,EAAG,CAAEC,QAAS,GAAIC,UAAW,MAAQH,OAAQC,KAAO,EAAG,CAAEC,QAAS,GAAIC,UAAW,aAAhO,GACG,gBAAGL,EAAH,EAAGA,QAASC,EAAZ,EAAYA,OAAQC,EAApB,EAAoBA,OAApB,OAIC,yBAAK1O,UAAS,8BAAgCsO,EAAa3M,MAAK,sBAAOA,EAAP,CAAc6M,QAASA,EAASM,UAAW3B,EAAO,SAAYsB,EAAZ,KAAuBC,EAAvB,IAAmC,KAAMK,OAAQ,IAAKhH,KAAK,UAAU2B,IAAK,EAAKyB,QAC9LqC,EAAMzK,KAAI,SAAA4K,GAAI,OACb,yBAAK5F,KAAK,SAASC,SAAS,IAAIzB,IAAKoH,EAAK/H,MAAOqC,aAAY0F,EAAK/H,MAAOsB,UAAW,EAAK8H,cAAe/M,QAAS,EAAKC,YAAalC,UAAWkI,IAAW,2BAA4B,CAAEmC,OAAQsD,EAAK/H,QAAUA,IAAUqJ,gBAAetB,EAAK/H,QAAUA,EAAO8D,IAAKiE,EAAK/H,QAAUA,EAAQ,EAAKsJ,YAAc,MAC1S,mBAAKlP,UAAU,uCAAf,EACE,YAAC,KAAD,CAAMsD,GAAIqK,EAAK3L,KAAMmN,YAAU,KAGjC,mBAAKnP,UAAU,0CAAf,EACE,+BAAS2N,EAAKyB,MACbzB,EAAK0B,gB,GAhIUjP,IAAMC,eA6IlCiP,GADU5O,Y,gNAaN,CACN6O,MAAM,EACNjB,UAAW,W,2CAGE,YAAiB,IAAd3I,EAAa,EAAbA,OAChB,GAAI,EAAKnG,MAAMgQ,iBACT,EAAKnM,MAAMkM,KACb,EAAK/P,MAAMiQ,eAEX,EAAKjQ,MAAMkQ,YAAY,CACrBC,QAAS,EAAKC,QAAQ7M,KAAI,SAAA8M,GAAM,6BAAUA,EAAV,CAAkBxF,OAAQwF,EAAOjK,QAAU,EAAKpG,MAAMoG,WACtF3D,QAAS,EAAK6N,6BAGb,CAAC,IACEC,EAAQpK,EAAOqK,wBAAfD,IACJ,EAAK1M,MAAMkM,MAAQ,EAAKU,eAC1B,EAAKA,cAActJ,QAErB,EAAKZ,SAAS,CAAEuI,UAAiB,EAANyB,EAAUG,YAAc,SAAW,QAC9D,EAAKnK,SAAS,CAAEwJ,MAAO,EAAKlM,MAAMkM,W,qDAIb,SAAC3O,GACxBA,EAAEI,iBAD4B,IAGtB4E,EAAU,EAAKgK,QAAQhP,EAAEyG,cAAcC,aAAa,eAApD1B,MAER,EAAKpG,MAAMiQ,eACX,EAAKjQ,MAAM0G,SAASN,M,4CAGN,SAAAhF,GACd,OAAOA,EAAE2F,KACT,IAAK,SACH,EAAK4J,kB,8CAKS,WACX,EAAK9M,MAAMkM,OACd,EAAKU,cAAgBzJ,SAASyJ,kB,kDAIZ,SAACrP,GACrB,OAAOA,EAAE2F,KACT,IAAK,IACL,IAAK,QACH,EAAK6J,sB,0CAKK,WACR,EAAK/M,MAAMkM,MAAQ,EAAKU,eAC1B,EAAKA,cAActJ,QAErB,EAAKZ,SAAS,CAAEwJ,MAAM,O,2CAGT,SAAA3J,GACb,EAAKpG,MAAM0G,SAASN,M,6BAGtByK,mBAAA,WAAuB,IACLtO,EAAoBxC,KAAKC,MAAjC+B,KAAQQ,cAEhBxC,KAAKqQ,QAAU,CACb,CAAE5N,KAAM,QAAS4D,MAAO,SAAUwJ,KAAMrN,EAAczB,GAAS+L,cAAegD,KAAMtN,EAAczB,GAASgM,cAC3G,CAAEtK,KAAM,SAAU4D,MAAO,WAAYwJ,KAAMrN,EAAczB,GAASiM,gBAAiB8C,KAAMtN,EAAczB,GAASkM,gBAChH,CAAExK,KAAM,OAAQ4D,MAAO,UAAWwJ,KAAMrN,EAAczB,GAASmM,eAAgB4C,KAAMtN,EAAczB,GAASoM,eAC5G,CAAE1K,KAAM,WAAY4D,MAAO,SAAUwJ,KAAMrN,EAAczB,GAASqM,cAAe0C,KAAMtN,EAAczB,GAASsM,gB,EAIlHxN,OAAA,WAAW,IAAD,EACgBG,KAAKC,MAArBoG,EADA,EACAA,MAAOrE,EADP,EACOA,KADP,EAEoBhC,KAAK8D,MAAzBkM,EAFA,EAEAA,KAAMjB,EAFN,EAEMA,UAERgC,EAAc/Q,KAAKqQ,QAAQW,MAAK,SAAA5C,GAAI,OAAIA,EAAK/H,QAAUA,KAE7D,OACE,mBAAK5F,UAAWkI,IAAW,mBAAoBoG,EAAW,CAAEjE,OAAQkF,IAASrI,UAAW3H,KAAKyP,oBAA7F,EACE,mBAAKhP,UAAWkI,IAAW,0BAA2B,CAAEmC,OAAQ9K,KAAKqQ,QAAQzK,QAAQmL,MAAgC,WAAdhC,EAAyB,EAAK/O,KAAKqQ,QAAQ1K,OAAS,WAA3J,EACE,YAAC,IAAD,CACElF,UAAU,+BACVgC,KAAMsO,EAAYtO,KAClBF,MAAOP,EAAKQ,cAAczB,GAASuM,gBACnCtK,KAAM,GACNiO,SAAUjB,EACVlF,OAAQkF,EACRpN,UAAQ,EACRF,QAAS1C,KAAKkR,aACdrI,YAAa7I,KAAK6Q,gBAClBlJ,UAAW3H,KAAKmR,oBAChB/O,MAAO,CAAEuI,OAAQ,KAAMC,WAAY,WAIvC,YAAC,KAAD,CAASwG,KAAMpB,EAAMjB,UAAWA,EAAW3I,OAAQpG,WAAnD,EACE,YAAC,GAAD,CACEiO,MAAOjO,KAAKqQ,QACZhK,MAAOA,EACP0H,QAAS/N,KAAK4Q,YACdjK,SAAU3G,KAAK8L,aACfiD,UAAWA,O,GAzHOlO,IAAMC,iB,sBC/IrB6C,sBAjBS,SAAAG,GAAK,MAAK,CAChCuN,YAA8C,YAAjCvN,EAAM3B,IAAI,SAASmP,UAChCjL,MAAOvC,EAAM/B,MAAM,CAAC,UAAW,gBAGN,SAAAiC,GAAQ,MAAK,CAEtC2C,SAFsC,SAE5BN,GACRrC,EAASuN,YAAwBlL,KAGnC4J,oBACAE,YAAa,SAAAlQ,GAAK,OAAI+D,EAASwN,aAAU,UAAWvR,KACpDiQ,aAAc,kBAAMlM,EAASyN,oBAIhB9N,CAA6CoM,I,idCb5D,IAAMhP,GAAWC,YAAe,CAC9B0Q,mBAAmB,CAAD,4EAClBC,WAAW,CAAD,iEACVC,cAAc,CAAD,0EACbC,cAAc,CAAD,gEACbC,iBAAiB,CAAD,kGAChBC,eAAe,CAAD,mGACdC,QAAQ,CAAD,iGACPC,MAAM,CAAD,2FACLC,KAAK,CAAD,0FAIAC,GADLhR,Y,mOAiB2B,SAAAE,GACxB,EAAKpB,MAAM0G,SAAS,EAAK1G,MAAMiO,MAAO7M,EAAE+E,OAAOC,U,iDAG5B,WACnB,EAAKpG,MAAMmS,SAAS,EAAKnS,MAAMiO,U,mDAIV,SAAA7M,GACrB,EAAKpB,MAAMoS,mBACXhR,EAAEI,iBACFJ,EAAEmG,qB,qDAGqB,SAAAnG,GACT,UAAVA,EAAE2F,KAA6B,MAAV3F,EAAE2F,KACzB,EAAKsL,qBAAqBjR,M,0DAIA,WAC5B,EAAKpB,MAAMsS,wB,0DAGiB,SAAChM,GAC7B,EAAKtG,MAAMuS,mBAAmBjM,M,mDAGT,SAACJ,EAAYI,EAAOF,GACzC,EAAKpG,MAAMwH,qBAAqBtB,EAAYI,EAAOF,EAAO,CAAC,OAAQ,UAAW,EAAKpG,MAAMiO,W,qBAG3FrO,OAAA,WAAW,IAAD,EACuCG,KAAKC,MAA5CwS,EADA,EACAA,eAAgBlQ,EADhB,EACgBA,MAAO2L,EADvB,EACuBA,MAAOlM,EAD9B,EAC8BA,KAEtC,OACE,2BACE,qBAAOvB,UAAU,8BAAjB,EACE,oBACEA,UAAWkI,IAAW,cAAe,CAAE+J,SAAUD,IACjD/P,QAAS1C,KAAKsS,qBACdK,WAAY3S,KAAK4S,uBACjBpK,KAAK,SACLC,SAAS,IACTlG,MAAOP,EAAKQ,cAAciQ,EAAiB1R,GAASgR,eAAiBhR,GAAS+Q,kBAC9EtF,aAAYxK,EAAKQ,cAAciQ,EAAiB1R,GAASgR,eAAiBhR,GAAS+Q,oBAGrF,YAAC,EAAD,CACE7I,YAAajH,EAAKQ,cAAczB,GAAS2Q,mBAAoB,CAAEpH,OAAQ4D,EAAQ,IAC/EhE,UAAW,IACX7D,MAAO9D,EACPoE,SAAU3G,KAAK6S,wBACfjM,YAAa5G,KAAKC,MAAM2G,YACxBH,4BAA6BzG,KAAKyG,4BAClCC,4BAA6B1G,KAAK0G,4BAClCe,qBAAsBzH,KAAKyH,qBAC3BsC,aAAc,CAAC,QAInB,mBAAKtJ,UAAU,qBAAf,EACE,YAAC,IAAD,CAAYoG,SAAUqH,GAAS,EAAG3L,MAAOP,EAAKQ,cAAczB,GAAS6Q,eAAgBnP,KAAK,QAAQC,QAAS1C,KAAK8S,yB,GA/ErGjS,IAAMC,iB,GAyFrBiS,GADL5R,a,8NAkBmB,WAChB,EAAKlB,MAAM+S,YAAY,O,mDAGF,SAAA3R,GACrB,EAAKpB,MAAMgT,iBAAiB5R,EAAE+E,OAAOC,MAAO,EAAKpG,MAAMiT,e,mDAGlC,WACrB,EAAKjT,MAAMgT,iBAAiB,EAAKhT,MAAMkT,WAAY,EAAKlT,MAAMiT,e,qBAGhErT,OAAA,WAAW,IAAD,SACmFG,KAAKC,MAAxFoQ,EADA,EACAA,QAAS8C,EADT,EACSA,UAAWD,EADpB,EACoBA,WAAYE,EADhC,EACgCA,eAAgBC,EADhD,EACgDA,eAAgBrR,EADhE,EACgEA,KAASsR,EADzE,oGAGR,OAAKjD,EAKH,mBAAK5P,UAAU,mCAAf,EACE,2BACG4P,EAAQ7M,KAAI,SAACjB,EAAO8F,GAAR,OAAc,kBAAC,GAAD,oBAAQ9F,MAAOA,EAAOyE,IAAKqB,EAAG6F,MAAO7F,EAAG1B,SAAUyM,EAAgBhB,SAAUiB,EAAgBZ,eAAgBS,EAAYb,iBAAkB,EAAKC,sBAA0BgB,QAGtM,mBAAK7S,UAAU,qBAAf,EACE,sBAAQoG,SAAUwJ,EAAQrN,MAAQ,EAAGvC,UAAU,0BAA0BiC,QAAS1C,KAAKuT,sBAAvF,EAAwG,YAAC,KAAD,CAAMxP,GAAG,SAAjH,IAA2H,kBAAC,IAAqBhD,GAAS4Q,aAG1J,sBAAQtL,MAAO8M,EAAWxM,SAAU3G,KAAKwT,2BAAzC,EACE,sBAAQnN,MAAO,UAAf,EAAqBrE,EAAKQ,cAAczB,GAASiR,QAAS,CAAE1H,OAAQ,KACpE,sBAAQjE,MAAO,WAAf,EAAsBrE,EAAKQ,cAAczB,GAASiR,QAAS,CAAE1H,OAAQ,MACrE,sBAAQjE,MAAO,WAAf,EAAsBrE,EAAKQ,cAAczB,GAASkR,MAAO,CAAE3H,OAAQ,KACnE,sBAAQjE,MAAO,YAAf,EAAuBrE,EAAKQ,cAAczB,GAASkR,MAAO,CAAE3H,OAAQ,KACpE,sBAAQjE,MAAO,YAAf,EAAuBrE,EAAKQ,cAAczB,GAASmR,KAAM,CAAE5H,OAAQ,KACnE,sBAAQjE,MAAO,aAAf,EAAwBrE,EAAKQ,cAAczB,GAASmR,KAAM,CAAE5H,OAAQ,KACpE,sBAAQjE,MAAO,aAAf,EAAwBrE,EAAKQ,cAAczB,GAASmR,KAAM,CAAE5H,OAAQ,QApBnE,M,GAjCUlH,K,2BAEF,CACjBiN,QAAS9M,IAAmBsG,KAC5BsJ,UAAW9P,IAAUiH,OACrB4I,WAAY7P,IAAUyG,KACtBsJ,eAAgB/P,IAAUI,KAAKC,WAC/BsP,YAAa3P,IAAUI,KAAKC,WAC5B2P,eAAgBhQ,IAAUI,KAAKC,WAC/BuP,iBAAkB5P,IAAUI,KAAKC,WACjCkD,YAAarD,IAAmBsG,KAChC0I,mBAAoBlP,IAAUI,KAAKC,WACnC8O,mBAAoBnP,IAAUI,KAAKC,WACnC+D,qBAAsBpE,IAAUI,KAAKC,WACrC1B,KAAMqB,IAAUC,OAAOI,a,YC/EZC,sBAtCS,SAAAG,GAAK,MAAK,CAChC8C,YAAa9C,EAAM/B,MAAM,CAAC,UAAW,gBACrCsO,QAASvM,EAAM/B,MAAM,CAAC,UAAW,OAAQ,YACzCoR,UAAWrP,EAAM/B,MAAM,CAAC,UAAW,OAAQ,eAC3CmR,WAAYpP,EAAM/B,MAAM,CAAC,UAAW,OAAQ,iBAGnB,SAAAiC,GAAQ,MAAK,CACtCgP,YADsC,SAC1BzQ,GACVyB,EAASyP,YAAclR,KAGzB8Q,eALsC,SAKvBnF,GACblK,EAAS0P,aAAiBxF,KAG5BkF,eATsC,SASvBlF,EAAO3L,GACpByB,EAAS2P,YAAiBzF,EAAO3L,KAGnC0Q,iBAbsC,SAarBE,EAAWD,GAC1BlP,EAAS4P,YAAmBT,EAAWD,KAGzCX,mBAjBsC,WAkBpCvO,EAAS6P,gBAGXrB,mBArBsC,SAqBlBjM,GAClBvC,EAAS8P,YAAwBvN,KAGnCkB,qBAzBsC,SAyBhBsM,EAAUxN,EAAOyN,EAAWC,GAChDjQ,EAASkQ,aAAwBH,EAAUxN,EAAOyN,EAAWC,QAKlDtQ,CAA6CoP,I,UCvC7CpP,sBALS,SAAAG,GAAK,MAAK,CAChCgH,OAAQhH,EAAM/B,MAAM,CAAC,UAAW,iBAChCoS,SAAUrQ,EAAM/B,MAAM,CAAC,UAAW,gBAGrB4B,CAAyByQ,M,ICEnBC,G,4NAYD,SAAAhT,GAChBA,EAAEmG,kBACF,EAAKvH,MAAMqU,OAAO,EAAKrU,MAAMkD,MAAMhB,IAAI,U,oDAGjB,SAAAd,GACtBA,EAAEmG,kBACF,EAAKvH,MAAMsU,iBAAiB,EAAKtU,MAAMkD,MAAMhB,IAAI,U,qBAGnDtC,OAAA,WAAW,IAAD,OACAsD,EAAUnD,KAAKC,MAAfkD,MACFqR,EAASrR,EAAMpB,MAAM,CAAC,OAAQ,QAAS,MACvC0S,EAAStR,EAAMpB,MAAM,CAAC,OAAQ,QAAS,MACvC2S,EAA2B,KAArBF,EAAU,EAAK,IACrBG,EAA2B,KAArBF,GAAU,EAAK,IAE3B,OACE,mBAAKhU,UAAU,uBAAuBgI,SAAS,IAAID,KAAK,eAAxD,EACE,YAAC,KAAD,CAAQwG,aAAc,CAAE4F,MAAO,IAAOxS,MAAO,CAAEwS,MAAOxF,KAAO,EAAG,CAAEE,UAAW,IAAKD,QAAS,YAA3F,GACG,gBAAGuF,EAAH,EAAGA,MAAH,OACC,mBAAKnU,UAAU,iCAAiC2B,MAAO,CAAEmN,UAAU,SAAUqF,EAAX,IAAqBC,gBAAgB,OAAQ1R,EAAMhB,IAAI,eAAnB,IAAsC2S,mBAAuBJ,EAAL,KAAWC,EAAX,WAA9J,EACE,mBAAKlU,UAAWkI,IAAW,gCAAiC,CAAEmC,QAAQ,UAAtE,EACE,sBAAQrK,UAAU,cAAciC,QAAS,EAAKqS,sBAA9C,EAA+D,YAAC,KAAD,CAAMhR,GAAG,UAAxE,IAAmF,YAAC,IAAD,CAAkBA,GAAG,mBAAmBgB,eAAe,YAC1I,sBAAQtE,UAAU,cAAciC,QAAS,EAAKsS,4BAA9C,EAAqE,YAAC,KAAD,CAAMjR,GAAG,WAA9E,IAA0F,YAAC,IAAD,CAAkBA,GAAG,mBAAmBgB,eAAe,kB,GApC7H3B,K,YAAfiR,G,eAEG,CACpB1S,OAAQ0B,IAAUC,S,YAHD+Q,G,YAMA,CACjBlR,MAAOI,IAAmBC,IAAIE,WAC9B4Q,OAAQjR,IAAUI,KAAKC,WACvB6Q,iBAAkBlR,IAAUI,KAAKC,aCbrC,IAoBeC,sBApBS,SAACG,EAAD,OAAUC,EAAV,EAAUA,GAAV,MAAoB,CAC1CZ,MAAOW,EAAM/B,MAAM,CAAC,UAAW,sBAAsBiP,MAAK,SAAA5C,GAAI,OAAIA,EAAKjM,IAAI,QAAU4B,SAG5D,SAAAC,GAAQ,MAAK,CAEtCsQ,OAAQ,SAAAvQ,GACNC,EAASiR,aAAkBlR,KAG7BwQ,iBAAkB,SAAAxQ,GAChBC,EAASwN,aAAU,cAAe,CAAEzN,SAGtCmR,SAVsC,SAU5BvT,GACRqC,EAASmR,aAAcxT,QAKZgC,CAA6C0Q,ICnB5D,IAAMtT,GAAWC,YAAe,CAC9B2L,OAAO,CAAD,kFACNC,SAAS,CAAD,0FAgBJwI,G,4GASJvV,OAAA,WAAW,IAAD,EACoCG,KAAKC,MAAzC6K,EADA,EACAA,OAAQjE,EADR,EACQA,SAAUnE,EADlB,EACkBA,QAASV,EAD3B,EAC2BA,KAEnC,OACE,mBAAKvB,UAAU,uCAAf,EACE,qBAAOA,UAAWkI,IAAW,cAAe,CAAEmC,WAAWvI,MAAOP,EAAKQ,cAAcsI,EAAS/J,GAAS4L,OAAS5L,GAAS6L,gBAAvH,EACE,qBACE/H,KAAK,iBACL0D,KAAK,WACL8M,QAASvK,EACTnE,SAAUjE,EACVmE,SAAUA,IAGZ,oBAAMpG,UAAWkI,IAAW,WAAY,CAAEmC,aAE1C,YAAC,IAAD,CAAkB/G,GAAG,8BAA8BgB,eAAe,gC,GAzB9ClE,IAAMC,eAiCrB6C,sBA9CS,SAAAG,GAAK,MAAK,CAChCgH,OAAQhH,EAAM/B,MAAM,CAAC,UAAW,cAChC8E,SAAU/C,EAAM/B,MAAM,CAAC,UAAW,gBAGT,SAAAiC,GAAQ,MAAK,CAEtCtB,QAFsC,WAGpCsB,EAASsR,mBAsCE3R,CAA6CxC,YAAWiU,K,IClDlDG,G,4GAMnB1V,OAAA,WAAW,IACD2V,EAAaxV,KAAKC,MAAlBuV,SAER,OACE,mBAAK/U,UAAU,qCAAf,EACE,YAAC,GAAD,CAAyBgC,KAAK,SAASgT,QAAS,YAAC,IAAD,CAAkB1R,GAAG,wBAAwBgB,eAAe,iBAE5G,mBAAKtE,UAAU,sCAAf,EACG+U,EAAShS,KAAI,SAAAO,GAAE,OACd,YAAC,GAAD,CAAiBA,GAAIA,GAASA,QAIhCyR,EAAS9L,WAAa,YAAC,GAAD,O,GAnBQtG,K,YAAnBmS,G,YAEA,CACjBC,SAAUjS,IAAmBsG,KAAKnG,aCRtC,IAIeC,sBAJS,SAAAG,GAAK,MAAK,CAChC0R,SAAU1R,EAAM/B,MAAM,CAAC,UAAW,sBAAsByB,KAAI,SAAA4K,GAAI,OAAIA,EAAKjM,IAAI,YAGhEwB,CAAyB4R,I,aCFnBG,G,4GAMnB7V,OAAA,WAAW,IACD4V,EAAYzV,KAAKC,MAAjBwV,QAER,OACE,YAAC,KAAD,CAAQzG,aAAc,CAAEC,QAAS,EAAGC,OAAQ,IAAMC,OAAQ,KAAQ/M,MAAO,CAAE6M,QAASG,KAAO,EAAG,CAAEC,QAAS,GAAIC,UAAW,MAAQJ,OAAQE,KAAO,EAAG,CAAEC,QAAS,GAAIC,UAAW,MAAQH,OAAQC,KAAO,EAAG,CAAEC,QAAS,GAAIC,UAAW,aAAhO,GACG,gBAAGL,EAAH,EAAGA,QAASC,EAAZ,EAAYA,OAAQC,EAApB,EAAoBA,OAApB,OACC,mBAAK1O,UAAU,wBAAwB2B,MAAO,CAAE6M,QAASA,EAASM,UAAU,SAAUL,EAAX,KAAsBC,EAAtB,WAA3E,EACGsG,S,GAbwB5U,IAAMC,e,SCErC6U,GAAoB,qCAoCXhS,sBAlCS,SAAAG,GAAK,MAAK,CAChC8R,iBAA0D,YAAxC9R,EAAM/B,MAAM,CAAC,UAAW,cAA8B+B,EAAM/B,MAAM,CAAC,WAAY8T,KAAI,WACrGC,eAAwD,WAAxChS,EAAM/B,MAAM,CAAC,UAAW,aAA4B4T,GAAkBI,KAAKjS,EAAM/B,MAAM,CAAC,UAAW,UACnHiU,qBAA8D,WAAxClS,EAAM/B,MAAM,CAAC,UAAW,eA+BjC4B,EA5BQ,SAAC,GAAgE,IAA9DiS,EAA6D,EAA7DA,iBAAkBE,EAA2C,EAA3CA,eAAgBE,EAA2B,EAA3BA,qBAC1D,GAAIJ,EACF,OAAO,YAAC,GAAD,CAASH,QAAS,YAAC,IAAD,CAAkB1R,GAAG,+BAA+BgB,eAAe,wFAAwFC,OAAQ,CAAEiR,OAAQ,iBAAGpT,KAAK,uBAAR,EAAyB,YAAC,IAAD,CAAkBkB,GAAG,oCAAoCgB,eAAe,iBAGzS,GAAI+Q,EACF,OAAO,YAAC,GAAD,CAASL,QAAS,YAAC,IAAD,CAAkB1R,GAAG,+BAA+BgB,eAAe,mHAG9F,GAAIiR,EAAsB,CACxB,IAAMP,EACJ,6BACE,YAAC,IAAD,CAAkB1R,GAAG,sCAAsCgB,eAAe,4DAD5E,IACyI,iBAAGlC,KAAK,SAASuD,OAAO,eAAxB,EAAiC,YAAC,IAAD,CAAkBrC,GAAG,iDAAiDgB,eAAe,iBAIjQ,OAAO,YAAC,GAAD,CAAS0Q,QAASA,KAG3B,OAAO,Q,SCXT,IAAMS,GAAyB,6CAEzBnV,GAAWC,YAAe,CAC9BiI,YAAY,CAAD,sEACXkN,oBAAoB,CAAD,gFACnBC,QAAQ,CAAD,iDACPC,YAAY,CAAD,8DAIPC,GADUnV,a,+NAqCC,SAACE,GACd,EAAKpB,MAAM0G,SAAStF,EAAE+E,OAAOC,U,4CAGf,SAAChF,GACG,KAAdA,EAAEkV,UAAmBlV,EAAEE,SAAWF,EAAEG,UACtC,EAAKgV,kB,2CAIM,WACT,EAAKvW,MAAM4P,OAAS,EAAK4G,oBAAoBzO,SAAS3B,OAGxD,EAAKpG,MAAM0G,SAAS,EAAK8P,oBAAoBzO,SAAS3B,OAJrC,MAQ+C,EAAKpG,MAA/DyW,EARW,EAQXA,aAAcC,EARH,EAQGA,iBAAkBC,EARrB,EAQqBA,YAAaC,EARlC,EAQkCA,SAC/CC,EAAW,CAAC,EAAK7W,MAAM8W,YAAa,EAAK9W,MAAM4P,MAAMmH,KAAK,IAE5DN,GAAgBE,GAAeD,GAAoBhR,kBAAOmR,GAAYG,MAAiC,IAApBH,EAASnR,QAA2C,IAA3BmR,EAASpR,OAAOC,SAAiBkR,GAIjJ,EAAK5W,MAAMiV,SAAS,EAAKxT,QAAQC,OAAS,EAAKD,QAAQC,OAAOC,QAAU,S,0DAG5C,WAC5B,EAAK3B,MAAMsS,wB,0DAGiB,SAAChM,GAC7B,EAAKtG,MAAMuS,mBAAmBjM,M,mDAGT,SAACJ,EAAYI,EAAOF,GACzC,EAAKpG,MAAMwH,qBAAqBtB,EAAYI,EAAOF,EAAO,CAAC,Y,0DAG/B,SAACF,EAAYI,EAAOF,GAChD,EAAKpG,MAAMwH,qBAAqBtB,EAAYI,EAAOF,EAAO,CAAC,oB,sDAGnC,SAAChF,GACzB,EAAKpB,MAAMiX,oBAAoB7V,EAAE+E,OAAOC,U,0CAG5B,WACZ,GAAI,EAAK8Q,cAAgB,EAAKlX,MAAMmX,aAAc,CAAC,IAAD,EACxB,EAAKD,YAAY1G,wBAAjCnL,EADwC,EACxCA,KAAMG,EADkC,EAClCA,OACVH,EAAO,GAAKG,GAAS4R,OAAOC,YAAcrQ,SAASsQ,gBAAgBC,eACrE,EAAKL,YAAYM,qB,qDAsCE,SAACxP,GACxB,EAAKwO,oBAAsBxO,K,6CAGZ,SAACA,GAChB,EAAK8O,YAAc9O,K,qCAGZ,SAAAA,GACP,EAAKkP,YAAclP,K,8CAGH,SAACyP,GAAU,IACnB7H,EAAa,EAAK5P,MAAlB4P,KACFkE,EAAe,EAAK0C,oBAAoBzO,SAAS1B,eACjDqR,EAAeD,EAAKxX,QAAU6T,EAAW,IAAMmC,GAAuBhK,SAAS2D,EAAKkE,EAAW,IAErG,EAAK9T,MAAM2X,YAAY7D,EAAU2D,EAAMC,M,6BAlDzCE,mBAAA,SAAoBC,GAOhB,IAAIC,EAAczR,EADhBtG,KAAKC,MAAM+X,YAAcF,EAAUE,WAGjChY,KAAKC,MAAMgY,gBAAkBH,EAAUG,eACzCF,EAAiB/X,KAAKC,MAAM4P,KAAKlK,OACjCW,EAAiBtG,KAAKC,MAAM4P,KAAKrK,OAAO,MAAQ,GACH,iBAA7BxF,KAAKC,MAAMmF,eAC3BkB,EAAiBtG,KAAKC,MAAMmF,cAC5B2S,EAAiB/X,KAAKC,MAAMmF,eAG5BkB,EADAyR,EAAiB/X,KAAKC,MAAM4P,KAAKlK,OAInC3F,KAAKyW,oBAAoBzO,SAASkQ,kBAAkB5R,EAAgByR,GACpE/X,KAAKyW,oBAAoBzO,SAASZ,SAC1B0Q,EAAUpB,eAAiB1W,KAAKC,MAAMyW,aAC9C1W,KAAKyW,oBAAoBzO,SAASZ,QACzBpH,KAAKC,MAAMkY,UAAYL,EAAUK,UACtCnY,KAAKC,MAAMkY,QACbnY,KAAK+W,YAAY9M,MAAM7C,QAEvBpH,KAAKyW,oBAAoBzO,SAASZ,U,EAyBxCvH,OAAA,WAAW,IAAD,EACwCG,KAAKC,MAA7C+B,EADA,EACAA,KAAMoG,EADN,EACMA,QAASgQ,EADf,EACeA,WAAYvB,EAD3B,EAC2BA,SAC7BhQ,EAAW7G,KAAKC,MAAMyW,aACtB7G,EAAW,CAAC7P,KAAKC,MAAM8W,YAAa/W,KAAKC,MAAM4P,MAAMmH,KAAK,IAC1DqB,EAAiBxR,GAAY7G,KAAKC,MAAM2W,aAAe5W,KAAKC,MAAM0W,kBAAoBhR,kBAAOkK,GAAQoH,MAA6B,IAAhBpH,EAAKlK,QAAuC,IAAvBkK,EAAKnK,OAAOC,SAAiBkR,EACtKyB,EAAc,GAQlB,OALEA,EADyB,YAAvBtY,KAAKC,MAAMsY,SAAgD,WAAvBvY,KAAKC,MAAMsY,QACnC,oBAAM9X,UAAU,sCAAhB,EAAgD,YAAC,KAAD,CAAMsD,GAAG,SAAzD,IAAoE/B,EAAKQ,cAAczB,GAASqV,UAEzE,aAAvBpW,KAAKC,MAAMsY,QAAyBvW,EAAKQ,cAAczB,GAASsV,YAAa,CAAED,QAASpU,EAAKQ,cAAczB,GAASqV,WAAcpU,EAAKQ,cAAczB,GAASqV,SAI5K,mBAAK3V,UAAU,qBAAf,EACE,YAAC,GAAD,IAEA,YAAC,EAAD,IAEA,yBAAKA,UAAS,kBAAmBT,KAAKC,MAAMkY,QAAU,yBAA2B,IAAMhO,IAAKnK,KAAK4L,QAC/F,kBAAC,EAAD,CACE3C,YAAajH,EAAKQ,cAAczB,GAASoV,qBACzC9P,MAAOrG,KAAKC,MAAM8W,YAClBpQ,SAAU3G,KAAKwY,wBACf7Q,UAAW3H,KAAKyP,cAChB5I,UAAW7G,KAAKC,MAAMkY,QACtBhO,IAAKnK,KAAKyY,eACV7R,YAAa5G,KAAKC,MAAM2G,YACxBH,4BAA6BzG,KAAKyG,4BAClCC,4BAA6B1G,KAAK0G,4BAClCe,qBAAsBzH,KAAK0Y,4BAC3B3O,aAAc,CAAC,KACfhG,GAAG,mBACHtD,UAAU,0BAId,kBAAC,EAAD,CACE0J,IAAKnK,KAAK2Y,uBACV1P,YAAajH,EAAKQ,cAAczB,GAASkI,aACzCpC,SAAUA,EACVR,MAAOrG,KAAKC,MAAM4P,KAClBlJ,SAAU3G,KAAK8L,aACflF,YAAa5G,KAAKC,MAAM2G,YACxBgB,QAAS5H,KAAK4Y,YACdjR,UAAW3H,KAAKyP,cAChBhJ,4BAA6BzG,KAAKyG,4BAClCC,4BAA6B1G,KAAK0G,4BAClCe,qBAAsBzH,KAAKyH,qBAC3BW,QAASA,EACTe,WAAYiP,IAAeS,aAASxB,OAAOC,aAE3C,YAAC,KAAD,CAAqBM,YAAa5X,KAAK8Y,kBACvC,mBAAKrY,UAAU,gCAAf,EACE,YAAC,GAAD,IACA,YAAC,GAAD,MAIJ,mBAAKA,UAAU,sCAAf,EACE,mBAAKA,UAAU,8BAAf,EACE,YAAC,GAAD,IACA,YAAC,EAAD,IACA,YAAC,GAAD,IACA,YAAC,GAAD,KAEF,mBAAKA,UAAU,mCAAf,EAA4C,YAAC,IAAD,CAAkB8G,IAAK0P,KAAUpH,KAAMA,MAGrF,mBAAKpP,UAAU,8BAAf,EACE,mBAAKA,UAAU,6CAAf,EAAsD,YAAC,IAAD,CAAQoP,KAAMyI,EAAa5V,QAAS1C,KAAKwW,aAAc3P,SAAUwR,EAAgBU,OAAK,Q,GAxN5H3V,K,8BAEF,CACpBzB,OAAQ0B,IAAUC,S,2BAGD,CACjBtB,KAAMqB,IAAUC,OAAOI,WACvBmM,KAAMxM,IAAUuG,OAAOlG,WACvBkD,YAAarD,IAAmBsG,KAChCsO,QAAS9U,IAAUyG,KACnByO,QAASlV,IAAUuG,OACnBmN,YAAa1T,IAAUuG,OACvBoO,UAAW3U,IAAU2V,WAAWC,MAChC7T,cAAe/B,IAAUiH,OACzB2N,cAAe5U,IAAU2V,WAAWC,MACpCvC,aAAcrT,IAAUyG,KACxB6M,iBAAkBtT,IAAUyG,KAC5B8M,YAAavT,IAAUyG,KACvBnD,SAAUtD,IAAUI,KAAKC,WACzBwR,SAAU7R,IAAUI,KAAKC,WACzB6O,mBAAoBlP,IAAUI,KAAKC,WACnC8O,mBAAoBnP,IAAUI,KAAKC,WACnC+D,qBAAsBpE,IAAUI,KAAKC,WACrCwT,oBAAqB7T,IAAUI,KAAKC,WACpC0E,QAAS/E,IAAUI,KAAKC,WACxBkU,YAAavU,IAAUI,KAAKC,WAC5B0U,WAAY/U,IAAUyG,KACtB+M,SAAUxT,IAAUyG,KACpBsN,aAAc/T,IAAUyG,O,8BAGJ,CACpBsO,YAAY,I,YCDDzU,uBApDS,SAAAG,GAAK,MAAK,CAChC+L,KAAM/L,EAAM/B,MAAM,CAAC,UAAW,SAC9B6E,YAAa9C,EAAM/B,MAAM,CAAC,UAAW,gBACrCoW,QAASrU,EAAM/B,MAAM,CAAC,UAAW,YACjCgV,YAAajT,EAAM/B,MAAM,CAAC,UAAW,iBACrCwW,QAASzU,EAAM/B,MAAM,CAAC,UAAW,YACjCiW,UAAWlU,EAAM/B,MAAM,CAAC,UAAW,cACnCqD,cAAetB,EAAM/B,MAAM,CAAC,UAAW,kBACvCkW,cAAenU,EAAM/B,MAAM,CAAC,UAAW,kBACvC2U,aAAc5S,EAAM/B,MAAM,CAAC,UAAW,kBACtC4U,iBAAkB7S,EAAM/B,MAAM,CAAC,UAAW,uBAC1C6U,YAAa9S,EAAM/B,MAAM,CAAC,UAAW,iBACrCqW,WAAYtU,EAAM/B,MAAM,CAAC,SAAU,gBAAkB+B,EAAM/B,MAAM,CAAC,SAAU,WAC5E8U,SAAU/S,EAAM/B,MAAM,CAAC,UAAW,sBAAsBiB,KAAO,MAGtC,SAACgB,GAAD,MAAe,CAExC2C,SAFwC,SAE9BkJ,GACR7L,EAASkV,YAAcrJ,KAGzBqF,SANwC,SAM9BvT,GACRqC,EAASmR,aAAcxT,KAGzB4Q,mBAVwC,WAWtCvO,EAAS6P,gBAGXrB,mBAdwC,SAcpBjM,GAClBvC,EAAS8P,YAAwBvN,KAGnCkB,qBAlBwC,SAkBlBsM,EAAUxN,EAAOsB,EAAYoM,GACjDjQ,EAASkQ,aAAwBH,EAAUxN,EAAOsB,EAAYoM,KAGhEiD,oBAtBwC,SAsBnB7B,GACnBrR,EAASmV,YAAyB9D,KAGpCjN,QA1BwC,SA0B/BD,GACPnE,EAASmI,aAAchE,KAGzByP,YA9BwC,SA8B3B7D,EAAU2D,EAAMC,GAC3B3T,EAASoV,aAAmBrF,EAAU2D,EAAMC,QAKjChU,CAA6C2S,K,iCCjE5D,qDAOMvV,EAAWC,YAAe,CAC9BqY,cAAc,CAAD,sFACbC,cAAc,CAAD,8DAmBAnY,gBAAWwC,mBAhBF,SAAAG,GACtB,MAAO,CACLf,QAASe,EAAM/B,MAAM,CAAC,WAAY8T,UAIX,SAAC7R,EAAD,OAAahC,EAAb,EAAaA,KAAb,MAAyB,CAClDuX,SADkD,WAEhDvV,EAASwN,YAAU,UAAW,CAC5BiE,QAASzT,EAAKQ,cAAczB,EAASsY,eACrCG,QAASxX,EAAKQ,cAAczB,EAASuY,eACrCG,UAAW,kBAAMC,sBAKG/V,CAA6CgW,O,8QCTvE,IAAM5Y,EAAWC,YAAe,CAC9B4Y,MAAM,CAAD,+DACLC,cAAc,CAAD,0CACbC,cAAc,CAAD,4DACbC,OAAO,CAAD,yEACNC,UAAU,CAAD,wEACTC,YAAY,CAAD,8DACXC,OAAO,CAAD,oDACNC,QAAQ,CAAD,+DACPd,cAAc,CAAD,sFACbC,cAAc,CAAD,8DAUTc,EAFUzW,mBALQ,SAACG,EAAOuW,GAAR,MAAsB,CAC5CC,QAASxW,EAAM/B,MAAM,CAAC,WAAY,YAClCqW,WAAYiC,EAASE,YAAczW,EAAM/B,MAAM,CAAC,SAAU,gBAAkB+B,EAAM/B,MAAM,CAAC,SAAU,WAAasY,EAASG,gB,GAI1HrZ,Y,gOA4BqB,SAAAE,GAAM,IAAD,EACI,EAAKpB,MAAxB+D,EADe,EACfA,SAAUhC,EADK,EACLA,KAWlB,OATAX,EAAEI,iBACFJ,EAAEmG,kBAEFxD,EAASwN,YAAU,UAAW,CAC5BiE,QAASzT,EAAKQ,cAAczB,EAASsY,eACrCG,QAASxX,EAAKQ,cAAczB,EAASuY,eACrCG,UAAW,kBAAMC,mBAGZ,K,sCAGC,WACR,EAAKzZ,MAAM+D,SAASyW,aAAgB,O,qCAG7B,WACP,EAAKxa,MAAM+D,SAASyW,aAAgB,O,6BApCtC/L,kBAAA,WAC2B1O,KAAKC,MAAtBua,cAGNxa,KAAKC,MAAM+D,SAAS0W,iB,EAIxB7L,qBAAA,WAC2B7O,KAAKC,MAAtBua,cAGNxa,KAAKC,MAAM+D,SAAS2W,iB,EA2BxB9a,OAAA,WAAW,IAAD,EACgDG,KAAKC,MAArDsa,EADA,EACAA,YAAanC,EADb,EACaA,WAAYoC,EADzB,EACyBA,aAAcxY,EADvC,EACuCA,KAE3C4Y,EAAS,GAEb,GAAIL,EAAa,CAAC,IACRD,EAAYta,KAAKC,MAAjBqa,QACRM,EACE,mBAAKna,UAAU,uBAAf,EACE,YAAC,IAAD,CAAMoa,GAAG,mBAAmBpa,UAAU,cAAc8B,MAAOP,EAAKQ,cAAczB,EAAS6Y,OAAQpN,aAAYxK,EAAKQ,cAAczB,EAAS6Y,aAAvI,EAA+I,YAAC,IAAD,CAAM7V,GAAG,OAAO6L,YAAU,MACvK0K,EAAQtO,MAAK,SAAA8O,GAAM,MAAyB,SAArBA,EAAO3Y,IAAI,UAClC,YAAC,IAAD,CAAM0Y,GAAG,kBAAkBpa,UAAU,cAAc8B,MAAOP,EAAKQ,cAAczB,EAAS8Y,eAAgBrN,aAAYxK,EAAKQ,cAAczB,EAAS8Y,qBAA9I,EAA8J,YAAC,IAAD,CAAM9V,GAAG,OAAO6L,YAAU,MAExL0K,EAAQtO,MAAK,SAAA8O,GAAM,MAAyB,kBAArBA,EAAO3Y,IAAI,UAClC,YAAC,IAAD,CAAM0Y,GAAG,iBAAiBpa,UAAU,cAAc8B,MAAOP,EAAKQ,cAAczB,EAAS+Y,eAAgBtN,aAAYxK,EAAKQ,cAAczB,EAAS+Y,qBAA7I,EAA6J,YAAC,IAAD,CAAM/V,GAAG,OAAO6L,YAAU,MAEvL0K,EAAQtO,MAAK,SAAA8O,GAAM,MAAyB,cAArBA,EAAO3Y,IAAI,UAClC,YAAC,IAAD,CAAM0Y,GAAG,0BAA0Bpa,UAAU,cAAc8B,MAAOP,EAAKQ,cAAczB,EAASiZ,WAAYxN,aAAYxK,EAAKQ,cAAczB,EAASiZ,iBAAlJ,EAA8J,YAAC,IAAD,CAAMjW,GAAG,QAAQ6L,YAAU,MAEzL0K,EAAQtO,MAAK,SAAA8O,GAAM,MAAyB,WAArBA,EAAO3Y,IAAI,UAClC,YAAC,IAAD,CAAM0Y,GAAG,oBAAoBpa,UAAU,cAAc8B,MAAOP,EAAKQ,cAAczB,EAASgZ,QAASvN,aAAYxK,EAAKQ,cAAczB,EAASgZ,cAAzI,EAAkJ,YAAC,IAAD,CAAMhW,GAAG,QAAQ6L,YAAU,KAE/K,iBAAG/M,KAAK,iBAAiBpC,UAAU,cAAc8B,MAAOP,EAAKQ,cAAczB,EAASkZ,aAAczN,aAAYxK,EAAKQ,cAAczB,EAASkZ,mBAA1I,EAAwJ,YAAC,IAAD,CAAMlW,GAAG,MAAM6L,YAAU,KACjL,iBAAG/M,KAAK,iBAAiBpC,UAAU,cAAc8B,MAAOP,EAAKQ,cAAczB,EAASmZ,QAAS1N,aAAYxK,EAAKQ,cAAczB,EAASmZ,QAASxX,QAAS1C,KAAK+a,wBAA5J,EAA+K,YAAC,IAAD,CAAMhX,GAAG,WAAW6L,YAAU,MAKnN,OACE,mBAAKnP,UAAU,SAAS+H,KAAK,SAASgE,aAAYxK,EAAKQ,cAAczB,EAASoZ,eAA9E,EACGS,GAECL,GAAeC,IAAiB,YAAC,IAAD,IAElC,mBAAK/Z,UAAU,sBAAf,GACI+Z,GAAgB,mBAAK/Z,UAAU,gBAAgBmH,QAAS5H,KAAK4H,cAA7C,EAChB,YAAC,IAAD,CAAqBmG,QAAS/N,KAAKwJ,SAEnC,YAAC,IAAD,IAHgB,eAKJ,mBAAK/I,UAAU,gCAAf,EACV,mBAAKE,IAAI,GAAGqa,UAAU,QAAQta,IAAKua,OANrB,MAUlB,YAAC,IAAD,CAAQjM,aAAc,CAAE0F,EAAG8F,EAAe,GAAK,KAAOpY,MAAO,CAAEsS,EAAGtF,IAAOgJ,GAAcoC,EAAe,GAAK,IAAK,CAAElL,UAAW,IAAKD,QAAS,YAA3I,GACG,gBAAGqF,EAAH,EAAGA,EAAH,OACC,mBAAKjU,UAAU,uBAAuB2B,MAAO,CAAEmN,UAAU,cAAemF,EAAhB,KAAuBwG,YAAmB,MAAPxG,EAAa,SAAW,iBAAnH,EACE,YAAC,IAAD,a,GAlGM7T,IAAMC,iB","file":"features/compose.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport unicodeMapping from '../features/emoji/emoji_unicode_mapping_light';\n\nconst assetHost = process.env.CDN_HOST || '';\n\nexport default class AutosuggestEmoji extends React.PureComponent {\n\n static propTypes = {\n emoji: PropTypes.object.isRequired,\n };\n\n render () {\n const { emoji } = this.props;\n let url;\n\n if (emoji.custom) {\n url = emoji.imageUrl;\n } else {\n const mapping = unicodeMapping[emoji.native] || unicodeMapping[emoji.native.replace(/\\uFE0F$/, '')];\n\n if (!mapping) {\n return null;\n }\n\n url = `${assetHost}/emoji/${mapping.filename}.svg`;\n }\n\n return (\n <div className='autosuggest-emoji'>\n <img\n className='emojione'\n src={url}\n alt={emoji.native || emoji.colons}\n />\n\n {emoji.colons}\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Avatar from '../../../components/avatar';\nimport IconButton from '../../../components/icon_button';\nimport DisplayName from '../../../components/display_name';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { isRtl } from '../../../rtl';\nimport AttachmentList from 'mastodon/components/attachment_list';\n\nconst messages = defineMessages({\n cancel: { id: 'reply_indicator.cancel', defaultMessage: 'Cancel' },\n});\n\nexport default @injectIntl\nclass ReplyIndicator extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map,\n onCancel: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleClick = () => {\n this.props.onCancel();\n }\n\n handleAccountClick = (e) => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n }\n }\n\n render () {\n const { status, intl } = this.props;\n\n if (!status) {\n return null;\n }\n\n const content = { __html: status.get('contentHtml') };\n const style = {\n direction: isRtl(status.get('search_index')) ? 'rtl' : 'ltr',\n };\n\n return (\n <div className='reply-indicator'>\n <div className='reply-indicator__header'>\n <div className='reply-indicator__cancel'><IconButton title={intl.formatMessage(messages.cancel)} icon='times' onClick={this.handleClick} inverted /></div>\n\n <a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='reply-indicator__display-name'>\n <div className='reply-indicator__display-avatar'><Avatar account={status.get('account')} size={24} /></div>\n <DisplayName account={status.get('account')} />\n </a>\n </div>\n\n <div className='reply-indicator__content' style={style} dangerouslySetInnerHTML={content} />\n\n {status.get('media_attachments').size > 0 && (\n <AttachmentList\n compact\n media={status.get('media_attachments')}\n />\n )}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { cancelReplyCompose } from '../../../actions/compose';\nimport { makeGetStatus } from '../../../selectors';\nimport ReplyIndicator from '../components/reply_indicator';\n\nconst makeMapStateToProps = () => {\n const getStatus = makeGetStatus();\n\n const mapStateToProps = state => ({\n status: getStatus(state, { id: state.getIn(['compose', 'in_reply_to']) }),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = dispatch => ({\n\n onCancel () {\n dispatch(cancelReplyCompose());\n },\n\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(ReplyIndicator);\n","import React from 'react';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nexport default class AutosuggestAccount extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n };\n\n render () {\n const { account } = this.props;\n\n return (\n <div className='autosuggest-account' title={account.get('acct')}>\n <div className='autosuggest-account-icon'><Avatar account={account} size={18} /></div>\n <DisplayName account={account} />\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport AutosuggestAccount from '../components/autosuggest_account';\nimport { makeGetAccount } from '../../../selectors';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { id }) => ({\n account: getAccount(state, id),\n });\n\n return mapStateToProps;\n};\n\nexport default connect(makeMapStateToProps)(AutosuggestAccount);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { shortNumberFormat } from 'mastodon/utils/numbers';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class AutosuggestHashtag extends React.PureComponent {\n\n static propTypes = {\n tag: PropTypes.shape({\n name: PropTypes.string.isRequired,\n url: PropTypes.string,\n history: PropTypes.array,\n }).isRequired,\n };\n\n render () {\n const { tag } = this.props;\n const weeklyUses = tag.history && shortNumberFormat(tag.history.reduce((total, day) => total + (day.uses * 1), 0));\n\n return (\n <div className='autosuggest-hashtag'>\n <div className='autosuggest-hashtag__name'>#<strong>{tag.name}</strong></div>\n {tag.history !== undefined && <div className='autosuggest-hashtag__uses'><FormattedMessage id='autosuggest_hashtag.per_week' defaultMessage='{count} per week' values={{ count: weeklyUses }} /></div>}\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container';\nimport AutosuggestEmoji from './autosuggest_emoji';\nimport AutosuggestHashtag from './autosuggest_hashtag';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { isRtl } from '../rtl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Textarea from 'react-textarea-autosize';\nimport classNames from 'classnames';\n\nconst textAtCursorMatchesToken = (str, caretPosition) => {\n let word;\n\n let left = str.slice(0, caretPosition).search(/\\S+$/);\n let right = str.slice(caretPosition).search(/\\s/);\n\n if (right < 0) {\n word = str.slice(left);\n } else {\n word = str.slice(left, right + caretPosition);\n }\n\n if (!word || word.trim().length < 3 || ['@', ':', '#'].indexOf(word[0]) === -1) {\n return [null, null];\n }\n\n word = word.trim().toLowerCase();\n\n if (word.length > 0) {\n return [left + 1, word];\n } else {\n return [null, null];\n }\n};\n\nexport default class AutosuggestTextarea extends ImmutablePureComponent {\n\n static propTypes = {\n value: PropTypes.string,\n suggestions: ImmutablePropTypes.list,\n disabled: PropTypes.bool,\n placeholder: PropTypes.string,\n onSuggestionSelected: PropTypes.func.isRequired,\n onSuggestionsClearRequested: PropTypes.func.isRequired,\n onSuggestionsFetchRequested: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onKeyUp: PropTypes.func,\n onKeyDown: PropTypes.func,\n onPaste: PropTypes.func.isRequired,\n autoFocus: PropTypes.bool,\n };\n\n static defaultProps = {\n autoFocus: true,\n };\n\n state = {\n suggestionsHidden: true,\n focused: false,\n selectedSuggestion: 0,\n lastToken: null,\n tokenStart: 0,\n };\n\n onChange = (e) => {\n const [ tokenStart, token ] = textAtCursorMatchesToken(e.target.value, e.target.selectionStart);\n\n if (token !== null && this.state.lastToken !== token) {\n this.setState({ lastToken: token, selectedSuggestion: 0, tokenStart });\n this.props.onSuggestionsFetchRequested(token);\n } else if (token === null) {\n this.setState({ lastToken: null });\n this.props.onSuggestionsClearRequested();\n }\n\n this.props.onChange(e);\n }\n\n onKeyDown = (e) => {\n const { suggestions, disabled } = this.props;\n const { selectedSuggestion, suggestionsHidden } = this.state;\n\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n if (e.which === 229 || e.isComposing) {\n // Ignore key events during text composition\n // e.key may be a name of the physical key even in this case (e.x. Safari / Chrome on Mac)\n return;\n }\n\n switch(e.key) {\n case 'Escape':\n if (suggestions.size === 0 || suggestionsHidden) {\n document.querySelector('.ui').parentElement.focus();\n } else {\n e.preventDefault();\n this.setState({ suggestionsHidden: true });\n }\n\n break;\n case 'ArrowDown':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) });\n }\n\n break;\n case 'ArrowUp':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) });\n }\n\n break;\n case 'Enter':\n case 'Tab':\n // Select suggestion\n if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion));\n }\n\n break;\n }\n\n if (e.defaultPrevented || !this.props.onKeyDown) {\n return;\n }\n\n this.props.onKeyDown(e);\n }\n\n onBlur = () => {\n this.setState({ suggestionsHidden: true, focused: false });\n }\n\n onFocus = (e) => {\n this.setState({ focused: true });\n if (this.props.onFocus) {\n this.props.onFocus(e);\n }\n }\n\n onSuggestionClick = (e) => {\n const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));\n e.preventDefault();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);\n this.textarea.focus();\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {\n this.setState({ suggestionsHidden: false });\n }\n }\n\n setTextarea = (c) => {\n this.textarea = c;\n }\n\n onPaste = (e) => {\n if (e.clipboardData && e.clipboardData.files.length === 1) {\n this.props.onPaste(e.clipboardData.files);\n e.preventDefault();\n }\n }\n\n renderSuggestion = (suggestion, i) => {\n const { selectedSuggestion } = this.state;\n let inner, key;\n\n if (suggestion.type === 'emoji') {\n inner = <AutosuggestEmoji emoji={suggestion} />;\n key = suggestion.id;\n } else if (suggestion.type === 'hashtag') {\n inner = <AutosuggestHashtag tag={suggestion} />;\n key = suggestion.name;\n } else if (suggestion.type === 'account') {\n inner = <AutosuggestAccountContainer id={suggestion.id} />;\n key = suggestion.id;\n }\n\n return (\n <div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>\n {inner}\n </div>\n );\n }\n\n render () {\n const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, children } = this.props;\n const { suggestionsHidden } = this.state;\n const style = { direction: 'ltr' };\n\n if (isRtl(value)) {\n style.direction = 'rtl';\n }\n\n return [\n <div className='compose-form__autosuggest-wrapper' key='autosuggest-wrapper'>\n <div className='autosuggest-textarea'>\n <label>\n <span style={{ display: 'none' }}>{placeholder}</span>\n\n <Textarea\n inputRef={this.setTextarea}\n className='autosuggest-textarea__textarea'\n disabled={disabled}\n placeholder={placeholder}\n autoFocus={autoFocus}\n value={value}\n onChange={this.onChange}\n onKeyDown={this.onKeyDown}\n onKeyUp={onKeyUp}\n onFocus={this.onFocus}\n onBlur={this.onBlur}\n onPaste={this.onPaste}\n style={style}\n aria-autocomplete='list'\n />\n </label>\n </div>\n {children}\n </div>,\n\n <div className='autosuggest-textarea__suggestions-wrapper' key='suggestions-wrapper'>\n <div className={`autosuggest-textarea__suggestions ${suggestionsHidden || suggestions.isEmpty() ? '' : 'autosuggest-textarea__suggestions--visible'}`}>\n {suggestions.map(this.renderSuggestion)}\n </div>\n </div>,\n ];\n }\n\n}\n","import React from 'react';\nimport AutosuggestAccountContainer from '../features/compose/containers/autosuggest_account_container';\nimport AutosuggestEmoji from './autosuggest_emoji';\nimport AutosuggestHashtag from './autosuggest_hashtag';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { isRtl } from '../rtl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport classNames from 'classnames';\nimport { List as ImmutableList } from 'immutable';\n\nconst textAtCursorMatchesToken = (str, caretPosition, searchTokens) => {\n let word;\n\n let left = str.slice(0, caretPosition).search(/\\S+$/);\n let right = str.slice(caretPosition).search(/\\s/);\n\n if (right < 0) {\n word = str.slice(left);\n } else {\n word = str.slice(left, right + caretPosition);\n }\n\n if (!word || word.trim().length < 3 || searchTokens.indexOf(word[0]) === -1) {\n return [null, null];\n }\n\n word = word.trim().toLowerCase();\n\n if (word.length > 0) {\n return [left + 1, word];\n } else {\n return [null, null];\n }\n};\n\nexport default class AutosuggestInput extends ImmutablePureComponent {\n\n static propTypes = {\n value: PropTypes.string,\n suggestions: ImmutablePropTypes.list,\n disabled: PropTypes.bool,\n placeholder: PropTypes.string,\n onSuggestionSelected: PropTypes.func.isRequired,\n onSuggestionsClearRequested: PropTypes.func.isRequired,\n onSuggestionsFetchRequested: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n onKeyUp: PropTypes.func,\n onKeyDown: PropTypes.func,\n autoFocus: PropTypes.bool,\n className: PropTypes.string,\n id: PropTypes.string,\n searchTokens: PropTypes.arrayOf(PropTypes.string),\n maxLength: PropTypes.number,\n };\n\n static defaultProps = {\n autoFocus: true,\n searchTokens: ImmutableList(['@', ':', '#']),\n };\n\n state = {\n suggestionsHidden: true,\n focused: false,\n selectedSuggestion: 0,\n lastToken: null,\n tokenStart: 0,\n };\n\n onChange = (e) => {\n const [ tokenStart, token ] = textAtCursorMatchesToken(e.target.value, e.target.selectionStart, this.props.searchTokens);\n\n if (token !== null && this.state.lastToken !== token) {\n this.setState({ lastToken: token, selectedSuggestion: 0, tokenStart });\n this.props.onSuggestionsFetchRequested(token);\n } else if (token === null) {\n this.setState({ lastToken: null });\n this.props.onSuggestionsClearRequested();\n }\n\n this.props.onChange(e);\n }\n\n onKeyDown = (e) => {\n const { suggestions, disabled } = this.props;\n const { selectedSuggestion, suggestionsHidden } = this.state;\n\n if (disabled) {\n e.preventDefault();\n return;\n }\n\n if (e.which === 229 || e.isComposing) {\n // Ignore key events during text composition\n // e.key may be a name of the physical key even in this case (e.x. Safari / Chrome on Mac)\n return;\n }\n\n switch(e.key) {\n case 'Escape':\n if (suggestions.size === 0 || suggestionsHidden) {\n document.querySelector('.ui').parentElement.focus();\n } else {\n e.preventDefault();\n this.setState({ suggestionsHidden: true });\n }\n\n break;\n case 'ArrowDown':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.min(selectedSuggestion + 1, suggestions.size - 1) });\n }\n\n break;\n case 'ArrowUp':\n if (suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n this.setState({ selectedSuggestion: Math.max(selectedSuggestion - 1, 0) });\n }\n\n break;\n case 'Enter':\n case 'Tab':\n // Select suggestion\n if (this.state.lastToken !== null && suggestions.size > 0 && !suggestionsHidden) {\n e.preventDefault();\n e.stopPropagation();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestions.get(selectedSuggestion));\n }\n\n break;\n }\n\n if (e.defaultPrevented || !this.props.onKeyDown) {\n return;\n }\n\n this.props.onKeyDown(e);\n }\n\n onBlur = () => {\n this.setState({ suggestionsHidden: true, focused: false });\n }\n\n onFocus = () => {\n this.setState({ focused: true });\n }\n\n onSuggestionClick = (e) => {\n const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));\n e.preventDefault();\n this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);\n this.input.focus();\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {\n this.setState({ suggestionsHidden: false });\n }\n }\n\n setInput = (c) => {\n this.input = c;\n }\n\n renderSuggestion = (suggestion, i) => {\n const { selectedSuggestion } = this.state;\n let inner, key;\n\n if (suggestion.type === 'emoji') {\n inner = <AutosuggestEmoji emoji={suggestion} />;\n key = suggestion.id;\n } else if (suggestion.type ==='hashtag') {\n inner = <AutosuggestHashtag tag={suggestion} />;\n key = suggestion.name;\n } else if (suggestion.type === 'account') {\n inner = <AutosuggestAccountContainer id={suggestion.id} />;\n key = suggestion.id;\n }\n\n return (\n <div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>\n {inner}\n </div>\n );\n }\n\n render () {\n const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength } = this.props;\n const { suggestionsHidden } = this.state;\n const style = { direction: 'ltr' };\n\n if (isRtl(value)) {\n style.direction = 'rtl';\n }\n\n return (\n <div className='autosuggest-input'>\n <label>\n <span style={{ display: 'none' }}>{placeholder}</span>\n\n <input\n type='text'\n ref={this.setInput}\n disabled={disabled}\n placeholder={placeholder}\n autoFocus={autoFocus}\n value={value}\n onChange={this.onChange}\n onKeyDown={this.onKeyDown}\n onKeyUp={onKeyUp}\n onFocus={this.onFocus}\n onBlur={this.onBlur}\n style={style}\n aria-autocomplete='list'\n id={id}\n className={className}\n maxLength={maxLength}\n />\n </label>\n\n <div className={`autosuggest-textarea__suggestions ${suggestionsHidden || suggestions.isEmpty() ? '' : 'autosuggest-textarea__suggestions--visible'}`}>\n {suggestions.map(this.renderSuggestion)}\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport IconButton from '../../../components/icon_button';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n add_poll: { id: 'poll_button.add_poll', defaultMessage: 'Add a poll' },\n remove_poll: { id: 'poll_button.remove_poll', defaultMessage: 'Remove poll' },\n});\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n};\n\nexport default\n@injectIntl\nclass PollButton extends React.PureComponent {\n\n static propTypes = {\n disabled: PropTypes.bool,\n unavailable: PropTypes.bool,\n active: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleClick = () => {\n this.props.onClick();\n }\n\n render () {\n const { intl, active, unavailable, disabled } = this.props;\n\n if (unavailable) {\n return null;\n }\n\n return (\n <div className='compose-form__poll-button'>\n <IconButton\n icon='tasks'\n title={intl.formatMessage(active ? messages.remove_poll : messages.add_poll)}\n disabled={disabled}\n onClick={this.handleClick}\n className={`compose-form__poll-button-icon ${active ? 'active' : ''}`}\n size={18}\n inverted\n style={iconStyle}\n />\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PollButton from '../components/poll_button';\nimport { addPoll, removePoll } from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n unavailable: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size > 0),\n active: state.getIn(['compose', 'poll']) !== null,\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch((_, getState) => {\n if (getState().getIn(['compose', 'poll'])) {\n dispatch(removePoll());\n } else {\n dispatch(addPoll());\n }\n });\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PollButton);\n","import React from 'react';\nimport IconButton from '../../../components/icon_button';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\n\nconst messages = defineMessages({\n upload: { id: 'upload_button.label', defaultMessage: 'Add media ({formats})' },\n});\n\nconst SUPPORTED_FORMATS = 'JPEG, PNG, GIF, WebM, MP4, MOV, OGG, WAV, MP3, FLAC';\n\nconst makeMapStateToProps = () => {\n const mapStateToProps = state => ({\n acceptContentTypes: state.getIn(['media_attachments', 'accept_content_types']),\n });\n\n return mapStateToProps;\n};\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n};\n\nexport default @connect(makeMapStateToProps)\n@injectIntl\nclass UploadButton extends ImmutablePureComponent {\n\n static propTypes = {\n disabled: PropTypes.bool,\n unavailable: PropTypes.bool,\n onSelectFile: PropTypes.func.isRequired,\n style: PropTypes.object,\n resetFileKey: PropTypes.number,\n acceptContentTypes: ImmutablePropTypes.listOf(PropTypes.string).isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleChange = (e) => {\n if (e.target.files.length > 0) {\n this.props.onSelectFile(e.target.files);\n }\n }\n\n handleClick = () => {\n this.fileElement.click();\n }\n\n setRef = (c) => {\n this.fileElement = c;\n }\n\n render () {\n const { intl, resetFileKey, unavailable, disabled, acceptContentTypes } = this.props;\n\n if (unavailable) {\n return null;\n }\n\n return (\n <div className='compose-form__upload-button'>\n <IconButton icon='paperclip' title={intl.formatMessage(messages.upload, { formats: SUPPORTED_FORMATS })} disabled={disabled} onClick={this.handleClick} className='compose-form__upload-button-icon' size={18} inverted style={iconStyle} />\n <label>\n <span style={{ display: 'none' }}>{intl.formatMessage(messages.upload, { formats: SUPPORTED_FORMATS })}</span>\n <input\n key={resetFileKey}\n ref={this.setRef}\n type='file'\n multiple\n onChange={this.handleChange}\n disabled={disabled}\n style={{ display: 'none' }}\n />\n </label>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport UploadButton from '../components/upload_button';\nimport { uploadCompose } from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n disabled: state.getIn(['compose', 'is_uploading']) || (state.getIn(['compose', 'media_attachments']).size + state.getIn(['compose', 'pending_media_attachments']) > 3 || state.getIn(['compose', 'media_attachments']).some(m => ['video', 'audio'].includes(m.get('type')))),\n unavailable: state.getIn(['compose', 'poll']) !== null,\n resetFileKey: state.getIn(['compose', 'resetFileKey']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onSelectFile (files) {\n dispatch(uploadCompose(files));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(UploadButton);\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst iconStyle = {\n height: null,\n lineHeight: '27px',\n width: `${18 * 1.28571429}px`,\n};\n\nexport default class TextIconButton extends React.PureComponent {\n\n static propTypes = {\n label: PropTypes.string.isRequired,\n title: PropTypes.string,\n active: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n ariaControls: PropTypes.string,\n };\n\n handleClick = (e) => {\n e.preventDefault();\n this.props.onClick();\n }\n\n render () {\n const { label, title, active, ariaControls } = this.props;\n\n return (\n <button\n title={title}\n aria-label={title}\n className={`text-icon-button ${active ? 'active' : ''}`}\n aria-expanded={active}\n onClick={this.handleClick}\n aria-controls={ariaControls} style={iconStyle}\n >\n {label}\n </button>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport TextIconButton from '../components/text_icon_button';\nimport { changeComposeSpoilerness } from '../../../actions/compose';\nimport { injectIntl, defineMessages } from 'react-intl';\n\nconst messages = defineMessages({\n marked: { id: 'compose_form.spoiler.marked', defaultMessage: 'Text is hidden behind warning' },\n unmarked: { id: 'compose_form.spoiler.unmarked', defaultMessage: 'Text is not hidden' },\n});\n\nconst mapStateToProps = (state, { intl }) => ({\n label: 'CW',\n title: intl.formatMessage(state.getIn(['compose', 'spoiler']) ? messages.marked : messages.unmarked),\n active: state.getIn(['compose', 'spoiler']),\n ariaControls: 'cw-spoiler-input',\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch(changeComposeSpoilerness());\n },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(TextIconButton));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { injectIntl, defineMessages } from 'react-intl';\nimport IconButton from '../../../components/icon_button';\nimport Overlay from 'react-overlays/lib/Overlay';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport detectPassiveEvents from 'detect-passive-events';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n public_short: { id: 'privacy.public.short', defaultMessage: 'Public' },\n public_long: { id: 'privacy.public.long', defaultMessage: 'Visible for all, shown in public timelines' },\n unlisted_short: { id: 'privacy.unlisted.short', defaultMessage: 'Unlisted' },\n unlisted_long: { id: 'privacy.unlisted.long', defaultMessage: 'Visible for all, but not in public timelines' },\n private_short: { id: 'privacy.private.short', defaultMessage: 'Followers-only' },\n private_long: { id: 'privacy.private.long', defaultMessage: 'Visible for followers only' },\n direct_short: { id: 'privacy.direct.short', defaultMessage: 'Direct' },\n direct_long: { id: 'privacy.direct.long', defaultMessage: 'Visible for mentioned users only' },\n change_privacy: { id: 'privacy.change', defaultMessage: 'Adjust status privacy' },\n});\n\nconst listenerOptions = detectPassiveEvents.hasSupport ? { passive: true } : false;\n\nclass PrivacyDropdownMenu extends React.PureComponent {\n\n static propTypes = {\n style: PropTypes.object,\n items: PropTypes.array.isRequired,\n value: PropTypes.string.isRequired,\n placement: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n onChange: PropTypes.func.isRequired,\n };\n\n state = {\n mounted: false,\n };\n\n handleDocumentClick = e => {\n if (this.node && !this.node.contains(e.target)) {\n this.props.onClose();\n }\n }\n\n handleKeyDown = e => {\n const { items } = this.props;\n const value = e.currentTarget.getAttribute('data-index');\n const index = items.findIndex(item => {\n return (item.value === value);\n });\n let element;\n\n switch(e.key) {\n case 'Escape':\n this.props.onClose();\n break;\n case 'Enter':\n this.handleClick(e);\n break;\n case 'ArrowDown':\n element = this.node.childNodes[index + 1];\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'ArrowUp':\n element = this.node.childNodes[index - 1];\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'Tab':\n if (e.shiftKey) {\n element = this.node.childNodes[index - 1] || this.node.lastChild;\n } else {\n element = this.node.childNodes[index + 1] || this.node.firstChild;\n }\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n e.preventDefault();\n e.stopPropagation();\n }\n break;\n case 'Home':\n element = this.node.firstChild;\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n case 'End':\n element = this.node.lastChild;\n if (element) {\n element.focus();\n this.props.onChange(element.getAttribute('data-index'));\n }\n break;\n }\n }\n\n handleClick = e => {\n const value = e.currentTarget.getAttribute('data-index');\n\n e.preventDefault();\n\n this.props.onClose();\n this.props.onChange(value);\n }\n\n componentDidMount () {\n document.addEventListener('click', this.handleDocumentClick, false);\n document.addEventListener('touchend', this.handleDocumentClick, listenerOptions);\n if (this.focusedItem) this.focusedItem.focus();\n this.setState({ mounted: true });\n }\n\n componentWillUnmount () {\n document.removeEventListener('click', this.handleDocumentClick, false);\n document.removeEventListener('touchend', this.handleDocumentClick, listenerOptions);\n }\n\n setRef = c => {\n this.node = c;\n }\n\n setFocusRef = c => {\n this.focusedItem = c;\n }\n\n render () {\n const { mounted } = this.state;\n const { style, items, placement, value } = this.props;\n\n return (\n <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>\n {({ opacity, scaleX, scaleY }) => (\n // It should not be transformed when mounting because the resulting\n // size will be used to determine the coordinate of the menu by\n // react-overlays\n <div className={`privacy-dropdown__dropdown ${placement}`} style={{ ...style, opacity: opacity, transform: mounted ? `scale(${scaleX}, ${scaleY})` : null, zIndex: 2 }} role='listbox' ref={this.setRef}>\n {items.map(item => (\n <div role='option' tabIndex='0' key={item.value} data-index={item.value} onKeyDown={this.handleKeyDown} onClick={this.handleClick} className={classNames('privacy-dropdown__option', { active: item.value === value })} aria-selected={item.value === value} ref={item.value === value ? this.setFocusRef : null}>\n <div className='privacy-dropdown__option__icon'>\n <Icon id={item.icon} fixedWidth />\n </div>\n\n <div className='privacy-dropdown__option__content'>\n <strong>{item.text}</strong>\n {item.meta}\n </div>\n </div>\n ))}\n </div>\n )}\n </Motion>\n );\n }\n\n}\n\nexport default @injectIntl\nclass PrivacyDropdown extends React.PureComponent {\n\n static propTypes = {\n isUserTouching: PropTypes.func,\n isModalOpen: PropTypes.bool.isRequired,\n onModalOpen: PropTypes.func,\n onModalClose: PropTypes.func,\n value: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n state = {\n open: false,\n placement: 'bottom',\n };\n\n handleToggle = ({ target }) => {\n if (this.props.isUserTouching()) {\n if (this.state.open) {\n this.props.onModalClose();\n } else {\n this.props.onModalOpen({\n actions: this.options.map(option => ({ ...option, active: option.value === this.props.value })),\n onClick: this.handleModalActionClick,\n });\n }\n } else {\n const { top } = target.getBoundingClientRect();\n if (this.state.open && this.activeElement) {\n this.activeElement.focus();\n }\n this.setState({ placement: top * 2 < innerHeight ? 'bottom' : 'top' });\n this.setState({ open: !this.state.open });\n }\n }\n\n handleModalActionClick = (e) => {\n e.preventDefault();\n\n const { value } = this.options[e.currentTarget.getAttribute('data-index')];\n\n this.props.onModalClose();\n this.props.onChange(value);\n }\n\n handleKeyDown = e => {\n switch(e.key) {\n case 'Escape':\n this.handleClose();\n break;\n }\n }\n\n handleMouseDown = () => {\n if (!this.state.open) {\n this.activeElement = document.activeElement;\n }\n }\n\n handleButtonKeyDown = (e) => {\n switch(e.key) {\n case ' ':\n case 'Enter':\n this.handleMouseDown();\n break;\n }\n }\n\n handleClose = () => {\n if (this.state.open && this.activeElement) {\n this.activeElement.focus();\n }\n this.setState({ open: false });\n }\n\n handleChange = value => {\n this.props.onChange(value);\n }\n\n componentWillMount () {\n const { intl: { formatMessage } } = this.props;\n\n this.options = [\n { icon: 'globe', value: 'public', text: formatMessage(messages.public_short), meta: formatMessage(messages.public_long) },\n { icon: 'unlock', value: 'unlisted', text: formatMessage(messages.unlisted_short), meta: formatMessage(messages.unlisted_long) },\n { icon: 'lock', value: 'private', text: formatMessage(messages.private_short), meta: formatMessage(messages.private_long) },\n { icon: 'envelope', value: 'direct', text: formatMessage(messages.direct_short), meta: formatMessage(messages.direct_long) },\n ];\n }\n\n render () {\n const { value, intl } = this.props;\n const { open, placement } = this.state;\n\n const valueOption = this.options.find(item => item.value === value);\n\n return (\n <div className={classNames('privacy-dropdown', placement, { active: open })} onKeyDown={this.handleKeyDown}>\n <div className={classNames('privacy-dropdown__value', { active: this.options.indexOf(valueOption) === (placement === 'bottom' ? 0 : (this.options.length - 1)) })}>\n <IconButton\n className='privacy-dropdown__value-icon'\n icon={valueOption.icon}\n title={intl.formatMessage(messages.change_privacy)}\n size={18}\n expanded={open}\n active={open}\n inverted\n onClick={this.handleToggle}\n onMouseDown={this.handleMouseDown}\n onKeyDown={this.handleButtonKeyDown}\n style={{ height: null, lineHeight: '27px' }}\n />\n </div>\n\n <Overlay show={open} placement={placement} target={this}>\n <PrivacyDropdownMenu\n items={this.options}\n value={value}\n onClose={this.handleClose}\n onChange={this.handleChange}\n placement={placement}\n />\n </Overlay>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PrivacyDropdown from '../components/privacy_dropdown';\nimport { changeComposeVisibility } from '../../../actions/compose';\nimport { openModal, closeModal } from '../../../actions/modal';\nimport { isUserTouching } from '../../../is_mobile';\n\nconst mapStateToProps = state => ({\n isModalOpen: state.get('modal').modalType === 'ACTIONS',\n value: state.getIn(['compose', 'privacy']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onChange (value) {\n dispatch(changeComposeVisibility(value));\n },\n\n isUserTouching,\n onModalOpen: props => dispatch(openModal('ACTIONS', props)),\n onModalClose: () => dispatch(closeModal()),\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PrivacyDropdown);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport IconButton from 'mastodon/components/icon_button';\nimport Icon from 'mastodon/components/icon';\nimport AutosuggestInput from 'mastodon/components/autosuggest_input';\nimport classNames from 'classnames';\n\nconst messages = defineMessages({\n option_placeholder: { id: 'compose_form.poll.option_placeholder', defaultMessage: 'Choice {number}' },\n add_option: { id: 'compose_form.poll.add_option', defaultMessage: 'Add a choice' },\n remove_option: { id: 'compose_form.poll.remove_option', defaultMessage: 'Remove this choice' },\n poll_duration: { id: 'compose_form.poll.duration', defaultMessage: 'Poll duration' },\n switchToMultiple: { id: 'compose_form.poll.switch_to_multiple', defaultMessage: 'Change poll to allow multiple choices' },\n switchToSingle: { id: 'compose_form.poll.switch_to_single', defaultMessage: 'Change poll to allow for a single choice' },\n minutes: { id: 'intervals.full.minutes', defaultMessage: '{number, plural, one {# minute} other {# minutes}}' },\n hours: { id: 'intervals.full.hours', defaultMessage: '{number, plural, one {# hour} other {# hours}}' },\n days: { id: 'intervals.full.days', defaultMessage: '{number, plural, one {# day} other {# days}}' },\n});\n\n@injectIntl\nclass Option extends React.PureComponent {\n\n static propTypes = {\n title: PropTypes.string.isRequired,\n index: PropTypes.number.isRequired,\n isPollMultiple: PropTypes.bool,\n onChange: PropTypes.func.isRequired,\n onRemove: PropTypes.func.isRequired,\n onToggleMultiple: PropTypes.func.isRequired,\n suggestions: ImmutablePropTypes.list,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleOptionTitleChange = e => {\n this.props.onChange(this.props.index, e.target.value);\n };\n\n handleOptionRemove = () => {\n this.props.onRemove(this.props.index);\n };\n\n\n handleToggleMultiple = e => {\n this.props.onToggleMultiple();\n e.preventDefault();\n e.stopPropagation();\n };\n\n handleCheckboxKeypress = e => {\n if (e.key === 'Enter' || e.key === ' ') {\n this.handleToggleMultiple(e);\n }\n }\n\n onSuggestionsClearRequested = () => {\n this.props.onClearSuggestions();\n }\n\n onSuggestionsFetchRequested = (token) => {\n this.props.onFetchSuggestions(token);\n }\n\n onSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['poll', 'options', this.props.index]);\n }\n\n render () {\n const { isPollMultiple, title, index, intl } = this.props;\n\n return (\n <li>\n <label className='poll__option editable'>\n <span\n className={classNames('poll__input', { checkbox: isPollMultiple })}\n onClick={this.handleToggleMultiple}\n onKeyPress={this.handleCheckboxKeypress}\n role='button'\n tabIndex='0'\n title={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}\n aria-label={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}\n />\n\n <AutosuggestInput\n placeholder={intl.formatMessage(messages.option_placeholder, { number: index + 1 })}\n maxLength={100}\n value={title}\n onChange={this.handleOptionTitleChange}\n suggestions={this.props.suggestions}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSuggestionSelected}\n searchTokens={[':']}\n />\n </label>\n\n <div className='poll__cancel'>\n <IconButton disabled={index <= 1} title={intl.formatMessage(messages.remove_option)} icon='times' onClick={this.handleOptionRemove} />\n </div>\n </li>\n );\n }\n\n}\n\nexport default\n@injectIntl\nclass PollForm extends ImmutablePureComponent {\n\n static propTypes = {\n options: ImmutablePropTypes.list,\n expiresIn: PropTypes.number,\n isMultiple: PropTypes.bool,\n onChangeOption: PropTypes.func.isRequired,\n onAddOption: PropTypes.func.isRequired,\n onRemoveOption: PropTypes.func.isRequired,\n onChangeSettings: PropTypes.func.isRequired,\n suggestions: ImmutablePropTypes.list,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleAddOption = () => {\n this.props.onAddOption('');\n };\n\n handleSelectDuration = e => {\n this.props.onChangeSettings(e.target.value, this.props.isMultiple);\n };\n\n handleToggleMultiple = () => {\n this.props.onChangeSettings(this.props.expiresIn, !this.props.isMultiple);\n };\n\n render () {\n const { options, expiresIn, isMultiple, onChangeOption, onRemoveOption, intl, ...other } = this.props;\n\n if (!options) {\n return null;\n }\n\n return (\n <div className='compose-form__poll-wrapper'>\n <ul>\n {options.map((title, i) => <Option title={title} key={i} index={i} onChange={onChangeOption} onRemove={onRemoveOption} isPollMultiple={isMultiple} onToggleMultiple={this.handleToggleMultiple} {...other} />)}\n </ul>\n\n <div className='poll__footer'>\n <button disabled={options.size >= 5} className='button button-secondary' onClick={this.handleAddOption}><Icon id='plus' /> <FormattedMessage {...messages.add_option} /></button>\n\n {/* eslint-disable-next-line jsx-a11y/no-onchange */}\n <select value={expiresIn} onChange={this.handleSelectDuration}>\n <option value={300}>{intl.formatMessage(messages.minutes, { number: 5 })}</option>\n <option value={1800}>{intl.formatMessage(messages.minutes, { number: 30 })}</option>\n <option value={3600}>{intl.formatMessage(messages.hours, { number: 1 })}</option>\n <option value={21600}>{intl.formatMessage(messages.hours, { number: 6 })}</option>\n <option value={86400}>{intl.formatMessage(messages.days, { number: 1 })}</option>\n <option value={259200}>{intl.formatMessage(messages.days, { number: 3 })}</option>\n <option value={604800}>{intl.formatMessage(messages.days, { number: 7 })}</option>\n </select>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport PollForm from '../components/poll_form';\nimport { addPollOption, removePollOption, changePollOption, changePollSettings } from '../../../actions/compose';\nimport {\n clearComposeSuggestions,\n fetchComposeSuggestions,\n selectComposeSuggestion,\n} from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n suggestions: state.getIn(['compose', 'suggestions']),\n options: state.getIn(['compose', 'poll', 'options']),\n expiresIn: state.getIn(['compose', 'poll', 'expires_in']),\n isMultiple: state.getIn(['compose', 'poll', 'multiple']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onAddOption(title) {\n dispatch(addPollOption(title));\n },\n\n onRemoveOption(index) {\n dispatch(removePollOption(index));\n },\n\n onChangeOption(index, title) {\n dispatch(changePollOption(index, title));\n },\n\n onChangeSettings(expiresIn, isMultiple) {\n dispatch(changePollSettings(expiresIn, isMultiple));\n },\n\n onClearSuggestions () {\n dispatch(clearComposeSuggestions());\n },\n\n onFetchSuggestions (token) {\n dispatch(fetchComposeSuggestions(token));\n },\n\n onSuggestionSelected (position, token, accountId, path) {\n dispatch(selectComposeSuggestion(position, token, accountId, path));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(PollForm);\n","import { connect } from 'react-redux';\nimport UploadProgress from '../components/upload_progress';\n\nconst mapStateToProps = state => ({\n active: state.getIn(['compose', 'is_uploading']),\n progress: state.getIn(['compose', 'progress']),\n});\n\nexport default connect(mapStateToProps)(UploadProgress);\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { FormattedMessage } from 'react-intl';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nexport default class Upload extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n media: ImmutablePropTypes.map.isRequired,\n onUndo: PropTypes.func.isRequired,\n onOpenFocalPoint: PropTypes.func.isRequired,\n };\n\n handleUndoClick = e => {\n e.stopPropagation();\n this.props.onUndo(this.props.media.get('id'));\n }\n\n handleFocalPointClick = e => {\n e.stopPropagation();\n this.props.onOpenFocalPoint(this.props.media.get('id'));\n }\n\n render () {\n const { media } = this.props;\n const focusX = media.getIn(['meta', 'focus', 'x']);\n const focusY = media.getIn(['meta', 'focus', 'y']);\n const x = ((focusX / 2) + .5) * 100;\n const y = ((focusY / -2) + .5) * 100;\n\n return (\n <div className='compose-form__upload' tabIndex='0' role='button'>\n <Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>\n {({ scale }) => (\n <div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>\n <div className={classNames('compose-form__upload__actions', { active: true })}>\n <button className='icon-button' onClick={this.handleUndoClick}><Icon id='times' /> <FormattedMessage id='upload_form.undo' defaultMessage='Delete' /></button>\n <button className='icon-button' onClick={this.handleFocalPointClick}><Icon id='pencil' /> <FormattedMessage id='upload_form.edit' defaultMessage='Edit' /></button>\n </div>\n </div>\n )}\n </Motion>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport Upload from '../components/upload';\nimport { undoUploadCompose } from '../../../actions/compose';\nimport { openModal } from '../../../actions/modal';\nimport { submitCompose } from '../../../actions/compose';\n\nconst mapStateToProps = (state, { id }) => ({\n media: state.getIn(['compose', 'media_attachments']).find(item => item.get('id') === id),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onUndo: id => {\n dispatch(undoUploadCompose(id));\n },\n\n onOpenFocalPoint: id => {\n dispatch(openModal('FOCAL_POINT', { id }));\n },\n\n onSubmit (router) {\n dispatch(submitCompose(router));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Upload);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { changeComposeSensitivity } from 'mastodon/actions/compose';\nimport { injectIntl, defineMessages, FormattedMessage } from 'react-intl';\n\nconst messages = defineMessages({\n marked: { id: 'compose_form.sensitive.marked', defaultMessage: 'Media is marked as sensitive' },\n unmarked: { id: 'compose_form.sensitive.unmarked', defaultMessage: 'Media is not marked as sensitive' },\n});\n\nconst mapStateToProps = state => ({\n active: state.getIn(['compose', 'sensitive']),\n disabled: state.getIn(['compose', 'spoiler']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onClick () {\n dispatch(changeComposeSensitivity());\n },\n\n});\n\nclass SensitiveButton extends React.PureComponent {\n\n static propTypes = {\n active: PropTypes.bool,\n disabled: PropTypes.bool,\n onClick: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { active, disabled, onClick, intl } = this.props;\n\n return (\n <div className='compose-form__sensitive-button'>\n <label className={classNames('icon-button', { active })} title={intl.formatMessage(active ? messages.marked : messages.unmarked)}>\n <input\n name='mark-sensitive'\n type='checkbox'\n checked={active}\n onChange={onClick}\n disabled={disabled}\n />\n\n <span className={classNames('checkbox', { active })} />\n\n <FormattedMessage id='compose_form.sensitive.hide' defaultMessage='Mark media as sensitive' />\n </label>\n </div>\n );\n }\n\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(injectIntl(SensitiveButton));\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport UploadProgressContainer from '../containers/upload_progress_container';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport UploadContainer from '../containers/upload_container';\nimport SensitiveButtonContainer from '../containers/sensitive_button_container';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class UploadForm extends ImmutablePureComponent {\n\n static propTypes = {\n mediaIds: ImmutablePropTypes.list.isRequired,\n };\n\n render () {\n const { mediaIds } = this.props;\n\n return (\n <div className='compose-form__upload-wrapper'>\n <UploadProgressContainer icon='upload' message={<FormattedMessage id='upload_progress.label' defaultMessage='Uploading…' />} />\n\n <div className='compose-form__uploads-wrapper'>\n {mediaIds.map(id => (\n <UploadContainer id={id} key={id} />\n ))}\n </div>\n\n {!mediaIds.isEmpty() && <SensitiveButtonContainer />}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport UploadForm from '../components/upload_form';\n\nconst mapStateToProps = state => ({\n mediaIds: state.getIn(['compose', 'media_attachments']).map(item => item.get('id')),\n});\n\nexport default connect(mapStateToProps)(UploadForm);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Motion from '../../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\n\nexport default class Warning extends React.PureComponent {\n\n static propTypes = {\n message: PropTypes.node.isRequired,\n };\n\n render () {\n const { message } = this.props;\n\n return (\n <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>\n {({ opacity, scaleX, scaleY }) => (\n <div className='compose-form__warning' style={{ opacity: opacity, transform: `scale(${scaleX}, ${scaleY})` }}>\n {message}\n </div>\n )}\n </Motion>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport Warning from '../components/warning';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from 'react-intl';\nimport { me } from '../../../initial_state';\n\nconst APPROX_HASHTAG_RE = /(?:^|[^\\/\\)\\w])#(\\w*[a-zA-Z·]\\w*)/i;\n\nconst mapStateToProps = state => ({\n needsLockWarning: state.getIn(['compose', 'privacy']) === 'private' && !state.getIn(['accounts', me, 'locked']),\n hashtagWarning: state.getIn(['compose', 'privacy']) !== 'public' && APPROX_HASHTAG_RE.test(state.getIn(['compose', 'text'])),\n directMessageWarning: state.getIn(['compose', 'privacy']) === 'direct',\n});\n\nconst WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning }) => {\n if (needsLockWarning) {\n return <Warning message={<FormattedMessage id='compose_form.lock_disclaimer' defaultMessage='Your account is not {locked}. Anyone can follow you to view your follower-only posts.' values={{ locked: <a href='/user-settings'><FormattedMessage id='compose_form.lock_disclaimer.lock' defaultMessage='locked' /></a> }} />} />;\n }\n\n if (hashtagWarning) {\n return <Warning message={<FormattedMessage id='compose_form.hashtag_warning' defaultMessage=\"This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.\" />} />;\n }\n\n if (directMessageWarning) {\n const message = (\n <span>\n <FormattedMessage id='compose_form.direct_message_warning' defaultMessage='This toot will only be sent to all the mentioned users.' /> <a href='/terms' target='_blank'><FormattedMessage id='compose_form.direct_message_warning_learn_more' defaultMessage='Learn more' /></a>\n </span>\n );\n\n return <Warning message={message} />;\n }\n\n return null;\n};\n\nWarningWrapper.propTypes = {\n needsLockWarning: PropTypes.bool,\n hashtagWarning: PropTypes.bool,\n directMessageWarning: PropTypes.bool,\n};\n\nexport default connect(mapStateToProps)(WarningWrapper);\n","import React from 'react';\nimport CharacterCounter from './character_counter';\nimport Button from '../../../components/button';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport ReplyIndicatorContainer from '../containers/reply_indicator_container';\nimport AutosuggestTextarea from '../../../components/autosuggest_textarea';\nimport AutosuggestInput from '../../../components/autosuggest_input';\nimport PollButtonContainer from '../containers/poll_button_container';\nimport UploadButtonContainer from '../containers/upload_button_container';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport SpoilerButtonContainer from '../containers/spoiler_button_container';\nimport PrivacyDropdownContainer from '../containers/privacy_dropdown_container';\nimport EmojiPickerDropdown from '../containers/emoji_picker_dropdown_container';\nimport PollFormContainer from '../containers/poll_form_container';\nimport UploadFormContainer from '../containers/upload_form_container';\nimport WarningContainer from '../containers/warning_container';\nimport { isMobile } from '../../../is_mobile';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { length } from 'stringz';\nimport Icon from 'mastodon/components/icon';\nimport { maxChars } from '../../../initial_state';\n\nconst allowedAroundShortCode = '><\\u0085\\u0020\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029\\u0009\\u000a\\u000b\\u000c\\u000d';\n\nconst messages = defineMessages({\n placeholder: { id: 'compose_form.placeholder', defaultMessage: 'What is on your mind?' },\n spoiler_placeholder: { id: 'compose_form.spoiler_placeholder', defaultMessage: 'Write your warning here' },\n publish: { id: 'compose_form.publish', defaultMessage: 'Toot' },\n publishLoud: { id: 'compose_form.publish_loud', defaultMessage: '{publish}!' },\n});\n\nexport default @injectIntl\nclass ComposeForm extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n text: PropTypes.string.isRequired,\n suggestions: ImmutablePropTypes.list,\n spoiler: PropTypes.bool,\n privacy: PropTypes.string,\n spoilerText: PropTypes.string,\n focusDate: PropTypes.instanceOf(Date),\n caretPosition: PropTypes.number,\n preselectDate: PropTypes.instanceOf(Date),\n isSubmitting: PropTypes.bool,\n isChangingUpload: PropTypes.bool,\n isUploading: PropTypes.bool,\n onChange: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onClearSuggestions: PropTypes.func.isRequired,\n onFetchSuggestions: PropTypes.func.isRequired,\n onSuggestionSelected: PropTypes.func.isRequired,\n onChangeSpoilerText: PropTypes.func.isRequired,\n onPaste: PropTypes.func.isRequired,\n onPickEmoji: PropTypes.func.isRequired,\n showSearch: PropTypes.bool,\n anyMedia: PropTypes.bool,\n singleColumn: PropTypes.bool,\n };\n\n static defaultProps = {\n showSearch: false,\n };\n\n handleChange = (e) => {\n this.props.onChange(e.target.value);\n }\n\n handleKeyDown = (e) => {\n if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) {\n this.handleSubmit();\n }\n }\n\n handleSubmit = () => {\n if (this.props.text !== this.autosuggestTextarea.textarea.value) {\n // Something changed the text inside the textarea (e.g. browser extensions like Grammarly)\n // Update the state to match the current text\n this.props.onChange(this.autosuggestTextarea.textarea.value);\n }\n\n // Submit disabled:\n const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props;\n const fulltext = [this.props.spoilerText, this.props.text].join('');\n\n if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > maxChars || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) {\n return;\n }\n\n this.props.onSubmit(this.context.router ? this.context.router.history : null);\n }\n\n onSuggestionsClearRequested = () => {\n this.props.onClearSuggestions();\n }\n\n onSuggestionsFetchRequested = (token) => {\n this.props.onFetchSuggestions(token);\n }\n\n onSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['text']);\n }\n\n onSpoilerSuggestionSelected = (tokenStart, token, value) => {\n this.props.onSuggestionSelected(tokenStart, token, value, ['spoiler_text']);\n }\n\n handleChangeSpoilerText = (e) => {\n this.props.onChangeSpoilerText(e.target.value);\n }\n\n handleFocus = () => {\n if (this.composeForm && !this.props.singleColumn) {\n const { left, right } = this.composeForm.getBoundingClientRect();\n if (left < 0 || right > (window.innerWidth || document.documentElement.clientWidth)) {\n this.composeForm.scrollIntoView();\n }\n }\n }\n\n componentDidUpdate (prevProps) {\n // This statement does several things:\n // - If we're beginning a reply, and,\n // - Replying to zero or one users, places the cursor at the end of the textbox.\n // - Replying to more than one user, selects any usernames past the first;\n // this provides a convenient shortcut to drop everyone else from the conversation.\n if (this.props.focusDate !== prevProps.focusDate) {\n let selectionEnd, selectionStart;\n\n if (this.props.preselectDate !== prevProps.preselectDate) {\n selectionEnd = this.props.text.length;\n selectionStart = this.props.text.search(/\\s/) + 1;\n } else if (typeof this.props.caretPosition === 'number') {\n selectionStart = this.props.caretPosition;\n selectionEnd = this.props.caretPosition;\n } else {\n selectionEnd = this.props.text.length;\n selectionStart = selectionEnd;\n }\n\n this.autosuggestTextarea.textarea.setSelectionRange(selectionStart, selectionEnd);\n this.autosuggestTextarea.textarea.focus();\n } else if(prevProps.isSubmitting && !this.props.isSubmitting) {\n this.autosuggestTextarea.textarea.focus();\n } else if (this.props.spoiler !== prevProps.spoiler) {\n if (this.props.spoiler) {\n this.spoilerText.input.focus();\n } else {\n this.autosuggestTextarea.textarea.focus();\n }\n }\n }\n\n setAutosuggestTextarea = (c) => {\n this.autosuggestTextarea = c;\n }\n\n setSpoilerText = (c) => {\n this.spoilerText = c;\n }\n\n setRef = c => {\n this.composeForm = c;\n };\n\n handleEmojiPick = (data) => {\n const { text } = this.props;\n const position = this.autosuggestTextarea.textarea.selectionStart;\n const needsSpace = data.custom && position > 0 && !allowedAroundShortCode.includes(text[position - 1]);\n\n this.props.onPickEmoji(position, data, needsSpace);\n }\n\n render () {\n const { intl, onPaste, showSearch, anyMedia } = this.props;\n const disabled = this.props.isSubmitting;\n const text = [this.props.spoilerText, this.props.text].join('');\n const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > maxChars || (text.length !== 0 && text.trim().length === 0 && !anyMedia);\n let publishText = '';\n\n if (this.props.privacy === 'private' || this.props.privacy === 'direct') {\n publishText = <span className='compose-form__publish-private'><Icon id='lock' /> {intl.formatMessage(messages.publish)}</span>;\n } else {\n publishText = this.props.privacy !== 'unlisted' ? intl.formatMessage(messages.publishLoud, { publish: intl.formatMessage(messages.publish) }) : intl.formatMessage(messages.publish);\n }\n\n return (\n <div className='compose-form'>\n <WarningContainer />\n\n <ReplyIndicatorContainer />\n\n <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`} ref={this.setRef}>\n <AutosuggestInput\n placeholder={intl.formatMessage(messages.spoiler_placeholder)}\n value={this.props.spoilerText}\n onChange={this.handleChangeSpoilerText}\n onKeyDown={this.handleKeyDown}\n disabled={!this.props.spoiler}\n ref={this.setSpoilerText}\n suggestions={this.props.suggestions}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSpoilerSuggestionSelected}\n searchTokens={[':']}\n id='cw-spoiler-input'\n className='spoiler-input__input'\n />\n </div>\n\n <AutosuggestTextarea\n ref={this.setAutosuggestTextarea}\n placeholder={intl.formatMessage(messages.placeholder)}\n disabled={disabled}\n value={this.props.text}\n onChange={this.handleChange}\n suggestions={this.props.suggestions}\n onFocus={this.handleFocus}\n onKeyDown={this.handleKeyDown}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionSelected={this.onSuggestionSelected}\n onPaste={onPaste}\n autoFocus={!showSearch && !isMobile(window.innerWidth)}\n >\n <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} />\n <div className='compose-form__modifiers'>\n <UploadFormContainer />\n <PollFormContainer />\n </div>\n </AutosuggestTextarea>\n\n <div className='compose-form__buttons-wrapper'>\n <div className='compose-form__buttons'>\n <UploadButtonContainer />\n <PollButtonContainer />\n <PrivacyDropdownContainer />\n <SpoilerButtonContainer />\n </div>\n <div className='character-counter__wrapper'><CharacterCounter max={maxChars} text={text} /></div>\n </div>\n\n <div className='compose-form__publish'>\n <div className='compose-form__publish-button-wrapper'><Button text={publishText} onClick={this.handleSubmit} disabled={disabledButton} block /></div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ComposeForm from '../components/compose_form';\nimport {\n changeCompose,\n submitCompose,\n clearComposeSuggestions,\n fetchComposeSuggestions,\n selectComposeSuggestion,\n changeComposeSpoilerText,\n insertEmojiCompose,\n uploadCompose,\n} from '../../../actions/compose';\n\nconst mapStateToProps = state => ({\n text: state.getIn(['compose', 'text']),\n suggestions: state.getIn(['compose', 'suggestions']),\n spoiler: state.getIn(['compose', 'spoiler']),\n spoilerText: state.getIn(['compose', 'spoiler_text']),\n privacy: state.getIn(['compose', 'privacy']),\n focusDate: state.getIn(['compose', 'focusDate']),\n caretPosition: state.getIn(['compose', 'caretPosition']),\n preselectDate: state.getIn(['compose', 'preselectDate']),\n isSubmitting: state.getIn(['compose', 'is_submitting']),\n isChangingUpload: state.getIn(['compose', 'is_changing_upload']),\n isUploading: state.getIn(['compose', 'is_uploading']),\n showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),\n anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n\n onChange (text) {\n dispatch(changeCompose(text));\n },\n\n onSubmit (router) {\n dispatch(submitCompose(router));\n },\n\n onClearSuggestions () {\n dispatch(clearComposeSuggestions());\n },\n\n onFetchSuggestions (token) {\n dispatch(fetchComposeSuggestions(token));\n },\n\n onSuggestionSelected (position, token, suggestion, path) {\n dispatch(selectComposeSuggestion(position, token, suggestion, path));\n },\n\n onChangeSpoilerText (checked) {\n dispatch(changeComposeSpoilerText(checked));\n },\n\n onPaste (files) {\n dispatch(uploadCompose(files));\n },\n\n onPickEmoji (position, data, needsSpace) {\n dispatch(insertEmojiCompose(position, data, needsSpace));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ComposeForm);\n","import { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport NavigationBar from '../components/navigation_bar';\nimport { logOut } from 'mastodon/utils/log_out';\nimport { openModal } from 'mastodon/actions/modal';\nimport { me } from '../../../initial_state';\n\nconst messages = defineMessages({\n logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },\n logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },\n});\n\nconst mapStateToProps = state => {\n return {\n account: state.getIn(['accounts', me]),\n };\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n onLogout () {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.logoutMessage),\n confirm: intl.formatMessage(messages.logoutConfirm),\n onConfirm: () => logOut(),\n }));\n },\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(NavigationBar));\n","import React from 'react';\nimport ComposeFormContainer from './containers/compose_form_container';\nimport NavigationContainer from './containers/navigation_container';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport { mountCompose, unmountCompose } from '../../actions/compose';\nimport { Link } from 'react-router-dom';\nimport { injectIntl, defineMessages } from 'react-intl';\nimport SearchContainer from './containers/search_container';\nimport Motion from '../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\nimport SearchResultsContainer from './containers/search_results_container';\nimport { changeComposing } from '../../actions/compose';\nimport { openModal } from 'mastodon/actions/modal';\nimport { mascot } from '../../initial_state';\nimport Icon from 'mastodon/components/icon';\nimport { logOut } from 'mastodon/utils/log_out';\n\nconst messages = defineMessages({\n start: { id: 'getting_started.heading', defaultMessage: 'Getting started' },\n home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' },\n notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },\n public: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },\n community: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },\n preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },\n logout: { id: 'navigation_bar.logout', defaultMessage: 'Logout' },\n compose: { id: 'navigation_bar.compose', defaultMessage: 'Compose new toot' },\n logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },\n logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },\n});\n\nconst mapStateToProps = (state, ownProps) => ({\n columns: state.getIn(['settings', 'columns']),\n showSearch: ownProps.multiColumn ? state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']) : ownProps.isSearchPage,\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Compose extends React.PureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n columns: ImmutablePropTypes.list.isRequired,\n multiColumn: PropTypes.bool,\n showSearch: PropTypes.bool,\n isSearchPage: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n };\n\n componentDidMount () {\n const { isSearchPage } = this.props;\n\n if (!isSearchPage) {\n this.props.dispatch(mountCompose());\n }\n }\n\n componentWillUnmount () {\n const { isSearchPage } = this.props;\n\n if (!isSearchPage) {\n this.props.dispatch(unmountCompose());\n }\n }\n\n handleLogoutClick = e => {\n const { dispatch, intl } = this.props;\n\n e.preventDefault();\n e.stopPropagation();\n\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.logoutMessage),\n confirm: intl.formatMessage(messages.logoutConfirm),\n onConfirm: () => logOut(),\n }));\n\n return false;\n }\n\n onFocus = () => {\n this.props.dispatch(changeComposing(true));\n }\n\n onBlur = () => {\n this.props.dispatch(changeComposing(false));\n }\n\n render () {\n const { multiColumn, showSearch, isSearchPage, intl } = this.props;\n\n let header = '';\n\n if (multiColumn) {\n const { columns } = this.props;\n header = (\n <nav className='drawer__header'>\n <Link to='/getting-started' className='drawer__tab' title={intl.formatMessage(messages.start)} aria-label={intl.formatMessage(messages.start)}><Icon id='bars' fixedWidth /></Link>\n {!columns.some(column => column.get('id') === 'HOME') && (\n <Link to='/timelines/home' className='drawer__tab' title={intl.formatMessage(messages.home_timeline)} aria-label={intl.formatMessage(messages.home_timeline)}><Icon id='home' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'NOTIFICATIONS') && (\n <Link to='/notifications' className='drawer__tab' title={intl.formatMessage(messages.notifications)} aria-label={intl.formatMessage(messages.notifications)}><Icon id='bell' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'COMMUNITY') && (\n <Link to='/timelines/public/local' className='drawer__tab' title={intl.formatMessage(messages.community)} aria-label={intl.formatMessage(messages.community)}><Icon id='users' fixedWidth /></Link>\n )}\n {!columns.some(column => column.get('id') === 'PUBLIC') && (\n <Link to='/timelines/public' className='drawer__tab' title={intl.formatMessage(messages.public)} aria-label={intl.formatMessage(messages.public)}><Icon id='globe' fixedWidth /></Link>\n )}\n <a href='/user-settings' className='drawer__tab' title={intl.formatMessage(messages.preferences)} aria-label={intl.formatMessage(messages.preferences)}><Icon id='cog' fixedWidth /></a>\n <a href='/auth/sign_out' className='drawer__tab' title={intl.formatMessage(messages.logout)} aria-label={intl.formatMessage(messages.logout)} onClick={this.handleLogoutClick}><Icon id='sign-out' fixedWidth /></a>\n </nav>\n );\n }\n\n return (\n <div className='drawer' role='region' aria-label={intl.formatMessage(messages.compose)}>\n {header}\n\n {(multiColumn || isSearchPage) && <SearchContainer /> }\n\n <div className='drawer__pager'>\n {!isSearchPage && <div className='drawer__inner' onFocus={this.onFocus}>\n <NavigationContainer onClose={this.onBlur} />\n\n <ComposeFormContainer />\n\n mascot && ( <div className='drawer__inner__mastodon'>\n <img alt='' draggable='false' src={mascot} />\n </div> )\n </div>}\n\n <Motion defaultStyle={{ x: isSearchPage ? 0 : -100 }} style={{ x: spring(showSearch || isSearchPage ? 0 : -100, { stiffness: 210, damping: 20 }) }}>\n {({ x }) => (\n <div className='drawer__inner darker' style={{ transform: `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>\n <SearchResultsContainer />\n </div>\n )}\n </Motion>\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/direct_timeline.js b/priv/static/packs/features/direct_timeline.js
index 76620a29a..ff330c383 100644
--- a/priv/static/packs/features/direct_timeline.js
+++ b/priv/static/packs/features/direct_timeline.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{811:function(e,t,n){"use strict";n.r(t);var a,o,s,c=n(0),i=n(2),r=n(7),d=n(1),l=n(3),u=n.n(l),p=n(13),h=n(736),f=n(733),b=n(102),m=n(250),v=n(6),j=n(740),O=n(8),g=n(30),M=n(62),y=n.n(M),_=n(5),w=n.n(_),C=n(14),R=n.n(C),k=n(18),I=n(229),L=n(282),x=n(710),D=n(754),S=n(294),E=n(50),N=n(104),U=n(295),T=n(20),H=n(12),A=n.n(H),q=Object(v.f)({more:{id:"status.more",defaultMessage:"More"},open:{id:"conversation.open",defaultMessage:"View conversation"},reply:{id:"status.reply",defaultMessage:"Reply"},markAsRead:{id:"conversation.mark_as_read",defaultMessage:"Mark as read"},delete:{id:"conversation.delete",defaultMessage:"Delete conversation"},muteConversation:{id:"status.mute_conversation",defaultMessage:"Mute conversation"},unmuteConversation:{id:"status.unmute_conversation",defaultMessage:"Unmute conversation"}}),P=Object(v.g)((s=o=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(i.a)(t),"handleEmojiMouseEnter",(function(e){var t=e.target;t.src=t.getAttribute("data-original")})),Object(d.a)(Object(i.a)(t),"handleEmojiMouseLeave",(function(e){var t=e.target;t.src=t.getAttribute("data-static")})),Object(d.a)(Object(i.a)(t),"handleClick",(function(){if(t.context.router){var e=t.props,n=e.lastStatus,a=e.unread,o=e.markRead;a&&o(),t.context.router.history.push("/statuses/"+n.get("id"))}})),Object(d.a)(Object(i.a)(t),"handleMarkAsRead",(function(){t.props.markRead()})),Object(d.a)(Object(i.a)(t),"handleReply",(function(){t.props.reply(t.props.lastStatus,t.context.router.history)})),Object(d.a)(Object(i.a)(t),"handleDelete",(function(){t.props.delete()})),Object(d.a)(Object(i.a)(t),"handleHotkeyMoveUp",(function(){t.props.onMoveUp(t.props.conversationId)})),Object(d.a)(Object(i.a)(t),"handleHotkeyMoveDown",(function(){t.props.onMoveDown(t.props.conversationId)})),Object(d.a)(Object(i.a)(t),"handleConversationMute",(function(){t.props.onMute(t.props.lastStatus)})),Object(d.a)(Object(i.a)(t),"handleShowMore",(function(){t.props.onToggleHidden(t.props.lastStatus)})),Object(d.a)(Object(i.a)(t),"setNamesRef",(function(e){t.namesNode=e})),t}Object(r.a)(t,e);var n=t.prototype;return n._updateEmojis=function(){var e=this.namesNode;if(e&&!T.a)for(var t=e.querySelectorAll(".custom-emoji"),n=0;n<t.length;n++){var a=t[n];a.classList.contains("status-emoji")||(a.classList.add("status-emoji"),a.addEventListener("mouseenter",this.handleEmojiMouseEnter,!1),a.addEventListener("mouseleave",this.handleEmojiMouseLeave,!1))}},n.componentDidMount=function(){this._updateEmojis()},n.componentDidUpdate=function(){this._updateEmojis()},n.render=function(){var e=this.props,t=e.accounts,n=e.lastStatus,a=e.unread,o=e.intl;if(null===n)return null;var s=[{text:o.formatMessage(q.open),action:this.handleClick},null];s.push({text:o.formatMessage(n.get("muted")?q.unmuteConversation:q.muteConversation),action:this.handleConversationMute}),a&&(s.push({text:o.formatMessage(q.markAsRead),action:this.handleMarkAsRead}),s.push(null)),s.push({text:o.formatMessage(q.delete),action:this.handleDelete});var i=t.map((function(e){return Object(c.a)(S.a,{to:"/accounts/"+e.get("id"),href:e.get("url"),title:e.get("acct")},e.get("id"),Object(c.a)("bdi",{},void 0,Object(c.a)("strong",{className:"display-name__html",dangerouslySetInnerHTML:{__html:e.get("display_name_html")}})))})).reduce((function(e,t){return[e,", ",t]})),r={reply:this.handleReply,open:this.handleClick,moveUp:this.handleHotkeyMoveUp,moveDown:this.handleHotkeyMoveDown,toggleHidden:this.handleShowMore};return Object(c.a)(U.HotKeys,{handlers:r},void 0,Object(c.a)("div",{className:A()("conversation focusable muted",{"conversation--unread":a}),tabIndex:"0"},void 0,Object(c.a)("div",{className:"conversation__avatar"},void 0,Object(c.a)(D.a,{accounts:t,size:48})),Object(c.a)("div",{className:"conversation__content"},void 0,Object(c.a)("div",{className:"conversation__content__info"},void 0,Object(c.a)("div",{className:"conversation__content__relative-time"},void 0,a&&Object(c.a)("span",{className:"conversation__unread"})," ",Object(c.a)(N.default,{timestamp:n.get("created_at")})),u.a.createElement("div",{className:"conversation__content__names",ref:this.setNamesRef},Object(c.a)(v.b,{id:"conversation.with",defaultMessage:"With {names}",values:{names:Object(c.a)("span",{},void 0,i)}}))),Object(c.a)(I.a,{status:n,onClick:this.handleClick,expanded:!n.get("hidden"),onExpandedToggle:this.handleShowMore,collapsable:!0}),n.get("media_attachments").size>0&&Object(c.a)(L.a,{compact:!0,media:n.get("media_attachments")}),Object(c.a)("div",{className:"status__action-bar"},void 0,Object(c.a)(E.a,{className:"status__action-bar-button",title:o.formatMessage(q.reply),icon:"reply",onClick:this.handleReply}),Object(c.a)("div",{className:"status__action-bar-dropdown"},void 0,Object(c.a)(x.a,{status:n,items:s,icon:"ellipsis-h",size:18,direction:"right",title:o.formatMessage(q.more)}))))))},t}(k.a),Object(d.a)(o,"contextTypes",{router:w.a.object}),Object(d.a)(o,"propTypes",{conversationId:w.a.string.isRequired,accounts:R.a.list.isRequired,lastStatus:R.a.map,unread:w.a.bool.isRequired,onMoveUp:w.a.func,onMoveDown:w.a.func,markRead:w.a.func.isRequired,delete:w.a.func.isRequired,intl:w.a.object.isRequired}),a=s))||a,z=n(206),K=n(21),V=n(47),W=n(85),J=Object(v.f)({replyConfirm:{id:"confirmations.reply.confirm",defaultMessage:"Reply"},replyMessage:{id:"confirmations.reply.message",defaultMessage:"Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?"}}),F=Object(v.g)(Object(p.connect)((function(){var e=Object(z.f)();return function(t,n){var a=n.conversationId,o=t.getIn(["conversations","items"]).find((function(e){return e.get("id")===a})),s=o.get("last_status",null);return{accounts:o.get("accounts").map((function(e){return t.getIn(["accounts",e],null)})),unread:o.get("unread"),lastStatus:s&&e(t,{id:s})}}}),(function(e,t){var n=t.intl,a=t.conversationId;return{markRead:function(){e(Object(b.k)(a))},reply:function(t,a){e((function(o,s){0!==s().getIn(["compose","text"]).trim().length?e(Object(V.d)("CONFIRM",{message:n.formatMessage(J.replyMessage),confirm:n.formatMessage(J.replyConfirm),onConfirm:function(){return e(Object(K.gb)(t,a))}})):e(Object(K.gb)(t,a))}))},delete:function(){e(Object(b.i)(a))},onMute:function(t){t.get("muted")?e(Object(W.n)(t.get("id"))):e(Object(W.k)(t.get("id")))},onToggleHidden:function(t){t.get("hidden")?e(Object(W.l)(t.get("id"))):e(Object(W.j)(t.get("id")))}}}))(P)),Y=n(1023),B=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(i.a)(t),"getCurrentIndex",(function(e){return t.props.conversations.findIndex((function(t){return t.get("id")===e}))})),Object(d.a)(Object(i.a)(t),"handleMoveUp",(function(e){var n=t.getCurrentIndex(e)-1;t._selectChild(n,!0)})),Object(d.a)(Object(i.a)(t),"handleMoveDown",(function(e){var n=t.getCurrentIndex(e)+1;t._selectChild(n,!1)})),Object(d.a)(Object(i.a)(t),"setRef",(function(e){t.node=e})),Object(d.a)(Object(i.a)(t),"handleLoadOlder",y()((function(){var e=t.props.conversations.last();e&&e.get("last_status")&&t.props.onLoadMore(e.get("last_status"))}),300,{leading:!0})),t}Object(r.a)(t,e);var n=t.prototype;return n._selectChild=function(e,t){var n=this.node.node,a=n.querySelector("article:nth-of-type("+(e+1)+") .focusable");a&&(t&&n.scrollTop>a.offsetTop?a.scrollIntoView(!0):!t&&n.scrollTop+n.clientHeight<a.offsetTop+a.offsetHeight&&a.scrollIntoView(!1),a.focus())},n.render=function(){var e=this,t=this.props,n=t.conversations,a=t.onLoadMore,o=Object(g.default)(t,["conversations","onLoadMore"]);return u.a.createElement(Y.a,Object(O.default)({},o,{onLoadMore:a&&this.handleLoadOlder,scrollKey:"direct",ref:this.setRef}),n.map((function(t){return Object(c.a)(F,{conversationId:t.get("id"),onMoveUp:e.handleMoveUp,onMoveDown:e.handleMoveDown},t.get("id"))})))},t}(k.a);Object(d.a)(B,"propTypes",{conversations:R.a.list.isRequired,hasMore:w.a.bool,isLoading:w.a.bool,onLoadMore:w.a.func,shouldUpdateScroll:w.a.func});var G,Q=Object(p.connect)((function(e){return{conversations:e.getIn(["conversations","items"]),isLoading:e.getIn(["conversations","isLoading"],!0),hasMore:e.getIn(["conversations","hasMore"],!1)}}),(function(e){return{onLoadMore:function(t){return e(Object(b.j)({maxId:t}))}}}))(B);n.d(t,"default",(function(){return Z}));var X=Object(v.f)({title:{id:"column.direct",defaultMessage:"Direct messages"}}),Z=Object(p.connect)()(G=Object(v.g)(G=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(i.a)(t),"handlePin",(function(){var e=t.props,n=e.columnId,a=e.dispatch;a(n?Object(m.h)(n):Object(m.e)("DIRECT",{}))})),Object(d.a)(Object(i.a)(t),"handleMove",(function(e){var n=t.props,a=n.columnId;(0,n.dispatch)(Object(m.g)(a,e))})),Object(d.a)(Object(i.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(d.a)(Object(i.a)(t),"setRef",(function(e){t.column=e})),Object(d.a)(Object(i.a)(t),"handleLoadMore",(function(e){t.props.dispatch(Object(b.j)({maxId:e}))})),t}Object(r.a)(t,e);var n=t.prototype;return n.componentDidMount=function(){var e=this.props.dispatch;e(Object(b.l)()),e(Object(b.j)()),this.disconnect=e(Object(j.b)())},n.componentWillUnmount=function(){this.props.dispatch(Object(b.m)()),this.disconnect&&(this.disconnect(),this.disconnect=null)},n.render=function(){var e=this.props,t=e.intl,n=e.hasUnread,a=e.columnId,o=e.multiColumn,s=e.shouldUpdateScroll,i=!!a;return u.a.createElement(h.a,{bindToDocument:!o,ref:this.setRef,label:t.formatMessage(X.title)},Object(c.a)(f.a,{icon:"envelope",active:n,title:t.formatMessage(X.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:i,multiColumn:o}),Object(c.a)(Q,{trackScroll:!i,scrollKey:"direct_timeline-"+a,timelineId:"direct",onLoadMore:this.handleLoadMore,emptyMessage:Object(c.a)(v.b,{id:"empty_column.direct",defaultMessage:"You don't have any direct messages yet. When you send or receive one, it will show up here."}),shouldUpdateScroll:s}))},t}(u.a.PureComponent))||G)||G}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{837:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return Z}));var a,o,s,c=n(0),i=n(2),r=(n(9),n(6),n(8)),l=n(1),d=n(3),u=n.n(d),p=n(15),h=n(762),f=n(759),b=n(107),m=n(253),v=n(7),j=n(766),O=n(10),g=n(32),M=n(65),y=n.n(M),_=n(5),w=n.n(_),C=n(16),k=n.n(C),R=n(21),I=n(234),L=n(282),x=n(723),D=n(780),S=n(300),E=n(53),N=n(109),U=n(301),T=n(22),H=n(14),A=n.n(H);var q=Object(v.f)({more:{id:"status.more",defaultMessage:"More"},open:{id:"conversation.open",defaultMessage:"View conversation"},reply:{id:"status.reply",defaultMessage:"Reply"},markAsRead:{id:"conversation.mark_as_read",defaultMessage:"Mark as read"},delete:{id:"conversation.delete",defaultMessage:"Delete conversation"},muteConversation:{id:"status.mute_conversation",defaultMessage:"Mute conversation"},unmuteConversation:{id:"status.unmute_conversation",defaultMessage:"Unmute conversation"}}),P=Object(v.g)((s=o=function(e){Object(r.a)(n,e);var t;t=n;function n(){for(var t,n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];return t=e.call.apply(e,[this].concat(a))||this,Object(l.a)(Object(i.a)(t),"handleEmojiMouseEnter",(function(e){var t=e.target;t.src=t.getAttribute("data-original")})),Object(l.a)(Object(i.a)(t),"handleEmojiMouseLeave",(function(e){var t=e.target;t.src=t.getAttribute("data-static")})),Object(l.a)(Object(i.a)(t),"handleClick",(function(){if(t.context.router){var e=t.props,n=e.lastStatus,a=e.unread,o=e.markRead;a&&o(),t.context.router.history.push("/statuses/"+n.get("id"))}})),Object(l.a)(Object(i.a)(t),"handleMarkAsRead",(function(){t.props.markRead()})),Object(l.a)(Object(i.a)(t),"handleReply",(function(){t.props.reply(t.props.lastStatus,t.context.router.history)})),Object(l.a)(Object(i.a)(t),"handleDelete",(function(){t.props.delete()})),Object(l.a)(Object(i.a)(t),"handleHotkeyMoveUp",(function(){t.props.onMoveUp(t.props.conversationId)})),Object(l.a)(Object(i.a)(t),"handleHotkeyMoveDown",(function(){t.props.onMoveDown(t.props.conversationId)})),Object(l.a)(Object(i.a)(t),"handleConversationMute",(function(){t.props.onMute(t.props.lastStatus)})),Object(l.a)(Object(i.a)(t),"handleShowMore",(function(){t.props.onToggleHidden(t.props.lastStatus)})),Object(l.a)(Object(i.a)(t),"setNamesRef",(function(e){t.namesNode=e})),t}var a=n.prototype;return a._updateEmojis=function(){var e=this.namesNode;if(e&&!T.a)for(var t=e.querySelectorAll(".custom-emoji"),n=0;n<t.length;n++){var a=t[n];a.classList.contains("status-emoji")||(a.classList.add("status-emoji"),a.addEventListener("mouseenter",this.handleEmojiMouseEnter,!1),a.addEventListener("mouseleave",this.handleEmojiMouseLeave,!1))}},a.componentDidMount=function(){this._updateEmojis()},a.componentDidUpdate=function(){this._updateEmojis()},a.render=function(){var e=this.props,t=e.accounts,n=e.lastStatus,a=e.unread,o=e.intl;if(null===n)return null;var s=[{text:o.formatMessage(q.open),action:this.handleClick},null];s.push({text:o.formatMessage(n.get("muted")?q.unmuteConversation:q.muteConversation),action:this.handleConversationMute}),a&&(s.push({text:o.formatMessage(q.markAsRead),action:this.handleMarkAsRead}),s.push(null)),s.push({text:o.formatMessage(q.delete),action:this.handleDelete});var i=t.map((function(e){return Object(c.a)(S.a,{to:"/accounts/"+e.get("id"),href:e.get("url"),title:e.get("acct")},e.get("id"),Object(c.a)("bdi",{},void 0,Object(c.a)("strong",{className:"display-name__html",dangerouslySetInnerHTML:{__html:e.get("display_name_html")}})))})).reduce((function(e,t){return[e,", ",t]})),r={reply:this.handleReply,open:this.handleClick,moveUp:this.handleHotkeyMoveUp,moveDown:this.handleHotkeyMoveDown,toggleHidden:this.handleShowMore};return Object(c.a)(U.HotKeys,{handlers:r},void 0,Object(c.a)("div",{className:A()("conversation focusable muted",{"conversation--unread":a}),tabIndex:"0"},void 0,Object(c.a)("div",{className:"conversation__avatar",onClick:this.handleClick,role:"presentation"},void 0,Object(c.a)(D.a,{accounts:t,size:48})),Object(c.a)("div",{className:"conversation__content"},void 0,Object(c.a)("div",{className:"conversation__content__info"},void 0,Object(c.a)("div",{className:"conversation__content__relative-time"},void 0,a&&Object(c.a)("span",{className:"conversation__unread"})," ",Object(c.a)(N.default,{timestamp:n.get("created_at")})),u.a.createElement("div",{className:"conversation__content__names",ref:this.setNamesRef},Object(c.a)(v.b,{id:"conversation.with",defaultMessage:"With {names}",values:{names:Object(c.a)("span",{},void 0,i)}}))),Object(c.a)(I.a,{status:n,onClick:this.handleClick,expanded:!n.get("hidden"),onExpandedToggle:this.handleShowMore,collapsable:!0}),n.get("media_attachments").size>0&&Object(c.a)(L.a,{compact:!0,media:n.get("media_attachments")}),Object(c.a)("div",{className:"status__action-bar"},void 0,Object(c.a)(E.a,{className:"status__action-bar-button",title:o.formatMessage(q.reply),icon:"reply",onClick:this.handleReply}),Object(c.a)("div",{className:"status__action-bar-dropdown"},void 0,Object(c.a)(x.a,{status:n,items:s,icon:"ellipsis-h",size:18,direction:"right",title:o.formatMessage(q.more)}))))))},n}(R.a),Object(l.a)(o,"contextTypes",{router:w.a.object}),Object(l.a)(o,"propTypes",{conversationId:w.a.string.isRequired,accounts:k.a.list.isRequired,lastStatus:k.a.map,unread:w.a.bool.isRequired,onMoveUp:w.a.func,onMoveDown:w.a.func,markRead:w.a.func.isRequired,delete:w.a.func.isRequired,intl:w.a.object.isRequired}),a=s))||a,z=n(210),K=n(23),V=n(48),W=n(89),J=Object(v.f)({replyConfirm:{id:"confirmations.reply.confirm",defaultMessage:"Reply"},replyMessage:{id:"confirmations.reply.message",defaultMessage:"Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?"}}),F=Object(v.g)(Object(p.connect)((function(){var e=Object(z.f)();return function(t,n){var a=n.conversationId,o=t.getIn(["conversations","items"]).find((function(e){return e.get("id")===a})),s=o.get("last_status",null);return{accounts:o.get("accounts").map((function(e){return t.getIn(["accounts",e],null)})),unread:o.get("unread"),lastStatus:s&&e(t,{id:s})}}}),(function(e,t){var n=t.intl,a=t.conversationId;return{markRead:function(){e(Object(b.k)(a))},reply:function(t,a){e((function(o,s){0!==s().getIn(["compose","text"]).trim().length?e(Object(V.d)("CONFIRM",{message:n.formatMessage(J.replyMessage),confirm:n.formatMessage(J.replyConfirm),onConfirm:function(){return e(Object(K.gb)(t,a))}})):e(Object(K.gb)(t,a))}))},delete:function(){e(Object(b.i)(a))},onMute:function(t){t.get("muted")?e(Object(W.n)(t.get("id"))):e(Object(W.k)(t.get("id")))},onToggleHidden:function(t){t.get("hidden")?e(Object(W.l)(t.get("id"))):e(Object(W.j)(t.get("id")))}}}))(P)),Y=n(1049);var B=function(e){Object(r.a)(n,e);var t;t=n;function n(){for(var t,n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];return t=e.call.apply(e,[this].concat(a))||this,Object(l.a)(Object(i.a)(t),"getCurrentIndex",(function(e){return t.props.conversations.findIndex((function(t){return t.get("id")===e}))})),Object(l.a)(Object(i.a)(t),"handleMoveUp",(function(e){var n=t.getCurrentIndex(e)-1;t._selectChild(n,!0)})),Object(l.a)(Object(i.a)(t),"handleMoveDown",(function(e){var n=t.getCurrentIndex(e)+1;t._selectChild(n,!1)})),Object(l.a)(Object(i.a)(t),"setRef",(function(e){t.node=e})),Object(l.a)(Object(i.a)(t),"handleLoadOlder",y()((function(){var e=t.props.conversations.last();e&&e.get("last_status")&&t.props.onLoadMore(e.get("last_status"))}),300,{leading:!0})),t}var a=n.prototype;return a._selectChild=function(e,t){var n=this.node.node,a=n.querySelector("article:nth-of-type("+(e+1)+") .focusable");a&&(t&&n.scrollTop>a.offsetTop?a.scrollIntoView(!0):!t&&n.scrollTop+n.clientHeight<a.offsetTop+a.offsetHeight&&a.scrollIntoView(!1),a.focus())},a.render=function(){var e=this,t=this.props,n=t.conversations,a=t.onLoadMore,o=Object(g.default)(t,["conversations","onLoadMore"]);return u.a.createElement(Y.a,Object(O.default)({},o,{onLoadMore:a&&this.handleLoadOlder,scrollKey:"direct",ref:this.setRef}),n.map((function(t){return Object(c.a)(F,{conversationId:t.get("id"),onMoveUp:e.handleMoveUp,onMoveDown:e.handleMoveDown},t.get("id"))})))},n}(R.a);Object(l.a)(B,"propTypes",{conversations:k.a.list.isRequired,hasMore:w.a.bool,isLoading:w.a.bool,onLoadMore:w.a.func,shouldUpdateScroll:w.a.func});var G,Q=Object(p.connect)((function(e){return{conversations:e.getIn(["conversations","items"]),isLoading:e.getIn(["conversations","isLoading"],!0),hasMore:e.getIn(["conversations","hasMore"],!1)}}),(function(e){return{onLoadMore:function(t){return e(Object(b.j)({maxId:t}))}}}))(B);var X=Object(v.f)({title:{id:"column.direct",defaultMessage:"Direct messages"}}),Z=Object(p.connect)()(G=Object(v.g)(G=function(e){Object(r.a)(n,e);var t;t=n;function n(){for(var t,n=arguments.length,a=new Array(n),o=0;o<n;o++)a[o]=arguments[o];return t=e.call.apply(e,[this].concat(a))||this,Object(l.a)(Object(i.a)(t),"handlePin",(function(){var e=t.props,n=e.columnId,a=e.dispatch;a(n?Object(m.h)(n):Object(m.e)("DIRECT",{}))})),Object(l.a)(Object(i.a)(t),"handleMove",(function(e){var n=t.props,a=n.columnId;(0,n.dispatch)(Object(m.g)(a,e))})),Object(l.a)(Object(i.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(l.a)(Object(i.a)(t),"setRef",(function(e){t.column=e})),Object(l.a)(Object(i.a)(t),"handleLoadMore",(function(e){t.props.dispatch(Object(b.j)({maxId:e}))})),t}var a=n.prototype;return a.componentDidMount=function(){var e=this.props.dispatch;e(Object(b.l)()),e(Object(b.j)()),this.disconnect=e(Object(j.b)())},a.componentWillUnmount=function(){this.props.dispatch(Object(b.m)()),this.disconnect&&(this.disconnect(),this.disconnect=null)},a.render=function(){var e=this.props,t=e.intl,n=e.hasUnread,a=e.columnId,o=e.multiColumn,s=e.shouldUpdateScroll,i=!!a;return u.a.createElement(h.a,{bindToDocument:!o,ref:this.setRef,label:t.formatMessage(X.title)},Object(c.a)(f.a,{icon:"envelope",active:n,title:t.formatMessage(X.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:i,multiColumn:o}),Object(c.a)(Q,{trackScroll:!i,scrollKey:"direct_timeline-"+a,timelineId:"direct",onLoadMore:this.handleLoadMore,emptyMessage:Object(c.a)(v.b,{id:"empty_column.direct",defaultMessage:"You don't have any direct messages yet. When you send or receive one, it will show up here."}),shouldUpdateScroll:s}))},n}(u.a.PureComponent))||G)||G}}]);
//# sourceMappingURL=direct_timeline.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/direct_timeline.js.map b/priv/static/packs/features/direct_timeline.js.map
index d0ef3c943..fd6845a06 100644
--- a/priv/static/packs/features/direct_timeline.js.map
+++ b/priv/static/packs/features/direct_timeline.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/components/conversation.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/containers/conversations_list_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/index.js"],"names":["messages","defineMessages","more","open","reply","markAsRead","delete","muteConversation","unmuteConversation","Conversation","injectIntl","target","src","getAttribute","context","router","props","lastStatus","unread","markRead","history","push","get","onMoveUp","conversationId","onMoveDown","onMute","onToggleHidden","c","namesNode","_updateEmojis","node","this","autoPlayGif","emojis","querySelectorAll","i","length","emoji","classList","contains","add","addEventListener","handleEmojiMouseEnter","handleEmojiMouseLeave","componentDidMount","componentDidUpdate","render","accounts","intl","menu","text","formatMessage","action","handleClick","handleConversationMute","handleMarkAsRead","handleDelete","names","map","a","to","href","title","className","dangerouslySetInnerHTML","__html","reduce","prev","cur","handlers","handleReply","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","toggleHidden","handleShowMore","classNames","tabIndex","size","timestamp","ref","setNamesRef","id","defaultMessage","values","status","onClick","expanded","onExpandedToggle","collapsable","compact","media","icon","items","direction","ImmutablePureComponent","PropTypes","object","string","isRequired","ImmutablePropTypes","list","bool","func","replyConfirm","replyMessage","connect","getStatus","makeGetStatus","state","conversation","getIn","find","x","lastStatusId","accountId","dispatch","markConversationRead","_","getState","trim","openModal","message","confirm","onConfirm","replyCompose","deleteConversation","unmuteStatus","muteStatus","revealStatus","hideStatus","ConversationsList","conversations","findIndex","elementIndex","getCurrentIndex","_selectChild","last","onLoadMore","leading","index","align_top","container","element","querySelector","scrollTop","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","other","handleLoadOlder","scrollKey","setRef","item","handleMoveUp","handleMoveDown","hasMore","isLoading","shouldUpdateScroll","maxId","expandConversations","DirectTimeline","columnId","removeColumn","addColumn","dir","moveColumn","column","mountConversations","disconnect","connectDirectStream","componentWillUnmount","unmountConversations","hasUnread","multiColumn","pinned","bindToDocument","label","active","onPin","handlePin","onMove","handleMove","handleHeaderClick","trackScroll","timelineId","handleLoadMore","emptyMessage","React","PureComponent"],"mappings":"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","file":"features/direct_timeline.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport StatusContent from 'mastodon/components/status_content';\nimport AttachmentList from 'mastodon/components/attachment_list';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';\nimport AvatarComposite from 'mastodon/components/avatar_composite';\nimport Permalink from 'mastodon/components/permalink';\nimport IconButton from 'mastodon/components/icon_button';\nimport RelativeTimestamp from 'mastodon/components/relative_timestamp';\nimport { HotKeys } from 'react-hotkeys';\nimport { autoPlayGif } from 'mastodon/initial_state';\nimport classNames from 'classnames';\n\nconst messages = defineMessages({\n more: { id: 'status.more', defaultMessage: 'More' },\n open: { id: 'conversation.open', defaultMessage: 'View conversation' },\n reply: { id: 'status.reply', defaultMessage: 'Reply' },\n markAsRead: { id: 'conversation.mark_as_read', defaultMessage: 'Mark as read' },\n delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' },\n muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },\n unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },\n});\n\nexport default @injectIntl\nclass Conversation extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n conversationId: PropTypes.string.isRequired,\n accounts: ImmutablePropTypes.list.isRequired,\n lastStatus: ImmutablePropTypes.map,\n unread:PropTypes.bool.isRequired,\n onMoveUp: PropTypes.func,\n onMoveDown: PropTypes.func,\n markRead: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n _updateEmojis () {\n const node = this.namesNode;\n\n if (!node || autoPlayGif) {\n return;\n }\n\n const emojis = node.querySelectorAll('.custom-emoji');\n\n for (var i = 0; i < emojis.length; i++) {\n let emoji = emojis[i];\n if (emoji.classList.contains('status-emoji')) {\n continue;\n }\n emoji.classList.add('status-emoji');\n\n emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);\n emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);\n }\n }\n\n componentDidMount () {\n this._updateEmojis();\n }\n\n componentDidUpdate () {\n this._updateEmojis();\n }\n\n handleEmojiMouseEnter = ({ target }) => {\n target.src = target.getAttribute('data-original');\n }\n\n handleEmojiMouseLeave = ({ target }) => {\n target.src = target.getAttribute('data-static');\n }\n\n handleClick = () => {\n if (!this.context.router) {\n return;\n }\n\n const { lastStatus, unread, markRead } = this.props;\n\n if (unread) {\n markRead();\n }\n\n this.context.router.history.push(`/statuses/${lastStatus.get('id')}`);\n }\n\n handleMarkAsRead = () => {\n this.props.markRead();\n }\n\n handleReply = () => {\n this.props.reply(this.props.lastStatus, this.context.router.history);\n }\n\n handleDelete = () => {\n this.props.delete();\n }\n\n handleHotkeyMoveUp = () => {\n this.props.onMoveUp(this.props.conversationId);\n }\n\n handleHotkeyMoveDown = () => {\n this.props.onMoveDown(this.props.conversationId);\n }\n\n handleConversationMute = () => {\n this.props.onMute(this.props.lastStatus);\n }\n\n handleShowMore = () => {\n this.props.onToggleHidden(this.props.lastStatus);\n }\n\n setNamesRef = (c) => {\n this.namesNode = c;\n }\n\n render () {\n const { accounts, lastStatus, unread, intl } = this.props;\n\n if (lastStatus === null) {\n return null;\n }\n\n const menu = [\n { text: intl.formatMessage(messages.open), action: this.handleClick },\n null,\n ];\n\n menu.push({ text: intl.formatMessage(lastStatus.get('muted') ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMute });\n\n if (unread) {\n menu.push({ text: intl.formatMessage(messages.markAsRead), action: this.handleMarkAsRead });\n menu.push(null);\n }\n\n menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete });\n\n const names = accounts.map(a => <Permalink to={`/accounts/${a.get('id')}`} href={a.get('url')} key={a.get('id')} title={a.get('acct')}><bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi></Permalink>).reduce((prev, cur) => [prev, ', ', cur]);\n\n const handlers = {\n reply: this.handleReply,\n open: this.handleClick,\n moveUp: this.handleHotkeyMoveUp,\n moveDown: this.handleHotkeyMoveDown,\n toggleHidden: this.handleShowMore,\n };\n\n return (\n <HotKeys handlers={handlers}>\n <div className={classNames('conversation focusable muted', { 'conversation--unread': unread })} tabIndex='0'>\n <div className='conversation__avatar'>\n <AvatarComposite accounts={accounts} size={48} />\n </div>\n\n <div className='conversation__content'>\n <div className='conversation__content__info'>\n <div className='conversation__content__relative-time'>\n {unread && <span className='conversation__unread' />} <RelativeTimestamp timestamp={lastStatus.get('created_at')} />\n </div>\n\n <div className='conversation__content__names' ref={this.setNamesRef}>\n <FormattedMessage id='conversation.with' defaultMessage='With {names}' values={{ names: <span>{names}</span> }} />\n </div>\n </div>\n\n <StatusContent\n status={lastStatus}\n onClick={this.handleClick}\n expanded={!lastStatus.get('hidden')}\n onExpandedToggle={this.handleShowMore}\n collapsable\n />\n\n {lastStatus.get('media_attachments').size > 0 && (\n <AttachmentList\n compact\n media={lastStatus.get('media_attachments')}\n />\n )}\n\n <div className='status__action-bar'>\n <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.reply)} icon='reply' onClick={this.handleReply} />\n\n <div className='status__action-bar-dropdown'>\n <DropdownMenuContainer status={lastStatus} items={menu} icon='ellipsis-h' size={18} direction='right' title={intl.formatMessage(messages.more)} />\n </div>\n </div>\n </div>\n </div>\n </HotKeys>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport Conversation from '../components/conversation';\nimport { markConversationRead, deleteConversation } from 'mastodon/actions/conversations';\nimport { makeGetStatus } from 'mastodon/selectors';\nimport { replyCompose } from 'mastodon/actions/compose';\nimport { openModal } from 'mastodon/actions/modal';\nimport { muteStatus, unmuteStatus, hideStatus, revealStatus } from 'mastodon/actions/statuses';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },\n replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },\n});\n\nconst mapStateToProps = () => {\n const getStatus = makeGetStatus();\n\n return (state, { conversationId }) => {\n const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId);\n const lastStatusId = conversation.get('last_status', null);\n\n return {\n accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)),\n unread: conversation.get('unread'),\n lastStatus: lastStatusId && getStatus(state, { id: lastStatusId }),\n };\n };\n};\n\nconst mapDispatchToProps = (dispatch, { intl, conversationId }) => ({\n\n markRead () {\n dispatch(markConversationRead(conversationId));\n },\n\n reply (status, router) {\n dispatch((_, getState) => {\n let state = getState();\n\n if (state.getIn(['compose', 'text']).trim().length !== 0) {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.replyMessage),\n confirm: intl.formatMessage(messages.replyConfirm),\n onConfirm: () => dispatch(replyCompose(status, router)),\n }));\n } else {\n dispatch(replyCompose(status, router));\n }\n });\n },\n\n delete () {\n dispatch(deleteConversation(conversationId));\n },\n\n onMute (status) {\n if (status.get('muted')) {\n dispatch(unmuteStatus(status.get('id')));\n } else {\n dispatch(muteStatus(status.get('id')));\n }\n },\n\n onToggleHidden (status) {\n if (status.get('hidden')) {\n dispatch(revealStatus(status.get('id')));\n } else {\n dispatch(hideStatus(status.get('id')));\n }\n },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Conversation));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ConversationContainer from '../containers/conversation_container';\nimport ScrollableList from '../../../components/scrollable_list';\nimport { debounce } from 'lodash';\n\nexport default class ConversationsList extends ImmutablePureComponent {\n\n static propTypes = {\n conversations: ImmutablePropTypes.list.isRequired,\n hasMore: PropTypes.bool,\n isLoading: PropTypes.bool,\n onLoadMore: PropTypes.func,\n shouldUpdateScroll: PropTypes.func,\n };\n\n getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id)\n\n handleMoveUp = id => {\n const elementIndex = this.getCurrentIndex(id) - 1;\n this._selectChild(elementIndex, true);\n }\n\n handleMoveDown = id => {\n const elementIndex = this.getCurrentIndex(id) + 1;\n this._selectChild(elementIndex, false);\n }\n\n _selectChild (index, align_top) {\n const container = this.node.node;\n const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`);\n\n if (element) {\n if (align_top && container.scrollTop > element.offsetTop) {\n element.scrollIntoView(true);\n } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n element.scrollIntoView(false);\n }\n element.focus();\n }\n }\n\n setRef = c => {\n this.node = c;\n }\n\n handleLoadOlder = debounce(() => {\n const last = this.props.conversations.last();\n\n if (last && last.get('last_status')) {\n this.props.onLoadMore(last.get('last_status'));\n }\n }, 300, { leading: true })\n\n render () {\n const { conversations, onLoadMore, ...other } = this.props;\n\n return (\n <ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} scrollKey='direct' ref={this.setRef}>\n {conversations.map(item => (\n <ConversationContainer\n key={item.get('id')}\n conversationId={item.get('id')}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n />\n ))}\n </ScrollableList>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ConversationsList from '../components/conversations_list';\nimport { expandConversations } from '../../../actions/conversations';\n\nconst mapStateToProps = state => ({\n conversations: state.getIn(['conversations', 'items']),\n isLoading: state.getIn(['conversations', 'isLoading'], true),\n hasMore: state.getIn(['conversations', 'hasMore'], false),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onLoadMore: maxId => dispatch(expandConversations({ maxId })),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ConversationsList);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { mountConversations, unmountConversations, expandConversations } from '../../actions/conversations';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport { connectDirectStream } from '../../actions/streaming';\nimport ConversationsListContainer from './containers/conversations_list_container';\n\nconst messages = defineMessages({\n title: { id: 'column.direct', defaultMessage: 'Direct messages' },\n});\n\nexport default @connect()\n@injectIntl\nclass DirectTimeline extends React.PureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n intl: PropTypes.object.isRequired,\n hasUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('DIRECT', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n\n dispatch(mountConversations());\n dispatch(expandConversations());\n this.disconnect = dispatch(connectDirectStream());\n }\n\n componentWillUnmount () {\n this.props.dispatch(unmountConversations());\n\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandConversations({ maxId }));\n }\n\n render () {\n const { intl, hasUnread, columnId, multiColumn, shouldUpdateScroll } = this.props;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='envelope'\n active={hasUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n />\n\n <ConversationsListContainer\n trackScroll={!pinned}\n scrollKey={`direct_timeline-${columnId}`}\n timelineId='direct'\n onLoadMore={this.handleLoadMore}\n emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage=\"You don't have any direct messages yet. When you send or receive one, it will show up here.\" />}\n shouldUpdateScroll={shouldUpdateScroll}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/components/conversation.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/containers/conversation_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/components/conversations_list.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/containers/conversations_list_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/direct_timeline/index.js"],"names":["messages","defineMessages","more","open","reply","markAsRead","delete","muteConversation","unmuteConversation","Conversation","injectIntl","target","src","getAttribute","context","router","props","lastStatus","unread","markRead","history","push","get","onMoveUp","conversationId","onMoveDown","onMute","onToggleHidden","c","namesNode","_updateEmojis","node","this","autoPlayGif","emojis","querySelectorAll","i","length","emoji","classList","contains","add","addEventListener","handleEmojiMouseEnter","handleEmojiMouseLeave","componentDidMount","componentDidUpdate","render","accounts","intl","menu","text","formatMessage","action","handleClick","handleConversationMute","handleMarkAsRead","handleDelete","names","map","a","to","href","title","className","dangerouslySetInnerHTML","__html","reduce","prev","cur","handlers","handleReply","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","toggleHidden","handleShowMore","classNames","tabIndex","onClick","role","size","timestamp","ref","setNamesRef","id","defaultMessage","values","status","expanded","onExpandedToggle","collapsable","compact","media","icon","items","direction","ImmutablePureComponent","PropTypes","object","string","isRequired","ImmutablePropTypes","list","bool","func","replyConfirm","replyMessage","connect","getStatus","makeGetStatus","state","conversation","getIn","find","x","lastStatusId","accountId","dispatch","markConversationRead","_","getState","trim","openModal","message","confirm","onConfirm","replyCompose","deleteConversation","unmuteStatus","muteStatus","revealStatus","hideStatus","ConversationsList","conversations","findIndex","elementIndex","getCurrentIndex","_selectChild","last","onLoadMore","leading","index","align_top","container","element","querySelector","scrollTop","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","other","handleLoadOlder","scrollKey","setRef","item","handleMoveUp","handleMoveDown","hasMore","isLoading","shouldUpdateScroll","maxId","expandConversations","DirectTimeline","columnId","removeColumn","addColumn","dir","moveColumn","column","mountConversations","disconnect","connectDirectStream","componentWillUnmount","unmountConversations","hasUnread","multiColumn","pinned","bindToDocument","label","active","onPin","handlePin","onMove","handleMove","handleHeaderClick","trackScroll","timelineId","handleLoadMore","emptyMessage","React","PureComponent"],"mappings":"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","file":"features/direct_timeline.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport StatusContent from 'mastodon/components/status_content';\nimport AttachmentList from 'mastodon/components/attachment_list';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';\nimport AvatarComposite from 'mastodon/components/avatar_composite';\nimport Permalink from 'mastodon/components/permalink';\nimport IconButton from 'mastodon/components/icon_button';\nimport RelativeTimestamp from 'mastodon/components/relative_timestamp';\nimport { HotKeys } from 'react-hotkeys';\nimport { autoPlayGif } from 'mastodon/initial_state';\nimport classNames from 'classnames';\n\nconst messages = defineMessages({\n more: { id: 'status.more', defaultMessage: 'More' },\n open: { id: 'conversation.open', defaultMessage: 'View conversation' },\n reply: { id: 'status.reply', defaultMessage: 'Reply' },\n markAsRead: { id: 'conversation.mark_as_read', defaultMessage: 'Mark as read' },\n delete: { id: 'conversation.delete', defaultMessage: 'Delete conversation' },\n muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },\n unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },\n});\n\nexport default @injectIntl\nclass Conversation extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n conversationId: PropTypes.string.isRequired,\n accounts: ImmutablePropTypes.list.isRequired,\n lastStatus: ImmutablePropTypes.map,\n unread:PropTypes.bool.isRequired,\n onMoveUp: PropTypes.func,\n onMoveDown: PropTypes.func,\n markRead: PropTypes.func.isRequired,\n delete: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n _updateEmojis () {\n const node = this.namesNode;\n\n if (!node || autoPlayGif) {\n return;\n }\n\n const emojis = node.querySelectorAll('.custom-emoji');\n\n for (var i = 0; i < emojis.length; i++) {\n let emoji = emojis[i];\n if (emoji.classList.contains('status-emoji')) {\n continue;\n }\n emoji.classList.add('status-emoji');\n\n emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);\n emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);\n }\n }\n\n componentDidMount () {\n this._updateEmojis();\n }\n\n componentDidUpdate () {\n this._updateEmojis();\n }\n\n handleEmojiMouseEnter = ({ target }) => {\n target.src = target.getAttribute('data-original');\n }\n\n handleEmojiMouseLeave = ({ target }) => {\n target.src = target.getAttribute('data-static');\n }\n\n handleClick = () => {\n if (!this.context.router) {\n return;\n }\n\n const { lastStatus, unread, markRead } = this.props;\n\n if (unread) {\n markRead();\n }\n\n this.context.router.history.push(`/statuses/${lastStatus.get('id')}`);\n }\n\n handleMarkAsRead = () => {\n this.props.markRead();\n }\n\n handleReply = () => {\n this.props.reply(this.props.lastStatus, this.context.router.history);\n }\n\n handleDelete = () => {\n this.props.delete();\n }\n\n handleHotkeyMoveUp = () => {\n this.props.onMoveUp(this.props.conversationId);\n }\n\n handleHotkeyMoveDown = () => {\n this.props.onMoveDown(this.props.conversationId);\n }\n\n handleConversationMute = () => {\n this.props.onMute(this.props.lastStatus);\n }\n\n handleShowMore = () => {\n this.props.onToggleHidden(this.props.lastStatus);\n }\n\n setNamesRef = (c) => {\n this.namesNode = c;\n }\n\n render () {\n const { accounts, lastStatus, unread, intl } = this.props;\n\n if (lastStatus === null) {\n return null;\n }\n\n const menu = [\n { text: intl.formatMessage(messages.open), action: this.handleClick },\n null,\n ];\n\n menu.push({ text: intl.formatMessage(lastStatus.get('muted') ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMute });\n\n if (unread) {\n menu.push({ text: intl.formatMessage(messages.markAsRead), action: this.handleMarkAsRead });\n menu.push(null);\n }\n\n menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete });\n\n const names = accounts.map(a => <Permalink to={`/accounts/${a.get('id')}`} href={a.get('url')} key={a.get('id')} title={a.get('acct')}><bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi></Permalink>).reduce((prev, cur) => [prev, ', ', cur]);\n\n const handlers = {\n reply: this.handleReply,\n open: this.handleClick,\n moveUp: this.handleHotkeyMoveUp,\n moveDown: this.handleHotkeyMoveDown,\n toggleHidden: this.handleShowMore,\n };\n\n return (\n <HotKeys handlers={handlers}>\n <div className={classNames('conversation focusable muted', { 'conversation--unread': unread })} tabIndex='0'>\n <div className='conversation__avatar' onClick={this.handleClick} role='presentation'>\n <AvatarComposite accounts={accounts} size={48} />\n </div>\n\n <div className='conversation__content'>\n <div className='conversation__content__info'>\n <div className='conversation__content__relative-time'>\n {unread && <span className='conversation__unread' />} <RelativeTimestamp timestamp={lastStatus.get('created_at')} />\n </div>\n\n <div className='conversation__content__names' ref={this.setNamesRef}>\n <FormattedMessage id='conversation.with' defaultMessage='With {names}' values={{ names: <span>{names}</span> }} />\n </div>\n </div>\n\n <StatusContent\n status={lastStatus}\n onClick={this.handleClick}\n expanded={!lastStatus.get('hidden')}\n onExpandedToggle={this.handleShowMore}\n collapsable\n />\n\n {lastStatus.get('media_attachments').size > 0 && (\n <AttachmentList\n compact\n media={lastStatus.get('media_attachments')}\n />\n )}\n\n <div className='status__action-bar'>\n <IconButton className='status__action-bar-button' title={intl.formatMessage(messages.reply)} icon='reply' onClick={this.handleReply} />\n\n <div className='status__action-bar-dropdown'>\n <DropdownMenuContainer status={lastStatus} items={menu} icon='ellipsis-h' size={18} direction='right' title={intl.formatMessage(messages.more)} />\n </div>\n </div>\n </div>\n </div>\n </HotKeys>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport Conversation from '../components/conversation';\nimport { markConversationRead, deleteConversation } from 'mastodon/actions/conversations';\nimport { makeGetStatus } from 'mastodon/selectors';\nimport { replyCompose } from 'mastodon/actions/compose';\nimport { openModal } from 'mastodon/actions/modal';\nimport { muteStatus, unmuteStatus, hideStatus, revealStatus } from 'mastodon/actions/statuses';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },\n replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },\n});\n\nconst mapStateToProps = () => {\n const getStatus = makeGetStatus();\n\n return (state, { conversationId }) => {\n const conversation = state.getIn(['conversations', 'items']).find(x => x.get('id') === conversationId);\n const lastStatusId = conversation.get('last_status', null);\n\n return {\n accounts: conversation.get('accounts').map(accountId => state.getIn(['accounts', accountId], null)),\n unread: conversation.get('unread'),\n lastStatus: lastStatusId && getStatus(state, { id: lastStatusId }),\n };\n };\n};\n\nconst mapDispatchToProps = (dispatch, { intl, conversationId }) => ({\n\n markRead () {\n dispatch(markConversationRead(conversationId));\n },\n\n reply (status, router) {\n dispatch((_, getState) => {\n let state = getState();\n\n if (state.getIn(['compose', 'text']).trim().length !== 0) {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.replyMessage),\n confirm: intl.formatMessage(messages.replyConfirm),\n onConfirm: () => dispatch(replyCompose(status, router)),\n }));\n } else {\n dispatch(replyCompose(status, router));\n }\n });\n },\n\n delete () {\n dispatch(deleteConversation(conversationId));\n },\n\n onMute (status) {\n if (status.get('muted')) {\n dispatch(unmuteStatus(status.get('id')));\n } else {\n dispatch(muteStatus(status.get('id')));\n }\n },\n\n onToggleHidden (status) {\n if (status.get('hidden')) {\n dispatch(revealStatus(status.get('id')));\n } else {\n dispatch(hideStatus(status.get('id')));\n }\n },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(Conversation));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ConversationContainer from '../containers/conversation_container';\nimport ScrollableList from '../../../components/scrollable_list';\nimport { debounce } from 'lodash';\n\nexport default class ConversationsList extends ImmutablePureComponent {\n\n static propTypes = {\n conversations: ImmutablePropTypes.list.isRequired,\n hasMore: PropTypes.bool,\n isLoading: PropTypes.bool,\n onLoadMore: PropTypes.func,\n shouldUpdateScroll: PropTypes.func,\n };\n\n getCurrentIndex = id => this.props.conversations.findIndex(x => x.get('id') === id)\n\n handleMoveUp = id => {\n const elementIndex = this.getCurrentIndex(id) - 1;\n this._selectChild(elementIndex, true);\n }\n\n handleMoveDown = id => {\n const elementIndex = this.getCurrentIndex(id) + 1;\n this._selectChild(elementIndex, false);\n }\n\n _selectChild (index, align_top) {\n const container = this.node.node;\n const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`);\n\n if (element) {\n if (align_top && container.scrollTop > element.offsetTop) {\n element.scrollIntoView(true);\n } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n element.scrollIntoView(false);\n }\n element.focus();\n }\n }\n\n setRef = c => {\n this.node = c;\n }\n\n handleLoadOlder = debounce(() => {\n const last = this.props.conversations.last();\n\n if (last && last.get('last_status')) {\n this.props.onLoadMore(last.get('last_status'));\n }\n }, 300, { leading: true })\n\n render () {\n const { conversations, onLoadMore, ...other } = this.props;\n\n return (\n <ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} scrollKey='direct' ref={this.setRef}>\n {conversations.map(item => (\n <ConversationContainer\n key={item.get('id')}\n conversationId={item.get('id')}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n />\n ))}\n </ScrollableList>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ConversationsList from '../components/conversations_list';\nimport { expandConversations } from '../../../actions/conversations';\n\nconst mapStateToProps = state => ({\n conversations: state.getIn(['conversations', 'items']),\n isLoading: state.getIn(['conversations', 'isLoading'], true),\n hasMore: state.getIn(['conversations', 'hasMore'], false),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onLoadMore: maxId => dispatch(expandConversations({ maxId })),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ConversationsList);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { mountConversations, unmountConversations, expandConversations } from '../../actions/conversations';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport { connectDirectStream } from '../../actions/streaming';\nimport ConversationsListContainer from './containers/conversations_list_container';\n\nconst messages = defineMessages({\n title: { id: 'column.direct', defaultMessage: 'Direct messages' },\n});\n\nexport default @connect()\n@injectIntl\nclass DirectTimeline extends React.PureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n intl: PropTypes.object.isRequired,\n hasUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('DIRECT', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n\n dispatch(mountConversations());\n dispatch(expandConversations());\n this.disconnect = dispatch(connectDirectStream());\n }\n\n componentWillUnmount () {\n this.props.dispatch(unmountConversations());\n\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandConversations({ maxId }));\n }\n\n render () {\n const { intl, hasUnread, columnId, multiColumn, shouldUpdateScroll } = this.props;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='envelope'\n active={hasUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n />\n\n <ConversationsListContainer\n trackScroll={!pinned}\n scrollKey={`direct_timeline-${columnId}`}\n timelineId='direct'\n onLoadMore={this.handleLoadMore}\n emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage=\"You don't have any direct messages yet. When you send or receive one, it will show up here.\" />}\n shouldUpdateScroll={shouldUpdateScroll}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/directory.js b/priv/static/packs/features/directory.js
index e02e54d5e..2c0111bc3 100644
--- a/priv/static/packs/features/directory.js
+++ b/priv/static/packs/features/directory.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{829:function(e,t,a){"use strict";a.r(t);var o,n,c,i,r,s,l,d=a(0),u=a(2),b=a(7),m=a(1),j=a(3),f=a.n(j),g=a(13),h=a(6),p=a(5),O=a.n(p),v=a(736),_=a(733),M=a(250),w=a(203),y=a(4),k=a(18),C=a(14),I=a.n(C),N=a(206),L=a(111),E=a(118),R=a(294),P=a(104),q=a(50),A=a(20),F=a(418),T=a(25),U=a(47),B=a(208),D=Object(h.f)({follow:{id:"account.follow",defaultMessage:"Follow"},unfollow:{id:"account.unfollow",defaultMessage:"Unfollow"},requested:{id:"account.requested",defaultMessage:"Awaiting approval"},unblock:{id:"account.unblock",defaultMessage:"Unblock @{name}"},unmute:{id:"account.unmute",defaultMessage:"Unmute @{name}"}}),S=(o=Object(g.connect)((function(){var e=Object(N.d)();return function(t,a){var o=a.id;return{account:e(t,o)}}}),(function(e,t){var a=t.intl;return{onFollow:function(t){t.getIn(["relationship","following"])||t.getIn(["relationship","requested"])?A.v?e(Object(U.d)("CONFIRM",{message:Object(d.a)(h.b,{id:"confirmations.unfollow.message",defaultMessage:"Are you sure you want to unfollow {name}?",values:{name:Object(d.a)("strong",{},void 0,"@",t.get("acct"))}}),confirm:a.formatMessage(D.unfollowConfirm),onConfirm:function(){return e(Object(T.K)(t.get("id")))}})):e(Object(T.K)(t.get("id"))):e(Object(T.F)(t.get("id")))},onBlock:function(t){t.getIn(["relationship","blocking"])?e(Object(T.J)(t.get("id"))):e(Object(T.w)(t.get("id")))},onMute:function(t){t.getIn(["relationship","muting"])?e(Object(T.L)(t.get("id"))):e(Object(B.g)(t))}}})),Object(h.g)(n=o((i=c=function(e){function t(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(m.a)(Object(u.a)(t),"handleEmojiMouseEnter",(function(e){var t=e.target;t.src=t.getAttribute("data-original")})),Object(m.a)(Object(u.a)(t),"handleEmojiMouseLeave",(function(e){var t=e.target;t.src=t.getAttribute("data-static")})),Object(m.a)(Object(u.a)(t),"handleFollow",(function(){t.props.onFollow(t.props.account)})),Object(m.a)(Object(u.a)(t),"handleBlock",(function(){t.props.onBlock(t.props.account)})),Object(m.a)(Object(u.a)(t),"handleMute",(function(){t.props.onMute(t.props.account)})),Object(m.a)(Object(u.a)(t),"setRef",(function(e){t.node=e})),t}Object(b.a)(t,e);var a=t.prototype;return a._updateEmojis=function(){var e=this.node;if(e&&!A.a)for(var t=e.querySelectorAll(".custom-emoji"),a=0;a<t.length;a++){var o=t[a];o.classList.contains("status-emoji")||(o.classList.add("status-emoji"),o.addEventListener("mouseenter",this.handleEmojiMouseEnter,!1),o.addEventListener("mouseleave",this.handleEmojiMouseLeave,!1))}},a.componentDidMount=function(){this._updateEmojis()},a.componentDidUpdate=function(){this._updateEmojis()},a.render=function(){var e,t=this.props,a=t.account,o=t.intl;if(a.get("id")!==A.n&&null!==a.get("relationship",null)){var n=a.getIn(["relationship","following"]),c=a.getIn(["relationship","requested"]),i=a.getIn(["relationship","blocking"]),r=a.getIn(["relationship","muting"]);c?e=Object(d.a)(q.a,{disabled:!0,icon:"hourglass",title:o.formatMessage(D.requested)}):i?e=Object(d.a)(q.a,{active:!0,icon:"unlock",title:o.formatMessage(D.unblock,{name:a.get("username")}),onClick:this.handleBlock}):r?e=Object(d.a)(q.a,{active:!0,icon:"volume-up",title:o.formatMessage(D.unmute,{name:a.get("username")}),onClick:this.handleMute}):a.get("moved")&&!n||(e=Object(d.a)(q.a,{icon:n?"user-times":"user-plus",title:o.formatMessage(n?D.unfollow:D.follow),onClick:this.handleFollow,active:n}))}return Object(d.a)("div",{className:"directory__card"},void 0,Object(d.a)("div",{className:"directory__card__img"},void 0,Object(d.a)("img",{src:A.a?a.get("header"):a.get("header_static"),alt:""})),Object(d.a)("div",{className:"directory__card__bar"},void 0,Object(d.a)(R.a,{className:"directory__card__bar__name",href:a.get("url"),to:"/accounts/"+a.get("id")},void 0,Object(d.a)(L.a,{account:a,size:48}),Object(d.a)(E.a,{account:a})),Object(d.a)("div",{className:"directory__card__bar__relationship account__relationship"},void 0,e)),f.a.createElement("div",{className:"directory__card__extra",ref:this.setRef},Object(d.a)("div",{className:"account__header__content",dangerouslySetInnerHTML:{__html:a.get("note_emojified")}})),Object(d.a)("div",{className:"directory__card__extra"},void 0,Object(d.a)("div",{className:"accounts-table__count"},void 0,Object(F.a)(a.get("statuses_count"))," ",Object(d.a)("small",{},void 0,Object(d.a)(h.b,{id:"account.posts",defaultMessage:"Toots"}))),Object(d.a)("div",{className:"accounts-table__count"},void 0,Object(F.a)(a.get("followers_count"))," ",Object(d.a)("small",{},void 0,Object(d.a)(h.b,{id:"account.followers",defaultMessage:"Followers"}))),Object(d.a)("div",{className:"accounts-table__count"},void 0,null===a.get("last_status_at")?Object(d.a)(h.b,{id:"account.never_active",defaultMessage:"Never"}):Object(d.a)(P.default,{timestamp:a.get("last_status_at")})," ",Object(d.a)("small",{},void 0,Object(d.a)(h.b,{id:"account.last_status",defaultMessage:"Last active"})))))},t}(k.a),Object(m.a)(c,"propTypes",{account:I.a.map.isRequired,intl:O.a.object.isRequired,onFollow:O.a.func.isRequired,onBlock:O.a.func.isRequired,onMute:O.a.func.isRequired}),n=i))||n)||n),x=a(12),H=a.n(x),J=function(e){function t(){return e.apply(this,arguments)||this}return Object(b.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.name,a=e.value,o=e.checked,n=e.onChange,c=e.label;return Object(d.a)("label",{className:"radio-button"},void 0,Object(d.a)("input",{name:t,type:"radio",value:a,checked:o,onChange:n}),Object(d.a)("span",{className:H()("radio-button__input",{checked:o})}),Object(d.a)("span",{},void 0,c))},t}(f.a.PureComponent),K=a(1054),z=a(467);a.d(t,"default",(function(){return G}));var Y=Object(h.f)({title:{id:"column.directory",defaultMessage:"Browse profiles"},recentlyActive:{id:"directory.recently_active",defaultMessage:"Recently active"},newArrivals:{id:"directory.new_arrivals",defaultMessage:"New arrivals"},local:{id:"directory.local",defaultMessage:"From {domain} only"},federated:{id:"directory.federated",defaultMessage:"From known fediverse"}}),G=Object(g.connect)((function(e){return{accountIds:e.getIn(["user_lists","directory","items"],Object(y.List)()),isLoading:e.getIn(["user_lists","directory","isLoading"],!0),domain:e.getIn(["meta","domain"])}}))(r=Object(h.g)((l=s=function(e){function t(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(m.a)(Object(u.a)(t),"state",{order:null,local:null}),Object(m.a)(Object(u.a)(t),"handlePin",(function(){var e=t.props,a=e.columnId,o=e.dispatch;o(a?Object(M.h)(a):Object(M.e)("DIRECTORY",t.getParams(t.props,t.state)))})),Object(m.a)(Object(u.a)(t),"getParams",(function(e,t){return{order:null===t.order?e.params.order||"active":t.order,local:null===t.local?e.params.local||!1:t.local}})),Object(m.a)(Object(u.a)(t),"handleMove",(function(e){var a=t.props,o=a.columnId;(0,a.dispatch)(Object(M.g)(o,e))})),Object(m.a)(Object(u.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(m.a)(Object(u.a)(t),"setRef",(function(e){t.column=e})),Object(m.a)(Object(u.a)(t),"handleChangeOrder",(function(e){var a=t.props,o=a.dispatch,n=a.columnId;n?o(Object(M.f)(n,["order"],e.target.value)):t.setState({order:e.target.value})})),Object(m.a)(Object(u.a)(t),"handleChangeLocal",(function(e){var a=t.props,o=a.dispatch,n=a.columnId;n?o(Object(M.f)(n,["local"],"1"===e.target.value)):t.setState({local:"1"===e.target.value})})),Object(m.a)(Object(u.a)(t),"handleLoadMore",(function(){(0,t.props.dispatch)(Object(w.g)(t.getParams(t.props,t.state)))})),t}Object(b.a)(t,e);var a=t.prototype;return a.componentDidMount=function(){(0,this.props.dispatch)(Object(w.h)(this.getParams(this.props,this.state)))},a.componentDidUpdate=function(e,t){var a=this.props.dispatch,o=this.getParams(e,t),n=this.getParams(this.props,this.state);o.order===n.order&&o.local===n.local||a(Object(w.h)(n))},a.render=function(){var e=this.props,t=e.isLoading,a=e.accountIds,o=e.intl,n=e.columnId,c=e.multiColumn,i=e.domain,r=e.shouldUpdateScroll,s=this.getParams(this.props,this.state),l=s.order,u=s.local,b=!!n,m=Object(d.a)("div",{className:"scrollable",style:{background:"transparent"}},void 0,Object(d.a)("div",{className:"filter-form"},void 0,Object(d.a)("div",{className:"filter-form__column",role:"group"},void 0,Object(d.a)(J,{name:"order",value:"active",label:o.formatMessage(Y.recentlyActive),checked:"active"===l,onChange:this.handleChangeOrder}),Object(d.a)(J,{name:"order",value:"new",label:o.formatMessage(Y.newArrivals),checked:"new"===l,onChange:this.handleChangeOrder})),Object(d.a)("div",{className:"filter-form__column",role:"group"},void 0,Object(d.a)(J,{name:"local",value:"1",label:o.formatMessage(Y.local,{domain:i}),checked:u,onChange:this.handleChangeLocal}),Object(d.a)(J,{name:"local",value:"0",label:o.formatMessage(Y.federated),checked:!u,onChange:this.handleChangeLocal}))),Object(d.a)("div",{className:H()("directory__list",{loading:t})},void 0,a.map((function(e){return Object(d.a)(S,{id:e},e)}))),Object(d.a)(K.a,{onClick:this.handleLoadMore,visible:!t}));return f.a.createElement(v.a,{bindToDocument:!c,ref:this.setRef,label:o.formatMessage(Y.title)},Object(d.a)(_.a,{icon:"address-book-o",title:o.formatMessage(Y.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:b,multiColumn:c}),c&&!b?Object(d.a)(z.a,{scrollKey:"directory",shouldUpdateScroll:r},void 0,m):m)},t}(f.a.PureComponent),Object(m.a)(s,"contextTypes",{router:O.a.object}),r=l))||r)||r}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{855:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return G}));var o,n,c,i,r=a(0),s=a(2),l=(a(9),a(6),a(8)),d=a(1),u=a(3),b=a.n(u),m=a(15),f=a(7),j=a(5),g=a.n(j),h=a(762),p=a(759),O=a(253),v=a(207),_=a(4),M=a(21),w=a(16),y=a.n(w),k=a(210),C=a(115),I=a(122),N=a(300),L=a(109),E=a(53),R=a(22),P=a(421),q=a(26),A=a(48),F=a(212);var U=Object(f.f)({follow:{id:"account.follow",defaultMessage:"Follow"},unfollow:{id:"account.unfollow",defaultMessage:"Unfollow"},requested:{id:"account.requested",defaultMessage:"Awaiting approval"},unblock:{id:"account.unblock",defaultMessage:"Unblock @{name}"},unmute:{id:"account.unmute",defaultMessage:"Unmute @{name}"},unfollowConfirm:{id:"confirmations.unfollow.confirm",defaultMessage:"Unfollow"}}),T=(o=Object(m.connect)((function(){var e=Object(k.d)();return function(t,a){var o=a.id;return{account:e(t,o)}}}),(function(e,t){var a=t.intl;return{onFollow:function(t){t.getIn(["relationship","following"])||t.getIn(["relationship","requested"])?R.v?e(Object(A.d)("CONFIRM",{message:Object(r.a)(f.b,{id:"confirmations.unfollow.message",defaultMessage:"Are you sure you want to unfollow {name}?",values:{name:Object(r.a)("strong",{},void 0,"@",t.get("acct"))}}),confirm:a.formatMessage(U.unfollowConfirm),onConfirm:function(){return e(Object(q.K)(t.get("id")))}})):e(Object(q.K)(t.get("id"))):e(Object(q.F)(t.get("id")))},onBlock:function(t){t.getIn(["relationship","blocking"])?e(Object(q.J)(t.get("id"))):e(Object(q.w)(t.get("id")))},onMute:function(t){t.getIn(["relationship","muting"])?e(Object(q.L)(t.get("id"))):e(Object(F.g)(t))}}})),Object(f.g)(n=o((i=c=function(e){Object(l.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(d.a)(Object(s.a)(t),"handleEmojiMouseEnter",(function(e){var t=e.target;t.src=t.getAttribute("data-original")})),Object(d.a)(Object(s.a)(t),"handleEmojiMouseLeave",(function(e){var t=e.target;t.src=t.getAttribute("data-static")})),Object(d.a)(Object(s.a)(t),"handleFollow",(function(){t.props.onFollow(t.props.account)})),Object(d.a)(Object(s.a)(t),"handleBlock",(function(){t.props.onBlock(t.props.account)})),Object(d.a)(Object(s.a)(t),"handleMute",(function(){t.props.onMute(t.props.account)})),Object(d.a)(Object(s.a)(t),"setRef",(function(e){t.node=e})),t}var o=a.prototype;return o._updateEmojis=function(){var e=this.node;if(e&&!R.a)for(var t=e.querySelectorAll(".custom-emoji"),a=0;a<t.length;a++){var o=t[a];o.classList.contains("status-emoji")||(o.classList.add("status-emoji"),o.addEventListener("mouseenter",this.handleEmojiMouseEnter,!1),o.addEventListener("mouseleave",this.handleEmojiMouseLeave,!1))}},o.componentDidMount=function(){this._updateEmojis()},o.componentDidUpdate=function(){this._updateEmojis()},o.render=function(){var e,t=this.props,a=t.account,o=t.intl;if(a.get("id")!==R.n&&null!==a.get("relationship",null)){var n=a.getIn(["relationship","following"]),c=a.getIn(["relationship","requested"]),i=a.getIn(["relationship","blocking"]),s=a.getIn(["relationship","muting"]);c?e=Object(r.a)(E.a,{disabled:!0,icon:"hourglass",title:o.formatMessage(U.requested)}):i?e=Object(r.a)(E.a,{active:!0,icon:"unlock",title:o.formatMessage(U.unblock,{name:a.get("username")}),onClick:this.handleBlock}):s?e=Object(r.a)(E.a,{active:!0,icon:"volume-up",title:o.formatMessage(U.unmute,{name:a.get("username")}),onClick:this.handleMute}):a.get("moved")&&!n||(e=Object(r.a)(E.a,{icon:n?"user-times":"user-plus",title:o.formatMessage(n?U.unfollow:U.follow),onClick:this.handleFollow,active:n}))}return(Object(r.a)("div",{className:"directory__card"},void 0,Object(r.a)("div",{className:"directory__card__img"},void 0,Object(r.a)("img",{src:R.a?a.get("header"):a.get("header_static"),alt:""})),Object(r.a)("div",{className:"directory__card__bar"},void 0,Object(r.a)(N.a,{className:"directory__card__bar__name",href:a.get("url"),to:"/accounts/"+a.get("id")},void 0,Object(r.a)(C.a,{account:a,size:48}),Object(r.a)(I.a,{account:a})),Object(r.a)("div",{className:"directory__card__bar__relationship account__relationship"},void 0,e)),b.a.createElement("div",{className:"directory__card__extra",ref:this.setRef},Object(r.a)("div",{className:"account__header__content",dangerouslySetInnerHTML:{__html:a.get("note_emojified")}})),Object(r.a)("div",{className:"directory__card__extra"},void 0,Object(r.a)("div",{className:"accounts-table__count"},void 0,Object(P.a)(a.get("statuses_count"))," ",Object(r.a)("small",{},void 0,Object(r.a)(f.b,{id:"account.posts",defaultMessage:"Toots"}))),Object(r.a)("div",{className:"accounts-table__count"},void 0,Object(P.a)(a.get("followers_count"))," ",Object(r.a)("small",{},void 0,Object(r.a)(f.b,{id:"account.followers",defaultMessage:"Followers"}))),Object(r.a)("div",{className:"accounts-table__count"},void 0,null===a.get("last_status_at")?Object(r.a)(f.b,{id:"account.never_active",defaultMessage:"Never"}):Object(r.a)(L.default,{timestamp:a.get("last_status_at")})," ",Object(r.a)("small",{},void 0,Object(r.a)(f.b,{id:"account.last_status",defaultMessage:"Last active"}))))))},a}(M.a),Object(d.a)(c,"propTypes",{account:y.a.map.isRequired,intl:g.a.object.isRequired,onFollow:g.a.func.isRequired,onBlock:g.a.func.isRequired,onMute:g.a.func.isRequired}),n=i))||n)||n),B=a(14),D=a.n(B);var S,x,H,J=function(e){Object(l.a)(a,e);var t;t=a;function a(){return e.apply(this,arguments)||this}return a.prototype.render=function(){var e=this.props,t=e.name,a=e.value,o=e.checked,n=e.onChange,c=e.label;return(Object(r.a)("label",{className:"radio-button"},void 0,Object(r.a)("input",{name:t,type:"radio",value:a,checked:o,onChange:n}),Object(r.a)("span",{className:D()("radio-button__input",{checked:o})}),Object(r.a)("span",{},void 0,c)))},a}(b.a.PureComponent),K=a(1081),z=a(472);var Y=Object(f.f)({title:{id:"column.directory",defaultMessage:"Browse profiles"},recentlyActive:{id:"directory.recently_active",defaultMessage:"Recently active"},newArrivals:{id:"directory.new_arrivals",defaultMessage:"New arrivals"},local:{id:"directory.local",defaultMessage:"From {domain} only"},federated:{id:"directory.federated",defaultMessage:"From known fediverse"}}),G=Object(m.connect)((function(e){return{accountIds:e.getIn(["user_lists","directory","items"],Object(_.List)()),isLoading:e.getIn(["user_lists","directory","isLoading"],!0),domain:e.getIn(["meta","domain"])}}))(S=Object(f.g)((H=x=function(e){Object(l.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(d.a)(Object(s.a)(t),"state",{order:null,local:null}),Object(d.a)(Object(s.a)(t),"handlePin",(function(){var e=t.props,a=e.columnId,o=e.dispatch;o(a?Object(O.h)(a):Object(O.e)("DIRECTORY",t.getParams(t.props,t.state)))})),Object(d.a)(Object(s.a)(t),"getParams",(function(e,t){return{order:null===t.order?e.params.order||"active":t.order,local:null===t.local?e.params.local||!1:t.local}})),Object(d.a)(Object(s.a)(t),"handleMove",(function(e){var a=t.props,o=a.columnId;(0,a.dispatch)(Object(O.g)(o,e))})),Object(d.a)(Object(s.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(d.a)(Object(s.a)(t),"setRef",(function(e){t.column=e})),Object(d.a)(Object(s.a)(t),"handleChangeOrder",(function(e){var a=t.props,o=a.dispatch,n=a.columnId;n?o(Object(O.f)(n,["order"],e.target.value)):t.setState({order:e.target.value})})),Object(d.a)(Object(s.a)(t),"handleChangeLocal",(function(e){var a=t.props,o=a.dispatch,n=a.columnId;n?o(Object(O.f)(n,["local"],"1"===e.target.value)):t.setState({local:"1"===e.target.value})})),Object(d.a)(Object(s.a)(t),"handleLoadMore",(function(){(0,t.props.dispatch)(Object(v.g)(t.getParams(t.props,t.state)))})),t}var o=a.prototype;return o.componentDidMount=function(){(0,this.props.dispatch)(Object(v.h)(this.getParams(this.props,this.state)))},o.componentDidUpdate=function(e,t){var a=this.props.dispatch,o=this.getParams(e,t),n=this.getParams(this.props,this.state);o.order===n.order&&o.local===n.local||a(Object(v.h)(n))},o.render=function(){var e=this.props,t=e.isLoading,a=e.accountIds,o=e.intl,n=e.columnId,c=e.multiColumn,i=e.domain,s=e.shouldUpdateScroll,l=this.getParams(this.props,this.state),d=l.order,u=l.local,m=!!n,f=Object(r.a)("div",{className:"scrollable",style:{background:"transparent"}},void 0,Object(r.a)("div",{className:"filter-form"},void 0,Object(r.a)("div",{className:"filter-form__column",role:"group"},void 0,Object(r.a)(J,{name:"order",value:"active",label:o.formatMessage(Y.recentlyActive),checked:"active"===d,onChange:this.handleChangeOrder}),Object(r.a)(J,{name:"order",value:"new",label:o.formatMessage(Y.newArrivals),checked:"new"===d,onChange:this.handleChangeOrder})),Object(r.a)("div",{className:"filter-form__column",role:"group"},void 0,Object(r.a)(J,{name:"local",value:"1",label:o.formatMessage(Y.local,{domain:i}),checked:u,onChange:this.handleChangeLocal}),Object(r.a)(J,{name:"local",value:"0",label:o.formatMessage(Y.federated),checked:!u,onChange:this.handleChangeLocal}))),Object(r.a)("div",{className:D()("directory__list",{loading:t})},void 0,a.map((function(e){return Object(r.a)(T,{id:e},e)}))),Object(r.a)(K.a,{onClick:this.handleLoadMore,visible:!t}));return b.a.createElement(h.a,{bindToDocument:!c,ref:this.setRef,label:o.formatMessage(Y.title)},Object(r.a)(p.a,{icon:"address-book-o",title:o.formatMessage(Y.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:m,multiColumn:c}),c&&!m?Object(r.a)(z.a,{scrollKey:"directory",shouldUpdateScroll:s},void 0,f):f)},a}(b.a.PureComponent),Object(d.a)(x,"contextTypes",{router:g.a.object}),S=H))||S)||S}}]);
//# sourceMappingURL=directory.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/directory.js.map b/priv/static/packs/features/directory.js.map
index eb45753be..be594d23d 100644
--- a/priv/static/packs/features/directory.js.map
+++ b/priv/static/packs/features/directory.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/directory/components/account_card.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/radio_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/directory/index.js"],"names":["messages","defineMessages","follow","unfollow","requested","unblock","unmute","AccountCard","connect","getAccount","makeGetAccount","state","id","account","dispatch","intl","onFollow","getIn","unfollowModal","openModal","message","defaultMessage","values","name","get","confirm","formatMessage","unfollowConfirm","onConfirm","unfollowAccount","followAccount","onBlock","unblockAccount","blockAccount","onMute","unmuteAccount","initMuteModal","injectIntl","target","src","getAttribute","props","c","node","_updateEmojis","this","autoPlayGif","emojis","querySelectorAll","i","length","emoji","classList","contains","add","addEventListener","handleEmojiMouseEnter","handleEmojiMouseLeave","componentDidMount","componentDidUpdate","render","buttons","me","following","blocking","muting","disabled","icon","title","active","onClick","handleBlock","handleMute","handleFollow","className","alt","href","to","size","ref","setRef","dangerouslySetInnerHTML","__html","shortNumberFormat","timestamp","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","RadioButton","value","checked","onChange","label","type","classNames","React","PureComponent","recentlyActive","newArrivals","local","federated","Directory","accountIds","ImmutableList","isLoading","domain","order","columnId","removeColumn","addColumn","getParams","params","dir","moveColumn","column","scrollTop","e","changeColumnParams","setState","expandDirectory","fetchDirectory","prevProps","prevState","paramsOld","paramsNew","multiColumn","shouldUpdateScroll","pinned","scrollableArea","style","background","role","handleChangeOrder","handleChangeLocal","loading","accountId","handleLoadMore","visible","bindToDocument","onPin","handlePin","onMove","handleMove","handleHeaderClick","scrollKey","router"],"mappings":"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","file":"features/directory.js","sourcesContent":["import React from 'react';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from 'mastodon/selectors';\nimport Avatar from 'mastodon/components/avatar';\nimport DisplayName from 'mastodon/components/display_name';\nimport Permalink from 'mastodon/components/permalink';\nimport RelativeTimestamp from 'mastodon/components/relative_timestamp';\nimport IconButton from 'mastodon/components/icon_button';\nimport { FormattedMessage, injectIntl, defineMessages } from 'react-intl';\nimport { autoPlayGif, me, unfollowModal } from 'mastodon/initial_state';\nimport { shortNumberFormat } from 'mastodon/utils/numbers';\nimport { followAccount, unfollowAccount, blockAccount, unblockAccount, unmuteAccount } from 'mastodon/actions/accounts';\nimport { openModal } from 'mastodon/actions/modal';\nimport { initMuteModal } from 'mastodon/actions/mutes';\n\nconst messages = defineMessages({\n follow: { id: 'account.follow', defaultMessage: 'Follow' },\n unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },\n requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },\n unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },\n unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },\n});\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { id }) => ({\n account: getAccount(state, id),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n onFollow (account) {\n if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {\n if (unfollowModal) {\n dispatch(openModal('CONFIRM', {\n message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,\n confirm: intl.formatMessage(messages.unfollowConfirm),\n onConfirm: () => dispatch(unfollowAccount(account.get('id'))),\n }));\n } else {\n dispatch(unfollowAccount(account.get('id')));\n }\n } else {\n dispatch(followAccount(account.get('id')));\n }\n },\n\n onBlock (account) {\n if (account.getIn(['relationship', 'blocking'])) {\n dispatch(unblockAccount(account.get('id')));\n } else {\n dispatch(blockAccount(account.get('id')));\n }\n },\n\n onMute (account) {\n if (account.getIn(['relationship', 'muting'])) {\n dispatch(unmuteAccount(account.get('id')));\n } else {\n dispatch(initMuteModal(account));\n }\n },\n\n});\n\nexport default @injectIntl\n@connect(makeMapStateToProps, mapDispatchToProps)\nclass AccountCard extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onFollow: PropTypes.func.isRequired,\n onBlock: PropTypes.func.isRequired,\n onMute: PropTypes.func.isRequired,\n };\n\n _updateEmojis () {\n const node = this.node;\n\n if (!node || autoPlayGif) {\n return;\n }\n\n const emojis = node.querySelectorAll('.custom-emoji');\n\n for (var i = 0; i < emojis.length; i++) {\n let emoji = emojis[i];\n if (emoji.classList.contains('status-emoji')) {\n continue;\n }\n emoji.classList.add('status-emoji');\n\n emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);\n emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);\n }\n }\n\n componentDidMount () {\n this._updateEmojis();\n }\n\n componentDidUpdate () {\n this._updateEmojis();\n }\n\n handleEmojiMouseEnter = ({ target }) => {\n target.src = target.getAttribute('data-original');\n }\n\n handleEmojiMouseLeave = ({ target }) => {\n target.src = target.getAttribute('data-static');\n }\n\n handleFollow = () => {\n this.props.onFollow(this.props.account);\n }\n\n handleBlock = () => {\n this.props.onBlock(this.props.account);\n }\n\n handleMute = () => {\n this.props.onMute(this.props.account);\n }\n\n setRef = (c) => {\n this.node = c;\n }\n\n render () {\n const { account, intl } = this.props;\n\n let buttons;\n\n if (account.get('id') !== me && account.get('relationship', null) !== null) {\n const following = account.getIn(['relationship', 'following']);\n const requested = account.getIn(['relationship', 'requested']);\n const blocking = account.getIn(['relationship', 'blocking']);\n const muting = account.getIn(['relationship', 'muting']);\n\n if (requested) {\n buttons = <IconButton disabled icon='hourglass' title={intl.formatMessage(messages.requested)} />;\n } else if (blocking) {\n buttons = <IconButton active icon='unlock' title={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.handleBlock} />;\n } else if (muting) {\n buttons = <IconButton active icon='volume-up' title={intl.formatMessage(messages.unmute, { name: account.get('username') })} onClick={this.handleMute} />;\n } else if (!account.get('moved') || following) {\n buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />;\n }\n }\n\n return (\n <div className='directory__card'>\n <div className='directory__card__img'>\n <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' />\n </div>\n\n <div className='directory__card__bar'>\n <Permalink className='directory__card__bar__name' href={account.get('url')} to={`/accounts/${account.get('id')}`}>\n <Avatar account={account} size={48} />\n <DisplayName account={account} />\n </Permalink>\n\n <div className='directory__card__bar__relationship account__relationship'>\n {buttons}\n </div>\n </div>\n\n <div className='directory__card__extra' ref={this.setRef}>\n <div className='account__header__content' dangerouslySetInnerHTML={{ __html: account.get('note_emojified') }} />\n </div>\n\n <div className='directory__card__extra'>\n <div className='accounts-table__count'>{shortNumberFormat(account.get('statuses_count'))} <small><FormattedMessage id='account.posts' defaultMessage='Toots' /></small></div>\n <div className='accounts-table__count'>{shortNumberFormat(account.get('followers_count'))} <small><FormattedMessage id='account.followers' defaultMessage='Followers' /></small></div>\n <div className='accounts-table__count'>{account.get('last_status_at') === null ? <FormattedMessage id='account.never_active' defaultMessage='Never' /> : <RelativeTimestamp timestamp={account.get('last_status_at')} />} <small><FormattedMessage id='account.last_status' defaultMessage='Last active' /></small></div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nexport default class RadioButton extends React.PureComponent {\n\n static propTypes = {\n value: PropTypes.string.isRequired,\n checked: PropTypes.bool,\n name: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n label: PropTypes.node.isRequired,\n };\n\n render () {\n const { name, value, checked, onChange, label } = this.props;\n\n return (\n <label className='radio-button'>\n <input\n name={name}\n type='radio'\n value={value}\n checked={checked}\n onChange={onChange}\n />\n\n <span className={classNames('radio-button__input', { checked })} />\n\n <span>{label}</span>\n </label>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from 'mastodon/components/column';\nimport ColumnHeader from 'mastodon/components/column_header';\nimport { addColumn, removeColumn, moveColumn, changeColumnParams } from 'mastodon/actions/columns';\nimport { fetchDirectory, expandDirectory } from 'mastodon/actions/directory';\nimport { List as ImmutableList } from 'immutable';\nimport AccountCard from './components/account_card';\nimport RadioButton from 'mastodon/components/radio_button';\nimport classNames from 'classnames';\nimport LoadMore from 'mastodon/components/load_more';\nimport { ScrollContainer } from 'react-router-scroll-4';\n\nconst messages = defineMessages({\n title: { id: 'column.directory', defaultMessage: 'Browse profiles' },\n recentlyActive: { id: 'directory.recently_active', defaultMessage: 'Recently active' },\n newArrivals: { id: 'directory.new_arrivals', defaultMessage: 'New arrivals' },\n local: { id: 'directory.local', defaultMessage: 'From {domain} only' },\n federated: { id: 'directory.federated', defaultMessage: 'From known fediverse' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'directory', 'items'], ImmutableList()),\n isLoading: state.getIn(['user_lists', 'directory', 'isLoading'], true),\n domain: state.getIn(['meta', 'domain']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Directory extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n isLoading: PropTypes.bool,\n accountIds: ImmutablePropTypes.list.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n params: PropTypes.shape({\n order: PropTypes.string,\n local: PropTypes.bool,\n }),\n };\n\n state = {\n order: null,\n local: null,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('DIRECTORY', this.getParams(this.props, this.state)));\n }\n }\n\n getParams = (props, state) => ({\n order: state.order === null ? (props.params.order || 'active') : state.order,\n local: state.local === null ? (props.params.local || false) : state.local,\n });\n\n handleMove = dir => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n dispatch(fetchDirectory(this.getParams(this.props, this.state)));\n }\n\n componentDidUpdate (prevProps, prevState) {\n const { dispatch } = this.props;\n const paramsOld = this.getParams(prevProps, prevState);\n const paramsNew = this.getParams(this.props, this.state);\n\n if (paramsOld.order !== paramsNew.order || paramsOld.local !== paramsNew.local) {\n dispatch(fetchDirectory(paramsNew));\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleChangeOrder = e => {\n const { dispatch, columnId } = this.props;\n\n if (columnId) {\n dispatch(changeColumnParams(columnId, ['order'], e.target.value));\n } else {\n this.setState({ order: e.target.value });\n }\n }\n\n handleChangeLocal = e => {\n const { dispatch, columnId } = this.props;\n\n if (columnId) {\n dispatch(changeColumnParams(columnId, ['local'], e.target.value === '1'));\n } else {\n this.setState({ local: e.target.value === '1' });\n }\n }\n\n handleLoadMore = () => {\n const { dispatch } = this.props;\n dispatch(expandDirectory(this.getParams(this.props, this.state)));\n }\n\n render () {\n const { isLoading, accountIds, intl, columnId, multiColumn, domain, shouldUpdateScroll } = this.props;\n const { order, local } = this.getParams(this.props, this.state);\n const pinned = !!columnId;\n\n const scrollableArea = (\n <div className='scrollable' style={{ background: 'transparent' }}>\n <div className='filter-form'>\n <div className='filter-form__column' role='group'>\n <RadioButton name='order' value='active' label={intl.formatMessage(messages.recentlyActive)} checked={order === 'active'} onChange={this.handleChangeOrder} />\n <RadioButton name='order' value='new' label={intl.formatMessage(messages.newArrivals)} checked={order === 'new'} onChange={this.handleChangeOrder} />\n </div>\n\n <div className='filter-form__column' role='group'>\n <RadioButton name='local' value='1' label={intl.formatMessage(messages.local, { domain })} checked={local} onChange={this.handleChangeLocal} />\n <RadioButton name='local' value='0' label={intl.formatMessage(messages.federated)} checked={!local} onChange={this.handleChangeLocal} />\n </div>\n </div>\n\n <div className={classNames('directory__list', { loading: isLoading })}>\n {accountIds.map(accountId => <AccountCard id={accountId} key={accountId} />)}\n </div>\n\n <LoadMore onClick={this.handleLoadMore} visible={!isLoading} />\n </div>\n );\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='address-book-o'\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n />\n\n {multiColumn && !pinned ? <ScrollContainer scrollKey='directory' shouldUpdateScroll={shouldUpdateScroll}>{scrollableArea}</ScrollContainer> : scrollableArea}\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/directory/components/account_card.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/radio_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/directory/index.js"],"names":["messages","defineMessages","follow","unfollow","requested","unblock","unmute","unfollowConfirm","AccountCard","connect","getAccount","makeGetAccount","state","id","account","dispatch","intl","onFollow","getIn","unfollowModal","openModal","message","defaultMessage","values","name","get","confirm","formatMessage","onConfirm","unfollowAccount","followAccount","onBlock","unblockAccount","blockAccount","onMute","unmuteAccount","initMuteModal","injectIntl","target","src","getAttribute","props","c","node","_updateEmojis","this","autoPlayGif","emojis","querySelectorAll","i","length","emoji","classList","contains","add","addEventListener","handleEmojiMouseEnter","handleEmojiMouseLeave","componentDidMount","componentDidUpdate","render","buttons","me","following","blocking","muting","disabled","icon","title","active","onClick","handleBlock","handleMute","handleFollow","className","alt","href","to","size","ref","setRef","dangerouslySetInnerHTML","__html","shortNumberFormat","timestamp","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","RadioButton","value","checked","onChange","label","type","classNames","React","PureComponent","recentlyActive","newArrivals","local","federated","Directory","accountIds","ImmutableList","isLoading","domain","order","columnId","removeColumn","addColumn","getParams","params","dir","moveColumn","column","scrollTop","e","changeColumnParams","setState","expandDirectory","fetchDirectory","prevProps","prevState","paramsOld","paramsNew","multiColumn","shouldUpdateScroll","pinned","scrollableArea","style","background","role","handleChangeOrder","handleChangeLocal","loading","accountId","handleLoadMore","visible","bindToDocument","onPin","handlePin","onMove","handleMove","handleHeaderClick","scrollKey","router"],"mappings":"gZAkBA,IAAMA,EAAWC,YAAe,CAC9BC,OAAO,CAAD,6CACNC,SAAS,CAAD,iDACRC,UAAU,CAAD,2DACTC,QAAQ,CAAD,uDACPC,OAAO,CAAD,qDACNC,gBAAgB,CAAD,iEAmDXC,G,EADLC,mBA/C2B,WAC1B,IAAMC,EAAaC,cAMnB,OAJwB,SAACC,EAAD,OAAUC,EAAV,EAAUA,GAAV,MAAoB,CAC1CC,QAASJ,EAAWE,EAAOC,QAMJ,SAACE,EAAD,OAAaC,EAAb,EAAaA,KAAb,MAAyB,CAElDC,SAFkD,SAExCH,GACJA,EAAQI,MAAM,CAAC,eAAgB,eAAiBJ,EAAQI,MAAM,CAAC,eAAgB,cAC7EC,IACFJ,EAASK,YAAU,UAAW,CAC5BC,QAAS,YAAC,IAAD,CAAkBR,GAAG,iCAAiCS,eAAe,4CAA4CC,OAAQ,CAAEC,KAAM,mCAAUV,EAAQW,IAAI,YAChKC,QAASV,EAAKW,cAAc3B,EAASO,iBACrCqB,UAAW,kBAAMb,EAASc,YAAgBf,EAAQW,IAAI,YAGxDV,EAASc,YAAgBf,EAAQW,IAAI,QAGvCV,EAASe,YAAchB,EAAQW,IAAI,SAIvCM,QAlBkD,SAkBzCjB,GACHA,EAAQI,MAAM,CAAC,eAAgB,aACjCH,EAASiB,YAAelB,EAAQW,IAAI,QAEpCV,EAASkB,YAAanB,EAAQW,IAAI,SAItCS,OA1BkD,SA0B1CpB,GACFA,EAAQI,MAAM,CAAC,eAAgB,WACjCH,EAASoB,YAAcrB,EAAQW,IAAI,QAEnCV,EAASqB,YAActB,SAMbuB,Y,2OAyCU,YAAiB,IAAdC,EAAa,EAAbA,OACzBA,EAAOC,IAAMD,EAAOE,aAAa,oB,oDAGX,YAAiB,IAAdF,EAAa,EAAbA,OACzBA,EAAOC,IAAMD,EAAOE,aAAa,kB,2CAGpB,WACb,EAAKC,MAAMxB,SAAS,EAAKwB,MAAM3B,Y,0CAGnB,WACZ,EAAK2B,MAAMV,QAAQ,EAAKU,MAAM3B,Y,yCAGnB,WACX,EAAK2B,MAAMP,OAAO,EAAKO,MAAM3B,Y,qCAGtB,SAAC4B,GACR,EAAKC,KAAOD,K,6BAlDdE,cAAA,WACE,IAAMD,EAAOE,KAAKF,KAElB,GAAKA,IAAQG,IAMb,IAFA,IAAMC,EAASJ,EAAKK,iBAAiB,iBAE5BC,EAAI,EAAGA,EAAIF,EAAOG,OAAQD,IAAK,CACtC,IAAIE,EAAQJ,EAAOE,GACfE,EAAMC,UAAUC,SAAS,kBAG7BF,EAAMC,UAAUE,IAAI,gBAEpBH,EAAMI,iBAAiB,aAAcV,KAAKW,uBAAuB,GACjEL,EAAMI,iBAAiB,aAAcV,KAAKY,uBAAuB,M,EAIrEC,kBAAA,WACEb,KAAKD,iB,EAGPe,mBAAA,WACEd,KAAKD,iB,EA2BPgB,OAAA,WAAW,IAGLC,EAHI,EACkBhB,KAAKJ,MAAvB3B,EADA,EACAA,QAASE,EADT,EACSA,KAIjB,GAAIF,EAAQW,IAAI,QAAUqC,KAA4C,OAAtChD,EAAQW,IAAI,eAAgB,MAAgB,CAC1E,IAAMsC,EAAYjD,EAAQI,MAAM,CAAC,eAAgB,cAC3Cd,EAAYU,EAAQI,MAAM,CAAC,eAAgB,cAC3C8C,EAAYlD,EAAQI,MAAM,CAAC,eAAgB,aAC3C+C,EAAYnD,EAAQI,MAAM,CAAC,eAAgB,WAE7Cd,EACFyD,EAAU,YAAC,IAAD,CAAYK,UAAQ,EAACC,KAAK,YAAYC,MAAOpD,EAAKW,cAAc3B,EAASI,aAC1E4D,EACTH,EAAU,YAAC,IAAD,CAAYQ,QAAM,EAACF,KAAK,SAASC,MAAOpD,EAAKW,cAAc3B,EAASK,QAAS,CAAEmB,KAAMV,EAAQW,IAAI,cAAgB6C,QAASzB,KAAK0B,cAChIN,EACTJ,EAAU,YAAC,IAAD,CAAYQ,QAAM,EAACF,KAAK,YAAYC,MAAOpD,EAAKW,cAAc3B,EAASM,OAAQ,CAAEkB,KAAMV,EAAQW,IAAI,cAAgB6C,QAASzB,KAAK2B,aACjI1D,EAAQW,IAAI,WAAYsC,IAClCF,EAAU,YAAC,IAAD,CAAYM,KAAMJ,EAAY,aAAe,YAAaK,MAAOpD,EAAKW,cAAcoC,EAAY/D,EAASG,SAAWH,EAASE,QAASoE,QAASzB,KAAK4B,aAAcJ,OAAQN,KAIxL,OACE,mBAAKW,UAAU,wBAAf,EACE,mBAAKA,UAAU,6BAAf,EACE,mBAAKnC,IAAKO,IAAchC,EAAQW,IAAI,UAAYX,EAAQW,IAAI,iBAAkBkD,IAAI,MAGpF,mBAAKD,UAAU,6BAAf,EACE,YAAC,IAAD,CAAWA,UAAU,6BAA6BE,KAAM9D,EAAQW,IAAI,OAAQoD,GAAE,aAAe/D,EAAQW,IAAI,YAAzG,EACE,YAAC,IAAD,CAAQX,QAASA,EAASgE,KAAM,KAChC,YAAC,IAAD,CAAahE,QAASA,KAGxB,mBAAK4D,UAAU,iEAAf,EACGb,IAIL,yBAAKa,UAAU,yBAAyBK,IAAKlC,KAAKmC,QAChD,mBAAKN,UAAU,2BAA2BO,wBAAyB,CAAEC,OAAQpE,EAAQW,IAAI,sBAG3F,mBAAKiD,UAAU,+BAAf,EACE,mBAAKA,UAAU,8BAAf,EAAwCS,YAAkBrE,EAAQW,IAAI,mBAAtE,IAA0F,8BAAO,YAAC,IAAD,CAAkBZ,GAAG,gBAAgBS,eAAe,YACrJ,mBAAKoD,UAAU,8BAAf,EAAwCS,YAAkBrE,EAAQW,IAAI,oBAAtE,IAA2F,8BAAO,YAAC,IAAD,CAAkBZ,GAAG,oBAAoBS,eAAe,gBAC1J,mBAAKoD,UAAU,8BAAf,EAA0E,OAAlC5D,EAAQW,IAAI,kBAA6B,YAAC,IAAD,CAAkBZ,GAAG,uBAAuBS,eAAe,UAAa,YAAC,UAAD,CAAmB8D,UAAWtE,EAAQW,IAAI,oBAAnM,IAA0N,8BAAO,YAAC,IAAD,CAAkBZ,GAAG,sBAAsBS,eAAe,sB,GA7G3Q+D,K,0BAEL,CACjBvE,QAASwE,IAAmBC,IAAIC,WAChCxE,KAAMyE,IAAUC,OAAOF,WACvBvE,SAAUwE,IAAUE,KAAKH,WACzBzD,QAAS0D,IAAUE,KAAKH,WACxBtD,OAAQuD,IAAUE,KAAKH,a,yCC9ENI,E,4GAUnBhC,OAAA,WAAW,IAAD,EAC0Cf,KAAKJ,MAA/CjB,EADA,EACAA,KAAMqE,EADN,EACMA,MAAOC,EADb,EACaA,QAASC,EADtB,EACsBA,SAAUC,EADhC,EACgCA,MAExC,OACE,qBAAOtB,UAAU,qBAAjB,EACE,qBACElD,KAAMA,EACNyE,KAAK,QACLJ,MAAOA,EACPC,QAASA,EACTC,SAAUA,IAGZ,oBAAMrB,UAAWwB,IAAW,sBAAuB,CAAEJ,cAErD,6BAAOE,M,GAzB0BG,IAAMC,e,mBCY/C,IAAMpG,EAAWC,YAAe,CAC9BmE,MAAM,CAAD,wDACLiC,eAAe,CAAD,iEACdC,YAAY,CAAD,2DACXC,MAAM,CAAD,0DACLC,UAAU,CAAD,kEAWLC,EAFUhG,mBANQ,SAAAG,GAAK,MAAK,CAChC8F,WAAY9F,EAAMM,MAAM,CAAC,aAAc,YAAa,SAAUyF,kBAC9DC,UAAWhG,EAAMM,MAAM,CAAC,aAAc,YAAa,cAAc,GACjE2F,OAAQjG,EAAMM,MAAM,CAAC,OAAQ,c,GAI9BmB,a,qNAsBS,CACNyE,MAAO,KACPP,MAAO,O,wCAGG,WAAO,IAAD,EACe,EAAK9D,MAA5BsE,EADQ,EACRA,SAAUhG,EADF,EACEA,SAGhBA,EADEgG,EACOC,YAAaD,GAEbE,YAAU,YAAa,EAAKC,UAAU,EAAKzE,MAAO,EAAK7B,Y,wCAIxD,SAAC6B,EAAO7B,GAAR,MAAmB,CAC7BkG,MAAuB,OAAhBlG,EAAMkG,MAAkBrE,EAAM0E,OAAOL,OAAS,SAAYlG,EAAMkG,MACvEP,MAAuB,OAAhB3F,EAAM2F,MAAkB9D,EAAM0E,OAAOZ,QAAS,EAAS3F,EAAM2F,U,yCAGzD,SAAAa,GAAQ,IAAD,EACa,EAAK3E,MAA5BsE,EADU,EACVA,UACRhG,EAFkB,EACAA,UACTsG,YAAWN,EAAUK,O,gDAGZ,WAClB,EAAKE,OAAOC,e,qCAkBL,SAAA7E,GACP,EAAK4E,OAAS5E,K,gDAGI,SAAA8E,GAAM,IAAD,EACQ,EAAK/E,MAA5B1B,EADe,EACfA,SAAUgG,EADK,EACLA,SAEdA,EACFhG,EAAS0G,YAAmBV,EAAU,CAAC,SAAUS,EAAElF,OAAOuD,QAE1D,EAAK6B,SAAS,CAAEZ,MAAOU,EAAElF,OAAOuD,W,gDAIhB,SAAA2B,GAAM,IAAD,EACQ,EAAK/E,MAA5B1B,EADe,EACfA,SAAUgG,EADK,EACLA,SAEdA,EACFhG,EAAS0G,YAAmBV,EAAU,CAAC,SAA6B,MAAnBS,EAAElF,OAAOuD,QAE1D,EAAK6B,SAAS,CAAEnB,MAA0B,MAAnBiB,EAAElF,OAAOuD,W,6CAInB,YAEf9E,EADqB,EAAK0B,MAAlB1B,UACC4G,YAAgB,EAAKT,UAAU,EAAKzE,MAAO,EAAK7B,Y,6BAzC3D8C,kBAAA,YAEE3C,EADqB8B,KAAKJ,MAAlB1B,UACC6G,YAAe/E,KAAKqE,UAAUrE,KAAKJ,MAAOI,KAAKjC,U,EAG1D+C,mBAAA,SAAoBkE,EAAWC,GAAY,IACjC/G,EAAa8B,KAAKJ,MAAlB1B,SACFgH,EAAYlF,KAAKqE,UAAUW,EAAWC,GACtCE,EAAYnF,KAAKqE,UAAUrE,KAAKJ,MAAOI,KAAKjC,OAE9CmH,EAAUjB,QAAUkB,EAAUlB,OAASiB,EAAUxB,QAAUyB,EAAUzB,OACvExF,EAAS6G,YAAeI,K,EAiC5BpE,OAAA,WAAW,IAAD,EACmFf,KAAKJ,MAAxFmE,EADA,EACAA,UAAWF,EADX,EACWA,WAAY1F,EADvB,EACuBA,KAAM+F,EAD7B,EAC6BA,SAAUkB,EADvC,EACuCA,YAAapB,EADpD,EACoDA,OAAQqB,EAD5D,EAC4DA,mBAD5D,EAEkBrF,KAAKqE,UAAUrE,KAAKJ,MAAOI,KAAKjC,OAAlDkG,EAFA,EAEAA,MAAOP,EAFP,EAEOA,MACT4B,IAAWpB,EAEXqB,EACJ,mBAAK1D,UAAU,aAAa2D,MAAO,CAAEC,WAAY,qBAAjD,EACE,mBAAK5D,UAAU,oBAAf,EACE,mBAAKA,UAAU,sBAAsB6D,KAAK,cAA1C,EACE,YAAC,EAAD,CAAa/G,KAAK,QAAQqE,MAAM,SAASG,MAAOhF,EAAKW,cAAc3B,EAASqG,gBAAiBP,QAAmB,WAAVgB,EAAoBf,SAAUlD,KAAK2F,oBACzI,YAAC,EAAD,CAAahH,KAAK,QAAQqE,MAAM,MAAMG,MAAOhF,EAAKW,cAAc3B,EAASsG,aAAcR,QAAmB,QAAVgB,EAAiBf,SAAUlD,KAAK2F,qBAGlI,mBAAK9D,UAAU,sBAAsB6D,KAAK,cAA1C,EACE,YAAC,EAAD,CAAa/G,KAAK,QAAQqE,MAAM,IAAIG,MAAOhF,EAAKW,cAAc3B,EAASuG,MAAO,CAAEM,WAAWf,QAASS,EAAOR,SAAUlD,KAAK4F,oBAC1H,YAAC,EAAD,CAAajH,KAAK,QAAQqE,MAAM,IAAIG,MAAOhF,EAAKW,cAAc3B,EAASwG,WAAYV,SAAUS,EAAOR,SAAUlD,KAAK4F,sBAIvH,mBAAK/D,UAAWwB,IAAW,kBAAmB,CAAEwC,QAAS9B,UAAzD,EACGF,EAAWnB,KAAI,SAAAoD,GAAS,OAAI,YAAC,EAAD,CAAa9H,GAAI8H,GAAgBA,OAGhE,YAAC,IAAD,CAAUrE,QAASzB,KAAK+F,eAAgBC,SAAUjC,KAItD,OACE,kBAAC,IAAD,CAAQkC,gBAAiBb,EAAalD,IAAKlC,KAAKmC,OAAQgB,MAAOhF,EAAKW,cAAc3B,EAASoE,QACzF,YAAC,IAAD,CACED,KAAK,iBACLC,MAAOpD,EAAKW,cAAc3B,EAASoE,OACnC2E,MAAOlG,KAAKmG,UACZC,OAAQpG,KAAKqG,WACb5E,QAASzB,KAAKsG,kBACdhB,OAAQA,EACRF,YAAaA,IAGdA,IAAgBE,EAAS,YAAC,IAAD,CAAiBiB,UAAU,YAAYlB,mBAAoBA,QAA3D,EAAgFE,GAAoCA,I,GArI9HjC,IAAMC,e,6BAEN,CACpBiD,OAAQ5D,IAAUC,S","file":"features/directory.js","sourcesContent":["import React from 'react';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from 'mastodon/selectors';\nimport Avatar from 'mastodon/components/avatar';\nimport DisplayName from 'mastodon/components/display_name';\nimport Permalink from 'mastodon/components/permalink';\nimport RelativeTimestamp from 'mastodon/components/relative_timestamp';\nimport IconButton from 'mastodon/components/icon_button';\nimport { FormattedMessage, injectIntl, defineMessages } from 'react-intl';\nimport { autoPlayGif, me, unfollowModal } from 'mastodon/initial_state';\nimport { shortNumberFormat } from 'mastodon/utils/numbers';\nimport { followAccount, unfollowAccount, blockAccount, unblockAccount, unmuteAccount } from 'mastodon/actions/accounts';\nimport { openModal } from 'mastodon/actions/modal';\nimport { initMuteModal } from 'mastodon/actions/mutes';\n\nconst messages = defineMessages({\n follow: { id: 'account.follow', defaultMessage: 'Follow' },\n unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },\n requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },\n unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },\n unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },\n unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },\n});\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { id }) => ({\n account: getAccount(state, id),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n onFollow (account) {\n if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {\n if (unfollowModal) {\n dispatch(openModal('CONFIRM', {\n message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,\n confirm: intl.formatMessage(messages.unfollowConfirm),\n onConfirm: () => dispatch(unfollowAccount(account.get('id'))),\n }));\n } else {\n dispatch(unfollowAccount(account.get('id')));\n }\n } else {\n dispatch(followAccount(account.get('id')));\n }\n },\n\n onBlock (account) {\n if (account.getIn(['relationship', 'blocking'])) {\n dispatch(unblockAccount(account.get('id')));\n } else {\n dispatch(blockAccount(account.get('id')));\n }\n },\n\n onMute (account) {\n if (account.getIn(['relationship', 'muting'])) {\n dispatch(unmuteAccount(account.get('id')));\n } else {\n dispatch(initMuteModal(account));\n }\n },\n\n});\n\nexport default @injectIntl\n@connect(makeMapStateToProps, mapDispatchToProps)\nclass AccountCard extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onFollow: PropTypes.func.isRequired,\n onBlock: PropTypes.func.isRequired,\n onMute: PropTypes.func.isRequired,\n };\n\n _updateEmojis () {\n const node = this.node;\n\n if (!node || autoPlayGif) {\n return;\n }\n\n const emojis = node.querySelectorAll('.custom-emoji');\n\n for (var i = 0; i < emojis.length; i++) {\n let emoji = emojis[i];\n if (emoji.classList.contains('status-emoji')) {\n continue;\n }\n emoji.classList.add('status-emoji');\n\n emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);\n emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);\n }\n }\n\n componentDidMount () {\n this._updateEmojis();\n }\n\n componentDidUpdate () {\n this._updateEmojis();\n }\n\n handleEmojiMouseEnter = ({ target }) => {\n target.src = target.getAttribute('data-original');\n }\n\n handleEmojiMouseLeave = ({ target }) => {\n target.src = target.getAttribute('data-static');\n }\n\n handleFollow = () => {\n this.props.onFollow(this.props.account);\n }\n\n handleBlock = () => {\n this.props.onBlock(this.props.account);\n }\n\n handleMute = () => {\n this.props.onMute(this.props.account);\n }\n\n setRef = (c) => {\n this.node = c;\n }\n\n render () {\n const { account, intl } = this.props;\n\n let buttons;\n\n if (account.get('id') !== me && account.get('relationship', null) !== null) {\n const following = account.getIn(['relationship', 'following']);\n const requested = account.getIn(['relationship', 'requested']);\n const blocking = account.getIn(['relationship', 'blocking']);\n const muting = account.getIn(['relationship', 'muting']);\n\n if (requested) {\n buttons = <IconButton disabled icon='hourglass' title={intl.formatMessage(messages.requested)} />;\n } else if (blocking) {\n buttons = <IconButton active icon='unlock' title={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.handleBlock} />;\n } else if (muting) {\n buttons = <IconButton active icon='volume-up' title={intl.formatMessage(messages.unmute, { name: account.get('username') })} onClick={this.handleMute} />;\n } else if (!account.get('moved') || following) {\n buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />;\n }\n }\n\n return (\n <div className='directory__card'>\n <div className='directory__card__img'>\n <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' />\n </div>\n\n <div className='directory__card__bar'>\n <Permalink className='directory__card__bar__name' href={account.get('url')} to={`/accounts/${account.get('id')}`}>\n <Avatar account={account} size={48} />\n <DisplayName account={account} />\n </Permalink>\n\n <div className='directory__card__bar__relationship account__relationship'>\n {buttons}\n </div>\n </div>\n\n <div className='directory__card__extra' ref={this.setRef}>\n <div className='account__header__content' dangerouslySetInnerHTML={{ __html: account.get('note_emojified') }} />\n </div>\n\n <div className='directory__card__extra'>\n <div className='accounts-table__count'>{shortNumberFormat(account.get('statuses_count'))} <small><FormattedMessage id='account.posts' defaultMessage='Toots' /></small></div>\n <div className='accounts-table__count'>{shortNumberFormat(account.get('followers_count'))} <small><FormattedMessage id='account.followers' defaultMessage='Followers' /></small></div>\n <div className='accounts-table__count'>{account.get('last_status_at') === null ? <FormattedMessage id='account.never_active' defaultMessage='Never' /> : <RelativeTimestamp timestamp={account.get('last_status_at')} />} <small><FormattedMessage id='account.last_status' defaultMessage='Last active' /></small></div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nexport default class RadioButton extends React.PureComponent {\n\n static propTypes = {\n value: PropTypes.string.isRequired,\n checked: PropTypes.bool,\n name: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n label: PropTypes.node.isRequired,\n };\n\n render () {\n const { name, value, checked, onChange, label } = this.props;\n\n return (\n <label className='radio-button'>\n <input\n name={name}\n type='radio'\n value={value}\n checked={checked}\n onChange={onChange}\n />\n\n <span className={classNames('radio-button__input', { checked })} />\n\n <span>{label}</span>\n </label>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from 'mastodon/components/column';\nimport ColumnHeader from 'mastodon/components/column_header';\nimport { addColumn, removeColumn, moveColumn, changeColumnParams } from 'mastodon/actions/columns';\nimport { fetchDirectory, expandDirectory } from 'mastodon/actions/directory';\nimport { List as ImmutableList } from 'immutable';\nimport AccountCard from './components/account_card';\nimport RadioButton from 'mastodon/components/radio_button';\nimport classNames from 'classnames';\nimport LoadMore from 'mastodon/components/load_more';\nimport { ScrollContainer } from 'react-router-scroll-4';\n\nconst messages = defineMessages({\n title: { id: 'column.directory', defaultMessage: 'Browse profiles' },\n recentlyActive: { id: 'directory.recently_active', defaultMessage: 'Recently active' },\n newArrivals: { id: 'directory.new_arrivals', defaultMessage: 'New arrivals' },\n local: { id: 'directory.local', defaultMessage: 'From {domain} only' },\n federated: { id: 'directory.federated', defaultMessage: 'From known fediverse' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'directory', 'items'], ImmutableList()),\n isLoading: state.getIn(['user_lists', 'directory', 'isLoading'], true),\n domain: state.getIn(['meta', 'domain']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Directory extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n isLoading: PropTypes.bool,\n accountIds: ImmutablePropTypes.list.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n params: PropTypes.shape({\n order: PropTypes.string,\n local: PropTypes.bool,\n }),\n };\n\n state = {\n order: null,\n local: null,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('DIRECTORY', this.getParams(this.props, this.state)));\n }\n }\n\n getParams = (props, state) => ({\n order: state.order === null ? (props.params.order || 'active') : state.order,\n local: state.local === null ? (props.params.local || false) : state.local,\n });\n\n handleMove = dir => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n dispatch(fetchDirectory(this.getParams(this.props, this.state)));\n }\n\n componentDidUpdate (prevProps, prevState) {\n const { dispatch } = this.props;\n const paramsOld = this.getParams(prevProps, prevState);\n const paramsNew = this.getParams(this.props, this.state);\n\n if (paramsOld.order !== paramsNew.order || paramsOld.local !== paramsNew.local) {\n dispatch(fetchDirectory(paramsNew));\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleChangeOrder = e => {\n const { dispatch, columnId } = this.props;\n\n if (columnId) {\n dispatch(changeColumnParams(columnId, ['order'], e.target.value));\n } else {\n this.setState({ order: e.target.value });\n }\n }\n\n handleChangeLocal = e => {\n const { dispatch, columnId } = this.props;\n\n if (columnId) {\n dispatch(changeColumnParams(columnId, ['local'], e.target.value === '1'));\n } else {\n this.setState({ local: e.target.value === '1' });\n }\n }\n\n handleLoadMore = () => {\n const { dispatch } = this.props;\n dispatch(expandDirectory(this.getParams(this.props, this.state)));\n }\n\n render () {\n const { isLoading, accountIds, intl, columnId, multiColumn, domain, shouldUpdateScroll } = this.props;\n const { order, local } = this.getParams(this.props, this.state);\n const pinned = !!columnId;\n\n const scrollableArea = (\n <div className='scrollable' style={{ background: 'transparent' }}>\n <div className='filter-form'>\n <div className='filter-form__column' role='group'>\n <RadioButton name='order' value='active' label={intl.formatMessage(messages.recentlyActive)} checked={order === 'active'} onChange={this.handleChangeOrder} />\n <RadioButton name='order' value='new' label={intl.formatMessage(messages.newArrivals)} checked={order === 'new'} onChange={this.handleChangeOrder} />\n </div>\n\n <div className='filter-form__column' role='group'>\n <RadioButton name='local' value='1' label={intl.formatMessage(messages.local, { domain })} checked={local} onChange={this.handleChangeLocal} />\n <RadioButton name='local' value='0' label={intl.formatMessage(messages.federated)} checked={!local} onChange={this.handleChangeLocal} />\n </div>\n </div>\n\n <div className={classNames('directory__list', { loading: isLoading })}>\n {accountIds.map(accountId => <AccountCard id={accountId} key={accountId} />)}\n </div>\n\n <LoadMore onClick={this.handleLoadMore} visible={!isLoading} />\n </div>\n );\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='address-book-o'\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n />\n\n {multiColumn && !pinned ? <ScrollContainer scrollKey='directory' shouldUpdateScroll={shouldUpdateScroll}>{scrollableArea}</ScrollContainer> : scrollableArea}\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/domain_blocks.js b/priv/static/packs/features/domain_blocks.js
index efa714703..2e59340de 100644
--- a/priv/static/packs/features/domain_blocks.js
+++ b/priv/static/packs/features/domain_blocks.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{826:function(n,e,o){"use strict";o.r(e);var a,t,i,c,r,s,d=o(0),l=o(2),u=o(7),m=o(1),b=o(62),f=o.n(b),p=(o(3),o(13)),j=o(6),O=o(18),h=o(5),g=o.n(h),k=o(14),v=o.n(k),M=o(300),y=o(731),_=o(737),D=o(80),w=o(50),U=Object(j.f)({unblockDomain:{id:"account.unblock_domain",defaultMessage:"Unhide {domain}"}}),C=Object(j.g)((i=t=function(n){function e(){for(var e,o=arguments.length,a=new Array(o),t=0;t<o;t++)a[t]=arguments[t];return e=n.call.apply(n,[this].concat(a))||this,Object(m.a)(Object(l.a)(e),"handleDomainUnblock",(function(){e.props.onUnblockDomain(e.props.domain)})),e}return Object(u.a)(e,n),e.prototype.render=function(){var n=this.props,e=n.domain,o=n.intl;return Object(d.a)("div",{className:"domain"},void 0,Object(d.a)("div",{className:"domain__wrapper"},void 0,Object(d.a)("span",{className:"domain__domain-name"},void 0,Object(d.a)("strong",{},void 0,e)),Object(d.a)("div",{className:"domain__buttons"},void 0,Object(d.a)(w.a,{active:!0,icon:"unlock",title:o.formatMessage(U.unblockDomain,{domain:e}),onClick:this.handleDomainUnblock}))))},e}(O.a),Object(m.a)(t,"propTypes",{domain:g.a.string,onUnblockDomain:g.a.func.isRequired,intl:g.a.object.isRequired}),a=i))||a,R=o(47),q=Object(j.f)({blockDomainConfirm:{id:"confirmations.domain_block.confirm",defaultMessage:"Hide entire domain"}}),N=Object(j.g)(Object(p.connect)((function(){return function(){return{}}}),(function(n,e){var o=e.intl;return{onBlockDomain:function(e){n(Object(R.d)("CONFIRM",{message:Object(d.a)(j.b,{id:"confirmations.domain_block.message",defaultMessage:"Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",values:{domain:Object(d.a)("strong",{},void 0,e)}}),confirm:o.formatMessage(q.blockDomainConfirm),onConfirm:function(){return n(Object(D.e)(e))}}))},onUnblockDomain:function(e){n(Object(D.h)(e))}}}))(C)),T=o(1023);o.d(e,"default",(function(){return S}));var I=Object(j.f)({heading:{id:"column.domain_blocks",defaultMessage:"Hidden domains"},unblockDomain:{id:"account.unblock_domain",defaultMessage:"Unhide {domain}"}}),S=Object(p.connect)((function(n){return{domains:n.getIn(["domain_lists","blocks","items"]),hasMore:!!n.getIn(["domain_lists","blocks","next"])}}))(c=Object(j.g)((s=r=function(n){function e(){for(var e,o=arguments.length,a=new Array(o),t=0;t<o;t++)a[t]=arguments[t];return e=n.call.apply(n,[this].concat(a))||this,Object(m.a)(Object(l.a)(e),"handleLoadMore",f()((function(){e.props.dispatch(Object(D.f)())}),300,{leading:!0})),e}Object(u.a)(e,n);var o=e.prototype;return o.componentWillMount=function(){this.props.dispatch(Object(D.g)())},o.render=function(){var n=this.props,e=n.intl,o=n.domains,a=n.shouldUpdateScroll,t=n.hasMore,i=n.multiColumn;if(!o)return Object(d.a)(y.a,{},void 0,Object(d.a)(M.a,{}));var c=Object(d.a)(j.b,{id:"empty_column.domain_blocks",defaultMessage:"There are no hidden domains yet."});return Object(d.a)(y.a,{bindToDocument:!i,icon:"minus-circle",heading:e.formatMessage(I.heading)},void 0,Object(d.a)(_.a,{}),Object(d.a)(T.a,{scrollKey:"domain_blocks",onLoadMore:this.handleLoadMore,hasMore:t,shouldUpdateScroll:a,emptyMessage:c,bindToDocument:!i},void 0,o.map((function(n){return Object(d.a)(N,{domain:n},n)}))))},e}(O.a),Object(m.a)(r,"propTypes",{params:g.a.object.isRequired,dispatch:g.a.func.isRequired,shouldUpdateScroll:g.a.func,hasMore:g.a.bool,domains:v.a.orderedSet,intl:g.a.object.isRequired,multiColumn:g.a.bool}),c=s))||c)||c}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{852:function(n,o,a){"use strict";a.r(o),a.d(o,"default",(function(){return S}));var e,t,i,c=a(0),r=a(2),s=(a(9),a(6),a(8)),d=a(1),l=a(65),u=a.n(l),m=(a(3),a(15)),b=a(7),f=a(21),p=a(5),j=a.n(p),O=a(16),h=a.n(O),k=a(306),g=a(757),v=a(763),M=a(84),y=a(53);var _,D,w,U=Object(b.f)({unblockDomain:{id:"account.unblock_domain",defaultMessage:"Unblock domain {domain}"}}),C=Object(b.g)((i=t=function(n){Object(s.a)(a,n);var o;o=a;function a(){for(var o,a=arguments.length,e=new Array(a),t=0;t<a;t++)e[t]=arguments[t];return o=n.call.apply(n,[this].concat(e))||this,Object(d.a)(Object(r.a)(o),"handleDomainUnblock",(function(){o.props.onUnblockDomain(o.props.domain)})),o}return a.prototype.render=function(){var n=this.props,o=n.domain,a=n.intl;return(Object(c.a)("div",{className:"domain"},void 0,Object(c.a)("div",{className:"domain__wrapper"},void 0,Object(c.a)("span",{className:"domain__domain-name"},void 0,Object(c.a)("strong",{},void 0,o)),Object(c.a)("div",{className:"domain__buttons"},void 0,Object(c.a)(y.a,{active:!0,icon:"unlock",title:a.formatMessage(U.unblockDomain,{domain:o}),onClick:this.handleDomainUnblock})))))},a}(f.a),Object(d.a)(t,"propTypes",{domain:j.a.string,onUnblockDomain:j.a.func.isRequired,intl:j.a.object.isRequired}),e=i))||e,R=a(48),q=Object(b.f)({blockDomainConfirm:{id:"confirmations.domain_block.confirm",defaultMessage:"Block entire domain"}}),N=Object(b.g)(Object(m.connect)((function(){return function(){return{}}}),(function(n,o){var a=o.intl;return{onBlockDomain:function(o){n(Object(R.d)("CONFIRM",{message:Object(c.a)(b.b,{id:"confirmations.domain_block.message",defaultMessage:"Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",values:{domain:Object(c.a)("strong",{},void 0,o)}}),confirm:a.formatMessage(q.blockDomainConfirm),onConfirm:function(){return n(Object(M.e)(o))}}))},onUnblockDomain:function(o){n(Object(M.h)(o))}}}))(C)),T=a(1049);var I=Object(b.f)({heading:{id:"column.domain_blocks",defaultMessage:"Blocked domains"},unblockDomain:{id:"account.unblock_domain",defaultMessage:"Unblock domain {domain}"}}),S=Object(m.connect)((function(n){return{domains:n.getIn(["domain_lists","blocks","items"]),hasMore:!!n.getIn(["domain_lists","blocks","next"])}}))(_=Object(b.g)((w=D=function(n){Object(s.a)(a,n);var o;o=a;function a(){for(var o,a=arguments.length,e=new Array(a),t=0;t<a;t++)e[t]=arguments[t];return o=n.call.apply(n,[this].concat(e))||this,Object(d.a)(Object(r.a)(o),"handleLoadMore",u()((function(){o.props.dispatch(Object(M.f)())}),300,{leading:!0})),o}var e=a.prototype;return e.componentWillMount=function(){this.props.dispatch(Object(M.g)())},e.render=function(){var n=this.props,o=n.intl,a=n.domains,e=n.shouldUpdateScroll,t=n.hasMore,i=n.multiColumn;if(!a)return Object(c.a)(g.a,{},void 0,Object(c.a)(k.a,{}));var r=Object(c.a)(b.b,{id:"empty_column.domain_blocks",defaultMessage:"There are no blocked domains yet."});return(Object(c.a)(g.a,{bindToDocument:!i,icon:"minus-circle",heading:o.formatMessage(I.heading)},void 0,Object(c.a)(v.a,{}),Object(c.a)(T.a,{scrollKey:"domain_blocks",onLoadMore:this.handleLoadMore,hasMore:t,shouldUpdateScroll:e,emptyMessage:r,bindToDocument:!i},void 0,a.map((function(n){return Object(c.a)(N,{domain:n},n)})))))},a}(f.a),Object(d.a)(D,"propTypes",{params:j.a.object.isRequired,dispatch:j.a.func.isRequired,shouldUpdateScroll:j.a.func,hasMore:j.a.bool,domains:h.a.orderedSet,intl:j.a.object.isRequired,multiColumn:j.a.bool}),_=w))||_)||_}}]);
//# sourceMappingURL=domain_blocks.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/domain_blocks.js.map b/priv/static/packs/features/domain_blocks.js.map
index 2ffb7e1f2..687c9b1bc 100644
--- a/priv/static/packs/features/domain_blocks.js.map
+++ b/priv/static/packs/features/domain_blocks.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/domain.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/containers/domain_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/domain_blocks/index.js"],"names":["messages","defineMessages","unblockDomain","Account","injectIntl","props","onUnblockDomain","domain","render","this","intl","className","active","icon","title","formatMessage","onClick","handleDomainUnblock","ImmutablePureComponent","PropTypes","string","func","isRequired","object","blockDomainConfirm","connect","dispatch","onBlockDomain","openModal","message","id","defaultMessage","values","confirm","onConfirm","blockDomain","Domain","heading","Blocks","state","domains","getIn","hasMore","expandDomainBlocks","leading","componentWillMount","fetchDomainBlocks","shouldUpdateScroll","multiColumn","emptyMessage","bindToDocument","scrollKey","onLoadMore","handleLoadMore","map","params","bool","ImmutablePropTypes","orderedSet"],"mappings":"yQAMMA,EAAWC,YAAe,CAC9BC,cAAc,CAAD,gEAITC,EADUC,a,yMASQ,WACpB,EAAKC,MAAMC,gBAAgB,EAAKD,MAAME,W,sCAGxCC,OAAA,WAAW,IAAD,EACiBC,KAAKJ,MAAtBE,EADA,EACAA,OAAQG,EADR,EACQA,KAEhB,OACE,mBAAKC,UAAU,eAAf,EACE,mBAAKA,UAAU,wBAAf,EACE,oBAAMA,UAAU,4BAAhB,EACE,+BAASJ,IAGX,mBAAKI,UAAU,wBAAf,EACE,YAAC,IAAD,CAAYC,QAAM,EAACC,KAAK,SAASC,MAAOJ,EAAKK,cAAcf,EAASE,cAAe,CAAEK,WAAWS,QAASP,KAAKQ,0B,GAvBpGC,K,0BAED,CACjBX,OAAQY,IAAUC,OAClBd,gBAAiBa,IAAUE,KAAKC,WAChCZ,KAAMS,IAAUI,OAAOD,a,iBCTrBtB,EAAWC,YAAe,CAC9BuB,mBAAmB,CAAD,+EAuBLpB,cAAWqB,mBApBE,WAG1B,OAFwB,iBAAO,OAKN,SAACC,EAAD,OAAahB,EAAb,EAAaA,KAAb,MAAyB,CAClDiB,cADkD,SACnCpB,GACbmB,EAASE,YAAU,UAAW,CAC5BC,QAAS,YAAC,IAAD,CAAkBC,GAAG,qCAAqCC,eAAe,iJAAiJC,OAAQ,CAAEzB,OAAQ,+BAASA,MAC9P0B,QAASvB,EAAKK,cAAcf,EAASwB,oBACrCU,UAAW,kBAAMR,EAASS,YAAY5B,SAI1CD,gBATkD,SASjCC,GACfmB,EAASxB,YAAcK,QAIDkB,CAAiDW,I,kDCjB3E,IAAMpC,EAAWC,YAAe,CAC9BoC,QAAQ,CAAD,2DACPnC,cAAc,CAAD,gEAUToC,EAFUb,mBALQ,SAAAc,GAAK,MAAK,CAChCC,QAASD,EAAME,MAAM,CAAC,eAAgB,SAAU,UAChDC,UAAWH,EAAME,MAAM,CAAC,eAAgB,SAAU,Y,GAInDrC,a,mMAiBkB,KAAS,WACxB,EAAKC,MAAMqB,SAASiB,iBACnB,IAAK,CAAEC,SAAS,K,8CANnBC,mBAAA,WACEpC,KAAKJ,MAAMqB,SAASoB,gB,EAOtBtC,OAAA,WAAW,IAAD,EAC4DC,KAAKJ,MAAjEK,EADA,EACAA,KAAM8B,EADN,EACMA,QAASO,EADf,EACeA,mBAAoBL,EADnC,EACmCA,QAASM,EAD5C,EAC4CA,YAEpD,IAAKR,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMS,EAAe,YAAC,IAAD,CAAkBnB,GAAG,6BAA6BC,eAAe,qCAEtF,OACE,YAAC,IAAD,CAAQmB,gBAAiBF,EAAanC,KAAK,eAAewB,QAAS3B,EAAKK,cAAcf,EAASqC,eAA/F,EACE,YAAC,IAAD,IACA,YAAC,IAAD,CACEc,UAAU,gBACVC,WAAY3C,KAAK4C,eACjBX,QAASA,EACTK,mBAAoBA,EACpBE,aAAcA,EACdC,gBAAiBF,QANnB,EAQGR,EAAQc,KAAI,SAAA/C,GAAM,OACjB,YAAC,EAAD,CAA8BA,OAAQA,GAAhBA,S,GA7CbW,K,0BAEA,CACjBqC,OAAQpC,IAAUI,OAAOD,WACzBI,SAAUP,IAAUE,KAAKC,WACzByB,mBAAoB5B,IAAUE,KAC9BqB,QAASvB,IAAUqC,KACnBhB,QAASiB,IAAmBC,WAC5BhD,KAAMS,IAAUI,OAAOD,WACvB0B,YAAa7B,IAAUqC,O","file":"features/domain_blocks.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport IconButton from './icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },\n});\n\nexport default @injectIntl\nclass Account extends ImmutablePureComponent {\n\n static propTypes = {\n domain: PropTypes.string,\n onUnblockDomain: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleDomainUnblock = () => {\n this.props.onUnblockDomain(this.props.domain);\n }\n\n render () {\n const { domain, intl } = this.props;\n\n return (\n <div className='domain'>\n <div className='domain__wrapper'>\n <span className='domain__domain-name'>\n <strong>{domain}</strong>\n </span>\n\n <div className='domain__buttons'>\n <IconButton active icon='unlock' title={intl.formatMessage(messages.unblockDomain, { domain })} onClick={this.handleDomainUnblock} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { blockDomain, unblockDomain } from '../actions/domain_blocks';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Domain from '../components/domain';\nimport { openModal } from '../actions/modal';\n\nconst messages = defineMessages({\n blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },\n});\n\nconst makeMapStateToProps = () => {\n const mapStateToProps = () => ({});\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n onBlockDomain (domain) {\n dispatch(openModal('CONFIRM', {\n message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.' values={{ domain: <strong>{domain}</strong> }} />,\n confirm: intl.formatMessage(messages.blockDomainConfirm),\n onConfirm: () => dispatch(blockDomain(domain)),\n }));\n },\n\n onUnblockDomain (domain) {\n dispatch(unblockDomain(domain));\n },\n});\n\nexport default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Domain));\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport DomainContainer from '../../containers/domain_container';\nimport { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.domain_blocks', defaultMessage: 'Hidden domains' },\n unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },\n});\n\nconst mapStateToProps = state => ({\n domains: state.getIn(['domain_lists', 'blocks', 'items']),\n hasMore: !!state.getIn(['domain_lists', 'blocks', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Blocks extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n hasMore: PropTypes.bool,\n domains: ImmutablePropTypes.orderedSet,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchDomainBlocks());\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandDomainBlocks());\n }, 300, { leading: true });\n\n render () {\n const { intl, domains, shouldUpdateScroll, hasMore, multiColumn } = this.props;\n\n if (!domains) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.domain_blocks' defaultMessage='There are no hidden domains yet.' />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='minus-circle' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <ScrollableList\n scrollKey='domain_blocks'\n onLoadMore={this.handleLoadMore}\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {domains.map(domain =>\n <DomainContainer key={domain} domain={domain} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/domain.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/containers/domain_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/domain_blocks/index.js"],"names":["messages","defineMessages","unblockDomain","Account","injectIntl","props","onUnblockDomain","domain","render","this","intl","className","active","icon","title","formatMessage","onClick","handleDomainUnblock","ImmutablePureComponent","PropTypes","string","func","isRequired","object","blockDomainConfirm","connect","dispatch","onBlockDomain","openModal","message","id","defaultMessage","values","confirm","onConfirm","blockDomain","Domain","heading","Blocks","state","domains","getIn","hasMore","expandDomainBlocks","leading","componentWillMount","fetchDomainBlocks","shouldUpdateScroll","multiColumn","emptyMessage","bindToDocument","scrollKey","onLoadMore","handleLoadMore","map","params","bool","ImmutablePropTypes","orderedSet"],"mappings":"uTAMA,I,MAAMA,EAAWC,YAAe,CAC9BC,cAAc,CAAD,wEAITC,EADUC,a,oOASQ,WACpB,EAAKC,MAAMC,gBAAgB,EAAKD,MAAME,W,qBAGxCC,OAAA,WAAW,IAAD,EACiBC,KAAKJ,MAAtBE,EADA,EACAA,OAAQG,EADR,EACQA,KAEhB,OACE,mBAAKC,UAAU,eAAf,EACE,mBAAKA,UAAU,wBAAf,EACE,oBAAMA,UAAU,4BAAhB,EACE,+BAASJ,IAGX,mBAAKI,UAAU,wBAAf,EACE,YAAC,IAAD,CAAYC,QAAM,EAACC,KAAK,SAASC,MAAOJ,EAAKK,cAAcf,EAASE,cAAe,CAAEK,WAAWS,QAASP,KAAKQ,2B,GAvBpGC,K,0BAED,CACjBX,OAAQY,IAAUC,OAClBd,gBAAiBa,IAAUE,KAAKC,WAChCZ,KAAMS,IAAUI,OAAOD,a,iBCTrBtB,EAAWC,YAAe,CAC9BuB,mBAAmB,CAAD,gFAuBLpB,cAAWqB,mBApBE,WAG1B,OAFwB,iBAAO,OAKN,SAACC,EAAD,OAAahB,EAAb,EAAaA,KAAb,MAAyB,CAClDiB,cADkD,SACnCpB,GACbmB,EAASE,YAAU,UAAW,CAC5BC,QAAS,YAAC,IAAD,CAAkBC,GAAG,qCAAqCC,eAAe,iJAAiJC,OAAQ,CAAEzB,OAAQ,+BAASA,MAC9P0B,QAASvB,EAAKK,cAAcf,EAASwB,oBACrCU,UAAW,kBAAMR,EAASS,YAAY5B,SAI1CD,gBATkD,SASjCC,GACfmB,EAASxB,YAAcK,QAIDkB,CAAiDW,I,UCjB3E,IAAMpC,EAAWC,YAAe,CAC9BoC,QAAQ,CAAD,4DACPnC,cAAc,CAAD,wEAUToC,EAFUb,mBALQ,SAAAc,GAAK,MAAK,CAChCC,QAASD,EAAME,MAAM,CAAC,eAAgB,SAAU,UAChDC,UAAWH,EAAME,MAAM,CAAC,eAAgB,SAAU,Y,GAInDrC,a,8NAiBkB,KAAS,WACxB,EAAKC,MAAMqB,SAASiB,iBACnB,IAAK,CAAEC,SAAS,K,6BANnBC,mBAAA,WACEpC,KAAKJ,MAAMqB,SAASoB,gB,EAOtBtC,OAAA,WAAW,IAAD,EAC4DC,KAAKJ,MAAjEK,EADA,EACAA,KAAM8B,EADN,EACMA,QAASO,EADf,EACeA,mBAAoBL,EADnC,EACmCA,QAASM,EAD5C,EAC4CA,YAEpD,IAAKR,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMS,EAAe,YAAC,IAAD,CAAkBnB,GAAG,6BAA6BC,eAAe,sCAEtF,OACE,YAAC,IAAD,CAAQmB,gBAAiBF,EAAanC,KAAK,eAAewB,QAAS3B,EAAKK,cAAcf,EAASqC,eAA/F,EACE,YAAC,IAAD,IACA,YAAC,IAAD,CACEc,UAAU,gBACVC,WAAY3C,KAAK4C,eACjBX,QAASA,EACTK,mBAAoBA,EACpBE,aAAcA,EACdC,gBAAiBF,QANnB,EAQGR,EAAQc,KAAI,SAAA/C,GAAM,OACjB,YAAC,EAAD,CAA8BA,OAAQA,GAAhBA,U,GA7CbW,K,0BAEA,CACjBqC,OAAQpC,IAAUI,OAAOD,WACzBI,SAAUP,IAAUE,KAAKC,WACzByB,mBAAoB5B,IAAUE,KAC9BqB,QAASvB,IAAUqC,KACnBhB,QAASiB,IAAmBC,WAC5BhD,KAAMS,IAAUI,OAAOD,WACvB0B,YAAa7B,IAAUqC,O","file":"features/domain_blocks.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport IconButton from './icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },\n});\n\nexport default @injectIntl\nclass Account extends ImmutablePureComponent {\n\n static propTypes = {\n domain: PropTypes.string,\n onUnblockDomain: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleDomainUnblock = () => {\n this.props.onUnblockDomain(this.props.domain);\n }\n\n render () {\n const { domain, intl } = this.props;\n\n return (\n <div className='domain'>\n <div className='domain__wrapper'>\n <span className='domain__domain-name'>\n <strong>{domain}</strong>\n </span>\n\n <div className='domain__buttons'>\n <IconButton active icon='unlock' title={intl.formatMessage(messages.unblockDomain, { domain })} onClick={this.handleDomainUnblock} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { blockDomain, unblockDomain } from '../actions/domain_blocks';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Domain from '../components/domain';\nimport { openModal } from '../actions/modal';\n\nconst messages = defineMessages({\n blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Block entire domain' },\n});\n\nconst makeMapStateToProps = () => {\n const mapStateToProps = () => ({});\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n onBlockDomain (domain) {\n dispatch(openModal('CONFIRM', {\n message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.' values={{ domain: <strong>{domain}</strong> }} />,\n confirm: intl.formatMessage(messages.blockDomainConfirm),\n onConfirm: () => dispatch(blockDomain(domain)),\n }));\n },\n\n onUnblockDomain (domain) {\n dispatch(unblockDomain(domain));\n },\n});\n\nexport default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(Domain));\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport DomainContainer from '../../containers/domain_container';\nimport { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.domain_blocks', defaultMessage: 'Blocked domains' },\n unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },\n});\n\nconst mapStateToProps = state => ({\n domains: state.getIn(['domain_lists', 'blocks', 'items']),\n hasMore: !!state.getIn(['domain_lists', 'blocks', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Blocks extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n hasMore: PropTypes.bool,\n domains: ImmutablePropTypes.orderedSet,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchDomainBlocks());\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandDomainBlocks());\n }, 300, { leading: true });\n\n render () {\n const { intl, domains, shouldUpdateScroll, hasMore, multiColumn } = this.props;\n\n if (!domains) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.domain_blocks' defaultMessage='There are no blocked domains yet.' />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='minus-circle' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <ScrollableList\n scrollKey='domain_blocks'\n onLoadMore={this.handleLoadMore}\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {domains.map(domain =>\n <DomainContainer key={domain} domain={domain} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/favourited_statuses.js b/priv/static/packs/features/favourited_statuses.js
index 747c47ea1..fcc60050f 100644
--- a/priv/static/packs/features/favourited_statuses.js
+++ b/priv/static/packs/features/favourited_statuses.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{799:function(t,e,a){"use strict";a.r(e),a.d(e,"default",(function(){return C}));var o,n,s,i=a(0),c=a(2),u=a(7),l=a(1),r=a(62),d=a.n(r),h=a(3),p=a.n(h),b=a(13),f=a(5),j=a.n(f),O=a(14),m=a.n(O),g=a(204),v=a(731),M=a(733),I=a(250),w=a(1038),y=a(6),L=a(18),k=Object(y.f)({heading:{id:"column.favourites",defaultMessage:"Favourites"}}),C=Object(b.connect)((function(t){return{statusIds:t.getIn(["status_lists","favourites","items"]),isLoading:t.getIn(["status_lists","favourites","isLoading"],!0),hasMore:!!t.getIn(["status_lists","favourites","next"])}}))(o=Object(y.g)((s=n=function(t){function e(){for(var e,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return e=t.call.apply(t,[this].concat(o))||this,Object(l.a)(Object(c.a)(e),"handlePin",(function(){var t=e.props,a=t.columnId,o=t.dispatch;o(a?Object(I.h)(a):Object(I.e)("FAVOURITES",{}))})),Object(l.a)(Object(c.a)(e),"handleMove",(function(t){var a=e.props,o=a.columnId;(0,a.dispatch)(Object(I.g)(o,t))})),Object(l.a)(Object(c.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(l.a)(Object(c.a)(e),"setRef",(function(t){e.column=t})),Object(l.a)(Object(c.a)(e),"handleLoadMore",d()((function(){e.props.dispatch(Object(g.g)())}),300,{leading:!0})),e}Object(u.a)(e,t);var a=e.prototype;return a.componentWillMount=function(){this.props.dispatch(Object(g.h)())},a.render=function(){var t=this.props,e=t.intl,a=t.shouldUpdateScroll,o=t.statusIds,n=t.columnId,s=t.multiColumn,c=t.hasMore,u=t.isLoading,l=!!n,r=Object(i.a)(y.b,{id:"empty_column.favourited_statuses",defaultMessage:"You don't have any favourite toots yet. When you favourite one, it will show up here."});return p.a.createElement(v.a,{bindToDocument:!s,ref:this.setRef,label:e.formatMessage(k.heading)},Object(i.a)(M.a,{icon:"star",title:e.formatMessage(k.heading),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:l,multiColumn:s,showBackButton:!0}),Object(i.a)(w.a,{trackScroll:!l,statusIds:o,scrollKey:"favourited_statuses-"+n,hasMore:c,isLoading:u,onLoadMore:this.handleLoadMore,shouldUpdateScroll:a,emptyMessage:r,bindToDocument:!s}))},e}(L.a),Object(l.a)(n,"propTypes",{dispatch:j.a.func.isRequired,shouldUpdateScroll:j.a.func,statusIds:m.a.list.isRequired,intl:j.a.object.isRequired,columnId:j.a.string,multiColumn:j.a.bool,hasMore:j.a.bool,isLoading:j.a.bool}),o=s))||o)||o}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{825:function(t,e,a){"use strict";a.r(e),a.d(e,"default",(function(){return C}));var o,n,s,i=a(0),c=a(2),u=(a(9),a(6),a(8)),r=a(1),l=a(65),d=a.n(l),h=a(3),p=a.n(h),b=a(15),f=a(5),j=a.n(f),O=a(16),m=a.n(O),g=a(208),v=a(757),M=a(759),I=a(253),w=a(1065),y=a(7),L=a(21);var k=Object(y.f)({heading:{id:"column.favourites",defaultMessage:"Favourites"}}),C=Object(b.connect)((function(t){return{statusIds:t.getIn(["status_lists","favourites","items"]),isLoading:t.getIn(["status_lists","favourites","isLoading"],!0),hasMore:!!t.getIn(["status_lists","favourites","next"])}}))(o=Object(y.g)((s=n=function(t){Object(u.a)(a,t);var e;e=a;function a(){for(var e,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return e=t.call.apply(t,[this].concat(o))||this,Object(r.a)(Object(c.a)(e),"handlePin",(function(){var t=e.props,a=t.columnId,o=t.dispatch;o(a?Object(I.h)(a):Object(I.e)("FAVOURITES",{}))})),Object(r.a)(Object(c.a)(e),"handleMove",(function(t){var a=e.props,o=a.columnId;(0,a.dispatch)(Object(I.g)(o,t))})),Object(r.a)(Object(c.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(r.a)(Object(c.a)(e),"setRef",(function(t){e.column=t})),Object(r.a)(Object(c.a)(e),"handleLoadMore",d()((function(){e.props.dispatch(Object(g.g)())}),300,{leading:!0})),e}var o=a.prototype;return o.componentWillMount=function(){this.props.dispatch(Object(g.h)())},o.render=function(){var t=this.props,e=t.intl,a=t.shouldUpdateScroll,o=t.statusIds,n=t.columnId,s=t.multiColumn,c=t.hasMore,u=t.isLoading,r=!!n,l=Object(i.a)(y.b,{id:"empty_column.favourited_statuses",defaultMessage:"You don't have any favourite toots yet. When you favourite one, it will show up here."});return p.a.createElement(v.a,{bindToDocument:!s,ref:this.setRef,label:e.formatMessage(k.heading)},Object(i.a)(M.a,{icon:"star",title:e.formatMessage(k.heading),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:r,multiColumn:s,showBackButton:!0}),Object(i.a)(w.a,{trackScroll:!r,statusIds:o,scrollKey:"favourited_statuses-"+n,hasMore:c,isLoading:u,onLoadMore:this.handleLoadMore,shouldUpdateScroll:a,emptyMessage:l,bindToDocument:!s}))},a}(L.a),Object(r.a)(n,"propTypes",{dispatch:j.a.func.isRequired,shouldUpdateScroll:j.a.func,statusIds:m.a.list.isRequired,intl:j.a.object.isRequired,columnId:j.a.string,multiColumn:j.a.bool,hasMore:j.a.bool,isLoading:j.a.bool}),o=s))||o)||o}}]);
//# sourceMappingURL=favourited_statuses.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/favourited_statuses.js.map b/priv/static/packs/features/favourited_statuses.js.map
index 136949ae3..5d1a473bf 100644
--- a/priv/static/packs/features/favourited_statuses.js.map
+++ b/priv/static/packs/features/favourited_statuses.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/favourited_statuses/index.js"],"names":["messages","defineMessages","heading","Favourites","connect","state","statusIds","getIn","isLoading","hasMore","injectIntl","props","columnId","dispatch","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","expandFavouritedStatuses","leading","componentWillMount","this","fetchFavouritedStatuses","render","intl","shouldUpdateScroll","multiColumn","pinned","emptyMessage","id","defaultMessage","bindToDocument","ref","setRef","label","formatMessage","icon","title","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","showBackButton","trackScroll","scrollKey","onLoadMore","handleLoadMore","ImmutablePureComponent","PropTypes","func","isRequired","ImmutablePropTypes","list","object","string","bool"],"mappings":"uTAaMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,sDAWHC,EAFUC,mBANQ,SAAAC,GAAK,MAAK,CAChCC,UAAWD,EAAME,MAAM,CAAC,eAAgB,aAAc,UACtDC,UAAWH,EAAME,MAAM,CAAC,eAAgB,aAAc,cAAc,GACpEE,UAAWJ,EAAME,MAAM,CAAC,eAAgB,aAAc,Y,GAIvDG,a,+LAkBa,WAAO,IAAD,EACe,EAAKC,MAA5BC,EADQ,EACRA,SAAUC,EADF,EACEA,SAGhBA,EADED,EACOE,YAAaF,GAEbG,YAAU,aAAc,Q,yCAIxB,SAACC,GAAS,IAAD,EACW,EAAKL,MAA5BC,EADY,EACZA,UACRC,EAFoB,EACFA,UACTI,YAAWL,EAAUI,O,gDAGZ,WAClB,EAAKE,OAAOC,e,qCAGL,SAAAC,GACP,EAAKF,OAASE,K,4CAGC,KAAS,WACxB,EAAKT,MAAME,SAASQ,iBACnB,IAAK,CAAEC,SAAS,K,8CA7BnBC,mBAAA,WACEC,KAAKb,MAAME,SAASY,gB,EA8BtBC,OAAA,WAAW,IAAD,EACmFF,KAAKb,MAAxFgB,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBtB,EAD1B,EAC0BA,UAAWM,EADrC,EACqCA,SAAUiB,EAD/C,EAC+CA,YAAapB,EAD5D,EAC4DA,QAASD,EADrE,EACqEA,UACvEsB,IAAWlB,EAEXmB,EAAe,YAAC,IAAD,CAAkBC,GAAG,mCAAmCC,eAAe,0FAE5F,OACE,kBAAC,IAAD,CAAQC,gBAAiBL,EAAaM,IAAKX,KAAKY,OAAQC,MAAOV,EAAKW,cAActC,EAASE,UACzF,YAAC,IAAD,CACEqC,KAAK,OACLC,MAAOb,EAAKW,cAActC,EAASE,SACnCuC,MAAOjB,KAAKkB,UACZC,OAAQnB,KAAKoB,WACbC,QAASrB,KAAKsB,kBACdhB,OAAQA,EACRD,YAAaA,EACbkB,gBAAc,IAGhB,YAAC,IAAD,CACEC,aAAclB,EACdxB,UAAWA,EACX2C,UAAS,uBAAyBrC,EAClCH,QAASA,EACTD,UAAWA,EACX0C,WAAY1B,KAAK2B,eACjBvB,mBAAoBA,EACpBG,aAAcA,EACdG,gBAAiBL,M,GAxEFuB,K,0BAEJ,CACjBvC,SAAUwC,IAAUC,KAAKC,WACzB3B,mBAAoByB,IAAUC,KAC9BhD,UAAWkD,IAAmBC,KAAKF,WACnC5B,KAAM0B,IAAUK,OAAOH,WACvB3C,SAAUyC,IAAUM,OACpB9B,YAAawB,IAAUO,KACvBnD,QAAS4C,IAAUO,KACnBpD,UAAW6C,IAAUO,O","file":"features/favourited_statuses.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { fetchFavouritedStatuses, expandFavouritedStatuses } from '../../actions/favourites';\nimport Column from '../ui/components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport StatusList from '../../components/status_list';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { debounce } from 'lodash';\n\nconst messages = defineMessages({\n heading: { id: 'column.favourites', defaultMessage: 'Favourites' },\n});\n\nconst mapStateToProps = state => ({\n statusIds: state.getIn(['status_lists', 'favourites', 'items']),\n isLoading: state.getIn(['status_lists', 'favourites', 'isLoading'], true),\n hasMore: !!state.getIn(['status_lists', 'favourites', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Favourites extends ImmutablePureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n statusIds: ImmutablePropTypes.list.isRequired,\n intl: PropTypes.object.isRequired,\n columnId: PropTypes.string,\n multiColumn: PropTypes.bool,\n hasMore: PropTypes.bool,\n isLoading: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchFavouritedStatuses());\n }\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('FAVOURITES', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandFavouritedStatuses());\n }, 300, { leading: true })\n\n render () {\n const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props;\n const pinned = !!columnId;\n\n const emptyMessage = <FormattedMessage id='empty_column.favourited_statuses' defaultMessage=\"You don't have any favourite toots yet. When you favourite one, it will show up here.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.heading)}>\n <ColumnHeader\n icon='star'\n title={intl.formatMessage(messages.heading)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n showBackButton\n />\n\n <StatusList\n trackScroll={!pinned}\n statusIds={statusIds}\n scrollKey={`favourited_statuses-${columnId}`}\n hasMore={hasMore}\n isLoading={isLoading}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/favourited_statuses/index.js"],"names":["messages","defineMessages","heading","Favourites","connect","state","statusIds","getIn","isLoading","hasMore","injectIntl","props","columnId","dispatch","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","expandFavouritedStatuses","leading","componentWillMount","this","fetchFavouritedStatuses","render","intl","shouldUpdateScroll","multiColumn","pinned","emptyMessage","id","defaultMessage","bindToDocument","ref","setRef","label","formatMessage","icon","title","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","showBackButton","trackScroll","scrollKey","onLoadMore","handleLoadMore","ImmutablePureComponent","PropTypes","func","isRequired","ImmutablePropTypes","list","object","string","bool"],"mappings":"mUAaA,IAAMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,sDAWHC,EAFUC,mBANQ,SAAAC,GAAK,MAAK,CAChCC,UAAWD,EAAME,MAAM,CAAC,eAAgB,aAAc,UACtDC,UAAWH,EAAME,MAAM,CAAC,eAAgB,aAAc,cAAc,GACpEE,UAAWJ,EAAME,MAAM,CAAC,eAAgB,aAAc,Y,GAIvDG,a,0NAkBa,WAAO,IAAD,EACe,EAAKC,MAA5BC,EADQ,EACRA,SAAUC,EADF,EACEA,SAGhBA,EADED,EACOE,YAAaF,GAEbG,YAAU,aAAc,Q,yCAIxB,SAACC,GAAS,IAAD,EACW,EAAKL,MAA5BC,EADY,EACZA,UACRC,EAFoB,EACFA,UACTI,YAAWL,EAAUI,O,gDAGZ,WAClB,EAAKE,OAAOC,e,qCAGL,SAAAC,GACP,EAAKF,OAASE,K,4CAGC,KAAS,WACxB,EAAKT,MAAME,SAASQ,iBACnB,IAAK,CAAEC,SAAS,K,6BA7BnBC,mBAAA,WACEC,KAAKb,MAAME,SAASY,gB,EA8BtBC,OAAA,WAAW,IAAD,EACmFF,KAAKb,MAAxFgB,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBtB,EAD1B,EAC0BA,UAAWM,EADrC,EACqCA,SAAUiB,EAD/C,EAC+CA,YAAapB,EAD5D,EAC4DA,QAASD,EADrE,EACqEA,UACvEsB,IAAWlB,EAEXmB,EAAe,YAAC,IAAD,CAAkBC,GAAG,mCAAmCC,eAAe,0FAE5F,OACE,kBAAC,IAAD,CAAQC,gBAAiBL,EAAaM,IAAKX,KAAKY,OAAQC,MAAOV,EAAKW,cAActC,EAASE,UACzF,YAAC,IAAD,CACEqC,KAAK,OACLC,MAAOb,EAAKW,cAActC,EAASE,SACnCuC,MAAOjB,KAAKkB,UACZC,OAAQnB,KAAKoB,WACbC,QAASrB,KAAKsB,kBACdhB,OAAQA,EACRD,YAAaA,EACbkB,gBAAc,IAGhB,YAAC,IAAD,CACEC,aAAclB,EACdxB,UAAWA,EACX2C,UAAS,uBAAyBrC,EAClCH,QAASA,EACTD,UAAWA,EACX0C,WAAY1B,KAAK2B,eACjBvB,mBAAoBA,EACpBG,aAAcA,EACdG,gBAAiBL,M,GAxEFuB,K,0BAEJ,CACjBvC,SAAUwC,IAAUC,KAAKC,WACzB3B,mBAAoByB,IAAUC,KAC9BhD,UAAWkD,IAAmBC,KAAKF,WACnC5B,KAAM0B,IAAUK,OAAOH,WACvB3C,SAAUyC,IAAUM,OACpB9B,YAAawB,IAAUO,KACvBnD,QAAS4C,IAAUO,KACnBpD,UAAW6C,IAAUO,O","file":"features/favourited_statuses.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { fetchFavouritedStatuses, expandFavouritedStatuses } from '../../actions/favourites';\nimport Column from '../ui/components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport StatusList from '../../components/status_list';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { debounce } from 'lodash';\n\nconst messages = defineMessages({\n heading: { id: 'column.favourites', defaultMessage: 'Favourites' },\n});\n\nconst mapStateToProps = state => ({\n statusIds: state.getIn(['status_lists', 'favourites', 'items']),\n isLoading: state.getIn(['status_lists', 'favourites', 'isLoading'], true),\n hasMore: !!state.getIn(['status_lists', 'favourites', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Favourites extends ImmutablePureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n statusIds: ImmutablePropTypes.list.isRequired,\n intl: PropTypes.object.isRequired,\n columnId: PropTypes.string,\n multiColumn: PropTypes.bool,\n hasMore: PropTypes.bool,\n isLoading: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchFavouritedStatuses());\n }\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('FAVOURITES', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandFavouritedStatuses());\n }, 300, { leading: true })\n\n render () {\n const { intl, shouldUpdateScroll, statusIds, columnId, multiColumn, hasMore, isLoading } = this.props;\n const pinned = !!columnId;\n\n const emptyMessage = <FormattedMessage id='empty_column.favourited_statuses' defaultMessage=\"You don't have any favourite toots yet. When you favourite one, it will show up here.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.heading)}>\n <ColumnHeader\n icon='star'\n title={intl.formatMessage(messages.heading)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n showBackButton\n />\n\n <StatusList\n trackScroll={!pinned}\n statusIds={statusIds}\n scrollKey={`favourited_statuses-${columnId}`}\n hasMore={hasMore}\n isLoading={isLoading}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/favourites.js b/priv/static/packs/features/favourites.js
index 605a1ed64..337ad7f6f 100644
--- a/priv/static/packs/features/favourites.js
+++ b/priv/static/packs/features/favourites.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{797:function(t,e,a){"use strict";a.r(e),a.d(e,"default",(function(){return q}));var s,o,r,n=a(0),c=a(2),i=a(7),u=a(1),p=(a(3),a(13)),d=a(18),l=a(5),h=a.n(l),f=a(14),b=a.n(f),m=a(300),j=a(45),O=a(6),v=a(1026),I=a(731),w=a(1023),y=a(26),g=a(733),R=Object(O.f)({refresh:{id:"refresh",defaultMessage:"Refresh"}}),q=Object(p.connect)((function(t,e){return{accountIds:t.getIn(["user_lists","favourited_by",e.params.statusId])}}))(s=Object(O.g)((r=o=function(t){function e(){for(var e,a=arguments.length,s=new Array(a),o=0;o<a;o++)s[o]=arguments[o];return e=t.call.apply(t,[this].concat(s))||this,Object(u.a)(Object(c.a)(e),"handleRefresh",(function(){e.props.dispatch(Object(j.q)(e.props.params.statusId))})),e}Object(i.a)(e,t);var a=e.prototype;return a.componentWillMount=function(){this.props.accountIds||this.props.dispatch(Object(j.q)(this.props.params.statusId))},a.componentWillReceiveProps=function(t){t.params.statusId!==this.props.params.statusId&&t.params.statusId&&this.props.dispatch(Object(j.q)(t.params.statusId))},a.render=function(){var t=this.props,e=t.intl,a=t.shouldUpdateScroll,s=t.accountIds,o=t.multiColumn;if(!s)return Object(n.a)(I.a,{},void 0,Object(n.a)(m.a,{}));var r=Object(n.a)(O.b,{id:"empty_column.favourites",defaultMessage:"No one has favourited this toot yet. When someone does, they will show up here."});return Object(n.a)(I.a,{bindToDocument:!o},void 0,Object(n.a)(g.a,{showBackButton:!0,multiColumn:o,extraButton:Object(n.a)("button",{className:"column-header__button",title:e.formatMessage(R.refresh),"aria-label":e.formatMessage(R.refresh),onClick:this.handleRefresh},void 0,Object(n.a)(y.a,{id:"refresh"}))}),Object(n.a)(w.a,{scrollKey:"favourites",shouldUpdateScroll:a,emptyMessage:r,bindToDocument:!o},void 0,s.map((function(t){return Object(n.a)(v.a,{id:t,withNote:!1},t)}))))},e}(d.a),Object(u.a)(o,"propTypes",{params:h.a.object.isRequired,dispatch:h.a.func.isRequired,shouldUpdateScroll:h.a.func,accountIds:b.a.list,multiColumn:h.a.bool,intl:h.a.object.isRequired}),s=r))||s)||s}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{823:function(t,e,a){"use strict";a.r(e),a.d(e,"default",(function(){return q}));var s,o,r,n=a(0),c=a(2),i=(a(9),a(6),a(8)),u=a(1),p=(a(3),a(15)),d=a(21),l=a(5),h=a.n(l),f=a(16),b=a.n(f),m=a(306),j=a(46),O=a(7),v=a(1053),I=a(757),w=a(1049),y=a(27),g=a(759);var R=Object(O.f)({refresh:{id:"refresh",defaultMessage:"Refresh"}}),q=Object(p.connect)((function(t,e){return{accountIds:t.getIn(["user_lists","favourited_by",e.params.statusId])}}))(s=Object(O.g)((r=o=function(t){Object(i.a)(a,t);var e;e=a;function a(){for(var e,a=arguments.length,s=new Array(a),o=0;o<a;o++)s[o]=arguments[o];return e=t.call.apply(t,[this].concat(s))||this,Object(u.a)(Object(c.a)(e),"handleRefresh",(function(){e.props.dispatch(Object(j.q)(e.props.params.statusId))})),e}var s=a.prototype;return s.componentWillMount=function(){this.props.accountIds||this.props.dispatch(Object(j.q)(this.props.params.statusId))},s.componentWillReceiveProps=function(t){t.params.statusId!==this.props.params.statusId&&t.params.statusId&&this.props.dispatch(Object(j.q)(t.params.statusId))},s.render=function(){var t=this.props,e=t.intl,a=t.shouldUpdateScroll,s=t.accountIds,o=t.multiColumn;if(!s)return Object(n.a)(I.a,{},void 0,Object(n.a)(m.a,{}));var r=Object(n.a)(O.b,{id:"empty_column.favourites",defaultMessage:"No one has favourited this toot yet. When someone does, they will show up here."});return(Object(n.a)(I.a,{bindToDocument:!o},void 0,Object(n.a)(g.a,{showBackButton:!0,multiColumn:o,extraButton:Object(n.a)("button",{className:"column-header__button",title:e.formatMessage(R.refresh),"aria-label":e.formatMessage(R.refresh),onClick:this.handleRefresh},void 0,Object(n.a)(y.a,{id:"refresh"}))}),Object(n.a)(w.a,{scrollKey:"favourites",shouldUpdateScroll:a,emptyMessage:r,bindToDocument:!o},void 0,s.map((function(t){return Object(n.a)(v.a,{id:t,withNote:!1},t)})))))},a}(d.a),Object(u.a)(o,"propTypes",{params:h.a.object.isRequired,dispatch:h.a.func.isRequired,shouldUpdateScroll:h.a.func,accountIds:b.a.list,multiColumn:h.a.bool,intl:h.a.object.isRequired}),s=r))||s)||s}}]);
//# sourceMappingURL=favourites.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/favourites.js.map b/priv/static/packs/features/favourites.js.map
index d1586da7a..9f9501be2 100644
--- a/priv/static/packs/features/favourites.js.map
+++ b/priv/static/packs/features/favourites.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/favourites/index.js"],"names":["messages","defineMessages","refresh","Favourites","connect","state","props","accountIds","getIn","params","statusId","injectIntl","dispatch","fetchFavourites","componentWillMount","this","componentWillReceiveProps","nextProps","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","showBackButton","extraButton","className","title","formatMessage","aria-label","onClick","handleRefresh","scrollKey","map","withNote","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"8SAcMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,yCASHC,EAFUC,mBAJQ,SAACC,EAAOC,GAAR,MAAmB,CACzCC,WAAYF,EAAMG,MAAM,CAAC,aAAc,gBAAiBF,EAAMG,OAAOC,c,GAItEC,a,mMAwBiB,WACd,EAAKL,MAAMM,SAASC,YAAgB,EAAKP,MAAMG,OAAOC,c,8CAbxDI,mBAAA,WACOC,KAAKT,MAAMC,YACdQ,KAAKT,MAAMM,SAASC,YAAgBE,KAAKT,MAAMG,OAAOC,Y,EAI1DM,0BAAA,SAA2BC,GACrBA,EAAUR,OAAOC,WAAaK,KAAKT,MAAMG,OAAOC,UAAYO,EAAUR,OAAOC,UAC/EK,KAAKT,MAAMM,SAASC,YAAgBI,EAAUR,OAAOC,Y,EAQzDQ,OAAA,WAAW,IAAD,EACsDH,KAAKT,MAA3Da,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBb,EAD1B,EAC0BA,WAAYc,EADtC,EACsCA,YAE9C,IAAKd,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAe,YAAC,IAAD,CAAkBC,GAAG,0BAA0BC,eAAe,oFAEnF,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,QAAzB,EACE,YAAC,IAAD,CACEK,gBAAc,EACdL,YAAaA,EACbM,YACE,sBAAQC,UAAU,wBAAwBC,MAAOV,EAAKW,cAAc9B,EAASE,SAAU6B,aAAYZ,EAAKW,cAAc9B,EAASE,SAAU8B,QAASjB,KAAKkB,oBAAvJ,EAAsK,YAAC,IAAD,CAAMV,GAAG,eAInL,YAAC,IAAD,CACEW,UAAU,aACVd,mBAAoBA,EACpBE,aAAcA,EACdG,gBAAiBJ,QAJnB,EAMGd,EAAW4B,KAAI,SAAAZ,GAAE,OAChB,YAAC,IAAD,CAA2BA,GAAIA,EAAIa,UAAU,GAAtBb,S,GAzDVc,K,0BAEJ,CACjB5B,OAAQ6B,IAAUC,OAAOC,WACzB5B,SAAU0B,IAAUG,KAAKD,WACzBpB,mBAAoBkB,IAAUG,KAC9BlC,WAAYmC,IAAmBC,KAC/BtB,YAAaiB,IAAUM,KACvBzB,KAAMmB,IAAUC,OAAOC,a","file":"features/favourites.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport { fetchFavourites } from '../../actions/interactions';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport AccountContainer from '../../containers/account_container';\nimport Column from '../ui/components/column';\nimport ScrollableList from '../../components/scrollable_list';\nimport Icon from 'mastodon/components/icon';\nimport ColumnHeader from '../../components/column_header';\n\nconst messages = defineMessages({\n refresh: { id: 'refresh', defaultMessage: 'Refresh' },\n});\n\nconst mapStateToProps = (state, props) => ({\n accountIds: state.getIn(['user_lists', 'favourited_by', props.params.statusId]),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Favourites extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n multiColumn: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n };\n\n componentWillMount () {\n if (!this.props.accountIds) {\n this.props.dispatch(fetchFavourites(this.props.params.statusId));\n }\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {\n this.props.dispatch(fetchFavourites(nextProps.params.statusId));\n }\n }\n\n handleRefresh = () => {\n this.props.dispatch(fetchFavourites(this.props.params.statusId));\n }\n\n render () {\n const { intl, shouldUpdateScroll, accountIds, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.favourites' defaultMessage='No one has favourited this toot yet. When someone does, they will show up here.' />;\n\n return (\n <Column bindToDocument={!multiColumn}>\n <ColumnHeader\n showBackButton\n multiColumn={multiColumn}\n extraButton={(\n <button className='column-header__button' title={intl.formatMessage(messages.refresh)} aria-label={intl.formatMessage(messages.refresh)} onClick={this.handleRefresh}><Icon id='refresh' /></button>\n )}\n />\n\n <ScrollableList\n scrollKey='favourites'\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountContainer key={id} id={id} withNote={false} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/favourites/index.js"],"names":["messages","defineMessages","refresh","Favourites","connect","state","props","accountIds","getIn","params","statusId","injectIntl","dispatch","fetchFavourites","componentWillMount","this","componentWillReceiveProps","nextProps","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","showBackButton","extraButton","className","title","formatMessage","aria-label","onClick","handleRefresh","scrollKey","map","withNote","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"0TAcA,IAAMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,yCASHC,EAFUC,mBAJQ,SAACC,EAAOC,GAAR,MAAmB,CACzCC,WAAYF,EAAMG,MAAM,CAAC,aAAc,gBAAiBF,EAAMG,OAAOC,c,GAItEC,a,8NAwBiB,WACd,EAAKL,MAAMM,SAASC,YAAgB,EAAKP,MAAMG,OAAOC,c,6BAbxDI,mBAAA,WACOC,KAAKT,MAAMC,YACdQ,KAAKT,MAAMM,SAASC,YAAgBE,KAAKT,MAAMG,OAAOC,Y,EAI1DM,0BAAA,SAA2BC,GACrBA,EAAUR,OAAOC,WAAaK,KAAKT,MAAMG,OAAOC,UAAYO,EAAUR,OAAOC,UAC/EK,KAAKT,MAAMM,SAASC,YAAgBI,EAAUR,OAAOC,Y,EAQzDQ,OAAA,WAAW,IAAD,EACsDH,KAAKT,MAA3Da,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBb,EAD1B,EAC0BA,WAAYc,EADtC,EACsCA,YAE9C,IAAKd,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAe,YAAC,IAAD,CAAkBC,GAAG,0BAA0BC,eAAe,oFAEnF,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,QAAzB,EACE,YAAC,IAAD,CACEK,gBAAc,EACdL,YAAaA,EACbM,YACE,sBAAQC,UAAU,wBAAwBC,MAAOV,EAAKW,cAAc9B,EAASE,SAAU6B,aAAYZ,EAAKW,cAAc9B,EAASE,SAAU8B,QAASjB,KAAKkB,oBAAvJ,EAAsK,YAAC,IAAD,CAAMV,GAAG,eAInL,YAAC,IAAD,CACEW,UAAU,aACVd,mBAAoBA,EACpBE,aAAcA,EACdG,gBAAiBJ,QAJnB,EAMGd,EAAW4B,KAAI,SAAAZ,GAAE,OAChB,YAAC,IAAD,CAA2BA,GAAIA,EAAIa,UAAU,GAAtBb,U,GAzDVc,K,0BAEJ,CACjB5B,OAAQ6B,IAAUC,OAAOC,WACzB5B,SAAU0B,IAAUG,KAAKD,WACzBpB,mBAAoBkB,IAAUG,KAC9BlC,WAAYmC,IAAmBC,KAC/BtB,YAAaiB,IAAUM,KACvBzB,KAAMmB,IAAUC,OAAOC,a","file":"features/favourites.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport { fetchFavourites } from '../../actions/interactions';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport AccountContainer from '../../containers/account_container';\nimport Column from '../ui/components/column';\nimport ScrollableList from '../../components/scrollable_list';\nimport Icon from 'mastodon/components/icon';\nimport ColumnHeader from '../../components/column_header';\n\nconst messages = defineMessages({\n refresh: { id: 'refresh', defaultMessage: 'Refresh' },\n});\n\nconst mapStateToProps = (state, props) => ({\n accountIds: state.getIn(['user_lists', 'favourited_by', props.params.statusId]),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Favourites extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n multiColumn: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n };\n\n componentWillMount () {\n if (!this.props.accountIds) {\n this.props.dispatch(fetchFavourites(this.props.params.statusId));\n }\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {\n this.props.dispatch(fetchFavourites(nextProps.params.statusId));\n }\n }\n\n handleRefresh = () => {\n this.props.dispatch(fetchFavourites(this.props.params.statusId));\n }\n\n render () {\n const { intl, shouldUpdateScroll, accountIds, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.favourites' defaultMessage='No one has favourited this toot yet. When someone does, they will show up here.' />;\n\n return (\n <Column bindToDocument={!multiColumn}>\n <ColumnHeader\n showBackButton\n multiColumn={multiColumn}\n extraButton={(\n <button className='column-header__button' title={intl.formatMessage(messages.refresh)} aria-label={intl.formatMessage(messages.refresh)} onClick={this.handleRefresh}><Icon id='refresh' /></button>\n )}\n />\n\n <ScrollableList\n scrollKey='favourites'\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountContainer key={id} id={id} withNote={false} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/follow_requests.js b/priv/static/packs/features/follow_requests.js
index c022a1eee..902c02d13 100644
--- a/priv/static/packs/features/follow_requests.js
+++ b/priv/static/packs/features/follow_requests.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{825:function(e,t,a){"use strict";a.r(t);var o,c,n,i,r,s,u=a(0),l=a(2),d=a(7),b=a(1),j=a(62),p=a.n(j),f=(a(3),a(13)),h=a(6),O=a(18),m=a(5),v=a.n(m),_=a(14),g=a.n(_),w=a(300),M=a(731),q=a(737),y=a(206),z=a(294),R=a(111),N=a(118),I=a(50),k=Object(h.f)({authorize:{id:"follow_request.authorize",defaultMessage:"Authorize"},reject:{id:"follow_request.reject",defaultMessage:"Reject"}}),A=Object(h.g)((n=c=function(e){function t(){return e.apply(this,arguments)||this}return Object(d.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.intl,a=e.account,o=e.onAuthorize,c=e.onReject,n={__html:a.get("note_emojified")};return Object(u.a)("div",{className:"account-authorize__wrapper"},void 0,Object(u.a)("div",{className:"account-authorize"},void 0,Object(u.a)(z.a,{href:a.get("url"),to:"/accounts/"+a.get("id"),className:"detailed-status__display-name"},void 0,Object(u.a)("div",{className:"account-authorize__avatar"},void 0,Object(u.a)(R.a,{account:a,size:48})),Object(u.a)(N.a,{account:a})),Object(u.a)("div",{className:"account__header__content",dangerouslySetInnerHTML:n})),Object(u.a)("div",{className:"account--panel"},void 0,Object(u.a)("div",{className:"account--panel__button"},void 0,Object(u.a)(I.a,{title:t.formatMessage(k.authorize),icon:"check",onClick:o})),Object(u.a)("div",{className:"account--panel__button"},void 0,Object(u.a)(I.a,{title:t.formatMessage(k.reject),icon:"times",onClick:c}))))},t}(O.a),Object(b.a)(c,"propTypes",{account:g.a.map.isRequired,onAuthorize:v.a.func.isRequired,onReject:v.a.func.isRequired,intl:v.a.object.isRequired}),o=n))||o,T=a(25),C=Object(f.connect)((function(){var e=Object(y.d)();return function(t,a){return{account:e(t,a.id)}}}),(function(e,t){var a=t.id;return{onAuthorize:function(){e(Object(T.v)(a))},onReject:function(){e(Object(T.I)(a))}}}))(A),L=a(1023);a.d(t,"default",(function(){return U}));var S=Object(h.f)({heading:{id:"column.follow_requests",defaultMessage:"Follow requests"}}),U=Object(f.connect)((function(e){return{accountIds:e.getIn(["user_lists","follow_requests","items"]),hasMore:!!e.getIn(["user_lists","follow_requests","next"])}}))(i=Object(h.g)((s=r=function(e){function t(){for(var t,a=arguments.length,o=new Array(a),c=0;c<a;c++)o[c]=arguments[c];return t=e.call.apply(e,[this].concat(o))||this,Object(b.a)(Object(l.a)(t),"handleLoadMore",p()((function(){t.props.dispatch(Object(T.x)())}),300,{leading:!0})),t}Object(d.a)(t,e);var a=t.prototype;return a.componentWillMount=function(){this.props.dispatch(Object(T.B)())},a.render=function(){var e=this.props,t=e.intl,a=e.shouldUpdateScroll,o=e.accountIds,c=e.hasMore,n=e.multiColumn;if(!o)return Object(u.a)(M.a,{},void 0,Object(u.a)(w.a,{}));var i=Object(u.a)(h.b,{id:"empty_column.follow_requests",defaultMessage:"You don't have any follow requests yet. When you receive one, it will show up here."});return Object(u.a)(M.a,{bindToDocument:!n,icon:"user-plus",heading:t.formatMessage(S.heading)},void 0,Object(u.a)(q.a,{}),Object(u.a)(L.a,{scrollKey:"follow_requests",onLoadMore:this.handleLoadMore,hasMore:c,shouldUpdateScroll:a,emptyMessage:i,bindToDocument:!n},void 0,o.map((function(e){return Object(u.a)(C,{id:e},e)}))))},t}(O.a),Object(b.a)(r,"propTypes",{params:v.a.object.isRequired,dispatch:v.a.func.isRequired,shouldUpdateScroll:v.a.func,hasMore:v.a.bool,accountIds:g.a.list,intl:v.a.object.isRequired,multiColumn:v.a.bool}),i=s))||i)||i}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{851:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return U}));var o,n,c,i=a(0),s=a(2),u=(a(9),a(6),a(8)),r=a(1),l=a(65),d=a.n(l),b=(a(3),a(15)),p=a(7),f=a(21),h=a(5),j=a.n(h),m=a(16),v=a.n(m),O=a(306),_=a(757),g=a(763),w=a(210),q=a(300),y=a(115),M=a(122),k=a(53);var z,R,I,N=Object(p.f)({authorize:{id:"follow_request.authorize",defaultMessage:"Authorize"},reject:{id:"follow_request.reject",defaultMessage:"Reject"}}),A=Object(p.g)((c=n=function(e){Object(u.a)(a,e);var t;t=a;function a(){return e.apply(this,arguments)||this}return a.prototype.render=function(){var e=this.props,t=e.intl,a=e.account,o=e.onAuthorize,n=e.onReject,c={__html:a.get("note_emojified")};return Object(i.a)("div",{className:"account-authorize__wrapper"},void 0,Object(i.a)("div",{className:"account-authorize"},void 0,Object(i.a)(q.a,{href:a.get("url"),to:"/accounts/"+a.get("id"),className:"detailed-status__display-name"},void 0,Object(i.a)("div",{className:"account-authorize__avatar"},void 0,Object(i.a)(y.a,{account:a,size:48})),Object(i.a)(M.a,{account:a})),Object(i.a)("div",{className:"account__header__content",dangerouslySetInnerHTML:c})),Object(i.a)("div",{className:"account--panel"},void 0,Object(i.a)("div",{className:"account--panel__button"},void 0,Object(i.a)(k.a,{title:t.formatMessage(N.authorize),icon:"check",onClick:o})),Object(i.a)("div",{className:"account--panel__button"},void 0,Object(i.a)(k.a,{title:t.formatMessage(N.reject),icon:"times",onClick:n}))))},a}(f.a),Object(r.a)(n,"propTypes",{account:v.a.map.isRequired,onAuthorize:j.a.func.isRequired,onReject:j.a.func.isRequired,intl:j.a.object.isRequired}),o=c))||o,T=a(26),x=Object(b.connect)((function(){var e=Object(w.d)();return function(t,a){return{account:e(t,a.id)}}}),(function(e,t){var a=t.id;return{onAuthorize:function(){e(Object(T.v)(a))},onReject:function(){e(Object(T.I)(a))}}}))(A),C=a(1049),L=a(22);var S=Object(p.f)({heading:{id:"column.follow_requests",defaultMessage:"Follow requests"}}),U=Object(b.connect)((function(e){return{accountIds:e.getIn(["user_lists","follow_requests","items"]),hasMore:!!e.getIn(["user_lists","follow_requests","next"]),locked:!!e.getIn(["accounts",L.n,"locked"]),domain:e.getIn(["meta","domain"])}}))(z=Object(p.g)((I=R=function(e){Object(u.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(r.a)(Object(s.a)(t),"handleLoadMore",d()((function(){t.props.dispatch(Object(T.x)())}),300,{leading:!0})),t}var o=a.prototype;return o.componentWillMount=function(){this.props.dispatch(Object(T.B)())},o.render=function(){var e=this.props,t=e.intl,a=e.shouldUpdateScroll,o=e.accountIds,n=e.hasMore,c=e.multiColumn,s=e.locked,u=e.domain;if(!o)return Object(i.a)(_.a,{},void 0,Object(i.a)(O.a,{}));var r=Object(i.a)(p.b,{id:"empty_column.follow_requests",defaultMessage:"You don't have any follow requests yet. When you receive one, it will show up here."}),l=s?null:Object(i.a)("div",{className:"follow_requests-unlocked_explanation"},void 0,Object(i.a)(p.b,{id:"follow_requests.unlocked_explanation",defaultMessage:"Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.",values:{domain:u}}));return Object(i.a)(_.a,{bindToDocument:!c,icon:"user-plus",heading:t.formatMessage(S.heading)},void 0,Object(i.a)(g.a,{}),Object(i.a)(C.a,{scrollKey:"follow_requests",onLoadMore:this.handleLoadMore,hasMore:n,shouldUpdateScroll:a,emptyMessage:r,bindToDocument:!c,prepend:l},void 0,o.map((function(e){return Object(i.a)(x,{id:e},e)}))))},a}(f.a),Object(r.a)(R,"propTypes",{params:j.a.object.isRequired,dispatch:j.a.func.isRequired,shouldUpdateScroll:j.a.func,hasMore:j.a.bool,accountIds:v.a.list,locked:j.a.bool,domain:j.a.string,intl:j.a.object.isRequired,multiColumn:j.a.bool}),z=I))||z)||z}}]);
//# sourceMappingURL=follow_requests.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/follow_requests.js.map b/priv/static/packs/features/follow_requests.js.map
index dd58baf4d..407dbd78e 100644
--- a/priv/static/packs/features/follow_requests.js.map
+++ b/priv/static/packs/features/follow_requests.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/follow_requests/components/account_authorize.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/follow_requests/containers/account_authorize_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/follow_requests/index.js"],"names":["messages","defineMessages","authorize","reject","AccountAuthorize","injectIntl","render","this","props","intl","account","onAuthorize","onReject","content","__html","get","className","href","to","size","dangerouslySetInnerHTML","title","formatMessage","icon","onClick","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","func","object","connect","getAccount","makeGetAccount","state","id","dispatch","authorizeFollowRequest","rejectFollowRequest","heading","FollowRequests","accountIds","getIn","hasMore","expandFollowRequests","leading","componentWillMount","fetchFollowRequests","shouldUpdateScroll","multiColumn","emptyMessage","defaultMessage","bindToDocument","scrollKey","onLoadMore","handleLoadMore","params","bool","list"],"mappings":"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","file":"features/follow_requests.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Permalink from '../../../components/permalink';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' },\n reject: { id: 'follow_request.reject', defaultMessage: 'Reject' },\n});\n\nexport default @injectIntl\nclass AccountAuthorize extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n onAuthorize: PropTypes.func.isRequired,\n onReject: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { intl, account, onAuthorize, onReject } = this.props;\n const content = { __html: account.get('note_emojified') };\n\n return (\n <div className='account-authorize__wrapper'>\n <div className='account-authorize'>\n <Permalink href={account.get('url')} to={`/accounts/${account.get('id')}`} className='detailed-status__display-name'>\n <div className='account-authorize__avatar'><Avatar account={account} size={48} /></div>\n <DisplayName account={account} />\n </Permalink>\n\n <div className='account__header__content' dangerouslySetInnerHTML={content} />\n </div>\n\n <div className='account--panel'>\n <div className='account--panel__button'><IconButton title={intl.formatMessage(messages.authorize)} icon='check' onClick={onAuthorize} /></div>\n <div className='account--panel__button'><IconButton title={intl.formatMessage(messages.reject)} icon='times' onClick={onReject} /></div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetAccount } from '../../../selectors';\nimport AccountAuthorize from '../components/account_authorize';\nimport { authorizeFollowRequest, rejectFollowRequest } from '../../../actions/accounts';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, props) => ({\n account: getAccount(state, props.id),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { id }) => ({\n onAuthorize () {\n dispatch(authorizeFollowRequest(id));\n },\n\n onReject () {\n dispatch(rejectFollowRequest(id));\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(AccountAuthorize);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport AccountAuthorizeContainer from './containers/account_authorize_container';\nimport { fetchFollowRequests, expandFollowRequests } from '../../actions/accounts';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.follow_requests', defaultMessage: 'Follow requests' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'follow_requests', 'items']),\n hasMore: !!state.getIn(['user_lists', 'follow_requests', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass FollowRequests extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n hasMore: PropTypes.bool,\n accountIds: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchFollowRequests());\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandFollowRequests());\n }, 300, { leading: true });\n\n render () {\n const { intl, shouldUpdateScroll, accountIds, hasMore, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.follow_requests' defaultMessage=\"You don't have any follow requests yet. When you receive one, it will show up here.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='user-plus' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <ScrollableList\n scrollKey='follow_requests'\n onLoadMore={this.handleLoadMore}\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountAuthorizeContainer key={id} id={id} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/follow_requests/components/account_authorize.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/follow_requests/containers/account_authorize_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/follow_requests/index.js"],"names":["messages","defineMessages","authorize","reject","AccountAuthorize","injectIntl","render","this","props","intl","account","onAuthorize","onReject","content","__html","get","className","href","to","size","dangerouslySetInnerHTML","title","formatMessage","icon","onClick","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","func","object","connect","getAccount","makeGetAccount","state","id","dispatch","authorizeFollowRequest","rejectFollowRequest","heading","FollowRequests","accountIds","getIn","hasMore","locked","me","domain","expandFollowRequests","leading","componentWillMount","fetchFollowRequests","shouldUpdateScroll","multiColumn","emptyMessage","defaultMessage","unlockedPrependMessage","values","bindToDocument","scrollKey","onLoadMore","handleLoadMore","prepend","params","bool","list","string"],"mappings":"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","file":"features/follow_requests.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Permalink from '../../../components/permalink';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' },\n reject: { id: 'follow_request.reject', defaultMessage: 'Reject' },\n});\n\nexport default @injectIntl\nclass AccountAuthorize extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n onAuthorize: PropTypes.func.isRequired,\n onReject: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { intl, account, onAuthorize, onReject } = this.props;\n const content = { __html: account.get('note_emojified') };\n\n return (\n <div className='account-authorize__wrapper'>\n <div className='account-authorize'>\n <Permalink href={account.get('url')} to={`/accounts/${account.get('id')}`} className='detailed-status__display-name'>\n <div className='account-authorize__avatar'><Avatar account={account} size={48} /></div>\n <DisplayName account={account} />\n </Permalink>\n\n <div className='account__header__content' dangerouslySetInnerHTML={content} />\n </div>\n\n <div className='account--panel'>\n <div className='account--panel__button'><IconButton title={intl.formatMessage(messages.authorize)} icon='check' onClick={onAuthorize} /></div>\n <div className='account--panel__button'><IconButton title={intl.formatMessage(messages.reject)} icon='times' onClick={onReject} /></div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetAccount } from '../../../selectors';\nimport AccountAuthorize from '../components/account_authorize';\nimport { authorizeFollowRequest, rejectFollowRequest } from '../../../actions/accounts';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, props) => ({\n account: getAccount(state, props.id),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { id }) => ({\n onAuthorize () {\n dispatch(authorizeFollowRequest(id));\n },\n\n onReject () {\n dispatch(rejectFollowRequest(id));\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(AccountAuthorize);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport AccountAuthorizeContainer from './containers/account_authorize_container';\nimport { fetchFollowRequests, expandFollowRequests } from '../../actions/accounts';\nimport ScrollableList from '../../components/scrollable_list';\nimport { me } from '../../initial_state';\n\nconst messages = defineMessages({\n heading: { id: 'column.follow_requests', defaultMessage: 'Follow requests' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'follow_requests', 'items']),\n hasMore: !!state.getIn(['user_lists', 'follow_requests', 'next']),\n locked: !!state.getIn(['accounts', me, 'locked']),\n domain: state.getIn(['meta', 'domain']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass FollowRequests extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n hasMore: PropTypes.bool,\n accountIds: ImmutablePropTypes.list,\n locked: PropTypes.bool,\n domain: PropTypes.string,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchFollowRequests());\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandFollowRequests());\n }, 300, { leading: true });\n\n render () {\n const { intl, shouldUpdateScroll, accountIds, hasMore, multiColumn, locked, domain } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.follow_requests' defaultMessage=\"You don't have any follow requests yet. When you receive one, it will show up here.\" />;\n const unlockedPrependMessage = locked ? null : (\n <div className='follow_requests-unlocked_explanation'>\n <FormattedMessage\n id='follow_requests.unlocked_explanation'\n defaultMessage='Even though your account is not locked, the {domain} staff thought you might want to review follow requests from these accounts manually.'\n values={{ domain: domain }}\n />\n </div>\n );\n\n return (\n <Column bindToDocument={!multiColumn} icon='user-plus' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <ScrollableList\n scrollKey='follow_requests'\n onLoadMore={this.handleLoadMore}\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n prepend={unlockedPrependMessage}\n >\n {accountIds.map(id =>\n <AccountAuthorizeContainer key={id} id={id} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/followers.js b/priv/static/packs/features/followers.js
index 67c5826cd..a74070322 100644
--- a/priv/static/packs/features/followers.js
+++ b/priv/static/packs/features/followers.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{794:function(a,t,o){"use strict";o.r(t),o.d(t,"default",(function(){return C}));var c,e,s,n=o(0),r=o(2),p=o(7),i=o(1),u=o(62),d=o.n(u),l=(o(3),o(13)),b=o(18),h=o(5),m=o.n(h),f=o(14),j=o.n(f),I=o(300),O=o(25),y=o(6),w=o(1026),v=o(731),M=o(1057),g=o(738),k=o(1023),A=o(1030),C=Object(l.connect)((function(a,t){return{isAccount:!!a.getIn(["accounts",t.params.accountId]),accountIds:a.getIn(["user_lists","followers",t.params.accountId,"items"]),hasMore:!!a.getIn(["user_lists","followers",t.params.accountId,"next"]),blockedBy:a.getIn(["relationships",t.params.accountId,"blocked_by"],!1)}}))((s=e=function(a){function t(){for(var t,o=arguments.length,c=new Array(o),e=0;e<o;e++)c[e]=arguments[e];return t=a.call.apply(a,[this].concat(c))||this,Object(i.a)(Object(r.a)(t),"handleLoadMore",d()((function(){t.props.dispatch(Object(O.y)(t.props.params.accountId))}),300,{leading:!0})),t}Object(p.a)(t,a);var o=t.prototype;return o.componentWillMount=function(){this.props.accountIds||(this.props.dispatch(Object(O.A)(this.props.params.accountId)),this.props.dispatch(Object(O.C)(this.props.params.accountId)))},o.componentWillReceiveProps=function(a){a.params.accountId!==this.props.params.accountId&&a.params.accountId&&(this.props.dispatch(Object(O.A)(a.params.accountId)),this.props.dispatch(Object(O.C)(a.params.accountId)))},o.render=function(){var a=this.props,t=a.shouldUpdateScroll,o=a.accountIds,c=a.hasMore,e=a.blockedBy,s=a.isAccount,r=a.multiColumn;if(!s)return Object(n.a)(v.a,{},void 0,Object(n.a)(A.a,{}));if(!o)return Object(n.a)(v.a,{},void 0,Object(n.a)(I.a,{}));var p=e?Object(n.a)(y.b,{id:"empty_column.account_unavailable",defaultMessage:"Profile unavailable"}):Object(n.a)(y.b,{id:"account.followers.empty",defaultMessage:"No one follows this user yet."});return Object(n.a)(v.a,{},void 0,Object(n.a)(g.a,{multiColumn:r}),Object(n.a)(k.a,{scrollKey:"followers",hasMore:c,onLoadMore:this.handleLoadMore,shouldUpdateScroll:t,prepend:Object(n.a)(M.a,{accountId:this.props.params.accountId,hideTabs:!0}),alwaysPrepend:!0,emptyMessage:p,bindToDocument:!r},void 0,e?[]:o.map((function(a){return Object(n.a)(w.a,{id:a,withNote:!1},a)}))))},t}(b.a),Object(i.a)(e,"propTypes",{params:m.a.object.isRequired,dispatch:m.a.func.isRequired,shouldUpdateScroll:m.a.func,accountIds:j.a.list,hasMore:m.a.bool,blockedBy:m.a.bool,isAccount:m.a.bool,multiColumn:m.a.bool}),c=s))||c}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{820:function(a,t,o){"use strict";o.r(t),o.d(t,"default",(function(){return C}));var c,e,s,n=o(0),r=o(2),p=(o(9),o(6),o(8)),i=o(1),u=o(65),d=o.n(u),l=(o(3),o(15)),b=o(21),h=o(5),m=o.n(h),f=o(16),j=o.n(f),I=o(306),O=o(26),y=o(7),v=o(1053),w=o(757),M=o(1084),g=o(764),k=o(1049),A=o(1057);var C=Object(l.connect)((function(a,t){return{isAccount:!!a.getIn(["accounts",t.params.accountId]),accountIds:a.getIn(["user_lists","followers",t.params.accountId,"items"]),hasMore:!!a.getIn(["user_lists","followers",t.params.accountId,"next"]),blockedBy:a.getIn(["relationships",t.params.accountId,"blocked_by"],!1)}}))((s=e=function(a){Object(p.a)(o,a);var t;t=o;function o(){for(var t,o=arguments.length,c=new Array(o),e=0;e<o;e++)c[e]=arguments[e];return t=a.call.apply(a,[this].concat(c))||this,Object(i.a)(Object(r.a)(t),"handleLoadMore",d()((function(){t.props.dispatch(Object(O.y)(t.props.params.accountId))}),300,{leading:!0})),t}var c=o.prototype;return c.componentWillMount=function(){this.props.accountIds||(this.props.dispatch(Object(O.A)(this.props.params.accountId)),this.props.dispatch(Object(O.C)(this.props.params.accountId)))},c.componentWillReceiveProps=function(a){a.params.accountId!==this.props.params.accountId&&a.params.accountId&&(this.props.dispatch(Object(O.A)(a.params.accountId)),this.props.dispatch(Object(O.C)(a.params.accountId)))},c.render=function(){var a=this.props,t=a.shouldUpdateScroll,o=a.accountIds,c=a.hasMore,e=a.blockedBy,s=a.isAccount,r=a.multiColumn;if(!s)return Object(n.a)(w.a,{},void 0,Object(n.a)(A.a,{}));if(!o)return Object(n.a)(w.a,{},void 0,Object(n.a)(I.a,{}));var p=e?Object(n.a)(y.b,{id:"empty_column.account_unavailable",defaultMessage:"Profile unavailable"}):Object(n.a)(y.b,{id:"account.followers.empty",defaultMessage:"No one follows this user yet."});return(Object(n.a)(w.a,{},void 0,Object(n.a)(g.a,{multiColumn:r}),Object(n.a)(k.a,{scrollKey:"followers",hasMore:c,onLoadMore:this.handleLoadMore,shouldUpdateScroll:t,prepend:Object(n.a)(M.a,{accountId:this.props.params.accountId,hideTabs:!0}),alwaysPrepend:!0,emptyMessage:p,bindToDocument:!r},void 0,e?[]:o.map((function(a){return Object(n.a)(v.a,{id:a,withNote:!1},a)})))))},o}(b.a),Object(i.a)(e,"propTypes",{params:m.a.object.isRequired,dispatch:m.a.func.isRequired,shouldUpdateScroll:m.a.func,accountIds:j.a.list,hasMore:m.a.bool,blockedBy:m.a.bool,isAccount:m.a.bool,multiColumn:m.a.bool}),c=s))||c}}]);
//# sourceMappingURL=followers.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/followers.js.map b/priv/static/packs/features/followers.js.map
index 44384dbc1..4e5cf5a2e 100644
--- a/priv/static/packs/features/followers.js.map
+++ b/priv/static/packs/features/followers.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/followers/index.js"],"names":["Followers","connect","state","props","isAccount","getIn","params","accountId","accountIds","hasMore","blockedBy","dispatch","expandFollowers","leading","componentWillMount","this","fetchAccount","fetchFollowers","componentWillReceiveProps","nextProps","render","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","scrollKey","onLoadMore","handleLoadMore","prepend","hideTabs","alwaysPrepend","bindToDocument","map","withNote","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"2UA4BMA,EADUC,mBAPQ,SAACC,EAAOC,GAAR,MAAmB,CACzCC,YAAaF,EAAMG,MAAM,CAAC,WAAYF,EAAMG,OAAOC,YACnDC,WAAYN,EAAMG,MAAM,CAAC,aAAc,YAAaF,EAAMG,OAAOC,UAAW,UAC5EE,UAAWP,EAAMG,MAAM,CAAC,aAAc,YAAaF,EAAMG,OAAOC,UAAW,SAC3EG,UAAWR,EAAMG,MAAM,CAAC,gBAAiBF,EAAMG,OAAOC,UAAW,eAAe,M,qMA+B/D,KAAS,WACxB,EAAKJ,MAAMQ,SAASC,YAAgB,EAAKT,MAAMG,OAAOC,cACrD,IAAK,CAAEM,SAAS,K,8CAhBnBC,mBAAA,WACOC,KAAKZ,MAAMK,aACdO,KAAKZ,MAAMQ,SAASK,YAAaD,KAAKZ,MAAMG,OAAOC,YACnDQ,KAAKZ,MAAMQ,SAASM,YAAeF,KAAKZ,MAAMG,OAAOC,c,EAIzDW,0BAAA,SAA2BC,GACrBA,EAAUb,OAAOC,YAAcQ,KAAKZ,MAAMG,OAAOC,WAAaY,EAAUb,OAAOC,YACjFQ,KAAKZ,MAAMQ,SAASK,YAAaG,EAAUb,OAAOC,YAClDQ,KAAKZ,MAAMQ,SAASM,YAAeE,EAAUb,OAAOC,c,EAQxDa,OAAA,WAAW,IAAD,EAC+EL,KAAKZ,MAApFkB,EADA,EACAA,mBAAoBb,EADpB,EACoBA,WAAYC,EADhC,EACgCA,QAASC,EADzC,EACyCA,UAAWN,EADpD,EACoDA,UAAWkB,EAD/D,EAC+DA,YAEvE,IAAKlB,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAKI,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAeb,EAAY,YAAC,IAAD,CAAkBc,GAAG,mCAAmCC,eAAe,wBAA2B,YAAC,IAAD,CAAkBD,GAAG,0BAA0BC,eAAe,kCAEjM,OACE,YAAC,IAAD,UACE,YAAC,IAAD,CAAkBH,YAAaA,IAE/B,YAAC,IAAD,CACEI,UAAU,YACVjB,QAASA,EACTkB,WAAYZ,KAAKa,eACjBP,mBAAoBA,EACpBQ,QAAS,YAAC,IAAD,CAAiBtB,UAAWQ,KAAKZ,MAAMG,OAAOC,UAAWuB,UAAQ,IAC1EC,eAAa,EACbR,aAAcA,EACdS,gBAAiBV,QARnB,EAUGZ,EAAY,GAAKF,EAAWyB,KAAI,SAAAT,GAAE,OACjC,YAAC,IAAD,CAA2BA,GAAIA,EAAIU,UAAU,GAAtBV,S,GAnEXW,K,0BAEH,CACjB7B,OAAQ8B,IAAUC,OAAOC,WACzB3B,SAAUyB,IAAUG,KAAKD,WACzBjB,mBAAoBe,IAAUG,KAC9B/B,WAAYgC,IAAmBC,KAC/BhC,QAAS2B,IAAUM,KACnBhC,UAAW0B,IAAUM,KACrBtC,UAAWgC,IAAUM,KACrBpB,YAAac,IAAUM,O","file":"features/followers.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport {\n fetchAccount,\n fetchFollowers,\n expandFollowers,\n} from '../../actions/accounts';\nimport { FormattedMessage } from 'react-intl';\nimport AccountContainer from '../../containers/account_container';\nimport Column from '../ui/components/column';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ScrollableList from '../../components/scrollable_list';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\n\nconst mapStateToProps = (state, props) => ({\n isAccount: !!state.getIn(['accounts', props.params.accountId]),\n accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),\n hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),\n blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),\n});\n\nexport default @connect(mapStateToProps)\nclass Followers extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n hasMore: PropTypes.bool,\n blockedBy: PropTypes.bool,\n isAccount: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n if (!this.props.accountIds) {\n this.props.dispatch(fetchAccount(this.props.params.accountId));\n this.props.dispatch(fetchFollowers(this.props.params.accountId));\n }\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {\n this.props.dispatch(fetchAccount(nextProps.params.accountId));\n this.props.dispatch(fetchFollowers(nextProps.params.accountId));\n }\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandFollowers(this.props.params.accountId));\n }, 300, { leading: true });\n\n render () {\n const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn } = this.props;\n\n if (!isAccount) {\n return (\n <Column>\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollableList\n scrollKey='followers'\n hasMore={hasMore}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}\n alwaysPrepend\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {blockedBy ? [] : accountIds.map(id =>\n <AccountContainer key={id} id={id} withNote={false} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/followers/index.js"],"names":["Followers","connect","state","props","isAccount","getIn","params","accountId","accountIds","hasMore","blockedBy","dispatch","expandFollowers","leading","componentWillMount","this","fetchAccount","fetchFollowers","componentWillReceiveProps","nextProps","render","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","scrollKey","onLoadMore","handleLoadMore","prepend","hideTabs","alwaysPrepend","bindToDocument","map","withNote","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"uVAoBA,IAQMA,EADUC,mBAPQ,SAACC,EAAOC,GAAR,MAAmB,CACzCC,YAAaF,EAAMG,MAAM,CAAC,WAAYF,EAAMG,OAAOC,YACnDC,WAAYN,EAAMG,MAAM,CAAC,aAAc,YAAaF,EAAMG,OAAOC,UAAW,UAC5EE,UAAWP,EAAMG,MAAM,CAAC,aAAc,YAAaF,EAAMG,OAAOC,UAAW,SAC3EG,UAAWR,EAAMG,MAAM,CAAC,gBAAiBF,EAAMG,OAAOC,UAAW,eAAe,M,gOA+B/D,KAAS,WACxB,EAAKJ,MAAMQ,SAASC,YAAgB,EAAKT,MAAMG,OAAOC,cACrD,IAAK,CAAEM,SAAS,K,6BAhBnBC,mBAAA,WACOC,KAAKZ,MAAMK,aACdO,KAAKZ,MAAMQ,SAASK,YAAaD,KAAKZ,MAAMG,OAAOC,YACnDQ,KAAKZ,MAAMQ,SAASM,YAAeF,KAAKZ,MAAMG,OAAOC,c,EAIzDW,0BAAA,SAA2BC,GACrBA,EAAUb,OAAOC,YAAcQ,KAAKZ,MAAMG,OAAOC,WAAaY,EAAUb,OAAOC,YACjFQ,KAAKZ,MAAMQ,SAASK,YAAaG,EAAUb,OAAOC,YAClDQ,KAAKZ,MAAMQ,SAASM,YAAeE,EAAUb,OAAOC,c,EAQxDa,OAAA,WAAW,IAAD,EAC+EL,KAAKZ,MAApFkB,EADA,EACAA,mBAAoBb,EADpB,EACoBA,WAAYC,EADhC,EACgCA,QAASC,EADzC,EACyCA,UAAWN,EADpD,EACoDA,UAAWkB,EAD/D,EAC+DA,YAEvE,IAAKlB,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAKI,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAeb,EAAY,YAAC,IAAD,CAAkBc,GAAG,mCAAmCC,eAAe,wBAA2B,YAAC,IAAD,CAAkBD,GAAG,0BAA0BC,eAAe,kCAEjM,OACE,YAAC,IAAD,UACE,YAAC,IAAD,CAAkBH,YAAaA,IAE/B,YAAC,IAAD,CACEI,UAAU,YACVjB,QAASA,EACTkB,WAAYZ,KAAKa,eACjBP,mBAAoBA,EACpBQ,QAAS,YAAC,IAAD,CAAiBtB,UAAWQ,KAAKZ,MAAMG,OAAOC,UAAWuB,UAAQ,IAC1EC,eAAa,EACbR,aAAcA,EACdS,gBAAiBV,QARnB,EAUGZ,EAAY,GAAKF,EAAWyB,KAAI,SAAAT,GAAE,OACjC,YAAC,IAAD,CAA2BA,GAAIA,EAAIU,UAAU,GAAtBV,U,GAnEXW,K,0BAEH,CACjB7B,OAAQ8B,IAAUC,OAAOC,WACzB3B,SAAUyB,IAAUG,KAAKD,WACzBjB,mBAAoBe,IAAUG,KAC9B/B,WAAYgC,IAAmBC,KAC/BhC,QAAS2B,IAAUM,KACnBhC,UAAW0B,IAAUM,KACrBtC,UAAWgC,IAAUM,KACrBpB,YAAac,IAAUM,O","file":"features/followers.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport {\n fetchAccount,\n fetchFollowers,\n expandFollowers,\n} from '../../actions/accounts';\nimport { FormattedMessage } from 'react-intl';\nimport AccountContainer from '../../containers/account_container';\nimport Column from '../ui/components/column';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ScrollableList from '../../components/scrollable_list';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\n\nconst mapStateToProps = (state, props) => ({\n isAccount: !!state.getIn(['accounts', props.params.accountId]),\n accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),\n hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),\n blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),\n});\n\nexport default @connect(mapStateToProps)\nclass Followers extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n hasMore: PropTypes.bool,\n blockedBy: PropTypes.bool,\n isAccount: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n if (!this.props.accountIds) {\n this.props.dispatch(fetchAccount(this.props.params.accountId));\n this.props.dispatch(fetchFollowers(this.props.params.accountId));\n }\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {\n this.props.dispatch(fetchAccount(nextProps.params.accountId));\n this.props.dispatch(fetchFollowers(nextProps.params.accountId));\n }\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandFollowers(this.props.params.accountId));\n }, 300, { leading: true });\n\n render () {\n const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn } = this.props;\n\n if (!isAccount) {\n return (\n <Column>\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollableList\n scrollKey='followers'\n hasMore={hasMore}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}\n alwaysPrepend\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {blockedBy ? [] : accountIds.map(id =>\n <AccountContainer key={id} id={id} withNote={false} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/following.js b/priv/static/packs/features/following.js
index e7bf1afb6..5189467a3 100644
--- a/priv/static/packs/features/following.js
+++ b/priv/static/packs/features/following.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{795:function(a,t,o){"use strict";o.r(t),o.d(t,"default",(function(){return _}));var c,e,n,s=o(0),r=o(2),i=o(7),p=o(1),u=o(62),d=o.n(u),l=(o(3),o(13)),b=o(18),h=o(5),m=o.n(h),f=o(14),j=o.n(f),I=o(300),O=o(25),y=o(6),w=o(1026),g=o(731),v=o(1057),M=o(738),k=o(1023),A=o(1030),_=Object(l.connect)((function(a,t){return{isAccount:!!a.getIn(["accounts",t.params.accountId]),accountIds:a.getIn(["user_lists","following",t.params.accountId,"items"]),hasMore:!!a.getIn(["user_lists","following",t.params.accountId,"next"]),blockedBy:a.getIn(["relationships",t.params.accountId,"blocked_by"],!1)}}))((n=e=function(a){function t(){for(var t,o=arguments.length,c=new Array(o),e=0;e<o;e++)c[e]=arguments[e];return t=a.call.apply(a,[this].concat(c))||this,Object(p.a)(Object(r.a)(t),"handleLoadMore",d()((function(){t.props.dispatch(Object(O.z)(t.props.params.accountId))}),300,{leading:!0})),t}Object(i.a)(t,a);var o=t.prototype;return o.componentWillMount=function(){this.props.accountIds||(this.props.dispatch(Object(O.A)(this.props.params.accountId)),this.props.dispatch(Object(O.D)(this.props.params.accountId)))},o.componentWillReceiveProps=function(a){a.params.accountId!==this.props.params.accountId&&a.params.accountId&&(this.props.dispatch(Object(O.A)(a.params.accountId)),this.props.dispatch(Object(O.D)(a.params.accountId)))},o.render=function(){var a=this.props,t=a.shouldUpdateScroll,o=a.accountIds,c=a.hasMore,e=a.blockedBy,n=a.isAccount,r=a.multiColumn;if(!n)return Object(s.a)(g.a,{},void 0,Object(s.a)(A.a,{}));if(!o)return Object(s.a)(g.a,{},void 0,Object(s.a)(I.a,{}));var i=e?Object(s.a)(y.b,{id:"empty_column.account_unavailable",defaultMessage:"Profile unavailable"}):Object(s.a)(y.b,{id:"account.follows.empty",defaultMessage:"This user doesn't follow anyone yet."});return Object(s.a)(g.a,{},void 0,Object(s.a)(M.a,{multiColumn:r}),Object(s.a)(k.a,{scrollKey:"following",hasMore:c,onLoadMore:this.handleLoadMore,shouldUpdateScroll:t,prepend:Object(s.a)(v.a,{accountId:this.props.params.accountId,hideTabs:!0}),alwaysPrepend:!0,emptyMessage:i,bindToDocument:!r},void 0,e?[]:o.map((function(a){return Object(s.a)(w.a,{id:a,withNote:!1},a)}))))},t}(b.a),Object(p.a)(e,"propTypes",{params:m.a.object.isRequired,dispatch:m.a.func.isRequired,shouldUpdateScroll:m.a.func,accountIds:j.a.list,hasMore:m.a.bool,blockedBy:m.a.bool,isAccount:m.a.bool,multiColumn:m.a.bool}),c=n))||c}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{821:function(a,t,o){"use strict";o.r(t),o.d(t,"default",(function(){return _}));var c,e,n,s=o(0),r=o(2),i=(o(9),o(6),o(8)),p=o(1),u=o(65),d=o.n(u),l=(o(3),o(15)),b=o(21),h=o(5),m=o.n(h),f=o(16),j=o.n(f),I=o(306),O=o(26),y=o(7),v=o(1053),w=o(757),g=o(1084),M=o(764),k=o(1049),A=o(1057);var _=Object(l.connect)((function(a,t){return{isAccount:!!a.getIn(["accounts",t.params.accountId]),accountIds:a.getIn(["user_lists","following",t.params.accountId,"items"]),hasMore:!!a.getIn(["user_lists","following",t.params.accountId,"next"]),blockedBy:a.getIn(["relationships",t.params.accountId,"blocked_by"],!1)}}))((n=e=function(a){Object(i.a)(o,a);var t;t=o;function o(){for(var t,o=arguments.length,c=new Array(o),e=0;e<o;e++)c[e]=arguments[e];return t=a.call.apply(a,[this].concat(c))||this,Object(p.a)(Object(r.a)(t),"handleLoadMore",d()((function(){t.props.dispatch(Object(O.z)(t.props.params.accountId))}),300,{leading:!0})),t}var c=o.prototype;return c.componentWillMount=function(){this.props.accountIds||(this.props.dispatch(Object(O.A)(this.props.params.accountId)),this.props.dispatch(Object(O.D)(this.props.params.accountId)))},c.componentWillReceiveProps=function(a){a.params.accountId!==this.props.params.accountId&&a.params.accountId&&(this.props.dispatch(Object(O.A)(a.params.accountId)),this.props.dispatch(Object(O.D)(a.params.accountId)))},c.render=function(){var a=this.props,t=a.shouldUpdateScroll,o=a.accountIds,c=a.hasMore,e=a.blockedBy,n=a.isAccount,r=a.multiColumn;if(!n)return Object(s.a)(w.a,{},void 0,Object(s.a)(A.a,{}));if(!o)return Object(s.a)(w.a,{},void 0,Object(s.a)(I.a,{}));var i=e?Object(s.a)(y.b,{id:"empty_column.account_unavailable",defaultMessage:"Profile unavailable"}):Object(s.a)(y.b,{id:"account.follows.empty",defaultMessage:"This user doesn't follow anyone yet."});return(Object(s.a)(w.a,{},void 0,Object(s.a)(M.a,{multiColumn:r}),Object(s.a)(k.a,{scrollKey:"following",hasMore:c,onLoadMore:this.handleLoadMore,shouldUpdateScroll:t,prepend:Object(s.a)(g.a,{accountId:this.props.params.accountId,hideTabs:!0}),alwaysPrepend:!0,emptyMessage:i,bindToDocument:!r},void 0,e?[]:o.map((function(a){return Object(s.a)(v.a,{id:a,withNote:!1},a)})))))},o}(b.a),Object(p.a)(e,"propTypes",{params:m.a.object.isRequired,dispatch:m.a.func.isRequired,shouldUpdateScroll:m.a.func,accountIds:j.a.list,hasMore:m.a.bool,blockedBy:m.a.bool,isAccount:m.a.bool,multiColumn:m.a.bool}),c=n))||c}}]);
//# sourceMappingURL=following.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/following.js.map b/priv/static/packs/features/following.js.map
index 7f94461b6..dc4b4badb 100644
--- a/priv/static/packs/features/following.js.map
+++ b/priv/static/packs/features/following.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/following/index.js"],"names":["Following","connect","state","props","isAccount","getIn","params","accountId","accountIds","hasMore","blockedBy","dispatch","expandFollowing","leading","componentWillMount","this","fetchAccount","fetchFollowing","componentWillReceiveProps","nextProps","render","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","scrollKey","onLoadMore","handleLoadMore","prepend","hideTabs","alwaysPrepend","bindToDocument","map","withNote","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"2UA4BMA,EADUC,mBAPQ,SAACC,EAAOC,GAAR,MAAmB,CACzCC,YAAaF,EAAMG,MAAM,CAAC,WAAYF,EAAMG,OAAOC,YACnDC,WAAYN,EAAMG,MAAM,CAAC,aAAc,YAAaF,EAAMG,OAAOC,UAAW,UAC5EE,UAAWP,EAAMG,MAAM,CAAC,aAAc,YAAaF,EAAMG,OAAOC,UAAW,SAC3EG,UAAWR,EAAMG,MAAM,CAAC,gBAAiBF,EAAMG,OAAOC,UAAW,eAAe,M,qMA+B/D,KAAS,WACxB,EAAKJ,MAAMQ,SAASC,YAAgB,EAAKT,MAAMG,OAAOC,cACrD,IAAK,CAAEM,SAAS,K,8CAhBnBC,mBAAA,WACOC,KAAKZ,MAAMK,aACdO,KAAKZ,MAAMQ,SAASK,YAAaD,KAAKZ,MAAMG,OAAOC,YACnDQ,KAAKZ,MAAMQ,SAASM,YAAeF,KAAKZ,MAAMG,OAAOC,c,EAIzDW,0BAAA,SAA2BC,GACrBA,EAAUb,OAAOC,YAAcQ,KAAKZ,MAAMG,OAAOC,WAAaY,EAAUb,OAAOC,YACjFQ,KAAKZ,MAAMQ,SAASK,YAAaG,EAAUb,OAAOC,YAClDQ,KAAKZ,MAAMQ,SAASM,YAAeE,EAAUb,OAAOC,c,EAQxDa,OAAA,WAAW,IAAD,EAC+EL,KAAKZ,MAApFkB,EADA,EACAA,mBAAoBb,EADpB,EACoBA,WAAYC,EADhC,EACgCA,QAASC,EADzC,EACyCA,UAAWN,EADpD,EACoDA,UAAWkB,EAD/D,EAC+DA,YAEvE,IAAKlB,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAKI,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAeb,EAAY,YAAC,IAAD,CAAkBc,GAAG,mCAAmCC,eAAe,wBAA2B,YAAC,IAAD,CAAkBD,GAAG,wBAAwBC,eAAe,yCAE/L,OACE,YAAC,IAAD,UACE,YAAC,IAAD,CAAkBH,YAAaA,IAE/B,YAAC,IAAD,CACEI,UAAU,YACVjB,QAASA,EACTkB,WAAYZ,KAAKa,eACjBP,mBAAoBA,EACpBQ,QAAS,YAAC,IAAD,CAAiBtB,UAAWQ,KAAKZ,MAAMG,OAAOC,UAAWuB,UAAQ,IAC1EC,eAAa,EACbR,aAAcA,EACdS,gBAAiBV,QARnB,EAUGZ,EAAY,GAAKF,EAAWyB,KAAI,SAAAT,GAAE,OACjC,YAAC,IAAD,CAA2BA,GAAIA,EAAIU,UAAU,GAAtBV,S,GAnEXW,K,0BAEH,CACjB7B,OAAQ8B,IAAUC,OAAOC,WACzB3B,SAAUyB,IAAUG,KAAKD,WACzBjB,mBAAoBe,IAAUG,KAC9B/B,WAAYgC,IAAmBC,KAC/BhC,QAAS2B,IAAUM,KACnBhC,UAAW0B,IAAUM,KACrBtC,UAAWgC,IAAUM,KACrBpB,YAAac,IAAUM,O","file":"features/following.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport {\n fetchAccount,\n fetchFollowing,\n expandFollowing,\n} from '../../actions/accounts';\nimport { FormattedMessage } from 'react-intl';\nimport AccountContainer from '../../containers/account_container';\nimport Column from '../ui/components/column';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ScrollableList from '../../components/scrollable_list';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\n\nconst mapStateToProps = (state, props) => ({\n isAccount: !!state.getIn(['accounts', props.params.accountId]),\n accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),\n hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),\n blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),\n});\n\nexport default @connect(mapStateToProps)\nclass Following extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n hasMore: PropTypes.bool,\n blockedBy: PropTypes.bool,\n isAccount: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n if (!this.props.accountIds) {\n this.props.dispatch(fetchAccount(this.props.params.accountId));\n this.props.dispatch(fetchFollowing(this.props.params.accountId));\n }\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {\n this.props.dispatch(fetchAccount(nextProps.params.accountId));\n this.props.dispatch(fetchFollowing(nextProps.params.accountId));\n }\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandFollowing(this.props.params.accountId));\n }, 300, { leading: true });\n\n render () {\n const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn } = this.props;\n\n if (!isAccount) {\n return (\n <Column>\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='account.follows.empty' defaultMessage=\"This user doesn't follow anyone yet.\" />;\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollableList\n scrollKey='following'\n hasMore={hasMore}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}\n alwaysPrepend\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {blockedBy ? [] : accountIds.map(id =>\n <AccountContainer key={id} id={id} withNote={false} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/following/index.js"],"names":["Following","connect","state","props","isAccount","getIn","params","accountId","accountIds","hasMore","blockedBy","dispatch","expandFollowing","leading","componentWillMount","this","fetchAccount","fetchFollowing","componentWillReceiveProps","nextProps","render","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","scrollKey","onLoadMore","handleLoadMore","prepend","hideTabs","alwaysPrepend","bindToDocument","map","withNote","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"uVAoBA,IAQMA,EADUC,mBAPQ,SAACC,EAAOC,GAAR,MAAmB,CACzCC,YAAaF,EAAMG,MAAM,CAAC,WAAYF,EAAMG,OAAOC,YACnDC,WAAYN,EAAMG,MAAM,CAAC,aAAc,YAAaF,EAAMG,OAAOC,UAAW,UAC5EE,UAAWP,EAAMG,MAAM,CAAC,aAAc,YAAaF,EAAMG,OAAOC,UAAW,SAC3EG,UAAWR,EAAMG,MAAM,CAAC,gBAAiBF,EAAMG,OAAOC,UAAW,eAAe,M,gOA+B/D,KAAS,WACxB,EAAKJ,MAAMQ,SAASC,YAAgB,EAAKT,MAAMG,OAAOC,cACrD,IAAK,CAAEM,SAAS,K,6BAhBnBC,mBAAA,WACOC,KAAKZ,MAAMK,aACdO,KAAKZ,MAAMQ,SAASK,YAAaD,KAAKZ,MAAMG,OAAOC,YACnDQ,KAAKZ,MAAMQ,SAASM,YAAeF,KAAKZ,MAAMG,OAAOC,c,EAIzDW,0BAAA,SAA2BC,GACrBA,EAAUb,OAAOC,YAAcQ,KAAKZ,MAAMG,OAAOC,WAAaY,EAAUb,OAAOC,YACjFQ,KAAKZ,MAAMQ,SAASK,YAAaG,EAAUb,OAAOC,YAClDQ,KAAKZ,MAAMQ,SAASM,YAAeE,EAAUb,OAAOC,c,EAQxDa,OAAA,WAAW,IAAD,EAC+EL,KAAKZ,MAApFkB,EADA,EACAA,mBAAoBb,EADpB,EACoBA,WAAYC,EADhC,EACgCA,QAASC,EADzC,EACyCA,UAAWN,EADpD,EACoDA,UAAWkB,EAD/D,EAC+DA,YAEvE,IAAKlB,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAKI,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAeb,EAAY,YAAC,IAAD,CAAkBc,GAAG,mCAAmCC,eAAe,wBAA2B,YAAC,IAAD,CAAkBD,GAAG,wBAAwBC,eAAe,yCAE/L,OACE,YAAC,IAAD,UACE,YAAC,IAAD,CAAkBH,YAAaA,IAE/B,YAAC,IAAD,CACEI,UAAU,YACVjB,QAASA,EACTkB,WAAYZ,KAAKa,eACjBP,mBAAoBA,EACpBQ,QAAS,YAAC,IAAD,CAAiBtB,UAAWQ,KAAKZ,MAAMG,OAAOC,UAAWuB,UAAQ,IAC1EC,eAAa,EACbR,aAAcA,EACdS,gBAAiBV,QARnB,EAUGZ,EAAY,GAAKF,EAAWyB,KAAI,SAAAT,GAAE,OACjC,YAAC,IAAD,CAA2BA,GAAIA,EAAIU,UAAU,GAAtBV,U,GAnEXW,K,0BAEH,CACjB7B,OAAQ8B,IAAUC,OAAOC,WACzB3B,SAAUyB,IAAUG,KAAKD,WACzBjB,mBAAoBe,IAAUG,KAC9B/B,WAAYgC,IAAmBC,KAC/BhC,QAAS2B,IAAUM,KACnBhC,UAAW0B,IAAUM,KACrBtC,UAAWgC,IAAUM,KACrBpB,YAAac,IAAUM,O","file":"features/following.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport {\n fetchAccount,\n fetchFollowing,\n expandFollowing,\n} from '../../actions/accounts';\nimport { FormattedMessage } from 'react-intl';\nimport AccountContainer from '../../containers/account_container';\nimport Column from '../ui/components/column';\nimport HeaderContainer from '../account_timeline/containers/header_container';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ScrollableList from '../../components/scrollable_list';\nimport MissingIndicator from 'mastodon/components/missing_indicator';\n\nconst mapStateToProps = (state, props) => ({\n isAccount: !!state.getIn(['accounts', props.params.accountId]),\n accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),\n hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),\n blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),\n});\n\nexport default @connect(mapStateToProps)\nclass Following extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n hasMore: PropTypes.bool,\n blockedBy: PropTypes.bool,\n isAccount: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n if (!this.props.accountIds) {\n this.props.dispatch(fetchAccount(this.props.params.accountId));\n this.props.dispatch(fetchFollowing(this.props.params.accountId));\n }\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {\n this.props.dispatch(fetchAccount(nextProps.params.accountId));\n this.props.dispatch(fetchFollowing(nextProps.params.accountId));\n }\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandFollowing(this.props.params.accountId));\n }, 300, { leading: true });\n\n render () {\n const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn } = this.props;\n\n if (!isAccount) {\n return (\n <Column>\n <MissingIndicator />\n </Column>\n );\n }\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='account.follows.empty' defaultMessage=\"This user doesn't follow anyone yet.\" />;\n\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n\n <ScrollableList\n scrollKey='following'\n hasMore={hasMore}\n onLoadMore={this.handleLoadMore}\n shouldUpdateScroll={shouldUpdateScroll}\n prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}\n alwaysPrepend\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {blockedBy ? [] : accountIds.map(id =>\n <AccountContainer key={id} id={id} withNote={false} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/generic_not_found.js b/priv/static/packs/features/generic_not_found.js
index 4b6f0f228..7dce6d8e4 100644
--- a/priv/static/packs/features/generic_not_found.js
+++ b/priv/static/packs/features/generic_not_found.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{798:function(a,n,e){"use strict";e.r(n);var t=e(0),c=(e(3),e(731)),o=e(1030);n.default=function(){return Object(t.a)(c.a,{},void 0,Object(t.a)(o.a,{fullPage:!0}))}}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{824:function(a,n,e){"use strict";e.r(n);var t=e(0),c=(e(3),e(757)),o=e(1057);n.default=function(){return Object(t.a)(c.a,{},void 0,Object(t.a)(o.a,{fullPage:!0}))}}}]);
//# sourceMappingURL=generic_not_found.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/getting_started.js b/priv/static/packs/features/getting_started.js
index 5b3f3471d..21450c8e1 100644
--- a/priv/static/packs/features/getting_started.js
+++ b/priv/static/packs/features/getting_started.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{762:function(e,t,a){"use strict";a.d(t,"a",(function(){return j}));var i,o,s=a(0),n=a(2),r=a(7),c=a(1),u=a(13),d=a(3),l=a.n(d),b=a(6),g=a(316),f=a(20),m=a(711),p=a(47),v=Object(b.f)({logoutMessage:{id:"confirmations.logout.message",defaultMessage:"Are you sure you want to log out?"},logoutConfirm:{id:"confirmations.logout.confirm",defaultMessage:"Log out"}}),j=(i=Object(u.connect)(null,(function(e,t){var a=t.intl;return{onLogout:function(){e(Object(p.d)("CONFIRM",{message:a.formatMessage(v.logoutMessage),confirm:a.formatMessage(v.logoutConfirm),onConfirm:function(){return Object(m.a)()}}))}}})),Object(b.g)(o=i(o=function(e){function t(){for(var t,a=arguments.length,i=new Array(a),o=0;o<a;o++)i[o]=arguments[o];return t=e.call.apply(e,[this].concat(i))||this,Object(c.a)(Object(n.a)(t),"handleLogoutClick",(function(e){return e.preventDefault(),e.stopPropagation(),t.props.onLogout(),!1})),t}return Object(r.a)(t,e),t.prototype.render=function(){var e=this.props.withHotkeys;return Object(s.a)("div",{className:"getting-started__footer"},void 0,Object(s.a)("ul",{},void 0,f.j&&Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/invites",target:"_blank"},void 0,Object(s.a)(b.b,{id:"getting_started.invite",defaultMessage:"Invite people"}))," · "),e&&Object(s.a)("li",{},void 0,Object(s.a)(g.a,{to:"/keyboard-shortcuts"},void 0,Object(s.a)(b.b,{id:"navigation_bar.keyboard_shortcuts",defaultMessage:"Hotkeys"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/auth/edit"},void 0,Object(s.a)(b.b,{id:"getting_started.security",defaultMessage:"Security"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/about/more",target:"_blank"},void 0,Object(s.a)(b.b,{id:"navigation_bar.info",defaultMessage:"About this server"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"https://joinmastodon.org/apps",target:"_blank"},void 0,Object(s.a)(b.b,{id:"navigation_bar.apps",defaultMessage:"Mobile apps"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/terms",target:"_blank"},void 0,Object(s.a)(b.b,{id:"getting_started.terms",defaultMessage:"Terms of service"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/settings/applications",target:"_blank"},void 0,Object(s.a)(b.b,{id:"getting_started.developers",defaultMessage:"Developers"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"https://docs.joinmastodon.org",target:"_blank"},void 0,Object(s.a)(b.b,{id:"getting_started.documentation",defaultMessage:"Documentation"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/auth/sign_out",onClick:this.handleLogoutClick},void 0,Object(s.a)(b.b,{id:"navigation_bar.logout",defaultMessage:"Logout"})))),Object(s.a)("p",{},void 0,Object(s.a)(b.b,{id:"getting_started.open_source_notice",defaultMessage:"Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",values:{github:Object(s.a)("span",{},void 0,Object(s.a)("a",{href:f.t,rel:"noopener noreferrer",target:"_blank"},void 0,f.q)," (v",f.y,")")}})))},t}(l.a.PureComponent))||o)||o)},790:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return x}));var i,o,s,n=a(0),r=a(7),c=a(1),u=(a(3),a(731)),d=a(1140),l=a(1141),b=a(6),g=a(13),f=a(5),m=a.n(f),p=a(14),v=a.n(p),j=a(18),O=a(20),h=a(25),_=a(4),M=a(756),y=a(26),k=a(762),w=a(839),q=Object(b.f)({home_timeline:{id:"tabs_bar.home",defaultMessage:"Home"},notifications:{id:"tabs_bar.notifications",defaultMessage:"Notifications"},public_timeline:{id:"navigation_bar.public_timeline",defaultMessage:"Federated timeline"},settings_subheading:{id:"column_subheading.settings",defaultMessage:"Settings"},community_timeline:{id:"navigation_bar.community_timeline",defaultMessage:"Local timeline"},direct:{id:"navigation_bar.direct",defaultMessage:"Direct messages"},bookmarks:{id:"navigation_bar.bookmarks",defaultMessage:"Bookmarks"},preferences:{id:"navigation_bar.preferences",defaultMessage:"Preferences"},follow_requests:{id:"navigation_bar.follow_requests",defaultMessage:"Follow requests"},favourites:{id:"navigation_bar.favourites",defaultMessage:"Favourites"},blocks:{id:"navigation_bar.blocks",defaultMessage:"Blocked users"},domain_blocks:{id:"navigation_bar.domain_blocks",defaultMessage:"Hidden domains"},mutes:{id:"navigation_bar.mutes",defaultMessage:"Muted users"},pins:{id:"navigation_bar.pins",defaultMessage:"Pinned toots"},lists:{id:"navigation_bar.lists",defaultMessage:"Lists"},discover:{id:"navigation_bar.discover",defaultMessage:"Discover"},personal:{id:"navigation_bar.personal",defaultMessage:"Personal"},security:{id:"navigation_bar.security",defaultMessage:"Security"},menu:{id:"getting_started.heading",defaultMessage:"Getting started"},profile_directory:{id:"getting_started.directory",defaultMessage:"Profile directory"}}),x=Object(g.connect)((function(e){return{myAccount:e.getIn(["accounts",O.n]),unreadFollowRequests:e.getIn(["user_lists","follow_requests","items"],Object(_.List)()).size}}),(function(e){return{fetchFollowRequests:function(){return e(Object(h.B)())}}}))(i=Object(b.g)((s=o=function(e){function t(){return e.apply(this,arguments)||this}Object(r.a)(t,e);var a=t.prototype;return a.componentDidMount=function(){var e=this.props,t=e.fetchFollowRequests;!e.multiColumn&&window.innerWidth>=1190?this.context.router.history.replace("/timelines/home"):t()},a.render=function(){var e,t,a=this.props,i=a.intl,o=a.myAccount,s=a.multiColumn,r=a.unreadFollowRequests,c=[],g=1,f=s?0:60;return s?(c.push(Object(n.a)(l.a,{text:i.formatMessage(q.discover)},g++),Object(n.a)(d.a,{icon:"users",text:i.formatMessage(q.community_timeline),to:"/timelines/public/local"},g++),Object(n.a)(d.a,{icon:"globe",text:i.formatMessage(q.public_timeline),to:"/timelines/public"},g++)),f+=130,O.o&&(c.push(Object(n.a)(d.a,{icon:"address-book",text:i.formatMessage(q.profile_directory),to:"/directory"},g++)),f+=48),c.push(Object(n.a)(l.a,{text:i.formatMessage(q.personal)},g++)),f+=34):O.o&&(c.push(Object(n.a)(d.a,{icon:"address-book",text:i.formatMessage(q.profile_directory),to:"/directory"},g++)),f+=48),c.push(Object(n.a)(d.a,{icon:"envelope",text:i.formatMessage(q.direct),to:"/timelines/direct"},g++),Object(n.a)(d.a,{icon:"bookmark",text:i.formatMessage(q.bookmarks),to:"/bookmarks"},g++),Object(n.a)(d.a,{icon:"star",text:i.formatMessage(q.favourites),to:"/favourites"},g++),Object(n.a)(d.a,{icon:"list-ul",text:i.formatMessage(q.lists),to:"/lists"},g++)),f+=192,(o.get("locked")||r>0)&&(c.push(Object(n.a)(d.a,{icon:"user-plus",text:i.formatMessage(q.follow_requests),badge:(e=r,t=40,0===e?void 0:t&&e>=t?t+"+":e),to:"/follow_requests"},g++)),f+=48),s||(c.push(Object(n.a)(l.a,{text:i.formatMessage(q.settings_subheading)},g++),Object(n.a)(d.a,{icon:"gears",text:i.formatMessage(q.preferences),href:"/settings/preferences"},g++)),f+=82),Object(n.a)(u.a,{bindToDocument:!s,label:i.formatMessage(q.menu)},void 0,s&&Object(n.a)("div",{className:"column-header__wrapper"},void 0,Object(n.a)("h1",{className:"column-header"},void 0,Object(n.a)("button",{},void 0,Object(n.a)(y.a,{id:"bars",className:"column-header__icon",fixedWidth:!0}),Object(n.a)(b.b,{id:"getting_started.heading",defaultMessage:"Getting started"})))),Object(n.a)("div",{className:"getting-started"},void 0,Object(n.a)("div",{className:"getting-started__wrapper",style:{height:f}},void 0,!s&&Object(n.a)(M.a,{account:o}),c),!s&&Object(n.a)("div",{className:"flex-spacer"}),Object(n.a)(k.a,{withHotkeys:s})),s&&O.s&&Object(n.a)(w.a,{}))},t}(j.a),Object(c.a)(o,"contextTypes",{router:m.a.object.isRequired}),Object(c.a)(o,"propTypes",{intl:m.a.object.isRequired,myAccount:v.a.map.isRequired,columns:v.a.list,multiColumn:m.a.bool,fetchFollowRequests:m.a.func.isRequired,unreadFollowRequests:m.a.number,unreadNotifications:m.a.number}),i=s))||i)||i},839:function(e,t,a){"use strict";var i=a(13),o=a(264),s=a(0),n=a(7),r=a(1),c=(a(3),a(18)),u=a(5),d=a.n(u),l=a(14),b=a.n(l),g=a(744),f=a(6),m=function(e){function t(){return e.apply(this,arguments)||this}Object(n.a)(t,e);var a=t.prototype;return a.componentDidMount=function(){var e=this;this.props.fetchTrends(),this.refreshInterval=setInterval((function(){return e.props.fetchTrends()}),9e5)},a.componentWillUnmount=function(){this.refreshInterval&&clearInterval(this.refreshInterval)},a.render=function(){var e=this.props.trends;return!e||e.isEmpty()?null:Object(s.a)("div",{className:"getting-started__trends"},void 0,Object(s.a)("h4",{},void 0,Object(s.a)(f.b,{id:"trends.trending_now",defaultMessage:"Trending now"})),e.take(3).map((function(e){return Object(s.a)(g.a,{hashtag:e},e.get("name"))})))},t}(c.a);Object(r.a)(m,"defaultProps",{loading:!1}),Object(r.a)(m,"propTypes",{trends:b.a.list,fetchTrends:d.a.func.isRequired});t.a=Object(i.connect)((function(e){return{trends:e.getIn(["trends","items"])}}),(function(e){return{fetchTrends:function(){return e(Object(o.d)())}}}))(m)}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{788:function(e,t,a){"use strict";a.d(t,"a",(function(){return j}));var i,o,s=a(0),n=a(2),r=(a(9),a(6),a(8)),c=a(1),u=a(15),d=a(3),l=a.n(d),b=a(7),g=a(322),f=a(22),m=a(724),p=a(48);var v=Object(b.f)({logoutMessage:{id:"confirmations.logout.message",defaultMessage:"Are you sure you want to log out?"},logoutConfirm:{id:"confirmations.logout.confirm",defaultMessage:"Log out"}}),j=(i=Object(u.connect)(null,(function(e,t){var a=t.intl;return{onLogout:function(){e(Object(p.d)("CONFIRM",{message:a.formatMessage(v.logoutMessage),confirm:a.formatMessage(v.logoutConfirm),onConfirm:function(){return Object(m.a)()}}))}}})),Object(b.g)(o=i(o=function(e){Object(r.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,i=new Array(a),o=0;o<a;o++)i[o]=arguments[o];return t=e.call.apply(e,[this].concat(i))||this,Object(c.a)(Object(n.a)(t),"handleLogoutClick",(function(e){return e.preventDefault(),e.stopPropagation(),t.props.onLogout(),!1})),t}return a.prototype.render=function(){var e=this.props.withHotkeys;return(Object(s.a)("div",{className:"getting-started__footer"},void 0,Object(s.a)("ul",{},void 0,f.j&&Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/invites",target:"_blank"},void 0,Object(s.a)(b.b,{id:"getting_started.invite",defaultMessage:"Invite people"}))," · "),e&&Object(s.a)("li",{},void 0,Object(s.a)(g.a,{to:"/keyboard-shortcuts"},void 0,Object(s.a)(b.b,{id:"navigation_bar.keyboard_shortcuts",defaultMessage:"Hotkeys"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/auth/edit"},void 0,Object(s.a)(b.b,{id:"getting_started.security",defaultMessage:"Security"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/about/more",target:"_blank"},void 0,Object(s.a)(b.b,{id:"navigation_bar.info",defaultMessage:"About this server"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"https://joinmastodon.org/apps",target:"_blank"},void 0,Object(s.a)(b.b,{id:"navigation_bar.apps",defaultMessage:"Mobile apps"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/terms",target:"_blank"},void 0,Object(s.a)(b.b,{id:"getting_started.terms",defaultMessage:"Terms of service"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/settings/applications",target:"_blank"},void 0,Object(s.a)(b.b,{id:"getting_started.developers",defaultMessage:"Developers"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"https://docs.joinmastodon.org",target:"_blank"},void 0,Object(s.a)(b.b,{id:"getting_started.documentation",defaultMessage:"Documentation"}))," · "),Object(s.a)("li",{},void 0,Object(s.a)("a",{href:"/auth/sign_out",onClick:this.handleLogoutClick},void 0,Object(s.a)(b.b,{id:"navigation_bar.logout",defaultMessage:"Logout"})))),Object(s.a)("p",{},void 0,Object(s.a)(b.b,{id:"getting_started.open_source_notice",defaultMessage:"Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",values:{github:Object(s.a)("span",{},void 0,Object(s.a)("a",{href:f.t,rel:"noopener noreferrer",target:"_blank"},void 0,f.q)," (v",f.y,")")}}))))},a}(l.a.PureComponent))||o)||o)},816:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return x}));var i,o,s,n=a(0),r=(a(9),a(6),a(8)),c=a(1),u=(a(3),a(757)),d=a(1173),l=a(1174),b=a(7),g=a(15),f=a(5),m=a.n(f),p=a(16),v=a.n(p),j=a(21),O=a(22),h=a(26),_=a(4),M=a(782),y=a(27),k=a(788),w=a(865);var q=Object(b.f)({home_timeline:{id:"tabs_bar.home",defaultMessage:"Home"},notifications:{id:"tabs_bar.notifications",defaultMessage:"Notifications"},public_timeline:{id:"navigation_bar.public_timeline",defaultMessage:"Federated timeline"},settings_subheading:{id:"column_subheading.settings",defaultMessage:"Settings"},community_timeline:{id:"navigation_bar.community_timeline",defaultMessage:"Local timeline"},direct:{id:"navigation_bar.direct",defaultMessage:"Direct messages"},bookmarks:{id:"navigation_bar.bookmarks",defaultMessage:"Bookmarks"},preferences:{id:"navigation_bar.preferences",defaultMessage:"Preferences"},follow_requests:{id:"navigation_bar.follow_requests",defaultMessage:"Follow requests"},favourites:{id:"navigation_bar.favourites",defaultMessage:"Favourites"},blocks:{id:"navigation_bar.blocks",defaultMessage:"Blocked users"},domain_blocks:{id:"navigation_bar.domain_blocks",defaultMessage:"Hidden domains"},mutes:{id:"navigation_bar.mutes",defaultMessage:"Muted users"},pins:{id:"navigation_bar.pins",defaultMessage:"Pinned toots"},lists:{id:"navigation_bar.lists",defaultMessage:"Lists"},discover:{id:"navigation_bar.discover",defaultMessage:"Discover"},personal:{id:"navigation_bar.personal",defaultMessage:"Personal"},security:{id:"navigation_bar.security",defaultMessage:"Security"},menu:{id:"getting_started.heading",defaultMessage:"Getting started"},profile_directory:{id:"getting_started.directory",defaultMessage:"Profile directory"}}),x=Object(g.connect)((function(e){return{myAccount:e.getIn(["accounts",O.n]),unreadFollowRequests:e.getIn(["user_lists","follow_requests","items"],Object(_.List)()).size}}),(function(e){return{fetchFollowRequests:function(){return e(Object(h.B)())}}}))(i=Object(b.g)((s=o=function(e){Object(r.a)(a,e);var t;t=a;function a(){return e.apply(this,arguments)||this}var i=a.prototype;return i.componentDidMount=function(){var e=this.props,t=e.fetchFollowRequests;!e.multiColumn&&window.innerWidth>=1190?this.context.router.history.replace("/timelines/home"):t()},i.render=function(){var e,t,a=this.props,i=a.intl,o=a.myAccount,s=a.multiColumn,r=a.unreadFollowRequests,c=[],g=1,f=s?0:60;return s?(c.push(Object(n.a)(l.a,{text:i.formatMessage(q.discover)},g++),Object(n.a)(d.a,{icon:"users",text:i.formatMessage(q.community_timeline),to:"/timelines/public/local"},g++),Object(n.a)(d.a,{icon:"globe",text:i.formatMessage(q.public_timeline),to:"/timelines/public"},g++)),f+=130,O.o&&(c.push(Object(n.a)(d.a,{icon:"address-book",text:i.formatMessage(q.profile_directory),to:"/directory"},g++)),f+=48),c.push(Object(n.a)(l.a,{text:i.formatMessage(q.personal)},g++)),f+=34):O.o&&(c.push(Object(n.a)(d.a,{icon:"address-book",text:i.formatMessage(q.profile_directory),to:"/directory"},g++)),f+=48),c.push(Object(n.a)(d.a,{icon:"envelope",text:i.formatMessage(q.direct),to:"/timelines/direct"},g++),Object(n.a)(d.a,{icon:"bookmark",text:i.formatMessage(q.bookmarks),to:"/bookmarks"},g++),Object(n.a)(d.a,{icon:"star",text:i.formatMessage(q.favourites),to:"/favourites"},g++),Object(n.a)(d.a,{icon:"list-ul",text:i.formatMessage(q.lists),to:"/lists"},g++)),f+=192,(o.get("locked")||r>0)&&(c.push(Object(n.a)(d.a,{icon:"user-plus",text:i.formatMessage(q.follow_requests),badge:(e=r,t=40,0===e?void 0:t&&e>=t?t+"+":e),to:"/follow_requests"},g++)),f+=48),s||(c.push(Object(n.a)(l.a,{text:i.formatMessage(q.settings_subheading)},g++),Object(n.a)(d.a,{icon:"gears",text:i.formatMessage(q.preferences),href:"/settings/preferences"},g++)),f+=82),Object(n.a)(u.a,{bindToDocument:!s,label:i.formatMessage(q.menu)},void 0,s&&Object(n.a)("div",{className:"column-header__wrapper"},void 0,Object(n.a)("h1",{className:"column-header"},void 0,Object(n.a)("button",{},void 0,Object(n.a)(y.a,{id:"bars",className:"column-header__icon",fixedWidth:!0}),Object(n.a)(b.b,{id:"getting_started.heading",defaultMessage:"Getting started"})))),Object(n.a)("div",{className:"getting-started"},void 0,Object(n.a)("div",{className:"getting-started__wrapper",style:{height:f}},void 0,!s&&Object(n.a)(M.a,{account:o}),c),!s&&Object(n.a)("div",{className:"flex-spacer"}),Object(n.a)(k.a,{withHotkeys:s})),s&&O.s&&Object(n.a)(w.a,{}))},a}(j.a),Object(c.a)(o,"contextTypes",{router:m.a.object.isRequired}),Object(c.a)(o,"propTypes",{intl:m.a.object.isRequired,myAccount:v.a.map.isRequired,columns:v.a.list,multiColumn:m.a.bool,fetchFollowRequests:m.a.func.isRequired,unreadFollowRequests:m.a.number,unreadNotifications:m.a.number}),i=s))||i)||i},865:function(e,t,a){"use strict";var i=a(15),o=a(231),s=a(0),n=(a(9),a(6),a(8)),r=a(1),c=(a(3),a(21)),u=a(5),d=a.n(u),l=a(16),b=a.n(l),g=a(770),f=a(7);var m=function(e){Object(n.a)(a,e);var t;t=a;function a(){return e.apply(this,arguments)||this}var i=a.prototype;return i.componentDidMount=function(){var e=this;this.props.fetchTrends(),this.refreshInterval=setInterval((function(){return e.props.fetchTrends()}),9e5)},i.componentWillUnmount=function(){this.refreshInterval&&clearInterval(this.refreshInterval)},i.render=function(){var e=this.props.trends;return!e||e.isEmpty()?null:Object(s.a)("div",{className:"getting-started__trends"},void 0,Object(s.a)("h4",{},void 0,Object(s.a)(f.b,{id:"trends.trending_now",defaultMessage:"Trending now"})),e.take(3).map((function(e){return Object(s.a)(g.a,{hashtag:e},e.get("name"))})))},a}(c.a);Object(r.a)(m,"defaultProps",{loading:!1}),Object(r.a)(m,"propTypes",{trends:b.a.list,fetchTrends:d.a.func.isRequired});t.a=Object(i.connect)((function(e){return{trends:e.getIn(["trends","items"])}}),(function(e){return{fetchTrends:function(){return e(Object(o.d)())}}}))(m)}}]);
//# sourceMappingURL=getting_started.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/getting_started.js.map b/priv/static/packs/features/getting_started.js.map
index f53c06c10..808b2d8ba 100644
--- a/priv/static/packs/features/getting_started.js.map
+++ b/priv/static/packs/features/getting_started.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/ui/components/link_footer.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/getting_started/index.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/getting_started/components/trends.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/getting_started/containers/trends_container.js"],"names":["messages","defineMessages","logoutMessage","logoutConfirm","LinkFooter","connect","dispatch","intl","onLogout","openModal","message","formatMessage","confirm","onConfirm","logOut","injectIntl","e","preventDefault","stopPropagation","props","render","withHotkeys","this","className","invitesEnabled","href","target","id","defaultMessage","to","onClick","handleLogoutClick","values","github","source_url","rel","repository","version","React","PureComponent","home_timeline","notifications","public_timeline","settings_subheading","community_timeline","direct","bookmarks","preferences","follow_requests","favourites","blocks","domain_blocks","mutes","pins","lists","discover","personal","security","menu","profile_directory","GettingStarted","state","myAccount","getIn","me","unreadFollowRequests","ImmutableList","size","fetchFollowRequests","componentDidMount","multiColumn","window","innerWidth","context","router","history","replace","number","limit","navItems","i","height","push","text","icon","get","badge","bindToDocument","label","fixedWidth","style","account","showTrends","ImmutablePureComponent","PropTypes","object","isRequired","ImmutablePropTypes","map","columns","list","bool","func","unreadNotifications","Trends","fetchTrends","refreshInterval","setInterval","componentWillUnmount","clearInterval","trends","isEmpty","take","hashtag","loading"],"mappings":"kOASMA,EAAWC,YAAe,CAC9BC,cAAc,CAAD,sFACbC,cAAc,CAAD,8DAeTC,G,EADLC,kBAAQ,MAXkB,SAACC,EAAD,OAAaC,EAAb,EAAaA,KAAb,MAAyB,CAClDC,SADkD,WAEhDF,EAASG,YAAU,UAAW,CAC5BC,QAASH,EAAKI,cAAcX,EAASE,eACrCU,QAASL,EAAKI,cAAcX,EAASG,eACrCU,UAAW,kBAAMC,uBAKPC,Y,yMAUM,SAAAC,GAMlB,OALAA,EAAEC,iBACFD,EAAEE,kBAEF,EAAKC,MAAMX,YAEJ,K,sCAGTY,OAAA,WAAW,IACDC,EAAgBC,KAAKH,MAArBE,YAER,OACE,mBAAKE,UAAU,gCAAf,EACE,2BACGC,KAAkB,2BAAI,iBAAGC,KAAK,WAAWC,OAAO,eAA1B,EAAmC,YAAC,IAAD,CAAkBC,GAAG,yBAAyBC,eAAe,mBAApG,OAClBP,GAAe,2BAAI,YAAC,IAAD,CAAMQ,GAAG,4BAAT,EAA+B,YAAC,IAAD,CAAkBF,GAAG,oCAAoCC,eAAe,aAA3G,OAChB,2BAAI,iBAAGH,KAAK,mBAAR,EAAqB,YAAC,IAAD,CAAkBE,GAAG,2BAA2BC,eAAe,cAAxF,OACA,2BAAI,iBAAGH,KAAK,cAAcC,OAAO,eAA7B,EAAsC,YAAC,IAAD,CAAkBC,GAAG,sBAAsBC,eAAe,uBAApG,OACA,2BAAI,iBAAGH,KAAK,gCAAgCC,OAAO,eAA/C,EAAwD,YAAC,IAAD,CAAkBC,GAAG,sBAAsBC,eAAe,iBAAtH,OACA,2BAAI,iBAAGH,KAAK,SAASC,OAAO,eAAxB,EAAiC,YAAC,IAAD,CAAkBC,GAAG,wBAAwBC,eAAe,sBAAjG,OACA,2BAAI,iBAAGH,KAAK,yBAAyBC,OAAO,eAAxC,EAAiD,YAAC,IAAD,CAAkBC,GAAG,6BAA6BC,eAAe,gBAAtH,OACA,2BAAI,iBAAGH,KAAK,gCAAgCC,OAAO,eAA/C,EAAwD,YAAC,IAAD,CAAkBC,GAAG,gCAAgCC,eAAe,mBAAhI,OACA,2BAAI,iBAAGH,KAAK,iBAAiBK,QAASR,KAAKS,wBAAvC,EAA0D,YAAC,IAAD,CAAkBJ,GAAG,wBAAwBC,eAAe,cAG5H,0BACE,YAAC,IAAD,CACED,GAAG,qCACHC,eAAe,+FACfI,OAAQ,CAAEC,OAAQ,6BAAM,iBAAGR,KAAMS,IAAYC,IAAI,sBAAsBT,OAAO,eAAtD,EAAgEU,KAAtE,MAAyFC,IAAzF,W,GAtCLC,IAAMC,iB,6QCTzBvC,EAAWC,YAAe,CAC9BuC,cAAc,CAAD,0CACbC,cAAc,CAAD,4DACbC,gBAAgB,CAAD,yEACfC,oBAAoB,CAAD,2DACnBC,mBAAmB,CAAD,wEAClBC,OAAO,CAAD,6DACNC,UAAU,CAAD,0DACTC,YAAY,CAAD,8DACXC,gBAAgB,CAAD,sEACfC,WAAW,CAAD,4DACVC,OAAO,CAAD,2DACNC,cAAc,CAAD,mEACbC,MAAM,CAAD,wDACLC,KAAK,CAAD,wDACJC,MAAM,CAAD,kDACLC,SAAS,CAAD,wDACRC,SAAS,CAAD,wDACRC,SAAS,CAAD,wDACRC,KAAK,CAAD,+DACJC,kBAAkB,CAAD,qEA0BbC,EAFUvD,mBArBQ,SAAAwD,GAAK,MAAK,CAChCC,UAAWD,EAAME,MAAM,CAAC,WAAYC,MACpCC,qBAAsBJ,EAAME,MAAM,CAAC,aAAc,kBAAmB,SAAUG,kBAAiBC,SAGtE,SAAA7D,GAAQ,MAAK,CACtC8D,oBAAqB,kBAAM9D,EAAS8D,mB,GAgBrCrD,a,8GAiBCsD,kBAAA,WAAsB,IAAD,EAC0B/C,KAAKH,MAA1CiD,EADW,EACXA,qBADW,EACUE,aAETC,OAAOC,YAvBK,KAwB9BlD,KAAKmD,QAAQC,OAAOC,QAAQC,QAAQ,mBAItCR,K,EAGFhD,OAAA,WAAW,IAzCSyD,EAAQC,EAyClB,EACuDxD,KAAKH,MAA5DZ,EADA,EACAA,KAAMuD,EADN,EACMA,UAAWQ,EADjB,EACiBA,YAAaL,EAD9B,EAC8BA,qBAEhCc,EAAW,GACbC,EAAI,EACJC,EAAUX,EAAe,EAAI,GAuDjC,OArDIA,GACFS,EAASG,KACP,YAAC,IAAD,CAA4BC,KAAM5E,EAAKI,cAAcX,EAASuD,WAAvCyB,KACvB,YAAC,IAAD,CAAsBI,KAAK,QAAQD,KAAM5E,EAAKI,cAAcX,EAAS4C,oBAAqBf,GAAG,2BAA5EmD,KACjB,YAAC,IAAD,CAAsBI,KAAK,QAAQD,KAAM5E,EAAKI,cAAcX,EAAS0C,iBAAkBb,GAAG,qBAAzEmD,MAGnBC,GAAU,IAENtB,MACFoB,EAASG,KACP,YAAC,IAAD,CAAsBE,KAAK,eAAeD,KAAM5E,EAAKI,cAAcX,EAAS2D,mBAAoB9B,GAAG,cAAlFmD,MAGnBC,GAAU,IAGZF,EAASG,KACP,YAAC,IAAD,CAA4BC,KAAM5E,EAAKI,cAAcX,EAASwD,WAAvCwB,MAGzBC,GAAU,IACDtB,MACToB,EAASG,KACP,YAAC,IAAD,CAAsBE,KAAK,eAAeD,KAAM5E,EAAKI,cAAcX,EAAS2D,mBAAoB9B,GAAG,cAAlFmD,MAGnBC,GAAU,IAGZF,EAASG,KACP,YAAC,IAAD,CAAsBE,KAAK,WAAWD,KAAM5E,EAAKI,cAAcX,EAAS6C,QAAShB,GAAG,qBAAnEmD,KACjB,YAAC,IAAD,CAAsBI,KAAK,WAAWD,KAAM5E,EAAKI,cAAcX,EAAS8C,WAAYjB,GAAG,cAAtEmD,KACjB,YAAC,IAAD,CAAsBI,KAAK,OAAOD,KAAM5E,EAAKI,cAAcX,EAASiD,YAAapB,GAAG,eAAnEmD,KACjB,YAAC,IAAD,CAAsBI,KAAK,UAAUD,KAAM5E,EAAKI,cAAcX,EAASsD,OAAQzB,GAAG,UAAjEmD,MAGnBC,GAAU,KAENnB,EAAUuB,IAAI,WAAapB,EAAuB,KACpDc,EAASG,KAAK,YAAC,IAAD,CAAsBE,KAAK,YAAYD,KAAM5E,EAAKI,cAAcX,EAASgD,iBAAkBsC,OAxFzFT,EAwF6GZ,EAxFrGa,EAwF2H,GAvFxI,IAAXD,OACF,EACSC,GAASD,GAAUC,EAClBA,EAAV,IAEOD,GAkFmJhD,GAAG,oBAA5HmD,MAC/BC,GAAU,IAGPX,IACHS,EAASG,KACP,YAAC,IAAD,CAA4BC,KAAM5E,EAAKI,cAAcX,EAAS2C,sBAAvCqC,KACvB,YAAC,IAAD,CAAsBI,KAAK,QAAQD,KAAM5E,EAAKI,cAAcX,EAAS+C,aAActB,KAAK,yBAAvEuD,MAGnBC,GAAU,IAIV,YAAC,IAAD,CAAQM,gBAAiBjB,EAAakB,MAAOjF,EAAKI,cAAcX,EAAS0D,YAAzE,EACGY,GAAe,mBAAK/C,UAAU,+BAAf,EACd,kBAAIA,UAAU,sBAAd,EACE,+BACE,YAAC,IAAD,CAAMI,GAAG,OAAOJ,UAAU,sBAAsBkE,YAAU,IAC1D,YAAC,IAAD,CAAkB9D,GAAG,0BAA0BC,eAAe,uBAKpE,mBAAKL,UAAU,wBAAf,EACE,mBAAKA,UAAU,2BAA2BmE,MAAO,CAAET,gBAAnD,GACIX,GAAe,YAAC,IAAD,CAAeqB,QAAS7B,IACxCiB,IAGDT,GAAe,mBAAK/C,UAAU,gBAEhC,YAAC,IAAD,CAAYF,YAAaiD,KAG1BA,GAAesB,KAAc,YAAC,IAAD,M,GA7GTC,K,6BAEL,CACpBnB,OAAQoB,IAAUC,OAAOC,a,0BAGR,CACjBzF,KAAMuF,IAAUC,OAAOC,WACvBlC,UAAWmC,IAAmBC,IAAIF,WAClCG,QAASF,IAAmBG,KAC5B9B,YAAawB,IAAUO,KACvBjC,oBAAqB0B,IAAUQ,KAAKN,WACpC/B,qBAAsB6B,IAAUjB,OAChC0B,oBAAqBT,IAAUjB,S,yJCrEd2B,E,0GAWnBnC,kBAAA,WAAsB,IAAD,OACnB/C,KAAKH,MAAMsF,cACXnF,KAAKoF,gBAAkBC,aAAY,kBAAM,EAAKxF,MAAMsF,gBAAe,M,EAGrEG,qBAAA,WACMtF,KAAKoF,iBACPG,cAAcvF,KAAKoF,kB,EAIvBtF,OAAA,WAAW,IACD0F,EAAWxF,KAAKH,MAAhB2F,OAER,OAAKA,GAAUA,EAAOC,UACb,KAIP,mBAAKxF,UAAU,gCAAf,EACE,2BAAI,YAAC,IAAD,CAAkBI,GAAG,sBAAsBC,eAAe,kBAE7DkF,EAAOE,KAAK,GAAGd,KAAI,SAAAe,GAAO,OAAI,YAAC,IAAD,CAAmCA,QAASA,GAA9BA,EAAQ5B,IAAI,c,GAjC7BQ,K,YAAfW,E,eAEG,CACpBU,SAAS,I,YAHQV,E,YAMA,CACjBM,OAAQb,IAAmBG,KAC3BK,YAAaX,IAAUQ,KAAKN,aCHjB3F,uBARS,SAAAwD,GAAK,MAAK,CAChCiD,OAAQjD,EAAME,MAAM,CAAC,SAAU,cAGN,SAAAzD,GAAQ,MAAK,CACtCmG,YAAa,kBAAMnG,EAASmG,mBAGfpG,CAA6CmG","file":"features/getting_started.js","sourcesContent":["import { connect } from 'react-redux';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { invitesEnabled, version, repository, source_url } from 'mastodon/initial_state';\nimport { logOut } from 'mastodon/utils/log_out';\nimport { openModal } from 'mastodon/actions/modal';\n\nconst messages = defineMessages({\n logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },\n logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },\n});\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n onLogout () {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.logoutMessage),\n confirm: intl.formatMessage(messages.logoutConfirm),\n onConfirm: () => logOut(),\n }));\n },\n});\n\nexport default @injectIntl\n@connect(null, mapDispatchToProps)\nclass LinkFooter extends React.PureComponent {\n\n static propTypes = {\n withHotkeys: PropTypes.bool,\n onLogout: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleLogoutClick = e => {\n e.preventDefault();\n e.stopPropagation();\n\n this.props.onLogout();\n\n return false;\n }\n\n render () {\n const { withHotkeys } = this.props;\n\n return (\n <div className='getting-started__footer'>\n <ul>\n {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}\n {withHotkeys && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>}\n <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li>\n <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li>\n <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li>\n <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li>\n <li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li>\n <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a> · </li>\n <li><a href='/auth/sign_out' onClick={this.handleLogoutClick}><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a></li>\n </ul>\n\n <p>\n <FormattedMessage\n id='getting_started.open_source_notice'\n defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.'\n values={{ github: <span><a href={source_url} rel='noopener noreferrer' target='_blank'>{repository}</a> (v{version})</span> }}\n />\n </p>\n </div>\n );\n }\n\n};\n","import React from 'react';\nimport Column from '../ui/components/column';\nimport ColumnLink from '../ui/components/column_link';\nimport ColumnSubheading from '../ui/components/column_subheading';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { me, profile_directory, showTrends } from '../../initial_state';\nimport { fetchFollowRequests } from 'mastodon/actions/accounts';\nimport { List as ImmutableList } from 'immutable';\nimport NavigationBar from '../compose/components/navigation_bar';\nimport Icon from 'mastodon/components/icon';\nimport LinkFooter from 'mastodon/features/ui/components/link_footer';\nimport TrendsContainer from './containers/trends_container';\n\nconst messages = defineMessages({\n home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' },\n notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },\n public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },\n settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },\n community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },\n direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' },\n bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },\n preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },\n follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },\n favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },\n blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },\n domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' },\n mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },\n pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' },\n lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },\n discover: { id: 'navigation_bar.discover', defaultMessage: 'Discover' },\n personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' },\n security: { id: 'navigation_bar.security', defaultMessage: 'Security' },\n menu: { id: 'getting_started.heading', defaultMessage: 'Getting started' },\n profile_directory: { id: 'getting_started.directory', defaultMessage: 'Profile directory' },\n});\n\nconst mapStateToProps = state => ({\n myAccount: state.getIn(['accounts', me]),\n unreadFollowRequests: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size,\n});\n\nconst mapDispatchToProps = dispatch => ({\n fetchFollowRequests: () => dispatch(fetchFollowRequests()),\n});\n\nconst badgeDisplay = (number, limit) => {\n if (number === 0) {\n return undefined;\n } else if (limit && number >= limit) {\n return `${limit}+`;\n } else {\n return number;\n }\n};\n\nconst NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2);\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass GettingStarted extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object.isRequired,\n };\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n myAccount: ImmutablePropTypes.map.isRequired,\n columns: ImmutablePropTypes.list,\n multiColumn: PropTypes.bool,\n fetchFollowRequests: PropTypes.func.isRequired,\n unreadFollowRequests: PropTypes.number,\n unreadNotifications: PropTypes.number,\n };\n\n componentDidMount () {\n const { fetchFollowRequests, multiColumn } = this.props;\n\n if (!multiColumn && window.innerWidth >= NAVIGATION_PANEL_BREAKPOINT) {\n this.context.router.history.replace('/timelines/home');\n return;\n }\n\n fetchFollowRequests();\n }\n\n render () {\n const { intl, myAccount, multiColumn, unreadFollowRequests } = this.props;\n\n const navItems = [];\n let i = 1;\n let height = (multiColumn) ? 0 : 60;\n\n if (multiColumn) {\n navItems.push(\n <ColumnSubheading key={i++} text={intl.formatMessage(messages.discover)} />,\n <ColumnLink key={i++} icon='users' text={intl.formatMessage(messages.community_timeline)} to='/timelines/public/local' />,\n <ColumnLink key={i++} icon='globe' text={intl.formatMessage(messages.public_timeline)} to='/timelines/public' />,\n );\n\n height += 34 + 48*2;\n\n if (profile_directory) {\n navItems.push(\n <ColumnLink key={i++} icon='address-book' text={intl.formatMessage(messages.profile_directory)} to='/directory' />\n );\n\n height += 48;\n }\n\n navItems.push(\n <ColumnSubheading key={i++} text={intl.formatMessage(messages.personal)} />\n );\n\n height += 34;\n } else if (profile_directory) {\n navItems.push(\n <ColumnLink key={i++} icon='address-book' text={intl.formatMessage(messages.profile_directory)} to='/directory' />\n );\n\n height += 48;\n }\n\n navItems.push(\n <ColumnLink key={i++} icon='envelope' text={intl.formatMessage(messages.direct)} to='/timelines/direct' />,\n <ColumnLink key={i++} icon='bookmark' text={intl.formatMessage(messages.bookmarks)} to='/bookmarks' />,\n <ColumnLink key={i++} icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />,\n <ColumnLink key={i++} icon='list-ul' text={intl.formatMessage(messages.lists)} to='/lists' />\n );\n\n height += 48*4;\n\n if (myAccount.get('locked') || unreadFollowRequests > 0) {\n navItems.push(<ColumnLink key={i++} icon='user-plus' text={intl.formatMessage(messages.follow_requests)} badge={badgeDisplay(unreadFollowRequests, 40)} to='/follow_requests' />);\n height += 48;\n }\n\n if (!multiColumn) {\n navItems.push(\n <ColumnSubheading key={i++} text={intl.formatMessage(messages.settings_subheading)} />,\n <ColumnLink key={i++} icon='gears' text={intl.formatMessage(messages.preferences)} href='/settings/preferences' />,\n );\n\n height += 34 + 48;\n }\n\n return (\n <Column bindToDocument={!multiColumn} label={intl.formatMessage(messages.menu)}>\n {multiColumn && <div className='column-header__wrapper'>\n <h1 className='column-header'>\n <button>\n <Icon id='bars' className='column-header__icon' fixedWidth />\n <FormattedMessage id='getting_started.heading' defaultMessage='Getting started' />\n </button>\n </h1>\n </div>}\n\n <div className='getting-started'>\n <div className='getting-started__wrapper' style={{ height }}>\n {!multiColumn && <NavigationBar account={myAccount} />}\n {navItems}\n </div>\n\n {!multiColumn && <div className='flex-spacer' />}\n\n <LinkFooter withHotkeys={multiColumn} />\n </div>\n\n {multiColumn && showTrends && <TrendsContainer />}\n </Column>\n );\n }\n\n}\n","import React from 'react';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Hashtag from 'mastodon/components/hashtag';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Trends extends ImmutablePureComponent {\n\n static defaultProps = {\n loading: false,\n };\n\n static propTypes = {\n trends: ImmutablePropTypes.list,\n fetchTrends: PropTypes.func.isRequired,\n };\n\n componentDidMount () {\n this.props.fetchTrends();\n this.refreshInterval = setInterval(() => this.props.fetchTrends(), 900 * 1000);\n }\n\n componentWillUnmount () {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n }\n\n render () {\n const { trends } = this.props;\n\n if (!trends || trends.isEmpty()) {\n return null;\n }\n\n return (\n <div className='getting-started__trends'>\n <h4><FormattedMessage id='trends.trending_now' defaultMessage='Trending now' /></h4>\n\n {trends.take(3).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { fetchTrends } from '../../../actions/trends';\nimport Trends from '../components/trends';\n\nconst mapStateToProps = state => ({\n trends: state.getIn(['trends', 'items']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n fetchTrends: () => dispatch(fetchTrends()),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Trends);\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/ui/components/link_footer.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/getting_started/index.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/getting_started/components/trends.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/getting_started/containers/trends_container.js"],"names":["messages","defineMessages","logoutMessage","logoutConfirm","LinkFooter","connect","dispatch","intl","onLogout","openModal","message","formatMessage","confirm","onConfirm","logOut","injectIntl","e","preventDefault","stopPropagation","props","render","withHotkeys","this","className","invitesEnabled","href","target","id","defaultMessage","to","onClick","handleLogoutClick","values","github","source_url","rel","repository","version","React","PureComponent","home_timeline","notifications","public_timeline","settings_subheading","community_timeline","direct","bookmarks","preferences","follow_requests","favourites","blocks","domain_blocks","mutes","pins","lists","discover","personal","security","menu","profile_directory","GettingStarted","state","myAccount","getIn","me","unreadFollowRequests","ImmutableList","size","fetchFollowRequests","componentDidMount","multiColumn","window","innerWidth","context","router","history","replace","number","limit","navItems","i","height","push","text","icon","get","badge","bindToDocument","label","fixedWidth","style","account","showTrends","ImmutablePureComponent","PropTypes","object","isRequired","ImmutablePropTypes","map","columns","list","bool","func","unreadNotifications","Trends","fetchTrends","refreshInterval","setInterval","componentWillUnmount","clearInterval","trends","isEmpty","take","hashtag","loading"],"mappings":"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","file":"features/getting_started.js","sourcesContent":["import { connect } from 'react-redux';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { invitesEnabled, version, repository, source_url } from 'mastodon/initial_state';\nimport { logOut } from 'mastodon/utils/log_out';\nimport { openModal } from 'mastodon/actions/modal';\n\nconst messages = defineMessages({\n logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },\n logoutConfirm: { id: 'confirmations.logout.confirm', defaultMessage: 'Log out' },\n});\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n onLogout () {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.logoutMessage),\n confirm: intl.formatMessage(messages.logoutConfirm),\n onConfirm: () => logOut(),\n }));\n },\n});\n\nexport default @injectIntl\n@connect(null, mapDispatchToProps)\nclass LinkFooter extends React.PureComponent {\n\n static propTypes = {\n withHotkeys: PropTypes.bool,\n onLogout: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n handleLogoutClick = e => {\n e.preventDefault();\n e.stopPropagation();\n\n this.props.onLogout();\n\n return false;\n }\n\n render () {\n const { withHotkeys } = this.props;\n\n return (\n <div className='getting-started__footer'>\n <ul>\n {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}\n {withHotkeys && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>}\n <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li>\n <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li>\n <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li>\n <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li>\n <li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li>\n <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a> · </li>\n <li><a href='/auth/sign_out' onClick={this.handleLogoutClick}><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a></li>\n </ul>\n\n <p>\n <FormattedMessage\n id='getting_started.open_source_notice'\n defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.'\n values={{ github: <span><a href={source_url} rel='noopener noreferrer' target='_blank'>{repository}</a> (v{version})</span> }}\n />\n </p>\n </div>\n );\n }\n\n};\n","import React from 'react';\nimport Column from '../ui/components/column';\nimport ColumnLink from '../ui/components/column_link';\nimport ColumnSubheading from '../ui/components/column_subheading';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { me, profile_directory, showTrends } from '../../initial_state';\nimport { fetchFollowRequests } from 'mastodon/actions/accounts';\nimport { List as ImmutableList } from 'immutable';\nimport NavigationBar from '../compose/components/navigation_bar';\nimport Icon from 'mastodon/components/icon';\nimport LinkFooter from 'mastodon/features/ui/components/link_footer';\nimport TrendsContainer from './containers/trends_container';\n\nconst messages = defineMessages({\n home_timeline: { id: 'tabs_bar.home', defaultMessage: 'Home' },\n notifications: { id: 'tabs_bar.notifications', defaultMessage: 'Notifications' },\n public_timeline: { id: 'navigation_bar.public_timeline', defaultMessage: 'Federated timeline' },\n settings_subheading: { id: 'column_subheading.settings', defaultMessage: 'Settings' },\n community_timeline: { id: 'navigation_bar.community_timeline', defaultMessage: 'Local timeline' },\n direct: { id: 'navigation_bar.direct', defaultMessage: 'Direct messages' },\n bookmarks: { id: 'navigation_bar.bookmarks', defaultMessage: 'Bookmarks' },\n preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },\n follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },\n favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },\n blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },\n domain_blocks: { id: 'navigation_bar.domain_blocks', defaultMessage: 'Hidden domains' },\n mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' },\n pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned toots' },\n lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },\n discover: { id: 'navigation_bar.discover', defaultMessage: 'Discover' },\n personal: { id: 'navigation_bar.personal', defaultMessage: 'Personal' },\n security: { id: 'navigation_bar.security', defaultMessage: 'Security' },\n menu: { id: 'getting_started.heading', defaultMessage: 'Getting started' },\n profile_directory: { id: 'getting_started.directory', defaultMessage: 'Profile directory' },\n});\n\nconst mapStateToProps = state => ({\n myAccount: state.getIn(['accounts', me]),\n unreadFollowRequests: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size,\n});\n\nconst mapDispatchToProps = dispatch => ({\n fetchFollowRequests: () => dispatch(fetchFollowRequests()),\n});\n\nconst badgeDisplay = (number, limit) => {\n if (number === 0) {\n return undefined;\n } else if (limit && number >= limit) {\n return `${limit}+`;\n } else {\n return number;\n }\n};\n\nconst NAVIGATION_PANEL_BREAKPOINT = 600 + (285 * 2) + (10 * 2);\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass GettingStarted extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object.isRequired,\n };\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n myAccount: ImmutablePropTypes.map.isRequired,\n columns: ImmutablePropTypes.list,\n multiColumn: PropTypes.bool,\n fetchFollowRequests: PropTypes.func.isRequired,\n unreadFollowRequests: PropTypes.number,\n unreadNotifications: PropTypes.number,\n };\n\n componentDidMount () {\n const { fetchFollowRequests, multiColumn } = this.props;\n\n if (!multiColumn && window.innerWidth >= NAVIGATION_PANEL_BREAKPOINT) {\n this.context.router.history.replace('/timelines/home');\n return;\n }\n\n fetchFollowRequests();\n }\n\n render () {\n const { intl, myAccount, multiColumn, unreadFollowRequests } = this.props;\n\n const navItems = [];\n let i = 1;\n let height = (multiColumn) ? 0 : 60;\n\n if (multiColumn) {\n navItems.push(\n <ColumnSubheading key={i++} text={intl.formatMessage(messages.discover)} />,\n <ColumnLink key={i++} icon='users' text={intl.formatMessage(messages.community_timeline)} to='/timelines/public/local' />,\n <ColumnLink key={i++} icon='globe' text={intl.formatMessage(messages.public_timeline)} to='/timelines/public' />,\n );\n\n height += 34 + 48*2;\n\n if (profile_directory) {\n navItems.push(\n <ColumnLink key={i++} icon='address-book' text={intl.formatMessage(messages.profile_directory)} to='/directory' />,\n );\n\n height += 48;\n }\n\n navItems.push(\n <ColumnSubheading key={i++} text={intl.formatMessage(messages.personal)} />,\n );\n\n height += 34;\n } else if (profile_directory) {\n navItems.push(\n <ColumnLink key={i++} icon='address-book' text={intl.formatMessage(messages.profile_directory)} to='/directory' />,\n );\n\n height += 48;\n }\n\n navItems.push(\n <ColumnLink key={i++} icon='envelope' text={intl.formatMessage(messages.direct)} to='/timelines/direct' />,\n <ColumnLink key={i++} icon='bookmark' text={intl.formatMessage(messages.bookmarks)} to='/bookmarks' />,\n <ColumnLink key={i++} icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />,\n <ColumnLink key={i++} icon='list-ul' text={intl.formatMessage(messages.lists)} to='/lists' />,\n );\n\n height += 48*4;\n\n if (myAccount.get('locked') || unreadFollowRequests > 0) {\n navItems.push(<ColumnLink key={i++} icon='user-plus' text={intl.formatMessage(messages.follow_requests)} badge={badgeDisplay(unreadFollowRequests, 40)} to='/follow_requests' />);\n height += 48;\n }\n\n if (!multiColumn) {\n navItems.push(\n <ColumnSubheading key={i++} text={intl.formatMessage(messages.settings_subheading)} />,\n <ColumnLink key={i++} icon='gears' text={intl.formatMessage(messages.preferences)} href='/settings/preferences' />,\n );\n\n height += 34 + 48;\n }\n\n return (\n <Column bindToDocument={!multiColumn} label={intl.formatMessage(messages.menu)}>\n {multiColumn && <div className='column-header__wrapper'>\n <h1 className='column-header'>\n <button>\n <Icon id='bars' className='column-header__icon' fixedWidth />\n <FormattedMessage id='getting_started.heading' defaultMessage='Getting started' />\n </button>\n </h1>\n </div>}\n\n <div className='getting-started'>\n <div className='getting-started__wrapper' style={{ height }}>\n {!multiColumn && <NavigationBar account={myAccount} />}\n {navItems}\n </div>\n\n {!multiColumn && <div className='flex-spacer' />}\n\n <LinkFooter withHotkeys={multiColumn} />\n </div>\n\n {multiColumn && showTrends && <TrendsContainer />}\n </Column>\n );\n }\n\n}\n","import React from 'react';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Hashtag from 'mastodon/components/hashtag';\nimport { FormattedMessage } from 'react-intl';\n\nexport default class Trends extends ImmutablePureComponent {\n\n static defaultProps = {\n loading: false,\n };\n\n static propTypes = {\n trends: ImmutablePropTypes.list,\n fetchTrends: PropTypes.func.isRequired,\n };\n\n componentDidMount () {\n this.props.fetchTrends();\n this.refreshInterval = setInterval(() => this.props.fetchTrends(), 900 * 1000);\n }\n\n componentWillUnmount () {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n }\n\n render () {\n const { trends } = this.props;\n\n if (!trends || trends.isEmpty()) {\n return null;\n }\n\n return (\n <div className='getting-started__trends'>\n <h4><FormattedMessage id='trends.trending_now' defaultMessage='Trending now' /></h4>\n\n {trends.take(3).map(hashtag => <Hashtag key={hashtag.get('name')} hashtag={hashtag} />)}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { fetchTrends } from 'mastodon/actions/trends';\nimport Trends from '../components/trends';\n\nconst mapStateToProps = state => ({\n trends: state.getIn(['trends', 'items']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n fetchTrends: () => dispatch(fetchTrends()),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Trends);\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/glitch/async/directory.js b/priv/static/packs/features/glitch/async/directory.js
index db8c2a912..725142be0 100644
--- a/priv/static/packs/features/glitch/async/directory.js
+++ b/priv/static/packs/features/glitch/async/directory.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{822:function(e,t,a){"use strict";a.r(t);var o,n,c,i,s,r,l,d=a(0),u=a(2),b=a(7),m=a(1),j=a(3),f=a.n(j),g=a(13),h=a(6),p=a(5),O=a.n(p),v=a(734),_=a(732),M=a(249),w=a(200),y=a(4),k=a(18),C=a(14),I=a.n(C),N=a(103),L=a(91),E=a(93),R=a(210),P=a(98),q=a(39),A=a(16),F=a(417),S=a(22),T=a(42),U=a(119),B=Object(h.f)({follow:{id:"account.follow",defaultMessage:"Follow"},unfollow:{id:"account.unfollow",defaultMessage:"Unfollow"},requested:{id:"account.requested",defaultMessage:"Awaiting approval"},unblock:{id:"account.unblock",defaultMessage:"Unblock @{name}"},unmute:{id:"account.unmute",defaultMessage:"Unmute @{name}"}}),D=(o=Object(g.connect)((function(){var e=Object(N.d)();return function(t,a){var o=a.id;return{account:e(t,o)}}}),(function(e,t){var a=t.intl;return{onFollow:function(t){t.getIn(["relationship","following"])||t.getIn(["relationship","requested"])?A.s?e(Object(T.d)("CONFIRM",{message:Object(d.a)(h.b,{id:"confirmations.unfollow.message",defaultMessage:"Are you sure you want to unfollow {name}?",values:{name:Object(d.a)("strong",{},void 0,"@",t.get("acct"))}}),confirm:a.formatMessage(B.unfollowConfirm),onConfirm:function(){return e(Object(S.S)(t.get("id")))}})):e(Object(S.S)(t.get("id"))):e(Object(S.M)(t.get("id")))},onBlock:function(t){t.getIn(["relationship","blocking"])?e(Object(S.R)(t.get("id"))):e(Object(S.z)(t.get("id")))},onMute:function(t){t.getIn(["relationship","muting"])?e(Object(S.T)(t.get("id"))):e(Object(U.g)(t))}}})),Object(h.g)(n=o((i=c=function(e){function t(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(m.a)(Object(u.a)(t),"handleEmojiMouseEnter",(function(e){var t=e.target;t.src=t.getAttribute("data-original")})),Object(m.a)(Object(u.a)(t),"handleEmojiMouseLeave",(function(e){var t=e.target;t.src=t.getAttribute("data-static")})),Object(m.a)(Object(u.a)(t),"handleFollow",(function(){t.props.onFollow(t.props.account)})),Object(m.a)(Object(u.a)(t),"handleBlock",(function(){t.props.onBlock(t.props.account)})),Object(m.a)(Object(u.a)(t),"handleMute",(function(){t.props.onMute(t.props.account)})),Object(m.a)(Object(u.a)(t),"setRef",(function(e){t.node=e})),t}Object(b.a)(t,e);var a=t.prototype;return a._updateEmojis=function(){var e=this.node;if(e&&!A.a)for(var t=e.querySelectorAll(".custom-emoji"),a=0;a<t.length;a++){var o=t[a];o.classList.contains("status-emoji")||(o.classList.add("status-emoji"),o.addEventListener("mouseenter",this.handleEmojiMouseEnter,!1),o.addEventListener("mouseleave",this.handleEmojiMouseLeave,!1))}},a.componentDidMount=function(){this._updateEmojis()},a.componentDidUpdate=function(){this._updateEmojis()},a.render=function(){var e,t=this.props,a=t.account,o=t.intl;if(a.get("id")!==A.m&&null!==a.get("relationship",null)){var n=a.getIn(["relationship","following"]),c=a.getIn(["relationship","requested"]),i=a.getIn(["relationship","blocking"]),s=a.getIn(["relationship","muting"]);c?e=Object(d.a)(q.a,{disabled:!0,icon:"hourglass",title:o.formatMessage(B.requested)}):i?e=Object(d.a)(q.a,{active:!0,icon:"unlock",title:o.formatMessage(B.unblock,{name:a.get("username")}),onClick:this.handleBlock}):s?e=Object(d.a)(q.a,{active:!0,icon:"volume-up",title:o.formatMessage(B.unmute,{name:a.get("username")}),onClick:this.handleMute}):a.get("moved")&&!n||(e=Object(d.a)(q.a,{icon:n?"user-times":"user-plus",title:o.formatMessage(n?B.unfollow:B.follow),onClick:this.handleFollow,active:n}))}return Object(d.a)("div",{className:"directory__card"},void 0,Object(d.a)("div",{className:"directory__card__img"},void 0,Object(d.a)("img",{src:A.a?a.get("header"):a.get("header_static"),alt:""})),Object(d.a)("div",{className:"directory__card__bar"},void 0,Object(d.a)(R.a,{className:"directory__card__bar__name",href:a.get("url"),to:"/accounts/"+a.get("id")},void 0,Object(d.a)(L.a,{account:a,size:48}),Object(d.a)(E.a,{account:a})),Object(d.a)("div",{className:"directory__card__bar__relationship account__relationship"},void 0,e)),f.a.createElement("div",{className:"directory__card__extra",ref:this.setRef},Object(d.a)("div",{className:"account__header__content",dangerouslySetInnerHTML:{__html:a.get("note_emojified")}})),Object(d.a)("div",{className:"directory__card__extra"},void 0,Object(d.a)("div",{className:"accounts-table__count"},void 0,Object(F.a)(a.get("statuses_count"))," ",Object(d.a)("small",{},void 0,Object(d.a)(h.b,{id:"account.posts",defaultMessage:"Toots"}))),Object(d.a)("div",{className:"accounts-table__count"},void 0,a.get("followers_count")<0?"-":Object(F.a)(a.get("followers_count"))," ",Object(d.a)("small",{},void 0,Object(d.a)(h.b,{id:"account.followers",defaultMessage:"Followers"}))),Object(d.a)("div",{className:"accounts-table__count"},void 0,null===a.get("last_status_at")?Object(d.a)(h.b,{id:"account.never_active",defaultMessage:"Never"}):Object(d.a)(P.default,{timestamp:a.get("last_status_at")})," ",Object(d.a)("small",{},void 0,Object(d.a)(h.b,{id:"account.last_status",defaultMessage:"Last active"})))))},t}(k.a),Object(m.a)(c,"propTypes",{account:I.a.map.isRequired,intl:O.a.object.isRequired,onFollow:O.a.func.isRequired,onBlock:O.a.func.isRequired,onMute:O.a.func.isRequired}),n=i))||n)||n),x=a(12),H=a.n(x),z=function(e){function t(){return e.apply(this,arguments)||this}return Object(b.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.name,a=e.value,o=e.checked,n=e.onChange,c=e.label;return Object(d.a)("label",{className:"radio-button"},void 0,Object(d.a)("input",{name:t,type:"radio",value:a,checked:o,onChange:n}),Object(d.a)("span",{className:H()("radio-button__input",{checked:o})}),Object(d.a)("span",{},void 0,c))},t}(f.a.PureComponent),J=a(1051),K=a(467);a.d(t,"default",(function(){return G}));var Y=Object(h.f)({title:{id:"column.directory",defaultMessage:"Browse profiles"},recentlyActive:{id:"directory.recently_active",defaultMessage:"Recently active"},newArrivals:{id:"directory.new_arrivals",defaultMessage:"New arrivals"},local:{id:"directory.local",defaultMessage:"From {domain} only"},federated:{id:"directory.federated",defaultMessage:"From known fediverse"}}),G=Object(g.connect)((function(e){return{accountIds:e.getIn(["user_lists","directory","items"],Object(y.List)()),isLoading:e.getIn(["user_lists","directory","isLoading"],!0),domain:e.getIn(["meta","domain"])}}))(s=Object(h.g)((l=r=function(e){function t(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(m.a)(Object(u.a)(t),"state",{order:null,local:null}),Object(m.a)(Object(u.a)(t),"handlePin",(function(){var e=t.props,a=e.columnId,o=e.dispatch;o(a?Object(M.h)(a):Object(M.e)("DIRECTORY",t.getParams(t.props,t.state)))})),Object(m.a)(Object(u.a)(t),"getParams",(function(e,t){return{order:null===t.order?e.params.order||"active":t.order,local:null===t.local?e.params.local||!1:t.local}})),Object(m.a)(Object(u.a)(t),"handleMove",(function(e){var a=t.props,o=a.columnId;(0,a.dispatch)(Object(M.g)(o,e))})),Object(m.a)(Object(u.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(m.a)(Object(u.a)(t),"setRef",(function(e){t.column=e})),Object(m.a)(Object(u.a)(t),"handleChangeOrder",(function(e){var a=t.props,o=a.dispatch,n=a.columnId;n?o(Object(M.f)(n,["order"],e.target.value)):t.setState({order:e.target.value})})),Object(m.a)(Object(u.a)(t),"handleChangeLocal",(function(e){var a=t.props,o=a.dispatch,n=a.columnId;n?o(Object(M.f)(n,["local"],"1"===e.target.value)):t.setState({local:"1"===e.target.value})})),Object(m.a)(Object(u.a)(t),"handleLoadMore",(function(){(0,t.props.dispatch)(Object(w.g)(t.getParams(t.props,t.state)))})),t}Object(b.a)(t,e);var a=t.prototype;return a.componentDidMount=function(){(0,this.props.dispatch)(Object(w.h)(this.getParams(this.props,this.state)))},a.componentDidUpdate=function(e,t){var a=this.props.dispatch,o=this.getParams(e,t),n=this.getParams(this.props,this.state);o.order===n.order&&o.local===n.local||a(Object(w.h)(n))},a.render=function(){var e=this.props,t=e.isLoading,a=e.accountIds,o=e.intl,n=e.columnId,c=e.multiColumn,i=e.domain,s=e.shouldUpdateScroll,r=this.getParams(this.props,this.state),l=r.order,u=r.local,b=!!n,m=Object(d.a)("div",{className:"scrollable",style:{background:"transparent"}},void 0,Object(d.a)("div",{className:"filter-form"},void 0,Object(d.a)("div",{className:"filter-form__column",role:"group"},void 0,Object(d.a)(z,{name:"order",value:"active",label:o.formatMessage(Y.recentlyActive),checked:"active"===l,onChange:this.handleChangeOrder}),Object(d.a)(z,{name:"order",value:"new",label:o.formatMessage(Y.newArrivals),checked:"new"===l,onChange:this.handleChangeOrder})),Object(d.a)("div",{className:"filter-form__column",role:"group"},void 0,Object(d.a)(z,{name:"local",value:"1",label:o.formatMessage(Y.local,{domain:i}),checked:u,onChange:this.handleChangeLocal}),Object(d.a)(z,{name:"local",value:"0",label:o.formatMessage(Y.federated),checked:!u,onChange:this.handleChangeLocal}))),Object(d.a)("div",{className:H()("directory__list",{loading:t})},void 0,a.map((function(e){return Object(d.a)(D,{id:e},e)}))),Object(d.a)(J.a,{onClick:this.handleLoadMore,visible:!t}));return f.a.createElement(v.a,{bindToDocument:!c,ref:this.setRef,label:o.formatMessage(Y.title)},Object(d.a)(_.a,{icon:"address-book-o",title:o.formatMessage(Y.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:b,multiColumn:c}),c&&!b?Object(d.a)(K.a,{scrollKey:"directory",shouldUpdateScroll:s},void 0,m):m)},t}(f.a.PureComponent),Object(m.a)(r,"contextTypes",{router:O.a.object}),s=l))||s)||s}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{849:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return G}));var o,n,c,i,r=a(0),s=a(2),l=(a(9),a(6),a(8)),d=a(1),u=a(3),b=a.n(u),m=a(15),f=a(7),j=a(5),g=a.n(j),h=a(760),p=a(758),O=a(252),v=a(204),_=a(4),M=a(21),w=a(16),y=a.n(w),k=a(108),C=a(96),I=a(98),N=a(214),L=a(102),E=a(41),R=a(18),P=a(420),q=a(24),A=a(45),F=a(123);var S=Object(f.f)({follow:{id:"account.follow",defaultMessage:"Follow"},unfollow:{id:"account.unfollow",defaultMessage:"Unfollow"},requested:{id:"account.requested",defaultMessage:"Awaiting approval"},unblock:{id:"account.unblock",defaultMessage:"Unblock @{name}"},unmute:{id:"account.unmute",defaultMessage:"Unmute @{name}"},unfollowConfirm:{id:"confirmations.unfollow.confirm",defaultMessage:"Unfollow"}}),T=(o=Object(m.connect)((function(){var e=Object(k.d)();return function(t,a){var o=a.id;return{account:e(t,o)}}}),(function(e,t){var a=t.intl;return{onFollow:function(t){t.getIn(["relationship","following"])||t.getIn(["relationship","requested"])?R.s?e(Object(A.d)("CONFIRM",{message:Object(r.a)(f.b,{id:"confirmations.unfollow.message",defaultMessage:"Are you sure you want to unfollow {name}?",values:{name:Object(r.a)("strong",{},void 0,"@",t.get("acct"))}}),confirm:a.formatMessage(S.unfollowConfirm),onConfirm:function(){return e(Object(q.S)(t.get("id")))}})):e(Object(q.S)(t.get("id"))):e(Object(q.M)(t.get("id")))},onBlock:function(t){t.getIn(["relationship","blocking"])?e(Object(q.R)(t.get("id"))):e(Object(q.z)(t.get("id")))},onMute:function(t){t.getIn(["relationship","muting"])?e(Object(q.T)(t.get("id"))):e(Object(F.g)(t))}}})),Object(f.g)(n=o((i=c=function(e){Object(l.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(d.a)(Object(s.a)(t),"handleEmojiMouseEnter",(function(e){var t=e.target;t.src=t.getAttribute("data-original")})),Object(d.a)(Object(s.a)(t),"handleEmojiMouseLeave",(function(e){var t=e.target;t.src=t.getAttribute("data-static")})),Object(d.a)(Object(s.a)(t),"handleFollow",(function(){t.props.onFollow(t.props.account)})),Object(d.a)(Object(s.a)(t),"handleBlock",(function(){t.props.onBlock(t.props.account)})),Object(d.a)(Object(s.a)(t),"handleMute",(function(){t.props.onMute(t.props.account)})),Object(d.a)(Object(s.a)(t),"setRef",(function(e){t.node=e})),t}var o=a.prototype;return o._updateEmojis=function(){var e=this.node;if(e&&!R.a)for(var t=e.querySelectorAll(".custom-emoji"),a=0;a<t.length;a++){var o=t[a];o.classList.contains("status-emoji")||(o.classList.add("status-emoji"),o.addEventListener("mouseenter",this.handleEmojiMouseEnter,!1),o.addEventListener("mouseleave",this.handleEmojiMouseLeave,!1))}},o.componentDidMount=function(){this._updateEmojis()},o.componentDidUpdate=function(){this._updateEmojis()},o.render=function(){var e,t=this.props,a=t.account,o=t.intl;if(a.get("id")!==R.m&&null!==a.get("relationship",null)){var n=a.getIn(["relationship","following"]),c=a.getIn(["relationship","requested"]),i=a.getIn(["relationship","blocking"]),s=a.getIn(["relationship","muting"]);c?e=Object(r.a)(E.a,{disabled:!0,icon:"hourglass",title:o.formatMessage(S.requested)}):i?e=Object(r.a)(E.a,{active:!0,icon:"unlock",title:o.formatMessage(S.unblock,{name:a.get("username")}),onClick:this.handleBlock}):s?e=Object(r.a)(E.a,{active:!0,icon:"volume-up",title:o.formatMessage(S.unmute,{name:a.get("username")}),onClick:this.handleMute}):a.get("moved")&&!n||(e=Object(r.a)(E.a,{icon:n?"user-times":"user-plus",title:o.formatMessage(n?S.unfollow:S.follow),onClick:this.handleFollow,active:n}))}return(Object(r.a)("div",{className:"directory__card"},void 0,Object(r.a)("div",{className:"directory__card__img"},void 0,Object(r.a)("img",{src:R.a?a.get("header"):a.get("header_static"),alt:""})),Object(r.a)("div",{className:"directory__card__bar"},void 0,Object(r.a)(N.a,{className:"directory__card__bar__name",href:a.get("url"),to:"/accounts/"+a.get("id")},void 0,Object(r.a)(C.a,{account:a,size:48}),Object(r.a)(I.a,{account:a})),Object(r.a)("div",{className:"directory__card__bar__relationship account__relationship"},void 0,e)),b.a.createElement("div",{className:"directory__card__extra",ref:this.setRef},Object(r.a)("div",{className:"account__header__content",dangerouslySetInnerHTML:{__html:a.get("note_emojified")}})),Object(r.a)("div",{className:"directory__card__extra"},void 0,Object(r.a)("div",{className:"accounts-table__count"},void 0,Object(P.a)(a.get("statuses_count"))," ",Object(r.a)("small",{},void 0,Object(r.a)(f.b,{id:"account.posts",defaultMessage:"Toots"}))),Object(r.a)("div",{className:"accounts-table__count"},void 0,a.get("followers_count")<0?"-":Object(P.a)(a.get("followers_count"))," ",Object(r.a)("small",{},void 0,Object(r.a)(f.b,{id:"account.followers",defaultMessage:"Followers"}))),Object(r.a)("div",{className:"accounts-table__count"},void 0,null===a.get("last_status_at")?Object(r.a)(f.b,{id:"account.never_active",defaultMessage:"Never"}):Object(r.a)(L.default,{timestamp:a.get("last_status_at")})," ",Object(r.a)("small",{},void 0,Object(r.a)(f.b,{id:"account.last_status",defaultMessage:"Last active"}))))))},a}(M.a),Object(d.a)(c,"propTypes",{account:y.a.map.isRequired,intl:g.a.object.isRequired,onFollow:g.a.func.isRequired,onBlock:g.a.func.isRequired,onMute:g.a.func.isRequired}),n=i))||n)||n),U=a(14),B=a.n(U);var D,x,H,z=function(e){Object(l.a)(a,e);var t;t=a;function a(){return e.apply(this,arguments)||this}return a.prototype.render=function(){var e=this.props,t=e.name,a=e.value,o=e.checked,n=e.onChange,c=e.label;return(Object(r.a)("label",{className:"radio-button"},void 0,Object(r.a)("input",{name:t,type:"radio",value:a,checked:o,onChange:n}),Object(r.a)("span",{className:B()("radio-button__input",{checked:o})}),Object(r.a)("span",{},void 0,c)))},a}(b.a.PureComponent),J=a(1078),K=a(472);var Y=Object(f.f)({title:{id:"column.directory",defaultMessage:"Browse profiles"},recentlyActive:{id:"directory.recently_active",defaultMessage:"Recently active"},newArrivals:{id:"directory.new_arrivals",defaultMessage:"New arrivals"},local:{id:"directory.local",defaultMessage:"From {domain} only"},federated:{id:"directory.federated",defaultMessage:"From known fediverse"}}),G=Object(m.connect)((function(e){return{accountIds:e.getIn(["user_lists","directory","items"],Object(_.List)()),isLoading:e.getIn(["user_lists","directory","isLoading"],!0),domain:e.getIn(["meta","domain"])}}))(D=Object(f.g)((H=x=function(e){Object(l.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,o=new Array(a),n=0;n<a;n++)o[n]=arguments[n];return t=e.call.apply(e,[this].concat(o))||this,Object(d.a)(Object(s.a)(t),"state",{order:null,local:null}),Object(d.a)(Object(s.a)(t),"handlePin",(function(){var e=t.props,a=e.columnId,o=e.dispatch;o(a?Object(O.h)(a):Object(O.e)("DIRECTORY",t.getParams(t.props,t.state)))})),Object(d.a)(Object(s.a)(t),"getParams",(function(e,t){return{order:null===t.order?e.params.order||"active":t.order,local:null===t.local?e.params.local||!1:t.local}})),Object(d.a)(Object(s.a)(t),"handleMove",(function(e){var a=t.props,o=a.columnId;(0,a.dispatch)(Object(O.g)(o,e))})),Object(d.a)(Object(s.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(d.a)(Object(s.a)(t),"setRef",(function(e){t.column=e})),Object(d.a)(Object(s.a)(t),"handleChangeOrder",(function(e){var a=t.props,o=a.dispatch,n=a.columnId;n?o(Object(O.f)(n,["order"],e.target.value)):t.setState({order:e.target.value})})),Object(d.a)(Object(s.a)(t),"handleChangeLocal",(function(e){var a=t.props,o=a.dispatch,n=a.columnId;n?o(Object(O.f)(n,["local"],"1"===e.target.value)):t.setState({local:"1"===e.target.value})})),Object(d.a)(Object(s.a)(t),"handleLoadMore",(function(){(0,t.props.dispatch)(Object(v.g)(t.getParams(t.props,t.state)))})),t}var o=a.prototype;return o.componentDidMount=function(){(0,this.props.dispatch)(Object(v.h)(this.getParams(this.props,this.state)))},o.componentDidUpdate=function(e,t){var a=this.props.dispatch,o=this.getParams(e,t),n=this.getParams(this.props,this.state);o.order===n.order&&o.local===n.local||a(Object(v.h)(n))},o.render=function(){var e=this.props,t=e.isLoading,a=e.accountIds,o=e.intl,n=e.columnId,c=e.multiColumn,i=e.domain,s=e.shouldUpdateScroll,l=this.getParams(this.props,this.state),d=l.order,u=l.local,m=!!n,f=Object(r.a)("div",{className:"scrollable",style:{background:"transparent"}},void 0,Object(r.a)("div",{className:"filter-form"},void 0,Object(r.a)("div",{className:"filter-form__column",role:"group"},void 0,Object(r.a)(z,{name:"order",value:"active",label:o.formatMessage(Y.recentlyActive),checked:"active"===d,onChange:this.handleChangeOrder}),Object(r.a)(z,{name:"order",value:"new",label:o.formatMessage(Y.newArrivals),checked:"new"===d,onChange:this.handleChangeOrder})),Object(r.a)("div",{className:"filter-form__column",role:"group"},void 0,Object(r.a)(z,{name:"local",value:"1",label:o.formatMessage(Y.local,{domain:i}),checked:u,onChange:this.handleChangeLocal}),Object(r.a)(z,{name:"local",value:"0",label:o.formatMessage(Y.federated),checked:!u,onChange:this.handleChangeLocal}))),Object(r.a)("div",{className:B()("directory__list",{loading:t})},void 0,a.map((function(e){return Object(r.a)(T,{id:e},e)}))),Object(r.a)(J.a,{onClick:this.handleLoadMore,visible:!t}));return b.a.createElement(h.a,{bindToDocument:!c,ref:this.setRef,label:o.formatMessage(Y.title)},Object(r.a)(p.a,{icon:"address-book-o",title:o.formatMessage(Y.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:m,multiColumn:c}),c&&!m?Object(r.a)(K.a,{scrollKey:"directory",shouldUpdateScroll:s},void 0,f):f)},a}(b.a.PureComponent),Object(d.a)(x,"contextTypes",{router:g.a.object}),D=H))||D)||D}}]);
//# sourceMappingURL=directory.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/glitch/async/directory.js.map b/priv/static/packs/features/glitch/async/directory.js.map
index 218c65282..e8c157894 100644
--- a/priv/static/packs/features/glitch/async/directory.js.map
+++ b/priv/static/packs/features/glitch/async/directory.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/directory/components/account_card.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/components/radio_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/directory/index.js"],"names":["messages","defineMessages","follow","unfollow","requested","unblock","unmute","AccountCard","connect","getAccount","makeGetAccount","state","id","account","dispatch","intl","onFollow","getIn","unfollowModal","openModal","message","defaultMessage","values","name","get","confirm","formatMessage","unfollowConfirm","onConfirm","unfollowAccount","followAccount","onBlock","unblockAccount","blockAccount","onMute","unmuteAccount","initMuteModal","injectIntl","target","src","getAttribute","props","c","node","_updateEmojis","this","autoPlayGif","emojis","querySelectorAll","i","length","emoji","classList","contains","add","addEventListener","handleEmojiMouseEnter","handleEmojiMouseLeave","componentDidMount","componentDidUpdate","render","buttons","me","following","blocking","muting","disabled","icon","title","active","onClick","handleBlock","handleMute","handleFollow","className","alt","href","to","size","ref","setRef","dangerouslySetInnerHTML","__html","shortNumberFormat","timestamp","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","RadioButton","value","checked","onChange","label","type","classNames","React","PureComponent","recentlyActive","newArrivals","local","federated","Directory","accountIds","ImmutableList","isLoading","domain","order","columnId","removeColumn","addColumn","getParams","params","dir","moveColumn","column","scrollTop","e","changeColumnParams","setState","expandDirectory","fetchDirectory","prevProps","prevState","paramsOld","paramsNew","multiColumn","shouldUpdateScroll","pinned","scrollableArea","style","background","role","handleChangeOrder","handleChangeLocal","loading","accountId","handleLoadMore","visible","bindToDocument","onPin","handlePin","onMove","handleMove","handleHeaderClick","scrollKey","router"],"mappings":"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","file":"features/glitch/async/directory.js","sourcesContent":["import React from 'react';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from 'flavours/glitch/selectors';\nimport Avatar from 'flavours/glitch/components/avatar';\nimport DisplayName from 'flavours/glitch/components/display_name';\nimport Permalink from 'flavours/glitch/components/permalink';\nimport RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';\nimport IconButton from 'flavours/glitch/components/icon_button';\nimport { FormattedMessage, injectIntl, defineMessages } from 'react-intl';\nimport { autoPlayGif, me, unfollowModal } from 'flavours/glitch/util/initial_state';\nimport { shortNumberFormat } from 'flavours/glitch/util/numbers';\nimport { followAccount, unfollowAccount, blockAccount, unblockAccount, unmuteAccount } from 'flavours/glitch/actions/accounts';\nimport { openModal } from 'flavours/glitch/actions/modal';\nimport { initMuteModal } from 'flavours/glitch/actions/mutes';\n\nconst messages = defineMessages({\n follow: { id: 'account.follow', defaultMessage: 'Follow' },\n unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },\n requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },\n unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },\n unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },\n});\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { id }) => ({\n account: getAccount(state, id),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n onFollow (account) {\n if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {\n if (unfollowModal) {\n dispatch(openModal('CONFIRM', {\n message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,\n confirm: intl.formatMessage(messages.unfollowConfirm),\n onConfirm: () => dispatch(unfollowAccount(account.get('id'))),\n }));\n } else {\n dispatch(unfollowAccount(account.get('id')));\n }\n } else {\n dispatch(followAccount(account.get('id')));\n }\n },\n\n onBlock (account) {\n if (account.getIn(['relationship', 'blocking'])) {\n dispatch(unblockAccount(account.get('id')));\n } else {\n dispatch(blockAccount(account.get('id')));\n }\n },\n\n onMute (account) {\n if (account.getIn(['relationship', 'muting'])) {\n dispatch(unmuteAccount(account.get('id')));\n } else {\n dispatch(initMuteModal(account));\n }\n },\n\n});\n\nexport default @injectIntl\n@connect(makeMapStateToProps, mapDispatchToProps)\nclass AccountCard extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onFollow: PropTypes.func.isRequired,\n onBlock: PropTypes.func.isRequired,\n onMute: PropTypes.func.isRequired,\n };\n\n _updateEmojis () {\n const node = this.node;\n\n if (!node || autoPlayGif) {\n return;\n }\n\n const emojis = node.querySelectorAll('.custom-emoji');\n\n for (var i = 0; i < emojis.length; i++) {\n let emoji = emojis[i];\n if (emoji.classList.contains('status-emoji')) {\n continue;\n }\n emoji.classList.add('status-emoji');\n\n emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);\n emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);\n }\n }\n\n componentDidMount () {\n this._updateEmojis();\n }\n\n componentDidUpdate () {\n this._updateEmojis();\n }\n\n handleEmojiMouseEnter = ({ target }) => {\n target.src = target.getAttribute('data-original');\n }\n\n handleEmojiMouseLeave = ({ target }) => {\n target.src = target.getAttribute('data-static');\n }\n\n handleFollow = () => {\n this.props.onFollow(this.props.account);\n }\n\n handleBlock = () => {\n this.props.onBlock(this.props.account);\n }\n\n handleMute = () => {\n this.props.onMute(this.props.account);\n }\n\n setRef = (c) => {\n this.node = c;\n }\n\n render () {\n const { account, intl } = this.props;\n\n let buttons;\n\n if (account.get('id') !== me && account.get('relationship', null) !== null) {\n const following = account.getIn(['relationship', 'following']);\n const requested = account.getIn(['relationship', 'requested']);\n const blocking = account.getIn(['relationship', 'blocking']);\n const muting = account.getIn(['relationship', 'muting']);\n\n if (requested) {\n buttons = <IconButton disabled icon='hourglass' title={intl.formatMessage(messages.requested)} />;\n } else if (blocking) {\n buttons = <IconButton active icon='unlock' title={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.handleBlock} />;\n } else if (muting) {\n buttons = <IconButton active icon='volume-up' title={intl.formatMessage(messages.unmute, { name: account.get('username') })} onClick={this.handleMute} />;\n } else if (!account.get('moved') || following) {\n buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />;\n }\n }\n\n return (\n <div className='directory__card'>\n <div className='directory__card__img'>\n <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' />\n </div>\n\n <div className='directory__card__bar'>\n <Permalink className='directory__card__bar__name' href={account.get('url')} to={`/accounts/${account.get('id')}`}>\n <Avatar account={account} size={48} />\n <DisplayName account={account} />\n </Permalink>\n\n <div className='directory__card__bar__relationship account__relationship'>\n {buttons}\n </div>\n </div>\n\n <div className='directory__card__extra' ref={this.setRef}>\n <div className='account__header__content' dangerouslySetInnerHTML={{ __html: account.get('note_emojified') }} />\n </div>\n\n <div className='directory__card__extra'>\n <div className='accounts-table__count'>{shortNumberFormat(account.get('statuses_count'))} <small><FormattedMessage id='account.posts' defaultMessage='Toots' /></small></div>\n <div className='accounts-table__count'>{account.get('followers_count') < 0 ? '-' : shortNumberFormat(account.get('followers_count'))} <small><FormattedMessage id='account.followers' defaultMessage='Followers' /></small></div>\n <div className='accounts-table__count'>{account.get('last_status_at') === null ? <FormattedMessage id='account.never_active' defaultMessage='Never' /> : <RelativeTimestamp timestamp={account.get('last_status_at')} />} <small><FormattedMessage id='account.last_status' defaultMessage='Last active' /></small></div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nexport default class RadioButton extends React.PureComponent {\n\n static propTypes = {\n value: PropTypes.string.isRequired,\n checked: PropTypes.bool,\n name: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n label: PropTypes.node.isRequired,\n };\n\n render () {\n const { name, value, checked, onChange, label } = this.props;\n\n return (\n <label className='radio-button'>\n <input\n name={name}\n type='radio'\n value={value}\n checked={checked}\n onChange={onChange}\n />\n\n <span className={classNames('radio-button__input', { checked })} />\n\n <span>{label}</span>\n </label>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from 'flavours/glitch/components/column';\nimport ColumnHeader from 'flavours/glitch/components/column_header';\nimport { addColumn, removeColumn, moveColumn, changeColumnParams } from 'flavours/glitch/actions/columns';\nimport { fetchDirectory, expandDirectory } from 'flavours/glitch/actions/directory';\nimport { List as ImmutableList } from 'immutable';\nimport AccountCard from './components/account_card';\nimport RadioButton from 'flavours/glitch/components/radio_button';\nimport classNames from 'classnames';\nimport LoadMore from 'flavours/glitch/components/load_more';\nimport { ScrollContainer } from 'react-router-scroll-4';\n\nconst messages = defineMessages({\n title: { id: 'column.directory', defaultMessage: 'Browse profiles' },\n recentlyActive: { id: 'directory.recently_active', defaultMessage: 'Recently active' },\n newArrivals: { id: 'directory.new_arrivals', defaultMessage: 'New arrivals' },\n local: { id: 'directory.local', defaultMessage: 'From {domain} only' },\n federated: { id: 'directory.federated', defaultMessage: 'From known fediverse' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'directory', 'items'], ImmutableList()),\n isLoading: state.getIn(['user_lists', 'directory', 'isLoading'], true),\n domain: state.getIn(['meta', 'domain']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Directory extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n isLoading: PropTypes.bool,\n accountIds: ImmutablePropTypes.list.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n params: PropTypes.shape({\n order: PropTypes.string,\n local: PropTypes.bool,\n }),\n };\n\n state = {\n order: null,\n local: null,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('DIRECTORY', this.getParams(this.props, this.state)));\n }\n }\n\n getParams = (props, state) => ({\n order: state.order === null ? (props.params.order || 'active') : state.order,\n local: state.local === null ? (props.params.local || false) : state.local,\n });\n\n handleMove = dir => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n dispatch(fetchDirectory(this.getParams(this.props, this.state)));\n }\n\n componentDidUpdate (prevProps, prevState) {\n const { dispatch } = this.props;\n const paramsOld = this.getParams(prevProps, prevState);\n const paramsNew = this.getParams(this.props, this.state);\n\n if (paramsOld.order !== paramsNew.order || paramsOld.local !== paramsNew.local) {\n dispatch(fetchDirectory(paramsNew));\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleChangeOrder = e => {\n const { dispatch, columnId } = this.props;\n\n if (columnId) {\n dispatch(changeColumnParams(columnId, ['order'], e.target.value));\n } else {\n this.setState({ order: e.target.value });\n }\n }\n\n handleChangeLocal = e => {\n const { dispatch, columnId } = this.props;\n\n if (columnId) {\n dispatch(changeColumnParams(columnId, ['local'], e.target.value === '1'));\n } else {\n this.setState({ local: e.target.value === '1' });\n }\n }\n\n handleLoadMore = () => {\n const { dispatch } = this.props;\n dispatch(expandDirectory(this.getParams(this.props, this.state)));\n }\n\n render () {\n const { isLoading, accountIds, intl, columnId, multiColumn, domain, shouldUpdateScroll } = this.props;\n const { order, local } = this.getParams(this.props, this.state);\n const pinned = !!columnId;\n\n const scrollableArea = (\n <div className='scrollable' style={{ background: 'transparent' }}>\n <div className='filter-form'>\n <div className='filter-form__column' role='group'>\n <RadioButton name='order' value='active' label={intl.formatMessage(messages.recentlyActive)} checked={order === 'active'} onChange={this.handleChangeOrder} />\n <RadioButton name='order' value='new' label={intl.formatMessage(messages.newArrivals)} checked={order === 'new'} onChange={this.handleChangeOrder} />\n </div>\n\n <div className='filter-form__column' role='group'>\n <RadioButton name='local' value='1' label={intl.formatMessage(messages.local, { domain })} checked={local} onChange={this.handleChangeLocal} />\n <RadioButton name='local' value='0' label={intl.formatMessage(messages.federated)} checked={!local} onChange={this.handleChangeLocal} />\n </div>\n </div>\n\n <div className={classNames('directory__list', { loading: isLoading })}>\n {accountIds.map(accountId => <AccountCard id={accountId} key={accountId} />)}\n </div>\n\n <LoadMore onClick={this.handleLoadMore} visible={!isLoading} />\n </div>\n );\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='address-book-o'\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n />\n\n {multiColumn && !pinned ? <ScrollContainer scrollKey='directory' shouldUpdateScroll={shouldUpdateScroll}>{scrollableArea}</ScrollContainer> : scrollableArea}\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/directory/components/account_card.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/components/radio_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/directory/index.js"],"names":["messages","defineMessages","follow","unfollow","requested","unblock","unmute","unfollowConfirm","AccountCard","connect","getAccount","makeGetAccount","state","id","account","dispatch","intl","onFollow","getIn","unfollowModal","openModal","message","defaultMessage","values","name","get","confirm","formatMessage","onConfirm","unfollowAccount","followAccount","onBlock","unblockAccount","blockAccount","onMute","unmuteAccount","initMuteModal","injectIntl","target","src","getAttribute","props","c","node","_updateEmojis","this","autoPlayGif","emojis","querySelectorAll","i","length","emoji","classList","contains","add","addEventListener","handleEmojiMouseEnter","handleEmojiMouseLeave","componentDidMount","componentDidUpdate","render","buttons","me","following","blocking","muting","disabled","icon","title","active","onClick","handleBlock","handleMute","handleFollow","className","alt","href","to","size","ref","setRef","dangerouslySetInnerHTML","__html","shortNumberFormat","timestamp","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","RadioButton","value","checked","onChange","label","type","classNames","React","PureComponent","recentlyActive","newArrivals","local","federated","Directory","accountIds","ImmutableList","isLoading","domain","order","columnId","removeColumn","addColumn","getParams","params","dir","moveColumn","column","scrollTop","e","changeColumnParams","setState","expandDirectory","fetchDirectory","prevProps","prevState","paramsOld","paramsNew","multiColumn","shouldUpdateScroll","pinned","scrollableArea","style","background","role","handleChangeOrder","handleChangeLocal","loading","accountId","handleLoadMore","visible","bindToDocument","onPin","handlePin","onMove","handleMove","handleHeaderClick","scrollKey","router"],"mappings":"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","file":"features/glitch/async/directory.js","sourcesContent":["import React from 'react';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from 'flavours/glitch/selectors';\nimport Avatar from 'flavours/glitch/components/avatar';\nimport DisplayName from 'flavours/glitch/components/display_name';\nimport Permalink from 'flavours/glitch/components/permalink';\nimport RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';\nimport IconButton from 'flavours/glitch/components/icon_button';\nimport { FormattedMessage, injectIntl, defineMessages } from 'react-intl';\nimport { autoPlayGif, me, unfollowModal } from 'flavours/glitch/util/initial_state';\nimport { shortNumberFormat } from 'flavours/glitch/util/numbers';\nimport { followAccount, unfollowAccount, blockAccount, unblockAccount, unmuteAccount } from 'flavours/glitch/actions/accounts';\nimport { openModal } from 'flavours/glitch/actions/modal';\nimport { initMuteModal } from 'flavours/glitch/actions/mutes';\n\nconst messages = defineMessages({\n follow: { id: 'account.follow', defaultMessage: 'Follow' },\n unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },\n requested: { id: 'account.requested', defaultMessage: 'Awaiting approval' },\n unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },\n unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },\n unfollowConfirm: { id: 'confirmations.unfollow.confirm', defaultMessage: 'Unfollow' },\n});\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { id }) => ({\n account: getAccount(state, id),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n onFollow (account) {\n if (account.getIn(['relationship', 'following']) || account.getIn(['relationship', 'requested'])) {\n if (unfollowModal) {\n dispatch(openModal('CONFIRM', {\n message: <FormattedMessage id='confirmations.unfollow.message' defaultMessage='Are you sure you want to unfollow {name}?' values={{ name: <strong>@{account.get('acct')}</strong> }} />,\n confirm: intl.formatMessage(messages.unfollowConfirm),\n onConfirm: () => dispatch(unfollowAccount(account.get('id'))),\n }));\n } else {\n dispatch(unfollowAccount(account.get('id')));\n }\n } else {\n dispatch(followAccount(account.get('id')));\n }\n },\n\n onBlock (account) {\n if (account.getIn(['relationship', 'blocking'])) {\n dispatch(unblockAccount(account.get('id')));\n } else {\n dispatch(blockAccount(account.get('id')));\n }\n },\n\n onMute (account) {\n if (account.getIn(['relationship', 'muting'])) {\n dispatch(unmuteAccount(account.get('id')));\n } else {\n dispatch(initMuteModal(account));\n }\n },\n\n});\n\nexport default @injectIntl\n@connect(makeMapStateToProps, mapDispatchToProps)\nclass AccountCard extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onFollow: PropTypes.func.isRequired,\n onBlock: PropTypes.func.isRequired,\n onMute: PropTypes.func.isRequired,\n };\n\n _updateEmojis () {\n const node = this.node;\n\n if (!node || autoPlayGif) {\n return;\n }\n\n const emojis = node.querySelectorAll('.custom-emoji');\n\n for (var i = 0; i < emojis.length; i++) {\n let emoji = emojis[i];\n if (emoji.classList.contains('status-emoji')) {\n continue;\n }\n emoji.classList.add('status-emoji');\n\n emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);\n emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);\n }\n }\n\n componentDidMount () {\n this._updateEmojis();\n }\n\n componentDidUpdate () {\n this._updateEmojis();\n }\n\n handleEmojiMouseEnter = ({ target }) => {\n target.src = target.getAttribute('data-original');\n }\n\n handleEmojiMouseLeave = ({ target }) => {\n target.src = target.getAttribute('data-static');\n }\n\n handleFollow = () => {\n this.props.onFollow(this.props.account);\n }\n\n handleBlock = () => {\n this.props.onBlock(this.props.account);\n }\n\n handleMute = () => {\n this.props.onMute(this.props.account);\n }\n\n setRef = (c) => {\n this.node = c;\n }\n\n render () {\n const { account, intl } = this.props;\n\n let buttons;\n\n if (account.get('id') !== me && account.get('relationship', null) !== null) {\n const following = account.getIn(['relationship', 'following']);\n const requested = account.getIn(['relationship', 'requested']);\n const blocking = account.getIn(['relationship', 'blocking']);\n const muting = account.getIn(['relationship', 'muting']);\n\n if (requested) {\n buttons = <IconButton disabled icon='hourglass' title={intl.formatMessage(messages.requested)} />;\n } else if (blocking) {\n buttons = <IconButton active icon='unlock' title={intl.formatMessage(messages.unblock, { name: account.get('username') })} onClick={this.handleBlock} />;\n } else if (muting) {\n buttons = <IconButton active icon='volume-up' title={intl.formatMessage(messages.unmute, { name: account.get('username') })} onClick={this.handleMute} />;\n } else if (!account.get('moved') || following) {\n buttons = <IconButton icon={following ? 'user-times' : 'user-plus'} title={intl.formatMessage(following ? messages.unfollow : messages.follow)} onClick={this.handleFollow} active={following} />;\n }\n }\n\n return (\n <div className='directory__card'>\n <div className='directory__card__img'>\n <img src={autoPlayGif ? account.get('header') : account.get('header_static')} alt='' />\n </div>\n\n <div className='directory__card__bar'>\n <Permalink className='directory__card__bar__name' href={account.get('url')} to={`/accounts/${account.get('id')}`}>\n <Avatar account={account} size={48} />\n <DisplayName account={account} />\n </Permalink>\n\n <div className='directory__card__bar__relationship account__relationship'>\n {buttons}\n </div>\n </div>\n\n <div className='directory__card__extra' ref={this.setRef}>\n <div className='account__header__content' dangerouslySetInnerHTML={{ __html: account.get('note_emojified') }} />\n </div>\n\n <div className='directory__card__extra'>\n <div className='accounts-table__count'>{shortNumberFormat(account.get('statuses_count'))} <small><FormattedMessage id='account.posts' defaultMessage='Toots' /></small></div>\n <div className='accounts-table__count'>{account.get('followers_count') < 0 ? '-' : shortNumberFormat(account.get('followers_count'))} <small><FormattedMessage id='account.followers' defaultMessage='Followers' /></small></div>\n <div className='accounts-table__count'>{account.get('last_status_at') === null ? <FormattedMessage id='account.never_active' defaultMessage='Never' /> : <RelativeTimestamp timestamp={account.get('last_status_at')} />} <small><FormattedMessage id='account.last_status' defaultMessage='Last active' /></small></div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\n\nexport default class RadioButton extends React.PureComponent {\n\n static propTypes = {\n value: PropTypes.string.isRequired,\n checked: PropTypes.bool,\n name: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n label: PropTypes.node.isRequired,\n };\n\n render () {\n const { name, value, checked, onChange, label } = this.props;\n\n return (\n <label className='radio-button'>\n <input\n name={name}\n type='radio'\n value={value}\n checked={checked}\n onChange={onChange}\n />\n\n <span className={classNames('radio-button__input', { checked })} />\n\n <span>{label}</span>\n </label>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from 'flavours/glitch/components/column';\nimport ColumnHeader from 'flavours/glitch/components/column_header';\nimport { addColumn, removeColumn, moveColumn, changeColumnParams } from 'flavours/glitch/actions/columns';\nimport { fetchDirectory, expandDirectory } from 'flavours/glitch/actions/directory';\nimport { List as ImmutableList } from 'immutable';\nimport AccountCard from './components/account_card';\nimport RadioButton from 'flavours/glitch/components/radio_button';\nimport classNames from 'classnames';\nimport LoadMore from 'flavours/glitch/components/load_more';\nimport { ScrollContainer } from 'react-router-scroll-4';\n\nconst messages = defineMessages({\n title: { id: 'column.directory', defaultMessage: 'Browse profiles' },\n recentlyActive: { id: 'directory.recently_active', defaultMessage: 'Recently active' },\n newArrivals: { id: 'directory.new_arrivals', defaultMessage: 'New arrivals' },\n local: { id: 'directory.local', defaultMessage: 'From {domain} only' },\n federated: { id: 'directory.federated', defaultMessage: 'From known fediverse' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'directory', 'items'], ImmutableList()),\n isLoading: state.getIn(['user_lists', 'directory', 'isLoading'], true),\n domain: state.getIn(['meta', 'domain']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Directory extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n isLoading: PropTypes.bool,\n accountIds: ImmutablePropTypes.list.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n params: PropTypes.shape({\n order: PropTypes.string,\n local: PropTypes.bool,\n }),\n };\n\n state = {\n order: null,\n local: null,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('DIRECTORY', this.getParams(this.props, this.state)));\n }\n }\n\n getParams = (props, state) => ({\n order: state.order === null ? (props.params.order || 'active') : state.order,\n local: state.local === null ? (props.params.local || false) : state.local,\n });\n\n handleMove = dir => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n dispatch(fetchDirectory(this.getParams(this.props, this.state)));\n }\n\n componentDidUpdate (prevProps, prevState) {\n const { dispatch } = this.props;\n const paramsOld = this.getParams(prevProps, prevState);\n const paramsNew = this.getParams(this.props, this.state);\n\n if (paramsOld.order !== paramsNew.order || paramsOld.local !== paramsNew.local) {\n dispatch(fetchDirectory(paramsNew));\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleChangeOrder = e => {\n const { dispatch, columnId } = this.props;\n\n if (columnId) {\n dispatch(changeColumnParams(columnId, ['order'], e.target.value));\n } else {\n this.setState({ order: e.target.value });\n }\n }\n\n handleChangeLocal = e => {\n const { dispatch, columnId } = this.props;\n\n if (columnId) {\n dispatch(changeColumnParams(columnId, ['local'], e.target.value === '1'));\n } else {\n this.setState({ local: e.target.value === '1' });\n }\n }\n\n handleLoadMore = () => {\n const { dispatch } = this.props;\n dispatch(expandDirectory(this.getParams(this.props, this.state)));\n }\n\n render () {\n const { isLoading, accountIds, intl, columnId, multiColumn, domain, shouldUpdateScroll } = this.props;\n const { order, local } = this.getParams(this.props, this.state);\n const pinned = !!columnId;\n\n const scrollableArea = (\n <div className='scrollable' style={{ background: 'transparent' }}>\n <div className='filter-form'>\n <div className='filter-form__column' role='group'>\n <RadioButton name='order' value='active' label={intl.formatMessage(messages.recentlyActive)} checked={order === 'active'} onChange={this.handleChangeOrder} />\n <RadioButton name='order' value='new' label={intl.formatMessage(messages.newArrivals)} checked={order === 'new'} onChange={this.handleChangeOrder} />\n </div>\n\n <div className='filter-form__column' role='group'>\n <RadioButton name='local' value='1' label={intl.formatMessage(messages.local, { domain })} checked={local} onChange={this.handleChangeLocal} />\n <RadioButton name='local' value='0' label={intl.formatMessage(messages.federated)} checked={!local} onChange={this.handleChangeLocal} />\n </div>\n </div>\n\n <div className={classNames('directory__list', { loading: isLoading })}>\n {accountIds.map(accountId => <AccountCard id={accountId} key={accountId} />)}\n </div>\n\n <LoadMore onClick={this.handleLoadMore} visible={!isLoading} />\n </div>\n );\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='address-book-o'\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n />\n\n {multiColumn && !pinned ? <ScrollContainer scrollKey='directory' shouldUpdateScroll={shouldUpdateScroll}>{scrollableArea}</ScrollContainer> : scrollableArea}\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/glitch/async/list_adder.js b/priv/static/packs/features/glitch/async/list_adder.js
index 1dc96e38c..456fbfb9a 100644
--- a/priv/static/packs/features/glitch/async/list_adder.js
+++ b/priv/static/packs/features/glitch/async/list_adder.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{821:function(t,e,n){"use strict";n.r(e);var i,a,c,o,s,r,d,u,l,p=n(0),b=n(7),f=n(1),v=(n(3),n(5)),j=n.n(v),O=n(14),m=n.n(O),_=n(13),R=n(18),g=n(6),I=n(28),h=n(54),N=n(39),q=n(23),y=Object(g.f)({remove:{id:"lists.account.remove",defaultMessage:"Remove from list"},add:{id:"lists.account.add",defaultMessage:"Add to list"}}),w=Object(_.connect)((function(t,e){var n=e.listId,i=e.added;return{list:t.get("lists").get(n),added:void 0===i?t.getIn(["listAdder","lists","items"]).includes(n):i}}),(function(t,e){var n=e.listId;return{onRemove:function(){return t(Object(I.J)(n))},onAdd:function(){return t(Object(I.A)(n))}}}))(i=Object(g.g)((c=a=function(t){function e(){return t.apply(this,arguments)||this}return Object(b.a)(e,t),e.prototype.render=function(){var t,e=this.props,n=e.list,i=e.intl,a=e.onRemove,c=e.onAdd;return t=e.added?Object(p.a)(N.a,{icon:"times",title:i.formatMessage(y.remove),onClick:a}):Object(p.a)(N.a,{icon:"plus",title:i.formatMessage(y.add),onClick:c}),Object(p.a)("div",{className:"list"},void 0,Object(p.a)("div",{className:"list__wrapper"},void 0,Object(p.a)("div",{className:"list__display-name"},void 0,Object(p.a)(q.a,{id:"list-ul",className:"column-link__icon",fixedWidth:!0}),n.get("title")),Object(p.a)("div",{className:"account__relationship"},void 0,t)))},e}(R.a),Object(f.a)(a,"propTypes",{list:m.a.map.isRequired,intl:j.a.object.isRequired,onRemove:j.a.func.isRequired,onAdd:j.a.func.isRequired,added:j.a.bool}),Object(f.a)(a,"defaultProps",{added:!1}),i=c))||i)||i,A=n(103),k=n(91),M=n(93),z=Object(_.connect)((function(){var t=Object(A.d)();return function(e,n){var i=n.accountId;return{account:t(e,i)}}}))(o=Object(g.g)((r=s=function(t){function e(){return t.apply(this,arguments)||this}return Object(b.a)(e,t),e.prototype.render=function(){var t=this.props.account;return Object(p.a)("div",{className:"account"},void 0,Object(p.a)("div",{className:"account__wrapper"},void 0,Object(p.a)("div",{className:"account__display-name"},void 0,Object(p.a)("div",{className:"account__avatar-wrapper"},void 0,Object(p.a)(k.a,{account:t,size:36})),Object(p.a)(M.a,{account:t}))))},e}(R.a),Object(f.a)(s,"propTypes",{account:m.a.map.isRequired}),o=r))||o)||o,C=n(1118);n.d(e,"default",(function(){return T}));var J=Object(h.a)([function(t){return t.get("lists")}],(function(t){return t?t.toList().filter((function(t){return!!t})).sort((function(t,e){return t.get("title").localeCompare(e.get("title"))})):t})),T=Object(_.connect)((function(t){return{listIds:J(t).map((function(t){return t.get("id")}))}}),(function(t){return{onInitialize:function(e){return t(Object(I.N)(e))},onReset:function(){return t(Object(I.L)())}}}))(d=Object(g.g)((l=u=function(t){function e(){return t.apply(this,arguments)||this}Object(b.a)(e,t);var n=e.prototype;return n.componentDidMount=function(){var t=this.props;(0,t.onInitialize)(t.accountId)},n.componentWillUnmount=function(){(0,this.props.onReset)()},n.render=function(){var t=this.props,e=t.accountId,n=t.listIds;return Object(p.a)("div",{className:"modal-root__modal list-adder"},void 0,Object(p.a)("div",{className:"list-adder__account"},void 0,Object(p.a)(z,{accountId:e})),Object(p.a)(C.a,{}),Object(p.a)("div",{className:"list-adder__lists"},void 0,n.map((function(t){return Object(p.a)(w,{listId:t},t)}))))},e}(R.a),Object(f.a)(u,"propTypes",{accountId:j.a.string.isRequired,onClose:j.a.func.isRequired,intl:j.a.object.isRequired,onInitialize:j.a.func.isRequired,onReset:j.a.func.isRequired,listIds:m.a.list.isRequired}),d=l))||d)||d}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{848:function(t,e,n){"use strict";n.r(e),n.d(e,"default",(function(){return T}));var i,a,c,o=n(0),r=(n(9),n(6),n(8)),s=n(1),d=(n(3),n(5)),u=n.n(d),l=n(16),p=n.n(l),v=n(15),b=n(21),f=n(7),j=n(30),O=n(57),m=n(41),_=n(25);var R,g,I,h=Object(f.f)({remove:{id:"lists.account.remove",defaultMessage:"Remove from list"},add:{id:"lists.account.add",defaultMessage:"Add to list"}}),N=Object(v.connect)((function(t,e){var n=e.listId,i=e.added;return{list:t.get("lists").get(n),added:void 0===i?t.getIn(["listAdder","lists","items"]).includes(n):i}}),(function(t,e){var n=e.listId;return{onRemove:function(){return t(Object(j.J)(n))},onAdd:function(){return t(Object(j.A)(n))}}}))(i=Object(f.g)((c=a=function(t){Object(r.a)(n,t);var e;e=n;function n(){return t.apply(this,arguments)||this}return n.prototype.render=function(){var t,e=this.props,n=e.list,i=e.intl,a=e.onRemove,c=e.onAdd;return t=e.added?Object(o.a)(m.a,{icon:"times",title:i.formatMessage(h.remove),onClick:a}):Object(o.a)(m.a,{icon:"plus",title:i.formatMessage(h.add),onClick:c}),Object(o.a)("div",{className:"list"},void 0,Object(o.a)("div",{className:"list__wrapper"},void 0,Object(o.a)("div",{className:"list__display-name"},void 0,Object(o.a)(_.a,{id:"list-ul",className:"column-link__icon",fixedWidth:!0}),n.get("title")),Object(o.a)("div",{className:"account__relationship"},void 0,t)))},n}(b.a),Object(s.a)(a,"propTypes",{list:p.a.map.isRequired,intl:u.a.object.isRequired,onRemove:u.a.func.isRequired,onAdd:u.a.func.isRequired,added:u.a.bool}),Object(s.a)(a,"defaultProps",{added:!1}),i=c))||i)||i,q=n(108),y=n(96),w=n(98);var A,k,M,z=Object(v.connect)((function(){var t=Object(q.d)();return function(e,n){var i=n.accountId;return{account:t(e,i)}}}))(R=Object(f.g)((I=g=function(t){Object(r.a)(n,t);var e;e=n;function n(){return t.apply(this,arguments)||this}return n.prototype.render=function(){var t=this.props.account;return(Object(o.a)("div",{className:"account"},void 0,Object(o.a)("div",{className:"account__wrapper"},void 0,Object(o.a)("div",{className:"account__display-name"},void 0,Object(o.a)("div",{className:"account__avatar-wrapper"},void 0,Object(o.a)(y.a,{account:t,size:36})),Object(o.a)(w.a,{account:t})))))},n}(b.a),Object(s.a)(g,"propTypes",{account:p.a.map.isRequired}),R=I))||R)||R,C=n(1150);var J=Object(O.a)([function(t){return t.get("lists")}],(function(t){return t?t.toList().filter((function(t){return!!t})).sort((function(t,e){return t.get("title").localeCompare(e.get("title"))})):t})),T=Object(v.connect)((function(t){return{listIds:J(t).map((function(t){return t.get("id")}))}}),(function(t){return{onInitialize:function(e){return t(Object(j.N)(e))},onReset:function(){return t(Object(j.L)())}}}))(A=Object(f.g)((M=k=function(t){Object(r.a)(n,t);var e;e=n;function n(){return t.apply(this,arguments)||this}var i=n.prototype;return i.componentDidMount=function(){var t=this.props;(0,t.onInitialize)(t.accountId)},i.componentWillUnmount=function(){(0,this.props.onReset)()},i.render=function(){var t=this.props,e=t.accountId,n=t.listIds;return(Object(o.a)("div",{className:"modal-root__modal list-adder"},void 0,Object(o.a)("div",{className:"list-adder__account"},void 0,Object(o.a)(z,{accountId:e})),Object(o.a)(C.a,{}),Object(o.a)("div",{className:"list-adder__lists"},void 0,n.map((function(t){return Object(o.a)(N,{listId:t},t)})))))},n}(b.a),Object(s.a)(k,"propTypes",{accountId:u.a.string.isRequired,onClose:u.a.func.isRequired,intl:u.a.object.isRequired,onInitialize:u.a.func.isRequired,onReset:u.a.func.isRequired,listIds:p.a.list.isRequired}),A=M))||A)||A}}]);
//# sourceMappingURL=list_adder.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/glitch/async/list_adder.js.map b/priv/static/packs/features/glitch/async/list_adder.js.map
index 956b752d1..cff691afb 100644
--- a/priv/static/packs/features/glitch/async/list_adder.js.map
+++ b/priv/static/packs/features/glitch/async/list_adder.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/list_adder/components/list.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/list_adder/components/account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/list_adder/index.js"],"names":["messages","defineMessages","remove","add","List","connect","state","listId","added","list","get","getIn","includes","dispatch","onRemove","removeFromListAdder","onAdd","addToListAdder","injectIntl","render","button","this","props","intl","icon","title","formatMessage","onClick","className","id","fixedWidth","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","bool","Account","getAccount","makeGetAccount","accountId","account","size","getOrderedLists","createSelector","lists","toList","filter","item","sort","a","b","localeCompare","ListAdder","listIds","onInitialize","setupListAdder","onReset","resetListAdder","componentDidMount","componentWillUnmount","ListId","string","onClose"],"mappings":"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","file":"features/glitch/async/list_adder.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { removeFromListAdder, addToListAdder } from '../../../actions/lists';\nimport Icon from 'flavours/glitch/components/icon';\n\nconst messages = defineMessages({\n remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },\n add: { id: 'lists.account.add', defaultMessage: 'Add to list' },\n});\n\nconst MapStateToProps = (state, { listId, added }) => ({\n list: state.get('lists').get(listId),\n added: typeof added === 'undefined' ? state.getIn(['listAdder', 'lists', 'items']).includes(listId) : added,\n});\n\nconst mapDispatchToProps = (dispatch, { listId }) => ({\n onRemove: () => dispatch(removeFromListAdder(listId)),\n onAdd: () => dispatch(addToListAdder(listId)),\n});\n\nexport default @connect(MapStateToProps, mapDispatchToProps)\n@injectIntl\nclass List extends ImmutablePureComponent {\n\n static propTypes = {\n list: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onRemove: PropTypes.func.isRequired,\n onAdd: PropTypes.func.isRequired,\n added: PropTypes.bool,\n };\n\n static defaultProps = {\n added: false,\n };\n\n render () {\n const { list, intl, onRemove, onAdd, added } = this.props;\n\n let button;\n\n if (added) {\n button = <IconButton icon='times' title={intl.formatMessage(messages.remove)} onClick={onRemove} />;\n } else {\n button = <IconButton icon='plus' title={intl.formatMessage(messages.add)} onClick={onAdd} />;\n }\n\n return (\n <div className='list'>\n <div className='list__wrapper'>\n <div className='list__display-name'>\n <Icon id='list-ul' className='column-link__icon' fixedWidth />\n {list.get('title')}\n </div>\n\n <div className='account__relationship'>\n {button}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from '../../../selectors';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport { injectIntl } from 'react-intl';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { accountId }) => ({\n account: getAccount(state, accountId),\n });\n\n return mapStateToProps;\n};\n\n\nexport default @connect(makeMapStateToProps)\n@injectIntl\nclass Account extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n };\n\n render () {\n const { account } = this.props;\n return (\n <div className='account'>\n <div className='account__wrapper'>\n <div className='account__display-name'>\n <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n <DisplayName account={account} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { injectIntl } from 'react-intl';\nimport { setupListAdder, resetListAdder } from '../../actions/lists';\nimport { createSelector } from 'reselect';\nimport List from './components/list';\nimport Account from './components/account';\nimport NewListForm from '../lists/components/new_list_form';\n// hack\n\nconst getOrderedLists = createSelector([state => state.get('lists')], lists => {\n if (!lists) {\n return lists;\n }\n\n return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));\n});\n\nconst mapStateToProps = state => ({\n listIds: getOrderedLists(state).map(list=>list.get('id')),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onInitialize: accountId => dispatch(setupListAdder(accountId)),\n onReset: () => dispatch(resetListAdder()),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass ListAdder extends ImmutablePureComponent {\n\n static propTypes = {\n accountId: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n onInitialize: PropTypes.func.isRequired,\n onReset: PropTypes.func.isRequired,\n listIds: ImmutablePropTypes.list.isRequired,\n };\n\n componentDidMount () {\n const { onInitialize, accountId } = this.props;\n onInitialize(accountId);\n }\n\n componentWillUnmount () {\n const { onReset } = this.props;\n onReset();\n }\n\n render () {\n const { accountId, listIds } = this.props;\n\n return (\n <div className='modal-root__modal list-adder'>\n <div className='list-adder__account'>\n <Account accountId={accountId} />\n </div>\n\n <NewListForm />\n\n\n <div className='list-adder__lists'>\n {listIds.map(ListId => <List key={ListId} listId={ListId} />)}\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/list_adder/components/list.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/list_adder/components/account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/flavours/glitch/features/list_adder/index.js"],"names":["messages","defineMessages","remove","add","List","connect","state","listId","added","list","get","getIn","includes","dispatch","onRemove","removeFromListAdder","onAdd","addToListAdder","injectIntl","render","button","this","props","intl","icon","title","formatMessage","onClick","className","id","fixedWidth","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","bool","Account","getAccount","makeGetAccount","accountId","account","size","getOrderedLists","createSelector","lists","toList","filter","item","sort","a","b","localeCompare","ListAdder","listIds","onInitialize","setupListAdder","onReset","resetListAdder","componentDidMount","componentWillUnmount","ListId","string","onClose"],"mappings":"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","file":"features/glitch/async/list_adder.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { removeFromListAdder, addToListAdder } from '../../../actions/lists';\nimport Icon from 'flavours/glitch/components/icon';\n\nconst messages = defineMessages({\n remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },\n add: { id: 'lists.account.add', defaultMessage: 'Add to list' },\n});\n\nconst MapStateToProps = (state, { listId, added }) => ({\n list: state.get('lists').get(listId),\n added: typeof added === 'undefined' ? state.getIn(['listAdder', 'lists', 'items']).includes(listId) : added,\n});\n\nconst mapDispatchToProps = (dispatch, { listId }) => ({\n onRemove: () => dispatch(removeFromListAdder(listId)),\n onAdd: () => dispatch(addToListAdder(listId)),\n});\n\nexport default @connect(MapStateToProps, mapDispatchToProps)\n@injectIntl\nclass List extends ImmutablePureComponent {\n\n static propTypes = {\n list: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onRemove: PropTypes.func.isRequired,\n onAdd: PropTypes.func.isRequired,\n added: PropTypes.bool,\n };\n\n static defaultProps = {\n added: false,\n };\n\n render () {\n const { list, intl, onRemove, onAdd, added } = this.props;\n\n let button;\n\n if (added) {\n button = <IconButton icon='times' title={intl.formatMessage(messages.remove)} onClick={onRemove} />;\n } else {\n button = <IconButton icon='plus' title={intl.formatMessage(messages.add)} onClick={onAdd} />;\n }\n\n return (\n <div className='list'>\n <div className='list__wrapper'>\n <div className='list__display-name'>\n <Icon id='list-ul' className='column-link__icon' fixedWidth />\n {list.get('title')}\n </div>\n\n <div className='account__relationship'>\n {button}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from '../../../selectors';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport { injectIntl } from 'react-intl';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { accountId }) => ({\n account: getAccount(state, accountId),\n });\n\n return mapStateToProps;\n};\n\n\nexport default @connect(makeMapStateToProps)\n@injectIntl\nclass Account extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n };\n\n render () {\n const { account } = this.props;\n return (\n <div className='account'>\n <div className='account__wrapper'>\n <div className='account__display-name'>\n <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n <DisplayName account={account} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { injectIntl } from 'react-intl';\nimport { setupListAdder, resetListAdder } from '../../actions/lists';\nimport { createSelector } from 'reselect';\nimport List from './components/list';\nimport Account from './components/account';\nimport NewListForm from '../lists/components/new_list_form';\n// hack\n\nconst getOrderedLists = createSelector([state => state.get('lists')], lists => {\n if (!lists) {\n return lists;\n }\n\n return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));\n});\n\nconst mapStateToProps = state => ({\n listIds: getOrderedLists(state).map(list=>list.get('id')),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onInitialize: accountId => dispatch(setupListAdder(accountId)),\n onReset: () => dispatch(resetListAdder()),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass ListAdder extends ImmutablePureComponent {\n\n static propTypes = {\n accountId: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n onInitialize: PropTypes.func.isRequired,\n onReset: PropTypes.func.isRequired,\n listIds: ImmutablePropTypes.list.isRequired,\n };\n\n componentDidMount () {\n const { onInitialize, accountId } = this.props;\n onInitialize(accountId);\n }\n\n componentWillUnmount () {\n const { onReset } = this.props;\n onReset();\n }\n\n render () {\n const { accountId, listIds } = this.props;\n\n return (\n <div className='modal-root__modal list-adder'>\n <div className='list-adder__account'>\n <Account accountId={accountId} />\n </div>\n\n <NewListForm />\n\n\n <div className='list-adder__lists'>\n {listIds.map(ListId => <List key={ListId} listId={ListId} />)}\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/glitch/async/search.js b/priv/static/packs/features/glitch/async/search.js
index f39dc3db0..2edb95c49 100644
--- a/priv/static/packs/features/glitch/async/search.js
+++ b/priv/static/packs/features/glitch/async/search.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{784:function(a,e,c){"use strict";c.r(e);var r=c(0),d=(c(3),c(747)),i=c(1144);e.default=function(){return Object(r.a)("div",{className:"column search-page"},void 0,Object(r.a)(d.a,{}),Object(r.a)("div",{className:"drawer__pager"},void 0,Object(r.a)("div",{className:"drawer__inner darker"},void 0,Object(r.a)(i.a,{}))))}}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{810:function(a,e,c){"use strict";c.r(e);var r=c(0),d=(c(3),c(773)),i=c(1177);e.default=function(){return Object(r.a)("div",{className:"column search-page"},void 0,Object(r.a)(d.a,{}),Object(r.a)("div",{className:"drawer__pager"},void 0,Object(r.a)("div",{className:"drawer__inner darker"},void 0,Object(r.a)(i.a,{}))))}}}]);
//# sourceMappingURL=search.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/hashtag_timeline.js b/priv/static/packs/features/hashtag_timeline.js
index f54b99ce8..139ca9b33 100644
--- a/priv/static/packs/features/hashtag_timeline.js
+++ b/priv/static/packs/features/hashtag_timeline.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{117:function(t,e){var n=Array.isArray;t.exports=n},151:function(t,e,n){var r=n(473),o=n(476);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},275:function(t,e,n){var r=n(489),o=n(490),a=n(491),i=n(492),s=n(493);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=i,c.prototype.set=s,t.exports=c},276:function(t,e,n){var r=n(411);t.exports=function(t,e){for(var n=t.length;n--;)if(r(t[n][0],e))return n;return-1}},277:function(t,e,n){var r=n(151)(Object,"create");t.exports=r},278:function(t,e,n){var r=n(507);t.exports=function(t,e){var n=t.__data__;return r(e)?n["string"==typeof e?"string":"hash"]:n.map}},320:function(t,e,n){var r=n(151)(n(76),"Map");t.exports=r},322:function(t,e){var n=9007199254740991;t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=n}},323:function(t,e,n){var r=n(499),o=n(506),a=n(508),i=n(509),s=n(510);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=i,c.prototype.set=s,t.exports=c},382:function(t,e,n){var r=n(477),o=n(484),a=n(488);t.exports=function(t){return a(t)?r(t):o(t)}},407:function(t,e,n){var r=n(152),o=n(96),a="[object AsyncFunction]",i="[object Function]",s="[object GeneratorFunction]",c="[object Proxy]";t.exports=function(t){if(!o(t))return!1;var e=r(t);return e==i||e==s||e==a||e==c}},408:function(t,e){var n=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return n.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},409:function(t,e,n){(function(t){var r=n(76),o=n(480),a=e&&!e.nodeType&&e,i=a&&"object"==typeof t&&t&&!t.nodeType&&t,s=i&&i.exports===a?r.Buffer:void 0,c=(s?s.isBuffer:void 0)||o;t.exports=c}).call(this,n(232)(t))},410:function(t,e,n){var r=n(481),o=n(482),a=n(483),i=a&&a.isTypedArray,s=i?o(i):r;t.exports=s},411:function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},412:function(t,e,n){var r=n(512),o=n(515),a=n(516),i=1,s=2;t.exports=function(t,e,n,c,u,p){var f=n&i,l=t.length,h=e.length;if(l!=h&&!(f&&h>l))return!1;var d=p.get(t);if(d&&p.get(e))return d==e;var b=-1,v=!0,g=n&s?new r:void 0;for(p.set(t,e),p.set(e,t);++b<l;){var _=t[b],j=e[b];if(c)var y=f?c(j,_,b,e,t,p):c(_,j,b,t,e,p);if(void 0!==y){if(y)continue;v=!1;break}if(g){if(!o(e,(function(t,e){if(!a(g,e)&&(_===t||u(_,t,n,c,p)))return g.push(e)}))){v=!1;break}}else if(_!==j&&!u(_,j,n,c,p)){v=!1;break}}return p.delete(t),p.delete(e),v}},413:function(t,e,n){var r=n(479),o=n(153),a=Object.prototype,i=a.hasOwnProperty,s=a.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(t){return o(t)&&i.call(t,"callee")&&!s.call(t,"callee")};t.exports=c},414:function(t,e){var n=9007199254740991,r=/^(?:0|[1-9]\d*)$/;t.exports=function(t,e){var o=typeof t;return!!(e=null==e?n:e)&&("number"==o||"symbol"!=o&&r.test(t))&&t>-1&&t%1==0&&t<e}},415:function(t,e,n){var r=n(275),o=n(494),a=n(495),i=n(496),s=n(497),c=n(498);function u(t){var e=this.__data__=new r(t);this.size=e.size}u.prototype.clear=o,u.prototype.delete=a,u.prototype.get=i,u.prototype.has=s,u.prototype.set=c,t.exports=u},416:function(t,e,n){var r=n(511),o=n(153);t.exports=function t(e,n,a,i,s){return e===n||(null==e||null==n||!o(e)&&!o(n)?e!=e&&n!=n:r(e,n,a,i,t,s))}},473:function(t,e,n){var r=n(407),o=n(474),a=n(96),i=n(408),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,p=c.toString,f=u.hasOwnProperty,l=RegExp("^"+p.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!a(t)||o(t))&&(r(t)?l:s).test(i(t))}},474:function(t,e,n){var r,o=n(475),a=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!a&&a in t}},475:function(t,e,n){var r=n(76)["__core-js_shared__"];t.exports=r},476:function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},477:function(t,e,n){var r=n(478),o=n(413),a=n(117),i=n(409),s=n(414),c=n(410),u=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=a(t),p=!n&&o(t),f=!n&&!p&&i(t),l=!n&&!p&&!f&&c(t),h=n||p||f||l,d=h?r(t.length,String):[],b=d.length;for(var v in t)!e&&!u.call(t,v)||h&&("length"==v||f&&("offset"==v||"parent"==v)||l&&("buffer"==v||"byteLength"==v||"byteOffset"==v)||s(v,b))||d.push(v);return d}},478:function(t,e){t.exports=function(t,e){for(var n=-1,r=Array(t);++n<t;)r[n]=e(n);return r}},479:function(t,e,n){var r=n(152),o=n(153),a="[object Arguments]";t.exports=function(t){return o(t)&&r(t)==a}},480:function(t,e){t.exports=function(){return!1}},481:function(t,e,n){var r=n(152),o=n(322),a=n(153),i={};i["[object Float32Array]"]=i["[object Float64Array]"]=i["[object Int8Array]"]=i["[object Int16Array]"]=i["[object Int32Array]"]=i["[object Uint8Array]"]=i["[object Uint8ClampedArray]"]=i["[object Uint16Array]"]=i["[object Uint32Array]"]=!0,i["[object Arguments]"]=i["[object Array]"]=i["[object ArrayBuffer]"]=i["[object Boolean]"]=i["[object DataView]"]=i["[object Date]"]=i["[object Error]"]=i["[object Function]"]=i["[object Map]"]=i["[object Number]"]=i["[object Object]"]=i["[object RegExp]"]=i["[object Set]"]=i["[object String]"]=i["[object WeakMap]"]=!1,t.exports=function(t){return a(t)&&o(t.length)&&!!i[r(t)]}},482:function(t,e){t.exports=function(t){return function(e){return t(e)}}},483:function(t,e,n){(function(t){var r=n(279),o=e&&!e.nodeType&&e,a=o&&"object"==typeof t&&t&&!t.nodeType&&t,i=a&&a.exports===o&&r.process,s=function(){try{var t=a&&a.require&&a.require("util").types;return t||i&&i.binding&&i.binding("util")}catch(t){}}();t.exports=s}).call(this,n(232)(t))},484:function(t,e,n){var r=n(485),o=n(486),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return o(t);var e=[];for(var n in Object(t))a.call(t,n)&&"constructor"!=n&&e.push(n);return e}},485:function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},486:function(t,e,n){var r=n(487)(Object.keys,Object);t.exports=r},487:function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},488:function(t,e,n){var r=n(407),o=n(322);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},489:function(t,e){t.exports=function(){this.__data__=[],this.size=0}},490:function(t,e,n){var r=n(276),o=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0)&&(n==e.length-1?e.pop():o.call(e,n,1),--this.size,!0)}},491:function(t,e,n){var r=n(276);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},492:function(t,e,n){var r=n(276);t.exports=function(t){return r(this.__data__,t)>-1}},493:function(t,e,n){var r=n(276);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},494:function(t,e,n){var r=n(275);t.exports=function(){this.__data__=new r,this.size=0}},495:function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},496:function(t,e){t.exports=function(t){return this.__data__.get(t)}},497:function(t,e){t.exports=function(t){return this.__data__.has(t)}},498:function(t,e,n){var r=n(275),o=n(320),a=n(323),i=200;t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var s=n.__data__;if(!o||s.length<i-1)return s.push([t,e]),this.size=++n.size,this;n=this.__data__=new a(s)}return n.set(t,e),this.size=n.size,this}},499:function(t,e,n){var r=n(500),o=n(275),a=n(320);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||o),string:new r}}},500:function(t,e,n){var r=n(501),o=n(502),a=n(503),i=n(504),s=n(505);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=i,c.prototype.set=s,t.exports=c},501:function(t,e,n){var r=n(277);t.exports=function(){this.__data__=r?r(null):{},this.size=0}},502:function(t,e){t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},503:function(t,e,n){var r=n(277),o="__lodash_hash_undefined__",a=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;if(r){var n=e[t];return n===o?void 0:n}return a.call(e,t)?e[t]:void 0}},504:function(t,e,n){var r=n(277),o=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return r?void 0!==e[t]:o.call(e,t)}},505:function(t,e,n){var r=n(277),o="__lodash_hash_undefined__";t.exports=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?o:e,this}},506:function(t,e,n){var r=n(278);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},507:function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},508:function(t,e,n){var r=n(278);t.exports=function(t){return r(this,t).get(t)}},509:function(t,e,n){var r=n(278);t.exports=function(t){return r(this,t).has(t)}},510:function(t,e,n){var r=n(278);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},511:function(t,e,n){var r=n(415),o=n(412),a=n(517),i=n(521),s=n(528),c=n(117),u=n(409),p=n(410),f=1,l="[object Arguments]",h="[object Array]",d="[object Object]",b=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,v,g,_){var j=c(t),y=c(e),m=j?h:s(t),O=y?h:s(e),x=(m=m==l?d:m)==d,w=(O=O==l?d:O)==d,M=m==O;if(M&&u(t)){if(!u(e))return!1;j=!0,x=!1}if(M&&!x)return _||(_=new r),j||p(t)?o(t,e,n,v,g,_):a(t,e,m,n,v,g,_);if(!(n&f)){var A=x&&b.call(t,"__wrapped__"),S=w&&b.call(e,"__wrapped__");if(A||S){var z=A?t.value():t,P=S?e.value():e;return _||(_=new r),g(z,P,n,v,_)}}return!!M&&(_||(_=new r),i(t,e,n,v,g,_))}},512:function(t,e,n){var r=n(323),o=n(513),a=n(514);function i(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new r;++e<n;)this.add(t[e])}i.prototype.add=i.prototype.push=o,i.prototype.has=a,t.exports=i},513:function(t,e){var n="__lodash_hash_undefined__";t.exports=function(t){return this.__data__.set(t,n),this}},514:function(t,e){t.exports=function(t){return this.__data__.has(t)}},515:function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n<r;)if(e(t[n],n,t))return!0;return!1}},516:function(t,e){t.exports=function(t,e){return t.has(e)}},517:function(t,e,n){var r=n(155),o=n(518),a=n(411),i=n(412),s=n(519),c=n(520),u=1,p=2,f="[object Boolean]",l="[object Date]",h="[object Error]",d="[object Map]",b="[object Number]",v="[object RegExp]",g="[object Set]",_="[object String]",j="[object Symbol]",y="[object ArrayBuffer]",m="[object DataView]",O=r?r.prototype:void 0,x=O?O.valueOf:void 0;t.exports=function(t,e,n,r,O,w,M){switch(n){case m:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case y:return!(t.byteLength!=e.byteLength||!w(new o(t),new o(e)));case f:case l:case b:return a(+t,+e);case h:return t.name==e.name&&t.message==e.message;case v:case _:return t==e+"";case d:var A=s;case g:var S=r&u;if(A||(A=c),t.size!=e.size&&!S)return!1;var z=M.get(t);if(z)return z==e;r|=p,M.set(t,e);var P=i(A(t),A(e),r,O,w,M);return M.delete(t),P;case j:if(x)return x.call(t)==x.call(e)}return!1}},518:function(t,e,n){var r=n(76).Uint8Array;t.exports=r},519:function(t,e){t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}},520:function(t,e){t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t){n[++e]=t})),n}},521:function(t,e,n){var r=n(522),o=1,a=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,i,s,c){var u=n&o,p=r(t),f=p.length;if(f!=r(e).length&&!u)return!1;for(var l=f;l--;){var h=p[l];if(!(u?h in e:a.call(e,h)))return!1}var d=c.get(t);if(d&&c.get(e))return d==e;var b=!0;c.set(t,e),c.set(e,t);for(var v=u;++l<f;){var g=t[h=p[l]],_=e[h];if(i)var j=u?i(_,g,h,e,t,c):i(g,_,h,t,e,c);if(!(void 0===j?g===_||s(g,_,n,i,c):j)){b=!1;break}v||(v="constructor"==h)}if(b&&!v){var y=t.constructor,m=e.constructor;y!=m&&"constructor"in t&&"constructor"in e&&!("function"==typeof y&&y instanceof y&&"function"==typeof m&&m instanceof m)&&(b=!1)}return c.delete(t),c.delete(e),b}},522:function(t,e,n){var r=n(523),o=n(525),a=n(382);t.exports=function(t){return r(t,a,o)}},523:function(t,e,n){var r=n(524),o=n(117);t.exports=function(t,e,n){var a=e(t);return o(t)?a:r(a,n(t))}},524:function(t,e){t.exports=function(t,e){for(var n=-1,r=e.length,o=t.length;++n<r;)t[o+n]=e[n];return t}},525:function(t,e,n){var r=n(526),o=n(527),a=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,s=i?function(t){return null==t?[]:(t=Object(t),r(i(t),(function(e){return a.call(t,e)})))}:o;t.exports=s},526:function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,o=0,a=[];++n<r;){var i=t[n];e(i,n,t)&&(a[o++]=i)}return a}},527:function(t,e){t.exports=function(){return[]}},528:function(t,e,n){var r=n(529),o=n(320),a=n(530),i=n(531),s=n(532),c=n(152),u=n(408),p=u(r),f=u(o),l=u(a),h=u(i),d=u(s),b=c;(r&&"[object DataView]"!=b(new r(new ArrayBuffer(1)))||o&&"[object Map]"!=b(new o)||a&&"[object Promise]"!=b(a.resolve())||i&&"[object Set]"!=b(new i)||s&&"[object WeakMap]"!=b(new s))&&(b=function(t){var e=c(t),n="[object Object]"==e?t.constructor:void 0,r=n?u(n):"";if(r)switch(r){case p:return"[object DataView]";case f:return"[object Map]";case l:return"[object Promise]";case h:return"[object Set]";case d:return"[object WeakMap]"}return e}),t.exports=b},529:function(t,e,n){var r=n(151)(n(76),"DataView");t.exports=r},530:function(t,e,n){var r=n(151)(n(76),"Promise");t.exports=r},531:function(t,e,n){var r=n(151)(n(76),"Set");t.exports=r},532:function(t,e,n){var r=n(151)(n(76),"WeakMap");t.exports=r},824:function(t,e,n){"use strict";n.r(e);var r,o,a=n(0),i=n(2),s=n(7),c=n(1),u=n(1116),p=n.n(u),f=n(3),l=n.n(f),h=n(13),d=n(1036),b=n(736),v=n(733),g=n(6),_=n(301),j=n.n(_),y=n(1143),m=Object(g.f)({placeholder:{id:"hashtag.column_settings.select.placeholder",defaultMessage:"Enter hashtags…"},noOptions:{id:"hashtag.column_settings.select.no_options_message",defaultMessage:"No suggestions found"}}),O=Object(g.g)(r=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return e=t.call.apply(t,[this].concat(r))||this,Object(c.a)(Object(i.a)(e),"state",{open:e.hasTags()}),Object(c.a)(Object(i.a)(e),"onSelect",(function(t){return function(n){return e.props.onChange(["tags",t],n)}})),Object(c.a)(Object(i.a)(e),"onToggle",(function(){e.state.open&&e.hasTags()&&e.props.onChange("tags",{}),e.setState({open:!e.state.open})})),Object(c.a)(Object(i.a)(e),"noOptionsMessage",(function(){return e.props.intl.formatMessage(m.noOptions)})),e}Object(s.a)(e,t);var n=e.prototype;return n.hasTags=function(){var t=this;return["all","any","none"].map((function(e){return t.tags(e).length>0})).includes(!0)},n.tags=function(t){var e=this.props.settings.getIn(["tags",t])||[];return e.toJSON?e.toJSON():e},n.modeSelect=function(t){return Object(a.a)("div",{className:"column-settings__row"},void 0,Object(a.a)("span",{className:"column-settings__section"},void 0,this.modeLabel(t)),Object(a.a)(y.a,{isMulti:!0,autoFocus:!0,value:this.tags(t),onChange:this.onSelect(t),loadOptions:this.props.onLoad,className:"column-select__container",classNamePrefix:"column-select",name:"tags",placeholder:this.props.intl.formatMessage(m.placeholder),noOptionsMessage:this.noOptionsMessage}))},n.modeLabel=function(t){switch(t){case"any":return Object(a.a)(g.b,{id:"hashtag.column_settings.tag_mode.any",defaultMessage:"Any of these"});case"all":return Object(a.a)(g.b,{id:"hashtag.column_settings.tag_mode.all",defaultMessage:"All of these"});case"none":return Object(a.a)(g.b,{id:"hashtag.column_settings.tag_mode.none",defaultMessage:"None of these"});default:return""}},n.render=function(){return Object(a.a)("div",{},void 0,Object(a.a)("div",{className:"column-settings__row"},void 0,Object(a.a)("div",{className:"setting-toggle"},void 0,Object(a.a)(j.a,{id:"hashtag.column_settings.tag_toggle",onChange:this.onToggle,checked:this.state.open}),Object(a.a)("span",{className:"setting-toggle__label"},void 0,Object(a.a)(g.b,{id:"hashtag.column_settings.tag_toggle",defaultMessage:"Include additional tags in this column"})))),this.state.open&&Object(a.a)("div",{className:"column-settings__hashtags"},void 0,this.modeSelect("any"),this.modeSelect("all"),this.modeSelect("none")))},e}(l.a.PureComponent))||r,x=n(250),w=n(10),M=Object(h.connect)((function(t,e){var n=e.columnId,r=t.getIn(["settings","columns"]),o=r.findIndex((function(t){return t.get("uuid")===n}));return n&&o>=0?{settings:r.get(o).get("params")}:{}}),(function(t,e){var n=e.columnId;return{onChange:function(e,r){t(Object(x.f)(n,e,r))},onLoad:function(t){return Object(w.a)().get("/api/v2/search",{params:{q:t,type:"hashtags"}}).then((function(t){return(t.data.hashtags||[]).map((function(t){return{value:t.name,label:"#"+t.name}}))}))}}}))(O),A=n(33),S=n(740);n.d(e,"default",(function(){return z}));var z=Object(h.connect)((function(t,e){return{hasUnread:t.getIn(["timelines","hashtag:"+e.params.id,"unread"])>0}}))(o=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return e=t.call.apply(t,[this].concat(r))||this,Object(c.a)(Object(i.a)(e),"disconnects",[]),Object(c.a)(Object(i.a)(e),"handlePin",(function(){var t=e.props,n=t.columnId,r=t.dispatch;r(n?Object(x.h)(n):Object(x.e)("HASHTAG",{id:e.props.params.id}))})),Object(c.a)(Object(i.a)(e),"title",(function(){var t=[e.props.params.id];return e.additionalFor("any")&&t.push(" ",Object(a.a)(g.b,{id:"hashtag.column_header.tag_mode.any",values:{additional:e.additionalFor("any")},defaultMessage:"or {additional}"},"any")),e.additionalFor("all")&&t.push(" ",Object(a.a)(g.b,{id:"hashtag.column_header.tag_mode.all",values:{additional:e.additionalFor("all")},defaultMessage:"and {additional}"},"all")),e.additionalFor("none")&&t.push(" ",Object(a.a)(g.b,{id:"hashtag.column_header.tag_mode.none",values:{additional:e.additionalFor("none")},defaultMessage:"without {additional}"},"none")),t})),Object(c.a)(Object(i.a)(e),"additionalFor",(function(t){var n=e.props.params.tags;return n&&(n[t]||[]).length>0?n[t].map((function(t){return t.value})).join("/"):""})),Object(c.a)(Object(i.a)(e),"handleMove",(function(t){var n=e.props,r=n.columnId;(0,n.dispatch)(Object(x.g)(r,t))})),Object(c.a)(Object(i.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(c.a)(Object(i.a)(e),"setRef",(function(t){e.column=t})),Object(c.a)(Object(i.a)(e),"handleLoadMore",(function(t){var n=e.props.params,r=n.id,o=n.tags;e.props.dispatch(Object(A.s)(r,{maxId:t,tags:o}))})),e}Object(s.a)(e,t);var n=e.prototype;return n._subscribe=function(t,e,n){var r=this;void 0===n&&(n={});var o=(n.any||[]).map((function(t){return t.value})),a=(n.all||[]).map((function(t){return t.value})),i=(n.none||[]).map((function(t){return t.value}));[e].concat(o).map((function(n){r.disconnects.push(t(Object(S.c)(e,n,(function(t){var e=t.tags.map((function(t){return t.name}));return a.filter((function(t){return e.includes(t)})).length===a.length&&0===i.filter((function(t){return e.includes(t)})).length}))))}))},n._unsubscribe=function(){this.disconnects.map((function(t){return t()})),this.disconnects=[]},n.componentDidMount=function(){var t=this.props.dispatch,e=this.props.params,n=e.id,r=e.tags;this._subscribe(t,n,r),t(Object(A.s)(n,{tags:r}))},n.componentWillReceiveProps=function(t){var e=this.props,n=e.dispatch,r=e.params,o=t.params,a=o.id,i=o.tags;a===r.id&&p()(i,r.tags)||(this._unsubscribe(),this._subscribe(n,a,i),this.props.dispatch(Object(A.k)("hashtag:"+a)),this.props.dispatch(Object(A.s)(a,{tags:i})))},n.componentWillUnmount=function(){this._unsubscribe()},n.render=function(){var t=this.props,e=t.shouldUpdateScroll,n=t.hasUnread,r=t.columnId,o=t.multiColumn,i=this.props.params.id,s=!!r;return l.a.createElement(b.a,{bindToDocument:!o,ref:this.setRef,label:"#"+i},Object(a.a)(v.a,{icon:"hashtag",active:n,title:this.title(),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:s,multiColumn:o,showBackButton:!0},void 0,r&&Object(a.a)(M,{columnId:r})),Object(a.a)(d.a,{trackScroll:!s,scrollKey:"hashtag_timeline-"+r,timelineId:"hashtag:"+i,onLoadMore:this.handleLoadMore,emptyMessage:Object(a.a)(g.b,{id:"empty_column.hashtag",defaultMessage:"There is nothing in this hashtag yet."}),shouldUpdateScroll:e,bindToDocument:!o}))},e}(l.a.PureComponent))||o}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{121:function(t,e){var n=Array.isArray;t.exports=n},156:function(t,e,n){var r=n(479),o=n(482);t.exports=function(t,e){var n=o(t,e);return r(n)?n:void 0}},275:function(t,e,n){var r=n(495),o=n(496),a=n(497),i=n(498),s=n(499);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=i,c.prototype.set=s,t.exports=c},276:function(t,e,n){var r=n(414);t.exports=function(t,e){for(var n=t.length;n--;)if(r(t[n][0],e))return n;return-1}},277:function(t,e,n){var r=n(156)(Object,"create");t.exports=r},278:function(t,e,n){var r=n(513);t.exports=function(t,e){var n=t.__data__;return r(e)?n["string"==typeof e?"string":"hash"]:n.map}},326:function(t,e,n){var r=n(156)(n(80),"Map");t.exports=r},328:function(t,e){var n=9007199254740991;t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=n}},329:function(t,e,n){var r=n(505),o=n(512),a=n(514),i=n(515),s=n(516);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=i,c.prototype.set=s,t.exports=c},381:function(t,e,n){var r=n(483),o=n(490),a=n(494);t.exports=function(t){return a(t)?r(t):o(t)}},410:function(t,e,n){var r=n(157),o=n(100),a="[object AsyncFunction]",i="[object Function]",s="[object GeneratorFunction]",c="[object Proxy]";t.exports=function(t){if(!o(t))return!1;var e=r(t);return e==i||e==s||e==a||e==c}},411:function(t,e){var n=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return n.call(t)}catch(t){}try{return t+""}catch(t){}}return""}},412:function(t,e,n){(function(t){var r=n(80),o=n(486),a=e&&!e.nodeType&&e,i=a&&"object"==typeof t&&t&&!t.nodeType&&t,s=i&&i.exports===a?r.Buffer:void 0,c=(s?s.isBuffer:void 0)||o;t.exports=c}).call(this,n(237)(t))},413:function(t,e,n){var r=n(487),o=n(488),a=n(489),i=a&&a.isTypedArray,s=i?o(i):r;t.exports=s},414:function(t,e){t.exports=function(t,e){return t===e||t!=t&&e!=e}},415:function(t,e,n){var r=n(518),o=n(521),a=n(522),i=1,s=2;t.exports=function(t,e,n,c,u,p){var f=n&i,l=t.length,h=e.length;if(l!=h&&!(f&&h>l))return!1;var d=p.get(t);if(d&&p.get(e))return d==e;var b=-1,v=!0,g=n&s?new r:void 0;for(p.set(t,e),p.set(e,t);++b<l;){var _=t[b],j=e[b];if(c)var y=f?c(j,_,b,e,t,p):c(_,j,b,t,e,p);if(void 0!==y){if(y)continue;v=!1;break}if(g){if(!o(e,(function(t,e){if(!a(g,e)&&(_===t||u(_,t,n,c,p)))return g.push(e)}))){v=!1;break}}else if(_!==j&&!u(_,j,n,c,p)){v=!1;break}}return p.delete(t),p.delete(e),v}},416:function(t,e,n){var r=n(485),o=n(158),a=Object.prototype,i=a.hasOwnProperty,s=a.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(t){return o(t)&&i.call(t,"callee")&&!s.call(t,"callee")};t.exports=c},417:function(t,e){var n=9007199254740991,r=/^(?:0|[1-9]\d*)$/;t.exports=function(t,e){var o=typeof t;return!!(e=null==e?n:e)&&("number"==o||"symbol"!=o&&r.test(t))&&t>-1&&t%1==0&&t<e}},418:function(t,e,n){var r=n(275),o=n(500),a=n(501),i=n(502),s=n(503),c=n(504);function u(t){var e=this.__data__=new r(t);this.size=e.size}u.prototype.clear=o,u.prototype.delete=a,u.prototype.get=i,u.prototype.has=s,u.prototype.set=c,t.exports=u},419:function(t,e,n){var r=n(517),o=n(158);t.exports=function t(e,n,a,i,s){return e===n||(null==e||null==n||!o(e)&&!o(n)?e!=e&&n!=n:r(e,n,a,i,t,s))}},479:function(t,e,n){var r=n(410),o=n(480),a=n(100),i=n(411),s=/^\[object .+?Constructor\]$/,c=Function.prototype,u=Object.prototype,p=c.toString,f=u.hasOwnProperty,l=RegExp("^"+p.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!a(t)||o(t))&&(r(t)?l:s).test(i(t))}},480:function(t,e,n){var r,o=n(481),a=(r=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"";t.exports=function(t){return!!a&&a in t}},481:function(t,e,n){var r=n(80)["__core-js_shared__"];t.exports=r},482:function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},483:function(t,e,n){var r=n(484),o=n(416),a=n(121),i=n(412),s=n(417),c=n(413),u=Object.prototype.hasOwnProperty;t.exports=function(t,e){var n=a(t),p=!n&&o(t),f=!n&&!p&&i(t),l=!n&&!p&&!f&&c(t),h=n||p||f||l,d=h?r(t.length,String):[],b=d.length;for(var v in t)!e&&!u.call(t,v)||h&&("length"==v||f&&("offset"==v||"parent"==v)||l&&("buffer"==v||"byteLength"==v||"byteOffset"==v)||s(v,b))||d.push(v);return d}},484:function(t,e){t.exports=function(t,e){for(var n=-1,r=Array(t);++n<t;)r[n]=e(n);return r}},485:function(t,e,n){var r=n(157),o=n(158),a="[object Arguments]";t.exports=function(t){return o(t)&&r(t)==a}},486:function(t,e){t.exports=function(){return!1}},487:function(t,e,n){var r=n(157),o=n(328),a=n(158),i={};i["[object Float32Array]"]=i["[object Float64Array]"]=i["[object Int8Array]"]=i["[object Int16Array]"]=i["[object Int32Array]"]=i["[object Uint8Array]"]=i["[object Uint8ClampedArray]"]=i["[object Uint16Array]"]=i["[object Uint32Array]"]=!0,i["[object Arguments]"]=i["[object Array]"]=i["[object ArrayBuffer]"]=i["[object Boolean]"]=i["[object DataView]"]=i["[object Date]"]=i["[object Error]"]=i["[object Function]"]=i["[object Map]"]=i["[object Number]"]=i["[object Object]"]=i["[object RegExp]"]=i["[object Set]"]=i["[object String]"]=i["[object WeakMap]"]=!1,t.exports=function(t){return a(t)&&o(t.length)&&!!i[r(t)]}},488:function(t,e){t.exports=function(t){return function(e){return t(e)}}},489:function(t,e,n){(function(t){var r=n(279),o=e&&!e.nodeType&&e,a=o&&"object"==typeof t&&t&&!t.nodeType&&t,i=a&&a.exports===o&&r.process,s=function(){try{var t=a&&a.require&&a.require("util").types;return t||i&&i.binding&&i.binding("util")}catch(t){}}();t.exports=s}).call(this,n(237)(t))},490:function(t,e,n){var r=n(491),o=n(492),a=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return o(t);var e=[];for(var n in Object(t))a.call(t,n)&&"constructor"!=n&&e.push(n);return e}},491:function(t,e){var n=Object.prototype;t.exports=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},492:function(t,e,n){var r=n(493)(Object.keys,Object);t.exports=r},493:function(t,e){t.exports=function(t,e){return function(n){return t(e(n))}}},494:function(t,e,n){var r=n(410),o=n(328);t.exports=function(t){return null!=t&&o(t.length)&&!r(t)}},495:function(t,e){t.exports=function(){this.__data__=[],this.size=0}},496:function(t,e,n){var r=n(276),o=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0)&&(n==e.length-1?e.pop():o.call(e,n,1),--this.size,!0)}},497:function(t,e,n){var r=n(276);t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},498:function(t,e,n){var r=n(276);t.exports=function(t){return r(this.__data__,t)>-1}},499:function(t,e,n){var r=n(276);t.exports=function(t,e){var n=this.__data__,o=r(n,t);return o<0?(++this.size,n.push([t,e])):n[o][1]=e,this}},500:function(t,e,n){var r=n(275);t.exports=function(){this.__data__=new r,this.size=0}},501:function(t,e){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},502:function(t,e){t.exports=function(t){return this.__data__.get(t)}},503:function(t,e){t.exports=function(t){return this.__data__.has(t)}},504:function(t,e,n){var r=n(275),o=n(326),a=n(329),i=200;t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var s=n.__data__;if(!o||s.length<i-1)return s.push([t,e]),this.size=++n.size,this;n=this.__data__=new a(s)}return n.set(t,e),this.size=n.size,this}},505:function(t,e,n){var r=n(506),o=n(275),a=n(326);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(a||o),string:new r}}},506:function(t,e,n){var r=n(507),o=n(508),a=n(509),i=n(510),s=n(511);function c(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e<n;){var r=t[e];this.set(r[0],r[1])}}c.prototype.clear=r,c.prototype.delete=o,c.prototype.get=a,c.prototype.has=i,c.prototype.set=s,t.exports=c},507:function(t,e,n){var r=n(277);t.exports=function(){this.__data__=r?r(null):{},this.size=0}},508:function(t,e){t.exports=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}},509:function(t,e,n){var r=n(277),o="__lodash_hash_undefined__",a=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;if(r){var n=e[t];return n===o?void 0:n}return a.call(e,t)?e[t]:void 0}},510:function(t,e,n){var r=n(277),o=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;return r?void 0!==e[t]:o.call(e,t)}},511:function(t,e,n){var r=n(277),o="__lodash_hash_undefined__";t.exports=function(t,e){var n=this.__data__;return this.size+=this.has(t)?0:1,n[t]=r&&void 0===e?o:e,this}},512:function(t,e,n){var r=n(278);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},513:function(t,e){t.exports=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t}},514:function(t,e,n){var r=n(278);t.exports=function(t){return r(this,t).get(t)}},515:function(t,e,n){var r=n(278);t.exports=function(t){return r(this,t).has(t)}},516:function(t,e,n){var r=n(278);t.exports=function(t,e){var n=r(this,t),o=n.size;return n.set(t,e),this.size+=n.size==o?0:1,this}},517:function(t,e,n){var r=n(418),o=n(415),a=n(523),i=n(527),s=n(534),c=n(121),u=n(412),p=n(413),f=1,l="[object Arguments]",h="[object Array]",d="[object Object]",b=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,v,g,_){var j=c(t),y=c(e),m=j?h:s(t),O=y?h:s(e),x=(m=m==l?d:m)==d,w=(O=O==l?d:O)==d,M=m==O;if(M&&u(t)){if(!u(e))return!1;j=!0,x=!1}if(M&&!x)return _||(_=new r),j||p(t)?o(t,e,n,v,g,_):a(t,e,m,n,v,g,_);if(!(n&f)){var A=x&&b.call(t,"__wrapped__"),S=w&&b.call(e,"__wrapped__");if(A||S){var z=A?t.value():t,P=S?e.value():e;return _||(_=new r),g(z,P,n,v,_)}}return!!M&&(_||(_=new r),i(t,e,n,v,g,_))}},518:function(t,e,n){var r=n(329),o=n(519),a=n(520);function i(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new r;++e<n;)this.add(t[e])}i.prototype.add=i.prototype.push=o,i.prototype.has=a,t.exports=i},519:function(t,e){var n="__lodash_hash_undefined__";t.exports=function(t){return this.__data__.set(t,n),this}},520:function(t,e){t.exports=function(t){return this.__data__.has(t)}},521:function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length;++n<r;)if(e(t[n],n,t))return!0;return!1}},522:function(t,e){t.exports=function(t,e){return t.has(e)}},523:function(t,e,n){var r=n(160),o=n(524),a=n(414),i=n(415),s=n(525),c=n(526),u=1,p=2,f="[object Boolean]",l="[object Date]",h="[object Error]",d="[object Map]",b="[object Number]",v="[object RegExp]",g="[object Set]",_="[object String]",j="[object Symbol]",y="[object ArrayBuffer]",m="[object DataView]",O=r?r.prototype:void 0,x=O?O.valueOf:void 0;t.exports=function(t,e,n,r,O,w,M){switch(n){case m:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case y:return!(t.byteLength!=e.byteLength||!w(new o(t),new o(e)));case f:case l:case b:return a(+t,+e);case h:return t.name==e.name&&t.message==e.message;case v:case _:return t==e+"";case d:var A=s;case g:var S=r&u;if(A||(A=c),t.size!=e.size&&!S)return!1;var z=M.get(t);if(z)return z==e;r|=p,M.set(t,e);var P=i(A(t),A(e),r,O,w,M);return M.delete(t),P;case j:if(x)return x.call(t)==x.call(e)}return!1}},524:function(t,e,n){var r=n(80).Uint8Array;t.exports=r},525:function(t,e){t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}},526:function(t,e){t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t){n[++e]=t})),n}},527:function(t,e,n){var r=n(528),o=1,a=Object.prototype.hasOwnProperty;t.exports=function(t,e,n,i,s,c){var u=n&o,p=r(t),f=p.length;if(f!=r(e).length&&!u)return!1;for(var l=f;l--;){var h=p[l];if(!(u?h in e:a.call(e,h)))return!1}var d=c.get(t);if(d&&c.get(e))return d==e;var b=!0;c.set(t,e),c.set(e,t);for(var v=u;++l<f;){var g=t[h=p[l]],_=e[h];if(i)var j=u?i(_,g,h,e,t,c):i(g,_,h,t,e,c);if(!(void 0===j?g===_||s(g,_,n,i,c):j)){b=!1;break}v||(v="constructor"==h)}if(b&&!v){var y=t.constructor,m=e.constructor;y!=m&&"constructor"in t&&"constructor"in e&&!("function"==typeof y&&y instanceof y&&"function"==typeof m&&m instanceof m)&&(b=!1)}return c.delete(t),c.delete(e),b}},528:function(t,e,n){var r=n(529),o=n(531),a=n(381);t.exports=function(t){return r(t,a,o)}},529:function(t,e,n){var r=n(530),o=n(121);t.exports=function(t,e,n){var a=e(t);return o(t)?a:r(a,n(t))}},530:function(t,e){t.exports=function(t,e){for(var n=-1,r=e.length,o=t.length;++n<r;)t[o+n]=e[n];return t}},531:function(t,e,n){var r=n(532),o=n(533),a=Object.prototype.propertyIsEnumerable,i=Object.getOwnPropertySymbols,s=i?function(t){return null==t?[]:(t=Object(t),r(i(t),(function(e){return a.call(t,e)})))}:o;t.exports=s},532:function(t,e){t.exports=function(t,e){for(var n=-1,r=null==t?0:t.length,o=0,a=[];++n<r;){var i=t[n];e(i,n,t)&&(a[o++]=i)}return a}},533:function(t,e){t.exports=function(){return[]}},534:function(t,e,n){var r=n(535),o=n(326),a=n(536),i=n(537),s=n(538),c=n(157),u=n(411),p=u(r),f=u(o),l=u(a),h=u(i),d=u(s),b=c;(r&&"[object DataView]"!=b(new r(new ArrayBuffer(1)))||o&&"[object Map]"!=b(new o)||a&&"[object Promise]"!=b(a.resolve())||i&&"[object Set]"!=b(new i)||s&&"[object WeakMap]"!=b(new s))&&(b=function(t){var e=c(t),n="[object Object]"==e?t.constructor:void 0,r=n?u(n):"";if(r)switch(r){case p:return"[object DataView]";case f:return"[object Map]";case l:return"[object Promise]";case h:return"[object Set]";case d:return"[object WeakMap]"}return e}),t.exports=b},535:function(t,e,n){var r=n(156)(n(80),"DataView");t.exports=r},536:function(t,e,n){var r=n(156)(n(80),"Promise");t.exports=r},537:function(t,e,n){var r=n(156)(n(80),"Set");t.exports=r},538:function(t,e,n){var r=n(156)(n(80),"WeakMap");t.exports=r},850:function(t,e,n){"use strict";n.r(e),n.d(e,"default",(function(){return z}));var r,o=n(0),a=n(2),i=(n(9),n(6),n(8)),s=n(1),c=n(1148),u=n.n(c),p=n(3),f=n.n(p),l=n(15),h=n(1063),d=n(762),b=n(759),v=n(7),g=n(307),_=n.n(g),j=n(1176);var y,m=Object(v.f)({placeholder:{id:"hashtag.column_settings.select.placeholder",defaultMessage:"Enter hashtags…"},noOptions:{id:"hashtag.column_settings.select.no_options_message",defaultMessage:"No suggestions found"}}),O=Object(v.g)(r=function(t){Object(i.a)(n,t);var e;e=n;function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return e=t.call.apply(t,[this].concat(r))||this,Object(s.a)(Object(a.a)(e),"state",{open:e.hasTags()}),Object(s.a)(Object(a.a)(e),"onSelect",(function(t){return function(n){return e.props.onChange(["tags",t],n)}})),Object(s.a)(Object(a.a)(e),"onToggle",(function(){e.state.open&&e.hasTags()&&e.props.onChange("tags",{}),e.setState({open:!e.state.open})})),Object(s.a)(Object(a.a)(e),"noOptionsMessage",(function(){return e.props.intl.formatMessage(m.noOptions)})),e}var r=n.prototype;return r.hasTags=function(){var t=this;return["all","any","none"].map((function(e){return t.tags(e).length>0})).includes(!0)},r.tags=function(t){var e=this.props.settings.getIn(["tags",t])||[];return e.toJSON?e.toJSON():e},r.modeSelect=function(t){return Object(o.a)("div",{className:"column-settings__row"},void 0,Object(o.a)("span",{className:"column-settings__section"},void 0,this.modeLabel(t)),Object(o.a)(j.a,{isMulti:!0,autoFocus:!0,value:this.tags(t),onChange:this.onSelect(t),loadOptions:this.props.onLoad,className:"column-select__container",classNamePrefix:"column-select",name:"tags",placeholder:this.props.intl.formatMessage(m.placeholder),noOptionsMessage:this.noOptionsMessage}))},r.modeLabel=function(t){switch(t){case"any":return Object(o.a)(v.b,{id:"hashtag.column_settings.tag_mode.any",defaultMessage:"Any of these"});case"all":return Object(o.a)(v.b,{id:"hashtag.column_settings.tag_mode.all",defaultMessage:"All of these"});case"none":return Object(o.a)(v.b,{id:"hashtag.column_settings.tag_mode.none",defaultMessage:"None of these"});default:return""}},r.render=function(){return Object(o.a)("div",{},void 0,Object(o.a)("div",{className:"column-settings__row"},void 0,Object(o.a)("div",{className:"setting-toggle"},void 0,Object(o.a)(_.a,{id:"hashtag.column_settings.tag_toggle",onChange:this.onToggle,checked:this.state.open}),Object(o.a)("span",{className:"setting-toggle__label"},void 0,Object(o.a)(v.b,{id:"hashtag.column_settings.tag_toggle",defaultMessage:"Include additional tags in this column"})))),this.state.open&&Object(o.a)("div",{className:"column-settings__hashtags"},void 0,this.modeSelect("any"),this.modeSelect("all"),this.modeSelect("none")))},n}(f.a.PureComponent))||r,x=n(253),w=n(12),M=Object(l.connect)((function(t,e){var n=e.columnId,r=t.getIn(["settings","columns"]),o=r.findIndex((function(t){return t.get("uuid")===n}));return n&&o>=0?{settings:r.get(o).get("params")}:{}}),(function(t,e){var n=e.columnId;return{onChange:function(e,r){t(Object(x.f)(n,e,r))},onLoad:function(t){return Object(w.a)().get("/api/v2/search",{params:{q:t,type:"hashtags"}}).then((function(t){return(t.data.hashtags||[]).map((function(t){return{value:t.name,label:"#"+t.name}}))}))}}}))(O),A=n(36),S=n(766);var z=Object(l.connect)((function(t,e){return{hasUnread:t.getIn(["timelines","hashtag:"+e.params.id,"unread"])>0}}))(y=function(t){Object(i.a)(n,t);var e;e=n;function n(){for(var e,n=arguments.length,r=new Array(n),i=0;i<n;i++)r[i]=arguments[i];return e=t.call.apply(t,[this].concat(r))||this,Object(s.a)(Object(a.a)(e),"disconnects",[]),Object(s.a)(Object(a.a)(e),"handlePin",(function(){var t=e.props,n=t.columnId,r=t.dispatch;r(n?Object(x.h)(n):Object(x.e)("HASHTAG",{id:e.props.params.id}))})),Object(s.a)(Object(a.a)(e),"title",(function(){var t=[e.props.params.id];return e.additionalFor("any")&&t.push(" ",Object(o.a)(v.b,{id:"hashtag.column_header.tag_mode.any",values:{additional:e.additionalFor("any")},defaultMessage:"or {additional}"},"any")),e.additionalFor("all")&&t.push(" ",Object(o.a)(v.b,{id:"hashtag.column_header.tag_mode.all",values:{additional:e.additionalFor("all")},defaultMessage:"and {additional}"},"all")),e.additionalFor("none")&&t.push(" ",Object(o.a)(v.b,{id:"hashtag.column_header.tag_mode.none",values:{additional:e.additionalFor("none")},defaultMessage:"without {additional}"},"none")),t})),Object(s.a)(Object(a.a)(e),"additionalFor",(function(t){var n=e.props.params.tags;return n&&(n[t]||[]).length>0?n[t].map((function(t){return t.value})).join("/"):""})),Object(s.a)(Object(a.a)(e),"handleMove",(function(t){var n=e.props,r=n.columnId;(0,n.dispatch)(Object(x.g)(r,t))})),Object(s.a)(Object(a.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(s.a)(Object(a.a)(e),"setRef",(function(t){e.column=t})),Object(s.a)(Object(a.a)(e),"handleLoadMore",(function(t){var n=e.props.params,r=n.id,o=n.tags;e.props.dispatch(Object(A.s)(r,{maxId:t,tags:o}))})),e}var r=n.prototype;return r._subscribe=function(t,e,n){var r=this;void 0===n&&(n={});var o=(n.any||[]).map((function(t){return t.value})),a=(n.all||[]).map((function(t){return t.value})),i=(n.none||[]).map((function(t){return t.value}));[e].concat(o).map((function(n){r.disconnects.push(t(Object(S.c)(e,n,(function(t){var e=t.tags.map((function(t){return t.name}));return a.filter((function(t){return e.includes(t)})).length===a.length&&0===i.filter((function(t){return e.includes(t)})).length}))))}))},r._unsubscribe=function(){this.disconnects.map((function(t){return t()})),this.disconnects=[]},r.componentDidMount=function(){var t=this.props.dispatch,e=this.props.params,n=e.id,r=e.tags;this._subscribe(t,n,r),t(Object(A.s)(n,{tags:r}))},r.componentWillReceiveProps=function(t){var e=this.props,n=e.dispatch,r=e.params,o=t.params,a=o.id,i=o.tags;a===r.id&&u()(i,r.tags)||(this._unsubscribe(),this._subscribe(n,a,i),this.props.dispatch(Object(A.k)("hashtag:"+a)),this.props.dispatch(Object(A.s)(a,{tags:i})))},r.componentWillUnmount=function(){this._unsubscribe()},r.render=function(){var t=this.props,e=t.shouldUpdateScroll,n=t.hasUnread,r=t.columnId,a=t.multiColumn,i=this.props.params.id,s=!!r;return f.a.createElement(d.a,{bindToDocument:!a,ref:this.setRef,label:"#"+i},Object(o.a)(b.a,{icon:"hashtag",active:n,title:this.title(),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:s,multiColumn:a,showBackButton:!0},void 0,r&&Object(o.a)(M,{columnId:r})),Object(o.a)(h.a,{trackScroll:!s,scrollKey:"hashtag_timeline-"+r,timelineId:"hashtag:"+i,onLoadMore:this.handleLoadMore,emptyMessage:Object(o.a)(v.b,{id:"empty_column.hashtag",defaultMessage:"There is nothing in this hashtag yet."}),shouldUpdateScroll:e,bindToDocument:!a}))},n}(f.a.PureComponent))||y}}]);
//# sourceMappingURL=hashtag_timeline.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/hashtag_timeline.js.map b/priv/static/packs/features/hashtag_timeline.js.map
index 909563919..3bd79924b 100644
--- a/priv/static/packs/features/hashtag_timeline.js.map
+++ b/priv/static/packs/features/hashtag_timeline.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///./node_modules/lodash/isArray.js","webpack:///./node_modules/lodash/_getNative.js","webpack:///./node_modules/lodash/_ListCache.js","webpack:///./node_modules/lodash/_assocIndexOf.js","webpack:///./node_modules/lodash/_nativeCreate.js","webpack:///./node_modules/lodash/_getMapData.js","webpack:///./node_modules/lodash/_Map.js","webpack:///./node_modules/lodash/isLength.js","webpack:///./node_modules/lodash/_MapCache.js","webpack:///./node_modules/lodash/keys.js","webpack:///./node_modules/lodash/isFunction.js","webpack:///./node_modules/lodash/_toSource.js","webpack:///./node_modules/lodash/isBuffer.js","webpack:///./node_modules/lodash/isTypedArray.js","webpack:///./node_modules/lodash/eq.js","webpack:///./node_modules/lodash/_equalArrays.js","webpack:///./node_modules/lodash/isArguments.js","webpack:///./node_modules/lodash/_isIndex.js","webpack:///./node_modules/lodash/_Stack.js","webpack:///./node_modules/lodash/_baseIsEqual.js","webpack:///./node_modules/lodash/_baseIsNative.js","webpack:///./node_modules/lodash/_isMasked.js","webpack:///./node_modules/lodash/_coreJsData.js","webpack:///./node_modules/lodash/_getValue.js","webpack:///./node_modules/lodash/_arrayLikeKeys.js","webpack:///./node_modules/lodash/_baseTimes.js","webpack:///./node_modules/lodash/_baseIsArguments.js","webpack:///./node_modules/lodash/stubFalse.js","webpack:///./node_modules/lodash/_baseIsTypedArray.js","webpack:///./node_modules/lodash/_baseUnary.js","webpack:///./node_modules/lodash/_nodeUtil.js","webpack:///./node_modules/lodash/_baseKeys.js","webpack:///./node_modules/lodash/_isPrototype.js","webpack:///./node_modules/lodash/_nativeKeys.js","webpack:///./node_modules/lodash/_overArg.js","webpack:///./node_modules/lodash/isArrayLike.js","webpack:///./node_modules/lodash/_listCacheClear.js","webpack:///./node_modules/lodash/_listCacheDelete.js","webpack:///./node_modules/lodash/_listCacheGet.js","webpack:///./node_modules/lodash/_listCacheHas.js","webpack:///./node_modules/lodash/_listCacheSet.js","webpack:///./node_modules/lodash/_stackClear.js","webpack:///./node_modules/lodash/_stackDelete.js","webpack:///./node_modules/lodash/_stackGet.js","webpack:///./node_modules/lodash/_stackHas.js","webpack:///./node_modules/lodash/_stackSet.js","webpack:///./node_modules/lodash/_mapCacheClear.js","webpack:///./node_modules/lodash/_Hash.js","webpack:///./node_modules/lodash/_hashClear.js","webpack:///./node_modules/lodash/_hashDelete.js","webpack:///./node_modules/lodash/_hashGet.js","webpack:///./node_modules/lodash/_hashHas.js","webpack:///./node_modules/lodash/_hashSet.js","webpack:///./node_modules/lodash/_mapCacheDelete.js","webpack:///./node_modules/lodash/_isKeyable.js","webpack:///./node_modules/lodash/_mapCacheGet.js","webpack:///./node_modules/lodash/_mapCacheHas.js","webpack:///./node_modules/lodash/_mapCacheSet.js","webpack:///./node_modules/lodash/_baseIsEqualDeep.js","webpack:///./node_modules/lodash/_SetCache.js","webpack:///./node_modules/lodash/_setCacheAdd.js","webpack:///./node_modules/lodash/_setCacheHas.js","webpack:///./node_modules/lodash/_arraySome.js","webpack:///./node_modules/lodash/_cacheHas.js","webpack:///./node_modules/lodash/_equalByTag.js","webpack:///./node_modules/lodash/_Uint8Array.js","webpack:///./node_modules/lodash/_mapToArray.js","webpack:///./node_modules/lodash/_setToArray.js","webpack:///./node_modules/lodash/_equalObjects.js","webpack:///./node_modules/lodash/_getAllKeys.js","webpack:///./node_modules/lodash/_baseGetAllKeys.js","webpack:///./node_modules/lodash/_arrayPush.js","webpack:///./node_modules/lodash/_getSymbols.js","webpack:///./node_modules/lodash/_arrayFilter.js","webpack:///./node_modules/lodash/stubArray.js","webpack:///./node_modules/lodash/_getTag.js","webpack:///./node_modules/lodash/_DataView.js","webpack:///./node_modules/lodash/_Promise.js","webpack:///./node_modules/lodash/_Set.js","webpack:///./node_modules/lodash/_WeakMap.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/hashtag_timeline/index.js"],"names":["isArray","Array","module","exports","baseIsNative","getValue","object","key","value","undefined","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","entries","index","length","this","clear","entry","set","prototype","get","has","eq","array","nativeCreate","getNative","Object","isKeyable","map","data","__data__","Map","MAX_SAFE_INTEGER","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","arrayLikeKeys","baseKeys","isArrayLike","baseGetTag","isObject","asyncTag","funcTag","genTag","proxyTag","tag","funcToString","Function","toString","func","call","e","stubFalse","freeExports","nodeType","freeModule","Buffer","root","isBuffer","baseIsTypedArray","baseUnary","nodeUtil","nodeIsTypedArray","isTypedArray","other","SetCache","arraySome","cacheHas","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","bitmask","customizer","equalFunc","stack","isPartial","arrLength","othLength","stacked","result","seen","arrValue","othValue","compared","othIndex","push","baseIsArguments","isObjectLike","objectProto","hasOwnProperty","propertyIsEnumerable","isArguments","arguments","reIsUint","type","test","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","size","baseIsEqualDeep","baseIsEqual","isFunction","isMasked","toSource","reIsHostCtor","funcProto","reIsNative","RegExp","replace","uid","coreJsData","maskSrcKey","exec","keys","IE_PROTO","baseTimes","isIndex","inherited","isArr","isArg","isBuff","isType","skipIndexes","String","n","iteratee","argsTag","isLength","typedArrayTags","freeProcess","freeGlobal","process","types","require","binding","isPrototype","nativeKeys","Ctor","constructor","overArg","transform","arg","assocIndexOf","splice","pop","LARGE_ARRAY_SIZE","pairs","Hash","hashClear","hashDelete","hashGet","hashHas","hashSet","HASH_UNDEFINED","getMapData","equalArrays","equalByTag","equalObjects","getTag","arrayTag","objectTag","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","setCacheAdd","setCacheHas","values","add","predicate","cache","Symbol","Uint8Array","mapToArray","setToArray","boolTag","dateTag","errorTag","mapTag","numberTag","regexpTag","setTag","stringTag","symbolTag","arrayBufferTag","dataViewTag","symbolProto","symbolValueOf","valueOf","byteLength","byteOffset","buffer","name","message","convert","forEach","getAllKeys","objProps","objLength","skipCtor","objValue","objCtor","othCtor","baseGetAllKeys","getSymbols","arrayPush","keysFunc","symbolsFunc","offset","arrayFilter","stubArray","nativeGetSymbols","getOwnPropertySymbols","symbol","resIndex","DataView","Promise","Set","WeakMap","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","ctorString","messages","defineMessages","placeholder","noOptions","ColumnSettings","injectIntl","open","hasTags","mode","props","onChange","state","setState","intl","formatMessage","tags","includes","settings","getIn","toJSON","modeSelect","className","modeLabel","isMulti","autoFocus","onSelect","loadOptions","onLoad","classNamePrefix","noOptionsMessage","id","defaultMessage","render","onToggle","checked","React","PureComponent","connect","columnId","columns","findIndex","c","dispatch","changeColumnParams","api","params","q","then","response","hashtags","label","HashtagTimeline","hasUnread","removeColumn","addColumn","title","additionalFor","additional","join","dir","moveColumn","column","scrollTop","maxId","expandHashtagTimeline","_subscribe","any","all","none","disconnects","connectHashtagStream","status","filter","_unsubscribe","disconnect","componentDidMount","componentWillReceiveProps","nextProps","clearTimeline","componentWillUnmount","shouldUpdateScroll","multiColumn","pinned","bindToDocument","ref","setRef","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","showBackButton","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage"],"mappings":"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","file":"features/hashtag_timeline.js","sourcesContent":["/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\nmodule.exports = isArray;","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n\n\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n} // Add methods to `ListCache`.\n\n\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\nmodule.exports = ListCache;","var eq = require('./eq');\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n\n\nfunction assocIndexOf(array, key) {\n var length = array.length;\n\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n\n return -1;\n}\n\nmodule.exports = assocIndexOf;","var getNative = require('./_getNative');\n/* Built-in method references that are verified to be native. */\n\n\nvar nativeCreate = getNative(Object, 'create');\nmodule.exports = nativeCreate;","var isKeyable = require('./_isKeyable');\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n\n\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;\n}\n\nmodule.exports = getMapData;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar Map = getNative(root, 'Map');\nmodule.exports = Map;","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n} // Add methods to `MapCache`.\n\n\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\nmodule.exports = MapCache;","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n\n\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n/** `Object#toString` result references. */\n\n\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n } // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n\n\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n/** Used to resolve the decompiled source of functions. */\n\nvar funcToString = funcProto.toString;\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n\n try {\n return func + '';\n } catch (e) {}\n }\n\n return '';\n}\n\nmodule.exports = toSource;","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n/** Detect free variable `exports`. */\n\n\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n/** Detect free variable `module`. */\n\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n/** Detect the popular CommonJS extension `module.exports`. */\n\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n/** Built-in value references. */\n\nvar Buffer = moduleExports ? root.Buffer : undefined;\n/* Built-in method references for those with the same name as other `lodash` methods. */\n\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n\nvar isBuffer = nativeIsBuffer || stubFalse;\nmodule.exports = isBuffer;","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n/* Node.js helper references. */\n\n\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\nmodule.exports = isTypedArray;","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || value !== value && other !== other;\n}\n\nmodule.exports = eq;","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n/** Used to compose bitmasks for value comparisons. */\n\n\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n } // Assume cyclic values are equal.\n\n\n var stacked = stack.get(array);\n\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n\n var index = -1,\n result = true,\n seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined;\n stack.set(array, other);\n stack.set(other, array); // Ignore non-index properties.\n\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);\n }\n\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n\n result = false;\n break;\n } // Recursively compare arrays (susceptible to call stack limits).\n\n\n if (seen) {\n if (!arraySome(other, function (othValue, othIndex) {\n if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n result = false;\n break;\n }\n }\n\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/** Built-in value references. */\n\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n\nvar isArguments = baseIsArguments(function () {\n return arguments;\n}()) ? baseIsArguments : function (value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n};\nmodule.exports = isArguments;","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n/** Used to detect unsigned integer values. */\n\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length && (type == 'number' || type != 'symbol' && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;\n}\n\nmodule.exports = isIndex;","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n} // Add methods to `Stack`.\n\n\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\nmodule.exports = Stack;","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n\n\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n\n if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {\n return value !== value && other !== other;\n }\n\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n\n\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n/** Used to detect host constructors (Safari). */\n\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n/** Used for built-in method references. */\n\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n/** Used to resolve the decompiled source of functions. */\n\nvar funcToString = funcProto.toString;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/** Used to detect if a method is native. */\n\nvar reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&').replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$');\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;","var coreJsData = require('./_coreJsData');\n/** Used to detect methods masquerading as native. */\n\n\nvar maskSrcKey = function () {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? 'Symbol(src)_1.' + uid : '';\n}();\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n\n\nfunction isMasked(func) {\n return !!maskSrcKey && maskSrcKey in func;\n}\n\nmodule.exports = isMasked;","var root = require('./_root');\n/** Used to detect overreaching core-js shims. */\n\n\nvar coreJsData = root['__core-js_shared__'];\nmodule.exports = coreJsData;","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers.\n isBuff && (key == 'offset' || key == 'parent') || // PhantomJS 2 has enumerable non-index properties on typed arrays.\n isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset') || // Skip index properties.\n isIndex(key, length)))) {\n result.push(key);\n }\n }\n\n return result;\n}\n\nmodule.exports = arrayLikeKeys;","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n\n return result;\n}\n\nmodule.exports = baseTimes;","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n/** `Object#toString` result references. */\n\n\nvar argsTag = '[object Arguments]';\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n/** `Object#toString` result references. */\n\n\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n/** Used to identify `toStringTag` values of typed arrays. */\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function (value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;","var freeGlobal = require('./_freeGlobal');\n/** Detect free variable `exports`. */\n\n\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n/** Detect free variable `module`. */\n\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n/** Detect the popular CommonJS extension `module.exports`. */\n\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n/** Detect free variable `process` from Node.js. */\n\nvar freeProcess = moduleExports && freeGlobal.process;\n/** Used to access faster Node.js helpers. */\n\nvar nodeUtil = function () {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n } // Legacy `process.binding('util')` for Node.js < 10.\n\n\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}();\n\nmodule.exports = nodeUtil;","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n\n var result = [];\n\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n\n return result;\n}\n\nmodule.exports = baseKeys;","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = typeof Ctor == 'function' && Ctor.prototype || objectProto;\n return value === proto;\n}\n\nmodule.exports = isPrototype;","var overArg = require('./_overArg');\n/* Built-in method references for those with the same name as other `lodash` methods. */\n\n\nvar nativeKeys = overArg(Object.keys, Object);\nmodule.exports = nativeKeys;","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function (arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n\n\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;","var assocIndexOf = require('./_assocIndexOf');\n/** Used for built-in method references. */\n\n\nvar arrayProto = Array.prototype;\n/** Built-in value references. */\n\nvar splice = arrayProto.splice;\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n\n var lastIndex = data.length - 1;\n\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;","var assocIndexOf = require('./_assocIndexOf');\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n\n\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;","var assocIndexOf = require('./_assocIndexOf');\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n\n\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;","var assocIndexOf = require('./_assocIndexOf');\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n\n\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n\n return this;\n}\n\nmodule.exports = listCacheSet;","var ListCache = require('./_ListCache');\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n\n\nfunction stackClear() {\n this.__data__ = new ListCache();\n this.size = 0;\n}\n\nmodule.exports = stackClear;","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n/** Used as the size to enable large array optimizations. */\n\n\nvar LARGE_ARRAY_SIZE = 200;\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n\nfunction stackSet(key, value) {\n var data = this.__data__;\n\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n\n if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n\n data = this.__data__ = new MapCache(pairs);\n }\n\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n\n\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash(),\n 'map': new (Map || ListCache)(),\n 'string': new Hash()\n };\n}\n\nmodule.exports = mapCacheClear;","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n} // Add methods to `Hash`.\n\n\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\nmodule.exports = Hash;","var nativeCreate = require('./_nativeCreate');\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n\n\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;","var nativeCreate = require('./_nativeCreate');\n/** Used to stand-in for `undefined` hash values. */\n\n\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n/** Used for built-in method references. */\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n\nfunction hashGet(key) {\n var data = this.__data__;\n\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;","var nativeCreate = require('./_nativeCreate');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;","var nativeCreate = require('./_nativeCreate');\n/** Used to stand-in for `undefined` hash values. */\n\n\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;","var getMapData = require('./_getMapData');\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n\n\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null;\n}\n\nmodule.exports = isKeyable;","var getMapData = require('./_getMapData');\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n\n\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;","var getMapData = require('./_getMapData');\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n\n\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;","var getMapData = require('./_getMapData');\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n\n\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n/** Used to compose bitmasks for value comparisons. */\n\n\nvar COMPARE_PARTIAL_FLAG = 1;\n/** `Object#toString` result references. */\n\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n/** Used for built-in method references. */\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n\n objIsArr = true;\n objIsObj = false;\n }\n\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack());\n return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n stack || (stack = new Stack());\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n\n if (!isSameTag) {\n return false;\n }\n\n stack || (stack = new Stack());\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n\n\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n this.__data__ = new MapCache();\n\n while (++index < length) {\n this.add(values[index]);\n }\n} // Add methods to `SetCache`.\n\n\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\nmodule.exports = SetCache;","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n\n return this;\n}\n\nmodule.exports = setCacheAdd;","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n\n return false;\n}\n\nmodule.exports = arraySome;","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n/** Used to compose bitmasks for value comparisons. */\n\n\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n/** `Object#toString` result references. */\n\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n/** Used to convert symbols to primitives and strings. */\n\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {\n return false;\n }\n\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == other + '';\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n } // Assume cyclic values are equal.\n\n\n var stacked = stack.get(object);\n\n if (stacked) {\n return stacked == other;\n }\n\n bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits).\n\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n\n }\n\n return false;\n}\n\nmodule.exports = equalByTag;","var root = require('./_root');\n/** Built-in value references. */\n\n\nvar Uint8Array = root.Uint8Array;\nmodule.exports = Uint8Array;","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n map.forEach(function (value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n set.forEach(function (value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;","var getAllKeys = require('./_getAllKeys');\n/** Used to compose bitmasks for value comparisons. */\n\n\nvar COMPARE_PARTIAL_FLAG = 1;\n/** Used for built-in method references. */\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n\n var index = objLength;\n\n while (index--) {\n var key = objProps[index];\n\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n } // Assume cyclic values are equal.\n\n\n var stacked = stack.get(object);\n\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n var skipCtor = isPartial;\n\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);\n } // Recursively compare objects (susceptible to call stack limits).\n\n\n if (!(compared === undefined ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {\n result = false;\n break;\n }\n\n skipCtor || (skipCtor = key == 'constructor');\n }\n\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal.\n\n if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n\n\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n\n\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n\n return array;\n}\n\nmodule.exports = arrayPush;","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Built-in value references. */\n\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n/* Built-in method references for those with the same name as other `lodash` methods. */\n\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n\nvar getSymbols = !nativeGetSymbols ? stubArray : function (object) {\n if (object == null) {\n return [];\n }\n\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function (symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\nmodule.exports = getSymbols;","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n\n return result;\n}\n\nmodule.exports = arrayFilter;","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n/** `Object#toString` result references. */\n\n\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\nvar dataViewTag = '[object DataView]';\n/** Used to detect maps, sets, and weakmaps. */\n\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n\nvar getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n\nif (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise && getTag(Promise.resolve()) != promiseTag || Set && getTag(new Set()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {\n getTag = function getTag(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString:\n return dataViewTag;\n\n case mapCtorString:\n return mapTag;\n\n case promiseCtorString:\n return promiseTag;\n\n case setCtorString:\n return setTag;\n\n case weakMapCtorString:\n return weakMapTag;\n }\n }\n\n return result;\n };\n}\n\nmodule.exports = getTag;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar DataView = getNative(root, 'DataView');\nmodule.exports = DataView;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar Promise = getNative(root, 'Promise');\nmodule.exports = Promise;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar Set = getNative(root, 'Set');\nmodule.exports = Set;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar WeakMap = getNative(root, 'WeakMap');\nmodule.exports = WeakMap;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Toggle from 'react-toggle';\nimport AsyncSelect from 'react-select/async';\n\nconst messages = defineMessages({\n placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },\n noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' },\n});\n\nexport default @injectIntl\nclass ColumnSettings extends React.PureComponent {\n\n static propTypes = {\n settings: ImmutablePropTypes.map.isRequired,\n onChange: PropTypes.func.isRequired,\n onLoad: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n state = {\n open: this.hasTags(),\n };\n\n hasTags () {\n return ['all', 'any', 'none'].map(mode => this.tags(mode).length > 0).includes(true);\n }\n\n tags (mode) {\n let tags = this.props.settings.getIn(['tags', mode]) || [];\n\n if (tags.toJSON) {\n return tags.toJSON();\n } else {\n return tags;\n }\n };\n\n onSelect = mode => value => this.props.onChange(['tags', mode], value);\n\n onToggle = () => {\n if (this.state.open && this.hasTags()) {\n this.props.onChange('tags', {});\n }\n\n this.setState({ open: !this.state.open });\n };\n\n noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions);\n\n modeSelect (mode) {\n return (\n <div className='column-settings__row'>\n <span className='column-settings__section'>\n {this.modeLabel(mode)}\n </span>\n\n <AsyncSelect\n isMulti\n autoFocus\n value={this.tags(mode)}\n onChange={this.onSelect(mode)}\n loadOptions={this.props.onLoad}\n className='column-select__container'\n classNamePrefix='column-select'\n name='tags'\n placeholder={this.props.intl.formatMessage(messages.placeholder)}\n noOptionsMessage={this.noOptionsMessage}\n />\n </div>\n );\n }\n\n modeLabel (mode) {\n switch(mode) {\n case 'any':\n return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;\n case 'all':\n return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;\n case 'none':\n return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;\n default:\n return '';\n }\n };\n\n render () {\n return (\n <div>\n <div className='column-settings__row'>\n <div className='setting-toggle'>\n <Toggle id='hashtag.column_settings.tag_toggle' onChange={this.onToggle} checked={this.state.open} />\n\n <span className='setting-toggle__label'>\n <FormattedMessage id='hashtag.column_settings.tag_toggle' defaultMessage='Include additional tags in this column' />\n </span>\n </div>\n </div>\n\n {this.state.open && (\n <div className='column-settings__hashtags'>\n {this.modeSelect('any')}\n {this.modeSelect('all')}\n {this.modeSelect('none')}\n </div>\n )}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ColumnSettings from '../components/column_settings';\nimport { changeColumnParams } from '../../../actions/columns';\nimport api from '../../../api';\n\nconst mapStateToProps = (state, { columnId }) => {\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === columnId);\n\n if (!(columnId && index >= 0)) {\n return {};\n }\n\n return { settings: columns.get(index).get('params') };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => ({\n onChange (key, value) {\n dispatch(changeColumnParams(columnId, key, value));\n },\n\n onLoad (value) {\n return api().get('/api/v2/search', { params: { q: value, type: 'hashtags' } }).then(response => {\n return (response.data.hashtags || []).map((tag) => {\n return { value: tag.name, label: `#${tag.name}` };\n });\n });\n },\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { expandHashtagTimeline, clearTimeline } from '../../actions/timelines';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { FormattedMessage } from 'react-intl';\nimport { connectHashtagStream } from '../../actions/streaming';\nimport { isEqual } from 'lodash';\n\nconst mapStateToProps = (state, props) => ({\n hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0,\n});\n\nexport default @connect(mapStateToProps)\nclass HashtagTimeline extends React.PureComponent {\n\n disconnects = [];\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n columnId: PropTypes.string,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n hasUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('HASHTAG', { id: this.props.params.id }));\n }\n }\n\n title = () => {\n let title = [this.props.params.id];\n\n if (this.additionalFor('any')) {\n title.push(' ', <FormattedMessage key='any' id='hashtag.column_header.tag_mode.any' values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />);\n }\n\n if (this.additionalFor('all')) {\n title.push(' ', <FormattedMessage key='all' id='hashtag.column_header.tag_mode.all' values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />);\n }\n\n if (this.additionalFor('none')) {\n title.push(' ', <FormattedMessage key='none' id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />);\n }\n\n return title;\n }\n\n additionalFor = (mode) => {\n const { tags } = this.props.params;\n\n if (tags && (tags[mode] || []).length > 0) {\n return tags[mode].map(tag => tag.value).join('/');\n } else {\n return '';\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n _subscribe (dispatch, id, tags = {}) {\n let any = (tags.any || []).map(tag => tag.value);\n let all = (tags.all || []).map(tag => tag.value);\n let none = (tags.none || []).map(tag => tag.value);\n\n [id, ...any].map(tag => {\n this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => {\n let tags = status.tags.map(tag => tag.name);\n\n return all.filter(tag => tags.includes(tag)).length === all.length &&\n none.filter(tag => tags.includes(tag)).length === 0;\n })));\n });\n }\n\n _unsubscribe () {\n this.disconnects.map(disconnect => disconnect());\n this.disconnects = [];\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n const { id, tags } = this.props.params;\n\n this._subscribe(dispatch, id, tags);\n dispatch(expandHashtagTimeline(id, { tags }));\n }\n\n componentWillReceiveProps (nextProps) {\n const { dispatch, params } = this.props;\n const { id, tags } = nextProps.params;\n\n if (id !== params.id || !isEqual(tags, params.tags)) {\n this._unsubscribe();\n this._subscribe(dispatch, id, tags);\n this.props.dispatch(clearTimeline(`hashtag:${id}`));\n this.props.dispatch(expandHashtagTimeline(id, { tags }));\n }\n }\n\n componentWillUnmount () {\n this._unsubscribe();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n const { id, tags } = this.props.params;\n this.props.dispatch(expandHashtagTimeline(id, { maxId, tags }));\n }\n\n render () {\n const { shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props;\n const { id } = this.props.params;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={`#${id}`}>\n <ColumnHeader\n icon='hashtag'\n active={hasUnread}\n title={this.title()}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n showBackButton\n >\n {columnId && <ColumnSettingsContainer columnId={columnId} />}\n </ColumnHeader>\n\n <StatusListContainer\n trackScroll={!pinned}\n scrollKey={`hashtag_timeline-${columnId}`}\n timelineId={`hashtag:${id}`}\n onLoadMore={this.handleLoadMore}\n emptyMessage={<FormattedMessage id='empty_column.hashtag' defaultMessage='There is nothing in this hashtag yet.' />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///./node_modules/lodash/isArray.js","webpack:///./node_modules/lodash/_getNative.js","webpack:///./node_modules/lodash/_ListCache.js","webpack:///./node_modules/lodash/_assocIndexOf.js","webpack:///./node_modules/lodash/_nativeCreate.js","webpack:///./node_modules/lodash/_getMapData.js","webpack:///./node_modules/lodash/_Map.js","webpack:///./node_modules/lodash/isLength.js","webpack:///./node_modules/lodash/_MapCache.js","webpack:///./node_modules/lodash/keys.js","webpack:///./node_modules/lodash/isFunction.js","webpack:///./node_modules/lodash/_toSource.js","webpack:///./node_modules/lodash/isBuffer.js","webpack:///./node_modules/lodash/isTypedArray.js","webpack:///./node_modules/lodash/eq.js","webpack:///./node_modules/lodash/_equalArrays.js","webpack:///./node_modules/lodash/isArguments.js","webpack:///./node_modules/lodash/_isIndex.js","webpack:///./node_modules/lodash/_Stack.js","webpack:///./node_modules/lodash/_baseIsEqual.js","webpack:///./node_modules/lodash/_baseIsNative.js","webpack:///./node_modules/lodash/_isMasked.js","webpack:///./node_modules/lodash/_coreJsData.js","webpack:///./node_modules/lodash/_getValue.js","webpack:///./node_modules/lodash/_arrayLikeKeys.js","webpack:///./node_modules/lodash/_baseTimes.js","webpack:///./node_modules/lodash/_baseIsArguments.js","webpack:///./node_modules/lodash/stubFalse.js","webpack:///./node_modules/lodash/_baseIsTypedArray.js","webpack:///./node_modules/lodash/_baseUnary.js","webpack:///./node_modules/lodash/_nodeUtil.js","webpack:///./node_modules/lodash/_baseKeys.js","webpack:///./node_modules/lodash/_isPrototype.js","webpack:///./node_modules/lodash/_nativeKeys.js","webpack:///./node_modules/lodash/_overArg.js","webpack:///./node_modules/lodash/isArrayLike.js","webpack:///./node_modules/lodash/_listCacheClear.js","webpack:///./node_modules/lodash/_listCacheDelete.js","webpack:///./node_modules/lodash/_listCacheGet.js","webpack:///./node_modules/lodash/_listCacheHas.js","webpack:///./node_modules/lodash/_listCacheSet.js","webpack:///./node_modules/lodash/_stackClear.js","webpack:///./node_modules/lodash/_stackDelete.js","webpack:///./node_modules/lodash/_stackGet.js","webpack:///./node_modules/lodash/_stackHas.js","webpack:///./node_modules/lodash/_stackSet.js","webpack:///./node_modules/lodash/_mapCacheClear.js","webpack:///./node_modules/lodash/_Hash.js","webpack:///./node_modules/lodash/_hashClear.js","webpack:///./node_modules/lodash/_hashDelete.js","webpack:///./node_modules/lodash/_hashGet.js","webpack:///./node_modules/lodash/_hashHas.js","webpack:///./node_modules/lodash/_hashSet.js","webpack:///./node_modules/lodash/_mapCacheDelete.js","webpack:///./node_modules/lodash/_isKeyable.js","webpack:///./node_modules/lodash/_mapCacheGet.js","webpack:///./node_modules/lodash/_mapCacheHas.js","webpack:///./node_modules/lodash/_mapCacheSet.js","webpack:///./node_modules/lodash/_baseIsEqualDeep.js","webpack:///./node_modules/lodash/_SetCache.js","webpack:///./node_modules/lodash/_setCacheAdd.js","webpack:///./node_modules/lodash/_setCacheHas.js","webpack:///./node_modules/lodash/_arraySome.js","webpack:///./node_modules/lodash/_cacheHas.js","webpack:///./node_modules/lodash/_equalByTag.js","webpack:///./node_modules/lodash/_Uint8Array.js","webpack:///./node_modules/lodash/_mapToArray.js","webpack:///./node_modules/lodash/_setToArray.js","webpack:///./node_modules/lodash/_equalObjects.js","webpack:///./node_modules/lodash/_getAllKeys.js","webpack:///./node_modules/lodash/_baseGetAllKeys.js","webpack:///./node_modules/lodash/_arrayPush.js","webpack:///./node_modules/lodash/_getSymbols.js","webpack:///./node_modules/lodash/_arrayFilter.js","webpack:///./node_modules/lodash/stubArray.js","webpack:///./node_modules/lodash/_getTag.js","webpack:///./node_modules/lodash/_DataView.js","webpack:///./node_modules/lodash/_Promise.js","webpack:///./node_modules/lodash/_Set.js","webpack:///./node_modules/lodash/_WeakMap.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/hashtag_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/hashtag_timeline/index.js"],"names":["isArray","Array","module","exports","baseIsNative","getValue","object","key","value","undefined","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","entries","index","length","this","clear","entry","set","prototype","get","has","eq","array","nativeCreate","getNative","Object","isKeyable","map","data","__data__","Map","MAX_SAFE_INTEGER","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","arrayLikeKeys","baseKeys","isArrayLike","baseGetTag","isObject","asyncTag","funcTag","genTag","proxyTag","tag","funcToString","Function","toString","func","call","e","stubFalse","freeExports","nodeType","freeModule","Buffer","root","isBuffer","baseIsTypedArray","baseUnary","nodeUtil","nodeIsTypedArray","isTypedArray","other","SetCache","arraySome","cacheHas","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","bitmask","customizer","equalFunc","stack","isPartial","arrLength","othLength","stacked","result","seen","arrValue","othValue","compared","othIndex","push","baseIsArguments","isObjectLike","objectProto","hasOwnProperty","propertyIsEnumerable","isArguments","arguments","reIsUint","type","test","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","size","baseIsEqualDeep","baseIsEqual","isFunction","isMasked","toSource","reIsHostCtor","funcProto","reIsNative","RegExp","replace","uid","coreJsData","maskSrcKey","exec","keys","IE_PROTO","baseTimes","isIndex","inherited","isArr","isArg","isBuff","isType","skipIndexes","String","n","iteratee","argsTag","isLength","typedArrayTags","freeProcess","freeGlobal","process","types","require","binding","isPrototype","nativeKeys","Ctor","constructor","overArg","transform","arg","assocIndexOf","splice","pop","LARGE_ARRAY_SIZE","pairs","Hash","hashClear","hashDelete","hashGet","hashHas","hashSet","HASH_UNDEFINED","getMapData","equalArrays","equalByTag","equalObjects","getTag","arrayTag","objectTag","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","setCacheAdd","setCacheHas","values","add","predicate","cache","Symbol","Uint8Array","mapToArray","setToArray","boolTag","dateTag","errorTag","mapTag","numberTag","regexpTag","setTag","stringTag","symbolTag","arrayBufferTag","dataViewTag","symbolProto","symbolValueOf","valueOf","byteLength","byteOffset","buffer","name","message","convert","forEach","getAllKeys","objProps","objLength","skipCtor","objValue","objCtor","othCtor","baseGetAllKeys","getSymbols","arrayPush","keysFunc","symbolsFunc","offset","arrayFilter","stubArray","nativeGetSymbols","getOwnPropertySymbols","symbol","resIndex","DataView","Promise","Set","WeakMap","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","ctorString","messages","defineMessages","placeholder","noOptions","ColumnSettings","injectIntl","open","hasTags","mode","props","onChange","state","setState","intl","formatMessage","tags","includes","settings","getIn","toJSON","modeSelect","className","modeLabel","isMulti","autoFocus","onSelect","loadOptions","onLoad","classNamePrefix","noOptionsMessage","id","defaultMessage","render","onToggle","checked","React","PureComponent","connect","columnId","columns","findIndex","c","dispatch","changeColumnParams","api","params","q","then","response","hashtags","label","HashtagTimeline","hasUnread","removeColumn","addColumn","title","additionalFor","additional","join","dir","moveColumn","column","scrollTop","maxId","expandHashtagTimeline","_subscribe","any","all","none","disconnects","connectHashtagStream","status","filter","_unsubscribe","disconnect","componentDidMount","componentWillReceiveProps","nextProps","clearTimeline","componentWillUnmount","shouldUpdateScroll","multiColumn","pinned","bindToDocument","ref","setRef","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","showBackButton","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage"],"mappings":"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","file":"features/hashtag_timeline.js","sourcesContent":["/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\nmodule.exports = isArray;","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\n\n\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n} // Add methods to `ListCache`.\n\n\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\nmodule.exports = ListCache;","var eq = require('./eq');\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\n\n\nfunction assocIndexOf(array, key) {\n var length = array.length;\n\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n\n return -1;\n}\n\nmodule.exports = assocIndexOf;","var getNative = require('./_getNative');\n/* Built-in method references that are verified to be native. */\n\n\nvar nativeCreate = getNative(Object, 'create');\nmodule.exports = nativeCreate;","var isKeyable = require('./_isKeyable');\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\n\n\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;\n}\n\nmodule.exports = getMapData;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar Map = getNative(root, 'Map');\nmodule.exports = Map;","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\n\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n} // Add methods to `MapCache`.\n\n\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\nmodule.exports = MapCache;","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\n\n\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n/** `Object#toString` result references. */\n\n\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\n\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n } // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n\n\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n/** Used to resolve the decompiled source of functions. */\n\nvar funcToString = funcProto.toString;\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\n\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n\n try {\n return func + '';\n } catch (e) {}\n }\n\n return '';\n}\n\nmodule.exports = toSource;","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n/** Detect free variable `exports`. */\n\n\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n/** Detect free variable `module`. */\n\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n/** Detect the popular CommonJS extension `module.exports`. */\n\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n/** Built-in value references. */\n\nvar Buffer = moduleExports ? root.Buffer : undefined;\n/* Built-in method references for those with the same name as other `lodash` methods. */\n\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\n\nvar isBuffer = nativeIsBuffer || stubFalse;\nmodule.exports = isBuffer;","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n/* Node.js helper references. */\n\n\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\n\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\nmodule.exports = isTypedArray;","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || value !== value && other !== other;\n}\n\nmodule.exports = eq;","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n/** Used to compose bitmasks for value comparisons. */\n\n\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\n\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n } // Assume cyclic values are equal.\n\n\n var stacked = stack.get(array);\n\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n\n var index = -1,\n result = true,\n seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined;\n stack.set(array, other);\n stack.set(other, array); // Ignore non-index properties.\n\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);\n }\n\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n\n result = false;\n break;\n } // Recursively compare arrays (susceptible to call stack limits).\n\n\n if (seen) {\n if (!arraySome(other, function (othValue, othIndex) {\n if (!cacheHas(seen, othIndex) && (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n result = false;\n break;\n }\n }\n\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/** Built-in value references. */\n\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\n\nvar isArguments = baseIsArguments(function () {\n return arguments;\n}()) ? baseIsArguments : function (value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');\n};\nmodule.exports = isArguments;","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n/** Used to detect unsigned integer values. */\n\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\n\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length && (type == 'number' || type != 'symbol' && reIsUint.test(value)) && value > -1 && value % 1 == 0 && value < length;\n}\n\nmodule.exports = isIndex;","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n} // Add methods to `Stack`.\n\n\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\nmodule.exports = Stack;","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\n\n\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n\n if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {\n return value !== value && other !== other;\n }\n\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\n\n\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n/** Used to detect host constructors (Safari). */\n\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n/** Used for built-in method references. */\n\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n/** Used to resolve the decompiled source of functions. */\n\nvar funcToString = funcProto.toString;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/** Used to detect if a method is native. */\n\nvar reIsNative = RegExp('^' + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&').replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$');\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\n\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;","var coreJsData = require('./_coreJsData');\n/** Used to detect methods masquerading as native. */\n\n\nvar maskSrcKey = function () {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? 'Symbol(src)_1.' + uid : '';\n}();\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\n\n\nfunction isMasked(func) {\n return !!maskSrcKey && maskSrcKey in func;\n}\n\nmodule.exports = isMasked;","var root = require('./_root');\n/** Used to detect overreaching core-js shims. */\n\n\nvar coreJsData = root['__core-js_shared__'];\nmodule.exports = coreJsData;","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\n\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && ( // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' || // Node.js 0.10 has enumerable non-index properties on buffers.\n isBuff && (key == 'offset' || key == 'parent') || // PhantomJS 2 has enumerable non-index properties on typed arrays.\n isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset') || // Skip index properties.\n isIndex(key, length)))) {\n result.push(key);\n }\n }\n\n return result;\n}\n\nmodule.exports = arrayLikeKeys;","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n\n return result;\n}\n\nmodule.exports = baseTimes;","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n/** `Object#toString` result references. */\n\n\nvar argsTag = '[object Arguments]';\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\n\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n/** `Object#toString` result references. */\n\n\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n/** Used to identify `toStringTag` values of typed arrays. */\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\n\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function (value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;","var freeGlobal = require('./_freeGlobal');\n/** Detect free variable `exports`. */\n\n\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n/** Detect free variable `module`. */\n\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n/** Detect the popular CommonJS extension `module.exports`. */\n\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n/** Detect free variable `process` from Node.js. */\n\nvar freeProcess = moduleExports && freeGlobal.process;\n/** Used to access faster Node.js helpers. */\n\nvar nodeUtil = function () {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n } // Legacy `process.binding('util')` for Node.js < 10.\n\n\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}();\n\nmodule.exports = nodeUtil;","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\n\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n\n var result = [];\n\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n\n return result;\n}\n\nmodule.exports = baseKeys;","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\n\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = typeof Ctor == 'function' && Ctor.prototype || objectProto;\n return value === proto;\n}\n\nmodule.exports = isPrototype;","var overArg = require('./_overArg');\n/* Built-in method references for those with the same name as other `lodash` methods. */\n\n\nvar nativeKeys = overArg(Object.keys, Object);\nmodule.exports = nativeKeys;","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function (arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\n\n\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;","var assocIndexOf = require('./_assocIndexOf');\n/** Used for built-in method references. */\n\n\nvar arrayProto = Array.prototype;\n/** Built-in value references. */\n\nvar splice = arrayProto.splice;\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n\n var lastIndex = data.length - 1;\n\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;","var assocIndexOf = require('./_assocIndexOf');\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n\n\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;","var assocIndexOf = require('./_assocIndexOf');\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n\n\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;","var assocIndexOf = require('./_assocIndexOf');\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\n\n\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n\n return this;\n}\n\nmodule.exports = listCacheSet;","var ListCache = require('./_ListCache');\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\n\n\nfunction stackClear() {\n this.__data__ = new ListCache();\n this.size = 0;\n}\n\nmodule.exports = stackClear;","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n/** Used as the size to enable large array optimizations. */\n\n\nvar LARGE_ARRAY_SIZE = 200;\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\n\nfunction stackSet(key, value) {\n var data = this.__data__;\n\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n\n if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n\n data = this.__data__ = new MapCache(pairs);\n }\n\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\n\n\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash(),\n 'map': new (Map || ListCache)(),\n 'string': new Hash()\n };\n}\n\nmodule.exports = mapCacheClear;","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\n\n\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n this.clear();\n\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n} // Add methods to `Hash`.\n\n\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\nmodule.exports = Hash;","var nativeCreate = require('./_nativeCreate');\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\n\n\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;","var nativeCreate = require('./_nativeCreate');\n/** Used to stand-in for `undefined` hash values. */\n\n\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n/** Used for built-in method references. */\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n\nfunction hashGet(key) {\n var data = this.__data__;\n\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;","var nativeCreate = require('./_nativeCreate');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;","var nativeCreate = require('./_nativeCreate');\n/** Used to stand-in for `undefined` hash values. */\n\n\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\n\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;","var getMapData = require('./_getMapData');\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\n\n\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean' ? value !== '__proto__' : value === null;\n}\n\nmodule.exports = isKeyable;","var getMapData = require('./_getMapData');\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\n\n\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;","var getMapData = require('./_getMapData');\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\n\n\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;","var getMapData = require('./_getMapData');\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\n\n\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n/** Used to compose bitmasks for value comparisons. */\n\n\nvar COMPARE_PARTIAL_FLAG = 1;\n/** `Object#toString` result references. */\n\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n/** Used for built-in method references. */\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n\n objIsArr = true;\n objIsObj = false;\n }\n\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack());\n return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n stack || (stack = new Stack());\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n\n if (!isSameTag) {\n return false;\n }\n\n stack || (stack = new Stack());\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\n\n\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n this.__data__ = new MapCache();\n\n while (++index < length) {\n this.add(values[index]);\n }\n} // Add methods to `SetCache`.\n\n\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\nmodule.exports = SetCache;","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\n\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n\n return this;\n}\n\nmodule.exports = setCacheAdd;","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n\n return false;\n}\n\nmodule.exports = arraySome;","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n/** Used to compose bitmasks for value comparisons. */\n\n\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n/** `Object#toString` result references. */\n\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n/** Used to convert symbols to primitives and strings. */\n\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {\n return false;\n }\n\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == other + '';\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n } // Assume cyclic values are equal.\n\n\n var stacked = stack.get(object);\n\n if (stacked) {\n return stacked == other;\n }\n\n bitmask |= COMPARE_UNORDERED_FLAG; // Recursively compare objects (susceptible to call stack limits).\n\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n\n }\n\n return false;\n}\n\nmodule.exports = equalByTag;","var root = require('./_root');\n/** Built-in value references. */\n\n\nvar Uint8Array = root.Uint8Array;\nmodule.exports = Uint8Array;","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n map.forEach(function (value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n set.forEach(function (value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;","var getAllKeys = require('./_getAllKeys');\n/** Used to compose bitmasks for value comparisons. */\n\n\nvar COMPARE_PARTIAL_FLAG = 1;\n/** Used for built-in method references. */\n\nvar objectProto = Object.prototype;\n/** Used to check objects for own properties. */\n\nvar hasOwnProperty = objectProto.hasOwnProperty;\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\n\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n\n var index = objLength;\n\n while (index--) {\n var key = objProps[index];\n\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n } // Assume cyclic values are equal.\n\n\n var stacked = stack.get(object);\n\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n var skipCtor = isPartial;\n\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial ? customizer(othValue, objValue, key, other, object, stack) : customizer(objValue, othValue, key, object, other, stack);\n } // Recursively compare objects (susceptible to call stack limits).\n\n\n if (!(compared === undefined ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {\n result = false;\n break;\n }\n\n skipCtor || (skipCtor = key == 'constructor');\n }\n\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor; // Non `Object` object instances with different constructors are not equal.\n\n if (objCtor != othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor == 'function' && objCtor instanceof objCtor && typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\n\n\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\n\n\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n\n return array;\n}\n\nmodule.exports = arrayPush;","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n/** Used for built-in method references. */\n\n\nvar objectProto = Object.prototype;\n/** Built-in value references. */\n\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n/* Built-in method references for those with the same name as other `lodash` methods. */\n\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\n\nvar getSymbols = !nativeGetSymbols ? stubArray : function (object) {\n if (object == null) {\n return [];\n }\n\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function (symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\nmodule.exports = getSymbols;","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n\n return result;\n}\n\nmodule.exports = arrayFilter;","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n/** `Object#toString` result references. */\n\n\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\nvar dataViewTag = '[object DataView]';\n/** Used to detect maps, sets, and weakmaps. */\n\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\n\nvar getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n\nif (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map && getTag(new Map()) != mapTag || Promise && getTag(Promise.resolve()) != promiseTag || Set && getTag(new Set()) != setTag || WeakMap && getTag(new WeakMap()) != weakMapTag) {\n getTag = function getTag(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString:\n return dataViewTag;\n\n case mapCtorString:\n return mapTag;\n\n case promiseCtorString:\n return promiseTag;\n\n case setCtorString:\n return setTag;\n\n case weakMapCtorString:\n return weakMapTag;\n }\n }\n\n return result;\n };\n}\n\nmodule.exports = getTag;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar DataView = getNative(root, 'DataView');\nmodule.exports = DataView;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar Promise = getNative(root, 'Promise');\nmodule.exports = Promise;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar Set = getNative(root, 'Set');\nmodule.exports = Set;","var getNative = require('./_getNative'),\n root = require('./_root');\n/* Built-in method references that are verified to be native. */\n\n\nvar WeakMap = getNative(root, 'WeakMap');\nmodule.exports = WeakMap;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Toggle from 'react-toggle';\nimport AsyncSelect from 'react-select/async';\n\nconst messages = defineMessages({\n placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },\n noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' },\n});\n\nexport default @injectIntl\nclass ColumnSettings extends React.PureComponent {\n\n static propTypes = {\n settings: ImmutablePropTypes.map.isRequired,\n onChange: PropTypes.func.isRequired,\n onLoad: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n state = {\n open: this.hasTags(),\n };\n\n hasTags () {\n return ['all', 'any', 'none'].map(mode => this.tags(mode).length > 0).includes(true);\n }\n\n tags (mode) {\n let tags = this.props.settings.getIn(['tags', mode]) || [];\n\n if (tags.toJSON) {\n return tags.toJSON();\n } else {\n return tags;\n }\n };\n\n onSelect = mode => value => this.props.onChange(['tags', mode], value);\n\n onToggle = () => {\n if (this.state.open && this.hasTags()) {\n this.props.onChange('tags', {});\n }\n\n this.setState({ open: !this.state.open });\n };\n\n noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions);\n\n modeSelect (mode) {\n return (\n <div className='column-settings__row'>\n <span className='column-settings__section'>\n {this.modeLabel(mode)}\n </span>\n\n <AsyncSelect\n isMulti\n autoFocus\n value={this.tags(mode)}\n onChange={this.onSelect(mode)}\n loadOptions={this.props.onLoad}\n className='column-select__container'\n classNamePrefix='column-select'\n name='tags'\n placeholder={this.props.intl.formatMessage(messages.placeholder)}\n noOptionsMessage={this.noOptionsMessage}\n />\n </div>\n );\n }\n\n modeLabel (mode) {\n switch(mode) {\n case 'any':\n return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;\n case 'all':\n return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;\n case 'none':\n return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;\n default:\n return '';\n }\n };\n\n render () {\n return (\n <div>\n <div className='column-settings__row'>\n <div className='setting-toggle'>\n <Toggle id='hashtag.column_settings.tag_toggle' onChange={this.onToggle} checked={this.state.open} />\n\n <span className='setting-toggle__label'>\n <FormattedMessage id='hashtag.column_settings.tag_toggle' defaultMessage='Include additional tags in this column' />\n </span>\n </div>\n </div>\n\n {this.state.open && (\n <div className='column-settings__hashtags'>\n {this.modeSelect('any')}\n {this.modeSelect('all')}\n {this.modeSelect('none')}\n </div>\n )}\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ColumnSettings from '../components/column_settings';\nimport { changeColumnParams } from '../../../actions/columns';\nimport api from '../../../api';\n\nconst mapStateToProps = (state, { columnId }) => {\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === columnId);\n\n if (!(columnId && index >= 0)) {\n return {};\n }\n\n return { settings: columns.get(index).get('params') };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => ({\n onChange (key, value) {\n dispatch(changeColumnParams(columnId, key, value));\n },\n\n onLoad (value) {\n return api().get('/api/v2/search', { params: { q: value, type: 'hashtags' } }).then(response => {\n return (response.data.hashtags || []).map((tag) => {\n return { value: tag.name, label: `#${tag.name}` };\n });\n });\n },\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { expandHashtagTimeline, clearTimeline } from '../../actions/timelines';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { FormattedMessage } from 'react-intl';\nimport { connectHashtagStream } from '../../actions/streaming';\nimport { isEqual } from 'lodash';\n\nconst mapStateToProps = (state, props) => ({\n hasUnread: state.getIn(['timelines', `hashtag:${props.params.id}`, 'unread']) > 0,\n});\n\nexport default @connect(mapStateToProps)\nclass HashtagTimeline extends React.PureComponent {\n\n disconnects = [];\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n columnId: PropTypes.string,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n hasUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('HASHTAG', { id: this.props.params.id }));\n }\n }\n\n title = () => {\n let title = [this.props.params.id];\n\n if (this.additionalFor('any')) {\n title.push(' ', <FormattedMessage key='any' id='hashtag.column_header.tag_mode.any' values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />);\n }\n\n if (this.additionalFor('all')) {\n title.push(' ', <FormattedMessage key='all' id='hashtag.column_header.tag_mode.all' values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />);\n }\n\n if (this.additionalFor('none')) {\n title.push(' ', <FormattedMessage key='none' id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />);\n }\n\n return title;\n }\n\n additionalFor = (mode) => {\n const { tags } = this.props.params;\n\n if (tags && (tags[mode] || []).length > 0) {\n return tags[mode].map(tag => tag.value).join('/');\n } else {\n return '';\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n _subscribe (dispatch, id, tags = {}) {\n let any = (tags.any || []).map(tag => tag.value);\n let all = (tags.all || []).map(tag => tag.value);\n let none = (tags.none || []).map(tag => tag.value);\n\n [id, ...any].map(tag => {\n this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => {\n let tags = status.tags.map(tag => tag.name);\n\n return all.filter(tag => tags.includes(tag)).length === all.length &&\n none.filter(tag => tags.includes(tag)).length === 0;\n })));\n });\n }\n\n _unsubscribe () {\n this.disconnects.map(disconnect => disconnect());\n this.disconnects = [];\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n const { id, tags } = this.props.params;\n\n this._subscribe(dispatch, id, tags);\n dispatch(expandHashtagTimeline(id, { tags }));\n }\n\n componentWillReceiveProps (nextProps) {\n const { dispatch, params } = this.props;\n const { id, tags } = nextProps.params;\n\n if (id !== params.id || !isEqual(tags, params.tags)) {\n this._unsubscribe();\n this._subscribe(dispatch, id, tags);\n this.props.dispatch(clearTimeline(`hashtag:${id}`));\n this.props.dispatch(expandHashtagTimeline(id, { tags }));\n }\n }\n\n componentWillUnmount () {\n this._unsubscribe();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n const { id, tags } = this.props.params;\n this.props.dispatch(expandHashtagTimeline(id, { maxId, tags }));\n }\n\n render () {\n const { shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props;\n const { id } = this.props.params;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={`#${id}`}>\n <ColumnHeader\n icon='hashtag'\n active={hasUnread}\n title={this.title()}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n showBackButton\n >\n {columnId && <ColumnSettingsContainer columnId={columnId} />}\n </ColumnHeader>\n\n <StatusListContainer\n trackScroll={!pinned}\n scrollKey={`hashtag_timeline-${columnId}`}\n timelineId={`hashtag:${id}`}\n onLoadMore={this.handleLoadMore}\n emptyMessage={<FormattedMessage id='empty_column.hashtag' defaultMessage='There is nothing in this hashtag yet.' />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/home_timeline.js b/priv/static/packs/features/home_timeline.js
index 33237345b..9286699bd 100644
--- a/priv/static/packs/features/home_timeline.js
+++ b/priv/static/packs/features/home_timeline.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{823:function(e,t,n){"use strict";n.r(t);var o,i,a=n(0),c=n(2),s=n(7),l=n(1),r=n(3),u=n.n(r),h=n(13),d=n(33),m=n(1036),p=n(736),b=n(733),f=n(250),g=n(6),O=n(1079),j=Object(g.g)(o=function(e){function t(){return e.apply(this,arguments)||this}return Object(s.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.settings,n=e.onChange;return Object(a.a)("div",{},void 0,Object(a.a)("span",{className:"column-settings__section"},void 0,Object(a.a)(g.b,{id:"home.column_settings.basic",defaultMessage:"Basic"})),Object(a.a)("div",{className:"column-settings__row"},void 0,Object(a.a)(O.a,{prefix:"home_timeline",settings:t,settingPath:["shows","reblog"],onChange:n,label:Object(a.a)(g.b,{id:"home.column_settings.show_reblogs",defaultMessage:"Show boosts"})})),Object(a.a)("div",{className:"column-settings__row"},void 0,Object(a.a)(O.a,{prefix:"home_timeline",settings:t,settingPath:["shows","reply"],onChange:n,label:Object(a.a)(g.b,{id:"home.column_settings.show_replies",defaultMessage:"Show replies"})})))},t}(u.a.PureComponent))||o,v=n(70),_=Object(h.connect)((function(e){return{settings:e.getIn(["settings","home"])}}),(function(e){return{onChange:function(t,n){e(Object(v.c)(["home"].concat(t),n))},onSave:function(){e(Object(v.d)())}}}))(j),M=n(316);n.d(t,"default",(function(){return P}));var w=Object(g.f)({title:{id:"column.home",defaultMessage:"Home"}}),P=Object(h.connect)((function(e){return{hasUnread:e.getIn(["timelines","home","unread"])>0,isPartial:e.getIn(["timelines","home","isPartial"])}}))(i=Object(g.g)(i=function(e){function t(){for(var t,n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];return t=e.call.apply(e,[this].concat(o))||this,Object(l.a)(Object(c.a)(t),"handlePin",(function(){var e=t.props,n=e.columnId,o=e.dispatch;o(n?Object(f.h)(n):Object(f.e)("HOME",{}))})),Object(l.a)(Object(c.a)(t),"handleMove",(function(e){var n=t.props,o=n.columnId;(0,n.dispatch)(Object(f.g)(o,e))})),Object(l.a)(Object(c.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(l.a)(Object(c.a)(t),"setRef",(function(e){t.column=e})),Object(l.a)(Object(c.a)(t),"handleLoadMore",(function(e){t.props.dispatch(Object(d.t)({maxId:e}))})),t}Object(s.a)(t,e);var n=t.prototype;return n.componentDidMount=function(){this._checkIfReloadNeeded(!1,this.props.isPartial)},n.componentDidUpdate=function(e){this._checkIfReloadNeeded(e.isPartial,this.props.isPartial)},n.componentWillUnmount=function(){this._stopPolling()},n._checkIfReloadNeeded=function(e,t){var n=this.props.dispatch;e!==t&&(!e&&t?this.polling=setInterval((function(){n(Object(d.t)())}),3e3):e&&!t&&this._stopPolling())},n._stopPolling=function(){this.polling&&(clearInterval(this.polling),this.polling=null)},n.render=function(){var e=this.props,t=e.intl,n=e.shouldUpdateScroll,o=e.hasUnread,i=e.columnId,c=e.multiColumn,s=!!i;return u.a.createElement(p.a,{bindToDocument:!c,ref:this.setRef,label:t.formatMessage(w.title)},Object(a.a)(b.a,{icon:"home",active:o,title:t.formatMessage(w.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:s,multiColumn:c},void 0,Object(a.a)(_,{})),Object(a.a)(m.a,{trackScroll:!s,scrollKey:"home_timeline-"+i,onLoadMore:this.handleLoadMore,timelineId:"home",emptyMessage:Object(a.a)(g.b,{id:"empty_column.home",defaultMessage:"Your home timeline is empty! Visit {public} or use search to get started and meet other users.",values:{public:Object(a.a)(M.a,{to:"/timelines/public"},void 0,Object(a.a)(g.b,{id:"empty_column.home.public_timeline",defaultMessage:"the public timeline"}))}}),shouldUpdateScroll:n,bindToDocument:!c}))},t}(u.a.PureComponent))||i)||i}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{1325:function(e,t,n){"use strict";(function(e){n.d(t,"a",(function(){return K}));var a,i,o,s=n(0),c=n(2),r=n(9),u=n(6),l=n(8),d=n(1),m=n(3),p=n.n(m),h=n(21),b=n(216),f=n.n(b),j=n(16),g=n.n(j),v=n(5),O=n.n(v),_=n(53),y=n(27),R=n(7),M=n(22),k=n(83),C=n.n(k),x=n(14),w=n.n(x),A=n(546),I=n(590),E=n(473),N=n.n(E),L=n(35),P=n.n(L);function S(e){return function(){var t,n=Object(u.a)(e);if(q()){var a=Object(u.a)(this).constructor;t=Reflect.construct(n,arguments,a)}else t=n.apply(this,arguments);return Object(r.a)(this,t)}}function q(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}var D=Object(R.f)({close:{id:"lightbox.close",defaultMessage:"Close"},previous:{id:"lightbox.previous",defaultMessage:"Previous"},next:{id:"lightbox.next",defaultMessage:"Next"}}),z=function(e){Object(l.a)(t,e);S(t);function t(){for(var t,n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(c.a)(t),"setRef",(function(e){t.node=e})),Object(d.a)(Object(c.a)(t),"onMentionClick",(function(e,n){!t.context.router||0!==n.button||n.ctrlKey||n.metaKey||(n.preventDefault(),t.context.router.history.push("/accounts/"+e.get("id")))})),Object(d.a)(Object(c.a)(t),"onHashtagClick",(function(e,n){e=e.replace(/^#/,""),!t.context.router||0!==n.button||n.ctrlKey||n.metaKey||(n.preventDefault(),t.context.router.history.push("/timelines/tag/"+e))})),Object(d.a)(Object(c.a)(t),"onStatusClick",(function(e,n){!t.context.router||0!==n.button||n.ctrlKey||n.metaKey||(n.preventDefault(),t.context.router.history.push("/statuses/"+e.get("id")))})),Object(d.a)(Object(c.a)(t),"handleEmojiMouseEnter",(function(e){var t=e.target;t.src=t.getAttribute("data-original")})),Object(d.a)(Object(c.a)(t),"handleEmojiMouseLeave",(function(e){var t=e.target;t.src=t.getAttribute("data-static")})),t}var n=t.prototype;return n.componentDidMount=function(){this._updateLinks(),this._updateEmojis()},n.componentDidUpdate=function(){this._updateLinks(),this._updateEmojis()},n._updateEmojis=function(){var e=this.node;if(e&&!M.a)for(var t=e.querySelectorAll(".custom-emoji"),n=0;n<t.length;n++){var a=t[n];a.classList.contains("status-emoji")||(a.classList.add("status-emoji"),a.addEventListener("mouseenter",this.handleEmojiMouseEnter,!1),a.addEventListener("mouseleave",this.handleEmojiMouseLeave,!1))}},n._updateLinks=function(){var e=this,t=this.node;if(t)for(var n=t.querySelectorAll("a"),a=function(){var t=n[i];if(t.classList.contains("status-link"))return"continue";t.classList.add("status-link");var a=e.props.announcement.get("mentions").find((function(e){return t.href===e.get("url")}));if(a)t.addEventListener("click",e.onMentionClick.bind(e,a),!1),t.setAttribute("title",a.get("acct"));else if("#"===t.textContent[0]||t.previousSibling&&t.previousSibling.textContent&&"#"===t.previousSibling.textContent[t.previousSibling.textContent.length-1])t.addEventListener("click",e.onHashtagClick.bind(e,t.text),!1);else{var o=e.props.announcement.get("statuses").find((function(e){return t.href===e.get("url")}));o&&t.addEventListener("click",e.onStatusClick.bind(e,o),!1),t.setAttribute("title",t.href),t.classList.add("unhandled-link")}t.setAttribute("target","_blank"),t.setAttribute("rel","noopener noreferrer")},i=0;i<n.length;++i)a()},n.render=function(){var e=this.props.announcement;return(p.a.createElement("div",{className:"announcements__item__content",ref:this.setRef,dangerouslySetInnerHTML:{__html:e.get("contentHtml")}}))},t}(h.a);Object(d.a)(z,"contextTypes",{router:O.a.object}),Object(d.a)(z,"propTypes",{announcement:g.a.map.isRequired});var T=e.env.CDN_HOST||"",H=function(e){Object(l.a)(t,e);S(t);function t(){return e.apply(this,arguments)||this}return t.prototype.render=function(){var e=this.props,t=e.emoji,n=e.emojiMap,a=e.hovered;if(C.a[t]){var i=C.a[this.props.emoji],o=i.filename,c=i.shortCode,r=c?":"+c+":":"";return Object(s.a)("img",{draggable:"false",className:"emojione",alt:t,title:r,src:T+"/emoji/"+o+".svg"})}if(n.get(t)){var u=M.a||a?n.getIn([t,"url"]):n.getIn([t,"static_url"]),l=":"+t+":";return Object(s.a)("img",{draggable:"false",className:"emojione custom-emoji",alt:l,title:l,src:u})}return null},t}(p.a.PureComponent),F=function(e){Object(l.a)(t,e);S(t);function t(){for(var t,n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(c.a)(t),"state",{hovered:!1}),Object(d.a)(Object(c.a)(t),"handleClick",(function(){var e=t.props,n=e.reaction,a=e.announcementId,i=e.addReaction,o=e.removeReaction;n.get("me")?o(a,n.get("name")):i(a,n.get("name"))})),Object(d.a)(Object(c.a)(t),"handleMouseEnter",(function(){return t.setState({hovered:!0})})),Object(d.a)(Object(c.a)(t),"handleMouseLeave",(function(){return t.setState({hovered:!1})})),t}return t.prototype.render=function(){var e=this.props.reaction,t=e.get("name");return C.a[t]&&(t=C.a[t].shortCode),Object(s.a)("button",{className:w()("reactions-bar__item",{active:e.get("me")}),onClick:this.handleClick,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave,title:":"+t+":",style:this.props.style},void 0,Object(s.a)("span",{className:"reactions-bar__item__emoji"},void 0,Object(s.a)(H,{hovered:this.state.hovered,emoji:e.get("name"),emojiMap:this.props.emojiMap})),Object(s.a)("span",{className:"reactions-bar__item__count"},void 0,Object(s.a)(I.a,{value:e.get("count")})))},t}(h.a);Object(d.a)(F,"propTypes",{announcementId:O.a.string.isRequired,reaction:g.a.map.isRequired,addReaction:O.a.func.isRequired,removeReaction:O.a.func.isRequired,emojiMap:g.a.map.isRequired,style:O.a.object});var Y=function(e){Object(l.a)(t,e);S(t);function t(){for(var t,n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(c.a)(t),"handleEmojiPick",(function(e){var n=t.props;(0,n.addReaction)(n.announcementId,e.native.replace(/:/g,""))})),t}var n=t.prototype;return n.willEnter=function(){return{scale:M.p?1:0}},n.willLeave=function(){return{scale:M.p?0:P()(0,{stiffness:170,damping:26})}},n.render=function(){var e=this,t=this.props.reactions.filter((function(e){return e.get("count")>0})),n=t.map((function(e){return{key:e.get("name"),data:e,style:{scale:M.p?1:P()(1,{stiffness:150,damping:13})}}})).toArray();return Object(s.a)(N.a,{styles:n,willEnter:this.willEnter,willLeave:this.willLeave},void 0,(function(n){return Object(s.a)("div",{className:w()("reactions-bar",{"reactions-bar--empty":t.isEmpty()})},void 0,n.map((function(t){var n=t.key,a=t.data,i=t.style;return(Object(s.a)(F,{reaction:a,style:{transform:"scale("+i.scale+")",position:i.scale<.5?"absolute":"static"},announcementId:e.props.announcementId,addReaction:e.props.addReaction,removeReaction:e.props.removeReaction,emojiMap:e.props.emojiMap},n))})),t.size<8&&Object(s.a)(A.a,{onPickEmoji:e.handleEmojiPick,button:Object(s.a)(y.a,{id:"plus"})}))}))},t}(h.a);Object(d.a)(Y,"propTypes",{announcementId:O.a.string.isRequired,reactions:g.a.list.isRequired,addReaction:O.a.func.isRequired,removeReaction:O.a.func.isRequired,emojiMap:g.a.map.isRequired});var U=function(e){Object(l.a)(t,e);S(t);function t(){for(var t,n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(c.a)(t),"state",{unread:!t.props.announcement.get("read")}),t}var n=t.prototype;return n.componentDidUpdate=function(){var e=this.props,t=e.selected,n=e.announcement;t||this.state.unread===!n.get("read")||this.setState({unread:!n.get("read")})},n.render=function(){var e=this.props.announcement,t=this.state.unread,n=e.get("starts_at")&&new Date(e.get("starts_at")),a=e.get("ends_at")&&new Date(e.get("ends_at")),i=new Date,o=n&&a,c=o&&n.getFullYear()===a.getFullYear()&&a.getFullYear()===i.getFullYear(),r=o&&n.getDate()===a.getDate()&&n.getMonth()===a.getMonth()&&n.getFullYear()===a.getFullYear(),u=e.get("all_day");return Object(s.a)("div",{className:"announcements__item"},void 0,Object(s.a)("strong",{className:"announcements__item__range"},void 0,Object(s.a)(R.b,{id:"announcement.announcement",defaultMessage:"Announcement"}),o&&Object(s.a)("span",{},void 0," · ",Object(s.a)(R.a,{value:n,hour12:!1,year:c||n.getFullYear()===i.getFullYear()?void 0:"numeric",month:"short",day:"2-digit",hour:u?void 0:"2-digit",minute:u?void 0:"2-digit"})," - ",Object(s.a)(R.a,{value:a,hour12:!1,year:c||a.getFullYear()===i.getFullYear()?void 0:"numeric",month:r?void 0:"short",day:r?void 0:"2-digit",hour:u?void 0:"2-digit",minute:u?void 0:"2-digit"}))),Object(s.a)(z,{announcement:e}),Object(s.a)(Y,{reactions:e.get("reactions"),announcementId:e.get("id"),addReaction:this.props.addReaction,removeReaction:this.props.removeReaction,emojiMap:this.props.emojiMap}),t&&Object(s.a)("span",{className:"announcements__item__unread"}))},t}(h.a);Object(d.a)(U,"propTypes",{announcement:g.a.map.isRequired,emojiMap:g.a.map.isRequired,addReaction:O.a.func.isRequired,removeReaction:O.a.func.isRequired,intl:O.a.object.isRequired,selected:O.a.bool});var K=Object(R.g)((o=i=function(e){Object(l.a)(t,e);S(t);function t(){for(var t,n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];return t=e.call.apply(e,[this].concat(a))||this,Object(d.a)(Object(c.a)(t),"state",{index:0}),Object(d.a)(Object(c.a)(t),"handleChangeIndex",(function(e){t.setState({index:e%t.props.announcements.size})})),Object(d.a)(Object(c.a)(t),"handleNextClick",(function(){t.setState({index:(t.state.index+1)%t.props.announcements.size})})),Object(d.a)(Object(c.a)(t),"handlePrevClick",(function(){t.setState({index:(t.props.announcements.size+t.state.index-1)%t.props.announcements.size})})),t}t.getDerivedStateFromProps=function(e,t){return e.announcements.size>0&&t.index>=e.announcements.size?{index:e.announcements.size-1}:null};var n=t.prototype;return n.componentDidMount=function(){this._markAnnouncementAsRead()},n.componentDidUpdate=function(){this._markAnnouncementAsRead()},n._markAnnouncementAsRead=function(){var e=this.props,t=e.dismissAnnouncement,n=e.announcements,a=this.state.index,i=n.get(a);i.get("read")||t(i.get("id"))},n.render=function(){var e=this,t=this.props,n=t.announcements,a=t.intl,i=this.state.index;return n.isEmpty()?null:Object(s.a)("div",{className:"announcements"},void 0,"mascot && ( ",Object(s.a)("img",{className:"announcements__mastodon",alt:"",draggable:"false",src:M.l})," )",Object(s.a)("div",{className:"announcements__container"},void 0,Object(s.a)(f.a,{animateHeight:!M.p,adjustHeight:M.p,index:i,onChangeIndex:this.handleChangeIndex},void 0,n.map((function(t,n){return Object(s.a)(U,{announcement:t,emojiMap:e.props.emojiMap,addReaction:e.props.addReaction,removeReaction:e.props.removeReaction,intl:a,selected:i===n},t.get("id"))}))),n.size>1&&Object(s.a)("div",{className:"announcements__pagination"},void 0,Object(s.a)(_.a,{disabled:1===n.size,title:a.formatMessage(D.previous),icon:"chevron-left",onClick:this.handlePrevClick,size:13}),Object(s.a)("span",{},void 0,i+1," / ",n.size),Object(s.a)(_.a,{disabled:1===n.size,title:a.formatMessage(D.next),icon:"chevron-right",onClick:this.handleNextClick,size:13}))))},t}(h.a),Object(d.a)(i,"propTypes",{announcements:g.a.list,emojiMap:g.a.map.isRequired,dismissAnnouncement:O.a.func.isRequired,addReaction:O.a.func.isRequired,removeReaction:O.a.func.isRequired,intl:O.a.object.isRequired}),a=o))||a}).call(this,n(50))},728:function(e,t,n){"use strict";var a=n(0),i=(n(3),n(27));t.a=function(e){var t,n=e.id,o=e.count,s=e.className;return(Object(a.a)("i",{className:"icon-with-badge"},void 0,Object(a.a)(i.a,{id:n,fixedWidth:!0,className:s}),o>0&&Object(a.a)("i",{className:"icon-with-badge__badge"},void 0,(t=o)>40?"40+":t)))}},842:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return L}));var a,i=n(0),o=n(2),s=(n(9),n(6),n(8)),c=n(1),r=n(3),u=n.n(r),l=n(15),d=n(36),m=n(1063),p=n(762),h=n(759),b=n(253),f=n(7),j=n(1107);var g,v=Object(f.g)(a=function(e){Object(s.a)(n,e);var t;t=n;function n(){return e.apply(this,arguments)||this}return n.prototype.render=function(){var e=this.props,t=e.settings,n=e.onChange;return(Object(i.a)("div",{},void 0,Object(i.a)("span",{className:"column-settings__section"},void 0,Object(i.a)(f.b,{id:"home.column_settings.basic",defaultMessage:"Basic"})),Object(i.a)("div",{className:"column-settings__row"},void 0,Object(i.a)(j.a,{prefix:"home_timeline",settings:t,settingPath:["shows","reblog"],onChange:n,label:Object(i.a)(f.b,{id:"home.column_settings.show_reblogs",defaultMessage:"Show boosts"})})),Object(i.a)("div",{className:"column-settings__row"},void 0,Object(i.a)(j.a,{prefix:"home_timeline",settings:t,settingPath:["shows","reply"],onChange:n,label:Object(i.a)(f.b,{id:"home.column_settings.show_replies",defaultMessage:"Show replies"})}))))},n}(u.a.PureComponent))||a,O=n(74),_=Object(l.connect)((function(e){return{settings:e.getIn(["settings","home"])}}),(function(e){return{onChange:function(t,n){e(Object(O.c)(["home"].concat(t),n))},onSave:function(){e(Object(O.d)())}}}))(v),y=n(322),R=n(72),M=n(1325),k=n(57),C=n(4),x=Object(k.a)([function(e){return e.get("custom_emojis")}],(function(e){return e.reduce((function(e,t){return e.set(t.get("shortcode"),t)}),Object(C.Map)())})),w=Object(l.connect)((function(e){return{announcements:e.getIn(["announcements","items"]),emojiMap:x(e)}}),(function(e){return{dismissAnnouncement:function(t){return e(Object(R.o)(t))},addReaction:function(t,n){return e(Object(R.m)(t,n))},removeReaction:function(t,n){return e(Object(R.q)(t,n))}}}))(M.a),A=n(14),I=n.n(A),E=n(728);var N=Object(f.f)({title:{id:"column.home",defaultMessage:"Home"},show_announcements:{id:"home.show_announcements",defaultMessage:"Show announcements"},hide_announcements:{id:"home.hide_announcements",defaultMessage:"Hide announcements"}}),L=Object(l.connect)((function(e){return{hasUnread:e.getIn(["timelines","home","unread"])>0,isPartial:e.getIn(["timelines","home","isPartial"]),hasAnnouncements:!e.getIn(["announcements","items"]).isEmpty(),unreadAnnouncements:e.getIn(["announcements","items"]).count((function(e){return!e.get("read")})),showAnnouncements:e.getIn(["announcements","show"])}}))(g=Object(f.g)(g=function(e){Object(s.a)(n,e);var t;t=n;function n(){for(var t,n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];return t=e.call.apply(e,[this].concat(a))||this,Object(c.a)(Object(o.a)(t),"handlePin",(function(){var e=t.props,n=e.columnId,a=e.dispatch;a(n?Object(b.h)(n):Object(b.e)("HOME",{}))})),Object(c.a)(Object(o.a)(t),"handleMove",(function(e){var n=t.props,a=n.columnId;(0,n.dispatch)(Object(b.g)(a,e))})),Object(c.a)(Object(o.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(c.a)(Object(o.a)(t),"setRef",(function(e){t.column=e})),Object(c.a)(Object(o.a)(t),"handleLoadMore",(function(e){t.props.dispatch(Object(d.t)({maxId:e}))})),Object(c.a)(Object(o.a)(t),"handleToggleAnnouncementsClick",(function(e){e.stopPropagation(),t.props.dispatch(Object(R.r)())})),t}var a=n.prototype;return a.componentDidMount=function(){this.props.dispatch(Object(R.p)()),this._checkIfReloadNeeded(!1,this.props.isPartial)},a.componentDidUpdate=function(e){this._checkIfReloadNeeded(e.isPartial,this.props.isPartial)},a.componentWillUnmount=function(){this._stopPolling()},a._checkIfReloadNeeded=function(e,t){var n=this.props.dispatch;e!==t&&(!e&&t?this.polling=setInterval((function(){n(Object(d.t)())}),3e3):e&&!t&&this._stopPolling())},a._stopPolling=function(){this.polling&&(clearInterval(this.polling),this.polling=null)},a.render=function(){var e=this.props,t=e.intl,n=e.shouldUpdateScroll,a=e.hasUnread,o=e.columnId,s=e.multiColumn,c=e.hasAnnouncements,r=e.unreadAnnouncements,l=e.showAnnouncements,d=!!o,b=null;return c&&(b=Object(i.a)("button",{className:I()("column-header__button",{active:l}),title:t.formatMessage(l?N.hide_announcements:N.show_announcements),"aria-label":t.formatMessage(l?N.hide_announcements:N.show_announcements),"aria-pressed":l?"true":"false",onClick:this.handleToggleAnnouncementsClick},void 0,Object(i.a)(E.a,{id:"bullhorn",count:r}))),u.a.createElement(p.a,{bindToDocument:!s,ref:this.setRef,label:t.formatMessage(N.title)},Object(i.a)(h.a,{icon:"home",active:a,title:t.formatMessage(N.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:d,multiColumn:s,extraButton:b,appendContent:c&&l&&Object(i.a)(w,{})},void 0,Object(i.a)(_,{})),Object(i.a)(m.a,{trackScroll:!d,scrollKey:"home_timeline-"+o,onLoadMore:this.handleLoadMore,timelineId:"home",emptyMessage:Object(i.a)(f.b,{id:"empty_column.home",defaultMessage:"Your home timeline is empty! Visit {public} or use search to get started and meet other users.",values:{public:Object(i.a)(y.a,{to:"/timelines/public"},void 0,Object(i.a)(f.b,{id:"empty_column.home.public_timeline",defaultMessage:"the public timeline"}))}}),shouldUpdateScroll:n,bindToDocument:!s}))},n}(u.a.PureComponent))||g)||g}}]);
//# sourceMappingURL=home_timeline.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/home_timeline.js.map b/priv/static/packs/features/home_timeline.js.map
index 20a487956..156d44782 100644
--- a/priv/static/packs/features/home_timeline.js.map
+++ b/priv/static/packs/features/home_timeline.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/home_timeline/components/column_settings.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/home_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/home_timeline/index.js"],"names":["ColumnSettings","injectIntl","render","this","props","settings","onChange","className","id","defaultMessage","prefix","settingPath","label","React","PureComponent","connect","state","getIn","dispatch","key","checked","changeSetting","onSave","saveSettings","messages","defineMessages","title","HomeTimeline","hasUnread","isPartial","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","maxId","expandHomeTimeline","componentDidMount","_checkIfReloadNeeded","componentDidUpdate","prevProps","componentWillUnmount","_stopPolling","wasPartial","polling","setInterval","clearInterval","intl","shouldUpdateScroll","multiColumn","pinned","bindToDocument","ref","setRef","formatMessage","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","trackScroll","scrollKey","onLoadMore","handleLoadMore","timelineId","emptyMessage","values","public","Link","to"],"mappings":"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","file":"features/home_timeline.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport SettingToggle from '../../notifications/components/setting_toggle';\n\nexport default @injectIntl\nclass ColumnSettings extends React.PureComponent {\n\n static propTypes = {\n settings: ImmutablePropTypes.map.isRequired,\n onChange: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { settings, onChange } = this.props;\n\n return (\n <div>\n <span className='column-settings__section'><FormattedMessage id='home.column_settings.basic' defaultMessage='Basic' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='home_timeline' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={<FormattedMessage id='home.column_settings.show_reblogs' defaultMessage='Show boosts' />} />\n </div>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='home_timeline' settings={settings} settingPath={['shows', 'reply']} onChange={onChange} label={<FormattedMessage id='home.column_settings.show_replies' defaultMessage='Show replies' />} />\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting, saveSettings } from '../../../actions/settings';\n\nconst mapStateToProps = state => ({\n settings: state.getIn(['settings', 'home']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onChange (key, checked) {\n dispatch(changeSetting(['home', ...key], checked));\n },\n\n onSave () {\n dispatch(saveSettings());\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { expandHomeTimeline } from '../../actions/timelines';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { Link } from 'react-router-dom';\n\nconst messages = defineMessages({\n title: { id: 'column.home', defaultMessage: 'Home' },\n});\n\nconst mapStateToProps = state => ({\n hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,\n isPartial: state.getIn(['timelines', 'home', 'isPartial']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass HomeTimeline extends React.PureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n intl: PropTypes.object.isRequired,\n hasUnread: PropTypes.bool,\n isPartial: PropTypes.bool,\n columnId: PropTypes.string,\n multiColumn: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('HOME', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandHomeTimeline({ maxId }));\n }\n\n componentDidMount () {\n this._checkIfReloadNeeded(false, this.props.isPartial);\n }\n\n componentDidUpdate (prevProps) {\n this._checkIfReloadNeeded(prevProps.isPartial, this.props.isPartial);\n }\n\n componentWillUnmount () {\n this._stopPolling();\n }\n\n _checkIfReloadNeeded (wasPartial, isPartial) {\n const { dispatch } = this.props;\n\n if (wasPartial === isPartial) {\n return;\n } else if (!wasPartial && isPartial) {\n this.polling = setInterval(() => {\n dispatch(expandHomeTimeline());\n }, 3000);\n } else if (wasPartial && !isPartial) {\n this._stopPolling();\n }\n }\n\n _stopPolling () {\n if (this.polling) {\n clearInterval(this.polling);\n this.polling = null;\n }\n }\n\n render () {\n const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn } = this.props;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='home'\n active={hasUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <ColumnSettingsContainer />\n </ColumnHeader>\n\n <StatusListContainer\n trackScroll={!pinned}\n scrollKey={`home_timeline-${columnId}`}\n onLoadMore={this.handleLoadMore}\n timelineId='home'\n emptyMessage={<FormattedMessage id='empty_column.home' defaultMessage='Your home timeline is empty! Visit {public} or use search to get started and meet other users.' values={{ public: <Link to='/timelines/public'><FormattedMessage id='empty_column.home.public_timeline' defaultMessage='the public timeline' /></Link> }} />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/getting_started/components/announcements.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/components/icon_with_badge.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/home_timeline/components/column_settings.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/home_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/getting_started/containers/announcements_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/home_timeline/index.js"],"names":["messages","defineMessages","close","previous","next","Content","c","node","mention","e","context","router","button","ctrlKey","metaKey","preventDefault","history","push","get","hashtag","replace","status","target","src","getAttribute","componentDidMount","this","_updateLinks","_updateEmojis","componentDidUpdate","autoPlayGif","emojis","querySelectorAll","i","length","emoji","classList","contains","add","addEventListener","handleEmojiMouseEnter","handleEmojiMouseLeave","links","link","props","announcement","find","item","href","onMentionClick","bind","setAttribute","textContent","previousSibling","onHashtagClick","text","onStatusClick","render","className","ref","setRef","dangerouslySetInnerHTML","__html","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","isRequired","assetHost","process","env","CDN_HOST","Emoji","emojiMap","hovered","unicodeMapping","filename","shortCode","title","draggable","alt","getIn","React","PureComponent","Reaction","reaction","announcementId","addReaction","removeReaction","setState","classNames","active","onClick","handleClick","onMouseEnter","handleMouseEnter","onMouseLeave","handleMouseLeave","style","state","value","string","func","ReactionsBar","data","native","willEnter","scale","reduceMotion","willLeave","spring","stiffness","damping","visibleReactions","reactions","filter","x","styles","key","toArray","items","isEmpty","transform","position","size","onPickEmoji","handleEmojiPick","id","list","Announcement","unread","selected","startsAt","Date","endsAt","now","hasTimeRange","skipYear","getFullYear","skipEndDate","getDate","getMonth","skipTime","defaultMessage","hour12","year","undefined","month","day","hour","minute","intl","bool","Announcements","injectIntl","index","announcements","getDerivedStateFromProps","_markAnnouncementAsRead","dismissAnnouncement","mascot","animateHeight","adjustHeight","onChangeIndex","handleChangeIndex","idx","disabled","formatMessage","icon","handlePrevClick","handleNextClick","IconWithBadge","num","count","fixedWidth","ColumnSettings","settings","onChange","prefix","settingPath","label","connect","dispatch","checked","changeSetting","onSave","saveSettings","customEmojiMap","createSelector","reduce","set","ImmutableMap","name","show_announcements","hide_announcements","HomeTimeline","hasUnread","isPartial","hasAnnouncements","unreadAnnouncements","showAnnouncements","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","maxId","expandHomeTimeline","stopPropagation","toggleShowAnnouncements","fetchAnnouncements","_checkIfReloadNeeded","prevProps","componentWillUnmount","_stopPolling","wasPartial","polling","setInterval","clearInterval","shouldUpdateScroll","multiColumn","pinned","announcementsButton","aria-label","aria-pressed","handleToggleAnnouncementsClick","bindToDocument","onPin","handlePin","onMove","handleMove","handleHeaderClick","extraButton","appendContent","trackScroll","scrollKey","onLoadMore","handleLoadMore","timelineId","emptyMessage","values","public","Link","to"],"mappings":"2zBAiBA,IAAMA,EAAWC,YAAe,CAC9BC,MAAM,CAAD,4CACLC,SAAS,CAAD,kDACRC,KAAK,CAAD,4CAGAC,E,8MAUK,SAAAC,GACP,EAAKC,KAAOD,K,6CA2EG,SAACE,EAASC,IACrB,EAAKC,QAAQC,QAAuB,IAAbF,EAAEG,QAAkBH,EAAEI,SAAWJ,EAAEK,UAC5DL,EAAEM,iBACF,EAAKL,QAAQC,OAAOK,QAAQC,KAA5B,aAA8CT,EAAQU,IAAI,W,6CAI7C,SAACC,EAASV,GACzBU,EAAUA,EAAQC,QAAQ,KAAM,KAE5B,EAAKV,QAAQC,QAAuB,IAAbF,EAAEG,QAAkBH,EAAEI,SAAWJ,EAAEK,UAC5DL,EAAEM,iBACF,EAAKL,QAAQC,OAAOK,QAAQC,KAA5B,kBAAmDE,O,4CAIvC,SAACE,EAAQZ,IACnB,EAAKC,QAAQC,QAAuB,IAAbF,EAAEG,QAAkBH,EAAEI,SAAWJ,EAAEK,UAC5DL,EAAEM,iBACF,EAAKL,QAAQC,OAAOK,QAAQC,KAA5B,aAA8CI,EAAOH,IAAI,W,oDAIrC,YAAiB,IAAdI,EAAa,EAAbA,OACzBA,EAAOC,IAAMD,EAAOE,aAAa,oB,oDAGX,YAAiB,IAAdF,EAAa,EAAbA,OACzBA,EAAOC,IAAMD,EAAOE,aAAa,kB,6BApGnCC,kBAAA,WACEC,KAAKC,eACLD,KAAKE,iB,EAGPC,mBAAA,WACEH,KAAKC,eACLD,KAAKE,iB,EAGPA,cAAA,WACE,IAAMrB,EAAOmB,KAAKnB,KAElB,GAAKA,IAAQuB,IAMb,IAFA,IAAMC,EAASxB,EAAKyB,iBAAiB,iBAE5BC,EAAI,EAAGA,EAAIF,EAAOG,OAAQD,IAAK,CACtC,IAAIE,EAAQJ,EAAOE,GAEfE,EAAMC,UAAUC,SAAS,kBAI7BF,EAAMC,UAAUE,IAAI,gBAEpBH,EAAMI,iBAAiB,aAAcb,KAAKc,uBAAuB,GACjEL,EAAMI,iBAAiB,aAAcb,KAAKe,uBAAuB,M,EAIrEd,aAAA,WAAiB,IAAD,OACRpB,EAAOmB,KAAKnB,KAElB,GAAKA,EAML,IAFA,IAAMmC,EAAQnC,EAAKyB,iBAAiB,KAPtB,aAUZ,IAAIW,EAAOD,EAAMT,GAEjB,GAAIU,EAAKP,UAAUC,SAAS,eAC1B,iBAGFM,EAAKP,UAAUE,IAAI,eAEnB,IAAI9B,EAAU,EAAKoC,MAAMC,aAAa3B,IAAI,YAAY4B,MAAK,SAAAC,GAAI,OAAIJ,EAAKK,OAASD,EAAK7B,IAAI,UAE1F,GAAIV,EACFmC,EAAKJ,iBAAiB,QAAS,EAAKU,eAAeC,KAAK,EAAM1C,IAAU,GACxEmC,EAAKQ,aAAa,QAAS3C,EAAQU,IAAI,cAClC,GAA4B,MAAxByB,EAAKS,YAAY,IAAeT,EAAKU,iBAAmBV,EAAKU,gBAAgBD,aAAiG,MAAlFT,EAAKU,gBAAgBD,YAAYT,EAAKU,gBAAgBD,YAAYlB,OAAS,GAChLS,EAAKJ,iBAAiB,QAAS,EAAKe,eAAeJ,KAAK,EAAMP,EAAKY,OAAO,OACrE,CACL,IAAIlC,EAAS,EAAKuB,MAAMC,aAAa3B,IAAI,YAAY4B,MAAK,SAAAC,GAAI,OAAIJ,EAAKK,OAASD,EAAK7B,IAAI,UACrFG,GACFsB,EAAKJ,iBAAiB,QAAS,EAAKiB,cAAcN,KAAK,EAAM7B,IAAS,GAExEsB,EAAKQ,aAAa,QAASR,EAAKK,MAChCL,EAAKP,UAAUE,IAAI,kBAGrBK,EAAKQ,aAAa,SAAU,UAC5BR,EAAKQ,aAAa,MAAO,wBA1BlBlB,EAAI,EAAGA,EAAIS,EAAMR,SAAUD,EAAG,K,EA6DzCwB,OAAA,WAAW,IACDZ,EAAiBnB,KAAKkB,MAAtBC,aAER,OACE,yBACEa,UAAU,+BACVC,IAAKjC,KAAKkC,OACVC,wBAAyB,CAAEC,OAAQjB,EAAa3B,IAAI,oB,GA5HtC6C,K,YAAhB1D,E,eAEkB,CACpBM,OAAQqD,IAAUC,S,YAHhB5D,E,YAMe,CACjBwC,aAAcqB,IAAmBC,IAAIC,aA4HzC,IAAMC,EAAYC,EAAQC,IAAIC,UAAY,GAEpCC,E,uGAQJhB,OAAA,WAAW,IAAD,EAC6B/B,KAAKkB,MAAlCT,EADA,EACAA,MAAOuC,EADP,EACOA,SAAUC,EADjB,EACiBA,QAEzB,GAAIC,IAAezC,GAAQ,CAAC,IAAD,EACOyC,IAAelD,KAAKkB,MAAMT,OAAlD0C,EADiB,EACjBA,SAAUC,EADO,EACPA,UACZC,EAAQD,EAAS,IAAOA,EAAP,IAAsB,GAE7C,OACE,mBACEE,UAAU,QACVtB,UAAU,WACVuB,IAAK9C,EACL4C,MAAOA,EACPxD,IAAQ8C,EAAL,UAAwBQ,EAAxB,SAGF,GAAIH,EAASxD,IAAIiB,GAAQ,CAC9B,IAAM0C,EAAa/C,KAAe6C,EAAWD,EAASQ,MAAM,CAAC/C,EAAO,QAAUuC,EAASQ,MAAM,CAAC/C,EAAO,eAC/F2C,EAAS,IAAO3C,EAAP,IAEf,OACE,mBACE6C,UAAU,QACVtB,UAAU,wBACVuB,IAAKH,EACLC,MAAOD,EACPvD,IAAKsD,IAIT,OAAO,M,GAtCOM,IAAMC,eA4CpBC,E,4MAWI,CACNV,SAAS,I,0CAGG,WAAO,IAAD,EACgD,EAAK/B,MAA/D0C,EADU,EACVA,SAAUC,EADA,EACAA,eAAgBC,EADhB,EACgBA,YAAaC,EAD7B,EAC6BA,eAE3CH,EAASpE,IAAI,MACfuE,EAAeF,EAAgBD,EAASpE,IAAI,SAE5CsE,EAAYD,EAAgBD,EAASpE,IAAI,Y,+CAI1B,kBAAM,EAAKwE,SAAS,CAAEf,SAAS,O,+CAE/B,kBAAM,EAAKe,SAAS,CAAEf,SAAS,O,qBAElDlB,OAAA,WAAW,IACD6B,EAAa5D,KAAKkB,MAAlB0C,SAEJR,EAAYQ,EAASpE,IAAI,QAM7B,OAJI0D,IAAeE,KACjBA,EAAYF,IAAeE,GAAWA,WAItC,sBAAQpB,UAAWiC,IAAW,sBAAuB,CAAEC,OAAQN,EAASpE,IAAI,QAAU2E,QAASnE,KAAKoE,YAAaC,aAAcrE,KAAKsE,iBAAkBC,aAAcvE,KAAKwE,iBAAkBnB,MAAK,IAAMD,EAAN,IAAoBqB,MAAOzE,KAAKkB,MAAMuD,YAAtO,EACE,oBAAMzC,UAAU,mCAAhB,EAA6C,YAACe,EAAD,CAAOE,QAASjD,KAAK0E,MAAMzB,QAASxC,MAAOmD,EAASpE,IAAI,QAASwD,SAAUhD,KAAKkB,MAAM8B,YACnI,oBAAMhB,UAAU,mCAAhB,EAA6C,YAAC,IAAD,CAAgB2C,MAAOf,EAASpE,IAAI,c,GAzClE6C,K,YAAjBsB,E,YAEe,CACjBE,eAAgBvB,IAAUsC,OAAOlC,WACjCkB,SAAUpB,IAAmBC,IAAIC,WACjCoB,YAAaxB,IAAUuC,KAAKnC,WAC5BqB,eAAgBzB,IAAUuC,KAAKnC,WAC/BM,SAAUR,IAAmBC,IAAIC,WACjC+B,MAAOnC,IAAUC,S,IAwCfuC,E,uNAUc,SAAAC,GAAS,IAAD,EACgB,EAAK7D,OAC7C4C,EAFwB,EAChBA,aADgB,EACHD,eACOkB,EAAKC,OAAOtF,QAAQ,KAAM,Q,6BAGxDuF,UAAA,WACE,MAAO,CAAEC,MAAOC,IAAe,EAAI,I,EAGrCC,UAAA,WACE,MAAO,CAAEF,MAAOC,IAAe,EAAIE,IAAO,EAAG,CAAEC,UAAW,IAAKC,QAAS,O,EAG1ExD,OAAA,WAAW,IAAD,OAEFyD,EADgBxF,KAAKkB,MAAnBuE,UAC2BC,QAAO,SAAAC,GAAC,OAAIA,EAAEnG,IAAI,SAAW,KAE1DoG,EAASJ,EAAiB/C,KAAI,SAAAmB,GAAQ,MAAK,CAC/CiC,IAAKjC,EAASpE,IAAI,QAClBuF,KAAMnB,EACNa,MAAO,CAAES,MAAOC,IAAe,EAAIE,IAAO,EAAG,CAAEC,UAAW,IAAKC,QAAS,UACtEO,UAEJ,OACE,YAAC,IAAD,CAAkBF,OAAQA,EAAQX,UAAWjF,KAAKiF,UAAWG,UAAWpF,KAAKoF,gBAA7E,GACG,SAAAW,GAAK,OACJ,mBAAK/D,UAAWiC,IAAW,gBAAiB,CAAE,uBAAwBuB,EAAiBQ,kBAAvF,EACGD,EAAMtD,KAAI,gBAAGoD,EAAH,EAAGA,IAAKd,EAAR,EAAQA,KAAMN,EAAd,EAAcA,MAAd,OACT,YAACd,EAAD,CAEEC,SAAUmB,EACVN,MAAO,CAAEwB,UAAU,SAAUxB,EAAMS,MAAjB,IAA2BgB,SAAUzB,EAAMS,MAAQ,GAAM,WAAa,UACxFrB,eAAgB,EAAK3C,MAAM2C,eAC3BC,YAAa,EAAK5C,MAAM4C,YACxBC,eAAgB,EAAK7C,MAAM6C,eAC3Bf,SAAU,EAAK9B,MAAM8B,UANhB6C,OAURL,EAAiBW,KAAO,GAAK,YAAC,IAAD,CAAqBC,YAAa,EAAKC,gBAAiBnH,OAAQ,YAAC,IAAD,CAAMoH,GAAG,gB,GAjDxFjE,K,YAArByC,E,YAEe,CACjBjB,eAAgBvB,IAAUsC,OAAOlC,WACjC+C,UAAWjD,IAAmB+D,KAAK7D,WACnCoB,YAAaxB,IAAUuC,KAAKnC,WAC5BqB,eAAgBzB,IAAUuC,KAAKnC,WAC/BM,SAAUR,IAAmBC,IAAIC,a,IAmD/B8D,E,4MAWI,CACNC,QAAS,EAAKvF,MAAMC,aAAa3B,IAAI,U,6BAGvCW,mBAAA,WAAuB,IAAD,EACeH,KAAKkB,MAAhCwF,EADY,EACZA,SAAUvF,EADE,EACFA,aACbuF,GAAY1G,KAAK0E,MAAM+B,UAAYtF,EAAa3B,IAAI,SACvDQ,KAAKgE,SAAS,CAAEyC,QAAStF,EAAa3B,IAAI,W,EAI9CuC,OAAA,WAAW,IACDZ,EAAiBnB,KAAKkB,MAAtBC,aACAsF,EAAWzG,KAAK0E,MAAhB+B,OACFE,EAAWxF,EAAa3B,IAAI,cAAgB,IAAIoH,KAAKzF,EAAa3B,IAAI,cACtEqH,EAAS1F,EAAa3B,IAAI,YAAc,IAAIoH,KAAKzF,EAAa3B,IAAI,YAClEsH,EAAM,IAAIF,KACVG,EAAeJ,GAAYE,EAC3BG,EAAWD,GAAgBJ,EAASM,gBAAkBJ,EAAOI,eAAiBJ,EAAOI,gBAAkBH,EAAIG,cAC3GC,EAAcH,GAAgBJ,EAASQ,YAAcN,EAAOM,WAAaR,EAASS,aAAeP,EAAOO,YAAcT,EAASM,gBAAkBJ,EAAOI,cACxJI,EAAWlG,EAAa3B,IAAI,WAElC,OACE,mBAAKwC,UAAU,4BAAf,EACE,sBAAQA,UAAU,mCAAlB,EACE,YAAC,IAAD,CAAkBsE,GAAG,4BAA4BgB,eAAe,iBAC/DP,GAAgB,mCAAS,YAAC,IAAD,CAAepC,MAAOgC,EAAUY,QAAQ,EAAOC,KAAOR,GAAYL,EAASM,gBAAkBH,EAAIG,mBAAiBQ,EAAY,UAAWC,MAAM,QAAQC,IAAI,UAAUC,KAAMP,OAAWI,EAAY,UAAWI,OAAQR,OAAWI,EAAY,YAArP,MAAqQ,YAAC,IAAD,CAAe9C,MAAOkC,EAAQU,QAAQ,EAAOC,KAAOR,GAAYH,EAAOI,gBAAkBH,EAAIG,mBAAiBQ,EAAY,UAAWC,MAAOR,OAAcO,EAAY,QAASE,IAAKT,OAAcO,EAAY,UAAWG,KAAMP,OAAWI,EAAY,UAAWI,OAAQR,OAAWI,EAAY,cAGxjB,YAAC9I,EAAD,CAASwC,aAAcA,IAEvB,YAAC2D,EAAD,CACEW,UAAWtE,EAAa3B,IAAI,aAC5BqE,eAAgB1C,EAAa3B,IAAI,MACjCsE,YAAa9D,KAAKkB,MAAM4C,YACxBC,eAAgB/D,KAAKkB,MAAM6C,eAC3Bf,SAAUhD,KAAKkB,MAAM8B,WAGtByD,GAAU,oBAAMzE,UAAU,kC,GAlDRK,K,YAArBmE,E,YAEe,CACjBrF,aAAcqB,IAAmBC,IAAIC,WACrCM,SAAUR,IAAmBC,IAAIC,WACjCoB,YAAaxB,IAAUuC,KAAKnC,WAC5BqB,eAAgBzB,IAAUuC,KAAKnC,WAC/BoF,KAAMxF,IAAUC,OAAOG,WACvBgE,SAAUpE,IAAUyF,O,IAkDlBC,EADUC,a,gNAYN,CACNC,MAAO,I,gDA0BW,SAAAA,GAClB,EAAKlE,SAAS,CAAEkE,MAAOA,EAAQ,EAAKhH,MAAMiH,cAAchC,U,8CAGxC,WAChB,EAAKnC,SAAS,CAAEkE,OAAQ,EAAKxD,MAAMwD,MAAQ,GAAK,EAAKhH,MAAMiH,cAAchC,U,8CAGzD,WAChB,EAAKnC,SAAS,CAAEkE,OAAQ,EAAKhH,MAAMiH,cAAchC,KAAO,EAAKzB,MAAMwD,MAAQ,GAAK,EAAKhH,MAAMiH,cAAchC,U,IAhCpGiC,yBAAP,SAAgClH,EAAOwD,GACrC,OAAIxD,EAAMiH,cAAchC,KAAO,GAAKzB,EAAMwD,OAAShH,EAAMiH,cAAchC,KAC9D,CAAE+B,MAAOhH,EAAMiH,cAAchC,KAAO,GAEpC,M,2BAIXpG,kBAAA,WACEC,KAAKqI,2B,EAGPlI,mBAAA,WACEH,KAAKqI,2B,EAGPA,wBAAA,WAA4B,IAAD,EACsBrI,KAAKkB,MAA5CoH,EADiB,EACjBA,oBAAqBH,EADJ,EACIA,cACrBD,EAAUlI,KAAK0E,MAAfwD,MACF/G,EAAegH,EAAc3I,IAAI0I,GAClC/G,EAAa3B,IAAI,SAAS8I,EAAoBnH,EAAa3B,IAAI,Q,EAetEuC,OAAA,WAAW,IAAD,SACwB/B,KAAKkB,MAA7BiH,EADA,EACAA,cAAeL,EADf,EACeA,KACfI,EAAUlI,KAAK0E,MAAfwD,MAER,OAAIC,EAAcnC,UACT,KAIP,mBAAKhE,UAAU,sBAAf,iBACc,mBAAKA,UAAU,0BAA0BuB,IAAI,GAAGD,UAAU,QAAQzD,IAAK0I,MADrF,KAGE,mBAAKvG,UAAU,iCAAf,EACE,YAAC,IAAD,CAAqBwG,eAAgBrD,IAAcsD,aAActD,IAAc+C,MAAOA,EAAOQ,cAAe1I,KAAK2I,wBAAjH,EACGR,EAAc1F,KAAI,SAACtB,EAAcyH,GAAf,OACjB,YAACpC,EAAD,CAEErF,aAAcA,EACd6B,SAAU,EAAK9B,MAAM8B,SACrBc,YAAa,EAAK5C,MAAM4C,YACxBC,eAAgB,EAAK7C,MAAM6C,eAC3B+D,KAAMA,EACNpB,SAAUwB,IAAUU,GANfzH,EAAa3B,IAAI,WAW3B2I,EAAchC,KAAO,GACpB,mBAAKnE,UAAU,kCAAf,EACE,YAAC,IAAD,CAAY6G,SAAiC,IAAvBV,EAAchC,KAAY9C,MAAOyE,EAAKgB,cAAcxK,EAASG,UAAWsK,KAAK,eAAe5E,QAASnE,KAAKgJ,gBAAiB7C,KAAM,KACvJ,6BAAO+B,EAAQ,EAAf,MAAqBC,EAAchC,MACnC,YAAC,IAAD,CAAY0C,SAAiC,IAAvBV,EAAchC,KAAY9C,MAAOyE,EAAKgB,cAAcxK,EAASI,MAAOqK,KAAK,gBAAgB5E,QAASnE,KAAKiJ,gBAAiB9C,KAAM,S,GAjFtI9D,K,0BAEP,CACjB8F,cAAe3F,IAAmB+D,KAClCvD,SAAUR,IAAmBC,IAAIC,WACjC4F,oBAAqBhG,IAAUuC,KAAKnC,WACpCoB,YAAaxB,IAAUuC,KAAKnC,WAC5BqB,eAAgBzB,IAAUuC,KAAKnC,WAC/BoF,KAAMxF,IAAUC,OAAOG,a,wFCjWZwG,IAbO,SAAC,GAAD,IAFDC,EAEI7C,EAAH,EAAGA,GAAI8C,EAAP,EAAOA,MAAOpH,EAAd,EAAcA,UAAd,OACpB,iBAAGA,UAAU,wBAAb,EACE,YAAC,IAAD,CAAMsE,GAAIA,EAAI+C,YAAU,EAACrH,UAAWA,IACnCoH,EAAQ,GAAK,iBAAGpH,UAAU,+BAAb,GALGmH,EAKiDC,GALpC,GAAK,MAAQD,O,0NCGzCG,EADUrB,Y,8GASdlG,OAAA,WAAW,IAAD,EACuB/B,KAAKkB,MAA5BqI,EADA,EACAA,SAAUC,EADV,EACUA,SAElB,OACE,4BACE,oBAAMxH,UAAU,iCAAhB,EAA2C,YAAC,IAAD,CAAkBsE,GAAG,6BAA6BgB,eAAe,WAE5G,mBAAKtF,UAAU,6BAAf,EACE,YAAC,IAAD,CAAeyH,OAAO,gBAAgBF,SAAUA,EAAUG,YAAa,CAAC,QAAS,UAAWF,SAAUA,EAAUG,MAAO,YAAC,IAAD,CAAkBrD,GAAG,oCAAoCgB,eAAe,mBAGjM,mBAAKtF,UAAU,6BAAf,EACE,YAAC,IAAD,CAAeyH,OAAO,gBAAgBF,SAAUA,EAAUG,YAAa,CAAC,QAAS,SAAUF,SAAUA,EAAUG,MAAO,YAAC,IAAD,CAAkBrD,GAAG,oCAAoCgB,eAAe,uB,GApB3K7D,IAAMC,iB,UCapBkG,qBAhBS,SAAAlF,GAAK,MAAK,CAChC6E,SAAU7E,EAAMlB,MAAM,CAAC,WAAY,aAGV,SAAAqG,GAAQ,MAAK,CAEtCL,SAFsC,SAE5B3D,EAAKiE,GACbD,EAASE,YAAc,CAAC,QAAF,OAAalE,GAAMiE,KAG3CE,OANsC,WAOpCH,EAASI,mBAKEL,CAA6CN,G,0CCdtDY,EAAiBC,YAAe,CAAC,SAAAzF,GAAK,OAAIA,EAAMlF,IAAI,oBAAmB,SAAAuG,GAAK,OAAIA,EAAMqE,QAAO,SAAC3H,EAAKhC,GAAN,OAAgBgC,EAAI4H,IAAI5J,EAAMjB,IAAI,aAAciB,KAAQ6J,oBAa5IV,qBAXS,SAAAlF,GAAK,MAAK,CAChCyD,cAAezD,EAAMlB,MAAM,CAAC,gBAAiB,UAC7CR,SAAUkH,EAAexF,OAGA,SAAAmF,GAAQ,MAAK,CACtCvB,oBAAqB,SAAAhC,GAAE,OAAIuD,EAASvB,YAAoBhC,KACxDxC,YAAa,SAACwC,EAAIiE,GAAL,OAAcV,EAAS/F,YAAYwC,EAAIiE,KACpDxG,eAAgB,SAACuC,EAAIiE,GAAL,OAAcV,EAAS9F,YAAeuC,EAAIiE,QAG7CX,CAA6C5B,K,0BCH5D,IAAM1J,EAAWC,YAAe,CAC9B8E,MAAM,CAAD,wCACLmH,mBAAmB,CAAD,kEAClBC,mBAAmB,CAAD,oEAadC,EAFUd,mBARQ,SAAAlF,GAAK,MAAK,CAChCiG,UAAWjG,EAAMlB,MAAM,CAAC,YAAa,OAAQ,WAAa,EAC1DoH,UAAWlG,EAAMlB,MAAM,CAAC,YAAa,OAAQ,cAC7CqH,kBAAmBnG,EAAMlB,MAAM,CAAC,gBAAiB,UAAUwC,UAC3D8E,oBAAqBpG,EAAMlB,MAAM,CAAC,gBAAiB,UAAU4F,OAAM,SAAA/H,GAAI,OAAKA,EAAK7B,IAAI,WACrFuL,kBAAmBrG,EAAMlB,MAAM,CAAC,gBAAiB,Y,GAIlDyE,Y,wNAgBa,WAAO,IAAD,EACe,EAAK/G,MAA5B8J,EADQ,EACRA,SAAUnB,EADF,EACEA,SAGhBA,EADEmB,EACOC,YAAaD,GAEbE,YAAU,OAAQ,Q,yCAIlB,SAACC,GAAS,IAAD,EACW,EAAKjK,MAA5B8J,EADY,EACZA,UACRnB,EAFoB,EACFA,UACTuB,YAAWJ,EAAUG,O,gDAGZ,WAClB,EAAKE,OAAOC,e,qCAGL,SAAA1M,GACP,EAAKyM,OAASzM,K,6CAGC,SAAA2M,GACf,EAAKrK,MAAM2I,SAAS2B,YAAmB,CAAED,c,6DAqCV,SAACxM,GAChCA,EAAE0M,kBACF,EAAKvK,MAAM2I,SAAS6B,kB,6BApCtB3L,kBAAA,WACEC,KAAKkB,MAAM2I,SAAS8B,eACpB3L,KAAK4L,sBAAqB,EAAO5L,KAAKkB,MAAM0J,Y,EAG9CzK,mBAAA,SAAoB0L,GAClB7L,KAAK4L,qBAAqBC,EAAUjB,UAAW5K,KAAKkB,MAAM0J,Y,EAG5DkB,qBAAA,WACE9L,KAAK+L,gB,EAGPH,qBAAA,SAAsBI,EAAYpB,GAAY,IACpCf,EAAa7J,KAAKkB,MAAlB2I,SAEJmC,IAAepB,KAEPoB,GAAcpB,EACxB5K,KAAKiM,QAAUC,aAAY,WACzBrC,EAAS2B,iBACR,KACMQ,IAAepB,GACxB5K,KAAK+L,iB,EAITA,aAAA,WACM/L,KAAKiM,UACPE,cAAcnM,KAAKiM,SACnBjM,KAAKiM,QAAU,O,EASnBlK,OAAA,WAAW,IAAD,EACyH/B,KAAKkB,MAA9H4G,EADA,EACAA,KAAMsE,EADN,EACMA,mBAAoBzB,EAD1B,EAC0BA,UAAWK,EADrC,EACqCA,SAAUqB,EAD/C,EAC+CA,YAAaxB,EAD5D,EAC4DA,iBAAkBC,EAD9E,EAC8EA,oBAAqBC,EADnG,EACmGA,kBACrGuB,IAAWtB,EAEbuB,EAAsB,KAgB1B,OAdI1B,IACF0B,EACE,sBACEvK,UAAWiC,IAAW,wBAAyB,CAAE,OAAU8G,IAC3D1H,MAAOyE,EAAKgB,cAAciC,EAAoBzM,EAASmM,mBAAqBnM,EAASkM,oBACrFgC,aAAY1E,EAAKgB,cAAciC,EAAoBzM,EAASmM,mBAAqBnM,EAASkM,oBAC1FiC,eAAc1B,EAAoB,OAAS,QAC3C5G,QAASnE,KAAK0M,qCALhB,EAOE,YAAC,IAAD,CAAepG,GAAG,WAAW8C,MAAO0B,MAMxC,kBAAC,IAAD,CAAQ6B,gBAAiBN,EAAapK,IAAKjC,KAAKkC,OAAQyH,MAAO7B,EAAKgB,cAAcxK,EAAS+E,QACzF,YAAC,IAAD,CACE0F,KAAK,OACL7E,OAAQyG,EACRtH,MAAOyE,EAAKgB,cAAcxK,EAAS+E,OACnCuJ,MAAO5M,KAAK6M,UACZC,OAAQ9M,KAAK+M,WACb5I,QAASnE,KAAKgN,kBACdV,OAAQA,EACRD,YAAaA,EACbY,YAAaV,EACbW,cAAerC,GAAoBE,GAAqB,YAAC,EAAD,UAV1D,EAYE,YAAC,EAAD,KAGF,YAAC,IAAD,CACEoC,aAAcb,EACdc,UAAS,iBAAmBpC,EAC5BqC,WAAYrN,KAAKsN,eACjBC,WAAW,OACXC,aAAc,YAAC,IAAD,CAAkBlH,GAAG,oBAAoBgB,eAAe,iGAAiGmG,OAAQ,CAAEC,OAAQ,YAACC,EAAA,EAAD,CAAMC,GAAG,0BAAT,EAA6B,YAAC,IAAD,CAAkBtH,GAAG,oCAAoCgB,eAAe,4BAC9R8E,mBAAoBA,EACpBO,gBAAiBN,M,GA7HA5I,IAAMC,iB","file":"features/home_timeline.js","sourcesContent":["import React from 'react';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ReactSwipeableViews from 'react-swipeable-views';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport IconButton from 'mastodon/components/icon_button';\nimport Icon from 'mastodon/components/icon';\nimport { defineMessages, injectIntl, FormattedMessage, FormattedDate } from 'react-intl';\nimport { autoPlayGif, reduceMotion } from 'mastodon/initial_state';\nimport { mascot } from 'mastodon/initial_state';\nimport unicodeMapping from 'mastodon/features/emoji/emoji_unicode_mapping_light';\nimport classNames from 'classnames';\nimport EmojiPickerDropdown from 'mastodon/features/compose/containers/emoji_picker_dropdown_container';\nimport AnimatedNumber from 'mastodon/components/animated_number';\nimport TransitionMotion from 'react-motion/lib/TransitionMotion';\nimport spring from 'react-motion/lib/spring';\n\nconst messages = defineMessages({\n close: { id: 'lightbox.close', defaultMessage: 'Close' },\n previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },\n next: { id: 'lightbox.next', defaultMessage: 'Next' },\n});\n\nclass Content extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n announcement: ImmutablePropTypes.map.isRequired,\n };\n\n setRef = c => {\n this.node = c;\n }\n\n componentDidMount () {\n this._updateLinks();\n this._updateEmojis();\n }\n\n componentDidUpdate () {\n this._updateLinks();\n this._updateEmojis();\n }\n\n _updateEmojis () {\n const node = this.node;\n\n if (!node || autoPlayGif) {\n return;\n }\n\n const emojis = node.querySelectorAll('.custom-emoji');\n\n for (var i = 0; i < emojis.length; i++) {\n let emoji = emojis[i];\n\n if (emoji.classList.contains('status-emoji')) {\n continue;\n }\n\n emoji.classList.add('status-emoji');\n\n emoji.addEventListener('mouseenter', this.handleEmojiMouseEnter, false);\n emoji.addEventListener('mouseleave', this.handleEmojiMouseLeave, false);\n }\n }\n\n _updateLinks () {\n const node = this.node;\n\n if (!node) {\n return;\n }\n\n const links = node.querySelectorAll('a');\n\n for (var i = 0; i < links.length; ++i) {\n let link = links[i];\n\n if (link.classList.contains('status-link')) {\n continue;\n }\n\n link.classList.add('status-link');\n\n let mention = this.props.announcement.get('mentions').find(item => link.href === item.get('url'));\n\n if (mention) {\n link.addEventListener('click', this.onMentionClick.bind(this, mention), false);\n link.setAttribute('title', mention.get('acct'));\n } else if (link.textContent[0] === '#' || (link.previousSibling && link.previousSibling.textContent && link.previousSibling.textContent[link.previousSibling.textContent.length - 1] === '#')) {\n link.addEventListener('click', this.onHashtagClick.bind(this, link.text), false);\n } else {\n let status = this.props.announcement.get('statuses').find(item => link.href === item.get('url'));\n if (status) {\n link.addEventListener('click', this.onStatusClick.bind(this, status), false);\n }\n link.setAttribute('title', link.href);\n link.classList.add('unhandled-link');\n }\n\n link.setAttribute('target', '_blank');\n link.setAttribute('rel', 'noopener noreferrer');\n }\n }\n\n onMentionClick = (mention, e) => {\n if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n this.context.router.history.push(`/accounts/${mention.get('id')}`);\n }\n }\n\n onHashtagClick = (hashtag, e) => {\n hashtag = hashtag.replace(/^#/, '');\n\n if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n this.context.router.history.push(`/timelines/tag/${hashtag}`);\n }\n }\n\n onStatusClick = (status, e) => {\n if (this.context.router && e.button === 0 && !(e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n this.context.router.history.push(`/statuses/${status.get('id')}`);\n }\n }\n\n handleEmojiMouseEnter = ({ target }) => {\n target.src = target.getAttribute('data-original');\n }\n\n handleEmojiMouseLeave = ({ target }) => {\n target.src = target.getAttribute('data-static');\n }\n\n render () {\n const { announcement } = this.props;\n\n return (\n <div\n className='announcements__item__content'\n ref={this.setRef}\n dangerouslySetInnerHTML={{ __html: announcement.get('contentHtml') }}\n />\n );\n }\n\n}\n\nconst assetHost = process.env.CDN_HOST || '';\n\nclass Emoji extends React.PureComponent {\n\n static propTypes = {\n emoji: PropTypes.string.isRequired,\n emojiMap: ImmutablePropTypes.map.isRequired,\n hovered: PropTypes.bool.isRequired,\n };\n\n render () {\n const { emoji, emojiMap, hovered } = this.props;\n\n if (unicodeMapping[emoji]) {\n const { filename, shortCode } = unicodeMapping[this.props.emoji];\n const title = shortCode ? `:${shortCode}:` : '';\n\n return (\n <img\n draggable='false'\n className='emojione'\n alt={emoji}\n title={title}\n src={`${assetHost}/emoji/${filename}.svg`}\n />\n );\n } else if (emojiMap.get(emoji)) {\n const filename = (autoPlayGif || hovered) ? emojiMap.getIn([emoji, 'url']) : emojiMap.getIn([emoji, 'static_url']);\n const shortCode = `:${emoji}:`;\n\n return (\n <img\n draggable='false'\n className='emojione custom-emoji'\n alt={shortCode}\n title={shortCode}\n src={filename}\n />\n );\n } else {\n return null;\n }\n }\n\n}\n\nclass Reaction extends ImmutablePureComponent {\n\n static propTypes = {\n announcementId: PropTypes.string.isRequired,\n reaction: ImmutablePropTypes.map.isRequired,\n addReaction: PropTypes.func.isRequired,\n removeReaction: PropTypes.func.isRequired,\n emojiMap: ImmutablePropTypes.map.isRequired,\n style: PropTypes.object,\n };\n\n state = {\n hovered: false,\n };\n\n handleClick = () => {\n const { reaction, announcementId, addReaction, removeReaction } = this.props;\n\n if (reaction.get('me')) {\n removeReaction(announcementId, reaction.get('name'));\n } else {\n addReaction(announcementId, reaction.get('name'));\n }\n }\n\n handleMouseEnter = () => this.setState({ hovered: true })\n\n handleMouseLeave = () => this.setState({ hovered: false })\n\n render () {\n const { reaction } = this.props;\n\n let shortCode = reaction.get('name');\n\n if (unicodeMapping[shortCode]) {\n shortCode = unicodeMapping[shortCode].shortCode;\n }\n\n return (\n <button className={classNames('reactions-bar__item', { active: reaction.get('me') })} onClick={this.handleClick} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} title={`:${shortCode}:`} style={this.props.style}>\n <span className='reactions-bar__item__emoji'><Emoji hovered={this.state.hovered} emoji={reaction.get('name')} emojiMap={this.props.emojiMap} /></span>\n <span className='reactions-bar__item__count'><AnimatedNumber value={reaction.get('count')} /></span>\n </button>\n );\n }\n\n}\n\nclass ReactionsBar extends ImmutablePureComponent {\n\n static propTypes = {\n announcementId: PropTypes.string.isRequired,\n reactions: ImmutablePropTypes.list.isRequired,\n addReaction: PropTypes.func.isRequired,\n removeReaction: PropTypes.func.isRequired,\n emojiMap: ImmutablePropTypes.map.isRequired,\n };\n\n handleEmojiPick = data => {\n const { addReaction, announcementId } = this.props;\n addReaction(announcementId, data.native.replace(/:/g, ''));\n }\n\n willEnter () {\n return { scale: reduceMotion ? 1 : 0 };\n }\n\n willLeave () {\n return { scale: reduceMotion ? 0 : spring(0, { stiffness: 170, damping: 26 }) };\n }\n\n render () {\n const { reactions } = this.props;\n const visibleReactions = reactions.filter(x => x.get('count') > 0);\n\n const styles = visibleReactions.map(reaction => ({\n key: reaction.get('name'),\n data: reaction,\n style: { scale: reduceMotion ? 1 : spring(1, { stiffness: 150, damping: 13 }) },\n })).toArray();\n\n return (\n <TransitionMotion styles={styles} willEnter={this.willEnter} willLeave={this.willLeave}>\n {items => (\n <div className={classNames('reactions-bar', { 'reactions-bar--empty': visibleReactions.isEmpty() })}>\n {items.map(({ key, data, style }) => (\n <Reaction\n key={key}\n reaction={data}\n style={{ transform: `scale(${style.scale})`, position: style.scale < 0.5 ? 'absolute' : 'static' }}\n announcementId={this.props.announcementId}\n addReaction={this.props.addReaction}\n removeReaction={this.props.removeReaction}\n emojiMap={this.props.emojiMap}\n />\n ))}\n\n {visibleReactions.size < 8 && <EmojiPickerDropdown onPickEmoji={this.handleEmojiPick} button={<Icon id='plus' />} />}\n </div>\n )}\n </TransitionMotion>\n );\n }\n\n}\n\nclass Announcement extends ImmutablePureComponent {\n\n static propTypes = {\n announcement: ImmutablePropTypes.map.isRequired,\n emojiMap: ImmutablePropTypes.map.isRequired,\n addReaction: PropTypes.func.isRequired,\n removeReaction: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n selected: PropTypes.bool,\n };\n\n state = {\n unread: !this.props.announcement.get('read'),\n };\n\n componentDidUpdate () {\n const { selected, announcement } = this.props;\n if (!selected && this.state.unread !== !announcement.get('read')) {\n this.setState({ unread: !announcement.get('read') });\n }\n }\n\n render () {\n const { announcement } = this.props;\n const { unread } = this.state;\n const startsAt = announcement.get('starts_at') && new Date(announcement.get('starts_at'));\n const endsAt = announcement.get('ends_at') && new Date(announcement.get('ends_at'));\n const now = new Date();\n const hasTimeRange = startsAt && endsAt;\n const skipYear = hasTimeRange && startsAt.getFullYear() === endsAt.getFullYear() && endsAt.getFullYear() === now.getFullYear();\n const skipEndDate = hasTimeRange && startsAt.getDate() === endsAt.getDate() && startsAt.getMonth() === endsAt.getMonth() && startsAt.getFullYear() === endsAt.getFullYear();\n const skipTime = announcement.get('all_day');\n\n return (\n <div className='announcements__item'>\n <strong className='announcements__item__range'>\n <FormattedMessage id='announcement.announcement' defaultMessage='Announcement' />\n {hasTimeRange && <span> · <FormattedDate value={startsAt} hour12={false} year={(skipYear || startsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month='short' day='2-digit' hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /> - <FormattedDate value={endsAt} hour12={false} year={(skipYear || endsAt.getFullYear() === now.getFullYear()) ? undefined : 'numeric'} month={skipEndDate ? undefined : 'short'} day={skipEndDate ? undefined : '2-digit'} hour={skipTime ? undefined : '2-digit'} minute={skipTime ? undefined : '2-digit'} /></span>}\n </strong>\n\n <Content announcement={announcement} />\n\n <ReactionsBar\n reactions={announcement.get('reactions')}\n announcementId={announcement.get('id')}\n addReaction={this.props.addReaction}\n removeReaction={this.props.removeReaction}\n emojiMap={this.props.emojiMap}\n />\n\n {unread && <span className='announcements__item__unread' />}\n </div>\n );\n }\n\n}\n\nexport default @injectIntl\nclass Announcements extends ImmutablePureComponent {\n\n static propTypes = {\n announcements: ImmutablePropTypes.list,\n emojiMap: ImmutablePropTypes.map.isRequired,\n dismissAnnouncement: PropTypes.func.isRequired,\n addReaction: PropTypes.func.isRequired,\n removeReaction: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n state = {\n index: 0,\n };\n\n static getDerivedStateFromProps(props, state) {\n if (props.announcements.size > 0 && state.index >= props.announcements.size) {\n return { index: props.announcements.size - 1 };\n } else {\n return null;\n }\n }\n\n componentDidMount () {\n this._markAnnouncementAsRead();\n }\n\n componentDidUpdate () {\n this._markAnnouncementAsRead();\n }\n\n _markAnnouncementAsRead () {\n const { dismissAnnouncement, announcements } = this.props;\n const { index } = this.state;\n const announcement = announcements.get(index);\n if (!announcement.get('read')) dismissAnnouncement(announcement.get('id'));\n }\n\n handleChangeIndex = index => {\n this.setState({ index: index % this.props.announcements.size });\n }\n\n handleNextClick = () => {\n this.setState({ index: (this.state.index + 1) % this.props.announcements.size });\n }\n\n handlePrevClick = () => {\n this.setState({ index: (this.props.announcements.size + this.state.index - 1) % this.props.announcements.size });\n }\n\n render () {\n const { announcements, intl } = this.props;\n const { index } = this.state;\n\n if (announcements.isEmpty()) {\n return null;\n }\n\n return (\n <div className='announcements'>\n mascot && ( <img className='announcements__mastodon' alt='' draggable='false' src={mascot} /> )\n\n <div className='announcements__container'>\n <ReactSwipeableViews animateHeight={!reduceMotion} adjustHeight={reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>\n {announcements.map((announcement, idx) => (\n <Announcement\n key={announcement.get('id')}\n announcement={announcement}\n emojiMap={this.props.emojiMap}\n addReaction={this.props.addReaction}\n removeReaction={this.props.removeReaction}\n intl={intl}\n selected={index === idx}\n />\n ))}\n </ReactSwipeableViews>\n\n {announcements.size > 1 && (\n <div className='announcements__pagination'>\n <IconButton disabled={announcements.size === 1} title={intl.formatMessage(messages.previous)} icon='chevron-left' onClick={this.handlePrevClick} size={13} />\n <span>{index + 1} / {announcements.size}</span>\n <IconButton disabled={announcements.size === 1} title={intl.formatMessage(messages.next)} icon='chevron-right' onClick={this.handleNextClick} size={13} />\n </div>\n )}\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Icon from 'mastodon/components/icon';\n\nconst formatNumber = num => num > 40 ? '40+' : num;\n\nconst IconWithBadge = ({ id, count, className }) => (\n <i className='icon-with-badge'>\n <Icon id={id} fixedWidth className={className} />\n {count > 0 && <i className='icon-with-badge__badge'>{formatNumber(count)}</i>}\n </i>\n);\n\nIconWithBadge.propTypes = {\n id: PropTypes.string.isRequired,\n count: PropTypes.number.isRequired,\n className: PropTypes.string,\n};\n\nexport default IconWithBadge;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { injectIntl, FormattedMessage } from 'react-intl';\nimport SettingToggle from '../../notifications/components/setting_toggle';\n\nexport default @injectIntl\nclass ColumnSettings extends React.PureComponent {\n\n static propTypes = {\n settings: ImmutablePropTypes.map.isRequired,\n onChange: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { settings, onChange } = this.props;\n\n return (\n <div>\n <span className='column-settings__section'><FormattedMessage id='home.column_settings.basic' defaultMessage='Basic' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='home_timeline' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={<FormattedMessage id='home.column_settings.show_reblogs' defaultMessage='Show boosts' />} />\n </div>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='home_timeline' settings={settings} settingPath={['shows', 'reply']} onChange={onChange} label={<FormattedMessage id='home.column_settings.show_replies' defaultMessage='Show replies' />} />\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting, saveSettings } from '../../../actions/settings';\n\nconst mapStateToProps = state => ({\n settings: state.getIn(['settings', 'home']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n\n onChange (key, checked) {\n dispatch(changeSetting(['home', ...key], checked));\n },\n\n onSave () {\n dispatch(saveSettings());\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import { connect } from 'react-redux';\nimport { addReaction, removeReaction, dismissAnnouncement } from 'mastodon/actions/announcements';\nimport Announcements from '../components/announcements';\nimport { createSelector } from 'reselect';\nimport { Map as ImmutableMap } from 'immutable';\n\nconst customEmojiMap = createSelector([state => state.get('custom_emojis')], items => items.reduce((map, emoji) => map.set(emoji.get('shortcode'), emoji), ImmutableMap()));\n\nconst mapStateToProps = state => ({\n announcements: state.getIn(['announcements', 'items']),\n emojiMap: customEmojiMap(state),\n});\n\nconst mapDispatchToProps = dispatch => ({\n dismissAnnouncement: id => dispatch(dismissAnnouncement(id)),\n addReaction: (id, name) => dispatch(addReaction(id, name)),\n removeReaction: (id, name) => dispatch(removeReaction(id, name)),\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Announcements);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { expandHomeTimeline } from '../../actions/timelines';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { Link } from 'react-router-dom';\nimport { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/announcements';\nimport AnnouncementsContainer from 'mastodon/features/getting_started/containers/announcements_container';\nimport classNames from 'classnames';\nimport IconWithBadge from 'mastodon/components/icon_with_badge';\n\nconst messages = defineMessages({\n title: { id: 'column.home', defaultMessage: 'Home' },\n show_announcements: { id: 'home.show_announcements', defaultMessage: 'Show announcements' },\n hide_announcements: { id: 'home.hide_announcements', defaultMessage: 'Hide announcements' },\n});\n\nconst mapStateToProps = state => ({\n hasUnread: state.getIn(['timelines', 'home', 'unread']) > 0,\n isPartial: state.getIn(['timelines', 'home', 'isPartial']),\n hasAnnouncements: !state.getIn(['announcements', 'items']).isEmpty(),\n unreadAnnouncements: state.getIn(['announcements', 'items']).count(item => !item.get('read')),\n showAnnouncements: state.getIn(['announcements', 'show']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass HomeTimeline extends React.PureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n intl: PropTypes.object.isRequired,\n hasUnread: PropTypes.bool,\n isPartial: PropTypes.bool,\n columnId: PropTypes.string,\n multiColumn: PropTypes.bool,\n hasAnnouncements: PropTypes.bool,\n unreadAnnouncements: PropTypes.number,\n showAnnouncements: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('HOME', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n this.props.dispatch(expandHomeTimeline({ maxId }));\n }\n\n componentDidMount () {\n this.props.dispatch(fetchAnnouncements());\n this._checkIfReloadNeeded(false, this.props.isPartial);\n }\n\n componentDidUpdate (prevProps) {\n this._checkIfReloadNeeded(prevProps.isPartial, this.props.isPartial);\n }\n\n componentWillUnmount () {\n this._stopPolling();\n }\n\n _checkIfReloadNeeded (wasPartial, isPartial) {\n const { dispatch } = this.props;\n\n if (wasPartial === isPartial) {\n return;\n } else if (!wasPartial && isPartial) {\n this.polling = setInterval(() => {\n dispatch(expandHomeTimeline());\n }, 3000);\n } else if (wasPartial && !isPartial) {\n this._stopPolling();\n }\n }\n\n _stopPolling () {\n if (this.polling) {\n clearInterval(this.polling);\n this.polling = null;\n }\n }\n\n handleToggleAnnouncementsClick = (e) => {\n e.stopPropagation();\n this.props.dispatch(toggleShowAnnouncements());\n }\n\n render () {\n const { intl, shouldUpdateScroll, hasUnread, columnId, multiColumn, hasAnnouncements, unreadAnnouncements, showAnnouncements } = this.props;\n const pinned = !!columnId;\n\n let announcementsButton = null;\n\n if (hasAnnouncements) {\n announcementsButton = (\n <button\n className={classNames('column-header__button', { 'active': showAnnouncements })}\n title={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}\n aria-label={intl.formatMessage(showAnnouncements ? messages.hide_announcements : messages.show_announcements)}\n aria-pressed={showAnnouncements ? 'true' : 'false'}\n onClick={this.handleToggleAnnouncementsClick}\n >\n <IconWithBadge id='bullhorn' count={unreadAnnouncements} />\n </button>\n );\n }\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='home'\n active={hasUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n extraButton={announcementsButton}\n appendContent={hasAnnouncements && showAnnouncements && <AnnouncementsContainer />}\n >\n <ColumnSettingsContainer />\n </ColumnHeader>\n\n <StatusListContainer\n trackScroll={!pinned}\n scrollKey={`home_timeline-${columnId}`}\n onLoadMore={this.handleLoadMore}\n timelineId='home'\n emptyMessage={<FormattedMessage id='empty_column.home' defaultMessage='Your home timeline is empty! Visit {public} or use search to get started and meet other users.' values={{ public: <Link to='/timelines/public'><FormattedMessage id='empty_column.home.public_timeline' defaultMessage='the public timeline' /></Link> }} />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/keyboard_shortcuts.js b/priv/static/packs/features/keyboard_shortcuts.js
index 484204569..cfeb074bd 100644
--- a/priv/static/packs/features/keyboard_shortcuts.js
+++ b/priv/static/packs/features/keyboard_shortcuts.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{791:function(t,e,d){"use strict";d.r(e),d.d(e,"default",(function(){return l}));var o,a,b,c=d(0),i=d(7),s=d(1),j=(d(3),d(731)),O=d(737),r=d(6),v=d(5),u=d.n(v),n=d(18),k=Object(r.f)({heading:{id:"keyboard_shortcuts.heading",defaultMessage:"Keyboard Shortcuts"}}),l=Object(r.g)((b=a=function(t){function e(){return t.apply(this,arguments)||this}return Object(i.a)(e,t),e.prototype.render=function(){var t=this.props,e=t.intl,d=t.multiColumn;return Object(c.a)(j.a,{bindToDocument:!d,icon:"question",heading:e.formatMessage(k.heading)},void 0,Object(c.a)(O.a,{}),Object(c.a)("div",{className:"keyboard-shortcuts scrollable optionally-scrollable"},void 0,Object(c.a)("table",{},void 0,Object(c.a)("thead",{},void 0,Object(c.a)("tr",{},void 0,Object(c.a)("th",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.hotkey",defaultMessage:"Hotkey"})),Object(c.a)("th",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.description",defaultMessage:"Description"})))),Object(c.a)("tbody",{},void 0,Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"r")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.reply",defaultMessage:"to reply"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"m")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.mention",defaultMessage:"to mention author"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"p")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.profile",defaultMessage:"to open author's profile"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"f")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.favourite",defaultMessage:"to favourite"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"b")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.boost",defaultMessage:"to boost"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"enter"),", ",Object(c.a)("kbd",{},void 0,"o")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.enter",defaultMessage:"to open status"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"e")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.open_media",defaultMessage:"to open media"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"x")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.toggle_hidden",defaultMessage:"to show/hide text behind CW"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"h")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.toggle_sensitivity",defaultMessage:"to show/hide media"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"up"),", ",Object(c.a)("kbd",{},void 0,"k")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.up",defaultMessage:"to move up in the list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"down"),", ",Object(c.a)("kbd",{},void 0,"j")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.down",defaultMessage:"to move down in the list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"1"),"-",Object(c.a)("kbd",{},void 0,"9")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.column",defaultMessage:"to focus a status in one of the columns"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"n")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.compose",defaultMessage:"to focus the compose textarea"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"alt"),"+",Object(c.a)("kbd",{},void 0,"n")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.toot",defaultMessage:"to start a brand new toot"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"backspace")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.back",defaultMessage:"to navigate back"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"s")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.search",defaultMessage:"to focus search"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"esc")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.unfocus",defaultMessage:"to un-focus compose textarea/search"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"h")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.home",defaultMessage:"to open home timeline"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"n")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.notifications",defaultMessage:"to open notifications column"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"l")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.local",defaultMessage:"to open local timeline"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"t")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.federated",defaultMessage:"to open federated timeline"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"d")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.direct",defaultMessage:"to open direct messages column"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"s")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.start",defaultMessage:'to open "get started" column'}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"f")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.favourites",defaultMessage:"to open favourites list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"p")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.pinned",defaultMessage:"to open pinned toots list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"u")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.my_profile",defaultMessage:"to open your profile"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"b")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.blocked",defaultMessage:"to open blocked users list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"m")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.muted",defaultMessage:"to open muted users list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"r")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.requests",defaultMessage:"to open follow requests list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"?")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.legend",defaultMessage:"to display this legend"})))))))},e}(n.a),Object(s.a)(a,"propTypes",{intl:u.a.object.isRequired,multiColumn:u.a.bool}),o=b))||o}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{817:function(t,e,d){"use strict";d.r(e),d.d(e,"default",(function(){return l}));var o,a,b,c=d(0),i=(d(9),d(6),d(8)),s=d(1),j=(d(3),d(757)),O=d(763),r=d(7),v=d(5),u=d.n(v),n=d(21);var k=Object(r.f)({heading:{id:"keyboard_shortcuts.heading",defaultMessage:"Keyboard Shortcuts"}}),l=Object(r.g)((b=a=function(t){Object(i.a)(d,t);var e;e=d;function d(){return t.apply(this,arguments)||this}return d.prototype.render=function(){var t=this.props,e=t.intl,d=t.multiColumn;return(Object(c.a)(j.a,{bindToDocument:!d,icon:"question",heading:e.formatMessage(k.heading)},void 0,Object(c.a)(O.a,{}),Object(c.a)("div",{className:"keyboard-shortcuts scrollable optionally-scrollable"},void 0,Object(c.a)("table",{},void 0,Object(c.a)("thead",{},void 0,Object(c.a)("tr",{},void 0,Object(c.a)("th",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.hotkey",defaultMessage:"Hotkey"})),Object(c.a)("th",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.description",defaultMessage:"Description"})))),Object(c.a)("tbody",{},void 0,Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"r")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.reply",defaultMessage:"to reply"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"m")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.mention",defaultMessage:"to mention author"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"p")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.profile",defaultMessage:"to open author's profile"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"f")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.favourite",defaultMessage:"to favourite"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"b")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.boost",defaultMessage:"to boost"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"enter"),", ",Object(c.a)("kbd",{},void 0,"o")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.enter",defaultMessage:"to open status"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"e")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.open_media",defaultMessage:"to open media"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"x")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.toggle_hidden",defaultMessage:"to show/hide text behind CW"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"h")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.toggle_sensitivity",defaultMessage:"to show/hide media"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"up"),", ",Object(c.a)("kbd",{},void 0,"k")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.up",defaultMessage:"to move up in the list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"down"),", ",Object(c.a)("kbd",{},void 0,"j")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.down",defaultMessage:"to move down in the list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"1"),"-",Object(c.a)("kbd",{},void 0,"9")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.column",defaultMessage:"to focus a status in one of the columns"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"n")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.compose",defaultMessage:"to focus the compose textarea"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"alt"),"+",Object(c.a)("kbd",{},void 0,"n")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.toot",defaultMessage:"to start a brand new toot"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"backspace")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.back",defaultMessage:"to navigate back"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"s")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.search",defaultMessage:"to focus search"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"esc")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.unfocus",defaultMessage:"to un-focus compose textarea/search"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"h")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.home",defaultMessage:"to open home timeline"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"n")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.notifications",defaultMessage:"to open notifications column"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"l")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.local",defaultMessage:"to open local timeline"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"t")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.federated",defaultMessage:"to open federated timeline"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"d")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.direct",defaultMessage:"to open direct messages column"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"s")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.start",defaultMessage:'to open "get started" column'}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"f")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.favourites",defaultMessage:"to open favourites list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"p")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.pinned",defaultMessage:"to open pinned toots list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"u")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.my_profile",defaultMessage:"to open your profile"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"b")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.blocked",defaultMessage:"to open blocked users list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"m")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.muted",defaultMessage:"to open muted users list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"g"),"+",Object(c.a)("kbd",{},void 0,"r")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.requests",defaultMessage:"to open follow requests list"}))),Object(c.a)("tr",{},void 0,Object(c.a)("td",{},void 0,Object(c.a)("kbd",{},void 0,"?")),Object(c.a)("td",{},void 0,Object(c.a)(r.b,{id:"keyboard_shortcuts.legend",defaultMessage:"to display this legend"}))))))))},d}(n.a),Object(s.a)(a,"propTypes",{intl:u.a.object.isRequired,multiColumn:u.a.bool}),o=b))||o}}]);
//# sourceMappingURL=keyboard_shortcuts.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/keyboard_shortcuts.js.map b/priv/static/packs/features/keyboard_shortcuts.js.map
index a383cb935..d736f454e 100644
--- a/priv/static/packs/features/keyboard_shortcuts.js.map
+++ b/priv/static/packs/features/keyboard_shortcuts.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/keyboard_shortcuts/index.js"],"names":["messages","defineMessages","heading","KeyboardShortcuts","injectIntl","render","this","props","intl","multiColumn","bindToDocument","icon","formatMessage","className","id","defaultMessage","ImmutablePureComponent","PropTypes","object","isRequired","bool"],"mappings":"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","file":"features/keyboard_shortcuts.js","sourcesContent":["import React from 'react';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' },\n});\n\nexport default @injectIntl\nclass KeyboardShortcuts extends ImmutablePureComponent {\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n render () {\n const { intl, multiColumn } = this.props;\n\n return (\n <Column bindToDocument={!multiColumn} icon='question' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <div className='keyboard-shortcuts scrollable optionally-scrollable'>\n <table>\n <thead>\n <tr>\n <th><FormattedMessage id='keyboard_shortcuts.hotkey' defaultMessage='Hotkey' /></th>\n <th><FormattedMessage id='keyboard_shortcuts.description' defaultMessage='Description' /></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td><kbd>r</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.reply' defaultMessage='to reply' /></td>\n </tr>\n <tr>\n <td><kbd>m</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.mention' defaultMessage='to mention author' /></td>\n </tr>\n <tr>\n <td><kbd>p</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.profile' defaultMessage=\"to open author's profile\" /></td>\n </tr>\n <tr>\n <td><kbd>f</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.favourite' defaultMessage='to favourite' /></td>\n </tr>\n <tr>\n <td><kbd>b</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.boost' defaultMessage='to boost' /></td>\n </tr>\n <tr>\n <td><kbd>enter</kbd>, <kbd>o</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.enter' defaultMessage='to open status' /></td>\n </tr>\n <tr>\n <td><kbd>e</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.open_media' defaultMessage='to open media' /></td>\n </tr>\n <tr>\n <td><kbd>x</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.toggle_hidden' defaultMessage='to show/hide text behind CW' /></td>\n </tr>\n <tr>\n <td><kbd>h</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.toggle_sensitivity' defaultMessage='to show/hide media' /></td>\n </tr>\n <tr>\n <td><kbd>up</kbd>, <kbd>k</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.up' defaultMessage='to move up in the list' /></td>\n </tr>\n <tr>\n <td><kbd>down</kbd>, <kbd>j</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.down' defaultMessage='to move down in the list' /></td>\n </tr>\n <tr>\n <td><kbd>1</kbd>-<kbd>9</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.column' defaultMessage='to focus a status in one of the columns' /></td>\n </tr>\n <tr>\n <td><kbd>n</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.compose' defaultMessage='to focus the compose textarea' /></td>\n </tr>\n <tr>\n <td><kbd>alt</kbd>+<kbd>n</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.toot' defaultMessage='to start a brand new toot' /></td>\n </tr>\n <tr>\n <td><kbd>backspace</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.back' defaultMessage='to navigate back' /></td>\n </tr>\n <tr>\n <td><kbd>s</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.search' defaultMessage='to focus search' /></td>\n </tr>\n <tr>\n <td><kbd>esc</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.unfocus' defaultMessage='to un-focus compose textarea/search' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>h</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.home' defaultMessage='to open home timeline' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>n</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.notifications' defaultMessage='to open notifications column' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>l</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.local' defaultMessage='to open local timeline' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>t</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.federated' defaultMessage='to open federated timeline' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>d</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.direct' defaultMessage='to open direct messages column' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>s</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.start' defaultMessage='to open \"get started\" column' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>f</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.favourites' defaultMessage='to open favourites list' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>p</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.pinned' defaultMessage='to open pinned toots list' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>u</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.my_profile' defaultMessage='to open your profile' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>b</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.blocked' defaultMessage='to open blocked users list' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>m</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.muted' defaultMessage='to open muted users list' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>r</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.requests' defaultMessage='to open follow requests list' /></td>\n </tr>\n <tr>\n <td><kbd>?</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.legend' defaultMessage='to display this legend' /></td>\n </tr>\n </tbody>\n </table>\n </div>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/keyboard_shortcuts/index.js"],"names":["messages","defineMessages","heading","KeyboardShortcuts","injectIntl","render","this","props","intl","multiColumn","bindToDocument","icon","formatMessage","className","id","defaultMessage","ImmutablePureComponent","PropTypes","object","isRequired","bool"],"mappings":"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","file":"features/keyboard_shortcuts.js","sourcesContent":["import React from 'react';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n heading: { id: 'keyboard_shortcuts.heading', defaultMessage: 'Keyboard Shortcuts' },\n});\n\nexport default @injectIntl\nclass KeyboardShortcuts extends ImmutablePureComponent {\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n render () {\n const { intl, multiColumn } = this.props;\n\n return (\n <Column bindToDocument={!multiColumn} icon='question' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <div className='keyboard-shortcuts scrollable optionally-scrollable'>\n <table>\n <thead>\n <tr>\n <th><FormattedMessage id='keyboard_shortcuts.hotkey' defaultMessage='Hotkey' /></th>\n <th><FormattedMessage id='keyboard_shortcuts.description' defaultMessage='Description' /></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td><kbd>r</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.reply' defaultMessage='to reply' /></td>\n </tr>\n <tr>\n <td><kbd>m</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.mention' defaultMessage='to mention author' /></td>\n </tr>\n <tr>\n <td><kbd>p</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.profile' defaultMessage=\"to open author's profile\" /></td>\n </tr>\n <tr>\n <td><kbd>f</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.favourite' defaultMessage='to favourite' /></td>\n </tr>\n <tr>\n <td><kbd>b</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.boost' defaultMessage='to boost' /></td>\n </tr>\n <tr>\n <td><kbd>enter</kbd>, <kbd>o</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.enter' defaultMessage='to open status' /></td>\n </tr>\n <tr>\n <td><kbd>e</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.open_media' defaultMessage='to open media' /></td>\n </tr>\n <tr>\n <td><kbd>x</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.toggle_hidden' defaultMessage='to show/hide text behind CW' /></td>\n </tr>\n <tr>\n <td><kbd>h</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.toggle_sensitivity' defaultMessage='to show/hide media' /></td>\n </tr>\n <tr>\n <td><kbd>up</kbd>, <kbd>k</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.up' defaultMessage='to move up in the list' /></td>\n </tr>\n <tr>\n <td><kbd>down</kbd>, <kbd>j</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.down' defaultMessage='to move down in the list' /></td>\n </tr>\n <tr>\n <td><kbd>1</kbd>-<kbd>9</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.column' defaultMessage='to focus a status in one of the columns' /></td>\n </tr>\n <tr>\n <td><kbd>n</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.compose' defaultMessage='to focus the compose textarea' /></td>\n </tr>\n <tr>\n <td><kbd>alt</kbd>+<kbd>n</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.toot' defaultMessage='to start a brand new toot' /></td>\n </tr>\n <tr>\n <td><kbd>backspace</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.back' defaultMessage='to navigate back' /></td>\n </tr>\n <tr>\n <td><kbd>s</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.search' defaultMessage='to focus search' /></td>\n </tr>\n <tr>\n <td><kbd>esc</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.unfocus' defaultMessage='to un-focus compose textarea/search' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>h</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.home' defaultMessage='to open home timeline' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>n</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.notifications' defaultMessage='to open notifications column' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>l</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.local' defaultMessage='to open local timeline' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>t</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.federated' defaultMessage='to open federated timeline' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>d</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.direct' defaultMessage='to open direct messages column' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>s</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.start' defaultMessage='to open \"get started\" column' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>f</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.favourites' defaultMessage='to open favourites list' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>p</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.pinned' defaultMessage='to open pinned toots list' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>u</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.my_profile' defaultMessage='to open your profile' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>b</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.blocked' defaultMessage='to open blocked users list' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>m</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.muted' defaultMessage='to open muted users list' /></td>\n </tr>\n <tr>\n <td><kbd>g</kbd>+<kbd>r</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.requests' defaultMessage='to open follow requests list' /></td>\n </tr>\n <tr>\n <td><kbd>?</kbd></td>\n <td><FormattedMessage id='keyboard_shortcuts.legend' defaultMessage='to display this legend' /></td>\n </tr>\n </tbody>\n </table>\n </div>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/list_adder.js b/priv/static/packs/features/list_adder.js
index 84fe9926c..0b4da1969 100644
--- a/priv/static/packs/features/list_adder.js
+++ b/priv/static/packs/features/list_adder.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{828:function(t,e,n){"use strict";n.r(e);var i,a,c,o,s,r,d,u,l,p=n(0),b=n(7),f=n(1),v=(n(3),n(5)),j=n.n(v),O=n(14),m=n.n(O),_=n(13),R=n(18),g=n(6),I=n(29),h=n(54),N=n(50),q=n(26),y=Object(g.f)({remove:{id:"lists.account.remove",defaultMessage:"Remove from list"},add:{id:"lists.account.add",defaultMessage:"Add to list"}}),w=Object(_.connect)((function(t,e){var n=e.listId,i=e.added;return{list:t.get("lists").get(n),added:void 0===i?t.getIn(["listAdder","lists","items"]).includes(n):i}}),(function(t,e){var n=e.listId;return{onRemove:function(){return t(Object(I.J)(n))},onAdd:function(){return t(Object(I.A)(n))}}}))(i=Object(g.g)((c=a=function(t){function e(){return t.apply(this,arguments)||this}return Object(b.a)(e,t),e.prototype.render=function(){var t,e=this.props,n=e.list,i=e.intl,a=e.onRemove,c=e.onAdd;return t=e.added?Object(p.a)(N.a,{icon:"times",title:i.formatMessage(y.remove),onClick:a}):Object(p.a)(N.a,{icon:"plus",title:i.formatMessage(y.add),onClick:c}),Object(p.a)("div",{className:"list"},void 0,Object(p.a)("div",{className:"list__wrapper"},void 0,Object(p.a)("div",{className:"list__display-name"},void 0,Object(p.a)(q.a,{id:"list-ul",className:"column-link__icon",fixedWidth:!0}),n.get("title")),Object(p.a)("div",{className:"account__relationship"},void 0,t)))},e}(R.a),Object(f.a)(a,"propTypes",{list:m.a.map.isRequired,intl:j.a.object.isRequired,onRemove:j.a.func.isRequired,onAdd:j.a.func.isRequired,added:j.a.bool}),Object(f.a)(a,"defaultProps",{added:!1}),i=c))||i)||i,A=n(206),k=n(111),M=n(118),z=Object(_.connect)((function(){var t=Object(A.d)();return function(e,n){var i=n.accountId;return{account:t(e,i)}}}))(o=Object(g.g)((r=s=function(t){function e(){return t.apply(this,arguments)||this}return Object(b.a)(e,t),e.prototype.render=function(){var t=this.props.account;return Object(p.a)("div",{className:"account"},void 0,Object(p.a)("div",{className:"account__wrapper"},void 0,Object(p.a)("div",{className:"account__display-name"},void 0,Object(p.a)("div",{className:"account__avatar-wrapper"},void 0,Object(p.a)(k.a,{account:t,size:36})),Object(p.a)(M.a,{account:t}))))},e}(R.a),Object(f.a)(s,"propTypes",{account:m.a.map.isRequired}),o=r))||o)||o,C=n(1142);n.d(e,"default",(function(){return T}));var J=Object(h.a)([function(t){return t.get("lists")}],(function(t){return t?t.toList().filter((function(t){return!!t})).sort((function(t,e){return t.get("title").localeCompare(e.get("title"))})):t})),T=Object(_.connect)((function(t){return{listIds:J(t).map((function(t){return t.get("id")}))}}),(function(t){return{onInitialize:function(e){return t(Object(I.N)(e))},onReset:function(){return t(Object(I.L)())}}}))(d=Object(g.g)((l=u=function(t){function e(){return t.apply(this,arguments)||this}Object(b.a)(e,t);var n=e.prototype;return n.componentDidMount=function(){var t=this.props;(0,t.onInitialize)(t.accountId)},n.componentWillUnmount=function(){(0,this.props.onReset)()},n.render=function(){var t=this.props,e=t.accountId,n=t.listIds;return Object(p.a)("div",{className:"modal-root__modal list-adder"},void 0,Object(p.a)("div",{className:"list-adder__account"},void 0,Object(p.a)(z,{accountId:e})),Object(p.a)(C.a,{}),Object(p.a)("div",{className:"list-adder__lists"},void 0,n.map((function(t){return Object(p.a)(w,{listId:t},t)}))))},e}(R.a),Object(f.a)(u,"propTypes",{accountId:j.a.string.isRequired,onClose:j.a.func.isRequired,intl:j.a.object.isRequired,onInitialize:j.a.func.isRequired,onReset:j.a.func.isRequired,listIds:m.a.list.isRequired}),d=l))||d)||d}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{854:function(t,e,n){"use strict";n.r(e),n.d(e,"default",(function(){return T}));var i,a,c,o=n(0),r=(n(9),n(6),n(8)),s=n(1),d=(n(3),n(5)),u=n.n(d),l=n(16),p=n.n(l),v=n(15),b=n(21),f=n(7),j=n(31),O=n(57),m=n(53),_=n(27);var R,g,I,h=Object(f.f)({remove:{id:"lists.account.remove",defaultMessage:"Remove from list"},add:{id:"lists.account.add",defaultMessage:"Add to list"}}),N=Object(v.connect)((function(t,e){var n=e.listId,i=e.added;return{list:t.get("lists").get(n),added:void 0===i?t.getIn(["listAdder","lists","items"]).includes(n):i}}),(function(t,e){var n=e.listId;return{onRemove:function(){return t(Object(j.J)(n))},onAdd:function(){return t(Object(j.A)(n))}}}))(i=Object(f.g)((c=a=function(t){Object(r.a)(n,t);var e;e=n;function n(){return t.apply(this,arguments)||this}return n.prototype.render=function(){var t,e=this.props,n=e.list,i=e.intl,a=e.onRemove,c=e.onAdd;return t=e.added?Object(o.a)(m.a,{icon:"times",title:i.formatMessage(h.remove),onClick:a}):Object(o.a)(m.a,{icon:"plus",title:i.formatMessage(h.add),onClick:c}),Object(o.a)("div",{className:"list"},void 0,Object(o.a)("div",{className:"list__wrapper"},void 0,Object(o.a)("div",{className:"list__display-name"},void 0,Object(o.a)(_.a,{id:"list-ul",className:"column-link__icon",fixedWidth:!0}),n.get("title")),Object(o.a)("div",{className:"account__relationship"},void 0,t)))},n}(b.a),Object(s.a)(a,"propTypes",{list:p.a.map.isRequired,intl:u.a.object.isRequired,onRemove:u.a.func.isRequired,onAdd:u.a.func.isRequired,added:u.a.bool}),Object(s.a)(a,"defaultProps",{added:!1}),i=c))||i)||i,q=n(210),y=n(115),w=n(122);var A,k,M,z=Object(v.connect)((function(){var t=Object(q.d)();return function(e,n){var i=n.accountId;return{account:t(e,i)}}}))(R=Object(f.g)((I=g=function(t){Object(r.a)(n,t);var e;e=n;function n(){return t.apply(this,arguments)||this}return n.prototype.render=function(){var t=this.props.account;return(Object(o.a)("div",{className:"account"},void 0,Object(o.a)("div",{className:"account__wrapper"},void 0,Object(o.a)("div",{className:"account__display-name"},void 0,Object(o.a)("div",{className:"account__avatar-wrapper"},void 0,Object(o.a)(y.a,{account:t,size:36})),Object(o.a)(w.a,{account:t})))))},n}(b.a),Object(s.a)(g,"propTypes",{account:p.a.map.isRequired}),R=I))||R)||R,C=n(1175);var J=Object(O.a)([function(t){return t.get("lists")}],(function(t){return t?t.toList().filter((function(t){return!!t})).sort((function(t,e){return t.get("title").localeCompare(e.get("title"))})):t})),T=Object(v.connect)((function(t){return{listIds:J(t).map((function(t){return t.get("id")}))}}),(function(t){return{onInitialize:function(e){return t(Object(j.N)(e))},onReset:function(){return t(Object(j.L)())}}}))(A=Object(f.g)((M=k=function(t){Object(r.a)(n,t);var e;e=n;function n(){return t.apply(this,arguments)||this}var i=n.prototype;return i.componentDidMount=function(){var t=this.props;(0,t.onInitialize)(t.accountId)},i.componentWillUnmount=function(){(0,this.props.onReset)()},i.render=function(){var t=this.props,e=t.accountId,n=t.listIds;return(Object(o.a)("div",{className:"modal-root__modal list-adder"},void 0,Object(o.a)("div",{className:"list-adder__account"},void 0,Object(o.a)(z,{accountId:e})),Object(o.a)(C.a,{}),Object(o.a)("div",{className:"list-adder__lists"},void 0,n.map((function(t){return Object(o.a)(N,{listId:t},t)})))))},n}(b.a),Object(s.a)(k,"propTypes",{accountId:u.a.string.isRequired,onClose:u.a.func.isRequired,intl:u.a.object.isRequired,onInitialize:u.a.func.isRequired,onReset:u.a.func.isRequired,listIds:p.a.list.isRequired}),A=M))||A)||A}}]);
//# sourceMappingURL=list_adder.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/list_adder.js.map b/priv/static/packs/features/list_adder.js.map
index f29e5f9f8..f3b671cad 100644
--- a/priv/static/packs/features/list_adder.js.map
+++ b/priv/static/packs/features/list_adder.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_adder/components/list.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_adder/components/account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_adder/index.js"],"names":["messages","defineMessages","remove","add","List","connect","state","listId","added","list","get","getIn","includes","dispatch","onRemove","removeFromListAdder","onAdd","addToListAdder","injectIntl","render","button","this","props","intl","icon","title","formatMessage","onClick","className","id","fixedWidth","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","bool","Account","getAccount","makeGetAccount","accountId","account","size","getOrderedLists","createSelector","lists","toList","filter","item","sort","a","b","localeCompare","ListAdder","listIds","onInitialize","setupListAdder","onReset","resetListAdder","componentDidMount","componentWillUnmount","ListId","string","onClose"],"mappings":"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","file":"features/list_adder.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { removeFromListAdder, addToListAdder } from '../../../actions/lists';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },\n add: { id: 'lists.account.add', defaultMessage: 'Add to list' },\n});\n\nconst MapStateToProps = (state, { listId, added }) => ({\n list: state.get('lists').get(listId),\n added: typeof added === 'undefined' ? state.getIn(['listAdder', 'lists', 'items']).includes(listId) : added,\n});\n\nconst mapDispatchToProps = (dispatch, { listId }) => ({\n onRemove: () => dispatch(removeFromListAdder(listId)),\n onAdd: () => dispatch(addToListAdder(listId)),\n});\n\nexport default @connect(MapStateToProps, mapDispatchToProps)\n@injectIntl\nclass List extends ImmutablePureComponent {\n\n static propTypes = {\n list: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onRemove: PropTypes.func.isRequired,\n onAdd: PropTypes.func.isRequired,\n added: PropTypes.bool,\n };\n\n static defaultProps = {\n added: false,\n };\n\n render () {\n const { list, intl, onRemove, onAdd, added } = this.props;\n\n let button;\n\n if (added) {\n button = <IconButton icon='times' title={intl.formatMessage(messages.remove)} onClick={onRemove} />;\n } else {\n button = <IconButton icon='plus' title={intl.formatMessage(messages.add)} onClick={onAdd} />;\n }\n\n return (\n <div className='list'>\n <div className='list__wrapper'>\n <div className='list__display-name'>\n <Icon id='list-ul' className='column-link__icon' fixedWidth />\n {list.get('title')}\n </div>\n\n <div className='account__relationship'>\n {button}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from '../../../selectors';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport { injectIntl } from 'react-intl';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { accountId }) => ({\n account: getAccount(state, accountId),\n });\n\n return mapStateToProps;\n};\n\n\nexport default @connect(makeMapStateToProps)\n@injectIntl\nclass Account extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n };\n\n render () {\n const { account } = this.props;\n return (\n <div className='account'>\n <div className='account__wrapper'>\n <div className='account__display-name'>\n <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n <DisplayName account={account} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { injectIntl } from 'react-intl';\nimport { setupListAdder, resetListAdder } from '../../actions/lists';\nimport { createSelector } from 'reselect';\nimport List from './components/list';\nimport Account from './components/account';\nimport NewListForm from '../lists/components/new_list_form';\n// hack\n\nconst getOrderedLists = createSelector([state => state.get('lists')], lists => {\n if (!lists) {\n return lists;\n }\n\n return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));\n});\n\nconst mapStateToProps = state => ({\n listIds: getOrderedLists(state).map(list=>list.get('id')),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onInitialize: accountId => dispatch(setupListAdder(accountId)),\n onReset: () => dispatch(resetListAdder()),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass ListAdder extends ImmutablePureComponent {\n\n static propTypes = {\n accountId: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n onInitialize: PropTypes.func.isRequired,\n onReset: PropTypes.func.isRequired,\n listIds: ImmutablePropTypes.list.isRequired,\n };\n\n componentDidMount () {\n const { onInitialize, accountId } = this.props;\n onInitialize(accountId);\n }\n\n componentWillUnmount () {\n const { onReset } = this.props;\n onReset();\n }\n\n render () {\n const { accountId, listIds } = this.props;\n\n return (\n <div className='modal-root__modal list-adder'>\n <div className='list-adder__account'>\n <Account accountId={accountId} />\n </div>\n\n <NewListForm />\n\n\n <div className='list-adder__lists'>\n {listIds.map(ListId => <List key={ListId} listId={ListId} />)}\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_adder/components/list.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_adder/components/account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_adder/index.js"],"names":["messages","defineMessages","remove","add","List","connect","state","listId","added","list","get","getIn","includes","dispatch","onRemove","removeFromListAdder","onAdd","addToListAdder","injectIntl","render","button","this","props","intl","icon","title","formatMessage","onClick","className","id","fixedWidth","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","bool","Account","getAccount","makeGetAccount","accountId","account","size","getOrderedLists","createSelector","lists","toList","filter","item","sort","a","b","localeCompare","ListAdder","listIds","onInitialize","setupListAdder","onReset","resetListAdder","componentDidMount","componentWillUnmount","ListId","string","onClose"],"mappings":"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","file":"features/list_adder.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { removeFromListAdder, addToListAdder } from '../../../actions/lists';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },\n add: { id: 'lists.account.add', defaultMessage: 'Add to list' },\n});\n\nconst MapStateToProps = (state, { listId, added }) => ({\n list: state.get('lists').get(listId),\n added: typeof added === 'undefined' ? state.getIn(['listAdder', 'lists', 'items']).includes(listId) : added,\n});\n\nconst mapDispatchToProps = (dispatch, { listId }) => ({\n onRemove: () => dispatch(removeFromListAdder(listId)),\n onAdd: () => dispatch(addToListAdder(listId)),\n});\n\nexport default @connect(MapStateToProps, mapDispatchToProps)\n@injectIntl\nclass List extends ImmutablePureComponent {\n\n static propTypes = {\n list: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onRemove: PropTypes.func.isRequired,\n onAdd: PropTypes.func.isRequired,\n added: PropTypes.bool,\n };\n\n static defaultProps = {\n added: false,\n };\n\n render () {\n const { list, intl, onRemove, onAdd, added } = this.props;\n\n let button;\n\n if (added) {\n button = <IconButton icon='times' title={intl.formatMessage(messages.remove)} onClick={onRemove} />;\n } else {\n button = <IconButton icon='plus' title={intl.formatMessage(messages.add)} onClick={onAdd} />;\n }\n\n return (\n <div className='list'>\n <div className='list__wrapper'>\n <div className='list__display-name'>\n <Icon id='list-ul' className='column-link__icon' fixedWidth />\n {list.get('title')}\n </div>\n\n <div className='account__relationship'>\n {button}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from '../../../selectors';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport { injectIntl } from 'react-intl';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { accountId }) => ({\n account: getAccount(state, accountId),\n });\n\n return mapStateToProps;\n};\n\n\nexport default @connect(makeMapStateToProps)\n@injectIntl\nclass Account extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n };\n\n render () {\n const { account } = this.props;\n return (\n <div className='account'>\n <div className='account__wrapper'>\n <div className='account__display-name'>\n <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n <DisplayName account={account} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { injectIntl } from 'react-intl';\nimport { setupListAdder, resetListAdder } from '../../actions/lists';\nimport { createSelector } from 'reselect';\nimport List from './components/list';\nimport Account from './components/account';\nimport NewListForm from '../lists/components/new_list_form';\n// hack\n\nconst getOrderedLists = createSelector([state => state.get('lists')], lists => {\n if (!lists) {\n return lists;\n }\n\n return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));\n});\n\nconst mapStateToProps = state => ({\n listIds: getOrderedLists(state).map(list=>list.get('id')),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onInitialize: accountId => dispatch(setupListAdder(accountId)),\n onReset: () => dispatch(resetListAdder()),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass ListAdder extends ImmutablePureComponent {\n\n static propTypes = {\n accountId: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n onInitialize: PropTypes.func.isRequired,\n onReset: PropTypes.func.isRequired,\n listIds: ImmutablePropTypes.list.isRequired,\n };\n\n componentDidMount () {\n const { onInitialize, accountId } = this.props;\n onInitialize(accountId);\n }\n\n componentWillUnmount () {\n const { onReset } = this.props;\n onReset();\n }\n\n render () {\n const { accountId, listIds } = this.props;\n\n return (\n <div className='modal-root__modal list-adder'>\n <div className='list-adder__account'>\n <Account accountId={accountId} />\n </div>\n\n <NewListForm />\n\n\n <div className='list-adder__lists'>\n {listIds.map(ListId => <List key={ListId} listId={ListId} />)}\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/list_editor.js b/priv/static/packs/features/list_editor.js
index 76f0f6599..f63276d6c 100644
--- a/priv/static/packs/features/list_editor.js
+++ b/priv/static/packs/features/list_editor.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{815:function(e,t,n){"use strict";n.r(t);var a,c,i,o,r,s,u,d,l=n(0),b=n(7),p=n(1),f=n(3),j=n.n(f),O=n(5),h=n.n(O),v=n(14),m=n.n(v),g=n(13),C=n(18),_=n(6),y=n(29),I=n(206),R=n(111),N=n(118),w=n(50),k=Object(_.f)({remove:{id:"lists.account.remove",defaultMessage:"Remove from list"},add:{id:"lists.account.add",defaultMessage:"Add to list"}}),q=Object(g.connect)((function(){var e=Object(I.d)();return function(t,n){var a=n.accountId,c=n.added;return{account:e(t,a),added:void 0===c?t.getIn(["listEditor","accounts","items"]).includes(a):c}}}),(function(e,t){var n=t.accountId;return{onRemove:function(){return e(Object(y.K)(n))},onAdd:function(){return e(Object(y.B)(n))}}}))(a=Object(_.g)((i=c=function(e){function t(){return e.apply(this,arguments)||this}return Object(b.a)(t,e),t.prototype.render=function(){var e,t=this.props,n=t.account,a=t.intl,c=t.onRemove,i=t.onAdd;return e=t.added?Object(l.a)(w.a,{icon:"times",title:a.formatMessage(k.remove),onClick:c}):Object(l.a)(w.a,{icon:"plus",title:a.formatMessage(k.add),onClick:i}),Object(l.a)("div",{className:"account"},void 0,Object(l.a)("div",{className:"account__wrapper"},void 0,Object(l.a)("div",{className:"account__display-name"},void 0,Object(l.a)("div",{className:"account__avatar-wrapper"},void 0,Object(l.a)(R.a,{account:n,size:36})),Object(l.a)(N.a,{account:n})),Object(l.a)("div",{className:"account__relationship"},void 0,e)))},t}(C.a),Object(p.a)(c,"propTypes",{account:m.a.map.isRequired,intl:h.a.object.isRequired,onRemove:h.a.func.isRequired,onAdd:h.a.func.isRequired,added:h.a.bool}),Object(p.a)(c,"defaultProps",{added:!1}),a=i))||a)||a,M=n(2),S=n(12),A=n.n(S),E=n(26),x=Object(_.f)({search:{id:"lists.search",defaultMessage:"Search among people you follow"}}),z=Object(g.connect)((function(e){return{value:e.getIn(["listEditor","suggestions","value"])}}),(function(e){return{onSubmit:function(t){return e(Object(y.H)(t))},onClear:function(){return e(Object(y.E)())},onChange:function(t){return e(Object(y.D)(t))}}}))(o=Object(_.g)(o=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),c=0;c<n;c++)a[c]=arguments[c];return t=e.call.apply(e,[this].concat(a))||this,Object(p.a)(Object(M.a)(t),"handleChange",(function(e){t.props.onChange(e.target.value)})),Object(p.a)(Object(M.a)(t),"handleKeyUp",(function(e){13===e.keyCode&&t.props.onSubmit(t.props.value)})),Object(p.a)(Object(M.a)(t),"handleClear",(function(){t.props.onClear()})),t}return Object(b.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.value,n=e.intl,a=t.length>0;return Object(l.a)("div",{className:"list-editor__search search"},void 0,Object(l.a)("label",{},void 0,Object(l.a)("span",{style:{display:"none"}},void 0,n.formatMessage(x.search)),Object(l.a)("input",{className:"search__input",type:"text",value:t,onChange:this.handleChange,onKeyUp:this.handleKeyUp,placeholder:n.formatMessage(x.search)})),Object(l.a)("div",{role:"button",tabIndex:"0",className:"search__icon",onClick:this.handleClear},void 0,Object(l.a)(E.a,{id:"search",className:A()({active:!a})}),Object(l.a)(E.a,{id:"times-circle","aria-label":n.formatMessage(x.search),className:A()({active:a})})))},t}(j.a.PureComponent))||o)||o,K=Object(_.f)({title:{id:"lists.edit.submit",defaultMessage:"Change title"}}),P=Object(g.connect)((function(e){return{value:e.getIn(["listEditor","title"]),disabled:!e.getIn(["listEditor","isChanged"])||!e.getIn(["listEditor","title"])}}),(function(e){return{onChange:function(t){return e(Object(y.C)(t))},onSubmit:function(){return e(Object(y.P)(!1))}}}))(r=Object(_.g)(r=function(e){function t(){for(var t,n=arguments.length,a=new Array(n),c=0;c<n;c++)a[c]=arguments[c];return t=e.call.apply(e,[this].concat(a))||this,Object(p.a)(Object(M.a)(t),"handleChange",(function(e){t.props.onChange(e.target.value)})),Object(p.a)(Object(M.a)(t),"handleSubmit",(function(e){e.preventDefault(),t.props.onSubmit()})),Object(p.a)(Object(M.a)(t),"handleClick",(function(){t.props.onSubmit()})),t}return Object(b.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.value,n=e.disabled,a=e.intl.formatMessage(K.title);return Object(l.a)("form",{className:"column-inline-form",onSubmit:this.handleSubmit},void 0,Object(l.a)("input",{className:"setting-text",value:t,onChange:this.handleChange}),Object(l.a)(w.a,{disabled:n,icon:"check",title:a,onClick:this.handleClick}))},t}(j.a.PureComponent))||r)||r,U=n(97),D=n(34),J=n.n(D);n.d(t,"default",(function(){return T}));var T=Object(g.connect)((function(e){return{accountIds:e.getIn(["listEditor","accounts","items"]),searchAccountIds:e.getIn(["listEditor","suggestions","items"])}}),(function(e){return{onInitialize:function(t){return e(Object(y.O)(t))},onClear:function(){return e(Object(y.E)())},onReset:function(){return e(Object(y.M)())}}}))(s=Object(_.g)((d=u=function(e){function t(){return e.apply(this,arguments)||this}Object(b.a)(t,e);var n=t.prototype;return n.componentDidMount=function(){var e=this.props;(0,e.onInitialize)(e.listId)},n.componentWillUnmount=function(){(0,this.props.onReset)()},n.render=function(){var e=this.props,t=e.accountIds,n=e.searchAccountIds,a=e.onClear,c=n.size>0;return Object(l.a)("div",{className:"modal-root__modal list-editor"},void 0,Object(l.a)(P,{}),Object(l.a)(z,{}),Object(l.a)("div",{className:"drawer__pager"},void 0,Object(l.a)("div",{className:"drawer__inner list-editor__accounts"},void 0,t.map((function(e){return Object(l.a)(q,{accountId:e,added:!0},e)}))),c&&Object(l.a)("div",{role:"button",tabIndex:"-1",className:"drawer__backdrop",onClick:a}),Object(l.a)(U.a,{defaultStyle:{x:-100},style:{x:J()(c?0:-100,{stiffness:210,damping:20})}},void 0,(function(e){var t=e.x;return Object(l.a)("div",{className:"drawer__inner backdrop",style:{transform:0===t?null:"translateX("+t+"%)",visibility:-100===t?"hidden":"visible"}},void 0,n.map((function(e){return Object(l.a)(q,{accountId:e},e)})))}))))},t}(C.a),Object(p.a)(u,"propTypes",{listId:h.a.string.isRequired,onClose:h.a.func.isRequired,intl:h.a.object.isRequired,onInitialize:h.a.func.isRequired,onClear:h.a.func.isRequired,onReset:h.a.func.isRequired,accountIds:m.a.list.isRequired,searchAccountIds:m.a.list.isRequired}),s=d))||s)||s}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{843:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return T}));var a,c,i,o=n(0),r=(n(9),n(6),n(8)),s=n(1),u=n(3),d=n.n(u),l=n(5),b=n.n(l),p=n(16),f=n.n(p),j=n(15),v=n(21),O=n(7),h=n(31),m=n(210),g=n(115),C=n(122),_=n(53);var y,I=Object(O.f)({remove:{id:"lists.account.remove",defaultMessage:"Remove from list"},add:{id:"lists.account.add",defaultMessage:"Add to list"}}),R=Object(j.connect)((function(){var e=Object(m.d)();return function(t,n){var a=n.accountId,c=n.added;return{account:e(t,a),added:void 0===c?t.getIn(["listEditor","accounts","items"]).includes(a):c}}}),(function(e,t){var n=t.accountId;return{onRemove:function(){return e(Object(h.K)(n))},onAdd:function(){return e(Object(h.B)(n))}}}))(a=Object(O.g)((i=c=function(e){Object(r.a)(n,e);var t;t=n;function n(){return e.apply(this,arguments)||this}return n.prototype.render=function(){var e,t=this.props,n=t.account,a=t.intl,c=t.onRemove,i=t.onAdd;return e=t.added?Object(o.a)(_.a,{icon:"times",title:a.formatMessage(I.remove),onClick:c}):Object(o.a)(_.a,{icon:"plus",title:a.formatMessage(I.add),onClick:i}),Object(o.a)("div",{className:"account"},void 0,Object(o.a)("div",{className:"account__wrapper"},void 0,Object(o.a)("div",{className:"account__display-name"},void 0,Object(o.a)("div",{className:"account__avatar-wrapper"},void 0,Object(o.a)(g.a,{account:n,size:36})),Object(o.a)(C.a,{account:n})),Object(o.a)("div",{className:"account__relationship"},void 0,e)))},n}(v.a),Object(s.a)(c,"propTypes",{account:f.a.map.isRequired,intl:b.a.object.isRequired,onRemove:b.a.func.isRequired,onAdd:b.a.func.isRequired,added:b.a.bool}),Object(s.a)(c,"defaultProps",{added:!1}),a=i))||a)||a,N=n(2),w=n(14),k=n.n(w),q=n(27);var M,S=Object(O.f)({search:{id:"lists.search",defaultMessage:"Search among people you follow"}}),A=Object(j.connect)((function(e){return{value:e.getIn(["listEditor","suggestions","value"])}}),(function(e){return{onSubmit:function(t){return e(Object(h.H)(t))},onClear:function(){return e(Object(h.E)())},onChange:function(t){return e(Object(h.D)(t))}}}))(y=Object(O.g)(y=function(e){Object(r.a)(n,e);var t;t=n;function n(){for(var t,n=arguments.length,a=new Array(n),c=0;c<n;c++)a[c]=arguments[c];return t=e.call.apply(e,[this].concat(a))||this,Object(s.a)(Object(N.a)(t),"handleChange",(function(e){t.props.onChange(e.target.value)})),Object(s.a)(Object(N.a)(t),"handleKeyUp",(function(e){13===e.keyCode&&t.props.onSubmit(t.props.value)})),Object(s.a)(Object(N.a)(t),"handleClear",(function(){t.props.onClear()})),t}return n.prototype.render=function(){var e=this.props,t=e.value,n=e.intl,a=t.length>0;return Object(o.a)("div",{className:"list-editor__search search"},void 0,Object(o.a)("label",{},void 0,Object(o.a)("span",{style:{display:"none"}},void 0,n.formatMessage(S.search)),Object(o.a)("input",{className:"search__input",type:"text",value:t,onChange:this.handleChange,onKeyUp:this.handleKeyUp,placeholder:n.formatMessage(S.search)})),Object(o.a)("div",{role:"button",tabIndex:"0",className:"search__icon",onClick:this.handleClear},void 0,Object(o.a)(q.a,{id:"search",className:k()({active:!a})}),Object(o.a)(q.a,{id:"times-circle","aria-label":n.formatMessage(S.search),className:k()({active:a})})))},n}(d.a.PureComponent))||y)||y;var E,x,z,K=Object(O.f)({title:{id:"lists.edit.submit",defaultMessage:"Change title"}}),P=Object(j.connect)((function(e){return{value:e.getIn(["listEditor","title"]),disabled:!e.getIn(["listEditor","isChanged"])||!e.getIn(["listEditor","title"])}}),(function(e){return{onChange:function(t){return e(Object(h.C)(t))},onSubmit:function(){return e(Object(h.P)(!1))}}}))(M=Object(O.g)(M=function(e){Object(r.a)(n,e);var t;t=n;function n(){for(var t,n=arguments.length,a=new Array(n),c=0;c<n;c++)a[c]=arguments[c];return t=e.call.apply(e,[this].concat(a))||this,Object(s.a)(Object(N.a)(t),"handleChange",(function(e){t.props.onChange(e.target.value)})),Object(s.a)(Object(N.a)(t),"handleSubmit",(function(e){e.preventDefault(),t.props.onSubmit()})),Object(s.a)(Object(N.a)(t),"handleClick",(function(){t.props.onSubmit()})),t}return n.prototype.render=function(){var e=this.props,t=e.value,n=e.disabled,a=e.intl.formatMessage(K.title);return Object(o.a)("form",{className:"column-inline-form",onSubmit:this.handleSubmit},void 0,Object(o.a)("input",{className:"setting-text",value:t,onChange:this.handleChange}),Object(o.a)(_.a,{disabled:n,icon:"check",title:a,onClick:this.handleClick}))},n}(d.a.PureComponent))||M)||M,U=n(101),D=n(35),J=n.n(D);var T=Object(j.connect)((function(e){return{accountIds:e.getIn(["listEditor","accounts","items"]),searchAccountIds:e.getIn(["listEditor","suggestions","items"])}}),(function(e){return{onInitialize:function(t){return e(Object(h.O)(t))},onClear:function(){return e(Object(h.E)())},onReset:function(){return e(Object(h.M)())}}}))(E=Object(O.g)((z=x=function(e){Object(r.a)(n,e);var t;t=n;function n(){return e.apply(this,arguments)||this}var a=n.prototype;return a.componentDidMount=function(){var e=this.props;(0,e.onInitialize)(e.listId)},a.componentWillUnmount=function(){(0,this.props.onReset)()},a.render=function(){var e=this.props,t=e.accountIds,n=e.searchAccountIds,a=e.onClear,c=n.size>0;return Object(o.a)("div",{className:"modal-root__modal list-editor"},void 0,Object(o.a)(P,{}),Object(o.a)(A,{}),Object(o.a)("div",{className:"drawer__pager"},void 0,Object(o.a)("div",{className:"drawer__inner list-editor__accounts"},void 0,t.map((function(e){return Object(o.a)(R,{accountId:e,added:!0},e)}))),c&&Object(o.a)("div",{role:"button",tabIndex:"-1",className:"drawer__backdrop",onClick:a}),Object(o.a)(U.a,{defaultStyle:{x:-100},style:{x:J()(c?0:-100,{stiffness:210,damping:20})}},void 0,(function(e){var t=e.x;return(Object(o.a)("div",{className:"drawer__inner backdrop",style:{transform:0===t?null:"translateX("+t+"%)",visibility:-100===t?"hidden":"visible"}},void 0,n.map((function(e){return Object(o.a)(R,{accountId:e},e)}))))}))))},n}(v.a),Object(s.a)(x,"propTypes",{listId:b.a.string.isRequired,onClose:b.a.func.isRequired,intl:b.a.object.isRequired,onInitialize:b.a.func.isRequired,onClear:b.a.func.isRequired,onReset:b.a.func.isRequired,accountIds:f.a.list.isRequired,searchAccountIds:f.a.list.isRequired}),E=z))||E)||E}}]);
//# sourceMappingURL=list_editor.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/list_editor.js.map b/priv/static/packs/features/list_editor.js.map
index c2ab32c4a..ee536303a 100644
--- a/priv/static/packs/features/list_editor.js.map
+++ b/priv/static/packs/features/list_editor.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_editor/components/account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_editor/components/search.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_editor/components/edit_list_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_editor/index.js"],"names":["messages","defineMessages","remove","add","Account","connect","getAccount","makeGetAccount","state","accountId","added","account","getIn","includes","dispatch","onRemove","removeFromListEditor","onAdd","addToListEditor","injectIntl","render","button","this","props","intl","icon","title","formatMessage","onClick","className","size","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","bool","search","Search","value","onSubmit","fetchListSuggestions","onClear","clearListSuggestions","onChange","changeListSuggestions","e","target","keyCode","hasValue","length","style","display","type","handleChange","onKeyUp","handleKeyUp","placeholder","role","tabIndex","handleClear","id","classNames","active","aria-label","React","PureComponent","ListForm","disabled","changeListEditorTitle","submitListEditor","preventDefault","handleSubmit","handleClick","ListEditor","accountIds","searchAccountIds","onInitialize","listId","setupListEditor","onReset","resetListEditor","componentDidMount","componentWillUnmount","showSearch","defaultStyle","x","spring","stiffness","damping","transform","visibility","string","onClose","list"],"mappings":"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","file":"features/list_editor.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from '../../../selectors';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { removeFromListEditor, addToListEditor } from '../../../actions/lists';\n\nconst messages = defineMessages({\n remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },\n add: { id: 'lists.account.add', defaultMessage: 'Add to list' },\n});\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { accountId, added }) => ({\n account: getAccount(state, accountId),\n added: typeof added === 'undefined' ? state.getIn(['listEditor', 'accounts', 'items']).includes(accountId) : added,\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { accountId }) => ({\n onRemove: () => dispatch(removeFromListEditor(accountId)),\n onAdd: () => dispatch(addToListEditor(accountId)),\n});\n\nexport default @connect(makeMapStateToProps, mapDispatchToProps)\n@injectIntl\nclass Account extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onRemove: PropTypes.func.isRequired,\n onAdd: PropTypes.func.isRequired,\n added: PropTypes.bool,\n };\n\n static defaultProps = {\n added: false,\n };\n\n render () {\n const { account, intl, onRemove, onAdd, added } = this.props;\n\n let button;\n\n if (added) {\n button = <IconButton icon='times' title={intl.formatMessage(messages.remove)} onClick={onRemove} />;\n } else {\n button = <IconButton icon='plus' title={intl.formatMessage(messages.add)} onClick={onAdd} />;\n }\n\n return (\n <div className='account'>\n <div className='account__wrapper'>\n <div className='account__display-name'>\n <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n <DisplayName account={account} />\n </div>\n\n <div className='account__relationship'>\n {button}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { fetchListSuggestions, clearListSuggestions, changeListSuggestions } from '../../../actions/lists';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n search: { id: 'lists.search', defaultMessage: 'Search among people you follow' },\n});\n\nconst mapStateToProps = state => ({\n value: state.getIn(['listEditor', 'suggestions', 'value']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onSubmit: value => dispatch(fetchListSuggestions(value)),\n onClear: () => dispatch(clearListSuggestions()),\n onChange: value => dispatch(changeListSuggestions(value)),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass Search extends React.PureComponent {\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n value: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onClear: PropTypes.func.isRequired,\n };\n\n handleChange = e => {\n this.props.onChange(e.target.value);\n }\n\n handleKeyUp = e => {\n if (e.keyCode === 13) {\n this.props.onSubmit(this.props.value);\n }\n }\n\n handleClear = () => {\n this.props.onClear();\n }\n\n render () {\n const { value, intl } = this.props;\n const hasValue = value.length > 0;\n\n return (\n <div className='list-editor__search search'>\n <label>\n <span style={{ display: 'none' }}>{intl.formatMessage(messages.search)}</span>\n\n <input\n className='search__input'\n type='text'\n value={value}\n onChange={this.handleChange}\n onKeyUp={this.handleKeyUp}\n placeholder={intl.formatMessage(messages.search)}\n />\n </label>\n\n <div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>\n <Icon id='search' className={classNames({ active: !hasValue })} />\n <Icon id='times-circle' aria-label={intl.formatMessage(messages.search)} className={classNames({ active: hasValue })} />\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { changeListEditorTitle, submitListEditor } from '../../../actions/lists';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n title: { id: 'lists.edit.submit', defaultMessage: 'Change title' },\n});\n\nconst mapStateToProps = state => ({\n value: state.getIn(['listEditor', 'title']),\n disabled: !state.getIn(['listEditor', 'isChanged']) || !state.getIn(['listEditor', 'title']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onChange: value => dispatch(changeListEditorTitle(value)),\n onSubmit: () => dispatch(submitListEditor(false)),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass ListForm extends React.PureComponent {\n\n static propTypes = {\n value: PropTypes.string.isRequired,\n disabled: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n };\n\n handleChange = e => {\n this.props.onChange(e.target.value);\n }\n\n handleSubmit = e => {\n e.preventDefault();\n this.props.onSubmit();\n }\n\n handleClick = () => {\n this.props.onSubmit();\n }\n\n render () {\n const { value, disabled, intl } = this.props;\n\n const title = intl.formatMessage(messages.title);\n\n return (\n <form className='column-inline-form' onSubmit={this.handleSubmit}>\n <input\n className='setting-text'\n value={value}\n onChange={this.handleChange}\n />\n\n <IconButton\n disabled={disabled}\n icon='check'\n title={title}\n onClick={this.handleClick}\n />\n </form>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { injectIntl } from 'react-intl';\nimport { setupListEditor, clearListSuggestions, resetListEditor } from '../../actions/lists';\nimport Account from './components/account';\nimport Search from './components/search';\nimport EditListForm from './components/edit_list_form';\nimport Motion from '../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['listEditor', 'accounts', 'items']),\n searchAccountIds: state.getIn(['listEditor', 'suggestions', 'items']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onInitialize: listId => dispatch(setupListEditor(listId)),\n onClear: () => dispatch(clearListSuggestions()),\n onReset: () => dispatch(resetListEditor()),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass ListEditor extends ImmutablePureComponent {\n\n static propTypes = {\n listId: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n onInitialize: PropTypes.func.isRequired,\n onClear: PropTypes.func.isRequired,\n onReset: PropTypes.func.isRequired,\n accountIds: ImmutablePropTypes.list.isRequired,\n searchAccountIds: ImmutablePropTypes.list.isRequired,\n };\n\n componentDidMount () {\n const { onInitialize, listId } = this.props;\n onInitialize(listId);\n }\n\n componentWillUnmount () {\n const { onReset } = this.props;\n onReset();\n }\n\n render () {\n const { accountIds, searchAccountIds, onClear } = this.props;\n const showSearch = searchAccountIds.size > 0;\n\n return (\n <div className='modal-root__modal list-editor'>\n <EditListForm />\n\n <Search />\n\n <div className='drawer__pager'>\n <div className='drawer__inner list-editor__accounts'>\n {accountIds.map(accountId => <Account key={accountId} accountId={accountId} added />)}\n </div>\n\n {showSearch && <div role='button' tabIndex='-1' className='drawer__backdrop' onClick={onClear} />}\n\n <Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>\n {({ x }) => (\n <div className='drawer__inner backdrop' style={{ transform: x === 0 ? null : `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>\n {searchAccountIds.map(accountId => <Account key={accountId} accountId={accountId} />)}\n </div>\n )}\n </Motion>\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_editor/components/account.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_editor/components/search.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_editor/components/edit_list_form.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_editor/index.js"],"names":["messages","defineMessages","remove","add","Account","connect","getAccount","makeGetAccount","state","accountId","added","account","getIn","includes","dispatch","onRemove","removeFromListEditor","onAdd","addToListEditor","injectIntl","render","button","this","props","intl","icon","title","formatMessage","onClick","className","size","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","object","func","bool","search","Search","value","onSubmit","fetchListSuggestions","onClear","clearListSuggestions","onChange","changeListSuggestions","e","target","keyCode","hasValue","length","style","display","type","handleChange","onKeyUp","handleKeyUp","placeholder","role","tabIndex","handleClear","id","classNames","active","aria-label","React","PureComponent","ListForm","disabled","changeListEditorTitle","submitListEditor","preventDefault","handleSubmit","handleClick","ListEditor","accountIds","searchAccountIds","onInitialize","listId","setupListEditor","onReset","resetListEditor","componentDidMount","componentWillUnmount","showSearch","defaultStyle","x","spring","stiffness","damping","transform","visibility","string","onClose","list"],"mappings":"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","file":"features/list_editor.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { makeGetAccount } from '../../../selectors';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { removeFromListEditor, addToListEditor } from '../../../actions/lists';\n\nconst messages = defineMessages({\n remove: { id: 'lists.account.remove', defaultMessage: 'Remove from list' },\n add: { id: 'lists.account.add', defaultMessage: 'Add to list' },\n});\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, { accountId, added }) => ({\n account: getAccount(state, accountId),\n added: typeof added === 'undefined' ? state.getIn(['listEditor', 'accounts', 'items']).includes(accountId) : added,\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { accountId }) => ({\n onRemove: () => dispatch(removeFromListEditor(accountId)),\n onAdd: () => dispatch(addToListEditor(accountId)),\n});\n\nexport default @connect(makeMapStateToProps, mapDispatchToProps)\n@injectIntl\nclass Account extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n intl: PropTypes.object.isRequired,\n onRemove: PropTypes.func.isRequired,\n onAdd: PropTypes.func.isRequired,\n added: PropTypes.bool,\n };\n\n static defaultProps = {\n added: false,\n };\n\n render () {\n const { account, intl, onRemove, onAdd, added } = this.props;\n\n let button;\n\n if (added) {\n button = <IconButton icon='times' title={intl.formatMessage(messages.remove)} onClick={onRemove} />;\n } else {\n button = <IconButton icon='plus' title={intl.formatMessage(messages.add)} onClick={onAdd} />;\n }\n\n return (\n <div className='account'>\n <div className='account__wrapper'>\n <div className='account__display-name'>\n <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n <DisplayName account={account} />\n </div>\n\n <div className='account__relationship'>\n {button}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { fetchListSuggestions, clearListSuggestions, changeListSuggestions } from '../../../actions/lists';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n search: { id: 'lists.search', defaultMessage: 'Search among people you follow' },\n});\n\nconst mapStateToProps = state => ({\n value: state.getIn(['listEditor', 'suggestions', 'value']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onSubmit: value => dispatch(fetchListSuggestions(value)),\n onClear: () => dispatch(clearListSuggestions()),\n onChange: value => dispatch(changeListSuggestions(value)),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass Search extends React.PureComponent {\n\n static propTypes = {\n intl: PropTypes.object.isRequired,\n value: PropTypes.string.isRequired,\n onChange: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n onClear: PropTypes.func.isRequired,\n };\n\n handleChange = e => {\n this.props.onChange(e.target.value);\n }\n\n handleKeyUp = e => {\n if (e.keyCode === 13) {\n this.props.onSubmit(this.props.value);\n }\n }\n\n handleClear = () => {\n this.props.onClear();\n }\n\n render () {\n const { value, intl } = this.props;\n const hasValue = value.length > 0;\n\n return (\n <div className='list-editor__search search'>\n <label>\n <span style={{ display: 'none' }}>{intl.formatMessage(messages.search)}</span>\n\n <input\n className='search__input'\n type='text'\n value={value}\n onChange={this.handleChange}\n onKeyUp={this.handleKeyUp}\n placeholder={intl.formatMessage(messages.search)}\n />\n </label>\n\n <div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>\n <Icon id='search' className={classNames({ active: !hasValue })} />\n <Icon id='times-circle' aria-label={intl.formatMessage(messages.search)} className={classNames({ active: hasValue })} />\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { changeListEditorTitle, submitListEditor } from '../../../actions/lists';\nimport IconButton from '../../../components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\n\nconst messages = defineMessages({\n title: { id: 'lists.edit.submit', defaultMessage: 'Change title' },\n});\n\nconst mapStateToProps = state => ({\n value: state.getIn(['listEditor', 'title']),\n disabled: !state.getIn(['listEditor', 'isChanged']) || !state.getIn(['listEditor', 'title']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onChange: value => dispatch(changeListEditorTitle(value)),\n onSubmit: () => dispatch(submitListEditor(false)),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass ListForm extends React.PureComponent {\n\n static propTypes = {\n value: PropTypes.string.isRequired,\n disabled: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n onChange: PropTypes.func.isRequired,\n onSubmit: PropTypes.func.isRequired,\n };\n\n handleChange = e => {\n this.props.onChange(e.target.value);\n }\n\n handleSubmit = e => {\n e.preventDefault();\n this.props.onSubmit();\n }\n\n handleClick = () => {\n this.props.onSubmit();\n }\n\n render () {\n const { value, disabled, intl } = this.props;\n\n const title = intl.formatMessage(messages.title);\n\n return (\n <form className='column-inline-form' onSubmit={this.handleSubmit}>\n <input\n className='setting-text'\n value={value}\n onChange={this.handleChange}\n />\n\n <IconButton\n disabled={disabled}\n icon='check'\n title={title}\n onClick={this.handleClick}\n />\n </form>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { injectIntl } from 'react-intl';\nimport { setupListEditor, clearListSuggestions, resetListEditor } from '../../actions/lists';\nimport Account from './components/account';\nimport Search from './components/search';\nimport EditListForm from './components/edit_list_form';\nimport Motion from '../ui/util/optional_motion';\nimport spring from 'react-motion/lib/spring';\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['listEditor', 'accounts', 'items']),\n searchAccountIds: state.getIn(['listEditor', 'suggestions', 'items']),\n});\n\nconst mapDispatchToProps = dispatch => ({\n onInitialize: listId => dispatch(setupListEditor(listId)),\n onClear: () => dispatch(clearListSuggestions()),\n onReset: () => dispatch(resetListEditor()),\n});\n\nexport default @connect(mapStateToProps, mapDispatchToProps)\n@injectIntl\nclass ListEditor extends ImmutablePureComponent {\n\n static propTypes = {\n listId: PropTypes.string.isRequired,\n onClose: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n onInitialize: PropTypes.func.isRequired,\n onClear: PropTypes.func.isRequired,\n onReset: PropTypes.func.isRequired,\n accountIds: ImmutablePropTypes.list.isRequired,\n searchAccountIds: ImmutablePropTypes.list.isRequired,\n };\n\n componentDidMount () {\n const { onInitialize, listId } = this.props;\n onInitialize(listId);\n }\n\n componentWillUnmount () {\n const { onReset } = this.props;\n onReset();\n }\n\n render () {\n const { accountIds, searchAccountIds, onClear } = this.props;\n const showSearch = searchAccountIds.size > 0;\n\n return (\n <div className='modal-root__modal list-editor'>\n <EditListForm />\n\n <Search />\n\n <div className='drawer__pager'>\n <div className='drawer__inner list-editor__accounts'>\n {accountIds.map(accountId => <Account key={accountId} accountId={accountId} added />)}\n </div>\n\n {showSearch && <div role='button' tabIndex='-1' className='drawer__backdrop' onClick={onClear} />}\n\n <Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>\n {({ x }) => (\n <div className='drawer__inner backdrop' style={{ transform: x === 0 ? null : `translateX(${x}%)`, visibility: x === -100 ? 'hidden' : 'visible' }}>\n {searchAccountIds.map(accountId => <Account key={accountId} accountId={accountId} />)}\n </div>\n )}\n </Motion>\n </div>\n </div>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/list_timeline.js b/priv/static/packs/features/list_timeline.js
index 391d15b87..8592d85a1 100644
--- a/priv/static/packs/features/list_timeline.js
+++ b/priv/static/packs/features/list_timeline.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{788:function(e,t,i){"use strict";i.r(t),i.d(t,"default",(function(){return D}));var n,a,s,c=i(0),o=i(2),l=i(7),d=i(1),r=i(3),p=i.n(r),u=i(13),b=i(5),h=i.n(b),m=i(1036),O=i(736),j=i(738),f=i(733),v=i(250),g=i(6),M=i(740),C=i(33),I=i(29),y=i(47),k=i(1030),_=i(300),w=i(26),x=Object(g.f)({deleteMessage:{id:"confirmations.delete_list.message",defaultMessage:"Are you sure you want to permanently delete this list?"},deleteConfirm:{id:"confirmations.delete_list.confirm",defaultMessage:"Delete"}}),D=Object(u.connect)((function(e,t){return{list:e.getIn(["lists",t.params.id]),hasUnread:e.getIn(["timelines","list:"+t.params.id,"unread"])>0}}))(n=Object(g.g)((s=a=function(e){function t(){for(var t,i=arguments.length,n=new Array(i),a=0;a<i;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(d.a)(Object(o.a)(t),"handlePin",(function(){var e=t.props,i=e.columnId,n=e.dispatch;i?n(Object(v.h)(i)):(n(Object(v.e)("LIST",{id:t.props.params.id})),t.context.router.history.push("/"))})),Object(d.a)(Object(o.a)(t),"handleMove",(function(e){var i=t.props,n=i.columnId;(0,i.dispatch)(Object(v.g)(n,e))})),Object(d.a)(Object(o.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(d.a)(Object(o.a)(t),"setRef",(function(e){t.column=e})),Object(d.a)(Object(o.a)(t),"handleLoadMore",(function(e){var i=t.props.params.id;t.props.dispatch(Object(C.u)(i,{maxId:e}))})),Object(d.a)(Object(o.a)(t),"handleEditClick",(function(){t.props.dispatch(Object(y.d)("LIST_EDITOR",{listId:t.props.params.id}))})),Object(d.a)(Object(o.a)(t),"handleDeleteClick",(function(){var e=t.props,i=e.dispatch,n=e.columnId,a=e.intl,s=t.props.params.id;i(Object(y.d)("CONFIRM",{message:a.formatMessage(x.deleteMessage),confirm:a.formatMessage(x.deleteConfirm),onConfirm:function(){i(Object(I.F)(s)),n?i(Object(v.h)(n)):t.context.router.history.push("/lists")}}))})),t}Object(l.a)(t,e);var i=t.prototype;return i.componentDidMount=function(){var e=this.props.dispatch,t=this.props.params.id;e(Object(I.G)(t)),e(Object(C.u)(t)),this.disconnect=e(Object(M.d)(t))},i.componentWillReceiveProps=function(e){var t=this.props.dispatch,i=e.params.id;i!==this.props.params.id&&(this.disconnect&&(this.disconnect(),this.disconnect=null),t(Object(I.G)(i)),t(Object(C.u)(i)),this.disconnect=t(Object(M.d)(i)))},i.componentWillUnmount=function(){this.disconnect&&(this.disconnect(),this.disconnect=null)},i.render=function(){var e=this.props,t=e.shouldUpdateScroll,i=e.hasUnread,n=e.columnId,a=e.multiColumn,s=e.list,o=this.props.params.id,l=!!n,d=s?s.get("title"):o;return void 0===s?Object(c.a)(O.a,{},void 0,Object(c.a)("div",{className:"scrollable"},void 0,Object(c.a)(_.a,{}))):!1===s?Object(c.a)(O.a,{},void 0,Object(c.a)(j.a,{multiColumn:a}),Object(c.a)(k.a,{})):p.a.createElement(O.a,{bindToDocument:!a,ref:this.setRef,label:d},Object(c.a)(f.a,{icon:"list-ul",active:i,title:d,onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:l,multiColumn:a},void 0,Object(c.a)("div",{className:"column-header__links"},void 0,Object(c.a)("button",{className:"text-btn column-header__setting-btn",tabIndex:"0",onClick:this.handleEditClick},void 0,Object(c.a)(w.a,{id:"pencil"})," ",Object(c.a)(g.b,{id:"lists.edit",defaultMessage:"Edit list"})),Object(c.a)("button",{className:"text-btn column-header__setting-btn",tabIndex:"0",onClick:this.handleDeleteClick},void 0,Object(c.a)(w.a,{id:"trash"})," ",Object(c.a)(g.b,{id:"lists.delete",defaultMessage:"Delete list"})))),Object(c.a)(m.a,{trackScroll:!l,scrollKey:"list_timeline-"+n,timelineId:"list:"+o,onLoadMore:this.handleLoadMore,emptyMessage:Object(c.a)(g.b,{id:"empty_column.list",defaultMessage:"There is nothing in this list yet. When members of this list post new statuses, they will appear here."}),shouldUpdateScroll:t,bindToDocument:!a}))},t}(p.a.PureComponent),Object(d.a)(a,"contextTypes",{router:h.a.object}),n=s))||n)||n}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{814:function(e,t,i){"use strict";i.r(t),i.d(t,"default",(function(){return D}));var n,a,s,c=i(0),o=i(2),l=(i(9),i(6),i(8)),d=i(1),r=i(3),p=i.n(r),u=i(15),b=i(5),h=i.n(b),m=i(1063),O=i(762),j=i(764),f=i(759),v=i(253),g=i(7),M=i(766),C=i(36),I=i(31),y=i(48),k=i(1057),_=i(306),w=i(27);var x=Object(g.f)({deleteMessage:{id:"confirmations.delete_list.message",defaultMessage:"Are you sure you want to permanently delete this list?"},deleteConfirm:{id:"confirmations.delete_list.confirm",defaultMessage:"Delete"}}),D=Object(u.connect)((function(e,t){return{list:e.getIn(["lists",t.params.id]),hasUnread:e.getIn(["timelines","list:"+t.params.id,"unread"])>0}}))(n=Object(g.g)((s=a=function(e){Object(l.a)(i,e);var t;t=i;function i(){for(var t,i=arguments.length,n=new Array(i),a=0;a<i;a++)n[a]=arguments[a];return t=e.call.apply(e,[this].concat(n))||this,Object(d.a)(Object(o.a)(t),"handlePin",(function(){var e=t.props,i=e.columnId,n=e.dispatch;i?n(Object(v.h)(i)):(n(Object(v.e)("LIST",{id:t.props.params.id})),t.context.router.history.push("/"))})),Object(d.a)(Object(o.a)(t),"handleMove",(function(e){var i=t.props,n=i.columnId;(0,i.dispatch)(Object(v.g)(n,e))})),Object(d.a)(Object(o.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(d.a)(Object(o.a)(t),"setRef",(function(e){t.column=e})),Object(d.a)(Object(o.a)(t),"handleLoadMore",(function(e){var i=t.props.params.id;t.props.dispatch(Object(C.u)(i,{maxId:e}))})),Object(d.a)(Object(o.a)(t),"handleEditClick",(function(){t.props.dispatch(Object(y.d)("LIST_EDITOR",{listId:t.props.params.id}))})),Object(d.a)(Object(o.a)(t),"handleDeleteClick",(function(){var e=t.props,i=e.dispatch,n=e.columnId,a=e.intl,s=t.props.params.id;i(Object(y.d)("CONFIRM",{message:a.formatMessage(x.deleteMessage),confirm:a.formatMessage(x.deleteConfirm),onConfirm:function(){i(Object(I.F)(s)),n?i(Object(v.h)(n)):t.context.router.history.push("/lists")}}))})),t}var n=i.prototype;return n.componentDidMount=function(){var e=this.props.dispatch,t=this.props.params.id;e(Object(I.G)(t)),e(Object(C.u)(t)),this.disconnect=e(Object(M.d)(t))},n.componentWillReceiveProps=function(e){var t=this.props.dispatch,i=e.params.id;i!==this.props.params.id&&(this.disconnect&&(this.disconnect(),this.disconnect=null),t(Object(I.G)(i)),t(Object(C.u)(i)),this.disconnect=t(Object(M.d)(i)))},n.componentWillUnmount=function(){this.disconnect&&(this.disconnect(),this.disconnect=null)},n.render=function(){var e=this.props,t=e.shouldUpdateScroll,i=e.hasUnread,n=e.columnId,a=e.multiColumn,s=e.list,o=this.props.params.id,l=!!n,d=s?s.get("title"):o;return void 0===s?Object(c.a)(O.a,{},void 0,Object(c.a)("div",{className:"scrollable"},void 0,Object(c.a)(_.a,{}))):!1===s?Object(c.a)(O.a,{},void 0,Object(c.a)(j.a,{multiColumn:a}),Object(c.a)(k.a,{})):p.a.createElement(O.a,{bindToDocument:!a,ref:this.setRef,label:d},Object(c.a)(f.a,{icon:"list-ul",active:i,title:d,onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:l,multiColumn:a},void 0,Object(c.a)("div",{className:"column-header__links"},void 0,Object(c.a)("button",{className:"text-btn column-header__setting-btn",tabIndex:"0",onClick:this.handleEditClick},void 0,Object(c.a)(w.a,{id:"pencil"})," ",Object(c.a)(g.b,{id:"lists.edit",defaultMessage:"Edit list"})),Object(c.a)("button",{className:"text-btn column-header__setting-btn",tabIndex:"0",onClick:this.handleDeleteClick},void 0,Object(c.a)(w.a,{id:"trash"})," ",Object(c.a)(g.b,{id:"lists.delete",defaultMessage:"Delete list"})))),Object(c.a)(m.a,{trackScroll:!l,scrollKey:"list_timeline-"+n,timelineId:"list:"+o,onLoadMore:this.handleLoadMore,emptyMessage:Object(c.a)(g.b,{id:"empty_column.list",defaultMessage:"There is nothing in this list yet. When members of this list post new statuses, they will appear here."}),shouldUpdateScroll:t,bindToDocument:!a}))},i}(p.a.PureComponent),Object(d.a)(a,"contextTypes",{router:h.a.object}),n=s))||n)||n}}]);
//# sourceMappingURL=list_timeline.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/list_timeline.js.map b/priv/static/packs/features/list_timeline.js.map
index 766670bd2..6e55f0a0c 100644
--- a/priv/static/packs/features/list_timeline.js.map
+++ b/priv/static/packs/features/list_timeline.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_timeline/index.js"],"names":["messages","defineMessages","deleteMessage","deleteConfirm","ListTimeline","connect","state","props","list","getIn","params","id","hasUnread","injectIntl","columnId","dispatch","removeColumn","addColumn","context","router","history","push","dir","moveColumn","column","scrollTop","c","maxId","expandListTimeline","openModal","listId","intl","message","formatMessage","confirm","onConfirm","deleteList","componentDidMount","this","fetchList","disconnect","connectListStream","componentWillReceiveProps","nextProps","componentWillUnmount","render","shouldUpdateScroll","multiColumn","pinned","title","get","className","bindToDocument","ref","setRef","label","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","tabIndex","handleEditClick","defaultMessage","handleDeleteClick","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage","React","PureComponent","PropTypes","object"],"mappings":"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","file":"features/list_timeline.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ColumnHeader from '../../components/column_header';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { connectListStream } from '../../actions/streaming';\nimport { expandListTimeline } from '../../actions/timelines';\nimport { fetchList, deleteList } from '../../actions/lists';\nimport { openModal } from '../../actions/modal';\nimport MissingIndicator from '../../components/missing_indicator';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' },\n deleteConfirm: { id: 'confirmations.delete_list.confirm', defaultMessage: 'Delete' },\n});\n\nconst mapStateToProps = (state, props) => ({\n list: state.getIn(['lists', props.params.id]),\n hasUnread: state.getIn(['timelines', `list:${props.params.id}`, 'unread']) > 0,\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass ListTimeline extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n hasUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n list: PropTypes.oneOfType([ImmutablePropTypes.map, PropTypes.bool]),\n intl: PropTypes.object.isRequired,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('LIST', { id: this.props.params.id }));\n this.context.router.history.push('/');\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n const { id } = this.props.params;\n\n dispatch(fetchList(id));\n dispatch(expandListTimeline(id));\n\n this.disconnect = dispatch(connectListStream(id));\n }\n\n componentWillReceiveProps (nextProps) {\n const { dispatch } = this.props;\n const { id } = nextProps.params;\n\n if (id !== this.props.params.id) {\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n\n dispatch(fetchList(id));\n dispatch(expandListTimeline(id));\n\n this.disconnect = dispatch(connectListStream(id));\n }\n }\n\n componentWillUnmount () {\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n const { id } = this.props.params;\n this.props.dispatch(expandListTimeline(id, { maxId }));\n }\n\n handleEditClick = () => {\n this.props.dispatch(openModal('LIST_EDITOR', { listId: this.props.params.id }));\n }\n\n handleDeleteClick = () => {\n const { dispatch, columnId, intl } = this.props;\n const { id } = this.props.params;\n\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.deleteMessage),\n confirm: intl.formatMessage(messages.deleteConfirm),\n onConfirm: () => {\n dispatch(deleteList(id));\n\n if (!!columnId) {\n dispatch(removeColumn(columnId));\n } else {\n this.context.router.history.push('/lists');\n }\n },\n }));\n }\n\n render () {\n const { shouldUpdateScroll, hasUnread, columnId, multiColumn, list } = this.props;\n const { id } = this.props.params;\n const pinned = !!columnId;\n const title = list ? list.get('title') : id;\n\n if (typeof list === 'undefined') {\n return (\n <Column>\n <div className='scrollable'>\n <LoadingIndicator />\n </div>\n </Column>\n );\n } else if (list === false) {\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n <MissingIndicator />\n </Column>\n );\n }\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={title}>\n <ColumnHeader\n icon='list-ul'\n active={hasUnread}\n title={title}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <div className='column-header__links'>\n <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.handleEditClick}>\n <Icon id='pencil' /> <FormattedMessage id='lists.edit' defaultMessage='Edit list' />\n </button>\n\n <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.handleDeleteClick}>\n <Icon id='trash' /> <FormattedMessage id='lists.delete' defaultMessage='Delete list' />\n </button>\n </div>\n </ColumnHeader>\n\n <StatusListContainer\n trackScroll={!pinned}\n scrollKey={`list_timeline-${columnId}`}\n timelineId={`list:${id}`}\n onLoadMore={this.handleLoadMore}\n emptyMessage={<FormattedMessage id='empty_column.list' defaultMessage='There is nothing in this list yet. When members of this list post new statuses, they will appear here.' />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/list_timeline/index.js"],"names":["messages","defineMessages","deleteMessage","deleteConfirm","ListTimeline","connect","state","props","list","getIn","params","id","hasUnread","injectIntl","columnId","dispatch","removeColumn","addColumn","context","router","history","push","dir","moveColumn","column","scrollTop","c","maxId","expandListTimeline","openModal","listId","intl","message","formatMessage","confirm","onConfirm","deleteList","componentDidMount","this","fetchList","disconnect","connectListStream","componentWillReceiveProps","nextProps","componentWillUnmount","render","shouldUpdateScroll","multiColumn","pinned","title","get","className","bindToDocument","ref","setRef","label","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","tabIndex","handleEditClick","defaultMessage","handleDeleteClick","trackScroll","scrollKey","timelineId","onLoadMore","handleLoadMore","emptyMessage","React","PureComponent","PropTypes","object"],"mappings":"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","file":"features/list_timeline.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ColumnHeader from '../../components/column_header';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport { FormattedMessage, defineMessages, injectIntl } from 'react-intl';\nimport { connectListStream } from '../../actions/streaming';\nimport { expandListTimeline } from '../../actions/timelines';\nimport { fetchList, deleteList } from '../../actions/lists';\nimport { openModal } from '../../actions/modal';\nimport MissingIndicator from '../../components/missing_indicator';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n deleteMessage: { id: 'confirmations.delete_list.message', defaultMessage: 'Are you sure you want to permanently delete this list?' },\n deleteConfirm: { id: 'confirmations.delete_list.confirm', defaultMessage: 'Delete' },\n});\n\nconst mapStateToProps = (state, props) => ({\n list: state.getIn(['lists', props.params.id]),\n hasUnread: state.getIn(['timelines', `list:${props.params.id}`, 'unread']) > 0,\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass ListTimeline extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n columnId: PropTypes.string,\n hasUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n list: PropTypes.oneOfType([ImmutablePropTypes.map, PropTypes.bool]),\n intl: PropTypes.object.isRequired,\n };\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('LIST', { id: this.props.params.id }));\n this.context.router.history.push('/');\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch } = this.props;\n const { id } = this.props.params;\n\n dispatch(fetchList(id));\n dispatch(expandListTimeline(id));\n\n this.disconnect = dispatch(connectListStream(id));\n }\n\n componentWillReceiveProps (nextProps) {\n const { dispatch } = this.props;\n const { id } = nextProps.params;\n\n if (id !== this.props.params.id) {\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n\n dispatch(fetchList(id));\n dispatch(expandListTimeline(id));\n\n this.disconnect = dispatch(connectListStream(id));\n }\n }\n\n componentWillUnmount () {\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n const { id } = this.props.params;\n this.props.dispatch(expandListTimeline(id, { maxId }));\n }\n\n handleEditClick = () => {\n this.props.dispatch(openModal('LIST_EDITOR', { listId: this.props.params.id }));\n }\n\n handleDeleteClick = () => {\n const { dispatch, columnId, intl } = this.props;\n const { id } = this.props.params;\n\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.deleteMessage),\n confirm: intl.formatMessage(messages.deleteConfirm),\n onConfirm: () => {\n dispatch(deleteList(id));\n\n if (!!columnId) {\n dispatch(removeColumn(columnId));\n } else {\n this.context.router.history.push('/lists');\n }\n },\n }));\n }\n\n render () {\n const { shouldUpdateScroll, hasUnread, columnId, multiColumn, list } = this.props;\n const { id } = this.props.params;\n const pinned = !!columnId;\n const title = list ? list.get('title') : id;\n\n if (typeof list === 'undefined') {\n return (\n <Column>\n <div className='scrollable'>\n <LoadingIndicator />\n </div>\n </Column>\n );\n } else if (list === false) {\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n <MissingIndicator />\n </Column>\n );\n }\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={title}>\n <ColumnHeader\n icon='list-ul'\n active={hasUnread}\n title={title}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <div className='column-header__links'>\n <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.handleEditClick}>\n <Icon id='pencil' /> <FormattedMessage id='lists.edit' defaultMessage='Edit list' />\n </button>\n\n <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.handleDeleteClick}>\n <Icon id='trash' /> <FormattedMessage id='lists.delete' defaultMessage='Delete list' />\n </button>\n </div>\n </ColumnHeader>\n\n <StatusListContainer\n trackScroll={!pinned}\n scrollKey={`list_timeline-${columnId}`}\n timelineId={`list:${id}`}\n onLoadMore={this.handleLoadMore}\n emptyMessage={<FormattedMessage id='empty_column.list' defaultMessage='There is nothing in this list yet. When members of this list post new statuses, they will appear here.' />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/lists.js b/priv/static/packs/features/lists.js
index fa26c7031..702c3adcf 100644
--- a/priv/static/packs/features/lists.js
+++ b/priv/static/packs/features/lists.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{789:function(t,e,i){"use strict";i.r(e),i.d(e,"default",(function(){return T}));var n,s,a,o=i(0),u=i(7),c=i(1),r=(i(3),i(13)),l=i(5),d=i.n(l),p=i(14),b=i.n(p),f=i(300),g=i(731),h=i(737),j=i(29),m=i(6),O=i(18),y=i(1140),v=i(1141),w=i(1142),M=i(54),q=i(1023),C=Object(m.f)({heading:{id:"column.lists",defaultMessage:"Lists"},subheading:{id:"lists.subheading",defaultMessage:"Your lists"}}),R=Object(M.a)([function(t){return t.get("lists")}],(function(t){return t?t.toList().filter((function(t){return!!t})).sort((function(t,e){return t.get("title").localeCompare(e.get("title"))})):t})),T=Object(r.connect)((function(t){return{lists:R(t)}}))(n=Object(m.g)((a=s=function(t){function e(){return t.apply(this,arguments)||this}Object(u.a)(e,t);var i=e.prototype;return i.componentWillMount=function(){this.props.dispatch(Object(j.I)())},i.render=function(){var t=this.props,e=t.intl,i=t.shouldUpdateScroll,n=t.lists,s=t.multiColumn;if(!n)return Object(o.a)(g.a,{},void 0,Object(o.a)(f.a,{}));var a=Object(o.a)(m.b,{id:"empty_column.lists",defaultMessage:"You don't have any lists yet. When you create one, it will show up here."});return Object(o.a)(g.a,{bindToDocument:!s,icon:"list-ul",heading:e.formatMessage(C.heading)},void 0,Object(o.a)(h.a,{}),Object(o.a)(w.a,{}),Object(o.a)(q.a,{scrollKey:"lists",shouldUpdateScroll:i,emptyMessage:a,prepend:Object(o.a)(v.a,{text:e.formatMessage(C.subheading)}),bindToDocument:!s},void 0,n.map((function(t){return Object(o.a)(y.a,{to:"/timelines/list/"+t.get("id"),icon:"list-ul",text:t.get("title")},t.get("id"))}))))},e}(O.a),Object(c.a)(s,"propTypes",{params:d.a.object.isRequired,dispatch:d.a.func.isRequired,lists:b.a.list,intl:d.a.object.isRequired,multiColumn:d.a.bool}),n=a))||n)||n}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{815:function(t,e,i){"use strict";i.r(e),i.d(e,"default",(function(){return T}));var n,s,a,o=i(0),u=(i(9),i(6),i(8)),r=i(1),c=(i(3),i(15)),l=i(5),d=i.n(l),p=i(16),b=i.n(p),f=i(306),g=i(757),h=i(763),j=i(31),m=i(7),O=i(21),v=i(1173),y=i(1174),w=i(1175),M=i(57),q=i(1049);var C=Object(m.f)({heading:{id:"column.lists",defaultMessage:"Lists"},subheading:{id:"lists.subheading",defaultMessage:"Your lists"}}),R=Object(M.a)([function(t){return t.get("lists")}],(function(t){return t?t.toList().filter((function(t){return!!t})).sort((function(t,e){return t.get("title").localeCompare(e.get("title"))})):t})),T=Object(c.connect)((function(t){return{lists:R(t)}}))(n=Object(m.g)((a=s=function(t){Object(u.a)(i,t);var e;e=i;function i(){return t.apply(this,arguments)||this}var n=i.prototype;return n.componentWillMount=function(){this.props.dispatch(Object(j.I)())},n.render=function(){var t=this.props,e=t.intl,i=t.shouldUpdateScroll,n=t.lists,s=t.multiColumn;if(!n)return Object(o.a)(g.a,{},void 0,Object(o.a)(f.a,{}));var a=Object(o.a)(m.b,{id:"empty_column.lists",defaultMessage:"You don't have any lists yet. When you create one, it will show up here."});return(Object(o.a)(g.a,{bindToDocument:!s,icon:"list-ul",heading:e.formatMessage(C.heading)},void 0,Object(o.a)(h.a,{}),Object(o.a)(w.a,{}),Object(o.a)(q.a,{scrollKey:"lists",shouldUpdateScroll:i,emptyMessage:a,prepend:Object(o.a)(y.a,{text:e.formatMessage(C.subheading)}),bindToDocument:!s},void 0,n.map((function(t){return Object(o.a)(v.a,{to:"/timelines/list/"+t.get("id"),icon:"list-ul",text:t.get("title")},t.get("id"))})))))},i}(O.a),Object(r.a)(s,"propTypes",{params:d.a.object.isRequired,dispatch:d.a.func.isRequired,lists:b.a.list,intl:d.a.object.isRequired,multiColumn:d.a.bool}),n=a))||n)||n}}]);
//# sourceMappingURL=lists.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/lists.js.map b/priv/static/packs/features/lists.js.map
index 2e4811657..58c03a95b 100644
--- a/priv/static/packs/features/lists.js.map
+++ b/priv/static/packs/features/lists.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/lists/index.js"],"names":["messages","defineMessages","heading","subheading","getOrderedLists","createSelector","state","get","lists","toList","filter","item","sort","a","b","localeCompare","Lists","connect","injectIntl","componentWillMount","this","props","dispatch","fetchLists","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","icon","formatMessage","scrollKey","prepend","text","map","list","to","ImmutablePureComponent","params","PropTypes","object","isRequired","func","ImmutablePropTypes","bool"],"mappings":"2TAgBMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,0CACPC,WAAW,CAAD,qDAGNC,EAAkBC,YAAe,CAAC,SAAAC,GAAK,OAAIA,EAAMC,IAAI,YAAW,SAAAC,GACpE,OAAKA,EAIEA,EAAMC,SAASC,QAAO,SAAAC,GAAI,QAAMA,KAAMC,MAAK,SAACC,EAAGC,GAAJ,OAAUD,EAAEN,IAAI,SAASQ,cAAcD,EAAEP,IAAI,aAHtFC,KAYLQ,EAFUC,mBAJQ,SAAAX,GAAK,MAAK,CAChCE,MAAOJ,EAAgBE,M,GAIxBY,a,8GAWCC,mBAAA,WACEC,KAAKC,MAAMC,SAASC,gB,EAGtBC,OAAA,WAAW,IAAD,EACiDJ,KAAKC,MAAtDI,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBlB,EAD1B,EAC0BA,MAAOmB,EADjC,EACiCA,YAEzC,IAAKnB,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMoB,EAAe,YAAC,IAAD,CAAkBC,GAAG,qBAAqBC,eAAe,6EAE9E,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,EAAaK,KAAK,UAAU9B,QAASuB,EAAKQ,cAAcjC,EAASE,eAA1F,EACE,YAAC,IAAD,IAEA,YAAC,IAAD,IAEA,YAAC,IAAD,CACEgC,UAAU,QACVR,mBAAoBA,EACpBE,aAAcA,EACdO,QAAS,YAAC,IAAD,CAAkBC,KAAMX,EAAKQ,cAAcjC,EAASG,cAC7D4B,gBAAiBJ,QALnB,EAOGnB,EAAM6B,KAAI,SAAAC,GAAI,OACb,YAAC,IAAD,CAAiCC,GAAE,mBAAqBD,EAAK/B,IAAI,MAASyB,KAAK,UAAUI,KAAME,EAAK/B,IAAI,UAAvF+B,EAAK/B,IAAI,a,GAzClBiC,K,0BAEC,CACjBC,OAAQC,IAAUC,OAAOC,WACzBtB,SAAUoB,IAAUG,KAAKD,WACzBpC,MAAOsC,IAAmBR,KAC1Bb,KAAMiB,IAAUC,OAAOC,WACvBjB,YAAae,IAAUK,O","file":"features/lists.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport { fetchLists } from '../../actions/lists';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ColumnLink from '../ui/components/column_link';\nimport ColumnSubheading from '../ui/components/column_subheading';\nimport NewListForm from './components/new_list_form';\nimport { createSelector } from 'reselect';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.lists', defaultMessage: 'Lists' },\n subheading: { id: 'lists.subheading', defaultMessage: 'Your lists' },\n});\n\nconst getOrderedLists = createSelector([state => state.get('lists')], lists => {\n if (!lists) {\n return lists;\n }\n\n return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));\n});\n\nconst mapStateToProps = state => ({\n lists: getOrderedLists(state),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Lists extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n lists: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchLists());\n }\n\n render () {\n const { intl, shouldUpdateScroll, lists, multiColumn } = this.props;\n\n if (!lists) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.lists' defaultMessage=\"You don't have any lists yet. When you create one, it will show up here.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='list-ul' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n\n <NewListForm />\n\n <ScrollableList\n scrollKey='lists'\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n prepend={<ColumnSubheading text={intl.formatMessage(messages.subheading)} />}\n bindToDocument={!multiColumn}\n >\n {lists.map(list =>\n <ColumnLink key={list.get('id')} to={`/timelines/list/${list.get('id')}`} icon='list-ul' text={list.get('title')} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/lists/index.js"],"names":["messages","defineMessages","heading","subheading","getOrderedLists","createSelector","state","get","lists","toList","filter","item","sort","a","b","localeCompare","Lists","connect","injectIntl","componentWillMount","this","props","dispatch","fetchLists","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","icon","formatMessage","scrollKey","prepend","text","map","list","to","ImmutablePureComponent","params","PropTypes","object","isRequired","func","ImmutablePropTypes","bool"],"mappings":"uUAgBA,IAAMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,0CACPC,WAAW,CAAD,qDAGNC,EAAkBC,YAAe,CAAC,SAAAC,GAAK,OAAIA,EAAMC,IAAI,YAAW,SAAAC,GACpE,OAAKA,EAIEA,EAAMC,SAASC,QAAO,SAAAC,GAAI,QAAMA,KAAMC,MAAK,SAACC,EAAGC,GAAJ,OAAUD,EAAEN,IAAI,SAASQ,cAAcD,EAAEP,IAAI,aAHtFC,KAYLQ,EAFUC,mBAJQ,SAAAX,GAAK,MAAK,CAChCE,MAAOJ,EAAgBE,M,GAIxBY,a,wHAWCC,mBAAA,WACEC,KAAKC,MAAMC,SAASC,gB,EAGtBC,OAAA,WAAW,IAAD,EACiDJ,KAAKC,MAAtDI,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBlB,EAD1B,EAC0BA,MAAOmB,EADjC,EACiCA,YAEzC,IAAKnB,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMoB,EAAe,YAAC,IAAD,CAAkBC,GAAG,qBAAqBC,eAAe,6EAE9E,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,EAAaK,KAAK,UAAU9B,QAASuB,EAAKQ,cAAcjC,EAASE,eAA1F,EACE,YAAC,IAAD,IAEA,YAAC,IAAD,IAEA,YAAC,IAAD,CACEgC,UAAU,QACVR,mBAAoBA,EACpBE,aAAcA,EACdO,QAAS,YAAC,IAAD,CAAkBC,KAAMX,EAAKQ,cAAcjC,EAASG,cAC7D4B,gBAAiBJ,QALnB,EAOGnB,EAAM6B,KAAI,SAAAC,GAAI,OACb,YAAC,IAAD,CAAiCC,GAAE,mBAAqBD,EAAK/B,IAAI,MAASyB,KAAK,UAAUI,KAAME,EAAK/B,IAAI,UAAvF+B,EAAK/B,IAAI,c,GAzClBiC,K,0BAEC,CACjBC,OAAQC,IAAUC,OAAOC,WACzBtB,SAAUoB,IAAUG,KAAKD,WACzBpC,MAAOsC,IAAmBR,KAC1Bb,KAAMiB,IAAUC,OAAOC,WACvBjB,YAAae,IAAUK,O","file":"features/lists.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport { fetchLists } from '../../actions/lists';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport ColumnLink from '../ui/components/column_link';\nimport ColumnSubheading from '../ui/components/column_subheading';\nimport NewListForm from './components/new_list_form';\nimport { createSelector } from 'reselect';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.lists', defaultMessage: 'Lists' },\n subheading: { id: 'lists.subheading', defaultMessage: 'Your lists' },\n});\n\nconst getOrderedLists = createSelector([state => state.get('lists')], lists => {\n if (!lists) {\n return lists;\n }\n\n return lists.toList().filter(item => !!item).sort((a, b) => a.get('title').localeCompare(b.get('title')));\n});\n\nconst mapStateToProps = state => ({\n lists: getOrderedLists(state),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Lists extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n lists: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchLists());\n }\n\n render () {\n const { intl, shouldUpdateScroll, lists, multiColumn } = this.props;\n\n if (!lists) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.lists' defaultMessage=\"You don't have any lists yet. When you create one, it will show up here.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='list-ul' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n\n <NewListForm />\n\n <ScrollableList\n scrollKey='lists'\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n prepend={<ColumnSubheading text={intl.formatMessage(messages.subheading)} />}\n bindToDocument={!multiColumn}\n >\n {lists.map(list =>\n <ColumnLink key={list.get('id')} to={`/timelines/list/${list.get('id')}`} icon='list-ul' text={list.get('title')} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/mutes.js b/priv/static/packs/features/mutes.js
index 3ed714fbd..444d6cd06 100644
--- a/priv/static/packs/features/mutes.js
+++ b/priv/static/packs/features/mutes.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{802:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return L}));var n,o,s,c=a(0),u=a(2),r=a(7),i=a(1),d=a(62),l=a.n(d),p=(a(3),a(13)),b=a(6),h=a(18),m=a(5),f=a.n(m),j=a(14),O=a.n(j),M=a(300),g=a(731),v=a(737),y=a(1026),w=a(208),I=a(1023),q=Object(b.f)({heading:{id:"column.mutes",defaultMessage:"Muted users"}}),L=Object(p.connect)((function(e){return{accountIds:e.getIn(["user_lists","mutes","items"]),hasMore:!!e.getIn(["user_lists","mutes","next"])}}))(n=Object(b.g)((s=o=function(e){function t(){for(var t,a=arguments.length,n=new Array(a),o=0;o<a;o++)n[o]=arguments[o];return t=e.call.apply(e,[this].concat(n))||this,Object(i.a)(Object(u.a)(t),"handleLoadMore",l()((function(){t.props.dispatch(Object(w.e)())}),300,{leading:!0})),t}Object(r.a)(t,e);var a=t.prototype;return a.componentWillMount=function(){this.props.dispatch(Object(w.f)())},a.render=function(){var e=this.props,t=e.intl,a=e.shouldUpdateScroll,n=e.hasMore,o=e.accountIds,s=e.multiColumn;if(!o)return Object(c.a)(g.a,{},void 0,Object(c.a)(M.a,{}));var u=Object(c.a)(b.b,{id:"empty_column.mutes",defaultMessage:"You haven't muted any users yet."});return Object(c.a)(g.a,{bindToDocument:!s,icon:"volume-off",heading:t.formatMessage(q.heading)},void 0,Object(c.a)(v.a,{}),Object(c.a)(I.a,{scrollKey:"mutes",onLoadMore:this.handleLoadMore,hasMore:n,shouldUpdateScroll:a,emptyMessage:u,bindToDocument:!s},void 0,o.map((function(e){return Object(c.a)(y.a,{id:e},e)}))))},t}(h.a),Object(i.a)(o,"propTypes",{params:f.a.object.isRequired,dispatch:f.a.func.isRequired,shouldUpdateScroll:f.a.func,hasMore:f.a.bool,accountIds:O.a.list,intl:f.a.object.isRequired,multiColumn:f.a.bool}),n=s))||n)||n}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{828:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return L}));var n,o,s,c=a(0),u=a(2),r=(a(9),a(6),a(8)),i=a(1),d=a(65),l=a.n(d),p=(a(3),a(15)),b=a(7),h=a(21),m=a(5),f=a.n(m),j=a(16),O=a.n(j),M=a(306),g=a(757),v=a(763),y=a(1053),w=a(212),I=a(1049);var q=Object(b.f)({heading:{id:"column.mutes",defaultMessage:"Muted users"}}),L=Object(p.connect)((function(e){return{accountIds:e.getIn(["user_lists","mutes","items"]),hasMore:!!e.getIn(["user_lists","mutes","next"])}}))(n=Object(b.g)((s=o=function(e){Object(r.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,n=new Array(a),o=0;o<a;o++)n[o]=arguments[o];return t=e.call.apply(e,[this].concat(n))||this,Object(i.a)(Object(u.a)(t),"handleLoadMore",l()((function(){t.props.dispatch(Object(w.e)())}),300,{leading:!0})),t}var n=a.prototype;return n.componentWillMount=function(){this.props.dispatch(Object(w.f)())},n.render=function(){var e=this.props,t=e.intl,a=e.shouldUpdateScroll,n=e.hasMore,o=e.accountIds,s=e.multiColumn;if(!o)return Object(c.a)(g.a,{},void 0,Object(c.a)(M.a,{}));var u=Object(c.a)(b.b,{id:"empty_column.mutes",defaultMessage:"You haven't muted any users yet."});return(Object(c.a)(g.a,{bindToDocument:!s,icon:"volume-off",heading:t.formatMessage(q.heading)},void 0,Object(c.a)(v.a,{}),Object(c.a)(I.a,{scrollKey:"mutes",onLoadMore:this.handleLoadMore,hasMore:n,shouldUpdateScroll:a,emptyMessage:u,bindToDocument:!s},void 0,o.map((function(e){return Object(c.a)(y.a,{id:e},e)})))))},a}(h.a),Object(i.a)(o,"propTypes",{params:f.a.object.isRequired,dispatch:f.a.func.isRequired,shouldUpdateScroll:f.a.func,hasMore:f.a.bool,accountIds:O.a.list,intl:f.a.object.isRequired,multiColumn:f.a.bool}),n=s))||n)||n}}]);
//# sourceMappingURL=mutes.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/mutes.js.map b/priv/static/packs/features/mutes.js.map
index 83d73d273..24155f586 100644
--- a/priv/static/packs/features/mutes.js.map
+++ b/priv/static/packs/features/mutes.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/mutes/index.js"],"names":["messages","defineMessages","heading","Mutes","connect","state","accountIds","getIn","hasMore","injectIntl","props","dispatch","expandMutes","leading","componentWillMount","this","fetchMutes","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","icon","formatMessage","scrollKey","onLoadMore","handleLoadMore","map","ImmutablePureComponent","params","PropTypes","object","isRequired","func","bool","ImmutablePropTypes","list"],"mappings":"wTAcMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,kDAUHC,EAFUC,mBALQ,SAAAC,GAAK,MAAK,CAChCC,WAAYD,EAAME,MAAM,CAAC,aAAc,QAAS,UAChDC,UAAWH,EAAME,MAAM,CAAC,aAAc,QAAS,Y,GAIhDE,a,mMAiBkB,KAAS,WACxB,EAAKC,MAAMC,SAASC,iBACnB,IAAK,CAAEC,SAAS,K,8CANnBC,mBAAA,WACEC,KAAKL,MAAMC,SAASK,gB,EAOtBC,OAAA,WAAW,IAAD,EAC+DF,KAAKL,MAApEQ,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBX,EAD1B,EAC0BA,QAASF,EADnC,EACmCA,WAAYc,EAD/C,EAC+CA,YAEvD,IAAKd,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAe,YAAC,IAAD,CAAkBC,GAAG,qBAAqBC,eAAe,qCAE9E,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,EAAaK,KAAK,aAAavB,QAASgB,EAAKQ,cAAc1B,EAASE,eAA7F,EACE,YAAC,IAAD,IACA,YAAC,IAAD,CACEyB,UAAU,QACVC,WAAYb,KAAKc,eACjBrB,QAASA,EACTW,mBAAoBA,EACpBE,aAAcA,EACdG,gBAAiBJ,QANnB,EAQGd,EAAWwB,KAAI,SAAAR,GAAE,OAChB,YAAC,IAAD,CAA2BA,GAAIA,GAARA,S,GA7CfS,K,0BAEC,CACjBC,OAAQC,IAAUC,OAAOC,WACzBxB,SAAUsB,IAAUG,KAAKD,WACzBhB,mBAAoBc,IAAUG,KAC9B5B,QAASyB,IAAUI,KACnB/B,WAAYgC,IAAmBC,KAC/BrB,KAAMe,IAAUC,OAAOC,WACvBf,YAAaa,IAAUI,O","file":"features/mutes.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport AccountContainer from '../../containers/account_container';\nimport { fetchMutes, expandMutes } from '../../actions/mutes';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.mutes', defaultMessage: 'Muted users' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'mutes', 'items']),\n hasMore: !!state.getIn(['user_lists', 'mutes', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Mutes extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n hasMore: PropTypes.bool,\n accountIds: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchMutes());\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandMutes());\n }, 300, { leading: true });\n\n render () {\n const { intl, shouldUpdateScroll, hasMore, accountIds, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.mutes' defaultMessage=\"You haven't muted any users yet.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='volume-off' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <ScrollableList\n scrollKey='mutes'\n onLoadMore={this.handleLoadMore}\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountContainer key={id} id={id} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/mutes/index.js"],"names":["messages","defineMessages","heading","Mutes","connect","state","accountIds","getIn","hasMore","injectIntl","props","dispatch","expandMutes","leading","componentWillMount","this","fetchMutes","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","icon","formatMessage","scrollKey","onLoadMore","handleLoadMore","map","ImmutablePureComponent","params","PropTypes","object","isRequired","func","bool","ImmutablePropTypes","list"],"mappings":"oUAcA,IAAMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,kDAUHC,EAFUC,mBALQ,SAAAC,GAAK,MAAK,CAChCC,WAAYD,EAAME,MAAM,CAAC,aAAc,QAAS,UAChDC,UAAWH,EAAME,MAAM,CAAC,aAAc,QAAS,Y,GAIhDE,a,8NAiBkB,KAAS,WACxB,EAAKC,MAAMC,SAASC,iBACnB,IAAK,CAAEC,SAAS,K,6BANnBC,mBAAA,WACEC,KAAKL,MAAMC,SAASK,gB,EAOtBC,OAAA,WAAW,IAAD,EAC+DF,KAAKL,MAApEQ,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBX,EAD1B,EAC0BA,QAASF,EADnC,EACmCA,WAAYc,EAD/C,EAC+CA,YAEvD,IAAKd,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAe,YAAC,IAAD,CAAkBC,GAAG,qBAAqBC,eAAe,qCAE9E,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,EAAaK,KAAK,aAAavB,QAASgB,EAAKQ,cAAc1B,EAASE,eAA7F,EACE,YAAC,IAAD,IACA,YAAC,IAAD,CACEyB,UAAU,QACVC,WAAYb,KAAKc,eACjBrB,QAASA,EACTW,mBAAoBA,EACpBE,aAAcA,EACdG,gBAAiBJ,QANnB,EAQGd,EAAWwB,KAAI,SAAAR,GAAE,OAChB,YAAC,IAAD,CAA2BA,GAAIA,GAARA,U,GA7CfS,K,0BAEC,CACjBC,OAAQC,IAAUC,OAAOC,WACzBxB,SAAUsB,IAAUG,KAAKD,WACzBhB,mBAAoBc,IAAUG,KAC9B5B,QAASyB,IAAUI,KACnB/B,WAAYgC,IAAmBC,KAC/BrB,KAAMe,IAAUC,OAAOC,WACvBf,YAAaa,IAAUI,O","file":"features/mutes.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { debounce } from 'lodash';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport AccountContainer from '../../containers/account_container';\nimport { fetchMutes, expandMutes } from '../../actions/mutes';\nimport ScrollableList from '../../components/scrollable_list';\n\nconst messages = defineMessages({\n heading: { id: 'column.mutes', defaultMessage: 'Muted users' },\n});\n\nconst mapStateToProps = state => ({\n accountIds: state.getIn(['user_lists', 'mutes', 'items']),\n hasMore: !!state.getIn(['user_lists', 'mutes', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Mutes extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n hasMore: PropTypes.bool,\n accountIds: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchMutes());\n }\n\n handleLoadMore = debounce(() => {\n this.props.dispatch(expandMutes());\n }, 300, { leading: true });\n\n render () {\n const { intl, shouldUpdateScroll, hasMore, accountIds, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='empty_column.mutes' defaultMessage=\"You haven't muted any users yet.\" />;\n\n return (\n <Column bindToDocument={!multiColumn} icon='volume-off' heading={intl.formatMessage(messages.heading)}>\n <ColumnBackButtonSlim />\n <ScrollableList\n scrollKey='mutes'\n onLoadMore={this.handleLoadMore}\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountContainer key={id} id={id} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/notifications.js b/priv/static/packs/features/notifications.js
index 49f828901..419aeeaac 100644
--- a/priv/static/packs/features/notifications.js
+++ b/priv/static/packs/features/notifications.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{808:function(t,e,i){"use strict";i.r(e);var o,a,n,s,c,l,r,d,u,f,b=i(0),h=i(2),g=i(7),p=i(1),O=i(62),j=i.n(O),v=i(3),m=i.n(v),_=i(13),M=i(736),w=i(733),C=i(53),y=i(250),P=i(206),k=i(14),N=i.n(k),x=i(6),I=i(295),q=i(5),S=i.n(q),F=i(18),R=i(20),W=i(1053),H=i(1026),T=i(111),D=i(118),L=i(294),B=i(50),U=Object(x.f)({authorize:{id:"follow_request.authorize",defaultMessage:"Authorize"},reject:{id:"follow_request.reject",defaultMessage:"Reject"}}),A=Object(x.g)((n=a=function(t){function e(){return t.apply(this,arguments)||this}return Object(g.a)(e,t),e.prototype.render=function(){var t=this.props,e=t.intl,i=t.hidden,o=t.account,a=t.onAuthorize,n=t.onReject;return o?i?Object(b.a)(v.Fragment,{},void 0,o.get("display_name"),o.get("username")):Object(b.a)("div",{className:"account"},void 0,Object(b.a)("div",{className:"account__wrapper"},void 0,Object(b.a)(L.a,{className:"account__display-name",title:o.get("acct"),href:o.get("url"),to:"/accounts/"+o.get("id")},o.get("id"),Object(b.a)("div",{className:"account__avatar-wrapper"},void 0,Object(b.a)(T.a,{account:o,size:36})),Object(b.a)(D.a,{account:o})),Object(b.a)("div",{className:"account__relationship"},void 0,Object(b.a)(B.a,{title:e.formatMessage(U.authorize),icon:"check",onClick:a}),Object(b.a)(B.a,{title:e.formatMessage(U.reject),icon:"times",onClick:n})))):Object(b.a)("div",{})},e}(F.a),Object(p.a)(a,"propTypes",{account:N.a.map.isRequired,onAuthorize:S.a.func.isRequired,onReject:S.a.func.isRequired,intl:S.a.object.isRequired}),o=n))||o,z=i(25),K=Object(_.connect)((function(){var t=Object(P.d)();return function(e,i){return{account:t(e,i.id)}}}),(function(t,e){var i=e.id;return{onAuthorize:function(){t(Object(z.v)(i))},onReject:function(){t(Object(z.I)(i))}}}))(A),Y=i(26),G=Object(x.f)({favourite:{id:"notification.favourite",defaultMessage:"{name} favourited your status"},follow:{id:"notification.follow",defaultMessage:"{name} followed you"},ownPoll:{id:"notification.own_poll",defaultMessage:"Your poll has ended"},poll:{id:"notification.poll",defaultMessage:"A poll you have voted in has ended"},reblog:{id:"notification.reblog",defaultMessage:"{name} boosted your status"}}),J=function(t,e,i){var o=[e];return o.push(t.formatDate(i,{hour:"2-digit",minute:"2-digit",month:"short",day:"numeric"})),o.join(", ")},V=Object(x.g)((l=c=function(t){function e(){for(var e,i=arguments.length,o=new Array(i),a=0;a<i;a++)o[a]=arguments[a];return e=t.call.apply(t,[this].concat(o))||this,Object(p.a)(Object(h.a)(e),"handleMoveUp",(function(){var t=e.props,i=t.notification;(0,t.onMoveUp)(i.get("id"))})),Object(p.a)(Object(h.a)(e),"handleMoveDown",(function(){var t=e.props,i=t.notification;(0,t.onMoveDown)(i.get("id"))})),Object(p.a)(Object(h.a)(e),"handleOpen",(function(){var t=e.props.notification;t.get("status")?e.context.router.history.push("/statuses/"+t.get("status")):e.handleOpenProfile()})),Object(p.a)(Object(h.a)(e),"handleOpenProfile",(function(){var t=e.props.notification;e.context.router.history.push("/accounts/"+t.getIn(["account","id"]))})),Object(p.a)(Object(h.a)(e),"handleMention",(function(t){t.preventDefault();var i=e.props,o=i.notification;(0,i.onMention)(o.get("account"),e.context.router.history)})),Object(p.a)(Object(h.a)(e),"handleHotkeyFavourite",(function(){var t=e.props.status;t&&e.props.onFavourite(t)})),Object(p.a)(Object(h.a)(e),"handleHotkeyBoost",(function(t){var i=e.props.status;i&&e.props.onReblog(i,t)})),Object(p.a)(Object(h.a)(e),"handleHotkeyToggleHidden",(function(){var t=e.props.status;t&&e.props.onToggleHidden(t)})),e}Object(g.a)(e,t);var i=e.prototype;return i.getHandlers=function(){return{reply:this.handleMention,favourite:this.handleHotkeyFavourite,boost:this.handleHotkeyBoost,mention:this.handleMention,open:this.handleOpen,openProfile:this.handleOpenProfile,moveUp:this.handleMoveUp,moveDown:this.handleMoveDown,toggleHidden:this.handleHotkeyToggleHidden}},i.renderFollow=function(t,e,i){var o=this.props.intl;return Object(b.a)(I.HotKeys,{handlers:this.getHandlers()},void 0,Object(b.a)("div",{className:"notification notification-follow focusable",tabIndex:"0","aria-label":J(o,o.formatMessage(G.follow,{name:e.get("acct")}),t.get("created_at"))},void 0,Object(b.a)("div",{className:"notification__message"},void 0,Object(b.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(b.a)(Y.a,{id:"user-plus",fixedWidth:!0})),Object(b.a)("span",{title:t.get("created_at")},void 0,Object(b.a)(x.b,{id:"notification.follow",defaultMessage:"{name} followed you",values:{name:i}}))),Object(b.a)(H.a,{id:e.get("id"),hidden:this.props.hidden})))},i.renderFollowRequest=function(t,e,i){var o=this.props.intl;return Object(b.a)(I.HotKeys,{handlers:this.getHandlers()},void 0,Object(b.a)("div",{className:"notification notification-follow-request focusable",tabIndex:"0","aria-label":J(o,o.formatMessage({id:"notification.follow_request",defaultMessage:"{name} has requested to follow you"},{name:e.get("acct")}),t.get("created_at"))},void 0,Object(b.a)("div",{className:"notification__message"},void 0,Object(b.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(b.a)(Y.a,{id:"user",fixedWidth:!0})),Object(b.a)("span",{title:t.get("created_at")},void 0,Object(b.a)(x.b,{id:"notification.follow_request",defaultMessage:"{name} has requested to follow you",values:{name:i}}))),Object(b.a)(K,{id:e.get("id"),withNote:!1,hidden:this.props.hidden})))},i.renderMention=function(t){return Object(b.a)(W.a,{id:t.get("status"),withDismiss:!0,hidden:this.props.hidden,onMoveDown:this.handleMoveDown,onMoveUp:this.handleMoveUp,contextType:"notifications",getScrollPosition:this.props.getScrollPosition,updateScrollBottom:this.props.updateScrollBottom,cachedMediaWidth:this.props.cachedMediaWidth,cacheMediaWidth:this.props.cacheMediaWidth})},i.renderFavourite=function(t,e){var i=this.props.intl;return Object(b.a)(I.HotKeys,{handlers:this.getHandlers()},void 0,Object(b.a)("div",{className:"notification notification-favourite focusable",tabIndex:"0","aria-label":J(i,i.formatMessage(G.favourite,{name:t.getIn(["account","acct"])}),t.get("created_at"))},void 0,Object(b.a)("div",{className:"notification__message"},void 0,Object(b.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(b.a)(Y.a,{id:"star",className:"star-icon",fixedWidth:!0})),Object(b.a)("span",{title:t.get("created_at")},void 0,Object(b.a)(x.b,{id:"notification.favourite",defaultMessage:"{name} favourited your status",values:{name:e}}))),Object(b.a)(W.a,{id:t.get("status"),account:t.get("account"),muted:!0,withDismiss:!0,hidden:!!this.props.hidden,getScrollPosition:this.props.getScrollPosition,updateScrollBottom:this.props.updateScrollBottom,cachedMediaWidth:this.props.cachedMediaWidth,cacheMediaWidth:this.props.cacheMediaWidth})))},i.renderReblog=function(t,e){var i=this.props.intl;return Object(b.a)(I.HotKeys,{handlers:this.getHandlers()},void 0,Object(b.a)("div",{className:"notification notification-reblog focusable",tabIndex:"0","aria-label":J(i,i.formatMessage(G.reblog,{name:t.getIn(["account","acct"])}),t.get("created_at"))},void 0,Object(b.a)("div",{className:"notification__message"},void 0,Object(b.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(b.a)(Y.a,{id:"retweet",fixedWidth:!0})),Object(b.a)("span",{title:t.get("created_at")},void 0,Object(b.a)(x.b,{id:"notification.reblog",defaultMessage:"{name} boosted your status",values:{name:e}}))),Object(b.a)(W.a,{id:t.get("status"),account:t.get("account"),muted:!0,withDismiss:!0,hidden:this.props.hidden,getScrollPosition:this.props.getScrollPosition,updateScrollBottom:this.props.updateScrollBottom,cachedMediaWidth:this.props.cachedMediaWidth,cacheMediaWidth:this.props.cacheMediaWidth})))},i.renderPoll=function(t,e){var i=this.props.intl,o=R.n===e.get("id"),a=o?i.formatMessage(G.ownPoll):i.formatMessage(G.poll);return Object(b.a)(I.HotKeys,{handlers:this.getHandlers()},void 0,Object(b.a)("div",{className:"notification notification-poll focusable",tabIndex:"0","aria-label":J(i,a,t.get("created_at"))},void 0,Object(b.a)("div",{className:"notification__message"},void 0,Object(b.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(b.a)(Y.a,{id:"tasks",fixedWidth:!0})),Object(b.a)("span",{title:t.get("created_at")},void 0,o?Object(b.a)(x.b,{id:"notification.own_poll",defaultMessage:"Your poll has ended"}):Object(b.a)(x.b,{id:"notification.poll",defaultMessage:"A poll you have voted in has ended"}))),Object(b.a)(W.a,{id:t.get("status"),account:e,muted:!0,withDismiss:!0,hidden:this.props.hidden,getScrollPosition:this.props.getScrollPosition,updateScrollBottom:this.props.updateScrollBottom,cachedMediaWidth:this.props.cachedMediaWidth,cacheMediaWidth:this.props.cacheMediaWidth})))},i.render=function(){var t=this.props.notification,e=t.get("account"),i={__html:e.get("display_name_html")},o=Object(b.a)("bdi",{},void 0,Object(b.a)(L.a,{className:"notification__display-name",href:e.get("url"),title:e.get("acct"),to:"/accounts/"+e.get("id"),dangerouslySetInnerHTML:i}));switch(t.get("type")){case"follow":return this.renderFollow(t,e,o);case"follow_request":return this.renderFollowRequest(t,e,o);case"mention":return this.renderMention(t);case"favourite":return this.renderFavourite(t,o);case"reblog":return this.renderReblog(t,o);case"poll":return this.renderPoll(t,e)}return null},e}(F.a),Object(p.a)(c,"contextTypes",{router:S.a.object}),Object(p.a)(c,"propTypes",{notification:N.a.map.isRequired,hidden:S.a.bool,onMoveUp:S.a.func.isRequired,onMoveDown:S.a.func.isRequired,onMention:S.a.func.isRequired,onFavourite:S.a.func.isRequired,onReblog:S.a.func.isRequired,onToggleHidden:S.a.func.isRequired,status:N.a.map,intl:S.a.object.isRequired,getScrollPosition:S.a.func,updateScrollBottom:S.a.func,cacheMediaWidth:S.a.func,cachedMediaWidth:S.a.number}),s=l))||s,E=i(47),Q=i(21),X=i(45),Z=i(85),$=Object(_.connect)((function(){var t=Object(P.e)(),e=Object(P.f)();return function(i,o){var a=t(i,o.notification,o.accountId);return{notification:a,status:a.get("status")?e(i,{id:a.get("status")}):null}}}),(function(t){return{onMention:function(e,i){t(Object(Q.cb)(e,i))},onModalReblog:function(e){t(Object(X.t)(e))},onReblog:function(e,i){e.get("reblogged")?t(Object(X.x)(e)):i.shiftKey||!R.b?this.onModalReblog(e):t(Object(E.d)("BOOST",{status:e,onReblog:this.onModalReblog}))},onFavourite:function(e){e.get("favourited")?t(Object(X.v)(e)):t(Object(X.p)(e))},onToggleHidden:function(e){e.get("hidden")?t(Object(Z.l)(e.get("id"))):t(Object(Z.j)(e.get("id")))}}}))(V),tt=function(t){function e(){return t.apply(this,arguments)||this}return Object(g.a)(e,t),e.prototype.render=function(){return Object(b.a)("button",{className:"text-btn column-header__setting-btn",tabIndex:"0",onClick:this.props.onClick},void 0,Object(b.a)(Y.a,{id:"eraser"})," ",Object(b.a)(x.b,{id:"notifications.clear",defaultMessage:"Clear notifications"}))},e}(m.a.PureComponent),et=i(1079),it=function(t){function e(){for(var e,i=arguments.length,o=new Array(i),a=0;a<i;a++)o[a]=arguments[a];return e=t.call.apply(t,[this].concat(o))||this,Object(p.a)(Object(h.a)(e),"onPushChange",(function(t,i){e.props.onChange(["push"].concat(t),i)})),e}return Object(g.a)(e,t),e.prototype.render=function(){var t=this.props,e=t.settings,i=t.pushSettings,o=t.onChange,a=t.onClear,n=Object(b.a)(x.b,{id:"notifications.column_settings.filter_bar.show",defaultMessage:"Show"}),s=Object(b.a)(x.b,{id:"notifications.column_settings.filter_bar.advanced",defaultMessage:"Display all categories"}),c=Object(b.a)(x.b,{id:"notifications.column_settings.alert",defaultMessage:"Desktop notifications"}),l=Object(b.a)(x.b,{id:"notifications.column_settings.show",defaultMessage:"Show in column"}),r=Object(b.a)(x.b,{id:"notifications.column_settings.sound",defaultMessage:"Play sound"}),d=i.get("browserSupport")&&i.get("isSubscribed"),u=d&&Object(b.a)(x.b,{id:"notifications.column_settings.push",defaultMessage:"Push notifications"});return Object(b.a)("div",{},void 0,Object(b.a)("div",{className:"column-settings__row"},void 0,Object(b.a)(tt,{onClick:a})),Object(b.a)("div",{role:"group","aria-labelledby":"notifications-filter-bar"},void 0,Object(b.a)("span",{id:"notifications-filter-bar",className:"column-settings__section"},void 0,Object(b.a)(x.b,{id:"notifications.column_settings.filter_bar.category",defaultMessage:"Quick filter bar"})),Object(b.a)("div",{className:"column-settings__row"},void 0,Object(b.a)(et.a,{id:"show-filter-bar",prefix:"notifications",settings:e,settingPath:["quickFilter","show"],onChange:o,label:n}),Object(b.a)(et.a,{id:"show-filter-bar",prefix:"notifications",settings:e,settingPath:["quickFilter","advanced"],onChange:o,label:s}))),Object(b.a)("div",{role:"group","aria-labelledby":"notifications-follow"},void 0,Object(b.a)("span",{id:"notifications-follow",className:"column-settings__section"},void 0,Object(b.a)(x.b,{id:"notifications.column_settings.follow",defaultMessage:"New followers:"})),Object(b.a)("div",{className:"column-settings__row"},void 0,Object(b.a)(et.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","follow"],onChange:o,label:c}),d&&Object(b.a)(et.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","follow"],onChange:this.onPushChange,label:u}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["shows","follow"],onChange:o,label:l}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["sounds","follow"],onChange:o,label:r}))),Object(b.a)("div",{role:"group","aria-labelledby":"notifications-follow-request"},void 0,Object(b.a)("span",{id:"notifications-follow-request",className:"column-settings__section"},void 0,Object(b.a)(x.b,{id:"notifications.column_settings.follow_request",defaultMessage:"New follow requests:"})),Object(b.a)("div",{className:"column-settings__row"},void 0,Object(b.a)(et.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","follow_request"],onChange:o,label:c}),d&&Object(b.a)(et.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","follow_request"],onChange:this.onPushChange,label:u}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["shows","follow_request"],onChange:o,label:l}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["sounds","follow_request"],onChange:o,label:r}))),Object(b.a)("div",{role:"group","aria-labelledby":"notifications-favourite"},void 0,Object(b.a)("span",{id:"notifications-favourite",className:"column-settings__section"},void 0,Object(b.a)(x.b,{id:"notifications.column_settings.favourite",defaultMessage:"Favourites:"})),Object(b.a)("div",{className:"column-settings__row"},void 0,Object(b.a)(et.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","favourite"],onChange:o,label:c}),d&&Object(b.a)(et.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","favourite"],onChange:this.onPushChange,label:u}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["shows","favourite"],onChange:o,label:l}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["sounds","favourite"],onChange:o,label:r}))),Object(b.a)("div",{role:"group","aria-labelledby":"notifications-mention"},void 0,Object(b.a)("span",{id:"notifications-mention",className:"column-settings__section"},void 0,Object(b.a)(x.b,{id:"notifications.column_settings.mention",defaultMessage:"Mentions:"})),Object(b.a)("div",{className:"column-settings__row"},void 0,Object(b.a)(et.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","mention"],onChange:o,label:c}),d&&Object(b.a)(et.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","mention"],onChange:this.onPushChange,label:u}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["shows","mention"],onChange:o,label:l}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["sounds","mention"],onChange:o,label:r}))),Object(b.a)("div",{role:"group","aria-labelledby":"notifications-reblog"},void 0,Object(b.a)("span",{id:"notifications-reblog",className:"column-settings__section"},void 0,Object(b.a)(x.b,{id:"notifications.column_settings.reblog",defaultMessage:"Boosts:"})),Object(b.a)("div",{className:"column-settings__row"},void 0,Object(b.a)(et.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","reblog"],onChange:o,label:c}),d&&Object(b.a)(et.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","reblog"],onChange:this.onPushChange,label:u}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["shows","reblog"],onChange:o,label:l}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["sounds","reblog"],onChange:o,label:r}))),Object(b.a)("div",{role:"group","aria-labelledby":"notifications-poll"},void 0,Object(b.a)("span",{id:"notifications-poll",className:"column-settings__section"},void 0,Object(b.a)(x.b,{id:"notifications.column_settings.poll",defaultMessage:"Poll results:"})),Object(b.a)("div",{className:"column-settings__row"},void 0,Object(b.a)(et.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","poll"],onChange:o,label:c}),d&&Object(b.a)(et.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","poll"],onChange:this.onPushChange,label:u}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["shows","poll"],onChange:o,label:l}),Object(b.a)(et.a,{prefix:"notifications",settings:e,settingPath:["sounds","poll"],onChange:o,label:r}))))},e}(m.a.PureComponent),ot=i(70),at=i(228),nt=Object(x.f)({clearMessage:{id:"notifications.clear_confirmation",defaultMessage:"Are you sure you want to permanently clear all your notifications?"},clearConfirm:{id:"notifications.clear",defaultMessage:"Clear notifications"}}),st=Object(x.g)(Object(_.connect)((function(t){return{settings:t.getIn(["settings","notifications"]),pushSettings:t.get("push_notifications")}}),(function(t,e){var i=e.intl;return{onChange:function(e,i){"push"===e[0]?t(Object(at.e)(e.slice(1),i)):"quickFilter"===e[0]?(t(Object(ot.c)(["notifications"].concat(e),i)),t(Object(C.p)("all"))):t(Object(ot.c)(["notifications"].concat(e),i))},onClear:function(){t(Object(E.d)("CONFIRM",{message:i.formatMessage(nt.clearMessage),confirm:i.formatMessage(nt.clearConfirm),onConfirm:function(){return t(Object(C.k)())}}))}}}))(it)),ct=Object(x.f)({mentions:{id:"notifications.filter.mentions",defaultMessage:"Mentions"},favourites:{id:"notifications.filter.favourites",defaultMessage:"Favourites"},boosts:{id:"notifications.filter.boosts",defaultMessage:"Boosts"},polls:{id:"notifications.filter.polls",defaultMessage:"Poll results"},follows:{id:"notifications.filter.follows",defaultMessage:"Follows"}}),lt=Object(x.g)(r=function(t){function e(){return t.apply(this,arguments)||this}Object(g.a)(e,t);var i=e.prototype;return i.onClick=function(t){var e=this;return function(){return e.props.selectFilter(t)}},i.render=function(){var t=this.props,e=t.selectedFilter,i=t.advancedMode,o=t.intl;return i?Object(b.a)("div",{className:"notification__filter-bar"},void 0,Object(b.a)("button",{className:"all"===e?"active":"",onClick:this.onClick("all")},void 0,Object(b.a)(x.b,{id:"notifications.filter.all",defaultMessage:"All"})),Object(b.a)("button",{className:"mention"===e?"active":"",onClick:this.onClick("mention"),title:o.formatMessage(ct.mentions)},void 0,Object(b.a)(Y.a,{id:"reply-all",fixedWidth:!0})),Object(b.a)("button",{className:"favourite"===e?"active":"",onClick:this.onClick("favourite"),title:o.formatMessage(ct.favourites)},void 0,Object(b.a)(Y.a,{id:"star",fixedWidth:!0})),Object(b.a)("button",{className:"reblog"===e?"active":"",onClick:this.onClick("reblog"),title:o.formatMessage(ct.boosts)},void 0,Object(b.a)(Y.a,{id:"retweet",fixedWidth:!0})),Object(b.a)("button",{className:"poll"===e?"active":"",onClick:this.onClick("poll"),title:o.formatMessage(ct.polls)},void 0,Object(b.a)(Y.a,{id:"tasks",fixedWidth:!0})),Object(b.a)("button",{className:"follow"===e?"active":"",onClick:this.onClick("follow"),title:o.formatMessage(ct.follows)},void 0,Object(b.a)(Y.a,{id:"user-plus",fixedWidth:!0}))):Object(b.a)("div",{className:"notification__filter-bar"},void 0,Object(b.a)("button",{className:"all"===e?"active":"",onClick:this.onClick("all")},void 0,Object(b.a)(x.b,{id:"notifications.filter.all",defaultMessage:"All"})),Object(b.a)("button",{className:"mention"===e?"active":"",onClick:this.onClick("mention")},void 0,Object(b.a)(x.b,{id:"notifications.filter.mentions",defaultMessage:"Mentions"})))},e}(m.a.PureComponent))||r,rt=Object(_.connect)((function(t){return{selectedFilter:t.getIn(["settings","notifications","quickFilter","active"]),advancedMode:t.getIn(["settings","notifications","quickFilter","advanced"])}}),(function(t){return{selectFilter:function(e){t(Object(C.p)(e))}}}))(lt),dt=i(54),ut=i(4),ft=i(1023),bt=i(1138);i.d(e,"default",(function(){return pt}));var ht=Object(x.f)({title:{id:"column.notifications",defaultMessage:"Notifications"}}),gt=Object(dt.a)([function(t){return t.getIn(["settings","notifications","quickFilter","show"])},function(t){return t.getIn(["settings","notifications","quickFilter","active"])},function(t){return Object(ut.List)(t.getIn(["settings","notifications","shows"]).filter((function(t){return!t})).keys())},function(t){return t.getIn(["notifications","items"])}],(function(t,e,i,o){return t&&"all"!==e?o.filter((function(t){return null!==t&&e===t.get("type")})):o.filterNot((function(t){return null!==t&&i.includes(t.get("type"))}))})),pt=Object(_.connect)((function(t){return{showFilterBar:t.getIn(["settings","notifications","quickFilter","show"]),notifications:gt(t),isLoading:t.getIn(["notifications","isLoading"],!0),isUnread:t.getIn(["notifications","unread"])>0||t.getIn(["notifications","pendingItems"]).size>0,hasMore:t.getIn(["notifications","hasMore"]),numPending:t.getIn(["notifications","pendingItems"],Object(ut.List)()).size}}))(d=Object(x.g)((f=u=function(t){function e(){for(var e,i=arguments.length,o=new Array(i),a=0;a<i;a++)o[a]=arguments[a];return e=t.call.apply(t,[this].concat(o))||this,Object(p.a)(Object(h.a)(e),"handleLoadGap",(function(t){e.props.dispatch(Object(C.l)({maxId:t}))})),Object(p.a)(Object(h.a)(e),"handleLoadOlder",j()((function(){var t=e.props.notifications.last();e.props.dispatch(Object(C.l)({maxId:t&&t.get("id")}))}),300,{leading:!0})),Object(p.a)(Object(h.a)(e),"handleLoadPending",(function(){e.props.dispatch(Object(C.m)())})),Object(p.a)(Object(h.a)(e),"handleScrollToTop",j()((function(){e.props.dispatch(Object(C.o)(!0))}),100)),Object(p.a)(Object(h.a)(e),"handleScroll",j()((function(){e.props.dispatch(Object(C.o)(!1))}),100)),Object(p.a)(Object(h.a)(e),"handlePin",(function(){var t=e.props,i=t.columnId,o=t.dispatch;o(i?Object(y.h)(i):Object(y.e)("NOTIFICATIONS",{}))})),Object(p.a)(Object(h.a)(e),"handleMove",(function(t){var i=e.props,o=i.columnId;(0,i.dispatch)(Object(y.g)(o,t))})),Object(p.a)(Object(h.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(p.a)(Object(h.a)(e),"setColumnRef",(function(t){e.column=t})),Object(p.a)(Object(h.a)(e),"handleMoveUp",(function(t){var i=e.props.notifications.findIndex((function(e){return null!==e&&e.get("id")===t}))-1;e._selectChild(i,!0)})),Object(p.a)(Object(h.a)(e),"handleMoveDown",(function(t){var i=e.props.notifications.findIndex((function(e){return null!==e&&e.get("id")===t}))+1;e._selectChild(i,!1)})),e}Object(g.a)(e,t);var i=e.prototype;return i.componentWillMount=function(){this.props.dispatch(Object(C.n)())},i.componentWillUnmount=function(){this.handleLoadOlder.cancel(),this.handleScrollToTop.cancel(),this.handleScroll.cancel(),this.props.dispatch(Object(C.o)(!1)),this.props.dispatch(Object(C.q)())},i._selectChild=function(t,e){var i=this.column.node,o=i.querySelector("article:nth-of-type("+(t+1)+") .focusable");o&&(e&&i.scrollTop>o.offsetTop?o.scrollIntoView(!0):!e&&i.scrollTop+i.clientHeight<o.offsetTop+o.offsetHeight&&o.scrollIntoView(!1),o.focus())},i.render=function(){var t=this,e=this.props,i=e.intl,o=e.notifications,a=e.shouldUpdateScroll,n=e.isLoading,s=e.isUnread,c=e.columnId,l=e.multiColumn,r=e.hasMore,d=e.numPending,u=e.showFilterBar,f=!!c,h=Object(b.a)(x.b,{id:"empty_column.notifications",defaultMessage:"You don't have any notifications yet. Interact with others to start the conversation."}),g=null,p=u?Object(b.a)(rt,{}):null;g=n&&this.scrollableContent?this.scrollableContent:o.size>0||r?o.map((function(e,i){return null===e?Object(b.a)(bt.a,{disabled:n,maxId:i>0?o.getIn([i-1,"id"]):null,onClick:t.handleLoadGap},"gap:"+o.getIn([i+1,"id"])):Object(b.a)($,{notification:e,accountId:e.get("account"),onMoveUp:t.handleMoveUp,onMoveDown:t.handleMoveDown},e.get("id"))})):null,this.scrollableContent=g;var O=Object(b.a)(ft.a,{scrollKey:"notifications-"+c,trackScroll:!f,isLoading:n,showLoading:n&&0===o.size,hasMore:r,numPending:d,emptyMessage:h,onLoadMore:this.handleLoadOlder,onLoadPending:this.handleLoadPending,onScrollToTop:this.handleScrollToTop,onScroll:this.handleScroll,shouldUpdateScroll:a,bindToDocument:!l},void 0,g);return m.a.createElement(M.a,{bindToDocument:!l,ref:this.setColumnRef,label:i.formatMessage(ht.title)},Object(b.a)(w.a,{icon:"bell",active:s,title:i.formatMessage(ht.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:f,multiColumn:l},void 0,Object(b.a)(st,{})),p,O)},e}(m.a.PureComponent),Object(p.a)(u,"defaultProps",{trackScroll:!0}),d=f))||d)||d}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{834:function(t,e,i){"use strict";i.r(e),i.d(e,"default",(function(){return pt}));var o,a,n,s=i(0),c=i(2),l=(i(9),i(6),i(8)),r=i(1),d=i(65),u=i.n(d),f=i(3),b=i.n(f),h=i(15),g=i(762),p=i(759),O=i(55),j=i(253),v=i(210),m=i(16),_=i.n(m),M=i(7),w=i(301),C=i(5),y=i.n(C),P=i(21),k=i(22),N=i(1080),x=i(1053),I=i(115),q=i(122),S=i(300),F=i(53);var R,W,H,T=Object(M.f)({authorize:{id:"follow_request.authorize",defaultMessage:"Authorize"},reject:{id:"follow_request.reject",defaultMessage:"Reject"}}),D=Object(M.g)((n=a=function(t){Object(l.a)(i,t);var e;e=i;function i(){return t.apply(this,arguments)||this}return i.prototype.render=function(){var t=this.props,e=t.intl,i=t.hidden,o=t.account,a=t.onAuthorize,n=t.onReject;return o?i?Object(s.a)(f.Fragment,{},void 0,o.get("display_name"),o.get("username")):Object(s.a)("div",{className:"account"},void 0,Object(s.a)("div",{className:"account__wrapper"},void 0,Object(s.a)(S.a,{className:"account__display-name",title:o.get("acct"),href:o.get("url"),to:"/accounts/"+o.get("id")},o.get("id"),Object(s.a)("div",{className:"account__avatar-wrapper"},void 0,Object(s.a)(I.a,{account:o,size:36})),Object(s.a)(q.a,{account:o})),Object(s.a)("div",{className:"account__relationship"},void 0,Object(s.a)(F.a,{title:e.formatMessage(T.authorize),icon:"check",onClick:a}),Object(s.a)(F.a,{title:e.formatMessage(T.reject),icon:"times",onClick:n})))):Object(s.a)("div",{})},i}(P.a),Object(r.a)(a,"propTypes",{account:_.a.map.isRequired,onAuthorize:y.a.func.isRequired,onReject:y.a.func.isRequired,intl:y.a.object.isRequired}),o=n))||o,L=i(26),B=Object(h.connect)((function(){var t=Object(v.d)();return function(e,i){return{account:t(e,i.id)}}}),(function(t,e){var i=e.id;return{onAuthorize:function(){t(Object(L.v)(i))},onReject:function(){t(Object(L.I)(i))}}}))(D),U=i(27);var A=Object(M.f)({favourite:{id:"notification.favourite",defaultMessage:"{name} favourited your status"},follow:{id:"notification.follow",defaultMessage:"{name} followed you"},ownPoll:{id:"notification.own_poll",defaultMessage:"Your poll has ended"},poll:{id:"notification.poll",defaultMessage:"A poll you have voted in has ended"},reblog:{id:"notification.reblog",defaultMessage:"{name} boosted your status"}}),z=function(t,e,i){var o=[e];return o.push(t.formatDate(i,{hour:"2-digit",minute:"2-digit",month:"short",day:"numeric"})),o.join(", ")},K=Object(M.g)((H=W=function(t){Object(l.a)(i,t);var e;e=i;function i(){for(var e,i=arguments.length,o=new Array(i),a=0;a<i;a++)o[a]=arguments[a];return e=t.call.apply(t,[this].concat(o))||this,Object(r.a)(Object(c.a)(e),"handleMoveUp",(function(){var t=e.props,i=t.notification;(0,t.onMoveUp)(i.get("id"))})),Object(r.a)(Object(c.a)(e),"handleMoveDown",(function(){var t=e.props,i=t.notification;(0,t.onMoveDown)(i.get("id"))})),Object(r.a)(Object(c.a)(e),"handleOpen",(function(){var t=e.props.notification;t.get("status")?e.context.router.history.push("/statuses/"+t.get("status")):e.handleOpenProfile()})),Object(r.a)(Object(c.a)(e),"handleOpenProfile",(function(){var t=e.props.notification;e.context.router.history.push("/accounts/"+t.getIn(["account","id"]))})),Object(r.a)(Object(c.a)(e),"handleMention",(function(t){t.preventDefault();var i=e.props,o=i.notification;(0,i.onMention)(o.get("account"),e.context.router.history)})),Object(r.a)(Object(c.a)(e),"handleHotkeyFavourite",(function(){var t=e.props.status;t&&e.props.onFavourite(t)})),Object(r.a)(Object(c.a)(e),"handleHotkeyBoost",(function(t){var i=e.props.status;i&&e.props.onReblog(i,t)})),Object(r.a)(Object(c.a)(e),"handleHotkeyToggleHidden",(function(){var t=e.props.status;t&&e.props.onToggleHidden(t)})),e}var o=i.prototype;return o.getHandlers=function(){return{reply:this.handleMention,favourite:this.handleHotkeyFavourite,boost:this.handleHotkeyBoost,mention:this.handleMention,open:this.handleOpen,openProfile:this.handleOpenProfile,moveUp:this.handleMoveUp,moveDown:this.handleMoveDown,toggleHidden:this.handleHotkeyToggleHidden}},o.renderFollow=function(t,e,i){var o=this.props.intl;return(Object(s.a)(w.HotKeys,{handlers:this.getHandlers()},void 0,Object(s.a)("div",{className:"notification notification-follow focusable",tabIndex:"0","aria-label":z(o,o.formatMessage(A.follow,{name:e.get("acct")}),t.get("created_at"))},void 0,Object(s.a)("div",{className:"notification__message"},void 0,Object(s.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(s.a)(U.a,{id:"user-plus",fixedWidth:!0})),Object(s.a)("span",{title:t.get("created_at")},void 0,Object(s.a)(M.b,{id:"notification.follow",defaultMessage:"{name} followed you",values:{name:i}}))),Object(s.a)(x.a,{id:e.get("id"),hidden:this.props.hidden}))))},o.renderFollowRequest=function(t,e,i){var o=this.props.intl;return(Object(s.a)(w.HotKeys,{handlers:this.getHandlers()},void 0,Object(s.a)("div",{className:"notification notification-follow-request focusable",tabIndex:"0","aria-label":z(o,o.formatMessage({id:"notification.follow_request",defaultMessage:"{name} has requested to follow you"},{name:e.get("acct")}),t.get("created_at"))},void 0,Object(s.a)("div",{className:"notification__message"},void 0,Object(s.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(s.a)(U.a,{id:"user",fixedWidth:!0})),Object(s.a)("span",{title:t.get("created_at")},void 0,Object(s.a)(M.b,{id:"notification.follow_request",defaultMessage:"{name} has requested to follow you",values:{name:i}}))),Object(s.a)(B,{id:e.get("id"),withNote:!1,hidden:this.props.hidden}))))},o.renderMention=function(t){return Object(s.a)(N.a,{id:t.get("status"),withDismiss:!0,hidden:this.props.hidden,onMoveDown:this.handleMoveDown,onMoveUp:this.handleMoveUp,contextType:"notifications",getScrollPosition:this.props.getScrollPosition,updateScrollBottom:this.props.updateScrollBottom,cachedMediaWidth:this.props.cachedMediaWidth,cacheMediaWidth:this.props.cacheMediaWidth})},o.renderFavourite=function(t,e){var i=this.props.intl;return(Object(s.a)(w.HotKeys,{handlers:this.getHandlers()},void 0,Object(s.a)("div",{className:"notification notification-favourite focusable",tabIndex:"0","aria-label":z(i,i.formatMessage(A.favourite,{name:t.getIn(["account","acct"])}),t.get("created_at"))},void 0,Object(s.a)("div",{className:"notification__message"},void 0,Object(s.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(s.a)(U.a,{id:"star",className:"star-icon",fixedWidth:!0})),Object(s.a)("span",{title:t.get("created_at")},void 0,Object(s.a)(M.b,{id:"notification.favourite",defaultMessage:"{name} favourited your status",values:{name:e}}))),Object(s.a)(N.a,{id:t.get("status"),account:t.get("account"),muted:!0,withDismiss:!0,hidden:!!this.props.hidden,getScrollPosition:this.props.getScrollPosition,updateScrollBottom:this.props.updateScrollBottom,cachedMediaWidth:this.props.cachedMediaWidth,cacheMediaWidth:this.props.cacheMediaWidth}))))},o.renderReblog=function(t,e){var i=this.props.intl;return(Object(s.a)(w.HotKeys,{handlers:this.getHandlers()},void 0,Object(s.a)("div",{className:"notification notification-reblog focusable",tabIndex:"0","aria-label":z(i,i.formatMessage(A.reblog,{name:t.getIn(["account","acct"])}),t.get("created_at"))},void 0,Object(s.a)("div",{className:"notification__message"},void 0,Object(s.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(s.a)(U.a,{id:"retweet",fixedWidth:!0})),Object(s.a)("span",{title:t.get("created_at")},void 0,Object(s.a)(M.b,{id:"notification.reblog",defaultMessage:"{name} boosted your status",values:{name:e}}))),Object(s.a)(N.a,{id:t.get("status"),account:t.get("account"),muted:!0,withDismiss:!0,hidden:this.props.hidden,getScrollPosition:this.props.getScrollPosition,updateScrollBottom:this.props.updateScrollBottom,cachedMediaWidth:this.props.cachedMediaWidth,cacheMediaWidth:this.props.cacheMediaWidth}))))},o.renderPoll=function(t,e){var i=this.props.intl,o=k.n===e.get("id"),a=o?i.formatMessage(A.ownPoll):i.formatMessage(A.poll);return Object(s.a)(w.HotKeys,{handlers:this.getHandlers()},void 0,Object(s.a)("div",{className:"notification notification-poll focusable",tabIndex:"0","aria-label":z(i,a,t.get("created_at"))},void 0,Object(s.a)("div",{className:"notification__message"},void 0,Object(s.a)("div",{className:"notification__favourite-icon-wrapper"},void 0,Object(s.a)(U.a,{id:"tasks",fixedWidth:!0})),Object(s.a)("span",{title:t.get("created_at")},void 0,o?Object(s.a)(M.b,{id:"notification.own_poll",defaultMessage:"Your poll has ended"}):Object(s.a)(M.b,{id:"notification.poll",defaultMessage:"A poll you have voted in has ended"}))),Object(s.a)(N.a,{id:t.get("status"),account:e,muted:!0,withDismiss:!0,hidden:this.props.hidden,getScrollPosition:this.props.getScrollPosition,updateScrollBottom:this.props.updateScrollBottom,cachedMediaWidth:this.props.cachedMediaWidth,cacheMediaWidth:this.props.cacheMediaWidth})))},o.render=function(){var t=this.props.notification,e=t.get("account"),i={__html:e.get("display_name_html")},o=Object(s.a)("bdi",{},void 0,Object(s.a)(S.a,{className:"notification__display-name",href:e.get("url"),title:e.get("acct"),to:"/accounts/"+e.get("id"),dangerouslySetInnerHTML:i}));switch(t.get("type")){case"follow":return this.renderFollow(t,e,o);case"follow_request":return this.renderFollowRequest(t,e,o);case"mention":return this.renderMention(t);case"favourite":return this.renderFavourite(t,o);case"reblog":return this.renderReblog(t,o);case"poll":return this.renderPoll(t,e)}return null},i}(P.a),Object(r.a)(W,"contextTypes",{router:y.a.object}),Object(r.a)(W,"propTypes",{notification:_.a.map.isRequired,hidden:y.a.bool,onMoveUp:y.a.func.isRequired,onMoveDown:y.a.func.isRequired,onMention:y.a.func.isRequired,onFavourite:y.a.func.isRequired,onReblog:y.a.func.isRequired,onToggleHidden:y.a.func.isRequired,status:_.a.map,intl:y.a.object.isRequired,getScrollPosition:y.a.func,updateScrollBottom:y.a.func,cacheMediaWidth:y.a.func,cachedMediaWidth:y.a.number}),R=H))||R,Y=i(48),G=i(23),J=i(46),V=i(89),E=Object(h.connect)((function(){var t=Object(v.e)(),e=Object(v.f)();return function(i,o){var a=t(i,o.notification,o.accountId);return{notification:a,status:a.get("status")?e(i,{id:a.get("status")}):null}}}),(function(t){return{onMention:function(e,i){t(Object(G.cb)(e,i))},onModalReblog:function(e){t(Object(J.t)(e))},onReblog:function(e,i){e.get("reblogged")?t(Object(J.x)(e)):i.shiftKey||!k.b?this.onModalReblog(e):t(Object(Y.d)("BOOST",{status:e,onReblog:this.onModalReblog}))},onFavourite:function(e){e.get("favourited")?t(Object(J.v)(e)):t(Object(J.p)(e))},onToggleHidden:function(e){e.get("hidden")?t(Object(V.l)(e.get("id"))):t(Object(V.j)(e.get("id")))}}}))(K);var Q=function(t){Object(l.a)(i,t);var e;e=i;function i(){return t.apply(this,arguments)||this}return i.prototype.render=function(){return Object(s.a)("button",{className:"text-btn column-header__setting-btn",tabIndex:"0",onClick:this.props.onClick},void 0,Object(s.a)(U.a,{id:"eraser"})," ",Object(s.a)(M.b,{id:"notifications.clear",defaultMessage:"Clear notifications"}))},i}(b.a.PureComponent),X=i(1107);var Z,$=function(t){Object(l.a)(i,t);var e;e=i;function i(){for(var e,i=arguments.length,o=new Array(i),a=0;a<i;a++)o[a]=arguments[a];return e=t.call.apply(t,[this].concat(o))||this,Object(r.a)(Object(c.a)(e),"onPushChange",(function(t,i){e.props.onChange(["push"].concat(t),i)})),e}return i.prototype.render=function(){var t=this.props,e=t.settings,i=t.pushSettings,o=t.onChange,a=t.onClear,n=Object(s.a)(M.b,{id:"notifications.column_settings.filter_bar.show",defaultMessage:"Show"}),c=Object(s.a)(M.b,{id:"notifications.column_settings.filter_bar.advanced",defaultMessage:"Display all categories"}),l=Object(s.a)(M.b,{id:"notifications.column_settings.alert",defaultMessage:"Desktop notifications"}),r=Object(s.a)(M.b,{id:"notifications.column_settings.show",defaultMessage:"Show in column"}),d=Object(s.a)(M.b,{id:"notifications.column_settings.sound",defaultMessage:"Play sound"}),u=i.get("browserSupport")&&i.get("isSubscribed"),f=u&&Object(s.a)(M.b,{id:"notifications.column_settings.push",defaultMessage:"Push notifications"});return Object(s.a)("div",{},void 0,Object(s.a)("div",{className:"column-settings__row"},void 0,Object(s.a)(Q,{onClick:a})),Object(s.a)("div",{role:"group","aria-labelledby":"notifications-filter-bar"},void 0,Object(s.a)("span",{id:"notifications-filter-bar",className:"column-settings__section"},void 0,Object(s.a)(M.b,{id:"notifications.column_settings.filter_bar.category",defaultMessage:"Quick filter bar"})),Object(s.a)("div",{className:"column-settings__row"},void 0,Object(s.a)(X.a,{id:"show-filter-bar",prefix:"notifications",settings:e,settingPath:["quickFilter","show"],onChange:o,label:n}),Object(s.a)(X.a,{id:"show-filter-bar",prefix:"notifications",settings:e,settingPath:["quickFilter","advanced"],onChange:o,label:c}))),Object(s.a)("div",{role:"group","aria-labelledby":"notifications-follow"},void 0,Object(s.a)("span",{id:"notifications-follow",className:"column-settings__section"},void 0,Object(s.a)(M.b,{id:"notifications.column_settings.follow",defaultMessage:"New followers:"})),Object(s.a)("div",{className:"column-settings__row"},void 0,Object(s.a)(X.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","follow"],onChange:o,label:l}),u&&Object(s.a)(X.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","follow"],onChange:this.onPushChange,label:f}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["shows","follow"],onChange:o,label:r}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["sounds","follow"],onChange:o,label:d}))),Object(s.a)("div",{role:"group","aria-labelledby":"notifications-follow-request"},void 0,Object(s.a)("span",{id:"notifications-follow-request",className:"column-settings__section"},void 0,Object(s.a)(M.b,{id:"notifications.column_settings.follow_request",defaultMessage:"New follow requests:"})),Object(s.a)("div",{className:"column-settings__row"},void 0,Object(s.a)(X.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","follow_request"],onChange:o,label:l}),u&&Object(s.a)(X.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","follow_request"],onChange:this.onPushChange,label:f}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["shows","follow_request"],onChange:o,label:r}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["sounds","follow_request"],onChange:o,label:d}))),Object(s.a)("div",{role:"group","aria-labelledby":"notifications-favourite"},void 0,Object(s.a)("span",{id:"notifications-favourite",className:"column-settings__section"},void 0,Object(s.a)(M.b,{id:"notifications.column_settings.favourite",defaultMessage:"Favourites:"})),Object(s.a)("div",{className:"column-settings__row"},void 0,Object(s.a)(X.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","favourite"],onChange:o,label:l}),u&&Object(s.a)(X.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","favourite"],onChange:this.onPushChange,label:f}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["shows","favourite"],onChange:o,label:r}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["sounds","favourite"],onChange:o,label:d}))),Object(s.a)("div",{role:"group","aria-labelledby":"notifications-mention"},void 0,Object(s.a)("span",{id:"notifications-mention",className:"column-settings__section"},void 0,Object(s.a)(M.b,{id:"notifications.column_settings.mention",defaultMessage:"Mentions:"})),Object(s.a)("div",{className:"column-settings__row"},void 0,Object(s.a)(X.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","mention"],onChange:o,label:l}),u&&Object(s.a)(X.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","mention"],onChange:this.onPushChange,label:f}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["shows","mention"],onChange:o,label:r}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["sounds","mention"],onChange:o,label:d}))),Object(s.a)("div",{role:"group","aria-labelledby":"notifications-reblog"},void 0,Object(s.a)("span",{id:"notifications-reblog",className:"column-settings__section"},void 0,Object(s.a)(M.b,{id:"notifications.column_settings.reblog",defaultMessage:"Boosts:"})),Object(s.a)("div",{className:"column-settings__row"},void 0,Object(s.a)(X.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","reblog"],onChange:o,label:l}),u&&Object(s.a)(X.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","reblog"],onChange:this.onPushChange,label:f}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["shows","reblog"],onChange:o,label:r}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["sounds","reblog"],onChange:o,label:d}))),Object(s.a)("div",{role:"group","aria-labelledby":"notifications-poll"},void 0,Object(s.a)("span",{id:"notifications-poll",className:"column-settings__section"},void 0,Object(s.a)(M.b,{id:"notifications.column_settings.poll",defaultMessage:"Poll results:"})),Object(s.a)("div",{className:"column-settings__row"},void 0,Object(s.a)(X.a,{prefix:"notifications_desktop",settings:e,settingPath:["alerts","poll"],onChange:o,label:l}),u&&Object(s.a)(X.a,{prefix:"notifications_push",settings:i,settingPath:["alerts","poll"],onChange:this.onPushChange,label:f}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["shows","poll"],onChange:o,label:r}),Object(s.a)(X.a,{prefix:"notifications",settings:e,settingPath:["sounds","poll"],onChange:o,label:d}))))},i}(b.a.PureComponent),tt=i(74),et=i(233),it=Object(M.f)({clearMessage:{id:"notifications.clear_confirmation",defaultMessage:"Are you sure you want to permanently clear all your notifications?"},clearConfirm:{id:"notifications.clear",defaultMessage:"Clear notifications"}}),ot=Object(M.g)(Object(h.connect)((function(t){return{settings:t.getIn(["settings","notifications"]),pushSettings:t.get("push_notifications")}}),(function(t,e){var i=e.intl;return{onChange:function(e,i){"push"===e[0]?t(Object(et.e)(e.slice(1),i)):"quickFilter"===e[0]?(t(Object(tt.c)(["notifications"].concat(e),i)),t(Object(O.p)("all"))):t(Object(tt.c)(["notifications"].concat(e),i))},onClear:function(){t(Object(Y.d)("CONFIRM",{message:i.formatMessage(it.clearMessage),confirm:i.formatMessage(it.clearConfirm),onConfirm:function(){return t(Object(O.k)())}}))}}}))($));var at,nt,st,ct=Object(M.f)({mentions:{id:"notifications.filter.mentions",defaultMessage:"Mentions"},favourites:{id:"notifications.filter.favourites",defaultMessage:"Favourites"},boosts:{id:"notifications.filter.boosts",defaultMessage:"Boosts"},polls:{id:"notifications.filter.polls",defaultMessage:"Poll results"},follows:{id:"notifications.filter.follows",defaultMessage:"Follows"}}),lt=Object(M.g)(Z=function(t){Object(l.a)(i,t);var e;e=i;function i(){return t.apply(this,arguments)||this}var o=i.prototype;return o.onClick=function(t){var e=this;return function(){return e.props.selectFilter(t)}},o.render=function(){var t=this.props,e=t.selectedFilter,i=t.advancedMode,o=t.intl;return i?Object(s.a)("div",{className:"notification__filter-bar"},void 0,Object(s.a)("button",{className:"all"===e?"active":"",onClick:this.onClick("all")},void 0,Object(s.a)(M.b,{id:"notifications.filter.all",defaultMessage:"All"})),Object(s.a)("button",{className:"mention"===e?"active":"",onClick:this.onClick("mention"),title:o.formatMessage(ct.mentions)},void 0,Object(s.a)(U.a,{id:"reply-all",fixedWidth:!0})),Object(s.a)("button",{className:"favourite"===e?"active":"",onClick:this.onClick("favourite"),title:o.formatMessage(ct.favourites)},void 0,Object(s.a)(U.a,{id:"star",fixedWidth:!0})),Object(s.a)("button",{className:"reblog"===e?"active":"",onClick:this.onClick("reblog"),title:o.formatMessage(ct.boosts)},void 0,Object(s.a)(U.a,{id:"retweet",fixedWidth:!0})),Object(s.a)("button",{className:"poll"===e?"active":"",onClick:this.onClick("poll"),title:o.formatMessage(ct.polls)},void 0,Object(s.a)(U.a,{id:"tasks",fixedWidth:!0})),Object(s.a)("button",{className:"follow"===e?"active":"",onClick:this.onClick("follow"),title:o.formatMessage(ct.follows)},void 0,Object(s.a)(U.a,{id:"user-plus",fixedWidth:!0}))):Object(s.a)("div",{className:"notification__filter-bar"},void 0,Object(s.a)("button",{className:"all"===e?"active":"",onClick:this.onClick("all")},void 0,Object(s.a)(M.b,{id:"notifications.filter.all",defaultMessage:"All"})),Object(s.a)("button",{className:"mention"===e?"active":"",onClick:this.onClick("mention")},void 0,Object(s.a)(M.b,{id:"notifications.filter.mentions",defaultMessage:"Mentions"})))},i}(b.a.PureComponent))||Z,rt=Object(h.connect)((function(t){return{selectedFilter:t.getIn(["settings","notifications","quickFilter","active"]),advancedMode:t.getIn(["settings","notifications","quickFilter","advanced"])}}),(function(t){return{selectFilter:function(e){t(Object(O.p)(e))}}}))(lt),dt=i(57),ut=i(4),ft=i(1049),bt=i(1171);var ht=Object(M.f)({title:{id:"column.notifications",defaultMessage:"Notifications"}}),gt=Object(dt.a)([function(t){return t.getIn(["settings","notifications","quickFilter","show"])},function(t){return t.getIn(["settings","notifications","quickFilter","active"])},function(t){return Object(ut.List)(t.getIn(["settings","notifications","shows"]).filter((function(t){return!t})).keys())},function(t){return t.getIn(["notifications","items"])}],(function(t,e,i,o){return t&&"all"!==e?o.filter((function(t){return null!==t&&e===t.get("type")})):o.filterNot((function(t){return null!==t&&i.includes(t.get("type"))}))})),pt=Object(h.connect)((function(t){return{showFilterBar:t.getIn(["settings","notifications","quickFilter","show"]),notifications:gt(t),isLoading:t.getIn(["notifications","isLoading"],!0),isUnread:t.getIn(["notifications","unread"])>0||t.getIn(["notifications","pendingItems"]).size>0,hasMore:t.getIn(["notifications","hasMore"]),numPending:t.getIn(["notifications","pendingItems"],Object(ut.List)()).size}}))(at=Object(M.g)((st=nt=function(t){Object(l.a)(i,t);var e;e=i;function i(){for(var e,i=arguments.length,o=new Array(i),a=0;a<i;a++)o[a]=arguments[a];return e=t.call.apply(t,[this].concat(o))||this,Object(r.a)(Object(c.a)(e),"handleLoadGap",(function(t){e.props.dispatch(Object(O.l)({maxId:t}))})),Object(r.a)(Object(c.a)(e),"handleLoadOlder",u()((function(){var t=e.props.notifications.last();e.props.dispatch(Object(O.l)({maxId:t&&t.get("id")}))}),300,{leading:!0})),Object(r.a)(Object(c.a)(e),"handleLoadPending",(function(){e.props.dispatch(Object(O.m)())})),Object(r.a)(Object(c.a)(e),"handleScrollToTop",u()((function(){e.props.dispatch(Object(O.o)(!0))}),100)),Object(r.a)(Object(c.a)(e),"handleScroll",u()((function(){e.props.dispatch(Object(O.o)(!1))}),100)),Object(r.a)(Object(c.a)(e),"handlePin",(function(){var t=e.props,i=t.columnId,o=t.dispatch;o(i?Object(j.h)(i):Object(j.e)("NOTIFICATIONS",{}))})),Object(r.a)(Object(c.a)(e),"handleMove",(function(t){var i=e.props,o=i.columnId;(0,i.dispatch)(Object(j.g)(o,t))})),Object(r.a)(Object(c.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(r.a)(Object(c.a)(e),"setColumnRef",(function(t){e.column=t})),Object(r.a)(Object(c.a)(e),"handleMoveUp",(function(t){var i=e.props.notifications.findIndex((function(e){return null!==e&&e.get("id")===t}))-1;e._selectChild(i,!0)})),Object(r.a)(Object(c.a)(e),"handleMoveDown",(function(t){var i=e.props.notifications.findIndex((function(e){return null!==e&&e.get("id")===t}))+1;e._selectChild(i,!1)})),e}var o=i.prototype;return o.componentWillMount=function(){this.props.dispatch(Object(O.n)())},o.componentWillUnmount=function(){this.handleLoadOlder.cancel(),this.handleScrollToTop.cancel(),this.handleScroll.cancel(),this.props.dispatch(Object(O.o)(!1)),this.props.dispatch(Object(O.q)())},o._selectChild=function(t,e){var i=this.column.node,o=i.querySelector("article:nth-of-type("+(t+1)+") .focusable");o&&(e&&i.scrollTop>o.offsetTop?o.scrollIntoView(!0):!e&&i.scrollTop+i.clientHeight<o.offsetTop+o.offsetHeight&&o.scrollIntoView(!1),o.focus())},o.render=function(){var t=this,e=this.props,i=e.intl,o=e.notifications,a=e.shouldUpdateScroll,n=e.isLoading,c=e.isUnread,l=e.columnId,r=e.multiColumn,d=e.hasMore,u=e.numPending,f=e.showFilterBar,h=!!l,O=Object(s.a)(M.b,{id:"empty_column.notifications",defaultMessage:"You don't have any notifications yet. Interact with others to start the conversation."}),j=null,v=f?Object(s.a)(rt,{}):null;j=n&&this.scrollableContent?this.scrollableContent:o.size>0||d?o.map((function(e,i){return null===e?Object(s.a)(bt.a,{disabled:n,maxId:i>0?o.getIn([i-1,"id"]):null,onClick:t.handleLoadGap},"gap:"+o.getIn([i+1,"id"])):Object(s.a)(E,{notification:e,accountId:e.get("account"),onMoveUp:t.handleMoveUp,onMoveDown:t.handleMoveDown},e.get("id"))})):null,this.scrollableContent=j;var m=Object(s.a)(ft.a,{scrollKey:"notifications-"+l,trackScroll:!h,isLoading:n,showLoading:n&&0===o.size,hasMore:d,numPending:u,emptyMessage:O,onLoadMore:this.handleLoadOlder,onLoadPending:this.handleLoadPending,onScrollToTop:this.handleScrollToTop,onScroll:this.handleScroll,shouldUpdateScroll:a,bindToDocument:!r},void 0,j);return(b.a.createElement(g.a,{bindToDocument:!r,ref:this.setColumnRef,label:i.formatMessage(ht.title)},Object(s.a)(p.a,{icon:"bell",active:c,title:i.formatMessage(ht.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:h,multiColumn:r},void 0,Object(s.a)(ot,{})),v,m))},i}(b.a.PureComponent),Object(r.a)(nt,"defaultProps",{trackScroll:!0}),at=st))||at)||at}}]);
//# sourceMappingURL=notifications.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/notifications.js.map b/priv/static/packs/features/notifications.js.map
index d466060de..80ef6305b 100644
--- a/priv/static/packs/features/notifications.js.map
+++ b/priv/static/packs/features/notifications.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/follow_request.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/follow_request_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/notification.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/notification_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/clear_column_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/column_settings.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/filter_bar.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/index.js"],"names":["messages","defineMessages","authorize","reject","FollowRequest","injectIntl","render","this","props","intl","hidden","account","onAuthorize","onReject","get","className","title","href","to","size","formatMessage","icon","onClick","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","func","object","connect","getAccount","makeGetAccount","state","id","dispatch","authorizeFollowRequest","rejectFollowRequest","favourite","follow","ownPoll","poll","reblog","notificationForScreenReader","message","timestamp","output","push","formatDate","hour","minute","month","day","join","Notification","notification","onMoveUp","onMoveDown","context","router","history","handleOpenProfile","getIn","e","preventDefault","onMention","status","onFavourite","onReblog","onToggleHidden","getHandlers","reply","handleMention","handleHotkeyFavourite","boost","handleHotkeyBoost","mention","open","handleOpen","openProfile","moveUp","handleMoveUp","moveDown","handleMoveDown","toggleHidden","handleHotkeyToggleHidden","renderFollow","link","handlers","tabIndex","aria-label","name","fixedWidth","defaultMessage","values","renderFollowRequest","withNote","renderMention","withDismiss","contextType","getScrollPosition","updateScrollBottom","cachedMediaWidth","cacheMediaWidth","renderFavourite","muted","renderReblog","renderPoll","me","displayNameHtml","__html","dangerouslySetInnerHTML","bool","number","getNotification","makeGetNotification","getStatus","makeGetStatus","accountId","mentionCompose","onModalReblog","unreblog","shiftKey","boostModal","openModal","unfavourite","revealStatus","hideStatus","ClearColumnButton","React","PureComponent","ColumnSettings","path","checked","onChange","settings","pushSettings","onClear","filterShowStr","filterAdvancedStr","alertStr","showStr","soundStr","showPushSettings","pushStr","role","aria-labelledby","prefix","settingPath","label","onPushChange","clearMessage","clearConfirm","changePushNotifications","slice","changeSetting","setFilter","confirm","onConfirm","clearNotifications","tooltips","mentions","favourites","boosts","polls","follows","FilterBar","notificationType","selectFilter","selectedFilter","advancedMode","newActiveFilter","getNotifications","createSelector","ImmutableList","filter","item","keys","showFilterBar","allowedType","excludedTypes","notifications","filterNot","includes","Notifications","isLoading","isUnread","hasMore","numPending","maxId","expandNotifications","last","leading","loadPending","scrollTopNotifications","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","elementIndex","findIndex","_selectChild","componentWillMount","mountNotifications","componentWillUnmount","handleLoadOlder","cancel","handleScrollToTop","handleScroll","unmountNotifications","index","align_top","container","node","element","querySelector","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","shouldUpdateScroll","multiColumn","pinned","emptyMessage","scrollableContent","filterBarContainer","disabled","handleLoadGap","scrollContainer","scrollKey","trackScroll","showLoading","onLoadMore","onLoadPending","handleLoadPending","onScrollToTop","onScroll","bindToDocument","ref","setColumnRef","active","onPin","handlePin","onMove","handleMove","handleHeaderClick"],"mappings":"mWAUMA,EAAWC,YAAe,CAC9BC,UAAU,CAAD,0DACTC,OAAO,CAAD,sDAIFC,EADUC,a,sGAUdC,OAAA,WAAW,IAAD,EACiDC,KAAKC,MAAtDC,EADA,EACAA,KAAMC,EADN,EACMA,OAAQC,EADd,EACcA,QAASC,EADvB,EACuBA,YAAaC,EADpC,EACoCA,SAE5C,OAAKF,EAIDD,EAEA,YAAC,WAAD,UACGC,EAAQG,IAAI,gBACZH,EAAQG,IAAI,aAMjB,mBAAKC,UAAU,gBAAf,EACE,mBAAKA,UAAU,yBAAf,EACE,YAAC,IAAD,CAAmCA,UAAU,wBAAwBC,MAAOL,EAAQG,IAAI,QAASG,KAAMN,EAAQG,IAAI,OAAQI,GAAE,aAAeP,EAAQG,IAAI,OAAxIH,EAAQG,IAAI,MAC1B,mBAAKC,UAAU,gCAAf,EAAyC,YAAC,IAAD,CAAQJ,QAASA,EAASQ,KAAM,MACzE,YAAC,IAAD,CAAaR,QAASA,KAGxB,mBAAKI,UAAU,8BAAf,EACE,YAAC,IAAD,CAAYC,MAAOP,EAAKW,cAAcpB,EAASE,WAAYmB,KAAK,QAAQC,QAASV,IACjF,YAAC,IAAD,CAAYI,MAAOP,EAAKW,cAAcpB,EAASG,QAASkB,KAAK,QAAQC,QAAST,OAtB7E,uB,GAbeU,K,0BAEP,CACjBZ,QAASa,IAAmBC,IAAIC,WAChCd,YAAae,IAAUC,KAAKF,WAC5Bb,SAAUc,IAAUC,KAAKF,WACzBjB,KAAMkB,IAAUE,OAAOH,a,iBCGZI,qBApBa,WAC1B,IAAMC,EAAaC,cAMnB,OAJwB,SAACC,EAAOzB,GAAR,MAAmB,CACzCG,QAASoB,EAAWE,EAAOzB,EAAM0B,SAMV,SAACC,EAAD,OAAaD,EAAb,EAAaA,GAAb,MAAuB,CAChDtB,YADgD,WAE9CuB,EAASC,YAAuBF,KAGlCrB,SALgD,WAM9CsB,EAASE,YAAoBH,QAIlBJ,CAAiD1B,G,QCZ1DJ,EAAWC,YAAe,CAC9BqC,UAAU,CAAD,4EACTC,OAAO,CAAD,+DACNC,QAAQ,CAAD,iEACPC,KAAK,CAAD,4EACJC,OAAO,CAAD,wEAGFC,EAA8B,SAAClC,EAAMmC,EAASC,GAClD,IAAMC,EAAS,CAACF,GAIhB,OAFAE,EAAOC,KAAKtC,EAAKuC,WAAWH,EAAW,CAAEI,KAAM,UAAWC,OAAQ,UAAWC,MAAO,QAASC,IAAK,aAE3FN,EAAOO,KAAK,OAIfC,EADUjD,a,kMAwBC,WAAO,IAAD,EACgB,EAAKG,MAAhC+C,EADW,EACXA,cACRC,EAFmB,EACGA,UACbD,EAAazC,IAAI,U,6CAGX,WAAO,IAAD,EACgB,EAAKN,MAAlC+C,EADa,EACbA,cACRE,EAFqB,EACCA,YACXF,EAAazC,IAAI,U,yCAGjB,WAAO,IACVyC,EAAiB,EAAK/C,MAAtB+C,aAEJA,EAAazC,IAAI,UACnB,EAAK4C,QAAQC,OAAOC,QAAQb,KAA5B,aAA8CQ,EAAazC,IAAI,WAE/D,EAAK+C,uB,gDAIW,WAAO,IACjBN,EAAiB,EAAK/C,MAAtB+C,aACR,EAAKG,QAAQC,OAAOC,QAAQb,KAA5B,aAA8CQ,EAAaO,MAAM,CAAC,UAAW,W,4CAG/D,SAAAC,GACdA,EAAEC,iBADiB,MAGiB,EAAKxD,MAAjC+C,EAHW,EAGXA,cACRU,EAJmB,EAGGA,WACZV,EAAazC,IAAI,WAAY,EAAK4C,QAAQC,OAAOC,Y,oDAGrC,WAAO,IACrBM,EAAW,EAAK1D,MAAhB0D,OACJA,GAAQ,EAAK1D,MAAM2D,YAAYD,M,gDAGjB,SAAAH,GAAM,IAChBG,EAAW,EAAK1D,MAAhB0D,OACJA,GAAQ,EAAK1D,MAAM4D,SAASF,EAAQH,M,uDAGf,WAAO,IACxBG,EAAW,EAAK1D,MAAhB0D,OACJA,GAAQ,EAAK1D,MAAM6D,eAAeH,M,8CAGxCI,YAAA,WACE,MAAO,CACLC,MAAOhE,KAAKiE,cACZlC,UAAW/B,KAAKkE,sBAChBC,MAAOnE,KAAKoE,kBACZC,QAASrE,KAAKiE,cACdK,KAAMtE,KAAKuE,WACXC,YAAaxE,KAAKsD,kBAClBmB,OAAQzE,KAAK0E,aACbC,SAAU3E,KAAK4E,eACfC,aAAc7E,KAAK8E,2B,EAIvBC,aAAA,SAAc/B,EAAc5C,EAAS4E,GAAO,IAClC9E,EAASF,KAAKC,MAAdC,KAER,OACE,YAAC,UAAD,CAAS+E,SAAUjF,KAAK+D,oBAAxB,EACE,mBAAKvD,UAAU,6CAA6C0E,SAAS,IAAIC,aAAY/C,EAA4BlC,EAAMA,EAAKW,cAAcpB,EAASuC,OAAQ,CAAEoD,KAAMhF,EAAQG,IAAI,UAAYyC,EAAazC,IAAI,qBAA5M,EACE,mBAAKC,UAAU,8BAAf,EACE,mBAAKA,UAAU,6CAAf,EACE,YAAC,IAAD,CAAMmB,GAAG,YAAY0D,YAAU,KAGjC,oBAAM5E,MAAOuC,EAAazC,IAAI,oBAA9B,EACE,YAAC,IAAD,CAAkBoB,GAAG,sBAAsB2D,eAAe,sBAAsBC,OAAQ,CAAEH,KAAMJ,OAIpG,YAAC,IAAD,CAAkBrD,GAAIvB,EAAQG,IAAI,MAAOJ,OAAQH,KAAKC,MAAME,Y,EAMpEqF,oBAAA,SAAqBxC,EAAc5C,EAAS4E,GAAO,IACzC9E,EAASF,KAAKC,MAAdC,KAER,OACE,YAAC,UAAD,CAAS+E,SAAUjF,KAAK+D,oBAAxB,EACE,mBAAKvD,UAAU,qDAAqD0E,SAAS,IAAIC,aAAY/C,EAA4BlC,EAAMA,EAAKW,cAAc,CAAEc,GAAI,8BAA+B2D,eAAgB,sCAAwC,CAAEF,KAAMhF,EAAQG,IAAI,UAAYyC,EAAazC,IAAI,qBAAhS,EACE,mBAAKC,UAAU,8BAAf,EACE,mBAAKA,UAAU,6CAAf,EACE,YAAC,IAAD,CAAMmB,GAAG,OAAO0D,YAAU,KAG5B,oBAAM5E,MAAOuC,EAAazC,IAAI,oBAA9B,EACE,YAAC,IAAD,CAAkBoB,GAAG,8BAA8B2D,eAAe,qCAAqCC,OAAQ,CAAEH,KAAMJ,OAI3H,YAAC,EAAD,CAAwBrD,GAAIvB,EAAQG,IAAI,MAAOkF,UAAU,EAAOtF,OAAQH,KAAKC,MAAME,Y,EAM3FuF,cAAA,SAAe1C,GACb,OACE,YAAC,IAAD,CACErB,GAAIqB,EAAazC,IAAI,UACrBoF,aAAW,EACXxF,OAAQH,KAAKC,MAAME,OACnB+C,WAAYlD,KAAK4E,eACjB3B,SAAUjD,KAAK0E,aACfkB,YAAY,gBACZC,kBAAmB7F,KAAKC,MAAM4F,kBAC9BC,mBAAoB9F,KAAKC,MAAM6F,mBAC/BC,iBAAkB/F,KAAKC,MAAM8F,iBAC7BC,gBAAiBhG,KAAKC,MAAM+F,mB,EAKlCC,gBAAA,SAAiBjD,EAAcgC,GAAO,IAC5B9E,EAASF,KAAKC,MAAdC,KAER,OACE,YAAC,UAAD,CAAS+E,SAAUjF,KAAK+D,oBAAxB,EACE,mBAAKvD,UAAU,gDAAgD0E,SAAS,IAAIC,aAAY/C,EAA4BlC,EAAMA,EAAKW,cAAcpB,EAASsC,UAAW,CAAEqD,KAAMpC,EAAaO,MAAM,CAAC,UAAW,WAAaP,EAAazC,IAAI,qBAAtO,EACE,mBAAKC,UAAU,8BAAf,EACE,mBAAKA,UAAU,6CAAf,EACE,YAAC,IAAD,CAAMmB,GAAG,OAAOnB,UAAU,YAAY6E,YAAU,KAGlD,oBAAM5E,MAAOuC,EAAazC,IAAI,oBAA9B,EACE,YAAC,IAAD,CAAkBoB,GAAG,yBAAyB2D,eAAe,gCAAgCC,OAAQ,CAAEH,KAAMJ,OAIjH,YAAC,IAAD,CACErD,GAAIqB,EAAazC,IAAI,UACrBH,QAAS4C,EAAazC,IAAI,WAC1B2F,OAAK,EACLP,aAAW,EACXxF,SAAUH,KAAKC,MAAME,OACrB0F,kBAAmB7F,KAAKC,MAAM4F,kBAC9BC,mBAAoB9F,KAAKC,MAAM6F,mBAC/BC,iBAAkB/F,KAAKC,MAAM8F,iBAC7BC,gBAAiBhG,KAAKC,MAAM+F,qB,EAOtCG,aAAA,SAAcnD,EAAcgC,GAAO,IACzB9E,EAASF,KAAKC,MAAdC,KAER,OACE,YAAC,UAAD,CAAS+E,SAAUjF,KAAK+D,oBAAxB,EACE,mBAAKvD,UAAU,6CAA6C0E,SAAS,IAAIC,aAAY/C,EAA4BlC,EAAMA,EAAKW,cAAcpB,EAAS0C,OAAQ,CAAEiD,KAAMpC,EAAaO,MAAM,CAAC,UAAW,WAAaP,EAAazC,IAAI,qBAAhO,EACE,mBAAKC,UAAU,8BAAf,EACE,mBAAKA,UAAU,6CAAf,EACE,YAAC,IAAD,CAAMmB,GAAG,UAAU0D,YAAU,KAG/B,oBAAM5E,MAAOuC,EAAazC,IAAI,oBAA9B,EACE,YAAC,IAAD,CAAkBoB,GAAG,sBAAsB2D,eAAe,6BAA6BC,OAAQ,CAAEH,KAAMJ,OAI3G,YAAC,IAAD,CACErD,GAAIqB,EAAazC,IAAI,UACrBH,QAAS4C,EAAazC,IAAI,WAC1B2F,OAAK,EACLP,aAAW,EACXxF,OAAQH,KAAKC,MAAME,OACnB0F,kBAAmB7F,KAAKC,MAAM4F,kBAC9BC,mBAAoB9F,KAAKC,MAAM6F,mBAC/BC,iBAAkB/F,KAAKC,MAAM8F,iBAC7BC,gBAAiBhG,KAAKC,MAAM+F,qB,EAOtCI,WAAA,SAAYpD,EAAc5C,GAAU,IAC1BF,EAASF,KAAKC,MAAdC,KACF+B,EAAWoE,MAAOjG,EAAQG,IAAI,MAC9B8B,EAAWJ,EAAU/B,EAAKW,cAAcpB,EAASwC,SAAW/B,EAAKW,cAAcpB,EAASyC,MAE9F,OACE,YAAC,UAAD,CAAS+C,SAAUjF,KAAK+D,oBAAxB,EACE,mBAAKvD,UAAU,2CAA2C0E,SAAS,IAAIC,aAAY/C,EAA4BlC,EAAMmC,EAASW,EAAazC,IAAI,qBAA/I,EACE,mBAAKC,UAAU,8BAAf,EACE,mBAAKA,UAAU,6CAAf,EACE,YAAC,IAAD,CAAMmB,GAAG,QAAQ0D,YAAU,KAG7B,oBAAM5E,MAAOuC,EAAazC,IAAI,oBAA9B,EACG0B,EACC,YAAC,IAAD,CAAkBN,GAAG,wBAAwB2D,eAAe,wBAE5D,YAAC,IAAD,CAAkB3D,GAAG,oBAAoB2D,eAAe,yCAK9D,YAAC,IAAD,CACE3D,GAAIqB,EAAazC,IAAI,UACrBH,QAASA,EACT8F,OAAK,EACLP,aAAW,EACXxF,OAAQH,KAAKC,MAAME,OACnB0F,kBAAmB7F,KAAKC,MAAM4F,kBAC9BC,mBAAoB9F,KAAKC,MAAM6F,mBAC/BC,iBAAkB/F,KAAKC,MAAM8F,iBAC7BC,gBAAiBhG,KAAKC,MAAM+F,qB,EAOtCjG,OAAA,WAAW,IACDiD,EAAiBhD,KAAKC,MAAtB+C,aACF5C,EAAmB4C,EAAazC,IAAI,WACpC+F,EAAmB,CAAEC,OAAQnG,EAAQG,IAAI,sBACzCyE,EAAmB,4BAAK,YAAC,IAAD,CAAWxE,UAAU,6BAA6BE,KAAMN,EAAQG,IAAI,OAAQE,MAAOL,EAAQG,IAAI,QAASI,GAAE,aAAeP,EAAQG,IAAI,MAASiG,wBAAyBF,KAErM,OAAOtD,EAAazC,IAAI,SACxB,IAAK,SACH,OAAOP,KAAK+E,aAAa/B,EAAc5C,EAAS4E,GAClD,IAAK,iBACH,OAAOhF,KAAKwF,oBAAoBxC,EAAc5C,EAAS4E,GACzD,IAAK,UACH,OAAOhF,KAAK0F,cAAc1C,GAC5B,IAAK,YACH,OAAOhD,KAAKiG,gBAAgBjD,EAAcgC,GAC5C,IAAK,SACH,OAAOhF,KAAKmG,aAAanD,EAAcgC,GACzC,IAAK,OACH,OAAOhF,KAAKoG,WAAWpD,EAAc5C,GAGvC,OAAO,M,GA5QgBY,K,6BAEH,CACpBoC,OAAQhC,IAAUE,S,0BAGD,CACjB0B,aAAc/B,IAAmBC,IAAIC,WACrChB,OAAQiB,IAAUqF,KAClBxD,SAAU7B,IAAUC,KAAKF,WACzB+B,WAAY9B,IAAUC,KAAKF,WAC3BuC,UAAWtC,IAAUC,KAAKF,WAC1ByC,YAAaxC,IAAUC,KAAKF,WAC5B0C,SAAUzC,IAAUC,KAAKF,WACzB2C,eAAgB1C,IAAUC,KAAKF,WAC/BwC,OAAQ1C,IAAmBC,IAC3BhB,KAAMkB,IAAUE,OAAOH,WACvB0E,kBAAmBzE,IAAUC,KAC7ByE,mBAAoB1E,IAAUC,KAC9B2E,gBAAiB5E,IAAUC,KAC3B0E,iBAAkB3E,IAAUsF,S,yCCoBjBnF,qBArDa,WAC1B,IAAMoF,EAAkBC,cAClBC,EAAYC,cAUlB,OARwB,SAACpF,EAAOzB,GAC9B,IAAM+C,EAAe2D,EAAgBjF,EAAOzB,EAAM+C,aAAc/C,EAAM8G,WACtE,MAAO,CACL/D,aAAcA,EACdW,OAAQX,EAAazC,IAAI,UAAYsG,EAAUnF,EAAO,CAAEC,GAAIqB,EAAazC,IAAI,YAAe,UAOvE,SAAAqB,GAAQ,MAAK,CACtC8B,UAAW,SAACtD,EAASgD,GACnBxB,EAASoF,aAAe5G,EAASgD,KAGnC6D,cALsC,SAKvBtD,GACb/B,EAASO,YAAOwB,KAGlBE,SATsC,SAS5BF,EAAQH,GACZG,EAAOpD,IAAI,aACbqB,EAASsF,YAASvD,IAEdH,EAAE2D,WAAaC,IACjBpH,KAAKiH,cAActD,GAEnB/B,EAASyF,YAAU,QAAS,CAAE1D,SAAQE,SAAU7D,KAAKiH,kBAK3DrD,YArBsC,SAqBzBD,GACPA,EAAOpD,IAAI,cACbqB,EAAS0F,YAAY3D,IAErB/B,EAASG,YAAU4B,KAIvBG,eA7BsC,SA6BtBH,GACVA,EAAOpD,IAAI,UACbqB,EAAS2F,YAAa5D,EAAOpD,IAAI,QAEjCqB,EAAS4F,YAAW7D,EAAOpD,IAAI,YAKtBgB,CAAiDwB,GCjE3C0E,G,kGAMnB1H,OAAA,WACE,OACE,sBAAQS,UAAU,sCAAsC0E,SAAS,IAAInE,QAASf,KAAKC,MAAMc,cAAzF,EAAkG,YAAC,IAAD,CAAMY,GAAG,WAA3G,IAAuH,YAAC,IAAD,CAAkBA,GAAG,sBAAsB2D,eAAe,0B,GARxIoC,IAAMC,e,WCEhCC,G,8LASJ,SAACC,EAAMC,GACpB,EAAK7H,MAAM8H,SAAX,CAAqB,QAArB,OAAgCF,GAAOC,M,sCAGzC/H,OAAA,WAAW,IAAD,EAC8CC,KAAKC,MAAnD+H,EADA,EACAA,SAAUC,EADV,EACUA,aAAcF,EADxB,EACwBA,SAAUG,EADlC,EACkCA,QAEpCC,EAAgB,YAAC,IAAD,CAAkBxG,GAAG,gDAAgD2D,eAAe,SACpG8C,EAAoB,YAAC,IAAD,CAAkBzG,GAAG,oDAAoD2D,eAAe,2BAC5G+C,EAAY,YAAC,IAAD,CAAkB1G,GAAG,sCAAsC2D,eAAe,0BACtFgD,EAAY,YAAC,IAAD,CAAkB3G,GAAG,qCAAqC2D,eAAe,mBACrFiD,EAAY,YAAC,IAAD,CAAkB5G,GAAG,sCAAsC2D,eAAe,eAEtFkD,EAAmBP,EAAa1H,IAAI,mBAAqB0H,EAAa1H,IAAI,gBAC1EkI,EAAUD,GAAoB,YAAC,IAAD,CAAkB7G,GAAG,qCAAqC2D,eAAe,uBAE7G,OACE,4BACE,mBAAK9E,UAAU,6BAAf,EACE,YAAC,GAAD,CAAmBO,QAASmH,KAG9B,mBAAKQ,KAAK,QAAQC,kBAAgB,iCAAlC,EACE,oBAAMhH,GAAG,2BAA2BnB,UAAU,iCAA9C,EACE,YAAC,IAAD,CAAkBmB,GAAG,oDAAoD2D,eAAe,sBAE1F,mBAAK9E,UAAU,6BAAf,EACE,YAAC,KAAD,CAAemB,GAAG,kBAAkBiH,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,cAAe,QAASd,SAAUA,EAAUe,MAAOX,IAChJ,YAAC,KAAD,CAAexG,GAAG,kBAAkBiH,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,cAAe,YAAad,SAAUA,EAAUe,MAAOV,MAIxJ,mBAAKM,KAAK,QAAQC,kBAAgB,6BAAlC,EACE,oBAAMhH,GAAG,uBAAuBnB,UAAU,iCAA1C,EAAqE,YAAC,IAAD,CAAkBmB,GAAG,uCAAuC2D,eAAe,oBAEhJ,mBAAK9E,UAAU,6BAAf,EACE,YAAC,KAAD,CAAeoI,OAAO,wBAAwBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,UAAWd,SAAUA,EAAUe,MAAOT,IAC/HG,GAAoB,YAAC,KAAD,CAAeI,OAAO,qBAAqBZ,SAAUC,EAAcY,YAAa,CAAC,SAAU,UAAWd,SAAU/H,KAAK+I,aAAcD,MAAOL,IAC/J,YAAC,KAAD,CAAeG,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,QAAS,UAAWd,SAAUA,EAAUe,MAAOR,IACvH,YAAC,KAAD,CAAeM,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,UAAWd,SAAUA,EAAUe,MAAOP,MAI5H,mBAAKG,KAAK,QAAQC,kBAAgB,qCAAlC,EACE,oBAAMhH,GAAG,+BAA+BnB,UAAU,iCAAlD,EAA6E,YAAC,IAAD,CAAkBmB,GAAG,+CAA+C2D,eAAe,0BAEhK,mBAAK9E,UAAU,6BAAf,EACE,YAAC,KAAD,CAAeoI,OAAO,wBAAwBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,kBAAmBd,SAAUA,EAAUe,MAAOT,IACvIG,GAAoB,YAAC,KAAD,CAAeI,OAAO,qBAAqBZ,SAAUC,EAAcY,YAAa,CAAC,SAAU,kBAAmBd,SAAU/H,KAAK+I,aAAcD,MAAOL,IACvK,YAAC,KAAD,CAAeG,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,QAAS,kBAAmBd,SAAUA,EAAUe,MAAOR,IAC/H,YAAC,KAAD,CAAeM,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,kBAAmBd,SAAUA,EAAUe,MAAOP,MAIpI,mBAAKG,KAAK,QAAQC,kBAAgB,gCAAlC,EACE,oBAAMhH,GAAG,0BAA0BnB,UAAU,iCAA7C,EAAwE,YAAC,IAAD,CAAkBmB,GAAG,0CAA0C2D,eAAe,iBAEtJ,mBAAK9E,UAAU,6BAAf,EACE,YAAC,KAAD,CAAeoI,OAAO,wBAAwBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,aAAcd,SAAUA,EAAUe,MAAOT,IAClIG,GAAoB,YAAC,KAAD,CAAeI,OAAO,qBAAqBZ,SAAUC,EAAcY,YAAa,CAAC,SAAU,aAAcd,SAAU/H,KAAK+I,aAAcD,MAAOL,IAClK,YAAC,KAAD,CAAeG,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,QAAS,aAAcd,SAAUA,EAAUe,MAAOR,IAC1H,YAAC,KAAD,CAAeM,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,aAAcd,SAAUA,EAAUe,MAAOP,MAI/H,mBAAKG,KAAK,QAAQC,kBAAgB,8BAAlC,EACE,oBAAMhH,GAAG,wBAAwBnB,UAAU,iCAA3C,EAAsE,YAAC,IAAD,CAAkBmB,GAAG,wCAAwC2D,eAAe,eAElJ,mBAAK9E,UAAU,6BAAf,EACE,YAAC,KAAD,CAAeoI,OAAO,wBAAwBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,WAAYd,SAAUA,EAAUe,MAAOT,IAChIG,GAAoB,YAAC,KAAD,CAAeI,OAAO,qBAAqBZ,SAAUC,EAAcY,YAAa,CAAC,SAAU,WAAYd,SAAU/H,KAAK+I,aAAcD,MAAOL,IAChK,YAAC,KAAD,CAAeG,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,QAAS,WAAYd,SAAUA,EAAUe,MAAOR,IACxH,YAAC,KAAD,CAAeM,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,WAAYd,SAAUA,EAAUe,MAAOP,MAI7H,mBAAKG,KAAK,QAAQC,kBAAgB,6BAAlC,EACE,oBAAMhH,GAAG,uBAAuBnB,UAAU,iCAA1C,EAAqE,YAAC,IAAD,CAAkBmB,GAAG,uCAAuC2D,eAAe,aAEhJ,mBAAK9E,UAAU,6BAAf,EACE,YAAC,KAAD,CAAeoI,OAAO,wBAAwBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,UAAWd,SAAUA,EAAUe,MAAOT,IAC/HG,GAAoB,YAAC,KAAD,CAAeI,OAAO,qBAAqBZ,SAAUC,EAAcY,YAAa,CAAC,SAAU,UAAWd,SAAU/H,KAAK+I,aAAcD,MAAOL,IAC/J,YAAC,KAAD,CAAeG,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,QAAS,UAAWd,SAAUA,EAAUe,MAAOR,IACvH,YAAC,KAAD,CAAeM,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,UAAWd,SAAUA,EAAUe,MAAOP,MAI5H,mBAAKG,KAAK,QAAQC,kBAAgB,2BAAlC,EACE,oBAAMhH,GAAG,qBAAqBnB,UAAU,iCAAxC,EAAmE,YAAC,IAAD,CAAkBmB,GAAG,qCAAqC2D,eAAe,mBAE5I,mBAAK9E,UAAU,6BAAf,EACE,YAAC,KAAD,CAAeoI,OAAO,wBAAwBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,QAASd,SAAUA,EAAUe,MAAOT,IAC7HG,GAAoB,YAAC,KAAD,CAAeI,OAAO,qBAAqBZ,SAAUC,EAAcY,YAAa,CAAC,SAAU,QAASd,SAAU/H,KAAK+I,aAAcD,MAAOL,IAC7J,YAAC,KAAD,CAAeG,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,QAAS,QAASd,SAAUA,EAAUe,MAAOR,IACrH,YAAC,KAAD,CAAeM,OAAO,gBAAgBZ,SAAUA,EAAUa,YAAa,CAAC,SAAU,QAASd,SAAUA,EAAUe,MAAOP,Q,GAvGtFb,IAAMC,e,mBCE5ClI,GAAWC,YAAe,CAC9BsJ,aAAa,CAAD,2HACZC,aAAa,CAAD,iEA+BCnJ,eAAWyB,mBA5BF,SAAAG,GAAK,MAAK,CAChCsG,SAAUtG,EAAM6B,MAAM,CAAC,WAAY,kBACnC0E,aAAcvG,EAAMnB,IAAI,0BAGC,SAACqB,EAAD,OAAa1B,EAAb,EAAaA,KAAb,MAAyB,CAElD6H,SAFkD,SAExCF,EAAMC,GACE,SAAZD,EAAK,GACPjG,EAASsH,aAAwBrB,EAAKsB,MAAM,GAAIrB,IAC3B,gBAAZD,EAAK,IACdjG,EAASwH,aAAc,CAAC,iBAAF,OAAsBvB,GAAOC,IACnDlG,EAASyH,YAAU,SAEnBzH,EAASwH,aAAc,CAAC,iBAAF,OAAsBvB,GAAOC,KAIvDI,QAbkD,WAchDtG,EAASyF,YAAU,UAAW,CAC5BhF,QAASnC,EAAKW,cAAcpB,GAASuJ,cACrCM,QAASpJ,EAAKW,cAAcpB,GAASwJ,cACrCM,UAAW,kBAAM3H,EAAS4H,uBAMNjI,CAA6CqG,KCrCjE6B,GAAW/J,YAAe,CAC9BgK,SAAS,CAAD,8DACRC,WAAW,CAAD,kEACVC,OAAO,CAAD,0DACNC,MAAM,CAAD,+DACLC,QAAQ,CAAD,8DAIHC,GADUjK,Y,4GAUdiB,QAAA,SAASiJ,GAAmB,IAAD,OACzB,OAAO,kBAAM,EAAK/J,MAAMgK,aAAaD,K,EAGvCjK,OAAA,WAAW,IAAD,EACuCC,KAAKC,MAA5CiK,EADA,EACAA,eAAgBC,EADhB,EACgBA,aAAcjK,EAD9B,EAC8BA,KAsEtC,OArEyBiK,EAsBvB,mBAAK3J,UAAU,iCAAf,EACE,sBACEA,UAA8B,QAAnB0J,EAA2B,SAAW,GACjDnJ,QAASf,KAAKe,QAAQ,aAFxB,EAIE,YAAC,IAAD,CACEY,GAAG,2BACH2D,eAAe,SAGnB,sBACE9E,UAA8B,YAAnB0J,EAA+B,SAAW,GACrDnJ,QAASf,KAAKe,QAAQ,WACtBN,MAAOP,EAAKW,cAAc4I,GAASC,gBAHrC,EAKE,YAAC,IAAD,CAAM/H,GAAG,YAAY0D,YAAU,KAEjC,sBACE7E,UAA8B,cAAnB0J,EAAiC,SAAW,GACvDnJ,QAASf,KAAKe,QAAQ,aACtBN,MAAOP,EAAKW,cAAc4I,GAASE,kBAHrC,EAKE,YAAC,IAAD,CAAMhI,GAAG,OAAO0D,YAAU,KAE5B,sBACE7E,UAA8B,WAAnB0J,EAA8B,SAAW,GACpDnJ,QAASf,KAAKe,QAAQ,UACtBN,MAAOP,EAAKW,cAAc4I,GAASG,cAHrC,EAKE,YAAC,IAAD,CAAMjI,GAAG,UAAU0D,YAAU,KAE/B,sBACE7E,UAA8B,SAAnB0J,EAA4B,SAAW,GAClDnJ,QAASf,KAAKe,QAAQ,QACtBN,MAAOP,EAAKW,cAAc4I,GAASI,aAHrC,EAKE,YAAC,IAAD,CAAMlI,GAAG,QAAQ0D,YAAU,KAE7B,sBACE7E,UAA8B,WAAnB0J,EAA8B,SAAW,GACpDnJ,QAASf,KAAKe,QAAQ,UACtBN,MAAOP,EAAKW,cAAc4I,GAASK,eAHrC,EAKE,YAAC,IAAD,CAAMnI,GAAG,YAAY0D,YAAU,MAhEnC,mBAAK7E,UAAU,iCAAf,EACE,sBACEA,UAA8B,QAAnB0J,EAA2B,SAAW,GACjDnJ,QAASf,KAAKe,QAAQ,aAFxB,EAIE,YAAC,IAAD,CACEY,GAAG,2BACH2D,eAAe,SAGnB,sBACE9E,UAA8B,YAAnB0J,EAA+B,SAAW,GACrDnJ,QAASf,KAAKe,QAAQ,iBAFxB,EAIE,YAAC,IAAD,CACEY,GAAG,gCACH2D,eAAe,gB,GAhCHoC,IAAMC,iB,ECCfpG,sBAXa,SAAAG,GAAK,MAAK,CACpCwI,eAAgBxI,EAAM6B,MAAM,CAAC,WAAY,gBAAiB,cAAe,WACzE4G,aAAczI,EAAM6B,MAAM,CAAC,WAAY,gBAAiB,cAAe,iBAG9C,SAAC3B,GAAD,MAAe,CACxCqI,aADwC,SAC1BG,GACZxI,EAASyH,YAAUe,QAIR7I,CAAiDwI,I,gFCGhE,IAAMtK,GAAWC,YAAe,CAC9Be,MAAM,CAAD,4DAGD4J,GAAmBC,aAAe,CACtC,SAAA5I,GAAK,OAAIA,EAAM6B,MAAM,CAAC,WAAY,gBAAiB,cAAe,UAClE,SAAA7B,GAAK,OAAIA,EAAM6B,MAAM,CAAC,WAAY,gBAAiB,cAAe,YAClE,SAAA7B,GAAK,OAAI6I,gBAAc7I,EAAM6B,MAAM,CAAC,WAAY,gBAAiB,UAAUiH,QAAO,SAAAC,GAAI,OAAKA,KAAMC,SACjG,SAAAhJ,GAAK,OAAIA,EAAM6B,MAAM,CAAC,gBAAiB,aACtC,SAACoH,EAAeC,EAAaC,EAAeC,GAC7C,OAAKH,GAAiC,QAAhBC,EAMfE,EAAcN,QAAO,SAAAC,GAAI,OAAa,OAATA,GAAiBG,IAAgBH,EAAKlK,IAAI,WAFrEuK,EAAcC,WAAU,SAAAN,GAAI,OAAa,OAATA,GAAiBI,EAAcG,SAASP,EAAKlK,IAAI,eAgBtF0K,GAFU1J,mBATQ,SAAAG,GAAK,MAAK,CAChCiJ,cAAejJ,EAAM6B,MAAM,CAAC,WAAY,gBAAiB,cAAe,SACxEuH,cAAeT,GAAiB3I,GAChCwJ,UAAWxJ,EAAM6B,MAAM,CAAC,gBAAiB,cAAc,GACvD4H,SAAUzJ,EAAM6B,MAAM,CAAC,gBAAiB,WAAa,GAAK7B,EAAM6B,MAAM,CAAC,gBAAiB,iBAAiB3C,KAAO,EAChHwK,QAAS1J,EAAM6B,MAAM,CAAC,gBAAiB,YACvC8H,WAAY3J,EAAM6B,MAAM,CAAC,gBAAiB,gBAAiBgH,mBAAiB3J,Q,GAI7Ed,a,mMAiCiB,SAACwL,GACf,EAAKrL,MAAM2B,SAAS2J,YAAoB,CAAED,c,6CAG1B,KAAS,WACzB,IAAME,EAAO,EAAKvL,MAAM6K,cAAcU,OACtC,EAAKvL,MAAM2B,SAAS2J,YAAoB,CAAED,MAAOE,GAAQA,EAAKjL,IAAI,WACjE,IAAK,CAAEkL,SAAS,K,gDAEC,WAClB,EAAKxL,MAAM2B,SAAS8J,kB,+CAGF,KAAS,WAC3B,EAAKzL,MAAM2B,SAAS+J,aAAuB,MAC1C,M,0CAEY,KAAS,WACtB,EAAK1L,MAAM2B,SAAS+J,aAAuB,MAC1C,M,wCAES,WAAO,IAAD,EACe,EAAK1L,MAA5B2L,EADQ,EACRA,SAAUhK,EADF,EACEA,SAGhBA,EADEgK,EACOC,YAAaD,GAEbE,YAAU,gBAAiB,Q,yCAI3B,SAACC,GAAS,IAAD,EACW,EAAK9L,MAA5B2L,EADY,EACZA,UACRhK,EAFoB,EACFA,UACToK,YAAWJ,EAAUG,O,gDAGZ,WAClB,EAAKE,OAAOC,e,2CAGC,SAAAC,GACb,EAAKF,OAASE,K,2CAGD,SAAAxK,GACb,IAAMyK,EAAe,EAAKnM,MAAM6K,cAAcuB,WAAU,SAAA5B,GAAI,OAAa,OAATA,GAAiBA,EAAKlK,IAAI,QAAUoB,KAAM,EAC1G,EAAK2K,aAAaF,GAAc,M,6CAGjB,SAAAzK,GACf,IAAMyK,EAAe,EAAKnM,MAAM6K,cAAcuB,WAAU,SAAA5B,GAAI,OAAa,OAATA,GAAiBA,EAAKlK,IAAI,QAAUoB,KAAM,EAC1G,EAAK2K,aAAaF,GAAc,M,8CA/DlCG,mBAAA,WACEvM,KAAKC,MAAM2B,SAAS4K,gB,EAGtBC,qBAAA,WACEzM,KAAK0M,gBAAgBC,SACrB3M,KAAK4M,kBAAkBD,SACvB3M,KAAK6M,aAAaF,SAClB3M,KAAKC,MAAM2B,SAAS+J,aAAuB,IAC3C3L,KAAKC,MAAM2B,SAASkL,gB,EAyDtBR,aAAA,SAAcS,EAAOC,GACnB,IAAMC,EAAYjN,KAAKiM,OAAOiB,KACxBC,EAAUF,EAAUG,cAAV,wBAA+CL,EAAQ,GAAvD,gBAEZI,IACEH,GAAaC,EAAUf,UAAYiB,EAAQE,UAC7CF,EAAQG,gBAAe,IACbN,GAAaC,EAAUf,UAAYe,EAAUM,aAAeJ,EAAQE,UAAYF,EAAQK,cAClGL,EAAQG,gBAAe,GAEzBH,EAAQM,U,EAIZ1N,OAAA,WAAW,IAAD,SAC4HC,KAAKC,MAAjIC,EADA,EACAA,KAAM4K,EADN,EACMA,cAAe4C,EADrB,EACqBA,mBAAoBxC,EADzC,EACyCA,UAAWC,EADpD,EACoDA,SAAUS,EAD9D,EAC8DA,SAAU+B,EADxE,EACwEA,YAAavC,EADrF,EACqFA,QAASC,EAD9F,EAC8FA,WAAYV,EAD1G,EAC0GA,cAC5GiD,IAAWhC,EACXiC,EAAe,YAAC,IAAD,CAAkBlM,GAAG,6BAA6B2D,eAAe,0FAElFwI,EAAoB,KAElBC,EAAqBpD,EACtB,YAAC,GAAD,IACD,KAGFmD,EADE5C,GAAalL,KAAK8N,kBACA9N,KAAK8N,kBAChBhD,EAAclK,KAAO,GAAKwK,EACfN,EAAc5J,KAAI,SAACuJ,EAAMsC,GAAP,OAA0B,OAATtC,EACrD,YAAC,KAAD,CAEEuD,SAAU9C,EACVI,MAAOyB,EAAQ,EAAIjC,EAAcvH,MAAM,CAACwJ,EAAQ,EAAG,OAAS,KAC5DhM,QAAS,EAAKkN,eAHT,OAASnD,EAAcvH,MAAM,CAACwJ,EAAQ,EAAG,QAMhD,YAAC,EAAD,CAEE/J,aAAcyH,EACd1D,UAAW0D,EAAKlK,IAAI,WACpB0C,SAAU,EAAKyB,aACfxB,WAAY,EAAK0B,gBAJZ6F,EAAKlK,IAAI,UAQE,KAGtBP,KAAK8N,kBAAoBA,EAEzB,IAAMI,EACJ,YAAC,KAAD,CACEC,UAAS,iBAAmBvC,EAC5BwC,aAAcR,EACd1C,UAAWA,EACXmD,YAAanD,GAAoC,IAAvBJ,EAAclK,KACxCwK,QAASA,EACTC,WAAYA,EACZwC,aAAcA,EACdS,WAAYtO,KAAK0M,gBACjB6B,cAAevO,KAAKwO,kBACpBC,cAAezO,KAAK4M,kBACpB8B,SAAU1O,KAAK6M,aACfa,mBAAoBA,EACpBiB,gBAAiBhB,QAbnB,EAeGG,GAIL,OACE,kBAAC,IAAD,CAAQa,gBAAiBhB,EAAaiB,IAAK5O,KAAK6O,aAAc/F,MAAO5I,EAAKW,cAAcpB,GAASgB,QAC/F,YAAC,IAAD,CACEK,KAAK,OACLgO,OAAQ3D,EACR1K,MAAOP,EAAKW,cAAcpB,GAASgB,OACnCsO,MAAO/O,KAAKgP,UACZC,OAAQjP,KAAKkP,WACbnO,QAASf,KAAKmP,kBACdvB,OAAQA,EACRD,YAAaA,QARf,EAUE,YAAC,GAAD,KAEDI,EACAG,I,GA3KmBxG,IAAMC,e,6BAgBV,CACpByG,aAAa,I","file":"features/notifications.js","sourcesContent":["import React, { Fragment } from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Avatar from 'mastodon/components/avatar';\nimport DisplayName from 'mastodon/components/display_name';\nimport Permalink from 'mastodon/components/permalink';\nimport IconButton from 'mastodon/components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' },\n reject: { id: 'follow_request.reject', defaultMessage: 'Reject' },\n});\n\nexport default @injectIntl\nclass FollowRequest extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n onAuthorize: PropTypes.func.isRequired,\n onReject: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { intl, hidden, account, onAuthorize, onReject } = this.props;\n\n if (!account) {\n return <div />;\n }\n\n if (hidden) {\n return (\n <Fragment>\n {account.get('display_name')}\n {account.get('username')}\n </Fragment>\n );\n }\n\n return (\n <div className='account'>\n <div className='account__wrapper'>\n <Permalink key={account.get('id')} className='account__display-name' title={account.get('acct')} href={account.get('url')} to={`/accounts/${account.get('id')}`}>\n <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n <DisplayName account={account} />\n </Permalink>\n\n <div className='account__relationship'>\n <IconButton title={intl.formatMessage(messages.authorize)} icon='check' onClick={onAuthorize} />\n <IconButton title={intl.formatMessage(messages.reject)} icon='times' onClick={onReject} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetAccount } from 'mastodon/selectors';\nimport FollowRequest from '../components/follow_request';\nimport { authorizeFollowRequest, rejectFollowRequest } from 'mastodon/actions/accounts';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, props) => ({\n account: getAccount(state, props.id),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { id }) => ({\n onAuthorize () {\n dispatch(authorizeFollowRequest(id));\n },\n\n onReject () {\n dispatch(rejectFollowRequest(id));\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(FollowRequest);\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { injectIntl, FormattedMessage, defineMessages } from 'react-intl';\nimport { HotKeys } from 'react-hotkeys';\nimport PropTypes from 'prop-types';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { me } from 'mastodon/initial_state';\nimport StatusContainer from 'mastodon/containers/status_container';\nimport AccountContainer from 'mastodon/containers/account_container';\nimport FollowRequestContainer from '../containers/follow_request_container';\nimport Icon from 'mastodon/components/icon';\nimport Permalink from 'mastodon/components/permalink';\n\nconst messages = defineMessages({\n favourite: { id: 'notification.favourite', defaultMessage: '{name} favourited your status' },\n follow: { id: 'notification.follow', defaultMessage: '{name} followed you' },\n ownPoll: { id: 'notification.own_poll', defaultMessage: 'Your poll has ended' },\n poll: { id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' },\n reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' },\n});\n\nconst notificationForScreenReader = (intl, message, timestamp) => {\n const output = [message];\n\n output.push(intl.formatDate(timestamp, { hour: '2-digit', minute: '2-digit', month: 'short', day: 'numeric' }));\n\n return output.join(', ');\n};\n\nexport default @injectIntl\nclass Notification extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n notification: ImmutablePropTypes.map.isRequired,\n hidden: PropTypes.bool,\n onMoveUp: PropTypes.func.isRequired,\n onMoveDown: PropTypes.func.isRequired,\n onMention: PropTypes.func.isRequired,\n onFavourite: PropTypes.func.isRequired,\n onReblog: PropTypes.func.isRequired,\n onToggleHidden: PropTypes.func.isRequired,\n status: ImmutablePropTypes.map,\n intl: PropTypes.object.isRequired,\n getScrollPosition: PropTypes.func,\n updateScrollBottom: PropTypes.func,\n cacheMediaWidth: PropTypes.func,\n cachedMediaWidth: PropTypes.number,\n };\n\n handleMoveUp = () => {\n const { notification, onMoveUp } = this.props;\n onMoveUp(notification.get('id'));\n }\n\n handleMoveDown = () => {\n const { notification, onMoveDown } = this.props;\n onMoveDown(notification.get('id'));\n }\n\n handleOpen = () => {\n const { notification } = this.props;\n\n if (notification.get('status')) {\n this.context.router.history.push(`/statuses/${notification.get('status')}`);\n } else {\n this.handleOpenProfile();\n }\n }\n\n handleOpenProfile = () => {\n const { notification } = this.props;\n this.context.router.history.push(`/accounts/${notification.getIn(['account', 'id'])}`);\n }\n\n handleMention = e => {\n e.preventDefault();\n\n const { notification, onMention } = this.props;\n onMention(notification.get('account'), this.context.router.history);\n }\n\n handleHotkeyFavourite = () => {\n const { status } = this.props;\n if (status) this.props.onFavourite(status);\n }\n\n handleHotkeyBoost = e => {\n const { status } = this.props;\n if (status) this.props.onReblog(status, e);\n }\n\n handleHotkeyToggleHidden = () => {\n const { status } = this.props;\n if (status) this.props.onToggleHidden(status);\n }\n\n getHandlers () {\n return {\n reply: this.handleMention,\n favourite: this.handleHotkeyFavourite,\n boost: this.handleHotkeyBoost,\n mention: this.handleMention,\n open: this.handleOpen,\n openProfile: this.handleOpenProfile,\n moveUp: this.handleMoveUp,\n moveDown: this.handleMoveDown,\n toggleHidden: this.handleHotkeyToggleHidden,\n };\n }\n\n renderFollow (notification, account, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.follow, { name: account.get('acct') }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='user-plus' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.follow' defaultMessage='{name} followed you' values={{ name: link }} />\n </span>\n </div>\n\n <AccountContainer id={account.get('id')} hidden={this.props.hidden} />\n </div>\n </HotKeys>\n );\n }\n\n renderFollowRequest (notification, account, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-follow-request focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow_request', defaultMessage: '{name} has requested to follow you' }, { name: account.get('acct') }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='user' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.follow_request' defaultMessage='{name} has requested to follow you' values={{ name: link }} />\n </span>\n </div>\n\n <FollowRequestContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} />\n </div>\n </HotKeys>\n );\n }\n\n renderMention (notification) {\n return (\n <StatusContainer\n id={notification.get('status')}\n withDismiss\n hidden={this.props.hidden}\n onMoveDown={this.handleMoveDown}\n onMoveUp={this.handleMoveUp}\n contextType='notifications'\n getScrollPosition={this.props.getScrollPosition}\n updateScrollBottom={this.props.updateScrollBottom}\n cachedMediaWidth={this.props.cachedMediaWidth}\n cacheMediaWidth={this.props.cacheMediaWidth}\n />\n );\n }\n\n renderFavourite (notification, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-favourite focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.favourite, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='star' className='star-icon' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.favourite' defaultMessage='{name} favourited your status' values={{ name: link }} />\n </span>\n </div>\n\n <StatusContainer\n id={notification.get('status')}\n account={notification.get('account')}\n muted\n withDismiss\n hidden={!!this.props.hidden}\n getScrollPosition={this.props.getScrollPosition}\n updateScrollBottom={this.props.updateScrollBottom}\n cachedMediaWidth={this.props.cachedMediaWidth}\n cacheMediaWidth={this.props.cacheMediaWidth}\n />\n </div>\n </HotKeys>\n );\n }\n\n renderReblog (notification, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-reblog focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.reblog, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='retweet' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.reblog' defaultMessage='{name} boosted your status' values={{ name: link }} />\n </span>\n </div>\n\n <StatusContainer\n id={notification.get('status')}\n account={notification.get('account')}\n muted\n withDismiss\n hidden={this.props.hidden}\n getScrollPosition={this.props.getScrollPosition}\n updateScrollBottom={this.props.updateScrollBottom}\n cachedMediaWidth={this.props.cachedMediaWidth}\n cacheMediaWidth={this.props.cacheMediaWidth}\n />\n </div>\n </HotKeys>\n );\n }\n\n renderPoll (notification, account) {\n const { intl } = this.props;\n const ownPoll = me === account.get('id');\n const message = ownPoll ? intl.formatMessage(messages.ownPoll) : intl.formatMessage(messages.poll);\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-poll focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, message, notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='tasks' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n {ownPoll ? (\n <FormattedMessage id='notification.own_poll' defaultMessage='Your poll has ended' />\n ) : (\n <FormattedMessage id='notification.poll' defaultMessage='A poll you have voted in has ended' />\n )}\n </span>\n </div>\n\n <StatusContainer\n id={notification.get('status')}\n account={account}\n muted\n withDismiss\n hidden={this.props.hidden}\n getScrollPosition={this.props.getScrollPosition}\n updateScrollBottom={this.props.updateScrollBottom}\n cachedMediaWidth={this.props.cachedMediaWidth}\n cacheMediaWidth={this.props.cacheMediaWidth}\n />\n </div>\n </HotKeys>\n );\n }\n\n render () {\n const { notification } = this.props;\n const account = notification.get('account');\n const displayNameHtml = { __html: account.get('display_name_html') };\n const link = <bdi><Permalink className='notification__display-name' href={account.get('url')} title={account.get('acct')} to={`/accounts/${account.get('id')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>;\n\n switch(notification.get('type')) {\n case 'follow':\n return this.renderFollow(notification, account, link);\n case 'follow_request':\n return this.renderFollowRequest(notification, account, link);\n case 'mention':\n return this.renderMention(notification);\n case 'favourite':\n return this.renderFavourite(notification, link);\n case 'reblog':\n return this.renderReblog(notification, link);\n case 'poll':\n return this.renderPoll(notification, account);\n }\n\n return null;\n }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetNotification, makeGetStatus } from '../../../selectors';\nimport Notification from '../components/notification';\nimport { openModal } from '../../../actions/modal';\nimport { mentionCompose } from '../../../actions/compose';\nimport {\n reblog,\n favourite,\n unreblog,\n unfavourite,\n} from '../../../actions/interactions';\nimport {\n hideStatus,\n revealStatus,\n} from '../../../actions/statuses';\nimport { boostModal } from '../../../initial_state';\n\nconst makeMapStateToProps = () => {\n const getNotification = makeGetNotification();\n const getStatus = makeGetStatus();\n\n const mapStateToProps = (state, props) => {\n const notification = getNotification(state, props.notification, props.accountId);\n return {\n notification: notification,\n status: notification.get('status') ? getStatus(state, { id: notification.get('status') }) : null,\n };\n };\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = dispatch => ({\n onMention: (account, router) => {\n dispatch(mentionCompose(account, router));\n },\n\n onModalReblog (status) {\n dispatch(reblog(status));\n },\n\n onReblog (status, e) {\n if (status.get('reblogged')) {\n dispatch(unreblog(status));\n } else {\n if (e.shiftKey || !boostModal) {\n this.onModalReblog(status);\n } else {\n dispatch(openModal('BOOST', { status, onReblog: this.onModalReblog }));\n }\n }\n },\n\n onFavourite (status) {\n if (status.get('favourited')) {\n dispatch(unfavourite(status));\n } else {\n dispatch(favourite(status));\n }\n },\n\n onToggleHidden (status) {\n if (status.get('hidden')) {\n dispatch(revealStatus(status.get('id')));\n } else {\n dispatch(hideStatus(status.get('id')));\n }\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(Notification);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nexport default class ClearColumnButton extends React.PureComponent {\n\n static propTypes = {\n onClick: PropTypes.func.isRequired,\n };\n\n render () {\n return (\n <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { FormattedMessage } from 'react-intl';\nimport ClearColumnButton from './clear_column_button';\nimport SettingToggle from './setting_toggle';\n\nexport default class ColumnSettings extends React.PureComponent {\n\n static propTypes = {\n settings: ImmutablePropTypes.map.isRequired,\n pushSettings: ImmutablePropTypes.map.isRequired,\n onChange: PropTypes.func.isRequired,\n onClear: PropTypes.func.isRequired,\n };\n\n onPushChange = (path, checked) => {\n this.props.onChange(['push', ...path], checked);\n }\n\n render () {\n const { settings, pushSettings, onChange, onClear } = this.props;\n\n const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;\n const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;\n const alertStr = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;\n const showStr = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;\n const soundStr = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;\n\n const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed');\n const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />;\n\n return (\n <div>\n <div className='column-settings__row'>\n <ClearColumnButton onClick={onClear} />\n </div>\n\n <div role='group' aria-labelledby='notifications-filter-bar'>\n <span id='notifications-filter-bar' className='column-settings__section'>\n <FormattedMessage id='notifications.column_settings.filter_bar.category' defaultMessage='Quick filter bar' />\n </span>\n <div className='column-settings__row'>\n <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'show']} onChange={onChange} label={filterShowStr} />\n <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'advanced']} onChange={onChange} label={filterAdvancedStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-follow'>\n <span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-follow-request'>\n <span id='notifications-follow-request' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow_request' defaultMessage='New follow requests:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow_request']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow_request']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow_request']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow_request']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-favourite'>\n <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favourites:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-mention'>\n <span id='notifications-mention' className='column-settings__section'><FormattedMessage id='notifications.column_settings.mention' defaultMessage='Mentions:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-reblog'>\n <span id='notifications-reblog' className='column-settings__section'><FormattedMessage id='notifications.column_settings.reblog' defaultMessage='Boosts:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-poll'>\n <span id='notifications-poll' className='column-settings__section'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'poll']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'poll']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'poll']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { setFilter } from '../../../actions/notifications';\nimport { clearNotifications } from '../../../actions/notifications';\nimport { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';\nimport { openModal } from '../../../actions/modal';\n\nconst messages = defineMessages({\n clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },\n clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' },\n});\n\nconst mapStateToProps = state => ({\n settings: state.getIn(['settings', 'notifications']),\n pushSettings: state.get('push_notifications'),\n});\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n onChange (path, checked) {\n if (path[0] === 'push') {\n dispatch(changePushNotifications(path.slice(1), checked));\n } else if (path[0] === 'quickFilter') {\n dispatch(changeSetting(['notifications', ...path], checked));\n dispatch(setFilter('all'));\n } else {\n dispatch(changeSetting(['notifications', ...path], checked));\n }\n },\n\n onClear () {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.clearMessage),\n confirm: intl.formatMessage(messages.clearConfirm),\n onConfirm: () => dispatch(clearNotifications()),\n }));\n },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nconst tooltips = defineMessages({\n mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },\n favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },\n boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },\n polls: { id: 'notifications.filter.polls', defaultMessage: 'Poll results' },\n follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },\n});\n\nexport default @injectIntl\nclass FilterBar extends React.PureComponent {\n\n static propTypes = {\n selectFilter: PropTypes.func.isRequired,\n selectedFilter: PropTypes.string.isRequired,\n advancedMode: PropTypes.bool.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n onClick (notificationType) {\n return () => this.props.selectFilter(notificationType);\n }\n\n render () {\n const { selectedFilter, advancedMode, intl } = this.props;\n const renderedElement = !advancedMode ? (\n <div className='notification__filter-bar'>\n <button\n className={selectedFilter === 'all' ? 'active' : ''}\n onClick={this.onClick('all')}\n >\n <FormattedMessage\n id='notifications.filter.all'\n defaultMessage='All'\n />\n </button>\n <button\n className={selectedFilter === 'mention' ? 'active' : ''}\n onClick={this.onClick('mention')}\n >\n <FormattedMessage\n id='notifications.filter.mentions'\n defaultMessage='Mentions'\n />\n </button>\n </div>\n ) : (\n <div className='notification__filter-bar'>\n <button\n className={selectedFilter === 'all' ? 'active' : ''}\n onClick={this.onClick('all')}\n >\n <FormattedMessage\n id='notifications.filter.all'\n defaultMessage='All'\n />\n </button>\n <button\n className={selectedFilter === 'mention' ? 'active' : ''}\n onClick={this.onClick('mention')}\n title={intl.formatMessage(tooltips.mentions)}\n >\n <Icon id='reply-all' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'favourite' ? 'active' : ''}\n onClick={this.onClick('favourite')}\n title={intl.formatMessage(tooltips.favourites)}\n >\n <Icon id='star' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'reblog' ? 'active' : ''}\n onClick={this.onClick('reblog')}\n title={intl.formatMessage(tooltips.boosts)}\n >\n <Icon id='retweet' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'poll' ? 'active' : ''}\n onClick={this.onClick('poll')}\n title={intl.formatMessage(tooltips.polls)}\n >\n <Icon id='tasks' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'follow' ? 'active' : ''}\n onClick={this.onClick('follow')}\n title={intl.formatMessage(tooltips.follows)}\n >\n <Icon id='user-plus' fixedWidth />\n </button>\n </div>\n );\n return renderedElement;\n }\n\n}\n","import { connect } from 'react-redux';\nimport FilterBar from '../components/filter_bar';\nimport { setFilter } from '../../../actions/notifications';\n\nconst makeMapStateToProps = state => ({\n selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n advancedMode: state.getIn(['settings', 'notifications', 'quickFilter', 'advanced']),\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n selectFilter (newActiveFilter) {\n dispatch(setFilter(newActiveFilter));\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(FilterBar);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandNotifications, scrollTopNotifications, loadPending, mountNotifications, unmountNotifications } from '../../actions/notifications';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport NotificationContainer from './containers/notification_container';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport FilterBarContainer from './containers/filter_bar_container';\nimport { createSelector } from 'reselect';\nimport { List as ImmutableList } from 'immutable';\nimport { debounce } from 'lodash';\nimport ScrollableList from '../../components/scrollable_list';\nimport LoadGap from '../../components/load_gap';\n\nconst messages = defineMessages({\n title: { id: 'column.notifications', defaultMessage: 'Notifications' },\n});\n\nconst getNotifications = createSelector([\n state => state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n state => state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n state => ImmutableList(state.getIn(['settings', 'notifications', 'shows']).filter(item => !item).keys()),\n state => state.getIn(['notifications', 'items']),\n], (showFilterBar, allowedType, excludedTypes, notifications) => {\n if (!showFilterBar || allowedType === 'all') {\n // used if user changed the notification settings after loading the notifications from the server\n // otherwise a list of notifications will come pre-filtered from the backend\n // we need to turn it off for FilterBar in order not to block ourselves from seeing a specific category\n return notifications.filterNot(item => item !== null && excludedTypes.includes(item.get('type')));\n }\n return notifications.filter(item => item !== null && allowedType === item.get('type'));\n});\n\nconst mapStateToProps = state => ({\n showFilterBar: state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n notifications: getNotifications(state),\n isLoading: state.getIn(['notifications', 'isLoading'], true),\n isUnread: state.getIn(['notifications', 'unread']) > 0 || state.getIn(['notifications', 'pendingItems']).size > 0,\n hasMore: state.getIn(['notifications', 'hasMore']),\n numPending: state.getIn(['notifications', 'pendingItems'], ImmutableList()).size,\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Notifications extends React.PureComponent {\n\n static propTypes = {\n columnId: PropTypes.string,\n notifications: ImmutablePropTypes.list.isRequired,\n showFilterBar: PropTypes.bool.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n intl: PropTypes.object.isRequired,\n isLoading: PropTypes.bool,\n isUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n hasMore: PropTypes.bool,\n numPending: PropTypes.number,\n };\n\n static defaultProps = {\n trackScroll: true,\n };\n\n componentWillMount() {\n this.props.dispatch(mountNotifications());\n }\n\n componentWillUnmount () {\n this.handleLoadOlder.cancel();\n this.handleScrollToTop.cancel();\n this.handleScroll.cancel();\n this.props.dispatch(scrollTopNotifications(false));\n this.props.dispatch(unmountNotifications());\n }\n\n handleLoadGap = (maxId) => {\n this.props.dispatch(expandNotifications({ maxId }));\n };\n\n handleLoadOlder = debounce(() => {\n const last = this.props.notifications.last();\n this.props.dispatch(expandNotifications({ maxId: last && last.get('id') }));\n }, 300, { leading: true });\n\n handleLoadPending = () => {\n this.props.dispatch(loadPending());\n };\n\n handleScrollToTop = debounce(() => {\n this.props.dispatch(scrollTopNotifications(true));\n }, 100);\n\n handleScroll = debounce(() => {\n this.props.dispatch(scrollTopNotifications(false));\n }, 100);\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('NOTIFICATIONS', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setColumnRef = c => {\n this.column = c;\n }\n\n handleMoveUp = id => {\n const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) - 1;\n this._selectChild(elementIndex, true);\n }\n\n handleMoveDown = id => {\n const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) + 1;\n this._selectChild(elementIndex, false);\n }\n\n _selectChild (index, align_top) {\n const container = this.column.node;\n const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`);\n\n if (element) {\n if (align_top && container.scrollTop > element.offsetTop) {\n element.scrollIntoView(true);\n } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n element.scrollIntoView(false);\n }\n element.focus();\n }\n }\n\n render () {\n const { intl, notifications, shouldUpdateScroll, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, showFilterBar } = this.props;\n const pinned = !!columnId;\n const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage=\"You don't have any notifications yet. Interact with others to start the conversation.\" />;\n\n let scrollableContent = null;\n\n const filterBarContainer = showFilterBar\n ? (<FilterBarContainer />)\n : null;\n\n if (isLoading && this.scrollableContent) {\n scrollableContent = this.scrollableContent;\n } else if (notifications.size > 0 || hasMore) {\n scrollableContent = notifications.map((item, index) => item === null ? (\n <LoadGap\n key={'gap:' + notifications.getIn([index + 1, 'id'])}\n disabled={isLoading}\n maxId={index > 0 ? notifications.getIn([index - 1, 'id']) : null}\n onClick={this.handleLoadGap}\n />\n ) : (\n <NotificationContainer\n key={item.get('id')}\n notification={item}\n accountId={item.get('account')}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n />\n ));\n } else {\n scrollableContent = null;\n }\n\n this.scrollableContent = scrollableContent;\n\n const scrollContainer = (\n <ScrollableList\n scrollKey={`notifications-${columnId}`}\n trackScroll={!pinned}\n isLoading={isLoading}\n showLoading={isLoading && notifications.size === 0}\n hasMore={hasMore}\n numPending={numPending}\n emptyMessage={emptyMessage}\n onLoadMore={this.handleLoadOlder}\n onLoadPending={this.handleLoadPending}\n onScrollToTop={this.handleScrollToTop}\n onScroll={this.handleScroll}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n >\n {scrollableContent}\n </ScrollableList>\n );\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setColumnRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='bell'\n active={isUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <ColumnSettingsContainer />\n </ColumnHeader>\n {filterBarContainer}\n {scrollContainer}\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/follow_request.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/follow_request_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/notification.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/notification_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/clear_column_button.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/column_settings.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/components/filter_bar.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/containers/filter_bar_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/notifications/index.js"],"names":["messages","defineMessages","authorize","reject","FollowRequest","injectIntl","render","this","props","intl","hidden","account","onAuthorize","onReject","get","className","title","href","to","size","formatMessage","icon","onClick","ImmutablePureComponent","ImmutablePropTypes","map","isRequired","PropTypes","func","object","connect","getAccount","makeGetAccount","state","id","dispatch","authorizeFollowRequest","rejectFollowRequest","favourite","follow","ownPoll","poll","reblog","notificationForScreenReader","message","timestamp","output","push","formatDate","hour","minute","month","day","join","Notification","notification","onMoveUp","onMoveDown","context","router","history","handleOpenProfile","getIn","e","preventDefault","onMention","status","onFavourite","onReblog","onToggleHidden","getHandlers","reply","handleMention","handleHotkeyFavourite","boost","handleHotkeyBoost","mention","open","handleOpen","openProfile","moveUp","handleMoveUp","moveDown","handleMoveDown","toggleHidden","handleHotkeyToggleHidden","renderFollow","link","handlers","tabIndex","aria-label","name","fixedWidth","defaultMessage","values","renderFollowRequest","withNote","renderMention","withDismiss","contextType","getScrollPosition","updateScrollBottom","cachedMediaWidth","cacheMediaWidth","renderFavourite","muted","renderReblog","renderPoll","me","displayNameHtml","__html","dangerouslySetInnerHTML","bool","number","getNotification","makeGetNotification","getStatus","makeGetStatus","accountId","mentionCompose","onModalReblog","unreblog","shiftKey","boostModal","openModal","unfavourite","revealStatus","hideStatus","ClearColumnButton","React","PureComponent","ColumnSettings","path","checked","onChange","settings","pushSettings","onClear","filterShowStr","filterAdvancedStr","alertStr","showStr","soundStr","showPushSettings","pushStr","role","aria-labelledby","prefix","settingPath","label","onPushChange","clearMessage","clearConfirm","changePushNotifications","slice","changeSetting","setFilter","confirm","onConfirm","clearNotifications","tooltips","mentions","favourites","boosts","polls","follows","FilterBar","notificationType","selectFilter","selectedFilter","advancedMode","newActiveFilter","getNotifications","createSelector","ImmutableList","filter","item","keys","showFilterBar","allowedType","excludedTypes","notifications","filterNot","includes","Notifications","isLoading","isUnread","hasMore","numPending","maxId","expandNotifications","last","leading","loadPending","scrollTopNotifications","columnId","removeColumn","addColumn","dir","moveColumn","column","scrollTop","c","elementIndex","findIndex","_selectChild","componentWillMount","mountNotifications","componentWillUnmount","handleLoadOlder","cancel","handleScrollToTop","handleScroll","unmountNotifications","index","align_top","container","node","element","querySelector","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","shouldUpdateScroll","multiColumn","pinned","emptyMessage","scrollableContent","filterBarContainer","disabled","handleLoadGap","scrollContainer","scrollKey","trackScroll","showLoading","onLoadMore","onLoadPending","handleLoadPending","onScrollToTop","onScroll","bindToDocument","ref","setColumnRef","active","onPin","handlePin","onMove","handleMove","handleHeaderClick"],"mappings":"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","file":"features/notifications.js","sourcesContent":["import React, { Fragment } from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport PropTypes from 'prop-types';\nimport Avatar from 'mastodon/components/avatar';\nimport DisplayName from 'mastodon/components/display_name';\nimport Permalink from 'mastodon/components/permalink';\nimport IconButton from 'mastodon/components/icon_button';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n authorize: { id: 'follow_request.authorize', defaultMessage: 'Authorize' },\n reject: { id: 'follow_request.reject', defaultMessage: 'Reject' },\n});\n\nexport default @injectIntl\nclass FollowRequest extends ImmutablePureComponent {\n\n static propTypes = {\n account: ImmutablePropTypes.map.isRequired,\n onAuthorize: PropTypes.func.isRequired,\n onReject: PropTypes.func.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n render () {\n const { intl, hidden, account, onAuthorize, onReject } = this.props;\n\n if (!account) {\n return <div />;\n }\n\n if (hidden) {\n return (\n <Fragment>\n {account.get('display_name')}\n {account.get('username')}\n </Fragment>\n );\n }\n\n return (\n <div className='account'>\n <div className='account__wrapper'>\n <Permalink key={account.get('id')} className='account__display-name' title={account.get('acct')} href={account.get('url')} to={`/accounts/${account.get('id')}`}>\n <div className='account__avatar-wrapper'><Avatar account={account} size={36} /></div>\n <DisplayName account={account} />\n </Permalink>\n\n <div className='account__relationship'>\n <IconButton title={intl.formatMessage(messages.authorize)} icon='check' onClick={onAuthorize} />\n <IconButton title={intl.formatMessage(messages.reject)} icon='times' onClick={onReject} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetAccount } from 'mastodon/selectors';\nimport FollowRequest from '../components/follow_request';\nimport { authorizeFollowRequest, rejectFollowRequest } from 'mastodon/actions/accounts';\n\nconst makeMapStateToProps = () => {\n const getAccount = makeGetAccount();\n\n const mapStateToProps = (state, props) => ({\n account: getAccount(state, props.id),\n });\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = (dispatch, { id }) => ({\n onAuthorize () {\n dispatch(authorizeFollowRequest(id));\n },\n\n onReject () {\n dispatch(rejectFollowRequest(id));\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(FollowRequest);\n","import React from 'react';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { injectIntl, FormattedMessage, defineMessages } from 'react-intl';\nimport { HotKeys } from 'react-hotkeys';\nimport PropTypes from 'prop-types';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { me } from 'mastodon/initial_state';\nimport StatusContainer from 'mastodon/containers/status_container';\nimport AccountContainer from 'mastodon/containers/account_container';\nimport FollowRequestContainer from '../containers/follow_request_container';\nimport Icon from 'mastodon/components/icon';\nimport Permalink from 'mastodon/components/permalink';\n\nconst messages = defineMessages({\n favourite: { id: 'notification.favourite', defaultMessage: '{name} favourited your status' },\n follow: { id: 'notification.follow', defaultMessage: '{name} followed you' },\n ownPoll: { id: 'notification.own_poll', defaultMessage: 'Your poll has ended' },\n poll: { id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' },\n reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' },\n});\n\nconst notificationForScreenReader = (intl, message, timestamp) => {\n const output = [message];\n\n output.push(intl.formatDate(timestamp, { hour: '2-digit', minute: '2-digit', month: 'short', day: 'numeric' }));\n\n return output.join(', ');\n};\n\nexport default @injectIntl\nclass Notification extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n notification: ImmutablePropTypes.map.isRequired,\n hidden: PropTypes.bool,\n onMoveUp: PropTypes.func.isRequired,\n onMoveDown: PropTypes.func.isRequired,\n onMention: PropTypes.func.isRequired,\n onFavourite: PropTypes.func.isRequired,\n onReblog: PropTypes.func.isRequired,\n onToggleHidden: PropTypes.func.isRequired,\n status: ImmutablePropTypes.map,\n intl: PropTypes.object.isRequired,\n getScrollPosition: PropTypes.func,\n updateScrollBottom: PropTypes.func,\n cacheMediaWidth: PropTypes.func,\n cachedMediaWidth: PropTypes.number,\n };\n\n handleMoveUp = () => {\n const { notification, onMoveUp } = this.props;\n onMoveUp(notification.get('id'));\n }\n\n handleMoveDown = () => {\n const { notification, onMoveDown } = this.props;\n onMoveDown(notification.get('id'));\n }\n\n handleOpen = () => {\n const { notification } = this.props;\n\n if (notification.get('status')) {\n this.context.router.history.push(`/statuses/${notification.get('status')}`);\n } else {\n this.handleOpenProfile();\n }\n }\n\n handleOpenProfile = () => {\n const { notification } = this.props;\n this.context.router.history.push(`/accounts/${notification.getIn(['account', 'id'])}`);\n }\n\n handleMention = e => {\n e.preventDefault();\n\n const { notification, onMention } = this.props;\n onMention(notification.get('account'), this.context.router.history);\n }\n\n handleHotkeyFavourite = () => {\n const { status } = this.props;\n if (status) this.props.onFavourite(status);\n }\n\n handleHotkeyBoost = e => {\n const { status } = this.props;\n if (status) this.props.onReblog(status, e);\n }\n\n handleHotkeyToggleHidden = () => {\n const { status } = this.props;\n if (status) this.props.onToggleHidden(status);\n }\n\n getHandlers () {\n return {\n reply: this.handleMention,\n favourite: this.handleHotkeyFavourite,\n boost: this.handleHotkeyBoost,\n mention: this.handleMention,\n open: this.handleOpen,\n openProfile: this.handleOpenProfile,\n moveUp: this.handleMoveUp,\n moveDown: this.handleMoveDown,\n toggleHidden: this.handleHotkeyToggleHidden,\n };\n }\n\n renderFollow (notification, account, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-follow focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.follow, { name: account.get('acct') }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='user-plus' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.follow' defaultMessage='{name} followed you' values={{ name: link }} />\n </span>\n </div>\n\n <AccountContainer id={account.get('id')} hidden={this.props.hidden} />\n </div>\n </HotKeys>\n );\n }\n\n renderFollowRequest (notification, account, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-follow-request focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage({ id: 'notification.follow_request', defaultMessage: '{name} has requested to follow you' }, { name: account.get('acct') }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='user' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.follow_request' defaultMessage='{name} has requested to follow you' values={{ name: link }} />\n </span>\n </div>\n\n <FollowRequestContainer id={account.get('id')} withNote={false} hidden={this.props.hidden} />\n </div>\n </HotKeys>\n );\n }\n\n renderMention (notification) {\n return (\n <StatusContainer\n id={notification.get('status')}\n withDismiss\n hidden={this.props.hidden}\n onMoveDown={this.handleMoveDown}\n onMoveUp={this.handleMoveUp}\n contextType='notifications'\n getScrollPosition={this.props.getScrollPosition}\n updateScrollBottom={this.props.updateScrollBottom}\n cachedMediaWidth={this.props.cachedMediaWidth}\n cacheMediaWidth={this.props.cacheMediaWidth}\n />\n );\n }\n\n renderFavourite (notification, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-favourite focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.favourite, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='star' className='star-icon' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.favourite' defaultMessage='{name} favourited your status' values={{ name: link }} />\n </span>\n </div>\n\n <StatusContainer\n id={notification.get('status')}\n account={notification.get('account')}\n muted\n withDismiss\n hidden={!!this.props.hidden}\n getScrollPosition={this.props.getScrollPosition}\n updateScrollBottom={this.props.updateScrollBottom}\n cachedMediaWidth={this.props.cachedMediaWidth}\n cacheMediaWidth={this.props.cacheMediaWidth}\n />\n </div>\n </HotKeys>\n );\n }\n\n renderReblog (notification, link) {\n const { intl } = this.props;\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-reblog focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, intl.formatMessage(messages.reblog, { name: notification.getIn(['account', 'acct']) }), notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='retweet' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n <FormattedMessage id='notification.reblog' defaultMessage='{name} boosted your status' values={{ name: link }} />\n </span>\n </div>\n\n <StatusContainer\n id={notification.get('status')}\n account={notification.get('account')}\n muted\n withDismiss\n hidden={this.props.hidden}\n getScrollPosition={this.props.getScrollPosition}\n updateScrollBottom={this.props.updateScrollBottom}\n cachedMediaWidth={this.props.cachedMediaWidth}\n cacheMediaWidth={this.props.cacheMediaWidth}\n />\n </div>\n </HotKeys>\n );\n }\n\n renderPoll (notification, account) {\n const { intl } = this.props;\n const ownPoll = me === account.get('id');\n const message = ownPoll ? intl.formatMessage(messages.ownPoll) : intl.formatMessage(messages.poll);\n\n return (\n <HotKeys handlers={this.getHandlers()}>\n <div className='notification notification-poll focusable' tabIndex='0' aria-label={notificationForScreenReader(intl, message, notification.get('created_at'))}>\n <div className='notification__message'>\n <div className='notification__favourite-icon-wrapper'>\n <Icon id='tasks' fixedWidth />\n </div>\n\n <span title={notification.get('created_at')}>\n {ownPoll ? (\n <FormattedMessage id='notification.own_poll' defaultMessage='Your poll has ended' />\n ) : (\n <FormattedMessage id='notification.poll' defaultMessage='A poll you have voted in has ended' />\n )}\n </span>\n </div>\n\n <StatusContainer\n id={notification.get('status')}\n account={account}\n muted\n withDismiss\n hidden={this.props.hidden}\n getScrollPosition={this.props.getScrollPosition}\n updateScrollBottom={this.props.updateScrollBottom}\n cachedMediaWidth={this.props.cachedMediaWidth}\n cacheMediaWidth={this.props.cacheMediaWidth}\n />\n </div>\n </HotKeys>\n );\n }\n\n render () {\n const { notification } = this.props;\n const account = notification.get('account');\n const displayNameHtml = { __html: account.get('display_name_html') };\n const link = <bdi><Permalink className='notification__display-name' href={account.get('url')} title={account.get('acct')} to={`/accounts/${account.get('id')}`} dangerouslySetInnerHTML={displayNameHtml} /></bdi>;\n\n switch(notification.get('type')) {\n case 'follow':\n return this.renderFollow(notification, account, link);\n case 'follow_request':\n return this.renderFollowRequest(notification, account, link);\n case 'mention':\n return this.renderMention(notification);\n case 'favourite':\n return this.renderFavourite(notification, link);\n case 'reblog':\n return this.renderReblog(notification, link);\n case 'poll':\n return this.renderPoll(notification, account);\n }\n\n return null;\n }\n\n}\n","import { connect } from 'react-redux';\nimport { makeGetNotification, makeGetStatus } from '../../../selectors';\nimport Notification from '../components/notification';\nimport { openModal } from '../../../actions/modal';\nimport { mentionCompose } from '../../../actions/compose';\nimport {\n reblog,\n favourite,\n unreblog,\n unfavourite,\n} from '../../../actions/interactions';\nimport {\n hideStatus,\n revealStatus,\n} from '../../../actions/statuses';\nimport { boostModal } from '../../../initial_state';\n\nconst makeMapStateToProps = () => {\n const getNotification = makeGetNotification();\n const getStatus = makeGetStatus();\n\n const mapStateToProps = (state, props) => {\n const notification = getNotification(state, props.notification, props.accountId);\n return {\n notification: notification,\n status: notification.get('status') ? getStatus(state, { id: notification.get('status') }) : null,\n };\n };\n\n return mapStateToProps;\n};\n\nconst mapDispatchToProps = dispatch => ({\n onMention: (account, router) => {\n dispatch(mentionCompose(account, router));\n },\n\n onModalReblog (status) {\n dispatch(reblog(status));\n },\n\n onReblog (status, e) {\n if (status.get('reblogged')) {\n dispatch(unreblog(status));\n } else {\n if (e.shiftKey || !boostModal) {\n this.onModalReblog(status);\n } else {\n dispatch(openModal('BOOST', { status, onReblog: this.onModalReblog }));\n }\n }\n },\n\n onFavourite (status) {\n if (status.get('favourited')) {\n dispatch(unfavourite(status));\n } else {\n dispatch(favourite(status));\n }\n },\n\n onToggleHidden (status) {\n if (status.get('hidden')) {\n dispatch(revealStatus(status.get('id')));\n } else {\n dispatch(hideStatus(status.get('id')));\n }\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(Notification);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nexport default class ClearColumnButton extends React.PureComponent {\n\n static propTypes = {\n onClick: PropTypes.func.isRequired,\n };\n\n render () {\n return (\n <button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { FormattedMessage } from 'react-intl';\nimport ClearColumnButton from './clear_column_button';\nimport SettingToggle from './setting_toggle';\n\nexport default class ColumnSettings extends React.PureComponent {\n\n static propTypes = {\n settings: ImmutablePropTypes.map.isRequired,\n pushSettings: ImmutablePropTypes.map.isRequired,\n onChange: PropTypes.func.isRequired,\n onClear: PropTypes.func.isRequired,\n };\n\n onPushChange = (path, checked) => {\n this.props.onChange(['push', ...path], checked);\n }\n\n render () {\n const { settings, pushSettings, onChange, onClear } = this.props;\n\n const filterShowStr = <FormattedMessage id='notifications.column_settings.filter_bar.show' defaultMessage='Show' />;\n const filterAdvancedStr = <FormattedMessage id='notifications.column_settings.filter_bar.advanced' defaultMessage='Display all categories' />;\n const alertStr = <FormattedMessage id='notifications.column_settings.alert' defaultMessage='Desktop notifications' />;\n const showStr = <FormattedMessage id='notifications.column_settings.show' defaultMessage='Show in column' />;\n const soundStr = <FormattedMessage id='notifications.column_settings.sound' defaultMessage='Play sound' />;\n\n const showPushSettings = pushSettings.get('browserSupport') && pushSettings.get('isSubscribed');\n const pushStr = showPushSettings && <FormattedMessage id='notifications.column_settings.push' defaultMessage='Push notifications' />;\n\n return (\n <div>\n <div className='column-settings__row'>\n <ClearColumnButton onClick={onClear} />\n </div>\n\n <div role='group' aria-labelledby='notifications-filter-bar'>\n <span id='notifications-filter-bar' className='column-settings__section'>\n <FormattedMessage id='notifications.column_settings.filter_bar.category' defaultMessage='Quick filter bar' />\n </span>\n <div className='column-settings__row'>\n <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'show']} onChange={onChange} label={filterShowStr} />\n <SettingToggle id='show-filter-bar' prefix='notifications' settings={settings} settingPath={['quickFilter', 'advanced']} onChange={onChange} label={filterAdvancedStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-follow'>\n <span id='notifications-follow' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow' defaultMessage='New followers:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-follow-request'>\n <span id='notifications-follow-request' className='column-settings__section'><FormattedMessage id='notifications.column_settings.follow_request' defaultMessage='New follow requests:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'follow_request']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'follow_request']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'follow_request']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'follow_request']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-favourite'>\n <span id='notifications-favourite' className='column-settings__section'><FormattedMessage id='notifications.column_settings.favourite' defaultMessage='Favourites:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'favourite']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'favourite']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'favourite']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'favourite']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-mention'>\n <span id='notifications-mention' className='column-settings__section'><FormattedMessage id='notifications.column_settings.mention' defaultMessage='Mentions:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'mention']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'mention']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'mention']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'mention']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-reblog'>\n <span id='notifications-reblog' className='column-settings__section'><FormattedMessage id='notifications.column_settings.reblog' defaultMessage='Boosts:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'reblog']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'reblog']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'reblog']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'reblog']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n\n <div role='group' aria-labelledby='notifications-poll'>\n <span id='notifications-poll' className='column-settings__section'><FormattedMessage id='notifications.column_settings.poll' defaultMessage='Poll results:' /></span>\n\n <div className='column-settings__row'>\n <SettingToggle prefix='notifications_desktop' settings={settings} settingPath={['alerts', 'poll']} onChange={onChange} label={alertStr} />\n {showPushSettings && <SettingToggle prefix='notifications_push' settings={pushSettings} settingPath={['alerts', 'poll']} onChange={this.onPushChange} label={pushStr} />}\n <SettingToggle prefix='notifications' settings={settings} settingPath={['shows', 'poll']} onChange={onChange} label={showStr} />\n <SettingToggle prefix='notifications' settings={settings} settingPath={['sounds', 'poll']} onChange={onChange} label={soundStr} />\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import { connect } from 'react-redux';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ColumnSettings from '../components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { setFilter } from '../../../actions/notifications';\nimport { clearNotifications } from '../../../actions/notifications';\nimport { changeAlerts as changePushNotifications } from '../../../actions/push_notifications';\nimport { openModal } from '../../../actions/modal';\n\nconst messages = defineMessages({\n clearMessage: { id: 'notifications.clear_confirmation', defaultMessage: 'Are you sure you want to permanently clear all your notifications?' },\n clearConfirm: { id: 'notifications.clear', defaultMessage: 'Clear notifications' },\n});\n\nconst mapStateToProps = state => ({\n settings: state.getIn(['settings', 'notifications']),\n pushSettings: state.get('push_notifications'),\n});\n\nconst mapDispatchToProps = (dispatch, { intl }) => ({\n\n onChange (path, checked) {\n if (path[0] === 'push') {\n dispatch(changePushNotifications(path.slice(1), checked));\n } else if (path[0] === 'quickFilter') {\n dispatch(changeSetting(['notifications', ...path], checked));\n dispatch(setFilter('all'));\n } else {\n dispatch(changeSetting(['notifications', ...path], checked));\n }\n },\n\n onClear () {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.clearMessage),\n confirm: intl.formatMessage(messages.clearConfirm),\n onConfirm: () => dispatch(clearNotifications()),\n }));\n },\n\n});\n\nexport default injectIntl(connect(mapStateToProps, mapDispatchToProps)(ColumnSettings));\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport Icon from 'mastodon/components/icon';\n\nconst tooltips = defineMessages({\n mentions: { id: 'notifications.filter.mentions', defaultMessage: 'Mentions' },\n favourites: { id: 'notifications.filter.favourites', defaultMessage: 'Favourites' },\n boosts: { id: 'notifications.filter.boosts', defaultMessage: 'Boosts' },\n polls: { id: 'notifications.filter.polls', defaultMessage: 'Poll results' },\n follows: { id: 'notifications.filter.follows', defaultMessage: 'Follows' },\n});\n\nexport default @injectIntl\nclass FilterBar extends React.PureComponent {\n\n static propTypes = {\n selectFilter: PropTypes.func.isRequired,\n selectedFilter: PropTypes.string.isRequired,\n advancedMode: PropTypes.bool.isRequired,\n intl: PropTypes.object.isRequired,\n };\n\n onClick (notificationType) {\n return () => this.props.selectFilter(notificationType);\n }\n\n render () {\n const { selectedFilter, advancedMode, intl } = this.props;\n const renderedElement = !advancedMode ? (\n <div className='notification__filter-bar'>\n <button\n className={selectedFilter === 'all' ? 'active' : ''}\n onClick={this.onClick('all')}\n >\n <FormattedMessage\n id='notifications.filter.all'\n defaultMessage='All'\n />\n </button>\n <button\n className={selectedFilter === 'mention' ? 'active' : ''}\n onClick={this.onClick('mention')}\n >\n <FormattedMessage\n id='notifications.filter.mentions'\n defaultMessage='Mentions'\n />\n </button>\n </div>\n ) : (\n <div className='notification__filter-bar'>\n <button\n className={selectedFilter === 'all' ? 'active' : ''}\n onClick={this.onClick('all')}\n >\n <FormattedMessage\n id='notifications.filter.all'\n defaultMessage='All'\n />\n </button>\n <button\n className={selectedFilter === 'mention' ? 'active' : ''}\n onClick={this.onClick('mention')}\n title={intl.formatMessage(tooltips.mentions)}\n >\n <Icon id='reply-all' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'favourite' ? 'active' : ''}\n onClick={this.onClick('favourite')}\n title={intl.formatMessage(tooltips.favourites)}\n >\n <Icon id='star' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'reblog' ? 'active' : ''}\n onClick={this.onClick('reblog')}\n title={intl.formatMessage(tooltips.boosts)}\n >\n <Icon id='retweet' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'poll' ? 'active' : ''}\n onClick={this.onClick('poll')}\n title={intl.formatMessage(tooltips.polls)}\n >\n <Icon id='tasks' fixedWidth />\n </button>\n <button\n className={selectedFilter === 'follow' ? 'active' : ''}\n onClick={this.onClick('follow')}\n title={intl.formatMessage(tooltips.follows)}\n >\n <Icon id='user-plus' fixedWidth />\n </button>\n </div>\n );\n return renderedElement;\n }\n\n}\n","import { connect } from 'react-redux';\nimport FilterBar from '../components/filter_bar';\nimport { setFilter } from '../../../actions/notifications';\n\nconst makeMapStateToProps = state => ({\n selectedFilter: state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n advancedMode: state.getIn(['settings', 'notifications', 'quickFilter', 'advanced']),\n});\n\nconst mapDispatchToProps = (dispatch) => ({\n selectFilter (newActiveFilter) {\n dispatch(setFilter(newActiveFilter));\n },\n});\n\nexport default connect(makeMapStateToProps, mapDispatchToProps)(FilterBar);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandNotifications, scrollTopNotifications, loadPending, mountNotifications, unmountNotifications } from '../../actions/notifications';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport NotificationContainer from './containers/notification_container';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport FilterBarContainer from './containers/filter_bar_container';\nimport { createSelector } from 'reselect';\nimport { List as ImmutableList } from 'immutable';\nimport { debounce } from 'lodash';\nimport ScrollableList from '../../components/scrollable_list';\nimport LoadGap from '../../components/load_gap';\n\nconst messages = defineMessages({\n title: { id: 'column.notifications', defaultMessage: 'Notifications' },\n});\n\nconst getNotifications = createSelector([\n state => state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n state => state.getIn(['settings', 'notifications', 'quickFilter', 'active']),\n state => ImmutableList(state.getIn(['settings', 'notifications', 'shows']).filter(item => !item).keys()),\n state => state.getIn(['notifications', 'items']),\n], (showFilterBar, allowedType, excludedTypes, notifications) => {\n if (!showFilterBar || allowedType === 'all') {\n // used if user changed the notification settings after loading the notifications from the server\n // otherwise a list of notifications will come pre-filtered from the backend\n // we need to turn it off for FilterBar in order not to block ourselves from seeing a specific category\n return notifications.filterNot(item => item !== null && excludedTypes.includes(item.get('type')));\n }\n return notifications.filter(item => item !== null && allowedType === item.get('type'));\n});\n\nconst mapStateToProps = state => ({\n showFilterBar: state.getIn(['settings', 'notifications', 'quickFilter', 'show']),\n notifications: getNotifications(state),\n isLoading: state.getIn(['notifications', 'isLoading'], true),\n isUnread: state.getIn(['notifications', 'unread']) > 0 || state.getIn(['notifications', 'pendingItems']).size > 0,\n hasMore: state.getIn(['notifications', 'hasMore']),\n numPending: state.getIn(['notifications', 'pendingItems'], ImmutableList()).size,\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Notifications extends React.PureComponent {\n\n static propTypes = {\n columnId: PropTypes.string,\n notifications: ImmutablePropTypes.list.isRequired,\n showFilterBar: PropTypes.bool.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n intl: PropTypes.object.isRequired,\n isLoading: PropTypes.bool,\n isUnread: PropTypes.bool,\n multiColumn: PropTypes.bool,\n hasMore: PropTypes.bool,\n numPending: PropTypes.number,\n };\n\n static defaultProps = {\n trackScroll: true,\n };\n\n componentWillMount() {\n this.props.dispatch(mountNotifications());\n }\n\n componentWillUnmount () {\n this.handleLoadOlder.cancel();\n this.handleScrollToTop.cancel();\n this.handleScroll.cancel();\n this.props.dispatch(scrollTopNotifications(false));\n this.props.dispatch(unmountNotifications());\n }\n\n handleLoadGap = (maxId) => {\n this.props.dispatch(expandNotifications({ maxId }));\n };\n\n handleLoadOlder = debounce(() => {\n const last = this.props.notifications.last();\n this.props.dispatch(expandNotifications({ maxId: last && last.get('id') }));\n }, 300, { leading: true });\n\n handleLoadPending = () => {\n this.props.dispatch(loadPending());\n };\n\n handleScrollToTop = debounce(() => {\n this.props.dispatch(scrollTopNotifications(true));\n }, 100);\n\n handleScroll = debounce(() => {\n this.props.dispatch(scrollTopNotifications(false));\n }, 100);\n\n handlePin = () => {\n const { columnId, dispatch } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('NOTIFICATIONS', {}));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setColumnRef = c => {\n this.column = c;\n }\n\n handleMoveUp = id => {\n const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) - 1;\n this._selectChild(elementIndex, true);\n }\n\n handleMoveDown = id => {\n const elementIndex = this.props.notifications.findIndex(item => item !== null && item.get('id') === id) + 1;\n this._selectChild(elementIndex, false);\n }\n\n _selectChild (index, align_top) {\n const container = this.column.node;\n const element = container.querySelector(`article:nth-of-type(${index + 1}) .focusable`);\n\n if (element) {\n if (align_top && container.scrollTop > element.offsetTop) {\n element.scrollIntoView(true);\n } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n element.scrollIntoView(false);\n }\n element.focus();\n }\n }\n\n render () {\n const { intl, notifications, shouldUpdateScroll, isLoading, isUnread, columnId, multiColumn, hasMore, numPending, showFilterBar } = this.props;\n const pinned = !!columnId;\n const emptyMessage = <FormattedMessage id='empty_column.notifications' defaultMessage=\"You don't have any notifications yet. Interact with others to start the conversation.\" />;\n\n let scrollableContent = null;\n\n const filterBarContainer = showFilterBar\n ? (<FilterBarContainer />)\n : null;\n\n if (isLoading && this.scrollableContent) {\n scrollableContent = this.scrollableContent;\n } else if (notifications.size > 0 || hasMore) {\n scrollableContent = notifications.map((item, index) => item === null ? (\n <LoadGap\n key={'gap:' + notifications.getIn([index + 1, 'id'])}\n disabled={isLoading}\n maxId={index > 0 ? notifications.getIn([index - 1, 'id']) : null}\n onClick={this.handleLoadGap}\n />\n ) : (\n <NotificationContainer\n key={item.get('id')}\n notification={item}\n accountId={item.get('account')}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n />\n ));\n } else {\n scrollableContent = null;\n }\n\n this.scrollableContent = scrollableContent;\n\n const scrollContainer = (\n <ScrollableList\n scrollKey={`notifications-${columnId}`}\n trackScroll={!pinned}\n isLoading={isLoading}\n showLoading={isLoading && notifications.size === 0}\n hasMore={hasMore}\n numPending={numPending}\n emptyMessage={emptyMessage}\n onLoadMore={this.handleLoadOlder}\n onLoadPending={this.handleLoadPending}\n onScrollToTop={this.handleScrollToTop}\n onScroll={this.handleScroll}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n >\n {scrollableContent}\n </ScrollableList>\n );\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setColumnRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='bell'\n active={isUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <ColumnSettingsContainer />\n </ColumnHeader>\n {filterBarContainer}\n {scrollContainer}\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/pinned_statuses.js b/priv/static/packs/features/pinned_statuses.js
index b5a366202..1aa2d549a 100644
--- a/priv/static/packs/features/pinned_statuses.js
+++ b/priv/static/packs/features/pinned_statuses.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{792:function(t,e,n){"use strict";n.r(e),n.d(e,"default",(function(){return y}));var s,a,o,c=n(0),i=n(2),u=n(7),r=n(1),l=n(3),d=n.n(l),p=n(13),b=n(5),h=n.n(b),f=n(14),m=n.n(f),j=n(431),O=n(731),g=n(737),w=n(1038),M=n(6),I=n(18),R=Object(M.f)({heading:{id:"column.pins",defaultMessage:"Pinned toot"}}),y=Object(p.connect)((function(t){return{statusIds:t.getIn(["status_lists","pins","items"]),hasMore:!!t.getIn(["status_lists","pins","next"])}}))(s=Object(M.g)((o=a=function(t){function e(){for(var e,n=arguments.length,s=new Array(n),a=0;a<n;a++)s[a]=arguments[a];return e=t.call.apply(t,[this].concat(s))||this,Object(r.a)(Object(i.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(r.a)(Object(i.a)(e),"setRef",(function(t){e.column=t})),e}Object(u.a)(e,t);var n=e.prototype;return n.componentWillMount=function(){this.props.dispatch(Object(j.b)())},n.render=function(){var t=this.props,e=t.intl,n=t.shouldUpdateScroll,s=t.statusIds,a=t.hasMore,o=t.multiColumn;return d.a.createElement(O.a,{bindToDocument:!o,icon:"thumb-tack",heading:e.formatMessage(R.heading),ref:this.setRef},Object(c.a)(g.a,{}),Object(c.a)(w.a,{statusIds:s,scrollKey:"pinned_statuses",hasMore:a,shouldUpdateScroll:n,bindToDocument:!o}))},e}(I.a),Object(r.a)(a,"propTypes",{dispatch:h.a.func.isRequired,shouldUpdateScroll:h.a.func,statusIds:m.a.list.isRequired,intl:h.a.object.isRequired,hasMore:h.a.bool.isRequired,multiColumn:h.a.bool}),s=o))||s)||s}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{818:function(t,e,n){"use strict";n.r(e),n.d(e,"default",(function(){return R}));var s,a,o,c=n(0),i=n(2),u=(n(9),n(6),n(8)),r=n(1),l=n(3),d=n.n(l),p=n(15),b=n(5),h=n.n(b),f=n(16),m=n.n(f),j=n(434),O=n(757),g=n(763),w=n(1065),M=n(7),v=n(21);var I=Object(M.f)({heading:{id:"column.pins",defaultMessage:"Pinned toot"}}),R=Object(p.connect)((function(t){return{statusIds:t.getIn(["status_lists","pins","items"]),hasMore:!!t.getIn(["status_lists","pins","next"])}}))(s=Object(M.g)((o=a=function(t){Object(u.a)(n,t);var e;e=n;function n(){for(var e,n=arguments.length,s=new Array(n),a=0;a<n;a++)s[a]=arguments[a];return e=t.call.apply(t,[this].concat(s))||this,Object(r.a)(Object(i.a)(e),"handleHeaderClick",(function(){e.column.scrollTop()})),Object(r.a)(Object(i.a)(e),"setRef",(function(t){e.column=t})),e}var s=n.prototype;return s.componentWillMount=function(){this.props.dispatch(Object(j.b)())},s.render=function(){var t=this.props,e=t.intl,n=t.shouldUpdateScroll,s=t.statusIds,a=t.hasMore,o=t.multiColumn;return(d.a.createElement(O.a,{bindToDocument:!o,icon:"thumb-tack",heading:e.formatMessage(I.heading),ref:this.setRef},Object(c.a)(g.a,{}),Object(c.a)(w.a,{statusIds:s,scrollKey:"pinned_statuses",hasMore:a,shouldUpdateScroll:n,bindToDocument:!o})))},n}(v.a),Object(r.a)(a,"propTypes",{dispatch:h.a.func.isRequired,shouldUpdateScroll:h.a.func,statusIds:m.a.list.isRequired,intl:h.a.object.isRequired,hasMore:h.a.bool.isRequired,multiColumn:h.a.bool}),s=o))||s)||s}}]);
//# sourceMappingURL=pinned_statuses.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/pinned_statuses.js.map b/priv/static/packs/features/pinned_statuses.js.map
index 2920e023c..898fcfd27 100644
--- a/priv/static/packs/features/pinned_statuses.js.map
+++ b/priv/static/packs/features/pinned_statuses.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/pinned_statuses/index.js"],"names":["messages","defineMessages","heading","PinnedStatuses","connect","state","statusIds","getIn","hasMore","injectIntl","column","scrollTop","c","componentWillMount","this","props","dispatch","fetchPinnedStatuses","render","intl","shouldUpdateScroll","multiColumn","bindToDocument","icon","formatMessage","ref","setRef","scrollKey","ImmutablePureComponent","PropTypes","func","isRequired","ImmutablePropTypes","list","object","bool"],"mappings":"6RAWMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,iDAUHC,EAFUC,mBALQ,SAAAC,GAAK,MAAK,CAChCC,UAAWD,EAAME,MAAM,CAAC,eAAgB,OAAQ,UAChDC,UAAWH,EAAME,MAAM,CAAC,eAAgB,OAAQ,Y,GAIjDE,a,uMAgBqB,WAClB,EAAKC,OAAOC,e,qCAGL,SAAAC,GACP,EAAKF,OAASE,K,8CAThBC,mBAAA,WACEC,KAAKC,MAAMC,SAASC,gB,EAWtBC,OAAA,WAAW,IAAD,EAC8DJ,KAAKC,MAAnEI,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBd,EAD1B,EAC0BA,UAAWE,EADrC,EACqCA,QAASa,EAD9C,EAC8CA,YAEtD,OACE,kBAAC,IAAD,CAAQC,gBAAiBD,EAAaE,KAAK,aAAarB,QAASiB,EAAKK,cAAcxB,EAASE,SAAUuB,IAAKX,KAAKY,QAC/G,YAAC,IAAD,IACA,YAAC,IAAD,CACEpB,UAAWA,EACXqB,UAAU,kBACVnB,QAASA,EACTY,mBAAoBA,EACpBE,gBAAiBD,M,GAlCEO,K,0BAER,CACjBZ,SAAUa,IAAUC,KAAKC,WACzBX,mBAAoBS,IAAUC,KAC9BxB,UAAW0B,IAAmBC,KAAKF,WACnCZ,KAAMU,IAAUK,OAAOH,WACvBvB,QAASqB,IAAUM,KAAKJ,WACxBV,YAAaQ,IAAUM,O","file":"features/pinned_statuses.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { fetchPinnedStatuses } from '../../actions/pin_statuses';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport StatusList from '../../components/status_list';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n heading: { id: 'column.pins', defaultMessage: 'Pinned toot' },\n});\n\nconst mapStateToProps = state => ({\n statusIds: state.getIn(['status_lists', 'pins', 'items']),\n hasMore: !!state.getIn(['status_lists', 'pins', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass PinnedStatuses extends ImmutablePureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n statusIds: ImmutablePropTypes.list.isRequired,\n intl: PropTypes.object.isRequired,\n hasMore: PropTypes.bool.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchPinnedStatuses());\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n render () {\n const { intl, shouldUpdateScroll, statusIds, hasMore, multiColumn } = this.props;\n\n return (\n <Column bindToDocument={!multiColumn} icon='thumb-tack' heading={intl.formatMessage(messages.heading)} ref={this.setRef}>\n <ColumnBackButtonSlim />\n <StatusList\n statusIds={statusIds}\n scrollKey='pinned_statuses'\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/pinned_statuses/index.js"],"names":["messages","defineMessages","heading","PinnedStatuses","connect","state","statusIds","getIn","hasMore","injectIntl","column","scrollTop","c","componentWillMount","this","props","dispatch","fetchPinnedStatuses","render","intl","shouldUpdateScroll","multiColumn","bindToDocument","icon","formatMessage","ref","setRef","scrollKey","ImmutablePureComponent","PropTypes","func","isRequired","ImmutablePropTypes","list","object","bool"],"mappings":"ySAWA,IAAMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,iDAUHC,EAFUC,mBALQ,SAAAC,GAAK,MAAK,CAChCC,UAAWD,EAAME,MAAM,CAAC,eAAgB,OAAQ,UAChDC,UAAWH,EAAME,MAAM,CAAC,eAAgB,OAAQ,Y,GAIjDE,a,kOAgBqB,WAClB,EAAKC,OAAOC,e,qCAGL,SAAAC,GACP,EAAKF,OAASE,K,6BAThBC,mBAAA,WACEC,KAAKC,MAAMC,SAASC,gB,EAWtBC,OAAA,WAAW,IAAD,EAC8DJ,KAAKC,MAAnEI,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBd,EAD1B,EAC0BA,UAAWE,EADrC,EACqCA,QAASa,EAD9C,EAC8CA,YAEtD,OACE,kBAAC,IAAD,CAAQC,gBAAiBD,EAAaE,KAAK,aAAarB,QAASiB,EAAKK,cAAcxB,EAASE,SAAUuB,IAAKX,KAAKY,QAC/G,YAAC,IAAD,IACA,YAAC,IAAD,CACEpB,UAAWA,EACXqB,UAAU,kBACVnB,QAASA,EACTY,mBAAoBA,EACpBE,gBAAiBD,O,GAlCEO,K,0BAER,CACjBZ,SAAUa,IAAUC,KAAKC,WACzBX,mBAAoBS,IAAUC,KAC9BxB,UAAW0B,IAAmBC,KAAKF,WACnCZ,KAAMU,IAAUK,OAAOH,WACvBvB,QAASqB,IAAUM,KAAKJ,WACxBV,YAAaQ,IAAUM,O","file":"features/pinned_statuses.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { fetchPinnedStatuses } from '../../actions/pin_statuses';\nimport Column from '../ui/components/column';\nimport ColumnBackButtonSlim from '../../components/column_back_button_slim';\nimport StatusList from '../../components/status_list';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\n\nconst messages = defineMessages({\n heading: { id: 'column.pins', defaultMessage: 'Pinned toot' },\n});\n\nconst mapStateToProps = state => ({\n statusIds: state.getIn(['status_lists', 'pins', 'items']),\n hasMore: !!state.getIn(['status_lists', 'pins', 'next']),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass PinnedStatuses extends ImmutablePureComponent {\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n statusIds: ImmutablePropTypes.list.isRequired,\n intl: PropTypes.object.isRequired,\n hasMore: PropTypes.bool.isRequired,\n multiColumn: PropTypes.bool,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchPinnedStatuses());\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n setRef = c => {\n this.column = c;\n }\n\n render () {\n const { intl, shouldUpdateScroll, statusIds, hasMore, multiColumn } = this.props;\n\n return (\n <Column bindToDocument={!multiColumn} icon='thumb-tack' heading={intl.formatMessage(messages.heading)} ref={this.setRef}>\n <ColumnBackButtonSlim />\n <StatusList\n statusIds={statusIds}\n scrollKey='pinned_statuses'\n hasMore={hasMore}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/public_timeline.js b/priv/static/packs/features/public_timeline.js
index eb800e73e..a32594de9 100644
--- a/priv/static/packs/features/public_timeline.js
+++ b/priv/static/packs/features/public_timeline.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{834:function(e,t,n){"use strict";n.r(t);var o,i,c,a=n(0),l=n(2),d=n(7),r=n(1),s=n(3),u=n.n(s),p=n(13),b=n(6),h=n(5),m=n.n(h),f=n(1036),j=n(736),O=n(733),g=n(33),M=n(250),y=n(1139),v=n(70),I=Object(p.connect)((function(e,t){var n=t.columnId,o=e.getIn(["settings","columns"]),i=o.findIndex((function(e){return e.get("uuid")===n}));return{settings:n&&i>=0?o.get(i).get("params"):e.getIn(["settings","public"])}}),(function(e,t){var n=t.columnId;return{onChange:function(t,o){e(n?Object(M.f)(n,t,o):Object(v.c)(["public"].concat(t),o))}}}))(y.a),w=n(740);n.d(t,"default",(function(){return U}));var C=Object(b.f)({title:{id:"column.public",defaultMessage:"Federated timeline"}}),U=Object(p.connect)((function(e,t){var n=t.columnId,o=n,i=e.getIn(["settings","columns"]),c=i.findIndex((function(e){return e.get("uuid")===o})),a=n&&c>=0?i.get(c).getIn(["params","other","onlyMedia"]):e.getIn(["settings","public","other","onlyMedia"]),l=e.getIn(["timelines","public"+(a?":media":"")]);return{hasUnread:!!l&&l.get("unread")>0,onlyMedia:a}}))(o=Object(b.g)((c=i=function(e){function t(){for(var t,n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];return t=e.call.apply(e,[this].concat(o))||this,Object(r.a)(Object(l.a)(t),"handlePin",(function(){var e=t.props,n=e.columnId,o=e.dispatch,i=e.onlyMedia;o(n?Object(M.h)(n):Object(M.e)("PUBLIC",{other:{onlyMedia:i}}))})),Object(r.a)(Object(l.a)(t),"handleMove",(function(e){var n=t.props,o=n.columnId;(0,n.dispatch)(Object(M.g)(o,e))})),Object(r.a)(Object(l.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(r.a)(Object(l.a)(t),"setRef",(function(e){t.column=e})),Object(r.a)(Object(l.a)(t),"handleLoadMore",(function(e){var n=t.props,o=n.dispatch,i=n.onlyMedia;o(Object(g.v)({maxId:e,onlyMedia:i}))})),t}Object(d.a)(t,e);var n=t.prototype;return n.componentDidMount=function(){var e=this.props,t=e.dispatch,n=e.onlyMedia;t(Object(g.v)({onlyMedia:n})),this.disconnect=t(Object(w.e)({onlyMedia:n}))},n.componentDidUpdate=function(e){if(e.onlyMedia!==this.props.onlyMedia){var t=this.props,n=t.dispatch,o=t.onlyMedia;this.disconnect(),n(Object(g.v)({onlyMedia:o})),this.disconnect=n(Object(w.e)({onlyMedia:o}))}},n.componentWillUnmount=function(){this.disconnect&&(this.disconnect(),this.disconnect=null)},n.render=function(){var e=this.props,t=e.intl,n=e.shouldUpdateScroll,o=e.columnId,i=e.hasUnread,c=e.multiColumn,l=e.onlyMedia,d=!!o;return u.a.createElement(j.a,{bindToDocument:!c,ref:this.setRef,label:t.formatMessage(C.title)},Object(a.a)(O.a,{icon:"globe",active:i,title:t.formatMessage(C.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:d,multiColumn:c},void 0,Object(a.a)(I,{columnId:o})),Object(a.a)(f.a,{timelineId:"public"+(l?":media":""),onLoadMore:this.handleLoadMore,trackScroll:!d,scrollKey:"public_timeline-"+o,emptyMessage:Object(a.a)(b.b,{id:"empty_column.public",defaultMessage:"There is nothing here! Write something publicly, or manually follow users from other servers to fill it up"}),shouldUpdateScroll:n,bindToDocument:!c}))},t}(u.a.PureComponent),Object(r.a)(i,"contextTypes",{router:m.a.object}),Object(r.a)(i,"defaultProps",{onlyMedia:!1}),o=c))||o)||o}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{860:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return U}));var o,i,c,a=n(0),l=n(2),d=(n(9),n(6),n(8)),r=n(1),s=n(3),u=n.n(s),p=n(15),b=n(7),h=n(5),m=n.n(h),f=n(1063),j=n(762),O=n(759),g=n(36),M=n(253),y=n(1172),v=n(74),I=Object(p.connect)((function(e,t){var n=t.columnId,o=e.getIn(["settings","columns"]),i=o.findIndex((function(e){return e.get("uuid")===n}));return{settings:n&&i>=0?o.get(i).get("params"):e.getIn(["settings","public"])}}),(function(e,t){var n=t.columnId;return{onChange:function(t,o){e(n?Object(M.f)(n,t,o):Object(v.c)(["public"].concat(t),o))}}}))(y.a),w=n(766);var C=Object(b.f)({title:{id:"column.public",defaultMessage:"Federated timeline"}}),U=Object(p.connect)((function(e,t){var n=t.columnId,o=n,i=e.getIn(["settings","columns"]),c=i.findIndex((function(e){return e.get("uuid")===o})),a=n&&c>=0?i.get(c).getIn(["params","other","onlyMedia"]):e.getIn(["settings","public","other","onlyMedia"]),l=e.getIn(["timelines","public"+(a?":media":"")]);return{hasUnread:!!l&&l.get("unread")>0,onlyMedia:a}}))(o=Object(b.g)((c=i=function(e){Object(d.a)(n,e);var t;t=n;function n(){for(var t,n=arguments.length,o=new Array(n),i=0;i<n;i++)o[i]=arguments[i];return t=e.call.apply(e,[this].concat(o))||this,Object(r.a)(Object(l.a)(t),"handlePin",(function(){var e=t.props,n=e.columnId,o=e.dispatch,i=e.onlyMedia;o(n?Object(M.h)(n):Object(M.e)("PUBLIC",{other:{onlyMedia:i}}))})),Object(r.a)(Object(l.a)(t),"handleMove",(function(e){var n=t.props,o=n.columnId;(0,n.dispatch)(Object(M.g)(o,e))})),Object(r.a)(Object(l.a)(t),"handleHeaderClick",(function(){t.column.scrollTop()})),Object(r.a)(Object(l.a)(t),"setRef",(function(e){t.column=e})),Object(r.a)(Object(l.a)(t),"handleLoadMore",(function(e){var n=t.props,o=n.dispatch,i=n.onlyMedia;o(Object(g.v)({maxId:e,onlyMedia:i}))})),t}var o=n.prototype;return o.componentDidMount=function(){var e=this.props,t=e.dispatch,n=e.onlyMedia;t(Object(g.v)({onlyMedia:n})),this.disconnect=t(Object(w.e)({onlyMedia:n}))},o.componentDidUpdate=function(e){if(e.onlyMedia!==this.props.onlyMedia){var t=this.props,n=t.dispatch,o=t.onlyMedia;this.disconnect(),n(Object(g.v)({onlyMedia:o})),this.disconnect=n(Object(w.e)({onlyMedia:o}))}},o.componentWillUnmount=function(){this.disconnect&&(this.disconnect(),this.disconnect=null)},o.render=function(){var e=this.props,t=e.intl,n=e.shouldUpdateScroll,o=e.columnId,i=e.hasUnread,c=e.multiColumn,l=e.onlyMedia,d=!!o;return u.a.createElement(j.a,{bindToDocument:!c,ref:this.setRef,label:t.formatMessage(C.title)},Object(a.a)(O.a,{icon:"globe",active:i,title:t.formatMessage(C.title),onPin:this.handlePin,onMove:this.handleMove,onClick:this.handleHeaderClick,pinned:d,multiColumn:c},void 0,Object(a.a)(I,{columnId:o})),Object(a.a)(f.a,{timelineId:"public"+(l?":media":""),onLoadMore:this.handleLoadMore,trackScroll:!d,scrollKey:"public_timeline-"+o,emptyMessage:Object(a.a)(b.b,{id:"empty_column.public",defaultMessage:"There is nothing here! Write something publicly, or manually follow users from other servers to fill it up"}),shouldUpdateScroll:n,bindToDocument:!c}))},n}(u.a.PureComponent),Object(r.a)(i,"contextTypes",{router:m.a.object}),Object(r.a)(i,"defaultProps",{onlyMedia:!1}),o=c))||o)||o}}]);
//# sourceMappingURL=public_timeline.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/public_timeline.js.map b/priv/static/packs/features/public_timeline.js.map
index eb39bab9d..92bd1de46 100644
--- a/priv/static/packs/features/public_timeline.js.map
+++ b/priv/static/packs/features/public_timeline.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/public_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/public_timeline/index.js"],"names":["connect","state","uuid","columnId","columns","getIn","index","findIndex","c","get","settings","dispatch","onChange","key","checked","changeColumnParams","changeSetting","ColumnSettings","messages","defineMessages","title","PublicTimeline","onlyMedia","timelineState","hasUnread","injectIntl","props","removeColumn","addColumn","other","dir","moveColumn","column","scrollTop","maxId","expandPublicTimeline","componentDidMount","this","disconnect","connectPublicStream","componentDidUpdate","prevProps","componentWillUnmount","render","intl","shouldUpdateScroll","multiColumn","pinned","bindToDocument","ref","setRef","label","formatMessage","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","timelineId","onLoadMore","handleLoadMore","trackScroll","scrollKey","emptyMessage","id","defaultMessage","React","PureComponent","router","PropTypes","object"],"mappings":"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","file":"features/public_timeline.js","sourcesContent":["import { connect } from 'react-redux';\nimport ColumnSettings from '../../community_timeline/components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { changeColumnParams } from '../../../actions/columns';\n\nconst mapStateToProps = (state, { columnId }) => {\n const uuid = columnId;\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === uuid);\n\n return {\n settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'public']),\n };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => {\n return {\n onChange (key, checked) {\n if (columnId) {\n dispatch(changeColumnParams(columnId, key, checked));\n } else {\n dispatch(changeSetting(['public', ...key], checked));\n }\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandPublicTimeline } from '../../actions/timelines';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { connectPublicStream } from '../../actions/streaming';\n\nconst messages = defineMessages({\n title: { id: 'column.public', defaultMessage: 'Federated timeline' },\n});\n\nconst mapStateToProps = (state, { columnId }) => {\n const uuid = columnId;\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === uuid);\n const onlyMedia = (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'public', 'other', 'onlyMedia']);\n const timelineState = state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`]);\n\n return {\n hasUnread: !!timelineState && timelineState.get('unread') > 0,\n onlyMedia,\n };\n};\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass PublicTimeline extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static defaultProps = {\n onlyMedia: false,\n };\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n intl: PropTypes.object.isRequired,\n columnId: PropTypes.string,\n multiColumn: PropTypes.bool,\n hasUnread: PropTypes.bool,\n onlyMedia: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch, onlyMedia } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('PUBLIC', { other: { onlyMedia } }));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch, onlyMedia } = this.props;\n\n dispatch(expandPublicTimeline({ onlyMedia }));\n this.disconnect = dispatch(connectPublicStream({ onlyMedia }));\n }\n\n componentDidUpdate (prevProps) {\n if (prevProps.onlyMedia !== this.props.onlyMedia) {\n const { dispatch, onlyMedia } = this.props;\n\n this.disconnect();\n dispatch(expandPublicTimeline({ onlyMedia }));\n this.disconnect = dispatch(connectPublicStream({ onlyMedia }));\n }\n }\n\n componentWillUnmount () {\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n const { dispatch, onlyMedia } = this.props;\n\n dispatch(expandPublicTimeline({ maxId, onlyMedia }));\n }\n\n render () {\n const { intl, shouldUpdateScroll, columnId, hasUnread, multiColumn, onlyMedia } = this.props;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='globe'\n active={hasUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <ColumnSettingsContainer columnId={columnId} />\n </ColumnHeader>\n\n <StatusListContainer\n timelineId={`public${onlyMedia ? ':media' : ''}`}\n onLoadMore={this.handleLoadMore}\n trackScroll={!pinned}\n scrollKey={`public_timeline-${columnId}`}\n emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up' />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/public_timeline/containers/column_settings_container.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/public_timeline/index.js"],"names":["connect","state","uuid","columnId","columns","getIn","index","findIndex","c","get","settings","dispatch","onChange","key","checked","changeColumnParams","changeSetting","ColumnSettings","messages","defineMessages","title","PublicTimeline","onlyMedia","timelineState","hasUnread","injectIntl","props","removeColumn","addColumn","other","dir","moveColumn","column","scrollTop","maxId","expandPublicTimeline","componentDidMount","this","disconnect","connectPublicStream","componentDidUpdate","prevProps","componentWillUnmount","render","intl","shouldUpdateScroll","multiColumn","pinned","bindToDocument","ref","setRef","label","formatMessage","icon","active","onPin","handlePin","onMove","handleMove","onClick","handleHeaderClick","timelineId","onLoadMore","handleLoadMore","trackScroll","scrollKey","emptyMessage","id","defaultMessage","React","PureComponent","router","PropTypes","object"],"mappings":"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","file":"features/public_timeline.js","sourcesContent":["import { connect } from 'react-redux';\nimport ColumnSettings from '../../community_timeline/components/column_settings';\nimport { changeSetting } from '../../../actions/settings';\nimport { changeColumnParams } from '../../../actions/columns';\n\nconst mapStateToProps = (state, { columnId }) => {\n const uuid = columnId;\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === uuid);\n\n return {\n settings: (uuid && index >= 0) ? columns.get(index).get('params') : state.getIn(['settings', 'public']),\n };\n};\n\nconst mapDispatchToProps = (dispatch, { columnId }) => {\n return {\n onChange (key, checked) {\n if (columnId) {\n dispatch(changeColumnParams(columnId, key, checked));\n } else {\n dispatch(changeSetting(['public', ...key], checked));\n }\n },\n };\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(ColumnSettings);\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport PropTypes from 'prop-types';\nimport StatusListContainer from '../ui/containers/status_list_container';\nimport Column from '../../components/column';\nimport ColumnHeader from '../../components/column_header';\nimport { expandPublicTimeline } from '../../actions/timelines';\nimport { addColumn, removeColumn, moveColumn } from '../../actions/columns';\nimport ColumnSettingsContainer from './containers/column_settings_container';\nimport { connectPublicStream } from '../../actions/streaming';\n\nconst messages = defineMessages({\n title: { id: 'column.public', defaultMessage: 'Federated timeline' },\n});\n\nconst mapStateToProps = (state, { columnId }) => {\n const uuid = columnId;\n const columns = state.getIn(['settings', 'columns']);\n const index = columns.findIndex(c => c.get('uuid') === uuid);\n const onlyMedia = (columnId && index >= 0) ? columns.get(index).getIn(['params', 'other', 'onlyMedia']) : state.getIn(['settings', 'public', 'other', 'onlyMedia']);\n const timelineState = state.getIn(['timelines', `public${onlyMedia ? ':media' : ''}`]);\n\n return {\n hasUnread: !!timelineState && timelineState.get('unread') > 0,\n onlyMedia,\n };\n};\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass PublicTimeline extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static defaultProps = {\n onlyMedia: false,\n };\n\n static propTypes = {\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n intl: PropTypes.object.isRequired,\n columnId: PropTypes.string,\n multiColumn: PropTypes.bool,\n hasUnread: PropTypes.bool,\n onlyMedia: PropTypes.bool,\n };\n\n handlePin = () => {\n const { columnId, dispatch, onlyMedia } = this.props;\n\n if (columnId) {\n dispatch(removeColumn(columnId));\n } else {\n dispatch(addColumn('PUBLIC', { other: { onlyMedia } }));\n }\n }\n\n handleMove = (dir) => {\n const { columnId, dispatch } = this.props;\n dispatch(moveColumn(columnId, dir));\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n componentDidMount () {\n const { dispatch, onlyMedia } = this.props;\n\n dispatch(expandPublicTimeline({ onlyMedia }));\n this.disconnect = dispatch(connectPublicStream({ onlyMedia }));\n }\n\n componentDidUpdate (prevProps) {\n if (prevProps.onlyMedia !== this.props.onlyMedia) {\n const { dispatch, onlyMedia } = this.props;\n\n this.disconnect();\n dispatch(expandPublicTimeline({ onlyMedia }));\n this.disconnect = dispatch(connectPublicStream({ onlyMedia }));\n }\n }\n\n componentWillUnmount () {\n if (this.disconnect) {\n this.disconnect();\n this.disconnect = null;\n }\n }\n\n setRef = c => {\n this.column = c;\n }\n\n handleLoadMore = maxId => {\n const { dispatch, onlyMedia } = this.props;\n\n dispatch(expandPublicTimeline({ maxId, onlyMedia }));\n }\n\n render () {\n const { intl, shouldUpdateScroll, columnId, hasUnread, multiColumn, onlyMedia } = this.props;\n const pinned = !!columnId;\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setRef} label={intl.formatMessage(messages.title)}>\n <ColumnHeader\n icon='globe'\n active={hasUnread}\n title={intl.formatMessage(messages.title)}\n onPin={this.handlePin}\n onMove={this.handleMove}\n onClick={this.handleHeaderClick}\n pinned={pinned}\n multiColumn={multiColumn}\n >\n <ColumnSettingsContainer columnId={columnId} />\n </ColumnHeader>\n\n <StatusListContainer\n timelineId={`public${onlyMedia ? ':media' : ''}`}\n onLoadMore={this.handleLoadMore}\n trackScroll={!pinned}\n scrollKey={`public_timeline-${columnId}`}\n emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up' />}\n shouldUpdateScroll={shouldUpdateScroll}\n bindToDocument={!multiColumn}\n />\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/reblogs.js b/priv/static/packs/features/reblogs.js
index d8598f305..857ed6a60 100644
--- a/priv/static/packs/features/reblogs.js
+++ b/priv/static/packs/features/reblogs.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{796:function(t,e,s){"use strict";s.r(e),s.d(e,"default",(function(){return M}));var a,o,r,n=s(0),c=s(2),i=s(7),u=s(1),p=(s(3),s(13)),d=s(18),l=s(5),h=s.n(l),b=s(14),f=s.n(b),m=s(300),j=s(45),O=s(6),g=s(1026),I=s(731),w=s(1023),v=s(26),y=s(733),R=Object(O.f)({refresh:{id:"refresh",defaultMessage:"Refresh"}}),M=Object(p.connect)((function(t,e){return{accountIds:t.getIn(["user_lists","reblogged_by",e.params.statusId])}}))(a=Object(O.g)((r=o=function(t){function e(){for(var e,s=arguments.length,a=new Array(s),o=0;o<s;o++)a[o]=arguments[o];return e=t.call.apply(t,[this].concat(a))||this,Object(u.a)(Object(c.a)(e),"handleRefresh",(function(){e.props.dispatch(Object(j.r)(e.props.params.statusId))})),e}Object(i.a)(e,t);var s=e.prototype;return s.componentWillMount=function(){this.props.accountIds||this.props.dispatch(Object(j.r)(this.props.params.statusId))},s.componentWillReceiveProps=function(t){t.params.statusId!==this.props.params.statusId&&t.params.statusId&&this.props.dispatch(Object(j.r)(t.params.statusId))},s.render=function(){var t=this.props,e=t.intl,s=t.shouldUpdateScroll,a=t.accountIds,o=t.multiColumn;if(!a)return Object(n.a)(I.a,{},void 0,Object(n.a)(m.a,{}));var r=Object(n.a)(O.b,{id:"status.reblogs.empty",defaultMessage:"No one has boosted this toot yet. When someone does, they will show up here."});return Object(n.a)(I.a,{bindToDocument:!o},void 0,Object(n.a)(y.a,{showBackButton:!0,multiColumn:o,extraButton:Object(n.a)("button",{className:"column-header__button",title:e.formatMessage(R.refresh),"aria-label":e.formatMessage(R.refresh),onClick:this.handleRefresh},void 0,Object(n.a)(v.a,{id:"refresh"}))}),Object(n.a)(w.a,{scrollKey:"reblogs",shouldUpdateScroll:s,emptyMessage:r,bindToDocument:!o},void 0,a.map((function(t){return Object(n.a)(g.a,{id:t,withNote:!1},t)}))))},e}(d.a),Object(u.a)(o,"propTypes",{params:h.a.object.isRequired,dispatch:h.a.func.isRequired,shouldUpdateScroll:h.a.func,accountIds:f.a.list,multiColumn:h.a.bool,intl:h.a.object.isRequired}),a=r))||a)||a}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{822:function(t,e,a){"use strict";a.r(e),a.d(e,"default",(function(){return M}));var s,o,r,n=a(0),c=a(2),i=(a(9),a(6),a(8)),u=a(1),p=(a(3),a(15)),d=a(21),l=a(5),h=a.n(l),b=a(16),f=a.n(b),m=a(306),j=a(46),O=a(7),g=a(1053),v=a(757),I=a(1049),w=a(27),y=a(759);var R=Object(O.f)({refresh:{id:"refresh",defaultMessage:"Refresh"}}),M=Object(p.connect)((function(t,e){return{accountIds:t.getIn(["user_lists","reblogged_by",e.params.statusId])}}))(s=Object(O.g)((r=o=function(t){Object(i.a)(a,t);var e;e=a;function a(){for(var e,a=arguments.length,s=new Array(a),o=0;o<a;o++)s[o]=arguments[o];return e=t.call.apply(t,[this].concat(s))||this,Object(u.a)(Object(c.a)(e),"handleRefresh",(function(){e.props.dispatch(Object(j.r)(e.props.params.statusId))})),e}var s=a.prototype;return s.componentWillMount=function(){this.props.accountIds||this.props.dispatch(Object(j.r)(this.props.params.statusId))},s.componentWillReceiveProps=function(t){t.params.statusId!==this.props.params.statusId&&t.params.statusId&&this.props.dispatch(Object(j.r)(t.params.statusId))},s.render=function(){var t=this.props,e=t.intl,a=t.shouldUpdateScroll,s=t.accountIds,o=t.multiColumn;if(!s)return Object(n.a)(v.a,{},void 0,Object(n.a)(m.a,{}));var r=Object(n.a)(O.b,{id:"status.reblogs.empty",defaultMessage:"No one has boosted this toot yet. When someone does, they will show up here."});return(Object(n.a)(v.a,{bindToDocument:!o},void 0,Object(n.a)(y.a,{showBackButton:!0,multiColumn:o,extraButton:Object(n.a)("button",{className:"column-header__button",title:e.formatMessage(R.refresh),"aria-label":e.formatMessage(R.refresh),onClick:this.handleRefresh},void 0,Object(n.a)(w.a,{id:"refresh"}))}),Object(n.a)(I.a,{scrollKey:"reblogs",shouldUpdateScroll:a,emptyMessage:r,bindToDocument:!o},void 0,s.map((function(t){return Object(n.a)(g.a,{id:t,withNote:!1},t)})))))},a}(d.a),Object(u.a)(o,"propTypes",{params:h.a.object.isRequired,dispatch:h.a.func.isRequired,shouldUpdateScroll:h.a.func,accountIds:f.a.list,multiColumn:h.a.bool,intl:h.a.object.isRequired}),s=r))||s)||s}}]);
//# sourceMappingURL=reblogs.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/reblogs.js.map b/priv/static/packs/features/reblogs.js.map
index ec193dd4f..211b4a843 100644
--- a/priv/static/packs/features/reblogs.js.map
+++ b/priv/static/packs/features/reblogs.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/reblogs/index.js"],"names":["messages","defineMessages","refresh","Reblogs","connect","state","props","accountIds","getIn","params","statusId","injectIntl","dispatch","fetchReblogs","componentWillMount","this","componentWillReceiveProps","nextProps","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","showBackButton","extraButton","className","title","formatMessage","aria-label","onClick","handleRefresh","scrollKey","map","withNote","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"8SAcMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,yCASHC,EAFUC,mBAJQ,SAACC,EAAOC,GAAR,MAAmB,CACzCC,WAAYF,EAAMG,MAAM,CAAC,aAAc,eAAgBF,EAAMG,OAAOC,c,GAIrEC,a,mMAwBiB,WACd,EAAKL,MAAMM,SAASC,YAAa,EAAKP,MAAMG,OAAOC,c,8CAbrDI,mBAAA,WACOC,KAAKT,MAAMC,YACdQ,KAAKT,MAAMM,SAASC,YAAaE,KAAKT,MAAMG,OAAOC,Y,EAIvDM,0BAAA,SAA0BC,GACpBA,EAAUR,OAAOC,WAAaK,KAAKT,MAAMG,OAAOC,UAAYO,EAAUR,OAAOC,UAC/EK,KAAKT,MAAMM,SAASC,YAAaI,EAAUR,OAAOC,Y,EAQtDQ,OAAA,WAAW,IAAD,EACsDH,KAAKT,MAA3Da,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBb,EAD1B,EAC0BA,WAAYc,EADtC,EACsCA,YAE9C,IAAKd,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAe,YAAC,IAAD,CAAkBC,GAAG,uBAAuBC,eAAe,iFAEhF,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,QAAzB,EACE,YAAC,IAAD,CACEK,gBAAc,EACdL,YAAaA,EACbM,YACE,sBAAQC,UAAU,wBAAwBC,MAAOV,EAAKW,cAAc9B,EAASE,SAAU6B,aAAYZ,EAAKW,cAAc9B,EAASE,SAAU8B,QAASjB,KAAKkB,oBAAvJ,EAAsK,YAAC,IAAD,CAAMV,GAAG,eAInL,YAAC,IAAD,CACEW,UAAU,UACVd,mBAAoBA,EACpBE,aAAcA,EACdG,gBAAiBJ,QAJnB,EAMGd,EAAW4B,KAAI,SAAAZ,GAAE,OAChB,YAAC,IAAD,CAA2BA,GAAIA,EAAIa,UAAU,GAAtBb,S,GAzDbc,K,0BAED,CACjB5B,OAAQ6B,IAAUC,OAAOC,WACzB5B,SAAU0B,IAAUG,KAAKD,WACzBpB,mBAAoBkB,IAAUG,KAC9BlC,WAAYmC,IAAmBC,KAC/BtB,YAAaiB,IAAUM,KACvBzB,KAAMmB,IAAUC,OAAOC,a","file":"features/reblogs.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport { fetchReblogs } from '../../actions/interactions';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport AccountContainer from '../../containers/account_container';\nimport Column from '../ui/components/column';\nimport ScrollableList from '../../components/scrollable_list';\nimport Icon from 'mastodon/components/icon';\nimport ColumnHeader from '../../components/column_header';\n\nconst messages = defineMessages({\n refresh: { id: 'refresh', defaultMessage: 'Refresh' },\n});\n\nconst mapStateToProps = (state, props) => ({\n accountIds: state.getIn(['user_lists', 'reblogged_by', props.params.statusId]),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Reblogs extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n multiColumn: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n };\n\n componentWillMount () {\n if (!this.props.accountIds) {\n this.props.dispatch(fetchReblogs(this.props.params.statusId));\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {\n this.props.dispatch(fetchReblogs(nextProps.params.statusId));\n }\n }\n\n handleRefresh = () => {\n this.props.dispatch(fetchReblogs(this.props.params.statusId));\n }\n\n render () {\n const { intl, shouldUpdateScroll, accountIds, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='status.reblogs.empty' defaultMessage='No one has boosted this toot yet. When someone does, they will show up here.' />;\n\n return (\n <Column bindToDocument={!multiColumn}>\n <ColumnHeader\n showBackButton\n multiColumn={multiColumn}\n extraButton={(\n <button className='column-header__button' title={intl.formatMessage(messages.refresh)} aria-label={intl.formatMessage(messages.refresh)} onClick={this.handleRefresh}><Icon id='refresh' /></button>\n )}\n />\n\n <ScrollableList\n scrollKey='reblogs'\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountContainer key={id} id={id} withNote={false} />\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/reblogs/index.js"],"names":["messages","defineMessages","refresh","Reblogs","connect","state","props","accountIds","getIn","params","statusId","injectIntl","dispatch","fetchReblogs","componentWillMount","this","componentWillReceiveProps","nextProps","render","intl","shouldUpdateScroll","multiColumn","emptyMessage","id","defaultMessage","bindToDocument","showBackButton","extraButton","className","title","formatMessage","aria-label","onClick","handleRefresh","scrollKey","map","withNote","ImmutablePureComponent","PropTypes","object","isRequired","func","ImmutablePropTypes","list","bool"],"mappings":"0TAcA,IAAMA,EAAWC,YAAe,CAC9BC,QAAQ,CAAD,yCASHC,EAFUC,mBAJQ,SAACC,EAAOC,GAAR,MAAmB,CACzCC,WAAYF,EAAMG,MAAM,CAAC,aAAc,eAAgBF,EAAMG,OAAOC,c,GAIrEC,a,8NAwBiB,WACd,EAAKL,MAAMM,SAASC,YAAa,EAAKP,MAAMG,OAAOC,c,6BAbrDI,mBAAA,WACOC,KAAKT,MAAMC,YACdQ,KAAKT,MAAMM,SAASC,YAAaE,KAAKT,MAAMG,OAAOC,Y,EAIvDM,0BAAA,SAA0BC,GACpBA,EAAUR,OAAOC,WAAaK,KAAKT,MAAMG,OAAOC,UAAYO,EAAUR,OAAOC,UAC/EK,KAAKT,MAAMM,SAASC,YAAaI,EAAUR,OAAOC,Y,EAQtDQ,OAAA,WAAW,IAAD,EACsDH,KAAKT,MAA3Da,EADA,EACAA,KAAMC,EADN,EACMA,mBAAoBb,EAD1B,EAC0BA,WAAYc,EADtC,EACsCA,YAE9C,IAAKd,EACH,OACE,YAAC,IAAD,UACE,YAAC,IAAD,KAKN,IAAMe,EAAe,YAAC,IAAD,CAAkBC,GAAG,uBAAuBC,eAAe,iFAEhF,OACE,YAAC,IAAD,CAAQC,gBAAiBJ,QAAzB,EACE,YAAC,IAAD,CACEK,gBAAc,EACdL,YAAaA,EACbM,YACE,sBAAQC,UAAU,wBAAwBC,MAAOV,EAAKW,cAAc9B,EAASE,SAAU6B,aAAYZ,EAAKW,cAAc9B,EAASE,SAAU8B,QAASjB,KAAKkB,oBAAvJ,EAAsK,YAAC,IAAD,CAAMV,GAAG,eAInL,YAAC,IAAD,CACEW,UAAU,UACVd,mBAAoBA,EACpBE,aAAcA,EACdG,gBAAiBJ,QAJnB,EAMGd,EAAW4B,KAAI,SAAAZ,GAAE,OAChB,YAAC,IAAD,CAA2BA,GAAIA,EAAIa,UAAU,GAAtBb,U,GAzDbc,K,0BAED,CACjB5B,OAAQ6B,IAAUC,OAAOC,WACzB5B,SAAU0B,IAAUG,KAAKD,WACzBpB,mBAAoBkB,IAAUG,KAC9BlC,WAAYmC,IAAmBC,KAC/BtB,YAAaiB,IAAUM,KACvBzB,KAAMmB,IAAUC,OAAOC,a","file":"features/reblogs.js","sourcesContent":["import React from 'react';\nimport { connect } from 'react-redux';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport LoadingIndicator from '../../components/loading_indicator';\nimport { fetchReblogs } from '../../actions/interactions';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport AccountContainer from '../../containers/account_container';\nimport Column from '../ui/components/column';\nimport ScrollableList from '../../components/scrollable_list';\nimport Icon from 'mastodon/components/icon';\nimport ColumnHeader from '../../components/column_header';\n\nconst messages = defineMessages({\n refresh: { id: 'refresh', defaultMessage: 'Refresh' },\n});\n\nconst mapStateToProps = (state, props) => ({\n accountIds: state.getIn(['user_lists', 'reblogged_by', props.params.statusId]),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass Reblogs extends ImmutablePureComponent {\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n shouldUpdateScroll: PropTypes.func,\n accountIds: ImmutablePropTypes.list,\n multiColumn: PropTypes.bool,\n intl: PropTypes.object.isRequired,\n };\n\n componentWillMount () {\n if (!this.props.accountIds) {\n this.props.dispatch(fetchReblogs(this.props.params.statusId));\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {\n this.props.dispatch(fetchReblogs(nextProps.params.statusId));\n }\n }\n\n handleRefresh = () => {\n this.props.dispatch(fetchReblogs(this.props.params.statusId));\n }\n\n render () {\n const { intl, shouldUpdateScroll, accountIds, multiColumn } = this.props;\n\n if (!accountIds) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n const emptyMessage = <FormattedMessage id='status.reblogs.empty' defaultMessage='No one has boosted this toot yet. When someone does, they will show up here.' />;\n\n return (\n <Column bindToDocument={!multiColumn}>\n <ColumnHeader\n showBackButton\n multiColumn={multiColumn}\n extraButton={(\n <button className='column-header__button' title={intl.formatMessage(messages.refresh)} aria-label={intl.formatMessage(messages.refresh)} onClick={this.handleRefresh}><Icon id='refresh' /></button>\n )}\n />\n\n <ScrollableList\n scrollKey='reblogs'\n shouldUpdateScroll={shouldUpdateScroll}\n emptyMessage={emptyMessage}\n bindToDocument={!multiColumn}\n >\n {accountIds.map(id =>\n <AccountContainer key={id} id={id} withNote={false} />,\n )}\n </ScrollableList>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/priv/static/packs/features/search.js b/priv/static/packs/features/search.js
index 7efd675f3..64bbc4984 100644
--- a/priv/static/packs/features/search.js
+++ b/priv/static/packs/features/search.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{806:function(a,e,c){"use strict";c.r(e);var r=c(0),d=(c(3),c(755)),i=c(1145);e.default=function(){return Object(r.a)("div",{className:"column search-page"},void 0,Object(r.a)(d.a,{}),Object(r.a)("div",{className:"drawer__pager"},void 0,Object(r.a)("div",{className:"drawer__inner darker"},void 0,Object(r.a)(i.a,{}))))}}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{832:function(a,e,c){"use strict";c.r(e);var r=c(0),d=(c(3),c(781)),i=c(1178);e.default=function(){return Object(r.a)("div",{className:"column search-page"},void 0,Object(r.a)(d.a,{}),Object(r.a)("div",{className:"drawer__pager"},void 0,Object(r.a)("div",{className:"drawer__inner darker"},void 0,Object(r.a)(i.a,{}))))}}}]);
//# sourceMappingURL=search.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/status.js b/priv/static/packs/features/status.js
index bd8c71d8f..dace442de 100644
--- a/priv/static/packs/features/status.js
+++ b/priv/static/packs/features/status.js
@@ -1,2 +1,2 @@
-(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{760:function(e,t,a){"use strict";a.d(t,"a",(function(){return I}));var n=a(0),i=a(2),o=a(7),s=a(1),c=a(3),l=a.n(c),r=a(5),d=a.n(r),u=a(14),p=a.n(u),h=a(111),b=a(118),g=a(229),f=a(533),m=a(316),O=a(6),j=a(534),v=a(18),k=a(84),M=a(224),y=a(752),_=a(12),C=a.n(_),w=a(26),I=function(e){function t(){for(var t,a=arguments.length,n=new Array(a),o=0;o<a;o++)n[o]=arguments[o];return t=e.call.apply(e,[this].concat(n))||this,Object(s.a)(Object(i.a)(t),"state",{height:null}),Object(s.a)(Object(i.a)(t),"handleAccountClick",(function(e){0!==e.button||e.ctrlKey||e.metaKey||!t.context.router||(e.preventDefault(),t.context.router.history.push("/accounts/"+t.props.status.getIn(["account","id"]))),e.stopPropagation()})),Object(s.a)(Object(i.a)(t),"handleOpenVideo",(function(e,a){t.props.onOpenVideo(e,a)})),Object(s.a)(Object(i.a)(t),"handleExpandedToggle",(function(){t.props.onToggleHidden(t.props.status)})),Object(s.a)(Object(i.a)(t),"setRef",(function(e){t.node=e,t._measureHeight()})),Object(s.a)(Object(i.a)(t),"handleModalLink",(function(e){var t;e.preventDefault(),t="A"!==e.target.nodeName?e.target.parentNode.href:e.target.href,window.open(t,"mastodon-intent","width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes")})),t}Object(o.a)(t,e);var a=t.prototype;return a._measureHeight=function(e){var t=this;this.props.measureHeight&&this.node&&(Object(y.a)((function(){return t.node&&t.setState({height:Math.ceil(t.node.scrollHeight)+1})})),this.props.onHeightChange&&e&&this.props.onHeightChange())},a.componentDidUpdate=function(e,t){this._measureHeight(t.height!==this.state.height)},a.render=function(){var e=this.props.status&&this.props.status.get("reblog")?this.props.status.get("reblog"):this.props.status,t={boxSizing:"border-box"},a=this.props.compact;if(!e)return null;var i="",o="",s="",c="retweet",r="";if(this.props.measureHeight&&(t.height=this.state.height+"px"),e.get("media_attachments").size>0)if("audio"===e.getIn(["media_attachments",0,"type"])){var d=e.getIn(["media_attachments",0]);i=Object(n.a)(M.default,{src:d.get("url"),alt:d.get("description"),duration:d.getIn(["meta","original","duration"],0),height:110,preload:!0})}else if("video"===e.getIn(["media_attachments",0,"type"])){var u=e.getIn(["media_attachments",0]);i=Object(n.a)(k.default,{preview:u.get("preview_url"),blurhash:u.get("blurhash"),src:u.get("url"),alt:u.get("description"),width:300,height:150,inline:!0,onOpenVideo:this.handleOpenVideo,sensitive:e.get("sensitive"),visible:this.props.showMedia,onToggleVisibility:this.props.onToggleMediaVisibility})}else i=Object(n.a)(f.default,{standalone:!0,sensitive:e.get("sensitive"),media:e.get("media_attachments"),height:300,onOpenMedia:this.props.onOpenMedia,visible:this.props.showMedia,onToggleVisibility:this.props.onToggleMediaVisibility});else 0===e.get("spoiler_text").length&&(i=Object(n.a)(j.a,{onOpenMedia:this.props.onOpenMedia,card:e.get("card",null)}));return e.get("application")&&(o=Object(n.a)("span",{},void 0," · ",Object(n.a)("a",{className:"detailed-status__application",href:e.getIn(["application","website"]),target:"_blank",rel:"noopener noreferrer"},void 0,e.getIn(["application","name"])))),"direct"===e.get("visibility")?c="envelope":"private"===e.get("visibility")&&(c="lock"),s="private"===e.get("visibility")?Object(n.a)(w.a,{id:c}):this.context.router?Object(n.a)(m.a,{to:"/statuses/"+e.get("id")+"/reblogs",className:"detailed-status__link"},void 0,Object(n.a)(w.a,{id:c}),Object(n.a)("span",{className:"detailed-status__reblogs"},void 0,Object(n.a)(O.c,{value:e.get("reblogs_count")}))):Object(n.a)("a",{href:"/interact/"+e.get("id")+"?type=reblog",className:"detailed-status__link",onClick:this.handleModalLink},void 0,Object(n.a)(w.a,{id:c}),Object(n.a)("span",{className:"detailed-status__reblogs"},void 0,Object(n.a)(O.c,{value:e.get("reblogs_count")}))),r=this.context.router?Object(n.a)(m.a,{to:"/statuses/"+e.get("id")+"/favourites",className:"detailed-status__link"},void 0,Object(n.a)(w.a,{id:"star"}),Object(n.a)("span",{className:"detailed-status__favorites"},void 0,Object(n.a)(O.c,{value:e.get("favourites_count")}))):Object(n.a)("a",{href:"/interact/"+e.get("id")+"?type=favourite",className:"detailed-status__link",onClick:this.handleModalLink},void 0,Object(n.a)(w.a,{id:"star"}),Object(n.a)("span",{className:"detailed-status__favorites"},void 0,Object(n.a)(O.c,{value:e.get("favourites_count")}))),Object(n.a)("div",{style:t},void 0,l.a.createElement("div",{ref:this.setRef,className:C()("detailed-status",{compact:a})},Object(n.a)("a",{href:e.getIn(["account","url"]),onClick:this.handleAccountClick,className:"detailed-status__display-name"},void 0,Object(n.a)("div",{className:"detailed-status__display-avatar"},void 0,Object(n.a)(h.a,{account:e.get("account"),size:48})),Object(n.a)(b.a,{account:e.get("account"),localDomain:this.props.domain})),Object(n.a)(g.a,{status:e,expanded:!e.get("hidden"),onExpandedToggle:this.handleExpandedToggle}),i,Object(n.a)("div",{className:"detailed-status__meta"},void 0,Object(n.a)("a",{className:"detailed-status__datetime",href:e.get("url"),target:"_blank",rel:"noopener noreferrer"},void 0,Object(n.a)(O.a,{value:new Date(e.get("created_at")),hour12:!1,year:"numeric",month:"short",day:"2-digit",hour:"2-digit",minute:"2-digit"})),o," · ",s," · ",r)))},t}(v.a);Object(s.a)(I,"contextTypes",{router:d.a.object}),Object(s.a)(I,"propTypes",{status:p.a.map,onOpenMedia:d.a.func.isRequired,onOpenVideo:d.a.func.isRequired,onToggleHidden:d.a.func.isRequired,measureHeight:d.a.bool,onHeightChange:d.a.func,domain:d.a.string.isRequired,compact:d.a.bool,showMedia:d.a.bool,onToggleMediaVisibility:d.a.func})},836:function(e,t,a){"use strict";a.r(t);var n,i,o,s,c,l,r,d=a(0),u=a(2),p=a(7),h=a(1),b=a(4),g=a.n(b),f=a(3),m=a.n(f),O=a(13),j=a(5),v=a.n(j),k=a(12),M=a.n(k),y=a(14),_=a.n(y),C=a(54),w=a(85),I=a(1030),x=a(760),D=a(50),R=a(710),H=a(6),T=a(20),U=Object(H.f)({delete:{id:"status.delete",defaultMessage:"Delete"},redraft:{id:"status.redraft",defaultMessage:"Delete & re-draft"},direct:{id:"status.direct",defaultMessage:"Direct message @{name}"},mention:{id:"status.mention",defaultMessage:"Mention @{name}"},reply:{id:"status.reply",defaultMessage:"Reply"},reblog:{id:"status.reblog",defaultMessage:"Boost"},reblog_private:{id:"status.reblog_private",defaultMessage:"Boost to original audience"},cancel_reblog_private:{id:"status.cancel_reblog_private",defaultMessage:"Unboost"},cannot_reblog:{id:"status.cannot_reblog",defaultMessage:"This post cannot be boosted"},favourite:{id:"status.favourite",defaultMessage:"Favourite"},bookmark:{id:"status.bookmark",defaultMessage:"Bookmark"},mute:{id:"status.mute",defaultMessage:"Mute @{name}"},muteConversation:{id:"status.mute_conversation",defaultMessage:"Mute conversation"},unmuteConversation:{id:"status.unmute_conversation",defaultMessage:"Unmute conversation"},block:{id:"status.block",defaultMessage:"Block @{name}"},report:{id:"status.report",defaultMessage:"Report @{name}"},share:{id:"status.share",defaultMessage:"Share"},pin:{id:"status.pin",defaultMessage:"Pin on profile"},unpin:{id:"status.unpin",defaultMessage:"Unpin from profile"},embed:{id:"status.embed",defaultMessage:"Embed"},admin_account:{id:"status.admin_account",defaultMessage:"Open moderation interface for @{name}"},admin_status:{id:"status.admin_status",defaultMessage:"Open this status in the moderation interface"},copy:{id:"status.copy",defaultMessage:"Copy link to status"},blockDomain:{id:"account.block_domain",defaultMessage:"Hide everything from {domain}"},unblockDomain:{id:"account.unblock_domain",defaultMessage:"Unhide {domain}"},unmute:{id:"account.unmute",defaultMessage:"Unmute @{name}"},unblock:{id:"account.unblock",defaultMessage:"Unblock @{name}"}}),N=Object(O.connect)((function(e,t){var a=t.status;return{relationship:e.getIn(["relationships",a.getIn(["account","id"])])}}))(n=Object(H.g)((o=i=function(e){function t(){for(var t,a=arguments.length,n=new Array(a),i=0;i<a;i++)n[i]=arguments[i];return t=e.call.apply(e,[this].concat(n))||this,Object(h.a)(Object(u.a)(t),"handleReplyClick",(function(){t.props.onReply(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleReblogClick",(function(e){t.props.onReblog(t.props.status,e)})),Object(h.a)(Object(u.a)(t),"handleFavouriteClick",(function(){t.props.onFavourite(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleBookmarkClick",(function(e){t.props.onBookmark(t.props.status,e)})),Object(h.a)(Object(u.a)(t),"handleDeleteClick",(function(){t.props.onDelete(t.props.status,t.context.router.history)})),Object(h.a)(Object(u.a)(t),"handleRedraftClick",(function(){t.props.onDelete(t.props.status,t.context.router.history,!0)})),Object(h.a)(Object(u.a)(t),"handleDirectClick",(function(){t.props.onDirect(t.props.status.get("account"),t.context.router.history)})),Object(h.a)(Object(u.a)(t),"handleMentionClick",(function(){t.props.onMention(t.props.status.get("account"),t.context.router.history)})),Object(h.a)(Object(u.a)(t),"handleMuteClick",(function(){var e=t.props,a=e.status,n=e.relationship,i=e.onMute,o=e.onUnmute,s=a.get("account");n&&n.get("muting")?o(s):i(s)})),Object(h.a)(Object(u.a)(t),"handleBlockClick",(function(){var e=t.props,a=e.status,n=e.relationship,i=e.onBlock,o=e.onUnblock,s=a.get("account");n&&n.get("blocking")?o(s):i(a)})),Object(h.a)(Object(u.a)(t),"handleBlockDomain",(function(){var e=t.props,a=e.status;(0,e.onBlockDomain)(a.get("account").get("acct").split("@")[1])})),Object(h.a)(Object(u.a)(t),"handleUnblockDomain",(function(){var e=t.props,a=e.status;(0,e.onUnblockDomain)(a.get("account").get("acct").split("@")[1])})),Object(h.a)(Object(u.a)(t),"handleConversationMuteClick",(function(){t.props.onMuteConversation(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleReport",(function(){t.props.onReport(t.props.status)})),Object(h.a)(Object(u.a)(t),"handlePinClick",(function(){t.props.onPin(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleShare",(function(){navigator.share({text:t.props.status.get("search_index"),url:t.props.status.get("url")})})),Object(h.a)(Object(u.a)(t),"handleEmbed",(function(){t.props.onEmbed(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleCopy",(function(){var e=t.props.status.get("url"),a=document.createElement("textarea");a.textContent=e,a.style.position="fixed",document.body.appendChild(a);try{a.select(),document.execCommand("copy")}catch(e){}finally{document.body.removeChild(a)}})),t}return Object(p.a)(t,e),t.prototype.render=function(){var e=this.props,t=e.status,a=e.relationship,n=e.intl,i=["public","unlisted"].includes(t.get("visibility")),o=t.get("muted"),s=t.get("account"),c=[];if(i&&(c.push({text:n.formatMessage(U.copy),action:this.handleCopy}),c.push({text:n.formatMessage(U.embed),action:this.handleEmbed}),c.push(null)),T.n===t.getIn(["account","id"]))i?c.push({text:n.formatMessage(t.get("pinned")?U.unpin:U.pin),action:this.handlePinClick}):"private"===t.get("visibility")&&c.push({text:n.formatMessage(t.get("reblogged")?U.cancel_reblog_private:U.reblog_private),action:this.handleReblogClick}),c.push(null),c.push({text:n.formatMessage(o?U.unmuteConversation:U.muteConversation),action:this.handleConversationMuteClick}),c.push(null),c.push({text:n.formatMessage(U.delete),action:this.handleDeleteClick}),c.push({text:n.formatMessage(U.redraft),action:this.handleRedraftClick});else{if(c.push({text:n.formatMessage(U.mention,{name:t.getIn(["account","username"])}),action:this.handleMentionClick}),c.push({text:n.formatMessage(U.direct,{name:t.getIn(["account","username"])}),action:this.handleDirectClick}),c.push(null),a&&a.get("muting")?c.push({text:n.formatMessage(U.unmute,{name:s.get("username")}),action:this.handleMuteClick}):c.push({text:n.formatMessage(U.mute,{name:s.get("username")}),action:this.handleMuteClick}),a&&a.get("blocking")?c.push({text:n.formatMessage(U.unblock,{name:s.get("username")}),action:this.handleBlockClick}):c.push({text:n.formatMessage(U.block,{name:s.get("username")}),action:this.handleBlockClick}),c.push({text:n.formatMessage(U.report,{name:t.getIn(["account","username"])}),action:this.handleReport}),s.get("acct")!==s.get("username")){var l=s.get("acct").split("@")[1];c.push(null),a&&a.get("domain_blocking")?c.push({text:n.formatMessage(U.unblockDomain,{domain:l}),action:this.handleUnblockDomain}):c.push({text:n.formatMessage(U.blockDomain,{domain:l}),action:this.handleBlockDomain})}T.k&&(c.push(null),c.push({text:n.formatMessage(U.admin_account,{name:t.getIn(["account","username"])}),href:"/admin/accounts/"+t.getIn(["account","id"])}),c.push({text:n.formatMessage(U.admin_status),href:"/admin/accounts/"+t.getIn(["account","id"])+"/statuses/"+t.get("id")}))}var r,u="share"in navigator&&"public"===t.get("visibility")&&Object(d.a)("div",{className:"detailed-status__button"},void 0,Object(d.a)(D.a,{title:n.formatMessage(U.share),icon:"share-alt",onClick:this.handleShare}));r=null===t.get("in_reply_to_id",null)?"reply":"reply-all";var p="retweet";"direct"===t.get("visibility")?p="envelope":"private"===t.get("visibility")&&(p="lock");var h="direct"===t.get("visibility")||"private"===t.get("visibility");return Object(d.a)("div",{className:"detailed-status__action-bar"},void 0,Object(d.a)("div",{className:"detailed-status__button"},void 0,Object(d.a)(D.a,{title:n.formatMessage(U.reply),icon:t.get("in_reply_to_account_id")===t.getIn(["account","id"])?"reply":r,onClick:this.handleReplyClick})),Object(d.a)("div",{className:"detailed-status__button"},void 0,Object(d.a)(D.a,{disabled:h,active:t.get("reblogged"),title:h?n.formatMessage(U.cannot_reblog):n.formatMessage(U.reblog),icon:p,onClick:this.handleReblogClick})),Object(d.a)("div",{className:"detailed-status__button"},void 0,Object(d.a)(D.a,{className:"star-icon",animate:!0,active:t.get("favourited"),title:n.formatMessage(U.favourite),icon:"star",onClick:this.handleFavouriteClick})),u,Object(d.a)("div",{className:"detailed-status__button"},void 0,Object(d.a)(D.a,{className:"bookmark-icon",active:t.get("bookmarked"),title:n.formatMessage(U.bookmark),icon:"bookmark",onClick:this.handleBookmarkClick})),Object(d.a)("div",{className:"detailed-status__action-bar-dropdown"},void 0,Object(d.a)(R.a,{size:18,icon:"ellipsis-h",status:t,items:c,direction:"left",title:"More"})))},t}(m.a.PureComponent),Object(h.a)(i,"contextTypes",{router:v.a.object}),n=o))||n)||n,B=a(731),S=a(45),V=a(21),A=a(25),E=a(80),F=a(208),z=a(226),P=a(100),q=a(206),L=a(467),J=a(738),K=a(733),W=a(1053),Y=a(47),X=a(18),G=a(295),Q=a(258),Z=a(845),$=a(26);a.d(t,"default",(function(){return te}));var ee=Object(H.f)({deleteConfirm:{id:"confirmations.delete.confirm",defaultMessage:"Delete"},deleteMessage:{id:"confirmations.delete.message",defaultMessage:"Are you sure you want to delete this status?"},redraftConfirm:{id:"confirmations.redraft.confirm",defaultMessage:"Delete & redraft"},redraftMessage:{id:"confirmations.redraft.message",defaultMessage:"Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned."},revealAll:{id:"status.show_more_all",defaultMessage:"Show more for all"},hideAll:{id:"status.show_less_all",defaultMessage:"Show less for all"},detailedStatus:{id:"status.detailed_status",defaultMessage:"Detailed conversation view"},replyConfirm:{id:"confirmations.reply.confirm",defaultMessage:"Reply"},replyMessage:{id:"confirmations.reply.message",defaultMessage:"Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?"},blockDomainConfirm:{id:"confirmations.domain_block.confirm",defaultMessage:"Hide entire domain"}}),te=(s=Object(O.connect)((function(){var e=Object(q.f)(),t=Object(C.a)([function(e,t){return t.id},function(e){return e.getIn(["contexts","inReplyTos"])}],(function(e,t){var a=g.a.List();return a=a.withMutations((function(a){for(var n=e;n;)a.unshift(n),n=t.get(n)}))})),a=Object(C.a)([function(e,t){return t.id},function(e){return e.getIn(["contexts","replies"])},function(e){return e.get("statuses")}],(function(e,t,a){for(var n=[],i=[e];i.length>0;){var o=i.shift(),s=t.get(o);e!==o&&n.push(o),s&&s.reverse().forEach((function(e){i.unshift(e)}))}var c=n.findIndex((function(e){return a.get(e).get("in_reply_to_account_id")!==a.get(e).get("account")}));return-1!==c&&n.forEach((function(e,t){t>c&&a.get(e).get("in_reply_to_account_id")===a.get(e).get("account")&&(n.splice(t,1),n.splice(c,0,e),c+=1)})),g.a.List(n)}));return function(n,i){var o=e(n,{id:i.params.statusId}),s=g.a.List(),c=g.a.List();return o&&(s=t(n,{id:o.get("in_reply_to_id")}),c=a(n,{id:o.get("id")})),{status:o,ancestorsIds:s,descendantsIds:c,askReplyConfirmation:0!==n.getIn(["compose","text"]).trim().length,domain:n.getIn(["meta","domain"])}}})),Object(H.g)(c=s((r=l=function(e){function t(){for(var t,a=arguments.length,n=new Array(a),i=0;i<a;i++)n[i]=arguments[i];return t=e.call.apply(e,[this].concat(n))||this,Object(h.a)(Object(u.a)(t),"state",{fullscreen:!1,showMedia:Object(Z.b)(t.props.status),loadedStatusId:void 0}),Object(h.a)(Object(u.a)(t),"handleToggleMediaVisibility",(function(){t.setState({showMedia:!t.state.showMedia})})),Object(h.a)(Object(u.a)(t),"handleFavouriteClick",(function(e){e.get("favourited")?t.props.dispatch(Object(S.v)(e)):t.props.dispatch(Object(S.p)(e))})),Object(h.a)(Object(u.a)(t),"handlePin",(function(e){e.get("pinned")?t.props.dispatch(Object(S.w)(e)):t.props.dispatch(Object(S.s)(e))})),Object(h.a)(Object(u.a)(t),"handleReplyClick",(function(e){var a=t.props,n=a.askReplyConfirmation,i=a.dispatch,o=a.intl;i(n?Object(Y.d)("CONFIRM",{message:o.formatMessage(ee.replyMessage),confirm:o.formatMessage(ee.replyConfirm),onConfirm:function(){return i(Object(V.gb)(e,t.context.router.history))}}):Object(V.gb)(e,t.context.router.history))})),Object(h.a)(Object(u.a)(t),"handleModalReblog",(function(e){t.props.dispatch(Object(S.t)(e))})),Object(h.a)(Object(u.a)(t),"handleReblogClick",(function(e,a){e.get("reblogged")?t.props.dispatch(Object(S.x)(e)):a&&a.shiftKey||!T.b?t.handleModalReblog(e):t.props.dispatch(Object(Y.d)("BOOST",{status:e,onReblog:t.handleModalReblog}))})),Object(h.a)(Object(u.a)(t),"handleBookmarkClick",(function(e){e.get("bookmarked")?t.props.dispatch(Object(S.u)(e)):t.props.dispatch(Object(S.o)(e))})),Object(h.a)(Object(u.a)(t),"handleDeleteClick",(function(e,a,n){void 0===n&&(n=!1);var i=t.props,o=i.dispatch,s=i.intl;T.e?o(Object(Y.d)("CONFIRM",{message:s.formatMessage(n?ee.redraftMessage:ee.deleteMessage),confirm:s.formatMessage(n?ee.redraftConfirm:ee.deleteConfirm),onConfirm:function(){return o(Object(w.h)(e.get("id"),a,n))}})):o(Object(w.h)(e.get("id"),a,n))})),Object(h.a)(Object(u.a)(t),"handleDirectClick",(function(e,a){t.props.dispatch(Object(V.X)(e,a))})),Object(h.a)(Object(u.a)(t),"handleMentionClick",(function(e,a){t.props.dispatch(Object(V.cb)(e,a))})),Object(h.a)(Object(u.a)(t),"handleOpenMedia",(function(e,a){t.props.dispatch(Object(Y.d)("MEDIA",{media:e,index:a}))})),Object(h.a)(Object(u.a)(t),"handleOpenVideo",(function(e,a){t.props.dispatch(Object(Y.d)("VIDEO",{media:e,time:a}))})),Object(h.a)(Object(u.a)(t),"handleHotkeyOpenMedia",(function(e){var a=t._properStatus();e.preventDefault(),a.get("media_attachments").size>0&&("audio"===a.getIn(["media_attachments",0,"type"])||("video"===a.getIn(["media_attachments",0,"type"])?t.handleOpenVideo(a.getIn(["media_attachments",0]),0):t.handleOpenMedia(a.get("media_attachments"),0)))})),Object(h.a)(Object(u.a)(t),"handleMuteClick",(function(e){t.props.dispatch(Object(F.g)(e))})),Object(h.a)(Object(u.a)(t),"handleConversationMuteClick",(function(e){e.get("muted")?t.props.dispatch(Object(w.n)(e.get("id"))):t.props.dispatch(Object(w.k)(e.get("id")))})),Object(h.a)(Object(u.a)(t),"handleToggleHidden",(function(e){e.get("hidden")?t.props.dispatch(Object(w.l)(e.get("id"))):t.props.dispatch(Object(w.j)(e.get("id")))})),Object(h.a)(Object(u.a)(t),"handleToggleAll",(function(){var e=t.props,a=e.status,n=e.ancestorsIds,i=e.descendantsIds,o=[a.get("id")].concat(n.toJS(),i.toJS());a.get("hidden")?t.props.dispatch(Object(w.l)(o)):t.props.dispatch(Object(w.j)(o))})),Object(h.a)(Object(u.a)(t),"handleBlockClick",(function(e){var a=t.props.dispatch,n=e.get("account");a(Object(z.f)(n))})),Object(h.a)(Object(u.a)(t),"handleReport",(function(e){t.props.dispatch(Object(P.k)(e.get("account"),e))})),Object(h.a)(Object(u.a)(t),"handleEmbed",(function(e){t.props.dispatch(Object(Y.d)("EMBED",{url:e.get("url")}))})),Object(h.a)(Object(u.a)(t),"handleUnmuteClick",(function(e){t.props.dispatch(Object(A.L)(e.get("id")))})),Object(h.a)(Object(u.a)(t),"handleUnblockClick",(function(e){t.props.dispatch(Object(A.J)(e.get("id")))})),Object(h.a)(Object(u.a)(t),"handleBlockDomainClick",(function(e){t.props.dispatch(Object(Y.d)("CONFIRM",{message:Object(d.a)(H.b,{id:"confirmations.domain_block.message",defaultMessage:"Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",values:{domain:Object(d.a)("strong",{},void 0,e)}}),confirm:t.props.intl.formatMessage(ee.blockDomainConfirm),onConfirm:function(){return t.props.dispatch(Object(E.e)(e))}}))})),Object(h.a)(Object(u.a)(t),"handleUnblockDomainClick",(function(e){t.props.dispatch(Object(E.h)(e))})),Object(h.a)(Object(u.a)(t),"handleHotkeyMoveUp",(function(){t.handleMoveUp(t.props.status.get("id"))})),Object(h.a)(Object(u.a)(t),"handleHotkeyMoveDown",(function(){t.handleMoveDown(t.props.status.get("id"))})),Object(h.a)(Object(u.a)(t),"handleHotkeyReply",(function(e){e.preventDefault(),t.handleReplyClick(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleHotkeyFavourite",(function(){t.handleFavouriteClick(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleHotkeyBoost",(function(){t.handleReblogClick(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleHotkeyMention",(function(e){e.preventDefault(),t.handleMentionClick(t.props.status.get("account"))})),Object(h.a)(Object(u.a)(t),"handleHotkeyOpenProfile",(function(){t.context.router.history.push("/accounts/"+t.props.status.getIn(["account","id"]))})),Object(h.a)(Object(u.a)(t),"handleHotkeyToggleHidden",(function(){t.handleToggleHidden(t.props.status)})),Object(h.a)(Object(u.a)(t),"handleHotkeyToggleSensitive",(function(){t.handleToggleMediaVisibility()})),Object(h.a)(Object(u.a)(t),"handleMoveUp",(function(e){var a=t.props,n=a.status,i=a.ancestorsIds,o=a.descendantsIds;if(e===n.get("id"))t._selectChild(i.size-1,!0);else{var s=i.indexOf(e);-1===s?(s=o.indexOf(e),t._selectChild(i.size+s,!0)):t._selectChild(s-1,!0)}})),Object(h.a)(Object(u.a)(t),"handleMoveDown",(function(e){var a=t.props,n=a.status,i=a.ancestorsIds,o=a.descendantsIds;if(e===n.get("id"))t._selectChild(i.size+1,!1);else{var s=i.indexOf(e);-1===s?(s=o.indexOf(e),t._selectChild(i.size+s+2,!1)):t._selectChild(s+1,!1)}})),Object(h.a)(Object(u.a)(t),"setRef",(function(e){t.node=e})),Object(h.a)(Object(u.a)(t),"onFullScreenChange",(function(){t.setState({fullscreen:Object(Q.d)()})})),t}Object(p.a)(t,e);var a=t.prototype;return a.componentWillMount=function(){this.props.dispatch(Object(w.i)(this.props.params.statusId))},a.componentDidMount=function(){Object(Q.a)(this.onFullScreenChange)},a.componentWillReceiveProps=function(e){e.params.statusId!==this.props.params.statusId&&e.params.statusId&&(this._scrolledIntoView=!1,this.props.dispatch(Object(w.i)(e.params.statusId))),e.status&&e.status.get("id")!==this.state.loadedStatusId&&this.setState({showMedia:Object(Z.b)(e.status),loadedStatusId:e.status.get("id")})},a._selectChild=function(e,t){var a=this.node,n=a.querySelectorAll(".focusable")[e];n&&(t&&a.scrollTop>n.offsetTop?n.scrollIntoView(!0):!t&&a.scrollTop+a.clientHeight<n.offsetTop+n.offsetHeight&&n.scrollIntoView(!1),n.focus())},a.renderChildren=function(e){var t=this;return e.map((function(e){return Object(d.a)(W.a,{id:e,onMoveUp:t.handleMoveUp,onMoveDown:t.handleMoveDown,contextType:"thread"},e)}))},a.componentDidUpdate=function(){if(!this._scrolledIntoView){var e=this.props,t=e.status,a=e.ancestorsIds;if(t&&a&&a.size>0){var n=this.node.querySelectorAll(".focusable")[a.size-1];window.requestAnimationFrame((function(){n.scrollIntoView(!0)})),this._scrolledIntoView=!0}}},a.componentWillUnmount=function(){Object(Q.b)(this.onFullScreenChange)},a.render=function(){var e,t,a=this.props,n=a.shouldUpdateScroll,i=a.status,o=a.ancestorsIds,s=a.descendantsIds,c=a.intl,l=a.domain,r=a.multiColumn,u=this.state.fullscreen;if(null===i)return Object(d.a)(B.a,{},void 0,Object(d.a)(J.a,{multiColumn:r}),Object(d.a)(I.a,{}));o&&o.size>0&&(e=Object(d.a)("div",{},void 0,this.renderChildren(o))),s&&s.size>0&&(t=Object(d.a)("div",{},void 0,this.renderChildren(s)));var p={moveUp:this.handleHotkeyMoveUp,moveDown:this.handleHotkeyMoveDown,reply:this.handleHotkeyReply,favourite:this.handleHotkeyFavourite,boost:this.handleHotkeyBoost,mention:this.handleHotkeyMention,openProfile:this.handleHotkeyOpenProfile,toggleHidden:this.handleHotkeyToggleHidden,toggleSensitive:this.handleHotkeyToggleSensitive,openMedia:this.handleHotkeyOpenMedia};return Object(d.a)(B.a,{bindToDocument:!r,label:c.formatMessage(ee.detailedStatus)},void 0,Object(d.a)(K.a,{showBackButton:!0,multiColumn:r,extraButton:Object(d.a)("button",{className:"column-header__button",title:c.formatMessage(i.get("hidden")?ee.revealAll:ee.hideAll),"aria-label":c.formatMessage(i.get("hidden")?ee.revealAll:ee.hideAll),onClick:this.handleToggleAll,"aria-pressed":i.get("hidden")?"false":"true"},void 0,Object(d.a)($.a,{id:i.get("hidden")?"eye-slash":"eye"}))}),Object(d.a)(L.a,{scrollKey:"thread",shouldUpdateScroll:n},void 0,m.a.createElement("div",{className:M()("scrollable",{fullscreen:u}),ref:this.setRef},e,Object(d.a)(G.HotKeys,{handlers:p},void 0,Object(d.a)("div",{className:M()("focusable","detailed-status__wrapper"),tabIndex:"0","aria-label":Object(Z.c)(c,i,!1)},void 0,Object(d.a)(x.a,{status:i,onOpenVideo:this.handleOpenVideo,onOpenMedia:this.handleOpenMedia,onToggleHidden:this.handleToggleHidden,domain:l,showMedia:this.state.showMedia,onToggleMediaVisibility:this.handleToggleMediaVisibility},"details-"+i.get("id")),Object(d.a)(N,{status:i,onReply:this.handleReplyClick,onFavourite:this.handleFavouriteClick,onReblog:this.handleReblogClick,onBookmark:this.handleBookmarkClick,onDelete:this.handleDeleteClick,onDirect:this.handleDirectClick,onMention:this.handleMentionClick,onMute:this.handleMuteClick,onUnmute:this.handleUnmuteClick,onMuteConversation:this.handleConversationMuteClick,onBlock:this.handleBlockClick,onUnblock:this.handleUnblockClick,onBlockDomain:this.handleBlockDomainClick,onUnblockDomain:this.handleUnblockDomainClick,onReport:this.handleReport,onPin:this.handlePin,onEmbed:this.handleEmbed},"action-bar-"+i.get("id")))),t)))},t}(X.a),Object(h.a)(l,"contextTypes",{router:v.a.object}),Object(h.a)(l,"propTypes",{params:v.a.object.isRequired,dispatch:v.a.func.isRequired,status:_.a.map,ancestorsIds:_.a.list,descendantsIds:_.a.list,intl:v.a.object.isRequired,askReplyConfirmation:v.a.bool,multiColumn:v.a.bool,domain:v.a.string.isRequired}),c=r))||c)||c)}}]);
+(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{786:function(e,t,a){"use strict";a.d(t,"a",(function(){return x}));var n=a(0),o=a(2),i=(a(9),a(6),a(8)),s=a(1),c=a(3),l=a.n(c),r=a(5),d=a.n(r),u=a(16),p=a.n(u),h=a(115),b=a(122),g=a(234),m=a(539),f=a(322),O=a(7),j=a(540),v=a(21),k=a(88),M=a(228),y=a(778),_=a(14),C=a.n(_),w=a(27),I=a(590);var x=function(e){Object(i.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,n=new Array(a),i=0;i<a;i++)n[i]=arguments[i];return t=e.call.apply(e,[this].concat(n))||this,Object(s.a)(Object(o.a)(t),"state",{height:null}),Object(s.a)(Object(o.a)(t),"handleAccountClick",(function(e){0!==e.button||e.ctrlKey||e.metaKey||!t.context.router||(e.preventDefault(),t.context.router.history.push("/accounts/"+t.props.status.getIn(["account","id"]))),e.stopPropagation()})),Object(s.a)(Object(o.a)(t),"handleOpenVideo",(function(e,a){t.props.onOpenVideo(e,a)})),Object(s.a)(Object(o.a)(t),"handleExpandedToggle",(function(){t.props.onToggleHidden(t.props.status)})),Object(s.a)(Object(o.a)(t),"setRef",(function(e){t.node=e,t._measureHeight()})),Object(s.a)(Object(o.a)(t),"handleModalLink",(function(e){var t;e.preventDefault(),t="A"!==e.target.nodeName?e.target.parentNode.href:e.target.href,window.open(t,"mastodon-intent","width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes")})),t}var c=a.prototype;return c._measureHeight=function(e){var t=this;this.props.measureHeight&&this.node&&(Object(y.a)((function(){return t.node&&t.setState({height:Math.ceil(t.node.scrollHeight)+1})})),this.props.onHeightChange&&e&&this.props.onHeightChange())},c.componentDidUpdate=function(e,t){this._measureHeight(t.height!==this.state.height)},c.render=function(){var e=this.props.status&&this.props.status.get("reblog")?this.props.status.get("reblog"):this.props.status,t={boxSizing:"border-box"},a=this.props.compact;if(!e)return null;var o="",i="",s="",c="retweet",r="";if(this.props.measureHeight&&(t.height=this.state.height+"px"),e.get("media_attachments").size>0)if("audio"===e.getIn(["media_attachments",0,"type"])){var d=e.getIn(["media_attachments",0]);o=Object(n.a)(M.default,{src:d.get("url"),alt:d.get("description"),duration:d.getIn(["meta","original","duration"],0),height:110,preload:!0})}else if("video"===e.getIn(["media_attachments",0,"type"])){var u=e.getIn(["media_attachments",0]);o=Object(n.a)(k.default,{preview:u.get("preview_url"),blurhash:u.get("blurhash"),src:u.get("url"),alt:u.get("description"),width:300,height:150,inline:!0,onOpenVideo:this.handleOpenVideo,sensitive:e.get("sensitive"),visible:this.props.showMedia,onToggleVisibility:this.props.onToggleMediaVisibility})}else o=Object(n.a)(m.default,{standalone:!0,sensitive:e.get("sensitive"),media:e.get("media_attachments"),height:300,onOpenMedia:this.props.onOpenMedia,visible:this.props.showMedia,onToggleVisibility:this.props.onToggleMediaVisibility});else 0===e.get("spoiler_text").length&&(o=Object(n.a)(j.a,{onOpenMedia:this.props.onOpenMedia,card:e.get("card",null)}));return e.get("application")&&(i=Object(n.a)("span",{},void 0," · ",Object(n.a)("a",{className:"detailed-status__application",href:e.getIn(["application","website"]),target:"_blank",rel:"noopener noreferrer"},void 0,e.getIn(["application","name"])))),"direct"===e.get("visibility")?c="envelope":"private"===e.get("visibility")&&(c="lock"),s=["private","direct"].includes(e.get("visibility"))?Object(n.a)(w.a,{id:c}):this.context.router?Object(n.a)(f.a,{to:"/statuses/"+e.get("id")+"/reblogs",className:"detailed-status__link"},void 0,Object(n.a)(w.a,{id:c}),Object(n.a)("span",{className:"detailed-status__reblogs"},void 0,Object(n.a)(I.a,{value:e.get("reblogs_count")}))):Object(n.a)("a",{href:"/interact/"+e.get("id")+"?type=reblog",className:"detailed-status__link",onClick:this.handleModalLink},void 0,Object(n.a)(w.a,{id:c}),Object(n.a)("span",{className:"detailed-status__reblogs"},void 0,Object(n.a)(I.a,{value:e.get("reblogs_count")}))),r=this.context.router?Object(n.a)(f.a,{to:"/statuses/"+e.get("id")+"/favourites",className:"detailed-status__link"},void 0,Object(n.a)(w.a,{id:"star"}),Object(n.a)("span",{className:"detailed-status__favorites"},void 0,Object(n.a)(I.a,{value:e.get("favourites_count")}))):Object(n.a)("a",{href:"/interact/"+e.get("id")+"?type=favourite",className:"detailed-status__link",onClick:this.handleModalLink},void 0,Object(n.a)(w.a,{id:"star"}),Object(n.a)("span",{className:"detailed-status__favorites"},void 0,Object(n.a)(I.a,{value:e.get("favourites_count")}))),Object(n.a)("div",{style:t},void 0,l.a.createElement("div",{ref:this.setRef,className:C()("detailed-status",{compact:a})},Object(n.a)("a",{href:e.getIn(["account","url"]),onClick:this.handleAccountClick,className:"detailed-status__display-name"},void 0,Object(n.a)("div",{className:"detailed-status__display-avatar"},void 0,Object(n.a)(h.a,{account:e.get("account"),size:48})),Object(n.a)(b.a,{account:e.get("account"),localDomain:this.props.domain})),Object(n.a)(g.a,{status:e,expanded:!e.get("hidden"),onExpandedToggle:this.handleExpandedToggle}),o,Object(n.a)("div",{className:"detailed-status__meta"},void 0,Object(n.a)("a",{className:"detailed-status__datetime",href:e.get("url"),target:"_blank",rel:"noopener noreferrer"},void 0,Object(n.a)(O.a,{value:new Date(e.get("created_at")),hour12:!1,year:"numeric",month:"short",day:"2-digit",hour:"2-digit",minute:"2-digit"})),i," · ",s," · ",r)))},a}(v.a);Object(s.a)(x,"contextTypes",{router:d.a.object}),Object(s.a)(x,"propTypes",{status:p.a.map,onOpenMedia:d.a.func.isRequired,onOpenVideo:d.a.func.isRequired,onToggleHidden:d.a.func.isRequired,measureHeight:d.a.bool,onHeightChange:d.a.func,domain:d.a.string.isRequired,compact:d.a.bool,showMedia:d.a.bool,onToggleMediaVisibility:d.a.func})},862:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return te}));var n,o,i,s=a(0),c=a(2),l=(a(9),a(6),a(8)),r=a(1),d=a(4),u=a.n(d),p=a(3),h=a.n(p),b=a(15),g=a(5),m=a.n(g),f=a(14),O=a.n(f),j=a(16),v=a.n(j),k=a(57),M=a(89),y=a(1057),_=a(786),C=a(53),w=a(723),I=a(7),x=a(22);var D,R,H,T,U=Object(I.f)({delete:{id:"status.delete",defaultMessage:"Delete"},redraft:{id:"status.redraft",defaultMessage:"Delete & re-draft"},direct:{id:"status.direct",defaultMessage:"Direct message @{name}"},mention:{id:"status.mention",defaultMessage:"Mention @{name}"},reply:{id:"status.reply",defaultMessage:"Reply"},reblog:{id:"status.reblog",defaultMessage:"Boost"},reblog_private:{id:"status.reblog_private",defaultMessage:"Boost to original audience"},cancel_reblog_private:{id:"status.cancel_reblog_private",defaultMessage:"Unboost"},cannot_reblog:{id:"status.cannot_reblog",defaultMessage:"This post cannot be boosted"},favourite:{id:"status.favourite",defaultMessage:"Favourite"},bookmark:{id:"status.bookmark",defaultMessage:"Bookmark"},more:{id:"status.more",defaultMessage:"More"},mute:{id:"status.mute",defaultMessage:"Mute @{name}"},muteConversation:{id:"status.mute_conversation",defaultMessage:"Mute conversation"},unmuteConversation:{id:"status.unmute_conversation",defaultMessage:"Unmute conversation"},block:{id:"status.block",defaultMessage:"Block @{name}"},report:{id:"status.report",defaultMessage:"Report @{name}"},share:{id:"status.share",defaultMessage:"Share"},pin:{id:"status.pin",defaultMessage:"Pin on profile"},unpin:{id:"status.unpin",defaultMessage:"Unpin from profile"},embed:{id:"status.embed",defaultMessage:"Embed"},admin_account:{id:"status.admin_account",defaultMessage:"Open moderation interface for @{name}"},admin_status:{id:"status.admin_status",defaultMessage:"Open this status in the moderation interface"},copy:{id:"status.copy",defaultMessage:"Copy link to status"},blockDomain:{id:"account.block_domain",defaultMessage:"Block domain {domain}"},unblockDomain:{id:"account.unblock_domain",defaultMessage:"Unblock domain {domain}"},unmute:{id:"account.unmute",defaultMessage:"Unmute @{name}"},unblock:{id:"account.unblock",defaultMessage:"Unblock @{name}"}}),B=Object(b.connect)((function(e,t){var a=t.status;return{relationship:e.getIn(["relationships",a.getIn(["account","id"])])}}))(n=Object(I.g)((i=o=function(e){Object(l.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,n=new Array(a),o=0;o<a;o++)n[o]=arguments[o];return t=e.call.apply(e,[this].concat(n))||this,Object(r.a)(Object(c.a)(t),"handleReplyClick",(function(){t.props.onReply(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleReblogClick",(function(e){t.props.onReblog(t.props.status,e)})),Object(r.a)(Object(c.a)(t),"handleFavouriteClick",(function(){t.props.onFavourite(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleBookmarkClick",(function(e){t.props.onBookmark(t.props.status,e)})),Object(r.a)(Object(c.a)(t),"handleDeleteClick",(function(){t.props.onDelete(t.props.status,t.context.router.history)})),Object(r.a)(Object(c.a)(t),"handleRedraftClick",(function(){t.props.onDelete(t.props.status,t.context.router.history,!0)})),Object(r.a)(Object(c.a)(t),"handleDirectClick",(function(){t.props.onDirect(t.props.status.get("account"),t.context.router.history)})),Object(r.a)(Object(c.a)(t),"handleMentionClick",(function(){t.props.onMention(t.props.status.get("account"),t.context.router.history)})),Object(r.a)(Object(c.a)(t),"handleMuteClick",(function(){var e=t.props,a=e.status,n=e.relationship,o=e.onMute,i=e.onUnmute,s=a.get("account");n&&n.get("muting")?i(s):o(s)})),Object(r.a)(Object(c.a)(t),"handleBlockClick",(function(){var e=t.props,a=e.status,n=e.relationship,o=e.onBlock,i=e.onUnblock,s=a.get("account");n&&n.get("blocking")?i(s):o(a)})),Object(r.a)(Object(c.a)(t),"handleBlockDomain",(function(){var e=t.props,a=e.status;(0,e.onBlockDomain)(a.get("account").get("acct").split("@")[1])})),Object(r.a)(Object(c.a)(t),"handleUnblockDomain",(function(){var e=t.props,a=e.status;(0,e.onUnblockDomain)(a.get("account").get("acct").split("@")[1])})),Object(r.a)(Object(c.a)(t),"handleConversationMuteClick",(function(){t.props.onMuteConversation(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleReport",(function(){t.props.onReport(t.props.status)})),Object(r.a)(Object(c.a)(t),"handlePinClick",(function(){t.props.onPin(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleShare",(function(){navigator.share({text:t.props.status.get("search_index"),url:t.props.status.get("url")})})),Object(r.a)(Object(c.a)(t),"handleEmbed",(function(){t.props.onEmbed(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleCopy",(function(){var e=t.props.status.get("url"),a=document.createElement("textarea");a.textContent=e,a.style.position="fixed",document.body.appendChild(a);try{a.select(),document.execCommand("copy")}catch(e){}finally{document.body.removeChild(a)}})),t}return a.prototype.render=function(){var e=this.props,t=e.status,a=e.relationship,n=e.intl,o=["public","unlisted"].includes(t.get("visibility")),i=t.get("muted"),c=t.get("account"),l=[];if(o&&(l.push({text:n.formatMessage(U.copy),action:this.handleCopy}),l.push({text:n.formatMessage(U.embed),action:this.handleEmbed}),l.push(null)),x.n===t.getIn(["account","id"]))o?l.push({text:n.formatMessage(t.get("pinned")?U.unpin:U.pin),action:this.handlePinClick}):"private"===t.get("visibility")&&l.push({text:n.formatMessage(t.get("reblogged")?U.cancel_reblog_private:U.reblog_private),action:this.handleReblogClick}),l.push(null),l.push({text:n.formatMessage(i?U.unmuteConversation:U.muteConversation),action:this.handleConversationMuteClick}),l.push(null),l.push({text:n.formatMessage(U.delete),action:this.handleDeleteClick}),l.push({text:n.formatMessage(U.redraft),action:this.handleRedraftClick});else{if(l.push({text:n.formatMessage(U.mention,{name:t.getIn(["account","username"])}),action:this.handleMentionClick}),l.push({text:n.formatMessage(U.direct,{name:t.getIn(["account","username"])}),action:this.handleDirectClick}),l.push(null),a&&a.get("muting")?l.push({text:n.formatMessage(U.unmute,{name:c.get("username")}),action:this.handleMuteClick}):l.push({text:n.formatMessage(U.mute,{name:c.get("username")}),action:this.handleMuteClick}),a&&a.get("blocking")?l.push({text:n.formatMessage(U.unblock,{name:c.get("username")}),action:this.handleBlockClick}):l.push({text:n.formatMessage(U.block,{name:c.get("username")}),action:this.handleBlockClick}),l.push({text:n.formatMessage(U.report,{name:t.getIn(["account","username"])}),action:this.handleReport}),c.get("acct")!==c.get("username")){var r=c.get("acct").split("@")[1];l.push(null),a&&a.get("domain_blocking")?l.push({text:n.formatMessage(U.unblockDomain,{domain:r}),action:this.handleUnblockDomain}):l.push({text:n.formatMessage(U.blockDomain,{domain:r}),action:this.handleBlockDomain})}x.k&&(l.push(null),l.push({text:n.formatMessage(U.admin_account,{name:t.getIn(["account","username"])}),href:"/admin/accounts/"+t.getIn(["account","id"])}),l.push({text:n.formatMessage(U.admin_status),href:"/admin/accounts/"+t.getIn(["account","id"])+"/statuses/"+t.get("id")}))}var d,u="share"in navigator&&o&&Object(s.a)("div",{className:"detailed-status__button"},void 0,Object(s.a)(C.a,{title:n.formatMessage(U.share),icon:"share-alt",onClick:this.handleShare}));d=null===t.get("in_reply_to_id",null)?"reply":"reply-all";var p="retweet";return"direct"===t.get("visibility")?p="envelope":"private"===t.get("visibility")&&(p="lock"),Object(s.a)("div",{className:"detailed-status__action-bar"},void 0,Object(s.a)("div",{className:"detailed-status__button"},void 0,Object(s.a)(C.a,{title:n.formatMessage(U.reply),icon:t.get("in_reply_to_account_id")===t.getIn(["account","id"])?"reply":d,onClick:this.handleReplyClick})),Object(s.a)("div",{className:"detailed-status__button"},void 0,Object(s.a)(C.a,{disabled:!o,active:t.get("reblogged"),title:o?n.formatMessage(U.reblog):n.formatMessage(U.cannot_reblog),icon:p,onClick:this.handleReblogClick})),Object(s.a)("div",{className:"detailed-status__button"},void 0,Object(s.a)(C.a,{className:"star-icon",animate:!0,active:t.get("favourited"),title:n.formatMessage(U.favourite),icon:"star",onClick:this.handleFavouriteClick})),u,Object(s.a)("div",{className:"detailed-status__button"},void 0,Object(s.a)(C.a,{className:"bookmark-icon",active:t.get("bookmarked"),title:n.formatMessage(U.bookmark),icon:"bookmark",onClick:this.handleBookmarkClick})),Object(s.a)("div",{className:"detailed-status__action-bar-dropdown"},void 0,Object(s.a)(w.a,{size:18,icon:"ellipsis-h",status:t,items:l,direction:"left",title:n.formatMessage(U.more)})))},a}(h.a.PureComponent),Object(r.a)(o,"contextTypes",{router:m.a.object}),n=i))||n)||n,N=a(757),S=a(46),V=a(23),A=a(26),E=a(84),F=a(212),z=a(230),P=a(105),q=a(210),L=a(472),J=a(764),K=a(759),W=a(1080),Y=a(48),X=a(21),G=a(301),Q=a(261),Z=a(871),$=a(27);var ee=Object(I.f)({deleteConfirm:{id:"confirmations.delete.confirm",defaultMessage:"Delete"},deleteMessage:{id:"confirmations.delete.message",defaultMessage:"Are you sure you want to delete this status?"},redraftConfirm:{id:"confirmations.redraft.confirm",defaultMessage:"Delete & redraft"},redraftMessage:{id:"confirmations.redraft.message",defaultMessage:"Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned."},revealAll:{id:"status.show_more_all",defaultMessage:"Show more for all"},hideAll:{id:"status.show_less_all",defaultMessage:"Show less for all"},detailedStatus:{id:"status.detailed_status",defaultMessage:"Detailed conversation view"},replyConfirm:{id:"confirmations.reply.confirm",defaultMessage:"Reply"},replyMessage:{id:"confirmations.reply.message",defaultMessage:"Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?"},blockDomainConfirm:{id:"confirmations.domain_block.confirm",defaultMessage:"Hide entire domain"}}),te=(D=Object(b.connect)((function(){var e=Object(q.f)(),t=Object(k.a)([function(e,t){return t.id},function(e){return e.getIn(["contexts","inReplyTos"])}],(function(e,t){var a=u.a.List();return a=a.withMutations((function(a){for(var n=e;n;)a.unshift(n),n=t.get(n)}))})),a=Object(k.a)([function(e,t){return t.id},function(e){return e.getIn(["contexts","replies"])},function(e){return e.get("statuses")}],(function(e,t,a){for(var n=[],o=[e];o.length>0;){var i=o.shift(),s=t.get(i);e!==i&&n.push(i),s&&s.reverse().forEach((function(e){o.unshift(e)}))}var c=n.findIndex((function(e){return a.get(e).get("in_reply_to_account_id")!==a.get(e).get("account")}));return-1!==c&&n.forEach((function(e,t){t>c&&a.get(e).get("in_reply_to_account_id")===a.get(e).get("account")&&(n.splice(t,1),n.splice(c,0,e),c+=1)})),u.a.List(n)}));return function(n,o){var i=e(n,{id:o.params.statusId}),s=u.a.List(),c=u.a.List();return i&&(s=t(n,{id:i.get("in_reply_to_id")}),c=a(n,{id:i.get("id")})),{status:i,ancestorsIds:s,descendantsIds:c,askReplyConfirmation:0!==n.getIn(["compose","text"]).trim().length,domain:n.getIn(["meta","domain"])}}})),Object(I.g)(R=D((T=H=function(e){Object(l.a)(a,e);var t;t=a;function a(){for(var t,a=arguments.length,n=new Array(a),o=0;o<a;o++)n[o]=arguments[o];return t=e.call.apply(e,[this].concat(n))||this,Object(r.a)(Object(c.a)(t),"state",{fullscreen:!1,showMedia:Object(Z.b)(t.props.status),loadedStatusId:void 0}),Object(r.a)(Object(c.a)(t),"handleToggleMediaVisibility",(function(){t.setState({showMedia:!t.state.showMedia})})),Object(r.a)(Object(c.a)(t),"handleFavouriteClick",(function(e){e.get("favourited")?t.props.dispatch(Object(S.v)(e)):t.props.dispatch(Object(S.p)(e))})),Object(r.a)(Object(c.a)(t),"handlePin",(function(e){e.get("pinned")?t.props.dispatch(Object(S.w)(e)):t.props.dispatch(Object(S.s)(e))})),Object(r.a)(Object(c.a)(t),"handleReplyClick",(function(e){var a=t.props,n=a.askReplyConfirmation,o=a.dispatch,i=a.intl;o(n?Object(Y.d)("CONFIRM",{message:i.formatMessage(ee.replyMessage),confirm:i.formatMessage(ee.replyConfirm),onConfirm:function(){return o(Object(V.gb)(e,t.context.router.history))}}):Object(V.gb)(e,t.context.router.history))})),Object(r.a)(Object(c.a)(t),"handleModalReblog",(function(e){t.props.dispatch(Object(S.t)(e))})),Object(r.a)(Object(c.a)(t),"handleReblogClick",(function(e,a){e.get("reblogged")?t.props.dispatch(Object(S.x)(e)):a&&a.shiftKey||!x.b?t.handleModalReblog(e):t.props.dispatch(Object(Y.d)("BOOST",{status:e,onReblog:t.handleModalReblog}))})),Object(r.a)(Object(c.a)(t),"handleBookmarkClick",(function(e){e.get("bookmarked")?t.props.dispatch(Object(S.u)(e)):t.props.dispatch(Object(S.o)(e))})),Object(r.a)(Object(c.a)(t),"handleDeleteClick",(function(e,a,n){void 0===n&&(n=!1);var o=t.props,i=o.dispatch,s=o.intl;x.e?i(Object(Y.d)("CONFIRM",{message:s.formatMessage(n?ee.redraftMessage:ee.deleteMessage),confirm:s.formatMessage(n?ee.redraftConfirm:ee.deleteConfirm),onConfirm:function(){return i(Object(M.h)(e.get("id"),a,n))}})):i(Object(M.h)(e.get("id"),a,n))})),Object(r.a)(Object(c.a)(t),"handleDirectClick",(function(e,a){t.props.dispatch(Object(V.X)(e,a))})),Object(r.a)(Object(c.a)(t),"handleMentionClick",(function(e,a){t.props.dispatch(Object(V.cb)(e,a))})),Object(r.a)(Object(c.a)(t),"handleOpenMedia",(function(e,a){t.props.dispatch(Object(Y.d)("MEDIA",{media:e,index:a}))})),Object(r.a)(Object(c.a)(t),"handleOpenVideo",(function(e,a){t.props.dispatch(Object(Y.d)("VIDEO",{media:e,time:a}))})),Object(r.a)(Object(c.a)(t),"handleHotkeyOpenMedia",(function(e){var a=t._properStatus();e.preventDefault(),a.get("media_attachments").size>0&&("audio"===a.getIn(["media_attachments",0,"type"])||("video"===a.getIn(["media_attachments",0,"type"])?t.handleOpenVideo(a.getIn(["media_attachments",0]),0):t.handleOpenMedia(a.get("media_attachments"),0)))})),Object(r.a)(Object(c.a)(t),"handleMuteClick",(function(e){t.props.dispatch(Object(F.g)(e))})),Object(r.a)(Object(c.a)(t),"handleConversationMuteClick",(function(e){e.get("muted")?t.props.dispatch(Object(M.n)(e.get("id"))):t.props.dispatch(Object(M.k)(e.get("id")))})),Object(r.a)(Object(c.a)(t),"handleToggleHidden",(function(e){e.get("hidden")?t.props.dispatch(Object(M.l)(e.get("id"))):t.props.dispatch(Object(M.j)(e.get("id")))})),Object(r.a)(Object(c.a)(t),"handleToggleAll",(function(){var e=t.props,a=e.status,n=e.ancestorsIds,o=e.descendantsIds,i=[a.get("id")].concat(n.toJS(),o.toJS());a.get("hidden")?t.props.dispatch(Object(M.l)(i)):t.props.dispatch(Object(M.j)(i))})),Object(r.a)(Object(c.a)(t),"handleBlockClick",(function(e){var a=t.props.dispatch,n=e.get("account");a(Object(z.f)(n))})),Object(r.a)(Object(c.a)(t),"handleReport",(function(e){t.props.dispatch(Object(P.k)(e.get("account"),e))})),Object(r.a)(Object(c.a)(t),"handleEmbed",(function(e){t.props.dispatch(Object(Y.d)("EMBED",{url:e.get("url")}))})),Object(r.a)(Object(c.a)(t),"handleUnmuteClick",(function(e){t.props.dispatch(Object(A.L)(e.get("id")))})),Object(r.a)(Object(c.a)(t),"handleUnblockClick",(function(e){t.props.dispatch(Object(A.J)(e.get("id")))})),Object(r.a)(Object(c.a)(t),"handleBlockDomainClick",(function(e){t.props.dispatch(Object(Y.d)("CONFIRM",{message:Object(s.a)(I.b,{id:"confirmations.domain_block.message",defaultMessage:"Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",values:{domain:Object(s.a)("strong",{},void 0,e)}}),confirm:t.props.intl.formatMessage(ee.blockDomainConfirm),onConfirm:function(){return t.props.dispatch(Object(E.e)(e))}}))})),Object(r.a)(Object(c.a)(t),"handleUnblockDomainClick",(function(e){t.props.dispatch(Object(E.h)(e))})),Object(r.a)(Object(c.a)(t),"handleHotkeyMoveUp",(function(){t.handleMoveUp(t.props.status.get("id"))})),Object(r.a)(Object(c.a)(t),"handleHotkeyMoveDown",(function(){t.handleMoveDown(t.props.status.get("id"))})),Object(r.a)(Object(c.a)(t),"handleHotkeyReply",(function(e){e.preventDefault(),t.handleReplyClick(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleHotkeyFavourite",(function(){t.handleFavouriteClick(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleHotkeyBoost",(function(){t.handleReblogClick(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleHotkeyMention",(function(e){e.preventDefault(),t.handleMentionClick(t.props.status.get("account"))})),Object(r.a)(Object(c.a)(t),"handleHotkeyOpenProfile",(function(){t.context.router.history.push("/accounts/"+t.props.status.getIn(["account","id"]))})),Object(r.a)(Object(c.a)(t),"handleHotkeyToggleHidden",(function(){t.handleToggleHidden(t.props.status)})),Object(r.a)(Object(c.a)(t),"handleHotkeyToggleSensitive",(function(){t.handleToggleMediaVisibility()})),Object(r.a)(Object(c.a)(t),"handleMoveUp",(function(e){var a=t.props,n=a.status,o=a.ancestorsIds,i=a.descendantsIds;if(e===n.get("id"))t._selectChild(o.size-1,!0);else{var s=o.indexOf(e);-1===s?(s=i.indexOf(e),t._selectChild(o.size+s,!0)):t._selectChild(s-1,!0)}})),Object(r.a)(Object(c.a)(t),"handleMoveDown",(function(e){var a=t.props,n=a.status,o=a.ancestorsIds,i=a.descendantsIds;if(e===n.get("id"))t._selectChild(o.size+1,!1);else{var s=o.indexOf(e);-1===s?(s=i.indexOf(e),t._selectChild(o.size+s+2,!1)):t._selectChild(s+1,!1)}})),Object(r.a)(Object(c.a)(t),"setRef",(function(e){t.node=e})),Object(r.a)(Object(c.a)(t),"onFullScreenChange",(function(){t.setState({fullscreen:Object(Q.d)()})})),t}var n=a.prototype;return n.componentWillMount=function(){this.props.dispatch(Object(M.i)(this.props.params.statusId))},n.componentDidMount=function(){Object(Q.a)(this.onFullScreenChange)},n.componentWillReceiveProps=function(e){e.params.statusId!==this.props.params.statusId&&e.params.statusId&&(this._scrolledIntoView=!1,this.props.dispatch(Object(M.i)(e.params.statusId))),e.status&&e.status.get("id")!==this.state.loadedStatusId&&this.setState({showMedia:Object(Z.b)(e.status),loadedStatusId:e.status.get("id")})},n._selectChild=function(e,t){var a=this.node,n=a.querySelectorAll(".focusable")[e];n&&(t&&a.scrollTop>n.offsetTop?n.scrollIntoView(!0):!t&&a.scrollTop+a.clientHeight<n.offsetTop+n.offsetHeight&&n.scrollIntoView(!1),n.focus())},n.renderChildren=function(e){var t=this;return e.map((function(e){return Object(s.a)(W.a,{id:e,onMoveUp:t.handleMoveUp,onMoveDown:t.handleMoveDown,contextType:"thread"},e)}))},n.componentDidUpdate=function(){if(!this._scrolledIntoView){var e=this.props,t=e.status,a=e.ancestorsIds;if(t&&a&&a.size>0){var n=this.node.querySelectorAll(".focusable")[a.size-1];window.requestAnimationFrame((function(){n.scrollIntoView(!0)})),this._scrolledIntoView=!0}}},n.componentWillUnmount=function(){Object(Q.b)(this.onFullScreenChange)},n.render=function(){var e,t,a=this.props,n=a.shouldUpdateScroll,o=a.status,i=a.ancestorsIds,c=a.descendantsIds,l=a.intl,r=a.domain,d=a.multiColumn,u=this.state.fullscreen;if(null===o)return Object(s.a)(N.a,{},void 0,Object(s.a)(J.a,{multiColumn:d}),Object(s.a)(y.a,{}));i&&i.size>0&&(e=Object(s.a)("div",{},void 0,this.renderChildren(i))),c&&c.size>0&&(t=Object(s.a)("div",{},void 0,this.renderChildren(c)));var p={moveUp:this.handleHotkeyMoveUp,moveDown:this.handleHotkeyMoveDown,reply:this.handleHotkeyReply,favourite:this.handleHotkeyFavourite,boost:this.handleHotkeyBoost,mention:this.handleHotkeyMention,openProfile:this.handleHotkeyOpenProfile,toggleHidden:this.handleHotkeyToggleHidden,toggleSensitive:this.handleHotkeyToggleSensitive,openMedia:this.handleHotkeyOpenMedia};return(Object(s.a)(N.a,{bindToDocument:!d,label:l.formatMessage(ee.detailedStatus)},void 0,Object(s.a)(K.a,{showBackButton:!0,multiColumn:d,extraButton:Object(s.a)("button",{className:"column-header__button",title:l.formatMessage(o.get("hidden")?ee.revealAll:ee.hideAll),"aria-label":l.formatMessage(o.get("hidden")?ee.revealAll:ee.hideAll),onClick:this.handleToggleAll,"aria-pressed":o.get("hidden")?"false":"true"},void 0,Object(s.a)($.a,{id:o.get("hidden")?"eye-slash":"eye"}))}),Object(s.a)(L.a,{scrollKey:"thread",shouldUpdateScroll:n},void 0,h.a.createElement("div",{className:O()("scrollable",{fullscreen:u}),ref:this.setRef},e,Object(s.a)(G.HotKeys,{handlers:p},void 0,Object(s.a)("div",{className:O()("focusable","detailed-status__wrapper"),tabIndex:"0","aria-label":Object(Z.c)(l,o,!1)},void 0,Object(s.a)(_.a,{status:o,onOpenVideo:this.handleOpenVideo,onOpenMedia:this.handleOpenMedia,onToggleHidden:this.handleToggleHidden,domain:r,showMedia:this.state.showMedia,onToggleMediaVisibility:this.handleToggleMediaVisibility},"details-"+o.get("id")),Object(s.a)(B,{status:o,onReply:this.handleReplyClick,onFavourite:this.handleFavouriteClick,onReblog:this.handleReblogClick,onBookmark:this.handleBookmarkClick,onDelete:this.handleDeleteClick,onDirect:this.handleDirectClick,onMention:this.handleMentionClick,onMute:this.handleMuteClick,onUnmute:this.handleUnmuteClick,onMuteConversation:this.handleConversationMuteClick,onBlock:this.handleBlockClick,onUnblock:this.handleUnblockClick,onBlockDomain:this.handleBlockDomainClick,onUnblockDomain:this.handleUnblockDomainClick,onReport:this.handleReport,onPin:this.handlePin,onEmbed:this.handleEmbed},"action-bar-"+o.get("id")))),t))))},a}(X.a),Object(r.a)(H,"contextTypes",{router:m.a.object}),Object(r.a)(H,"propTypes",{params:m.a.object.isRequired,dispatch:m.a.func.isRequired,status:v.a.map,ancestorsIds:v.a.list,descendantsIds:v.a.list,intl:m.a.object.isRequired,askReplyConfirmation:m.a.bool,multiColumn:m.a.bool,domain:m.a.string.isRequired}),R=T))||R)||R)}}]);
//# sourceMappingURL=status.js.map \ No newline at end of file
diff --git a/priv/static/packs/features/status.js.map b/priv/static/packs/features/status.js.map
index 55d5f08e7..f4688ee17 100644
--- a/priv/static/packs/features/status.js.map
+++ b/priv/static/packs/features/status.js.map
@@ -1 +1 @@
-{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/components/detailed_status.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/components/action_bar.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/index.js"],"names":["DetailedStatus","height","e","button","ctrlKey","metaKey","context","router","preventDefault","history","push","props","status","getIn","stopPropagation","media","startTime","onOpenVideo","onToggleHidden","c","node","_measureHeight","href","target","nodeName","parentNode","window","open","heightJustChanged","this","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","state","render","get","outerStyle","boxSizing","compact","applicationLink","reblogLink","reblogIcon","favouriteLink","size","attachment","src","alt","duration","preload","preview","blurhash","width","inline","handleOpenVideo","sensitive","visible","showMedia","onToggleVisibility","onToggleMediaVisibility","standalone","onOpenMedia","length","card","className","rel","id","to","value","onClick","handleModalLink","style","ref","setRef","classNames","handleAccountClick","account","localDomain","domain","expanded","onExpandedToggle","handleExpandedToggle","Date","hour12","year","month","day","hour","minute","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","bool","string","messages","defineMessages","delete","redraft","direct","mention","reply","reblog","reblog_private","cancel_reblog_private","cannot_reblog","favourite","bookmark","mute","muteConversation","unmuteConversation","block","report","share","pin","unpin","embed","admin_account","admin_status","copy","blockDomain","unblockDomain","unmute","unblock","ActionBar","connect","relationship","injectIntl","onReply","onReblog","onFavourite","onBookmark","onDelete","onDirect","onMention","onMute","onUnmute","onBlock","onUnblock","onBlockDomain","split","onUnblockDomain","onMuteConversation","onReport","onPin","navigator","text","url","onEmbed","textarea","document","createElement","textContent","position","body","appendChild","select","execCommand","removeChild","intl","publicStatus","includes","mutingConversation","menu","formatMessage","action","handleCopy","handleEmbed","me","handlePinClick","handleReblogClick","handleConversationMuteClick","handleDeleteClick","handleRedraftClick","name","handleMentionClick","handleDirectClick","handleMuteClick","handleBlockClick","handleReport","handleUnblockDomain","handleBlockDomain","isStaff","replyIcon","shareButton","title","icon","handleShare","reblog_disabled","handleReplyClick","disabled","active","animate","handleFavouriteClick","handleBookmarkClick","items","direction","React","PureComponent","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","revealAll","hideAll","detailedStatus","replyConfirm","replyMessage","blockDomainConfirm","Status","getStatus","makeGetStatus","getAncestorsIds","createSelector","_","statusId","inReplyTos","ancestorsIds","Immutable","List","withMutations","mutable","unshift","getDescendantsIds","contextReplies","statuses","descendantsIds","ids","shift","replies","reverse","forEach","insertAt","findIndex","idx","splice","params","askReplyConfirmation","trim","fullscreen","defaultMediaVisibility","loadedStatusId","undefined","dispatch","unfavourite","openModal","message","confirm","onConfirm","replyCompose","unreblog","shiftKey","boostModal","handleModalReblog","unbookmark","withRedraft","deleteModal","deleteStatus","directCompose","mentionCompose","index","time","_properStatus","handleOpenMedia","initMuteModal","unmuteStatus","muteStatus","revealStatus","hideStatus","statusIds","concat","toJS","initBlockModal","initReport","unmuteAccount","unblockAccount","defaultMessage","values","handleMoveUp","handleMoveDown","handleToggleHidden","handleToggleMediaVisibility","_selectChild","indexOf","isFullscreen","componentWillMount","fetchStatus","componentDidMount","attachFullscreenListener","onFullScreenChange","componentWillReceiveProps","nextProps","_scrolledIntoView","align_top","container","element","querySelectorAll","scrollTop","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","renderChildren","list","onMoveUp","onMoveDown","contextType","requestAnimationFrame","componentWillUnmount","detachFullscreenListener","ancestors","descendants","shouldUpdateScroll","multiColumn","handlers","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","handleHotkeyReply","handleHotkeyFavourite","boost","handleHotkeyBoost","handleHotkeyMention","openProfile","handleHotkeyOpenProfile","toggleHidden","handleHotkeyToggleHidden","toggleSensitive","handleHotkeyToggleSensitive","openMedia","handleHotkeyOpenMedia","bindToDocument","label","showBackButton","extraButton","aria-label","handleToggleAll","aria-pressed","scrollKey","tabIndex","textForScreenReader","handleUnmuteClick","handleUnblockClick","handleBlockDomainClick","handleUnblockDomainClick","handlePin"],"mappings":"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","file":"features/status.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport StatusContent from '../../../components/status_content';\nimport MediaGallery from '../../../components/media_gallery';\nimport { Link } from 'react-router-dom';\nimport { FormattedDate, FormattedNumber } from 'react-intl';\nimport Card from './card';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Video from '../../video';\nimport Audio from '../../audio';\nimport scheduleIdleTask from '../../ui/util/schedule_idle_task';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\n\nexport default class DetailedStatus extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map,\n onOpenMedia: PropTypes.func.isRequired,\n onOpenVideo: PropTypes.func.isRequired,\n onToggleHidden: PropTypes.func.isRequired,\n measureHeight: PropTypes.bool,\n onHeightChange: PropTypes.func,\n domain: PropTypes.string.isRequired,\n compact: PropTypes.bool,\n showMedia: PropTypes.bool,\n onToggleMediaVisibility: PropTypes.func,\n };\n\n state = {\n height: null,\n };\n\n handleAccountClick = (e) => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey) && this.context.router) {\n e.preventDefault();\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n }\n\n e.stopPropagation();\n }\n\n handleOpenVideo = (media, startTime) => {\n this.props.onOpenVideo(media, startTime);\n }\n\n handleExpandedToggle = () => {\n this.props.onToggleHidden(this.props.status);\n }\n\n _measureHeight (heightJustChanged) {\n if (this.props.measureHeight && this.node) {\n scheduleIdleTask(() => this.node && this.setState({ height: Math.ceil(this.node.scrollHeight) + 1 }));\n\n if (this.props.onHeightChange && heightJustChanged) {\n this.props.onHeightChange();\n }\n }\n }\n\n setRef = c => {\n this.node = c;\n this._measureHeight();\n }\n\n componentDidUpdate (prevProps, prevState) {\n this._measureHeight(prevState.height !== this.state.height);\n }\n\n handleModalLink = e => {\n e.preventDefault();\n\n let href;\n\n if (e.target.nodeName !== 'A') {\n href = e.target.parentNode.href;\n } else {\n href = e.target.href;\n }\n\n window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');\n }\n\n render () {\n const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;\n const outerStyle = { boxSizing: 'border-box' };\n const { compact } = this.props;\n\n if (!status) {\n return null;\n }\n\n let media = '';\n let applicationLink = '';\n let reblogLink = '';\n let reblogIcon = 'retweet';\n let favouriteLink = '';\n\n if (this.props.measureHeight) {\n outerStyle.height = `${this.state.height}px`;\n }\n\n if (status.get('media_attachments').size > 0) {\n if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {\n const attachment = status.getIn(['media_attachments', 0]);\n\n media = (\n <Audio\n src={attachment.get('url')}\n alt={attachment.get('description')}\n duration={attachment.getIn(['meta', 'original', 'duration'], 0)}\n height={110}\n preload\n />\n );\n } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n const attachment = status.getIn(['media_attachments', 0]);\n\n media = (\n <Video\n preview={attachment.get('preview_url')}\n blurhash={attachment.get('blurhash')}\n src={attachment.get('url')}\n alt={attachment.get('description')}\n width={300}\n height={150}\n inline\n onOpenVideo={this.handleOpenVideo}\n sensitive={status.get('sensitive')}\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n } else {\n media = (\n <MediaGallery\n standalone\n sensitive={status.get('sensitive')}\n media={status.get('media_attachments')}\n height={300}\n onOpenMedia={this.props.onOpenMedia}\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n }\n } else if (status.get('spoiler_text').length === 0) {\n media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;\n }\n\n if (status.get('application')) {\n applicationLink = <span> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></span>;\n }\n\n if (status.get('visibility') === 'direct') {\n reblogIcon = 'envelope';\n } else if (status.get('visibility') === 'private') {\n reblogIcon = 'lock';\n }\n\n if (status.get('visibility') === 'private') {\n reblogLink = <Icon id={reblogIcon} />;\n } else if (this.context.router) {\n reblogLink = (\n <Link to={`/statuses/${status.get('id')}/reblogs`} className='detailed-status__link'>\n <Icon id={reblogIcon} />\n <span className='detailed-status__reblogs'>\n <FormattedNumber value={status.get('reblogs_count')} />\n </span>\n </Link>\n );\n } else {\n reblogLink = (\n <a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>\n <Icon id={reblogIcon} />\n <span className='detailed-status__reblogs'>\n <FormattedNumber value={status.get('reblogs_count')} />\n </span>\n </a>\n );\n }\n\n if (this.context.router) {\n favouriteLink = (\n <Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>\n <Icon id='star' />\n <span className='detailed-status__favorites'>\n <FormattedNumber value={status.get('favourites_count')} />\n </span>\n </Link>\n );\n } else {\n favouriteLink = (\n <a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>\n <Icon id='star' />\n <span className='detailed-status__favorites'>\n <FormattedNumber value={status.get('favourites_count')} />\n </span>\n </a>\n );\n }\n\n return (\n <div style={outerStyle}>\n <div ref={this.setRef} className={classNames('detailed-status', { compact })}>\n <a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='detailed-status__display-name'>\n <div className='detailed-status__display-avatar'><Avatar account={status.get('account')} size={48} /></div>\n <DisplayName account={status.get('account')} localDomain={this.props.domain} />\n </a>\n\n <StatusContent status={status} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} />\n\n {media}\n\n <div className='detailed-status__meta'>\n <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener noreferrer'>\n <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />\n </a>{applicationLink} · {reblogLink} · {favouriteLink}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport IconButton from '../../../components/icon_button';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport DropdownMenuContainer from '../../../containers/dropdown_menu_container';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { me, isStaff } from '../../../initial_state';\n\nconst messages = defineMessages({\n delete: { id: 'status.delete', defaultMessage: 'Delete' },\n redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },\n direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },\n mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },\n reply: { id: 'status.reply', defaultMessage: 'Reply' },\n reblog: { id: 'status.reblog', defaultMessage: 'Boost' },\n reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost to original audience' },\n cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },\n cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },\n favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },\n bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },\n mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },\n muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },\n unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },\n block: { id: 'status.block', defaultMessage: 'Block @{name}' },\n report: { id: 'status.report', defaultMessage: 'Report @{name}' },\n share: { id: 'status.share', defaultMessage: 'Share' },\n pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },\n unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },\n embed: { id: 'status.embed', defaultMessage: 'Embed' },\n admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },\n admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },\n copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },\n blockDomain: { id: 'account.block_domain', defaultMessage: 'Hide everything from {domain}' },\n unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unhide {domain}' },\n unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },\n unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },\n});\n\nconst mapStateToProps = (state, { status }) => ({\n relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass ActionBar extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map.isRequired,\n relationship: ImmutablePropTypes.map,\n onReply: PropTypes.func.isRequired,\n onReblog: PropTypes.func.isRequired,\n onFavourite: PropTypes.func.isRequired,\n onBookmark: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n onDirect: PropTypes.func.isRequired,\n onMention: PropTypes.func.isRequired,\n onMute: PropTypes.func,\n onUnmute: PropTypes.func,\n onBlock: PropTypes.func,\n onUnblock: PropTypes.func,\n onBlockDomain: PropTypes.func,\n onUnblockDomain: PropTypes.func,\n onMuteConversation: PropTypes.func,\n onReport: PropTypes.func,\n onPin: PropTypes.func,\n onEmbed: PropTypes.func,\n intl: PropTypes.object.isRequired,\n };\n\n handleReplyClick = () => {\n this.props.onReply(this.props.status);\n }\n\n handleReblogClick = (e) => {\n this.props.onReblog(this.props.status, e);\n }\n\n handleFavouriteClick = () => {\n this.props.onFavourite(this.props.status);\n }\n\n handleBookmarkClick = (e) => {\n this.props.onBookmark(this.props.status, e);\n }\n\n handleDeleteClick = () => {\n this.props.onDelete(this.props.status, this.context.router.history);\n }\n\n handleRedraftClick = () => {\n this.props.onDelete(this.props.status, this.context.router.history, true);\n }\n\n handleDirectClick = () => {\n this.props.onDirect(this.props.status.get('account'), this.context.router.history);\n }\n\n handleMentionClick = () => {\n this.props.onMention(this.props.status.get('account'), this.context.router.history);\n }\n\n handleMuteClick = () => {\n const { status, relationship, onMute, onUnmute } = this.props;\n const account = status.get('account');\n\n if (relationship && relationship.get('muting')) {\n onUnmute(account);\n } else {\n onMute(account);\n }\n }\n\n handleBlockClick = () => {\n const { status, relationship, onBlock, onUnblock } = this.props;\n const account = status.get('account');\n\n if (relationship && relationship.get('blocking')) {\n onUnblock(account);\n } else {\n onBlock(status);\n }\n }\n\n handleBlockDomain = () => {\n const { status, onBlockDomain } = this.props;\n const account = status.get('account');\n\n onBlockDomain(account.get('acct').split('@')[1]);\n }\n\n handleUnblockDomain = () => {\n const { status, onUnblockDomain } = this.props;\n const account = status.get('account');\n\n onUnblockDomain(account.get('acct').split('@')[1]);\n }\n\n handleConversationMuteClick = () => {\n this.props.onMuteConversation(this.props.status);\n }\n\n handleReport = () => {\n this.props.onReport(this.props.status);\n }\n\n handlePinClick = () => {\n this.props.onPin(this.props.status);\n }\n\n handleShare = () => {\n navigator.share({\n text: this.props.status.get('search_index'),\n url: this.props.status.get('url'),\n });\n }\n\n handleEmbed = () => {\n this.props.onEmbed(this.props.status);\n }\n\n handleCopy = () => {\n const url = this.props.status.get('url');\n const textarea = document.createElement('textarea');\n\n textarea.textContent = url;\n textarea.style.position = 'fixed';\n\n document.body.appendChild(textarea);\n\n try {\n textarea.select();\n document.execCommand('copy');\n } catch (e) {\n\n } finally {\n document.body.removeChild(textarea);\n }\n }\n\n render () {\n const { status, relationship, intl } = this.props;\n\n const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));\n const mutingConversation = status.get('muted');\n const account = status.get('account');\n\n let menu = [];\n\n if (publicStatus) {\n menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });\n menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });\n menu.push(null);\n }\n\n if (me === status.getIn(['account', 'id'])) {\n if (publicStatus) {\n menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });\n } else {\n if (status.get('visibility') === 'private') {\n menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancel_reblog_private : messages.reblog_private), action: this.handleReblogClick });\n }\n }\n\n menu.push(null);\n menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });\n menu.push(null);\n menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });\n menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });\n menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });\n menu.push(null);\n\n if (relationship && relationship.get('muting')) {\n menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.handleMuteClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.handleMuteClick });\n }\n\n if (relationship && relationship.get('blocking')) {\n menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.handleBlockClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.handleBlockClick });\n }\n\n menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });\n\n if (account.get('acct') !== account.get('username')) {\n const domain = account.get('acct').split('@')[1];\n\n menu.push(null);\n\n if (relationship && relationship.get('domain_blocking')) {\n menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.handleUnblockDomain });\n } else {\n menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.handleBlockDomain });\n }\n }\n\n if (isStaff) {\n menu.push(null);\n menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });\n menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });\n }\n }\n\n const shareButton = ('share' in navigator) && status.get('visibility') === 'public' && (\n <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShare} /></div>\n );\n\n let replyIcon;\n if (status.get('in_reply_to_id', null) === null) {\n replyIcon = 'reply';\n } else {\n replyIcon = 'reply-all';\n }\n\n let reblogIcon = 'retweet';\n if (status.get('visibility') === 'direct') reblogIcon = 'envelope';\n else if (status.get('visibility') === 'private') reblogIcon = 'lock';\n\n let reblog_disabled = (status.get('visibility') === 'direct' || status.get('visibility') === 'private');\n\n return (\n <div className='detailed-status__action-bar'>\n <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /></div>\n <div className='detailed-status__button'><IconButton disabled={reblog_disabled} active={status.get('reblogged')} title={reblog_disabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>\n <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>\n {shareButton}\n <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>\n\n <div className='detailed-status__action-bar-dropdown'>\n <DropdownMenuContainer size={18} icon='ellipsis-h' status={status} items={menu} direction='left' title='More' />\n </div>\n </div>\n );\n }\n\n}\n","import Immutable from 'immutable';\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { createSelector } from 'reselect';\nimport { fetchStatus } from '../../actions/statuses';\nimport MissingIndicator from '../../components/missing_indicator';\nimport DetailedStatus from './components/detailed_status';\nimport ActionBar from './components/action_bar';\nimport Column from '../ui/components/column';\nimport {\n favourite,\n unfavourite,\n bookmark,\n unbookmark,\n reblog,\n unreblog,\n pin,\n unpin,\n} from '../../actions/interactions';\nimport {\n replyCompose,\n mentionCompose,\n directCompose,\n} from '../../actions/compose';\nimport {\n muteStatus,\n unmuteStatus,\n deleteStatus,\n hideStatus,\n revealStatus,\n} from '../../actions/statuses';\nimport {\n unblockAccount,\n unmuteAccount,\n} from '../../actions/accounts';\nimport {\n blockDomain,\n unblockDomain,\n} from '../../actions/domain_blocks';\nimport { initMuteModal } from '../../actions/mutes';\nimport { initBlockModal } from '../../actions/blocks';\nimport { initReport } from '../../actions/reports';\nimport { makeGetStatus } from '../../selectors';\nimport { ScrollContainer } from 'react-router-scroll-4';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ColumnHeader from '../../components/column_header';\nimport StatusContainer from '../../containers/status_container';\nimport { openModal } from '../../actions/modal';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { HotKeys } from 'react-hotkeys';\nimport { boostModal, deleteModal } from '../../initial_state';\nimport { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';\nimport { textForScreenReader, defaultMediaVisibility } from '../../components/status';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },\n deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },\n redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },\n redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' },\n revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },\n hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },\n detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },\n replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },\n replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },\n blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },\n});\n\nconst makeMapStateToProps = () => {\n const getStatus = makeGetStatus();\n\n const getAncestorsIds = createSelector([\n (_, { id }) => id,\n state => state.getIn(['contexts', 'inReplyTos']),\n ], (statusId, inReplyTos) => {\n let ancestorsIds = Immutable.List();\n ancestorsIds = ancestorsIds.withMutations(mutable => {\n let id = statusId;\n\n while (id) {\n mutable.unshift(id);\n id = inReplyTos.get(id);\n }\n });\n\n return ancestorsIds;\n });\n\n const getDescendantsIds = createSelector([\n (_, { id }) => id,\n state => state.getIn(['contexts', 'replies']),\n state => state.get('statuses'),\n ], (statusId, contextReplies, statuses) => {\n let descendantsIds = [];\n const ids = [statusId];\n\n while (ids.length > 0) {\n let id = ids.shift();\n const replies = contextReplies.get(id);\n\n if (statusId !== id) {\n descendantsIds.push(id);\n }\n\n if (replies) {\n replies.reverse().forEach(reply => {\n ids.unshift(reply);\n });\n }\n }\n\n let insertAt = descendantsIds.findIndex((id) => statuses.get(id).get('in_reply_to_account_id') !== statuses.get(id).get('account'));\n if (insertAt !== -1) {\n descendantsIds.forEach((id, idx) => {\n if (idx > insertAt && statuses.get(id).get('in_reply_to_account_id') === statuses.get(id).get('account')) {\n descendantsIds.splice(idx, 1);\n descendantsIds.splice(insertAt, 0, id);\n insertAt += 1;\n }\n });\n }\n\n return Immutable.List(descendantsIds);\n });\n\n const mapStateToProps = (state, props) => {\n const status = getStatus(state, { id: props.params.statusId });\n let ancestorsIds = Immutable.List();\n let descendantsIds = Immutable.List();\n\n if (status) {\n ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });\n descendantsIds = getDescendantsIds(state, { id: status.get('id') });\n }\n\n return {\n status,\n ancestorsIds,\n descendantsIds,\n askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0,\n domain: state.getIn(['meta', 'domain']),\n };\n };\n\n return mapStateToProps;\n};\n\nexport default @injectIntl\n@connect(makeMapStateToProps)\nclass Status extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n status: ImmutablePropTypes.map,\n ancestorsIds: ImmutablePropTypes.list,\n descendantsIds: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n askReplyConfirmation: PropTypes.bool,\n multiColumn: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n };\n\n state = {\n fullscreen: false,\n showMedia: defaultMediaVisibility(this.props.status),\n loadedStatusId: undefined,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchStatus(this.props.params.statusId));\n }\n\n componentDidMount () {\n attachFullscreenListener(this.onFullScreenChange);\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {\n this._scrolledIntoView = false;\n this.props.dispatch(fetchStatus(nextProps.params.statusId));\n }\n\n if (nextProps.status && nextProps.status.get('id') !== this.state.loadedStatusId) {\n this.setState({ showMedia: defaultMediaVisibility(nextProps.status), loadedStatusId: nextProps.status.get('id') });\n }\n }\n\n handleToggleMediaVisibility = () => {\n this.setState({ showMedia: !this.state.showMedia });\n }\n\n handleFavouriteClick = (status) => {\n if (status.get('favourited')) {\n this.props.dispatch(unfavourite(status));\n } else {\n this.props.dispatch(favourite(status));\n }\n }\n\n handlePin = (status) => {\n if (status.get('pinned')) {\n this.props.dispatch(unpin(status));\n } else {\n this.props.dispatch(pin(status));\n }\n }\n\n handleReplyClick = (status) => {\n let { askReplyConfirmation, dispatch, intl } = this.props;\n if (askReplyConfirmation) {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.replyMessage),\n confirm: intl.formatMessage(messages.replyConfirm),\n onConfirm: () => dispatch(replyCompose(status, this.context.router.history)),\n }));\n } else {\n dispatch(replyCompose(status, this.context.router.history));\n }\n }\n\n handleModalReblog = (status) => {\n this.props.dispatch(reblog(status));\n }\n\n handleReblogClick = (status, e) => {\n if (status.get('reblogged')) {\n this.props.dispatch(unreblog(status));\n } else {\n if ((e && e.shiftKey) || !boostModal) {\n this.handleModalReblog(status);\n } else {\n this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog }));\n }\n }\n }\n\n handleBookmarkClick = (status) => {\n if (status.get('bookmarked')) {\n this.props.dispatch(unbookmark(status));\n } else {\n this.props.dispatch(bookmark(status));\n }\n }\n\n handleDeleteClick = (status, history, withRedraft = false) => {\n const { dispatch, intl } = this.props;\n\n if (!deleteModal) {\n dispatch(deleteStatus(status.get('id'), history, withRedraft));\n } else {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),\n confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),\n onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)),\n }));\n }\n }\n\n handleDirectClick = (account, router) => {\n this.props.dispatch(directCompose(account, router));\n }\n\n handleMentionClick = (account, router) => {\n this.props.dispatch(mentionCompose(account, router));\n }\n\n handleOpenMedia = (media, index) => {\n this.props.dispatch(openModal('MEDIA', { media, index }));\n }\n\n handleOpenVideo = (media, time) => {\n this.props.dispatch(openModal('VIDEO', { media, time }));\n }\n\n handleHotkeyOpenMedia = e => {\n const status = this._properStatus();\n\n e.preventDefault();\n\n if (status.get('media_attachments').size > 0) {\n if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {\n // TODO: toggle play/paused?\n } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n this.handleOpenVideo(status.getIn(['media_attachments', 0]), 0);\n } else {\n this.handleOpenMedia(status.get('media_attachments'), 0);\n }\n }\n }\n\n handleMuteClick = (account) => {\n this.props.dispatch(initMuteModal(account));\n }\n\n handleConversationMuteClick = (status) => {\n if (status.get('muted')) {\n this.props.dispatch(unmuteStatus(status.get('id')));\n } else {\n this.props.dispatch(muteStatus(status.get('id')));\n }\n }\n\n handleToggleHidden = (status) => {\n if (status.get('hidden')) {\n this.props.dispatch(revealStatus(status.get('id')));\n } else {\n this.props.dispatch(hideStatus(status.get('id')));\n }\n }\n\n handleToggleAll = () => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS());\n\n if (status.get('hidden')) {\n this.props.dispatch(revealStatus(statusIds));\n } else {\n this.props.dispatch(hideStatus(statusIds));\n }\n }\n\n handleBlockClick = (status) => {\n const { dispatch } = this.props;\n const account = status.get('account');\n dispatch(initBlockModal(account));\n }\n\n handleReport = (status) => {\n this.props.dispatch(initReport(status.get('account'), status));\n }\n\n handleEmbed = (status) => {\n this.props.dispatch(openModal('EMBED', { url: status.get('url') }));\n }\n\n handleUnmuteClick = account => {\n this.props.dispatch(unmuteAccount(account.get('id')));\n }\n\n handleUnblockClick = account => {\n this.props.dispatch(unblockAccount(account.get('id')));\n }\n\n handleBlockDomainClick = domain => {\n this.props.dispatch(openModal('CONFIRM', {\n message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.' values={{ domain: <strong>{domain}</strong> }} />,\n confirm: this.props.intl.formatMessage(messages.blockDomainConfirm),\n onConfirm: () => this.props.dispatch(blockDomain(domain)),\n }));\n }\n\n handleUnblockDomainClick = domain => {\n this.props.dispatch(unblockDomain(domain));\n }\n\n\n handleHotkeyMoveUp = () => {\n this.handleMoveUp(this.props.status.get('id'));\n }\n\n handleHotkeyMoveDown = () => {\n this.handleMoveDown(this.props.status.get('id'));\n }\n\n handleHotkeyReply = e => {\n e.preventDefault();\n this.handleReplyClick(this.props.status);\n }\n\n handleHotkeyFavourite = () => {\n this.handleFavouriteClick(this.props.status);\n }\n\n handleHotkeyBoost = () => {\n this.handleReblogClick(this.props.status);\n }\n\n handleHotkeyMention = e => {\n e.preventDefault();\n this.handleMentionClick(this.props.status.get('account'));\n }\n\n handleHotkeyOpenProfile = () => {\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n }\n\n handleHotkeyToggleHidden = () => {\n this.handleToggleHidden(this.props.status);\n }\n\n handleHotkeyToggleSensitive = () => {\n this.handleToggleMediaVisibility();\n }\n\n handleMoveUp = id => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n\n if (id === status.get('id')) {\n this._selectChild(ancestorsIds.size - 1, true);\n } else {\n let index = ancestorsIds.indexOf(id);\n\n if (index === -1) {\n index = descendantsIds.indexOf(id);\n this._selectChild(ancestorsIds.size + index, true);\n } else {\n this._selectChild(index - 1, true);\n }\n }\n }\n\n handleMoveDown = id => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n\n if (id === status.get('id')) {\n this._selectChild(ancestorsIds.size + 1, false);\n } else {\n let index = ancestorsIds.indexOf(id);\n\n if (index === -1) {\n index = descendantsIds.indexOf(id);\n this._selectChild(ancestorsIds.size + index + 2, false);\n } else {\n this._selectChild(index + 1, false);\n }\n }\n }\n\n _selectChild (index, align_top) {\n const container = this.node;\n const element = container.querySelectorAll('.focusable')[index];\n\n if (element) {\n if (align_top && container.scrollTop > element.offsetTop) {\n element.scrollIntoView(true);\n } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n element.scrollIntoView(false);\n }\n element.focus();\n }\n }\n\n renderChildren (list) {\n return list.map(id => (\n <StatusContainer\n key={id}\n id={id}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n contextType='thread'\n />\n ));\n }\n\n setRef = c => {\n this.node = c;\n }\n\n componentDidUpdate () {\n if (this._scrolledIntoView) {\n return;\n }\n\n const { status, ancestorsIds } = this.props;\n\n if (status && ancestorsIds && ancestorsIds.size > 0) {\n const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size - 1];\n\n window.requestAnimationFrame(() => {\n element.scrollIntoView(true);\n });\n this._scrolledIntoView = true;\n }\n }\n\n componentWillUnmount () {\n detachFullscreenListener(this.onFullScreenChange);\n }\n\n onFullScreenChange = () => {\n this.setState({ fullscreen: isFullscreen() });\n }\n\n render () {\n let ancestors, descendants;\n const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn } = this.props;\n const { fullscreen } = this.state;\n\n if (status === null) {\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n <MissingIndicator />\n </Column>\n );\n }\n\n if (ancestorsIds && ancestorsIds.size > 0) {\n ancestors = <div>{this.renderChildren(ancestorsIds)}</div>;\n }\n\n if (descendantsIds && descendantsIds.size > 0) {\n descendants = <div>{this.renderChildren(descendantsIds)}</div>;\n }\n\n const handlers = {\n moveUp: this.handleHotkeyMoveUp,\n moveDown: this.handleHotkeyMoveDown,\n reply: this.handleHotkeyReply,\n favourite: this.handleHotkeyFavourite,\n boost: this.handleHotkeyBoost,\n mention: this.handleHotkeyMention,\n openProfile: this.handleHotkeyOpenProfile,\n toggleHidden: this.handleHotkeyToggleHidden,\n toggleSensitive: this.handleHotkeyToggleSensitive,\n openMedia: this.handleHotkeyOpenMedia,\n };\n\n return (\n <Column bindToDocument={!multiColumn} label={intl.formatMessage(messages.detailedStatus)}>\n <ColumnHeader\n showBackButton\n multiColumn={multiColumn}\n extraButton={(\n <button className='column-header__button' title={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} aria-label={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} onClick={this.handleToggleAll} aria-pressed={status.get('hidden') ? 'false' : 'true'}><Icon id={status.get('hidden') ? 'eye-slash' : 'eye'} /></button>\n )}\n />\n\n <ScrollContainer scrollKey='thread' shouldUpdateScroll={shouldUpdateScroll}>\n <div className={classNames('scrollable', { fullscreen })} ref={this.setRef}>\n {ancestors}\n\n <HotKeys handlers={handlers}>\n <div className={classNames('focusable', 'detailed-status__wrapper')} tabIndex='0' aria-label={textForScreenReader(intl, status, false)}>\n <DetailedStatus\n key={`details-${status.get('id')}`}\n status={status}\n onOpenVideo={this.handleOpenVideo}\n onOpenMedia={this.handleOpenMedia}\n onToggleHidden={this.handleToggleHidden}\n domain={domain}\n showMedia={this.state.showMedia}\n onToggleMediaVisibility={this.handleToggleMediaVisibility}\n />\n\n <ActionBar\n key={`action-bar-${status.get('id')}`}\n status={status}\n onReply={this.handleReplyClick}\n onFavourite={this.handleFavouriteClick}\n onReblog={this.handleReblogClick}\n onBookmark={this.handleBookmarkClick}\n onDelete={this.handleDeleteClick}\n onDirect={this.handleDirectClick}\n onMention={this.handleMentionClick}\n onMute={this.handleMuteClick}\n onUnmute={this.handleUnmuteClick}\n onMuteConversation={this.handleConversationMuteClick}\n onBlock={this.handleBlockClick}\n onUnblock={this.handleUnblockClick}\n onBlockDomain={this.handleBlockDomainClick}\n onUnblockDomain={this.handleUnblockDomainClick}\n onReport={this.handleReport}\n onPin={this.handlePin}\n onEmbed={this.handleEmbed}\n />\n </div>\n </HotKeys>\n\n {descendants}\n </div>\n </ScrollContainer>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"sources":["webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/components/detailed_status.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/components/action_bar.js","webpack:///app/javascript/tank/sources/git/git.pleroma.social/pleroma/mastofe/app/javascript/mastodon/features/status/index.js"],"names":["DetailedStatus","height","e","button","ctrlKey","metaKey","context","router","preventDefault","history","push","props","status","getIn","stopPropagation","media","startTime","onOpenVideo","onToggleHidden","c","node","_measureHeight","href","target","nodeName","parentNode","window","open","heightJustChanged","this","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","state","render","get","outerStyle","boxSizing","compact","applicationLink","reblogLink","reblogIcon","favouriteLink","size","attachment","src","alt","duration","preload","preview","blurhash","width","inline","handleOpenVideo","sensitive","visible","showMedia","onToggleVisibility","onToggleMediaVisibility","standalone","onOpenMedia","length","card","className","rel","includes","id","to","value","onClick","handleModalLink","style","ref","setRef","classNames","handleAccountClick","account","localDomain","domain","expanded","onExpandedToggle","handleExpandedToggle","Date","hour12","year","month","day","hour","minute","ImmutablePureComponent","PropTypes","object","ImmutablePropTypes","map","func","isRequired","bool","string","messages","defineMessages","delete","redraft","direct","mention","reply","reblog","reblog_private","cancel_reblog_private","cannot_reblog","favourite","bookmark","more","mute","muteConversation","unmuteConversation","block","report","share","pin","unpin","embed","admin_account","admin_status","copy","blockDomain","unblockDomain","unmute","unblock","ActionBar","connect","relationship","injectIntl","onReply","onReblog","onFavourite","onBookmark","onDelete","onDirect","onMention","onMute","onUnmute","onBlock","onUnblock","onBlockDomain","split","onUnblockDomain","onMuteConversation","onReport","onPin","navigator","text","url","onEmbed","textarea","document","createElement","textContent","position","body","appendChild","select","execCommand","removeChild","intl","publicStatus","mutingConversation","menu","formatMessage","action","handleCopy","handleEmbed","me","handlePinClick","handleReblogClick","handleConversationMuteClick","handleDeleteClick","handleRedraftClick","name","handleMentionClick","handleDirectClick","handleMuteClick","handleBlockClick","handleReport","handleUnblockDomain","handleBlockDomain","isStaff","replyIcon","shareButton","title","icon","handleShare","handleReplyClick","disabled","active","animate","handleFavouriteClick","handleBookmarkClick","items","direction","React","PureComponent","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","revealAll","hideAll","detailedStatus","replyConfirm","replyMessage","blockDomainConfirm","Status","getStatus","makeGetStatus","getAncestorsIds","createSelector","_","statusId","inReplyTos","ancestorsIds","Immutable","List","withMutations","mutable","unshift","getDescendantsIds","contextReplies","statuses","descendantsIds","ids","shift","replies","reverse","forEach","insertAt","findIndex","idx","splice","params","askReplyConfirmation","trim","fullscreen","defaultMediaVisibility","loadedStatusId","undefined","dispatch","unfavourite","openModal","message","confirm","onConfirm","replyCompose","unreblog","shiftKey","boostModal","handleModalReblog","unbookmark","withRedraft","deleteModal","deleteStatus","directCompose","mentionCompose","index","time","_properStatus","handleOpenMedia","initMuteModal","unmuteStatus","muteStatus","revealStatus","hideStatus","statusIds","concat","toJS","initBlockModal","initReport","unmuteAccount","unblockAccount","defaultMessage","values","handleMoveUp","handleMoveDown","handleToggleHidden","handleToggleMediaVisibility","_selectChild","indexOf","isFullscreen","componentWillMount","fetchStatus","componentDidMount","attachFullscreenListener","onFullScreenChange","componentWillReceiveProps","nextProps","_scrolledIntoView","align_top","container","element","querySelectorAll","scrollTop","offsetTop","scrollIntoView","clientHeight","offsetHeight","focus","renderChildren","list","onMoveUp","onMoveDown","contextType","requestAnimationFrame","componentWillUnmount","detachFullscreenListener","ancestors","descendants","shouldUpdateScroll","multiColumn","handlers","moveUp","handleHotkeyMoveUp","moveDown","handleHotkeyMoveDown","handleHotkeyReply","handleHotkeyFavourite","boost","handleHotkeyBoost","handleHotkeyMention","openProfile","handleHotkeyOpenProfile","toggleHidden","handleHotkeyToggleHidden","toggleSensitive","handleHotkeyToggleSensitive","openMedia","handleHotkeyOpenMedia","bindToDocument","label","showBackButton","extraButton","aria-label","handleToggleAll","aria-pressed","scrollKey","tabIndex","textForScreenReader","handleUnmuteClick","handleUnblockClick","handleBlockDomainClick","handleUnblockDomainClick","handlePin"],"mappings":"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","file":"features/status.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from '../../../components/avatar';\nimport DisplayName from '../../../components/display_name';\nimport StatusContent from '../../../components/status_content';\nimport MediaGallery from '../../../components/media_gallery';\nimport { Link } from 'react-router-dom';\nimport { FormattedDate } from 'react-intl';\nimport Card from './card';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Video from '../../video';\nimport Audio from '../../audio';\nimport scheduleIdleTask from '../../ui/util/schedule_idle_task';\nimport classNames from 'classnames';\nimport Icon from 'mastodon/components/icon';\nimport AnimatedNumber from 'mastodon/components/animated_number';\n\nexport default class DetailedStatus extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map,\n onOpenMedia: PropTypes.func.isRequired,\n onOpenVideo: PropTypes.func.isRequired,\n onToggleHidden: PropTypes.func.isRequired,\n measureHeight: PropTypes.bool,\n onHeightChange: PropTypes.func,\n domain: PropTypes.string.isRequired,\n compact: PropTypes.bool,\n showMedia: PropTypes.bool,\n onToggleMediaVisibility: PropTypes.func,\n };\n\n state = {\n height: null,\n };\n\n handleAccountClick = (e) => {\n if (e.button === 0 && !(e.ctrlKey || e.metaKey) && this.context.router) {\n e.preventDefault();\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n }\n\n e.stopPropagation();\n }\n\n handleOpenVideo = (media, startTime) => {\n this.props.onOpenVideo(media, startTime);\n }\n\n handleExpandedToggle = () => {\n this.props.onToggleHidden(this.props.status);\n }\n\n _measureHeight (heightJustChanged) {\n if (this.props.measureHeight && this.node) {\n scheduleIdleTask(() => this.node && this.setState({ height: Math.ceil(this.node.scrollHeight) + 1 }));\n\n if (this.props.onHeightChange && heightJustChanged) {\n this.props.onHeightChange();\n }\n }\n }\n\n setRef = c => {\n this.node = c;\n this._measureHeight();\n }\n\n componentDidUpdate (prevProps, prevState) {\n this._measureHeight(prevState.height !== this.state.height);\n }\n\n handleModalLink = e => {\n e.preventDefault();\n\n let href;\n\n if (e.target.nodeName !== 'A') {\n href = e.target.parentNode.href;\n } else {\n href = e.target.href;\n }\n\n window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');\n }\n\n render () {\n const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;\n const outerStyle = { boxSizing: 'border-box' };\n const { compact } = this.props;\n\n if (!status) {\n return null;\n }\n\n let media = '';\n let applicationLink = '';\n let reblogLink = '';\n let reblogIcon = 'retweet';\n let favouriteLink = '';\n\n if (this.props.measureHeight) {\n outerStyle.height = `${this.state.height}px`;\n }\n\n if (status.get('media_attachments').size > 0) {\n if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {\n const attachment = status.getIn(['media_attachments', 0]);\n\n media = (\n <Audio\n src={attachment.get('url')}\n alt={attachment.get('description')}\n duration={attachment.getIn(['meta', 'original', 'duration'], 0)}\n height={110}\n preload\n />\n );\n } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n const attachment = status.getIn(['media_attachments', 0]);\n\n media = (\n <Video\n preview={attachment.get('preview_url')}\n blurhash={attachment.get('blurhash')}\n src={attachment.get('url')}\n alt={attachment.get('description')}\n width={300}\n height={150}\n inline\n onOpenVideo={this.handleOpenVideo}\n sensitive={status.get('sensitive')}\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n } else {\n media = (\n <MediaGallery\n standalone\n sensitive={status.get('sensitive')}\n media={status.get('media_attachments')}\n height={300}\n onOpenMedia={this.props.onOpenMedia}\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />\n );\n }\n } else if (status.get('spoiler_text').length === 0) {\n media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;\n }\n\n if (status.get('application')) {\n applicationLink = <span> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></span>;\n }\n\n if (status.get('visibility') === 'direct') {\n reblogIcon = 'envelope';\n } else if (status.get('visibility') === 'private') {\n reblogIcon = 'lock';\n }\n\n if (['private', 'direct'].includes(status.get('visibility'))) {\n reblogLink = <Icon id={reblogIcon} />;\n } else if (this.context.router) {\n reblogLink = (\n <Link to={`/statuses/${status.get('id')}/reblogs`} className='detailed-status__link'>\n <Icon id={reblogIcon} />\n <span className='detailed-status__reblogs'>\n <AnimatedNumber value={status.get('reblogs_count')} />\n </span>\n </Link>\n );\n } else {\n reblogLink = (\n <a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>\n <Icon id={reblogIcon} />\n <span className='detailed-status__reblogs'>\n <AnimatedNumber value={status.get('reblogs_count')} />\n </span>\n </a>\n );\n }\n\n if (this.context.router) {\n favouriteLink = (\n <Link to={`/statuses/${status.get('id')}/favourites`} className='detailed-status__link'>\n <Icon id='star' />\n <span className='detailed-status__favorites'>\n <AnimatedNumber value={status.get('favourites_count')} />\n </span>\n </Link>\n );\n } else {\n favouriteLink = (\n <a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>\n <Icon id='star' />\n <span className='detailed-status__favorites'>\n <AnimatedNumber value={status.get('favourites_count')} />\n </span>\n </a>\n );\n }\n\n return (\n <div style={outerStyle}>\n <div ref={this.setRef} className={classNames('detailed-status', { compact })}>\n <a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='detailed-status__display-name'>\n <div className='detailed-status__display-avatar'><Avatar account={status.get('account')} size={48} /></div>\n <DisplayName account={status.get('account')} localDomain={this.props.domain} />\n </a>\n\n <StatusContent status={status} expanded={!status.get('hidden')} onExpandedToggle={this.handleExpandedToggle} />\n\n {media}\n\n <div className='detailed-status__meta'>\n <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener noreferrer'>\n <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />\n </a>{applicationLink} · {reblogLink} · {favouriteLink}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport IconButton from '../../../components/icon_button';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport DropdownMenuContainer from '../../../containers/dropdown_menu_container';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { me, isStaff } from '../../../initial_state';\n\nconst messages = defineMessages({\n delete: { id: 'status.delete', defaultMessage: 'Delete' },\n redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },\n direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },\n mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },\n reply: { id: 'status.reply', defaultMessage: 'Reply' },\n reblog: { id: 'status.reblog', defaultMessage: 'Boost' },\n reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost to original audience' },\n cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },\n cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },\n favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },\n bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },\n more: { id: 'status.more', defaultMessage: 'More' },\n mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },\n muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },\n unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },\n block: { id: 'status.block', defaultMessage: 'Block @{name}' },\n report: { id: 'status.report', defaultMessage: 'Report @{name}' },\n share: { id: 'status.share', defaultMessage: 'Share' },\n pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },\n unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },\n embed: { id: 'status.embed', defaultMessage: 'Embed' },\n admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },\n admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },\n copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },\n blockDomain: { id: 'account.block_domain', defaultMessage: 'Block domain {domain}' },\n unblockDomain: { id: 'account.unblock_domain', defaultMessage: 'Unblock domain {domain}' },\n unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' },\n unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },\n});\n\nconst mapStateToProps = (state, { status }) => ({\n relationship: state.getIn(['relationships', status.getIn(['account', 'id'])]),\n});\n\nexport default @connect(mapStateToProps)\n@injectIntl\nclass ActionBar extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map.isRequired,\n relationship: ImmutablePropTypes.map,\n onReply: PropTypes.func.isRequired,\n onReblog: PropTypes.func.isRequired,\n onFavourite: PropTypes.func.isRequired,\n onBookmark: PropTypes.func.isRequired,\n onDelete: PropTypes.func.isRequired,\n onDirect: PropTypes.func.isRequired,\n onMention: PropTypes.func.isRequired,\n onMute: PropTypes.func,\n onUnmute: PropTypes.func,\n onBlock: PropTypes.func,\n onUnblock: PropTypes.func,\n onBlockDomain: PropTypes.func,\n onUnblockDomain: PropTypes.func,\n onMuteConversation: PropTypes.func,\n onReport: PropTypes.func,\n onPin: PropTypes.func,\n onEmbed: PropTypes.func,\n intl: PropTypes.object.isRequired,\n };\n\n handleReplyClick = () => {\n this.props.onReply(this.props.status);\n }\n\n handleReblogClick = (e) => {\n this.props.onReblog(this.props.status, e);\n }\n\n handleFavouriteClick = () => {\n this.props.onFavourite(this.props.status);\n }\n\n handleBookmarkClick = (e) => {\n this.props.onBookmark(this.props.status, e);\n }\n\n handleDeleteClick = () => {\n this.props.onDelete(this.props.status, this.context.router.history);\n }\n\n handleRedraftClick = () => {\n this.props.onDelete(this.props.status, this.context.router.history, true);\n }\n\n handleDirectClick = () => {\n this.props.onDirect(this.props.status.get('account'), this.context.router.history);\n }\n\n handleMentionClick = () => {\n this.props.onMention(this.props.status.get('account'), this.context.router.history);\n }\n\n handleMuteClick = () => {\n const { status, relationship, onMute, onUnmute } = this.props;\n const account = status.get('account');\n\n if (relationship && relationship.get('muting')) {\n onUnmute(account);\n } else {\n onMute(account);\n }\n }\n\n handleBlockClick = () => {\n const { status, relationship, onBlock, onUnblock } = this.props;\n const account = status.get('account');\n\n if (relationship && relationship.get('blocking')) {\n onUnblock(account);\n } else {\n onBlock(status);\n }\n }\n\n handleBlockDomain = () => {\n const { status, onBlockDomain } = this.props;\n const account = status.get('account');\n\n onBlockDomain(account.get('acct').split('@')[1]);\n }\n\n handleUnblockDomain = () => {\n const { status, onUnblockDomain } = this.props;\n const account = status.get('account');\n\n onUnblockDomain(account.get('acct').split('@')[1]);\n }\n\n handleConversationMuteClick = () => {\n this.props.onMuteConversation(this.props.status);\n }\n\n handleReport = () => {\n this.props.onReport(this.props.status);\n }\n\n handlePinClick = () => {\n this.props.onPin(this.props.status);\n }\n\n handleShare = () => {\n navigator.share({\n text: this.props.status.get('search_index'),\n url: this.props.status.get('url'),\n });\n }\n\n handleEmbed = () => {\n this.props.onEmbed(this.props.status);\n }\n\n handleCopy = () => {\n const url = this.props.status.get('url');\n const textarea = document.createElement('textarea');\n\n textarea.textContent = url;\n textarea.style.position = 'fixed';\n\n document.body.appendChild(textarea);\n\n try {\n textarea.select();\n document.execCommand('copy');\n } catch (e) {\n\n } finally {\n document.body.removeChild(textarea);\n }\n }\n\n render () {\n const { status, relationship, intl } = this.props;\n\n const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));\n const mutingConversation = status.get('muted');\n const account = status.get('account');\n\n let menu = [];\n\n if (publicStatus) {\n menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });\n menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });\n menu.push(null);\n }\n\n if (me === status.getIn(['account', 'id'])) {\n if (publicStatus) {\n menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });\n } else {\n if (status.get('visibility') === 'private') {\n menu.push({ text: intl.formatMessage(status.get('reblogged') ? messages.cancel_reblog_private : messages.reblog_private), action: this.handleReblogClick });\n }\n }\n\n menu.push(null);\n menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });\n menu.push(null);\n menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });\n menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });\n menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });\n menu.push(null);\n\n if (relationship && relationship.get('muting')) {\n menu.push({ text: intl.formatMessage(messages.unmute, { name: account.get('username') }), action: this.handleMuteClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.mute, { name: account.get('username') }), action: this.handleMuteClick });\n }\n\n if (relationship && relationship.get('blocking')) {\n menu.push({ text: intl.formatMessage(messages.unblock, { name: account.get('username') }), action: this.handleBlockClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.block, { name: account.get('username') }), action: this.handleBlockClick });\n }\n\n menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });\n\n if (account.get('acct') !== account.get('username')) {\n const domain = account.get('acct').split('@')[1];\n\n menu.push(null);\n\n if (relationship && relationship.get('domain_blocking')) {\n menu.push({ text: intl.formatMessage(messages.unblockDomain, { domain }), action: this.handleUnblockDomain });\n } else {\n menu.push({ text: intl.formatMessage(messages.blockDomain, { domain }), action: this.handleBlockDomain });\n }\n }\n\n if (isStaff) {\n menu.push(null);\n menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });\n menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });\n }\n }\n\n const shareButton = ('share' in navigator) && publicStatus && (\n <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShare} /></div>\n );\n\n let replyIcon;\n if (status.get('in_reply_to_id', null) === null) {\n replyIcon = 'reply';\n } else {\n replyIcon = 'reply-all';\n }\n\n let reblogIcon = 'retweet';\n if (status.get('visibility') === 'direct') reblogIcon = 'envelope';\n else if (status.get('visibility') === 'private') reblogIcon = 'lock';\n\n return (\n <div className='detailed-status__action-bar'>\n <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /></div>\n <div className='detailed-status__button'><IconButton disabled={!publicStatus} active={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} /></div>\n <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>\n {shareButton}\n <div className='detailed-status__button'><IconButton className='bookmark-icon' active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>\n\n <div className='detailed-status__action-bar-dropdown'>\n <DropdownMenuContainer size={18} icon='ellipsis-h' status={status} items={menu} direction='left' title={intl.formatMessage(messages.more)} />\n </div>\n </div>\n );\n }\n\n}\n","import Immutable from 'immutable';\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { createSelector } from 'reselect';\nimport { fetchStatus } from '../../actions/statuses';\nimport MissingIndicator from '../../components/missing_indicator';\nimport DetailedStatus from './components/detailed_status';\nimport ActionBar from './components/action_bar';\nimport Column from '../ui/components/column';\nimport {\n favourite,\n unfavourite,\n bookmark,\n unbookmark,\n reblog,\n unreblog,\n pin,\n unpin,\n} from '../../actions/interactions';\nimport {\n replyCompose,\n mentionCompose,\n directCompose,\n} from '../../actions/compose';\nimport {\n muteStatus,\n unmuteStatus,\n deleteStatus,\n hideStatus,\n revealStatus,\n} from '../../actions/statuses';\nimport {\n unblockAccount,\n unmuteAccount,\n} from '../../actions/accounts';\nimport {\n blockDomain,\n unblockDomain,\n} from '../../actions/domain_blocks';\nimport { initMuteModal } from '../../actions/mutes';\nimport { initBlockModal } from '../../actions/blocks';\nimport { initReport } from '../../actions/reports';\nimport { makeGetStatus } from '../../selectors';\nimport { ScrollContainer } from 'react-router-scroll-4';\nimport ColumnBackButton from '../../components/column_back_button';\nimport ColumnHeader from '../../components/column_header';\nimport StatusContainer from '../../containers/status_container';\nimport { openModal } from '../../actions/modal';\nimport { defineMessages, injectIntl, FormattedMessage } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { HotKeys } from 'react-hotkeys';\nimport { boostModal, deleteModal } from '../../initial_state';\nimport { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';\nimport { textForScreenReader, defaultMediaVisibility } from '../../components/status';\nimport Icon from 'mastodon/components/icon';\n\nconst messages = defineMessages({\n deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },\n deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },\n redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },\n redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.' },\n revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },\n hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },\n detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },\n replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },\n replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },\n blockDomainConfirm: { id: 'confirmations.domain_block.confirm', defaultMessage: 'Hide entire domain' },\n});\n\nconst makeMapStateToProps = () => {\n const getStatus = makeGetStatus();\n\n const getAncestorsIds = createSelector([\n (_, { id }) => id,\n state => state.getIn(['contexts', 'inReplyTos']),\n ], (statusId, inReplyTos) => {\n let ancestorsIds = Immutable.List();\n ancestorsIds = ancestorsIds.withMutations(mutable => {\n let id = statusId;\n\n while (id) {\n mutable.unshift(id);\n id = inReplyTos.get(id);\n }\n });\n\n return ancestorsIds;\n });\n\n const getDescendantsIds = createSelector([\n (_, { id }) => id,\n state => state.getIn(['contexts', 'replies']),\n state => state.get('statuses'),\n ], (statusId, contextReplies, statuses) => {\n let descendantsIds = [];\n const ids = [statusId];\n\n while (ids.length > 0) {\n let id = ids.shift();\n const replies = contextReplies.get(id);\n\n if (statusId !== id) {\n descendantsIds.push(id);\n }\n\n if (replies) {\n replies.reverse().forEach(reply => {\n ids.unshift(reply);\n });\n }\n }\n\n let insertAt = descendantsIds.findIndex((id) => statuses.get(id).get('in_reply_to_account_id') !== statuses.get(id).get('account'));\n if (insertAt !== -1) {\n descendantsIds.forEach((id, idx) => {\n if (idx > insertAt && statuses.get(id).get('in_reply_to_account_id') === statuses.get(id).get('account')) {\n descendantsIds.splice(idx, 1);\n descendantsIds.splice(insertAt, 0, id);\n insertAt += 1;\n }\n });\n }\n\n return Immutable.List(descendantsIds);\n });\n\n const mapStateToProps = (state, props) => {\n const status = getStatus(state, { id: props.params.statusId });\n let ancestorsIds = Immutable.List();\n let descendantsIds = Immutable.List();\n\n if (status) {\n ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });\n descendantsIds = getDescendantsIds(state, { id: status.get('id') });\n }\n\n return {\n status,\n ancestorsIds,\n descendantsIds,\n askReplyConfirmation: state.getIn(['compose', 'text']).trim().length !== 0,\n domain: state.getIn(['meta', 'domain']),\n };\n };\n\n return mapStateToProps;\n};\n\nexport default @injectIntl\n@connect(makeMapStateToProps)\nclass Status extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n status: ImmutablePropTypes.map,\n ancestorsIds: ImmutablePropTypes.list,\n descendantsIds: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n askReplyConfirmation: PropTypes.bool,\n multiColumn: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n };\n\n state = {\n fullscreen: false,\n showMedia: defaultMediaVisibility(this.props.status),\n loadedStatusId: undefined,\n };\n\n componentWillMount () {\n this.props.dispatch(fetchStatus(this.props.params.statusId));\n }\n\n componentDidMount () {\n attachFullscreenListener(this.onFullScreenChange);\n }\n\n componentWillReceiveProps (nextProps) {\n if (nextProps.params.statusId !== this.props.params.statusId && nextProps.params.statusId) {\n this._scrolledIntoView = false;\n this.props.dispatch(fetchStatus(nextProps.params.statusId));\n }\n\n if (nextProps.status && nextProps.status.get('id') !== this.state.loadedStatusId) {\n this.setState({ showMedia: defaultMediaVisibility(nextProps.status), loadedStatusId: nextProps.status.get('id') });\n }\n }\n\n handleToggleMediaVisibility = () => {\n this.setState({ showMedia: !this.state.showMedia });\n }\n\n handleFavouriteClick = (status) => {\n if (status.get('favourited')) {\n this.props.dispatch(unfavourite(status));\n } else {\n this.props.dispatch(favourite(status));\n }\n }\n\n handlePin = (status) => {\n if (status.get('pinned')) {\n this.props.dispatch(unpin(status));\n } else {\n this.props.dispatch(pin(status));\n }\n }\n\n handleReplyClick = (status) => {\n let { askReplyConfirmation, dispatch, intl } = this.props;\n if (askReplyConfirmation) {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.replyMessage),\n confirm: intl.formatMessage(messages.replyConfirm),\n onConfirm: () => dispatch(replyCompose(status, this.context.router.history)),\n }));\n } else {\n dispatch(replyCompose(status, this.context.router.history));\n }\n }\n\n handleModalReblog = (status) => {\n this.props.dispatch(reblog(status));\n }\n\n handleReblogClick = (status, e) => {\n if (status.get('reblogged')) {\n this.props.dispatch(unreblog(status));\n } else {\n if ((e && e.shiftKey) || !boostModal) {\n this.handleModalReblog(status);\n } else {\n this.props.dispatch(openModal('BOOST', { status, onReblog: this.handleModalReblog }));\n }\n }\n }\n\n handleBookmarkClick = (status) => {\n if (status.get('bookmarked')) {\n this.props.dispatch(unbookmark(status));\n } else {\n this.props.dispatch(bookmark(status));\n }\n }\n\n handleDeleteClick = (status, history, withRedraft = false) => {\n const { dispatch, intl } = this.props;\n\n if (!deleteModal) {\n dispatch(deleteStatus(status.get('id'), history, withRedraft));\n } else {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),\n confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),\n onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)),\n }));\n }\n }\n\n handleDirectClick = (account, router) => {\n this.props.dispatch(directCompose(account, router));\n }\n\n handleMentionClick = (account, router) => {\n this.props.dispatch(mentionCompose(account, router));\n }\n\n handleOpenMedia = (media, index) => {\n this.props.dispatch(openModal('MEDIA', { media, index }));\n }\n\n handleOpenVideo = (media, time) => {\n this.props.dispatch(openModal('VIDEO', { media, time }));\n }\n\n handleHotkeyOpenMedia = e => {\n const status = this._properStatus();\n\n e.preventDefault();\n\n if (status.get('media_attachments').size > 0) {\n if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {\n // TODO: toggle play/paused?\n } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n this.handleOpenVideo(status.getIn(['media_attachments', 0]), 0);\n } else {\n this.handleOpenMedia(status.get('media_attachments'), 0);\n }\n }\n }\n\n handleMuteClick = (account) => {\n this.props.dispatch(initMuteModal(account));\n }\n\n handleConversationMuteClick = (status) => {\n if (status.get('muted')) {\n this.props.dispatch(unmuteStatus(status.get('id')));\n } else {\n this.props.dispatch(muteStatus(status.get('id')));\n }\n }\n\n handleToggleHidden = (status) => {\n if (status.get('hidden')) {\n this.props.dispatch(revealStatus(status.get('id')));\n } else {\n this.props.dispatch(hideStatus(status.get('id')));\n }\n }\n\n handleToggleAll = () => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS());\n\n if (status.get('hidden')) {\n this.props.dispatch(revealStatus(statusIds));\n } else {\n this.props.dispatch(hideStatus(statusIds));\n }\n }\n\n handleBlockClick = (status) => {\n const { dispatch } = this.props;\n const account = status.get('account');\n dispatch(initBlockModal(account));\n }\n\n handleReport = (status) => {\n this.props.dispatch(initReport(status.get('account'), status));\n }\n\n handleEmbed = (status) => {\n this.props.dispatch(openModal('EMBED', { url: status.get('url') }));\n }\n\n handleUnmuteClick = account => {\n this.props.dispatch(unmuteAccount(account.get('id')));\n }\n\n handleUnblockClick = account => {\n this.props.dispatch(unblockAccount(account.get('id')));\n }\n\n handleBlockDomainClick = domain => {\n this.props.dispatch(openModal('CONFIRM', {\n message: <FormattedMessage id='confirmations.domain_block.message' defaultMessage='Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.' values={{ domain: <strong>{domain}</strong> }} />,\n confirm: this.props.intl.formatMessage(messages.blockDomainConfirm),\n onConfirm: () => this.props.dispatch(blockDomain(domain)),\n }));\n }\n\n handleUnblockDomainClick = domain => {\n this.props.dispatch(unblockDomain(domain));\n }\n\n\n handleHotkeyMoveUp = () => {\n this.handleMoveUp(this.props.status.get('id'));\n }\n\n handleHotkeyMoveDown = () => {\n this.handleMoveDown(this.props.status.get('id'));\n }\n\n handleHotkeyReply = e => {\n e.preventDefault();\n this.handleReplyClick(this.props.status);\n }\n\n handleHotkeyFavourite = () => {\n this.handleFavouriteClick(this.props.status);\n }\n\n handleHotkeyBoost = () => {\n this.handleReblogClick(this.props.status);\n }\n\n handleHotkeyMention = e => {\n e.preventDefault();\n this.handleMentionClick(this.props.status.get('account'));\n }\n\n handleHotkeyOpenProfile = () => {\n this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`);\n }\n\n handleHotkeyToggleHidden = () => {\n this.handleToggleHidden(this.props.status);\n }\n\n handleHotkeyToggleSensitive = () => {\n this.handleToggleMediaVisibility();\n }\n\n handleMoveUp = id => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n\n if (id === status.get('id')) {\n this._selectChild(ancestorsIds.size - 1, true);\n } else {\n let index = ancestorsIds.indexOf(id);\n\n if (index === -1) {\n index = descendantsIds.indexOf(id);\n this._selectChild(ancestorsIds.size + index, true);\n } else {\n this._selectChild(index - 1, true);\n }\n }\n }\n\n handleMoveDown = id => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n\n if (id === status.get('id')) {\n this._selectChild(ancestorsIds.size + 1, false);\n } else {\n let index = ancestorsIds.indexOf(id);\n\n if (index === -1) {\n index = descendantsIds.indexOf(id);\n this._selectChild(ancestorsIds.size + index + 2, false);\n } else {\n this._selectChild(index + 1, false);\n }\n }\n }\n\n _selectChild (index, align_top) {\n const container = this.node;\n const element = container.querySelectorAll('.focusable')[index];\n\n if (element) {\n if (align_top && container.scrollTop > element.offsetTop) {\n element.scrollIntoView(true);\n } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n element.scrollIntoView(false);\n }\n element.focus();\n }\n }\n\n renderChildren (list) {\n return list.map(id => (\n <StatusContainer\n key={id}\n id={id}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n contextType='thread'\n />\n ));\n }\n\n setRef = c => {\n this.node = c;\n }\n\n componentDidUpdate () {\n if (this._scrolledIntoView) {\n return;\n }\n\n const { status, ancestorsIds } = this.props;\n\n if (status && ancestorsIds && ancestorsIds.size > 0) {\n const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size - 1];\n\n window.requestAnimationFrame(() => {\n element.scrollIntoView(true);\n });\n this._scrolledIntoView = true;\n }\n }\n\n componentWillUnmount () {\n detachFullscreenListener(this.onFullScreenChange);\n }\n\n onFullScreenChange = () => {\n this.setState({ fullscreen: isFullscreen() });\n }\n\n render () {\n let ancestors, descendants;\n const { shouldUpdateScroll, status, ancestorsIds, descendantsIds, intl, domain, multiColumn } = this.props;\n const { fullscreen } = this.state;\n\n if (status === null) {\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n <MissingIndicator />\n </Column>\n );\n }\n\n if (ancestorsIds && ancestorsIds.size > 0) {\n ancestors = <div>{this.renderChildren(ancestorsIds)}</div>;\n }\n\n if (descendantsIds && descendantsIds.size > 0) {\n descendants = <div>{this.renderChildren(descendantsIds)}</div>;\n }\n\n const handlers = {\n moveUp: this.handleHotkeyMoveUp,\n moveDown: this.handleHotkeyMoveDown,\n reply: this.handleHotkeyReply,\n favourite: this.handleHotkeyFavourite,\n boost: this.handleHotkeyBoost,\n mention: this.handleHotkeyMention,\n openProfile: this.handleHotkeyOpenProfile,\n toggleHidden: this.handleHotkeyToggleHidden,\n toggleSensitive: this.handleHotkeyToggleSensitive,\n openMedia: this.handleHotkeyOpenMedia,\n };\n\n return (\n <Column bindToDocument={!multiColumn} label={intl.formatMessage(messages.detailedStatus)}>\n <ColumnHeader\n showBackButton\n multiColumn={multiColumn}\n extraButton={(\n <button className='column-header__button' title={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} aria-label={intl.formatMessage(status.get('hidden') ? messages.revealAll : messages.hideAll)} onClick={this.handleToggleAll} aria-pressed={status.get('hidden') ? 'false' : 'true'}><Icon id={status.get('hidden') ? 'eye-slash' : 'eye'} /></button>\n )}\n />\n\n <ScrollContainer scrollKey='thread' shouldUpdateScroll={shouldUpdateScroll}>\n <div className={classNames('scrollable', { fullscreen })} ref={this.setRef}>\n {ancestors}\n\n <HotKeys handlers={handlers}>\n <div className={classNames('focusable', 'detailed-status__wrapper')} tabIndex='0' aria-label={textForScreenReader(intl, status, false)}>\n <DetailedStatus\n key={`details-${status.get('id')}`}\n status={status}\n onOpenVideo={this.handleOpenVideo}\n onOpenMedia={this.handleOpenMedia}\n onToggleHidden={this.handleToggleHidden}\n domain={domain}\n showMedia={this.state.showMedia}\n onToggleMediaVisibility={this.handleToggleMediaVisibility}\n />\n\n <ActionBar\n key={`action-bar-${status.get('id')}`}\n status={status}\n onReply={this.handleReplyClick}\n onFavourite={this.handleFavouriteClick}\n onReblog={this.handleReblogClick}\n onBookmark={this.handleBookmarkClick}\n onDelete={this.handleDeleteClick}\n onDirect={this.handleDirectClick}\n onMention={this.handleMentionClick}\n onMute={this.handleMuteClick}\n onUnmute={this.handleUnmuteClick}\n onMuteConversation={this.handleConversationMuteClick}\n onBlock={this.handleBlockClick}\n onUnblock={this.handleUnblockClick}\n onBlockDomain={this.handleBlockDomainClick}\n onUnblockDomain={this.handleUnblockDomainClick}\n onReport={this.handleReport}\n onPin={this.handlePin}\n onEmbed={this.handleEmbed}\n />\n </div>\n </HotKeys>\n\n {descendants}\n </div>\n </ScrollContainer>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""} \ No newline at end of file