diff --git a/frontend/src/components/posting/edit.js b/frontend/src/components/posting/edit.js index 53f6bb9792..25336dc7f1 100644 --- a/frontend/src/components/posting/edit.js +++ b/frontend/src/components/posting/edit.js @@ -85,7 +85,7 @@ export default class extends Form { this.setState((prevState, props) => { if (prevState.post.length > 0) { return { - post: prevState.post + "\n\n" + newPost, + post: prevState.post.trim() + "\n\n" + newPost, } } diff --git a/frontend/src/components/posting/reply.js b/frontend/src/components/posting/reply.js index 13e071bceb..a0c87546d1 100644 --- a/frontend/src/components/posting/reply.js +++ b/frontend/src/components/posting/reply.js @@ -51,7 +51,8 @@ export default class extends Form { const context = this.props.context const newContext = nextProps.context - if (context && newContext && context.reply === newContext.reply) return + // User clicked "reply" instead of "quote" + if (context && newContext && !newContext.reply) return ajax .get(nextProps.config, nextProps.context || null) @@ -82,7 +83,7 @@ export default class extends Form { this.setState((prevState, props) => { if (prevState.post.length > 0) { return { - post: prevState.post + "\n\n" + newPost, + post: prevState.post.trim() + "\n\n" + newPost, } } diff --git a/frontend/src/components/posts-list/post/footer.js b/frontend/src/components/posts-list/post/footer.js index 97e2a95c4e..8d9c3a3077 100644 --- a/frontend/src/components/posts-list/post/footer.js +++ b/frontend/src/components/posts-list/post/footer.js @@ -19,6 +19,7 @@ export default function (props) { /> + ) @@ -54,7 +55,7 @@ export class MarkAsBestAnswer extends React.Component { type="button" > check_box - {gettext("Best answer")} + {pgettext("post control", "Best answer")} ) } @@ -232,6 +233,34 @@ export class Reply extends React.Component { thread: this.props.thread, config: this.props.thread.api.editor, submit: this.props.thread.api.posts.index, + }) + } + + render() { + if (this.props.post.acl.can_reply) { + return ( + + ) + } else { + return null + } + } +} + +export class Quote extends React.Component { + onClick = () => { + posting.open({ + mode: "QUOTE", + + thread: this.props.thread, + config: this.props.thread.api.editor, + submit: this.props.thread.api.posts.index, context: { reply: this.props.post.id, @@ -243,11 +272,11 @@ export class Reply extends React.Component { if (this.props.post.acl.can_reply) { return ( ) } else { @@ -276,7 +305,7 @@ export class Edit extends React.Component { type="button" onClick={this.onClick} > - {gettext("Edit")} + {pgettext("post control", "Edit")} ) } else { diff --git a/frontend/src/services/posting.js b/frontend/src/services/posting.js index c46c5a4f9f..477641d81b 100644 --- a/frontend/src/services/posting.js +++ b/frontend/src/services/posting.js @@ -19,6 +19,7 @@ export class Posting { this._isClosing = false this._beforeunloadSet = false + this._props = null } isOpen() { @@ -27,13 +28,17 @@ export class Posting { setBeforeUnload() { if (!this._beforeunloadSet) { - window.addEventListener("beforeunload", this.beforeUnload, { capture: true }) + window.addEventListener("beforeunload", this.beforeUnload, { + capture: true, + }) this._beforeunloadSet = true } } unsetBeforeUnload() { - window.removeEventListener("beforeunload", this.beforeUnload, { capture: true }) + window.removeEventListener("beforeunload", this.beforeUnload, { + capture: true, + }) this._beforeunloadSet = false } @@ -44,9 +49,23 @@ export class Posting { open(props) { if (this._isOpen === false) { - this._mode = props.mode + if (props.mode === "QUOTE") { + this._mode = "REPLY" + } else { + this._mode = props.mode + } + this._isOpen = props.submit - this._realOpen(props) + this._realOpen( + Object.assign({}, props, {mode: this._mode}) + ) + } else if (props.mode === "QUOTE") { + this._realOpen( + Object.assign({}, this._props, { + config: props.config, + context: props.context, + }) + ) } else if (this._isOpen !== props.submit) { let message = gettext( "You are already working on other message. Do you want to discard it?" @@ -66,6 +85,7 @@ export class Posting { _realOpen(props) { mount(, this._mount.id) + this._props = props this._mount.classList.add("show") this._observer.observe(this._mount) this.setBeforeUnload() @@ -73,6 +93,7 @@ export class Posting { close = () => { this.unsetBeforeUnload() + this._props = null if (this._isOpen && !this._isClosing) { this._isClosing = true diff --git a/misago/static/misago/js/misago.js b/misago/static/misago/js/misago.js index 765eb2081a..63833cba36 100644 --- a/misago/static/misago/js/misago.js +++ b/misago/static/misago/js/misago.js @@ -1,2 +1,2 @@ -!function(){var e,t,s,a={98936:function(e,t,s){"use strict";s.d(t,{gq:function(){return n},Z6:function(){return r},kw:function(){return l}});var a=s(22928),i=s(94184),o=s.n(i);s(57588);var n=e=>{let{children:t,className:s}=e;return(0,a.Z)("div",{className:o()("flex-row",s)},void 0,t)},r=e=>{let{children:t,className:s,shrink:i}=e;return(0,a.Z)("div",{className:o()("flex-row-col",s,{"flex-row-col-shrink":i})},void 0,t)},l=e=>{let{auto:t,children:s,className:i}=e;return(0,a.Z)("div",{className:o()("flex-row-section",{"flex-row-section-auto":t},i)},void 0,s)}},59131:function(e,t,s){"use strict";var a=s(22928);s(57588),t.Z=e=>{let{children:t}=e;return(0,a.Z)("div",{className:"container page-container"},void 0,t)}},99755:function(e,t,s){"use strict";s.d(t,{mr:function(){return r},gC:function(){return l},sP:function(){return d},eA:function(){return c},Ql:function(){return p},bM:function(){return u},Iv:function(){return h}});var a,i=s(22928),o=s(94184),n=s.n(o);s(57588);var r=e=>{let{children:t,className:s,styleName:o}=e;return(0,i.Z)("div",{className:n()("page-header",s,o&&"page-header-"+o)},void 0,(0,i.Z)("div",{className:"page-header-bg-image"},void 0,(0,i.Z)("div",{className:"page-header-bg-overlay"},void 0,a||(a=(0,i.Z)("div",{className:"page-header-image"})),t)))},l=e=>{let{children:t,className:s,styleName:a}=e;return(0,i.Z)("div",{className:n()("page-header-banner",s,a&&"page-header-banner-"+a)},void 0,(0,i.Z)("div",{className:"page-header-banner-bg-image"},void 0,(0,i.Z)("div",{className:"page-header-banner-bg-overlay"},void 0,t)))},d=e=>{let{children:t}=e;return(0,i.Z)("div",{className:"container page-header-container"},void 0,t)},c=e=>{let{children:t,className:s}=e;return(0,i.Z)("div",{className:n()("page-header-details",s)},void 0,t)},p=e=>{let{className:t,message:s}=e;return(0,i.Z)("div",{className:n()("page-header-message",t),dangerouslySetInnerHTML:{__html:s}})},u=e=>{let{children:t,className:s}=e;return(0,i.Z)("div",{className:n()("page-header-message",s)},void 0,t)},h=e=>{let{styleName:t,header:s,message:a}=e;return(0,i.Z)(d,{},void 0,(0,i.Z)(r,{styleName:t},void 0,(0,i.Z)(l,{styleName:t},void 0,(0,i.Z)("h1",{},void 0,s)),a&&(0,i.Z)(c,{styleName:t},void 0,a)))}},26106:function(e,t,s){"use strict";var a=s(22928),i=(s(57588),s(32233)),o=s(89627);const n=e=>{const{agreement:t,checked:s,errors:i,url:n,value:r,onChange:l}=e;if(!n)return null;const d=interpolate('%(agreement)s',{agreement:(0,o.Z)(t),url:(0,o.Z)(n)},!0),c=interpolate(gettext("I have read and accept %(agreement)s."),{agreement:d},!0);return(0,a.Z)("div",{className:"checkbox legal-footnote"},void 0,(0,a.Z)("label",{},void 0,(0,a.Z)("input",{checked:s,type:"checkbox",value:r,onChange:l}),(0,a.Z)("span",{dangerouslySetInnerHTML:{__html:c}})),i&&i.map(((e,t)=>(0,a.Z)("div",{className:"help-block errors"},t,e))))};t.Z=e=>{const{errors:t,privacyPolicy:s,termsOfService:o,onPrivacyPolicyChange:r,onTermsOfServiceChange:l}=e,d=i.Z.get("TERMS_OF_SERVICE_ID"),c=i.Z.get("TERMS_OF_SERVICE_URL"),p=i.Z.get("PRIVACY_POLICY_ID"),u=i.Z.get("PRIVACY_POLICY_URL");return d||p?(0,a.Z)("div",{},void 0,(0,a.Z)(n,{agreement:gettext("the terms of service"),checked:null!==o,errors:t.termsOfService,url:c,value:d,onChange:l}),(0,a.Z)(n,{agreement:gettext("the privacy policy"),checked:null!==s,errors:t.privacyPolicy,url:u,value:p,onChange:r})):null}},47235:function(e,t,s){"use strict";var a,i=s(22928),o=(s(57588),s(32233));const n=e=>{let{className:t,text:s}=e;return s?(0,i.Z)("h5",{className:t||""},void 0,s):null};t.Z=e=>{const{buttonClassName:t,buttonLabel:s,formLabel:r,header:l,labelClassName:d}=e,c=o.Z.get("SOCIAL_AUTH");return 0===c.length?null:(0,i.Z)("div",{className:"form-group form-social-auth"},void 0,(0,i.Z)(n,{className:d,text:l}),(0,i.Z)("div",{className:"row"},void 0,c.map((e=>{let{pk:a,name:o,button_text:n,button_color:r,url:l}=e;const d="btn btn-block btn-default btn-social-"+a,c=r?{color:r}:null,p=n||interpolate(s,{site:o},!0);return(0,i.Z)("div",{className:t||"col-xs-12"},a,(0,i.Z)("a",{className:d,style:c,href:l},void 0,p))}))),a||(a=(0,i.Z)("hr",{})),(0,i.Z)(n,{className:d,text:r}))}},50366:function(e,t,s){"use strict";var a,i,o,n,r,l,d,c=s(22928);s(57588),t.Z=e=>{let{thread:t}=e;return(0,c.Z)("ul",{className:"thread-flags"},void 0,2==t.weight&&(0,c.Z)("li",{className:"thread-flag-pinned-globally",title:gettext("Pinned globally")},void 0,a||(a=(0,c.Z)("span",{className:"material-icon"},void 0,"bookmark"))),1==t.weight&&(0,c.Z)("li",{className:"thread-flag-pinned-locally",title:gettext("Pinned in category")},void 0,i||(i=(0,c.Z)("span",{className:"material-icon"},void 0,"bookmark_outline"))),t.best_answer&&(0,c.Z)("li",{className:"thread-flag-answered",title:gettext("Answered")},void 0,o||(o=(0,c.Z)("span",{className:"material-icon"},void 0,"check_circle"))),t.has_poll&&(0,c.Z)("li",{className:"thread-flag-poll",title:gettext("Poll")},void 0,n||(n=(0,c.Z)("span",{className:"material-icon"},void 0,"poll"))),(t.is_unapproved||t.has_unapproved_posts)&&(0,c.Z)("li",{className:"thread-flag-unapproved",title:t.is_unapproved?gettext("Awaiting approval"):gettext("Has unapproved posts")},void 0,r||(r=(0,c.Z)("span",{className:"material-icon"},void 0,"visibility"))),t.is_closed&&(0,c.Z)("li",{className:"thread-flag-closed",title:gettext("Closed")},void 0,l||(l=(0,c.Z)("span",{className:"material-icon"},void 0,"lock"))),t.is_hidden&&(0,c.Z)("li",{className:"thread-flag-hidden",title:gettext("Hidden")},void 0,d||(d=(0,c.Z)("span",{className:"material-icon"},void 0,"visibility_off"))))}},16768:function(e,t,s){"use strict";var a,i=s(22928);s(57588),t.Z=e=>{let{thread:t}=e;return(0,i.Z)("span",{className:"threads-replies",title:interpolate(ngettext("%(replies)s reply","%(replies)s replies",t.replies),{replies:t.replies},!0)},void 0,a||(a=(0,i.Z)("span",{className:"material-icon"},void 0,"chat_bubble_outline")),t.replies>980?Math.round(t.replies/1e3)+"K":t.replies)}},92490:function(e,t,s){"use strict";s.d(t,{o8:function(){return n},Eg:function(){return r},Z2:function(){return l},tw:function(){return d}});var a=s(22928),i=s(94184),o=s.n(i);s(57588);var n=e=>{let{children:t,className:s}=e;return(0,a.Z)("nav",{className:o()("toolbar",s)},void 0,t)},r=e=>{let{children:t,className:s,shrink:i}=e;return(0,a.Z)("div",{className:o()("toolbar-item",s,{"toolbar-item-shrink":i})},void 0,t)},l=e=>{let{auto:t,children:s,className:i}=e;return(0,a.Z)("div",{className:o()("toolbar-section",{"toolbar-section-auto":t},i)},void 0,s)},d=e=>{let{className:t}=e;return(0,a.Z)("div",{className:o()("toolbar-spacer",t)})}},19605:function(e,t,s){"use strict";s.d(t,{ZP:function(){return o}});var a=s(22928),i=(s(57588),s(32233));function o(e){const t=e.size||100,s=e.size2x||t;return(0,a.Z)("img",{alt:"",className:e.className||"user-avatar",src:n(e.user,t),srcSet:n(e.user,s),width:t,height:t})}function n(e,t){return e&&e.id?function(e,t){let s=e[0];return e.forEach((e=>{e.size>=t&&(s=e)})),s}(e.avatars,t).url:i.Z.get("BLANK_AVATAR_URL")}},82211:function(e,t,s){"use strict";s.d(t,{Z:function(){return l}});var a,i=s(22928),o=s(57588),n=s.n(o),r=s(37848);class l extends n().Component{render(){let e="btn "+this.props.className,t=this.props.disabled;return this.props.loading&&(e+=" btn-loading",t=!0),(0,i.Z)("button",{className:e,disabled:t,onClick:this.props.onClick,type:this.props.onClick?"button":"submit"},void 0,this.props.children,this.props.loading?a||(a=(0,i.Z)(r.Z,{})):null)}}l.defaultProps={className:"btn-default",type:"submit",loading:!1,disabled:!1,onClick:null}},57026:function(e,t,s){"use strict";s.d(t,{Z:function(){return i}});var a=s(22928);function i(e){return(0,a.Z)("select",{className:e.className||"form-control",disabled:e.disabled||!1,id:e.id||null,onChange:e.onChange,value:e.value},void 0,e.choices.map((e=>(0,a.Z)("option",{disabled:e.disabled||!1,value:e.value},e.value,"- - ".repeat(e.level)+e.label))))}s(57588)},21688:function(e,t,s){"use strict";s.d(t,{Z:function(){return x}});var a=s(22928),i=s(57588),o=s.n(i),n=s(33556);function r(e){let{display:t}=e;return t?(0,a.Z)(n.Z,{helpText:gettext("No profile details are editable at this time."),message:gettext("This option is currently unavailable.")}):null}var l,d=s(37848);function c(e){let{display:t}=e;return t?l||(l=(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)(d.Z,{}))):null}var p=s(4942),u=s(60471),h=class extends o().Component{constructor(){super(...arguments),(0,p.Z)(this,"onChange",(e=>{const{field:t,onChange:s}=this.props;s(t.fieldname,e.target.value)}))}render(){const{disabled:e,field:t,value:s}=this.props,{input:i}=t;return"select"===i.type?(0,a.Z)(u.Z,{choices:i.choices,disabled:e,id:"id_"+t.fieldname,onChange:this.onChange,value:s}):"textarea"===i.type?(0,a.Z)("textarea",{className:"form-control",disabled:e,id:"id_"+t.fieldname,onChange:this.onChange,rows:"4",type:"text",value:s}):"text"===i.type?(0,a.Z)("input",{className:"form-control",disabled:e,id:"id_"+t.fieldname,onChange:this.onChange,type:"text",value:s}):null}},m=s(96359);function v(e){let{disabled:t,errors:s,fields:i,name:o,onChange:n,value:r}=e;return(0,a.Z)("fieldset",{},void 0,(0,a.Z)("legend",{},void 0,o),i.map((e=>(0,a.Z)(m.Z,{for:"id_"+e.fieldname,helpText:e.help_text,label:e.label,validation:s[e.fieldname]},e.fieldname,(0,a.Z)(h,{disabled:t,field:e,onChange:n,value:r[e.fieldname]})))))}var g=s(82211),Z=s(43345),b=s(78657),f=s(53904),_=class extends Z.Z{constructor(e){super(e),(0,p.Z)(this,"onChange",((e,t)=>{this.setState({[e]:t})})),this.state={isLoading:!1,errors:{}};const t=e.groups.length;for(let s=0;s(0,a.Z)(v,{disabled:this.state.isLoading,errors:this.state.errors,fields:e.fields,name:e.name,onChange:this.onChange,value:this.state},t)))),(0,a.Z)("div",{className:"panel-footer text-right"},void 0,(0,a.Z)(N,{disabled:this.state.isLoading,onCancel:this.props.onCancel})," ",(0,a.Z)(g.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Save changes"))))}};function N(e){let{onCancel:t,disabled:s}=e;return t?(0,a.Z)("button",{className:"btn btn-default",disabled:s,onClick:t,type:"button"},void 0,gettext("Cancel")):null}var x=class extends o().Component{constructor(e){super(e),this.state={loading:!0,groups:null}}componentDidMount(){b.Z.get(this.props.api).then((e=>{this.setState({loading:!1,groups:e})}),(e=>{f.Z.apiError(e),this.props.cancel&&this.props.cancel()}))}render(){const{groups:e,loading:t}=this.state;return(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Edit details"))),(0,a.Z)(c,{display:t}),(0,a.Z)(r,{display:!t&&!e.length}),(0,a.Z)(y,{api:this.props.api,display:!t&&e.length,groups:e,onCancel:this.props.onCancel,onSuccess:this.props.onSuccess}))}};function y(e){let{api:t,display:s,groups:i,onCancel:o,onSuccess:n}=e;return s?(0,a.Z)(_,{api:t,groups:i,onCancel:o,onSuccess:n}):null}},96359:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i);t.Z=class extends o().Component{isValidated(){return void 0!==this.props.validation}getClassName(){let e="form-group";return this.isValidated()&&(e+=" has-feedback",null===this.props.validation?e+=" has-success":e+=" has-error"),e}getFeedback(){return this.props.validation?(0,a.Z)("div",{className:"help-block errors"},void 0,this.props.validation.map(((e,t)=>(0,a.Z)("p",{},this.props.for+"FeedbackItem"+t,e)))):null}getFeedbackDescription(){return this.isValidated()?(0,a.Z)("span",{id:this.props.for+"_status",className:"sr-only"},void 0,this.props.validation?gettext("(error)"):gettext("(success)")):null}getHelpText(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}render(){return(0,a.Z)("div",{className:this.getClassName()},void 0,(0,a.Z)("label",{className:"control-label "+(this.props.labelClass||""),htmlFor:this.props.for||""},void 0,this.props.label+":"),(0,a.Z)("div",{className:this.props.controlClass||""},void 0,this.props.children,this.getFeedbackDescription(),this.getFeedback(),this.getHelpText(),this.props.extra||null))}}},43345:function(e,t,s){"use strict";var a=s(4942),i=s(57588),o=s.n(i),n=s(55210),r=s(53904);let l=(0,n.C1)();t.Z=class extends o().Component{constructor(){super(...arguments),(0,a.Z)(this,"bindInput",(e=>t=>{this.changeValue(e,t.target.value)})),(0,a.Z)(this,"changeValue",((e,t)=>{let s={[e]:t};const a=this.state.errors||{};a[e]=this.validateField(e,s[e]),s.errors=a,this.setState(s)})),(0,a.Z)(this,"handleSubmit",(e=>{if(e&&e.preventDefault(),!this.state.isLoading&&this.clean()){this.setState({isLoading:!0});let e=this.send();e?e.then((e=>{this.setState({isLoading:!1}),this.handleSuccess(e)}),(e=>{this.setState({isLoading:!1}),this.handleError(e)})):this.setState({isLoading:!1})}}))}validate(){let e={};if(!this.state.validators)return e;let t={required:this.state.validators.required||this.state.validators,optional:this.state.validators.optional||{}},s=[];for(let e in t.required)t.required.hasOwnProperty(e)&&t.required[e]&&s.push(e);for(let e in t.optional)t.optional.hasOwnProperty(e)&&t.optional[e]&&s.push(e);for(let t in s){let a=s[t],i=this.validateField(a,this.state[a]);null===i?e[a]=null:i&&(e[a]=i)}return e}isValid(){let e=this.validate();for(let t in e)if(e.hasOwnProperty(t)&&null!==e[t])return!1;return!0}validateField(e,t){let s=[];if(!this.state.validators)return s;let a={required:(this.state.validators.required||this.state.validators)[e],optional:(this.state.validators.optional||{})[e]},i=l(t)||!1;if(a.required){if(i)s=[i];else for(let e in a.required){let i=a.required[e](t);i&&s.push(i)}return s.length?s:null}if(!1===i&&a.optional){for(let e in a.optional){let i=a.optional[e](t);i&&s.push(i)}return s.length?s:null}return!1}clean(){return!0}send(){return null}handleSuccess(e){}handleError(e){r.Z.apiError(e)}}},94417:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i);t.Z=class extends o().Component{isActive(){return this.props.isControlled?this.props.isActive:!!this.props.path&&0===document.location.pathname.indexOf(this.props.path)}getClassName(){return this.isActive()?(this.props.className||"")+" "+(this.props.activeClassName||"active"):this.props.className||""}render(){return(0,a.Z)("li",{className:this.getClassName()},void 0,this.props.children)}}},37848:function(e,t,s){"use strict";s.d(t,{Z:function(){return o}});var a,i=s(22928);function o(e){return(0,i.Z)("div",{className:e.className||"loader"},void 0,a||(a=(0,i.Z)("div",{className:"loader-spinning-wheel"})))}s(57588)},52753:function(e,t,s){"use strict";var a,i=s(22928),o=s(4942),n=(s(57588),s(82211)),r=s(43345),l=s(96359),d=s(78657),c=s(59801);function p(e){let{choices:t,onChange:s,value:a}=e;return t?(0,i.Z)(l.Z,{label:gettext("Best answer"),helpText:gettext("Please select the best answer for your newly merged thread. No posts will be deleted during the merge."),for:"id_best_answer"},void 0,(0,i.Z)("select",{className:"form-control",id:"id_best_answer",onChange:s,value:a},void 0,t.map((e=>(0,i.Z)("option",{value:e[0]},e[0],e[1]))))):null}function u(e){let{choices:t,onChange:s,value:a}=e;return t?(0,i.Z)(l.Z,{label:gettext("Poll"),helpText:gettext("Please select the poll for your newly merged thread. Rejected polls will be permanently deleted and cannot be recovered."),for:"id_poll"},void 0,(0,i.Z)("select",{className:"form-control",id:"id_poll",onChange:s,value:a},void 0,t.map((e=>(0,i.Z)("option",{value:e[0]},e[0],e[1]))))):null}t.ZP=class extends r.Z{constructor(e){super(e),(0,o.Z)(this,"handleSuccess",(e=>{this.props.onSuccess(e),c.Z.hide()})),(0,o.Z)(this,"handleError",(e=>{this.props.onError(e)})),(0,o.Z)(this,"onBestAnswerChange",(e=>{this.changeValue("bestAnswer",e.target.value)})),(0,o.Z)(this,"onPollChange",(e=>{this.changeValue("poll",e.target.value)})),this.state={isLoading:!1,bestAnswer:"0",poll:"0"}}clean(){return!this.props.polls||"0"!==this.state.poll||window.confirm(gettext("Are you sure you want to delete all polls?"))}send(){const e=Object.assign({},this.props.data,{best_answer:this.state.bestAnswer,poll:this.state.poll});return d.Z.post(this.props.api,e)}render(){return(0,i.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,a||(a=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Merge threads"))),(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(p,{choices:this.props.bestAnswers,onChange:this.onBestAnswerChange,value:this.state.bestAnswer}),(0,i.Z)(u,{choices:this.props.polls,onChange:this.onPollChange,value:this.state.poll})),(0,i.Z)("div",{className:"modal-footer"},void 0,(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,i.Z)(n.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Merge threads"))))))}}},69092:function(e,t,s){"use strict";s.d(t,{Z:function(){return h}});var a=s(94184),i=s.n(a),o=s(57588),n=s.n(o),r=s(4942),l=s(19755);const d=new RegExp("^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*");var c=new class{constructor(){(0,r.Z)(this,"render",(e=>{e&&(this.highlightCode(e),this.embedYoutubePlayers(e))})),this._youtube={}}highlightCode(e){s.e(417).then(s.bind(s,15739)).then((t=>{let{default:s}=t;const a=e.querySelectorAll("pre>code");for(let e=0;ea");for(let e=0;e');l(e).replaceWith(a),a.wrap('
')}};function p(e){const t=function(e){let t=e;return"https://"===e.substr(0,8)?t=t.substr(8):"http://"===e.substr(0,7)&&(t=t.substr(7)),"www."===t.substr(0,4)&&(t=t.substr(4)),t}(e),s=function(e){if(-1===e.indexOf("youtu"))return null;const t=e.match(d);return t?t[1]:null}(t);if(!s)return null;let a=0;if(t.indexOf("?")>0){const e=t.substr(t.indexOf("?")+1).split("&").filter((e=>"t="===e.substr(0,2)))[0];if(e){const t=e.substr(2).split("m");"s"===t[0].substr(-1)?a+=parseInt(t[0].substr(0,t[0].length-1)):(a+=60*parseInt(t[0]),t[1]&&"s"===t[1].substr(-1)&&(a+=parseInt(t[1].substr(0,t[1].length-1))))}}return{start:a,video:s}}var u=s(19755),h=class extends n().Component{componentDidMount(){c.render(this.documentNode),u(this.documentNode).find(".spoiler-reveal").click(m)}componentDidUpdate(e,t){c.render(this.documentNode),u(this.documentNode).find(".spoiler-reveal").click(m)}shouldComponentUpdate(e,t){return e.markup!==this.props.markup}render(){return n().createElement("article",{className:i()("misago-markup",this.props.className),dangerouslySetInnerHTML:{__html:this.props.markup},"data-author":this.props.author||void 0,ref:e=>{this.documentNode=e}})}};function m(e){var t=e.target;u(t).parent().parent().addClass("revealed")}},3784:function(e,t,s){"use strict";var a,i=s(22928),o=s(57588),n=s.n(o),r=s(37848);t.Z=class extends n().Component{render(){return a||(a=(0,i.Z)("div",{className:"modal-body modal-loader"},void 0,(0,i.Z)(r.Z,{})))}}},30337:function(e,t,s){"use strict";var a=s(22928),i=(s(57588),s(33556));t.Z=class extends i.Z{getHelpText(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}render(){return(0,a.Z)("div",{className:"modal-body"},void 0,(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,this.props.icon||"info_outline")),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,this.props.message),this.getHelpText(),(0,a.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}}},95187:function(e,t,s){"use strict";var a,i=s(22928),o=s(57588),n=s.n(o),r=s(37848);t.Z=class extends n().Component{render(){return a||(a=(0,i.Z)("div",{className:"panel-body panel-body-loading"},void 0,(0,i.Z)(r.Z,{className:"loader loader-spaced"})))}}},33556:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i);t.Z=class extends o().Component{getHelpText(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}render(){return(0,a.Z)("div",{className:"panel-body panel-message-body"},void 0,(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,this.props.icon||"info_outline")),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,this.props.message),this.getHelpText()))}}},11005:function(e,t,s){"use strict";s.d(t,{Z:function(){return w}});var a=s(22928),i=s(57588),o=s.n(i),n=s(69092);function r(e){return e.post.content?o().createElement(l,e):o().createElement(d,e)}function l(e){return(0,a.Z)("div",{className:"post-body"},void 0,(0,a.Z)(n.Z,{markup:e.post.content}))}function d(e){return(0,a.Z)("div",{className:"post-body post-body-invalid"},void 0,(0,a.Z)("p",{className:"lead"},void 0,gettext("This post's contents cannot be displayed.")),(0,a.Z)("p",{className:"text-muted"},void 0,gettext("This error is caused by invalid post content manipulation.")))}function c(e){let{post:t}=e;const{category:s,thread:i}=t,o=interpolate(gettext("posted %(posted_on)s"),{posted_on:t.posted_on.format("LL, LT")},!0);return(0,a.Z)("div",{className:"post-heading"},void 0,(0,a.Z)("a",{className:"btn btn-link item-title",href:i.url},void 0,i.title),(0,a.Z)("a",{className:"btn btn-link post-category",href:s.url.index},void 0,s.name),(0,a.Z)("a",{href:t.url.index,className:"btn btn-link posted-on",title:o},void 0,t.posted_on.fromNow()))}var p,u,h=s(19605);function m(e){let{post:t}=e;return(0,a.Z)("a",{className:"btn btn-default btn-icon pull-right",href:t.url.index},void 0,(0,a.Z)("span",{className:"btn-text-left hidden-xs"},void 0,gettext("See post")),p||(p=(0,a.Z)("span",{className:"material-icon"},void 0,"chevron_right")))}function v(e){let{post:t}=e;return(0,a.Z)("div",{className:"post-side post-side-anonymous"},void 0,(0,a.Z)(m,{post:t}),(0,a.Z)("div",{className:"media"},void 0,u||(u=(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("span",{},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50})))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("span",{className:"item-title"},void 0,t.poster_name)),(0,a.Z)("span",{className:"user-title user-title-anonymous"},void 0,gettext("Removed user")))))}function g(e){let{rank:t,title:s}=e,i=s||t.title||t.name,o="user-title";return t.css_class&&(o+=" user-title-"+t.css_class),t.is_tab?(0,a.Z)("a",{className:o,href:t.url},void 0,i):(0,a.Z)("span",{className:o},void 0,i)}function Z(e){let{post:t,poster:s}=e;return(0,a.Z)("div",{className:"post-side post-side-registered"},void 0,(0,a.Z)(m,{post:t}),(0,a.Z)("div",{className:"media"},void 0,(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("a",{href:s.url},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50,user:s}))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("a",{className:"item-title",href:s.url},void 0,s.username)),(0,a.Z)(g,{title:s.title,rank:s.rank}))))}function b(e){let{post:t,poster:s}=e;return s&&s.id?(0,a.Z)(Z,{post:t,poster:s}):(0,a.Z)(v,{post:t})}function f(e){let{post:t,poster:s}=e;const i=s||t.poster;let o="post";return i&&i.rank.css_class&&(o+=" post-"+i.rank.css_class),(0,a.Z)("li",{className:o,id:"post-"+t.id},void 0,(0,a.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("div",{className:"panel-content"},void 0,(0,a.Z)(b,{post:t,poster:i}),(0,a.Z)(c,{post:t}),(0,a.Z)(r,{post:t})))))}var _,N,x=s(44039);function y(){return(0,a.Z)("ul",{className:"posts-list post-feed ui-preview"},void 0,(0,a.Z)("li",{className:"post"},void 0,(0,a.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("div",{className:"panel-content"},void 0,(0,a.Z)("div",{className:"post-side post-side-anonymous"},void 0,(0,a.Z)("div",{className:"media"},void 0,_||(_=(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("span",{},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50})))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("span",{className:"item-title"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," "))),(0,a.Z)("span",{className:"user-title user-title-anonymous"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," "))))),(0,a.Z)("div",{className:"post-heading"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," ")),(0,a.Z)("div",{className:"post-body"},void 0,(0,a.Z)("article",{className:"misago-markup"},void 0,(0,a.Z)("p",{},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," ")," ",(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," ")," ",(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," ")))))))))}function w(e){let{isReady:t,posts:s,poster:i}=e;return t?(0,a.Z)("ul",{className:"posts-list post-feed ui-ready"},void 0,s.map((e=>(0,a.Z)(f,{post:e,poster:i},e.id)))):N||(N=(0,a.Z)(y,{}))}},78107:function(e,t,s){"use strict";s.d(t,{mv:function(){return d},ZP:function(){return ls},MO:function(){return C},Fi:function(){return v}});var a,i=s(57588),o=s.n(i),n=s(22928),r=s(4942),l=s(64646);class d extends o().Component{constructor(e){super(e),(0,r.Z)(this,"selected",(()=>{if(this.element){const e=p(this.element)||null,t=e?e.getBoundingClientRect():null;this.setState({range:e,rect:t})}})),(0,r.Z)(this,"reply",(()=>{if(l.Z.isOpen()){const e=C();e&&!e.disabled&&(e.quote(v(this.state.range)),this.setState({range:null,rect:null}),c())}else{const e=v(this.state.range);l.Z.open(Object.assign({},this.props.posting,{default:e})),this.setState({range:null,rect:null}),window.setTimeout(c,1e3)}})),(0,r.Z)(this,"render",(()=>(0,n.Z)("div",{},void 0,o().createElement("div",{ref:e=>{e&&(this.element=e)},onMouseUp:this.selected,onTouchEnd:this.selected},this.props.children),!!this.state.rect&&(0,n.Z)("div",{className:"quote-control",style:{position:"absolute",left:this.state.rect.left+window.scrollX,top:this.state.rect.bottom+window.scrollY}},void 0,a||(a=(0,n.Z)("div",{className:"quote-control-arrow"})),(0,n.Z)("div",{className:"quote-control-inner"},void 0,(0,n.Z)("button",{className:"btn quote-control-btn",type:"button",onClick:this.reply},void 0,pgettext("post reply","Quote"))))))),this.state={range:null,rect:null},this.element=null}}function c(){const e=document.querySelector("#posting-mount textarea");e.focus(),e.selectionStart=e.selectionEnd=e.value.length}const p=e=>{if(void 0===window.getSelection)return;const t=window.getSelection();if(!t)return;if("Range"!==t.type)return;if(1!==t.rangeCount)return;const s=t.getRangeAt(0);return u(s,e)&&h(s)&&m(s.cloneContents())?s:void 0},u=(e,t)=>{const s=e.commonAncestorContainer;if(s===t)return!0;let a=s.parentNode;for(;a;){if(a===t)return!0;a=a.parentNode}return!1},h=e=>{const t=e.commonAncestorContainer;if("ARTICLE"===t.nodeName)return!0;if(t.dataset&&"1"===t.dataset.noquote)return!1;let s=t.parentNode;for(;s;){if(s.dataset&&"1"===s.dataset.noquote)return!1;if("ARTICLE"===s.nodeName)return!0;s=s.parentNode}return!1},m=e=>{for(let t=0;t0)return!0;if("IMG"===s.nodeName)return!0;if(m(s))return!0}return!1};var v=e=>{const t=g(e);let s=y(e.cloneContents().childNodes,[]),a=t?`[quote="${t}"]\n`:"[quote]\n",i="\n[/quote]\n\n";const o=f(e);return o?(a+=o.syntax?`[code=${o.syntax}]\n`:"[code]\n",i="\n[/code]"+i):N(e)?(s=s.trim(),a+="`",i="`"+i):s=s.trim(),a+s+i};const g=e=>{const t=e.commonAncestorContainer;if(Z(t))return b(t);let s=t.parentNode;for(;s;){if(Z(s))return b(s);s=s.parentNode}return""},Z=e=>e.nodeType===Node.ELEMENT_NODE&&("ARTICLE"===e.nodeName||"BLOCKQUOTE"===e.nodeName&&e.dataset&&"quote"===e.dataset.block),b=e=>e.dataset&&e.dataset.author||null,f=e=>{const t=e.commonAncestorContainer;if(_(t))return x(t);let s=t.parentNode;for(;s;){if(_(s))return x(s);s=s.parentNode}return null},_=e=>"PRE"===e.nodeName,N=e=>{const t=e.commonAncestorContainer;if("CODE"===t.nodeName)return!0;let s=t.parentNode;for(;s;){if(Z(s))return!1;if("CODE"===s.nodeName)return!0;s=s.parentNode}return!1},x=e=>e.dataset?{syntax:e.dataset.syntax||null}:{syntax:null},y=(e,t)=>{let s="";for(let a=0;a{const s=e.dataset||{};if(e.nodeType===Node.TEXT_NODE)return e.textContent||"";if(e.nodeType===Node.ELEMENT_NODE){if(s.quote)return s.quote||"";if("1"===s.noquote)return""}if(e.nodeType===Node.ELEMENT_NODE&&s.quote&&s.quote.trim())return"";if("HR"===e.nodeName)return"\n\n- - -";if(w[e.nodeName]){const[s,a]=w[e.nodeName];return s+y(e.childNodes,[...t,e.nodeName])+a}if("A"===e.nodeName){const s=e.href,a=y(e.childNodes,[...t,e.nodeName]);return a?`[${a}](${s})`:`!(${s})`}if("IMG"===e.nodeName){const t=e.src,s=e.alt;return s?`![${s}](${t})`:`!(${t})`}if("DIV"===e.nodeName||"ASIDE"===e.nodeName){const a=s.block&&s.block.toUpperCase();if(a&&w[a]){const[s,i]=w[a];return s+y(e.childNodes,[...t,a])+i}return y(e.childNodes,t)}if("BLOCKQUOTE"===e.nodeName){if("spoiler"===s.block){const s=y(e.childNodes,[...t,"SPOILER"]).trim();if(!s)return"";let a="\n[spoiler]\n";return a+=s,a+="\n[/spoiler]",a}const a=y(e.childNodes,[...t,"QUOTE"]).trim();if(!a)return"";const i=b(e);let o=i?`\n[quote=${i}]\n`:"\n\n[quote]\n";return o+=a,o+="\n[/quote]",o}if("PRE"===e.nodeName){const t=s.syntax||null,a=e.querySelector("code"),i=a&&a.innerText||"";return i.trim()?"\n[code"+(t?"="+t:"")+"]"+i+"[/code]":""}if("CODE"===e.nodeName)return"`"+e.innerText+"`";if("P"===e.nodeName)return"\n"+y(e.childNodes,[...t,e.nodeName]);if("UL"===e.nodeName||"OL"===e.nodeName)return(0===t.filter((e=>"OL"===e||"UL"===e)).length?"\n":"")+y(e.childNodes,[...t,e.nodeName]);if("LI"===e.nodeName){let a="";const i=t.filter((e=>"OL"===e||"UL"===e)).length;for(let e=1;ee.id&&!e.isRemoved)).map((e=>e.id))}var A,I=s(12891),D=s(78657),j=s(53904),z=s(94184),U=s.n(z),M=s(32233),B=s(69092),q=s(59801),H=s(48772);function F(e){let{attachment:t}=e;return(0,n.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,A||(A=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Attachment details"))),(0,n.Z)("div",{className:"modal-body"},void 0,!!t.is_image&&(0,n.Z)("div",{className:"markup-editor-attachment-modal-preview"},void 0,(0,n.Z)("a",{href:t.url.index+"?shva=1",target:"_blank"},void 0,(0,n.Z)("img",{src:t.url.index+"?shva=1",alt:""}))),(0,n.Z)("div",{className:"markup-editor-attachment-modal-filename"},void 0,t.filename),(0,n.Z)("div",{className:"row markup-editor-attachment-modal-details"},void 0,(0,n.Z)("div",{className:"col-xs-12 col-md-3"},void 0,(0,n.Z)("strong",{},void 0,t.filetype+", "+(0,H.Z)(t.size)),(0,n.Z)("div",{className:"text-muted"},void 0,(0,n.Z)("small",{},void 0,pgettext("markup editor","Type and size")))),(0,n.Z)("div",{className:"col-xs-12 col-md-4"},void 0,(0,n.Z)("strong",{},void 0,(0,n.Z)("abbr",{title:t.uploaded_on.format("LLL")},void 0,t.uploaded_on.fromNow())),(0,n.Z)("div",{className:"text-muted"},void 0,(0,n.Z)("small",{},void 0,pgettext("markup editor","Uploaded at")))),(0,n.Z)("div",{className:"col-xs-12 col-md-3"},void 0,t.url.uploader?(0,n.Z)("a",{href:t.url.uploader,target:"_blank",className:"item-title"},void 0,t.uploader_name):(0,n.Z)("span",{className:"item-title"},void 0,t.uploader_name),(0,n.Z)("div",{className:"text-muted"},void 0,(0,n.Z)("small",{},void 0,pgettext("markup editor","Uploader")))))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("modal","Close")))))}const Y=(e,t,s,a,i)=>{const o=e.text||i||"";let n=e.prefix;n+=s+o+a,n+=e.suffix,t(n),window.setTimeout((()=>{W(e.textarea);const t=e.start+s.length;e.textarea.setSelectionRange(t,t+o.length)}),250)},V=(e,t,s)=>{let a=e.prefix;a+=s,a+=e.suffix,t(a),window.setTimeout((()=>{W(e.textarea);const t=e.end+s.length;e.textarea.setSelectionRange(t,t)}),250)},G=e=>{if(document.selection){e.focus();const t=document.selection.createRange(),s=t.text.length;return t.moveStart("character",-e.value.length),$(e,t.text.length-s,t.text.length)}if(e.selectionStart||"0"==e.selectionStart)return $(e,e.selectionStart,e.selectionEnd)},$=(e,t,s)=>({textarea:e,start:t,end:s,text:e.value.substring(t,s),prefix:e.value.substring(0,t),suffix:e.value.substring(s)});function W(e){const t=e.scrollTop;e.focus(),e.scrollTop=t}var Q,K,J,X,ee,te,se=e=>{var t;let{attachment:s,disabled:a,element:i,setState:o,update:r}=e;return(0,n.Z)("div",{className:"markup-editor-attachments-item"},void 0,(0,n.Z)("div",{className:"markup-editor-attachment"},void 0,(0,n.Z)("div",{className:"markup-editor-attachment-details"},void 0,s.id?(0,n.Z)("a",{className:"item-title",href:s.url.index+"?shva=1",target:"_blank",onClick:e=>{e.preventDefault(),q.Z.show(t||(t=(0,n.Z)(F,{attachment:s})))}},void 0,s.filename):(0,n.Z)("strong",{className:"item-title"},void 0,s.filename),(0,n.Z)("div",{className:"text-muted"},void 0,(0,n.Z)("ul",{className:"list-unstyled list-inline"},void 0,!s.id&&(0,n.Z)("li",{},void 0,s.progress+"%"),!!s.filetype&&(0,n.Z)("li",{},void 0,s.filetype),s.size>0&&(0,n.Z)("li",{},void 0,(0,H.Z)(s.size))))),!!s.id&&(0,n.Z)("div",{className:"markup-editor-attachment-buttons"},void 0,(0,n.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Insert into message"),type:"button",disabled:a,onClick:()=>{const e=function(e){let t="[";return e.is_image?(t+="!["+e.filename+"]",t+="("+(e.url.thumb||e.url.index)+"?shva=1)"):t+=e.filename,t+="]("+e.url.index+"?shva=1)",t}(s),t=G(i);V(t,r,e)}},void 0,Q||(Q=(0,n.Z)("span",{className:"material-icon"},void 0,"flip_to_front"))),(0,n.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Remove attachment"),type:"button",disabled:a,onClick:()=>{o((e=>{let{attachments:t}=e;if(window.confirm(pgettext("markup editor","Remove this attachment?")))return{attachments:t.filter((e=>{let{id:t}=e;return t!==s.id}))}}))}},void 0,K||(K=(0,n.Z)("span",{className:"material-icon"},void 0,"close")))),!s.id&&!!s.key&&(0,n.Z)("div",{className:"markup-editor-attachment-buttons"},void 0,s.error&&(0,n.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","See error"),type:"button",onClick:()=>{j.Z.error(interpolate(pgettext("markup editor","%(filename)s: %(error)s"),{filename:s.filename,error:s.error},!0))}},void 0,J||(J=(0,n.Z)("span",{className:"material-icon"},void 0,"warning"))),(0,n.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Remove attachment"),type:"button",disabled:a,onClick:()=>{o((e=>{let{attachments:t}=e;return{attachments:t.filter((e=>{let{key:t}=e;return t!==s.key}))}}))}},void 0,X||(X=(0,n.Z)("span",{className:"material-icon"},void 0,"close"))))))},ae=e=>{let{attachments:t,disabled:s,element:a,setState:i,update:o}=e;return(0,n.Z)("div",{className:"markup-editor-attachments"},void 0,(0,n.Z)("div",{className:"markup-editor-attachments-container"},void 0,t.map((e=>(0,n.Z)(se,{attachment:e,disabled:s,element:a,setState:i,update:o},e.key||e.id)))))},ie=s(82211),oe=e=>{let{canProtect:t,disabled:s,empty:a,preview:i,isProtected:o,submitText:r,showPreview:l,closePreview:d,enableProtection:c,disableProtection:p}=e;return(0,n.Z)("div",{className:"markup-editor-footer"},void 0,!!t&&(0,n.Z)(ie.Z,{className:"btn-default btn-icon hidden-sm hidden-md hidden-lg",title:o?pgettext("markup editor","Protected"):pgettext("markup editor","Protect"),type:"button",disabled:s,onClick:()=>{o?p():c()}},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,o?"lock":"lock_open")),!!t&&(0,n.Z)("div",{},void 0,(0,n.Z)(ie.Z,{className:"btn-default hidden-xs",type:"button",disabled:s,onClick:()=>{o?p():c()}},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,o?"lock":"lock_open"),o?pgettext("markup editor","Protected"):pgettext("markup editor","Protect"))),ee||(ee=(0,n.Z)("div",{className:"markup-editor-spacer"})),i?(0,n.Z)(ie.Z,{className:"btn-default btn-auto",type:"button",onClick:d},void 0,pgettext("markup editor","Edit")):(0,n.Z)(ie.Z,{className:"btn-default btn-auto",disabled:s||a,type:"button",onClick:l},void 0,pgettext("markup editor","Preview")),(0,n.Z)(ie.Z,{className:"btn-primary btn-auto",disabled:s||a},void 0,r||gettext("Post")))},ne=s(96359);class re extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{selection:t,update:s}=this.props,a=this.state.syntax.trim(),i=this.state.text.trim();if(0===i.length)return this.setState({error:gettext("This field is required.")}),!1;const o=t.prefix.trim().length?"\n\n":"";return V(Object.assign({},t,{text:i}),s,o+"```"+a+"\n"+i+"\n```\n\n"),q.Z.hide(),!1})),this.state={error:null,syntax:"",text:e.selection.text}}render(){return(0,n.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,te||(te=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Code"))),(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"modal-body"},void 0,(0,n.Z)(ne.Z,{for:"markup_code_syntax",label:pgettext("markup editor","Syntax highlighting")},void 0,(0,n.Z)("select",{id:"markup_code_syntax",className:"form-control",value:this.state.syntax,onChange:e=>this.setState({syntax:e.target.value})},void 0,(0,n.Z)("option",{value:""},void 0,pgettext("markup editor","No syntax highlighting")),le.map((e=>{let{value:t,name:s}=e;return(0,n.Z)("option",{value:t},t,s)})))),(0,n.Z)(ne.Z,{for:"markup_code_text",label:pgettext("markup editor","Code to insert"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,n.Z)("textarea",{id:"markup_code_text",className:"form-control",rows:"8",value:this.state.text,onChange:e=>this.setState({text:e.target.value})}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Cancel")),(0,n.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert code"))))))}}const le=[{value:"bash",name:"Bash"},{value:"c",name:"C"},{value:"c#",name:"C#"},{value:"c++",name:"C++"},{value:"css",name:"CSS"},{value:"diff",name:"Diff"},{value:"go",name:"Go"},{value:"graphql",name:"GraphQL"},{value:"html,",name:"HTML"},{value:"xml",name:"XML"},{value:"json",name:"JSON"},{value:"java",name:"Java"},{value:"javascript",name:"JavaScript"},{value:"kotlin",name:"Kotlin"},{value:"less",name:"Less"},{value:"lua",name:"Lua"},{value:"makefile",name:"Makefile"},{value:"markdown",name:"Markdown"},{value:"objective-C",name:"Objective-C"},{value:"php",name:"PHP"},{value:"perl",name:"Perl"},{value:"plain",name:"Plain"},{value:"text",name:"text"},{value:"python",name:"Python"},{value:"repl",name:"REPL"},{value:"r",name:"R"},{value:"ruby",name:"Ruby"},{value:"rust",name:"Rust"},{value:"scss",name:"SCSS"},{value:"sql",name:"SQL"},{value:"shell",name:"Shell Session"},{value:"swift",name:"Swift"},{value:"toml",name:"TOML"},{value:"ini",name:"INI"},{value:"typescript",name:"TypeScript"},{value:"visualbasic",name:"Visual Basic .NET"},{value:"webassembly",name:"WebAssembly"},{value:"yaml",name:"YAML"}];var de,ce,pe,ue,he,me,ve,ge,Ze,be,fe,_e,Ne,xe,ye,we,ke,Ce,Se,Ee,Le,Te,Pe,Oe,Re,Ae,Ie,De,je,ze,Ue,Me,Be,qe,He,Fe,Ye,Ve,Ge,$e,We,Qe,Ke,Je,Xe,et=re;function tt(){return(0,n.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,de||(de=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup help","Formatting help"))),(0,n.Z)("div",{className:"modal-body formatting-help"},void 0,(0,n.Z)("h4",{},void 0,pgettext("markup help","Emphasis text")),(0,n.Z)(st,{markup:pgettext("markup help","_This text will have emphasis_"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("em",{},void 0,pgettext("markup help","This text will have emphasis")))}),ce||(ce=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Bold text")),(0,n.Z)(st,{markup:pgettext("markup help","**This text will be bold**"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("strong",{},void 0,pgettext("markup help","This text will be bold")))}),pe||(pe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Removed text")),(0,n.Z)(st,{markup:pgettext("markup help","~~This text will be removed~~"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("del",{},void 0,pgettext("markup help","This text will be removed")))}),ue||(ue=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Bold text (BBCode)")),(0,n.Z)(st,{markup:pgettext("markup help","[b]This text will be bold[/b]"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("b",{},void 0,pgettext("markup help","This text will be bold")))}),he||(he=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Underlined text (BBCode)")),(0,n.Z)(st,{markup:pgettext("markup help","[u]This text will be underlined[/u]"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("u",{},void 0,pgettext("markup help","This text will be underlined")))}),me||(me=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Italics text (BBCode)")),(0,n.Z)(st,{markup:pgettext("markup help","[i]This text will be in italics[/i]"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("i",{},void 0,pgettext("markup help","This text will be in italics")))}),ve||(ve=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Link")),ge||(ge=(0,n.Z)(st,{markup:"",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,"example.com"))})),Ze||(Ze=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Link with text")),(0,n.Z)(st,{markup:"["+pgettext("markup help","Link text")+"](http://example.com)",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,pgettext("markup help","Link text")))}),be||(be=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Link (BBCode)")),fe||(fe=(0,n.Z)(st,{markup:"[url]http://example.com[/url]",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,"example.com"))})),_e||(_e=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Link with text (BBCode)")),(0,n.Z)(st,{markup:"[url=http://example.com]"+pgettext("markup help","Link text")+"[/url]",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,pgettext("markup help","Link text")))}),Ne||(Ne=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Image")),xe||(xe=(0,n.Z)(st,{markup:"!(http://placekitten.com/38/38)",result:(0,n.Z)("p",{},void 0,(0,n.Z)("img",{alt:"",src:"http://placekitten.com/38/38"}))})),ye||(ye=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Image with alternate text")),(0,n.Z)(st,{markup:"!["+pgettext("markup help","Image text")+"](http://placekitten.com/38/38)",result:(0,n.Z)("p",{},void 0,(0,n.Z)("img",{alt:pgettext("markup help","Image text"),src:"http://placekitten.com/38/38"}))}),we||(we=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Image (BBCode)")),ke||(ke=(0,n.Z)(st,{markup:"[img]http://placekitten.com/38/38[/img]",result:(0,n.Z)("p",{},void 0,(0,n.Z)("img",{alt:"",src:"http://placekitten.com/38/38"}))})),Ce||(Ce=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Mention user by their name")),Se||(Se=(0,n.Z)(st,{markup:"@username",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,"@username"))})),Ee||(Ee=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 1")),(0,n.Z)(st,{markup:pgettext("markup help","# First level heading"),result:(0,n.Z)("h1",{},void 0,pgettext("markup help","First level heading"))}),Le||(Le=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 2")),(0,n.Z)(st,{markup:pgettext("markup help","## Second level heading"),result:(0,n.Z)("h2",{},void 0,pgettext("markup help","Second level heading"))}),Te||(Te=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 3")),(0,n.Z)(st,{markup:pgettext("markup help","### Third level heading"),result:(0,n.Z)("h3",{},void 0,pgettext("markup help","Third level heading"))}),Pe||(Pe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 4")),(0,n.Z)(st,{markup:pgettext("markup help","#### Fourth level heading"),result:(0,n.Z)("h4",{},void 0,pgettext("markup help","Fourth level heading"))}),Oe||(Oe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 5")),(0,n.Z)(st,{markup:pgettext("markup help","##### Fifth level heading"),result:(0,n.Z)("h5",{},void 0,pgettext("markup help","Fifth level heading"))}),Re||(Re=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Unordered list")),Ae||(Ae=(0,n.Z)(st,{markup:"- Lorem ipsum\n- Dolor met\n- Vulputate lectus",result:(0,n.Z)("ul",{},void 0,(0,n.Z)("li",{},void 0,"Lorem ipsum"),(0,n.Z)("li",{},void 0,"Dolor met"),(0,n.Z)("li",{},void 0,"Vulputate lectus"))})),Ie||(Ie=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Ordered list")),De||(De=(0,n.Z)(st,{markup:"1. Lorem ipsum\n2. Dolor met\n3. Vulputate lectus",result:(0,n.Z)("ol",{},void 0,(0,n.Z)("li",{},void 0,"Lorem ipsum"),(0,n.Z)("li",{},void 0,"Dolor met"),(0,n.Z)("li",{},void 0,"Vulputate lectus"))})),je||(je=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Quote text")),(0,n.Z)(st,{markup:"> "+pgettext("markup help","Quoted text"),result:(0,n.Z)("blockquote",{},void 0,(0,n.Z)("p",{},void 0,pgettext("markup help","Quoted text")))}),ze||(ze=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Quote text (BBCode)")),(0,n.Z)(st,{markup:"[quote]\n"+pgettext("markup help","Quoted text")+"\n[/quote]",result:(0,n.Z)("aside",{className:"quote-block"},void 0,(0,n.Z)("div",{className:"quote-heading"},void 0,gettext("Quoted message:")),(0,n.Z)("blockquote",{className:"quote-body"},void 0,(0,n.Z)("p",{},void 0,pgettext("markup help","Quoted text"))))}),Ue||(Ue=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Quote text with title (BBCode)")),(0,n.Z)(st,{markup:'[quote="'+pgettext("markup help","Quote title")+'"]\n'+pgettext("markup help","Quoted text")+"\n[/quote]",result:(0,n.Z)("aside",{className:"quote-block"},void 0,(0,n.Z)("div",{className:"quote-heading"},void 0,gettext("Quote title has written:")),(0,n.Z)("blockquote",{className:"quote-body"},void 0,(0,n.Z)("p",{},void 0,pgettext("markup help","Quoted text"))))}),Me||(Me=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Spoiler")),(0,n.Z)(st,{markup:"[spoiler]\n"+pgettext("markup help","Secret text")+"\n[/spoiler]",result:(0,n.Z)(at,{},void 0,pgettext("markup help","Secret text"))}),Be||(Be=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Inline code")),(0,n.Z)(st,{markup:pgettext("markup help","`Inline code`"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("code",{},void 0,pgettext("markup help","Inline code")))}),qe||(qe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Code block")),He||(He=(0,n.Z)(st,{markup:'```\nalert("Hello world!");\n```',result:(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{className:"hljs"},void 0,'alert("Hello world!");'))})),Fe||(Fe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Code block with syntax highlighting")),Ye||(Ye=(0,n.Z)(st,{markup:'```python\nprint("Hello world!");\n```',result:(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{className:"hljs language-python"},void 0,(0,n.Z)("span",{className:"hljs-built_in"},void 0,"print"),'("Hello world!");'))})),Ve||(Ve=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Code block (BBCode)")),Ge||(Ge=(0,n.Z)(st,{markup:'[code]\nalert("Hello world!");\n[/code]',result:(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{className:"hljs"},void 0,'alert("Hello world!");'))})),$e||($e=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Code block with syntax highlighting (BBCode)")),We||(We=(0,n.Z)(st,{markup:'[code="python"]\nprint("Hello world!");\n[/code]',result:(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{className:"hljs language-python"},void 0,(0,n.Z)("span",{className:"hljs-built_in"},void 0,"print"),'("Hello world!");'))})),Qe||(Qe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Horizontal rule")),Ke||(Ke=(0,n.Z)(st,{markup:"Lorem ipsum\n- - -\nDolor met",result:(0,n.Z)("div",{},void 0,(0,n.Z)("p",{},void 0,"Lorem ipsum"),(0,n.Z)("hr",{}),(0,n.Z)("p",{},void 0,"Dolor met"))})),Je||(Je=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Horizontal rule (BBCode)")),Xe||(Xe=(0,n.Z)(st,{markup:"Lorem ipsum\n[hr]\nDolor met",result:(0,n.Z)("div",{},void 0,(0,n.Z)("p",{},void 0,"Lorem ipsum"),(0,n.Z)("hr",{}),(0,n.Z)("p",{},void 0,"Dolor met"))}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("modal","Close")))))}function st(e){let{markup:t,result:s}=e;return(0,n.Z)("div",{className:"formatting-help-item"},void 0,(0,n.Z)("div",{className:"formatting-help-item-markup"},void 0,(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{},void 0,t))),(0,n.Z)("div",{className:"formatting-help-item-preview"},void 0,(0,n.Z)("article",{className:"misago-markup"},void 0,s)))}class at extends o().Component{constructor(e){super(e),this.state={reveal:!1}}render(){return(0,n.Z)("aside",{className:this.state.reveal?"spoiler-block revealed":"spoiler-block"},void 0,(0,n.Z)("blockquote",{className:"spoiler-body"},void 0,(0,n.Z)("p",{},void 0,this.props.children)),!this.state.reveal&&(0,n.Z)("div",{className:"spoiler-overlay"},void 0,(0,n.Z)("button",{className:"spoiler-reveal",type:"button",onClick:()=>{this.setState({reveal:!0})}},void 0,gettext("Reveal spoiler"))))}}var it=s(19755);const ot=new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i");function nt(e){return ot.test(it.trim(e))}var rt;class lt extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{selection:t,update:s}=this.props,a=this.state.text.trim(),i=this.state.url.trim();return 0===i.length?(this.setState({error:gettext("This field is required.")}),!1):nt(i)?(a.length>0?V(t,s,"!["+a+"]("+i+")"):V(t,s,"!("+i+")"),q.Z.hide(),!1):(this.setState({error:gettext("Enter a valid address.")}),!1)}));const t=e.selection.text.trim(),s=nt(t);this.state={error:null,text:s?"":t,url:s?t:""}}render(){return(0,n.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,rt||(rt=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Image"))),(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"modal-body"},void 0,(0,n.Z)(ne.Z,{for:"markup_link_url",label:pgettext("markup editor","Image description"),helpText:pgettext("markup editor","Optional but recommended . Will be displayed instead of image when it fails to load.")},void 0,(0,n.Z)("input",{id:"markup_link_text",className:"form-control",type:"text",value:this.state.text,onChange:e=>this.setState({text:e.target.value})})),(0,n.Z)(ne.Z,{for:"markup_link_url",label:pgettext("markup editor","Image address"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,n.Z)("input",{id:"markup_link_url",className:"form-control",type:"text",value:this.state.url,onChange:e=>this.setState({url:e.target.value})}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Cancel")),(0,n.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert image"))))))}}var dt,ct=lt;class pt extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{selection:t,update:s}=this.props,a=this.state.text.trim(),i=this.state.url.trim();return 0===i.length?(this.setState({error:gettext("This field is required.")}),!1):nt(i)?(a.length>0?V(t,s,"["+a+"]("+i+")"):V(t,s,"<"+i+">"),q.Z.hide(),!1):(this.setState({error:gettext("Enter a valid address.")}),!1)}));const t=e.selection.text.trim(),s=nt(t);this.state={error:null,text:s?"":t,url:s?t:""}}render(){return(0,n.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,dt||(dt=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Link"))),(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"modal-body"},void 0,(0,n.Z)(ne.Z,{for:"markup_link_url",label:pgettext("markup editor","Link text"),helpText:pgettext("markup editor","Optional. Will be displayed instead of link's address.")},void 0,(0,n.Z)("input",{id:"markup_link_text",className:"form-control",type:"text",value:this.state.text,onChange:e=>this.setState({text:e.target.value})})),(0,n.Z)(ne.Z,{for:"markup_link_url",label:pgettext("markup editor","Link address"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,n.Z)("input",{id:"markup_link_url",className:"form-control",type:"text",value:this.state.url,onChange:e=>this.setState({url:e.target.value})}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Cancel")),(0,n.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert link"))))))}}var ut,ht=pt;class mt extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{selection:t,update:s}=this.props,a=this.state.author.trim(),i=this.state.text.trim();if(0===i.length)return this.setState({error:gettext("This field is required.")}),!1;const o=t.prefix.trim().length?"\n\n":"";return V(t,s,a?o+'[quote="'+a+'"]\n'+i+"\n[/quote]\n\n":o+"[quote]\n"+i+"\n[/quote]\n\n"),q.Z.hide(),!1})),this.state={error:null,author:"",text:e.selection.text}}render(){return(0,n.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ut||(ut=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Quote"))),(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"modal-body"},void 0,(0,n.Z)(ne.Z,{for:"markup_quote_author",label:pgettext("markup editor","Quote's author or source"),helpText:pgettext("markup editor",'Optional. If it\'s username, put "@" before it ("@JohnDoe").')},void 0,(0,n.Z)("input",{id:"markup_quote_author",className:"form-control",type:"text",value:this.state.author,onChange:e=>this.setState({author:e.target.value})})),(0,n.Z)(ne.Z,{for:"markup_quote_text",label:pgettext("markup editor","Quoted text"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,n.Z)("textarea",{id:"markup_quote_text",className:"form-control",rows:"8",value:this.state.text,onChange:e=>this.setState({text:e.target.value})}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Cancel")),(0,n.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert quote"))))))}}var vt=mt,gt=e=>{let{disabled:t,icon:s,title:a,onClick:i}=e;return(0,n.Z)("button",{className:"btn btn-markup-editor",title:a,type:"button",disabled:t,onClick:i},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,s))};const Zt="12345678990abcdefghijklmnopqrstuvwxyz",bt=Zt.length,ft=e=>{const t=[];for(let s=0;s{const s=1024*M.Z.get("user").acl.max_attachment_size;if(e.size>s)return void j.Z.error(interpolate(pgettext("markup editor","File %(filename)s is bigger than %(limit)s."),{filename:e.name,limit:(0,H.Z)(s)},!0));let a={id:null,key:ft(32),error:null,uploaded_on:null,progress:0,filename:e.name,filetype:null,is_image:!1,size:e.size,url:null,uploader_name:null};t((e=>{let{attachments:t}=e;return{attachments:[a].concat(t)}}));const i=()=>{t((e=>{let{attachments:t}=e;return{attachments:t.concat()}}))},o=new FormData;o.append("upload",e),D.Z.upload(M.Z.get("ATTACHMENTS_API"),o,(e=>{a.progress=e,i()})).then((e=>{Object.assign(a,e,{uploaded_on:O()(e.uploaded_on)}),i()}),(e=>{400===e.status||413===e.status?(a.error=e.detail,j.Z.error(e.detail),i()):j.Z.apiError(e)}))};var yt=e=>{let{disabled:t,element:s,update:a,updateAttachments:i}=e;const o=[{name:pgettext("markup editor","Strong"),icon:"format_bold",onClick:()=>{Y(G(s),a,"**","**",pgettext("example markup","Strong text"))}},{name:pgettext("markup editor","Emphasis"),icon:"format_italic",onClick:()=>{Y(G(s),a,"*","*",pgettext("example markup","Text with emphasis"))}},{name:pgettext("markup editor","Strikethrough"),icon:"format_strikethrough",onClick:()=>{Y(G(s),a,"~~","~~",pgettext("example markup","Text with strikethrough"))}},{name:pgettext("markup editor","Horizontal ruler"),icon:"remove",onClick:()=>{V(G(s),a,"\n\n- - -\n\n")}},{name:pgettext("markup editor","Link"),icon:"insert_link",onClick:()=>{const e=G(s);q.Z.show((0,n.Z)(ht,{selection:e,element:s,update:a}))}},{name:pgettext("markup editor","Image"),icon:"insert_photo",onClick:()=>{const e=G(s);q.Z.show((0,n.Z)(ct,{selection:e,element:s,update:a}))}},{name:pgettext("markup editor","Quote"),icon:"format_quote",onClick:()=>{const e=G(s);q.Z.show((0,n.Z)(vt,{selection:e,element:s,update:a}))}},{name:pgettext("markup editor","Spoiler"),icon:"visibility_off",onClick:()=>{((e,t)=>{const s=G(e),a=s.prefix.trim().length?"\n\n":"";Y(s,t,a+"[spoiler]\n","\n[/spoiler]\n\n",pgettext("markup editor","Spoiler text"))})(s,a)}},{name:pgettext("markup editor","Code"),icon:"code",onClick:()=>{const e=G(s);q.Z.show((0,n.Z)(et,{selection:e,element:s,update:a}))}}];return M.Z.get("user").acl.max_attachment_size&&o.push({name:pgettext("markup editor","Upload file"),icon:"file_upload",onClick:()=>(e=>{const t=document.createElement("input");t.type="file",t.multiple="multiple",t.addEventListener("change",(function(){for(let s=0;s{let{name:a,icon:i,onClick:o}=e;return(0,n.Z)(gt,{title:a,icon:i,disabled:t||!s,onClick:o},i)}))),(0,n.Z)("div",{className:"markup-editor-toolbar-right"},void 0,(0,n.Z)("div",{className:"markup-editor-controls-dropdown"},void 0,(0,n.Z)("button",{type:"button",className:"btn btn-markup-editor dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:t||!s},void 0,_t||(_t=(0,n.Z)("span",{className:"material-icon"},void 0,"more_vert"))),(0,n.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,o.map((e=>{let{name:a,icon:i,onClick:o}=e;return(0,n.Z)("li",{},i,(0,n.Z)("button",{type:"button",className:"btn-link",disabled:t||!s,onClick:o},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,i),a))})))),(0,n.Z)(gt,{title:pgettext("markup editor","Formatting help"),icon:"help_outline",onClick:()=>{q.Z.show(Nt||(Nt=(0,n.Z)(tt,{})))}})))},wt=s(19755);class kt extends o().Component{constructor(e){super(e),(0,r.Z)(this,"showPreview",(()=>{this.state.loading||(this.setState({loading:!0,preview:!0,element:null}),D.Z.post(M.Z.get("PARSE_MARKUP_API"),{post:this.props.value}).then((e=>{this.setState({loading:!1,parsed:e.parsed})}),(e=>{400===e.status?j.Z.error(e.detail):j.Z.apiError(e),this.setState({loading:!1,preview:!1})})))})),(0,r.Z)(this,"closePreview",(()=>{this.setState({loading:!1,preview:!1})})),(0,r.Z)(this,"onDrop",(e=>{if(e.preventDefault(),e.stopPropagation(),!e.dataTransfer.files)return;const{onAttachmentsChange:t}=this.props;if(M.Z.get("user").acl.max_attachment_size)for(let s=0;s{const{onAttachmentsChange:t}=this.props,s=[];for(let t=0;t(0,n.Z)("div",{className:U()("markup-editor",{"markup-editor-focused":this.state.focused&&!this.state.preview})},void 0,(0,n.Z)(yt,{disabled:this.props.disabled||this.state.preview,element:this.state.element,update:e=>this.props.onChange({target:{value:e}}),updateAttachments:this.props.onAttachmentsChange}),this.state.preview?(0,n.Z)("div",{className:"markup-editor-preview"},void 0,this.state.loading?(0,n.Z)("div",{className:"markup-editor-preview-loading"},void 0,(0,n.Z)("div",{className:"ui-preview"},void 0,(0,n.Z)("span",{className:"ui-preview-text",style:{width:"240px"}}))):(0,n.Z)(B.Z,{className:"markup-editor-preview-contents",markup:this.state.parsed})):o().createElement("textarea",{className:"markup-editor-textarea form-control",placeholder:this.props.placeholder,value:this.props.value,disabled:this.props.disabled||this.state.loading,rows:6,ref:e=>{e&&this.state.element!==e&&(this.setState({element:e}),function(e,t){wt(t).atwho({at:"@",displayTpl:'
  • ${username}
  • ',insertTpl:"@${username}",searchKey:"username",callbacks:{remoteFilter:function(e,t){wt.getJSON(M.Z.get("MENTION_API"),{q:e},t)}}}),wt(t).on("inserted.atwho",((t,s,a,i)=>{const{query:o}=i,n=a.target.innerText.trim(),r=t.target.value.substr(0,o.headPos),l=t.target.value.substr(o.endPos);t.target.value=r+n+l,e.onChange(t);const d=o.headPos+n.length;t.target.setSelectionRange(d,d),t.target.focus()}))}(this.props,e))},onChange:this.props.onChange,onDrop:this.onDrop,onFocus:()=>this.setState({focused:!0}),onPaste:this.onPaste,onBlur:()=>this.setState({focused:!1})}),this.props.attachments.length>0&&(0,n.Z)(ae,{attachments:this.props.attachments,disabled:this.props.disabled||this.state.preview,element:this.state.element,setState:this.props.onAttachmentsChange,update:e=>this.props.onChange({target:{value:e}})}),(0,n.Z)(oe,{preview:this.state.preview,canProtect:this.props.canProtect,isProtected:this.props.isProtected,disabled:this.props.disabled,empty:this.props.value.trim().length{let{children:t}=e;return(0,n.Z)("div",{className:"posting-dialog-body"},void 0,t)},Qt=e=>{let{close:t,message:s}=e;return(0,n.Z)("div",{className:"posting-dialog-error"},void 0,Rt||(Rt=(0,n.Z)("div",{className:"posting-dialog-error-icon"},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,"error_outlined"))),(0,n.Z)("div",{className:"posting-dialog-error-detail"},void 0,(0,n.Z)("p",{},void 0,s),(0,n.Z)("button",{type:"button",className:"btn btn-default",onClick:t},void 0,pgettext("modal","Close"))))},Kt=e=>{let{children:t,close:s,fullscreen:a,minimize:i,minimized:o,fullscreenEnter:r,fullscreenExit:l,open:d}=e;return(0,n.Z)("div",{className:"posting-dialog-header"},void 0,(0,n.Z)("div",{className:"posting-dialog-caption"},void 0,t),o?(0,n.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Open"),type:"button",onClick:d},void 0,At||(At=(0,n.Z)("span",{className:"material-icon"},void 0,"expand_less"))):(0,n.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Minimize"),type:"button",onClick:i},void 0,It||(It=(0,n.Z)("span",{className:"material-icon"},void 0,"expand_more"))),a?(0,n.Z)("button",{className:"btn btn-posting-dialog hidden-xs",title:pgettext("dialog","Exit the fullscreen mode"),type:"button",onClick:l},void 0,Dt||(Dt=(0,n.Z)("span",{className:"material-icon"},void 0,"fullscreen_exit"))):(0,n.Z)("button",{className:"btn btn-posting-dialog hidden-xs",title:pgettext("dialog","Enter the fullscreen mode"),type:"button",onClick:r},void 0,jt||(jt=(0,n.Z)("span",{className:"material-icon"},void 0,"fullscreen"))),(0,n.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Cancel"),type:"button",onClick:s},void 0,zt||(zt=(0,n.Z)("span",{className:"material-icon"},void 0,"close"))))};function Jt(e){let{isClosed:t,isHidden:s,isPinned:a,disabled:i,options:o,close:r,open:l,hide:d,unhide:c,pinGlobally:p,pinLocally:u,unpin:h}=e;const m=function(e,t,s){const a=[];return 2===s&&a.push("bookmark"),1===s&&a.push("bookmark_outline"),e&&a.push("lock"),t&&a.push("visibility_off"),a}(t,s,a);return(0,n.Z)("div",{className:"dropdown"},void 0,(0,n.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:pgettext("post thread","Options"),"aria-expanded":"true","aria-haspopup":"true","data-toggle":"dropdown",type:"button",disabled:i},void 0,m.length>0?(0,n.Z)("span",{className:"btn-icons-family"},void 0,m.map((e=>(0,n.Z)("span",{className:"material-icon"},e,e)))):Ut||(Ut=(0,n.Z)("span",{className:"material-icon"},void 0,"more_horiz"))),(0,n.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,2===o.pin&&2!==a&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:p,type:"button",disabled:i},void 0,Mt||(Mt=(0,n.Z)("span",{className:"material-icon"},void 0,"bookmark")),pgettext("post thread","Pinned globally"))),o.pin>=a&&1!==a&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:u,type:"button",disabled:i},void 0,Bt||(Bt=(0,n.Z)("span",{className:"material-icon"},void 0,"bookmark_outline")),pgettext("post thread","Pinned locally"))),o.pin>=a&&0!==a&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:h,type:"button",disabled:i},void 0,qt||(qt=(0,n.Z)("span",{className:"material-icon"},void 0,"radio_button_unchecked")),pgettext("post thread","Not pinned"))),o.close&&!!t&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:l,type:"button",disabled:i},void 0,Ht||(Ht=(0,n.Z)("span",{className:"material-icon"},void 0,"lock_outline")),pgettext("post thread","Open"))),o.close&&!t&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:r,type:"button",disabled:i},void 0,Ft||(Ft=(0,n.Z)("span",{className:"material-icon"},void 0,"lock")),pgettext("post thread","Closed"))),o.hide&&!!s&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:c,type:"button",disabled:i},void 0,Yt||(Yt=(0,n.Z)("span",{className:"material-icon"},void 0,"visibility")),pgettext("post thread","Visible"))),o.hide&&!s&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:d,type:"button",disabled:i},void 0,Vt||(Vt=(0,n.Z)("span",{className:"material-icon"},void 0,"visibility_off")),pgettext("post thread","Hidden")))))}var Xt=class extends T.Z{constructor(e){super(e),(0,r.Z)(this,"loadSuccess",(e=>{let t=null,s=null;const a=e.map((e=>(!1===e.post||t&&e.id!=this.state.category||(t=e.id,s=e.post),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id}))));this.setState({isReady:!0,options:s,categories:a,category:t})})),(0,r.Z)(this,"loadError",(e=>{this.setState({error:e.detail})})),(0,r.Z)(this,"onCancel",(()=>{window.confirm(pgettext("post thread","Are you sure you want to discard thread?"))&&(this.minimize(),l.Z.close())})),(0,r.Z)(this,"onTitleChange",(e=>{this.changeValue("title",e.target.value)})),(0,r.Z)(this,"onCategoryChange",(e=>{const t=this.state.categories.find((t=>e.target.value==t.value));let s=this.state.pin;t.post.pin&&t.post.pin{this.changeValue("post",e.target.value)})),(0,r.Z)(this,"onAttachmentsChange",(e=>{this.setState(e)})),(0,r.Z)(this,"onClose",(()=>{this.changeValue("close",!0)})),(0,r.Z)(this,"onOpen",(()=>{this.changeValue("close",!1)})),(0,r.Z)(this,"onPinGlobally",(()=>{this.changeValue("pin",2)})),(0,r.Z)(this,"onPinLocally",(()=>{this.changeValue("pin",1)})),(0,r.Z)(this,"onUnpin",(()=>{this.changeValue("pin",0)})),(0,r.Z)(this,"onHide",(()=>{this.changeValue("hide",!0)})),(0,r.Z)(this,"onUnhide",(()=>{this.changeValue("hide",!1)})),(0,r.Z)(this,"close",(()=>{this.minimize(),l.Z.close()})),(0,r.Z)(this,"minimize",(()=>{this.setState({fullscreen:!1,minimized:!0})})),(0,r.Z)(this,"open",(()=>{this.setState({minimized:!1}),this.state.fullscreen})),(0,r.Z)(this,"fullscreenEnter",(()=>{this.setState({fullscreen:!0,minimized:!1})})),(0,r.Z)(this,"fullscreenExit",(()=>{this.setState({fullscreen:!1,minimized:!1})})),this.state={isReady:!1,isLoading:!1,error:null,minimized:!1,fullscreen:!1,options:null,title:"",category:e.category||null,categories:[],post:"",attachments:[],close:!1,hide:!1,pin:0,validators:{title:(0,I.jn)(),post:(0,I.Jh)()},errors:{}}}componentDidMount(){D.Z.get(this.props.config).then(this.loadSuccess,this.loadError)}clean(){if(!this.state.title.trim().length)return j.Z.error(gettext("You have to enter thread title.")),!1;if(!this.state.post.trim().length)return j.Z.error(gettext("You have to enter a message.")),!1;const e=this.validate();return e.title?(j.Z.error(e.title[0]),!1):!e.post||(j.Z.error(e.post[0]),!1)}send(){return D.Z.post(this.props.submit,{title:this.state.title,category:this.state.category,post:this.state.post,attachments:R(this.state.attachments),close:this.state.close,hide:this.state.hide,pin:this.state.pin})}handleSuccess(e){this.setState({isLoading:!0}),this.close(),j.Z.success(pgettext("post thread","Your thread has been posted.")),window.location=e.url}handleError(e){if(400===e.status){const t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]);j.Z.error(t[0])}else j.Z.apiError(e)}render(){const e={minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};if(this.state.error)return o().createElement(es,e,(0,n.Z)(Qt,{message:this.state.error,close:this.close}));if(!this.state.isReady)return o().createElement(es,e,(0,n.Z)("div",{className:"posting-loading ui-preview"},void 0,Gt||(Gt=(0,n.Z)(St.o8,{className:"posting-dialog-toolbar"},void 0,(0,n.Z)(St.Z2,{className:"posting-dialog-thread-title",auto:!0},void 0,(0,n.Z)(St.Eg,{auto:!0},void 0,(0,n.Z)("input",{className:"form-control",disabled:!0,type:"text"}))),(0,n.Z)(St.Z2,{className:"posting-dialog-category-select",auto:!0},void 0,(0,n.Z)(St.Eg,{},void 0,(0,n.Z)("input",{className:"form-control",disabled:!0,type:"text"}))))),(0,n.Z)(Ct,{attachments:[],value:"",submitText:pgettext("post thread submit","Post thread"),disabled:!0,onAttachmentsChange:()=>{},onChange:()=>{}})));const t=!!(this.state.options.close||this.state.options.hide||this.state.options.pin);return o().createElement(es,e,(0,n.Z)("form",{className:"posting-dialog-form",onSubmit:this.handleSubmit},void 0,(0,n.Z)(St.o8,{className:"posting-dialog-toolbar"},void 0,(0,n.Z)(St.Z2,{className:"posting-dialog-thread-title",auto:!0},void 0,(0,n.Z)(St.Eg,{auto:!0},void 0,(0,n.Z)("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:pgettext("post thread","Thread title"),type:"text",value:this.state.title}))),(0,n.Z)(St.Z2,{className:"posting-dialog-category-select",auto:!0},void 0,(0,n.Z)(St.Eg,{},void 0,(0,n.Z)(L.Z,{choices:this.state.categories,disabled:this.state.isLoading,onChange:this.onCategoryChange,value:this.state.category})),t&&(0,n.Z)(St.Eg,{shrink:!0},void 0,(0,n.Z)(Jt,{isClosed:this.state.close,isHidden:this.state.hide,isPinned:this.state.pin,disabled:this.state.isLoading,options:this.state.options,close:this.onClose,open:this.onOpen,hide:this.onHide,unhide:this.onUnhide,pinGlobally:this.onPinGlobally,pinLocally:this.onPinLocally,unpin:this.onUnpin})))),(0,n.Z)(Ct,{attachments:this.state.attachments,value:this.state.post,submitText:pgettext("post thread submit","Start thread"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange})))}};const es=e=>{let{children:t,close:s,minimized:a,minimize:i,open:o,fullscreen:r,fullscreenEnter:l,fullscreenExit:d}=e;return(0,n.Z)($t,{fullscreen:r,minimized:a},void 0,(0,n.Z)(Kt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:d,minimized:a,minimize:i,open:o,close:s},void 0,pgettext("post thread","Start new thread")),(0,n.Z)(Wt,{},void 0,t))};function ts(e){const t=e.split(",").map((e=>e.trim().toLowerCase())).filter((e=>e.length>0));return t.filter(((e,s)=>t.indexOf(e)==s))}var ss=class extends T.Z{constructor(e){super(e),(0,r.Z)(this,"onCancel",(()=>{window.confirm(pgettext("post thread","Are you sure you want to discard private thread?"))&&this.close()})),(0,r.Z)(this,"onToChange",(e=>{this.changeValue("to",e.target.value)})),(0,r.Z)(this,"onTitleChange",(e=>{this.changeValue("title",e.target.value)})),(0,r.Z)(this,"onPostChange",(e=>{this.changeValue("post",e.target.value)})),(0,r.Z)(this,"onAttachmentsChange",(e=>{this.setState(e)})),(0,r.Z)(this,"close",(()=>{this.minimize(),l.Z.close()})),(0,r.Z)(this,"minimize",(()=>{this.setState({fullscreen:!1,minimized:!0})})),(0,r.Z)(this,"open",(()=>{this.setState({minimized:!1}),this.state.fullscreen})),(0,r.Z)(this,"fullscreenEnter",(()=>{this.setState({fullscreen:!0,minimized:!1})})),(0,r.Z)(this,"fullscreenExit",(()=>{this.setState({fullscreen:!1,minimized:!1})}));const t=(e.to||[]).map((e=>e.username)).join(", ");this.state={isLoading:!1,error:null,minimized:!1,fullscreen:!1,to:t,title:"",post:"",attachments:[],validators:{title:(0,I.jn)(),post:(0,I.Jh)()},errors:{}}}clean(){if(!ts(this.state.to).length)return j.Z.error(gettext("You have to enter at least one recipient.")),!1;if(!this.state.title.trim().length)return j.Z.error(gettext("You have to enter thread title.")),!1;if(!this.state.post.trim().length)return j.Z.error(gettext("You have to enter a message.")),!1;const e=this.validate();return e.title?(j.Z.error(e.title[0]),!1):!e.post||(j.Z.error(e.post[0]),!1)}send(){return D.Z.post(this.props.submit,{to:ts(this.state.to),title:this.state.title,post:this.state.post,attachments:R(this.state.attachments)})}handleSuccess(e){this.setState({isLoading:!0}),this.close(),j.Z.success(pgettext("post thread","Your thread has been posted.")),window.location=e.url}handleError(e){if(400===e.status){const t=[].concat(e.non_field_errors||[],e.to||[],e.title||[],e.post||[],e.attachments||[]);j.Z.error(t[0])}else j.Z.apiError(e)}render(){const e={minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return o().createElement(as,e,(0,n.Z)("form",{className:"posting-dialog-form",onSubmit:this.handleSubmit},void 0,(0,n.Z)(St.o8,{className:"posting-dialog-toolbar"},void 0,(0,n.Z)(St.Z2,{className:"posting-dialog-thread-recipients",auto:!0},void 0,(0,n.Z)(St.Eg,{auto:!0},void 0,(0,n.Z)("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onToChange,placeholder:pgettext("post thread","Recipients, eg.: Danny, Lisa, Alice"),type:"text",value:this.state.to}))),(0,n.Z)(St.Z2,{className:"posting-dialog-thread-title",auto:!0},void 0,(0,n.Z)(St.Eg,{auto:!0},void 0,(0,n.Z)("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:pgettext("post thread","Thread title"),type:"text",value:this.state.title})))),(0,n.Z)(Ct,{attachments:this.state.attachments,value:this.state.post,submitText:pgettext("post thread submit","Start thread"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange})))}};const as=e=>{let{children:t,close:s,minimized:a,minimize:i,open:o,fullscreen:r,fullscreenEnter:l,fullscreenExit:d}=e;return(0,n.Z)($t,{fullscreen:r,minimized:a},void 0,(0,n.Z)(Kt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:d,minimized:a,minimize:i,open:o,close:s},void 0,pgettext("post thread","Start private thread")),(0,n.Z)(Wt,{},void 0,t))};var is=class extends T.Z{constructor(e){super(e),(0,r.Z)(this,"loadSuccess",(e=>{this.setState({isReady:!0,post:e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]":this.state.post})})),(0,r.Z)(this,"loadError",(e=>{this.setState({error:e.detail})})),(0,r.Z)(this,"appendData",(e=>{const t=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]\n\n":"";this.setState(((e,s)=>e.post.length>0?{post:e.post+"\n\n"+t}:{post:t})),this.open()})),(0,r.Z)(this,"onCancel",(()=>{window.confirm(pgettext("post reply","Are you sure you want to discard your reply?"))&&this.close()})),(0,r.Z)(this,"onPostChange",(e=>{this.changeValue("post",e.target.value)})),(0,r.Z)(this,"onAttachmentsChange",(e=>{this.setState(e)})),(0,r.Z)(this,"onQuote",(e=>{this.setState((t=>{let{post:s}=t;return s.length>0?{post:s.trim()+"\n\n"+e}:{post:e}})),this.open()})),(0,r.Z)(this,"close",(()=>{this.minimize(),l.Z.close()})),(0,r.Z)(this,"minimize",(()=>{this.setState({fullscreen:!1,minimized:!0})})),(0,r.Z)(this,"open",(()=>{this.setState({minimized:!1}),this.state.fullscreen})),(0,r.Z)(this,"fullscreenEnter",(()=>{this.setState({fullscreen:!0,minimized:!1})})),(0,r.Z)(this,"fullscreenExit",(()=>{this.setState({fullscreen:!1,minimized:!1})})),this.state={isReady:!1,isLoading:!1,error:null,minimized:!1,fullscreen:!1,post:this.props.default||"",attachments:[],validators:{post:(0,I.Jh)()},errors:{}}}componentDidMount(){D.Z.get(this.props.config,this.props.context||null).then(this.loadSuccess,this.loadError),S(!1,this.onQuote)}componentWillUnmount(){E()}componentWillReceiveProps(e){const t=this.props.context,s=e.context;t&&s&&t.reply===s.reply||D.Z.get(e.config,e.context||null).then(this.appendData,j.Z.apiError)}clean(){if(!this.state.post.trim().length)return j.Z.error(gettext("You have to enter a message.")),!1;const e=this.validate();return!e.post||(j.Z.error(e.post[0]),!1)}send(){return S(!0,this.onQuote),D.Z.post(this.props.submit,{post:this.state.post,attachments:R(this.state.attachments)})}handleSuccess(e){this.setState({isLoading:!0}),this.close(),S(!1,this.onQuote),j.Z.success(pgettext("post reply","Your reply has been posted.")),window.location=e.url.index}handleError(e){if(400===e.status){const t=[].concat(e.non_field_errors||[],e.post||[],e.attachments||[]);j.Z.error(t[0])}else j.Z.apiError(e);S(!1,this.onQuote)}render(){const e={thread:this.props.thread,minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return this.state.error?o().createElement(os,e,(0,n.Z)(Qt,{message:this.state.error,close:this.close})):this.state.isReady?o().createElement(os,e,(0,n.Z)("form",{className:"posting-dialog-form",method:"POST",onSubmit:this.handleSubmit},void 0,(0,n.Z)(Ct,{attachments:this.state.attachments,value:this.state.post,submitText:pgettext("post reply submit","Post reply"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange}))):o().createElement(os,e,(0,n.Z)("div",{className:"posting-loading ui-preview"},void 0,(0,n.Z)(Ct,{attachments:[],value:"",submitText:pgettext("post reply submit","Post reply"),disabled:!0,onAttachmentsChange:()=>{},onChange:()=>{}})))}};const os=e=>{let{children:t,close:s,minimized:a,minimize:i,open:o,fullscreen:r,fullscreenEnter:l,fullscreenExit:d,thread:c}=e;return(0,n.Z)($t,{fullscreen:r,minimized:a},void 0,(0,n.Z)(Kt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:d,minimized:a,minimize:i,open:o,close:s},void 0,interpolate(pgettext("post reply","Reply to: %(thread)s"),{thread:c.title},!0)),(0,n.Z)(Wt,{},void 0,t))};var ns=class extends T.Z{constructor(e){super(e),(0,r.Z)(this,"loadSuccess",(e=>{var t;this.setState({isReady:!0,post:e.post,attachments:(t=e.attachments,t.map((e=>Object.assign({},e,{uploaded_on:O()(e.uploaded_on)})))),protect:e.is_protected,canProtect:e.can_protect})})),(0,r.Z)(this,"loadError",(e=>{this.setState({error:e.detail})})),(0,r.Z)(this,"appendData",(e=>{const t=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]\n\n":"";this.setState(((e,s)=>e.post.length>0?{post:e.post+"\n\n"+t}:{post:t})),this.open()})),(0,r.Z)(this,"onCancel",(()=>{window.confirm(gettext("Are you sure you want to discard changes?"))&&this.close()})),(0,r.Z)(this,"onProtect",(()=>{this.setState({protect:!0})})),(0,r.Z)(this,"onUnprotect",(()=>{this.setState({protect:!1})})),(0,r.Z)(this,"onPostChange",(e=>{this.changeValue("post",e.target.value)})),(0,r.Z)(this,"onAttachmentsChange",(e=>{this.setState(e)})),(0,r.Z)(this,"onQuote",(e=>{this.setState((t=>{let{post:s}=t;return s.length>0?{post:s.trim()+"\n\n"+e}:{post:e}})),this.open()})),(0,r.Z)(this,"close",(()=>{this.minimize(),l.Z.close()})),(0,r.Z)(this,"minimize",(()=>{this.setState({fullscreen:!1,minimized:!0})})),(0,r.Z)(this,"open",(()=>{this.setState({minimized:!1}),this.state.fullscreen})),(0,r.Z)(this,"fullscreenEnter",(()=>{this.setState({fullscreen:!0,minimized:!1})})),(0,r.Z)(this,"fullscreenExit",(()=>{this.setState({fullscreen:!1,minimized:!1})})),this.state={isReady:!1,isLoading:!1,error:!1,minimized:!1,fullscreen:!1,post:"",attachments:[],protect:!1,canProtect:!1,validators:{post:(0,I.Jh)()},errors:{}}}componentDidMount(){D.Z.get(this.props.config).then(this.loadSuccess,this.loadError),S(!1,this.onQuote)}componentWillUnmount(){E()}componentWillReceiveProps(e){const t=this.props.context,s=e.context;t&&s&&t.reply===s.reply||D.Z.get(e.config,e.context||null).then(this.appendData,j.Z.apiError)}clean(){if(!this.state.post.trim().length)return j.Z.error(gettext("You have to enter a message.")),!1;const e=this.validate();return!e.post||(j.Z.error(e.post[0]),!1)}send(){return S(!0,this.onQuote),D.Z.put(this.props.submit,{post:this.state.post,attachments:R(this.state.attachments),protect:this.state.protect})}handleSuccess(e){this.setState({isLoading:!0}),this.close(),S(!1,this.onQuote),j.Z.success(gettext("Reply has been edited.")),window.location=e.url.index}handleError(e){if(400===e.status){const t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]);j.Z.error(t[0])}else j.Z.apiError(e);S(!1,this.onQuote)}render(){const e={post:this.props.post,minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return this.state.error?o().createElement(rs,e,(0,n.Z)(Qt,{message:this.state.error,close:this.close})):this.state.isReady?o().createElement(rs,e,(0,n.Z)("form",{className:"posting-dialog-form",method:"POST",onSubmit:this.handleSubmit},void 0,(0,n.Z)(Ct,{attachments:this.state.attachments,canProtect:this.state.canProtect,isProtected:this.state.protect,enableProtection:()=>this.setState({protect:!0}),disableProtection:()=>this.setState({protect:!1}),value:this.state.post,submitText:pgettext("edit reply submit","Edit reply"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange}))):o().createElement(rs,e,(0,n.Z)("div",{className:"posting-loading ui-preview"},void 0,(0,n.Z)(Ct,{attachments:[],value:"",submitText:pgettext("edit reply submit","Edit reply"),disabled:!0,onAttachmentsChange:()=>{},onChange:()=>{}})))}};const rs=e=>{let{children:t,close:s,minimized:a,minimize:i,open:o,fullscreen:r,fullscreenEnter:l,fullscreenExit:d,post:c}=e;return(0,n.Z)($t,{fullscreen:r,minimized:a},void 0,(0,n.Z)(Kt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:d,minimized:a,minimize:i,open:o,close:s},void 0,interpolate(pgettext("edit reply","Edit reply by %(poster)s from %(date)s"),{poster:c.poster?c.poster.username:c.poster_name,date:c.posted_on.fromNow()},!0)),(0,n.Z)(Wt,{},void 0,t))};function ls(e){switch(e.mode){case"START":return o().createElement(Xt,e);case"START_PRIVATE":return o().createElement(ss,e);case"REPLY":return o().createElement(is,e);case"EDIT":return o().createElement(ns,e);default:return null}}},12891:function(e,t,s){"use strict";s.d(t,{Jh:function(){return n},jn:function(){return o}});var a=s(55210),i=s(32233);function o(){return[(0,a.Ei)(i.Z.get("SETTINGS").thread_title_length_min,((e,t)=>{const s=ngettext("Thread title should be at least %(limit_value)s character long (it has %(show_value)s).","Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).",e);return interpolate(s,{limit_value:e,show_value:t},!0)})),(0,a.BS)(i.Z.get("SETTINGS").thread_title_length_max,((e,t)=>{const s=ngettext("Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).","Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).",e);return interpolate(s,{limit_value:e,show_value:t},!0)}))]}function n(){return i.Z.get("SETTINGS").post_length_max?[r(),(0,a.BS)(i.Z.get("SETTINGS").post_length_max||1e6,((e,t)=>{const s=ngettext("Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).","Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).",e);return interpolate(s,{limit_value:e,show_value:t},!0)}))]:[r()]}function r(){return(0,a.Ei)(i.Z.get("SETTINGS").post_length_min,((e,t)=>{const s=ngettext("Posted message should be at least %(limit_value)s character long (it has %(show_value)s).","Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).",e);return interpolate(s,{limit_value:e,show_value:t},!0)}))}},60471:function(e,t,s){"use strict";var a=s(22928),i=s(4942),o=s(57588),n=s.n(o);function r(e){let{icon:t}=e;return t?(0,a.Z)("span",{className:"material-icon"},void 0,t):null}t.Z=class extends n().Component{constructor(){super(...arguments),(0,i.Z)(this,"change",(e=>()=>{this.props.onChange({target:{value:e}})}))}getChoice(){let e=null;return this.props.choices.map((t=>{t.value===this.props.value&&(e=t)})),e}getIcon(){return this.getChoice().icon}getLabel(){return this.getChoice().label}render(){return(0,a.Z)("div",{className:"btn-group btn-select-group"},void 0,(0,a.Z)("button",{type:"button",className:"btn btn-select dropdown-toggle",id:this.props.id||null,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},void 0,(0,a.Z)(r,{icon:this.getIcon()}),this.getLabel()),(0,a.Z)("ul",{className:"dropdown-menu"},void 0,this.props.choices.map(((e,t)=>(0,a.Z)("li",{},t,(0,a.Z)("button",{type:"button",className:"btn-link",onClick:this.change(e.value)},void 0,(0,a.Z)(r,{icon:e.icon}),e.label))))))}}},14467:function(e,t,s){"use strict";var a,i=s(22928),o=(s(57588),s(32233)),n=s(82211),r=s(43345),l=s(47235),d=s(78657),c=s(59801),p=s(53904),u=s(93051),h=s(19755);t.Z=class extends r.Z{constructor(e){super(e),this.state={isLoading:!1,showActivation:!1,username:"",password:"",validators:{username:[],password:[]}}}clean(){return!!this.isValid()||(p.Z.error(gettext("Fill out both fields.")),!1)}send(){return d.Z.post(o.Z.get("AUTH_API"),{username:this.state.username,password:this.state.password})}handleSuccess(){let e=h("#hidden-login-form");e.append(''),e.append(''),e.find('input[type="hidden"]').val(d.Z.getCsrfToken()),e.find('input[name="redirect_to"]').val(window.location.pathname),e.find('input[name="username"]').val(this.state.username),e.find('input[name="password"]').val(this.state.password),e.submit(),this.setState({isLoading:!0})}handleError(e){400===e.status?"inactive_admin"===e.code?p.Z.info(e.detail):"inactive_user"===e.code?(p.Z.info(e.detail),this.setState({showActivation:!0})):"banned"===e.code?((0,u.Z)(e.detail),c.Z.hide()):p.Z.error(e.detail):403===e.status&&e.ban?((0,u.Z)(e.ban),c.Z.hide()):p.Z.apiError(e)}getActivationButton(){return this.state.showActivation?(0,i.Z)("a",{className:"btn btn-success btn-block",href:o.Z.get("REQUEST_ACTIVATION_URL")},void 0,gettext("Activate account")):null}render(){return(0,i.Z)("div",{className:"modal-dialog modal-sm modal-sign-in",role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,a||(a=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Sign in"))),(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(l.Z,{buttonLabel:gettext("Sign in with %(site)s"),formLabel:gettext("Or use your forum account:"),labelClassName:"text-center"}),(0,i.Z)("div",{className:"form-group"},void 0,(0,i.Z)("div",{className:"control-input"},void 0,(0,i.Z)("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_username",onChange:this.bindInput("username"),placeholder:gettext("Username or e-mail"),type:"text",value:this.state.username}))),(0,i.Z)("div",{className:"form-group"},void 0,(0,i.Z)("div",{className:"control-input"},void 0,(0,i.Z)("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_password",onChange:this.bindInput("password"),placeholder:gettext("Password"),type:"password",value:this.state.password})))),(0,i.Z)("div",{className:"modal-footer"},void 0,this.getActivationButton(),(0,i.Z)(n.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,gettext("Sign in")),(0,i.Z)("a",{className:"btn btn-default btn-block",href:o.Z.get("FORGOTTEN_PASSWORD_URL")},void 0,gettext("Forgot password?"))))))}}},24678:function(e,t,s){"use strict";s.d(t,{Jj:function(){return n},pg:function(){return r}});var a=s(22928),i=s(57588),o=s.n(i);t.ZP=class extends o().Component{getClass(){return function(e){let t="";return e.is_banned?t="banned":e.is_hidden?t="offline":e.is_online_hidden?t="online":e.is_offline_hidden?t="offline":e.is_online?t="online":e.is_offline&&(t="offline"),"user-status user-"+t}(this.props.status)}render(){return(0,a.Z)("span",{className:this.getClass()},void 0,this.props.children)}};class n extends o().Component{getIcon(){return this.props.status.is_banned?"remove_circle_outline":this.props.status.is_hidden?"help_outline":this.props.status.is_online_hidden?"label":this.props.status.is_offline_hidden?"label_outline":this.props.status.is_online?"lens":this.props.status.is_offline?"panorama_fish_eye":void 0}render(){return(0,a.Z)("span",{className:"material-icon status-icon"},void 0,this.getIcon())}}class r extends o().Component{getHelp(){return e=this.props.user,(t=this.props.status).is_banned?t.banned_until?interpolate(gettext("%(username)s is banned until %(ban_expires)s"),{username:e.username,ban_expires:t.banned_until.format("LL, LT")},!0):interpolate(gettext("%(username)s is banned"),{username:e.username},!0):t.is_hidden?interpolate(gettext("%(username)s is hiding presence"),{username:e.username},!0):t.is_online_hidden?interpolate(gettext("%(username)s is online (hidden)"),{username:e.username},!0):t.is_offline_hidden?interpolate(gettext("%(username)s was last seen %(last_click)s (hidden)"),{username:e.username,last_click:t.last_click.fromNow()},!0):t.is_online?interpolate(gettext("%(username)s is online"),{username:e.username},!0):t.is_offline?interpolate(gettext("%(username)s was last seen %(last_click)s"),{username:e.username,last_click:t.last_click.fromNow()},!0):void 0;var e,t}getLabel(){return this.props.status.is_banned?gettext("Banned"):this.props.status.is_hidden?gettext("Hidden"):this.props.status.is_online_hidden?gettext("Online (hidden)"):this.props.status.is_offline_hidden?gettext("Offline (hidden)"):this.props.status.is_online?gettext("Online"):this.props.status.is_offline?gettext("Offline"):void 0}render(){return(0,a.Z)("span",{className:this.props.className||"status-label",title:this.getHelp()},void 0,this.getLabel())}}},7850:function(e,t,s){"use strict";s.d(t,{Z:function(){return b}});var a,i,o,n,r,l=s(22928),d=s(57588),c=s.n(d),p=class extends c().Component{getEmptyMessage(){return this.props.emptyMessage?this.props.emptyMessage:gettext("No name changes have been recorded for your account.")}render(){return(0,l.Z)("div",{className:"username-history ui-ready"},void 0,(0,l.Z)("ul",{className:"list-group"},void 0,(0,l.Z)("li",{className:"list-group-item empty-message"},void 0,this.getEmptyMessage())))}},u=s(19605),h=class extends c().Component{renderUserAvatar(){return this.props.change.changed_by?(0,l.Z)("a",{href:this.props.change.changed_by.url,className:"user-avatar-wrapper"},void 0,(0,l.Z)(u.ZP,{user:this.props.change.changed_by,size:"100"})):a||(a=(0,l.Z)("span",{className:"user-avatar-wrapper"},void 0,(0,l.Z)(u.ZP,{size:"100"})))}renderUsername(){return this.props.change.changed_by?(0,l.Z)("a",{href:this.props.change.changed_by.url,className:"item-title"},void 0,this.props.change.changed_by.username):(0,l.Z)("span",{className:"item-title"},void 0,this.props.change.changed_by_username)}render(){return(0,l.Z)("li",{className:"list-group-item"},this.props.change.id,(0,l.Z)("div",{className:"change-avatar"},void 0,this.renderUserAvatar()),(0,l.Z)("div",{className:"change-author"},void 0,this.renderUsername()),(0,l.Z)("div",{className:"change"},void 0,(0,l.Z)("span",{className:"old-username"},void 0,this.props.change.old_username),i||(i=(0,l.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),(0,l.Z)("span",{className:"new-username"},void 0,this.props.change.new_username)),(0,l.Z)("div",{className:"change-date"},void 0,(0,l.Z)("abbr",{title:this.props.change.changed_on.format("LLL")},void 0,this.props.change.changed_on.fromNow())))}},m=class extends c().Component{render(){return(0,l.Z)("div",{className:"username-history ui-ready"},void 0,(0,l.Z)("ul",{className:"list-group"},void 0,this.props.changes.map((e=>(0,l.Z)(h,{change:e},e.id)))))}},v=s(44039),g=class extends c().Component{shouldComponentUpdate(){return!1}getClassName(){return this.props.hiddenOnMobile?"list-group-item hidden-xs hidden-sm":"list-group-item"}render(){return(0,l.Z)("li",{className:this.getClassName()},void 0,o||(o=(0,l.Z)("div",{className:"change-avatar"},void 0,(0,l.Z)("span",{className:"user-avatar"},void 0,(0,l.Z)(u.ZP,{size:"100"})))),(0,l.Z)("div",{className:"change-author"},void 0,(0,l.Z)("span",{className:"ui-preview-text",style:{width:v.e(30,100)+"px"}},void 0," ")),(0,l.Z)("div",{className:"change"},void 0,(0,l.Z)("span",{className:"ui-preview-text",style:{width:v.e(30,70)+"px"}},void 0," "),n||(n=(0,l.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),(0,l.Z)("span",{className:"ui-preview-text",style:{width:v.e(30,70)+"px"}},void 0," ")),(0,l.Z)("div",{className:"change-date"},void 0,(0,l.Z)("span",{className:"ui-preview-text",style:{width:v.e(80,140)+"px"}},void 0," ")))}},Z=class extends c().Component{shouldComponentUpdate(){return!1}render(){return(0,l.Z)("div",{className:"username-history ui-preview"},void 0,(0,l.Z)("ul",{className:"list-group"},void 0,[0,1,2].map((e=>(0,l.Z)(g,{hiddenOnMobile:e>0},e)))))}},b=class extends c().Component{render(){return this.props.isLoaded?this.props.changes.length?(0,l.Z)(m,{changes:this.props.changes}):(0,l.Z)(p,{emptyMessage:this.props.emptyMessage}):r||(r=(0,l.Z)(Z,{}))}}},40429:function(e,t,s){"use strict";s.d(t,{Z:function(){return k}});var a,i=s(22928),o=s(57588),n=s.n(o),r=s(19605),l=s(24678);function d(e){let{showStatus:t,user:s}=e;return(0,i.Z)("ul",{className:"list-unstyled"},void 0,(0,i.Z)(c,{showStatus:t,user:s}),(0,i.Z)(p,{user:s}),a||(a=(0,i.Z)("li",{className:"user-stat-divider"})),(0,i.Z)(u,{user:s}),(0,i.Z)(h,{user:s}),(0,i.Z)(m,{user:s}))}function c(e){let{showStatus:t,user:s}=e;return t?(0,i.Z)("li",{className:"user-stat-status"},void 0,(0,i.Z)(l.ZP,{status:s.status},void 0,(0,i.Z)(l.pg,{status:s.status,user:s}))):null}function p(e){let{user:t}=e;const{joined_on:s}=t;let a=interpolate(gettext("Joined on %(joined_on)s"),{joined_on:s.format("LL, LT")},!0),o=interpolate(gettext("Joined %(joined_on)s"),{joined_on:s.fromNow()},!0);return(0,i.Z)("li",{className:"user-stat-join-date"},void 0,(0,i.Z)("abbr",{title:a},void 0,o))}function u(e){let{user:t}=e;const s=v("user-stat-posts",t.posts),a=ngettext("%(posts)s post","%(posts)s posts",t.posts);return(0,i.Z)("li",{className:s},void 0,interpolate(a,{posts:t.posts},!0))}function h(e){let{user:t}=e;const s=v("user-stat-threads",t.threads),a=ngettext("%(threads)s thread","%(threads)s threads",t.threads);return(0,i.Z)("li",{className:s},void 0,interpolate(a,{threads:t.threads},!0))}function m(e){let{user:t}=e;const s=v("user-stat-followers",t.followers),a=ngettext("%(followers)s follower","%(followers)s followers",t.followers);return(0,i.Z)("li",{className:s},void 0,interpolate(a,{followers:t.followers},!0))}function v(e,t){return 0===t?e+" user-stat-empty":e}function g(e){let{rank:t,title:s}=e,a=s||t.title||t.name,o="user-title";return t.css_class&&(o+=" user-title-"+t.css_class),t.is_tab?(0,i.Z)("a",{className:o,href:t.url},void 0,a):(0,i.Z)("span",{className:o},void 0,a)}function Z(e){let{showStatus:t,user:s}=e;const{rank:a}=s;let o="panel user-card";return a.css_class&&(o+=" user-card-"+a.css_class),(0,i.Z)("div",{className:o},void 0,(0,i.Z)("div",{className:"panel-body"},void 0,(0,i.Z)("div",{className:"row"},void 0,(0,i.Z)("div",{className:"col-xs-3 user-card-left"},void 0,(0,i.Z)("div",{className:"user-card-small-avatar"},void 0,(0,i.Z)("a",{href:s.url},void 0,(0,i.Z)(r.ZP,{size:"50",size2x:"80",user:s})))),(0,i.Z)("div",{className:"col-xs-9 col-sm-12 user-card-body"},void 0,(0,i.Z)("div",{className:"user-card-avatar"},void 0,(0,i.Z)("a",{href:s.url},void 0,(0,i.Z)(r.ZP,{size:"150",size2x:"200",user:s}))),(0,i.Z)("div",{className:"user-card-username"},void 0,(0,i.Z)("a",{href:s.url},void 0,s.username)),(0,i.Z)("div",{className:"user-card-title"},void 0,(0,i.Z)(g,{rank:a,title:s.title})),(0,i.Z)("div",{className:"user-card-stats"},void 0,(0,i.Z)(d,{showStatus:t,user:s}))))))}var b,f,_,N,x=s(44039),y=class extends n().Component{shouldComponentUpdate(){return!1}render(){return(0,i.Z)("div",{className:"panel user-card user-card-preview"},void 0,(0,i.Z)("div",{className:"panel-body"},void 0,(0,i.Z)("div",{className:"row"},void 0,b||(b=(0,i.Z)("div",{className:"col-xs-3 user-card-left"},void 0,(0,i.Z)("div",{className:"user-card-small-avatar"},void 0,(0,i.Z)("span",{},void 0,(0,i.Z)(r.ZP,{size:"50",size2x:"80"}))))),(0,i.Z)("div",{className:"col-xs-9 col-sm-12 user-card-body"},void 0,f||(f=(0,i.Z)("div",{className:"user-card-avatar"},void 0,(0,i.Z)("span",{},void 0,(0,i.Z)(r.ZP,{size:"150",size2x:"200"})))),(0,i.Z)("div",{className:"user-card-username"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(60,150)+"px"}},void 0," ")),(0,i.Z)("div",{className:"user-card-title"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(60,150)+"px"}},void 0," ")),(0,i.Z)("div",{className:"user-card-stats"},void 0,(0,i.Z)("ul",{className:"list-unstyled"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,70)+"px"}},void 0," ")),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,70)+"px"}},void 0," ")),_||(_=(0,i.Z)("li",{className:"user-stat-divider"})),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,70)+"px"}},void 0," ")),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,70)+"px"}},void 0," "))))))))}};function w(e){let{colClassName:t,cols:s}=e;const a=Array.apply(null,{length:s}).map(Number.call,Number);return(0,i.Z)("div",{className:"users-cards-list ui-preview"},void 0,(0,i.Z)("div",{className:"row"},void 0,a.map((e=>{let s=t;return 0!==e&&(s+=" hidden-xs"),3===e&&(s+=" hidden-sm"),(0,i.Z)("div",{className:s},e,N||(N=(0,i.Z)(y,{})))}))))}function k(e){let{cols:t,isReady:s,showStatus:a,users:o}=e,n="col-xs-12 col-sm-4";return 4===t&&(n+=" col-md-3"),s?(0,i.Z)("div",{className:"users-cards-list ui-ready"},void 0,(0,i.Z)("div",{className:"row"},void 0,o.map((e=>(0,i.Z)("div",{className:n},e.id,(0,i.Z)(Z,{showStatus:a,user:e})))))):(0,i.Z)(w,{colClassName:n,cols:t})}},82125:function(e,t,s){"use strict";var a=s(4942),i=s(57588),o=s.n(i);t.Z=class extends o().Component{constructor(e){super(e),(0,a.Z)(this,"toggleNav",(()=>{this.setState({dropdown:!this.state.dropdown})})),(0,a.Z)(this,"hideNav",(()=>{this.setState({dropdown:!1})})),this.state={dropdown:!1}}getCompactNavClassName(){return this.state.dropdown?"compact-nav open":"compact-nav"}}},7227:function(e,t,s){"use strict";var a=s(22928),i=s(4942),o=s(57588),n=s.n(o);t.Z=class extends n().Component{constructor(){super(...arguments),(0,i.Z)(this,"toggle",(()=>{this.props.onChange({target:{value:!this.props.value}})}))}getClassName(){return this.props.value?"btn btn-yes-no btn-yes-no-on":"btn btn-yes-no btn-yes-no-off"}getIcon(){return this.props.value?this.props.iconOn||"check_box":this.props.iconOff||"check_box_outline_blank"}getLabel(){return this.props.value?this.props.labelOn||gettext("yes"):this.props.labelOff||gettext("no")}render(){return(0,a.Z)("button",{type:"button",onClick:this.toggle,className:this.getClassName(),id:this.props.id||null,"aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,this.getIcon()),(0,a.Z)("span",{className:"btn-text"},void 0,this.getLabel()))}}},32233:function(e,t,s){"use strict";s.d(t,{Z:function(){return i}}),s(58294),s(95377),s(68852),s(39737),s(14316),s(43204),s(43511),s(7023);var a=new class{constructor(){this._initializers=[],this._context={}}addInitializer(e){this._initializers.push({key:e.name,item:e.initializer,after:e.after,before:e.before})}init(e){this._context=e,new class{constructor(e){this.isOrdered=!1,this._items=e||[]}add(e,t,s){this._items.push({key:e,item:t,after:s&&s.after||null,before:s&&s.before||null})}get(e,t){for(var s=0;s0&&t.length!==a.length;)o-=1,e.forEach(i);return s}}(this._initializers).orderedValues().forEach((e=>{e(this)}))}has(e){return!!this._context[e]}get(e,t){return this.has(e)?this._context[e]:t||void 0}pop(e){if(this.has(e)){let t=this._context[e];return this._context[e]=null,t}}};window.misago=a;var i=a},58339:function(e,t,s){"use strict";var a=s(32233),i=s(78657);a.Z.addInitializer({name:"ajax",initializer:function(){i.Z.init(a.Z.get("CSRF_COOKIE_NAME"))}})},64109:function(e,t,s){"use strict";var a=s(32233),i=s(35486),o=s(78657),n=s(53904),r=s(90287);a.Z.addInitializer({name:"auth-sync",initializer:function(e){e.get("isAuthenticated")&&window.setInterval((function(){o.Z.get(e.get("AUTH_API")).then((function(e){r.Z.dispatch((0,i.r$)(e))}),(function(e){n.Z.apiError(e)}))}),45e3)},after:"auth"})},46226:function(e,t,s){"use strict";var a=s(32233),i=s(98274),o=s(59801),n=s(90287),r=s(62833);a.Z.addInitializer({name:"auth",initializer:function(){i.Z.init(n.Z,r.Z,o.Z)},after:"store"})},93240:function(e,t,s){"use strict";var a=s(32233),i=s(78657),o=s(93825),n=s(96142),r=s(53904);a.Z.addInitializer({name:"captcha",initializer:function(e){o.ZP.init(e,i.Z,n.Z,r.Z)}})},75147:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i),n=s(32233),r=s(4942),l=s(78657);class d extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleDecline",(()=>{this.state.submiting||window.confirm(gettext("Declining will result in immediate deactivation and deletion of your account. This action is not reversible."))&&(this.setState({submiting:!0}),l.Z.post(this.props.api,{accept:!1}).then((()=>{window.location.reload(!0)})))})),(0,r.Z)(this,"handleAccept",(()=>{this.state.submiting||(this.setState({submiting:!0}),l.Z.post(this.props.api,{accept:!0}).then((()=>{window.location.reload(!0)})))})),this.state={submiting:!1}}render(){return(0,a.Z)("div",{},void 0,(0,a.Z)("button",{className:"btn btn-default",disabled:this.state.submiting,type:"buton",onClick:this.handleDecline},void 0,gettext("Decline")),(0,a.Z)("button",{className:"btn btn-primary",disabled:this.state.submiting,type:"buton",onClick:this.handleAccept},void 0,gettext("Accept and continue")))}}var c=s(4869);n.Z.addInitializer({name:"component:accept-agreement",initializer:function(e){document.getElementById("required-agreement-mount")&&(0,c.Z)((0,a.Z)(d,{api:e.get("REQUIRED_AGREEMENT_API")}),"required-agreement-mount",!1)},after:"store"})},4894:function(e,t,s){"use strict";var a=s(37424),i=s(32233),o=s(22928),n=s(57588),r=s.n(n),l=class extends r().Component{refresh(){window.location.reload()}getMessage(){return this.props.signedIn?interpolate(gettext("You have signed in as %(username)s. Please refresh the page before continuing."),{username:this.props.signedIn.username},!0):this.props.signedOut?interpolate(gettext("%(username)s, you have been signed out. Please refresh the page before continuing."),{username:this.props.user.username},!0):void 0}render(){let e="auth-message";return(this.props.signedIn||this.props.signedOut)&&(e+=" show"),(0,o.Z)("div",{className:e},void 0,(0,o.Z)("div",{className:"container"},void 0,(0,o.Z)("p",{className:"lead"},void 0,this.getMessage()),(0,o.Z)("p",{},void 0,(0,o.Z)("button",{className:"btn btn-default",type:"button",onClick:this.refresh},void 0,gettext("Reload page")),(0,o.Z)("span",{className:"hidden-xs hidden-sm"},void 0," "+gettext("or press F5 key.")))))}};function d(e){return{user:e.auth.user,signedIn:e.auth.signedIn,signedOut:e.auth.signedOut}}var c=s(4869);i.Z.addInitializer({name:"component:auth-message",initializer:function(){(0,c.Z)((0,a.$j)(d)(l),"auth-message-mount")},after:"store"})},29223:function(e,t,s){"use strict";var a=s(32233),i=s(93051);a.Z.addInitializer({name:"component:banmed-page",initializer:function(e){e.has("BAN_MESSAGE")&&(0,i.Z)(e.get("BAN_MESSAGE"),!1)},after:"store"})},3026:function(e,t,s){"use strict";var a=s(37424),i=s(22928),o=s(4942),n=s(30381),r=s.n(n),l=s(57588),d=s.n(l);function c(e){return(0,i.Z)("div",{className:"categories-list"},void 0,(0,i.Z)("ul",{className:"list-group"},void 0,(0,i.Z)("li",{className:"list-group-item empty-message"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("No categories exist or you don't have permission to see them.")))))}function p(e){let{category:t}=e;return t.description?(0,i.Z)("div",{className:"category-description",dangerouslySetInnerHTML:{__html:t.description.html}}):null}function u(e){let{category:t}=e;return(0,i.Z)("div",{className:h(t),title:m(t)},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,function(e){return e.is_closed?e.is_read?"lock_outline":"lock":e.is_read?"chat_bubble_outline":"chat_bubble"}(t)))}function h(e){return e.is_read?"read-status item-read":"read-status item-new"}function m(e){return e.is_closed?e.is_read?gettext("This category has no new posts. (closed)"):gettext("This category has new posts. (closed)"):e.is_read?gettext("This category has no new posts."):gettext("This category has new posts.")}function v(e){let{category:t}=e;return(0,i.Z)("div",{className:"col-xs-12 col-sm-6 col-md-6 category-main"},void 0,(0,i.Z)("div",{className:"media"},void 0,(0,i.Z)("div",{className:"media-left"},void 0,(0,i.Z)(u,{category:t})),(0,i.Z)("div",{className:"media-body"},void 0,(0,i.Z)("h4",{className:"media-heading"},void 0,(0,i.Z)("a",{href:t.url.index},void 0,t.name)),(0,i.Z)(p,{category:t}))))}var g,Z,b,f=s(19605);function _(e){let{category:t}=e;return(0,i.Z)("div",{className:"col-xs-12 col-sm-6 col-md-4 category-last-thread"},void 0,(0,i.Z)(N,{category:t}),(0,i.Z)(w,{category:t}),(0,i.Z)(k,{category:t}),(0,i.Z)(C,{category:t}))}function N(e){let{category:t}=e;return t.acl.can_browse&&t.acl.can_see_all_threads&&t.last_thread_title?(0,i.Z)("div",{className:"media"},void 0,(0,i.Z)("div",{className:"media-left hidden-xs"},void 0,(0,i.Z)(x,{category:t})),(0,i.Z)("div",{className:"media-body"},void 0,(0,i.Z)("div",{className:"media-heading"},void 0,(0,i.Z)("a",{className:"item-title thread-title",href:t.url.last_thread_new,title:t.last_thread_title},void 0,t.last_thread_title)),(0,i.Z)("ul",{className:"list-inline"},void 0,(0,i.Z)("li",{className:"category-last-thread-poster"},void 0,(0,i.Z)(y,{category:t})),g||(g=(0,i.Z)("li",{className:"divider"},void 0,"—")),(0,i.Z)("li",{className:"category-last-thread-date"},void 0,(0,i.Z)("a",{href:t.url.last_post},void 0,t.last_post_on.fromNow()))))):null}function x(e){let{category:t}=e;return t.last_poster?(0,i.Z)("a",{className:"last-poster-avatar",href:t.last_poster.url,title:t.last_poster_name},void 0,(0,i.Z)(f.ZP,{className:"media-object",size:40,user:t.last_poster})):(0,i.Z)("span",{className:"last-poster-avatar",title:t.last_poster_name},void 0,Z||(Z=(0,i.Z)(f.ZP,{className:"media-object",size:40})))}function y(e){let{category:t}=e;return t.last_poster?(0,i.Z)("a",{className:"item-title",href:t.last_poster.url},void 0,t.last_poster_name):(0,i.Z)("span",{className:"item-title"},void 0,t.last_poster_name)}function w(e){let{category:t}=e;return t.acl.can_browse&&t.acl.can_see_all_threads?t.last_thread_title?null:(0,i.Z)(S,{message:gettext("This category is empty. No threads were posted within it so far.")}):null}function k(e){let{category:t}=e;return t.acl.can_browse?t.acl.can_see_all_threads?null:(0,i.Z)(S,{message:gettext("This category is private. You can see only your own threads within it.")}):null}function C(e){let{category:t}=e;return t.acl.can_browse?null:(0,i.Z)(S,{message:gettext("This category is protected. You can't browse its contents.")})}function S(e){let{message:t}=e;return(0,i.Z)("div",{className:"media category-thread-message"},void 0,b||(b=(0,i.Z)("div",{className:"media-left"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,i.Z)("div",{className:"media-body"},void 0,(0,i.Z)("p",{},void 0,t)))}function E(e){let{category:t}=e;return(0,i.Z)("div",{className:"col-md-2 hidden-xs hidden-sm"},void 0,(0,i.Z)("ul",{className:"list-unstyled category-stats"},void 0,(0,i.Z)(L,{threads:t.threads}),(0,i.Z)(T,{posts:t.posts})))}function L(e){let{threads:t}=e;const s=ngettext("%(threads)s thread","%(threads)s threads",t);return(0,i.Z)("li",{className:"category-stat-threads"},void 0,interpolate(s,{threads:t},!0))}function T(e){let{posts:t}=e;const s=ngettext("%(posts)s post","%(posts)s posts",t);return(0,i.Z)("li",{className:"category-stat-posts"},void 0,interpolate(s,{posts:t},!0))}function P(e){let{category:t}=e,s="btn btn-default btn-block btn-sm btn-subcategory";return t.is_read||(s+=" btn-subcategory-new"),(0,i.Z)("div",{className:"col-xs-12 col-sm-4 col-md-3"},void 0,(0,i.Z)("a",{className:s,href:t.url.index},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,function(e){return e.is_closed?e.is_read?"lock_outline":"lock":e.is_read?"chat_bubble_outline":"chat_bubble"}(t)),(0,i.Z)("span",{className:"icon-text"},void 0,t.name)))}function O(e){let{category:t,isFirst:s}=e;return s||0===t.subcategories.length?null:(0,i.Z)("div",{className:"row subcategories-list"},void 0,t.subcategories.map((e=>(0,i.Z)(P,{category:e},e.id))))}function R(e){let{category:t,isFirst:s}=e,a="list-group-item";return t.description?a+=" list-group-category-has-description":a+=" list-group-category-no-description",s&&(a+=" list-group-item-first"),t.css_class&&(a+=" list-group-category-has-flavor",a+=" list-group-item-category-"+t.css_class),(0,i.Z)("li",{className:a},void 0,(0,i.Z)("div",{className:"row"},void 0,(0,i.Z)(v,{category:t}),(0,i.Z)(E,{category:t}),(0,i.Z)(_,{category:t})),(0,i.Z)(O,{category:t,isFirst:s}))}function A(e){let{category:t}=e,s="list-group list-group-category";return t.css_class&&(s+=" list-group-category-has-flavor",s+=" list-group-category-"+t.css_class),(0,i.Z)("ul",{className:s},void 0,(0,i.Z)(R,{category:t,isFirst:!0}),t.subcategories.map((e=>(0,i.Z)(R,{category:e,isFirst:!1},e.id))))}function I(e){let{categories:t}=e;return(0,i.Z)("div",{className:"categories-list"},void 0,t.map((e=>(0,i.Z)(A,{category:e},e.id))))}var D,j=s(32233),z=s(55547);const U=function(e){return Object.assign({},e,{last_post_on:e.last_post_on?r()(e.last_post_on):null,subcategories:e.subcategories.map(U)})};var M=class extends d().Component{constructor(e){super(e),(0,o.Z)(this,"update",(e=>{this.setState({categories:e.map(U)})})),this.state={categories:j.Z.get("CATEGORIES").map(U)},this.startPolling(j.Z.get("CATEGORIES_API"))}startPolling(e){z.Z.start({poll:"categories",url:e,frequency:18e4,update:this.update})}render(){const{categories:e}=this.state;return 0===e.length?D||(D=(0,i.Z)(c,{})):(0,i.Z)(I,{categories:e})}};function B(e){return{tick:e.tick.tick}}var q=s(4869);j.Z.addInitializer({name:"component:categories",initializer:function(){document.getElementById("categories-mount")&&(0,q.Z)((0,a.$j)(B)(M),"categories-mount")},after:"store"})},94795:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i),n=s(37424),r=s(69987),l=s(94417);function d(e){return(0,a.Z)("div",{className:"list-group nav-side"},void 0,e.options.map((t=>(0,a.Z)(r.rU,{to:e.baseUrl+t.component+"/",className:"list-group-item",activeClassName:"active"},t.component,(0,a.Z)("span",{className:"material-icon"},void 0,t.icon),t.name))))}function c(e){return(0,a.Z)("ul",{className:e.className||"dropdown-menu",role:"menu"},void 0,e.options.map((t=>(0,a.Z)(l.Z,{path:e.baseUrl+t.component+"/"},t.component,(0,a.Z)(r.rU,{to:e.baseUrl+t.component+"/",onClick:e.hideNav},void 0,(0,a.Z)("span",{className:"material-icon hidden-sm"},void 0,t.icon),t.name)))))}var p,u=s(4942),h=s(82211),m=s(78657),v=s(53328),g=s(53904),Z=s(90287),b=s(32233),f=class extends o().Component{constructor(e){super(e),(0,u.Z)(this,"onPasswordChange",(e=>{this.setState({password:e.target.value})})),(0,u.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{isLoading:t,password:s}=this.state,{user:a}=this.props;return 0==s.length?(g.Z.error(gettext("Enter your password to confirm account deletion.")),!1):!t&&(this.setState({isLoading:!0}),void m.Z.post(a.api.delete,{password:s}).then((e=>{window.location.href=b.Z.get("MISAGO_PATH")}),(e=>{this.setState({isLoading:!1}),e.password?g.Z.error(e.password[0]):g.Z.apiError(e)})))})),this.state={isLoading:!1,password:""}}componentDidMount(){v.Z.set({title:gettext("Delete account"),parent:gettext("Change your options")})}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("div",{className:"panel panel-danger panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Delete account"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,gettext("You are going to delete your account. This action is nonreversible, and will result in following data being deleted:")),(0,a.Z)("p",{},void 0,"-"," ",gettext("Stored IP addresses associated with content that you have posted will be deleted.")),(0,a.Z)("p",{},void 0,"-"," ",gettext("Your username will become available for other user to rename to or for new user to register their account with.")),(0,a.Z)("p",{},void 0,"-"," ",gettext("Your e-mail will become available for use in new account registration.")),p||(p=(0,a.Z)("hr",{})),(0,a.Z)("p",{},void 0,gettext("All your posted content will NOT be deleted, but username associated with it will be changed to one shared by all deleted accounts."))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)("div",{className:"input-group"},void 0,(0,a.Z)("input",{className:"form-control",disabled:this.state.isLoading,name:"password-confirmation",type:"password",placeholder:gettext("Enter your password to confirm account deletion."),value:this.state.password,onChange:this.onPasswordChange}),(0,a.Z)("span",{className:"input-group-btn"},void 0,(0,a.Z)(h.Z,{className:"btn-danger",loading:this.state.isLoading},void 0,gettext("Delete my account")))))))}},_=s(21688),N=class extends o().Component{constructor(){super(...arguments),(0,u.Z)(this,"onSuccess",(()=>{g.Z.info(gettext("Your details have been updated."))}))}componentDidMount(){v.Z.set({title:gettext("Edit details"),parent:gettext("Change your options")})}render(){return(0,a.Z)(_.Z,{api:this.props.user.api.edit_details,onSuccess:this.onSuccess})}},x=s(30381),y=s.n(x);class w extends o().Component{constructor(e){super(e),(0,u.Z)(this,"handleLoadDownloads",(()=>{m.Z.get(this.props.user.api.data_downloads).then((e=>{this.setState({isLoading:!1,downloads:e})}),(e=>{g.Z.apiError(e)}))})),(0,u.Z)(this,"handleRequestDataDownload",(()=>{this.setState({isSubmiting:!0}),m.Z.post(this.props.user.api.request_data_download).then((()=>{this.handleLoadDownloads(),g.Z.success(gettext("Your request for data download has been registered.")),this.setState({isSubmiting:!1})}),(e=>{g.Z.apiError(e),this.setState({isSubmiting:!1})}))})),this.state={isLoading:!1,isSubmiting:!1,downloads:[]}}componentDidMount(){v.Z.set({title:gettext("Download your data"),parent:gettext("Change your options")}),this.handleLoadDownloads()}render(){return(0,a.Z)("div",{},void 0,(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Download your data"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("p",{},void 0,gettext('To download your data from the site, click the "Request data download" button. Depending on amount of data to be archived and number of users wanting to download their data at same time it may take up to few days for your download to be prepared. An e-mail with notification will be sent to you when your data is ready to be downloaded.')),(0,a.Z)("p",{},void 0,gettext("The download will only be available for limited amount of time, after which it will be deleted from the site and marked as expired."))),(0,a.Z)("table",{className:"table"},void 0,(0,a.Z)("thead",{},void 0,(0,a.Z)("tr",{},void 0,(0,a.Z)("th",{},void 0,gettext("Requested on")),(0,a.Z)("th",{className:"col-md-4"},void 0,gettext("Download")))),(0,a.Z)("tbody",{},void 0,this.state.downloads.map((e=>(0,a.Z)("tr",{},e.id,(0,a.Z)("td",{style:k},void 0,y()(e.requested_on).fromNow()),(0,a.Z)("td",{},void 0,(0,a.Z)(C,{exportFile:e.file,status:e.status}))))),0==this.state.downloads.length?(0,a.Z)("tr",{},void 0,(0,a.Z)("td",{colSpan:"2"},void 0,gettext("You have no data downloads."))):null)),(0,a.Z)("div",{className:"panel-footer text-right"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isSubmiting,type:"button",onClick:this.handleRequestDataDownload},void 0,gettext("Request data download")))))}}const k={verticalAlign:"middle"},C=e=>{let{exportFile:t,status:s}=e;return 0===s||1===s?(0,a.Z)(h.Z,{className:"btn-info btn-sm btn-block",disabled:!0,type:"button"},void 0,gettext("Download is being prepared")):t?(0,a.Z)("a",{className:"btn btn-success btn-sm btn-block",href:t},void 0,gettext("Download your data")):(0,a.Z)(h.Z,{className:"btn-default btn-sm btn-block",disabled:!0,type:"button"},void 0,gettext("Download is expired"))};var S,E=s(43345),L=s(96359),T=s(60471),P=s(7227),O=s(35486),R=class extends E.Z{constructor(e){super(e),this.state={isLoading:!1,is_hiding_presence:e.user.is_hiding_presence,limits_private_thread_invites_to:e.user.limits_private_thread_invites_to,subscribe_to_started_threads:e.user.subscribe_to_started_threads,subscribe_to_replied_threads:e.user.subscribe_to_replied_threads,errors:{}},this.privateThreadInvitesChoices=[{value:0,icon:"help_outline",label:gettext("Everybody")},{value:1,icon:"done_all",label:gettext("Users I follow")},{value:2,icon:"highlight_off",label:gettext("Nobody")}],this.subscribeToChoices=[{value:0,icon:"star_border",label:gettext("No")},{value:1,icon:"star_half",label:gettext("Notify")},{value:2,icon:"star",label:gettext("Notify with e-mail")}]}send(){return m.Z.post(this.props.user.api.options,{is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})}handleSuccess(){Z.Z.dispatch((0,O.r$)({is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})),g.Z.success(gettext("Your forum options have been changed."))}handleError(e){400===e.status?g.Z.error(gettext("Please reload page and try again.")):g.Z.apiError(e)}componentDidMount(){v.Z.set({title:gettext("Forum options"),parent:gettext("Change your options")})}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change forum options"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("fieldset",{},void 0,(0,a.Z)("legend",{},void 0,gettext("Privacy settings")),(0,a.Z)(L.Z,{label:gettext("Hide my presence"),helpText:gettext("If you hide your presence, only members with permission to see hidden users will see when you are online."),for:"id_is_hiding_presence"},void 0,(0,a.Z)(P.Z,{id:"id_is_hiding_presence",disabled:this.state.isLoading,iconOn:"visibility_off",iconOff:"visibility",labelOn:gettext("Hide my presence from other users"),labelOff:gettext("Show my presence to other users"),onChange:this.bindInput("is_hiding_presence"),value:this.state.is_hiding_presence})),(0,a.Z)(L.Z,{label:gettext("Private thread invitations"),for:"id_limits_private_thread_invites_to"},void 0,(0,a.Z)(T.Z,{id:"id_limits_private_thread_invites_to",disabled:this.state.isLoading,onChange:this.bindInput("limits_private_thread_invites_to"),value:this.state.limits_private_thread_invites_to,choices:this.privateThreadInvitesChoices}))),(0,a.Z)("fieldset",{},void 0,(0,a.Z)("legend",{},void 0,gettext("Automatic subscriptions")),(0,a.Z)(L.Z,{label:gettext("Threads I start"),for:"id_subscribe_to_started_threads"},void 0,(0,a.Z)(T.Z,{id:"id_subscribe_to_started_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_started_threads"),value:this.state.subscribe_to_started_threads,choices:this.subscribeToChoices})),(0,a.Z)(L.Z,{label:gettext("Threads I reply to"),for:"id_subscribe_to_replied_threads"},void 0,(0,a.Z)(T.Z,{id:"id_subscribe_to_replied_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_replied_threads"),value:this.state.subscribe_to_replied_threads,choices:this.subscribeToChoices})))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Save changes")))))}},A=s(95187);function I(){return(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change username"))),S||(S=(0,a.Z)(A.Z,{})))}var D,j,z,U,M,B,q,H=s(33556),F=class extends o().Component{getHelpText(){return this.props.options.next_on?interpolate(gettext("You will be able to change your username %(next_change)s."),{next_change:this.props.options.next_on.fromNow()},!0):gettext("You have used up available name changes.")}render(){return(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change username"))),(0,a.Z)(H.Z,{helpText:this.getHelpText(),message:gettext("You can't change your username at the moment.")}))}},Y=s(55210),V=class extends E.Z{constructor(e){super(e),this.state={username:"",validators:{username:[Y.lG(),Y.HR(e.options.length_min),Y.gS(e.options.length_max)]},isLoading:!1}}getHelpText(){let e=[];if(this.props.options.changes_left>0){let t=ngettext("You can change your username %(changes_left)s more time.","You can change your username %(changes_left)s more times.",this.props.options.changes_left);e.push(interpolate(t,{changes_left:this.props.options.changes_left},!0))}if(this.props.user.acl.name_changes_expire>0){let t=ngettext("Used changes become available again after %(name_changes_expire)s day.","Used changes become available again after %(name_changes_expire)s days.",this.props.user.acl.name_changes_expire);e.push(interpolate(t,{name_changes_expire:this.props.user.acl.name_changes_expire},!0))}return e.length?e.join(" "):null}clean(){let e=this.validate();return e.username?(g.Z.error(e.username[0]),!1):this.state.username.trim()!==this.props.user.username||(g.Z.info(gettext("Your new username is same as current one.")),!1)}send(){return m.Z.post(this.props.user.api.username,{username:this.state.username})}handleSuccess(e){this.setState({username:""}),this.props.complete(e.username,e.slug,e.options)}handleError(e){g.Z.apiError(e)}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change username"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)(L.Z,{label:gettext("New username"),for:"id_username",helpText:this.getHelpText()},void 0,(0,a.Z)("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Change username")))))}},G=s(7850),$=s(48927),W=s(6935),Q=class extends o().Component{constructor(e){super(e),(0,u.Z)(this,"onComplete",((e,t,s)=>{this.setState({options:s}),Z.Z.dispatch((0,$.KP)({username:e,slug:t},this.props.user,this.props.user)),Z.Z.dispatch((0,W._S)(this.props.user,e,t)),g.Z.success(gettext("Your username has been changed successfully."))})),this.state={isLoaded:!1,options:null}}componentDidMount(){v.Z.set({title:gettext("Change username"),parent:gettext("Change your options")}),Promise.all([m.Z.get(this.props.user.api.username),m.Z.get(b.Z.get("USERNAME_CHANGES_API"),{user:this.props.user.id})]).then((e=>{Z.Z.dispatch((0,$.ZB)(e[1].results)),this.setState({isLoaded:!0,options:{changes_left:e[0].changes_left,length_min:e[0].length_min,length_max:e[0].length_max,next_on:e[0].next_on?y()(e[0].next_on):null}})}))}getChangeForm(){return this.state.isLoaded?0===this.state.options.changes_left?(0,a.Z)(F,{options:this.state.options}):(0,a.Z)(V,{complete:this.onComplete,options:this.state.options,user:this.props.user}):D||(D=(0,a.Z)(I,{}))}render(){return(0,a.Z)("div",{},void 0,this.getChangeForm(),(0,a.Z)(G.Z,{changes:this.props["username-history"],isLoaded:this.state.isLoaded}))}},K=class extends E.Z{constructor(e){super(e),this.state={new_email:"",password:"",validators:{new_email:[Y.Do()],password:[]},isLoading:!1}}clean(){let e=this.validate();return-1!==[this.state.new_email.trim().length,this.state.password.trim().length].indexOf(0)?(g.Z.error(gettext("Fill out all fields.")),!1):!e.new_email||(g.Z.error(e.new_email[0]),!1)}send(){return m.Z.post(this.props.user.api.change_email,{new_email:this.state.new_email,password:this.state.password})}handleSuccess(e){this.setState({new_email:"",password:""}),g.Z.success(e.detail)}handleError(e){400===e.status?e.new_email?g.Z.error(e.new_email):g.Z.error(e.password):g.Z.apiError(e)}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("input",{type:"type",style:{display:"none"}}),(0,a.Z)("input",{type:"password",style:{display:"none"}}),(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change e-mail address"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)(L.Z,{label:gettext("New e-mail"),for:"id_new_email"},void 0,(0,a.Z)("input",{type:"text",id:"id_new_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_email"),value:this.state.new_email})),j||(j=(0,a.Z)("hr",{})),(0,a.Z)(L.Z,{label:gettext("Your current password"),for:"id_confirm_email"},void 0,(0,a.Z)("input",{type:"password",id:"id_confirm_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Change e-mail")))))}},J=class extends E.Z{constructor(e){super(e),this.state={new_password:"",repeat_password:"",password:"",validators:{new_password:[],repeat_password:[],password:[]},isLoading:!1}}clean(){let e=this.validate();return-1!==[this.state.new_password.trim().length,this.state.repeat_password.trim().length,this.state.password.trim().length].indexOf(0)?(g.Z.error(gettext("Fill out all fields.")),!1):e.new_password?(g.Z.error(e.new_password[0]),!1):this.state.new_password===this.state.repeat_password||(g.Z.error(gettext("New passwords are different.")),!1)}send(){return m.Z.post(this.props.user.api.change_password,{new_password:this.state.new_password,password:this.state.password})}handleSuccess(e){this.setState({new_password:"",repeat_password:"",password:""}),g.Z.success(e.detail)}handleError(e){400===e.status?e.new_password?g.Z.error(e.new_password):g.Z.error(e.password):g.Z.apiError(e)}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("input",{type:"type",style:{display:"none"}}),(0,a.Z)("input",{type:"password",style:{display:"none"}}),(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change password"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)(L.Z,{label:gettext("New password"),for:"id_new_password"},void 0,(0,a.Z)("input",{type:"password",id:"id_new_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_password"),value:this.state.new_password})),(0,a.Z)(L.Z,{label:gettext("Repeat password"),for:"id_repeat_password"},void 0,(0,a.Z)("input",{type:"password",id:"id_repeat_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("repeat_password"),value:this.state.repeat_password})),z||(z=(0,a.Z)("hr",{})),(0,a.Z)(L.Z,{label:gettext("Your current password"),for:"id_confirm_password"},void 0,(0,a.Z)("input",{type:"password",id:"id_confirm_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Change password")))))}},X=()=>(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change email or password"))),(0,a.Z)("div",{className:"panel-body panel-message-body"},void 0,U||(U=(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,gettext("You need to set a password for your account to be able to change your username or email.")),(0,a.Z)("p",{className:"help-block"},void 0,(0,a.Z)("a",{className:"btn btn-primary",href:b.Z.get("FORGOTTEN_PASSWORD_URL")},void 0,gettext("Set password")))))),ee=class extends o().Component{componentDidMount(){v.Z.set({title:gettext("Change email or password"),parent:gettext("Change your options")})}render(){return this.props.user.has_usable_password?(0,a.Z)("div",{},void 0,(0,a.Z)(K,{user:this.props.user}),(0,a.Z)(J,{user:this.props.user}),(0,a.Z)("p",{className:"message-line"},void 0,B||(B=(0,a.Z)("span",{className:"material-icon"},void 0,"warning")),(0,a.Z)("a",{href:b.Z.get("FORGOTTEN_PASSWORD_URL")},void 0,gettext("Change forgotten password")))):M||(M=(0,a.Z)(X,{}))}},te=s(82125),se=s(98936),ae=s(59131),ie=s(99755),oe=class extends te.Z{render(){const e=b.Z.get("USER_OPTIONS").filter((e=>{const t=b.Z.get("USERCP_URL")+e.component+"/";return this.props.location.pathname.substr(0,t.length)===t}))[0];return(0,a.Z)("div",{className:"page page-options"},void 0,(0,a.Z)(ie.sP,{},void 0,(0,a.Z)(ie.mr,{styleName:"options"},void 0,(0,a.Z)(ie.gC,{styleName:"options"},void 0,(0,a.Z)(se.gq,{},void 0,(0,a.Z)(se.kw,{auto:!0},void 0,(0,a.Z)(se.Z6,{auto:!0},void 0,(0,a.Z)("h1",{},void 0,gettext("Change your options"))),(0,a.Z)(se.Z6,{className:"hidden-xs hidden-md hidden-lg",shrink:!0},void 0,(0,a.Z)("div",{className:"dropdown"},void 0,(0,a.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle",title:gettext("Menu"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,q||(q=(0,a.Z)("span",{className:"material-icon"},void 0,"menu"))),(0,a.Z)(c,{className:"dropdown-menu dropdown-menu-right",baseUrl:b.Z.get("USERCP_URL"),options:b.Z.get("USER_OPTIONS")})))),(0,a.Z)(se.kw,{className:"hidden-sm hidden-md hidden-lg"},void 0,(0,a.Z)(se.Z6,{},void 0,(0,a.Z)("div",{className:"dropdown"},void 0,(0,a.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-block dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,e.icon),e.name),(0,a.Z)(c,{className:"dropdown-menu",baseUrl:b.Z.get("USERCP_URL"),options:b.Z.get("USER_OPTIONS")})))))))),(0,a.Z)(ae.Z,{},void 0,(0,a.Z)("div",{className:"row"},void 0,(0,a.Z)("div",{className:"col-md-3 hidden-xs hidden-sm"},void 0,(0,a.Z)(d,{baseUrl:b.Z.get("USERCP_URL"),options:b.Z.get("USER_OPTIONS")})),(0,a.Z)("div",{className:"col-md-9"},void 0,this.props.children))))}};function ne(e){return{tick:e.tick.tick,user:e.auth.user,"username-history":e["username-history"]}}function re(){const e=[{path:b.Z.get("USERCP_URL")+"forum-options/",component:(0,n.$j)(ne)(R)},{path:b.Z.get("USERCP_URL")+"edit-details/",component:(0,n.$j)(ne)(N)}],t=b.Z.get("SETTINGS").DELEGATE_AUTH;return t||(e.push({path:b.Z.get("USERCP_URL")+"change-username/",component:(0,n.$j)(ne)(Q)}),e.push({path:b.Z.get("USERCP_URL")+"sign-in-credentials/",component:(0,n.$j)(ne)(ee)})),b.Z.get("ENABLE_DOWNLOAD_OWN_DATA")&&e.push({path:b.Z.get("USERCP_URL")+"download-data/",component:(0,n.$j)(ne)(w)}),!t&&b.Z.get("ENABLE_DELETE_OWN_ACCOUNT")&&e.push({path:b.Z.get("USERCP_URL")+"delete-account/",component:(0,n.$j)(ne)(f)}),e}var le=s(39633);b.Z.addInitializer({name:"component:options",initializer:function(e){e.has("USER_OPTIONS")&&(0,le.Z)({root:b.Z.get("USERCP_URL"),component:oe,paths:re()})},after:"store"})},95563:function(e,t,s){"use strict";var a,i=s(37424),o=s(22928),n=s(4942),r=s(57588),l=s.n(r),d=s(30381),c=s.n(d),p=s(95187),u=s(33556),h=s(32233),m=s(55547),v=s(53328),g=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"update",(e=>{e.expires_on&&(e.expires_on=c()(e.expires_on)),this.setState({isLoaded:!0,error:null,ban:e})})),(0,n.Z)(this,"error",(e=>{this.setState({isLoaded:!0,error:e.detail,ban:null})})),h.Z.has("PROFILE_BAN")?this.initWithPreloadedData(h.Z.pop("PROFILE_BAN")):this.initWithoutPreloadedData(),this.startPolling(e.profile.api.ban)}initWithPreloadedData(e){e.expires_on&&(e.expires_on=c()(e.expires_on)),this.state={isLoaded:!0,ban:e}}initWithoutPreloadedData(){this.state={isLoaded:!1}}startPolling(e){m.Z.start({poll:"ban-details",url:e,frequency:9e4,update:this.update,error:this.error})}componentDidMount(){v.Z.set({title:gettext("Ban details"),parent:this.props.profile.username})}componentWillUnmount(){m.Z.stop("ban-details")}getUserMessage(){return this.state.ban.user_message?(0,o.Z)("div",{className:"panel-body ban-message ban-user-message"},void 0,(0,o.Z)("h4",{},void 0,gettext("User-shown ban message")),(0,o.Z)("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.user_message.html}})):null}getStaffMessage(){return this.state.ban.staff_message?(0,o.Z)("div",{className:"panel-body ban-message ban-staff-message"},void 0,(0,o.Z)("h4",{},void 0,gettext("Team-shown ban message")),(0,o.Z)("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.staff_message.html}})):null}getExpirationMessage(){if(this.state.ban.expires_on){if(this.state.ban.expires_on.isAfter(c()())){let e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.state.ban.expires_on.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.state.ban.expires_on.fromNow()},!0);return(0,o.Z)("abbr",{title:e},void 0,t)}return gettext("This ban has expired.")}return interpolate(gettext("%(username)s's ban is permanent."),{username:this.props.profile.username},!0)}getPanelBody(){return this.state.ban?Object.keys(this.state.ban).length?(0,o.Z)("div",{},void 0,this.getUserMessage(),this.getStaffMessage(),(0,o.Z)("div",{className:"panel-body ban-expires"},void 0,(0,o.Z)("h4",{},void 0,gettext("Ban expiration")),(0,o.Z)("p",{className:"lead"},void 0,this.getExpirationMessage()))):(0,o.Z)("div",{},void 0,(0,o.Z)(u.Z,{message:gettext("No ban is active at the moment.")})):this.state.error?(0,o.Z)("div",{},void 0,(0,o.Z)(u.Z,{icon:"error_outline",message:this.state.error})):a||(a=(0,o.Z)("div",{},void 0,(0,o.Z)(p.Z,{})))}render(){return(0,o.Z)("div",{className:"profile-ban-details"},void 0,(0,o.Z)("div",{className:"panel panel-default"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,gettext("Ban details"))),this.getPanelBody()))}},Z=s(21688);function b(e){let{api:t,display:s,onCancel:a,onSuccess:i}=e;return s?(0,o.Z)(Z.Z,{api:t,onCancel:a,onSuccess:i}):null}function f(e){let{isAuthenticated:t,profile:s}=e,a=null;return a=t?gettext("You are not sharing any details with others."):interpolate(gettext("%(username)s is not sharing any details with others."),{username:s.username},!0),(0,o.Z)("div",{className:"panel panel-default"},void 0,(0,o.Z)("div",{className:"panel-body text-center lead"},void 0,a))}function _(e){let{html:t,text:s,url:a}=e;return t?(0,o.Z)("div",{className:"form-control-static col-md-9",dangerouslySetInnerHTML:{__html:t}}):(0,o.Z)("div",{className:"form-control-static col-md-9"},void 0,(0,o.Z)(N,{text:s,url:a}))}function N(e){let{text:t,url:s}=e;return s?(0,o.Z)("p",{},void 0,(0,o.Z)("a",{href:s,target:"_blank",rel:"nofollow"},void 0,t||s)):t?(0,o.Z)("p",{},void 0,t):null}function x(e){return(0,o.Z)("div",{className:"form-group"},void 0,(0,o.Z)("strong",{className:"control-label col-md-3"},void 0,e.name,":"),l().createElement(_,e))}function y(e){let{fields:t,name:s}=e;return(0,o.Z)("div",{className:"panel panel-default panel-profile-details-group"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,s)),(0,o.Z)("div",{className:"panel-body"},void 0,(0,o.Z)("div",{className:"form-horizontal"},void 0,t.map((e=>{let{fieldname:t,html:s,name:a,text:i,url:n}=e;return(0,o.Z)(x,{name:a,html:s,text:i,url:n},t)})))))}var w,k=s(37848);function C(e){let{display:t,groups:s,isAuthenticated:a,loading:i,profile:n}=e;return t?i?w||(w=(0,o.Z)(k.Z,{})):s.length?(0,o.Z)("div",{},void 0,s.map(((e,t)=>(0,o.Z)(y,{fields:e.fields,name:e.name},t)))):(0,o.Z)(f,{isAuthenticated:a,profile:n}):null}var S,E=s(92490),L=e=>{let{onEdit:t,showEditButton:s}=e;return(0,o.Z)(E.o8,{},void 0,(0,o.Z)(E.Z2,{auto:!0},void 0,(0,o.Z)(E.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,gettext("Details")))),s&&(0,o.Z)(E.Z2,{},void 0,(0,o.Z)(E.Eg,{},void 0,(0,o.Z)("button",{className:"btn btn-default btn-outline btn-block",onClick:t,type:"button"},void 0,gettext("Edit")))))},T=s(58598),P=s(78657),O=s(53904),R=class extends l().Component{componentDidMount(){const{data:e,dispatch:t,user:s}=this.props;e&&e.id===s.id||P.Z.get(this.props.user.api.details).then((e=>{t((0,T.zD)(e))}),(e=>{O.Z.apiError(e)}))}render(){return this.props.children}},A=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"onCancel",(()=>{this.setState({editing:!1})})),(0,n.Z)(this,"onEdit",(()=>{this.setState({editing:!0})})),(0,n.Z)(this,"onSuccess",(e=>{const{dispatch:t,isAuthenticated:s,profile:a}=this.props;let i=null;i=s?gettext("Your details have been updated."):interpolate(gettext("%(username)s's details have been updated."),{username:a.username},!0),O.Z.info(i),t((0,T.zD)(e)),this.setState({editing:!1})})),this.state={editing:!1}}componentDidMount(){v.Z.set({title:gettext("Details"),parent:this.props.profile.username})}render(){const{dispatch:e,isAuthenticated:t,profile:s,profileDetails:a}=this.props,i=a.id!==s.id;return(0,o.Z)(R,{data:a,dispatch:e,user:s},void 0,(0,o.Z)("div",{className:"profile-details"},void 0,(0,o.Z)(L,{onEdit:this.onEdit,showEditButton:!!a.edit&&!this.state.editing}),(0,o.Z)(C,{display:!this.state.editing,groups:a.groups,isAuthenticated:t,loading:i,profile:s}),(0,o.Z)(b,{api:s.api.edit_details,dispatch:e,display:this.state.editing,onCancel:this.onCancel,onSuccess:this.onSuccess})))}},I=s(87462),D=s(11005),j=s(82211),z=s(21981),U=s(90287),M=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"loadMore",(()=>{this.setState({isLoading:!0}),this.loadItems(this.props.posts.next)})),this.state={isLoading:!1}}loadItems(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;P.Z.get(this.props.api,{start:e||0}).then((t=>{0===e?U.Z.dispatch(z.zD(t)):U.Z.dispatch(z.R3(t)),this.setState({isLoading:!1})}),(e=>{this.setState({isLoading:!1}),O.Z.apiError(e)}))}componentDidMount(){v.Z.set({title:this.props.title,parent:this.props.profile.username}),this.loadItems()}render(){return(0,o.Z)("div",{className:"profile-feed"},void 0,(0,o.Z)(E.o8,{},void 0,(0,o.Z)(E.Z2,{auto:!0},void 0,(0,o.Z)(E.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.props.header)))),l().createElement(B,(0,I.Z)({isLoading:this.state.isLoading,loadMore:this.loadMore},this.props)))}};function B(e){return e.posts.isLoaded&&!e.posts.results.length?(0,o.Z)("p",{className:"lead"},void 0,e.emptyMessage):(0,o.Z)("div",{},void 0,(0,o.Z)(D.Z,{isReady:e.posts.isLoaded,posts:e.posts.results,poster:e.profile}),(0,o.Z)(q,{isLoading:e.isLoading,loadMore:e.loadMore,next:e.posts.next}))}function q(e){return e.next?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(j.Z,{className:"btn btn-default btn-outline",loading:e.isLoading,onClick:e.loadMore},void 0,gettext("Show older activity"))):null}var H,F,Y,V,G,$,W,Q,K,J,X,ee=class extends l().Component{getClassName(){return this.props.className?"form-search "+this.props.className:"form-search"}render(){return(0,o.Z)("div",{className:this.getClassName()},void 0,(0,o.Z)("input",{type:"text",className:"form-control",value:this.props.value,onChange:this.props.onChange,placeholder:this.props.placeholder||gettext("Search...")}),S||(S=(0,o.Z)("span",{className:"material-icon"},void 0,"search")))}},te=s(40429),se=s(6935),ae=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"loadMore",(()=>{this.setState({isBusy:!0}),this.loadUsers(this.state.page+1,this.state.search)})),(0,n.Z)(this,"search",(e=>{this.setState({isLoaded:!1,isBusy:!0,search:e.target.value,count:0,more:0,page:1,pages:1}),this.loadUsers(1,e.target.value)})),this.setSpecialProps(),h.Z.has(this.PRELOADED_DATA_KEY)?this.initWithPreloadedData(h.Z.pop(this.PRELOADED_DATA_KEY)):this.initWithoutPreloadedData()}setSpecialProps(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWERS",this.TITLE=gettext("Followers"),this.API_FILTER="followers"}initWithPreloadedData(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},U.Z.dispatch((0,se.ZB)(e.results))}initWithoutPreloadedData(){this.state={isLoaded:!1,isBusy:!1,search:"",count:0,more:0,page:1,pages:1},this.loadUsers()}loadUsers(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;const s=this.props.profile.api[this.API_FILTER];P.Z.get(s,{search:t,page:e||1},"user-"+this.API_FILTER).then((t=>{1===e?U.Z.dispatch((0,se.ZB)(t.results)):U.Z.dispatch((0,se.R3)(t.results)),this.setState({isLoaded:!0,isBusy:!1,count:t.count,more:t.more,page:t.page,pages:t.pages})}),(e=>{O.Z.apiError(e)}))}componentDidMount(){v.Z.set({title:this.TITLE,parent:this.props.profile.username})}getLabel(){if(this.state.isLoaded){if(this.state.search){let e=ngettext("Found %(users)s user.","Found %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){let e=ngettext("You have %(users)s follower.","You have %(users)s followers.",this.state.count);return interpolate(e,{users:this.state.count},!0)}{let e=ngettext("%(username)s has %(users)s follower.","%(username)s has %(users)s followers.",this.state.count);return interpolate(e,{username:this.props.profile.username,users:this.state.count},!0)}}return gettext("Loading...")}getEmptyMessage(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You have no followers."):interpolate(gettext("%(username)s has no followers."),{username:this.props.profile.username},!0)}getMoreButton(){return this.state.more?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(j.Z,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},void 0,interpolate(gettext("Show more (%(more)s)"),{more:this.state.more},!0))):null}getListBody(){return this.state.isLoaded&&0===this.state.count?(0,o.Z)("p",{className:"lead"},void 0,this.getEmptyMessage()):(0,o.Z)("div",{},void 0,(0,o.Z)(te.Z,{cols:3,isReady:this.state.isLoaded,users:this.props.users}),this.getMoreButton())}getClassName(){return"profile-"+this.API_FILTER}render(){return(0,o.Z)("div",{className:this.getClassName()},void 0,(0,o.Z)(E.o8,{},void 0,(0,o.Z)(E.Z2,{auto:!0},void 0,(0,o.Z)(E.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.getLabel()))),(0,o.Z)(E.Z2,{},void 0,(0,o.Z)(E.Eg,{},void 0,(0,o.Z)(ee,{value:this.state.search,onChange:this.search,placeholder:gettext("Search users...")})))),this.getListBody())}},ie=s(7850),oe=s(48927),ne=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"loadMore",(()=>{this.setState({isBusy:!0}),this.loadChanges(this.state.page+1,this.state.search)})),(0,n.Z)(this,"search",(e=>{this.setState({isLoaded:!1,isBusy:!0,search:e.target.value,count:0,more:0,page:1,pages:1}),this.loadChanges(1,e.target.value)})),h.Z.has("PROFILE_NAME_HISTORY")?this.initWithPreloadedData(h.Z.pop("PROFILE_NAME_HISTORY")):this.initWithoutPreloadedData()}initWithPreloadedData(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},U.Z.dispatch((0,oe.ZB)(e.results))}initWithoutPreloadedData(){this.state={isLoaded:!1,isBusy:!1,search:"",count:0,more:0,page:1,pages:1},this.loadChanges()}loadChanges(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;P.Z.get(h.Z.get("USERNAME_CHANGES_API"),{user:this.props.profile.id,search:t,page:e||1},"search-username-history").then((t=>{1===e?U.Z.dispatch((0,oe.ZB)(t.results)):U.Z.dispatch((0,oe.R3)(t.results)),this.setState({isLoaded:!0,isBusy:!1,count:t.count,more:t.more,page:t.page,pages:t.pages})}),(e=>{O.Z.apiError(e)}))}componentDidMount(){v.Z.set({title:gettext("Username history"),parent:this.props.profile.username})}getLabel(){if(this.state.isLoaded){if(this.state.search){let e=ngettext("Found %(changes)s username change.","Found %(changes)s username changes.",this.state.count);return interpolate(e,{changes:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){let e=ngettext("Your username was changed %(changes)s time.","Your username was changed %(changes)s times.",this.state.count);return interpolate(e,{changes:this.state.count},!0)}{let e=ngettext("%(username)s's username was changed %(changes)s time.","%(username)s's username was changed %(changes)s times.",this.state.count);return interpolate(e,{username:this.props.profile.username,changes:this.state.count},!0)}}return gettext("Loading...")}getEmptyMessage(){return this.state.search?gettext("Search returned no username changes matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("No name changes have been recorded for your account."):interpolate(gettext("%(username)s's username was never changed."),{username:this.props.profile.username},!0)}getMoreButton(){return this.state.more?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(j.Z,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},void 0,interpolate(gettext("Show older (%(more)s)"),{more:this.state.more},!0))):null}render(){return(0,o.Z)("div",{className:"profile-username-history"},void 0,(0,o.Z)(E.o8,{},void 0,(0,o.Z)(E.Z2,{auto:!0},void 0,(0,o.Z)(E.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.getLabel()))),(0,o.Z)(E.Z2,{},void 0,(0,o.Z)(E.Eg,{},void 0,(0,o.Z)(ee,{value:this.state.search,onChange:this.search,placeholder:gettext("Search history...")})))),(0,o.Z)(ie.Z,{isLoaded:this.state.isLoaded,emptyMessage:this.getEmptyMessage(),changes:this.props["username-history"]}),this.getMoreButton())}},re=s(82125),le=s(27519),de=s(59131),ce=s(19605),pe=s(98936),ue=s(99755),he=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"action",(()=>{this.setState({isLoading:!0}),this.props.profile.is_followed?U.Z.dispatch((0,le.r$)({is_followed:!1,followers:this.props.profile.followers-1})):U.Z.dispatch((0,le.r$)({is_followed:!0,followers:this.props.profile.followers+1})),P.Z.post(this.props.profile.api.follow).then((e=>{this.setState({isLoading:!1}),U.Z.dispatch((0,le.r$)(e))}),(e=>{this.setState({isLoading:!1}),O.Z.apiError(e)}))})),this.state={isLoading:!1}}getClassName(){return this.props.profile.is_followed?this.props.className+" btn-default btn-following":this.props.className+" btn-default btn-follow"}getIcon(){return this.props.profile.is_followed?"favorite":"favorite_border"}getLabel(){return this.props.profile.is_followed?gettext("Following"):gettext("Follow")}render(){return(0,o.Z)(j.Z,{className:this.getClassName(),disabled:this.state.isLoading,onClick:this.action},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,this.getIcon()),this.getLabel())}},me=s(64646),ve=class extends l().Component{constructor(){super(...arguments),(0,n.Z)(this,"onClick",(()=>{me.Z.open({mode:"START_PRIVATE",submit:h.Z.get("PRIVATE_THREADS_API"),to:[this.props.profile]})}))}render(){const e=this.props.user.acl.can_start_private_threads,t=this.props.user.id===this.props.profile.id;return!e||t?null:(0,o.Z)("button",{className:this.props.className,onClick:this.onClick,type:"button"},void 0,H||(H=(0,o.Z)("span",{className:"material-icon"},void 0,"comment")),gettext("Message"))}},ge=s(43345),Ze=s(96359),be=s(3784),fe=s(7227),_e=s(30337),Ne=class extends ge.Z{constructor(e){super(e),this.state={isLoaded:!1,isLoading:!1,error:null,is_avatar_locked:"",avatar_lock_user_message:"",avatar_lock_staff_message:""}}componentDidMount(){P.Z.get(this.props.profile.api.moderate_avatar).then((e=>{this.setState({isLoaded:!0,is_avatar_locked:e.is_avatar_locked,avatar_lock_user_message:e.avatar_lock_user_message||"",avatar_lock_staff_message:e.avatar_lock_staff_message||""})}),(e=>{this.setState({isLoaded:!0,error:e.detail})}))}clean(){return!!this.isValid()||(O.Z.error(this.validate().username[0]),!1)}send(){return P.Z.post(this.props.profile.api.moderate_avatar,{is_avatar_locked:this.state.is_avatar_locked,avatar_lock_user_message:this.state.avatar_lock_user_message,avatar_lock_staff_message:this.state.avatar_lock_staff_message})}handleSuccess(e){U.Z.dispatch((0,se.n1)(this.props.profile,e.avatar_hash)),O.Z.success(gettext("Avatar controls have been changed."))}getFormBody(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(Ze.Z,{label:gettext("Lock avatar"),helpText:gettext("Locking user avatar will prohibit user from changing his avatar and will reset his/her avatar to default one."),for:"id_is_avatar_locked"},void 0,(0,o.Z)(fe.Z,{id:"id_is_avatar_locked",disabled:this.state.isLoading,iconOn:"lock_outline",iconOff:"lock_open",labelOn:gettext("Disallow user from changing avatar"),labelOff:gettext("Allow user to change avatar"),onChange:this.bindInput("is_avatar_locked"),value:this.state.is_avatar_locked})),(0,o.Z)(Ze.Z,{label:gettext("User message"),helpText:gettext("Optional message for user explaining why he/she is prohibited form changing avatar."),for:"id_avatar_lock_user_message"},void 0,(0,o.Z)("textarea",{id:"id_avatar_lock_user_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_user_message"),value:this.state.avatar_lock_user_message})),(0,o.Z)(Ze.Z,{label:gettext("Staff message"),helpText:gettext("Optional message for forum team members explaining why user is prohibited form changing avatar."),for:"id_avatar_lock_staff_message"},void 0,(0,o.Z)("textarea",{id:"id_avatar_lock_staff_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_staff_message"),value:this.state.avatar_lock_staff_message}))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},void 0,gettext("Close")),(0,o.Z)(j.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Save changes"))))}getModalBody(){return this.state.error?(0,o.Z)(_e.Z,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():F||(F=(0,o.Z)(be.Z,{}))}getClassName(){return this.state.error?"modal-dialog modal-message modal-avatar-controls":"modal-dialog modal-avatar-controls"}render(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Y||(Y=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Avatar controls"))),this.getModalBody()))}},xe=s(55210),ye=class extends ge.Z{constructor(e){super(e),this.state={isLoaded:!1,isLoading:!1,error:null,username:"",validators:{username:[xe.lG()]}}}componentDidMount(){P.Z.get(this.props.profile.api.moderate_username).then((()=>{this.setState({isLoaded:!0})}),(e=>{this.setState({isLoaded:!0,error:e.detail})}))}clean(){return!!this.isValid()||(O.Z.error(this.validate().username[0]),!1)}send(){return P.Z.post(this.props.profile.api.moderate_username,{username:this.state.username})}handleSuccess(e){this.setState({username:""}),U.Z.dispatch((0,oe.KP)(e,this.props.profile,this.props.user)),U.Z.dispatch((0,se._S)(this.props.profile,e.username,e.slug)),O.Z.success(gettext("Username has been changed."))}getFormBody(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(Ze.Z,{label:gettext("New username"),for:"id_username"},void 0,(0,o.Z)("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,o.Z)(j.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Change username"))))}getModalBody(){return this.state.error?(0,o.Z)(_e.Z,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():V||(V=(0,o.Z)(be.Z,{}))}getClassName(){return this.state.error?"modal-dialog modal-message modal-rename-user":"modal-dialog modal-rename-user"}render(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,G||(G=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Change username"))),this.getModalBody()))}},we=class extends ge.Z{constructor(e){super(e),(0,n.Z)(this,"countdown",(()=>{window.setTimeout((()=>{this.state.countdown>1?(this.setState({countdown:this.state.countdown-1}),this.countdown()):this.state.confirm||this.setState({confirm:!0})}),1e3)})),this.state={isLoaded:!1,isLoading:!1,isDeleted:!1,error:null,countdown:5,confirm:!1,with_content:!1}}componentDidMount(){P.Z.get(this.props.profile.api.delete).then((()=>{this.setState({isLoaded:!0}),this.countdown()}),(e=>{this.setState({isLoaded:!0,error:e.detail})}))}send(){return P.Z.post(this.props.profile.api.delete,{with_content:this.state.with_content})}handleSuccess(){m.Z.stop("user-profile"),this.state.with_content?this.setState({isDeleted:interpolate(gettext("%(username)s's account, threads, posts and other content has been deleted."),{username:this.props.profile.username},!0)}):this.setState({isDeleted:interpolate(gettext("%(username)s's account has been deleted and other content has been hidden."),{username:this.props.profile.username},!0)})}getButtonLabel(){return this.state.confirm?interpolate(gettext("Delete %(username)s"),{username:this.props.profile.username},!0):interpolate(gettext("Please wait... (%(countdown)ss)"),{countdown:this.state.countdown},!0)}getForm(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(Ze.Z,{label:gettext("User content"),for:"id_with_content"},void 0,(0,o.Z)(fe.Z,{id:"id_with_content",disabled:this.state.isLoading,labelOn:gettext("Delete together with user's account"),labelOff:gettext("Hide after deleting user's account"),onChange:this.bindInput("with_content"),value:this.state.with_content}))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},void 0,gettext("Cancel")),(0,o.Z)(j.Z,{className:"btn-danger",loading:this.state.isLoading,disabled:!this.state.confirm},void 0,this.getButtonLabel())))}getDeletedBody(){return(0,o.Z)("div",{className:"modal-body"},void 0,$||($=(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,this.state.isDeleted),(0,o.Z)("p",{},void 0,(0,o.Z)("a",{href:h.Z.get("USERS_LIST_URL")},void 0,gettext("Return to users list")))))}getModalBody(){return this.state.error?(0,o.Z)(_e.Z,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.state.isDeleted?this.getDeletedBody():this.getForm():W||(W=(0,o.Z)(be.Z,{}))}getClassName(){return this.state.error||this.state.isDeleted?"modal-dialog modal-message modal-delete-account":"modal-dialog modal-delete-account"}render(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Q||(Q=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Delete user account"))),this.getModalBody()))}},ke=s(59801);let Ce=function(e){return{tick:e.tick,user:e.auth,profile:e.profile}};var Se,Ee,Le,Te,Pe,Oe=class extends l().Component{constructor(){super(...arguments),(0,n.Z)(this,"showAvatarDialog",(()=>{ke.Z.show((0,i.$j)(Ce)(Ne))})),(0,n.Z)(this,"showRenameDialog",(()=>{ke.Z.show((0,i.$j)(Ce)(ye))})),(0,n.Z)(this,"showDeleteDialog",(()=>{ke.Z.show((0,i.$j)(Ce)(we))}))}render(){const{moderation:e}=this.props;return(0,o.Z)("ul",{className:"dropdown-menu dropdown-menu-right",role:"menu"},void 0,!!e.avatar&&(0,o.Z)("li",{},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-link",onClick:this.showAvatarDialog},void 0,K||(K=(0,o.Z)("span",{className:"material-icon"},void 0,"portrait")),gettext("Avatar controls"))),!!e.rename&&(0,o.Z)("li",{},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-link",onClick:this.showRenameDialog},void 0,J||(J=(0,o.Z)("span",{className:"material-icon"},void 0,"credit_card")),gettext("Change username"))),!!e.delete&&(0,o.Z)("li",{},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-link",onClick:this.showDeleteDialog},void 0,X||(X=(0,o.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete account"))))}},Re=s(24678),Ae=e=>{let{profile:t}=e;return(0,o.Z)("ul",{className:"profile-data-list"},void 0,!1===t.is_active&&(0,o.Z)("li",{className:"user-account-disabled"},void 0,(0,o.Z)("abbr",{title:gettext("This user's account has been disabled by administrator.")},void 0,gettext("Account disabled"))),(0,o.Z)("li",{className:"user-status-display"},void 0,(0,o.Z)(Re.ZP,{user:t,status:t.status},void 0,(0,o.Z)(Re.Jj,{user:t,status:t.status}),(0,o.Z)(Re.pg,{user:t,status:t.status,className:"status-label"}))),t.rank.is_tab?(0,o.Z)("li",{className:"user-rank"},void 0,(0,o.Z)("a",{href:t.rank.url,className:"item-title"},void 0,t.rank.name)):(0,o.Z)("li",{className:"user-rank"},void 0,(0,o.Z)("span",{className:"item-title"},void 0,t.rank.name)),(t.title||t.rank.title)&&(0,o.Z)("li",{className:"user-title"},void 0,t.title||t.rank.title),(0,o.Z)("li",{className:"user-joined-on"},void 0,(0,o.Z)("abbr",{title:interpolate(gettext("Joined on %(joined_on)s"),{joined_on:t.joined_on.format("LL, LT")},!0)},void 0,interpolate(gettext("Joined %(joined_on)s"),{joined_on:t.joined_on.fromNow()},!0))),t.email&&(0,o.Z)("li",{className:"user-email"},void 0,(0,o.Z)("a",{href:"mailto:"+t.email,className:"item-title"},void 0,t.email)))};const Ie=()=>(0,o.Z)("button",{className:"btn btn-default btn-icon btn-outline dropdown-toggle",type:"button",title:gettext("Options"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,Pe||(Pe=(0,o.Z)("span",{className:"material-icon"},void 0,"settings")));var De=e=>{let{profile:t,user:s,moderation:a,message:i,follow:n}=e;return(0,o.Z)(ue.sP,{},void 0,(0,o.Z)(ue.mr,{styleName:t.rank.css_class?"rank-"+t.rank.css_class:"profile"},void 0,(0,o.Z)(ue.gC,{styleName:t.rank.css_class?"rank-"+t.rank.css_class:"profile"},void 0,(0,o.Z)("div",{className:"profile-page-header"},void 0,(0,o.Z)("div",{className:"profile-page-header-avatar"},void 0,(0,o.Z)(ce.ZP,{className:"user-avatar hidden-sm hidden-md hidden-lg",user:t,size:200,size2x:400}),(0,o.Z)(ce.ZP,{className:"user-avatar hidden-xs hidden-md hidden-lg",user:t,size:64,size2x:128}),(0,o.Z)(ce.ZP,{className:"user-avatar hidden-xs hidden-sm",user:t,size:128,size2x:256})),(0,o.Z)("h1",{},void 0,t.username))),(0,o.Z)(ue.eA,{className:"profile-page-header-details"},void 0,(0,o.Z)(pe.gq,{},void 0,(0,o.Z)(pe.kw,{auto:!0},void 0,(0,o.Z)(pe.Z6,{},void 0,(0,o.Z)(Ae,{profile:t}))),i&&(0,o.Z)(pe.kw,{},void 0,(0,o.Z)(pe.Z6,{},void 0,(0,o.Z)(ve,{className:"btn btn-default btn-block btn-outline",profile:t,user:s})),a.available&&!n&&(0,o.Z)(pe.Z6,{shrink:!0},void 0,(0,o.Z)("div",{className:"dropdown"},void 0,Se||(Se=(0,o.Z)(Ie,{})),(0,o.Z)(Oe,{profile:t,moderation:a})))),n&&(0,o.Z)(pe.kw,{},void 0,(0,o.Z)(pe.Z6,{},void 0,(0,o.Z)(he,{className:"btn btn-block btn-outline",profile:t})),a.available&&(0,o.Z)(pe.Z6,{shrink:!0},void 0,(0,o.Z)("div",{className:"dropdown"},void 0,Ee||(Ee=(0,o.Z)(Ie,{})),(0,o.Z)(Oe,{profile:t,moderation:a})))),a.available&&!n&&!i&&(0,o.Z)(pe.kw,{},void 0,(0,o.Z)(pe.Z6,{className:"hidden-xs",shrink:!0},void 0,(0,o.Z)("div",{className:"dropdown"},void 0,Le||(Le=(0,o.Z)(Ie,{})),(0,o.Z)(Oe,{profile:t,moderation:a}))),(0,o.Z)(pe.Z6,{className:"hidden-sm hidden-md hidden-lg"},void 0,(0,o.Z)("div",{className:"dropdown"},void 0,(0,o.Z)("button",{className:"btn btn-default btn-block btn-outline dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,Te||(Te=(0,o.Z)("span",{className:"material-icon"},void 0,"settings")),gettext("Options")),(0,o.Z)(Oe,{profile:t,moderation:a}))))))))},je=s(69987),ze=s(94417),Ue=e=>{let{baseUrl:t,page:s,pages:a}=e;return(0,o.Z)("div",{className:"nav-container"},void 0,(0,o.Z)("div",{className:"dropdown hidden-sm hidden-md hidden-lg"},void 0,(0,o.Z)("button",{className:"btn btn-default btn-block btn-outline dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,s.icon),s.name),(0,o.Z)("ul",{className:"dropdown-menu stick-to-bottom"},void 0,a.map((e=>(0,o.Z)("li",{},e.component,(0,o.Z)(je.rU,{to:t+e.component+"/"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,e.icon),e.name)))))),(0,o.Z)("ul",{className:"nav nav-pills hidden-xs",role:"menu"},void 0,a.map((e=>(0,o.Z)(ze.Z,{path:t+e.component+"/"},e.component,(0,o.Z)(je.rU,{to:t+e.component+"/"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,e.icon),e.name))))))},Me=class extends re.Z{constructor(e){super(e),(0,n.Z)(this,"update",(e=>{U.Z.dispatch((0,le.ZB)(e))})),this.startPolling(e.profile.api.index)}startPolling(e){m.Z.start({poll:"user-profile",url:e,frequency:9e4,update:this.update})}render(){const e=h.Z.get("PROFILE").url,t=h.Z.get("PROFILE_PAGES"),s=t.filter((t=>{const s=e+t.component+"/";return this.props.location.pathname===s}))[0],{profile:a,user:i}=this.props,n=Be(a,i),r=!!i.acl.can_start_private_threads&&a.id!==i.id,l=!!a.acl.can_follow&&a.id!==i.id;return(0,o.Z)("div",{className:"page page-user-profile"},void 0,(0,o.Z)(De,{profile:this.props.profile,user:this.props.user,moderation:n,message:r,follow:l}),(0,o.Z)(de.Z,{},void 0,(0,o.Z)(Ue,{baseUrl:e,page:s,pages:t}),this.props.children))}};const Be=(e,t)=>{const s={available:!1,rename:!1,avatar:!1,delete:!1};return t.is_anonymous||(s.rename=e.acl.can_rename,s.avatar=e.acl.can_moderate_avatar,s.delete=e.acl.can_delete,s.available=!!(s.rename||s.avatar||s.delete)),s};function qe(e){return{isAuthenticated:e.auth.user.id===e.profile.id,tick:e.tick.tick,user:e.auth.user,users:e.users,posts:e.posts,profile:e.profile,profileDetails:e["profile-details"],"username-history":e["username-history"]}}const He={posts:function(e){let t=null;t=e.user.id===e.profile.id?gettext("You have posted no messages."):interpolate(gettext("%(username)s posted no messages."),{username:e.profile.username},!0);let s=null;if(e.posts.isLoaded)if(e.profile.id===e.user.id){const t=ngettext("You have posted %(posts)s message.","You have posted %(posts)s messages.",e.profile.posts);s=interpolate(t,{posts:e.profile.posts},!0)}else{const t=ngettext("%(username)s has posted %(posts)s message.","%(username)s has posted %(posts)s messages.",e.profile.posts);s=interpolate(t,{username:e.profile.username,posts:e.profile.posts},!0)}else s=gettext("Loading...");return l().createElement(M,(0,I.Z)({api:e.profile.api.posts,emptyMessage:t,header:s,title:gettext("Posts")},e))},threads:function(e){let t=null;t=e.user.id===e.profile.id?gettext("You have no started threads."):interpolate(gettext("%(username)s started no threads."),{username:e.profile.username},!0);let s=null;if(e.posts.isLoaded)if(e.profile.id===e.user.id){const t=ngettext("You have started %(threads)s thread.","You have started %(threads)s threads.",e.profile.threads);s=interpolate(t,{threads:e.profile.threads},!0)}else{const t=ngettext("%(username)s has started %(threads)s thread.","%(username)s has started %(threads)s threads.",e.profile.threads);s=interpolate(t,{username:e.profile.username,threads:e.profile.threads},!0)}else s=gettext("Loading...");return l().createElement(M,(0,I.Z)({api:e.profile.api.threads,emptyMessage:t,header:s,title:gettext("Threads")},e))},followers:ae,follows:class extends ae{setSpecialProps(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWS",this.TITLE=gettext("Follows"),this.API_FILTER="follows"}getLabel(){if(this.state.isLoaded){if(this.state.search){let e=ngettext("Found %(users)s user.","Found %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){let e=ngettext("You are following %(users)s user.","You are following %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}{let e=ngettext("%(username)s is following %(users)s user.","%(username)s is following %(users)s users.",this.state.count);return interpolate(e,{username:this.props.profile.username,users:this.state.count},!0)}}return gettext("Loading...")}getEmptyMessage(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You are not following any users."):interpolate(gettext("%(username)s is not following any users."),{username:this.props.profile.username},!0)}},details:A,"username-history":ne,"ban-details":g};function Fe(){let e=[];return h.Z.get("PROFILE_PAGES").forEach((function(t){e.push(Object.assign({},t,{path:h.Z.get("PROFILE").url+t.component+"/",component:(0,i.$j)(qe)(He[t.component])}))})),e}var Ye=s(39633);h.Z.addInitializer({name:"component:profile",initializer:function(e){e.has("PROFILE")&&e.has("PROFILE_PAGES")&&(0,Ye.Z)({root:h.Z.get("PROFILE").url,component:(0,i.$j)(qe)(Me),paths:Fe()})},after:"reducer:profile-hydrate"})},32488:function(e,t,s){"use strict";var a,i=s(32233),o=s(4942),n=s(22928),r=s(57588),l=s.n(r),d=s(82211),c=s(43345),p=s(78657),u=s(53904),h=s(55210),m=s(93051);class v extends c.Z{constructor(e){super(e),this.state={isLoading:!1,email:"",validators:{email:[h.Do()]}}}clean(){return!!this.isValid()||(u.Z.error(gettext("Enter a valid email address.")),!1)}send(){return p.Z.post(i.Z.get("SEND_ACTIVATION_API"),{email:this.state.email})}handleSuccess(e){this.props.callback(e)}handleError(e){["already_active","inactive_admin"].indexOf(e.code)>-1?u.Z.info(e.detail):403===e.status&&e.ban?(0,m.Z)(e.ban):u.Z.apiError(e)}render(){return(0,n.Z)("div",{className:"well well-form well-form-request-activation-link"},void 0,(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"form-group"},void 0,(0,n.Z)("div",{className:"control-input"},void 0,(0,n.Z)("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),(0,n.Z)(d.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,gettext("Send link"))))}}class g extends l().Component{getMessage(){return interpolate(gettext("Activation link was sent to %(email)s"),{email:this.props.user.email},!0)}render(){return(0,n.Z)("div",{className:"well well-form well-form-request-activation-link well-done"},void 0,(0,n.Z)("div",{className:"done-message"},void 0,a||(a=(0,n.Z)("div",{className:"message-icon"},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,"check"))),(0,n.Z)("div",{className:"message-body"},void 0,(0,n.Z)("p",{},void 0,this.getMessage())),(0,n.Z)("button",{className:"btn btn-primary btn-block",type:"button",onClick:this.props.callback},void 0,gettext("Request another link"))))}}var Z=class extends l().Component{constructor(e){super(e),(0,o.Z)(this,"complete",(e=>{this.setState({complete:e})})),(0,o.Z)(this,"reset",(()=>{this.setState({complete:!1})})),this.state={complete:!1}}render(){return this.state.complete?(0,n.Z)(g,{user:this.state.complete,callback:this.reset}):(0,n.Z)(v,{callback:this.complete})}},b=s(4869);i.Z.addInitializer({name:"component:request-activation-link",initializer:function(){document.getElementById("request-activation-link-mount")&&(0,b.Z)(Z,"request-activation-link-mount",!1)},after:"store"})},11768:function(e,t,s){"use strict";var a,i,o=s(32233),n=s(4942),r=s(22928),l=s(57588),d=s.n(l),c=s(73935),p=s.n(c),u=s(82211),h=s(43345),m=s(78657),v=s(53904),g=s(55210),Z=s(93051);class b extends h.Z{constructor(e){super(e),this.state={isLoading:!1,email:"",validators:{email:[g.Do()]}}}clean(){return!!this.isValid()||(v.Z.error(gettext("Enter a valid email address.")),!1)}send(){return m.Z.post(o.Z.get("SEND_PASSWORD_RESET_API"),{email:this.state.email})}handleSuccess(e){this.props.callback(e)}handleError(e){["inactive_user","inactive_admin"].indexOf(e.code)>-1?this.props.showInactivePage(e):403===e.status&&e.ban?(0,Z.Z)(e.ban):v.Z.apiError(e)}render(){return(0,r.Z)("div",{className:"well well-form well-form-request-password-reset"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"form-group"},void 0,(0,r.Z)("div",{className:"control-input"},void 0,(0,r.Z)("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),(0,r.Z)(u.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,gettext("Send link"))))}}class f extends d().Component{getMessage(){return interpolate(gettext("Reset password link was sent to %(email)s"),{email:this.props.user.email},!0)}render(){return(0,r.Z)("div",{className:"well well-form well-form-request-password-reset well-done"},void 0,(0,r.Z)("div",{className:"done-message"},void 0,a||(a=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"check"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{},void 0,this.getMessage())),(0,r.Z)("button",{type:"button",className:"btn btn-primary btn-block",onClick:this.props.callback},void 0,gettext("Request another link"))))}}class _ extends d().Component{getActivateButton(){return"inactive_user"===this.props.activation?(0,r.Z)("p",{},void 0,(0,r.Z)("a",{href:o.Z.get("REQUEST_ACTIVATION_URL")},void 0,gettext("Activate your account."))):null}render(){return(0,r.Z)("div",{className:"page page-message page-message-info page-forgotten-password-inactive"},void 0,(0,r.Z)("div",{className:"container"},void 0,(0,r.Z)("div",{className:"message-panel"},void 0,i||(i=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("Your account is inactive.")),(0,r.Z)("p",{},void 0,this.props.message),this.getActivateButton()))))}}var N=class extends d().Component{constructor(e){super(e),(0,n.Z)(this,"complete",(e=>{this.setState({complete:e})})),(0,n.Z)(this,"reset",(()=>{this.setState({complete:!1})})),this.state={complete:!1}}showInactivePage(e){p().render((0,r.Z)(_,{activation:e.code,message:e.detail}),document.getElementById("page-mount"))}render(){return this.state.complete?(0,r.Z)(f,{callback:this.reset,user:this.state.complete}):(0,r.Z)(b,{callback:this.complete,showInactivePage:this.showInactivePage})}},x=s(4869);o.Z.addInitializer({name:"component:request-password-reset",initializer:function(){document.getElementById("request-password-reset-mount")&&(0,x.Z)(N,"request-password-reset-mount",!1)},after:"store"})},61323:function(e,t,s){"use strict";var a,i=s(32233),o=s(4942),n=s(22928),r=s(57588),l=s.n(r),d=s(73935),c=s.n(d),p=s(82211),u=s(43345),h=s(14467),m=s(78657),v=s(98274),g=s(59801),Z=s(53904),b=s(93051),f=s(19755);class _ extends u.Z{constructor(e){super(e),this.state={isLoading:!1,password:""}}clean(){return!!this.state.password.trim().length||(Z.Z.error(gettext("Enter new password.")),!1)}send(){return m.Z.post(i.Z.get("CHANGE_PASSWORD_API"),{password:this.state.password})}handleSuccess(e){this.props.callback(e)}handleError(e){403===e.status&&e.ban?(0,b.Z)(e.ban):Z.Z.apiError(e)}render(){return(0,n.Z)("div",{className:"well well-form well-form-reset-password"},void 0,(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"form-group"},void 0,(0,n.Z)("div",{className:"control-input"},void 0,(0,n.Z)("input",{type:"password",className:"form-control",placeholder:gettext("Enter new password"),disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),(0,n.Z)(p.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,gettext("Change password"))))}}class N extends l().Component{getMessage(){return interpolate(gettext("%(username)s, your password has been changed successfully."),{username:this.props.user.username},!0)}showSignIn(){g.Z.show(h.Z)}render(){return(0,n.Z)("div",{className:"page page-message page-message-success page-forgotten-password-changed"},void 0,(0,n.Z)("div",{className:"container"},void 0,(0,n.Z)("div",{className:"message-panel"},void 0,a||(a=(0,n.Z)("div",{className:"message-icon"},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,"check"))),(0,n.Z)("div",{className:"message-body"},void 0,(0,n.Z)("p",{className:"lead"},void 0,this.getMessage()),(0,n.Z)("p",{},void 0,gettext("You will have to sign in using new password before continuing.")),(0,n.Z)("p",{},void 0,(0,n.Z)("button",{type:"button",className:"btn btn-primary",onClick:this.showSignIn},void 0,gettext("Sign in")))))))}}var x=class extends l().Component{constructor(){super(...arguments),(0,o.Z)(this,"complete",(e=>{v.Z.softSignOut(),f('#hidden-login-form input[name="redirect_to"]').remove(),c().render((0,n.Z)(N,{user:e}),document.getElementById("page-mount"))}))}render(){return(0,n.Z)(_,{callback:this.complete})}},y=s(4869);i.Z.addInitializer({name:"component:reset-password-form",initializer:function(){document.getElementById("reset-password-form-mount")&&(0,y.Z)(x,"reset-password-form-mount",!1)},after:"store"})},15049:function(e,t,s){"use strict";var a,i=s(37424),o=s(22928),n=s(87462),r=s(57588),l=s.n(r),d=s(59131),c=s(4942),p=s(32233),u=s(43345),h=s(21981),m=s(16427),v=s(6935),g=s(78657),Z=s(53904),b=s(90287),f=s(98936),_=s(99755),N=class extends u.Z{constructor(e){super(e),(0,c.Z)(this,"onQueryChange",(e=>{this.changeValue("query",e.target.value)})),this.state={isLoading:!1,query:e.search.query}}componentDidMount(){this.state.query.length&&this.handleSubmit()}clean(){return!!this.state.query.trim().length||(Z.Z.error(gettext("You have to enter search query.")),!1)}send(){b.Z.dispatch((0,m.Vx)({isLoading:!0}));const e=this.state.query.trim();let t=window.location.href;const s=t.indexOf("?q=");return s>0&&(t=t.substring(0,s+3)),window.history.pushState({},"",t+encodeURIComponent(e)),g.Z.get(p.Z.get("SEARCH_API"),{q:e})}handleSuccess(e){b.Z.dispatch((0,m.Vx)({query:this.state.query.trim(),isLoading:!1,providers:e})),e.forEach((e=>{"users"===e.id?b.Z.dispatch((0,v.ZB)(e.results.results)):"threads"===e.id&&b.Z.dispatch((0,h.zD)(e.results))}))}handleError(e){Z.Z.apiError(e),b.Z.dispatch((0,m.Vx)({isLoading:!1}))}render(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)(_.sP,{},void 0,(0,o.Z)(_.mr,{styleName:"site-search"},void 0,(0,o.Z)(_.gC,{styleName:"site-search"},void 0,(0,o.Z)("h1",{},void 0,gettext("Search"))),(0,o.Z)(_.eA,{className:"page-header-search-form"},void 0,(0,o.Z)(f.gq,{},void 0,(0,o.Z)(f.kw,{auto:!0},void 0,(0,o.Z)(f.Z6,{},void 0,(0,o.Z)("input",{className:"form-control",disabled:this.state.isLoading,type:"text",value:this.state.query,placeholder:gettext("Search"),onChange:this.onQueryChange})),(0,o.Z)(f.Z6,{shrink:!0},void 0,(0,o.Z)("button",{className:"btn btn-secondary btn-icon btn-outline",disabled:this.state.isLoading},void 0,a||(a=(0,o.Z)("span",{className:"material-icon"},void 0,"search"))))))))))}},x=s(69987);function y(e){return(0,o.Z)("div",{className:"list-group nav-side"},void 0,e.providers.map((e=>(0,o.Z)(x.rU,{activeClassName:"active",className:"list-group-item",to:e.url},e.id,(0,o.Z)("span",{className:"material-icon"},void 0,e.icon),e.name,(0,o.Z)(w,{results:e.results})))))}function w(e){if(!e.results)return null;let t=e.results.count;return t>1e6?t=Math.ceil(t/1e6)+"KK":t>1e3&&(t=Math.ceil(t/1e3)+"K"),(0,o.Z)("span",{className:"badge"},void 0,t)}function k(e){return(0,o.Z)("div",{className:"page page-search"},void 0,(0,o.Z)(N,{provider:e.provider,search:e.search}),(0,o.Z)(d.Z,{},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-3"},void 0,(0,o.Z)(y,{providers:e.search.providers})),(0,o.Z)("div",{className:"col-md-9"},void 0,e.children,(0,o.Z)(C,{provider:e.provider,search:e.search})))))}function C(e){let t=null;if(e.search.providers.forEach((s=>{s.id===e.provider.id&&(t=s.time)})),null===t)return null;const s=gettext("Search took %(time)s s to complete");return(0,o.Z)("footer",{className:"search-footer"},void 0,(0,o.Z)("p",{},void 0,interpolate(s,{time:t},!0)))}var S=s(11005),E=s(82211);function L(e){return(0,o.Z)("div",{},void 0,(0,o.Z)(S.Z,{isReady:!0,posts:e.results}),l().createElement(T,e))}s(69092);class T extends l().Component{constructor(){super(...arguments),(0,c.Z)(this,"onClick",(()=>{b.Z.dispatch((0,h.Vx)({isBusy:!0})),g.Z.get(this.props.provider.api,{q:this.props.query,page:this.props.next}).then((e=>{e.forEach((e=>{"threads"===e.id&&(b.Z.dispatch((0,h.R3)(e.results)),b.Z.dispatch((0,m.P0)(e)))})),b.Z.dispatch((0,h.Vx)({isBusy:!1}))}),(e=>{Z.Z.apiError(e),b.Z.dispatch((0,h.Vx)({isBusy:!1}))}))}))}render(){return this.props.more?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(E.Z,{className:"btn btn-default btn-outline",loading:this.props.isBusy,onClick:this.onClick},void 0,gettext("Show more"))):null}}function P(e){let{children:t,loading:s,posts:a,query:i}=e;return a&&a.count?t:i.length?(0,o.Z)("p",{className:"lead"},void 0,s?gettext("Loading results..."):gettext("No threads matching search query have been found.")):(0,o.Z)("p",{className:"lead"},void 0,gettext("Enter at least two characters to search threads."))}var O=s(40429);function R(e){let{children:t,loading:s,query:a,users:i}=e;return i.length?t:a.length?(0,o.Z)("p",{className:"lead"},void 0,s?gettext("Loading results..."):gettext("No users matching search query have been found.")):(0,o.Z)("p",{className:"lead"},void 0,gettext("Enter at least two characters to search users."))}const A={threads:function(e){return(0,o.Z)(k,{provider:e.route.provider,search:e.search},void 0,(0,o.Z)(P,{loading:e.search.isLoading,query:e.search.query,posts:e.posts},void 0,l().createElement(L,(0,n.Z)({provider:e.route.provider,query:e.search.query},e.posts))))},users:function(e){return(0,o.Z)(k,{provider:e.route.provider,search:e.search},void 0,(0,o.Z)(R,{loading:e.search.isLoading,query:e.search.query,users:e.users},void 0,(0,o.Z)(O.Z,{cols:3,isReady:!e.search.isLoading,users:e.users})))}};function I(e){return{posts:e.posts,search:e.search,tick:e.tick.tick,user:e.auth.user,users:e.users}}var D=s(39633);p.Z.addInitializer({name:"component:search",initializer:function(e){var t;"misago:search"===e.get("CURRENT_LINK")&&(0,D.Z)({paths:(t=p.Z.get("SEARCH_PROVIDERS"),t.map((e=>({path:e.url,component:(0,i.$j)(I)(A[e.id]),provider:e}))))})},after:"store"})},61814:function(e,t,s){"use strict";var a=s(37424),i=s(32233),o=s(22928),n=s(57588),r=s.n(n);const l={info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-danger"};class d extends r().Component{getSnackbarClass(){let e="alerts-snackbar";return this.props.isVisible?e+=" in":e+=" out",e}render(){return(0,o.Z)("div",{className:this.getSnackbarClass()},void 0,(0,o.Z)("p",{className:"alert "+l[this.props.type]},void 0,this.props.message))}}function c(e){return e.snackbar}var p=s(4869);i.Z.addInitializer({name:"component:snackbar",initializer:function(){(0,p.Z)((0,a.$j)(c)(d),"snackbar-mount")},after:"snackbar"})},95920:function(e,t,s){"use strict";var a=s(57588),i=s.n(a),o=s(22928),n=s(4942),r=s(32233),l=s(26106),d=s(82211),c=s(43345),p=s(96359),u=s(78657),h=s(53904),m=s(55210),v=s(59131),g=s(99755),Z=e=>{let{backendName:t}=e;const s=gettext("Sign in with %(backend)s"),a=interpolate(s,{backend:t},!0);return(0,o.Z)(g.sP,{},void 0,(0,o.Z)(g.mr,{styleName:"social-auth"},void 0,(0,o.Z)(g.gC,{styleName:"social-auth"},void 0,(0,o.Z)("h1",{},void 0,a))))};class b extends c.Z{constructor(e){super(e),(0,n.Z)(this,"handlePrivacyPolicyChange",(e=>{const t=e.target.value;this.handleToggleAgreement("privacyPolicy",t)})),(0,n.Z)(this,"handleTermsOfServiceChange",(e=>{const t=e.target.value;this.handleToggleAgreement("termsOfService",t)})),(0,n.Z)(this,"handleToggleAgreement",((e,t)=>{this.setState(((s,a)=>{if(null===s[e])return{errors:{...s.errors,[e]:null},[e]:t};const i=this.state.validators[e][0];return{errors:{...s.errors,[e]:[i(null)]},[e]:null}}))}));const t={email:[m.Do()],username:[m.lG()]};r.Z.get("TERMS_OF_SERVICE_ID")&&(t.termsOfService=[m.fT()]),r.Z.get("PRIVACY_POLICY_ID")&&(t.privacyPolicy=[m.jA()]),this.state={email:e.email||"",emailProtected:!!e.email,username:e.username||"",termsOfService:null,privacyPolicy:null,validators:t,errors:{},isLoading:!1}}clean(){if(this.validate(),-1!==[this.state.email.trim().length,this.state.username.trim().length].indexOf(0))return h.Z.error(gettext("Fill out all fields.")),!1;const{validators:e}=this.state;return r.Z.get("TERMS_OF_SERVICE_ID")&&null===this.state.termsOfService?(h.Z.error(e.termsOfService[0](null)),!1):!r.Z.get("PRIVACY_POLICY_ID")||null!==this.state.privacyPolicy||(h.Z.error(e.privacyPolicy[0](null)),h.Z.error(gettext("You need to accept the privacy policy.")),!1)}send(){return u.Z.post(this.props.url,{email:this.state.email,username:this.state.username,terms_of_service:this.state.termsOfService,privacy_policy:this.state.privacyPolicy})}handleSuccess(e){const{onRegistrationComplete:t}=this.props;t(e)}handleError(e){if(200===e.status){const{onRegistrationComplete:e}=this.props,{username:t}=this.state;e({activation:"active",step:"done",username:t})}else if(400===e.status){const t={errors:e};e.email&&(t.emailProtected=!1),this.setState(t)}else h.Z.apiError(e)}render(){const{backend_name:e}=this.props,{email:t,emailProtected:s,username:a,isLoading:i}=this.state;let n=null;if(s){const t=gettext("Your e-mail address has been verified by %(backend)s.");n=interpolate(t,{backend:e},!0)}return(0,o.Z)("div",{className:"page page-social-auth page-social-auth-register"},void 0,(0,o.Z)(Z,{backendName:e}),(0,o.Z)(v.Z,{},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,gettext("Complete your details"))),(0,o.Z)("div",{className:"panel-body"},void 0,(0,o.Z)(p.Z,{for:"id_username",label:gettext("Username"),validation:this.state.errors.username},void 0,(0,o.Z)("input",{type:"text",id:"id_username",className:"form-control",disabled:i,onChange:this.bindInput("username"),value:a})),(0,o.Z)(p.Z,{for:"id_email",label:gettext("E-mail address"),helpText:n,validation:s?null:this.state.errors.email},void 0,(0,o.Z)("input",{type:"email",id:"id_email",className:"form-control",disabled:i||s,onChange:this.bindInput("email"),value:t})),(0,o.Z)(l.Z,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),(0,o.Z)("div",{className:"panel-footer"},void 0,(0,o.Z)(d.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Sign in")))))))))}}var f=e=>{let{activation:t,backend_name:s,username:a}=e,i="",n="";return n="user"===t?gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in."):"admin"===t?gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in."):gettext("%(username)s, your account has been created and you have been signed in to it."),i="active"===t?"check":"info_outline",(0,o.Z)("div",{className:"page page-social-auth page-social-auth-register"},void 0,(0,o.Z)(Z,{backendName:s}),(0,o.Z)(v.Z,{},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,gettext("Registration completed!"))),(0,o.Z)("div",{className:"panel-body panel-message-body"},void 0,(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,i)),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,interpolate(n,{username:a},!0)),(0,o.Z)("p",{className:"help-block"},void 0,(0,o.Z)("a",{className:"btn btn-default",href:r.Z.get("MISAGO_PATH")},void 0,gettext("Return to forum index"))))))))))};class _ extends i().Component{constructor(e){super(e),(0,n.Z)(this,"handleRegistrationComplete",(e=>{let{activation:t,email:s,step:a,username:i}=e;this.setState({activation:t,email:s,step:a,username:i})})),this.state={step:e.step,activation:e.activation||"",email:e.email||"",username:e.username||""}}render(){const{backend_name:e,url:t}=this.props,{activation:s,email:a,step:i,username:n}=this.state;return"register"===i?(0,o.Z)(b,{backend_name:e,email:a,url:t,username:n,onRegistrationComplete:this.handleRegistrationComplete}):(0,o.Z)(f,{activation:s,backend_name:e,email:a,url:t,username:n})}}var N=s(4869);r.Z.addInitializer({name:"component:social-auth",initializer:function(e){if("misago:social-complete"===e.get("CURRENT_LINK")){const t=e.get("SOCIAL_AUTH_FORM");(0,N.Z)(i().createElement(_,t),"page-mount")}},after:"store"})},60630:function(e,t,s){"use strict";var a,i,o,n=s(37424),r=s(22928),l=s(4942),d=s(57588),c=s.n(d),p=s(87462),u=s(43345),h=s(96359),m=s(8154),v=s(7738),g=s(78657),Z=s(59801),b=s(53904),f=s(90287),_=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onUsernameChange",(e=>{this.changeValue("username",e.target.value)})),this.state={isLoading:!1,username:""}}clean(){return!!this.state.username.trim().length||(b.Z.error(gettext("You have to enter user name.")),!1)}send(){return g.Z.patch(this.props.thread.api.index,[{op:"add",path:"participants",value:this.state.username},{op:"add",path:"acl",value:1}])}handleSuccess(e){f.Z.dispatch((0,v.y8)(e)),f.Z.dispatch(m.gx(e.participants)),b.Z.success(gettext("New participant has been added to thread.")),Z.Z.hide()}render(){return(0,r.Z)("div",{className:"modal-dialog modal-sm",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,a||(a=(0,r.Z)(N,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_username",label:gettext("User to add")},void 0,(0,r.Z)("input",{id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.onUsernameChange,type:"text",value:this.state.username}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-block btn-primary",disabled:this.state.isLoading},void 0,gettext("Add participant")),(0,r.Z)("button",{className:"btn btn-block btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel"))))))}};function N(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,i||(i=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Add participant")))}var x,y,w,k=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)(_,{thread:this.props.thread}))}))}render(){return this.props.thread.acl.can_add_participants?(0,r.Z)("div",{className:"col-xs-12 col-sm-3"},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block",onClick:this.onClick,type:"button"},void 0,o||(o=(0,r.Z)("span",{className:"material-icon"},void 0,"person_add")),gettext("Add participant"))):null}},C=s(32233),S=class extends c().Component{constructor(e){super(e),(0,l.Z)(this,"onClick",(()=>{let e=!1;if(this.isUser)e=window.confirm(gettext("Are you sure you want to take over this thread?"));else{const t=gettext("Are you sure you want to change thread owner to %(user)s?");e=window.confirm(interpolate(t,{user:this.props.participant.username},!0))}var t,s;e&&(t=this.props.thread,s=this.props.participant,g.Z.patch(t.api.index,[{op:"replace",path:"owner",value:s.id},{op:"add",path:"acl",value:1}]).then((e=>{f.Z.dispatch((0,v.y8)(e)),f.Z.dispatch(m.gx(e.participants));const t=gettext("%(user)s has been made new thread owner.");b.Z.success(interpolate(t,{user:s.username},!0))}),(e=>{b.Z.apiError(e)})))})),this.isUser=e.participant.id===e.user.id}render(){return this.props.participant.is_owner?null:this.props.thread.acl.can_change_owner?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,gettext("Make owner"))):null}},E=class extends c().Component{constructor(e){super(e),(0,l.Z)(this,"onClick",(()=>{let e=!1;if(this.isUser)e=window.confirm(gettext("Are you sure you want to leave this thread?"));else{const t=gettext("Are you sure you want to remove %(user)s from this thread?");e=window.confirm(interpolate(t,{user:this.props.participant.username},!0))}var t,s;e&&(this.isUser?(t=this.props.thread,s=this.props.participant,g.Z.patch(t.api.index,[{op:"remove",path:"participants",value:s.id}]).then((()=>{b.Z.success(gettext("You have left this thread.")),window.setTimeout((()=>{window.location=C.Z.get("PRIVATE_THREADS_URL")}),3e3)}),(e=>{b.Z.apiError(e)}))):function(e,t){g.Z.patch(e.api.index,[{op:"remove",path:"participants",value:t.id},{op:"add",path:"acl",value:1}]).then((e=>{f.Z.dispatch((0,v.y8)(e)),f.Z.dispatch(m.gx(e.participants));const s=gettext("%(user)s has been removed from this thread.");b.Z.success(interpolate(s,{user:t.username},!0))}),(e=>{b.Z.apiError(e)}))}(this.props.thread,this.props.participant))})),this.isUser=e.participant.id===e.user.id}render(){const e=this.props.user.acl.can_moderate_private_threads;return this.props.userIsOwner||this.isUser||e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,this.isUser?gettext("Leave thread"):gettext("Remove"))):null}},L=s(19605);function T(e){const t=e.participant;let s="btn btn-default";return t.is_owner&&(s="btn btn-primary"),s+=" btn-user btn-block",(0,r.Z)("div",{className:"col-xs-12 col-sm-3 col-md-2 participant-card"},void 0,(0,r.Z)("div",{className:"dropdown"},void 0,(0,r.Z)("button",{"aria-haspopup":"true","aria-expanded":"false",className:s,"data-toggle":"dropdown",type:"button"},void 0,(0,r.Z)(L.ZP,{size:"34",user:t}),(0,r.Z)("span",{className:"btn-text"},void 0,t.username)),(0,r.Z)("ul",{className:"dropdown-menu stick-to-bottom"},void 0,(0,r.Z)(P,{isOwner:t.is_owner}),x||(x=(0,r.Z)("li",{className:"dropdown-header"})),(0,r.Z)("li",{},void 0,(0,r.Z)("a",{href:t.url},void 0,gettext("See profile"))),y||(y=(0,r.Z)("li",{role:"separator",className:"divider"})),c().createElement(S,e),c().createElement(E,e))))}function P(e){let{isOwner:t}=e;return t?(0,r.Z)("li",{className:"dropdown-header dropdown-header-owner"},void 0,w||(w=(0,r.Z)("span",{className:"material-icon"},void 0,"start")),(0,r.Z)("span",{className:"icon-text"},void 0,gettext("Thread owner"))):null}function O(e){let{participants:t,thread:s,user:a,userIsOwner:i}=e;return(0,r.Z)("div",{className:"participants-cards"},void 0,(0,r.Z)("div",{className:"row"},void 0,t.map((e=>(0,r.Z)(T,{participant:e,thread:s,user:a,userIsOwner:i},e.id)))))}function R(e){return e.participants.length?(0,r.Z)("div",{className:"panel panel-default panel-participants"},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,c().createElement(O,(0,p.Z)({userIsOwner:A(e.user,e.participants)},e)),(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)(k,{thread:e.thread}),(0,r.Z)("div",{className:"col-xs-12 col-sm-9"},void 0,(0,r.Z)("p",{},void 0,function(e){const t=e.length,s=ngettext("This thread has %(users)s participant.","This thread has %(users)s participants.",t);return interpolate(s,{users:t},!0)}(e.participants)))))):null}function A(e,t){return t[0].id===e.id}var I,D=s(30381),j=s.n(D);function z(e){return(0,r.Z)("div",{className:"poll-choices-bars"},void 0,e.poll.choices.map((t=>(0,r.Z)(U,{choice:t,poll:e.poll},t.hash))))}function U(e){let t=0;return e.choice.votes&&e.poll.votes&&(t=Math.ceil(100*e.choice.votes/e.poll.votes)),(0,r.Z)("dl",{className:"dl-horizontal"},void 0,(0,r.Z)("dt",{},void 0,e.choice.label),(0,r.Z)("dd",{},void 0,(0,r.Z)("div",{className:"progress"},void 0,(0,r.Z)("div",{className:"progress-bar",role:"progressbar","aria-valuenow":t,"aria-valuemin":"0","aria-valuemax":"100",style:{width:t+"%"}},void 0,(0,r.Z)("span",{className:"sr-only"},void 0,B(e.votes,e.proc)))),(0,r.Z)("ul",{className:"list-unstyled list-inline poll-chart"},void 0,(0,r.Z)(M,{proc:t,votes:e.choice.votes}),(0,r.Z)(q,{selected:e.choice.selected}))))}function M(e){return(0,r.Z)("li",{className:"poll-chart-votes"},void 0,B(e.votes,e.proc))}function B(e,t){const s=npgettext("thread poll","%(votes)s vote, %(proc)s% of total.","%(votes)s votes, %(proc)s% of total.",e);return interpolate(s,{votes:e,proc:t},!0)}function q(e){return e.selected?(0,r.Z)("li",{className:"poll-chart-selected"},void 0,I||(I=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box")),pgettext("thread poll","You've voted on this choice.")):null}var H,F,Y,V=s(30337),G=s(3784),$=class extends c().Component{constructor(e){super(e),this.state={isLoading:!0,error:null,data:[]}}componentDidMount(){g.Z.get(this.props.poll.api.votes).then((e=>{const t=e.map((e=>Object.assign({},e,{voters:e.voters.map((e=>Object.assign({},e,{voted_on:j()(e.voted_on)})))})));this.setState({isLoading:!1,data:t})}),(e=>{this.setState({isLoading:!1,error:e.detail})}))}render(){return(0,r.Z)("div",{className:"modal-dialog"+(this.state.error?" modal-message":" modal-sm"),role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,H||(H=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,pgettext("thread poll","Poll votes"))),(0,r.Z)(W,{data:this.state.data,error:this.state.error,isLoading:this.state.isLoading})))}};function W(e){return e.isLoading?F||(F=(0,r.Z)(G.Z,{})):e.error?(0,r.Z)(V.Z,{icon:"error_outline",message:e.error}):(0,r.Z)(Q,{data:e.data})}function Q(e){return(0,r.Z)("div",{className:"modal-body modal-poll-votes"},void 0,(0,r.Z)("ul",{className:"list-unstyled votes-details"},void 0,e.data.map((e=>c().createElement(K,(0,p.Z)({key:e.hash},e))))))}function K(e){return(0,r.Z)("li",{},void 0,(0,r.Z)("h4",{},void 0,e.label),(0,r.Z)(J,{votes:e.votes}),(0,r.Z)(X,{voters:e.voters}),Y||(Y=(0,r.Z)("hr",{})))}function J(e){const t=npgettext("thread poll","%(votes)s user has voted for this choice.","%(votes)s users have voted for this choice.",e.votes),s=interpolate(t,{votes:e.votes},!0);return(0,r.Z)("p",{},void 0,s)}function X(e){return e.voters.length?(0,r.Z)("ul",{className:"list-unstyled"},void 0,e.voters.map((e=>c().createElement(ee,(0,p.Z)({key:e.username},e))))):null}function ee(e){return e.url?(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"item-title",href:e.url},void 0,e.username)," ",(0,r.Z)(te,{voted_on:e.voted_on})):(0,r.Z)("li",{},void 0,(0,r.Z)("strong",{},void 0,e.username)," ",(0,r.Z)(te,{voted_on:e.voted_on}))}function te(e){return(0,r.Z)("abbr",{className:"text-muted",title:e.voted_on.format("LLL")},void 0,e.voted_on.fromNow())}var se=s(59752),ae=s(64646);function ie(e){const{isPollOver:t,poll:s,showVoting:a,thread:i}=e;if(!function(e,t,s){return s.is_public||t.can_delete||t.can_edit||t.can_see_votes||t.can_vote&&!e&&(!s.hasSelectedChoices||s.allow_revotes)}(t,s.acl,s))return null;const o=[],n=s.acl.can_vote,l=!s.hasSelectedChoices||s.allow_revotes;return n&&l&&o.push(0),(s.is_public||s.acl.can_see_votes)&&o.push(1),s.acl.can_edit&&o.push(2),s.acl.can_delete&&o.push(3),(0,r.Z)("div",{className:"row poll-options"},void 0,(0,r.Z)(ne,{controls:o,isPollOver:t,poll:s,showVoting:a}),(0,r.Z)(re,{controls:o,poll:s}),(0,r.Z)(le,{controls:o,poll:s,thread:i,onClick:e.edit}),(0,r.Z)(de,{controls:o,poll:s}))}function oe(e,t){let s="col-xs-6";return 1===e.length&&(s="col-xs-12"),3===e.length&&e[0]===t&&(s="col-xs-12"),s+" col-sm-3 col-md-2"}function ne(e){const t=e.poll.acl.can_vote,s=!e.poll.hasSelectedChoices||e.poll.allow_revotes;return t&&s?(0,r.Z)("div",{className:oe(e.controls,0)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:e.poll.isBusy,onClick:e.showVoting,type:"button"},void 0,pgettext("thread poll","Vote"))):null}class re extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)($,{poll:this.props.poll}))}))}render(){return this.props.poll.is_public||this.props.poll.acl.can_see_votes?(0,r.Z)("div",{className:oe(this.props.controls,1)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},void 0,pgettext("thread poll","See votes"))):null}}function le(e){return e.poll.acl.can_edit?(0,r.Z)("div",{className:oe(e.controls,2)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:e.poll.isBusy,onClick:e.onClick,type:"button"},void 0,pgettext("thread poll","Edit"))):null}class de extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{if(!window.confirm(pgettext("thread poll","Are you sure you want to delete this poll? This action is not reversible.")))return!1;f.Z.dispatch(se.n6()),g.Z.delete(this.props.poll.api.index).then(this.handleSuccess,this.handleError)})),(0,l.Z)(this,"handleSuccess",(e=>{b.Z.success(pgettext("thread poll","Poll has been deleted")),f.Z.dispatch(se.Od()),f.Z.dispatch(v.y8(e))})),(0,l.Z)(this,"handleError",(e=>{b.Z.apiError(e),f.Z.dispatch(se.Ar())}))}render(){return this.props.poll.acl.can_delete?(0,r.Z)("div",{className:oe(this.props.controls,3)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},void 0,pgettext("thread poll","Delete"))):null}}var ce=s(89627);const pe='%(relative)s';function ue(e){return(0,r.Z)("ul",{className:"list-unstyled list-inline poll-details"},void 0,(0,r.Z)(be,{votes:e.poll.votes}),(0,r.Z)(ge,{poll:e.poll}),(0,r.Z)(fe,{poll:e.poll}),(0,r.Z)(he,{poll:e.poll}))}function he(e){const t=interpolate((0,ce.Z)(pgettext("thread poll","Started by %(poster)s %(posted_on)s.")),{poster:me(e.poll),posted_on:ve(e.poll)},!0);return(0,r.Z)("li",{className:"poll-info-creation",dangerouslySetInnerHTML:{__html:t}})}function me(e){return e.url.poster?interpolate('%(user)s',{url:(0,ce.Z)(e.url.poster),user:(0,ce.Z)(e.poster_name)},!0):interpolate('%(user)s',{user:(0,ce.Z)(e.poster_name)},!0)}function ve(e){return interpolate(pe,{absolute:(0,ce.Z)(e.posted_on.format("LLL")),relative:(0,ce.Z)(e.posted_on.fromNow())},!0)}function ge(e){if(!e.poll.length)return null;const t=interpolate((0,ce.Z)(pgettext("thread poll","Voting ends %(ends_on)s.")),{ends_on:Ze(e.poll)},!0);return(0,r.Z)("li",{className:"poll-info-ends-on",dangerouslySetInnerHTML:{__html:t}})}function Ze(e){return interpolate(pe,{absolute:(0,ce.Z)(e.endsOn.format("LLL")),relative:(0,ce.Z)(e.endsOn.fromNow())},!0)}function be(e){const t=npgettext("thread poll","%(votes)s vote.","%(votes)s votes.",e.votes),s=interpolate(t,{votes:e.votes},!0);return(0,r.Z)("li",{className:"poll-info-votes"},void 0,s)}function fe(e){return e.poll.is_public?(0,r.Z)("li",{className:"poll-info-public"},void 0,pgettext("thread poll","Voting is public.")):null}function _e(e){return(0,r.Z)("div",{className:"panel panel-default panel-poll"},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,(0,r.Z)("h2",{},void 0,e.poll.question),(0,r.Z)(ue,{poll:e.poll}),(0,r.Z)(z,{poll:e.poll}),(0,r.Z)(ie,{isPollOver:e.isPollOver,poll:e.poll,showVoting:e.showVoting,thread:e.thread})))}function Ne(e){return(0,r.Z)("ul",{className:"list-unstyled list-inline poll-help"},void 0,(0,r.Z)(xe,{choicesLeft:e.choicesLeft}),(0,r.Z)(ye,{poll:e.poll}))}function xe(e){let{choicesLeft:t}=e;if(0===t)return(0,r.Z)("li",{className:"poll-help-choices-left"},void 0,pgettext("thread poll","You can't select any more choices."));const s=npgettext("thread poll","You can select %(choices)s more choice.","You can select %(choices)s more choices.",t),a=interpolate(s,{choices:t},!0);return(0,r.Z)("li",{className:"poll-help-choices-left"},void 0,a)}function ye(e){return e.poll.allow_revotes?(0,r.Z)("li",{className:"poll-help-allow-revotes"},void 0,pgettext("thread poll","You can change your vote later.")):(0,r.Z)("li",{className:"poll-help-no-revotes"},void 0,pgettext("thread poll","Votes are final."))}function we(e){return(0,r.Z)("ul",{className:"list-unstyled poll-select-choices"},void 0,e.choices.map((t=>(0,r.Z)(ke,{choice:t,toggleChoice:e.toggleChoice},t.hash))))}class ke extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{this.props.toggleChoice(this.props.choice.hash)}))}render(){return(0,r.Z)("li",{className:"poll-select-choice"},void 0,(0,r.Z)("button",{className:this.props.choice.selected?"btn btn-selected":"btn",onClick:this.onClick,type:"button"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,this.props.choice.selected?"check_box":"check_box_outline_blank"),(0,r.Z)("strong",{},void 0,this.props.choice.label)))}}function Ce(e,t){let s=[];for(const e in t){const a=t[e];a.selected&&s.push(a)}return e.allowed_choices-s.length}var Se,Ee=s(82211),Le=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"toggleChoice",(e=>{const t=function(e,t){for(const s in e){const a=e[s];if(a.hash===t)return a}return null}(this.state.choices,e);let s=null;s=t.selected?this.deselectChoice(t,e):this.selectChoice(t,e),this.setState({choices:s,choicesLeft:Ce(this.props.poll,s)})})),(0,l.Z)(this,"selectChoice",((e,t)=>{if(!Ce(this.props.poll,this.state.choices))for(const e in this.state.choices.slice()){const s=this.state.choices[e];if(s.selected&&s.hash!=t){s.selected=!1;break}}return this.state.choices.map((e=>Object.assign({},e,{selected:e.hash==t||e.selected})))})),(0,l.Z)(this,"deselectChoice",((e,t)=>this.state.choices.map((e=>Object.assign({},e,{selected:e.hash!=t&&e.selected}))))),this.state={isLoading:!1,choices:e.poll.choices,choicesLeft:Ce(e.poll,e.poll.choices)}}clean(){return this.state.choicesLeft!==this.props.poll.allowed_choices||(b.Z.error(gettext("You need to select at least one choice")),!1)}send(){let e=[];for(const t in this.state.choices.slice()){const s=this.state.choices[t];s.selected&&e.push(s.hash)}return g.Z.post(this.props.poll.api.votes,e)}handleSuccess(e){f.Z.dispatch(se.gx(e)),b.Z.success(gettext("Your vote has been saved.")),this.props.showResults()}handleError(e){400===e.status?b.Z.error(e.detail):b.Z.apiError(e)}render(){const e=[];return this.props.poll.acl.can_vote&&e.push(0),(this.props.poll.is_public||this.props.poll.acl.can_see_votes)&&e.push(1),this.props.poll.acl.can_edit&&e.push(2),this.props.poll.acl.can_delete&&e.push(3),(0,r.Z)("div",{className:"panel panel-default panel-poll"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,(0,r.Z)("h2",{},void 0,this.props.poll.question),(0,r.Z)(ue,{poll:this.props.poll}),(0,r.Z)(we,{choices:this.state.choices,toggleChoice:this.toggleChoice}),(0,r.Z)(Ne,{choicesLeft:this.state.choicesLeft,poll:this.props.poll})),(0,r.Z)("div",{className:"panel-footer"},void 0,(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)("div",{className:oe(e,0)},void 0,(0,r.Z)(Ee.Z,{className:"btn-primary btn-block btn-sm",loading:this.state.isLoading},void 0,gettext("Save your vote"))),(0,r.Z)("div",{className:oe(e,1)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:this.state.isLoading,onClick:this.props.showResults,type:"button"},void 0,gettext("See results"))),(0,r.Z)(le,{controls:e,poll:this.props.poll,thread:this.props.thread,onClick:this.props.edit}),(0,r.Z)(de,{controls:e,poll:this.props.poll})))))}},Te=class extends c().Component{constructor(e){super(e),(0,l.Z)(this,"showResults",(()=>{this.setState({showResults:!0})})),(0,l.Z)(this,"showVoting",(()=>{this.setState({showResults:!1})}));let t=!0;e.user.id&&!e.poll.hasSelectedChoices&&(t=!1),this.state={showResults:t}}render(){if(!this.props.thread.poll)return null;const e=function(e){return!!e.length&&j()().isAfter(e.endsOn)}(this.props.poll);return e||!this.props.poll.acl.can_vote||this.state.showResults?c().createElement(_e,(0,p.Z)({isPollOver:e,showVoting:this.showVoting},this.props)):c().createElement(Le,(0,p.Z)({showResults:this.showResults},this.props))}},Pe=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onAdd",(()=>{let e=this.props.choices.slice();e.push({hash:Re(),label:""}),this.props.setChoices(e)})),(0,l.Z)(this,"onChange",((e,t)=>{const s=this.props.choices.map((s=>(s.hash===e&&(s.label=t),s)));this.props.setChoices(s)})),(0,l.Z)(this,"onDelete",(e=>{const t=this.props.choices.filter((t=>t.hash!==e));this.props.setChoices(t)}))}render(){return(0,r.Z)("div",{className:"poll-choices-control"},void 0,(0,r.Z)("ul",{className:"list-group"},void 0,this.props.choices.map((e=>(0,r.Z)(Oe,{canDelete:this.props.choices.length>2,choice:e,disabled:this.props.disabled,onChange:this.onChange,onDelete:this.onDelete},e.hash)))),(0,r.Z)("button",{className:"btn btn-default btn-sm",disabled:this.props.disabled,onClick:this.onAdd,type:"button"},void 0,pgettext("thread poll","Add choice")))}};class Oe extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onChange",(e=>{this.props.onChange(this.props.choice.hash,e.target.value)})),(0,l.Z)(this,"onDelete",(()=>{window.confirm(pgettext("thread poll","Are you sure you want to remove this choice?"))&&this.props.onDelete(this.props.choice.hash)}))}render(){return(0,r.Z)("li",{className:"list-group-item"},void 0,(0,r.Z)("button",{className:"btn",disabled:!this.props.canDelete||this.props.disabled,onClick:this.onDelete,title:pgettext("thread poll","Remove this choice"),type:"button"},void 0,Se||(Se=(0,r.Z)("span",{className:"material-icon"},void 0,"close"))),(0,r.Z)("input",{disabled:this.props.disabled,maxLength:"255",placeholder:pgettext("thread poll","Poll choice"),type:"text",onChange:this.onChange,value:this.props.choice.label}))}}function Re(){let e="";for(;12!=e.length;)e=Math.random().toString(36).replace(/[^a-zA-Z0-9]+/g,"").substr(1,12);return e}var Ae=s(7227),Ie=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"setChoices",(e=>{const t=Object.assign({},t,{choices:null});this.setState({choices:e,errors:t})})),(0,l.Z)(this,"onCancel",(()=>{let e=!1;e=this.props.poll?window.confirm(pgettext("thread poll","Are you sure you want to discard changes?")):window.confirm(pgettext("thread poll","Are you sure you want to discard new poll?")),e&&this.props.close()}));const t=e.poll.id?e.poll:{question:"",choices:[{hash:"choice-10000",label:""},{hash:"choice-20000",label:""}],length:0,allowed_choices:1,allow_revotes:0,is_public:0};this.state={isLoading:!1,isEdit:!!t.id,question:t.question,choices:t.choices,length:t.length,allowed_choices:t.allowed_choices,allow_revotes:t.allow_revotes,is_public:t.is_public,validators:{question:[],choices:[],length:[],allowed_choices:[]},errors:{}}}send(){const e={question:this.state.question,choices:this.state.choices,length:this.state.length,allowed_choices:this.state.allowed_choices,allow_revotes:this.state.allow_revotes,is_public:this.state.is_public};return this.state.isEdit?g.Z.put(this.props.poll.api.index,e):g.Z.post(this.props.thread.api.poll,e)}handleSuccess(e){f.Z.dispatch(se.gx(e)),this.state.isEdit?b.Z.success(pgettext("thread poll","Poll has been edited.")):b.Z.success(pgettext("thread poll","Poll has been posted.")),this.props.close()}handleError(e){400===e.status?(e.non_field_errors&&(e.allowed_choices=e.non_field_errors),this.setState({errors:Object.assign({},e)}),b.Z.error(gettext("Form contains errors."))):b.Z.apiError(e)}render(){return(0,r.Z)("div",{className:"poll-form"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,r.Z)("div",{className:"panel-heading"},void 0,(0,r.Z)("h3",{className:"panel-title"},void 0,this.state.isEdit?pgettext("thread poll","Edit poll"):pgettext("thread poll","Add poll"))),(0,r.Z)("div",{className:"panel-body"},void 0,(0,r.Z)("fieldset",{},void 0,(0,r.Z)("legend",{},void 0,pgettext("thread poll","Question and choices")),(0,r.Z)(h.Z,{label:pgettext("thread poll","Poll question"),for:"id_questions",validation:this.state.errors.question},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_questions",onChange:this.bindInput("question"),type:"text",maxLength:"255",value:this.state.question})),(0,r.Z)(h.Z,{label:pgettext("thread poll","Available choices"),validation:this.state.errors.choices},void 0,(0,r.Z)(Pe,{choices:this.state.choices,disabled:this.state.isLoading,setChoices:this.setChoices}))),(0,r.Z)("fieldset",{},void 0,(0,r.Z)("legend",{},void 0,pgettext("thread poll","Voting")),(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)("div",{className:"col-xs-12 col-sm-6"},void 0,(0,r.Z)(h.Z,{label:pgettext("thread poll","Poll length"),helpText:pgettext("thread poll","Enter number of days for which voting in this poll should be possible or zero to run this poll indefinitely."),for:"id_length",validation:this.state.errors.length},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_length",onChange:this.bindInput("length"),type:"text",value:this.state.length}))),(0,r.Z)("div",{className:"col-xs-12 col-sm-6"},void 0,(0,r.Z)(h.Z,{label:pgettext("thread poll","Allowed choices"),for:"id_allowed_choices",validation:this.state.errors.allowed_choices},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_allowed_choices",onChange:this.bindInput("allowed_choices"),type:"text",maxLength:"255",value:this.state.allowed_choices})))),(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)(De,{bindInput:this.bindInput,disabled:this.state.isLoading,isEdit:this.state.isEdit,value:this.state.is_public}),(0,r.Z)("div",{className:"col-xs-12 col-sm-6"},void 0,(0,r.Z)(h.Z,{label:pgettext("thread poll","Allow vote changes"),for:"id_allow_revotes"},void 0,(0,r.Z)(Ae.Z,{id:"id_allow_revotes",disabled:this.state.isLoading,iconOn:"check",iconOff:"close",labelOn:pgettext("thread poll","Allow participants to change their vote"),labelOff:pgettext("thread poll","Don't allow participants to change their vote"),onChange:this.bindInput("allow_revotes"),value:this.state.allow_revotes})))))),(0,r.Z)("div",{className:"panel-footer text-right"},void 0,(0,r.Z)("button",{className:"btn btn-default",disabled:this.state.isLoading,onClick:this.onCancel,type:"button"},void 0,pgettext("thread poll","Cancel"))," ",(0,r.Z)(Ee.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,this.state.isEdit?pgettext("thread poll","Save changes"):pgettext("thread poll","Post poll"))))))}};function De(e){return e.isEdit?null:(0,r.Z)("div",{className:"col-xs-12 col-sm-6"},void 0,(0,r.Z)(h.Z,{label:pgettext("thread poll","Make voting public"),helpText:pgettext("thread poll","Making voting public will allow everyone to access detailed list of votes, showing which users voted for which choices and at which times. This option can't be changed after poll's creation. Moderators may see voting details for all polls."),for:"id_is_public"},void 0,(0,r.Z)(Ae.Z,{id:"id_is_public",disabled:e.disabled,iconOn:"visibility",iconOff:"visibility_off",labelOn:pgettext("thread poll","Votes are public"),labelOff:pgettext("thread poll","Votes are hidden"),onChange:e.bindInput("is_public"),value:e.value})))}const je={changed_title:"edit",pinned_globally:"bookmark",pinned_locally:"bookmark_border",unpinned:"panorama_fish_eye",moved:"arrow_forward",merged:"call_merge",approved:"done",opened:"lock_open",closed:"lock_outline",unhid:"visibility",hid:"visibility_off",changed_owner:"grade",tookover:"grade",added_participant:"person_add",owner_left:"person_outline",participant_left:"person_outline",removed_participant:"remove_circle_outline"};var ze=e=>(0,r.Z)("span",{className:"event-icon-bg"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,je[e.post.event_type])),Ue=s(92747);function Me(e){return e.post.acl.can_hide?(0,r.Z)("li",{className:"event-controls"},void 0,c().createElement(Be,e),c().createElement(qe,e),c().createElement(He,e)):null}class Be extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{f.Z.dispatch(Ue.r$(this.props.post,{is_hidden:!0,hidden_on:j()(),hidden_by_name:this.props.user.username,url:Object.assign(this.props.post.url,{hidden_by:this.props.user.url})})),g.Z.patch(this.props.post.api.index,[{op:"replace",path:"is-hidden",value:!0}]).then((e=>{f.Z.dispatch(Ue.r$(this.props.post,e))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(Ue.r$(this.props.post,{is_hidden:!1}))}))}))}render(){return this.props.post.is_hidden?null:(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,gettext("Hide"))}}class qe extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{f.Z.dispatch(Ue.r$(this.props.post,{is_hidden:!1})),g.Z.patch(this.props.post.api.index,[{op:"replace",path:"is-hidden",value:!1}]).then((e=>{f.Z.dispatch(Ue.r$(this.props.post,e))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(Ue.r$(this.props.post,{is_hidden:!0}))}))}))}render(){return this.props.post.is_hidden?(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,gettext("Unhide")):null}}class He extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{window.confirm(gettext("Are you sure you wish to delete this event? This action is not reversible!"))&&this.delete()})),(0,l.Z)(this,"delete",(()=>{f.Z.dispatch(Ue.r$(this.props.post,{isDeleted:!0})),g.Z.delete(this.props.post.api.index).then((()=>{b.Z.success(gettext("Event has been deleted."))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(Ue.r$(this.props.post,{isDeleted:!1}))}))}))}render(){return(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,gettext("Delete"))}}const Fe='%(user)s',Ye='%(user)s';function Ve(e){return(0,r.Z)("ul",{className:"list-inline event-info"},void 0,c().createElement(Ge,e),c().createElement($e,e),c().createElement(Me,e))}function Ge(e){if(e.post.is_hidden){let t=null;t=e.post.url.hidden_by?interpolate(Ye,{url:(0,ce.Z)(e.post.url.hidden_by),user:(0,ce.Z)(e.post.hidden_by_name)},!0):interpolate(Fe,{user:(0,ce.Z)(e.post.hidden_by_name)},!0);const s=interpolate('%(relative)s',{absolute:(0,ce.Z)(e.post.hidden_on.format("LLL")),relative:(0,ce.Z)(e.post.hidden_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("Hidden by %(event_by)s %(event_on)s.")),{event_by:t,event_on:s},!0);return(0,r.Z)("li",{className:"event-hidden-message",dangerouslySetInnerHTML:{__html:a}})}return null}function $e(e){let t=null;t=e.post.poster?interpolate(Ye,{url:(0,ce.Z)(e.post.poster.url),user:(0,ce.Z)(e.post.poster_name)},!0):interpolate(Fe,{user:(0,ce.Z)(e.post.poster_name)},!0);const s=interpolate('%(relative)s',{url:(0,ce.Z)(e.post.url.index),absolute:(0,ce.Z)(e.post.posted_on.format("LLL")),relative:(0,ce.Z)(e.post.posted_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("By %(event_by)s %(event_on)s.")),{event_by:t,event_on:s},!0);return(0,r.Z)("li",{className:"event-posters",dangerouslySetInnerHTML:{__html:a}})}const We={pinned_globally:gettext("Thread has been pinned globally."),pinned_locally:gettext("Thread has been pinned locally."),unpinned:gettext("Thread has been unpinned."),approved:gettext("Thread has been approved."),opened:gettext("Thread has been opened."),closed:gettext("Thread has been closed."),unhid:gettext("Thread has been revealed."),hid:gettext("Thread has been made hidden."),tookover:gettext("Took thread over."),owner_left:gettext("Owner has left thread. This thread is now closed."),participant_left:gettext("Participant has left thread.")},Qe='%(name)s',Ke='%(name)s';function Je(e){return We[e.post.event_type]?(0,r.Z)("p",{className:"event-message"},void 0,We[e.post.event_type]):"changed_title"===e.post.event_type?c().createElement(Xe,e):"moved"===e.post.event_type?c().createElement(et,e):"merged"===e.post.event_type?c().createElement(tt,e):"changed_owner"===e.post.event_type?c().createElement(st,e):"added_participant"===e.post.event_type?c().createElement(at,e):"removed_participant"===e.post.event_type?c().createElement(it,e):null}function Xe(e){const t=(0,ce.Z)(gettext("Thread title has been changed from %(old_title)s.")),s=interpolate(Ke,{name:(0,ce.Z)(e.post.event_context.old_title)},!0),a=interpolate(t,{old_title:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function et(e){const t=(0,ce.Z)(gettext("Thread has been moved from %(from_category)s.")),s=interpolate(Qe,{url:(0,ce.Z)(e.post.event_context.from_category.url),name:(0,ce.Z)(e.post.event_context.from_category.name)},!0),a=interpolate(t,{from_category:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function tt(e){const t=(0,ce.Z)(gettext("The %(merged_thread)s thread has been merged into this thread.")),s=interpolate(Ke,{name:(0,ce.Z)(e.post.event_context.merged_thread)},!0),a=interpolate(t,{merged_thread:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function st(e){const t=(0,ce.Z)(gettext("Changed thread owner to %(user)s.")),s=interpolate(Qe,{url:(0,ce.Z)(e.post.event_context.user.url),name:(0,ce.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function at(e){const t=(0,ce.Z)(gettext("Added %(user)s to thread.")),s=interpolate(Qe,{url:(0,ce.Z)(e.post.event_context.user.url),name:(0,ce.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function it(e){const t=(0,ce.Z)(gettext("Removed %(user)s from thread.")),s=interpolate(Qe,{url:(0,ce.Z)(e.post.event_context.user.url),name:(0,ce.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function ot(e){let{post:t}=e;return t.is_read?null:(0,r.Z)("div",{className:"event-label"},void 0,(0,r.Z)("span",{className:"label label-unread"},void 0,gettext("New event")))}var nt=s(19755),rt=class extends c().Component{componentDidMount(){this.props.post.is_read||nt(this.element).waypoint({handler:e=>{"down"!==e||this.props.post.is_read||window.setTimeout((()=>{const e=this.element.getBoundingClientRect(),t=e.height+e.top,s=document.documentElement.clientHeight;t<5||t>s||(f.Z.dispatch(Ue.r$(this.props.post,{is_read:!0})),g.Z.post(this.props.post.api.read).then((e=>{f.Z.dispatch(v.Vx(this.props.thread,{is_read:e.thread_is_read}))}),(e=>{b.Z.apiError(e)})))}),1e3)},offset:"bottom-in-view"})}render(){return c().createElement("div",{className:this.props.className,ref:e=>{e&&(this.element=e)}},this.props.children)}};function lt(e){let t="event";return e.post.isDeleted?t="hide":e.post.is_hidden&&(t="event post-hidden"),(0,r.Z)("li",{id:"post-"+e.post.id,className:t},void 0,(0,r.Z)(ot,{post:e.post}),(0,r.Z)("div",{className:"event-body"},void 0,(0,r.Z)("div",{className:"event-icon"},void 0,c().createElement(ze,e)),(0,r.Z)(rt,{className:"event-content",post:e.post},void 0,c().createElement(Je,e),c().createElement(Ve,e))))}var dt=s(69130),ct=s(48772);function pt(e){return(0,r.Z)("div",{className:"col-xs-12 col-md-6"},void 0,c().createElement(ut,e),(0,r.Z)("div",{className:"post-attachment"},void 0,(0,r.Z)("a",{href:e.attachment.url.index,className:"attachment-name item-title",target:"_blank"},void 0,e.attachment.filename),c().createElement(vt,e)))}function ut(e){return e.attachment.is_image?(0,r.Z)("div",{className:"post-attachment-preview"},void 0,c().createElement(mt,e)):(0,r.Z)("div",{className:"post-attachment-preview"},void 0,c().createElement(ht,e))}function ht(e){return(0,r.Z)("a",{href:e.attachment.url.index,className:"material-icon"},void 0,"insert_drive_file")}function mt(e){const t=e.attachment.url.thumb||e.attachment.url.index;return(0,r.Z)("a",{className:"post-thumbnail",href:e.attachment.url.index,target:"_blank",style:{backgroundImage:'url("'+(0,ce.Z)(t)+'")'}})}function vt(e){let t=null;t=e.attachment.url.uploader?interpolate('%(user)s',{url:(0,ce.Z)(e.attachment.url.uploader),user:(0,ce.Z)(e.attachment.uploader_name)},!0):interpolate('%(user)s',{user:(0,ce.Z)(e.attachment.uploader_name)},!0);const s=interpolate('%(relative)s',{absolute:(0,ce.Z)(e.attachment.uploaded_on.format("LLL")),relative:(0,ce.Z)(e.attachment.uploaded_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.")),{filetype:e.attachment.filetype,size:(0,ct.Z)(e.attachment.size),uploader:t,uploaded_on:s},!0);return(0,r.Z)("p",{className:"post-attachment-description",dangerouslySetInnerHTML:{__html:a}})}function gt(e){return function(e){return(!e.is_hidden||e.acl.can_see_hidden)&&e.attachments}(e.post)?(0,r.Z)("div",{className:"post-attachments"},void 0,(0,dt.Z)(e.post.attachments,2).map((e=>{const t=e.map((e=>e?e.id:0)).join("_");return(0,r.Z)(Zt,{row:e},t)}))):null}function Zt(e){return(0,r.Z)("div",{className:"row"},void 0,e.row.map((e=>(0,r.Z)(pt,{attachment:e},e?e.id:0))))}var bt,ft,_t,Nt,xt,yt,wt,kt=s(69092);function Ct(e){return e.post.is_hidden&&!e.post.acl.can_see_hidden?c().createElement(Et,e):e.post.content?c().createElement(St,e):c().createElement(Lt,e)}function St(e){let{post:t}=e;const s="@"+(t.poster?t.poster.username:t.poster_name);return(0,r.Z)(rt,{className:"post-body",post:t},void 0,(0,r.Z)(kt.Z,{author:s,markup:t.content}))}function Et(e){let t=null;t=e.post.hidden_by?interpolate('%(user)s',{url:(0,ce.Z)(e.post.url.hidden_by),user:(0,ce.Z)(e.post.hidden_by_name)},!0):interpolate('%(user)s',{user:(0,ce.Z)(e.post.hidden_by_name)},!0);const s=interpolate('%(relative)s',{absolute:(0,ce.Z)(e.post.hidden_on.format("LLL")),relative:(0,ce.Z)(e.post.hidden_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("Hidden by %(hidden_by)s %(hidden_on)s.")),{hidden_by:t,hidden_on:s},!0);return(0,r.Z)(rt,{className:"post-body post-body-hidden",post:e.post},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("This post is hidden. You cannot see its contents.")),(0,r.Z)("p",{className:"text-muted",dangerouslySetInnerHTML:{__html:a}}))}function Lt(e){return(0,r.Z)(rt,{className:"post-body post-body-invalid",post:e.post},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("This post's contents cannot be displayed.")),(0,r.Z)("p",{className:"text-muted"},void 0,gettext("This error is caused by invalid post content manipulation.")))}function Tt(e){let{post:t,thread:s,user:a}=e;if(!At(t)||t.id!==s.best_answer)return null;let i=null;return i=a.id&&s.best_answer_marked_by===a.id?interpolate(gettext("Marked as best answer by you %(marked_on)s."),{marked_on:s.best_answer_marked_on.fromNow()},!0):interpolate(gettext("Marked as best answer by %(marked_by)s %(marked_on)s."),{marked_by:s.best_answer_marked_by_name,marked_on:s.best_answer_marked_on.fromNow()},!0),(0,r.Z)("div",{className:"post-status-message post-status-best-answer"},void 0,bt||(bt=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box")),(0,r.Z)("p",{},void 0,i))}function Pt(e){return At(e.post)&&e.post.is_hidden?(0,r.Z)("div",{className:"post-status-message post-status-hidden"},void 0,ft||(ft=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility_off")),(0,r.Z)("p",{},void 0,gettext("This post is hidden. Only users with permission may see its contents."))):null}function Ot(e){return At(e.post)&&e.post.is_unapproved?(0,r.Z)("div",{className:"post-status-message post-status-unapproved"},void 0,_t||(_t=(0,r.Z)("span",{className:"material-icon"},void 0,"remove_circle_outline")),(0,r.Z)("p",{},void 0,gettext("This post is unapproved. Only users with permission to approve posts and its author may see its contents."))):null}function Rt(e){return At(e.post)&&e.post.is_protected?(0,r.Z)("div",{className:"post-status-message post-status-protected visible-xs-block"},void 0,Nt||(Nt=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),(0,r.Z)("p",{},void 0,gettext("This post is protected. Only moderators may change it."))):null}function At(e){return!e.is_hidden||e.acl.can_see_hidden}function It(e,t,s){g.Z.patch(e.post.api.index,t).then((t=>{f.Z.dispatch(Ue.r$(e.post,t))}),(t=>{400===t.status?b.Z.error(t.detail[0]):b.Z.apiError(t),f.Z.dispatch(Ue.r$(e.post,s))}))}function Dt(e){const{post:t,user:s}=e;f.Z.dispatch(v.Vx({best_answer:t.id,best_answer_is_protected:t.is_protected,best_answer_marked_on:j()(),best_answer_marked_by:s.id,best_answer_marked_by_name:s.username,best_answer_marked_by_slug:s.slug})),jt(e,[{op:"replace",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],{best_answer:e.thread.best_answer,best_answer_is_protected:e.thread.best_answer_is_protected,best_answer_marked_on:e.thread.best_answer_marked_on,best_answer_marked_by:e.thread.best_answer_marked_by,best_answer_marked_by_name:e.thread.best_answer_marked_by_name,best_answer_marked_by_slug:e.thread.best_answer_marked_by_slug})}function jt(e,t,s){g.Z.patch(e.thread.api.index,t).then((e=>{e.best_answer_marked_on&&(e.best_answer_marked_on=j()(e.best_answer_marked_on)),f.Z.dispatch(v.Vx(e))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(v.Vx(s))}))}var zt,Ut,Mt,Bt,qt,Ht,Ft=class extends c().Component{constructor(e){super(e),this.state={isReady:!1,error:null,likes:[]}}componentDidMount(){g.Z.get(this.props.post.api.likes).then((e=>{this.setState({isReady:!0,likes:e.map(Yt)})}),(e=>{this.setState({isReady:!0,error:e.detail})}))}render(){return this.state.error?(0,r.Z)(Vt,{className:"modal-message"},void 0,(0,r.Z)(V.Z,{message:this.state.error})):this.state.isReady?this.state.likes.length?(0,r.Z)(Vt,{className:"modal-sm",likes:this.state.likes},void 0,(0,r.Z)(Gt,{likes:this.state.likes})):(0,r.Z)(Vt,{className:"modal-message"},void 0,(0,r.Z)(V.Z,{message:gettext("No users have liked this post.")})):xt||(xt=(0,r.Z)(Vt,{className:"modal-sm"},void 0,(0,r.Z)(G.Z,{})))}};function Yt(e){return Object.assign({},e,{liked_on:j()(e.liked_on)})}function Vt(e){let{className:t,children:s,likes:a}=e,i=gettext("Post Likes");if(a){const e=a.length,t=ngettext("%(likes)s like","%(likes)s likes",e);i=interpolate(t,{likes:e},!0)}return(0,r.Z)("div",{className:"modal-dialog "+(t||""),role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,yt||(yt=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,i)),s))}function Gt(e){return(0,r.Z)("div",{className:"modal-body modal-post-likers"},void 0,(0,r.Z)("ul",{className:"media-list"},void 0,e.likes.map((e=>c().createElement($t,(0,p.Z)({key:e.id},e))))))}function $t(e){if(e.url){const t={id:e.liker_id,avatars:e.avatars};return(0,r.Z)("li",{className:"media"},void 0,(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("a",{className:"user-avatar",href:e.url},void 0,(0,r.Z)(L.ZP,{size:"50",user:t}))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("a",{className:"item-title",href:e.url},void 0,e.username)," ",(0,r.Z)(Wt,{likedOn:e.liked_on})))}return(0,r.Z)("li",{className:"media"},void 0,wt||(wt=(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("span",{className:"user-avatar"},void 0,(0,r.Z)(L.ZP,{size:"50"})))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("strong",{},void 0,e.username)," ",(0,r.Z)(Wt,{likedOn:e.liked_on})))}function Wt(e){return(0,r.Z)("span",{className:"text-muted",title:e.likedOn.format("LLL")},void 0,e.likedOn.fromNow())}function Qt(e){return function(e){return(!e.is_hidden||e.acl.can_see_hidden)&&(e.acl.can_reply||e.acl.can_edit||e.acl.can_see_likes&&(e.last_likes||[]).length||e.acl.can_like)}(e.post)?(0,r.Z)("div",{className:"post-footer"},void 0,c().createElement(Kt,e),c().createElement(Jt,e),c().createElement(Xt,e),c().createElement(es,(0,p.Z)({lastLikes:e.post.last_likes,likes:e.post.likes},e)),c().createElement(ts,(0,p.Z)({likes:e.post.likes},e)),c().createElement(as,e),c().createElement(is,e)):null}class Kt extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Dt(this.props)}))}render(){const{post:e,thread:t}=this.props;return t.acl.can_mark_best_answer&&e.acl.can_mark_as_best_answer?t.best_answer&&!t.acl.can_change_best_answer?null:(0,r.Z)("button",{className:"hidden-xs btn btn-default btn-sm pull-left",disabled:this.props.post.isBusy||e.id===t.best_answer,onClick:this.onClick,type:"button"},void 0,zt||(zt=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box")),gettext("Best answer")):null}}class Jt extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Dt(this.props)}))}render(){const{post:e,thread:t}=this.props;return t.acl.can_mark_best_answer&&e.acl.can_mark_as_best_answer?t.best_answer&&!t.acl.can_change_best_answer?null:(0,r.Z)("button",{className:"visible-xs-inline-block btn btn-default btn-sm pull-left",disabled:this.props.post.isBusy||e.id===t.best_answer,onClick:this.onClick,type:"button"},void 0,Ut||(Ut=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box"))):null}}class Xt extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{this.props.post.is_liked?function(e){f.Z.dispatch(Ue.r$(e.post,{is_liked:!1,likes:e.post.likes-1,last_likes:e.post.last_likes.filter((t=>!t.id||t.id!==e.user.id))}));const t={is_liked:e.post.is_liked,likes:e.post.likes,last_likes:e.post.last_likes};It(e,[{op:"replace",path:"is-liked",value:!1}],t)}(this.props):function(e){const t=e.post.last_likes||[],s=[e.user].concat(t),a=s.length>3?s.slice(0,-1):s;f.Z.dispatch(Ue.r$(e.post,{is_liked:!0,likes:e.post.likes+1,last_likes:a})),It(e,[{op:"replace",path:"is-liked",value:!0}],{is_liked:e.post.is_liked,likes:e.post.likes,last_likes:e.post.last_likes})}(this.props)}))}render(){if(!this.props.post.acl.can_like)return null;let e="btn btn-default btn-sm pull-left";return this.props.post.is_liked&&(e="btn btn-success btn-sm pull-left"),(0,r.Z)("button",{className:e,disabled:this.props.post.isBusy,onClick:this.onClick,type:"button"},void 0,this.props.post.is_liked?gettext("Liked"):gettext("Like"))}}class es extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)(Ft,{post:this.props.post}))}))}render(){const e=(this.props.post.last_likes||[]).length>0;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?(0,r.Z)("button",{className:"btn btn-link btn-sm pull-left hidden-xs",onClick:this.onClick,type:"button"},void 0,ss(this.props.likes,this.props.lastLikes)):(0,r.Z)("p",{className:"pull-left hidden-xs"},void 0,ss(this.props.likes,this.props.lastLikes)):null}}class ts extends es{render(){const e=(this.props.post.last_likes||[]).length>0;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?(0,r.Z)("button",{className:"btn btn-link btn-sm likes-compact pull-left visible-xs-block",onClick:this.onClick,type:"button"},void 0,Mt||(Mt=(0,r.Z)("span",{className:"material-icon"},void 0,"favorite")),this.props.likes):(0,r.Z)("p",{className:"likes-compact pull-left visible-xs-block"},void 0,Bt||(Bt=(0,r.Z)("span",{className:"material-icon"},void 0,"favorite")),this.props.likes):null}}function ss(e,t){const s=t.slice(0,3).map((e=>e.username));if(1==s.length)return interpolate(gettext("%(user)s likes this."),{user:s[0]},!0);const a=e-s.length,i=s.slice(0,-1).join(", "),o=s.slice(-1)[0],n=interpolate(gettext("%(users)s and %(last_user)s"),{users:i,last_user:o},!0);if(0===a)return interpolate(gettext("%(users)s like this."),{users:n},!0);const r=ngettext("%(users)s and %(likes)s other user like this.","%(users)s and %(likes)s other users like this.",a);return interpolate(r,{users:s.join(", "),likes:a},!0)}class as extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{ae.Z.open({mode:"REPLY",thread:this.props.thread,config:this.props.thread.api.editor,submit:this.props.thread.api.posts.index,context:{reply:this.props.post.id}})}))}render(){return this.props.post.acl.can_reply?(0,r.Z)("button",{className:"btn btn-primary btn-sm pull-right",type:"button",onClick:this.onClick},void 0,gettext("Reply")):null}}class is extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{ae.Z.open({mode:"EDIT",thread:this.props.thread,post:this.props.post,config:this.props.post.api.editor,submit:this.props.post.api.index})}))}render(){return this.props.post.acl.can_edit?(0,r.Z)("button",{className:"hidden-xs btn btn-default btn-sm pull-right",type:"button",onClick:this.onClick},void 0,gettext("Edit")):null}}var os=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onUrlChange",(e=>{this.changeValue("url",e.target.value)})),this.state={isLoading:!1,url:"",validators:{url:[]},errors:{}}}clean(){return!!this.state.url.trim().length||(b.Z.error(gettext("You have to enter link to the other thread.")),!1)}send(){return g.Z.post(this.props.thread.api.posts.move,{new_thread:this.state.url,posts:[this.props.post.id]})}handleSuccess(e){f.Z.dispatch(Ue.r$(this.props.post,{isDeleted:!0})),Z.Z.hide(),b.Z.success(gettext("Selected post was moved to the other thread."))}handleError(e){400===e.status?b.Z.error(e.detail):b.Z.apiError(e)}render(){return(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,qt||(qt=(0,r.Z)(ns,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_url",label:gettext("Link to thread you want to move post to")},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading},void 0,gettext("Move post"))))))}};function ns(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,Ht||(Ht=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Move post")))}function rs(e){return(0,r.Z)("div",{className:"modal-body post-changelog-diff"},void 0,(0,r.Z)("ul",{className:"list-unstyled"},void 0,e.diff.map(((e,t)=>(0,r.Z)(ls,{item:e},t)))))}function ls(e){return"?"===e.item[0]?null:(0,r.Z)("li",{className:ds(e.item)},void 0,e.item.substr(2))}function ds(e){let t="diff-item";return"-"===e[0]?t+=" diff-item-sub":"+"===e[0]&&(t+=" diff-item-add"),t}var cs,ps,us,hs,ms,vs=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{this.props.revertEdit(this.props.edit.id)}))}render(){return this.props.canRevert?(0,r.Z)("div",{className:"modal-footer visible-xs-block"},void 0,(0,r.Z)(Ee.Z,{className:"btn-default btn-sm btn-block",disabled:this.props.disabled,onClick:this.onClick,title:gettext("Revert post to state from before this edit.")},void 0,gettext("Revert"))):null}},gs=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"goLast",(()=>{this.props.goToEdit()})),(0,l.Z)(this,"goForward",(()=>{this.props.goToEdit(this.props.edit.next)})),(0,l.Z)(this,"goBack",(()=>{this.props.goToEdit(this.props.edit.previous)})),(0,l.Z)(this,"revertEdit",(()=>{this.props.revertEdit(this.props.edit.id)}))}render(){return(0,r.Z)("div",{className:"modal-toolbar post-changelog-toolbar"},void 0,(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)("div",{className:"col-xs-12 col-sm-4"},void 0,(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)("div",{className:"col-xs-4"},void 0,(0,r.Z)(Zs,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goBack})),(0,r.Z)("div",{className:"col-xs-4"},void 0,(0,r.Z)(bs,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goForward})),(0,r.Z)("div",{className:"col-xs-4"},void 0,(0,r.Z)(fs,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goLast})))),(0,r.Z)("div",{className:"col-xs-12 col-sm-5 xs-margin-top-half post-change-label"},void 0,(0,r.Z)(Ns,{edit:this.props.edit})),(0,r.Z)(_s,{canRevert:this.props.canRevert,disabled:this.props.disabled,onClick:this.revertEdit})))}};function Zs(e){return(0,r.Z)(Ee.Z,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.previous,onClick:e.onClick,title:gettext("See previous change")},void 0,cs||(cs=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_left")))}function bs(e){return(0,r.Z)(Ee.Z,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.next,onClick:e.onClick,title:gettext("See next change")},void 0,ps||(ps=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_right")))}function fs(e){return(0,r.Z)(Ee.Z,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.next,onClick:e.onClick,title:gettext("See previous change")},void 0,us||(us=(0,r.Z)("span",{className:"material-icon"},void 0,"last_page")))}function _s(e){return e.canRevert?(0,r.Z)("div",{className:"col-sm-3 hidden-xs"},void 0,(0,r.Z)(Ee.Z,{className:"btn-default btn-sm btn-block",disabled:e.disabled,onClick:e.onClick,title:gettext("Revert post to state from before this edit.")},void 0,gettext("Revert"))):null}function Ns(e){let t=null;t=e.edit.url.editor?interpolate('%(user)s',{url:(0,ce.Z)(e.edit.url.editor),user:(0,ce.Z)(e.edit.editor_name)},!0):interpolate('%(user)s',{user:(0,ce.Z)(e.edit.editor_name)},!0);const s=interpolate('%(relative)s',{absolute:(0,ce.Z)(e.edit.edited_on.format("LLL")),relative:(0,ce.Z)(e.edit.edited_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("By %(edited_by)s %(edited_on)s.")),{edited_by:t,edited_on:s},!0);return(0,r.Z)("p",{dangerouslySetInnerHTML:{__html:a}})}function xs(e){return Object.assign({},e,{edited_on:j()(e.edited_on)})}var ys=class extends c().Component{constructor(e){var t;super(e),t=this,(0,l.Z)(this,"goToEdit",(function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;t.setState({isBusy:!0});let s=t.props.post.api.edits;null!==e&&(s+="?edit="+e),g.Z.get(s).then((e=>{t.setState({isReady:!0,isBusy:!1,edit:xs(e)})}),(e=>{t.setState({isReady:!0,isBusy:!1,error:e.detail})}))})),(0,l.Z)(this,"revertEdit",(e=>{if(this.state.isBusy)return;if(!window.confirm(gettext("Are you sure you with to revert this post to the state from before this edit?")))return;this.setState({isBusy:!0});const t=this.props.post.api.edits+"?edit="+e;g.Z.post(t).then((e=>{const t=Ue.ZB(e);f.Z.dispatch(Ue.r$(e,t)),b.Z.success(gettext("Post has been reverted to previous state.")),Z.Z.hide()}),(e=>{b.Z.apiError(e),this.setState({isBusy:!1})}))})),this.state={isReady:!1,isBusy:!0,canRevert:e.post.acl.can_edit,error:null,edit:null}}componentDidMount(){this.goToEdit()}render(){return this.state.error?(0,r.Z)(ws,{className:"modal-dialog modal-message"},void 0,(0,r.Z)(V.Z,{message:this.state.error})):this.state.isReady?(0,r.Z)(ws,{},void 0,(0,r.Z)(gs,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,goToEdit:this.goToEdit,revertEdit:this.revertEdit}),(0,r.Z)(rs,{diff:this.state.edit.diff}),(0,r.Z)(vs,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,revertEdit:this.revertEdit})):hs||(hs=(0,r.Z)(ws,{},void 0,(0,r.Z)(G.Z,{})))}};function ws(e){return(0,r.Z)("div",{className:e.className||"modal-dialog",role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ms||(ms=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Post edits history"))),e.children))}var ks,Cs,Ss,Es,Ls,Ts,Ps,Os,Rs,As,Is,Ds,js,zs,Us,Ms,Bs,qs,Hs,Fs,Ys=s(57026),Vs=s(60471),Gs=s(55210);function $s(e){return c().createElement(Ws,(0,p.Z)({},e,{Form:Qs}))}class Ws extends c().Component{constructor(e){super(e),this.state={isLoaded:!1,isError:!1,categories:[]}}componentDidMount(){g.Z.get(misago.get("THREAD_EDITOR_API")).then((e=>{const t=e.map((e=>Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})));this.setState({isLoaded:!0,categories:t})}),(e=>{this.setState({isError:e.detail})}))}render(){return this.state.isError?(0,r.Z)(Js,{message:this.state.isError}):this.state.isLoaded?c().createElement(Qs,(0,p.Z)({},this.props,{categories:this.state.categories})):ks||(ks=(0,r.Z)(Ks,{}))}}class Qs extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onCategoryChange",(e=>{const t=e.target.value,s={category:t};this.acl[t].can_pin_threads{e.post&&(this.state.category||(this.state.category=e.id),this.acl[e.id]={can_pin_threads:e.post.pin,can_close_threads:e.post.close,can_hide_threads:e.post.hide})}))}clean(){return!!this.isValid()||(b.Z.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}send(){return g.Z.post(this.props.thread.api.posts.split,{title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed,posts:[this.props.post.id]})}handleSuccess(e){f.Z.dispatch(Ue.r$(this.props.post,{isDeleted:!0})),Z.Z.hide(),b.Z.success(gettext("Selected post was split into new thread."))}handleError(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),b.Z.error(gettext("Form contains errors."))):b.Z.apiError(e)}getWeightChoices(){const e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}renderWeightField(){return this.acl[this.state.category].can_pin_threads?(0,r.Z)(h.Z,{label:gettext("Thread weight"),for:"id_weight",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Vs.Z,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}renderHiddenField(){return this.acl[this.state.category].can_hide_threads?(0,r.Z)(h.Z,{label:gettext("Hide thread"),for:"id_is_hidden",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Vs.Z,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}renderClosedField(){return this.acl[this.state.category].can_close_threads?(0,r.Z)(h.Z,{label:gettext("Close thread"),for:"id_is_closed",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Vs.Z,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}render(){return(0,r.Z)(Xs,{className:"modal-dialog"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{label:gettext("Thread title"),for:"id_title",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.title},void 0,(0,r.Z)("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),Cs||(Cs=(0,r.Z)("div",{className:"clearfix"})),(0,r.Z)(h.Z,{label:gettext("Category"),for:"id_category",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.category},void 0,(0,r.Z)(Ys.Z,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.state.categories})),Ss||(Ss=(0,r.Z)("div",{className:"clearfix"})),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)(Ee.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Split post")))))}}function Ks(){return Es||(Es=(0,r.Z)(Xs,{className:"modal-dialog"},void 0,(0,r.Z)(G.Z,{})))}function Js(e){return(0,r.Z)(Xs,{className:"modal-dialog modal-message"},void 0,Ls||(Ls=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("You can't move this post at the moment.")),(0,r.Z)("p",{},void 0,e.message)))}function Xs(e){return(0,r.Z)("div",{className:e.className,role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,Ts||(Ts=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Split post into new thread"))),e.children))}function ea(e){return(0,r.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,c().createElement(ta,e),c().createElement(sa,e),c().createElement(aa,e),c().createElement(ia,e),c().createElement(oa,e),c().createElement(na,e),c().createElement(ra,e),c().createElement(la,e),c().createElement(da,e),c().createElement(ca,e),c().createElement(pa,e),c().createElement(ua,e),c().createElement(ha,e))}class ta extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{let e=window.location.protocol+"//";e+=window.location.host,e+=this.props.post.url.index,prompt(gettext("Permament link to this post:"),e)}))}render(){return(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Ps||(Ps=(0,r.Z)("span",{className:"material-icon"},void 0,"link")),gettext("Permament link")))}}class sa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{ae.Z.open({mode:"EDIT",thread:this.props.thread,post:this.props.post,config:this.props.post.api.editor,submit:this.props.post.api.index})}))}render(){return this.props.post.acl.can_edit?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Os||(Os=(0,r.Z)("span",{className:"material-icon"},void 0,"edit")),gettext("Edit"))):null}}class aa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Dt(this.props)}))}render(){const{post:e,thread:t}=this.props;return t.acl.can_mark_best_answer&&e.acl.can_mark_as_best_answer?e.id===t.best_answer||t.best_answer&&!t.acl.can_change_best_answer?null:(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Rs||(Rs=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box")),gettext("Mark as best answer"))):null}}class ia extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{post:t}=e;f.Z.dispatch(v.Vx({best_answer:null,best_answer_is_protected:!1,best_answer_marked_on:null,best_answer_marked_by:null,best_answer_marked_by_name:null,best_answer_marked_by_slug:null})),jt(e,[{op:"remove",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],{best_answer:e.thread.best_answer,best_answer_is_protected:e.thread.best_answer_is_protected,best_answer_marked_on:e.thread.best_answer_marked_on,best_answer_marked_by:e.thread.best_answer_marked_by,best_answer_marked_by_name:e.thread.best_answer_marked_by_name,best_answer_marked_by_slug:e.thread.best_answer_marked_by_slug})}(this.props)}))}render(){const{post:e,thread:t}=this.props;return e.id!==t.best_answer?null:t.acl.can_unmark_best_answer?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,As||(As=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box_outline_blank")),gettext("Unmark best answer"))):null}}class oa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)(ys,{post:this.props.post}))}))}render(){const e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;const s=ngettext("This post was edited %(edits)s time.","This post was edited %(edits)s times.",this.props.post.edits);return interpolate(s,{edits:this.props.post.edits},!0),(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Is||(Is=(0,r.Z)("span",{className:"material-icon"},void 0,"edit")),gettext("Changes history")))}}class na extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_unapproved:!1})),It(e,[{op:"replace",path:"is-unapproved",value:!1}],{is_unapproved:e.post.is_unapproved})}))}render(){return this.props.post.acl.can_approve&&this.props.post.is_unapproved?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Ds||(Ds=(0,r.Z)("span",{className:"material-icon"},void 0,"done")),gettext("Approve"))):null}}class ra extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show(c().createElement(os,this.props))}))}render(){return this.props.post.acl.can_move?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,js||(js=(0,r.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),gettext("Move"))):null}}class la extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show(c().createElement($s,this.props))}))}render(){return this.props.post.acl.can_move?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,zs||(zs=(0,r.Z)("span",{className:"material-icon"},void 0,"call_split")),gettext("Split"))):null}}class da extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_protected:!0})),It(e,[{op:"replace",path:"is-protected",value:!0}],{is_protected:e.post.is_protected})}))}render(){return this.props.post.acl.can_protect?this.props.post.is_protected?null:(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Us||(Us=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("Protect"))):null}}class ca extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_protected:!1})),It(e,[{op:"replace",path:"is-protected",value:!1}],{is_protected:e.post.is_protected})}))}render(){return this.props.post.acl.can_protect&&this.props.post.is_protected?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Ms||(Ms=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_open")),gettext("Remove protection"))):null}}class pa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_hidden:!0,hidden_on:j()(),hidden_by_name:e.user.username,url:Object.assign(e.post.url,{hidden_by:e.user.url})})),It(e,[{op:"replace",path:"is-hidden",value:!0}],{is_hidden:e.post.is_hidden,hidden_on:e.post.hidden_on,hidden_by_name:e.post.hidden_by_name,url:e.post.url})}))}render(){const{post:e,thread:t}=this.props;return e.id===t.best_answer?null:e.acl.can_hide?e.is_hidden?null:(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Bs||(Bs=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility_off")),gettext("Hide"))):null}}class ua extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_hidden:!1})),It(e,[{op:"replace",path:"is-hidden",value:!1}],{is_hidden:e.post.is_hidden})}))}render(){return this.props.post.acl.can_unhide&&this.props.post.is_hidden?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,qs||(qs=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Unhide"))):null}}class ha extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,window.confirm(gettext("Are you sure you want to delete this post? This action is not reversible!"))&&(f.Z.dispatch(Ue.r$(e.post,{isDeleted:!0})),g.Z.delete(e.post.api.index).then((()=>{b.Z.success(gettext("Post has been deleted."))}),(t=>{400===t.status?b.Z.error(t.detail):b.Z.apiError(t),f.Z.dispatch(Ue.r$(e.post,{isDeleted:!1}))})))}))}render(){const{post:e,thread:t}=this.props;return e.id===t.best_answer?null:e.acl.can_delete?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Hs||(Hs=(0,r.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete"))):null}}function ma(e){return(0,r.Z)("div",{className:"pull-right dropdown"},void 0,Fs||(Fs=(0,r.Z)("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default btn-icon dropdown-toggle","data-toggle":"dropdown",type:"button"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"expand_more"))),c().createElement(ea,e))}var va,ga,Za,ba=s(21981),fa=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{this.props.post.isSelected?f.Z.dispatch(ba._H(this.props.post)):f.Z.dispatch(ba.Ys(this.props.post))}))}render(){return this.props.thread.acl.can_merge_posts||(e=this.props.post.acl).can_approve||e.can_hide||e.can_protect||e.can_unhide||e.can_delete||e.can_move?(0,r.Z)("div",{className:"pull-right"},void 0,(0,r.Z)("button",{className:"btn btn-default btn-icon",onClick:this.onClick,type:"button"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,this.props.post.isSelected?"check_box":"check_box_outline_blank"))):null;var e}},_a=s(24678);function Na(e){return(0,r.Z)("div",{className:"post-heading"},void 0,c().createElement(xa,e),c().createElement(ya,e),c().createElement(wa,e),c().createElement(ka,e),c().createElement(Ca,e),c().createElement(Sa,e),c().createElement(Ea,e),c().createElement(fa,e),c().createElement(ma,e))}function xa(e){return e.post.is_read?null:(0,r.Z)("span",{className:"label label-unread hidden-xs"},void 0,gettext("New post"))}function ya(e){return e.post.is_read?null:(0,r.Z)("span",{className:"label label-unread visible-xs-inline-block"},void 0,gettext("New"))}function wa(e){const t=interpolate(gettext("posted %(posted_on)s"),{posted_on:e.post.posted_on.format("LL, LT")},!0);return(0,r.Z)("a",{href:e.post.url.index,className:"btn btn-link posted-on hidden-xs",title:t},void 0,e.post.posted_on.fromNow())}function ka(e){return(0,r.Z)("a",{href:e.post.url.index,className:"btn btn-link posted-on visible-xs-inline-block"},void 0,e.post.posted_on.fromNow())}class Ca extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)(ys,{post:this.props.post}))}))}render(){const e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;const s=ngettext("This post was edited %(edits)s time.","This post was edited %(edits)s times.",this.props.post.edits),a=interpolate(s,{edits:this.props.post.edits},!0),i=ngettext("edited %(edits)s time","edited %(edits)s times",this.props.post.edits);return(0,r.Z)("button",{className:"btn btn-link btn-see-edits hidden-xs",onClick:this.onClick,title:a,type:"button"},void 0,interpolate(i,{edits:this.props.post.edits},!0))}}class Sa extends Ca{render(){const e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;const s=ngettext("%(edits)s edit","%(edits)s edits",this.props.post.edits);return(0,r.Z)("button",{className:"btn btn-link btn-see-edits visible-xs-inline-block",onClick:this.onClick,type:"button"},void 0,interpolate(s,{edits:this.props.post.edits},!0))}}function Ea(e){const t=e.post.poster&&e.post.poster.id===e.user.id,s=e.post.acl.can_protect;return e.user.id&&e.post.is_protected&&(t||s)?(0,r.Z)("span",{className:"label label-protected hidden-xs",title:gettext("This post is protected and may not be edited.")},void 0,va||(va=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("protected")):null}function La(e){let{post:t,thread:s}=e;return(0,r.Z)("div",{className:"post-side post-side-anonymous"},void 0,(0,r.Z)(fa,{post:t,thread:s}),(0,r.Z)(ma,{post:t,thread:s}),(0,r.Z)("div",{className:"media"},void 0,ga||(ga=(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("span",{},void 0,(0,r.Z)(L.ZP,{className:"poster-avatar",size:100})))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("span",{className:"media-heading item-title"},void 0,t.poster_name),(0,r.Z)("span",{className:"user-title user-title-anonymous"},void 0,gettext("Removed user")))))}function Ta(e){let{title:t,rank:s}=e;return s.is_tab||!!t||!!s.title}function Pa(e){let{poster:t}=e;const s=ngettext("%(posts)s post","%(posts)s posts",t.posts);let a="user-postcount";return Ta(t)&&(a+=" hidden-xs hidden-sm"),(0,r.Z)("span",{className:a},void 0,interpolate(s,{posts:t.posts},!0))}function Oa(e){let{poster:t}=e,s="hidden-xs";return Ta(t)&&(s+=" hidden-sm"),(0,r.Z)("span",{className:s},void 0,(0,r.Z)(_a.ZP,{status:t.status},void 0,(0,r.Z)(_a.pg,{status:t.status,user:t})))}function Ra(e){let{rank:t,title:s}=e,a=s||t.title;if(!a&&t.is_tab&&(a=t.name),!a)return null;let i="user-title";return t.css_class&&(i+=" user-title-"+t.css_class),t.is_tab?(0,r.Z)("div",{className:i},void 0,(0,r.Z)("a",{href:t.url},void 0,a)):(0,r.Z)("div",{className:i},void 0,a)}function Aa(e){let{post:t,thread:s}=e;const{poster:a}=t;return(0,r.Z)("div",{className:"post-side post-side-registered"},void 0,(0,r.Z)(fa,{post:t,thread:s}),(0,r.Z)(ma,{post:t,thread:s}),(0,r.Z)("div",{className:"media"},void 0,(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("a",{href:a.url},void 0,(0,r.Z)(L.ZP,{className:"poster-avatar",size:100,user:a}))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("div",{className:"media-heading"},void 0,(0,r.Z)("a",{className:"item-title",href:a.url},void 0,a.username),(0,r.Z)(_a.ZP,{status:a.status},void 0,(0,r.Z)(_a.Jj,{status:a.status}))),(0,r.Z)(Ra,{rank:a.rank,title:a.title}),(0,r.Z)(Oa,{poster:a}),(0,r.Z)(Pa,{poster:a}))))}function Ia(e){return e.post.poster?c().createElement(Aa,e):c().createElement(La,e)}function Da(e){let t="post";return e.post.isDeleted?t="hide":e.post.is_hidden&&!e.post.acl.can_see_hidden&&(t="post post-hidden"),e.post.poster&&e.post.poster.rank.css_class&&(t+=" post-"+e.post.poster.rank.css_class),e.post.is_read||(t+=" post-new"),(0,r.Z)("li",{id:"post-"+e.post.id,className:t},void 0,(0,r.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,c().createElement(Ia,e),(0,r.Z)("div",{className:"panel-content"},void 0,c().createElement(Na,e),c().createElement(Tt,e),c().createElement(Ot,e),c().createElement(Rt,e),c().createElement(Pt,e),c().createElement(Ct,e),c().createElement(gt,e),c().createElement(Qt,e)))))}var ja,za=()=>(0,r.Z)("li",{className:"post"},void 0,(0,r.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,(0,r.Z)("div",{className:"post-side post-side-registered"},void 0,(0,r.Z)("div",{className:"media"},void 0,Za||(Za=(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("span",{},void 0,(0,r.Z)(L.ZP,{className:"poster-avatar",size:"100"})))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("span",{className:"media-heading item-title"},void 0,(0,r.Z)("span",{className:"ui-preview-text",style:{width:"80px"}},void 0," ")),(0,r.Z)("span",{className:"user-title user-title-anonymous"},void 0,(0,r.Z)("span",{className:"ui-preview-text",style:{width:"60px"}},void 0," "))))),(0,r.Z)("div",{className:"panel-content"},void 0,(0,r.Z)("div",{className:"post-body"},void 0,(0,r.Z)("article",{className:"misago-markup"},void 0,(0,r.Z)("p",{className:"ui-preview-text",style:{width:"100%"}},void 0," "),(0,r.Z)("p",{className:"ui-preview-text",style:{width:"70%"}},void 0," "),(0,r.Z)("p",{className:"ui-preview-text hidden-xs hidden-sm",style:{width:"85%"}},void 0," ")))))));function Ua(e){return e.posts.isLoaded?(0,r.Z)("ul",{className:"posts-list ui-ready"},void 0,e.posts.results.map((t=>c().createElement(Ma,(0,p.Z)({key:t.id,post:t},e))))):ja||(ja=(0,r.Z)("ul",{className:"posts-list ui-preview"},void 0,(0,r.Z)(za,{})))}function Ma(e){return e.post.is_event?c().createElement(lt,e):c().createElement(Da,e)}var Ba,qa,Ha,Fa=s(55547),Ya=s(53328),Va=s(78107),Ga=s(59131),$a=s(98936),Wa=s(50366),Qa=s(16768),Ka=e=>{let{thread:t}=e;return(0,r.Z)("div",{className:"thread-user-card"},void 0,(0,r.Z)("div",{className:"thread-user-card-media"},void 0,t.starter?(0,r.Z)("a",{href:t.url.starter},void 0,(0,r.Z)(L.ZP,{size:40,user:t.starter})):Ba||(Ba=(0,r.Z)(L.ZP,{size:40}))),(0,r.Z)("div",{className:"thread-user-card-body"},void 0,(0,r.Z)("div",{className:"thread-user-card-header"},void 0,t.starter?(0,r.Z)("a",{className:"item-title",href:t.url.starter,title:gettext("Thread author")},void 0,t.starter.username):(0,r.Z)("span",{className:"item-title",title:gettext("Thread author")},void 0,t.starter_name)),(0,r.Z)("div",{},void 0,(0,r.Z)("span",{className:"text-muted",title:interpolate(gettext("Started on: %(timestamp)s"),{timestamp:t.started_on.format("LLL")},!0)},void 0,t.started_on.fromNow()))))},Ja=s(99755),Xa=s(12891),ei=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"handleSuccess",(e=>{this.handleSuccessUnmounted(e),this.setState({isLoading:!0}),Z.Z.hide()})),(0,l.Z)(this,"handleSuccessUnmounted",(e=>{f.Z.dispatch(v.Ar()),f.Z.dispatch(v.Vx(e))})),(0,l.Z)(this,"handleError",(e=>{f.Z.dispatch(v.Ar()),400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e)})),(0,l.Z)(this,"onChange",(e=>{this.changeValue("title",e.target.value)})),this.state={isLoading:!1,title:e.thread.title,validators:{title:(0,Xa.jn)()},errors:{}}}clean(){if(!this.state.title.trim().length)return b.Z.error(gettext("You have to enter thread title.")),!1;const e=this.validate();return!e.title||(b.Z.error(e.title[0]),!1)}send(){return f.Z.dispatch(v.n6()),g.Z.patch(this.props.thread.api.index,[{op:"replace",path:"title",value:this.state.title}])}render(){return(0,r.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,qa||(qa=(0,r.Z)(ti,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_modal_title",label:gettext("Thread title")},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_modal_title",onChange:this.onChange,value:this.state.title}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading||this.props.thread.isBusy},void 0,gettext("Change title"))))))}};function ti(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,Ha||(Ha=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Change title")))}var si,ai,ii,oi,ni,ri,li,di,ci=s(52753),pi=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"handleSuccess",(e=>{this.handleSuccessUnmounted(e),this.setState({isLoading:!0})})),(0,l.Z)(this,"handleSuccessUnmounted",(e=>{b.Z.success(gettext("Thread has been merged with other one.")),window.location=e.url})),(0,l.Z)(this,"handleError",(e=>{f.Z.dispatch(v.Ar()),400===e.status?e.best_answers||e.polls?Z.Z.show((0,r.Z)(ci.ZP,{api:this.props.thread.api.merge,bestAnswers:e.best_answers,data:{other_thread:this.state.url},polls:e.polls,onError:this.handleError,onSuccess:this.handleSuccessUnmounted})):e.best_answer?b.Z.error(e.best_answer[0]):e.poll?b.Z.error(e.poll[0]):b.Z.error(e.detail):b.Z.apiError(e)})),(0,l.Z)(this,"onUrlChange",(e=>{this.changeValue("url",e.target.value)})),this.state={isLoading:!1,url:"",validators:{url:[]},errors:{}}}clean(){return!!this.state.url.trim().length||(b.Z.error(gettext("You have to enter link to the other thread.")),!1)}send(){return f.Z.dispatch(v.n6()),g.Z.post(this.props.thread.api.merge,{other_thread:this.state.url})}render(){return(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,si||(si=(0,r.Z)(ui,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_url",label:gettext("Link to thread you want to merge with"),help_text:gettext("Merge will delete current thread and move its contents to the thread specified here.")},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading||this.props.thread.isBusy},void 0,gettext("Merge thread"))))))}};function ui(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ai||(ai=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Merge thread")))}var hi,mi,vi,gi,Zi,bi,fi,_i,Ni,xi,yi,wi,ki=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onCategoryChange",(e=>{this.changeValue("category",e.target.value)})),this.state={isReady:!1,isLoading:!1,isError:!1,category:null,categories:[]}}componentDidMount(){g.Z.get(C.Z.get("THREAD_EDITOR_API")).then((e=>{let t=null;const s=e.map((e=>(!1===e.post||t||(t=e.id),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id}))));this.setState({isReady:!0,category:t,categories:s})}),(e=>{this.setState({isError:e.detail})}))}send(){return f.Z.dispatch(v.n6()),g.Z.patch(this.props.thread.api.index,[{op:"replace",path:"category",value:this.state.category}])}handleSuccess(){g.Z.get(this.props.thread.api.posts.index,{page:this.props.posts.page}).then((e=>{f.Z.dispatch(v.gx(e)),f.Z.dispatch(ba.zD(e.post_set)),f.Z.dispatch(v.Ar()),b.Z.success(gettext("Thread has been moved.")),Z.Z.hide()}),(e=>{f.Z.dispatch(v.Ar()),b.Z.apiError(e)}))}handleError(e){400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e)}render(){return this.state.isReady?(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,ii||(ii=(0,r.Z)(Ci,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_category",label:gettext("New category")},void 0,(0,r.Z)(Ys.Z,{choices:this.state.categories,disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_category",onChange:this.onCategoryChange,value:this.state.category}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading||this.props.thread.isBusy},void 0,gettext("Move thread")))))):this.state.isError?(0,r.Z)(Ei,{message:this.state.isError}):oi||(oi=(0,r.Z)(Si,{}))}};function Ci(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ni||(ni=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Move thread")))}function Si(e){return ri||(ri=(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)(Ci,{}),(0,r.Z)(G.Z,{}))))}function Ei(e){return(0,r.Z)("div",{className:"modal-dialog modal-message",role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,li||(li=(0,r.Z)(Ci,{})),di||(di=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("You can't move this thread at the moment.")),(0,r.Z)("p",{},void 0,e.message),(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok")))))}var Li,Ti,Pi,Oi,Ri=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"callApi",((e,t)=>{f.Z.dispatch(v.n6()),e.push({op:"add",path:"acl",value:!0}),g.Z.patch(this.props.thread.api.index,e).then((e=>{f.Z.dispatch(v.Vx(e)),f.Z.dispatch(v.Ar()),b.Z.success(t)}),(e=>{f.Z.dispatch(v.Ar()),400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e)}))})),(0,l.Z)(this,"changeTitle",(()=>{Z.Z.show((0,r.Z)(ei,{thread:this.props.thread}))})),(0,l.Z)(this,"pinGlobally",(()=>{this.callApi([{op:"replace",path:"weight",value:2}],gettext("Thread has been pinned globally."))})),(0,l.Z)(this,"pinLocally",(()=>{this.callApi([{op:"replace",path:"weight",value:1}],gettext("Thread has been pinned locally."))})),(0,l.Z)(this,"unpin",(()=>{this.callApi([{op:"replace",path:"weight",value:0}],gettext("Thread has been unpinned."))})),(0,l.Z)(this,"approve",(()=>{this.callApi([{op:"replace",path:"is-unapproved",value:!1}],gettext("Thread has been approved."))})),(0,l.Z)(this,"open",(()=>{this.callApi([{op:"replace",path:"is-closed",value:!1}],gettext("Thread has been opened."))})),(0,l.Z)(this,"close",(()=>{this.callApi([{op:"replace",path:"is-closed",value:!0}],gettext("Thread has been closed."))})),(0,l.Z)(this,"unhide",(()=>{this.callApi([{op:"replace",path:"is-hidden",value:!1}],gettext("Thread has been made visible."))})),(0,l.Z)(this,"hide",(()=>{this.callApi([{op:"replace",path:"is-hidden",value:!0}],gettext("Thread has been made hidden."))})),(0,l.Z)(this,"move",(()=>{Z.Z.show((0,r.Z)(ki,{posts:this.props.posts,thread:this.props.thread}))})),(0,l.Z)(this,"merge",(()=>{Z.Z.show((0,r.Z)(pi,{thread:this.props.thread}))})),(0,l.Z)(this,"delete",(()=>{window.confirm(gettext("Are you sure you want to delete this thread?"))&&(f.Z.dispatch(v.n6()),g.Z.delete(this.props.thread.api.index).then((e=>{b.Z.success(gettext("Thread has been deleted.")),window.location=this.props.thread.category.url.index}),(e=>{f.Z.dispatch(v.Ar()),b.Z.apiError(e)})))}))}render(){const{moderation:e}=this.props;return(0,r.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,!!e.edit&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.changeTitle,type:"button"},void 0,hi||(hi=(0,r.Z)("span",{className:"material-icon"},void 0,"edit")),gettext("Change title"))),!!e.pinGlobally&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.pinGlobally,type:"button"},void 0,mi||(mi=(0,r.Z)("span",{className:"material-icon"},void 0,"bookmark")),gettext("Pin globally"))),!!e.pinLocally&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.pinLocally,type:"button"},void 0,vi||(vi=(0,r.Z)("span",{className:"material-icon"},void 0,"bookmark_border")),gettext("Pin locally"))),!!e.unpin&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.unpin,type:"button"},void 0,gi||(gi=(0,r.Z)("span",{className:"material-icon"},void 0,"panorama_fish_eye")),gettext("Unpin"))),!!e.move&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.move,type:"button"},void 0,Zi||(Zi=(0,r.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),gettext("Move"))),!!e.merge&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.merge,type:"button"},void 0,bi||(bi=(0,r.Z)("span",{className:"material-icon"},void 0,"call_merge")),gettext("Merge"))),!!e.approve&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.approve,type:"button"},void 0,fi||(fi=(0,r.Z)("span",{className:"material-icon"},void 0,"done")),gettext("Approve"))),!!e.open&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.open,type:"button"},void 0,_i||(_i=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_open")),gettext("Open"))),!!e.close&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.close,type:"button"},void 0,Ni||(Ni=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("Close"))),!!e.unhide&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.unhide,type:"button"},void 0,xi||(xi=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Unhide"))),!!e.hide&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.hide,type:"button"},void 0,yi||(yi=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility_off")),gettext("Hide"))),!!e.delete&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.delete,type:"button"},void 0,wi||(wi=(0,r.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete"))))}},Ai=Ri,Ii=e=>{let{thread:t,posts:s,moderation:a}=e;return(0,r.Z)("div",{className:"dropdown"},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle",title:gettext("Thread options"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:t.isBusy},void 0,Li||(Li=(0,r.Z)("span",{className:"material-icon"},void 0,"settings"))),(0,r.Z)(Ai,{thread:t,posts:s,moderation:a}))},Di=s(94184),ji=s.n(Di);function zi(e,t,s){const a={subscription:e.subscription};f.Z.dispatch(v.Vx({subscription:t})),g.Z.patch(e.api.index,[{op:"replace",path:"subscription",value:s}]).then((e=>{f.Z.dispatch(v.Vx(e))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(v.Vx(a))}))}var Ui,Mi,Bi=e=>{let{stickToBottom:t,thread:s}=e;return(0,r.Z)("div",{className:"dropdown"},void 0,(0,r.Z)("button",{className:"btn btn-default btn-outline btn-block","aria-expanded":"true","aria-haspopup":"true","data-toggle":"dropdown",type:"button"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,!0===(a=s.subscription)?"star":!1===a?"star_half":"star_border"),function(e){return!0===e?gettext("E-mail"):!1===e?gettext("Enabled"):gettext("Disabled")}(s.subscription)),(0,r.Z)("ul",{className:ji()("dropdown-menu dropdown-menu-right",{"stick-to-bottom":t})},void 0,(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:()=>function(e){null!==e.subscription&&zi(e,null,"unsubscribe")}(s)},void 0,Ti||(Ti=(0,r.Z)("span",{className:"material-icon"},void 0,"star_border")),gettext("Unsubscribe"))),(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:()=>function(e){!1!==e.subscription&&zi(e,!1,"notify")}(s)},void 0,Pi||(Pi=(0,r.Z)("span",{className:"material-icon"},void 0,"star_half")),gettext("Subscribe"))),(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:()=>function(e){!0!==e.subscription&&zi(e,!0,"email")}(s)},void 0,Oi||(Oi=(0,r.Z)("span",{className:"material-icon"},void 0,"star")),gettext("Subscribe with e-mail")))));var a},qi=e=>{let{children:t,className:s}=e;return(0,r.Z)("ul",{className:ji()("breadcrumbs",s)},void 0,t)},Hi=e=>{let{category:t,className:s}=e;return(0,r.Z)("li",{className:ji()("breadcrumbs-item",s)},void 0,(0,r.Z)("a",{href:t.url.index},void 0,(0,r.Z)("span",{className:"material-icon",style:{color:t.color||"inherit"}},void 0,"label"),!!t.short_name&&(0,r.Z)("span",{className:"breadcrumbs-item-name hidden-sm hidden-md hidden-lg",title:t.name},void 0,t.short_name),!!t.short_name&&(0,r.Z)("span",{className:"breadcrumbs-item-name hidden-xs"},void 0,t.name),!t.short_name&&(0,r.Z)("span",{className:"breadcrumbs-item-name"},void 0,t.name)))},Fi=e=>{let{category:t,className:s}=e;return(0,r.Z)("li",{className:ji()("breadcrumbs-item",s)},void 0,(0,r.Z)("a",{href:t.url.index},void 0,Ui||(Ui=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_right")),(0,r.Z)("span",{className:"breadcrumbs-item-name"},void 0,"root_category"===t.special_role?gettext("Threads"):gettext("Private threads"))))},Yi=e=>{let{breadcrumbs:t}=e;return(0,r.Z)(qi,{},void 0,t.map((e=>e.special_role?(0,r.Z)(Fi,{category:e},e.id):(0,r.Z)(Hi,{category:e},e.id))))};var Vi,Gi,$i,Wi,Qi,Ki,Ji,Xi,eo,to,so,ao=e=>{let{styleName:t,thread:s,posts:a,user:i,moderation:o}=e;return(0,r.Z)(Ja.sP,{},void 0,(0,r.Z)(Ja.mr,{styleName:t},void 0,(0,r.Z)(Ja.gC,{styleName:t},void 0,(0,r.Z)(Yi,{breadcrumbs:s.path}),(0,r.Z)("h1",{},void 0,s.title)),(0,r.Z)(Ja.eA,{className:"page-header-thread-details"},void 0,(0,r.Z)($a.gq,{},void 0,(0,r.Z)($a.kw,{auto:!0},void 0,(0,r.Z)($a.Z6,{shrink:!0},void 0,(0,r.Z)(Ka,{thread:s})),Mi||(Mi=(0,r.Z)($a.Z6,{auto:!0})),s.replies>0&&(0,r.Z)($a.Z6,{shrink:!0},void 0,(0,r.Z)(Qa.Z,{thread:s})),(e=>e.is_closed||e.is_hidden||e.is_unapproved||e.weight>0||e.best_answer||e.has_poll||e.has_unapproved_posts)(s)&&(0,r.Z)($a.Z6,{shrink:!0},void 0,(0,r.Z)(Wa.Z,{thread:s}))),i.is_authenticated&&(0,r.Z)($a.kw,{},void 0,(0,r.Z)($a.Z6,{},void 0,(0,r.Z)(Bi,{thread:s})),o.enabled&&(0,r.Z)($a.Z6,{shrink:!0},void 0,(0,r.Z)(Ii,{thread:s,posts:a,moderation:o})))))))},io=s(92490),oo=s(69987),no=e=>{let{baseUrl:t,posts:s}=e;return(0,r.Z)("div",{className:"misago-pagination"},void 0,s.isLoaded&&s.first?(0,r.Z)(oo.rU,{className:"btn btn-default btn-outline btn-icon",to:t,title:gettext("Go to first page")},void 0,Vi||(Vi=(0,r.Z)("span",{className:"material-icon"},void 0,"first_page"))):(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to first page"),type:"button",disabled:!0},void 0,Gi||(Gi=(0,r.Z)("span",{className:"material-icon"},void 0,"first_page"))),s.isLoaded&&s.previous?(0,r.Z)(oo.rU,{className:"btn btn-default btn-outline btn-icon",to:t+(s.previous>1?s.previous+"/":""),title:gettext("Go to previous page")},void 0,$i||($i=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_left"))):(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to previous page"),type:"button",disabled:!0},void 0,Wi||(Wi=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_left"))),s.isLoaded&&s.next?(0,r.Z)(oo.rU,{className:"btn btn-default btn-outline btn-icon",to:t+s.next+"/",title:gettext("Go to next page")},void 0,Qi||(Qi=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_right"))):(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to next page"),type:"button",disabled:!0},void 0,Ki||(Ki=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_right"))),s.isLoaded&&s.last?(0,r.Z)(oo.rU,{className:"btn btn-default btn-outline btn-icon",to:t+s.last+"/",title:gettext("Go to last page")},void 0,Ji||(Ji=(0,r.Z)("span",{className:"material-icon"},void 0,"last_page"))):(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to last page"),type:"button",disabled:!0},void 0,Xi||(Xi=(0,r.Z)("span",{className:"material-icon"},void 0,"last_page"))))},ro=e=>{let{posts:t}=e;return t.more?(0,r.Z)("p",{},void 0,interpolate(ngettext("There is %(more)s more post in this thread.","There are %(more)s more posts in this thread.",t.more),{more:t.more},!0)):(0,r.Z)("p",{},void 0,gettext("There are no more posts in this thread."))};function lo(e){let{errors:t,posts:s}=e;return(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,eo||(eo=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Moderation"))),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("One or more posts could not be changed:")),(0,r.Z)("ul",{className:"list-unstyled list-errored-items"},void 0,t.map((e=>(0,r.Z)(co,{errors:e.detail,post:s[e.id]},e.id)))))))}function co(e){let{errors:t,post:s}=e;const a=interpolate(gettext("%(username)s on %(posted_on)s"),{posted_on:s.posted_on.format("LL, LT"),username:s.poster_name},!0);return(0,r.Z)("li",{},void 0,(0,r.Z)("h5",{},void 0,a,":"),t.map(((e,t)=>(0,r.Z)("p",{},t,e))))}function po(e,t,s,a){const{selection:i,thread:o}=e;s.forEach((e=>{Ue.r$(e,e)})),f.Z.dispatch(ba.kR());const n={ops:t,ids:i.map((e=>e.id))};g.Z.patch(o.api.posts.index,n).then((e=>{e.forEach((e=>{f.Z.dispatch(Ue.r$(e,e))}))}),(e=>{if(400!==e.status)return a.forEach((e=>{f.Z.dispatch(Ue.r$(e,e))})),b.Z.apiError(e);let t=[],s=[];e.forEach((e=>{e.detail?(t.push(e),s.push(e.id)):f.Z.dispatch(Ue.r$(e,e)),a.forEach((e=>{-1!==s.indexOf(e)&&f.Z.dispatch(Ue.r$(e,e))}))}));let o={};i.forEach((e=>{o[e.id]=e})),Z.Z.show((0,r.Z)(lo,{errors:t,posts:o}))}))}var uo,ho,mo,vo,go,Zo,bo,fo,_o,No,xo,yo,wo,ko,Co,So,Eo=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onUrlChange",(e=>{this.changeValue("url",e.target.value)})),this.state={isLoading:!1,url:"",validators:{url:[]},errors:{}}}clean(){return!!this.state.url.trim().length||(b.Z.error(gettext("You have to enter link to the other thread.")),!1)}send(){return g.Z.post(this.props.thread.api.posts.move,{new_thread:this.state.url,posts:this.props.selection.map((e=>e.id))})}handleSuccess(e){this.props.selection.forEach((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!0}))})),Z.Z.hide(),b.Z.success(gettext("Selected posts were moved to the other thread."))}handleError(e){400===e.status?b.Z.error(e.detail):b.Z.apiError(e)}render(){return(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,to||(to=(0,r.Z)(Lo,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_url",label:gettext("Link to thread you want to move posts to")},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading},void 0,gettext("Move posts"))))))}};function Lo(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,so||(so=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Move posts")))}function To(e){return c().createElement(Po,(0,p.Z)({},e,{Form:Oo}))}class Po extends c().Component{constructor(e){super(e),this.state={isLoaded:!1,isError:!1,categories:[]}}componentDidMount(){g.Z.get(misago.get("THREAD_EDITOR_API")).then((e=>{const t=e.map((e=>Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})));this.setState({isLoaded:!0,categories:t})}),(e=>{this.setState({isError:e.detail})}))}render(){return this.state.isError?(0,r.Z)(Ao,{message:this.state.isError}):this.state.isLoaded?c().createElement(Oo,(0,p.Z)({},this.props,{categories:this.state.categories})):uo||(uo=(0,r.Z)(Ro,{}))}}class Oo extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onCategoryChange",(e=>{const t=e.target.value,s={category:t};this.acl[t].can_pin_threads{e.post&&(this.state.category||(this.state.category=e.id),this.acl[e.id]={can_pin_threads:e.post.pin,can_close_threads:e.post.close,can_hide_threads:e.post.hide})}))}clean(){return!!this.isValid()||(b.Z.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}send(){return g.Z.post(this.props.thread.api.posts.split,{title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed,posts:this.props.selection.map((e=>e.id))})}handleSuccess(e){this.props.selection.forEach((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!0}))})),Z.Z.hide(),b.Z.success(gettext("Selected posts were split into new thread."))}handleError(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),b.Z.error(gettext("Form contains errors."))):403===e.status&&Array.isArray(e)?Z.Z.show((0,r.Z)(lo,{errors:e})):b.Z.apiError(e)}getWeightChoices(){const e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}renderWeightField(){return this.acl[this.state.category].can_pin_threads?(0,r.Z)(h.Z,{label:gettext("Thread weight"),for:"id_weight",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Vs.Z,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}renderHiddenField(){return this.acl[this.state.category].can_hide_threads?(0,r.Z)(h.Z,{label:gettext("Hide thread"),for:"id_is_hidden",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Vs.Z,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}renderClosedField(){return this.acl[this.state.category].can_close_threads?(0,r.Z)(h.Z,{label:gettext("Close thread"),for:"id_is_closed",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Vs.Z,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}render(){return(0,r.Z)(Io,{className:"modal-dialog"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{label:gettext("Thread title"),for:"id_title",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.title},void 0,(0,r.Z)("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),ho||(ho=(0,r.Z)("div",{className:"clearfix"})),(0,r.Z)(h.Z,{label:gettext("Category"),for:"id_category",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.category},void 0,(0,r.Z)(Ys.Z,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.state.categories})),mo||(mo=(0,r.Z)("div",{className:"clearfix"})),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)(Ee.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Split posts")))))}}function Ro(){return vo||(vo=(0,r.Z)(Io,{className:"modal-dialog"},void 0,(0,r.Z)(G.Z,{})))}function Ao(e){return(0,r.Z)(Io,{className:"modal-dialog modal-message"},void 0,go||(go=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("You can't move selected posts at the moment.")),(0,r.Z)("p",{},void 0,e.message),(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}function Io(e){return(0,r.Z)("div",{className:e.className,role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,Zo||(Zo=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Split posts into new thread"))),e.children))}function Do(e){return(0,r.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,c().createElement(jo,e),c().createElement(zo,e),c().createElement(Uo,e),c().createElement(Mo,e),c().createElement(Bo,e),c().createElement(qo,e),c().createElement(Fo,e),c().createElement(Ho,e),c().createElement(Yo,e))}class jo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((e=>({id:e.id,is_unapproved:!1}))),a=t.map((e=>({id:e.id,is_unapproved:e.is_unapproved})));po(e,[{op:"replace",path:"is-unapproved",value:!1}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>e.acl.can_approve&&e.is_unapproved));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,bo||(bo=(0,r.Z)("span",{className:"material-icon"},void 0,"done")),gettext("Approve"))):null}}class zo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,window.confirm(gettext("Are you sure you want to merge selected posts? This action is not reversible!"))&&(e.selection.slice(1).map((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!0}))})),g.Z.post(e.thread.api.posts.merge,{posts:e.selection.map((e=>e.id))}).then((e=>{f.Z.dispatch(Ue.r$(e,Ue.ZB(e)))}),(t=>{400===t.status?b.Z.error(t.detail):b.Z.apiError(t),e.selection.slice(1).map((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!1}))}))})),f.Z.dispatch(ba.kR()))}))}render(){const e=this.props.selection.length>1&&this.props.selection.find((e=>e.acl.can_merge));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,fo||(fo=(0,r.Z)("span",{className:"material-icon"},void 0,"call_merge")),gettext("Merge"))):null}}class Uo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show(c().createElement(Eo,this.props))}))}render(){const e=this.props.selection.find((e=>e.acl.can_move));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,_o||(_o=(0,r.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),gettext("Move"))):null}}class Mo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show(c().createElement(To,this.props))}))}render(){const e=this.props.selection.find((e=>e.acl.can_move));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,No||(No=(0,r.Z)("span",{className:"material-icon"},void 0,"call_split")),gettext("Split"))):null}}class Bo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((e=>({id:e.id,is_protected:!0}))),a=t.map((e=>({id:e.id,is_protected:e.is_protected})));po(e,[{op:"replace",path:"is-protected",value:!0}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>!e.is_protected&&e.acl.can_protect));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,xo||(xo=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("Protect"))):null}}class qo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((e=>({id:e.id,is_protected:!1}))),a=t.map((e=>({id:e.id,is_protected:e.is_protected})));po(e,[{op:"replace",path:"is-protected",value:!1}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>e.is_protected&&e.acl.can_protect));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,yo||(yo=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_open")),gettext("Unprotect"))):null}}class Ho extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((t=>({id:t.id,is_hidden:!0,hidden_on:j()(),hidden_by_name:e.user.username,url:Object.assign(t.url,{hidden_by:e.user.url})}))),a=t.map((e=>({id:e.id,is_hidden:e.is_hidden,hidden_on:e.hidden_on,hidden_by_name:e.hidden_by_name,url:e.url})));po(e,[{op:"replace",path:"is-hidden",value:!0}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>e.acl.can_hide&&!e.is_hidden));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,wo||(wo=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility_off")),gettext("Hide"))):null}}class Fo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((t=>({id:t.id,is_hidden:!1,hidden_on:j()(),hidden_by_name:e.user.username,url:Object.assign(t.url,{hidden_by:e.user.url})}))),a=t.map((e=>({id:e.id,is_hidden:e.is_hidden,hidden_on:e.hidden_on,hidden_by_name:e.hidden_by_name,url:e.url})));po(e,[{op:"replace",path:"is-hidden",value:!1}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>e.acl.can_unhide&&e.is_hidden));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,ko||(ko=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Unhide"))):null}}class Yo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){if(!window.confirm(gettext("Are you sure you want to delete selected posts? This action is not reversible!")))return;e.selection.map((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!0}))}));const t=e.selection.map((e=>e.id));g.Z.delete(e.thread.api.posts.index,t).then((()=>{}),(t=>{400===t.status?b.Z.error(t.detail):b.Z.apiError(t),e.selection.map((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!1}))}))})),f.Z.dispatch(ba.kR())}(this.props)}))}render(){const e=this.props.selection.find((e=>e.acl.can_delete));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,Co||(Co=(0,r.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete"))):null}}var Vo,Go,$o,Wo,Qo,Ko,Jo,Xo,en,tn=e=>{let{thread:t,user:s,selection:a,dropup:i}=e;return(0,r.Z)("div",{className:i?"dropup":"dropdown"},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle",title:gettext("Posts options"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:0===a.length},void 0,So||(So=(0,r.Z)("span",{className:"material-icon"},void 0,"settings"))),(0,r.Z)(Do,{thread:t,user:s,selection:a}))},sn=e=>{let{onClick:t}=e;return(0,r.Z)("button",{className:"btn btn-primary btn-outline btn-block",type:"button",onClick:t},void 0,Vo||(Vo=(0,r.Z)("span",{className:"material-icon"},void 0,"chat")),gettext("Reply"))},an=e=>{let{thread:t,posts:s,user:a,selection:i,moderation:o,onReply:n}=e;return(0,r.Z)(io.o8,{},void 0,(0,r.Z)(io.Z2,{},void 0,(0,r.Z)(io.Eg,{},void 0,(0,r.Z)(no,{baseUrl:t.url.index,posts:s})),o.enabled&&(0,r.Z)(io.Eg,{className:"hidden-sm hidden-md hidden-lg",shrink:!0},void 0,(0,r.Z)(tn,{thread:t,user:a,selection:i,dropup:!0}))),(0,r.Z)(io.Z2,{className:"hidden-xs hidden-sm",auto:!0},void 0,(0,r.Z)(io.Eg,{},void 0,(0,r.Z)(ro,{posts:s}))),Go||(Go=(0,r.Z)(io.tw,{className:"hidden-md hidden-lg"})),a.is_authenticated&&(0,r.Z)(io.Z2,{},void 0,(0,r.Z)(io.Eg,{},void 0,(0,r.Z)(Bi,{thread:t})),t.acl.can_reply&&(0,r.Z)(io.Eg,{},void 0,(0,r.Z)(sn,{onClick:n})),o.enabled&&(0,r.Z)(io.Eg,{className:"hidden-xs",shrink:!0},void 0,(0,r.Z)(tn,{thread:t,user:a,selection:i,dropup:!0}))))},on=e=>{let{compact:t,disabled:s,onClick:a}=e;return(0,r.Z)("button",{className:ji()("btn btn-default btn-outline",{"btn-block":!t,"btn-icon":t}),type:"button",title:t?gettext("Add poll"):null,disabled:s,onClick:a},void 0,$o||($o=(0,r.Z)("span",{className:"material-icon"},void 0,"poll")),!t&&gettext("Add poll"))},nn=e=>{let{user:t,thread:s}=e;return(0,r.Z)("div",{className:"dropdown"},void 0,(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Shortcuts"),"aria-expanded":"true","aria-haspopup":"true","data-toggle":"dropdown",type:"button"},void 0,Wo||(Wo=(0,r.Z)("span",{className:"material-icon"},void 0,"bookmark"))),(0,r.Z)("ul",{className:"dropdown-menu"},void 0,t.is_authenticated&&s.is_new&&(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"btn btn-link",href:s.url.new_post},void 0,Qo||(Qo=(0,r.Z)("span",{className:"material-icon"},void 0,"comment")),gettext("Go to new post"))),s.best_answer&&(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"btn btn-link",href:s.url.best_answer},void 0,Ko||(Ko=(0,r.Z)("span",{className:"material-icon"},void 0,"check_circle")),gettext("Go to best answer"))),s.has_unapproved_posts&&s.acl.can_approve&&(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"btn btn-link",href:s.url.unapproved_post},void 0,Jo||(Jo=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Go to unapproved post"))),(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"btn btn-link",href:s.url.last_post},void 0,Xo||(Xo=(0,r.Z)("span",{className:"material-icon"},void 0,"reply")),gettext("Go to last post")))))},rn=e=>{let{thread:t,posts:s,user:a,pollDisabled:i,selection:o,moderation:n,onPoll:l,onReply:d}=e;return(0,r.Z)(io.o8,{},void 0,(0,r.Z)(io.Z2,{className:"hidden-xs"},void 0,(0,r.Z)(io.Eg,{},void 0,(0,r.Z)(nn,{thread:t,user:a})),(0,r.Z)(io.Eg,{className:"hidden-xs hidden-sm"},void 0,(0,r.Z)(no,{baseUrl:t.url.index,posts:s}))),en||(en=(0,r.Z)(io.tw,{})),t.acl.can_start_poll&&!t.poll&&(0,r.Z)(io.Z2,{className:"hidden-xs"},void 0,(0,r.Z)(io.Eg,{},void 0,(0,r.Z)(on,{disabled:i,onClick:l}))),t.acl.can_reply?(0,r.Z)(io.Z2,{},void 0,(0,r.Z)(io.Eg,{className:"hidden-sm hidden-md hidden-lg",shrink:!0},void 0,(0,r.Z)(nn,{thread:t,user:a})),(0,r.Z)(io.Eg,{},void 0,(0,r.Z)(sn,{onClick:d})),t.acl.can_start_poll&&!t.poll&&(0,r.Z)(io.Eg,{className:"hidden-sm hidden-md hidden-lg",shrink:!0},void 0,(0,r.Z)(on,{disabled:i,onClick:l,compact:!0})),n.enabled&&(0,r.Z)(io.Eg,{className:"hidden-xs",shrink:!0},void 0,(0,r.Z)(tn,{thread:t,user:a,selection:o}))):(0,r.Z)(io.Z2,{},void 0,(0,r.Z)(io.Eg,{className:"hidden-sm hidden-md hidden-lg",shrink:!0},void 0,(0,r.Z)(nn,{thread:t,user:a})),t.acl.can_start_poll&&!t.poll&&(0,r.Z)(io.Eg,{},void 0,(0,r.Z)(on,{disabled:i,onClick:l})),n.enabled&&(0,r.Z)(io.Eg,{shrink:!0},void 0,(0,r.Z)(tn,{thread:t,user:a,selection:o}))))},ln=class extends c().Component{constructor(e){super(e),(0,l.Z)(this,"update",(e=>{f.Z.dispatch(v.gx(e)),f.Z.dispatch(ba.zD(e.post_set)),e.participants&&f.Z.dispatch(m.gx(e.participants)),e.poll&&f.Z.dispatch(se.gx(e.poll)),this.setPageTitle()})),(0,l.Z)(this,"openPollForm",(()=>{this.setState({editPoll:!0})})),(0,l.Z)(this,"closePollForm",(()=>{this.setState({editPoll:!1})})),(0,l.Z)(this,"openReplyForm",(()=>{ae.Z.open({mode:"REPLY",thread:this.props.thread,config:this.props.thread.api.editor,submit:this.props.thread.api.posts.index})})),this.state={editPoll:!1}}componentDidMount(){this.shouldFetchData()&&(this.fetchData(),this.setPageTitle()),this.startPollingApi()}componentDidUpdate(){this.shouldFetchData()&&(this.fetchData(),this.startPollingApi(),this.setPageTitle())}componentWillUnmount(){this.stopPollingApi()}shouldFetchData(){return!!this.props.posts.isLoaded&&1*(this.props.params.page||1)!=this.props.posts.page}fetchData(){f.Z.dispatch(ba.Rz()),g.Z.get(this.props.thread.api.posts.index,{page:this.props.params.page||1},"posts").then((e=>{this.update(e)}),(e=>{b.Z.apiError(e)}))}startPollingApi(){Fa.Z.start({poll:"thread-posts",url:this.props.thread.api.posts.index,data:{page:this.props.params.page||1},update:this.update,frequency:12e4,delayed:!0})}stopPollingApi(){Fa.Z.stop("thread-posts")}setPageTitle(){Ya.Z.set({title:this.props.thread.title,parent:this.props.thread.category.name,page:1*(this.props.params.page||1)})}render(){const e=this.props.thread.category;let t="page page-thread";e.css_class&&(t+=" page-thread-"+e.css_class);const s="private_threads"===e.special_role?"private-threads":e.css_class||"category-threads",a=dn(this.props.thread,this.props.user),i=cn(this.props.posts.results,this.props.user),o=this.props.posts.results.filter((e=>e.isSelected));return(0,r.Z)("div",{className:t},void 0,(0,r.Z)(ao,{styleName:s,thread:this.props.thread,posts:this.props.posts,user:this.props.user,moderation:a}),(0,r.Z)(Ga.Z,{},void 0,(0,r.Z)(R,{participants:this.props.participants,thread:this.props.thread,user:this.props.user}),(0,r.Z)(rn,{thread:this.props.thread,posts:this.props.posts,user:this.props.user,selection:o,moderation:i,pollDisabled:this.state.editPoll,onPoll:this.openPollForm,onReply:this.openReplyForm}),this.state.editPoll?(0,r.Z)(Ie,{poll:this.props.poll,thread:this.props.thread,close:this.closePollForm}):(0,r.Z)(Te,{poll:this.props.poll,thread:this.props.thread,user:this.props.user,edit:this.openPollForm}),this.props.thread.acl.can_reply?(0,r.Z)(Va.mv,{posting:{mode:"REPLY",thread:this.props.thread,config:this.props.thread.api.editor,submit:this.props.thread.api.posts.index}},void 0,c().createElement(Ua,this.props)):c().createElement(Ua,this.props),(0,r.Z)(an,{thread:this.props.thread,posts:this.props.posts,user:this.props.user,selection:o,moderation:i,onReply:this.openReplyForm})))}};const dn=(e,t)=>{const s={enabled:!1,edit:!1,approve:!1,close:!1,open:!1,hide:!1,unhide:!1,move:!1,merge:!1,pinGlobally:!1,pinLocally:!1,unpin:!1,delete:!1};return t.is_authenticated?(s.edit=e.acl.can_edit,s.approve=e.acl.can_approve&&e.is_unapproved,s.close=e.acl.can_close&&!e.is_closed,s.open=e.acl.can_close&&e.is_closed,s.hide=e.acl.can_hide&&!e.is_hidden,s.unhide=e.acl.can_unhide&&e.is_hidden,s.move=e.acl.can_move,s.merge=e.acl.can_merge,s.pinGlobally=e.acl.can_pin_globally&&e.weight<2,s.pinLocally=e.acl.can_pin&&1!==e.weight,s.unpin=e.acl.can_pin&&1===e.weight||e.acl.can_pin_globally&&2===e.weight,s.delete=e.acl.can_delete,s.enabled=s.edit||s.approve||s.close||s.open||s.hide||s.unhide||s.move||s.merge||s.pinGlobally||s.pinLocally||s.unpin||s.delete,s):s},cn=(e,t)=>{const s={enabled:!1,approve:!1,move:!1,merge:!1,protect:!1,hide:!1,delete:!1};return t.is_authenticated?(e.forEach((e=>{e.is_event||(e.acl.can_approve&&e.is_unapproved&&(s.approve=!0),e.acl.can_move&&(s.move=!0),e.acl.can_merge&&(s.merge=!0),(e.acl.can_protect||e.acl.can_unprotect)&&(s.protect=!0),(e.acl.can_hide||e.acl.can_unhide)&&(s.hide=!0),e.acl.can_delete&&(s.delete=!0),(s.approve||s.move||s.merge||s.protect||s.hide||s.delete)&&(s.enabled=!0))})),s):s};function pn(e){return{participants:e.participants,poll:e.poll,posts:e.posts,thread:e.thread,tick:e.tick.tick,user:e.auth.user}}function un(){const e=C.Z.get("THREAD"),t=e.url.index.replace(e.slug+"-"+e.pk,":slug");return[{path:t,component:(0,n.$j)(pn)(ln)},{path:t+":page/",component:(0,n.$j)(pn)(ln)}]}var hn=s(39633);C.Z.addInitializer({name:"component:thread",initializer:function(e){e.has("THREAD")&&e.has("POSTS")&&(0,hn.Z)({paths:un()})},after:"store"})},72168:function(e,t,s){"use strict";var a=s(37424),i=s(22928),o=s(4942),n=s(57588),r=s.n(n),l=s(82211);function d(e,t){return e.last_post>t.last_post?-1:e.last_postt.weight?-1:2===t.weight&&e.weightt.weight?-1:e.weight{let{allItems:t,parentUrl:s,category:a,categories:o,list:n}=e;return(0,i.Z)("div",{className:"dropdown threads-category-picker"},void 0,(0,i.Z)("button",{type:"button",className:"btn btn-default btn-outline dropdown-toggle btn-block text-ellipsis","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,a&&(0,i.Z)("span",{className:"material-icon",style:{color:a.color||"inherit"}},void 0,"label"),a&&a.short_name&&(0,i.Z)("span",{className:a.short_name&&"hidden-md hidden-lg"},void 0,a.short_name),a?(0,i.Z)("span",{className:a.short_name&&"hidden-xs hidden-sm"},void 0,a.name):t),(0,i.Z)("ul",{className:"dropdown-menu"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)(Z.rU,{to:s+n.path},void 0,t)),u||(u=(0,i.Z)("li",{role:"separator",className:"divider"})),o.map((e=>(0,i.Z)("li",{},e.id,(0,i.Z)(Z.rU,{to:e.url.index+n.path},void 0,(0,i.Z)("span",{className:"material-icon",style:{color:e.color||"inherit"}},void 0,"label"),e.name))))))},f=e=>{let{baseUrl:t,list:s,lists:a}=e;return(0,i.Z)("div",{className:"dropdown threads-list-picker"},void 0,(0,i.Z)("button",{type:"button",className:"btn btn-default btn-outline dropdown-toggle btn-block","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,s.longName),(0,i.Z)("ul",{className:"dropdown-menu stick-to-bottom"},void 0,a.map((e=>(0,i.Z)("li",{},e.type,(0,i.Z)(Z.rU,{to:t+e.path},void 0,e.longName))))))},_=class extends r().Component{render(){return(0,i.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,h||(h=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Threads moderation"))),(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("One or more threads could not be deleted:")),(0,i.Z)("ul",{className:"list-unstyled list-errored-items"},void 0,this.props.errors.map((e=>(0,i.Z)(N,{errors:e.errors,thread:e.thread},e.thread.id)))))))}};function N(e){let{errors:t,thread:s}=e;return(0,i.Z)("li",{},void 0,(0,i.Z)("h5",{},void 0,s.title),t.map(((e,t)=>(0,i.Z)("p",{},void 0,e))))}var x,y,w,k,C,S,E,L,T,P,O,R,A,I,D,j,z,U,M,B,q,H,F,Y=s(43345),V=s(96359),G=s(57026),$=s(60471),W=s(32233),Q=s(61340),K=s(77751),J=s(52753),X=s(78657),ee=s(59801),te=s(53904),se=s(90287),ae=s(55210),ie=class extends Y.Z{constructor(e){super(e),(0,o.Z)(this,"getFormdata",(()=>({threads:this.props.threads.map((e=>e.id)),title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed}))),(0,o.Z)(this,"handleSuccess",(e=>{this.props.threads.forEach((e=>{this.props.freezeThread(e.id),this.props.deleteThread(e)})),se.Z.dispatch(K.YP()),this.props.addThreads([e]),se.Z.dispatch((0,Q.V8)(this.props.route.category,this.props.categoriesMap)),ee.Z.hide()})),(0,o.Z)(this,"handleError",(e=>{400===e.status?e.best_answers||e.polls?ee.Z.show((0,i.Z)(J.ZP,{api:W.Z.get("MERGE_THREADS_API"),bestAnswers:e.best_answers,data:this.getFormdata(),polls:e.polls,onError:this.handleError,onSuccess:this.handleSuccess})):(this.setState({errors:Object.assign({},this.state.errors,e)}),te.Z.error(gettext("Form contains errors."))):403===e.status&&Array.isArray(e)?ee.Z.show((0,i.Z)(_,{errors:e})):e.best_answer?te.Z.error(e.best_answer[0]):e.poll?te.Z.error(e.poll[0]):te.Z.apiError(e)})),(0,o.Z)(this,"onCategoryChange",(e=>{const t=e.target.value,s={category:t};this.acl[t].can_pin_threads{if(e.level>0){const t=this.acl[e.id],s=!t.can_start_threads||e.is_closed&&!t.can_close_threads;this.categoryChoices.push({value:e.id,disabled:s,level:e.level-1,label:e.name}),s||this.state.category||(this.state.category=e.id)}})),this.isHiddenChoices=[{value:0,icon:"visibility",label:gettext("No")},{value:1,icon:"visibility_off",label:gettext("Yes")}],this.isClosedChoices=[{value:!1,icon:"lock_outline",label:gettext("No")},{value:!0,icon:"lock",label:gettext("Yes")}]}clean(){return!!this.isValid()||(te.Z.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}send(){return X.Z.post(W.Z.get("MERGE_THREADS_API"),this.getFormdata())}getWeightChoices(){const e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}renderWeightField(){return this.acl[this.state.category].can_pin_threads?(0,i.Z)(V.Z,{label:gettext("Thread weight"),for:"id_weight"},void 0,(0,i.Z)($.Z,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}renderHiddenField(){return this.acl[this.state.category].can_hide_threads?(0,i.Z)(V.Z,{label:gettext("Hide thread"),for:"id_is_hidden"},void 0,(0,i.Z)($.Z,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}renderClosedField(){return this.acl[this.state.category].can_close_threads?(0,i.Z)(V.Z,{label:gettext("Close thread"),for:"id_is_closed"},void 0,(0,i.Z)($.Z,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}renderForm(){return(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(V.Z,{label:gettext("Thread title"),for:"id_title",validation:this.state.errors.title},void 0,(0,i.Z)("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),x||(x=(0,i.Z)("div",{className:"clearfix"})),(0,i.Z)(V.Z,{label:gettext("Category"),for:"id_category",validation:this.state.errors.category},void 0,(0,i.Z)(G.Z,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.categoryChoices})),y||(y=(0,i.Z)("div",{className:"clearfix"})),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),(0,i.Z)("div",{className:"modal-footer"},void 0,(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,i.Z)(l.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Merge threads"))))}renderCantMergeMessage(){return(0,i.Z)("div",{className:"modal-body"},void 0,w||(w=(0,i.Z)("div",{className:"message-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,i.Z)("div",{className:"message-body"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("You can't move threads because there are no categories you are allowed to move them to.")),(0,i.Z)("p",{},void 0,gettext("You need permission to start threads in category to be able to merge threads to it.")),(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}getClassName(){return this.state.category?"modal-dialog":"modal-dialog modal-message"}render(){return(0,i.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,k||(k=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Merge threads"))),this.state.category?this.renderForm():this.renderCantMergeMessage()))}},oe=class extends Y.Z{constructor(e){super(e),(0,o.Z)(this,"handleSubmit",(e=>{e.preventDefault(),ee.Z.hide(),this.props.callApi([{op:"replace",path:"category",value:this.state.category},{op:"replace",path:"flatten-categories",value:null},{op:"add",path:"acl",value:!0}],gettext("Selected threads were moved."),(()=>{se.Z.dispatch((0,Q.V8)(this.props.route.category,this.props.categoriesMap));const e=se.Z.getState(),t=e.threads.map((e=>e.id));se.Z.dispatch(K.$6(e.selection.filter((e=>-1!==t.indexOf(e)))))}))})),this.state={category:null};const t={};for(const s in e.user.acl.categories){if(!e.user.acl.categories.hasOwnProperty(s))continue;const a=e.user.acl.categories[s];t[a.id]=a}this.categoryChoices=[],e.categories.forEach((e=>{if(e.level>0){const s=t[e.id],a=!s.can_start_threads||e.is_closed&&!s.can_close_threads;this.categoryChoices.push({value:e.id,disabled:a,level:e.level-1,label:e.name}),a||this.state.category||(this.state.category=e.id)}}))}getClassName(){return this.state.category?"modal-dialog":"modal-dialog modal-message"}renderForm(){return(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(V.Z,{label:gettext("New category"),for:"id_new_category"},void 0,(0,i.Z)(G.Z,{id:"id_new_category",onChange:this.bindInput("category"),value:this.state.category,choices:this.categoryChoices}))),(0,i.Z)("div",{className:"modal-footer"},void 0,(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,i.Z)("button",{className:"btn btn-primary"},void 0,gettext("Move threads"))))}renderCantMoveMessage(){return(0,i.Z)("div",{className:"modal-body"},void 0,C||(C=(0,i.Z)("div",{className:"message-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,i.Z)("div",{className:"message-body"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("You can't move threads because there are no categories you are allowed to move them to.")),(0,i.Z)("p",{},void 0,gettext("You need permission to start threads in category to be able to move threads to it.")),(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}render(){return(0,i.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,S||(S=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Move threads"))),this.state.category?this.renderForm():this.renderCantMoveMessage()))}},ne=class extends r().Component{constructor(){var e;super(...arguments),e=this,(0,o.Z)(this,"callApi",(function(t,s){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;e.props.threads.forEach((t=>{e.props.freezeThread(t.id)}));const o=e.props.threads.map((e=>e.id));t.push({op:"add",path:"acl",value:!0}),X.Z.patch(e.props.api,{ids:o,ops:t}).then((t=>{e.props.threads.forEach((t=>{e.props.freezeThread(t.id)})),t.forEach((t=>{e.props.updateThread(t)})),te.Z.success(s),a&&a()}),(t=>{if(e.props.threads.forEach((t=>{e.props.freezeThread(t.id)})),400!==t.status)return te.Z.apiError(t);let s=[],a={};e.props.threads.forEach((e=>{a[e.id]=e})),t.forEach((e=>{let{id:t,detail:i}=e;void 0!==a[t]&&s.push({errors:i,thread:a[t]})})),ee.Z.show((0,i.Z)(_,{errors:s}))}))})),(0,o.Z)(this,"pinGlobally",(()=>{this.callApi([{op:"replace",path:"weight",value:2}],gettext("Selected threads were pinned globally."))})),(0,o.Z)(this,"pinLocally",(()=>{this.callApi([{op:"replace",path:"weight",value:1}],gettext("Selected threads were pinned locally."))})),(0,o.Z)(this,"unpin",(()=>{this.callApi([{op:"replace",path:"weight",value:0}],gettext("Selected threads were unpinned."))})),(0,o.Z)(this,"approve",(()=>{this.callApi([{op:"replace",path:"is-unapproved",value:!1}],gettext("Selected threads were approved."))})),(0,o.Z)(this,"open",(()=>{this.callApi([{op:"replace",path:"is-closed",value:!1}],gettext("Selected threads were opened."))})),(0,o.Z)(this,"close",(()=>{this.callApi([{op:"replace",path:"is-closed",value:!0}],gettext("Selected threads were closed."))})),(0,o.Z)(this,"unhide",(()=>{this.callApi([{op:"replace",path:"is-hidden",value:!1}],gettext("Selected threads were unhidden."))})),(0,o.Z)(this,"hide",(()=>{this.callApi([{op:"replace",path:"is-hidden",value:!0}],gettext("Selected threads were hidden."))})),(0,o.Z)(this,"move",(()=>{ee.Z.show((0,i.Z)(oe,{callApi:this.callApi,categories:this.props.categories,categoriesMap:this.props.categoriesMap,route:this.props.route,user:this.props.user}))})),(0,o.Z)(this,"merge",(()=>{const e=[];if(this.props.threads.forEach((t=>{t.acl.can_merge||e.append({id:t.id,title:t.title,errors:[gettext("You don't have permission to merge this thread with others.")]})})),this.props.threads.length<2)te.Z.info(gettext("You have to select at least two threads to merge."));else{if(e.length)return void ee.Z.show((0,i.Z)(_,{errors:e}));ee.Z.show(r().createElement(ie,this.props))}})),(0,o.Z)(this,"delete",(()=>{if(!window.confirm(gettext("Are you sure you want to delete selected threads?")))return;this.props.threads.map((e=>{this.props.freezeThread(e.id)}));const e=this.props.threads.map((e=>e.id));X.Z.delete(this.props.api,e).then((()=>{this.props.threads.map((e=>{this.props.freezeThread(e.id),this.props.deleteThread(e)})),te.Z.success(gettext("Selected threads were deleted."))}),(e=>{if(400===e.status){const t=e.map((e=>e.id));this.props.threads.map((e=>{this.props.freezeThread(e.id),-1===t.indexOf(e.id)&&this.props.deleteThread(e)})),ee.Z.show((0,i.Z)(_,{errors:e}))}else te.Z.apiError(e)}))}))}render(){const{moderation:e,threads:t}=this.props,s=0==this.props.selection.length;return(0,i.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",onClick:()=>se.Z.dispatch(K.$6(t.map((e=>e.id))))},void 0,E||(E=(0,i.Z)("span",{className:"material-icon"},void 0,"check_box")),gettext("Select all"))),(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:()=>se.Z.dispatch(K.YP())},void 0,L||(L=(0,i.Z)("span",{className:"material-icon"},void 0,"check_box_outline_blank")),gettext("Select none"))),T||(T=(0,i.Z)("li",{role:"separator",className:"divider"})),!!e.can_pin_globally&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.pinGlobally},void 0,P||(P=(0,i.Z)("span",{className:"material-icon"},void 0,"bookmark")),gettext("Pin threads globally"))),!!e.can_pin&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.pinLocally},void 0,O||(O=(0,i.Z)("span",{className:"material-icon"},void 0,"bookmark_border")),gettext("Pin threads locally"))),!!e.can_pin&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.unpin},void 0,R||(R=(0,i.Z)("span",{className:"material-icon"},void 0,"panorama_fish_eye")),gettext("Unpin threads"))),!!e.can_move&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.move},void 0,A||(A=(0,i.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),gettext("Move threads"))),!!e.can_merge&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.merge},void 0,I||(I=(0,i.Z)("span",{className:"material-icon"},void 0,"call_merge")),gettext("Merge threads"))),!!e.can_approve&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.approve},void 0,D||(D=(0,i.Z)("span",{className:"material-icon"},void 0,"done")),gettext("Approve threads"))),!!e.can_close&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.open},void 0,j||(j=(0,i.Z)("span",{className:"material-icon"},void 0,"lock_open")),gettext("Open threads"))),!!e.can_close&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.close},void 0,z||(z=(0,i.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("Close threads"))),!!e.can_unhide&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.unhide},void 0,U||(U=(0,i.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Unhide threads"))),!!e.can_hide&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.hide},void 0,M||(M=(0,i.Z)("span",{className:"material-icon"},void 0,"visibility_off")),gettext("Hide threads"))),!!e.can_delete&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.delete},void 0,B||(B=(0,i.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete threads"))))}},re=e=>{let{api:t,categoriesMap:s,categories:a,threads:o,addThreads:n,freezeThread:r,updateThread:l,deleteThread:d,selection:c,moderation:p,route:u,user:h,disabled:m}=e;return(0,i.Z)("div",{className:"dropdown threads-moderation"},void 0,(0,i.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle",title:gettext("Moderation"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:m},void 0,q||(q=(0,i.Z)("span",{className:"material-icon"},void 0,"settings"))),(0,i.Z)(ne,{api:t,categories:a,categoriesMap:s,threads:o,addThreads:n,freezeThread:r,updateThread:l,deleteThread:d,selection:c,moderation:p,route:u,user:h,disabled:m}))},le=e=>{let{api:t,baseUrl:s,category:a,categories:o,categoriesMap:n,topCategory:r,topCategories:d,subCategory:c,subCategories:p,list:u,lists:h,threads:m,addThreads:Z,startThread:_,freezeThread:N,updateThread:x,deleteThread:y,selection:w,moderation:k,route:C,user:S,disabled:E}=e;return(0,i.Z)(g.o8,{},void 0,d.length>0&&(0,i.Z)(g.Z2,{},void 0,(0,i.Z)(g.Eg,{},void 0,(0,i.Z)(b,{allItems:gettext("All categories"),parentUrl:u.path,category:r,categories:d,list:u})),r&&p.length>0&&(0,i.Z)(g.Eg,{},void 0,(0,i.Z)(b,{allItems:gettext("All subcategories"),parentUrl:r.url.index,category:c,categories:p,list:u}))),h.length>1&&(0,i.Z)(g.Z2,{className:"hidden-xs"},void 0,(0,i.Z)(g.Eg,{},void 0,(0,i.Z)(f,{baseUrl:s,list:u,lists:h}))),H||(H=(0,i.Z)(g.tw,{})),!!S.id&&(0,i.Z)(g.Z2,{},void 0,(0,i.Z)(g.Eg,{},void 0,(0,i.Z)(l.Z,{className:"btn-primary btn-outline btn-block",disabled:E,onClick:()=>{v.Z.open(_||{mode:"START",config:misago.get("THREAD_EDITOR_API"),submit:misago.get("THREADS_API"),category:a.id})}},void 0,F||(F=(0,i.Z)("span",{className:"material-icon"},void 0,"chat")),gettext("Start thread"))),!!k.allow&&(0,i.Z)(g.Eg,{shrink:!0},void 0,(0,i.Z)(re,{api:t,categories:o,categoriesMap:n,threads:m.filter((e=>-1!==w.indexOf(e.id))),addThreads:Z,freezeThread:N,updateThread:x,deleteThread:y,selection:w,moderation:k,route:C,user:S,disabled:E}))))},de=class extends r().Component{render(){const{root:e}=this.props,{category:t,categories:s,categoriesMap:a}=this.props.route,o=ce(e,t,a);return(0,i.Z)(m.Z,{},void 0,(0,i.Z)(le,{api:this.props.api,baseUrl:t.url.index,category:t,categories:s,categoriesMap:a,topCategory:o,topCategories:s.filter((t=>t.parent===e.id)),subCategories:o?s.filter((e=>e.parent===o.id)):[],subCategory:2===t.level?t:null,subcategories:this.props.subcategories,list:this.props.route.list,lists:this.props.route.lists,threads:this.props.threads,addThreads:this.props.addThreads,startThread:this.props.startThread,freezeThread:this.props.freezeThread,deleteThread:this.props.deleteThread,updateThread:this.props.updateThread,selection:this.props.selection,moderation:this.props.moderation,route:this.props.route,user:this.props.user,disabled:!this.props.isLoaded||this.props.isBusy||this.props.busyThreads.length}),this.props.children)}};const ce=(e,t,s)=>t.parent?t.parent===e.id?t:s[t.parent]:null;function pe(e,t){let s={};return e.forEach((function(e){s[e.id]=e})),t.filter((function(e){return!s[e.id]||function(e,t){return[e.title===t.title,e.weight===t.weight,e.category===t.category,e.last_post===t.last_post,e.last_poster_name===t.last_poster_name].indexOf(!1)>=0}(s[e.id],e)}))}function ue(e){let t={allow:!1,can_approve:0,can_close:0,can_delete:0,can_hide:0,can_merge:0,can_move:0,can_pin:0,can_pin_globally:0,can_unhide:0};return e.forEach((function(e){e.is_unapproved&&e.acl.can_approve>t.can_approve&&(t.can_approve=e.acl.can_approve),e.acl.can_close>t.can_close&&(t.can_close=e.acl.can_close),e.acl.can_delete>t.can_delete&&(t.can_delete=e.acl.can_delete),e.acl.can_hide>t.can_hide&&(t.can_hide=e.acl.can_hide),e.acl.can_merge>t.can_merge&&(t.can_merge=e.acl.can_merge),e.acl.can_move>t.can_move&&(t.can_move=e.acl.can_move),e.acl.can_pin>t.can_pin&&(t.can_pin=e.acl.can_pin),e.acl.can_pin_globally>t.can_pin_globally&&(t.can_pin_globally=e.acl.can_pin_globally),e.is_hidden&&e.acl.can_unhide>t.can_unhide&&(t.can_unhide=e.acl.can_unhide),t.allow=t.can_approve||t.can_close||t.can_delete||t.can_hide||t.can_merge||t.can_move||t.can_pin||t.can_pin_globally||t.can_unhide})),t}var he=e=>{let{category:t,list:s,message:a}=e;return"all"===s.type?a?(0,i.Z)("li",{className:"list-group-item empty-message"},void 0,(0,i.Z)("p",{className:"lead"},void 0,a),(0,i.Z)("p",{},void 0,gettext("Why not start one yourself?"))):(0,i.Z)("li",{className:"list-group-item empty-message"},void 0,(0,i.Z)("p",{className:"lead"},void 0,t.special_role?gettext("There are no threads on this forum... yet!"):gettext("There are no threads in this category.")),(0,i.Z)("p",{},void 0,gettext("Why not start one yourself?"))):(0,i.Z)("li",{className:"list-group-item empty-message"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("No threads matching specified criteria were found.")))},me=s(50366),ve=s(16768),ge=e=>{let{thread:t}=e;return(0,i.Z)("a",{href:t.url.last_post,className:"threads-list-item-last-activity",title:interpolate(gettext("Last activity: %(timestamp)s"),{timestamp:t.last_post_on.format("LLL")},!0)},void 0,t.last_post_on.fromNow(!0))};const Ze=e=>{let t="threads-list-item-category threads-list-category-label";return e.color&&(t+=" threads-list-category-label-color"),t};var be,fe,_e,Ne,xe=e=>{let{parent:t,category:s}=e;return(0,i.Z)("span",{},void 0,t&&(0,i.Z)("a",{href:t.url.index,className:Ze(t)+" threads-list-item-parent-category",style:t.color?{"--label-color":t.color}:null,title:t.short_name?t.name:null},void 0,t.short_name||t.name),(0,i.Z)("a",{href:s.url.index,className:Ze(s),style:s.color?{"--label-color":s.color}:null,title:s.short_name?s.name:null},void 0,s.short_name||s.name))},ye=e=>{let{checked:t,disabled:s,thread:a}=e;return(0,i.Z)("button",{className:"btn btn-default btn-icon",type:"button",disabled:s,onClick:()=>se.Z.dispatch(K.wc(a.id))},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,t?"check_box":"check_box_outline_blank"))},we=e=>{let{thread:t}=e,s="threads-list-icon";return t.is_read||(s+=" threads-list-icon-new"),(0,i.Z)("a",{title:t.is_read?gettext("No new posts"):gettext("New posts"),href:t.is_read?t.url.last_post:t.url.new_post,className:s},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,t.is_read?"chat_bubble_outline":"chat_bubble"))},ke=s(19605),Ce=e=>{let{thread:t}=e;return t.last_poster?(0,i.Z)("a",{href:t.url.last_poster,className:"threads-list-item-last-poster",title:interpolate(gettext("Last post by: %(poster)s"),{poster:t.last_poster.username},!0)},void 0,(0,i.Z)(ke.ZP,{size:32,user:t.last_poster})):(0,i.Z)("span",{className:"threads-list-item-last-poster",title:interpolate(gettext("Last post by: %(poster)s"),{poster:t.last_poster_name},!0)},void 0,be||(be=(0,i.Z)(ke.ZP,{size:32})))};const Se={unsubscribe:null,notify:!1,email:!0};class Ee extends r().Component{constructor(e){super(e),(0,o.Z)(this,"update",(e=>{const{thread:t}=this.props;this.setState({loading:!0}),se.Z.dispatch((0,Q.r$)(t,{subscription:Se[e]})),X.Z.patch(t.api.index,[{op:"replace",path:"subscription",value:e}]).then((()=>{}),(e=>{se.Z.dispatch((0,Q.r$)(t,{subscription:Se[t.subscription]})),te.Z.apiError(e)})).then((()=>this.setState({loading:!1})))})),(0,o.Z)(this,"render",(()=>{const{loading:e}=this.state,{disabled:t,thread:s}=this.props;return(0,i.Z)("ul",{className:"dropdown-menu dropdown-menu-right"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn-link",disabled:t||e||null===s.subscription,onClick:()=>this.update("unsubscribe")},void 0,fe||(fe=(0,i.Z)("span",{className:"material-icon"},void 0,"star_border")),gettext("Unsubscribe"))),(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn-link",disabled:t||e||!1===s.subscription,onClick:()=>this.update("notify")},void 0,_e||(_e=(0,i.Z)("span",{className:"material-icon"},void 0,"star_half")),gettext("Subscribe with alert"))),(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn-link",disabled:t||e||!0===s.subscription,onClick:()=>this.update("email")},void 0,Ne||(Ne=(0,i.Z)("span",{className:"material-icon"},void 0,"star")),gettext("Subscribe with e-mail"))))})),this.state={loading:!1}}}var Le=Ee;var Te,Pe,Oe,Re,Ae,Ie,De,je,ze,Ue,Me,Be=e=>{let{disabled:t,thread:s}=e;return(0,i.Z)("div",{className:"dropdown"},void 0,(0,i.Z)("button",{className:"btn btn-default btn-icon",type:"button",title:(a=s.subscription,!0===a?gettext("Subscribed to e-mails"):!1===a?gettext("Subscribed to alerts"):gettext("Not subscribed")),disabled:t,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,(e=>!0===e?"star":!1===e?"star_half":"star_border")(s.subscription))),(0,i.Z)(Le,{disabled:t,thread:s}));var a},qe=e=>{let{activeCategory:t,categories:s,showOptions:a,showSubscription:o,thread:n,isBusy:r,isSelected:l}=e,d=null,c=null;t.id!==n.category&&(c=s[n.category],c.parent&&c.parent!==t.id&&s[c.parent]&&!s[c.parent].special_role&&(d=s[c.parent]));const p=n.is_closed||n.is_hidden||n.is_unapproved||n.weight>0||n.best_answer||n.has_poll||n.has_unapproved_posts,u=!!a&&n.is_new;return(0,i.Z)("li",{className:"list-group-item threads-list-item"+(r?" threads-list-item-is-busy":"")},void 0,(0,i.Z)("div",{className:"threads-list-item-top-row"},void 0,a&&(0,i.Z)("div",{className:"threads-list-item-col-icon"},void 0,(0,i.Z)(we,{thread:n})),(0,i.Z)("div",{className:"threads-list-item-col-title"},void 0,(0,i.Z)("a",{href:n.url.index,className:"threads-list-item-title"},void 0,n.title),(0,i.Z)("a",{href:u?n.url.new_post:n.url.index,className:"threads-list-item-title-sm"+(u?" threads-list-item-title-new":"")},void 0,n.title)),a&&n.moderation.length>0&&(0,i.Z)("div",{className:"threads-list-item-col-checkbox-sm"},void 0,(0,i.Z)(ye,{checked:l,disabled:r,thread:n}))),(0,i.Z)("div",{className:"threads-list-item-bottom-row"},void 0,p&&(0,i.Z)("div",{className:"threads-list-item-col-flags"},void 0,(0,i.Z)(me.Z,{thread:n})),!!c&&(0,i.Z)("div",{className:"threads-list-item-col-category"},void 0,(0,i.Z)(xe,{parent:d,category:c})),Te||(Te=(0,i.Z)("div",{className:"threads-list-item-col-spacer-xs"})),(0,i.Z)("div",{className:"threads-list-item-col-replies"},void 0,(0,i.Z)(ve.Z,{thread:n})),(0,i.Z)("div",{className:"threads-list-item-col-last-poster"},void 0,(0,i.Z)(Ce,{thread:n})),(0,i.Z)("div",{className:"threads-list-item-col-last-activity"},void 0,(0,i.Z)(ge,{thread:n})),a&&o&&(0,i.Z)("div",{className:"threads-list-item-col-subscription"},void 0,(0,i.Z)(Be,{disabled:r,thread:n})),a&&n.moderation.length>0&&(0,i.Z)("div",{className:"threads-list-item-col-checkbox"},void 0,(0,i.Z)(ye,{checked:l,disabled:r,thread:n}))))},He=e=>{let{width:t}=e;return(0,i.Z)("span",{className:"ui-preview-text",style:{width:t+"px"}},void 0," ")},Fe=e=>{let{showOptions:t}=e;return(0,i.Z)("div",{className:"threads-list threads-list-loader"},void 0,(0,i.Z)("ul",{className:"list-group"},void 0,(0,i.Z)("li",{className:"list-group-item threads-list-item"},void 0,(0,i.Z)("div",{className:"threads-list-item-top-row"},void 0,t&&(Pe||(Pe=(0,i.Z)("div",{className:"threads-list-item-col-icon"},void 0,(0,i.Z)("span",{className:"threads-list-icon ui-preview-img"})))),Oe||(Oe=(0,i.Z)("div",{className:"threads-list-item-col-title"},void 0,(0,i.Z)("span",{className:"threads-list-item-title"},void 0,(0,i.Z)(He,{width:"90"})," ",(0,i.Z)(He,{width:"40"})," ",(0,i.Z)(He,{width:"120"})),(0,i.Z)("span",{className:"threads-list-item-title-sm"},void 0,(0,i.Z)(He,{width:"90"})," ",(0,i.Z)(He,{width:"40"})," ",(0,i.Z)(He,{width:"120"}))))),Re||(Re=(0,i.Z)("div",{className:"threads-list-item-bottom-row"},void 0,(0,i.Z)("div",{className:"threads-list-item-col-category"},void 0,(0,i.Z)(He,{width:"70"})),(0,i.Z)("div",{className:"threads-list-item-col-replies"},void 0,(0,i.Z)(He,{width:"50"})),(0,i.Z)("div",{className:"threads-list-item-col-last-poster"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-poster"},void 0,(0,i.Z)(ke.ZP,{size:32}))),(0,i.Z)("div",{className:"threads-list-item-col-last-activity"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-activity"},void 0,(0,i.Z)(He,{width:"50"})))))),(0,i.Z)("li",{className:"list-group-item threads-list-item"},void 0,(0,i.Z)("div",{className:"threads-list-item-top-row"},void 0,t&&(Ae||(Ae=(0,i.Z)("div",{className:"threads-list-item-col-icon"},void 0,(0,i.Z)("span",{className:"threads-list-icon ui-preview-img"})))),Ie||(Ie=(0,i.Z)("div",{className:"threads-list-item-col-title"},void 0,(0,i.Z)("span",{className:"threads-list-item-title"},void 0,(0,i.Z)(He,{width:"120"})," ",(0,i.Z)(He,{width:"30"})," ",(0,i.Z)(He,{width:"60"})),(0,i.Z)("span",{className:"threads-list-item-title-sm"},void 0,(0,i.Z)(He,{width:"120"})," ",(0,i.Z)(He,{width:"30"})," ",(0,i.Z)(He,{width:"60"}))))),De||(De=(0,i.Z)("div",{className:"threads-list-item-bottom-row"},void 0,(0,i.Z)("div",{className:"threads-list-item-col-category"},void 0,(0,i.Z)(He,{width:"55"})),(0,i.Z)("div",{className:"threads-list-item-col-replies"},void 0,(0,i.Z)(He,{width:"60"})),(0,i.Z)("div",{className:"threads-list-item-col-last-poster"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-poster"},void 0,(0,i.Z)(ke.ZP,{size:32}))),(0,i.Z)("div",{className:"threads-list-item-col-last-activity"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-activity"},void 0,(0,i.Z)(He,{width:"70"})))))),(0,i.Z)("li",{className:"list-group-item threads-list-item"},void 0,(0,i.Z)("div",{className:"threads-list-item-top-row"},void 0,t&&(je||(je=(0,i.Z)("div",{className:"threads-list-item-col-icon"},void 0,(0,i.Z)("span",{className:"threads-list-icon ui-preview-img"})))),ze||(ze=(0,i.Z)("div",{className:"threads-list-item-col-title"},void 0,(0,i.Z)("span",{className:"threads-list-item-title"},void 0,(0,i.Z)(He,{width:"40"})," ",(0,i.Z)(He,{width:"120"})," ",(0,i.Z)(He,{width:"80"})),(0,i.Z)("span",{className:"threads-list-item-title-sm"},void 0,(0,i.Z)(He,{width:"40"})," ",(0,i.Z)(He,{width:"120"})," ",(0,i.Z)(He,{width:"80"}))))),Ue||(Ue=(0,i.Z)("div",{className:"threads-list-item-bottom-row"},void 0,(0,i.Z)("div",{className:"threads-list-item-col-category"},void 0,(0,i.Z)(He,{width:"75"})),(0,i.Z)("div",{className:"threads-list-item-col-replies"},void 0,(0,i.Z)(He,{width:"40"})),(0,i.Z)("div",{className:"threads-list-item-col-last-poster"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-poster"},void 0,(0,i.Z)(ke.ZP,{size:32}))),(0,i.Z)("div",{className:"threads-list-item-col-last-activity"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-activity"},void 0,(0,i.Z)(He,{width:"60"}))))))))},Ye=e=>{let{threads:t,onClick:s}=e;return(0,i.Z)("li",{className:"list-group-item threads-list-update-prompt"},void 0,(0,i.Z)("button",{type:"button",className:"btn btn-block threads-list-update-prompt-btn",onClick:s},void 0,Me||(Me=(0,i.Z)("span",{className:"material-icon"},void 0,"cached")),(0,i.Z)("span",{className:"threads-list-update-prompt-message"},void 0,interpolate(ngettext("There is %(threads)s new or updated thread. Click here to show it.","There are %(threads)s new or updated threads. Click here to show them.",t),{threads:t},!0))))},Ve=e=>{let{list:t,categories:s,category:a,threads:o,busyThreads:n,selection:r,isLoaded:l,showOptions:d,updatedThreads:c,applyUpdate:p,emptyMessage:u}=e;return l?(0,i.Z)("div",{className:"threads-list"},void 0,o.length>0?(0,i.Z)("ul",{className:"list-group"},void 0,c>0&&(0,i.Z)(Ye,{threads:c,onClick:p}),o.map((e=>(0,i.Z)(qe,{activeCategory:a,categories:s,thread:e,showOptions:d,showSubscription:d&&"subscribed"===t.type,isBusy:n.indexOf(e.id)>=0,isSelected:r.indexOf(e.id)>=0},e.id)))):(0,i.Z)("ul",{className:"list-group"},void 0,c>0&&(0,i.Z)(Ye,{threads:c,onClick:p}),(0,i.Z)(he,{category:a,list:t,message:u}))):(0,i.Z)(Fe,{showOptions:d})},Ge=s(82125),$e=s(55547),We=s(53328),Qe=s(20370),Ke=s(99755),Je=class extends Ge.Z{constructor(e){super(e),(0,o.Z)(this,"loadMore",(()=>{this.setState({isBusy:!0}),this.loadThreads(this.getCategory(),this.state.next)})),(0,o.Z)(this,"pollResponse",(e=>{this.setState({diff:Object.assign({},e,{results:pe(this.props.threads,e.results)})})})),(0,o.Z)(this,"addThreads",(e=>{se.Z.dispatch((0,Q.R3)(e,this.getSorting()))})),(0,o.Z)(this,"applyDiff",(()=>{this.addThreads(this.state.diff.results),this.setState(Object.assign({},this.state.diff,{moderation:ue(se.Z.getState().threads),diff:{results:[]}}))})),(0,o.Z)(this,"freezeThread",(e=>{this.setState((function(t){return{busyThreads:Qe.ZN(t.busyThreads,e)}}))})),(0,o.Z)(this,"updateThread",(e=>{se.Z.dispatch((0,Q.r$)(e,e,this.getSorting()))})),(0,o.Z)(this,"deleteThread",(e=>{se.Z.dispatch((0,Q.l8)(e))})),this.state={isMounted:!0,isLoaded:!1,isBusy:!1,diff:{results:[]},moderation:[],busyThreads:[],dropdown:!1,subcategories:[],next:0};let t=this.getCategory();W.Z.has("THREADS")?this.initWithPreloadedData(t,W.Z.get("THREADS")):this.initWithoutPreloadedData(t)}getCategory(){return this.props.route.category.special_role?null:this.props.route.category.id}initWithPreloadedData(e,t){this.state=Object.assign(this.state,{moderation:ue(t.results),subcategories:t.subcategories,next:t.next}),this.startPolling(e)}initWithoutPreloadedData(e){this.loadThreads(e)}loadThreads(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;X.Z.get(this.props.options.api,{category:e,list:this.props.route.list.type,start:t||0},"threads").then((s=>{this.state.isMounted&&(0===t?se.Z.dispatch((0,Q.ZB)(s.results)):se.Z.dispatch((0,Q.R3)(s.results,this.getSorting())),this.setState({isLoaded:!0,isBusy:!1,moderation:ue(se.Z.getState().threads),subcategories:s.subcategories,next:s.next}),this.startPolling(e))}),(e=>{te.Z.apiError(e)}))}startPolling(e){$e.Z.start({poll:"threads",url:this.props.options.api,data:{category:e,list:this.props.route.list.type},frequency:12e4,update:this.pollResponse})}componentDidMount(){this.setPageTitle(),W.Z.has("THREADS")&&(se.Z.dispatch((0,Q.ZB)(W.Z.pop("THREADS").results)),this.setState({isLoaded:!0})),se.Z.dispatch(K.YP())}componentWillUnmount(){this.state.isMounted=!1,$e.Z.stop("threads")}getTitle(){return this.props.options.title?this.props.options.title:function(e){return e.category.level?e.category.name:W.Z.get("THREADS_ON_INDEX")?W.Z.get("SETTINGS").index_header?W.Z.get("SETTINGS").index_header:W.Z.get("SETTINGS").forum_name:gettext("Threads")}(this.props.route)}setPageTitle(){this.props.route.category.level||!W.Z.get("THREADS_ON_INDEX")?We.Z.set(function(e){return e.category.level?e.list.path?{title:e.list.longName,parent:e.category.name}:{title:e.category.name}:W.Z.get("THREADS_ON_INDEX")?e.list.path?{title:e.list.longName}:null:e.list.path?{title:e.list.longName,parent:gettext("Threads")}:{title:gettext("Threads")}}(this.props.route)):this.props.options.title?We.Z.set(this.props.options.title):W.Z.get("SETTINGS").index_title?document.title=W.Z.get("SETTINGS").index_title:document.title=W.Z.get("SETTINGS").forum_name}getSorting(){return this.props.route.category.level?p:c}getMoreButton(){return this.state.next?(0,i.Z)("div",{className:"pager-more"},void 0,(0,i.Z)(l.Z,{className:"btn btn-default btn-outline",loading:this.state.isBusy||this.state.busyThreads.length,onClick:this.loadMore},void 0,gettext("Show more"))):null}getClassName(){let e="page page-threads";var t;return e+=" page-threads-"+this.props.route.list.type,(t=this.props).route.category.level||!W.Z.get("THREADS_ON_INDEX")||t.options.title||(e+=" page-threads-index"),this.props.route.category.css_class&&(e+=" page-threads-"+this.props.route.category.css_class),e}render(){const e=this.props.route.categories[0],{category:t,list:s}=this.props.route,a=t.special_role;return(0,i.Z)("div",{className:this.getClassName()},void 0,"root_category"==a&&W.Z.get("THREADS_ON_INDEX")&&W.Z.get("SETTINGS").index_header&&(0,i.Z)(Ke.Iv,{header:W.Z.get("SETTINGS").index_header,message:t.description&&(0,i.Z)(Ke.Ql,{message:t.description.html}),styleName:"forum-index"}),"root_category"==a&&!W.Z.get("THREADS_ON_INDEX")&&(0,i.Z)(Ke.Iv,{header:gettext("Threads"),styleName:"threads"}),"private_threads"==a&&(0,i.Z)(Ke.Iv,{header:this.props.options.title,message:this.props.options.pageLead&&(0,i.Z)(Ke.bM,{},void 0,(0,i.Z)("p",{},void 0,this.props.options.pageLead)),styleName:"private-threads"}),!a&&(0,i.Z)(Ke.Iv,{header:t.name,message:t.description&&(0,i.Z)(Ke.Ql,{message:t.description.html}),styleName:t.css_class||"category-threads"}),(0,i.Z)(de,{api:this.props.options.api,root:e,route:this.props.route,user:this.props.user,pageLead:this.props.options.pageLead,threads:this.props.threads,threadsCount:this.state.count,moderation:this.state.moderation,selection:this.props.selection,busyThreads:this.state.busyThreads,addThreads:this.addThreads,startThread:this.props.options.startThread,freezeThread:this.freezeThread,deleteThread:this.deleteThread,updateThread:this.updateThread,isLoaded:this.state.isLoaded,isBusy:this.state.isBusy},void 0,(0,i.Z)(Ve,{category:t,categories:this.props.route.categoriesMap,list:s,selection:this.props.selection,threads:this.props.threads,updatedThreads:this.state.diff.results.length,applyUpdate:this.applyDiff,showOptions:!!this.props.user.id,isLoaded:this.state.isLoaded,busyThreads:this.state.busyThreads,emptyMessage:this.props.options.emptyMessage}),this.getMoreButton()))}};function Xe(e,t){let s=function(e){let t=[{type:"all",path:"",name:gettext("All"),longName:gettext("All threads")}];return e.id&&(t.push({type:"my",path:"my/",name:gettext("My"),longName:gettext("My threads")}),t.push({type:"new",path:"new/",name:gettext("New"),longName:gettext("New threads")}),t.push({type:"unread",path:"unread/",name:gettext("Unread"),longName:gettext("Unread threads")}),t.push({type:"subscribed",path:"subscribed/",name:gettext("Subscribed"),longName:gettext("Subscribed threads")}),e.acl.can_see_unapproved_content_lists&&t.push({type:"unapproved",path:"unapproved/",name:gettext("Unapproved"),longName:gettext("Unapproved content")})),t}(e),i=[],o={};return W.Z.get("CATEGORIES").forEach((function(e){s.forEach((function(n){var r;o[e.id]=e,i.push({path:e.url.index+n.path,component:(0,a.$j)((r=t,function(e){return{options:r,selection:e.selection,threads:e.threads,tick:e.tick.tick,user:e.auth.user}}))(Je),categories:W.Z.get("CATEGORIES"),categoriesMap:o,category:e,lists:s,list:n})}))})),i}var et=s(39633);const tt="misago:private-threads";function st(e){return e.get("CURRENT_LINK").substr(0,tt.length)===tt?{api:e.get("PRIVATE_THREADS_API"),startThread:{mode:"START_PRIVATE",submit:W.Z.get("PRIVATE_THREADS_API")},title:gettext("Private threads"),pageLead:gettext("Private threads are threads which only those that started them and those they have invited may see and participate in."),emptyMessage:gettext("You aren't participating in any private threads.")}:{api:e.get("THREADS_API")}}W.Z.addInitializer({name:"component:threads",initializer:function(e){e.has("THREADS")&&e.has("CATEGORIES")&&(0,et.Z)({paths:Xe(e.get("user"),st(e))})},after:"store"})},47806:function(e,t,s){"use strict";var a=s(37424),i=s(32233),o=s(22928),n=s(57588),r=s.n(n),l=s(19605),d=s(4942),c=s(78657),p=s(53904);function u(e){return e.filter((e=>e.results.count>0)).map((e=>Object.assign({},e,{count:e.results.count,results:e.results.results.slice(0,5)})))}var h=s(87462);const m="HEADER",v="RESULT",g="FOOTER";function Z(e){let{value:t,onChange:s}=e;return(0,o.Z)("input",{"aria-haspopup":"true","aria-expanded":"false","aria-controls":"dropdown-menu dropdown-search-results",autoComplete:"off",className:"form-control",value:t,onChange:s,placeholder:gettext("Search"),role:"combobox",type:"text"})}function b(e){let{children:t,onChange:s,query:a}=e;return(0,o.Z)("ul",{className:"dropdown-menu dropdown-search-results",role:"menu"},void 0,(0,o.Z)("li",{className:"form-group"},void 0,(0,o.Z)(Z,{value:a,onChange:s})),t)}function f(){return(0,o.Z)("li",{className:"dropdown-search-message"},void 0,gettext("Search returned no results."))}var _,N=s(37848);function x(e){let{message:t}=e;return _||(_=(0,o.Z)("li",{className:"dropdown-search-loader"},void 0,(0,o.Z)(N.Z,{})))}function y(e){let{provider:t,query:s}=e;const a=t.url+"?q="+encodeURI(s),i=ngettext('See full "%(provider)s" results page with %(count)s result.','See full "%(provider)s" results page with %(count)s results.',t.count);return(0,o.Z)("li",{className:"dropdown-search-footer"},void 0,(0,o.Z)("a",{href:a},void 0,interpolate(i,{count:t.count,provider:t.name},!0)))}function w(e){let{provider:t}=e;return(0,o.Z)("li",{className:"dropdown-search-header"},void 0,t.name)}var k,C,S,E=s(30381),L=s.n(E),T=s(19755);function P(e){let{result:t}=e;const{poster:s,thread:a}=t,i=gettext("Posted by %(poster)s on %(posted_on)s in %(category)s.");return(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:t.url.index,className:"dropdown-search-thread"},void 0,(0,o.Z)("h5",{},void 0,a.title),(0,o.Z)("small",{className:"dropdown-search-post-content"},void 0,T(t.content).text()),(0,o.Z)("small",{className:"dropdown-search-post-footer"},void 0,interpolate(i,{category:t.category.name,posted_on:L()(t.posted_on).format("LL"),poster:t.poster_name},!0))))}function O(e){let{result:t}=e;const{rank:s}=t,a=gettext("%(title)s, joined on %(joined_on)s"),i=t.title||s.title||s.name;return(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:t.url,className:"dropdown-search-user"},void 0,(0,o.Z)("div",{className:"media"},void 0,(0,o.Z)("div",{className:"media-left"},void 0,(0,o.Z)(l.ZP,{size:38,user:t})),(0,o.Z)("div",{className:"media-body"},void 0,(0,o.Z)("h5",{className:"media-heading"},void 0,t.username),(0,o.Z)("small",{},void 0,interpolate(a,{title:i,joined_on:L()(t.joined_on).format("LL")},!0))))))}function R(e){let{provider:t,result:s}=e;return"threads"===t.id?(0,o.Z)(P,{result:s}):(0,o.Z)(O,{result:s})}function A(e){let{provider:t,result:s,type:a,query:i}=e;return a===m?(0,o.Z)(w,{provider:t}):a===g?(0,o.Z)(y,{provider:t,query:i}):(0,o.Z)(R,{provider:t,result:s})}function I(e,t){const s=e.results.length;for(var a=0;a{const{type:t,provider:s,result:a}=e;return t===v?r().createElement(A,(0,h.Z)({key:[s.id,t,a.id].join("_")},e)):r().createElement(A,(0,h.Z)({key:[s.id,t].join("_"),query:i},e))})))}return t?(0,o.Z)(b,{onChange:s,query:i},void 0,k||(k=(0,o.Z)(x,{}))):(0,o.Z)(b,{onChange:s,query:i},void 0,C||(C=(0,o.Z)(f,{})))}var j=class extends r().Component{constructor(){super(),(0,d.Z)(this,"onToggle",(e=>{this.setState(((e,t)=>(e.isOpen||window.setTimeout((()=>{this.container.querySelector("input").focus()}),100),{isOpen:!e.isOpen})))})),(0,d.Z)(this,"onDocumentMouseDown",(e=>{let t=!0,s=e.target;for(;null!==s&&s!==document;){if(s===this.container)return void(t=!1);s=s.parentNode}t&&this.setState({isOpen:!1})})),(0,d.Z)(this,"onEscape",(e=>{"Escape"===e.key&&this.setState({isOpen:!1})})),(0,d.Z)(this,"onChange",(e=>{const t=e.target.value;this.setState({query:t}),this.loadResults(t.trim())})),this.state={isLoading:!1,isOpen:!1,query:"",results:[]},this.intervalId=null}componentDidMount(){document.addEventListener("mousedown",this.onDocumentMouseDown),document.addEventListener("keydown",this.onEscape)}componentWillUnmount(){document.removeEventListener("mousedown",this.onDocumentMouseDown),document.removeEventListener("keydown",this.onEscape)}loadResults(e){if(!e.length)return;const t=300+300*Math.random();this.intervalId&&window.clearTimeout(this.intervalId),this.setState({isLoading:!0}),this.intervalId=window.setTimeout((()=>{c.Z.get(i.Z.get("SEARCH_API"),{q:e}).then((e=>{this.setState({intervalId:null,isLoading:!1,results:u(e)})}),(e=>{p.Z.apiError(e),this.setState({intervalId:null,isLoading:!1,results:[]})}))}),t)}render(){let e="navbar-search dropdown";return this.state.isOpen&&(e+=" open"),r().createElement("div",{className:e,ref:e=>this.container=e},(0,o.Z)("a",{"aria-haspopup":"true","aria-expanded":"false",className:"navbar-icon","data-toggle":"dropdown",href:i.Z.get("SEARCH_URL"),onClick:this.onToggle},void 0,S||(S=(0,o.Z)("i",{className:"material-icon"},void 0,"search"))),(0,o.Z)(D,{isLoading:this.state.isLoading,onChange:this.onChange,results:this.state.results,query:this.state.query}))}},z=s(82211),U=s(43345),M=s(96359),B=s(59940);const q=["progress-bar-danger","progress-bar-warning","progress-bar-warning","progress-bar-primary","progress-bar-success"],H=[gettext("Entered password is very weak."),gettext("Entered password is weak."),gettext("Entered password is average."),gettext("Entered password is strong."),gettext("Entered password is very strong.")];var F,Y,V,G=class extends r().Component{constructor(e){super(e),this._score=0,this._password=null,this._inputs=[],this.state={loaded:!1}}componentDidMount(){B.Z.load().then((()=>{this.setState({loaded:!0})}))}getScore(e,t){let s=!1;return e!==this._password&&(s=!0),t.length!==this._inputs.length?s=!0:t.map(((e,t)=>{e.trim()!==this._inputs[t]&&(s=!0)})),s&&(this._score=B.Z.scorePassword(e,t),this._password=e,this._inputs=t.map((function(e){return e.trim()}))),this._score}render(){if(!this.state.loaded)return null;let e=this.getScore(this.props.password,this.props.inputs);return(0,o.Z)("div",{className:"help-block password-strength"},void 0,(0,o.Z)("div",{className:"progress"},void 0,(0,o.Z)("div",{className:"progress-bar "+q[e],style:{width:20+20*e+"%"},role:"progress-bar","aria-valuenow":e,"aria-valuemin":"0","aria-valuemax":"4"},void 0,(0,o.Z)("span",{className:"sr-only"},void 0,H[e]))),(0,o.Z)("p",{className:"text-small"},void 0,H[e]))}},$=s(26106),W=s(47235),Q=s(98274),K=s(93825),J=s(59801),X=s(93051),ee=s(55210);class te extends U.Z{constructor(e){super(e),(0,d.Z)(this,"handlePrivacyPolicyChange",(e=>{const t=e.target.value;this.handleToggleAgreement("privacyPolicy",t)})),(0,d.Z)(this,"handleTermsOfServiceChange",(e=>{const t=e.target.value;this.handleToggleAgreement("termsOfService",t)})),(0,d.Z)(this,"handleToggleAgreement",((e,t)=>{this.setState(((s,a)=>{if(null===s[e])return{errors:{...s.errors,[e]:null},[e]:t};const i=this.state.validators[e][0];return{errors:{...s.errors,[e]:[i(null)]},[e]:null}}))}));const{username:t,password:s}=this.props.criteria;let a=0;s.forEach((e=>{"MinimumLengthValidator"===e.name&&(a=e.min_length)}));const o={username:[ee.lG(),ee.HR(t.min_length),ee.gS(t.max_length)],email:[ee.Do()],password:[ee.Vb(a)],captcha:K.ZP.validator()};i.Z.get("TERMS_OF_SERVICE_ID")&&(o.termsOfService=[ee.fT()]),i.Z.get("PRIVACY_POLICY_ID")&&(o.privacyPolicy=[ee.jA()]),this.state={isLoading:!1,username:"",email:"",password:"",captcha:"",termsOfService:null,privacyPolicy:null,validators:o,errors:{}}}clean(){return!!this.isValid()||(p.Z.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}send(){return c.Z.post(i.Z.get("USERS_API"),{username:this.state.username,email:this.state.email,password:this.state.password,captcha:this.state.captcha,terms_of_service:this.state.termsOfService,privacy_policy:this.state.privacyPolicy})}handleSuccess(e){this.props.callback(e)}handleError(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),e.__all__&&e.__all__.length>0?p.Z.error(e.__all__[0]):p.Z.error(gettext("Form contains errors."))):403===e.status&&e.ban?((0,X.Z)(e.ban),J.Z.hide()):p.Z.apiError(e)}render(){return(0,o.Z)("div",{className:"modal-dialog modal-register",role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,F||(F=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Register"))),(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("input",{type:"type",style:{display:"none"}}),(0,o.Z)("input",{type:"password",style:{display:"none"}}),(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(W.Z,{buttonClassName:"col-xs-12 col-sm-6",buttonLabel:gettext("Join with %(site)s"),formLabel:gettext("Or create forum account:")}),(0,o.Z)(M.Z,{label:gettext("Username"),for:"id_username",validation:this.state.errors.username},void 0,(0,o.Z)("input",{type:"text",id:"id_username",className:"form-control","aria-describedby":"id_username_status",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username})),(0,o.Z)(M.Z,{label:gettext("E-mail"),for:"id_email",validation:this.state.errors.email},void 0,(0,o.Z)("input",{type:"text",id:"id_email",className:"form-control","aria-describedby":"id_email_status",disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email})),(0,o.Z)(M.Z,{label:gettext("Password"),for:"id_password",validation:this.state.errors.password,extra:(0,o.Z)(G,{password:this.state.password,inputs:[this.state.username,this.state.email]})},void 0,(0,o.Z)("input",{type:"password",id:"id_password",className:"form-control","aria-describedby":"id_password_status",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password})),K.ZP.component({form:this}),(0,o.Z)($.Z,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,o.Z)(z.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Register account"))))))}}class se extends r().Component{getLead(){return"user"===this.props.activation?gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in."):"admin"===this.props.activation?gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in."):void 0}getSubscript(){return"user"===this.props.activation?gettext("We have sent an e-mail to %(email)s with link that you have to click to activate your account."):"admin"===this.props.activation?gettext("We will send an e-mail to %(email)s when this takes place."):void 0}render(){return(0,o.Z)("div",{className:"modal-dialog modal-message modal-register",role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Y||(Y=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Registration complete"))),(0,o.Z)("div",{className:"modal-body"},void 0,V||(V=(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,interpolate(this.getLead(),{username:this.props.username},!0)),(0,o.Z)("p",{},void 0,interpolate(this.getSubscript(),{email:this.props.email},!0)),(0,o.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))))}}var ae,ie,oe,ne,re,le=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"completeRegistration",(e=>{"active"===e.activation?(J.Z.hide(),Q.Z.signIn(e)):this.setState({complete:e})})),this.state={complete:!1}}render(){return this.state.complete?(0,o.Z)(se,{activation:this.state.complete.activation,email:this.state.complete.email,username:this.state.complete.username}):r().createElement(te,(0,h.Z)({callback:this.completeRegistration},this.props))}},de=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"showRegisterForm",(()=>{"closed"===misago.get("SETTINGS").account_activation?p.Z.info(gettext("New registrations are currently disabled.")):this.state.isLoaded?J.Z.show((0,o.Z)(le,{criteria:this.state.criteria})):(this.setState({isLoading:!0}),Promise.all([K.ZP.load(),c.Z.get(misago.get("AUTH_CRITERIA_API"))]).then((e=>{this.setState({isLoading:!1,isLoaded:!0,criteria:e[1]}),J.Z.show((0,o.Z)(le,{criteria:e[1]}))}),(()=>{this.setState({isLoading:!1}),p.Z.error(gettext("Registration is currently unavailable due to an error."))})))})),this.state={isLoading:!1,isLoaded:!1,criteria:null}}getClassName(){return this.props.className+(this.state.isLoading?" btn-loading":"")}render(){return(0,o.Z)("button",{className:"btn "+this.getClassName(),disabled:this.state.isLoading,onClick:this.showRegisterForm,type:"button"},void 0,gettext("Register"),this.state.isLoading?ae||(ae=(0,o.Z)(N.Z,{})):null)}},ce=s(14467),pe=s(8621);class ue extends r().Component{showSignInModal(){J.Z.show(ce.Z)}componentDidMount(){"login"===new URLSearchParams(window.location.search).get("modal")&&window.setTimeout(this.showSignInModal,500)}render(){const e=i.Z.get("SETTINGS").DELEGATE_AUTH;return(0,o.Z)("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},void 0,(0,o.Z)("li",{className:"guest-preview"},void 0,(0,o.Z)("h4",{},void 0,gettext("You are browsing as guest.")),(0,o.Z)("p",{},void 0,gettext("Sign in or register to start and participate in discussions.")),e?(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-xs-12"},void 0,(0,o.Z)("a",{className:"btn btn-default btn-sign-in btn-block",href:i.Z.get("SETTINGS").LOGIN_URL},void 0,gettext("Sign in")))):(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-xs-6"},void 0,(0,o.Z)("button",{className:"btn btn-default btn-sign-in btn-block",onClick:this.showSignInModal,type:"button"},void 0,gettext("Sign in"))),(0,o.Z)("div",{className:"col-xs-6"},void 0,(0,o.Z)(de,{className:"btn-primary btn-register btn-block"},void 0,gettext("Register"))))))}}class he extends ue{render(){return i.Z.get("SETTINGS").DELEGATE_AUTH?(0,o.Z)("div",{className:"nav nav-guest"},void 0,(0,o.Z)("a",{className:"btn navbar-btn btn-default btn-sign-in",href:i.Z.get("SETTINGS").LOGIN_URL},void 0,gettext("Sign in")),ie||(ie=(0,o.Z)("div",{className:"navbar-left"},void 0,(0,o.Z)(j,{})))):(0,o.Z)("div",{className:"nav nav-guest"},void 0,(0,o.Z)("button",{className:"btn navbar-btn btn-default btn-sign-in",onClick:this.showSignInModal,type:"button"},void 0,gettext("Sign in")),(0,o.Z)(de,{className:"navbar-btn btn-primary btn-register"},void 0,gettext("Register")),oe||(oe=(0,o.Z)("div",{className:"navbar-left"},void 0,(0,o.Z)(j,{}))))}}class me extends r().Component{showGuestMenu(){pe.Z.show(ue)}render(){return(0,o.Z)("button",{type:"button",onClick:this.showGuestMenu},void 0,ne||(ne=(0,o.Z)(l.ZP,{size:"64"})))}}var ve,ge,Ze,be=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"setGravatar",(()=>{this.callApi("gravatar")})),(0,d.Z)(this,"setGenerated",(()=>{this.callApi("generated")})),this.state={isLoading:!1}}callApi(e){if(this.state.isLoading)return!1;this.setState({isLoading:!0}),c.Z.post(this.props.user.api.avatar,{avatar:e}).then((e=>{this.setState({isLoading:!1}),p.Z.success(e.detail),this.props.onComplete(e)}),(e=>{400===e.status?(p.Z.error(e.detail),this.setState({isLoading:!1})):this.props.showError(e)}))}getGravatarButton(){return this.props.options.gravatar?(0,o.Z)(z.Z,{onClick:this.setGravatar,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-gravatar"},void 0,gettext("Download my Gravatar")):null}getCropButton(){return this.props.options.crop_src?(0,o.Z)(z.Z,{className:"btn-default btn-block btn-avatar-crop",disabled:this.state.isLoading,onClick:this.props.showCrop},void 0,gettext("Re-crop uploaded image")):null}getUploadButton(){return this.props.options.upload?(0,o.Z)(z.Z,{className:"btn-default btn-block btn-avatar-upload",disabled:this.state.isLoading,onClick:this.props.showUpload},void 0,gettext("Upload new image")):null}getGalleryButton(){return this.props.options.galleries?(0,o.Z)(z.Z,{className:"btn-default btn-block btn-avatar-gallery",disabled:this.state.isLoading,onClick:this.props.showGallery},void 0,gettext("Pick avatar from gallery")):null}getAvatarPreview(){let e={id:this.props.user.id,avatars:this.props.options.avatars};return this.state.isLoading?(0,o.Z)("div",{className:"avatar-preview preview-loading"},void 0,(0,o.Z)(l.ZP,{size:"200",user:e}),re||(re=(0,o.Z)(N.Z,{}))):(0,o.Z)("div",{className:"avatar-preview"},void 0,(0,o.Z)(l.ZP,{size:"200",user:e}))}render(){return(0,o.Z)("div",{className:"modal-body modal-avatar-index"},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-5"},void 0,this.getAvatarPreview()),(0,o.Z)("div",{className:"col-md-7"},void 0,this.getGravatarButton(),(0,o.Z)(z.Z,{onClick:this.setGenerated,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-generate"},void 0,gettext("Generate my individual avatar")),this.getCropButton(),this.getUploadButton(),this.getGalleryButton())))}},fe=s(19755),_e=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"cropAvatar",(()=>{if(this.state.isLoading)return!1;this.setState({isLoading:!0});let e=this.props.upload?"crop_tmp":"crop_src",t=fe(".crop-form");const s=t.cropit("exportZoom"),a=t.cropit("offset");c.Z.post(this.props.user.api.avatar,{avatar:e,crop:{offset:{x:a.x*s,y:a.y*s},zoom:t.cropit("zoom")*s}}).then((e=>{this.props.onComplete(e),p.Z.success(e.detail)}),(e=>{400===e.status?(p.Z.error(e.detail),this.setState({isLoading:!1})):this.props.showError(e)}))})),this.state={isLoading:!1,deviceRatio:1}}getAvatarSize(){return this.props.upload?this.props.options.crop_tmp.size:this.props.options.crop_src.size}getImagePath(){return this.props.upload?this.props.dataUrl:this.props.options.crop_src.url}componentDidMount(){let e=fe(".crop-form"),t=this.getAvatarSize();const s=e.width();for(;s{if(this.props.upload){let t=e.cropit("zoom"),s=e.cropit("imageSize");if(s.width>s.height){let a=(s.width*t-this.getAvatarSize())/-2;e.cropit("offset",{x:a,y:0})}else if(s.width{document.getElementById("avatar-hidden-upload").click()})),(0,d.Z)(this,"uploadFile",(()=>{let e=document.getElementById("avatar-hidden-upload").files[0];if(!e)return;let t=this.validateFile(e);if(t)return void p.Z.error(t);this.setState({image:e,preview:URL.createObjectURL(e),progress:0});let s=new FormData;s.append("avatar","upload"),s.append("image",e),c.Z.upload(this.props.user.api.avatar,s,(e=>{this.setState({progress:e})})).then((e=>{this.setState({options:e,uploaded:e.detail}),p.Z.info(gettext("Your image has been uploaded and you may now crop it."))}),(e=>{400===e.status||413===e.status?(p.Z.error(e.detail),this.setState({isLoading:!1,image:null,progress:0})):this.props.showError(e)}))})),this.state={image:null,preview:null,progress:0,uploaded:null,dataUrl:null}}validateFile(e){if(e.size>this.props.options.upload.limit)return interpolate(gettext("Selected file is too big. (%(filesize)s)"),{filesize:(0,Ne.Z)(e.size)},!0);let t=gettext("Selected file type is not supported.");if(-1===this.props.options.upload.allowed_mime_types.indexOf(e.type))return t;let s=!1,a=e.name.toLowerCase();return this.props.options.upload.allowed_extensions.map((function(e){a.substr(-1*e.length)===e&&(s=!0)})),!s&&t}getUploadRequirements(e){let t=e.allowed_extensions.map((function(e){return e.substr(1)}));return interpolate(gettext("%(files)s files smaller than %(limit)s"),{files:t.join(", "),limit:(0,Ne.Z)(e.limit)},!0)}getUploadButton(){return(0,o.Z)("div",{className:"modal-body modal-avatar-upload"},void 0,(0,o.Z)(z.Z,{className:"btn-pick-file",onClick:this.pickFile},void 0,ge||(ge=(0,o.Z)("div",{className:"material-icon"},void 0,"input")),gettext("Select file")),(0,o.Z)("p",{className:"text-muted"},void 0,this.getUploadRequirements(this.props.options.upload)))}getUploadProgressLabel(){return interpolate(gettext("%(progress)s % complete"),{progress:this.state.progress},!0)}getUploadProgress(){return(0,o.Z)("div",{className:"modal-body modal-avatar-upload"},void 0,(0,o.Z)("div",{className:"upload-progress"},void 0,(0,o.Z)("img",{src:this.state.preview}),(0,o.Z)("div",{className:"progress"},void 0,(0,o.Z)("div",{className:"progress-bar",role:"progressbar","aria-valuenow":"{this.state.progress}","aria-valuemin":"0","aria-valuemax":"100",style:{width:this.state.progress+"%"}},void 0,(0,o.Z)("span",{className:"sr-only"},void 0,this.getUploadProgressLabel())))))}renderUpload(){return(0,o.Z)("div",{},void 0,(0,o.Z)("input",{type:"file",id:"avatar-hidden-upload",className:"hidden-file-upload",onChange:this.uploadFile}),this.state.image?this.getUploadProgress():this.getUploadButton(),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)(z.Z,{onClick:this.props.showIndex,disabled:!!this.state.image,className:"btn-default btn-block"},void 0,gettext("Cancel")))))}renderCrop(){return(0,o.Z)(_e,{options:this.state.options,user:this.props.user,upload:this.state.uploaded,dataUrl:this.state.preview,onComplete:this.props.onComplete,showError:this.props.showError,showIndex:this.props.showIndex})}render(){return this.state.uploaded?this.renderCrop():this.renderUpload()}},ye=s(69130);class we extends r().Component{constructor(){super(...arguments),(0,d.Z)(this,"select",(()=>{this.props.select(this.props.id)}))}getClassName(){return this.props.selection===this.props.id?this.props.disabled?"btn btn-avatar btn-disabled avatar-selected":"btn btn-avatar avatar-selected":this.props.disabled?"btn btn-avatar btn-disabled":"btn btn-avatar"}render(){return(0,o.Z)("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,onClick:this.select},void 0,(0,o.Z)("img",{src:this.props.url}))}}class ke extends r().Component{render(){return(0,o.Z)("div",{className:"avatars-gallery"},void 0,(0,o.Z)("h3",{},void 0,this.props.name),(0,o.Z)("div",{className:"avatars-gallery-images"},void 0,(0,ye.Z)(this.props.images,4,null).map(((e,t)=>(0,o.Z)("div",{className:"row"},t,e.map(((e,t)=>(0,o.Z)("div",{className:"col-xs-3"},t,e?r().createElement(we,(0,h.Z)({disabled:this.props.disabled,select:this.props.select,selection:this.props.selection},e)):Ze||(Ze=(0,o.Z)("div",{className:"blank-avatar"}))))))))))}}var Ce,Se,Ee,Le=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"select",(e=>{this.setState({selection:e})})),(0,d.Z)(this,"save",(()=>{if(this.state.isLoading)return!1;this.setState({isLoading:!0}),c.Z.post(this.props.user.api.avatar,{avatar:"galleries",image:this.state.selection}).then((e=>{this.setState({isLoading:!1}),p.Z.success(e.detail),this.props.onComplete(e),this.props.showIndex()}),(e=>{400===e.status?(p.Z.error(e.detail),this.setState({isLoading:!1})):this.props.showError(e)}))})),this.state={selection:null,isLoading:!1}}render(){return(0,o.Z)("div",{},void 0,(0,o.Z)("div",{className:"modal-body modal-avatar-gallery"},void 0,this.props.options.galleries.map(((e,t)=>(0,o.Z)(ke,{name:e.name,images:e.images,selection:this.state.selection,disabled:this.state.isLoading,select:this.select},t)))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)(z.Z,{onClick:this.save,loading:this.state.isLoading,disabled:!this.state.selection,className:"btn-primary btn-block"},void 0,this.state.selection?gettext("Save choice"):gettext("Select avatar")),(0,o.Z)(z.Z,{onClick:this.props.showIndex,disabled:this.state.isLoading,className:"btn-default btn-block"},void 0,gettext("Cancel"))))))}},Te=s(3784),Pe=s(6935),Oe=s(90287);class Re extends r().Component{getErrorReason(){return this.props.reason?(0,o.Z)("p",{dangerouslySetInnerHTML:{__html:this.props.reason}}):null}render(){return(0,o.Z)("div",{className:"modal-body"},void 0,Ce||(Ce=(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,"remove_circle_outline"))),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,this.props.message),this.getErrorReason(),(0,o.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}}var Ae,Ie,De,je,ze,Ue,Me,Be,qe,He,Fe,Ye,Ve,Ge,$e=class extends r().Component{constructor(){super(...arguments),(0,d.Z)(this,"showError",(e=>{this.setState({error:e})})),(0,d.Z)(this,"showIndex",(()=>{this.setState({component:be})})),(0,d.Z)(this,"showUpload",(()=>{this.setState({component:xe})})),(0,d.Z)(this,"showCrop",(()=>{this.setState({component:_e})})),(0,d.Z)(this,"showGallery",(()=>{this.setState({component:Le})})),(0,d.Z)(this,"completeFlow",(e=>{Oe.Z.dispatch((0,Pe.n1)(this.props.user,e.avatars)),this.setState({component:be,options:e})}))}componentDidMount(){c.Z.get(this.props.user.api.avatar).then((e=>{this.setState({component:be,options:e,error:null})}),(e=>{this.showError(e)}))}getBody(){return this.state?this.state.error?(0,o.Z)(Re,{message:this.state.error.detail,reason:this.state.error.reason}):(0,o.Z)(this.state.component,{options:this.state.options,user:this.props.user,onComplete:this.completeFlow,showError:this.showError,showIndex:this.showIndex,showCrop:this.showCrop,showUpload:this.showUpload,showGallery:this.showGallery}):Se||(Se=(0,o.Z)(Te.Z,{}))}getClassName(){return this.state&&this.state.error?"modal-dialog modal-message modal-change-avatar":"modal-dialog modal-change-avatar"}render(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Ee||(Ee=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Change your avatar"))),this.getBody()))}};function We(e){return{user:e.auth.user}}class Qe extends r().Component{changeAvatar(){J.Z.show((0,a.$j)(We)($e))}render(){const{user:e}=this.props;return(0,o.Z)("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},void 0,(0,o.Z)("li",{className:"dropdown-header"},void 0,(0,o.Z)("strong",{},void 0,e.username),(0,o.Z)("div",{className:"row user-stats"},void 0,(0,o.Z)("div",{className:"col-sm-3"},void 0,Ae||(Ae=(0,o.Z)("span",{className:"material-icon"},void 0,"message")),e.posts),(0,o.Z)("div",{className:"col-sm-3"},void 0,Ie||(Ie=(0,o.Z)("span",{className:"material-icon"},void 0,"forum")),e.threads),(0,o.Z)("div",{className:"col-sm-3"},void 0,De||(De=(0,o.Z)("span",{className:"material-icon"},void 0,"favorite")),e.followers),(0,o.Z)("div",{className:"col-sm-3"},void 0,je||(je=(0,o.Z)("span",{className:"material-icon"},void 0,"favorite_outline")),e.following))),ze||(ze=(0,o.Z)("li",{className:"divider"})),(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:e.url},void 0,Ue||(Ue=(0,o.Z)("span",{className:"material-icon"},void 0,"account_circle")),gettext("See your profile"))),(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:i.Z.get("USERCP_URL")},void 0,Me||(Me=(0,o.Z)("span",{className:"material-icon"},void 0,"done_all")),gettext("Change options"))),(0,o.Z)("li",{},void 0,(0,o.Z)("button",{className:"btn-link",onClick:this.changeAvatar,type:"button"},void 0,Be||(Be=(0,o.Z)("span",{className:"material-icon"},void 0,"portrait")),gettext("Change avatar"))),!!e.acl.can_use_private_threads&&(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:i.Z.get("PRIVATE_THREADS_URL")},void 0,qe||(qe=(0,o.Z)("span",{className:"material-icon"},void 0,"message")),gettext("Private threads"),(0,o.Z)(Ke,{user:e}))),He||(He=(0,o.Z)("li",{className:"divider"})),(0,o.Z)("li",{className:"dropdown-buttons"},void 0,(0,o.Z)("button",{className:"btn btn-default btn-block",onClick:()=>document.getElementById("hidden-logout-form").submit(),type:"button"},void 0,gettext("Log out"))))}}function Ke(e){let{user:t}=e;return t.unread_private_threads?(0,o.Z)("span",{className:"badge"},void 0,t.unread_private_threads):null}function Je(e){let{user:t}=e;return(0,o.Z)("ul",{className:"ul nav navbar-nav nav-user"},void 0,Fe||(Fe=(0,o.Z)("li",{},void 0,(0,o.Z)(j,{}))),(0,o.Z)(Xe,{user:t}),(0,o.Z)("li",{className:"dropdown"},void 0,(0,o.Z)("a",{"aria-haspopup":"true","aria-expanded":"false",className:"dropdown-toggle","data-toggle":"dropdown",href:t.url,role:"button"},void 0,(0,o.Z)(l.ZP,{user:t,size:"64"})),(0,o.Z)(Qe,{user:t})))}function Xe(e){let{user:t}=e;if(!t.acl.can_use_private_threads)return null;let s=null;return s=t.unread_private_threads?gettext("You have unread private threads!"):gettext("Private threads"),(0,o.Z)("li",{},void 0,(0,o.Z)("a",{className:"navbar-icon",href:i.Z.get("PRIVATE_THREADS_URL"),title:s},void 0,Ye||(Ye=(0,o.Z)("span",{className:"material-icon"},void 0,"message")),t.unread_private_threads>0&&(0,o.Z)("span",{className:"badge"},void 0,t.unread_private_threads)))}function et(e){return{user:e.auth.user}}class tt extends r().Component{showUserMenu(){pe.Z.showConnected("user-menu",(0,a.$j)(et)(Qe))}render(){return(0,o.Z)("button",{type:"button",onClick:this.showUserMenu},void 0,(0,o.Z)(l.ZP,{user:this.props.user,size:"50"}))}}class st extends r().Component{render(){return this.props.isAuthenticated?(0,o.Z)(Je,{user:this.props.user}):Ve||(Ve=(0,o.Z)(he,{}))}}class at extends r().Component{render(){return this.props.isAuthenticated?(0,o.Z)(tt,{user:this.props.user}):Ge||(Ge=(0,o.Z)(me,{}))}}function it(e){return e.auth}var ot=s(4869);i.Z.addInitializer({name:"component:user-menu",initializer:function(){(0,ot.Z)((0,a.$j)(it)(st),"user-menu-mount"),(0,ot.Z)((0,a.$j)(it)(at),"user-menu-compact-mount")},after:"store"})},77031:function(e,t,s){"use strict";var a,i=s(22928),o=s(57588),n=s.n(o),r=s(37424),l=s(4942),d=s(59131),c=s(69987),p=s(94417);const u=(e,t)=>{let s=e;return"rank"===t.component?s+=t.slug:s+=t.component,s+"/"};var h,m,v,g,Z=e=>{let{baseUrl:t,page:s,pages:o}=e;return(0,i.Z)("div",{className:"nav-container"},void 0,(0,i.Z)("div",{className:"dropdown hidden-sm hidden-md hidden-lg"},void 0,(0,i.Z)("button",{className:"btn btn-default btn-block btn-outline dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,a||(a=(0,i.Z)("span",{className:"material-icon"},void 0,"menu")),s.name),(0,i.Z)("ul",{className:"dropdown-menu stick-to-bottom"},void 0,o.map((e=>{const s=u(t,e);return(0,i.Z)("li",{},s,(0,i.Z)(c.rU,{to:s},void 0,e.name))})))),(0,i.Z)("ul",{className:"nav nav-pills hidden-xs",role:"menu"},void 0,o.map((e=>{const s=u(t,e);return(0,i.Z)(p.Z,{path:s},s,(0,i.Z)(c.rU,{to:s},void 0,e.name))}))))},b=class extends n().Component{getEmptyMessage(){return interpolate(gettext("No users have posted any new messages during last %(days)s days."),{days:this.props.trackedPeriod},!0)}render(){return(0,i.Z)("div",{className:"active-posters-list"},void 0,(0,i.Z)(d.Z,{},void 0,(0,i.Z)(Z,{baseUrl:misago.get("USERS_LIST_URL"),page:this.props.page,pages:misago.get("USERS_LISTS")}),(0,i.Z)("p",{className:"lead"},void 0,this.getEmptyMessage())))}},f=s(19605),_=s(44039),N=class extends n().Component{shouldComponentUpdate(){return!1}getClassName(){return this.props.hiddenOnMobile?"list-group-item hidden-xs hidden-sm":"list-group-item"}render(){return(0,i.Z)("li",{className:this.getClassName()},void 0,h||(h=(0,i.Z)("div",{className:"rank-user-avatar"},void 0,(0,i.Z)("span",{},void 0,(0,i.Z)(f.ZP,{size:"50"})))),(0,i.Z)("div",{className:"rank-user"},void 0,(0,i.Z)("div",{className:"user-name"},void 0,(0,i.Z)("span",{className:"item-title"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(30,80)+"px"}},void 0," "))),(0,i.Z)("div",{className:"user-details"},void 0,(0,i.Z)("span",{className:"user-status"},void 0,m||(m=(0,i.Z)("span",{className:"status-icon ui-preview-text"},void 0," ")),(0,i.Z)("span",{className:"status-label ui-preview-text hidden-xs hidden-sm",style:{width:_.e(30,50)+"px"}},void 0," ")),(0,i.Z)("span",{className:"rank-name"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(30,50)+"px"}},void 0," ")),(0,i.Z)("span",{className:"user-title hidden-xs hidden-sm"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(30,50)+"px"}},void 0," "))),(0,i.Z)("div",{className:"user-compact-stats visible-xs-block"},void 0,(0,i.Z)("span",{className:"rank-position"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Rank"))),(0,i.Z)("span",{className:"rank-posts-counted"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Ranked posts"))))),(0,i.Z)("div",{className:"rank-position hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Rank"))),(0,i.Z)("div",{className:"rank-posts-counted hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Ranked posts"))),(0,i.Z)("div",{className:"rank-posts-total hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Total posts"))))}},x=class extends n().Component{shouldComponentUpdate(){return!1}render(){return(0,i.Z)("div",{className:"active-posters-list"},void 0,(0,i.Z)(d.Z,{},void 0,(0,i.Z)(Z,{baseUrl:misago.get("USERS_LIST_URL"),page:this.props.page,pages:misago.get("USERS_LISTS")}),(0,i.Z)("p",{className:"lead ui-preview"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(50,220)+"px"}},void 0," ")),(0,i.Z)("div",{className:"active-posters ui-preview"},void 0,(0,i.Z)("ul",{className:"list-group"},void 0,[0,1,2].map((e=>(0,i.Z)(N,{hiddenOnMobile:e>0},e)))))))}},y=s(24678),w=s(32233),k=class extends n().Component{getClassName(){return this.props.rank.css_class?"list-group-item list-group-rank-"+this.props.rank.css_class:"list-group-item"}getUserStatus(){return this.props.user.status?(0,i.Z)(y.ZP,{user:this.props.user,status:this.props.user.status},void 0,(0,i.Z)(y.Jj,{user:this.props.user,status:this.props.user.status}),(0,i.Z)(y.pg,{user:this.props.user,status:this.props.user.status,className:"status-label hidden-xs hidden-sm"})):(0,i.Z)("span",{className:"user-status"},void 0,v||(v=(0,i.Z)("span",{className:"status-icon ui-preview-text"},void 0," ")),(0,i.Z)("span",{className:"status-label ui-preview-text hidden-xs hidden-sm",style:{width:_.e(30,50)+"px"}},void 0," "))}getRankName(){if(!this.props.rank.is_tab)return(0,i.Z)("span",{className:"rank-name item-title"},void 0,this.props.rank.name);let e=w.Z.get("USERS_LIST_URL")+this.props.rank.slug+"/";return(0,i.Z)(c.rU,{to:e,className:"rank-name item-title"},void 0,this.props.rank.name)}getUserTitle(){return this.props.user.title?(0,i.Z)("span",{className:"user-title hidden-xs hidden-sm"},void 0,this.props.user.title):null}render(){return(0,i.Z)("li",{className:this.getClassName()},void 0,(0,i.Z)("div",{className:"rank-user-avatar"},void 0,(0,i.Z)("a",{href:this.props.user.url},void 0,(0,i.Z)(f.ZP,{user:this.props.user,size:50,size2x:64}))),(0,i.Z)("div",{className:"rank-user"},void 0,(0,i.Z)("div",{className:"user-name"},void 0,(0,i.Z)("a",{href:this.props.user.url,className:"item-title"},void 0,this.props.user.username)),(0,i.Z)("div",{className:"user-details"},void 0,this.getUserStatus(),this.getRankName(),this.getUserTitle()),(0,i.Z)("div",{className:"user-compact-stats visible-xs-block"},void 0,(0,i.Z)("span",{className:"rank-position"},void 0,(0,i.Z)("strong",{},void 0,"#",this.props.counter),(0,i.Z)("small",{},void 0,gettext("Rank"))),(0,i.Z)("span",{className:"rank-posts-counted"},void 0,(0,i.Z)("strong",{},void 0,this.props.user.meta.score),(0,i.Z)("small",{},void 0,gettext("Ranked posts"))))),(0,i.Z)("div",{className:"rank-position hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,"#",this.props.counter),(0,i.Z)("small",{},void 0,gettext("Rank"))),(0,i.Z)("div",{className:"rank-posts-counted hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,this.props.user.meta.score),(0,i.Z)("small",{},void 0,gettext("Ranked posts"))),(0,i.Z)("div",{className:"rank-posts-total hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,this.props.user.posts),(0,i.Z)("small",{},void 0,gettext("Total posts"))))}},C=class extends n().Component{getLeadMessage(){let e=ngettext("%(posters)s top poster from last %(days)s days.","%(posters)s top posters from last %(days)s days.",this.props.count);return interpolate(e,{posters:this.props.count,days:this.props.trackedPeriod},!0)}render(){return(0,i.Z)("div",{className:"active-posters-list"},void 0,(0,i.Z)(d.Z,{},void 0,(0,i.Z)(Z,{baseUrl:misago.get("USERS_LIST_URL"),page:this.props.page,pages:misago.get("USERS_LISTS")}),(0,i.Z)("p",{className:"lead"},void 0,this.getLeadMessage()),(0,i.Z)("div",{className:"active-posters ui-ready"},void 0,(0,i.Z)("ul",{className:"list-group"},void 0,this.props.users.map(((e,t)=>(0,i.Z)(k,{user:e,rank:e.rank,counter:t+1},e.id)))))))}},S=s(6935),E=s(55547),L=s(90287),T=s(53328),P=class extends n().Component{constructor(e){super(e),(0,l.Z)(this,"update",(e=>{L.Z.dispatch((0,S.ZB)(e.results)),this.setState({isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count})})),w.Z.has("USERS")?this.initWithPreloadedData(w.Z.pop("USERS")):this.initWithoutPreloadedData(),this.startPolling()}initWithPreloadedData(e){this.state={isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count},L.Z.dispatch((0,S.ZB)(e.results))}initWithoutPreloadedData(){this.state={isLoaded:!1}}startPolling(){E.Z.start({poll:"active-posters",url:w.Z.get("USERS_API"),data:{list:"active"},frequency:9e4,update:this.update})}componentDidMount(){T.Z.set({title:this.props.route.extra.name,parent:gettext("Users")})}componentWillUnmount(){E.Z.stop("active-posters")}render(){const e={name:this.props.route.extra.name};return this.state.isLoaded?this.state.count>0?(0,i.Z)(C,{page:e,users:this.props.users,trackedPeriod:this.state.trackedPeriod,count:this.state.count}):(0,i.Z)(b,{page:e,trackedPeriod:this.state.trackedPeriod}):(0,i.Z)(x,{page:e})}},O=class extends n().Component{getClassName(){return this.props.copy&&this.props.copy.length&&1===function(e,t){if(e=(e+"").toLowerCase(),(t=(t+"").toLowerCase()).length<=0)return 0;let s=0,a=0,i=t.length;for(;a=e.indexOf(t,a),a>=0;)s+=1,a+=i;return s}(this.props.copy,"{let{users:t}=e;return(0,i.Z)(R.Z,{cols:4,isReady:!0,showStatus:!0,users:t})};class I extends n().Component{constructor(){super(...arguments),(0,l.Z)(this,"render",(()=>g||(g=(0,i.Z)(R.Z,{cols:4,isReady:!1}))))}shouldComponentUpdate(){return!1}}var D,j,z,U,M,B,q,H,F,Y=I,V=s(92490),G=e=>{let{users:t}=e;return t.more?(0,i.Z)("p",{},void 0,interpolate(ngettext("There is %(more)s more member with this role.","There are %(more)s more members with this role.",t.more),{more:t.more},!0)):(0,i.Z)("p",{},void 0,gettext("There are no more members with this role."))},$=e=>{let{baseUrl:t,users:s}=e;return(0,i.Z)("div",{className:"misago-pagination"},void 0,s.isLoaded&&s.first?(0,i.Z)(c.rU,{className:"btn btn-default btn-outline btn-icon",to:t,title:gettext("Go to first page")},void 0,D||(D=(0,i.Z)("span",{className:"material-icon"},void 0,"first_page"))):(0,i.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to first page"),type:"button",disabled:!0},void 0,j||(j=(0,i.Z)("span",{className:"material-icon"},void 0,"first_page"))),s.isLoaded&&s.previous?(0,i.Z)(c.rU,{className:"btn btn-default btn-outline btn-icon",to:t+(s.previous>1?s.previous+"/":""),title:gettext("Go to previous page")},void 0,z||(z=(0,i.Z)("span",{className:"material-icon"},void 0,"chevron_left"))):(0,i.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to previous page"),type:"button",disabled:!0},void 0,U||(U=(0,i.Z)("span",{className:"material-icon"},void 0,"chevron_left"))),s.isLoaded&&s.next?(0,i.Z)(c.rU,{className:"btn btn-default btn-outline btn-icon",to:t+s.next+"/",title:gettext("Go to next page")},void 0,M||(M=(0,i.Z)("span",{className:"material-icon"},void 0,"chevron_right"))):(0,i.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to next page"),type:"button",disabled:!0},void 0,B||(B=(0,i.Z)("span",{className:"material-icon"},void 0,"chevron_right"))),s.isLoaded&&s.last?(0,i.Z)(c.rU,{className:"btn btn-default btn-outline btn-icon",to:t+s.last+"/",title:gettext("Go to last page")},void 0,q||(q=(0,i.Z)("span",{className:"material-icon"},void 0,"last_page"))):(0,i.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to last page"),type:"button",disabled:!0},void 0,H||(H=(0,i.Z)("span",{className:"material-icon"},void 0,"last_page"))))},W=e=>{let{baseUrl:t,users:s}=e;return(0,i.Z)(V.o8,{},void 0,(0,i.Z)(V.Z2,{},void 0,(0,i.Z)(V.Eg,{},void 0,(0,i.Z)($,{baseUrl:t,users:s}))),(0,i.Z)(V.Z2,{auto:!0},void 0,(0,i.Z)(V.Eg,{},void 0,(0,i.Z)(G,{users:s}))))},Q=class extends n().Component{constructor(e){super(e),(0,l.Z)(this,"update",(e=>{L.Z.dispatch((0,S.ZB)(e.results)),e.isLoaded=!0,this.setState(e)})),w.Z.has("USERS")?this.initWithPreloadedData(w.Z.pop("USERS")):this.initWithoutPreloadedData(),this.startPolling(e.params.page||1)}initWithPreloadedData(e){this.state=Object.assign(e,{isLoaded:!0}),L.Z.dispatch((0,S.ZB)(e.results))}initWithoutPreloadedData(){this.state={isLoaded:!1}}startPolling(e){E.Z.start({poll:"rank-users",url:w.Z.get("USERS_API"),data:{rank:this.props.route.rank.id,page:e},frequency:9e4,update:this.update})}componentDidMount(){T.Z.set({title:this.props.route.rank.name,page:this.props.params.page||null,parent:gettext("Users")})}componentWillUnmount(){E.Z.stop("rank-users")}componentWillReceiveProps(e){this.props.params.page!==e.params.page&&(T.Z.set({title:this.props.route.rank.name,page:e.params.page||null,parent:gettext("Users")}),this.setState({isLoaded:!1}),E.Z.stop("rank-users"),this.startPolling(e.params.page))}getClassName(){return this.props.route.rank.css_class?"rank-users-list rank-users-"+this.props.route.rank.css_class:"rank-users-list"}getRankDescription(){return this.props.route.rank.description?(0,i.Z)("div",{className:"rank-description"},void 0,(0,i.Z)(O,{copy:this.props.route.rank.description.html})):null}getComponent(){return this.state.isLoaded?this.state.count>0?(0,i.Z)(A,{users:this.props.users}):(0,i.Z)("p",{className:"lead"},void 0,gettext("There are no users with this rank at the moment.")):F||(F=(0,i.Z)(Y,{}))}render(){return(0,i.Z)("div",{className:this.getClassName()},void 0,(0,i.Z)(d.Z,{},void 0,(0,i.Z)(Z,{baseUrl:w.Z.get("USERS_LIST_URL"),page:{name:this.props.route.rank.name},pages:w.Z.get("USERS_LISTS")}),this.getRankDescription(),this.getComponent(),(0,i.Z)(W,{baseUrl:w.Z.get("USERS_LIST_URL")+this.props.route.rank.slug+"/",users:this.state})))}},K=s(82125),J=s(99755),X=class extends K.Z{render(){return(0,i.Z)("div",{className:"page page-users-lists"},void 0,(0,i.Z)(J.sP,{},void 0,(0,i.Z)(J.mr,{styleName:"users-lists"},void 0,(0,i.Z)(J.gC,{styleName:"users-lists"},void 0,(0,i.Z)("h1",{},void 0,gettext("Users"))))),this.props.children)}};function ee(e){return{tick:e.tick.tick,user:e.auth.user,users:e.users}}function te(){let e=[];return w.Z.get("USERS_LISTS").forEach((function(t){"rank"===t.component?(e.push({path:w.Z.get("USERS_LIST_URL")+t.slug+"/:page/",component:(0,r.$j)(ee)(Q),rank:t}),e.push({path:w.Z.get("USERS_LIST_URL")+t.slug+"/",component:(0,r.$j)(ee)(Q),rank:t})):"active-posters"===t.component&&e.push({path:w.Z.get("USERS_LIST_URL")+t.component+"/",component:(0,r.$j)(ee)(P),extra:{name:t.name}})})),e}var se=s(39633);w.Z.addInitializer({name:"component:users",initializer:function(e){e.has("USERS_LISTS")&&(0,se.Z)({root:w.Z.get("USERS_LIST_URL"),component:X,paths:te()})},after:"store"})},97751:function(e,t,s){"use strict";var a=s(32233),i=s(96142);a.Z.addInitializer({name:"include",initializer:function(e){i.Z.init(e.get("STATIC_URL"))}})},76093:function(e,t,s){"use strict";var a=s(32233),i=s(62833);a.Z.addInitializer({name:"local-storage",initializer:function(){i.Z.init("misago_")}})},19764:function(e,t,s){"use strict";var a=s(32233),i=s(8621);a.Z.addInitializer({name:"dropdown",initializer:function(){let e=document.getElementById("mobile-navbar-dropdown-mount");e&&i.Z.init(e)},before:"store"})},47549:function(e,t,s){"use strict";var a=s(32233),i=s(59801);a.Z.addInitializer({name:"modal",initializer:function(){let e=document.getElementById("modal-mount");e&&i.Z.init(e)},before:"store"})},22331:function(e,t,s){"use strict";var a=s(30381),i=s.n(a),o=s(32233),n=s(19755);o.Z.addInitializer({name:"moment",initializer:function(){i().locale(n("html").attr("lang"))}})},21513:function(e,t,s){"use strict";var a=s(32233),i=s(53328);a.Z.addInitializer({name:"page-title",initializer:function(e){i.Z.init(e.get("SETTINGS").forum_index_title,e.get("SETTINGS").forum_name)}})},98749:function(e,t,s){"use strict";var a=s(32233),i=s(78657),o=s(53904),n=s(55547);a.Z.addInitializer({name:"polls",initializer:function(){n.Z.init(i.Z,o.Z)}})},98251:function(e,t,s){"use strict";var a=s(32233),i=s(78657),o=s(64646),n=s(53904);a.Z.addInitializer({name:"posting",initializer:function(){o.Z.init(i.Z,n.Z,document.getElementById("posting-mount"))}})},6720:function(e,t,s){"use strict";var a=s(32233),i=s(35486),o=s(90287);a.Z.addInitializer({name:"reducer:auth",initializer:function(e){o.Z.addReducer("auth",i.ZP,Object.assign({isAuthenticated:e.get("isAuthenticated"),isAnonymous:!e.get("isAuthenticated"),user:e.get("user")},i.E3))},before:"store"})},10846:function(e,t,s){"use strict";var a=s(32233),i=s(8154),o=s(90287);a.Z.addInitializer({name:"reducer:participants",initializer:function(){let e=null;a.Z.has("THREAD")&&(e=a.Z.get("THREAD").participants),o.Z.addReducer("participants",i.ZP,e||[])},before:"store"})},18255:function(e,t,s){"use strict";var a=s(32233),i=s(59752),o=s(90287);a.Z.addInitializer({name:"reducer:poll",initializer:function(){let e=null;e=a.Z.has("THREAD")&&a.Z.get("THREAD").poll?(0,i.ZB)(a.Z.get("THREAD").poll):{},o.Z.addReducer("poll",i.ZP,e)},before:"store"})},14113:function(e,t,s){"use strict";var a=s(32233),i=s(21981),o=s(90287);a.Z.addInitializer({name:"reducer:posts",initializer:function(){let e=null;e=a.Z.has("POSTS")?(0,i.ZB)(a.Z.get("POSTS")):{isLoaded:!1,isBusy:!1},o.Z.addReducer("posts",i.ZP,e)},before:"store"})},24444:function(e,t,s){"use strict";var a=s(32233),i=s(58598),o=s(90287);a.Z.addInitializer({name:"reducer:profile-details",initializer:function(){let e=null;a.Z.has("PROFILE_DETAILS")&&(e=a.Z.get("PROFILE_DETAILS")),o.Z.addReducer("profile-details",i.ZP,e||{})},before:"store"})},1764:function(e,t,s){"use strict";var a=s(32233),i=s(27519),o=s(90287);a.Z.addInitializer({name:"reducer:profile-hydrate",initializer:function(){a.Z.has("PROFILE")&&o.Z.dispatch((0,i.ZB)(a.Z.get("PROFILE")))},after:"store"})},68351:function(e,t,s){"use strict";var a=s(32233),i=s(27519),o=s(90287);a.Z.addInitializer({name:"reducer:profile",initializer:function(){o.Z.addReducer("profile",i.ZP,{})},before:"store"})},81521:function(e,t,s){"use strict";var a=s(32233),i=s(16427),o=s(90287);a.Z.addInitializer({name:"reducer:search",initializer:function(){o.Z.addReducer("search",i.ZP,Object.assign({},i.E3,{providers:a.Z.get("SEARCH_PROVIDERS")||[],query:a.Z.get("SEARCH_QUERY")||""}))},before:"store"})},19984:function(e,t,s){"use strict";var a=s(32233),i=s(77751),o=s(90287);a.Z.addInitializer({name:"reducer:selection",initializer:function(){o.Z.addReducer("selection",i.ZP,[])},before:"store"})},41229:function(e,t,s){"use strict";var a=s(32233),i=s(27346),o=s(90287);a.Z.addInitializer({name:"reducer:snackbar",initializer:function(){o.Z.addReducer("snackbar",i.ZP,i.E3)},before:"store"})},43589:function(e,t,s){"use strict";var a=s(32233),i=s(7738),o=s(90287);a.Z.addInitializer({name:"reducer:thread",initializer:function(){let e=null;e=a.Z.has("THREAD")?(0,i.ZB)(a.Z.get("THREAD")):{isBusy:!1},o.Z.addReducer("thread",i.ZP,e)},before:"store"})},24108:function(e,t,s){"use strict";var a=s(32233),i=s(61340),o=s(90287);a.Z.addInitializer({name:"reducer:threads",initializer:function(){o.Z.addReducer("threads",i.ZP,[])},before:"store"})},33934:function(e,t,s){"use strict";var a=s(32233),i=s(85586),o=s(90287);a.Z.addInitializer({name:"reducer:tick",initializer:function(){o.Z.addReducer("tick",i.ZP,i.E3)},before:"store"})},85577:function(e,t,s){"use strict";var a=s(32233),i=s(48927),o=s(90287);a.Z.addInitializer({name:"reducer:username-history",initializer:function(){o.Z.addReducer("username-history",i.ZP,[])},before:"store"})},83526:function(e,t,s){"use strict";var a=s(32233),i=s(6935),o=s(90287);a.Z.addInitializer({name:"reducer:users",initializer:function(){o.Z.addReducer("users",i.ZP,[])},before:"store"})},43060:function(e,t,s){"use strict";var a=s(32233),i=s(53904),o=s(90287);a.Z.addInitializer({name:"snackbar",initializer:function(){i.Z.init(o.Z)},after:"store"})},92292:function(e,t,s){"use strict";var a=s(32233),i=s(90287);a.Z.addInitializer({name:"store",initializer:function(){i.Z.init()},before:"_end"})},33409:function(e,t,s){"use strict";var a=s(32233),i=s(85586),o=s(90287);a.Z.addInitializer({name:"tick-start",initializer:function(){window.setInterval((function(){o.Z.dispatch((0,i.bq)())}),5e4)},after:"store"})},31341:function(e,t,s){"use strict";var a=s(32233),i=s(96142),o=s(59940);a.Z.addInitializer({name:"zxcvbn",initializer:function(){o.Z.init(i.Z)}})},35486:function(e,t,s){"use strict";s.d(t,{E3:function(){return i},ZP:function(){return p},r$:function(){return l},w7:function(){return c},zB:function(){return d}});var a=s(6935),i={signedIn:!1,signedOut:!1};const o="PATCH_USER",n="SIGN_IN",r="SIGN_OUT";function l(e){return{type:o,patch:e}}function d(e){return{type:n,user:e}}function c(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return{type:r,soft:e}}function p(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case o:let s=Object.assign({},e);return s.user=Object.assign({},e.user,t.patch),s;case n:return Object.assign({},e,{signedIn:t.user});case r:return Object.assign({},e,{isAuthenticated:!1,isAnonymous:!0,signedOut:!t.soft});case a.oB:if(e.isAuthenticated&&e.user.id===t.userId){let s=Object.assign({},e);return s.user=Object.assign({},e.user,{avatars:t.avatars}),s}return e;case a.D9:if(e.isAuthenticated&&e.user.id===t.userId){let s=Object.assign({},e);return s.user=Object.assign({},e.user,{username:t.username,slug:t.slug}),s}return e;default:return e}}},8154:function(e,t,s){"use strict";s.d(t,{ZP:function(){return o},gx:function(){return i}});const a="REPLACE_PARTICIPANTS";function i(e){return{type:a,state:e}}function o(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===a?t.state:e}},59752:function(e,t,s){"use strict";s.d(t,{Ar:function(){return u},Od:function(){return m},ZB:function(){return c},ZH:function(){return r},ZP:function(){return v},b9:function(){return l},gx:function(){return h},n6:function(){return p}});var a=s(30381),i=s.n(a);const o="BUSY_POLL",n="RELEASE_POLL",r="REMOVE_POLL",l="REPLACE_POLL",d="UPDATE_POLL";function c(e){let t=!1;for(const s in e.choices)if(e.choices[s].selected){t=!0;break}return Object.assign({},e,{posted_on:i()(e.posted_on),hasSelectedChoices:t,endsOn:e.length?i()(e.posted_on).add(e.length,"days"):null,isBusy:!1})}function p(){return{type:o}}function u(){return{type:n}}function h(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{type:l,state:t?e:c(e)}}function m(){return{type:r}}function v(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case o:return Object.assign({},e,{isBusy:!0});case n:return Object.assign({},e,{isBusy:!1});case r:return{isBusy:!1};case l:return t.state;case d:return Object.assign({},e,t.data);default:return e}}},92747:function(e,t,s){"use strict";s.d(t,{Qu:function(){return n},ZB:function(){return r},ZP:function(){return c},r$:function(){return d}});var a=s(30381),i=s.n(a),o=s(6935);const n="PATCH_POST";function r(e){return Object.assign({},e,{posted_on:i()(e.posted_on),updated_on:i()(e.updated_on),hidden_on:i()(e.hidden_on),attachments:e.attachments?e.attachments.map(l):null,poster:e.poster?(0,o.Ru)(e.poster):null,isSelected:!1,isBusy:!1,isDeleted:!1})}function l(e){return Object.assign({},e,{uploaded_on:i()(e.uploaded_on)})}function d(e,t){return{type:n,post:e,patch:t}}function c(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===n&&e.id==t.post.id?Object.assign({},e,t.patch):e}},21981:function(e,t,s){"use strict";s.d(t,{R3:function(){return g},Rz:function(){return Z},Vx:function(){return b},Ys:function(){return p},ZB:function(){return m},ZP:function(){return f},_H:function(){return u},kR:function(){return h},zD:function(){return v}});var a=s(92747);const i="APPEND_POSTS",o="SELECT_POST",n="DESELECT_POST",r="DESELECT_POSTS",l="LOAD_POSTS",d="UNLOAD_POSTS",c="UPDATE_POSTS";function p(e){return{type:o,post:e}}function u(e){return{type:n,post:e}}function h(){return{type:r}}function m(e){return Object.assign({},e,{results:e.results.map(a.ZB),isLoaded:!0,isBusy:!1,isSelected:!1})}function v(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{type:l,state:t?e:m(e)}}function g(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{type:i,state:t?e:m(e)}}function Z(){return{type:d}}function b(e){return{type:c,update:e}}function f(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case o:const s=e.results.map((e=>e.id==t.post.id?Object.assign({},e,{isSelected:!0}):e));return Object.assign({},e,{results:s});case n:const p=e.results.map((e=>e.id==t.post.id?Object.assign({},e,{isSelected:!1}):e));return Object.assign({},e,{results:p});case r:const u=e.results.map((e=>Object.assign({},e,{isSelected:!1})));return Object.assign({},e,{results:u});case i:let h=e.results.slice();const m=e.results.map((e=>e.id));return t.state.results.map((e=>{-1===m.indexOf(e.id)&&h.push(e)})),Object.assign({},t.state,{results:h});case l:return t.state;case d:return Object.assign({},e,{isLoaded:!1});case c:return Object.assign({},e,t.update);case a.Qu:const v=e.results.map((e=>(0,a.ZP)(e,t)));return Object.assign({},e,{results:v});default:return e}}},58598:function(e,t,s){"use strict";s.d(t,{ZP:function(){return o},zD:function(){return i}});const a="LOAD_DETAILS";function i(e){return{type:a,newState:e}}function o(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===a?t.newState:e}},27519:function(e,t,s){"use strict";s.d(t,{ZB:function(){return l},ZP:function(){return c},r$:function(){return d}});var a=s(30381),i=s.n(a),o=s(6935);const n="HYDRATE_PROFILE",r="PATCH_PROFILE";function l(e){return{type:n,profile:e}}function d(e){return{type:r,patch:e}}function c(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return Object.assign({},t.profile,{joined_on:i()(t.profile.joined_on),status:(0,o.$q)(t.profile.status)});case r:return Object.assign({},e,t.patch);case o.oB:return e.id===t.userId?Object.assign({},e,{avatars:t.avatars}):e;case o.D9:return e.id===t.userId?Object.assign({},e,{username:t.username,slug:t.slug}):e;default:return e}}},16427:function(e,t,s){"use strict";s.d(t,{E3:function(){return n},P0:function(){return l},Vx:function(){return r},ZP:function(){return d}});const a="REPLACE_SEARCH",i="UPDATE_SEARCH",o="UPDATE_SEARCH_PROVIDER",n={isLoading:!1,query:"",providers:[]};function r(e){return{type:i,update:e}}function l(e){return{type:o,provider:e}}function d(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case a:return t.state;case i:return Object.assign({},e,t.update);case o:return Object.assign({},e,{providers:e.providers.map((e=>e.id===t.provider.id?t.provider:e))});default:return e}}},77751:function(e,t,s){"use strict";s.d(t,{$6:function(){return r},YP:function(){return l},ZP:function(){return c},wc:function(){return d}});var a=s(20370);const i="SELECT_ALL",o="SELECT_NONE",n="SELECT_ITEM";function r(e){return{type:i,items:e}}function l(){return{type:o}}function d(e){return{type:n,item:e}}function c(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case i:return t.items;case o:return[];case n:return(0,a.ZN)(e,t.item);default:return e}}},27346:function(e,t,s){"use strict";s.d(t,{E3:function(){return a},OV:function(){return n},ZP:function(){return l},p2:function(){return r}});var a={type:"info",message:"",isVisible:!1};const i="SHOW_SNACKBAR",o="HIDE_SNACKBAR";function n(e,t){return{type:i,message:e,messageType:t}}function r(){return{type:o}}function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:a,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===i?{type:t.messageType,message:t.message,isVisible:!0}:t.type===o?Object.assign({},e,{isVisible:!1}):e}},7738:function(e,t,s){"use strict";s.d(t,{Ar:function(){return h},Vx:function(){return v},ZB:function(){return p},ZP:function(){return Z},gx:function(){return m},n6:function(){return u},y8:function(){return g}});var a=s(30381),i=s.n(a),o=s(59752);const n="BUSY_THREAD",r="RELEASE_THREAD",l="REPLACE_THREAD",d="UPDATE_THREAD",c="UPDATE_THREAD_ACL";function p(e){return Object.assign({},e,{started_on:i()(e.started_on),last_post_on:i()(e.last_post_on),best_answer_marked_on:e.best_answer_marked_on?i()(e.best_answer_marked_on):null,isBusy:!1})}function u(){return{type:n}}function h(){return{type:r}}function m(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{type:l,state:t?e:p(e)}}function v(e){return{type:d,data:e}}function g(e){return{type:c,data:e}}function Z(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return Object.assign({},e,{isBusy:!0});case r:return Object.assign({},e,{isBusy:!1});case o.ZH:return Object.assign({},e,{poll:null});case o.b9:return Object.assign({},e,{poll:t.state});case l:return t.state;case d:return Object.assign({},e,t.data);case c:const s=Object.assign({},e.acl,t.data);return Object.assign({},e,{acl:s});default:return e}}},61340:function(e,t,s){"use strict";s.d(t,{R3:function(){return h},V8:function(){return v},ZB:function(){return g},ZP:function(){return _},l8:function(){return m},r$:function(){return Z}});var a=s(30381),i=s.n(a),o=s(89759);const n="APPEND_THREADS",r="DELETE_THREAD",l="FILTER_THREADS",d="HYDRATE_THREADS",c="PATCH_THREAD",p="SORT_THREADS",u=["can_announce","can_approve","can_close","can_hide","can_move","can_merge","can_pin","can_review"];function h(e,t){return{type:n,items:e,sorting:t}}function m(e){return{type:r,thread:e}}function v(e,t){return{type:l,category:e,categoriesMap:t}}function g(e){return{type:d,items:e}}function Z(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{type:c,thread:e,patch:t,sorting:s}}function b(e){let t=[];return u.forEach((function(s){e[s]&&t.push(s)})),t}function f(e){return Object.assign({},e,{started_on:i()(e.started_on),last_post_on:i()(e.last_post_on),moderation:b(e.acl)})}function _(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return(0,o.Z)(t.items.map(f),e).sort(t.sorting);case r:return e.filter((function(e){return e.id!==t.thread.id}));case l:return e.filter((function(e){const s=t.categoriesMap[e.category];return s.lft>=t.category.lft&&s.rght<=t.category.rght||2==e.weight}));case d:return t.items.map(f);case c:const s=e.map((function(e){return e.id===t.thread.id?Object.assign({},e,t.patch):e}));return t.sorting?s.sort(t.sorting):s;case p:return e.sort(t.sorting);default:return e}}},85586:function(e,t,s){"use strict";s.d(t,{E3:function(){return a},ZP:function(){return n},bq:function(){return o}});var a={tick:0};const i="TICK";function o(){return{type:i}}function n(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:a,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===i?Object.assign({},e,{tick:e.tick+1}):e}},48927:function(e,t,s){"use strict";s.d(t,{KP:function(){return c},R3:function(){return p},ZB:function(){return u},ZP:function(){return m}});var a=s(30381),i=s.n(a),o=s(6935),n=s(89759);const r="ADD_NAME_CHANGE",l="APPEND_HISTORY",d="HYDRATE_HISTORY";function c(e,t,s){return{type:r,change:e,user:t,changedBy:s}}function p(e){return{type:l,items:e}}function u(e){return{type:d,items:e}}function h(e){return Object.assign({},e,{changed_on:i()(e.changed_on)})}function m(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case r:let s=e.slice();return s.unshift({id:Math.floor(Date.now()/1e3),changed_by:t.changedBy,changed_by_username:t.changedBy.username,changed_on:i()(),new_username:t.change.username,old_username:t.user.username}),s;case l:return(0,n.Z)(e,t.items.map(h));case d:return t.items.map(h);case o.oB:return e.map((function(e){return(e=Object.assign({},e)).changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{avatars:t.avatars})),e}));case o.D9:return e.map((function(e){return(e=Object.assign({},e)).changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{username:t.username,slug:t.slug})),Object.assign({},e)}));default:return e}}},6935:function(e,t,s){"use strict";s.d(t,{$q:function(){return u},D9:function(){return d},R3:function(){return c},Ru:function(){return h},ZB:function(){return p},ZP:function(){return g},_S:function(){return v},n1:function(){return m},oB:function(){return l}});var a=s(30381),i=s.n(a),o=s(89759);const n="APPEND_USERS",r="HYDRATE_USERS",l="UPDATE_AVATAR",d="UPDATE_USERNAME";function c(e){return{type:n,items:e}}function p(e){return{type:r,items:e}}function u(e){return e?Object.assign({},e,{last_click:e.last_click?i()(e.last_click):null,banned_until:e.banned_until?i()(e.banned_until):null}):null}function h(e){return Object.assign({},e,{joined_on:i()(e.joined_on),status:u(e.status)})}function m(e,t){return{type:l,userId:e.id,avatars:t}}function v(e,t,s){return{type:d,userId:e.id,username:t,slug:s}}function g(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return(0,o.Z)(e,t.items.map(h));case r:return t.items.map(h);case l:return e.map((function(e){return(e=Object.assign({},e)).id===t.userId&&(e.avatars=t.avatars),e}));default:return e}}},78657:function(e,t,s){"use strict";var a=s(19755);t.Z=new class{constructor(){this._cookieName=null,this._csrfToken=null,this._locks={}}init(e){this._cookieName=e}getCsrfToken(){if(-1!==document.cookie.indexOf(this._cookieName)){let e=new RegExp(this._cookieName+"=([^;]*)"),t=document.cookie.match(e)[0];return t?t.split("=")[1]:null}return null}request(e,t,s){let i=this;return new Promise((function(o,n){let r={url:t,method:e,headers:{"X-CSRFToken":i.getCsrfToken()},data:s?JSON.stringify(s):null,contentType:"application/json; charset=utf-8",dataType:"json",success:function(e){o(e)},error:function(e){let t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,n(t)}};a.ajax(r)}))}get(e,t,s){if(t&&(e+="?"+a.param(t)),s){let t=this;return this._locks[s]&&(this._locks[s].url=e),this._locks[s]&&this._locks[s].waiter?{then:function(){}}:this._locks[s]&&this._locks[s].wait?(this._locks[s].waiter=!0,new Promise((function(a,i){let o=function(e){t._locks[s].wait?window.setTimeout((function(){o(e)}),300):t._locks[s].url!==e?o(t._locks[s].url):(t._locks[s].waiter=!1,t.request("GET",t._locks[s].url).then((function(i){t._locks[s].url===e?a(i):(t._locks[s].waiter=!0,o(t._locks[s].url))}),(function(a){t._locks[s].url===e?i(a):(t._locks[s].waiter=!0,o(t._locks[s].url))})))};window.setTimeout((function(){o(e)}),300)}))):(this._locks[s]={url:e,wait:!0,waiter:!1},new Promise((function(a,i){t.request("GET",e).then((function(i){t._locks[s].wait=!1,t._locks[s].url===e&&a(i)}),(function(a){t._locks[s].wait=!1,t._locks[s].url===e&&i(a)}))})))}return this.request("GET",e)}post(e,t){return this.request("POST",e,t)}patch(e,t){return this.request("PATCH",e,t)}put(e,t){return this.request("PUT",e,t)}delete(e,t){return this.request("DELETE",e,t)}upload(e,t,s){let i=this;return new Promise((function(o,n){let r={url:e,method:"POST",headers:{"X-CSRFToken":i.getCsrfToken()},data:t,contentType:!1,processData:!1,xhr:function(){let e=new window.XMLHttpRequest;return e.upload.addEventListener("progress",(function(e){e.lengthComputable&&s(Math.round(e.loaded/e.total*100))}),!1),e},success:function(e){o(e)},error:function(e){let t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),413!==t.status||t.detail||(t.detail=gettext("Upload was rejected by server as too large.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,n(t)}};a.ajax(r)}))}}},98274:function(e,t,s){"use strict";var a=s(35486);t.Z=new class{init(e,t,s){this._store=e,this._local=t,this._modal=s,this.syncSession(),this.watchState()}syncSession(){const e=this._store.getState().auth;e.isAuthenticated?this._local.set("auth",{isAuthenticated:!0,username:e.user.username}):this._local.set("auth",{isAuthenticated:!1})}watchState(){const e=this._store.getState().auth;this._local.watch("auth",(t=>{t.isAuthenticated?this._store.dispatch((0,a.zB)({username:t.username})):e.isAuthenticated&&this._store.dispatch((0,a.w7)())})),this._modal.hide()}signIn(e){this._store.dispatch((0,a.zB)(e)),this._local.set("auth",{isAuthenticated:!0,username:e.username}),this._modal.hide()}signOut(){this._store.dispatch((0,a.w7)()),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}softSignOut(){this._store.dispatch((0,a.w7)(!0)),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}}},93825:function(e,t,s){"use strict";var a,i=s(22928),o=s(57588),n=s.n(o),r=s(96359);class l{init(e,t,s,a){this._context=e,this._ajax=t,this._include=s,this._snackbar=a}}class d extends l{load(){return new Promise((function(e){e()}))}validator(){return null}component(){return null}}class c extends l{load(){var e=this;return new Promise(((t,s)=>{e._ajax.get(e._context.get("CAPTCHA_API")).then((function(s){e.question=s.question,e.helpText=s.help_text,t()}),(function(){e._snackbar.error(gettext("Failed to load CAPTCHA.")),s()}))}))}validator(){return[]}component(e){return(0,i.Z)(r.Z,{label:this.question,for:"id_captcha",labelClass:e.labelClass||"",controlClass:e.controlClass||"",validation:e.form.state.errors.captcha,helpText:this.helpText||null},void 0,(0,i.Z)("input",{"aria-describedby":"id_captcha_status",className:"form-control",disabled:e.form.state.isLoading,id:"id_captcha",onChange:e.form.bindInput("captcha"),type:"text",value:e.form.state.captcha}))}}class p extends n().Component{componentDidMount(){grecaptcha.render("recaptcha",{sitekey:this.props.siteKey,callback:e=>{this.props.binding({target:{value:e}})}})}render(){return a||(a=(0,i.Z)("div",{id:"recaptcha"}))}}class u extends l{load(){return this._include.include("https://www.google.com/recaptcha/api.js",!0),new Promise((function(e){var t=function(){"undefined"==typeof grecaptcha?window.setTimeout((function(){t()}),200):e()};t()}))}validator(){return[]}component(e){return(0,i.Z)(r.Z,{label:gettext("Please solve the quick test"),for:"id_captcha",labelClass:e.labelClass||"",controlClass:e.controlClass||"",validation:e.form.state.errors.captcha,helpText:gettext("This test helps us prevent automated spam registrations on our site.")},void 0,(0,i.Z)(p,{binding:e.form.bindInput("captcha"),siteKey:this._context.get("SETTINGS").recaptcha_site_key}))}}t.ZP=new class{init(e,t,s,a){switch(e.get("SETTINGS").captcha_type){case"no":this._captcha=new d;break;case"qa":this._captcha=new c;break;case"re":this._captcha=new u}this._captcha.init(e,t,s,a)}load(){return this._captcha.load()}validator(){return this._captcha.validator()}component(e){return this._captcha.component(e)}}},96142:function(e,t,s){"use strict";var a=s(19755);t.Z=new class{init(e){this._staticUrl=e,this._included=[]}include(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];-1===this._included.indexOf(e)&&(this._included.push(e),this._include(e,t))}_include(e,t){a.ajax({url:(t?"":this._staticUrl)+e,cache:!0,dataType:"script"})}}},62833:function(e,t,s){"use strict";let a=window.localStorage;t.Z=new class{init(e){this._prefix=e,this._watchers=[],window.addEventListener("storage",(e=>{let t=JSON.parse(e.newValue);this._watchers.forEach((function(s){s.key===e.key&&e.oldValue!==e.newValue&&s.callback(t)}))}))}set(e,t){a.setItem(this._prefix+e,JSON.stringify(t))}get(e){let t=a.getItem(this._prefix+e);return t?JSON.parse(t):null}watch(e,t){this._watchers.push({key:this._prefix+e,callback:t})}}},8621:function(e,t,s){"use strict";var a=s(4869),i=s(19755);t.Z=new class{init(e){this._element=e,this._component=null}show(e){this._component===e?this.hide():(this._component=e,(0,a.Z)(e,this._element.id),i(this._element).addClass("open"))}showConnected(e,t){this._component===e?this.hide():(this._component=e,(0,a.Z)(t,this._element.id,!0),i(this._element).addClass("open"))}hide(){i(this._element).removeClass("open"),this._component=null}}},59801:function(e,t,s){"use strict";var a=s(73935),i=s.n(a),o=s(4869),n=s(19755);t.Z=new class{init(e){this._element=e,this._modal=n(e).modal({show:!1}),this._modal.on("hidden.bs.modal",(()=>{i().unmountComponentAtNode(this._element)}))}show(e){(0,o.Z)(e,this._element.id),this._modal.modal("show")}hide(){this._modal.modal("hide")}}},53328:function(e,t,s){"use strict";t.Z=new class{init(e,t){this._indexTitle=e,this._forumName=t}set(e){if(!e)return void(document.title=this._indexTitle||this._forumName);"string"==typeof e&&(e={title:e});let t=e.title;e.page>1&&(t+=" ("+interpolate(gettext("page: %(page)s"),{page:e.page},!0)+")"),e.parent&&(t+=" | "+e.parent),document.title=t+" | "+this._forumName}}},55547:function(e,t,s){"use strict";t.Z=new class{init(e,t){this._ajax=e,this._snackbar=t,this._polls={}}start(e){this.stop(e.poll);const t=()=>{this._polls[e.poll]=e,this._ajax.get(e.url,e.data||null).then((s=>{this._polls[e.poll]._stopped||(e.update(s),this._polls[e.poll].timeout=window.setTimeout(t,e.frequency))}),(t=>{this._polls[e.poll]._stopped||(e.error?e.error(t):this._snackbar.apiError(t))}))};e.delayed?this._polls[e.poll]={timeout:window.setTimeout(t,e.frequency)}:t()}stop(e){this._polls[e]&&(window.clearTimeout(this._polls[e].timeout),this._polls[e]._stopped=!0)}}},64646:function(e,t,s){"use strict";var a=s(4942),i=s(57588),o=s.n(i),n=s(73935),r=s.n(n),l=s(78107),d=s(4869);t.Z=new class{constructor(){(0,a.Z)(this,"close",(()=>{this.unsetBeforeUnload(),this._isOpen&&!this._isClosing&&(this._isClosing=!0,this._mount.classList.remove("show"),window.setTimeout((()=>{r().unmountComponentAtNode(this._mount),this._observer.unobserve(this._mount),this._spacer.style.height="0px;",this._isClosing=!1,this._isOpen=!1,this._mode=null}),300))}))}init(e,t,s){this._ajax=e,this._snackbar=t,this._mount=s,this._mode=null,this._spacer=document.getElementById("posting-spacer"),this._observer=new ResizeObserver((e=>{this._spacer.style.height=e[0].contentRect.height+"px"})),this._isOpen=!1,this._isClosing=!1,this._beforeunloadSet=!1}isOpen(){return this._isOpen}setBeforeUnload(){this._beforeunloadSet||(window.addEventListener("beforeunload",this.beforeUnload,{capture:!0}),this._beforeunloadSet=!0)}unsetBeforeUnload(){window.removeEventListener("beforeunload",this.beforeUnload,{capture:!0}),this._beforeunloadSet=!1}beforeUnload(e){return e.returnValue="true","true"}open(e){if(!1===this._isOpen)this._mode=e.mode,this._isOpen=e.submit,this._realOpen(e);else if(this._isOpen!==e.submit){let t=gettext("You are already working on other message. Do you want to discard it?");window.confirm(t)&&(this._mode=e.mode,this._isOpen=e.submit,this._realOpen(e))}else"REPLY"==this._mode&&"REPLY"==e.mode&&this._realOpen(e)}_realOpen(e){(0,d.Z)(o().createElement(l.ZP,e),this._mount.id),this._mount.classList.add("show"),this._observer.observe(this._mount),this.setBeforeUnload()}}},53904:function(e,t,s){"use strict";var a=s(27346);t.Z=new class{init(e){this._store=e,this._timeout=null}alert(e,t){this._timeout?(window.clearTimeout(this._timeout),this._store.dispatch((0,a.p2)()),this._timeout=window.setTimeout((()=>{this._timeout=null,this.alert(e,t)}),300)):(this._store.dispatch((0,a.OV)(e,t)),this._timeout=window.setTimeout((()=>{this._store.dispatch((0,a.p2)()),this._timeout=null}),5e3))}info(e){this.alert(e,"info")}success(e){this.alert(e,"success")}warning(e){this.alert(e,"warning")}error(e){this.alert(e,"error")}apiError(e){let t=e.detail;t||(t=404===e.status?gettext("Action link is invalid."):gettext("Unknown error has occured.")),403===e.status&&"Permission denied"===t&&(t=gettext("You don't have permission to perform this action.")),this.error(t)}}},90287:function(e,t,s){"use strict";var a=s(41438);t.Z=new class{constructor(){this._store=null,this._reducers={},this._initialState={}}addReducer(e,t,s){this._reducers[e]=t,this._initialState[e]=s}init(){this._store=(0,a.createStore)((0,a.combineReducers)(this._reducers),this._initialState)}getStore(){return this._store}getState(){return this._store.getState()}dispatch(e){return this._store.dispatch(e)}}},59940:function(e,t,s){"use strict";t.Z=new class{init(e){this._include=e,this._isLoaded=!1}scorePassword(e,t){return this._isLoaded?zxcvbn(e,t).score:0}load(){return this._isLoaded?this._loadedPromise():(this._include.include("misago/js/zxcvbn.js"),this._loadingPromise())}_loadingPromise(){const e=this;return new Promise((function(t,s){var a=function(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;i+=1,i>200?s():"undefined"==typeof zxcvbn?window.setTimeout((function(){a(i)}),200):(e._isLoaded=!0,t())};a()}))}_loadedPromise(){return new Promise((function(e){e()}))}}},93051:function(e,t,s){"use strict";s.d(t,{Z:function(){return g}});var a,i=s(22928),o=s(30381),n=s.n(o),r=s(57588),l=s.n(r),d=s(73935),c=s.n(d),p=s(37424),u=class extends l().Component{getReasonMessage(){return this.props.message.html?(0,i.Z)("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.props.message.html}}):(0,i.Z)("p",{className:"lead"},void 0,this.props.message.plain)}getExpirationMessage(){if(this.props.expires){if(this.props.expires.isAfter(n()())){let e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.props.expires.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.props.expires.fromNow()},!0);return(0,i.Z)("abbr",{title:e},void 0,t)}return gettext("This ban has expired.")}return gettext("This ban is permanent.")}render(){return(0,i.Z)("div",{className:"page page-error page-error-banned"},void 0,(0,i.Z)("div",{className:"container"},void 0,(0,i.Z)("div",{className:"message-panel"},void 0,a||(a=(0,i.Z)("div",{className:"message-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,"highlight_off"))),(0,i.Z)("div",{className:"message-body"},void 0,this.getReasonMessage(),(0,i.Z)("p",{className:"message-footnote"},void 0,this.getExpirationMessage())))))}},h=s(32233),m=s(90287);let v=(0,p.$j)((function(e){return e.tick}))(u);function g(e,t){if(c().render((0,i.Z)(p.zt,{store:m.Z.getStore()},void 0,(0,i.Z)(v,{message:e.message,expires:e.expires_on?n()(e.expires_on):null})),document.getElementById("page-mount")),void 0===t||t){let e=h.Z.get("SETTINGS").forum_name;document.title=gettext("You are banned")+" | "+e,window.history.pushState({},"",h.Z.get("BANNED_URL"))}}},69130:function(e,t,s){"use strict";function a(e,t){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=[],i=[];if(e.forEach((function(e){i.push(e),i.length===t&&(a.push(i),i=[])})),!1!==s&&i.length>0&&i.length":">",'"':""","'":"'"};function i(e){return e.replace(/[&<>"']/g,(function(e){return a[e]}))}},48772:function(e,t,s){"use strict";function a(e){return e>1073741824?i(e/1073741824)+" GB":e>1048576?i(e/1048576)+" MB":e>1024?i(e/1024)+" KB":i(e)+" B"}function i(e){return e.toFixed(1)}s.d(t,{Z:function(){return a}})},4869:function(e,t,s){"use strict";s.d(t,{Z:function(){return l}});var a=s(22928),i=(s(57588),s(73935)),o=s.n(i),n=s(37424),r=s(90287);function l(e,t){let s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=document.getElementById(t),l=e.props?e:(0,a.Z)(e,{});i&&(s?o().render((0,a.Z)(n.zt,{store:r.Z.getStore()},void 0,l),i):o().render(l,i))}},44039:function(e,t,s){"use strict";function a(e,t){return Math.floor(Math.random()*(t-e+1))+e}s.d(t,{e:function(){return a}})},39633:function(e,t,s){"use strict";s.d(t,{Z:function(){return c}});var a=s(22928),i=(s(57588),s(73935)),o=s.n(i),n=s(37424),r=s(69987),l=s(90287);const d=document.getElementById("page-mount");function c(e){let t={component:e.component||null,childRoutes:[]};e.root?t.childRoutes=[{path:e.root,onEnter:function(t,s){s(null,e.paths[0].path)}}].concat(e.paths):t.childRoutes=e.paths,o().render((0,a.Z)(n.zt,{store:l.Z.getStore()},void 0,(0,a.Z)(r.F0,{routes:t,history:r.mW})),d)}},20370:function(e,t,s){"use strict";function a(e,t){if(-1===e.indexOf(t)){let s=e.slice();return s.push(t),s}return e.filter((function(e){return e!==t}))}s.d(t,{ZN:function(){return a}})},55210:function(e,t,s){"use strict";s.d(t,{BS:function(){return p},C1:function(){return n},Do:function(){return d},Ei:function(){return c},HR:function(){return u},Vb:function(){return v},fT:function(){return r},gS:function(){return h},jA:function(){return l},lG:function(){return m}});var a=s(19755);const i=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i,o=new RegExp("^[0-9a-z]+$","i");function n(e){return function(t){if(!1===t||null===t||0===a.trim(t).length)return e||gettext("This field is required.")}}function r(e){const t=gettext("You have to accept the terms of service.");return n(e||t)}function l(e){const t=gettext("You have to accept the privacy policy.");return n(e||t)}function d(e){return function(t){if(!i.test(t))return e||gettext("Enter a valid email address.")}}function c(e,t){return function(s){var i="",o=a.trim(s).length;if(oe)return i=t?t(e,o):ngettext("Ensure this value has at most %(limit_value)s character (it has %(show_value)s).","Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).",e),interpolate(i,{limit_value:e,show_value:o},!0)}}function u(e){return c(e,(function(e){return ngettext("Username must be at least %(limit_value)s character long.","Username must be at least %(limit_value)s characters long.",e)}))}function h(e){return p(e,(function(e){return ngettext("Username cannot be longer than %(limit_value)s character.","Username cannot be longer than %(limit_value)s characters.",e)}))}function m(){return function(e){if(!o.test(a.trim(e)))return gettext("Username can only contain latin alphabet letters and digits.")}}function v(e){return function(t){const s=t.length;if(s=i)&&Object.keys(o.O).every((function(e){return o.O[e](s[l])}))?s.splice(l--,1):(r=!1,i0&&e[c-1][2]>i;c--)e[c]=e[c-1];e[c]=[s,a,i]},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,{a:t}),t},o.d=function(e,t){for(var s in t)o.o(t,s)&&!o.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},o.f={},o.e=function(e){return Promise.all(Object.keys(o.f).reduce((function(t,s){return o.f[s](e,t),t}),[]))},o.u=function(e){return"hljs.js"},o.miniCssF=function(e){},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t={},s="misago:",o.l=function(e,a,i,n){if(t[e])t[e].push(a);else{var r,l;if(void 0!==i)for(var d=document.getElementsByTagName("script"),c=0;c{let{children:t,className:s}=e;return(0,a.Z)("div",{className:o()("flex-row",s)},void 0,t)},r=e=>{let{children:t,className:s,shrink:i}=e;return(0,a.Z)("div",{className:o()("flex-row-col",s,{"flex-row-col-shrink":i})},void 0,t)},l=e=>{let{auto:t,children:s,className:i}=e;return(0,a.Z)("div",{className:o()("flex-row-section",{"flex-row-section-auto":t},i)},void 0,s)}},59131:function(e,t,s){"use strict";var a=s(22928);s(57588),t.Z=e=>{let{children:t}=e;return(0,a.Z)("div",{className:"container page-container"},void 0,t)}},99755:function(e,t,s){"use strict";s.d(t,{mr:function(){return r},gC:function(){return l},sP:function(){return d},eA:function(){return c},Ql:function(){return p},bM:function(){return u},Iv:function(){return h}});var a,i=s(22928),o=s(94184),n=s.n(o);s(57588);var r=e=>{let{children:t,className:s,styleName:o}=e;return(0,i.Z)("div",{className:n()("page-header",s,o&&"page-header-"+o)},void 0,(0,i.Z)("div",{className:"page-header-bg-image"},void 0,(0,i.Z)("div",{className:"page-header-bg-overlay"},void 0,a||(a=(0,i.Z)("div",{className:"page-header-image"})),t)))},l=e=>{let{children:t,className:s,styleName:a}=e;return(0,i.Z)("div",{className:n()("page-header-banner",s,a&&"page-header-banner-"+a)},void 0,(0,i.Z)("div",{className:"page-header-banner-bg-image"},void 0,(0,i.Z)("div",{className:"page-header-banner-bg-overlay"},void 0,t)))},d=e=>{let{children:t}=e;return(0,i.Z)("div",{className:"container page-header-container"},void 0,t)},c=e=>{let{children:t,className:s}=e;return(0,i.Z)("div",{className:n()("page-header-details",s)},void 0,t)},p=e=>{let{className:t,message:s}=e;return(0,i.Z)("div",{className:n()("page-header-message",t),dangerouslySetInnerHTML:{__html:s}})},u=e=>{let{children:t,className:s}=e;return(0,i.Z)("div",{className:n()("page-header-message",s)},void 0,t)},h=e=>{let{styleName:t,header:s,message:a}=e;return(0,i.Z)(d,{},void 0,(0,i.Z)(r,{styleName:t},void 0,(0,i.Z)(l,{styleName:t},void 0,(0,i.Z)("h1",{},void 0,s)),a&&(0,i.Z)(c,{styleName:t},void 0,a)))}},26106:function(e,t,s){"use strict";var a=s(22928),i=(s(57588),s(32233)),o=s(89627);const n=e=>{const{agreement:t,checked:s,errors:i,url:n,value:r,onChange:l}=e;if(!n)return null;const d=interpolate('%(agreement)s',{agreement:(0,o.Z)(t),url:(0,o.Z)(n)},!0),c=interpolate(gettext("I have read and accept %(agreement)s."),{agreement:d},!0);return(0,a.Z)("div",{className:"checkbox legal-footnote"},void 0,(0,a.Z)("label",{},void 0,(0,a.Z)("input",{checked:s,type:"checkbox",value:r,onChange:l}),(0,a.Z)("span",{dangerouslySetInnerHTML:{__html:c}})),i&&i.map(((e,t)=>(0,a.Z)("div",{className:"help-block errors"},t,e))))};t.Z=e=>{const{errors:t,privacyPolicy:s,termsOfService:o,onPrivacyPolicyChange:r,onTermsOfServiceChange:l}=e,d=i.Z.get("TERMS_OF_SERVICE_ID"),c=i.Z.get("TERMS_OF_SERVICE_URL"),p=i.Z.get("PRIVACY_POLICY_ID"),u=i.Z.get("PRIVACY_POLICY_URL");return d||p?(0,a.Z)("div",{},void 0,(0,a.Z)(n,{agreement:gettext("the terms of service"),checked:null!==o,errors:t.termsOfService,url:c,value:d,onChange:l}),(0,a.Z)(n,{agreement:gettext("the privacy policy"),checked:null!==s,errors:t.privacyPolicy,url:u,value:p,onChange:r})):null}},47235:function(e,t,s){"use strict";var a,i=s(22928),o=(s(57588),s(32233));const n=e=>{let{className:t,text:s}=e;return s?(0,i.Z)("h5",{className:t||""},void 0,s):null};t.Z=e=>{const{buttonClassName:t,buttonLabel:s,formLabel:r,header:l,labelClassName:d}=e,c=o.Z.get("SOCIAL_AUTH");return 0===c.length?null:(0,i.Z)("div",{className:"form-group form-social-auth"},void 0,(0,i.Z)(n,{className:d,text:l}),(0,i.Z)("div",{className:"row"},void 0,c.map((e=>{let{pk:a,name:o,button_text:n,button_color:r,url:l}=e;const d="btn btn-block btn-default btn-social-"+a,c=r?{color:r}:null,p=n||interpolate(s,{site:o},!0);return(0,i.Z)("div",{className:t||"col-xs-12"},a,(0,i.Z)("a",{className:d,style:c,href:l},void 0,p))}))),a||(a=(0,i.Z)("hr",{})),(0,i.Z)(n,{className:d,text:r}))}},50366:function(e,t,s){"use strict";var a,i,o,n,r,l,d,c=s(22928);s(57588),t.Z=e=>{let{thread:t}=e;return(0,c.Z)("ul",{className:"thread-flags"},void 0,2==t.weight&&(0,c.Z)("li",{className:"thread-flag-pinned-globally",title:gettext("Pinned globally")},void 0,a||(a=(0,c.Z)("span",{className:"material-icon"},void 0,"bookmark"))),1==t.weight&&(0,c.Z)("li",{className:"thread-flag-pinned-locally",title:gettext("Pinned in category")},void 0,i||(i=(0,c.Z)("span",{className:"material-icon"},void 0,"bookmark_outline"))),t.best_answer&&(0,c.Z)("li",{className:"thread-flag-answered",title:gettext("Answered")},void 0,o||(o=(0,c.Z)("span",{className:"material-icon"},void 0,"check_circle"))),t.has_poll&&(0,c.Z)("li",{className:"thread-flag-poll",title:gettext("Poll")},void 0,n||(n=(0,c.Z)("span",{className:"material-icon"},void 0,"poll"))),(t.is_unapproved||t.has_unapproved_posts)&&(0,c.Z)("li",{className:"thread-flag-unapproved",title:t.is_unapproved?gettext("Awaiting approval"):gettext("Has unapproved posts")},void 0,r||(r=(0,c.Z)("span",{className:"material-icon"},void 0,"visibility"))),t.is_closed&&(0,c.Z)("li",{className:"thread-flag-closed",title:gettext("Closed")},void 0,l||(l=(0,c.Z)("span",{className:"material-icon"},void 0,"lock"))),t.is_hidden&&(0,c.Z)("li",{className:"thread-flag-hidden",title:gettext("Hidden")},void 0,d||(d=(0,c.Z)("span",{className:"material-icon"},void 0,"visibility_off"))))}},16768:function(e,t,s){"use strict";var a,i=s(22928);s(57588),t.Z=e=>{let{thread:t}=e;return(0,i.Z)("span",{className:"threads-replies",title:interpolate(ngettext("%(replies)s reply","%(replies)s replies",t.replies),{replies:t.replies},!0)},void 0,a||(a=(0,i.Z)("span",{className:"material-icon"},void 0,"chat_bubble_outline")),t.replies>980?Math.round(t.replies/1e3)+"K":t.replies)}},92490:function(e,t,s){"use strict";s.d(t,{o8:function(){return n},Eg:function(){return r},Z2:function(){return l},tw:function(){return d}});var a=s(22928),i=s(94184),o=s.n(i);s(57588);var n=e=>{let{children:t,className:s}=e;return(0,a.Z)("nav",{className:o()("toolbar",s)},void 0,t)},r=e=>{let{children:t,className:s,shrink:i}=e;return(0,a.Z)("div",{className:o()("toolbar-item",s,{"toolbar-item-shrink":i})},void 0,t)},l=e=>{let{auto:t,children:s,className:i}=e;return(0,a.Z)("div",{className:o()("toolbar-section",{"toolbar-section-auto":t},i)},void 0,s)},d=e=>{let{className:t}=e;return(0,a.Z)("div",{className:o()("toolbar-spacer",t)})}},19605:function(e,t,s){"use strict";s.d(t,{ZP:function(){return o}});var a=s(22928),i=(s(57588),s(32233));function o(e){const t=e.size||100,s=e.size2x||t;return(0,a.Z)("img",{alt:"",className:e.className||"user-avatar",src:n(e.user,t),srcSet:n(e.user,s),width:t,height:t})}function n(e,t){return e&&e.id?function(e,t){let s=e[0];return e.forEach((e=>{e.size>=t&&(s=e)})),s}(e.avatars,t).url:i.Z.get("BLANK_AVATAR_URL")}},82211:function(e,t,s){"use strict";s.d(t,{Z:function(){return l}});var a,i=s(22928),o=s(57588),n=s.n(o),r=s(37848);class l extends n().Component{render(){let e="btn "+this.props.className,t=this.props.disabled;return this.props.loading&&(e+=" btn-loading",t=!0),(0,i.Z)("button",{className:e,disabled:t,onClick:this.props.onClick,type:this.props.onClick?"button":"submit"},void 0,this.props.children,this.props.loading?a||(a=(0,i.Z)(r.Z,{})):null)}}l.defaultProps={className:"btn-default",type:"submit",loading:!1,disabled:!1,onClick:null}},57026:function(e,t,s){"use strict";s.d(t,{Z:function(){return i}});var a=s(22928);function i(e){return(0,a.Z)("select",{className:e.className||"form-control",disabled:e.disabled||!1,id:e.id||null,onChange:e.onChange,value:e.value},void 0,e.choices.map((e=>(0,a.Z)("option",{disabled:e.disabled||!1,value:e.value},e.value,"- - ".repeat(e.level)+e.label))))}s(57588)},21688:function(e,t,s){"use strict";s.d(t,{Z:function(){return x}});var a=s(22928),i=s(57588),o=s.n(i),n=s(33556);function r(e){let{display:t}=e;return t?(0,a.Z)(n.Z,{helpText:gettext("No profile details are editable at this time."),message:gettext("This option is currently unavailable.")}):null}var l,d=s(37848);function c(e){let{display:t}=e;return t?l||(l=(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)(d.Z,{}))):null}var p=s(4942),u=s(60471),h=class extends o().Component{constructor(){super(...arguments),(0,p.Z)(this,"onChange",(e=>{const{field:t,onChange:s}=this.props;s(t.fieldname,e.target.value)}))}render(){const{disabled:e,field:t,value:s}=this.props,{input:i}=t;return"select"===i.type?(0,a.Z)(u.Z,{choices:i.choices,disabled:e,id:"id_"+t.fieldname,onChange:this.onChange,value:s}):"textarea"===i.type?(0,a.Z)("textarea",{className:"form-control",disabled:e,id:"id_"+t.fieldname,onChange:this.onChange,rows:"4",type:"text",value:s}):"text"===i.type?(0,a.Z)("input",{className:"form-control",disabled:e,id:"id_"+t.fieldname,onChange:this.onChange,type:"text",value:s}):null}},m=s(96359);function v(e){let{disabled:t,errors:s,fields:i,name:o,onChange:n,value:r}=e;return(0,a.Z)("fieldset",{},void 0,(0,a.Z)("legend",{},void 0,o),i.map((e=>(0,a.Z)(m.Z,{for:"id_"+e.fieldname,helpText:e.help_text,label:e.label,validation:s[e.fieldname]},e.fieldname,(0,a.Z)(h,{disabled:t,field:e,onChange:n,value:r[e.fieldname]})))))}var g=s(82211),Z=s(43345),b=s(78657),f=s(53904),_=class extends Z.Z{constructor(e){super(e),(0,p.Z)(this,"onChange",((e,t)=>{this.setState({[e]:t})})),this.state={isLoading:!1,errors:{}};const t=e.groups.length;for(let s=0;s(0,a.Z)(v,{disabled:this.state.isLoading,errors:this.state.errors,fields:e.fields,name:e.name,onChange:this.onChange,value:this.state},t)))),(0,a.Z)("div",{className:"panel-footer text-right"},void 0,(0,a.Z)(N,{disabled:this.state.isLoading,onCancel:this.props.onCancel})," ",(0,a.Z)(g.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Save changes"))))}};function N(e){let{onCancel:t,disabled:s}=e;return t?(0,a.Z)("button",{className:"btn btn-default",disabled:s,onClick:t,type:"button"},void 0,gettext("Cancel")):null}var x=class extends o().Component{constructor(e){super(e),this.state={loading:!0,groups:null}}componentDidMount(){b.Z.get(this.props.api).then((e=>{this.setState({loading:!1,groups:e})}),(e=>{f.Z.apiError(e),this.props.cancel&&this.props.cancel()}))}render(){const{groups:e,loading:t}=this.state;return(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Edit details"))),(0,a.Z)(c,{display:t}),(0,a.Z)(r,{display:!t&&!e.length}),(0,a.Z)(y,{api:this.props.api,display:!t&&e.length,groups:e,onCancel:this.props.onCancel,onSuccess:this.props.onSuccess}))}};function y(e){let{api:t,display:s,groups:i,onCancel:o,onSuccess:n}=e;return s?(0,a.Z)(_,{api:t,groups:i,onCancel:o,onSuccess:n}):null}},96359:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i);t.Z=class extends o().Component{isValidated(){return void 0!==this.props.validation}getClassName(){let e="form-group";return this.isValidated()&&(e+=" has-feedback",null===this.props.validation?e+=" has-success":e+=" has-error"),e}getFeedback(){return this.props.validation?(0,a.Z)("div",{className:"help-block errors"},void 0,this.props.validation.map(((e,t)=>(0,a.Z)("p",{},this.props.for+"FeedbackItem"+t,e)))):null}getFeedbackDescription(){return this.isValidated()?(0,a.Z)("span",{id:this.props.for+"_status",className:"sr-only"},void 0,this.props.validation?gettext("(error)"):gettext("(success)")):null}getHelpText(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}render(){return(0,a.Z)("div",{className:this.getClassName()},void 0,(0,a.Z)("label",{className:"control-label "+(this.props.labelClass||""),htmlFor:this.props.for||""},void 0,this.props.label+":"),(0,a.Z)("div",{className:this.props.controlClass||""},void 0,this.props.children,this.getFeedbackDescription(),this.getFeedback(),this.getHelpText(),this.props.extra||null))}}},43345:function(e,t,s){"use strict";var a=s(4942),i=s(57588),o=s.n(i),n=s(55210),r=s(53904);let l=(0,n.C1)();t.Z=class extends o().Component{constructor(){super(...arguments),(0,a.Z)(this,"bindInput",(e=>t=>{this.changeValue(e,t.target.value)})),(0,a.Z)(this,"changeValue",((e,t)=>{let s={[e]:t};const a=this.state.errors||{};a[e]=this.validateField(e,s[e]),s.errors=a,this.setState(s)})),(0,a.Z)(this,"handleSubmit",(e=>{if(e&&e.preventDefault(),!this.state.isLoading&&this.clean()){this.setState({isLoading:!0});let e=this.send();e?e.then((e=>{this.setState({isLoading:!1}),this.handleSuccess(e)}),(e=>{this.setState({isLoading:!1}),this.handleError(e)})):this.setState({isLoading:!1})}}))}validate(){let e={};if(!this.state.validators)return e;let t={required:this.state.validators.required||this.state.validators,optional:this.state.validators.optional||{}},s=[];for(let e in t.required)t.required.hasOwnProperty(e)&&t.required[e]&&s.push(e);for(let e in t.optional)t.optional.hasOwnProperty(e)&&t.optional[e]&&s.push(e);for(let t in s){let a=s[t],i=this.validateField(a,this.state[a]);null===i?e[a]=null:i&&(e[a]=i)}return e}isValid(){let e=this.validate();for(let t in e)if(e.hasOwnProperty(t)&&null!==e[t])return!1;return!0}validateField(e,t){let s=[];if(!this.state.validators)return s;let a={required:(this.state.validators.required||this.state.validators)[e],optional:(this.state.validators.optional||{})[e]},i=l(t)||!1;if(a.required){if(i)s=[i];else for(let e in a.required){let i=a.required[e](t);i&&s.push(i)}return s.length?s:null}if(!1===i&&a.optional){for(let e in a.optional){let i=a.optional[e](t);i&&s.push(i)}return s.length?s:null}return!1}clean(){return!0}send(){return null}handleSuccess(e){}handleError(e){r.Z.apiError(e)}}},94417:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i);t.Z=class extends o().Component{isActive(){return this.props.isControlled?this.props.isActive:!!this.props.path&&0===document.location.pathname.indexOf(this.props.path)}getClassName(){return this.isActive()?(this.props.className||"")+" "+(this.props.activeClassName||"active"):this.props.className||""}render(){return(0,a.Z)("li",{className:this.getClassName()},void 0,this.props.children)}}},37848:function(e,t,s){"use strict";s.d(t,{Z:function(){return o}});var a,i=s(22928);function o(e){return(0,i.Z)("div",{className:e.className||"loader"},void 0,a||(a=(0,i.Z)("div",{className:"loader-spinning-wheel"})))}s(57588)},52753:function(e,t,s){"use strict";var a,i=s(22928),o=s(4942),n=(s(57588),s(82211)),r=s(43345),l=s(96359),d=s(78657),c=s(59801);function p(e){let{choices:t,onChange:s,value:a}=e;return t?(0,i.Z)(l.Z,{label:gettext("Best answer"),helpText:gettext("Please select the best answer for your newly merged thread. No posts will be deleted during the merge."),for:"id_best_answer"},void 0,(0,i.Z)("select",{className:"form-control",id:"id_best_answer",onChange:s,value:a},void 0,t.map((e=>(0,i.Z)("option",{value:e[0]},e[0],e[1]))))):null}function u(e){let{choices:t,onChange:s,value:a}=e;return t?(0,i.Z)(l.Z,{label:gettext("Poll"),helpText:gettext("Please select the poll for your newly merged thread. Rejected polls will be permanently deleted and cannot be recovered."),for:"id_poll"},void 0,(0,i.Z)("select",{className:"form-control",id:"id_poll",onChange:s,value:a},void 0,t.map((e=>(0,i.Z)("option",{value:e[0]},e[0],e[1]))))):null}t.ZP=class extends r.Z{constructor(e){super(e),(0,o.Z)(this,"handleSuccess",(e=>{this.props.onSuccess(e),c.Z.hide()})),(0,o.Z)(this,"handleError",(e=>{this.props.onError(e)})),(0,o.Z)(this,"onBestAnswerChange",(e=>{this.changeValue("bestAnswer",e.target.value)})),(0,o.Z)(this,"onPollChange",(e=>{this.changeValue("poll",e.target.value)})),this.state={isLoading:!1,bestAnswer:"0",poll:"0"}}clean(){return!this.props.polls||"0"!==this.state.poll||window.confirm(gettext("Are you sure you want to delete all polls?"))}send(){const e=Object.assign({},this.props.data,{best_answer:this.state.bestAnswer,poll:this.state.poll});return d.Z.post(this.props.api,e)}render(){return(0,i.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,a||(a=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Merge threads"))),(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(p,{choices:this.props.bestAnswers,onChange:this.onBestAnswerChange,value:this.state.bestAnswer}),(0,i.Z)(u,{choices:this.props.polls,onChange:this.onPollChange,value:this.state.poll})),(0,i.Z)("div",{className:"modal-footer"},void 0,(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,i.Z)(n.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Merge threads"))))))}}},69092:function(e,t,s){"use strict";s.d(t,{Z:function(){return h}});var a=s(94184),i=s.n(a),o=s(57588),n=s.n(o),r=s(4942),l=s(19755);const d=new RegExp("^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*");var c=new class{constructor(){(0,r.Z)(this,"render",(e=>{e&&(this.highlightCode(e),this.embedYoutubePlayers(e))})),this._youtube={}}highlightCode(e){s.e(417).then(s.bind(s,15739)).then((t=>{let{default:s}=t;const a=e.querySelectorAll("pre>code");for(let e=0;ea");for(let e=0;e');l(e).replaceWith(a),a.wrap('
    ')}};function p(e){const t=function(e){let t=e;return"https://"===e.substr(0,8)?t=t.substr(8):"http://"===e.substr(0,7)&&(t=t.substr(7)),"www."===t.substr(0,4)&&(t=t.substr(4)),t}(e),s=function(e){if(-1===e.indexOf("youtu"))return null;const t=e.match(d);return t?t[1]:null}(t);if(!s)return null;let a=0;if(t.indexOf("?")>0){const e=t.substr(t.indexOf("?")+1).split("&").filter((e=>"t="===e.substr(0,2)))[0];if(e){const t=e.substr(2).split("m");"s"===t[0].substr(-1)?a+=parseInt(t[0].substr(0,t[0].length-1)):(a+=60*parseInt(t[0]),t[1]&&"s"===t[1].substr(-1)&&(a+=parseInt(t[1].substr(0,t[1].length-1))))}}return{start:a,video:s}}var u=s(19755),h=class extends n().Component{componentDidMount(){c.render(this.documentNode),u(this.documentNode).find(".spoiler-reveal").click(m)}componentDidUpdate(e,t){c.render(this.documentNode),u(this.documentNode).find(".spoiler-reveal").click(m)}shouldComponentUpdate(e,t){return e.markup!==this.props.markup}render(){return n().createElement("article",{className:i()("misago-markup",this.props.className),dangerouslySetInnerHTML:{__html:this.props.markup},"data-author":this.props.author||void 0,ref:e=>{this.documentNode=e}})}};function m(e){var t=e.target;u(t).parent().parent().addClass("revealed")}},3784:function(e,t,s){"use strict";var a,i=s(22928),o=s(57588),n=s.n(o),r=s(37848);t.Z=class extends n().Component{render(){return a||(a=(0,i.Z)("div",{className:"modal-body modal-loader"},void 0,(0,i.Z)(r.Z,{})))}}},30337:function(e,t,s){"use strict";var a=s(22928),i=(s(57588),s(33556));t.Z=class extends i.Z{getHelpText(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}render(){return(0,a.Z)("div",{className:"modal-body"},void 0,(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,this.props.icon||"info_outline")),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,this.props.message),this.getHelpText(),(0,a.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}}},95187:function(e,t,s){"use strict";var a,i=s(22928),o=s(57588),n=s.n(o),r=s(37848);t.Z=class extends n().Component{render(){return a||(a=(0,i.Z)("div",{className:"panel-body panel-body-loading"},void 0,(0,i.Z)(r.Z,{className:"loader loader-spaced"})))}}},33556:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i);t.Z=class extends o().Component{getHelpText(){return this.props.helpText?(0,a.Z)("p",{className:"help-block"},void 0,this.props.helpText):null}render(){return(0,a.Z)("div",{className:"panel-body panel-message-body"},void 0,(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,this.props.icon||"info_outline")),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,this.props.message),this.getHelpText()))}}},11005:function(e,t,s){"use strict";s.d(t,{Z:function(){return w}});var a=s(22928),i=s(57588),o=s.n(i),n=s(69092);function r(e){return e.post.content?o().createElement(l,e):o().createElement(d,e)}function l(e){return(0,a.Z)("div",{className:"post-body"},void 0,(0,a.Z)(n.Z,{markup:e.post.content}))}function d(e){return(0,a.Z)("div",{className:"post-body post-body-invalid"},void 0,(0,a.Z)("p",{className:"lead"},void 0,gettext("This post's contents cannot be displayed.")),(0,a.Z)("p",{className:"text-muted"},void 0,gettext("This error is caused by invalid post content manipulation.")))}function c(e){let{post:t}=e;const{category:s,thread:i}=t,o=interpolate(gettext("posted %(posted_on)s"),{posted_on:t.posted_on.format("LL, LT")},!0);return(0,a.Z)("div",{className:"post-heading"},void 0,(0,a.Z)("a",{className:"btn btn-link item-title",href:i.url},void 0,i.title),(0,a.Z)("a",{className:"btn btn-link post-category",href:s.url.index},void 0,s.name),(0,a.Z)("a",{href:t.url.index,className:"btn btn-link posted-on",title:o},void 0,t.posted_on.fromNow()))}var p,u,h=s(19605);function m(e){let{post:t}=e;return(0,a.Z)("a",{className:"btn btn-default btn-icon pull-right",href:t.url.index},void 0,(0,a.Z)("span",{className:"btn-text-left hidden-xs"},void 0,gettext("See post")),p||(p=(0,a.Z)("span",{className:"material-icon"},void 0,"chevron_right")))}function v(e){let{post:t}=e;return(0,a.Z)("div",{className:"post-side post-side-anonymous"},void 0,(0,a.Z)(m,{post:t}),(0,a.Z)("div",{className:"media"},void 0,u||(u=(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("span",{},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50})))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("span",{className:"item-title"},void 0,t.poster_name)),(0,a.Z)("span",{className:"user-title user-title-anonymous"},void 0,gettext("Removed user")))))}function g(e){let{rank:t,title:s}=e,i=s||t.title||t.name,o="user-title";return t.css_class&&(o+=" user-title-"+t.css_class),t.is_tab?(0,a.Z)("a",{className:o,href:t.url},void 0,i):(0,a.Z)("span",{className:o},void 0,i)}function Z(e){let{post:t,poster:s}=e;return(0,a.Z)("div",{className:"post-side post-side-registered"},void 0,(0,a.Z)(m,{post:t}),(0,a.Z)("div",{className:"media"},void 0,(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("a",{href:s.url},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50,user:s}))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("a",{className:"item-title",href:s.url},void 0,s.username)),(0,a.Z)(g,{title:s.title,rank:s.rank}))))}function b(e){let{post:t,poster:s}=e;return s&&s.id?(0,a.Z)(Z,{post:t,poster:s}):(0,a.Z)(v,{post:t})}function f(e){let{post:t,poster:s}=e;const i=s||t.poster;let o="post";return i&&i.rank.css_class&&(o+=" post-"+i.rank.css_class),(0,a.Z)("li",{className:o,id:"post-"+t.id},void 0,(0,a.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("div",{className:"panel-content"},void 0,(0,a.Z)(b,{post:t,poster:i}),(0,a.Z)(c,{post:t}),(0,a.Z)(r,{post:t})))))}var _,N,x=s(44039);function y(){return(0,a.Z)("ul",{className:"posts-list post-feed ui-preview"},void 0,(0,a.Z)("li",{className:"post"},void 0,(0,a.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("div",{className:"panel-content"},void 0,(0,a.Z)("div",{className:"post-side post-side-anonymous"},void 0,(0,a.Z)("div",{className:"media"},void 0,_||(_=(0,a.Z)("div",{className:"media-left"},void 0,(0,a.Z)("span",{},void 0,(0,a.Z)(h.ZP,{className:"poster-avatar",size:50})))),(0,a.Z)("div",{className:"media-body"},void 0,(0,a.Z)("div",{className:"media-heading"},void 0,(0,a.Z)("span",{className:"item-title"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," "))),(0,a.Z)("span",{className:"user-title user-title-anonymous"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," "))))),(0,a.Z)("div",{className:"post-heading"},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," ")),(0,a.Z)("div",{className:"post-body"},void 0,(0,a.Z)("article",{className:"misago-markup"},void 0,(0,a.Z)("p",{},void 0,(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," ")," ",(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," ")," ",(0,a.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,200)+"px"}},void 0," ")))))))))}function w(e){let{isReady:t,posts:s,poster:i}=e;return t?(0,a.Z)("ul",{className:"posts-list post-feed ui-ready"},void 0,s.map((e=>(0,a.Z)(f,{post:e,poster:i},e.id)))):N||(N=(0,a.Z)(y,{}))}},78107:function(e,t,s){"use strict";s.d(t,{mv:function(){return d},ZP:function(){return ls},MO:function(){return C},Fi:function(){return v}});var a,i=s(57588),o=s.n(i),n=s(22928),r=s(4942),l=s(64646);class d extends o().Component{constructor(e){super(e),(0,r.Z)(this,"selected",(()=>{if(this.element){const e=p(this.element)||null,t=e?e.getBoundingClientRect():null;this.setState({range:e,rect:t})}})),(0,r.Z)(this,"reply",(()=>{if(l.Z.isOpen()){const e=C();e&&!e.disabled&&(e.quote(v(this.state.range)),this.setState({range:null,rect:null}),c())}else{const e=v(this.state.range);l.Z.open(Object.assign({},this.props.posting,{default:e})),this.setState({range:null,rect:null}),window.setTimeout(c,1e3)}})),(0,r.Z)(this,"render",(()=>(0,n.Z)("div",{},void 0,o().createElement("div",{ref:e=>{e&&(this.element=e)},onMouseUp:this.selected,onTouchEnd:this.selected},this.props.children),!!this.state.rect&&(0,n.Z)("div",{className:"quote-control",style:{position:"absolute",left:this.state.rect.left+window.scrollX,top:this.state.rect.bottom+window.scrollY}},void 0,a||(a=(0,n.Z)("div",{className:"quote-control-arrow"})),(0,n.Z)("div",{className:"quote-control-inner"},void 0,(0,n.Z)("button",{className:"btn quote-control-btn",type:"button",onClick:this.reply},void 0,pgettext("post reply","Quote"))))))),this.state={range:null,rect:null},this.element=null}}function c(){const e=document.querySelector("#posting-mount textarea");e.focus(),e.selectionStart=e.selectionEnd=e.value.length}const p=e=>{if(void 0===window.getSelection)return;const t=window.getSelection();if(!t)return;if("Range"!==t.type)return;if(1!==t.rangeCount)return;const s=t.getRangeAt(0);return u(s,e)&&h(s)&&m(s.cloneContents())?s:void 0},u=(e,t)=>{const s=e.commonAncestorContainer;if(s===t)return!0;let a=s.parentNode;for(;a;){if(a===t)return!0;a=a.parentNode}return!1},h=e=>{const t=e.commonAncestorContainer;if("ARTICLE"===t.nodeName)return!0;if(t.dataset&&"1"===t.dataset.noquote)return!1;let s=t.parentNode;for(;s;){if(s.dataset&&"1"===s.dataset.noquote)return!1;if("ARTICLE"===s.nodeName)return!0;s=s.parentNode}return!1},m=e=>{for(let t=0;t0)return!0;if("IMG"===s.nodeName)return!0;if(m(s))return!0}return!1};var v=e=>{const t=g(e);let s=y(e.cloneContents().childNodes,[]),a=t?`[quote="${t}"]\n`:"[quote]\n",i="\n[/quote]\n\n";const o=f(e);return o?(a+=o.syntax?`[code=${o.syntax}]\n`:"[code]\n",i="\n[/code]"+i):N(e)?(s=s.trim(),a+="`",i="`"+i):s=s.trim(),a+s+i};const g=e=>{const t=e.commonAncestorContainer;if(Z(t))return b(t);let s=t.parentNode;for(;s;){if(Z(s))return b(s);s=s.parentNode}return""},Z=e=>e.nodeType===Node.ELEMENT_NODE&&("ARTICLE"===e.nodeName||"BLOCKQUOTE"===e.nodeName&&e.dataset&&"quote"===e.dataset.block),b=e=>e.dataset&&e.dataset.author||null,f=e=>{const t=e.commonAncestorContainer;if(_(t))return x(t);let s=t.parentNode;for(;s;){if(_(s))return x(s);s=s.parentNode}return null},_=e=>"PRE"===e.nodeName,N=e=>{const t=e.commonAncestorContainer;if("CODE"===t.nodeName)return!0;let s=t.parentNode;for(;s;){if(Z(s))return!1;if("CODE"===s.nodeName)return!0;s=s.parentNode}return!1},x=e=>e.dataset?{syntax:e.dataset.syntax||null}:{syntax:null},y=(e,t)=>{let s="";for(let a=0;a{const s=e.dataset||{};if(e.nodeType===Node.TEXT_NODE)return e.textContent||"";if(e.nodeType===Node.ELEMENT_NODE){if(s.quote)return s.quote||"";if("1"===s.noquote)return""}if(e.nodeType===Node.ELEMENT_NODE&&s.quote&&s.quote.trim())return"";if("HR"===e.nodeName)return"\n\n- - -";if(w[e.nodeName]){const[s,a]=w[e.nodeName];return s+y(e.childNodes,[...t,e.nodeName])+a}if("A"===e.nodeName){const s=e.href,a=y(e.childNodes,[...t,e.nodeName]);return a?`[${a}](${s})`:`!(${s})`}if("IMG"===e.nodeName){const t=e.src,s=e.alt;return s?`![${s}](${t})`:`!(${t})`}if("DIV"===e.nodeName||"ASIDE"===e.nodeName){const a=s.block&&s.block.toUpperCase();if(a&&w[a]){const[s,i]=w[a];return s+y(e.childNodes,[...t,a])+i}return y(e.childNodes,t)}if("BLOCKQUOTE"===e.nodeName){if("spoiler"===s.block){const s=y(e.childNodes,[...t,"SPOILER"]).trim();if(!s)return"";let a="\n[spoiler]\n";return a+=s,a+="\n[/spoiler]",a}const a=y(e.childNodes,[...t,"QUOTE"]).trim();if(!a)return"";const i=b(e);let o=i?`\n[quote=${i}]\n`:"\n\n[quote]\n";return o+=a,o+="\n[/quote]",o}if("PRE"===e.nodeName){const t=s.syntax||null,a=e.querySelector("code"),i=a&&a.innerText||"";return i.trim()?"\n[code"+(t?"="+t:"")+"]"+i+"[/code]":""}if("CODE"===e.nodeName)return"`"+e.innerText+"`";if("P"===e.nodeName)return"\n"+y(e.childNodes,[...t,e.nodeName]);if("UL"===e.nodeName||"OL"===e.nodeName)return(0===t.filter((e=>"OL"===e||"UL"===e)).length?"\n":"")+y(e.childNodes,[...t,e.nodeName]);if("LI"===e.nodeName){let a="";const i=t.filter((e=>"OL"===e||"UL"===e)).length;for(let e=1;ee.id&&!e.isRemoved)).map((e=>e.id))}var A,I=s(12891),D=s(78657),j=s(53904),z=s(94184),U=s.n(z),M=s(32233),B=s(69092),q=s(59801),H=s(48772);function F(e){let{attachment:t}=e;return(0,n.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,A||(A=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Attachment details"))),(0,n.Z)("div",{className:"modal-body"},void 0,!!t.is_image&&(0,n.Z)("div",{className:"markup-editor-attachment-modal-preview"},void 0,(0,n.Z)("a",{href:t.url.index+"?shva=1",target:"_blank"},void 0,(0,n.Z)("img",{src:t.url.index+"?shva=1",alt:""}))),(0,n.Z)("div",{className:"markup-editor-attachment-modal-filename"},void 0,t.filename),(0,n.Z)("div",{className:"row markup-editor-attachment-modal-details"},void 0,(0,n.Z)("div",{className:"col-xs-12 col-md-3"},void 0,(0,n.Z)("strong",{},void 0,t.filetype+", "+(0,H.Z)(t.size)),(0,n.Z)("div",{className:"text-muted"},void 0,(0,n.Z)("small",{},void 0,pgettext("markup editor","Type and size")))),(0,n.Z)("div",{className:"col-xs-12 col-md-4"},void 0,(0,n.Z)("strong",{},void 0,(0,n.Z)("abbr",{title:t.uploaded_on.format("LLL")},void 0,t.uploaded_on.fromNow())),(0,n.Z)("div",{className:"text-muted"},void 0,(0,n.Z)("small",{},void 0,pgettext("markup editor","Uploaded at")))),(0,n.Z)("div",{className:"col-xs-12 col-md-3"},void 0,t.url.uploader?(0,n.Z)("a",{href:t.url.uploader,target:"_blank",className:"item-title"},void 0,t.uploader_name):(0,n.Z)("span",{className:"item-title"},void 0,t.uploader_name),(0,n.Z)("div",{className:"text-muted"},void 0,(0,n.Z)("small",{},void 0,pgettext("markup editor","Uploader")))))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("modal","Close")))))}const Y=(e,t,s,a,i)=>{const o=e.text||i||"";let n=e.prefix;n+=s+o+a,n+=e.suffix,t(n),window.setTimeout((()=>{W(e.textarea);const t=e.start+s.length;e.textarea.setSelectionRange(t,t+o.length)}),250)},V=(e,t,s)=>{let a=e.prefix;a+=s,a+=e.suffix,t(a),window.setTimeout((()=>{W(e.textarea);const t=e.end+s.length;e.textarea.setSelectionRange(t,t)}),250)},G=e=>{if(document.selection){e.focus();const t=document.selection.createRange(),s=t.text.length;return t.moveStart("character",-e.value.length),$(e,t.text.length-s,t.text.length)}if(e.selectionStart||"0"==e.selectionStart)return $(e,e.selectionStart,e.selectionEnd)},$=(e,t,s)=>({textarea:e,start:t,end:s,text:e.value.substring(t,s),prefix:e.value.substring(0,t),suffix:e.value.substring(s)});function W(e){const t=e.scrollTop;e.focus(),e.scrollTop=t}var Q,K,J,X,ee,te,se=e=>{var t;let{attachment:s,disabled:a,element:i,setState:o,update:r}=e;return(0,n.Z)("div",{className:"markup-editor-attachments-item"},void 0,(0,n.Z)("div",{className:"markup-editor-attachment"},void 0,(0,n.Z)("div",{className:"markup-editor-attachment-details"},void 0,s.id?(0,n.Z)("a",{className:"item-title",href:s.url.index+"?shva=1",target:"_blank",onClick:e=>{e.preventDefault(),q.Z.show(t||(t=(0,n.Z)(F,{attachment:s})))}},void 0,s.filename):(0,n.Z)("strong",{className:"item-title"},void 0,s.filename),(0,n.Z)("div",{className:"text-muted"},void 0,(0,n.Z)("ul",{className:"list-unstyled list-inline"},void 0,!s.id&&(0,n.Z)("li",{},void 0,s.progress+"%"),!!s.filetype&&(0,n.Z)("li",{},void 0,s.filetype),s.size>0&&(0,n.Z)("li",{},void 0,(0,H.Z)(s.size))))),!!s.id&&(0,n.Z)("div",{className:"markup-editor-attachment-buttons"},void 0,(0,n.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Insert into message"),type:"button",disabled:a,onClick:()=>{const e=function(e){let t="[";return e.is_image?(t+="!["+e.filename+"]",t+="("+(e.url.thumb||e.url.index)+"?shva=1)"):t+=e.filename,t+="]("+e.url.index+"?shva=1)",t}(s),t=G(i);V(t,r,e)}},void 0,Q||(Q=(0,n.Z)("span",{className:"material-icon"},void 0,"flip_to_front"))),(0,n.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Remove attachment"),type:"button",disabled:a,onClick:()=>{o((e=>{let{attachments:t}=e;if(window.confirm(pgettext("markup editor","Remove this attachment?")))return{attachments:t.filter((e=>{let{id:t}=e;return t!==s.id}))}}))}},void 0,K||(K=(0,n.Z)("span",{className:"material-icon"},void 0,"close")))),!s.id&&!!s.key&&(0,n.Z)("div",{className:"markup-editor-attachment-buttons"},void 0,s.error&&(0,n.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","See error"),type:"button",onClick:()=>{j.Z.error(interpolate(pgettext("markup editor","%(filename)s: %(error)s"),{filename:s.filename,error:s.error},!0))}},void 0,J||(J=(0,n.Z)("span",{className:"material-icon"},void 0,"warning"))),(0,n.Z)("button",{className:"btn btn-markup-editor-attachment btn-icon",title:pgettext("markup editor","Remove attachment"),type:"button",disabled:a,onClick:()=>{o((e=>{let{attachments:t}=e;return{attachments:t.filter((e=>{let{key:t}=e;return t!==s.key}))}}))}},void 0,X||(X=(0,n.Z)("span",{className:"material-icon"},void 0,"close"))))))},ae=e=>{let{attachments:t,disabled:s,element:a,setState:i,update:o}=e;return(0,n.Z)("div",{className:"markup-editor-attachments"},void 0,(0,n.Z)("div",{className:"markup-editor-attachments-container"},void 0,t.map((e=>(0,n.Z)(se,{attachment:e,disabled:s,element:a,setState:i,update:o},e.key||e.id)))))},ie=s(82211),oe=e=>{let{canProtect:t,disabled:s,empty:a,preview:i,isProtected:o,submitText:r,showPreview:l,closePreview:d,enableProtection:c,disableProtection:p}=e;return(0,n.Z)("div",{className:"markup-editor-footer"},void 0,!!t&&(0,n.Z)(ie.Z,{className:"btn-default btn-icon hidden-sm hidden-md hidden-lg",title:o?pgettext("markup editor","Protected"):pgettext("markup editor","Protect"),type:"button",disabled:s,onClick:()=>{o?p():c()}},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,o?"lock":"lock_open")),!!t&&(0,n.Z)("div",{},void 0,(0,n.Z)(ie.Z,{className:"btn-default hidden-xs",type:"button",disabled:s,onClick:()=>{o?p():c()}},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,o?"lock":"lock_open"),o?pgettext("markup editor","Protected"):pgettext("markup editor","Protect"))),ee||(ee=(0,n.Z)("div",{className:"markup-editor-spacer"})),i?(0,n.Z)(ie.Z,{className:"btn-default btn-auto",type:"button",onClick:d},void 0,pgettext("markup editor","Edit")):(0,n.Z)(ie.Z,{className:"btn-default btn-auto",disabled:s||a,type:"button",onClick:l},void 0,pgettext("markup editor","Preview")),(0,n.Z)(ie.Z,{className:"btn-primary btn-auto",disabled:s||a},void 0,r||gettext("Post")))},ne=s(96359);class re extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{selection:t,update:s}=this.props,a=this.state.syntax.trim(),i=this.state.text.trim();if(0===i.length)return this.setState({error:gettext("This field is required.")}),!1;const o=t.prefix.trim().length?"\n\n":"";return V(Object.assign({},t,{text:i}),s,o+"```"+a+"\n"+i+"\n```\n\n"),q.Z.hide(),!1})),this.state={error:null,syntax:"",text:e.selection.text}}render(){return(0,n.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,te||(te=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Code"))),(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"modal-body"},void 0,(0,n.Z)(ne.Z,{for:"markup_code_syntax",label:pgettext("markup editor","Syntax highlighting")},void 0,(0,n.Z)("select",{id:"markup_code_syntax",className:"form-control",value:this.state.syntax,onChange:e=>this.setState({syntax:e.target.value})},void 0,(0,n.Z)("option",{value:""},void 0,pgettext("markup editor","No syntax highlighting")),le.map((e=>{let{value:t,name:s}=e;return(0,n.Z)("option",{value:t},t,s)})))),(0,n.Z)(ne.Z,{for:"markup_code_text",label:pgettext("markup editor","Code to insert"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,n.Z)("textarea",{id:"markup_code_text",className:"form-control",rows:"8",value:this.state.text,onChange:e=>this.setState({text:e.target.value})}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Cancel")),(0,n.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert code"))))))}}const le=[{value:"bash",name:"Bash"},{value:"c",name:"C"},{value:"c#",name:"C#"},{value:"c++",name:"C++"},{value:"css",name:"CSS"},{value:"diff",name:"Diff"},{value:"go",name:"Go"},{value:"graphql",name:"GraphQL"},{value:"html,",name:"HTML"},{value:"xml",name:"XML"},{value:"json",name:"JSON"},{value:"java",name:"Java"},{value:"javascript",name:"JavaScript"},{value:"kotlin",name:"Kotlin"},{value:"less",name:"Less"},{value:"lua",name:"Lua"},{value:"makefile",name:"Makefile"},{value:"markdown",name:"Markdown"},{value:"objective-C",name:"Objective-C"},{value:"php",name:"PHP"},{value:"perl",name:"Perl"},{value:"plain",name:"Plain"},{value:"text",name:"text"},{value:"python",name:"Python"},{value:"repl",name:"REPL"},{value:"r",name:"R"},{value:"ruby",name:"Ruby"},{value:"rust",name:"Rust"},{value:"scss",name:"SCSS"},{value:"sql",name:"SQL"},{value:"shell",name:"Shell Session"},{value:"swift",name:"Swift"},{value:"toml",name:"TOML"},{value:"ini",name:"INI"},{value:"typescript",name:"TypeScript"},{value:"visualbasic",name:"Visual Basic .NET"},{value:"webassembly",name:"WebAssembly"},{value:"yaml",name:"YAML"}];var de,ce,pe,ue,he,me,ve,ge,Ze,be,fe,_e,Ne,xe,ye,we,ke,Ce,Se,Ee,Le,Te,Pe,Oe,Re,Ae,Ie,De,je,ze,Ue,Me,Be,qe,He,Fe,Ye,Ve,Ge,$e,We,Qe,Ke,Je,Xe,et=re;function tt(){return(0,n.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,de||(de=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup help","Formatting help"))),(0,n.Z)("div",{className:"modal-body formatting-help"},void 0,(0,n.Z)("h4",{},void 0,pgettext("markup help","Emphasis text")),(0,n.Z)(st,{markup:pgettext("markup help","_This text will have emphasis_"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("em",{},void 0,pgettext("markup help","This text will have emphasis")))}),ce||(ce=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Bold text")),(0,n.Z)(st,{markup:pgettext("markup help","**This text will be bold**"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("strong",{},void 0,pgettext("markup help","This text will be bold")))}),pe||(pe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Removed text")),(0,n.Z)(st,{markup:pgettext("markup help","~~This text will be removed~~"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("del",{},void 0,pgettext("markup help","This text will be removed")))}),ue||(ue=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Bold text (BBCode)")),(0,n.Z)(st,{markup:pgettext("markup help","[b]This text will be bold[/b]"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("b",{},void 0,pgettext("markup help","This text will be bold")))}),he||(he=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Underlined text (BBCode)")),(0,n.Z)(st,{markup:pgettext("markup help","[u]This text will be underlined[/u]"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("u",{},void 0,pgettext("markup help","This text will be underlined")))}),me||(me=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Italics text (BBCode)")),(0,n.Z)(st,{markup:pgettext("markup help","[i]This text will be in italics[/i]"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("i",{},void 0,pgettext("markup help","This text will be in italics")))}),ve||(ve=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Link")),ge||(ge=(0,n.Z)(st,{markup:"",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,"example.com"))})),Ze||(Ze=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Link with text")),(0,n.Z)(st,{markup:"["+pgettext("markup help","Link text")+"](http://example.com)",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,pgettext("markup help","Link text")))}),be||(be=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Link (BBCode)")),fe||(fe=(0,n.Z)(st,{markup:"[url]http://example.com[/url]",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,"example.com"))})),_e||(_e=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Link with text (BBCode)")),(0,n.Z)(st,{markup:"[url=http://example.com]"+pgettext("markup help","Link text")+"[/url]",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,pgettext("markup help","Link text")))}),Ne||(Ne=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Image")),xe||(xe=(0,n.Z)(st,{markup:"!(http://placekitten.com/38/38)",result:(0,n.Z)("p",{},void 0,(0,n.Z)("img",{alt:"",src:"http://placekitten.com/38/38"}))})),ye||(ye=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Image with alternate text")),(0,n.Z)(st,{markup:"!["+pgettext("markup help","Image text")+"](http://placekitten.com/38/38)",result:(0,n.Z)("p",{},void 0,(0,n.Z)("img",{alt:pgettext("markup help","Image text"),src:"http://placekitten.com/38/38"}))}),we||(we=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Image (BBCode)")),ke||(ke=(0,n.Z)(st,{markup:"[img]http://placekitten.com/38/38[/img]",result:(0,n.Z)("p",{},void 0,(0,n.Z)("img",{alt:"",src:"http://placekitten.com/38/38"}))})),Ce||(Ce=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Mention user by their name")),Se||(Se=(0,n.Z)(st,{markup:"@username",result:(0,n.Z)("p",{},void 0,(0,n.Z)("a",{href:"#"},void 0,"@username"))})),Ee||(Ee=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 1")),(0,n.Z)(st,{markup:pgettext("markup help","# First level heading"),result:(0,n.Z)("h1",{},void 0,pgettext("markup help","First level heading"))}),Le||(Le=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 2")),(0,n.Z)(st,{markup:pgettext("markup help","## Second level heading"),result:(0,n.Z)("h2",{},void 0,pgettext("markup help","Second level heading"))}),Te||(Te=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 3")),(0,n.Z)(st,{markup:pgettext("markup help","### Third level heading"),result:(0,n.Z)("h3",{},void 0,pgettext("markup help","Third level heading"))}),Pe||(Pe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 4")),(0,n.Z)(st,{markup:pgettext("markup help","#### Fourth level heading"),result:(0,n.Z)("h4",{},void 0,pgettext("markup help","Fourth level heading"))}),Oe||(Oe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Heading 5")),(0,n.Z)(st,{markup:pgettext("markup help","##### Fifth level heading"),result:(0,n.Z)("h5",{},void 0,pgettext("markup help","Fifth level heading"))}),Re||(Re=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Unordered list")),Ae||(Ae=(0,n.Z)(st,{markup:"- Lorem ipsum\n- Dolor met\n- Vulputate lectus",result:(0,n.Z)("ul",{},void 0,(0,n.Z)("li",{},void 0,"Lorem ipsum"),(0,n.Z)("li",{},void 0,"Dolor met"),(0,n.Z)("li",{},void 0,"Vulputate lectus"))})),Ie||(Ie=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Ordered list")),De||(De=(0,n.Z)(st,{markup:"1. Lorem ipsum\n2. Dolor met\n3. Vulputate lectus",result:(0,n.Z)("ol",{},void 0,(0,n.Z)("li",{},void 0,"Lorem ipsum"),(0,n.Z)("li",{},void 0,"Dolor met"),(0,n.Z)("li",{},void 0,"Vulputate lectus"))})),je||(je=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Quote text")),(0,n.Z)(st,{markup:"> "+pgettext("markup help","Quoted text"),result:(0,n.Z)("blockquote",{},void 0,(0,n.Z)("p",{},void 0,pgettext("markup help","Quoted text")))}),ze||(ze=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Quote text (BBCode)")),(0,n.Z)(st,{markup:"[quote]\n"+pgettext("markup help","Quoted text")+"\n[/quote]",result:(0,n.Z)("aside",{className:"quote-block"},void 0,(0,n.Z)("div",{className:"quote-heading"},void 0,gettext("Quoted message:")),(0,n.Z)("blockquote",{className:"quote-body"},void 0,(0,n.Z)("p",{},void 0,pgettext("markup help","Quoted text"))))}),Ue||(Ue=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Quote text with title (BBCode)")),(0,n.Z)(st,{markup:'[quote="'+pgettext("markup help","Quote title")+'"]\n'+pgettext("markup help","Quoted text")+"\n[/quote]",result:(0,n.Z)("aside",{className:"quote-block"},void 0,(0,n.Z)("div",{className:"quote-heading"},void 0,gettext("Quote title has written:")),(0,n.Z)("blockquote",{className:"quote-body"},void 0,(0,n.Z)("p",{},void 0,pgettext("markup help","Quoted text"))))}),Me||(Me=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Spoiler")),(0,n.Z)(st,{markup:"[spoiler]\n"+pgettext("markup help","Secret text")+"\n[/spoiler]",result:(0,n.Z)(at,{},void 0,pgettext("markup help","Secret text"))}),Be||(Be=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Inline code")),(0,n.Z)(st,{markup:pgettext("markup help","`Inline code`"),result:(0,n.Z)("p",{},void 0,(0,n.Z)("code",{},void 0,pgettext("markup help","Inline code")))}),qe||(qe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Code block")),He||(He=(0,n.Z)(st,{markup:'```\nalert("Hello world!");\n```',result:(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{className:"hljs"},void 0,'alert("Hello world!");'))})),Fe||(Fe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Code block with syntax highlighting")),Ye||(Ye=(0,n.Z)(st,{markup:'```python\nprint("Hello world!");\n```',result:(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{className:"hljs language-python"},void 0,(0,n.Z)("span",{className:"hljs-built_in"},void 0,"print"),'("Hello world!");'))})),Ve||(Ve=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Code block (BBCode)")),Ge||(Ge=(0,n.Z)(st,{markup:'[code]\nalert("Hello world!");\n[/code]',result:(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{className:"hljs"},void 0,'alert("Hello world!");'))})),$e||($e=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Code block with syntax highlighting (BBCode)")),We||(We=(0,n.Z)(st,{markup:'[code="python"]\nprint("Hello world!");\n[/code]',result:(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{className:"hljs language-python"},void 0,(0,n.Z)("span",{className:"hljs-built_in"},void 0,"print"),'("Hello world!");'))})),Qe||(Qe=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Horizontal rule")),Ke||(Ke=(0,n.Z)(st,{markup:"Lorem ipsum\n- - -\nDolor met",result:(0,n.Z)("div",{},void 0,(0,n.Z)("p",{},void 0,"Lorem ipsum"),(0,n.Z)("hr",{}),(0,n.Z)("p",{},void 0,"Dolor met"))})),Je||(Je=(0,n.Z)("hr",{})),(0,n.Z)("h4",{},void 0,pgettext("markup help","Horizontal rule (BBCode)")),Xe||(Xe=(0,n.Z)(st,{markup:"Lorem ipsum\n[hr]\nDolor met",result:(0,n.Z)("div",{},void 0,(0,n.Z)("p",{},void 0,"Lorem ipsum"),(0,n.Z)("hr",{}),(0,n.Z)("p",{},void 0,"Dolor met"))}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,pgettext("modal","Close")))))}function st(e){let{markup:t,result:s}=e;return(0,n.Z)("div",{className:"formatting-help-item"},void 0,(0,n.Z)("div",{className:"formatting-help-item-markup"},void 0,(0,n.Z)("pre",{},void 0,(0,n.Z)("code",{},void 0,t))),(0,n.Z)("div",{className:"formatting-help-item-preview"},void 0,(0,n.Z)("article",{className:"misago-markup"},void 0,s)))}class at extends o().Component{constructor(e){super(e),this.state={reveal:!1}}render(){return(0,n.Z)("aside",{className:this.state.reveal?"spoiler-block revealed":"spoiler-block"},void 0,(0,n.Z)("blockquote",{className:"spoiler-body"},void 0,(0,n.Z)("p",{},void 0,this.props.children)),!this.state.reveal&&(0,n.Z)("div",{className:"spoiler-overlay"},void 0,(0,n.Z)("button",{className:"spoiler-reveal",type:"button",onClick:()=>{this.setState({reveal:!0})}},void 0,gettext("Reveal spoiler"))))}}var it=s(19755);const ot=new RegExp("^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i");function nt(e){return ot.test(it.trim(e))}var rt;class lt extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{selection:t,update:s}=this.props,a=this.state.text.trim(),i=this.state.url.trim();return 0===i.length?(this.setState({error:gettext("This field is required.")}),!1):nt(i)?(a.length>0?V(t,s,"!["+a+"]("+i+")"):V(t,s,"!("+i+")"),q.Z.hide(),!1):(this.setState({error:gettext("Enter a valid address.")}),!1)}));const t=e.selection.text.trim(),s=nt(t);this.state={error:null,text:s?"":t,url:s?t:""}}render(){return(0,n.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,rt||(rt=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Image"))),(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"modal-body"},void 0,(0,n.Z)(ne.Z,{for:"markup_link_url",label:pgettext("markup editor","Image description"),helpText:pgettext("markup editor","Optional but recommended . Will be displayed instead of image when it fails to load.")},void 0,(0,n.Z)("input",{id:"markup_link_text",className:"form-control",type:"text",value:this.state.text,onChange:e=>this.setState({text:e.target.value})})),(0,n.Z)(ne.Z,{for:"markup_link_url",label:pgettext("markup editor","Image address"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,n.Z)("input",{id:"markup_link_url",className:"form-control",type:"text",value:this.state.url,onChange:e=>this.setState({url:e.target.value})}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Cancel")),(0,n.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert image"))))))}}var dt,ct=lt;class pt extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{selection:t,update:s}=this.props,a=this.state.text.trim(),i=this.state.url.trim();return 0===i.length?(this.setState({error:gettext("This field is required.")}),!1):nt(i)?(a.length>0?V(t,s,"["+a+"]("+i+")"):V(t,s,"<"+i+">"),q.Z.hide(),!1):(this.setState({error:gettext("Enter a valid address.")}),!1)}));const t=e.selection.text.trim(),s=nt(t);this.state={error:null,text:s?"":t,url:s?t:""}}render(){return(0,n.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,dt||(dt=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Link"))),(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"modal-body"},void 0,(0,n.Z)(ne.Z,{for:"markup_link_url",label:pgettext("markup editor","Link text"),helpText:pgettext("markup editor","Optional. Will be displayed instead of link's address.")},void 0,(0,n.Z)("input",{id:"markup_link_text",className:"form-control",type:"text",value:this.state.text,onChange:e=>this.setState({text:e.target.value})})),(0,n.Z)(ne.Z,{for:"markup_link_url",label:pgettext("markup editor","Link address"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,n.Z)("input",{id:"markup_link_url",className:"form-control",type:"text",value:this.state.url,onChange:e=>this.setState({url:e.target.value})}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Cancel")),(0,n.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert link"))))))}}var ut,ht=pt;class mt extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{selection:t,update:s}=this.props,a=this.state.author.trim(),i=this.state.text.trim();if(0===i.length)return this.setState({error:gettext("This field is required.")}),!1;const o=t.prefix.trim().length?"\n\n":"";return V(t,s,a?o+'[quote="'+a+'"]\n'+i+"\n[/quote]\n\n":o+"[quote]\n"+i+"\n[/quote]\n\n"),q.Z.hide(),!1})),this.state={error:null,author:"",text:e.selection.text}}render(){return(0,n.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,n.Z)("div",{className:"modal-content"},void 0,(0,n.Z)("div",{className:"modal-header"},void 0,(0,n.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ut||(ut=(0,n.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,n.Z)("h4",{className:"modal-title"},void 0,pgettext("markup editor","Quote"))),(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"modal-body"},void 0,(0,n.Z)(ne.Z,{for:"markup_quote_author",label:pgettext("markup editor","Quote's author or source"),helpText:pgettext("markup editor",'Optional. If it\'s username, put "@" before it ("@JohnDoe").')},void 0,(0,n.Z)("input",{id:"markup_quote_author",className:"form-control",type:"text",value:this.state.author,onChange:e=>this.setState({author:e.target.value})})),(0,n.Z)(ne.Z,{for:"markup_quote_text",label:pgettext("markup editor","Quoted text"),validation:this.state.error?[this.state.error]:void 0},void 0,(0,n.Z)("textarea",{id:"markup_quote_text",className:"form-control",rows:"8",value:this.state.text,onChange:e=>this.setState({text:e.target.value})}))),(0,n.Z)("div",{className:"modal-footer"},void 0,(0,n.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Cancel")),(0,n.Z)("button",{className:"btn btn-primary"},void 0,pgettext("markup editor","Insert quote"))))))}}var vt=mt,gt=e=>{let{disabled:t,icon:s,title:a,onClick:i}=e;return(0,n.Z)("button",{className:"btn btn-markup-editor",title:a,type:"button",disabled:t,onClick:i},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,s))};const Zt="12345678990abcdefghijklmnopqrstuvwxyz",bt=Zt.length,ft=e=>{const t=[];for(let s=0;s{const s=1024*M.Z.get("user").acl.max_attachment_size;if(e.size>s)return void j.Z.error(interpolate(pgettext("markup editor","File %(filename)s is bigger than %(limit)s."),{filename:e.name,limit:(0,H.Z)(s)},!0));let a={id:null,key:ft(32),error:null,uploaded_on:null,progress:0,filename:e.name,filetype:null,is_image:!1,size:e.size,url:null,uploader_name:null};t((e=>{let{attachments:t}=e;return{attachments:[a].concat(t)}}));const i=()=>{t((e=>{let{attachments:t}=e;return{attachments:t.concat()}}))},o=new FormData;o.append("upload",e),D.Z.upload(M.Z.get("ATTACHMENTS_API"),o,(e=>{a.progress=e,i()})).then((e=>{Object.assign(a,e,{uploaded_on:O()(e.uploaded_on)}),i()}),(e=>{400===e.status||413===e.status?(a.error=e.detail,j.Z.error(e.detail),i()):j.Z.apiError(e)}))};var yt=e=>{let{disabled:t,element:s,update:a,updateAttachments:i}=e;const o=[{name:pgettext("markup editor","Strong"),icon:"format_bold",onClick:()=>{Y(G(s),a,"**","**",pgettext("example markup","Strong text"))}},{name:pgettext("markup editor","Emphasis"),icon:"format_italic",onClick:()=>{Y(G(s),a,"*","*",pgettext("example markup","Text with emphasis"))}},{name:pgettext("markup editor","Strikethrough"),icon:"format_strikethrough",onClick:()=>{Y(G(s),a,"~~","~~",pgettext("example markup","Text with strikethrough"))}},{name:pgettext("markup editor","Horizontal ruler"),icon:"remove",onClick:()=>{V(G(s),a,"\n\n- - -\n\n")}},{name:pgettext("markup editor","Link"),icon:"insert_link",onClick:()=>{const e=G(s);q.Z.show((0,n.Z)(ht,{selection:e,element:s,update:a}))}},{name:pgettext("markup editor","Image"),icon:"insert_photo",onClick:()=>{const e=G(s);q.Z.show((0,n.Z)(ct,{selection:e,element:s,update:a}))}},{name:pgettext("markup editor","Quote"),icon:"format_quote",onClick:()=>{const e=G(s);q.Z.show((0,n.Z)(vt,{selection:e,element:s,update:a}))}},{name:pgettext("markup editor","Spoiler"),icon:"visibility_off",onClick:()=>{((e,t)=>{const s=G(e),a=s.prefix.trim().length?"\n\n":"";Y(s,t,a+"[spoiler]\n","\n[/spoiler]\n\n",pgettext("markup editor","Spoiler text"))})(s,a)}},{name:pgettext("markup editor","Code"),icon:"code",onClick:()=>{const e=G(s);q.Z.show((0,n.Z)(et,{selection:e,element:s,update:a}))}}];return M.Z.get("user").acl.max_attachment_size&&o.push({name:pgettext("markup editor","Upload file"),icon:"file_upload",onClick:()=>(e=>{const t=document.createElement("input");t.type="file",t.multiple="multiple",t.addEventListener("change",(function(){for(let s=0;s{let{name:a,icon:i,onClick:o}=e;return(0,n.Z)(gt,{title:a,icon:i,disabled:t||!s,onClick:o},i)}))),(0,n.Z)("div",{className:"markup-editor-toolbar-right"},void 0,(0,n.Z)("div",{className:"markup-editor-controls-dropdown"},void 0,(0,n.Z)("button",{type:"button",className:"btn btn-markup-editor dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:t||!s},void 0,_t||(_t=(0,n.Z)("span",{className:"material-icon"},void 0,"more_vert"))),(0,n.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,o.map((e=>{let{name:a,icon:i,onClick:o}=e;return(0,n.Z)("li",{},i,(0,n.Z)("button",{type:"button",className:"btn-link",disabled:t||!s,onClick:o},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,i),a))})))),(0,n.Z)(gt,{title:pgettext("markup editor","Formatting help"),icon:"help_outline",onClick:()=>{q.Z.show(Nt||(Nt=(0,n.Z)(tt,{})))}})))},wt=s(19755);class kt extends o().Component{constructor(e){super(e),(0,r.Z)(this,"showPreview",(()=>{this.state.loading||(this.setState({loading:!0,preview:!0,element:null}),D.Z.post(M.Z.get("PARSE_MARKUP_API"),{post:this.props.value}).then((e=>{this.setState({loading:!1,parsed:e.parsed})}),(e=>{400===e.status?j.Z.error(e.detail):j.Z.apiError(e),this.setState({loading:!1,preview:!1})})))})),(0,r.Z)(this,"closePreview",(()=>{this.setState({loading:!1,preview:!1})})),(0,r.Z)(this,"onDrop",(e=>{if(e.preventDefault(),e.stopPropagation(),!e.dataTransfer.files)return;const{onAttachmentsChange:t}=this.props;if(M.Z.get("user").acl.max_attachment_size)for(let s=0;s{const{onAttachmentsChange:t}=this.props,s=[];for(let t=0;t(0,n.Z)("div",{className:U()("markup-editor",{"markup-editor-focused":this.state.focused&&!this.state.preview})},void 0,(0,n.Z)(yt,{disabled:this.props.disabled||this.state.preview,element:this.state.element,update:e=>this.props.onChange({target:{value:e}}),updateAttachments:this.props.onAttachmentsChange}),this.state.preview?(0,n.Z)("div",{className:"markup-editor-preview"},void 0,this.state.loading?(0,n.Z)("div",{className:"markup-editor-preview-loading"},void 0,(0,n.Z)("div",{className:"ui-preview"},void 0,(0,n.Z)("span",{className:"ui-preview-text",style:{width:"240px"}}))):(0,n.Z)(B.Z,{className:"markup-editor-preview-contents",markup:this.state.parsed})):o().createElement("textarea",{className:"markup-editor-textarea form-control",placeholder:this.props.placeholder,value:this.props.value,disabled:this.props.disabled||this.state.loading,rows:6,ref:e=>{e&&this.state.element!==e&&(this.setState({element:e}),function(e,t){wt(t).atwho({at:"@",displayTpl:'
  • ${username}
  • ',insertTpl:"@${username}",searchKey:"username",callbacks:{remoteFilter:function(e,t){wt.getJSON(M.Z.get("MENTION_API"),{q:e},t)}}}),wt(t).on("inserted.atwho",((t,s,a,i)=>{const{query:o}=i,n=a.target.innerText.trim(),r=t.target.value.substr(0,o.headPos),l=t.target.value.substr(o.endPos);t.target.value=r+n+l,e.onChange(t);const d=o.headPos+n.length;t.target.setSelectionRange(d,d),t.target.focus()}))}(this.props,e))},onChange:this.props.onChange,onDrop:this.onDrop,onFocus:()=>this.setState({focused:!0}),onPaste:this.onPaste,onBlur:()=>this.setState({focused:!1})}),this.props.attachments.length>0&&(0,n.Z)(ae,{attachments:this.props.attachments,disabled:this.props.disabled||this.state.preview,element:this.state.element,setState:this.props.onAttachmentsChange,update:e=>this.props.onChange({target:{value:e}})}),(0,n.Z)(oe,{preview:this.state.preview,canProtect:this.props.canProtect,isProtected:this.props.isProtected,disabled:this.props.disabled,empty:this.props.value.trim().length{let{children:t}=e;return(0,n.Z)("div",{className:"posting-dialog-body"},void 0,t)},Qt=e=>{let{close:t,message:s}=e;return(0,n.Z)("div",{className:"posting-dialog-error"},void 0,Rt||(Rt=(0,n.Z)("div",{className:"posting-dialog-error-icon"},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,"error_outlined"))),(0,n.Z)("div",{className:"posting-dialog-error-detail"},void 0,(0,n.Z)("p",{},void 0,s),(0,n.Z)("button",{type:"button",className:"btn btn-default",onClick:t},void 0,pgettext("modal","Close"))))},Kt=e=>{let{children:t,close:s,fullscreen:a,minimize:i,minimized:o,fullscreenEnter:r,fullscreenExit:l,open:d}=e;return(0,n.Z)("div",{className:"posting-dialog-header"},void 0,(0,n.Z)("div",{className:"posting-dialog-caption"},void 0,t),o?(0,n.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Open"),type:"button",onClick:d},void 0,At||(At=(0,n.Z)("span",{className:"material-icon"},void 0,"expand_less"))):(0,n.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Minimize"),type:"button",onClick:i},void 0,It||(It=(0,n.Z)("span",{className:"material-icon"},void 0,"expand_more"))),a?(0,n.Z)("button",{className:"btn btn-posting-dialog hidden-xs",title:pgettext("dialog","Exit the fullscreen mode"),type:"button",onClick:l},void 0,Dt||(Dt=(0,n.Z)("span",{className:"material-icon"},void 0,"fullscreen_exit"))):(0,n.Z)("button",{className:"btn btn-posting-dialog hidden-xs",title:pgettext("dialog","Enter the fullscreen mode"),type:"button",onClick:r},void 0,jt||(jt=(0,n.Z)("span",{className:"material-icon"},void 0,"fullscreen"))),(0,n.Z)("button",{className:"btn btn-posting-dialog",title:pgettext("dialog","Cancel"),type:"button",onClick:s},void 0,zt||(zt=(0,n.Z)("span",{className:"material-icon"},void 0,"close"))))};function Jt(e){let{isClosed:t,isHidden:s,isPinned:a,disabled:i,options:o,close:r,open:l,hide:d,unhide:c,pinGlobally:p,pinLocally:u,unpin:h}=e;const m=function(e,t,s){const a=[];return 2===s&&a.push("bookmark"),1===s&&a.push("bookmark_outline"),e&&a.push("lock"),t&&a.push("visibility_off"),a}(t,s,a);return(0,n.Z)("div",{className:"dropdown"},void 0,(0,n.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:pgettext("post thread","Options"),"aria-expanded":"true","aria-haspopup":"true","data-toggle":"dropdown",type:"button",disabled:i},void 0,m.length>0?(0,n.Z)("span",{className:"btn-icons-family"},void 0,m.map((e=>(0,n.Z)("span",{className:"material-icon"},e,e)))):Ut||(Ut=(0,n.Z)("span",{className:"material-icon"},void 0,"more_horiz"))),(0,n.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,2===o.pin&&2!==a&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:p,type:"button",disabled:i},void 0,Mt||(Mt=(0,n.Z)("span",{className:"material-icon"},void 0,"bookmark")),pgettext("post thread","Pinned globally"))),o.pin>=a&&1!==a&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:u,type:"button",disabled:i},void 0,Bt||(Bt=(0,n.Z)("span",{className:"material-icon"},void 0,"bookmark_outline")),pgettext("post thread","Pinned locally"))),o.pin>=a&&0!==a&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:h,type:"button",disabled:i},void 0,qt||(qt=(0,n.Z)("span",{className:"material-icon"},void 0,"radio_button_unchecked")),pgettext("post thread","Not pinned"))),o.close&&!!t&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:l,type:"button",disabled:i},void 0,Ht||(Ht=(0,n.Z)("span",{className:"material-icon"},void 0,"lock_outline")),pgettext("post thread","Open"))),o.close&&!t&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:r,type:"button",disabled:i},void 0,Ft||(Ft=(0,n.Z)("span",{className:"material-icon"},void 0,"lock")),pgettext("post thread","Closed"))),o.hide&&!!s&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:c,type:"button",disabled:i},void 0,Yt||(Yt=(0,n.Z)("span",{className:"material-icon"},void 0,"visibility")),pgettext("post thread","Visible"))),o.hide&&!s&&(0,n.Z)("li",{},void 0,(0,n.Z)("button",{className:"btn btn-link",onClick:d,type:"button",disabled:i},void 0,Vt||(Vt=(0,n.Z)("span",{className:"material-icon"},void 0,"visibility_off")),pgettext("post thread","Hidden")))))}var Xt=class extends T.Z{constructor(e){super(e),(0,r.Z)(this,"loadSuccess",(e=>{let t=null,s=null;const a=e.map((e=>(!1===e.post||t&&e.id!=this.state.category||(t=e.id,s=e.post),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id}))));this.setState({isReady:!0,options:s,categories:a,category:t})})),(0,r.Z)(this,"loadError",(e=>{this.setState({error:e.detail})})),(0,r.Z)(this,"onCancel",(()=>{window.confirm(pgettext("post thread","Are you sure you want to discard thread?"))&&(this.minimize(),l.Z.close())})),(0,r.Z)(this,"onTitleChange",(e=>{this.changeValue("title",e.target.value)})),(0,r.Z)(this,"onCategoryChange",(e=>{const t=this.state.categories.find((t=>e.target.value==t.value));let s=this.state.pin;t.post.pin&&t.post.pin{this.changeValue("post",e.target.value)})),(0,r.Z)(this,"onAttachmentsChange",(e=>{this.setState(e)})),(0,r.Z)(this,"onClose",(()=>{this.changeValue("close",!0)})),(0,r.Z)(this,"onOpen",(()=>{this.changeValue("close",!1)})),(0,r.Z)(this,"onPinGlobally",(()=>{this.changeValue("pin",2)})),(0,r.Z)(this,"onPinLocally",(()=>{this.changeValue("pin",1)})),(0,r.Z)(this,"onUnpin",(()=>{this.changeValue("pin",0)})),(0,r.Z)(this,"onHide",(()=>{this.changeValue("hide",!0)})),(0,r.Z)(this,"onUnhide",(()=>{this.changeValue("hide",!1)})),(0,r.Z)(this,"close",(()=>{this.minimize(),l.Z.close()})),(0,r.Z)(this,"minimize",(()=>{this.setState({fullscreen:!1,minimized:!0})})),(0,r.Z)(this,"open",(()=>{this.setState({minimized:!1}),this.state.fullscreen})),(0,r.Z)(this,"fullscreenEnter",(()=>{this.setState({fullscreen:!0,minimized:!1})})),(0,r.Z)(this,"fullscreenExit",(()=>{this.setState({fullscreen:!1,minimized:!1})})),this.state={isReady:!1,isLoading:!1,error:null,minimized:!1,fullscreen:!1,options:null,title:"",category:e.category||null,categories:[],post:"",attachments:[],close:!1,hide:!1,pin:0,validators:{title:(0,I.jn)(),post:(0,I.Jh)()},errors:{}}}componentDidMount(){D.Z.get(this.props.config).then(this.loadSuccess,this.loadError)}clean(){if(!this.state.title.trim().length)return j.Z.error(gettext("You have to enter thread title.")),!1;if(!this.state.post.trim().length)return j.Z.error(gettext("You have to enter a message.")),!1;const e=this.validate();return e.title?(j.Z.error(e.title[0]),!1):!e.post||(j.Z.error(e.post[0]),!1)}send(){return D.Z.post(this.props.submit,{title:this.state.title,category:this.state.category,post:this.state.post,attachments:R(this.state.attachments),close:this.state.close,hide:this.state.hide,pin:this.state.pin})}handleSuccess(e){this.setState({isLoading:!0}),this.close(),j.Z.success(pgettext("post thread","Your thread has been posted.")),window.location=e.url}handleError(e){if(400===e.status){const t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]);j.Z.error(t[0])}else j.Z.apiError(e)}render(){const e={minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};if(this.state.error)return o().createElement(es,e,(0,n.Z)(Qt,{message:this.state.error,close:this.close}));if(!this.state.isReady)return o().createElement(es,e,(0,n.Z)("div",{className:"posting-loading ui-preview"},void 0,Gt||(Gt=(0,n.Z)(St.o8,{className:"posting-dialog-toolbar"},void 0,(0,n.Z)(St.Z2,{className:"posting-dialog-thread-title",auto:!0},void 0,(0,n.Z)(St.Eg,{auto:!0},void 0,(0,n.Z)("input",{className:"form-control",disabled:!0,type:"text"}))),(0,n.Z)(St.Z2,{className:"posting-dialog-category-select",auto:!0},void 0,(0,n.Z)(St.Eg,{},void 0,(0,n.Z)("input",{className:"form-control",disabled:!0,type:"text"}))))),(0,n.Z)(Ct,{attachments:[],value:"",submitText:pgettext("post thread submit","Post thread"),disabled:!0,onAttachmentsChange:()=>{},onChange:()=>{}})));const t=!!(this.state.options.close||this.state.options.hide||this.state.options.pin);return o().createElement(es,e,(0,n.Z)("form",{className:"posting-dialog-form",onSubmit:this.handleSubmit},void 0,(0,n.Z)(St.o8,{className:"posting-dialog-toolbar"},void 0,(0,n.Z)(St.Z2,{className:"posting-dialog-thread-title",auto:!0},void 0,(0,n.Z)(St.Eg,{auto:!0},void 0,(0,n.Z)("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:pgettext("post thread","Thread title"),type:"text",value:this.state.title}))),(0,n.Z)(St.Z2,{className:"posting-dialog-category-select",auto:!0},void 0,(0,n.Z)(St.Eg,{},void 0,(0,n.Z)(L.Z,{choices:this.state.categories,disabled:this.state.isLoading,onChange:this.onCategoryChange,value:this.state.category})),t&&(0,n.Z)(St.Eg,{shrink:!0},void 0,(0,n.Z)(Jt,{isClosed:this.state.close,isHidden:this.state.hide,isPinned:this.state.pin,disabled:this.state.isLoading,options:this.state.options,close:this.onClose,open:this.onOpen,hide:this.onHide,unhide:this.onUnhide,pinGlobally:this.onPinGlobally,pinLocally:this.onPinLocally,unpin:this.onUnpin})))),(0,n.Z)(Ct,{attachments:this.state.attachments,value:this.state.post,submitText:pgettext("post thread submit","Start thread"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange})))}};const es=e=>{let{children:t,close:s,minimized:a,minimize:i,open:o,fullscreen:r,fullscreenEnter:l,fullscreenExit:d}=e;return(0,n.Z)($t,{fullscreen:r,minimized:a},void 0,(0,n.Z)(Kt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:d,minimized:a,minimize:i,open:o,close:s},void 0,pgettext("post thread","Start new thread")),(0,n.Z)(Wt,{},void 0,t))};function ts(e){const t=e.split(",").map((e=>e.trim().toLowerCase())).filter((e=>e.length>0));return t.filter(((e,s)=>t.indexOf(e)==s))}var ss=class extends T.Z{constructor(e){super(e),(0,r.Z)(this,"onCancel",(()=>{window.confirm(pgettext("post thread","Are you sure you want to discard private thread?"))&&this.close()})),(0,r.Z)(this,"onToChange",(e=>{this.changeValue("to",e.target.value)})),(0,r.Z)(this,"onTitleChange",(e=>{this.changeValue("title",e.target.value)})),(0,r.Z)(this,"onPostChange",(e=>{this.changeValue("post",e.target.value)})),(0,r.Z)(this,"onAttachmentsChange",(e=>{this.setState(e)})),(0,r.Z)(this,"close",(()=>{this.minimize(),l.Z.close()})),(0,r.Z)(this,"minimize",(()=>{this.setState({fullscreen:!1,minimized:!0})})),(0,r.Z)(this,"open",(()=>{this.setState({minimized:!1}),this.state.fullscreen})),(0,r.Z)(this,"fullscreenEnter",(()=>{this.setState({fullscreen:!0,minimized:!1})})),(0,r.Z)(this,"fullscreenExit",(()=>{this.setState({fullscreen:!1,minimized:!1})}));const t=(e.to||[]).map((e=>e.username)).join(", ");this.state={isLoading:!1,error:null,minimized:!1,fullscreen:!1,to:t,title:"",post:"",attachments:[],validators:{title:(0,I.jn)(),post:(0,I.Jh)()},errors:{}}}clean(){if(!ts(this.state.to).length)return j.Z.error(gettext("You have to enter at least one recipient.")),!1;if(!this.state.title.trim().length)return j.Z.error(gettext("You have to enter thread title.")),!1;if(!this.state.post.trim().length)return j.Z.error(gettext("You have to enter a message.")),!1;const e=this.validate();return e.title?(j.Z.error(e.title[0]),!1):!e.post||(j.Z.error(e.post[0]),!1)}send(){return D.Z.post(this.props.submit,{to:ts(this.state.to),title:this.state.title,post:this.state.post,attachments:R(this.state.attachments)})}handleSuccess(e){this.setState({isLoading:!0}),this.close(),j.Z.success(pgettext("post thread","Your thread has been posted.")),window.location=e.url}handleError(e){if(400===e.status){const t=[].concat(e.non_field_errors||[],e.to||[],e.title||[],e.post||[],e.attachments||[]);j.Z.error(t[0])}else j.Z.apiError(e)}render(){const e={minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return o().createElement(as,e,(0,n.Z)("form",{className:"posting-dialog-form",onSubmit:this.handleSubmit},void 0,(0,n.Z)(St.o8,{className:"posting-dialog-toolbar"},void 0,(0,n.Z)(St.Z2,{className:"posting-dialog-thread-recipients",auto:!0},void 0,(0,n.Z)(St.Eg,{auto:!0},void 0,(0,n.Z)("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onToChange,placeholder:pgettext("post thread","Recipients, eg.: Danny, Lisa, Alice"),type:"text",value:this.state.to}))),(0,n.Z)(St.Z2,{className:"posting-dialog-thread-title",auto:!0},void 0,(0,n.Z)(St.Eg,{auto:!0},void 0,(0,n.Z)("input",{className:"form-control",disabled:this.state.isLoading,onChange:this.onTitleChange,placeholder:pgettext("post thread","Thread title"),type:"text",value:this.state.title})))),(0,n.Z)(Ct,{attachments:this.state.attachments,value:this.state.post,submitText:pgettext("post thread submit","Start thread"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange})))}};const as=e=>{let{children:t,close:s,minimized:a,minimize:i,open:o,fullscreen:r,fullscreenEnter:l,fullscreenExit:d}=e;return(0,n.Z)($t,{fullscreen:r,minimized:a},void 0,(0,n.Z)(Kt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:d,minimized:a,minimize:i,open:o,close:s},void 0,pgettext("post thread","Start private thread")),(0,n.Z)(Wt,{},void 0,t))};var is=class extends T.Z{constructor(e){super(e),(0,r.Z)(this,"loadSuccess",(e=>{this.setState({isReady:!0,post:e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]":this.state.post})})),(0,r.Z)(this,"loadError",(e=>{this.setState({error:e.detail})})),(0,r.Z)(this,"appendData",(e=>{const t=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]\n\n":"";this.setState(((e,s)=>e.post.length>0?{post:e.post.trim()+"\n\n"+t}:{post:t})),this.open()})),(0,r.Z)(this,"onCancel",(()=>{window.confirm(pgettext("post reply","Are you sure you want to discard your reply?"))&&this.close()})),(0,r.Z)(this,"onPostChange",(e=>{this.changeValue("post",e.target.value)})),(0,r.Z)(this,"onAttachmentsChange",(e=>{this.setState(e)})),(0,r.Z)(this,"onQuote",(e=>{this.setState((t=>{let{post:s}=t;return s.length>0?{post:s.trim()+"\n\n"+e}:{post:e}})),this.open()})),(0,r.Z)(this,"close",(()=>{this.minimize(),l.Z.close()})),(0,r.Z)(this,"minimize",(()=>{this.setState({fullscreen:!1,minimized:!0})})),(0,r.Z)(this,"open",(()=>{this.setState({minimized:!1}),this.state.fullscreen})),(0,r.Z)(this,"fullscreenEnter",(()=>{this.setState({fullscreen:!0,minimized:!1})})),(0,r.Z)(this,"fullscreenExit",(()=>{this.setState({fullscreen:!1,minimized:!1})})),this.state={isReady:!1,isLoading:!1,error:null,minimized:!1,fullscreen:!1,post:this.props.default||"",attachments:[],validators:{post:(0,I.Jh)()},errors:{}}}componentDidMount(){D.Z.get(this.props.config,this.props.context||null).then(this.loadSuccess,this.loadError),S(!1,this.onQuote)}componentWillUnmount(){E()}componentWillReceiveProps(e){const t=this.props.context,s=e.context;t&&s&&!s.reply||D.Z.get(e.config,e.context||null).then(this.appendData,j.Z.apiError)}clean(){if(!this.state.post.trim().length)return j.Z.error(gettext("You have to enter a message.")),!1;const e=this.validate();return!e.post||(j.Z.error(e.post[0]),!1)}send(){return S(!0,this.onQuote),D.Z.post(this.props.submit,{post:this.state.post,attachments:R(this.state.attachments)})}handleSuccess(e){this.setState({isLoading:!0}),this.close(),S(!1,this.onQuote),j.Z.success(pgettext("post reply","Your reply has been posted.")),window.location=e.url.index}handleError(e){if(400===e.status){const t=[].concat(e.non_field_errors||[],e.post||[],e.attachments||[]);j.Z.error(t[0])}else j.Z.apiError(e);S(!1,this.onQuote)}render(){const e={thread:this.props.thread,minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return this.state.error?o().createElement(os,e,(0,n.Z)(Qt,{message:this.state.error,close:this.close})):this.state.isReady?o().createElement(os,e,(0,n.Z)("form",{className:"posting-dialog-form",method:"POST",onSubmit:this.handleSubmit},void 0,(0,n.Z)(Ct,{attachments:this.state.attachments,value:this.state.post,submitText:pgettext("post reply submit","Post reply"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange}))):o().createElement(os,e,(0,n.Z)("div",{className:"posting-loading ui-preview"},void 0,(0,n.Z)(Ct,{attachments:[],value:"",submitText:pgettext("post reply submit","Post reply"),disabled:!0,onAttachmentsChange:()=>{},onChange:()=>{}})))}};const os=e=>{let{children:t,close:s,minimized:a,minimize:i,open:o,fullscreen:r,fullscreenEnter:l,fullscreenExit:d,thread:c}=e;return(0,n.Z)($t,{fullscreen:r,minimized:a},void 0,(0,n.Z)(Kt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:d,minimized:a,minimize:i,open:o,close:s},void 0,interpolate(pgettext("post reply","Reply to: %(thread)s"),{thread:c.title},!0)),(0,n.Z)(Wt,{},void 0,t))};var ns=class extends T.Z{constructor(e){super(e),(0,r.Z)(this,"loadSuccess",(e=>{var t;this.setState({isReady:!0,post:e.post,attachments:(t=e.attachments,t.map((e=>Object.assign({},e,{uploaded_on:O()(e.uploaded_on)})))),protect:e.is_protected,canProtect:e.can_protect})})),(0,r.Z)(this,"loadError",(e=>{this.setState({error:e.detail})})),(0,r.Z)(this,"appendData",(e=>{const t=e.post?'[quote="@'+e.poster+'"]\n'+e.post+"\n[/quote]\n\n":"";this.setState(((e,s)=>e.post.length>0?{post:e.post.trim()+"\n\n"+t}:{post:t})),this.open()})),(0,r.Z)(this,"onCancel",(()=>{window.confirm(gettext("Are you sure you want to discard changes?"))&&this.close()})),(0,r.Z)(this,"onProtect",(()=>{this.setState({protect:!0})})),(0,r.Z)(this,"onUnprotect",(()=>{this.setState({protect:!1})})),(0,r.Z)(this,"onPostChange",(e=>{this.changeValue("post",e.target.value)})),(0,r.Z)(this,"onAttachmentsChange",(e=>{this.setState(e)})),(0,r.Z)(this,"onQuote",(e=>{this.setState((t=>{let{post:s}=t;return s.length>0?{post:s.trim()+"\n\n"+e}:{post:e}})),this.open()})),(0,r.Z)(this,"close",(()=>{this.minimize(),l.Z.close()})),(0,r.Z)(this,"minimize",(()=>{this.setState({fullscreen:!1,minimized:!0})})),(0,r.Z)(this,"open",(()=>{this.setState({minimized:!1}),this.state.fullscreen})),(0,r.Z)(this,"fullscreenEnter",(()=>{this.setState({fullscreen:!0,minimized:!1})})),(0,r.Z)(this,"fullscreenExit",(()=>{this.setState({fullscreen:!1,minimized:!1})})),this.state={isReady:!1,isLoading:!1,error:!1,minimized:!1,fullscreen:!1,post:"",attachments:[],protect:!1,canProtect:!1,validators:{post:(0,I.Jh)()},errors:{}}}componentDidMount(){D.Z.get(this.props.config).then(this.loadSuccess,this.loadError),S(!1,this.onQuote)}componentWillUnmount(){E()}componentWillReceiveProps(e){const t=this.props.context,s=e.context;t&&s&&t.reply===s.reply||D.Z.get(e.config,e.context||null).then(this.appendData,j.Z.apiError)}clean(){if(!this.state.post.trim().length)return j.Z.error(gettext("You have to enter a message.")),!1;const e=this.validate();return!e.post||(j.Z.error(e.post[0]),!1)}send(){return S(!0,this.onQuote),D.Z.put(this.props.submit,{post:this.state.post,attachments:R(this.state.attachments),protect:this.state.protect})}handleSuccess(e){this.setState({isLoading:!0}),this.close(),S(!1,this.onQuote),j.Z.success(gettext("Reply has been edited.")),window.location=e.url.index}handleError(e){if(400===e.status){const t=[].concat(e.non_field_errors||[],e.category||[],e.title||[],e.post||[],e.attachments||[]);j.Z.error(t[0])}else j.Z.apiError(e);S(!1,this.onQuote)}render(){const e={post:this.props.post,minimized:this.state.minimized,minimize:this.minimize,open:this.open,fullscreen:this.state.fullscreen,fullscreenEnter:this.fullscreenEnter,fullscreenExit:this.fullscreenExit,close:this.onCancel};return this.state.error?o().createElement(rs,e,(0,n.Z)(Qt,{message:this.state.error,close:this.close})):this.state.isReady?o().createElement(rs,e,(0,n.Z)("form",{className:"posting-dialog-form",method:"POST",onSubmit:this.handleSubmit},void 0,(0,n.Z)(Ct,{attachments:this.state.attachments,canProtect:this.state.canProtect,isProtected:this.state.protect,enableProtection:()=>this.setState({protect:!0}),disableProtection:()=>this.setState({protect:!1}),value:this.state.post,submitText:pgettext("edit reply submit","Edit reply"),disabled:this.state.isLoading,onAttachmentsChange:this.onAttachmentsChange,onChange:this.onPostChange}))):o().createElement(rs,e,(0,n.Z)("div",{className:"posting-loading ui-preview"},void 0,(0,n.Z)(Ct,{attachments:[],value:"",submitText:pgettext("edit reply submit","Edit reply"),disabled:!0,onAttachmentsChange:()=>{},onChange:()=>{}})))}};const rs=e=>{let{children:t,close:s,minimized:a,minimize:i,open:o,fullscreen:r,fullscreenEnter:l,fullscreenExit:d,post:c}=e;return(0,n.Z)($t,{fullscreen:r,minimized:a},void 0,(0,n.Z)(Kt,{fullscreen:r,fullscreenEnter:l,fullscreenExit:d,minimized:a,minimize:i,open:o,close:s},void 0,interpolate(pgettext("edit reply","Edit reply by %(poster)s from %(date)s"),{poster:c.poster?c.poster.username:c.poster_name,date:c.posted_on.fromNow()},!0)),(0,n.Z)(Wt,{},void 0,t))};function ls(e){switch(e.mode){case"START":return o().createElement(Xt,e);case"START_PRIVATE":return o().createElement(ss,e);case"REPLY":return o().createElement(is,e);case"EDIT":return o().createElement(ns,e);default:return null}}},12891:function(e,t,s){"use strict";s.d(t,{Jh:function(){return n},jn:function(){return o}});var a=s(55210),i=s(32233);function o(){return[(0,a.Ei)(i.Z.get("SETTINGS").thread_title_length_min,((e,t)=>{const s=ngettext("Thread title should be at least %(limit_value)s character long (it has %(show_value)s).","Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).",e);return interpolate(s,{limit_value:e,show_value:t},!0)})),(0,a.BS)(i.Z.get("SETTINGS").thread_title_length_max,((e,t)=>{const s=ngettext("Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).","Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).",e);return interpolate(s,{limit_value:e,show_value:t},!0)}))]}function n(){return i.Z.get("SETTINGS").post_length_max?[r(),(0,a.BS)(i.Z.get("SETTINGS").post_length_max||1e6,((e,t)=>{const s=ngettext("Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).","Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).",e);return interpolate(s,{limit_value:e,show_value:t},!0)}))]:[r()]}function r(){return(0,a.Ei)(i.Z.get("SETTINGS").post_length_min,((e,t)=>{const s=ngettext("Posted message should be at least %(limit_value)s character long (it has %(show_value)s).","Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).",e);return interpolate(s,{limit_value:e,show_value:t},!0)}))}},60471:function(e,t,s){"use strict";var a=s(22928),i=s(4942),o=s(57588),n=s.n(o);function r(e){let{icon:t}=e;return t?(0,a.Z)("span",{className:"material-icon"},void 0,t):null}t.Z=class extends n().Component{constructor(){super(...arguments),(0,i.Z)(this,"change",(e=>()=>{this.props.onChange({target:{value:e}})}))}getChoice(){let e=null;return this.props.choices.map((t=>{t.value===this.props.value&&(e=t)})),e}getIcon(){return this.getChoice().icon}getLabel(){return this.getChoice().label}render(){return(0,a.Z)("div",{className:"btn-group btn-select-group"},void 0,(0,a.Z)("button",{type:"button",className:"btn btn-select dropdown-toggle",id:this.props.id||null,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false","aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},void 0,(0,a.Z)(r,{icon:this.getIcon()}),this.getLabel()),(0,a.Z)("ul",{className:"dropdown-menu"},void 0,this.props.choices.map(((e,t)=>(0,a.Z)("li",{},t,(0,a.Z)("button",{type:"button",className:"btn-link",onClick:this.change(e.value)},void 0,(0,a.Z)(r,{icon:e.icon}),e.label))))))}}},14467:function(e,t,s){"use strict";var a,i=s(22928),o=(s(57588),s(32233)),n=s(82211),r=s(43345),l=s(47235),d=s(78657),c=s(59801),p=s(53904),u=s(93051),h=s(19755);t.Z=class extends r.Z{constructor(e){super(e),this.state={isLoading:!1,showActivation:!1,username:"",password:"",validators:{username:[],password:[]}}}clean(){return!!this.isValid()||(p.Z.error(gettext("Fill out both fields.")),!1)}send(){return d.Z.post(o.Z.get("AUTH_API"),{username:this.state.username,password:this.state.password})}handleSuccess(){let e=h("#hidden-login-form");e.append(''),e.append(''),e.find('input[type="hidden"]').val(d.Z.getCsrfToken()),e.find('input[name="redirect_to"]').val(window.location.pathname),e.find('input[name="username"]').val(this.state.username),e.find('input[name="password"]').val(this.state.password),e.submit(),this.setState({isLoading:!0})}handleError(e){400===e.status?"inactive_admin"===e.code?p.Z.info(e.detail):"inactive_user"===e.code?(p.Z.info(e.detail),this.setState({showActivation:!0})):"banned"===e.code?((0,u.Z)(e.detail),c.Z.hide()):p.Z.error(e.detail):403===e.status&&e.ban?((0,u.Z)(e.ban),c.Z.hide()):p.Z.apiError(e)}getActivationButton(){return this.state.showActivation?(0,i.Z)("a",{className:"btn btn-success btn-block",href:o.Z.get("REQUEST_ACTIVATION_URL")},void 0,gettext("Activate account")):null}render(){return(0,i.Z)("div",{className:"modal-dialog modal-sm modal-sign-in",role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,a||(a=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Sign in"))),(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(l.Z,{buttonLabel:gettext("Sign in with %(site)s"),formLabel:gettext("Or use your forum account:"),labelClassName:"text-center"}),(0,i.Z)("div",{className:"form-group"},void 0,(0,i.Z)("div",{className:"control-input"},void 0,(0,i.Z)("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_username",onChange:this.bindInput("username"),placeholder:gettext("Username or e-mail"),type:"text",value:this.state.username}))),(0,i.Z)("div",{className:"form-group"},void 0,(0,i.Z)("div",{className:"control-input"},void 0,(0,i.Z)("input",{className:"form-control input-lg",disabled:this.state.isLoading,id:"id_password",onChange:this.bindInput("password"),placeholder:gettext("Password"),type:"password",value:this.state.password})))),(0,i.Z)("div",{className:"modal-footer"},void 0,this.getActivationButton(),(0,i.Z)(n.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,gettext("Sign in")),(0,i.Z)("a",{className:"btn btn-default btn-block",href:o.Z.get("FORGOTTEN_PASSWORD_URL")},void 0,gettext("Forgot password?"))))))}}},24678:function(e,t,s){"use strict";s.d(t,{Jj:function(){return n},pg:function(){return r}});var a=s(22928),i=s(57588),o=s.n(i);t.ZP=class extends o().Component{getClass(){return function(e){let t="";return e.is_banned?t="banned":e.is_hidden?t="offline":e.is_online_hidden?t="online":e.is_offline_hidden?t="offline":e.is_online?t="online":e.is_offline&&(t="offline"),"user-status user-"+t}(this.props.status)}render(){return(0,a.Z)("span",{className:this.getClass()},void 0,this.props.children)}};class n extends o().Component{getIcon(){return this.props.status.is_banned?"remove_circle_outline":this.props.status.is_hidden?"help_outline":this.props.status.is_online_hidden?"label":this.props.status.is_offline_hidden?"label_outline":this.props.status.is_online?"lens":this.props.status.is_offline?"panorama_fish_eye":void 0}render(){return(0,a.Z)("span",{className:"material-icon status-icon"},void 0,this.getIcon())}}class r extends o().Component{getHelp(){return e=this.props.user,(t=this.props.status).is_banned?t.banned_until?interpolate(gettext("%(username)s is banned until %(ban_expires)s"),{username:e.username,ban_expires:t.banned_until.format("LL, LT")},!0):interpolate(gettext("%(username)s is banned"),{username:e.username},!0):t.is_hidden?interpolate(gettext("%(username)s is hiding presence"),{username:e.username},!0):t.is_online_hidden?interpolate(gettext("%(username)s is online (hidden)"),{username:e.username},!0):t.is_offline_hidden?interpolate(gettext("%(username)s was last seen %(last_click)s (hidden)"),{username:e.username,last_click:t.last_click.fromNow()},!0):t.is_online?interpolate(gettext("%(username)s is online"),{username:e.username},!0):t.is_offline?interpolate(gettext("%(username)s was last seen %(last_click)s"),{username:e.username,last_click:t.last_click.fromNow()},!0):void 0;var e,t}getLabel(){return this.props.status.is_banned?gettext("Banned"):this.props.status.is_hidden?gettext("Hidden"):this.props.status.is_online_hidden?gettext("Online (hidden)"):this.props.status.is_offline_hidden?gettext("Offline (hidden)"):this.props.status.is_online?gettext("Online"):this.props.status.is_offline?gettext("Offline"):void 0}render(){return(0,a.Z)("span",{className:this.props.className||"status-label",title:this.getHelp()},void 0,this.getLabel())}}},7850:function(e,t,s){"use strict";s.d(t,{Z:function(){return b}});var a,i,o,n,r,l=s(22928),d=s(57588),c=s.n(d),p=class extends c().Component{getEmptyMessage(){return this.props.emptyMessage?this.props.emptyMessage:gettext("No name changes have been recorded for your account.")}render(){return(0,l.Z)("div",{className:"username-history ui-ready"},void 0,(0,l.Z)("ul",{className:"list-group"},void 0,(0,l.Z)("li",{className:"list-group-item empty-message"},void 0,this.getEmptyMessage())))}},u=s(19605),h=class extends c().Component{renderUserAvatar(){return this.props.change.changed_by?(0,l.Z)("a",{href:this.props.change.changed_by.url,className:"user-avatar-wrapper"},void 0,(0,l.Z)(u.ZP,{user:this.props.change.changed_by,size:"100"})):a||(a=(0,l.Z)("span",{className:"user-avatar-wrapper"},void 0,(0,l.Z)(u.ZP,{size:"100"})))}renderUsername(){return this.props.change.changed_by?(0,l.Z)("a",{href:this.props.change.changed_by.url,className:"item-title"},void 0,this.props.change.changed_by.username):(0,l.Z)("span",{className:"item-title"},void 0,this.props.change.changed_by_username)}render(){return(0,l.Z)("li",{className:"list-group-item"},this.props.change.id,(0,l.Z)("div",{className:"change-avatar"},void 0,this.renderUserAvatar()),(0,l.Z)("div",{className:"change-author"},void 0,this.renderUsername()),(0,l.Z)("div",{className:"change"},void 0,(0,l.Z)("span",{className:"old-username"},void 0,this.props.change.old_username),i||(i=(0,l.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),(0,l.Z)("span",{className:"new-username"},void 0,this.props.change.new_username)),(0,l.Z)("div",{className:"change-date"},void 0,(0,l.Z)("abbr",{title:this.props.change.changed_on.format("LLL")},void 0,this.props.change.changed_on.fromNow())))}},m=class extends c().Component{render(){return(0,l.Z)("div",{className:"username-history ui-ready"},void 0,(0,l.Z)("ul",{className:"list-group"},void 0,this.props.changes.map((e=>(0,l.Z)(h,{change:e},e.id)))))}},v=s(44039),g=class extends c().Component{shouldComponentUpdate(){return!1}getClassName(){return this.props.hiddenOnMobile?"list-group-item hidden-xs hidden-sm":"list-group-item"}render(){return(0,l.Z)("li",{className:this.getClassName()},void 0,o||(o=(0,l.Z)("div",{className:"change-avatar"},void 0,(0,l.Z)("span",{className:"user-avatar"},void 0,(0,l.Z)(u.ZP,{size:"100"})))),(0,l.Z)("div",{className:"change-author"},void 0,(0,l.Z)("span",{className:"ui-preview-text",style:{width:v.e(30,100)+"px"}},void 0," ")),(0,l.Z)("div",{className:"change"},void 0,(0,l.Z)("span",{className:"ui-preview-text",style:{width:v.e(30,70)+"px"}},void 0," "),n||(n=(0,l.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),(0,l.Z)("span",{className:"ui-preview-text",style:{width:v.e(30,70)+"px"}},void 0," ")),(0,l.Z)("div",{className:"change-date"},void 0,(0,l.Z)("span",{className:"ui-preview-text",style:{width:v.e(80,140)+"px"}},void 0," ")))}},Z=class extends c().Component{shouldComponentUpdate(){return!1}render(){return(0,l.Z)("div",{className:"username-history ui-preview"},void 0,(0,l.Z)("ul",{className:"list-group"},void 0,[0,1,2].map((e=>(0,l.Z)(g,{hiddenOnMobile:e>0},e)))))}},b=class extends c().Component{render(){return this.props.isLoaded?this.props.changes.length?(0,l.Z)(m,{changes:this.props.changes}):(0,l.Z)(p,{emptyMessage:this.props.emptyMessage}):r||(r=(0,l.Z)(Z,{}))}}},40429:function(e,t,s){"use strict";s.d(t,{Z:function(){return k}});var a,i=s(22928),o=s(57588),n=s.n(o),r=s(19605),l=s(24678);function d(e){let{showStatus:t,user:s}=e;return(0,i.Z)("ul",{className:"list-unstyled"},void 0,(0,i.Z)(c,{showStatus:t,user:s}),(0,i.Z)(p,{user:s}),a||(a=(0,i.Z)("li",{className:"user-stat-divider"})),(0,i.Z)(u,{user:s}),(0,i.Z)(h,{user:s}),(0,i.Z)(m,{user:s}))}function c(e){let{showStatus:t,user:s}=e;return t?(0,i.Z)("li",{className:"user-stat-status"},void 0,(0,i.Z)(l.ZP,{status:s.status},void 0,(0,i.Z)(l.pg,{status:s.status,user:s}))):null}function p(e){let{user:t}=e;const{joined_on:s}=t;let a=interpolate(gettext("Joined on %(joined_on)s"),{joined_on:s.format("LL, LT")},!0),o=interpolate(gettext("Joined %(joined_on)s"),{joined_on:s.fromNow()},!0);return(0,i.Z)("li",{className:"user-stat-join-date"},void 0,(0,i.Z)("abbr",{title:a},void 0,o))}function u(e){let{user:t}=e;const s=v("user-stat-posts",t.posts),a=ngettext("%(posts)s post","%(posts)s posts",t.posts);return(0,i.Z)("li",{className:s},void 0,interpolate(a,{posts:t.posts},!0))}function h(e){let{user:t}=e;const s=v("user-stat-threads",t.threads),a=ngettext("%(threads)s thread","%(threads)s threads",t.threads);return(0,i.Z)("li",{className:s},void 0,interpolate(a,{threads:t.threads},!0))}function m(e){let{user:t}=e;const s=v("user-stat-followers",t.followers),a=ngettext("%(followers)s follower","%(followers)s followers",t.followers);return(0,i.Z)("li",{className:s},void 0,interpolate(a,{followers:t.followers},!0))}function v(e,t){return 0===t?e+" user-stat-empty":e}function g(e){let{rank:t,title:s}=e,a=s||t.title||t.name,o="user-title";return t.css_class&&(o+=" user-title-"+t.css_class),t.is_tab?(0,i.Z)("a",{className:o,href:t.url},void 0,a):(0,i.Z)("span",{className:o},void 0,a)}function Z(e){let{showStatus:t,user:s}=e;const{rank:a}=s;let o="panel user-card";return a.css_class&&(o+=" user-card-"+a.css_class),(0,i.Z)("div",{className:o},void 0,(0,i.Z)("div",{className:"panel-body"},void 0,(0,i.Z)("div",{className:"row"},void 0,(0,i.Z)("div",{className:"col-xs-3 user-card-left"},void 0,(0,i.Z)("div",{className:"user-card-small-avatar"},void 0,(0,i.Z)("a",{href:s.url},void 0,(0,i.Z)(r.ZP,{size:"50",size2x:"80",user:s})))),(0,i.Z)("div",{className:"col-xs-9 col-sm-12 user-card-body"},void 0,(0,i.Z)("div",{className:"user-card-avatar"},void 0,(0,i.Z)("a",{href:s.url},void 0,(0,i.Z)(r.ZP,{size:"150",size2x:"200",user:s}))),(0,i.Z)("div",{className:"user-card-username"},void 0,(0,i.Z)("a",{href:s.url},void 0,s.username)),(0,i.Z)("div",{className:"user-card-title"},void 0,(0,i.Z)(g,{rank:a,title:s.title})),(0,i.Z)("div",{className:"user-card-stats"},void 0,(0,i.Z)(d,{showStatus:t,user:s}))))))}var b,f,_,N,x=s(44039),y=class extends n().Component{shouldComponentUpdate(){return!1}render(){return(0,i.Z)("div",{className:"panel user-card user-card-preview"},void 0,(0,i.Z)("div",{className:"panel-body"},void 0,(0,i.Z)("div",{className:"row"},void 0,b||(b=(0,i.Z)("div",{className:"col-xs-3 user-card-left"},void 0,(0,i.Z)("div",{className:"user-card-small-avatar"},void 0,(0,i.Z)("span",{},void 0,(0,i.Z)(r.ZP,{size:"50",size2x:"80"}))))),(0,i.Z)("div",{className:"col-xs-9 col-sm-12 user-card-body"},void 0,f||(f=(0,i.Z)("div",{className:"user-card-avatar"},void 0,(0,i.Z)("span",{},void 0,(0,i.Z)(r.ZP,{size:"150",size2x:"200"})))),(0,i.Z)("div",{className:"user-card-username"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(60,150)+"px"}},void 0," ")),(0,i.Z)("div",{className:"user-card-title"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(60,150)+"px"}},void 0," ")),(0,i.Z)("div",{className:"user-card-stats"},void 0,(0,i.Z)("ul",{className:"list-unstyled"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,70)+"px"}},void 0," ")),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,70)+"px"}},void 0," ")),_||(_=(0,i.Z)("li",{className:"user-stat-divider"})),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,70)+"px"}},void 0," ")),(0,i.Z)("li",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:x.e(30,70)+"px"}},void 0," "))))))))}};function w(e){let{colClassName:t,cols:s}=e;const a=Array.apply(null,{length:s}).map(Number.call,Number);return(0,i.Z)("div",{className:"users-cards-list ui-preview"},void 0,(0,i.Z)("div",{className:"row"},void 0,a.map((e=>{let s=t;return 0!==e&&(s+=" hidden-xs"),3===e&&(s+=" hidden-sm"),(0,i.Z)("div",{className:s},e,N||(N=(0,i.Z)(y,{})))}))))}function k(e){let{cols:t,isReady:s,showStatus:a,users:o}=e,n="col-xs-12 col-sm-4";return 4===t&&(n+=" col-md-3"),s?(0,i.Z)("div",{className:"users-cards-list ui-ready"},void 0,(0,i.Z)("div",{className:"row"},void 0,o.map((e=>(0,i.Z)("div",{className:n},e.id,(0,i.Z)(Z,{showStatus:a,user:e})))))):(0,i.Z)(w,{colClassName:n,cols:t})}},82125:function(e,t,s){"use strict";var a=s(4942),i=s(57588),o=s.n(i);t.Z=class extends o().Component{constructor(e){super(e),(0,a.Z)(this,"toggleNav",(()=>{this.setState({dropdown:!this.state.dropdown})})),(0,a.Z)(this,"hideNav",(()=>{this.setState({dropdown:!1})})),this.state={dropdown:!1}}getCompactNavClassName(){return this.state.dropdown?"compact-nav open":"compact-nav"}}},7227:function(e,t,s){"use strict";var a=s(22928),i=s(4942),o=s(57588),n=s.n(o);t.Z=class extends n().Component{constructor(){super(...arguments),(0,i.Z)(this,"toggle",(()=>{this.props.onChange({target:{value:!this.props.value}})}))}getClassName(){return this.props.value?"btn btn-yes-no btn-yes-no-on":"btn btn-yes-no btn-yes-no-off"}getIcon(){return this.props.value?this.props.iconOn||"check_box":this.props.iconOff||"check_box_outline_blank"}getLabel(){return this.props.value?this.props.labelOn||gettext("yes"):this.props.labelOff||gettext("no")}render(){return(0,a.Z)("button",{type:"button",onClick:this.toggle,className:this.getClassName(),id:this.props.id||null,"aria-describedby":this.props["aria-describedby"]||null,disabled:this.props.disabled||!1},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,this.getIcon()),(0,a.Z)("span",{className:"btn-text"},void 0,this.getLabel()))}}},32233:function(e,t,s){"use strict";s.d(t,{Z:function(){return i}}),s(58294),s(95377),s(68852),s(39737),s(14316),s(43204),s(43511),s(7023);var a=new class{constructor(){this._initializers=[],this._context={}}addInitializer(e){this._initializers.push({key:e.name,item:e.initializer,after:e.after,before:e.before})}init(e){this._context=e,new class{constructor(e){this.isOrdered=!1,this._items=e||[]}add(e,t,s){this._items.push({key:e,item:t,after:s&&s.after||null,before:s&&s.before||null})}get(e,t){for(var s=0;s0&&t.length!==a.length;)o-=1,e.forEach(i);return s}}(this._initializers).orderedValues().forEach((e=>{e(this)}))}has(e){return!!this._context[e]}get(e,t){return this.has(e)?this._context[e]:t||void 0}pop(e){if(this.has(e)){let t=this._context[e];return this._context[e]=null,t}}};window.misago=a;var i=a},58339:function(e,t,s){"use strict";var a=s(32233),i=s(78657);a.Z.addInitializer({name:"ajax",initializer:function(){i.Z.init(a.Z.get("CSRF_COOKIE_NAME"))}})},64109:function(e,t,s){"use strict";var a=s(32233),i=s(35486),o=s(78657),n=s(53904),r=s(90287);a.Z.addInitializer({name:"auth-sync",initializer:function(e){e.get("isAuthenticated")&&window.setInterval((function(){o.Z.get(e.get("AUTH_API")).then((function(e){r.Z.dispatch((0,i.r$)(e))}),(function(e){n.Z.apiError(e)}))}),45e3)},after:"auth"})},46226:function(e,t,s){"use strict";var a=s(32233),i=s(98274),o=s(59801),n=s(90287),r=s(62833);a.Z.addInitializer({name:"auth",initializer:function(){i.Z.init(n.Z,r.Z,o.Z)},after:"store"})},93240:function(e,t,s){"use strict";var a=s(32233),i=s(78657),o=s(93825),n=s(96142),r=s(53904);a.Z.addInitializer({name:"captcha",initializer:function(e){o.ZP.init(e,i.Z,n.Z,r.Z)}})},75147:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i),n=s(32233),r=s(4942),l=s(78657);class d extends o().Component{constructor(e){super(e),(0,r.Z)(this,"handleDecline",(()=>{this.state.submiting||window.confirm(gettext("Declining will result in immediate deactivation and deletion of your account. This action is not reversible."))&&(this.setState({submiting:!0}),l.Z.post(this.props.api,{accept:!1}).then((()=>{window.location.reload(!0)})))})),(0,r.Z)(this,"handleAccept",(()=>{this.state.submiting||(this.setState({submiting:!0}),l.Z.post(this.props.api,{accept:!0}).then((()=>{window.location.reload(!0)})))})),this.state={submiting:!1}}render(){return(0,a.Z)("div",{},void 0,(0,a.Z)("button",{className:"btn btn-default",disabled:this.state.submiting,type:"buton",onClick:this.handleDecline},void 0,gettext("Decline")),(0,a.Z)("button",{className:"btn btn-primary",disabled:this.state.submiting,type:"buton",onClick:this.handleAccept},void 0,gettext("Accept and continue")))}}var c=s(4869);n.Z.addInitializer({name:"component:accept-agreement",initializer:function(e){document.getElementById("required-agreement-mount")&&(0,c.Z)((0,a.Z)(d,{api:e.get("REQUIRED_AGREEMENT_API")}),"required-agreement-mount",!1)},after:"store"})},4894:function(e,t,s){"use strict";var a=s(37424),i=s(32233),o=s(22928),n=s(57588),r=s.n(n),l=class extends r().Component{refresh(){window.location.reload()}getMessage(){return this.props.signedIn?interpolate(gettext("You have signed in as %(username)s. Please refresh the page before continuing."),{username:this.props.signedIn.username},!0):this.props.signedOut?interpolate(gettext("%(username)s, you have been signed out. Please refresh the page before continuing."),{username:this.props.user.username},!0):void 0}render(){let e="auth-message";return(this.props.signedIn||this.props.signedOut)&&(e+=" show"),(0,o.Z)("div",{className:e},void 0,(0,o.Z)("div",{className:"container"},void 0,(0,o.Z)("p",{className:"lead"},void 0,this.getMessage()),(0,o.Z)("p",{},void 0,(0,o.Z)("button",{className:"btn btn-default",type:"button",onClick:this.refresh},void 0,gettext("Reload page")),(0,o.Z)("span",{className:"hidden-xs hidden-sm"},void 0," "+gettext("or press F5 key.")))))}};function d(e){return{user:e.auth.user,signedIn:e.auth.signedIn,signedOut:e.auth.signedOut}}var c=s(4869);i.Z.addInitializer({name:"component:auth-message",initializer:function(){(0,c.Z)((0,a.$j)(d)(l),"auth-message-mount")},after:"store"})},29223:function(e,t,s){"use strict";var a=s(32233),i=s(93051);a.Z.addInitializer({name:"component:banmed-page",initializer:function(e){e.has("BAN_MESSAGE")&&(0,i.Z)(e.get("BAN_MESSAGE"),!1)},after:"store"})},3026:function(e,t,s){"use strict";var a=s(37424),i=s(22928),o=s(4942),n=s(30381),r=s.n(n),l=s(57588),d=s.n(l);function c(e){return(0,i.Z)("div",{className:"categories-list"},void 0,(0,i.Z)("ul",{className:"list-group"},void 0,(0,i.Z)("li",{className:"list-group-item empty-message"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("No categories exist or you don't have permission to see them.")))))}function p(e){let{category:t}=e;return t.description?(0,i.Z)("div",{className:"category-description",dangerouslySetInnerHTML:{__html:t.description.html}}):null}function u(e){let{category:t}=e;return(0,i.Z)("div",{className:h(t),title:m(t)},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,function(e){return e.is_closed?e.is_read?"lock_outline":"lock":e.is_read?"chat_bubble_outline":"chat_bubble"}(t)))}function h(e){return e.is_read?"read-status item-read":"read-status item-new"}function m(e){return e.is_closed?e.is_read?gettext("This category has no new posts. (closed)"):gettext("This category has new posts. (closed)"):e.is_read?gettext("This category has no new posts."):gettext("This category has new posts.")}function v(e){let{category:t}=e;return(0,i.Z)("div",{className:"col-xs-12 col-sm-6 col-md-6 category-main"},void 0,(0,i.Z)("div",{className:"media"},void 0,(0,i.Z)("div",{className:"media-left"},void 0,(0,i.Z)(u,{category:t})),(0,i.Z)("div",{className:"media-body"},void 0,(0,i.Z)("h4",{className:"media-heading"},void 0,(0,i.Z)("a",{href:t.url.index},void 0,t.name)),(0,i.Z)(p,{category:t}))))}var g,Z,b,f=s(19605);function _(e){let{category:t}=e;return(0,i.Z)("div",{className:"col-xs-12 col-sm-6 col-md-4 category-last-thread"},void 0,(0,i.Z)(N,{category:t}),(0,i.Z)(w,{category:t}),(0,i.Z)(k,{category:t}),(0,i.Z)(C,{category:t}))}function N(e){let{category:t}=e;return t.acl.can_browse&&t.acl.can_see_all_threads&&t.last_thread_title?(0,i.Z)("div",{className:"media"},void 0,(0,i.Z)("div",{className:"media-left hidden-xs"},void 0,(0,i.Z)(x,{category:t})),(0,i.Z)("div",{className:"media-body"},void 0,(0,i.Z)("div",{className:"media-heading"},void 0,(0,i.Z)("a",{className:"item-title thread-title",href:t.url.last_thread_new,title:t.last_thread_title},void 0,t.last_thread_title)),(0,i.Z)("ul",{className:"list-inline"},void 0,(0,i.Z)("li",{className:"category-last-thread-poster"},void 0,(0,i.Z)(y,{category:t})),g||(g=(0,i.Z)("li",{className:"divider"},void 0,"—")),(0,i.Z)("li",{className:"category-last-thread-date"},void 0,(0,i.Z)("a",{href:t.url.last_post},void 0,t.last_post_on.fromNow()))))):null}function x(e){let{category:t}=e;return t.last_poster?(0,i.Z)("a",{className:"last-poster-avatar",href:t.last_poster.url,title:t.last_poster_name},void 0,(0,i.Z)(f.ZP,{className:"media-object",size:40,user:t.last_poster})):(0,i.Z)("span",{className:"last-poster-avatar",title:t.last_poster_name},void 0,Z||(Z=(0,i.Z)(f.ZP,{className:"media-object",size:40})))}function y(e){let{category:t}=e;return t.last_poster?(0,i.Z)("a",{className:"item-title",href:t.last_poster.url},void 0,t.last_poster_name):(0,i.Z)("span",{className:"item-title"},void 0,t.last_poster_name)}function w(e){let{category:t}=e;return t.acl.can_browse&&t.acl.can_see_all_threads?t.last_thread_title?null:(0,i.Z)(S,{message:gettext("This category is empty. No threads were posted within it so far.")}):null}function k(e){let{category:t}=e;return t.acl.can_browse?t.acl.can_see_all_threads?null:(0,i.Z)(S,{message:gettext("This category is private. You can see only your own threads within it.")}):null}function C(e){let{category:t}=e;return t.acl.can_browse?null:(0,i.Z)(S,{message:gettext("This category is protected. You can't browse its contents.")})}function S(e){let{message:t}=e;return(0,i.Z)("div",{className:"media category-thread-message"},void 0,b||(b=(0,i.Z)("div",{className:"media-left"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,i.Z)("div",{className:"media-body"},void 0,(0,i.Z)("p",{},void 0,t)))}function E(e){let{category:t}=e;return(0,i.Z)("div",{className:"col-md-2 hidden-xs hidden-sm"},void 0,(0,i.Z)("ul",{className:"list-unstyled category-stats"},void 0,(0,i.Z)(L,{threads:t.threads}),(0,i.Z)(T,{posts:t.posts})))}function L(e){let{threads:t}=e;const s=ngettext("%(threads)s thread","%(threads)s threads",t);return(0,i.Z)("li",{className:"category-stat-threads"},void 0,interpolate(s,{threads:t},!0))}function T(e){let{posts:t}=e;const s=ngettext("%(posts)s post","%(posts)s posts",t);return(0,i.Z)("li",{className:"category-stat-posts"},void 0,interpolate(s,{posts:t},!0))}function P(e){let{category:t}=e,s="btn btn-default btn-block btn-sm btn-subcategory";return t.is_read||(s+=" btn-subcategory-new"),(0,i.Z)("div",{className:"col-xs-12 col-sm-4 col-md-3"},void 0,(0,i.Z)("a",{className:s,href:t.url.index},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,function(e){return e.is_closed?e.is_read?"lock_outline":"lock":e.is_read?"chat_bubble_outline":"chat_bubble"}(t)),(0,i.Z)("span",{className:"icon-text"},void 0,t.name)))}function O(e){let{category:t,isFirst:s}=e;return s||0===t.subcategories.length?null:(0,i.Z)("div",{className:"row subcategories-list"},void 0,t.subcategories.map((e=>(0,i.Z)(P,{category:e},e.id))))}function R(e){let{category:t,isFirst:s}=e,a="list-group-item";return t.description?a+=" list-group-category-has-description":a+=" list-group-category-no-description",s&&(a+=" list-group-item-first"),t.css_class&&(a+=" list-group-category-has-flavor",a+=" list-group-item-category-"+t.css_class),(0,i.Z)("li",{className:a},void 0,(0,i.Z)("div",{className:"row"},void 0,(0,i.Z)(v,{category:t}),(0,i.Z)(E,{category:t}),(0,i.Z)(_,{category:t})),(0,i.Z)(O,{category:t,isFirst:s}))}function A(e){let{category:t}=e,s="list-group list-group-category";return t.css_class&&(s+=" list-group-category-has-flavor",s+=" list-group-category-"+t.css_class),(0,i.Z)("ul",{className:s},void 0,(0,i.Z)(R,{category:t,isFirst:!0}),t.subcategories.map((e=>(0,i.Z)(R,{category:e,isFirst:!1},e.id))))}function I(e){let{categories:t}=e;return(0,i.Z)("div",{className:"categories-list"},void 0,t.map((e=>(0,i.Z)(A,{category:e},e.id))))}var D,j=s(32233),z=s(55547);const U=function(e){return Object.assign({},e,{last_post_on:e.last_post_on?r()(e.last_post_on):null,subcategories:e.subcategories.map(U)})};var M=class extends d().Component{constructor(e){super(e),(0,o.Z)(this,"update",(e=>{this.setState({categories:e.map(U)})})),this.state={categories:j.Z.get("CATEGORIES").map(U)},this.startPolling(j.Z.get("CATEGORIES_API"))}startPolling(e){z.Z.start({poll:"categories",url:e,frequency:18e4,update:this.update})}render(){const{categories:e}=this.state;return 0===e.length?D||(D=(0,i.Z)(c,{})):(0,i.Z)(I,{categories:e})}};function B(e){return{tick:e.tick.tick}}var q=s(4869);j.Z.addInitializer({name:"component:categories",initializer:function(){document.getElementById("categories-mount")&&(0,q.Z)((0,a.$j)(B)(M),"categories-mount")},after:"store"})},94795:function(e,t,s){"use strict";var a=s(22928),i=s(57588),o=s.n(i),n=s(37424),r=s(69987),l=s(94417);function d(e){return(0,a.Z)("div",{className:"list-group nav-side"},void 0,e.options.map((t=>(0,a.Z)(r.rU,{to:e.baseUrl+t.component+"/",className:"list-group-item",activeClassName:"active"},t.component,(0,a.Z)("span",{className:"material-icon"},void 0,t.icon),t.name))))}function c(e){return(0,a.Z)("ul",{className:e.className||"dropdown-menu",role:"menu"},void 0,e.options.map((t=>(0,a.Z)(l.Z,{path:e.baseUrl+t.component+"/"},t.component,(0,a.Z)(r.rU,{to:e.baseUrl+t.component+"/",onClick:e.hideNav},void 0,(0,a.Z)("span",{className:"material-icon hidden-sm"},void 0,t.icon),t.name)))))}var p,u=s(4942),h=s(82211),m=s(78657),v=s(53328),g=s(53904),Z=s(90287),b=s(32233),f=class extends o().Component{constructor(e){super(e),(0,u.Z)(this,"onPasswordChange",(e=>{this.setState({password:e.target.value})})),(0,u.Z)(this,"handleSubmit",(e=>{e.preventDefault();const{isLoading:t,password:s}=this.state,{user:a}=this.props;return 0==s.length?(g.Z.error(gettext("Enter your password to confirm account deletion.")),!1):!t&&(this.setState({isLoading:!0}),void m.Z.post(a.api.delete,{password:s}).then((e=>{window.location.href=b.Z.get("MISAGO_PATH")}),(e=>{this.setState({isLoading:!1}),e.password?g.Z.error(e.password[0]):g.Z.apiError(e)})))})),this.state={isLoading:!1,password:""}}componentDidMount(){v.Z.set({title:gettext("Delete account"),parent:gettext("Change your options")})}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("div",{className:"panel panel-danger panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Delete account"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,gettext("You are going to delete your account. This action is nonreversible, and will result in following data being deleted:")),(0,a.Z)("p",{},void 0,"-"," ",gettext("Stored IP addresses associated with content that you have posted will be deleted.")),(0,a.Z)("p",{},void 0,"-"," ",gettext("Your username will become available for other user to rename to or for new user to register their account with.")),(0,a.Z)("p",{},void 0,"-"," ",gettext("Your e-mail will become available for use in new account registration.")),p||(p=(0,a.Z)("hr",{})),(0,a.Z)("p",{},void 0,gettext("All your posted content will NOT be deleted, but username associated with it will be changed to one shared by all deleted accounts."))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)("div",{className:"input-group"},void 0,(0,a.Z)("input",{className:"form-control",disabled:this.state.isLoading,name:"password-confirmation",type:"password",placeholder:gettext("Enter your password to confirm account deletion."),value:this.state.password,onChange:this.onPasswordChange}),(0,a.Z)("span",{className:"input-group-btn"},void 0,(0,a.Z)(h.Z,{className:"btn-danger",loading:this.state.isLoading},void 0,gettext("Delete my account")))))))}},_=s(21688),N=class extends o().Component{constructor(){super(...arguments),(0,u.Z)(this,"onSuccess",(()=>{g.Z.info(gettext("Your details have been updated."))}))}componentDidMount(){v.Z.set({title:gettext("Edit details"),parent:gettext("Change your options")})}render(){return(0,a.Z)(_.Z,{api:this.props.user.api.edit_details,onSuccess:this.onSuccess})}},x=s(30381),y=s.n(x);class w extends o().Component{constructor(e){super(e),(0,u.Z)(this,"handleLoadDownloads",(()=>{m.Z.get(this.props.user.api.data_downloads).then((e=>{this.setState({isLoading:!1,downloads:e})}),(e=>{g.Z.apiError(e)}))})),(0,u.Z)(this,"handleRequestDataDownload",(()=>{this.setState({isSubmiting:!0}),m.Z.post(this.props.user.api.request_data_download).then((()=>{this.handleLoadDownloads(),g.Z.success(gettext("Your request for data download has been registered.")),this.setState({isSubmiting:!1})}),(e=>{g.Z.apiError(e),this.setState({isSubmiting:!1})}))})),this.state={isLoading:!1,isSubmiting:!1,downloads:[]}}componentDidMount(){v.Z.set({title:gettext("Download your data"),parent:gettext("Change your options")}),this.handleLoadDownloads()}render(){return(0,a.Z)("div",{},void 0,(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Download your data"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("p",{},void 0,gettext('To download your data from the site, click the "Request data download" button. Depending on amount of data to be archived and number of users wanting to download their data at same time it may take up to few days for your download to be prepared. An e-mail with notification will be sent to you when your data is ready to be downloaded.')),(0,a.Z)("p",{},void 0,gettext("The download will only be available for limited amount of time, after which it will be deleted from the site and marked as expired."))),(0,a.Z)("table",{className:"table"},void 0,(0,a.Z)("thead",{},void 0,(0,a.Z)("tr",{},void 0,(0,a.Z)("th",{},void 0,gettext("Requested on")),(0,a.Z)("th",{className:"col-md-4"},void 0,gettext("Download")))),(0,a.Z)("tbody",{},void 0,this.state.downloads.map((e=>(0,a.Z)("tr",{},e.id,(0,a.Z)("td",{style:k},void 0,y()(e.requested_on).fromNow()),(0,a.Z)("td",{},void 0,(0,a.Z)(C,{exportFile:e.file,status:e.status}))))),0==this.state.downloads.length?(0,a.Z)("tr",{},void 0,(0,a.Z)("td",{colSpan:"2"},void 0,gettext("You have no data downloads."))):null)),(0,a.Z)("div",{className:"panel-footer text-right"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isSubmiting,type:"button",onClick:this.handleRequestDataDownload},void 0,gettext("Request data download")))))}}const k={verticalAlign:"middle"},C=e=>{let{exportFile:t,status:s}=e;return 0===s||1===s?(0,a.Z)(h.Z,{className:"btn-info btn-sm btn-block",disabled:!0,type:"button"},void 0,gettext("Download is being prepared")):t?(0,a.Z)("a",{className:"btn btn-success btn-sm btn-block",href:t},void 0,gettext("Download your data")):(0,a.Z)(h.Z,{className:"btn-default btn-sm btn-block",disabled:!0,type:"button"},void 0,gettext("Download is expired"))};var S,E=s(43345),L=s(96359),T=s(60471),P=s(7227),O=s(35486),R=class extends E.Z{constructor(e){super(e),this.state={isLoading:!1,is_hiding_presence:e.user.is_hiding_presence,limits_private_thread_invites_to:e.user.limits_private_thread_invites_to,subscribe_to_started_threads:e.user.subscribe_to_started_threads,subscribe_to_replied_threads:e.user.subscribe_to_replied_threads,errors:{}},this.privateThreadInvitesChoices=[{value:0,icon:"help_outline",label:gettext("Everybody")},{value:1,icon:"done_all",label:gettext("Users I follow")},{value:2,icon:"highlight_off",label:gettext("Nobody")}],this.subscribeToChoices=[{value:0,icon:"star_border",label:gettext("No")},{value:1,icon:"star_half",label:gettext("Notify")},{value:2,icon:"star",label:gettext("Notify with e-mail")}]}send(){return m.Z.post(this.props.user.api.options,{is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})}handleSuccess(){Z.Z.dispatch((0,O.r$)({is_hiding_presence:this.state.is_hiding_presence,limits_private_thread_invites_to:this.state.limits_private_thread_invites_to,subscribe_to_started_threads:this.state.subscribe_to_started_threads,subscribe_to_replied_threads:this.state.subscribe_to_replied_threads})),g.Z.success(gettext("Your forum options have been changed."))}handleError(e){400===e.status?g.Z.error(gettext("Please reload page and try again.")):g.Z.apiError(e)}componentDidMount(){v.Z.set({title:gettext("Forum options"),parent:gettext("Change your options")})}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change forum options"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)("fieldset",{},void 0,(0,a.Z)("legend",{},void 0,gettext("Privacy settings")),(0,a.Z)(L.Z,{label:gettext("Hide my presence"),helpText:gettext("If you hide your presence, only members with permission to see hidden users will see when you are online."),for:"id_is_hiding_presence"},void 0,(0,a.Z)(P.Z,{id:"id_is_hiding_presence",disabled:this.state.isLoading,iconOn:"visibility_off",iconOff:"visibility",labelOn:gettext("Hide my presence from other users"),labelOff:gettext("Show my presence to other users"),onChange:this.bindInput("is_hiding_presence"),value:this.state.is_hiding_presence})),(0,a.Z)(L.Z,{label:gettext("Private thread invitations"),for:"id_limits_private_thread_invites_to"},void 0,(0,a.Z)(T.Z,{id:"id_limits_private_thread_invites_to",disabled:this.state.isLoading,onChange:this.bindInput("limits_private_thread_invites_to"),value:this.state.limits_private_thread_invites_to,choices:this.privateThreadInvitesChoices}))),(0,a.Z)("fieldset",{},void 0,(0,a.Z)("legend",{},void 0,gettext("Automatic subscriptions")),(0,a.Z)(L.Z,{label:gettext("Threads I start"),for:"id_subscribe_to_started_threads"},void 0,(0,a.Z)(T.Z,{id:"id_subscribe_to_started_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_started_threads"),value:this.state.subscribe_to_started_threads,choices:this.subscribeToChoices})),(0,a.Z)(L.Z,{label:gettext("Threads I reply to"),for:"id_subscribe_to_replied_threads"},void 0,(0,a.Z)(T.Z,{id:"id_subscribe_to_replied_threads",disabled:this.state.isLoading,onChange:this.bindInput("subscribe_to_replied_threads"),value:this.state.subscribe_to_replied_threads,choices:this.subscribeToChoices})))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Save changes")))))}},A=s(95187);function I(){return(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change username"))),S||(S=(0,a.Z)(A.Z,{})))}var D,j,z,U,M,B,q,H=s(33556),F=class extends o().Component{getHelpText(){return this.props.options.next_on?interpolate(gettext("You will be able to change your username %(next_change)s."),{next_change:this.props.options.next_on.fromNow()},!0):gettext("You have used up available name changes.")}render(){return(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change username"))),(0,a.Z)(H.Z,{helpText:this.getHelpText(),message:gettext("You can't change your username at the moment.")}))}},Y=s(55210),V=class extends E.Z{constructor(e){super(e),this.state={username:"",validators:{username:[Y.lG(),Y.HR(e.options.length_min),Y.gS(e.options.length_max)]},isLoading:!1}}getHelpText(){let e=[];if(this.props.options.changes_left>0){let t=ngettext("You can change your username %(changes_left)s more time.","You can change your username %(changes_left)s more times.",this.props.options.changes_left);e.push(interpolate(t,{changes_left:this.props.options.changes_left},!0))}if(this.props.user.acl.name_changes_expire>0){let t=ngettext("Used changes become available again after %(name_changes_expire)s day.","Used changes become available again after %(name_changes_expire)s days.",this.props.user.acl.name_changes_expire);e.push(interpolate(t,{name_changes_expire:this.props.user.acl.name_changes_expire},!0))}return e.length?e.join(" "):null}clean(){let e=this.validate();return e.username?(g.Z.error(e.username[0]),!1):this.state.username.trim()!==this.props.user.username||(g.Z.info(gettext("Your new username is same as current one.")),!1)}send(){return m.Z.post(this.props.user.api.username,{username:this.state.username})}handleSuccess(e){this.setState({username:""}),this.props.complete(e.username,e.slug,e.options)}handleError(e){g.Z.apiError(e)}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change username"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)(L.Z,{label:gettext("New username"),for:"id_username",helpText:this.getHelpText()},void 0,(0,a.Z)("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Change username")))))}},G=s(7850),$=s(48927),W=s(6935),Q=class extends o().Component{constructor(e){super(e),(0,u.Z)(this,"onComplete",((e,t,s)=>{this.setState({options:s}),Z.Z.dispatch((0,$.KP)({username:e,slug:t},this.props.user,this.props.user)),Z.Z.dispatch((0,W._S)(this.props.user,e,t)),g.Z.success(gettext("Your username has been changed successfully."))})),this.state={isLoaded:!1,options:null}}componentDidMount(){v.Z.set({title:gettext("Change username"),parent:gettext("Change your options")}),Promise.all([m.Z.get(this.props.user.api.username),m.Z.get(b.Z.get("USERNAME_CHANGES_API"),{user:this.props.user.id})]).then((e=>{Z.Z.dispatch((0,$.ZB)(e[1].results)),this.setState({isLoaded:!0,options:{changes_left:e[0].changes_left,length_min:e[0].length_min,length_max:e[0].length_max,next_on:e[0].next_on?y()(e[0].next_on):null}})}))}getChangeForm(){return this.state.isLoaded?0===this.state.options.changes_left?(0,a.Z)(F,{options:this.state.options}):(0,a.Z)(V,{complete:this.onComplete,options:this.state.options,user:this.props.user}):D||(D=(0,a.Z)(I,{}))}render(){return(0,a.Z)("div",{},void 0,this.getChangeForm(),(0,a.Z)(G.Z,{changes:this.props["username-history"],isLoaded:this.state.isLoaded}))}},K=class extends E.Z{constructor(e){super(e),this.state={new_email:"",password:"",validators:{new_email:[Y.Do()],password:[]},isLoading:!1}}clean(){let e=this.validate();return-1!==[this.state.new_email.trim().length,this.state.password.trim().length].indexOf(0)?(g.Z.error(gettext("Fill out all fields.")),!1):!e.new_email||(g.Z.error(e.new_email[0]),!1)}send(){return m.Z.post(this.props.user.api.change_email,{new_email:this.state.new_email,password:this.state.password})}handleSuccess(e){this.setState({new_email:"",password:""}),g.Z.success(e.detail)}handleError(e){400===e.status?e.new_email?g.Z.error(e.new_email):g.Z.error(e.password):g.Z.apiError(e)}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("input",{type:"type",style:{display:"none"}}),(0,a.Z)("input",{type:"password",style:{display:"none"}}),(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change e-mail address"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)(L.Z,{label:gettext("New e-mail"),for:"id_new_email"},void 0,(0,a.Z)("input",{type:"text",id:"id_new_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_email"),value:this.state.new_email})),j||(j=(0,a.Z)("hr",{})),(0,a.Z)(L.Z,{label:gettext("Your current password"),for:"id_confirm_email"},void 0,(0,a.Z)("input",{type:"password",id:"id_confirm_email",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Change e-mail")))))}},J=class extends E.Z{constructor(e){super(e),this.state={new_password:"",repeat_password:"",password:"",validators:{new_password:[],repeat_password:[],password:[]},isLoading:!1}}clean(){let e=this.validate();return-1!==[this.state.new_password.trim().length,this.state.repeat_password.trim().length,this.state.password.trim().length].indexOf(0)?(g.Z.error(gettext("Fill out all fields.")),!1):e.new_password?(g.Z.error(e.new_password[0]),!1):this.state.new_password===this.state.repeat_password||(g.Z.error(gettext("New passwords are different.")),!1)}send(){return m.Z.post(this.props.user.api.change_password,{new_password:this.state.new_password,password:this.state.password})}handleSuccess(e){this.setState({new_password:"",repeat_password:"",password:""}),g.Z.success(e.detail)}handleError(e){400===e.status?e.new_password?g.Z.error(e.new_password):g.Z.error(e.password):g.Z.apiError(e)}render(){return(0,a.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,a.Z)("input",{type:"type",style:{display:"none"}}),(0,a.Z)("input",{type:"password",style:{display:"none"}}),(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change password"))),(0,a.Z)("div",{className:"panel-body"},void 0,(0,a.Z)(L.Z,{label:gettext("New password"),for:"id_new_password"},void 0,(0,a.Z)("input",{type:"password",id:"id_new_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("new_password"),value:this.state.new_password})),(0,a.Z)(L.Z,{label:gettext("Repeat password"),for:"id_repeat_password"},void 0,(0,a.Z)("input",{type:"password",id:"id_repeat_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("repeat_password"),value:this.state.repeat_password})),z||(z=(0,a.Z)("hr",{})),(0,a.Z)(L.Z,{label:gettext("Your current password"),for:"id_confirm_password"},void 0,(0,a.Z)("input",{type:"password",id:"id_confirm_password",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),(0,a.Z)("div",{className:"panel-footer"},void 0,(0,a.Z)(h.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Change password")))))}},X=()=>(0,a.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,a.Z)("div",{className:"panel-heading"},void 0,(0,a.Z)("h3",{className:"panel-title"},void 0,gettext("Change email or password"))),(0,a.Z)("div",{className:"panel-body panel-message-body"},void 0,U||(U=(0,a.Z)("div",{className:"message-icon"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,a.Z)("div",{className:"message-body"},void 0,(0,a.Z)("p",{className:"lead"},void 0,gettext("You need to set a password for your account to be able to change your username or email.")),(0,a.Z)("p",{className:"help-block"},void 0,(0,a.Z)("a",{className:"btn btn-primary",href:b.Z.get("FORGOTTEN_PASSWORD_URL")},void 0,gettext("Set password")))))),ee=class extends o().Component{componentDidMount(){v.Z.set({title:gettext("Change email or password"),parent:gettext("Change your options")})}render(){return this.props.user.has_usable_password?(0,a.Z)("div",{},void 0,(0,a.Z)(K,{user:this.props.user}),(0,a.Z)(J,{user:this.props.user}),(0,a.Z)("p",{className:"message-line"},void 0,B||(B=(0,a.Z)("span",{className:"material-icon"},void 0,"warning")),(0,a.Z)("a",{href:b.Z.get("FORGOTTEN_PASSWORD_URL")},void 0,gettext("Change forgotten password")))):M||(M=(0,a.Z)(X,{}))}},te=s(82125),se=s(98936),ae=s(59131),ie=s(99755),oe=class extends te.Z{render(){const e=b.Z.get("USER_OPTIONS").filter((e=>{const t=b.Z.get("USERCP_URL")+e.component+"/";return this.props.location.pathname.substr(0,t.length)===t}))[0];return(0,a.Z)("div",{className:"page page-options"},void 0,(0,a.Z)(ie.sP,{},void 0,(0,a.Z)(ie.mr,{styleName:"options"},void 0,(0,a.Z)(ie.gC,{styleName:"options"},void 0,(0,a.Z)(se.gq,{},void 0,(0,a.Z)(se.kw,{auto:!0},void 0,(0,a.Z)(se.Z6,{auto:!0},void 0,(0,a.Z)("h1",{},void 0,gettext("Change your options"))),(0,a.Z)(se.Z6,{className:"hidden-xs hidden-md hidden-lg",shrink:!0},void 0,(0,a.Z)("div",{className:"dropdown"},void 0,(0,a.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle",title:gettext("Menu"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,q||(q=(0,a.Z)("span",{className:"material-icon"},void 0,"menu"))),(0,a.Z)(c,{className:"dropdown-menu dropdown-menu-right",baseUrl:b.Z.get("USERCP_URL"),options:b.Z.get("USER_OPTIONS")})))),(0,a.Z)(se.kw,{className:"hidden-sm hidden-md hidden-lg"},void 0,(0,a.Z)(se.Z6,{},void 0,(0,a.Z)("div",{className:"dropdown"},void 0,(0,a.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-block dropdown-toggle","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,(0,a.Z)("span",{className:"material-icon"},void 0,e.icon),e.name),(0,a.Z)(c,{className:"dropdown-menu",baseUrl:b.Z.get("USERCP_URL"),options:b.Z.get("USER_OPTIONS")})))))))),(0,a.Z)(ae.Z,{},void 0,(0,a.Z)("div",{className:"row"},void 0,(0,a.Z)("div",{className:"col-md-3 hidden-xs hidden-sm"},void 0,(0,a.Z)(d,{baseUrl:b.Z.get("USERCP_URL"),options:b.Z.get("USER_OPTIONS")})),(0,a.Z)("div",{className:"col-md-9"},void 0,this.props.children))))}};function ne(e){return{tick:e.tick.tick,user:e.auth.user,"username-history":e["username-history"]}}function re(){const e=[{path:b.Z.get("USERCP_URL")+"forum-options/",component:(0,n.$j)(ne)(R)},{path:b.Z.get("USERCP_URL")+"edit-details/",component:(0,n.$j)(ne)(N)}],t=b.Z.get("SETTINGS").DELEGATE_AUTH;return t||(e.push({path:b.Z.get("USERCP_URL")+"change-username/",component:(0,n.$j)(ne)(Q)}),e.push({path:b.Z.get("USERCP_URL")+"sign-in-credentials/",component:(0,n.$j)(ne)(ee)})),b.Z.get("ENABLE_DOWNLOAD_OWN_DATA")&&e.push({path:b.Z.get("USERCP_URL")+"download-data/",component:(0,n.$j)(ne)(w)}),!t&&b.Z.get("ENABLE_DELETE_OWN_ACCOUNT")&&e.push({path:b.Z.get("USERCP_URL")+"delete-account/",component:(0,n.$j)(ne)(f)}),e}var le=s(39633);b.Z.addInitializer({name:"component:options",initializer:function(e){e.has("USER_OPTIONS")&&(0,le.Z)({root:b.Z.get("USERCP_URL"),component:oe,paths:re()})},after:"store"})},95563:function(e,t,s){"use strict";var a,i=s(37424),o=s(22928),n=s(4942),r=s(57588),l=s.n(r),d=s(30381),c=s.n(d),p=s(95187),u=s(33556),h=s(32233),m=s(55547),v=s(53328),g=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"update",(e=>{e.expires_on&&(e.expires_on=c()(e.expires_on)),this.setState({isLoaded:!0,error:null,ban:e})})),(0,n.Z)(this,"error",(e=>{this.setState({isLoaded:!0,error:e.detail,ban:null})})),h.Z.has("PROFILE_BAN")?this.initWithPreloadedData(h.Z.pop("PROFILE_BAN")):this.initWithoutPreloadedData(),this.startPolling(e.profile.api.ban)}initWithPreloadedData(e){e.expires_on&&(e.expires_on=c()(e.expires_on)),this.state={isLoaded:!0,ban:e}}initWithoutPreloadedData(){this.state={isLoaded:!1}}startPolling(e){m.Z.start({poll:"ban-details",url:e,frequency:9e4,update:this.update,error:this.error})}componentDidMount(){v.Z.set({title:gettext("Ban details"),parent:this.props.profile.username})}componentWillUnmount(){m.Z.stop("ban-details")}getUserMessage(){return this.state.ban.user_message?(0,o.Z)("div",{className:"panel-body ban-message ban-user-message"},void 0,(0,o.Z)("h4",{},void 0,gettext("User-shown ban message")),(0,o.Z)("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.user_message.html}})):null}getStaffMessage(){return this.state.ban.staff_message?(0,o.Z)("div",{className:"panel-body ban-message ban-staff-message"},void 0,(0,o.Z)("h4",{},void 0,gettext("Team-shown ban message")),(0,o.Z)("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.state.ban.staff_message.html}})):null}getExpirationMessage(){if(this.state.ban.expires_on){if(this.state.ban.expires_on.isAfter(c()())){let e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.state.ban.expires_on.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.state.ban.expires_on.fromNow()},!0);return(0,o.Z)("abbr",{title:e},void 0,t)}return gettext("This ban has expired.")}return interpolate(gettext("%(username)s's ban is permanent."),{username:this.props.profile.username},!0)}getPanelBody(){return this.state.ban?Object.keys(this.state.ban).length?(0,o.Z)("div",{},void 0,this.getUserMessage(),this.getStaffMessage(),(0,o.Z)("div",{className:"panel-body ban-expires"},void 0,(0,o.Z)("h4",{},void 0,gettext("Ban expiration")),(0,o.Z)("p",{className:"lead"},void 0,this.getExpirationMessage()))):(0,o.Z)("div",{},void 0,(0,o.Z)(u.Z,{message:gettext("No ban is active at the moment.")})):this.state.error?(0,o.Z)("div",{},void 0,(0,o.Z)(u.Z,{icon:"error_outline",message:this.state.error})):a||(a=(0,o.Z)("div",{},void 0,(0,o.Z)(p.Z,{})))}render(){return(0,o.Z)("div",{className:"profile-ban-details"},void 0,(0,o.Z)("div",{className:"panel panel-default"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,gettext("Ban details"))),this.getPanelBody()))}},Z=s(21688);function b(e){let{api:t,display:s,onCancel:a,onSuccess:i}=e;return s?(0,o.Z)(Z.Z,{api:t,onCancel:a,onSuccess:i}):null}function f(e){let{isAuthenticated:t,profile:s}=e,a=null;return a=t?gettext("You are not sharing any details with others."):interpolate(gettext("%(username)s is not sharing any details with others."),{username:s.username},!0),(0,o.Z)("div",{className:"panel panel-default"},void 0,(0,o.Z)("div",{className:"panel-body text-center lead"},void 0,a))}function _(e){let{html:t,text:s,url:a}=e;return t?(0,o.Z)("div",{className:"form-control-static col-md-9",dangerouslySetInnerHTML:{__html:t}}):(0,o.Z)("div",{className:"form-control-static col-md-9"},void 0,(0,o.Z)(N,{text:s,url:a}))}function N(e){let{text:t,url:s}=e;return s?(0,o.Z)("p",{},void 0,(0,o.Z)("a",{href:s,target:"_blank",rel:"nofollow"},void 0,t||s)):t?(0,o.Z)("p",{},void 0,t):null}function x(e){return(0,o.Z)("div",{className:"form-group"},void 0,(0,o.Z)("strong",{className:"control-label col-md-3"},void 0,e.name,":"),l().createElement(_,e))}function y(e){let{fields:t,name:s}=e;return(0,o.Z)("div",{className:"panel panel-default panel-profile-details-group"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,s)),(0,o.Z)("div",{className:"panel-body"},void 0,(0,o.Z)("div",{className:"form-horizontal"},void 0,t.map((e=>{let{fieldname:t,html:s,name:a,text:i,url:n}=e;return(0,o.Z)(x,{name:a,html:s,text:i,url:n},t)})))))}var w,k=s(37848);function C(e){let{display:t,groups:s,isAuthenticated:a,loading:i,profile:n}=e;return t?i?w||(w=(0,o.Z)(k.Z,{})):s.length?(0,o.Z)("div",{},void 0,s.map(((e,t)=>(0,o.Z)(y,{fields:e.fields,name:e.name},t)))):(0,o.Z)(f,{isAuthenticated:a,profile:n}):null}var S,E=s(92490),L=e=>{let{onEdit:t,showEditButton:s}=e;return(0,o.Z)(E.o8,{},void 0,(0,o.Z)(E.Z2,{auto:!0},void 0,(0,o.Z)(E.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,gettext("Details")))),s&&(0,o.Z)(E.Z2,{},void 0,(0,o.Z)(E.Eg,{},void 0,(0,o.Z)("button",{className:"btn btn-default btn-outline btn-block",onClick:t,type:"button"},void 0,gettext("Edit")))))},T=s(58598),P=s(78657),O=s(53904),R=class extends l().Component{componentDidMount(){const{data:e,dispatch:t,user:s}=this.props;e&&e.id===s.id||P.Z.get(this.props.user.api.details).then((e=>{t((0,T.zD)(e))}),(e=>{O.Z.apiError(e)}))}render(){return this.props.children}},A=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"onCancel",(()=>{this.setState({editing:!1})})),(0,n.Z)(this,"onEdit",(()=>{this.setState({editing:!0})})),(0,n.Z)(this,"onSuccess",(e=>{const{dispatch:t,isAuthenticated:s,profile:a}=this.props;let i=null;i=s?gettext("Your details have been updated."):interpolate(gettext("%(username)s's details have been updated."),{username:a.username},!0),O.Z.info(i),t((0,T.zD)(e)),this.setState({editing:!1})})),this.state={editing:!1}}componentDidMount(){v.Z.set({title:gettext("Details"),parent:this.props.profile.username})}render(){const{dispatch:e,isAuthenticated:t,profile:s,profileDetails:a}=this.props,i=a.id!==s.id;return(0,o.Z)(R,{data:a,dispatch:e,user:s},void 0,(0,o.Z)("div",{className:"profile-details"},void 0,(0,o.Z)(L,{onEdit:this.onEdit,showEditButton:!!a.edit&&!this.state.editing}),(0,o.Z)(C,{display:!this.state.editing,groups:a.groups,isAuthenticated:t,loading:i,profile:s}),(0,o.Z)(b,{api:s.api.edit_details,dispatch:e,display:this.state.editing,onCancel:this.onCancel,onSuccess:this.onSuccess})))}},I=s(87462),D=s(11005),j=s(82211),z=s(21981),U=s(90287),M=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"loadMore",(()=>{this.setState({isLoading:!0}),this.loadItems(this.props.posts.next)})),this.state={isLoading:!1}}loadItems(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;P.Z.get(this.props.api,{start:e||0}).then((t=>{0===e?U.Z.dispatch(z.zD(t)):U.Z.dispatch(z.R3(t)),this.setState({isLoading:!1})}),(e=>{this.setState({isLoading:!1}),O.Z.apiError(e)}))}componentDidMount(){v.Z.set({title:this.props.title,parent:this.props.profile.username}),this.loadItems()}render(){return(0,o.Z)("div",{className:"profile-feed"},void 0,(0,o.Z)(E.o8,{},void 0,(0,o.Z)(E.Z2,{auto:!0},void 0,(0,o.Z)(E.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.props.header)))),l().createElement(B,(0,I.Z)({isLoading:this.state.isLoading,loadMore:this.loadMore},this.props)))}};function B(e){return e.posts.isLoaded&&!e.posts.results.length?(0,o.Z)("p",{className:"lead"},void 0,e.emptyMessage):(0,o.Z)("div",{},void 0,(0,o.Z)(D.Z,{isReady:e.posts.isLoaded,posts:e.posts.results,poster:e.profile}),(0,o.Z)(q,{isLoading:e.isLoading,loadMore:e.loadMore,next:e.posts.next}))}function q(e){return e.next?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(j.Z,{className:"btn btn-default btn-outline",loading:e.isLoading,onClick:e.loadMore},void 0,gettext("Show older activity"))):null}var H,F,Y,V,G,$,W,Q,K,J,X,ee=class extends l().Component{getClassName(){return this.props.className?"form-search "+this.props.className:"form-search"}render(){return(0,o.Z)("div",{className:this.getClassName()},void 0,(0,o.Z)("input",{type:"text",className:"form-control",value:this.props.value,onChange:this.props.onChange,placeholder:this.props.placeholder||gettext("Search...")}),S||(S=(0,o.Z)("span",{className:"material-icon"},void 0,"search")))}},te=s(40429),se=s(6935),ae=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"loadMore",(()=>{this.setState({isBusy:!0}),this.loadUsers(this.state.page+1,this.state.search)})),(0,n.Z)(this,"search",(e=>{this.setState({isLoaded:!1,isBusy:!0,search:e.target.value,count:0,more:0,page:1,pages:1}),this.loadUsers(1,e.target.value)})),this.setSpecialProps(),h.Z.has(this.PRELOADED_DATA_KEY)?this.initWithPreloadedData(h.Z.pop(this.PRELOADED_DATA_KEY)):this.initWithoutPreloadedData()}setSpecialProps(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWERS",this.TITLE=gettext("Followers"),this.API_FILTER="followers"}initWithPreloadedData(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},U.Z.dispatch((0,se.ZB)(e.results))}initWithoutPreloadedData(){this.state={isLoaded:!1,isBusy:!1,search:"",count:0,more:0,page:1,pages:1},this.loadUsers()}loadUsers(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;const s=this.props.profile.api[this.API_FILTER];P.Z.get(s,{search:t,page:e||1},"user-"+this.API_FILTER).then((t=>{1===e?U.Z.dispatch((0,se.ZB)(t.results)):U.Z.dispatch((0,se.R3)(t.results)),this.setState({isLoaded:!0,isBusy:!1,count:t.count,more:t.more,page:t.page,pages:t.pages})}),(e=>{O.Z.apiError(e)}))}componentDidMount(){v.Z.set({title:this.TITLE,parent:this.props.profile.username})}getLabel(){if(this.state.isLoaded){if(this.state.search){let e=ngettext("Found %(users)s user.","Found %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){let e=ngettext("You have %(users)s follower.","You have %(users)s followers.",this.state.count);return interpolate(e,{users:this.state.count},!0)}{let e=ngettext("%(username)s has %(users)s follower.","%(username)s has %(users)s followers.",this.state.count);return interpolate(e,{username:this.props.profile.username,users:this.state.count},!0)}}return gettext("Loading...")}getEmptyMessage(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You have no followers."):interpolate(gettext("%(username)s has no followers."),{username:this.props.profile.username},!0)}getMoreButton(){return this.state.more?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(j.Z,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},void 0,interpolate(gettext("Show more (%(more)s)"),{more:this.state.more},!0))):null}getListBody(){return this.state.isLoaded&&0===this.state.count?(0,o.Z)("p",{className:"lead"},void 0,this.getEmptyMessage()):(0,o.Z)("div",{},void 0,(0,o.Z)(te.Z,{cols:3,isReady:this.state.isLoaded,users:this.props.users}),this.getMoreButton())}getClassName(){return"profile-"+this.API_FILTER}render(){return(0,o.Z)("div",{className:this.getClassName()},void 0,(0,o.Z)(E.o8,{},void 0,(0,o.Z)(E.Z2,{auto:!0},void 0,(0,o.Z)(E.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.getLabel()))),(0,o.Z)(E.Z2,{},void 0,(0,o.Z)(E.Eg,{},void 0,(0,o.Z)(ee,{value:this.state.search,onChange:this.search,placeholder:gettext("Search users...")})))),this.getListBody())}},ie=s(7850),oe=s(48927),ne=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"loadMore",(()=>{this.setState({isBusy:!0}),this.loadChanges(this.state.page+1,this.state.search)})),(0,n.Z)(this,"search",(e=>{this.setState({isLoaded:!1,isBusy:!0,search:e.target.value,count:0,more:0,page:1,pages:1}),this.loadChanges(1,e.target.value)})),h.Z.has("PROFILE_NAME_HISTORY")?this.initWithPreloadedData(h.Z.pop("PROFILE_NAME_HISTORY")):this.initWithoutPreloadedData()}initWithPreloadedData(e){this.state={isLoaded:!0,isBusy:!1,search:"",count:e.count,more:e.more,page:e.page,pages:e.pages},U.Z.dispatch((0,oe.ZB)(e.results))}initWithoutPreloadedData(){this.state={isLoaded:!1,isBusy:!1,search:"",count:0,more:0,page:1,pages:1},this.loadChanges()}loadChanges(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;P.Z.get(h.Z.get("USERNAME_CHANGES_API"),{user:this.props.profile.id,search:t,page:e||1},"search-username-history").then((t=>{1===e?U.Z.dispatch((0,oe.ZB)(t.results)):U.Z.dispatch((0,oe.R3)(t.results)),this.setState({isLoaded:!0,isBusy:!1,count:t.count,more:t.more,page:t.page,pages:t.pages})}),(e=>{O.Z.apiError(e)}))}componentDidMount(){v.Z.set({title:gettext("Username history"),parent:this.props.profile.username})}getLabel(){if(this.state.isLoaded){if(this.state.search){let e=ngettext("Found %(changes)s username change.","Found %(changes)s username changes.",this.state.count);return interpolate(e,{changes:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){let e=ngettext("Your username was changed %(changes)s time.","Your username was changed %(changes)s times.",this.state.count);return interpolate(e,{changes:this.state.count},!0)}{let e=ngettext("%(username)s's username was changed %(changes)s time.","%(username)s's username was changed %(changes)s times.",this.state.count);return interpolate(e,{username:this.props.profile.username,changes:this.state.count},!0)}}return gettext("Loading...")}getEmptyMessage(){return this.state.search?gettext("Search returned no username changes matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("No name changes have been recorded for your account."):interpolate(gettext("%(username)s's username was never changed."),{username:this.props.profile.username},!0)}getMoreButton(){return this.state.more?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(j.Z,{className:"btn btn-default btn-outline",loading:this.state.isBusy,onClick:this.loadMore},void 0,interpolate(gettext("Show older (%(more)s)"),{more:this.state.more},!0))):null}render(){return(0,o.Z)("div",{className:"profile-username-history"},void 0,(0,o.Z)(E.o8,{},void 0,(0,o.Z)(E.Z2,{auto:!0},void 0,(0,o.Z)(E.Eg,{auto:!0},void 0,(0,o.Z)("h3",{},void 0,this.getLabel()))),(0,o.Z)(E.Z2,{},void 0,(0,o.Z)(E.Eg,{},void 0,(0,o.Z)(ee,{value:this.state.search,onChange:this.search,placeholder:gettext("Search history...")})))),(0,o.Z)(ie.Z,{isLoaded:this.state.isLoaded,emptyMessage:this.getEmptyMessage(),changes:this.props["username-history"]}),this.getMoreButton())}},re=s(82125),le=s(27519),de=s(59131),ce=s(19605),pe=s(98936),ue=s(99755),he=class extends l().Component{constructor(e){super(e),(0,n.Z)(this,"action",(()=>{this.setState({isLoading:!0}),this.props.profile.is_followed?U.Z.dispatch((0,le.r$)({is_followed:!1,followers:this.props.profile.followers-1})):U.Z.dispatch((0,le.r$)({is_followed:!0,followers:this.props.profile.followers+1})),P.Z.post(this.props.profile.api.follow).then((e=>{this.setState({isLoading:!1}),U.Z.dispatch((0,le.r$)(e))}),(e=>{this.setState({isLoading:!1}),O.Z.apiError(e)}))})),this.state={isLoading:!1}}getClassName(){return this.props.profile.is_followed?this.props.className+" btn-default btn-following":this.props.className+" btn-default btn-follow"}getIcon(){return this.props.profile.is_followed?"favorite":"favorite_border"}getLabel(){return this.props.profile.is_followed?gettext("Following"):gettext("Follow")}render(){return(0,o.Z)(j.Z,{className:this.getClassName(),disabled:this.state.isLoading,onClick:this.action},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,this.getIcon()),this.getLabel())}},me=s(64646),ve=class extends l().Component{constructor(){super(...arguments),(0,n.Z)(this,"onClick",(()=>{me.Z.open({mode:"START_PRIVATE",submit:h.Z.get("PRIVATE_THREADS_API"),to:[this.props.profile]})}))}render(){const e=this.props.user.acl.can_start_private_threads,t=this.props.user.id===this.props.profile.id;return!e||t?null:(0,o.Z)("button",{className:this.props.className,onClick:this.onClick,type:"button"},void 0,H||(H=(0,o.Z)("span",{className:"material-icon"},void 0,"comment")),gettext("Message"))}},ge=s(43345),Ze=s(96359),be=s(3784),fe=s(7227),_e=s(30337),Ne=class extends ge.Z{constructor(e){super(e),this.state={isLoaded:!1,isLoading:!1,error:null,is_avatar_locked:"",avatar_lock_user_message:"",avatar_lock_staff_message:""}}componentDidMount(){P.Z.get(this.props.profile.api.moderate_avatar).then((e=>{this.setState({isLoaded:!0,is_avatar_locked:e.is_avatar_locked,avatar_lock_user_message:e.avatar_lock_user_message||"",avatar_lock_staff_message:e.avatar_lock_staff_message||""})}),(e=>{this.setState({isLoaded:!0,error:e.detail})}))}clean(){return!!this.isValid()||(O.Z.error(this.validate().username[0]),!1)}send(){return P.Z.post(this.props.profile.api.moderate_avatar,{is_avatar_locked:this.state.is_avatar_locked,avatar_lock_user_message:this.state.avatar_lock_user_message,avatar_lock_staff_message:this.state.avatar_lock_staff_message})}handleSuccess(e){U.Z.dispatch((0,se.n1)(this.props.profile,e.avatar_hash)),O.Z.success(gettext("Avatar controls have been changed."))}getFormBody(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(Ze.Z,{label:gettext("Lock avatar"),helpText:gettext("Locking user avatar will prohibit user from changing his avatar and will reset his/her avatar to default one."),for:"id_is_avatar_locked"},void 0,(0,o.Z)(fe.Z,{id:"id_is_avatar_locked",disabled:this.state.isLoading,iconOn:"lock_outline",iconOff:"lock_open",labelOn:gettext("Disallow user from changing avatar"),labelOff:gettext("Allow user to change avatar"),onChange:this.bindInput("is_avatar_locked"),value:this.state.is_avatar_locked})),(0,o.Z)(Ze.Z,{label:gettext("User message"),helpText:gettext("Optional message for user explaining why he/she is prohibited form changing avatar."),for:"id_avatar_lock_user_message"},void 0,(0,o.Z)("textarea",{id:"id_avatar_lock_user_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_user_message"),value:this.state.avatar_lock_user_message})),(0,o.Z)(Ze.Z,{label:gettext("Staff message"),helpText:gettext("Optional message for forum team members explaining why user is prohibited form changing avatar."),for:"id_avatar_lock_staff_message"},void 0,(0,o.Z)("textarea",{id:"id_avatar_lock_staff_message",className:"form-control",rows:"4",disabled:this.state.isLoading,onChange:this.bindInput("avatar_lock_staff_message"),value:this.state.avatar_lock_staff_message}))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},void 0,gettext("Close")),(0,o.Z)(j.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Save changes"))))}getModalBody(){return this.state.error?(0,o.Z)(_e.Z,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():F||(F=(0,o.Z)(be.Z,{}))}getClassName(){return this.state.error?"modal-dialog modal-message modal-avatar-controls":"modal-dialog modal-avatar-controls"}render(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Y||(Y=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Avatar controls"))),this.getModalBody()))}},xe=s(55210),ye=class extends ge.Z{constructor(e){super(e),this.state={isLoaded:!1,isLoading:!1,error:null,username:"",validators:{username:[xe.lG()]}}}componentDidMount(){P.Z.get(this.props.profile.api.moderate_username).then((()=>{this.setState({isLoaded:!0})}),(e=>{this.setState({isLoaded:!0,error:e.detail})}))}clean(){return!!this.isValid()||(O.Z.error(this.validate().username[0]),!1)}send(){return P.Z.post(this.props.profile.api.moderate_username,{username:this.state.username})}handleSuccess(e){this.setState({username:""}),U.Z.dispatch((0,oe.KP)(e,this.props.profile,this.props.user)),U.Z.dispatch((0,se._S)(this.props.profile,e.username,e.slug)),O.Z.success(gettext("Username has been changed."))}getFormBody(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(Ze.Z,{label:gettext("New username"),for:"id_username"},void 0,(0,o.Z)("input",{type:"text",id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username}))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,o.Z)(j.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Change username"))))}getModalBody(){return this.state.error?(0,o.Z)(_e.Z,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.getFormBody():V||(V=(0,o.Z)(be.Z,{}))}getClassName(){return this.state.error?"modal-dialog modal-message modal-rename-user":"modal-dialog modal-rename-user"}render(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,G||(G=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Change username"))),this.getModalBody()))}},we=class extends ge.Z{constructor(e){super(e),(0,n.Z)(this,"countdown",(()=>{window.setTimeout((()=>{this.state.countdown>1?(this.setState({countdown:this.state.countdown-1}),this.countdown()):this.state.confirm||this.setState({confirm:!0})}),1e3)})),this.state={isLoaded:!1,isLoading:!1,isDeleted:!1,error:null,countdown:5,confirm:!1,with_content:!1}}componentDidMount(){P.Z.get(this.props.profile.api.delete).then((()=>{this.setState({isLoaded:!0}),this.countdown()}),(e=>{this.setState({isLoaded:!0,error:e.detail})}))}send(){return P.Z.post(this.props.profile.api.delete,{with_content:this.state.with_content})}handleSuccess(){m.Z.stop("user-profile"),this.state.with_content?this.setState({isDeleted:interpolate(gettext("%(username)s's account, threads, posts and other content has been deleted."),{username:this.props.profile.username},!0)}):this.setState({isDeleted:interpolate(gettext("%(username)s's account has been deleted and other content has been hidden."),{username:this.props.profile.username},!0)})}getButtonLabel(){return this.state.confirm?interpolate(gettext("Delete %(username)s"),{username:this.props.profile.username},!0):interpolate(gettext("Please wait... (%(countdown)ss)"),{countdown:this.state.countdown},!0)}getForm(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(Ze.Z,{label:gettext("User content"),for:"id_with_content"},void 0,(0,o.Z)(fe.Z,{id:"id_with_content",disabled:this.state.isLoading,labelOn:gettext("Delete together with user's account"),labelOff:gettext("Hide after deleting user's account"),onChange:this.bindInput("with_content"),value:this.state.with_content}))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-default","data-dismiss":"modal"},void 0,gettext("Cancel")),(0,o.Z)(j.Z,{className:"btn-danger",loading:this.state.isLoading,disabled:!this.state.confirm},void 0,this.getButtonLabel())))}getDeletedBody(){return(0,o.Z)("div",{className:"modal-body"},void 0,$||($=(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,this.state.isDeleted),(0,o.Z)("p",{},void 0,(0,o.Z)("a",{href:h.Z.get("USERS_LIST_URL")},void 0,gettext("Return to users list")))))}getModalBody(){return this.state.error?(0,o.Z)(_e.Z,{icon:"remove_circle_outline",message:this.state.error}):this.state.isLoaded?this.state.isDeleted?this.getDeletedBody():this.getForm():W||(W=(0,o.Z)(be.Z,{}))}getClassName(){return this.state.error||this.state.isDeleted?"modal-dialog modal-message modal-delete-account":"modal-dialog modal-delete-account"}render(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Q||(Q=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Delete user account"))),this.getModalBody()))}},ke=s(59801);let Ce=function(e){return{tick:e.tick,user:e.auth,profile:e.profile}};var Se,Ee,Le,Te,Pe,Oe=class extends l().Component{constructor(){super(...arguments),(0,n.Z)(this,"showAvatarDialog",(()=>{ke.Z.show((0,i.$j)(Ce)(Ne))})),(0,n.Z)(this,"showRenameDialog",(()=>{ke.Z.show((0,i.$j)(Ce)(ye))})),(0,n.Z)(this,"showDeleteDialog",(()=>{ke.Z.show((0,i.$j)(Ce)(we))}))}render(){const{moderation:e}=this.props;return(0,o.Z)("ul",{className:"dropdown-menu dropdown-menu-right",role:"menu"},void 0,!!e.avatar&&(0,o.Z)("li",{},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-link",onClick:this.showAvatarDialog},void 0,K||(K=(0,o.Z)("span",{className:"material-icon"},void 0,"portrait")),gettext("Avatar controls"))),!!e.rename&&(0,o.Z)("li",{},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-link",onClick:this.showRenameDialog},void 0,J||(J=(0,o.Z)("span",{className:"material-icon"},void 0,"credit_card")),gettext("Change username"))),!!e.delete&&(0,o.Z)("li",{},void 0,(0,o.Z)("button",{type:"button",className:"btn btn-link",onClick:this.showDeleteDialog},void 0,X||(X=(0,o.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete account"))))}},Re=s(24678),Ae=e=>{let{profile:t}=e;return(0,o.Z)("ul",{className:"profile-data-list"},void 0,!1===t.is_active&&(0,o.Z)("li",{className:"user-account-disabled"},void 0,(0,o.Z)("abbr",{title:gettext("This user's account has been disabled by administrator.")},void 0,gettext("Account disabled"))),(0,o.Z)("li",{className:"user-status-display"},void 0,(0,o.Z)(Re.ZP,{user:t,status:t.status},void 0,(0,o.Z)(Re.Jj,{user:t,status:t.status}),(0,o.Z)(Re.pg,{user:t,status:t.status,className:"status-label"}))),t.rank.is_tab?(0,o.Z)("li",{className:"user-rank"},void 0,(0,o.Z)("a",{href:t.rank.url,className:"item-title"},void 0,t.rank.name)):(0,o.Z)("li",{className:"user-rank"},void 0,(0,o.Z)("span",{className:"item-title"},void 0,t.rank.name)),(t.title||t.rank.title)&&(0,o.Z)("li",{className:"user-title"},void 0,t.title||t.rank.title),(0,o.Z)("li",{className:"user-joined-on"},void 0,(0,o.Z)("abbr",{title:interpolate(gettext("Joined on %(joined_on)s"),{joined_on:t.joined_on.format("LL, LT")},!0)},void 0,interpolate(gettext("Joined %(joined_on)s"),{joined_on:t.joined_on.fromNow()},!0))),t.email&&(0,o.Z)("li",{className:"user-email"},void 0,(0,o.Z)("a",{href:"mailto:"+t.email,className:"item-title"},void 0,t.email)))};const Ie=()=>(0,o.Z)("button",{className:"btn btn-default btn-icon btn-outline dropdown-toggle",type:"button",title:gettext("Options"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,Pe||(Pe=(0,o.Z)("span",{className:"material-icon"},void 0,"settings")));var De=e=>{let{profile:t,user:s,moderation:a,message:i,follow:n}=e;return(0,o.Z)(ue.sP,{},void 0,(0,o.Z)(ue.mr,{styleName:t.rank.css_class?"rank-"+t.rank.css_class:"profile"},void 0,(0,o.Z)(ue.gC,{styleName:t.rank.css_class?"rank-"+t.rank.css_class:"profile"},void 0,(0,o.Z)("div",{className:"profile-page-header"},void 0,(0,o.Z)("div",{className:"profile-page-header-avatar"},void 0,(0,o.Z)(ce.ZP,{className:"user-avatar hidden-sm hidden-md hidden-lg",user:t,size:200,size2x:400}),(0,o.Z)(ce.ZP,{className:"user-avatar hidden-xs hidden-md hidden-lg",user:t,size:64,size2x:128}),(0,o.Z)(ce.ZP,{className:"user-avatar hidden-xs hidden-sm",user:t,size:128,size2x:256})),(0,o.Z)("h1",{},void 0,t.username))),(0,o.Z)(ue.eA,{className:"profile-page-header-details"},void 0,(0,o.Z)(pe.gq,{},void 0,(0,o.Z)(pe.kw,{auto:!0},void 0,(0,o.Z)(pe.Z6,{},void 0,(0,o.Z)(Ae,{profile:t}))),i&&(0,o.Z)(pe.kw,{},void 0,(0,o.Z)(pe.Z6,{},void 0,(0,o.Z)(ve,{className:"btn btn-default btn-block btn-outline",profile:t,user:s})),a.available&&!n&&(0,o.Z)(pe.Z6,{shrink:!0},void 0,(0,o.Z)("div",{className:"dropdown"},void 0,Se||(Se=(0,o.Z)(Ie,{})),(0,o.Z)(Oe,{profile:t,moderation:a})))),n&&(0,o.Z)(pe.kw,{},void 0,(0,o.Z)(pe.Z6,{},void 0,(0,o.Z)(he,{className:"btn btn-block btn-outline",profile:t})),a.available&&(0,o.Z)(pe.Z6,{shrink:!0},void 0,(0,o.Z)("div",{className:"dropdown"},void 0,Ee||(Ee=(0,o.Z)(Ie,{})),(0,o.Z)(Oe,{profile:t,moderation:a})))),a.available&&!n&&!i&&(0,o.Z)(pe.kw,{},void 0,(0,o.Z)(pe.Z6,{className:"hidden-xs",shrink:!0},void 0,(0,o.Z)("div",{className:"dropdown"},void 0,Le||(Le=(0,o.Z)(Ie,{})),(0,o.Z)(Oe,{profile:t,moderation:a}))),(0,o.Z)(pe.Z6,{className:"hidden-sm hidden-md hidden-lg"},void 0,(0,o.Z)("div",{className:"dropdown"},void 0,(0,o.Z)("button",{className:"btn btn-default btn-block btn-outline dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,Te||(Te=(0,o.Z)("span",{className:"material-icon"},void 0,"settings")),gettext("Options")),(0,o.Z)(Oe,{profile:t,moderation:a}))))))))},je=s(69987),ze=s(94417),Ue=e=>{let{baseUrl:t,page:s,pages:a}=e;return(0,o.Z)("div",{className:"nav-container"},void 0,(0,o.Z)("div",{className:"dropdown hidden-sm hidden-md hidden-lg"},void 0,(0,o.Z)("button",{className:"btn btn-default btn-block btn-outline dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,s.icon),s.name),(0,o.Z)("ul",{className:"dropdown-menu stick-to-bottom"},void 0,a.map((e=>(0,o.Z)("li",{},e.component,(0,o.Z)(je.rU,{to:t+e.component+"/"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,e.icon),e.name)))))),(0,o.Z)("ul",{className:"nav nav-pills hidden-xs",role:"menu"},void 0,a.map((e=>(0,o.Z)(ze.Z,{path:t+e.component+"/"},e.component,(0,o.Z)(je.rU,{to:t+e.component+"/"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,e.icon),e.name))))))},Me=class extends re.Z{constructor(e){super(e),(0,n.Z)(this,"update",(e=>{U.Z.dispatch((0,le.ZB)(e))})),this.startPolling(e.profile.api.index)}startPolling(e){m.Z.start({poll:"user-profile",url:e,frequency:9e4,update:this.update})}render(){const e=h.Z.get("PROFILE").url,t=h.Z.get("PROFILE_PAGES"),s=t.filter((t=>{const s=e+t.component+"/";return this.props.location.pathname===s}))[0],{profile:a,user:i}=this.props,n=Be(a,i),r=!!i.acl.can_start_private_threads&&a.id!==i.id,l=!!a.acl.can_follow&&a.id!==i.id;return(0,o.Z)("div",{className:"page page-user-profile"},void 0,(0,o.Z)(De,{profile:this.props.profile,user:this.props.user,moderation:n,message:r,follow:l}),(0,o.Z)(de.Z,{},void 0,(0,o.Z)(Ue,{baseUrl:e,page:s,pages:t}),this.props.children))}};const Be=(e,t)=>{const s={available:!1,rename:!1,avatar:!1,delete:!1};return t.is_anonymous||(s.rename=e.acl.can_rename,s.avatar=e.acl.can_moderate_avatar,s.delete=e.acl.can_delete,s.available=!!(s.rename||s.avatar||s.delete)),s};function qe(e){return{isAuthenticated:e.auth.user.id===e.profile.id,tick:e.tick.tick,user:e.auth.user,users:e.users,posts:e.posts,profile:e.profile,profileDetails:e["profile-details"],"username-history":e["username-history"]}}const He={posts:function(e){let t=null;t=e.user.id===e.profile.id?gettext("You have posted no messages."):interpolate(gettext("%(username)s posted no messages."),{username:e.profile.username},!0);let s=null;if(e.posts.isLoaded)if(e.profile.id===e.user.id){const t=ngettext("You have posted %(posts)s message.","You have posted %(posts)s messages.",e.profile.posts);s=interpolate(t,{posts:e.profile.posts},!0)}else{const t=ngettext("%(username)s has posted %(posts)s message.","%(username)s has posted %(posts)s messages.",e.profile.posts);s=interpolate(t,{username:e.profile.username,posts:e.profile.posts},!0)}else s=gettext("Loading...");return l().createElement(M,(0,I.Z)({api:e.profile.api.posts,emptyMessage:t,header:s,title:gettext("Posts")},e))},threads:function(e){let t=null;t=e.user.id===e.profile.id?gettext("You have no started threads."):interpolate(gettext("%(username)s started no threads."),{username:e.profile.username},!0);let s=null;if(e.posts.isLoaded)if(e.profile.id===e.user.id){const t=ngettext("You have started %(threads)s thread.","You have started %(threads)s threads.",e.profile.threads);s=interpolate(t,{threads:e.profile.threads},!0)}else{const t=ngettext("%(username)s has started %(threads)s thread.","%(username)s has started %(threads)s threads.",e.profile.threads);s=interpolate(t,{username:e.profile.username,threads:e.profile.threads},!0)}else s=gettext("Loading...");return l().createElement(M,(0,I.Z)({api:e.profile.api.threads,emptyMessage:t,header:s,title:gettext("Threads")},e))},followers:ae,follows:class extends ae{setSpecialProps(){this.PRELOADED_DATA_KEY="PROFILE_FOLLOWS",this.TITLE=gettext("Follows"),this.API_FILTER="follows"}getLabel(){if(this.state.isLoaded){if(this.state.search){let e=ngettext("Found %(users)s user.","Found %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}if(this.props.profile.id===this.props.user.id){let e=ngettext("You are following %(users)s user.","You are following %(users)s users.",this.state.count);return interpolate(e,{users:this.state.count},!0)}{let e=ngettext("%(username)s is following %(users)s user.","%(username)s is following %(users)s users.",this.state.count);return interpolate(e,{username:this.props.profile.username,users:this.state.count},!0)}}return gettext("Loading...")}getEmptyMessage(){return this.state.search?gettext("Search returned no users matching specified criteria."):this.props.user.id===this.props.profile.id?gettext("You are not following any users."):interpolate(gettext("%(username)s is not following any users."),{username:this.props.profile.username},!0)}},details:A,"username-history":ne,"ban-details":g};function Fe(){let e=[];return h.Z.get("PROFILE_PAGES").forEach((function(t){e.push(Object.assign({},t,{path:h.Z.get("PROFILE").url+t.component+"/",component:(0,i.$j)(qe)(He[t.component])}))})),e}var Ye=s(39633);h.Z.addInitializer({name:"component:profile",initializer:function(e){e.has("PROFILE")&&e.has("PROFILE_PAGES")&&(0,Ye.Z)({root:h.Z.get("PROFILE").url,component:(0,i.$j)(qe)(Me),paths:Fe()})},after:"reducer:profile-hydrate"})},32488:function(e,t,s){"use strict";var a,i=s(32233),o=s(4942),n=s(22928),r=s(57588),l=s.n(r),d=s(82211),c=s(43345),p=s(78657),u=s(53904),h=s(55210),m=s(93051);class v extends c.Z{constructor(e){super(e),this.state={isLoading:!1,email:"",validators:{email:[h.Do()]}}}clean(){return!!this.isValid()||(u.Z.error(gettext("Enter a valid email address.")),!1)}send(){return p.Z.post(i.Z.get("SEND_ACTIVATION_API"),{email:this.state.email})}handleSuccess(e){this.props.callback(e)}handleError(e){["already_active","inactive_admin"].indexOf(e.code)>-1?u.Z.info(e.detail):403===e.status&&e.ban?(0,m.Z)(e.ban):u.Z.apiError(e)}render(){return(0,n.Z)("div",{className:"well well-form well-form-request-activation-link"},void 0,(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"form-group"},void 0,(0,n.Z)("div",{className:"control-input"},void 0,(0,n.Z)("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),(0,n.Z)(d.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,gettext("Send link"))))}}class g extends l().Component{getMessage(){return interpolate(gettext("Activation link was sent to %(email)s"),{email:this.props.user.email},!0)}render(){return(0,n.Z)("div",{className:"well well-form well-form-request-activation-link well-done"},void 0,(0,n.Z)("div",{className:"done-message"},void 0,a||(a=(0,n.Z)("div",{className:"message-icon"},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,"check"))),(0,n.Z)("div",{className:"message-body"},void 0,(0,n.Z)("p",{},void 0,this.getMessage())),(0,n.Z)("button",{className:"btn btn-primary btn-block",type:"button",onClick:this.props.callback},void 0,gettext("Request another link"))))}}var Z=class extends l().Component{constructor(e){super(e),(0,o.Z)(this,"complete",(e=>{this.setState({complete:e})})),(0,o.Z)(this,"reset",(()=>{this.setState({complete:!1})})),this.state={complete:!1}}render(){return this.state.complete?(0,n.Z)(g,{user:this.state.complete,callback:this.reset}):(0,n.Z)(v,{callback:this.complete})}},b=s(4869);i.Z.addInitializer({name:"component:request-activation-link",initializer:function(){document.getElementById("request-activation-link-mount")&&(0,b.Z)(Z,"request-activation-link-mount",!1)},after:"store"})},11768:function(e,t,s){"use strict";var a,i,o=s(32233),n=s(4942),r=s(22928),l=s(57588),d=s.n(l),c=s(73935),p=s.n(c),u=s(82211),h=s(43345),m=s(78657),v=s(53904),g=s(55210),Z=s(93051);class b extends h.Z{constructor(e){super(e),this.state={isLoading:!1,email:"",validators:{email:[g.Do()]}}}clean(){return!!this.isValid()||(v.Z.error(gettext("Enter a valid email address.")),!1)}send(){return m.Z.post(o.Z.get("SEND_PASSWORD_RESET_API"),{email:this.state.email})}handleSuccess(e){this.props.callback(e)}handleError(e){["inactive_user","inactive_admin"].indexOf(e.code)>-1?this.props.showInactivePage(e):403===e.status&&e.ban?(0,Z.Z)(e.ban):v.Z.apiError(e)}render(){return(0,r.Z)("div",{className:"well well-form well-form-request-password-reset"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"form-group"},void 0,(0,r.Z)("div",{className:"control-input"},void 0,(0,r.Z)("input",{type:"text",className:"form-control",placeholder:gettext("Your e-mail address"),disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email}))),(0,r.Z)(u.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,gettext("Send link"))))}}class f extends d().Component{getMessage(){return interpolate(gettext("Reset password link was sent to %(email)s"),{email:this.props.user.email},!0)}render(){return(0,r.Z)("div",{className:"well well-form well-form-request-password-reset well-done"},void 0,(0,r.Z)("div",{className:"done-message"},void 0,a||(a=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"check"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{},void 0,this.getMessage())),(0,r.Z)("button",{type:"button",className:"btn btn-primary btn-block",onClick:this.props.callback},void 0,gettext("Request another link"))))}}class _ extends d().Component{getActivateButton(){return"inactive_user"===this.props.activation?(0,r.Z)("p",{},void 0,(0,r.Z)("a",{href:o.Z.get("REQUEST_ACTIVATION_URL")},void 0,gettext("Activate your account."))):null}render(){return(0,r.Z)("div",{className:"page page-message page-message-info page-forgotten-password-inactive"},void 0,(0,r.Z)("div",{className:"container"},void 0,(0,r.Z)("div",{className:"message-panel"},void 0,i||(i=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("Your account is inactive.")),(0,r.Z)("p",{},void 0,this.props.message),this.getActivateButton()))))}}var N=class extends d().Component{constructor(e){super(e),(0,n.Z)(this,"complete",(e=>{this.setState({complete:e})})),(0,n.Z)(this,"reset",(()=>{this.setState({complete:!1})})),this.state={complete:!1}}showInactivePage(e){p().render((0,r.Z)(_,{activation:e.code,message:e.detail}),document.getElementById("page-mount"))}render(){return this.state.complete?(0,r.Z)(f,{callback:this.reset,user:this.state.complete}):(0,r.Z)(b,{callback:this.complete,showInactivePage:this.showInactivePage})}},x=s(4869);o.Z.addInitializer({name:"component:request-password-reset",initializer:function(){document.getElementById("request-password-reset-mount")&&(0,x.Z)(N,"request-password-reset-mount",!1)},after:"store"})},61323:function(e,t,s){"use strict";var a,i=s(32233),o=s(4942),n=s(22928),r=s(57588),l=s.n(r),d=s(73935),c=s.n(d),p=s(82211),u=s(43345),h=s(14467),m=s(78657),v=s(98274),g=s(59801),Z=s(53904),b=s(93051),f=s(19755);class _ extends u.Z{constructor(e){super(e),this.state={isLoading:!1,password:""}}clean(){return!!this.state.password.trim().length||(Z.Z.error(gettext("Enter new password.")),!1)}send(){return m.Z.post(i.Z.get("CHANGE_PASSWORD_API"),{password:this.state.password})}handleSuccess(e){this.props.callback(e)}handleError(e){403===e.status&&e.ban?(0,b.Z)(e.ban):Z.Z.apiError(e)}render(){return(0,n.Z)("div",{className:"well well-form well-form-reset-password"},void 0,(0,n.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,n.Z)("div",{className:"form-group"},void 0,(0,n.Z)("div",{className:"control-input"},void 0,(0,n.Z)("input",{type:"password",className:"form-control",placeholder:gettext("Enter new password"),disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password}))),(0,n.Z)(p.Z,{className:"btn-primary btn-block",loading:this.state.isLoading},void 0,gettext("Change password"))))}}class N extends l().Component{getMessage(){return interpolate(gettext("%(username)s, your password has been changed successfully."),{username:this.props.user.username},!0)}showSignIn(){g.Z.show(h.Z)}render(){return(0,n.Z)("div",{className:"page page-message page-message-success page-forgotten-password-changed"},void 0,(0,n.Z)("div",{className:"container"},void 0,(0,n.Z)("div",{className:"message-panel"},void 0,a||(a=(0,n.Z)("div",{className:"message-icon"},void 0,(0,n.Z)("span",{className:"material-icon"},void 0,"check"))),(0,n.Z)("div",{className:"message-body"},void 0,(0,n.Z)("p",{className:"lead"},void 0,this.getMessage()),(0,n.Z)("p",{},void 0,gettext("You will have to sign in using new password before continuing.")),(0,n.Z)("p",{},void 0,(0,n.Z)("button",{type:"button",className:"btn btn-primary",onClick:this.showSignIn},void 0,gettext("Sign in")))))))}}var x=class extends l().Component{constructor(){super(...arguments),(0,o.Z)(this,"complete",(e=>{v.Z.softSignOut(),f('#hidden-login-form input[name="redirect_to"]').remove(),c().render((0,n.Z)(N,{user:e}),document.getElementById("page-mount"))}))}render(){return(0,n.Z)(_,{callback:this.complete})}},y=s(4869);i.Z.addInitializer({name:"component:reset-password-form",initializer:function(){document.getElementById("reset-password-form-mount")&&(0,y.Z)(x,"reset-password-form-mount",!1)},after:"store"})},15049:function(e,t,s){"use strict";var a,i=s(37424),o=s(22928),n=s(87462),r=s(57588),l=s.n(r),d=s(59131),c=s(4942),p=s(32233),u=s(43345),h=s(21981),m=s(16427),v=s(6935),g=s(78657),Z=s(53904),b=s(90287),f=s(98936),_=s(99755),N=class extends u.Z{constructor(e){super(e),(0,c.Z)(this,"onQueryChange",(e=>{this.changeValue("query",e.target.value)})),this.state={isLoading:!1,query:e.search.query}}componentDidMount(){this.state.query.length&&this.handleSubmit()}clean(){return!!this.state.query.trim().length||(Z.Z.error(gettext("You have to enter search query.")),!1)}send(){b.Z.dispatch((0,m.Vx)({isLoading:!0}));const e=this.state.query.trim();let t=window.location.href;const s=t.indexOf("?q=");return s>0&&(t=t.substring(0,s+3)),window.history.pushState({},"",t+encodeURIComponent(e)),g.Z.get(p.Z.get("SEARCH_API"),{q:e})}handleSuccess(e){b.Z.dispatch((0,m.Vx)({query:this.state.query.trim(),isLoading:!1,providers:e})),e.forEach((e=>{"users"===e.id?b.Z.dispatch((0,v.ZB)(e.results.results)):"threads"===e.id&&b.Z.dispatch((0,h.zD)(e.results))}))}handleError(e){Z.Z.apiError(e),b.Z.dispatch((0,m.Vx)({isLoading:!1}))}render(){return(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)(_.sP,{},void 0,(0,o.Z)(_.mr,{styleName:"site-search"},void 0,(0,o.Z)(_.gC,{styleName:"site-search"},void 0,(0,o.Z)("h1",{},void 0,gettext("Search"))),(0,o.Z)(_.eA,{className:"page-header-search-form"},void 0,(0,o.Z)(f.gq,{},void 0,(0,o.Z)(f.kw,{auto:!0},void 0,(0,o.Z)(f.Z6,{},void 0,(0,o.Z)("input",{className:"form-control",disabled:this.state.isLoading,type:"text",value:this.state.query,placeholder:gettext("Search"),onChange:this.onQueryChange})),(0,o.Z)(f.Z6,{shrink:!0},void 0,(0,o.Z)("button",{className:"btn btn-secondary btn-icon btn-outline",disabled:this.state.isLoading},void 0,a||(a=(0,o.Z)("span",{className:"material-icon"},void 0,"search"))))))))))}},x=s(69987);function y(e){return(0,o.Z)("div",{className:"list-group nav-side"},void 0,e.providers.map((e=>(0,o.Z)(x.rU,{activeClassName:"active",className:"list-group-item",to:e.url},e.id,(0,o.Z)("span",{className:"material-icon"},void 0,e.icon),e.name,(0,o.Z)(w,{results:e.results})))))}function w(e){if(!e.results)return null;let t=e.results.count;return t>1e6?t=Math.ceil(t/1e6)+"KK":t>1e3&&(t=Math.ceil(t/1e3)+"K"),(0,o.Z)("span",{className:"badge"},void 0,t)}function k(e){return(0,o.Z)("div",{className:"page page-search"},void 0,(0,o.Z)(N,{provider:e.provider,search:e.search}),(0,o.Z)(d.Z,{},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-3"},void 0,(0,o.Z)(y,{providers:e.search.providers})),(0,o.Z)("div",{className:"col-md-9"},void 0,e.children,(0,o.Z)(C,{provider:e.provider,search:e.search})))))}function C(e){let t=null;if(e.search.providers.forEach((s=>{s.id===e.provider.id&&(t=s.time)})),null===t)return null;const s=gettext("Search took %(time)s s to complete");return(0,o.Z)("footer",{className:"search-footer"},void 0,(0,o.Z)("p",{},void 0,interpolate(s,{time:t},!0)))}var S=s(11005),E=s(82211);function L(e){return(0,o.Z)("div",{},void 0,(0,o.Z)(S.Z,{isReady:!0,posts:e.results}),l().createElement(T,e))}s(69092);class T extends l().Component{constructor(){super(...arguments),(0,c.Z)(this,"onClick",(()=>{b.Z.dispatch((0,h.Vx)({isBusy:!0})),g.Z.get(this.props.provider.api,{q:this.props.query,page:this.props.next}).then((e=>{e.forEach((e=>{"threads"===e.id&&(b.Z.dispatch((0,h.R3)(e.results)),b.Z.dispatch((0,m.P0)(e)))})),b.Z.dispatch((0,h.Vx)({isBusy:!1}))}),(e=>{Z.Z.apiError(e),b.Z.dispatch((0,h.Vx)({isBusy:!1}))}))}))}render(){return this.props.more?(0,o.Z)("div",{className:"pager-more"},void 0,(0,o.Z)(E.Z,{className:"btn btn-default btn-outline",loading:this.props.isBusy,onClick:this.onClick},void 0,gettext("Show more"))):null}}function P(e){let{children:t,loading:s,posts:a,query:i}=e;return a&&a.count?t:i.length?(0,o.Z)("p",{className:"lead"},void 0,s?gettext("Loading results..."):gettext("No threads matching search query have been found.")):(0,o.Z)("p",{className:"lead"},void 0,gettext("Enter at least two characters to search threads."))}var O=s(40429);function R(e){let{children:t,loading:s,query:a,users:i}=e;return i.length?t:a.length?(0,o.Z)("p",{className:"lead"},void 0,s?gettext("Loading results..."):gettext("No users matching search query have been found.")):(0,o.Z)("p",{className:"lead"},void 0,gettext("Enter at least two characters to search users."))}const A={threads:function(e){return(0,o.Z)(k,{provider:e.route.provider,search:e.search},void 0,(0,o.Z)(P,{loading:e.search.isLoading,query:e.search.query,posts:e.posts},void 0,l().createElement(L,(0,n.Z)({provider:e.route.provider,query:e.search.query},e.posts))))},users:function(e){return(0,o.Z)(k,{provider:e.route.provider,search:e.search},void 0,(0,o.Z)(R,{loading:e.search.isLoading,query:e.search.query,users:e.users},void 0,(0,o.Z)(O.Z,{cols:3,isReady:!e.search.isLoading,users:e.users})))}};function I(e){return{posts:e.posts,search:e.search,tick:e.tick.tick,user:e.auth.user,users:e.users}}var D=s(39633);p.Z.addInitializer({name:"component:search",initializer:function(e){var t;"misago:search"===e.get("CURRENT_LINK")&&(0,D.Z)({paths:(t=p.Z.get("SEARCH_PROVIDERS"),t.map((e=>({path:e.url,component:(0,i.$j)(I)(A[e.id]),provider:e}))))})},after:"store"})},61814:function(e,t,s){"use strict";var a=s(37424),i=s(32233),o=s(22928),n=s(57588),r=s.n(n);const l={info:"alert-info",success:"alert-success",warning:"alert-warning",error:"alert-danger"};class d extends r().Component{getSnackbarClass(){let e="alerts-snackbar";return this.props.isVisible?e+=" in":e+=" out",e}render(){return(0,o.Z)("div",{className:this.getSnackbarClass()},void 0,(0,o.Z)("p",{className:"alert "+l[this.props.type]},void 0,this.props.message))}}function c(e){return e.snackbar}var p=s(4869);i.Z.addInitializer({name:"component:snackbar",initializer:function(){(0,p.Z)((0,a.$j)(c)(d),"snackbar-mount")},after:"snackbar"})},95920:function(e,t,s){"use strict";var a=s(57588),i=s.n(a),o=s(22928),n=s(4942),r=s(32233),l=s(26106),d=s(82211),c=s(43345),p=s(96359),u=s(78657),h=s(53904),m=s(55210),v=s(59131),g=s(99755),Z=e=>{let{backendName:t}=e;const s=gettext("Sign in with %(backend)s"),a=interpolate(s,{backend:t},!0);return(0,o.Z)(g.sP,{},void 0,(0,o.Z)(g.mr,{styleName:"social-auth"},void 0,(0,o.Z)(g.gC,{styleName:"social-auth"},void 0,(0,o.Z)("h1",{},void 0,a))))};class b extends c.Z{constructor(e){super(e),(0,n.Z)(this,"handlePrivacyPolicyChange",(e=>{const t=e.target.value;this.handleToggleAgreement("privacyPolicy",t)})),(0,n.Z)(this,"handleTermsOfServiceChange",(e=>{const t=e.target.value;this.handleToggleAgreement("termsOfService",t)})),(0,n.Z)(this,"handleToggleAgreement",((e,t)=>{this.setState(((s,a)=>{if(null===s[e])return{errors:{...s.errors,[e]:null},[e]:t};const i=this.state.validators[e][0];return{errors:{...s.errors,[e]:[i(null)]},[e]:null}}))}));const t={email:[m.Do()],username:[m.lG()]};r.Z.get("TERMS_OF_SERVICE_ID")&&(t.termsOfService=[m.fT()]),r.Z.get("PRIVACY_POLICY_ID")&&(t.privacyPolicy=[m.jA()]),this.state={email:e.email||"",emailProtected:!!e.email,username:e.username||"",termsOfService:null,privacyPolicy:null,validators:t,errors:{},isLoading:!1}}clean(){if(this.validate(),-1!==[this.state.email.trim().length,this.state.username.trim().length].indexOf(0))return h.Z.error(gettext("Fill out all fields.")),!1;const{validators:e}=this.state;return r.Z.get("TERMS_OF_SERVICE_ID")&&null===this.state.termsOfService?(h.Z.error(e.termsOfService[0](null)),!1):!r.Z.get("PRIVACY_POLICY_ID")||null!==this.state.privacyPolicy||(h.Z.error(e.privacyPolicy[0](null)),h.Z.error(gettext("You need to accept the privacy policy.")),!1)}send(){return u.Z.post(this.props.url,{email:this.state.email,username:this.state.username,terms_of_service:this.state.termsOfService,privacy_policy:this.state.privacyPolicy})}handleSuccess(e){const{onRegistrationComplete:t}=this.props;t(e)}handleError(e){if(200===e.status){const{onRegistrationComplete:e}=this.props,{username:t}=this.state;e({activation:"active",step:"done",username:t})}else if(400===e.status){const t={errors:e};e.email&&(t.emailProtected=!1),this.setState(t)}else h.Z.apiError(e)}render(){const{backend_name:e}=this.props,{email:t,emailProtected:s,username:a,isLoading:i}=this.state;let n=null;if(s){const t=gettext("Your e-mail address has been verified by %(backend)s.");n=interpolate(t,{backend:e},!0)}return(0,o.Z)("div",{className:"page page-social-auth page-social-auth-register"},void 0,(0,o.Z)(Z,{backendName:e}),(0,o.Z)(v.Z,{},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,gettext("Complete your details"))),(0,o.Z)("div",{className:"panel-body"},void 0,(0,o.Z)(p.Z,{for:"id_username",label:gettext("Username"),validation:this.state.errors.username},void 0,(0,o.Z)("input",{type:"text",id:"id_username",className:"form-control",disabled:i,onChange:this.bindInput("username"),value:a})),(0,o.Z)(p.Z,{for:"id_email",label:gettext("E-mail address"),helpText:n,validation:s?null:this.state.errors.email},void 0,(0,o.Z)("input",{type:"email",id:"id_email",className:"form-control",disabled:i||s,onChange:this.bindInput("email"),value:t})),(0,o.Z)(l.Z,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),(0,o.Z)("div",{className:"panel-footer"},void 0,(0,o.Z)(d.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Sign in")))))))))}}var f=e=>{let{activation:t,backend_name:s,username:a}=e,i="",n="";return n="user"===t?gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in."):"admin"===t?gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in."):gettext("%(username)s, your account has been created and you have been signed in to it."),i="active"===t?"check":"info_outline",(0,o.Z)("div",{className:"page page-social-auth page-social-auth-register"},void 0,(0,o.Z)(Z,{backendName:s}),(0,o.Z)(v.Z,{},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,o.Z)("div",{className:"panel-heading"},void 0,(0,o.Z)("h3",{className:"panel-title"},void 0,gettext("Registration completed!"))),(0,o.Z)("div",{className:"panel-body panel-message-body"},void 0,(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,i)),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,interpolate(n,{username:a},!0)),(0,o.Z)("p",{className:"help-block"},void 0,(0,o.Z)("a",{className:"btn btn-default",href:r.Z.get("MISAGO_PATH")},void 0,gettext("Return to forum index"))))))))))};class _ extends i().Component{constructor(e){super(e),(0,n.Z)(this,"handleRegistrationComplete",(e=>{let{activation:t,email:s,step:a,username:i}=e;this.setState({activation:t,email:s,step:a,username:i})})),this.state={step:e.step,activation:e.activation||"",email:e.email||"",username:e.username||""}}render(){const{backend_name:e,url:t}=this.props,{activation:s,email:a,step:i,username:n}=this.state;return"register"===i?(0,o.Z)(b,{backend_name:e,email:a,url:t,username:n,onRegistrationComplete:this.handleRegistrationComplete}):(0,o.Z)(f,{activation:s,backend_name:e,email:a,url:t,username:n})}}var N=s(4869);r.Z.addInitializer({name:"component:social-auth",initializer:function(e){if("misago:social-complete"===e.get("CURRENT_LINK")){const t=e.get("SOCIAL_AUTH_FORM");(0,N.Z)(i().createElement(_,t),"page-mount")}},after:"store"})},60630:function(e,t,s){"use strict";var a,i,o,n=s(37424),r=s(22928),l=s(4942),d=s(57588),c=s.n(d),p=s(87462),u=s(43345),h=s(96359),m=s(8154),v=s(7738),g=s(78657),Z=s(59801),b=s(53904),f=s(90287),_=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onUsernameChange",(e=>{this.changeValue("username",e.target.value)})),this.state={isLoading:!1,username:""}}clean(){return!!this.state.username.trim().length||(b.Z.error(gettext("You have to enter user name.")),!1)}send(){return g.Z.patch(this.props.thread.api.index,[{op:"add",path:"participants",value:this.state.username},{op:"add",path:"acl",value:1}])}handleSuccess(e){f.Z.dispatch((0,v.y8)(e)),f.Z.dispatch(m.gx(e.participants)),b.Z.success(gettext("New participant has been added to thread.")),Z.Z.hide()}render(){return(0,r.Z)("div",{className:"modal-dialog modal-sm",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,a||(a=(0,r.Z)(N,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_username",label:gettext("User to add")},void 0,(0,r.Z)("input",{id:"id_username",className:"form-control",disabled:this.state.isLoading,onChange:this.onUsernameChange,type:"text",value:this.state.username}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-block btn-primary",disabled:this.state.isLoading},void 0,gettext("Add participant")),(0,r.Z)("button",{className:"btn btn-block btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel"))))))}};function N(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,i||(i=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Add participant")))}var x,y,w,k=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)(_,{thread:this.props.thread}))}))}render(){return this.props.thread.acl.can_add_participants?(0,r.Z)("div",{className:"col-xs-12 col-sm-3"},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block",onClick:this.onClick,type:"button"},void 0,o||(o=(0,r.Z)("span",{className:"material-icon"},void 0,"person_add")),gettext("Add participant"))):null}},C=s(32233),S=class extends c().Component{constructor(e){super(e),(0,l.Z)(this,"onClick",(()=>{let e=!1;if(this.isUser)e=window.confirm(gettext("Are you sure you want to take over this thread?"));else{const t=gettext("Are you sure you want to change thread owner to %(user)s?");e=window.confirm(interpolate(t,{user:this.props.participant.username},!0))}var t,s;e&&(t=this.props.thread,s=this.props.participant,g.Z.patch(t.api.index,[{op:"replace",path:"owner",value:s.id},{op:"add",path:"acl",value:1}]).then((e=>{f.Z.dispatch((0,v.y8)(e)),f.Z.dispatch(m.gx(e.participants));const t=gettext("%(user)s has been made new thread owner.");b.Z.success(interpolate(t,{user:s.username},!0))}),(e=>{b.Z.apiError(e)})))})),this.isUser=e.participant.id===e.user.id}render(){return this.props.participant.is_owner?null:this.props.thread.acl.can_change_owner?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,gettext("Make owner"))):null}},E=class extends c().Component{constructor(e){super(e),(0,l.Z)(this,"onClick",(()=>{let e=!1;if(this.isUser)e=window.confirm(gettext("Are you sure you want to leave this thread?"));else{const t=gettext("Are you sure you want to remove %(user)s from this thread?");e=window.confirm(interpolate(t,{user:this.props.participant.username},!0))}var t,s;e&&(this.isUser?(t=this.props.thread,s=this.props.participant,g.Z.patch(t.api.index,[{op:"remove",path:"participants",value:s.id}]).then((()=>{b.Z.success(gettext("You have left this thread.")),window.setTimeout((()=>{window.location=C.Z.get("PRIVATE_THREADS_URL")}),3e3)}),(e=>{b.Z.apiError(e)}))):function(e,t){g.Z.patch(e.api.index,[{op:"remove",path:"participants",value:t.id},{op:"add",path:"acl",value:1}]).then((e=>{f.Z.dispatch((0,v.y8)(e)),f.Z.dispatch(m.gx(e.participants));const s=gettext("%(user)s has been removed from this thread.");b.Z.success(interpolate(s,{user:t.username},!0))}),(e=>{b.Z.apiError(e)}))}(this.props.thread,this.props.participant))})),this.isUser=e.participant.id===e.user.id}render(){const e=this.props.user.acl.can_moderate_private_threads;return this.props.userIsOwner||this.isUser||e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,this.isUser?gettext("Leave thread"):gettext("Remove"))):null}},L=s(19605);function T(e){const t=e.participant;let s="btn btn-default";return t.is_owner&&(s="btn btn-primary"),s+=" btn-user btn-block",(0,r.Z)("div",{className:"col-xs-12 col-sm-3 col-md-2 participant-card"},void 0,(0,r.Z)("div",{className:"dropdown"},void 0,(0,r.Z)("button",{"aria-haspopup":"true","aria-expanded":"false",className:s,"data-toggle":"dropdown",type:"button"},void 0,(0,r.Z)(L.ZP,{size:"34",user:t}),(0,r.Z)("span",{className:"btn-text"},void 0,t.username)),(0,r.Z)("ul",{className:"dropdown-menu stick-to-bottom"},void 0,(0,r.Z)(P,{isOwner:t.is_owner}),x||(x=(0,r.Z)("li",{className:"dropdown-header"})),(0,r.Z)("li",{},void 0,(0,r.Z)("a",{href:t.url},void 0,gettext("See profile"))),y||(y=(0,r.Z)("li",{role:"separator",className:"divider"})),c().createElement(S,e),c().createElement(E,e))))}function P(e){let{isOwner:t}=e;return t?(0,r.Z)("li",{className:"dropdown-header dropdown-header-owner"},void 0,w||(w=(0,r.Z)("span",{className:"material-icon"},void 0,"start")),(0,r.Z)("span",{className:"icon-text"},void 0,gettext("Thread owner"))):null}function O(e){let{participants:t,thread:s,user:a,userIsOwner:i}=e;return(0,r.Z)("div",{className:"participants-cards"},void 0,(0,r.Z)("div",{className:"row"},void 0,t.map((e=>(0,r.Z)(T,{participant:e,thread:s,user:a,userIsOwner:i},e.id)))))}function R(e){return e.participants.length?(0,r.Z)("div",{className:"panel panel-default panel-participants"},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,c().createElement(O,(0,p.Z)({userIsOwner:A(e.user,e.participants)},e)),(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)(k,{thread:e.thread}),(0,r.Z)("div",{className:"col-xs-12 col-sm-9"},void 0,(0,r.Z)("p",{},void 0,function(e){const t=e.length,s=ngettext("This thread has %(users)s participant.","This thread has %(users)s participants.",t);return interpolate(s,{users:t},!0)}(e.participants)))))):null}function A(e,t){return t[0].id===e.id}var I,D=s(30381),j=s.n(D);function z(e){return(0,r.Z)("div",{className:"poll-choices-bars"},void 0,e.poll.choices.map((t=>(0,r.Z)(U,{choice:t,poll:e.poll},t.hash))))}function U(e){let t=0;return e.choice.votes&&e.poll.votes&&(t=Math.ceil(100*e.choice.votes/e.poll.votes)),(0,r.Z)("dl",{className:"dl-horizontal"},void 0,(0,r.Z)("dt",{},void 0,e.choice.label),(0,r.Z)("dd",{},void 0,(0,r.Z)("div",{className:"progress"},void 0,(0,r.Z)("div",{className:"progress-bar",role:"progressbar","aria-valuenow":t,"aria-valuemin":"0","aria-valuemax":"100",style:{width:t+"%"}},void 0,(0,r.Z)("span",{className:"sr-only"},void 0,B(e.votes,e.proc)))),(0,r.Z)("ul",{className:"list-unstyled list-inline poll-chart"},void 0,(0,r.Z)(M,{proc:t,votes:e.choice.votes}),(0,r.Z)(q,{selected:e.choice.selected}))))}function M(e){return(0,r.Z)("li",{className:"poll-chart-votes"},void 0,B(e.votes,e.proc))}function B(e,t){const s=npgettext("thread poll","%(votes)s vote, %(proc)s% of total.","%(votes)s votes, %(proc)s% of total.",e);return interpolate(s,{votes:e,proc:t},!0)}function q(e){return e.selected?(0,r.Z)("li",{className:"poll-chart-selected"},void 0,I||(I=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box")),pgettext("thread poll","You've voted on this choice.")):null}var H,F,Y,V=s(30337),G=s(3784),$=class extends c().Component{constructor(e){super(e),this.state={isLoading:!0,error:null,data:[]}}componentDidMount(){g.Z.get(this.props.poll.api.votes).then((e=>{const t=e.map((e=>Object.assign({},e,{voters:e.voters.map((e=>Object.assign({},e,{voted_on:j()(e.voted_on)})))})));this.setState({isLoading:!1,data:t})}),(e=>{this.setState({isLoading:!1,error:e.detail})}))}render(){return(0,r.Z)("div",{className:"modal-dialog"+(this.state.error?" modal-message":" modal-sm"),role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,H||(H=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,pgettext("thread poll","Poll votes"))),(0,r.Z)(W,{data:this.state.data,error:this.state.error,isLoading:this.state.isLoading})))}};function W(e){return e.isLoading?F||(F=(0,r.Z)(G.Z,{})):e.error?(0,r.Z)(V.Z,{icon:"error_outline",message:e.error}):(0,r.Z)(Q,{data:e.data})}function Q(e){return(0,r.Z)("div",{className:"modal-body modal-poll-votes"},void 0,(0,r.Z)("ul",{className:"list-unstyled votes-details"},void 0,e.data.map((e=>c().createElement(K,(0,p.Z)({key:e.hash},e))))))}function K(e){return(0,r.Z)("li",{},void 0,(0,r.Z)("h4",{},void 0,e.label),(0,r.Z)(J,{votes:e.votes}),(0,r.Z)(X,{voters:e.voters}),Y||(Y=(0,r.Z)("hr",{})))}function J(e){const t=npgettext("thread poll","%(votes)s user has voted for this choice.","%(votes)s users have voted for this choice.",e.votes),s=interpolate(t,{votes:e.votes},!0);return(0,r.Z)("p",{},void 0,s)}function X(e){return e.voters.length?(0,r.Z)("ul",{className:"list-unstyled"},void 0,e.voters.map((e=>c().createElement(ee,(0,p.Z)({key:e.username},e))))):null}function ee(e){return e.url?(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"item-title",href:e.url},void 0,e.username)," ",(0,r.Z)(te,{voted_on:e.voted_on})):(0,r.Z)("li",{},void 0,(0,r.Z)("strong",{},void 0,e.username)," ",(0,r.Z)(te,{voted_on:e.voted_on}))}function te(e){return(0,r.Z)("abbr",{className:"text-muted",title:e.voted_on.format("LLL")},void 0,e.voted_on.fromNow())}var se=s(59752),ae=s(64646);function ie(e){const{isPollOver:t,poll:s,showVoting:a,thread:i}=e;if(!function(e,t,s){return s.is_public||t.can_delete||t.can_edit||t.can_see_votes||t.can_vote&&!e&&(!s.hasSelectedChoices||s.allow_revotes)}(t,s.acl,s))return null;const o=[],n=s.acl.can_vote,l=!s.hasSelectedChoices||s.allow_revotes;return n&&l&&o.push(0),(s.is_public||s.acl.can_see_votes)&&o.push(1),s.acl.can_edit&&o.push(2),s.acl.can_delete&&o.push(3),(0,r.Z)("div",{className:"row poll-options"},void 0,(0,r.Z)(ne,{controls:o,isPollOver:t,poll:s,showVoting:a}),(0,r.Z)(re,{controls:o,poll:s}),(0,r.Z)(le,{controls:o,poll:s,thread:i,onClick:e.edit}),(0,r.Z)(de,{controls:o,poll:s}))}function oe(e,t){let s="col-xs-6";return 1===e.length&&(s="col-xs-12"),3===e.length&&e[0]===t&&(s="col-xs-12"),s+" col-sm-3 col-md-2"}function ne(e){const t=e.poll.acl.can_vote,s=!e.poll.hasSelectedChoices||e.poll.allow_revotes;return t&&s?(0,r.Z)("div",{className:oe(e.controls,0)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:e.poll.isBusy,onClick:e.showVoting,type:"button"},void 0,pgettext("thread poll","Vote"))):null}class re extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)($,{poll:this.props.poll}))}))}render(){return this.props.poll.is_public||this.props.poll.acl.can_see_votes?(0,r.Z)("div",{className:oe(this.props.controls,1)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},void 0,pgettext("thread poll","See votes"))):null}}function le(e){return e.poll.acl.can_edit?(0,r.Z)("div",{className:oe(e.controls,2)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:e.poll.isBusy,onClick:e.onClick,type:"button"},void 0,pgettext("thread poll","Edit"))):null}class de extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{if(!window.confirm(pgettext("thread poll","Are you sure you want to delete this poll? This action is not reversible.")))return!1;f.Z.dispatch(se.n6()),g.Z.delete(this.props.poll.api.index).then(this.handleSuccess,this.handleError)})),(0,l.Z)(this,"handleSuccess",(e=>{b.Z.success(pgettext("thread poll","Poll has been deleted")),f.Z.dispatch(se.Od()),f.Z.dispatch(v.y8(e))})),(0,l.Z)(this,"handleError",(e=>{b.Z.apiError(e),f.Z.dispatch(se.Ar())}))}render(){return this.props.poll.acl.can_delete?(0,r.Z)("div",{className:oe(this.props.controls,3)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:this.props.poll.isBusy,onClick:this.onClick,type:"button"},void 0,pgettext("thread poll","Delete"))):null}}var ce=s(89627);const pe='%(relative)s';function ue(e){return(0,r.Z)("ul",{className:"list-unstyled list-inline poll-details"},void 0,(0,r.Z)(be,{votes:e.poll.votes}),(0,r.Z)(ge,{poll:e.poll}),(0,r.Z)(fe,{poll:e.poll}),(0,r.Z)(he,{poll:e.poll}))}function he(e){const t=interpolate((0,ce.Z)(pgettext("thread poll","Started by %(poster)s %(posted_on)s.")),{poster:me(e.poll),posted_on:ve(e.poll)},!0);return(0,r.Z)("li",{className:"poll-info-creation",dangerouslySetInnerHTML:{__html:t}})}function me(e){return e.url.poster?interpolate('%(user)s',{url:(0,ce.Z)(e.url.poster),user:(0,ce.Z)(e.poster_name)},!0):interpolate('%(user)s',{user:(0,ce.Z)(e.poster_name)},!0)}function ve(e){return interpolate(pe,{absolute:(0,ce.Z)(e.posted_on.format("LLL")),relative:(0,ce.Z)(e.posted_on.fromNow())},!0)}function ge(e){if(!e.poll.length)return null;const t=interpolate((0,ce.Z)(pgettext("thread poll","Voting ends %(ends_on)s.")),{ends_on:Ze(e.poll)},!0);return(0,r.Z)("li",{className:"poll-info-ends-on",dangerouslySetInnerHTML:{__html:t}})}function Ze(e){return interpolate(pe,{absolute:(0,ce.Z)(e.endsOn.format("LLL")),relative:(0,ce.Z)(e.endsOn.fromNow())},!0)}function be(e){const t=npgettext("thread poll","%(votes)s vote.","%(votes)s votes.",e.votes),s=interpolate(t,{votes:e.votes},!0);return(0,r.Z)("li",{className:"poll-info-votes"},void 0,s)}function fe(e){return e.poll.is_public?(0,r.Z)("li",{className:"poll-info-public"},void 0,pgettext("thread poll","Voting is public.")):null}function _e(e){return(0,r.Z)("div",{className:"panel panel-default panel-poll"},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,(0,r.Z)("h2",{},void 0,e.poll.question),(0,r.Z)(ue,{poll:e.poll}),(0,r.Z)(z,{poll:e.poll}),(0,r.Z)(ie,{isPollOver:e.isPollOver,poll:e.poll,showVoting:e.showVoting,thread:e.thread})))}function Ne(e){return(0,r.Z)("ul",{className:"list-unstyled list-inline poll-help"},void 0,(0,r.Z)(xe,{choicesLeft:e.choicesLeft}),(0,r.Z)(ye,{poll:e.poll}))}function xe(e){let{choicesLeft:t}=e;if(0===t)return(0,r.Z)("li",{className:"poll-help-choices-left"},void 0,pgettext("thread poll","You can't select any more choices."));const s=npgettext("thread poll","You can select %(choices)s more choice.","You can select %(choices)s more choices.",t),a=interpolate(s,{choices:t},!0);return(0,r.Z)("li",{className:"poll-help-choices-left"},void 0,a)}function ye(e){return e.poll.allow_revotes?(0,r.Z)("li",{className:"poll-help-allow-revotes"},void 0,pgettext("thread poll","You can change your vote later.")):(0,r.Z)("li",{className:"poll-help-no-revotes"},void 0,pgettext("thread poll","Votes are final."))}function we(e){return(0,r.Z)("ul",{className:"list-unstyled poll-select-choices"},void 0,e.choices.map((t=>(0,r.Z)(ke,{choice:t,toggleChoice:e.toggleChoice},t.hash))))}class ke extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{this.props.toggleChoice(this.props.choice.hash)}))}render(){return(0,r.Z)("li",{className:"poll-select-choice"},void 0,(0,r.Z)("button",{className:this.props.choice.selected?"btn btn-selected":"btn",onClick:this.onClick,type:"button"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,this.props.choice.selected?"check_box":"check_box_outline_blank"),(0,r.Z)("strong",{},void 0,this.props.choice.label)))}}function Ce(e,t){let s=[];for(const e in t){const a=t[e];a.selected&&s.push(a)}return e.allowed_choices-s.length}var Se,Ee=s(82211),Le=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"toggleChoice",(e=>{const t=function(e,t){for(const s in e){const a=e[s];if(a.hash===t)return a}return null}(this.state.choices,e);let s=null;s=t.selected?this.deselectChoice(t,e):this.selectChoice(t,e),this.setState({choices:s,choicesLeft:Ce(this.props.poll,s)})})),(0,l.Z)(this,"selectChoice",((e,t)=>{if(!Ce(this.props.poll,this.state.choices))for(const e in this.state.choices.slice()){const s=this.state.choices[e];if(s.selected&&s.hash!=t){s.selected=!1;break}}return this.state.choices.map((e=>Object.assign({},e,{selected:e.hash==t||e.selected})))})),(0,l.Z)(this,"deselectChoice",((e,t)=>this.state.choices.map((e=>Object.assign({},e,{selected:e.hash!=t&&e.selected}))))),this.state={isLoading:!1,choices:e.poll.choices,choicesLeft:Ce(e.poll,e.poll.choices)}}clean(){return this.state.choicesLeft!==this.props.poll.allowed_choices||(b.Z.error(gettext("You need to select at least one choice")),!1)}send(){let e=[];for(const t in this.state.choices.slice()){const s=this.state.choices[t];s.selected&&e.push(s.hash)}return g.Z.post(this.props.poll.api.votes,e)}handleSuccess(e){f.Z.dispatch(se.gx(e)),b.Z.success(gettext("Your vote has been saved.")),this.props.showResults()}handleError(e){400===e.status?b.Z.error(e.detail):b.Z.apiError(e)}render(){const e=[];return this.props.poll.acl.can_vote&&e.push(0),(this.props.poll.is_public||this.props.poll.acl.can_see_votes)&&e.push(1),this.props.poll.acl.can_edit&&e.push(2),this.props.poll.acl.can_delete&&e.push(3),(0,r.Z)("div",{className:"panel panel-default panel-poll"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,(0,r.Z)("h2",{},void 0,this.props.poll.question),(0,r.Z)(ue,{poll:this.props.poll}),(0,r.Z)(we,{choices:this.state.choices,toggleChoice:this.toggleChoice}),(0,r.Z)(Ne,{choicesLeft:this.state.choicesLeft,poll:this.props.poll})),(0,r.Z)("div",{className:"panel-footer"},void 0,(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)("div",{className:oe(e,0)},void 0,(0,r.Z)(Ee.Z,{className:"btn-primary btn-block btn-sm",loading:this.state.isLoading},void 0,gettext("Save your vote"))),(0,r.Z)("div",{className:oe(e,1)},void 0,(0,r.Z)("button",{className:"btn btn-default btn-block btn-sm",disabled:this.state.isLoading,onClick:this.props.showResults,type:"button"},void 0,gettext("See results"))),(0,r.Z)(le,{controls:e,poll:this.props.poll,thread:this.props.thread,onClick:this.props.edit}),(0,r.Z)(de,{controls:e,poll:this.props.poll})))))}},Te=class extends c().Component{constructor(e){super(e),(0,l.Z)(this,"showResults",(()=>{this.setState({showResults:!0})})),(0,l.Z)(this,"showVoting",(()=>{this.setState({showResults:!1})}));let t=!0;e.user.id&&!e.poll.hasSelectedChoices&&(t=!1),this.state={showResults:t}}render(){if(!this.props.thread.poll)return null;const e=function(e){return!!e.length&&j()().isAfter(e.endsOn)}(this.props.poll);return e||!this.props.poll.acl.can_vote||this.state.showResults?c().createElement(_e,(0,p.Z)({isPollOver:e,showVoting:this.showVoting},this.props)):c().createElement(Le,(0,p.Z)({showResults:this.showResults},this.props))}},Pe=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onAdd",(()=>{let e=this.props.choices.slice();e.push({hash:Re(),label:""}),this.props.setChoices(e)})),(0,l.Z)(this,"onChange",((e,t)=>{const s=this.props.choices.map((s=>(s.hash===e&&(s.label=t),s)));this.props.setChoices(s)})),(0,l.Z)(this,"onDelete",(e=>{const t=this.props.choices.filter((t=>t.hash!==e));this.props.setChoices(t)}))}render(){return(0,r.Z)("div",{className:"poll-choices-control"},void 0,(0,r.Z)("ul",{className:"list-group"},void 0,this.props.choices.map((e=>(0,r.Z)(Oe,{canDelete:this.props.choices.length>2,choice:e,disabled:this.props.disabled,onChange:this.onChange,onDelete:this.onDelete},e.hash)))),(0,r.Z)("button",{className:"btn btn-default btn-sm",disabled:this.props.disabled,onClick:this.onAdd,type:"button"},void 0,pgettext("thread poll","Add choice")))}};class Oe extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onChange",(e=>{this.props.onChange(this.props.choice.hash,e.target.value)})),(0,l.Z)(this,"onDelete",(()=>{window.confirm(pgettext("thread poll","Are you sure you want to remove this choice?"))&&this.props.onDelete(this.props.choice.hash)}))}render(){return(0,r.Z)("li",{className:"list-group-item"},void 0,(0,r.Z)("button",{className:"btn",disabled:!this.props.canDelete||this.props.disabled,onClick:this.onDelete,title:pgettext("thread poll","Remove this choice"),type:"button"},void 0,Se||(Se=(0,r.Z)("span",{className:"material-icon"},void 0,"close"))),(0,r.Z)("input",{disabled:this.props.disabled,maxLength:"255",placeholder:pgettext("thread poll","Poll choice"),type:"text",onChange:this.onChange,value:this.props.choice.label}))}}function Re(){let e="";for(;12!=e.length;)e=Math.random().toString(36).replace(/[^a-zA-Z0-9]+/g,"").substr(1,12);return e}var Ae=s(7227),Ie=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"setChoices",(e=>{const t=Object.assign({},t,{choices:null});this.setState({choices:e,errors:t})})),(0,l.Z)(this,"onCancel",(()=>{let e=!1;e=this.props.poll?window.confirm(pgettext("thread poll","Are you sure you want to discard changes?")):window.confirm(pgettext("thread poll","Are you sure you want to discard new poll?")),e&&this.props.close()}));const t=e.poll.id?e.poll:{question:"",choices:[{hash:"choice-10000",label:""},{hash:"choice-20000",label:""}],length:0,allowed_choices:1,allow_revotes:0,is_public:0};this.state={isLoading:!1,isEdit:!!t.id,question:t.question,choices:t.choices,length:t.length,allowed_choices:t.allowed_choices,allow_revotes:t.allow_revotes,is_public:t.is_public,validators:{question:[],choices:[],length:[],allowed_choices:[]},errors:{}}}send(){const e={question:this.state.question,choices:this.state.choices,length:this.state.length,allowed_choices:this.state.allowed_choices,allow_revotes:this.state.allow_revotes,is_public:this.state.is_public};return this.state.isEdit?g.Z.put(this.props.poll.api.index,e):g.Z.post(this.props.thread.api.poll,e)}handleSuccess(e){f.Z.dispatch(se.gx(e)),this.state.isEdit?b.Z.success(pgettext("thread poll","Poll has been edited.")):b.Z.success(pgettext("thread poll","Poll has been posted.")),this.props.close()}handleError(e){400===e.status?(e.non_field_errors&&(e.allowed_choices=e.non_field_errors),this.setState({errors:Object.assign({},e)}),b.Z.error(gettext("Form contains errors."))):b.Z.apiError(e)}render(){return(0,r.Z)("div",{className:"poll-form"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"panel panel-default panel-form"},void 0,(0,r.Z)("div",{className:"panel-heading"},void 0,(0,r.Z)("h3",{className:"panel-title"},void 0,this.state.isEdit?pgettext("thread poll","Edit poll"):pgettext("thread poll","Add poll"))),(0,r.Z)("div",{className:"panel-body"},void 0,(0,r.Z)("fieldset",{},void 0,(0,r.Z)("legend",{},void 0,pgettext("thread poll","Question and choices")),(0,r.Z)(h.Z,{label:pgettext("thread poll","Poll question"),for:"id_questions",validation:this.state.errors.question},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_questions",onChange:this.bindInput("question"),type:"text",maxLength:"255",value:this.state.question})),(0,r.Z)(h.Z,{label:pgettext("thread poll","Available choices"),validation:this.state.errors.choices},void 0,(0,r.Z)(Pe,{choices:this.state.choices,disabled:this.state.isLoading,setChoices:this.setChoices}))),(0,r.Z)("fieldset",{},void 0,(0,r.Z)("legend",{},void 0,pgettext("thread poll","Voting")),(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)("div",{className:"col-xs-12 col-sm-6"},void 0,(0,r.Z)(h.Z,{label:pgettext("thread poll","Poll length"),helpText:pgettext("thread poll","Enter number of days for which voting in this poll should be possible or zero to run this poll indefinitely."),for:"id_length",validation:this.state.errors.length},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_length",onChange:this.bindInput("length"),type:"text",value:this.state.length}))),(0,r.Z)("div",{className:"col-xs-12 col-sm-6"},void 0,(0,r.Z)(h.Z,{label:pgettext("thread poll","Allowed choices"),for:"id_allowed_choices",validation:this.state.errors.allowed_choices},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_allowed_choices",onChange:this.bindInput("allowed_choices"),type:"text",maxLength:"255",value:this.state.allowed_choices})))),(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)(De,{bindInput:this.bindInput,disabled:this.state.isLoading,isEdit:this.state.isEdit,value:this.state.is_public}),(0,r.Z)("div",{className:"col-xs-12 col-sm-6"},void 0,(0,r.Z)(h.Z,{label:pgettext("thread poll","Allow vote changes"),for:"id_allow_revotes"},void 0,(0,r.Z)(Ae.Z,{id:"id_allow_revotes",disabled:this.state.isLoading,iconOn:"check",iconOff:"close",labelOn:pgettext("thread poll","Allow participants to change their vote"),labelOff:pgettext("thread poll","Don't allow participants to change their vote"),onChange:this.bindInput("allow_revotes"),value:this.state.allow_revotes})))))),(0,r.Z)("div",{className:"panel-footer text-right"},void 0,(0,r.Z)("button",{className:"btn btn-default",disabled:this.state.isLoading,onClick:this.onCancel,type:"button"},void 0,pgettext("thread poll","Cancel"))," ",(0,r.Z)(Ee.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,this.state.isEdit?pgettext("thread poll","Save changes"):pgettext("thread poll","Post poll"))))))}};function De(e){return e.isEdit?null:(0,r.Z)("div",{className:"col-xs-12 col-sm-6"},void 0,(0,r.Z)(h.Z,{label:pgettext("thread poll","Make voting public"),helpText:pgettext("thread poll","Making voting public will allow everyone to access detailed list of votes, showing which users voted for which choices and at which times. This option can't be changed after poll's creation. Moderators may see voting details for all polls."),for:"id_is_public"},void 0,(0,r.Z)(Ae.Z,{id:"id_is_public",disabled:e.disabled,iconOn:"visibility",iconOff:"visibility_off",labelOn:pgettext("thread poll","Votes are public"),labelOff:pgettext("thread poll","Votes are hidden"),onChange:e.bindInput("is_public"),value:e.value})))}const je={changed_title:"edit",pinned_globally:"bookmark",pinned_locally:"bookmark_border",unpinned:"panorama_fish_eye",moved:"arrow_forward",merged:"call_merge",approved:"done",opened:"lock_open",closed:"lock_outline",unhid:"visibility",hid:"visibility_off",changed_owner:"grade",tookover:"grade",added_participant:"person_add",owner_left:"person_outline",participant_left:"person_outline",removed_participant:"remove_circle_outline"};var ze=e=>(0,r.Z)("span",{className:"event-icon-bg"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,je[e.post.event_type])),Ue=s(92747);function Me(e){return e.post.acl.can_hide?(0,r.Z)("li",{className:"event-controls"},void 0,c().createElement(Be,e),c().createElement(qe,e),c().createElement(He,e)):null}class Be extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{f.Z.dispatch(Ue.r$(this.props.post,{is_hidden:!0,hidden_on:j()(),hidden_by_name:this.props.user.username,url:Object.assign(this.props.post.url,{hidden_by:this.props.user.url})})),g.Z.patch(this.props.post.api.index,[{op:"replace",path:"is-hidden",value:!0}]).then((e=>{f.Z.dispatch(Ue.r$(this.props.post,e))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(Ue.r$(this.props.post,{is_hidden:!1}))}))}))}render(){return this.props.post.is_hidden?null:(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,gettext("Hide"))}}class qe extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{f.Z.dispatch(Ue.r$(this.props.post,{is_hidden:!1})),g.Z.patch(this.props.post.api.index,[{op:"replace",path:"is-hidden",value:!1}]).then((e=>{f.Z.dispatch(Ue.r$(this.props.post,e))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(Ue.r$(this.props.post,{is_hidden:!0}))}))}))}render(){return this.props.post.is_hidden?(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,gettext("Unhide")):null}}class He extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{window.confirm(gettext("Are you sure you wish to delete this event? This action is not reversible!"))&&this.delete()})),(0,l.Z)(this,"delete",(()=>{f.Z.dispatch(Ue.r$(this.props.post,{isDeleted:!0})),g.Z.delete(this.props.post.api.index).then((()=>{b.Z.success(gettext("Event has been deleted."))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(Ue.r$(this.props.post,{isDeleted:!1}))}))}))}render(){return(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,gettext("Delete"))}}const Fe='%(user)s',Ye='%(user)s';function Ve(e){return(0,r.Z)("ul",{className:"list-inline event-info"},void 0,c().createElement(Ge,e),c().createElement($e,e),c().createElement(Me,e))}function Ge(e){if(e.post.is_hidden){let t=null;t=e.post.url.hidden_by?interpolate(Ye,{url:(0,ce.Z)(e.post.url.hidden_by),user:(0,ce.Z)(e.post.hidden_by_name)},!0):interpolate(Fe,{user:(0,ce.Z)(e.post.hidden_by_name)},!0);const s=interpolate('%(relative)s',{absolute:(0,ce.Z)(e.post.hidden_on.format("LLL")),relative:(0,ce.Z)(e.post.hidden_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("Hidden by %(event_by)s %(event_on)s.")),{event_by:t,event_on:s},!0);return(0,r.Z)("li",{className:"event-hidden-message",dangerouslySetInnerHTML:{__html:a}})}return null}function $e(e){let t=null;t=e.post.poster?interpolate(Ye,{url:(0,ce.Z)(e.post.poster.url),user:(0,ce.Z)(e.post.poster_name)},!0):interpolate(Fe,{user:(0,ce.Z)(e.post.poster_name)},!0);const s=interpolate('%(relative)s',{url:(0,ce.Z)(e.post.url.index),absolute:(0,ce.Z)(e.post.posted_on.format("LLL")),relative:(0,ce.Z)(e.post.posted_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("By %(event_by)s %(event_on)s.")),{event_by:t,event_on:s},!0);return(0,r.Z)("li",{className:"event-posters",dangerouslySetInnerHTML:{__html:a}})}const We={pinned_globally:gettext("Thread has been pinned globally."),pinned_locally:gettext("Thread has been pinned locally."),unpinned:gettext("Thread has been unpinned."),approved:gettext("Thread has been approved."),opened:gettext("Thread has been opened."),closed:gettext("Thread has been closed."),unhid:gettext("Thread has been revealed."),hid:gettext("Thread has been made hidden."),tookover:gettext("Took thread over."),owner_left:gettext("Owner has left thread. This thread is now closed."),participant_left:gettext("Participant has left thread.")},Qe='%(name)s',Ke='%(name)s';function Je(e){return We[e.post.event_type]?(0,r.Z)("p",{className:"event-message"},void 0,We[e.post.event_type]):"changed_title"===e.post.event_type?c().createElement(Xe,e):"moved"===e.post.event_type?c().createElement(et,e):"merged"===e.post.event_type?c().createElement(tt,e):"changed_owner"===e.post.event_type?c().createElement(st,e):"added_participant"===e.post.event_type?c().createElement(at,e):"removed_participant"===e.post.event_type?c().createElement(it,e):null}function Xe(e){const t=(0,ce.Z)(gettext("Thread title has been changed from %(old_title)s.")),s=interpolate(Ke,{name:(0,ce.Z)(e.post.event_context.old_title)},!0),a=interpolate(t,{old_title:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function et(e){const t=(0,ce.Z)(gettext("Thread has been moved from %(from_category)s.")),s=interpolate(Qe,{url:(0,ce.Z)(e.post.event_context.from_category.url),name:(0,ce.Z)(e.post.event_context.from_category.name)},!0),a=interpolate(t,{from_category:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function tt(e){const t=(0,ce.Z)(gettext("The %(merged_thread)s thread has been merged into this thread.")),s=interpolate(Ke,{name:(0,ce.Z)(e.post.event_context.merged_thread)},!0),a=interpolate(t,{merged_thread:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function st(e){const t=(0,ce.Z)(gettext("Changed thread owner to %(user)s.")),s=interpolate(Qe,{url:(0,ce.Z)(e.post.event_context.user.url),name:(0,ce.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function at(e){const t=(0,ce.Z)(gettext("Added %(user)s to thread.")),s=interpolate(Qe,{url:(0,ce.Z)(e.post.event_context.user.url),name:(0,ce.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function it(e){const t=(0,ce.Z)(gettext("Removed %(user)s from thread.")),s=interpolate(Qe,{url:(0,ce.Z)(e.post.event_context.user.url),name:(0,ce.Z)(e.post.event_context.user.username)},!0),a=interpolate(t,{user:s},!0);return(0,r.Z)("p",{className:"event-message",dangerouslySetInnerHTML:{__html:a}})}function ot(e){let{post:t}=e;return t.is_read?null:(0,r.Z)("div",{className:"event-label"},void 0,(0,r.Z)("span",{className:"label label-unread"},void 0,gettext("New event")))}var nt=s(19755),rt=class extends c().Component{componentDidMount(){this.props.post.is_read||nt(this.element).waypoint({handler:e=>{"down"!==e||this.props.post.is_read||window.setTimeout((()=>{const e=this.element.getBoundingClientRect(),t=e.height+e.top,s=document.documentElement.clientHeight;t<5||t>s||(f.Z.dispatch(Ue.r$(this.props.post,{is_read:!0})),g.Z.post(this.props.post.api.read).then((e=>{f.Z.dispatch(v.Vx(this.props.thread,{is_read:e.thread_is_read}))}),(e=>{b.Z.apiError(e)})))}),1e3)},offset:"bottom-in-view"})}render(){return c().createElement("div",{className:this.props.className,ref:e=>{e&&(this.element=e)}},this.props.children)}};function lt(e){let t="event";return e.post.isDeleted?t="hide":e.post.is_hidden&&(t="event post-hidden"),(0,r.Z)("li",{id:"post-"+e.post.id,className:t},void 0,(0,r.Z)(ot,{post:e.post}),(0,r.Z)("div",{className:"event-body"},void 0,(0,r.Z)("div",{className:"event-icon"},void 0,c().createElement(ze,e)),(0,r.Z)(rt,{className:"event-content",post:e.post},void 0,c().createElement(Je,e),c().createElement(Ve,e))))}var dt=s(69130),ct=s(48772);function pt(e){return(0,r.Z)("div",{className:"col-xs-12 col-md-6"},void 0,c().createElement(ut,e),(0,r.Z)("div",{className:"post-attachment"},void 0,(0,r.Z)("a",{href:e.attachment.url.index,className:"attachment-name item-title",target:"_blank"},void 0,e.attachment.filename),c().createElement(vt,e)))}function ut(e){return e.attachment.is_image?(0,r.Z)("div",{className:"post-attachment-preview"},void 0,c().createElement(mt,e)):(0,r.Z)("div",{className:"post-attachment-preview"},void 0,c().createElement(ht,e))}function ht(e){return(0,r.Z)("a",{href:e.attachment.url.index,className:"material-icon"},void 0,"insert_drive_file")}function mt(e){const t=e.attachment.url.thumb||e.attachment.url.index;return(0,r.Z)("a",{className:"post-thumbnail",href:e.attachment.url.index,target:"_blank",style:{backgroundImage:'url("'+(0,ce.Z)(t)+'")'}})}function vt(e){let t=null;t=e.attachment.url.uploader?interpolate('%(user)s',{url:(0,ce.Z)(e.attachment.url.uploader),user:(0,ce.Z)(e.attachment.uploader_name)},!0):interpolate('%(user)s',{user:(0,ce.Z)(e.attachment.uploader_name)},!0);const s=interpolate('%(relative)s',{absolute:(0,ce.Z)(e.attachment.uploaded_on.format("LLL")),relative:(0,ce.Z)(e.attachment.uploaded_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.")),{filetype:e.attachment.filetype,size:(0,ct.Z)(e.attachment.size),uploader:t,uploaded_on:s},!0);return(0,r.Z)("p",{className:"post-attachment-description",dangerouslySetInnerHTML:{__html:a}})}function gt(e){return function(e){return(!e.is_hidden||e.acl.can_see_hidden)&&e.attachments}(e.post)?(0,r.Z)("div",{className:"post-attachments"},void 0,(0,dt.Z)(e.post.attachments,2).map((e=>{const t=e.map((e=>e?e.id:0)).join("_");return(0,r.Z)(Zt,{row:e},t)}))):null}function Zt(e){return(0,r.Z)("div",{className:"row"},void 0,e.row.map((e=>(0,r.Z)(pt,{attachment:e},e?e.id:0))))}var bt,ft,_t,Nt,xt,yt,wt,kt=s(69092);function Ct(e){return e.post.is_hidden&&!e.post.acl.can_see_hidden?c().createElement(Et,e):e.post.content?c().createElement(St,e):c().createElement(Lt,e)}function St(e){let{post:t}=e;const s="@"+(t.poster?t.poster.username:t.poster_name);return(0,r.Z)(rt,{className:"post-body",post:t},void 0,(0,r.Z)(kt.Z,{author:s,markup:t.content}))}function Et(e){let t=null;t=e.post.hidden_by?interpolate('%(user)s',{url:(0,ce.Z)(e.post.url.hidden_by),user:(0,ce.Z)(e.post.hidden_by_name)},!0):interpolate('%(user)s',{user:(0,ce.Z)(e.post.hidden_by_name)},!0);const s=interpolate('%(relative)s',{absolute:(0,ce.Z)(e.post.hidden_on.format("LLL")),relative:(0,ce.Z)(e.post.hidden_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("Hidden by %(hidden_by)s %(hidden_on)s.")),{hidden_by:t,hidden_on:s},!0);return(0,r.Z)(rt,{className:"post-body post-body-hidden",post:e.post},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("This post is hidden. You cannot see its contents.")),(0,r.Z)("p",{className:"text-muted",dangerouslySetInnerHTML:{__html:a}}))}function Lt(e){return(0,r.Z)(rt,{className:"post-body post-body-invalid",post:e.post},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("This post's contents cannot be displayed.")),(0,r.Z)("p",{className:"text-muted"},void 0,gettext("This error is caused by invalid post content manipulation.")))}function Tt(e){let{post:t,thread:s,user:a}=e;if(!At(t)||t.id!==s.best_answer)return null;let i=null;return i=a.id&&s.best_answer_marked_by===a.id?interpolate(gettext("Marked as best answer by you %(marked_on)s."),{marked_on:s.best_answer_marked_on.fromNow()},!0):interpolate(gettext("Marked as best answer by %(marked_by)s %(marked_on)s."),{marked_by:s.best_answer_marked_by_name,marked_on:s.best_answer_marked_on.fromNow()},!0),(0,r.Z)("div",{className:"post-status-message post-status-best-answer"},void 0,bt||(bt=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box")),(0,r.Z)("p",{},void 0,i))}function Pt(e){return At(e.post)&&e.post.is_hidden?(0,r.Z)("div",{className:"post-status-message post-status-hidden"},void 0,ft||(ft=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility_off")),(0,r.Z)("p",{},void 0,gettext("This post is hidden. Only users with permission may see its contents."))):null}function Ot(e){return At(e.post)&&e.post.is_unapproved?(0,r.Z)("div",{className:"post-status-message post-status-unapproved"},void 0,_t||(_t=(0,r.Z)("span",{className:"material-icon"},void 0,"remove_circle_outline")),(0,r.Z)("p",{},void 0,gettext("This post is unapproved. Only users with permission to approve posts and its author may see its contents."))):null}function Rt(e){return At(e.post)&&e.post.is_protected?(0,r.Z)("div",{className:"post-status-message post-status-protected visible-xs-block"},void 0,Nt||(Nt=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),(0,r.Z)("p",{},void 0,gettext("This post is protected. Only moderators may change it."))):null}function At(e){return!e.is_hidden||e.acl.can_see_hidden}function It(e,t,s){g.Z.patch(e.post.api.index,t).then((t=>{f.Z.dispatch(Ue.r$(e.post,t))}),(t=>{400===t.status?b.Z.error(t.detail[0]):b.Z.apiError(t),f.Z.dispatch(Ue.r$(e.post,s))}))}function Dt(e){const{post:t,user:s}=e;f.Z.dispatch(v.Vx({best_answer:t.id,best_answer_is_protected:t.is_protected,best_answer_marked_on:j()(),best_answer_marked_by:s.id,best_answer_marked_by_name:s.username,best_answer_marked_by_slug:s.slug})),jt(e,[{op:"replace",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],{best_answer:e.thread.best_answer,best_answer_is_protected:e.thread.best_answer_is_protected,best_answer_marked_on:e.thread.best_answer_marked_on,best_answer_marked_by:e.thread.best_answer_marked_by,best_answer_marked_by_name:e.thread.best_answer_marked_by_name,best_answer_marked_by_slug:e.thread.best_answer_marked_by_slug})}function jt(e,t,s){g.Z.patch(e.thread.api.index,t).then((e=>{e.best_answer_marked_on&&(e.best_answer_marked_on=j()(e.best_answer_marked_on)),f.Z.dispatch(v.Vx(e))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(v.Vx(s))}))}var zt,Ut,Mt,Bt,qt,Ht,Ft=class extends c().Component{constructor(e){super(e),this.state={isReady:!1,error:null,likes:[]}}componentDidMount(){g.Z.get(this.props.post.api.likes).then((e=>{this.setState({isReady:!0,likes:e.map(Yt)})}),(e=>{this.setState({isReady:!0,error:e.detail})}))}render(){return this.state.error?(0,r.Z)(Vt,{className:"modal-message"},void 0,(0,r.Z)(V.Z,{message:this.state.error})):this.state.isReady?this.state.likes.length?(0,r.Z)(Vt,{className:"modal-sm",likes:this.state.likes},void 0,(0,r.Z)(Gt,{likes:this.state.likes})):(0,r.Z)(Vt,{className:"modal-message"},void 0,(0,r.Z)(V.Z,{message:gettext("No users have liked this post.")})):xt||(xt=(0,r.Z)(Vt,{className:"modal-sm"},void 0,(0,r.Z)(G.Z,{})))}};function Yt(e){return Object.assign({},e,{liked_on:j()(e.liked_on)})}function Vt(e){let{className:t,children:s,likes:a}=e,i=gettext("Post Likes");if(a){const e=a.length,t=ngettext("%(likes)s like","%(likes)s likes",e);i=interpolate(t,{likes:e},!0)}return(0,r.Z)("div",{className:"modal-dialog "+(t||""),role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,yt||(yt=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,i)),s))}function Gt(e){return(0,r.Z)("div",{className:"modal-body modal-post-likers"},void 0,(0,r.Z)("ul",{className:"media-list"},void 0,e.likes.map((e=>c().createElement($t,(0,p.Z)({key:e.id},e))))))}function $t(e){if(e.url){const t={id:e.liker_id,avatars:e.avatars};return(0,r.Z)("li",{className:"media"},void 0,(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("a",{className:"user-avatar",href:e.url},void 0,(0,r.Z)(L.ZP,{size:"50",user:t}))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("a",{className:"item-title",href:e.url},void 0,e.username)," ",(0,r.Z)(Wt,{likedOn:e.liked_on})))}return(0,r.Z)("li",{className:"media"},void 0,wt||(wt=(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("span",{className:"user-avatar"},void 0,(0,r.Z)(L.ZP,{size:"50"})))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("strong",{},void 0,e.username)," ",(0,r.Z)(Wt,{likedOn:e.liked_on})))}function Wt(e){return(0,r.Z)("span",{className:"text-muted",title:e.likedOn.format("LLL")},void 0,e.likedOn.fromNow())}function Qt(e){return function(e){return(!e.is_hidden||e.acl.can_see_hidden)&&(e.acl.can_reply||e.acl.can_edit||e.acl.can_see_likes&&(e.last_likes||[]).length||e.acl.can_like)}(e.post)?(0,r.Z)("div",{className:"post-footer"},void 0,c().createElement(Kt,e),c().createElement(Jt,e),c().createElement(Xt,e),c().createElement(es,(0,p.Z)({lastLikes:e.post.last_likes,likes:e.post.likes},e)),c().createElement(ts,(0,p.Z)({likes:e.post.likes},e)),c().createElement(as,e),c().createElement(is,e),c().createElement(os,e)):null}class Kt extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Dt(this.props)}))}render(){const{post:e,thread:t}=this.props;return t.acl.can_mark_best_answer&&e.acl.can_mark_as_best_answer?t.best_answer&&!t.acl.can_change_best_answer?null:(0,r.Z)("button",{className:"hidden-xs btn btn-default btn-sm pull-left",disabled:this.props.post.isBusy||e.id===t.best_answer,onClick:this.onClick,type:"button"},void 0,zt||(zt=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box")),pgettext("post control","Best answer")):null}}class Jt extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Dt(this.props)}))}render(){const{post:e,thread:t}=this.props;return t.acl.can_mark_best_answer&&e.acl.can_mark_as_best_answer?t.best_answer&&!t.acl.can_change_best_answer?null:(0,r.Z)("button",{className:"visible-xs-inline-block btn btn-default btn-sm pull-left",disabled:this.props.post.isBusy||e.id===t.best_answer,onClick:this.onClick,type:"button"},void 0,Ut||(Ut=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box"))):null}}class Xt extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{this.props.post.is_liked?function(e){f.Z.dispatch(Ue.r$(e.post,{is_liked:!1,likes:e.post.likes-1,last_likes:e.post.last_likes.filter((t=>!t.id||t.id!==e.user.id))}));const t={is_liked:e.post.is_liked,likes:e.post.likes,last_likes:e.post.last_likes};It(e,[{op:"replace",path:"is-liked",value:!1}],t)}(this.props):function(e){const t=e.post.last_likes||[],s=[e.user].concat(t),a=s.length>3?s.slice(0,-1):s;f.Z.dispatch(Ue.r$(e.post,{is_liked:!0,likes:e.post.likes+1,last_likes:a})),It(e,[{op:"replace",path:"is-liked",value:!0}],{is_liked:e.post.is_liked,likes:e.post.likes,last_likes:e.post.last_likes})}(this.props)}))}render(){if(!this.props.post.acl.can_like)return null;let e="btn btn-default btn-sm pull-left";return this.props.post.is_liked&&(e="btn btn-success btn-sm pull-left"),(0,r.Z)("button",{className:e,disabled:this.props.post.isBusy,onClick:this.onClick,type:"button"},void 0,this.props.post.is_liked?gettext("Liked"):gettext("Like"))}}class es extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)(Ft,{post:this.props.post}))}))}render(){const e=(this.props.post.last_likes||[]).length>0;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?(0,r.Z)("button",{className:"btn btn-link btn-sm pull-left hidden-xs",onClick:this.onClick,type:"button"},void 0,ss(this.props.likes,this.props.lastLikes)):(0,r.Z)("p",{className:"pull-left hidden-xs"},void 0,ss(this.props.likes,this.props.lastLikes)):null}}class ts extends es{render(){const e=(this.props.post.last_likes||[]).length>0;return this.props.post.acl.can_see_likes&&e?2===this.props.post.acl.can_see_likes?(0,r.Z)("button",{className:"btn btn-link btn-sm likes-compact pull-left visible-xs-block",onClick:this.onClick,type:"button"},void 0,Mt||(Mt=(0,r.Z)("span",{className:"material-icon"},void 0,"favorite")),this.props.likes):(0,r.Z)("p",{className:"likes-compact pull-left visible-xs-block"},void 0,Bt||(Bt=(0,r.Z)("span",{className:"material-icon"},void 0,"favorite")),this.props.likes):null}}function ss(e,t){const s=t.slice(0,3).map((e=>e.username));if(1==s.length)return interpolate(gettext("%(user)s likes this."),{user:s[0]},!0);const a=e-s.length,i=s.slice(0,-1).join(", "),o=s.slice(-1)[0],n=interpolate(gettext("%(users)s and %(last_user)s"),{users:i,last_user:o},!0);if(0===a)return interpolate(gettext("%(users)s like this."),{users:n},!0);const r=ngettext("%(users)s and %(likes)s other user like this.","%(users)s and %(likes)s other users like this.",a);return interpolate(r,{users:s.join(", "),likes:a},!0)}class as extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{ae.Z.open({mode:"REPLY",thread:this.props.thread,config:this.props.thread.api.editor,submit:this.props.thread.api.posts.index})}))}render(){return this.props.post.acl.can_reply?(0,r.Z)("button",{className:"btn btn-default btn-sm pull-right",type:"button",onClick:this.onClick},void 0,pgettext("post control","Reply")):null}}class is extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{ae.Z.open({mode:"QUOTE",thread:this.props.thread,config:this.props.thread.api.editor,submit:this.props.thread.api.posts.index,context:{reply:this.props.post.id}})}))}render(){return this.props.post.acl.can_reply?(0,r.Z)("button",{className:"btn btn-default btn-sm pull-right",type:"button",onClick:this.onClick},void 0,pgettext("post control","Quote")):null}}class os extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{ae.Z.open({mode:"EDIT",thread:this.props.thread,post:this.props.post,config:this.props.post.api.editor,submit:this.props.post.api.index})}))}render(){return this.props.post.acl.can_edit?(0,r.Z)("button",{className:"hidden-xs btn btn-default btn-sm pull-right",type:"button",onClick:this.onClick},void 0,pgettext("post control","Edit")):null}}var ns=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onUrlChange",(e=>{this.changeValue("url",e.target.value)})),this.state={isLoading:!1,url:"",validators:{url:[]},errors:{}}}clean(){return!!this.state.url.trim().length||(b.Z.error(gettext("You have to enter link to the other thread.")),!1)}send(){return g.Z.post(this.props.thread.api.posts.move,{new_thread:this.state.url,posts:[this.props.post.id]})}handleSuccess(e){f.Z.dispatch(Ue.r$(this.props.post,{isDeleted:!0})),Z.Z.hide(),b.Z.success(gettext("Selected post was moved to the other thread."))}handleError(e){400===e.status?b.Z.error(e.detail):b.Z.apiError(e)}render(){return(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,qt||(qt=(0,r.Z)(rs,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_url",label:gettext("Link to thread you want to move post to")},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading},void 0,gettext("Move post"))))))}};function rs(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,Ht||(Ht=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Move post")))}function ls(e){return(0,r.Z)("div",{className:"modal-body post-changelog-diff"},void 0,(0,r.Z)("ul",{className:"list-unstyled"},void 0,e.diff.map(((e,t)=>(0,r.Z)(ds,{item:e},t)))))}function ds(e){return"?"===e.item[0]?null:(0,r.Z)("li",{className:cs(e.item)},void 0,e.item.substr(2))}function cs(e){let t="diff-item";return"-"===e[0]?t+=" diff-item-sub":"+"===e[0]&&(t+=" diff-item-add"),t}var ps,us,hs,ms,vs,gs=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{this.props.revertEdit(this.props.edit.id)}))}render(){return this.props.canRevert?(0,r.Z)("div",{className:"modal-footer visible-xs-block"},void 0,(0,r.Z)(Ee.Z,{className:"btn-default btn-sm btn-block",disabled:this.props.disabled,onClick:this.onClick,title:gettext("Revert post to state from before this edit.")},void 0,gettext("Revert"))):null}},Zs=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"goLast",(()=>{this.props.goToEdit()})),(0,l.Z)(this,"goForward",(()=>{this.props.goToEdit(this.props.edit.next)})),(0,l.Z)(this,"goBack",(()=>{this.props.goToEdit(this.props.edit.previous)})),(0,l.Z)(this,"revertEdit",(()=>{this.props.revertEdit(this.props.edit.id)}))}render(){return(0,r.Z)("div",{className:"modal-toolbar post-changelog-toolbar"},void 0,(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)("div",{className:"col-xs-12 col-sm-4"},void 0,(0,r.Z)("div",{className:"row"},void 0,(0,r.Z)("div",{className:"col-xs-4"},void 0,(0,r.Z)(bs,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goBack})),(0,r.Z)("div",{className:"col-xs-4"},void 0,(0,r.Z)(fs,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goForward})),(0,r.Z)("div",{className:"col-xs-4"},void 0,(0,r.Z)(_s,{disabled:this.props.disabled,edit:this.props.edit,onClick:this.goLast})))),(0,r.Z)("div",{className:"col-xs-12 col-sm-5 xs-margin-top-half post-change-label"},void 0,(0,r.Z)(xs,{edit:this.props.edit})),(0,r.Z)(Ns,{canRevert:this.props.canRevert,disabled:this.props.disabled,onClick:this.revertEdit})))}};function bs(e){return(0,r.Z)(Ee.Z,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.previous,onClick:e.onClick,title:gettext("See previous change")},void 0,ps||(ps=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_left")))}function fs(e){return(0,r.Z)(Ee.Z,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.next,onClick:e.onClick,title:gettext("See next change")},void 0,us||(us=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_right")))}function _s(e){return(0,r.Z)(Ee.Z,{className:"btn-default btn-block btn-icon btn-sm",disabled:e.disabled||!e.edit.next,onClick:e.onClick,title:gettext("See previous change")},void 0,hs||(hs=(0,r.Z)("span",{className:"material-icon"},void 0,"last_page")))}function Ns(e){return e.canRevert?(0,r.Z)("div",{className:"col-sm-3 hidden-xs"},void 0,(0,r.Z)(Ee.Z,{className:"btn-default btn-sm btn-block",disabled:e.disabled,onClick:e.onClick,title:gettext("Revert post to state from before this edit.")},void 0,gettext("Revert"))):null}function xs(e){let t=null;t=e.edit.url.editor?interpolate('%(user)s',{url:(0,ce.Z)(e.edit.url.editor),user:(0,ce.Z)(e.edit.editor_name)},!0):interpolate('%(user)s',{user:(0,ce.Z)(e.edit.editor_name)},!0);const s=interpolate('%(relative)s',{absolute:(0,ce.Z)(e.edit.edited_on.format("LLL")),relative:(0,ce.Z)(e.edit.edited_on.fromNow())},!0),a=interpolate((0,ce.Z)(gettext("By %(edited_by)s %(edited_on)s.")),{edited_by:t,edited_on:s},!0);return(0,r.Z)("p",{dangerouslySetInnerHTML:{__html:a}})}function ys(e){return Object.assign({},e,{edited_on:j()(e.edited_on)})}var ws=class extends c().Component{constructor(e){var t;super(e),t=this,(0,l.Z)(this,"goToEdit",(function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;t.setState({isBusy:!0});let s=t.props.post.api.edits;null!==e&&(s+="?edit="+e),g.Z.get(s).then((e=>{t.setState({isReady:!0,isBusy:!1,edit:ys(e)})}),(e=>{t.setState({isReady:!0,isBusy:!1,error:e.detail})}))})),(0,l.Z)(this,"revertEdit",(e=>{if(this.state.isBusy)return;if(!window.confirm(gettext("Are you sure you with to revert this post to the state from before this edit?")))return;this.setState({isBusy:!0});const t=this.props.post.api.edits+"?edit="+e;g.Z.post(t).then((e=>{const t=Ue.ZB(e);f.Z.dispatch(Ue.r$(e,t)),b.Z.success(gettext("Post has been reverted to previous state.")),Z.Z.hide()}),(e=>{b.Z.apiError(e),this.setState({isBusy:!1})}))})),this.state={isReady:!1,isBusy:!0,canRevert:e.post.acl.can_edit,error:null,edit:null}}componentDidMount(){this.goToEdit()}render(){return this.state.error?(0,r.Z)(ks,{className:"modal-dialog modal-message"},void 0,(0,r.Z)(V.Z,{message:this.state.error})):this.state.isReady?(0,r.Z)(ks,{},void 0,(0,r.Z)(Zs,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,goToEdit:this.goToEdit,revertEdit:this.revertEdit}),(0,r.Z)(ls,{diff:this.state.edit.diff}),(0,r.Z)(gs,{canRevert:this.state.canRevert,disabled:this.state.isBusy,edit:this.state.edit,revertEdit:this.revertEdit})):ms||(ms=(0,r.Z)(ks,{},void 0,(0,r.Z)(G.Z,{})))}};function ks(e){return(0,r.Z)("div",{className:e.className||"modal-dialog",role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,vs||(vs=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Post edits history"))),e.children))}var Cs,Ss,Es,Ls,Ts,Ps,Os,Rs,As,Is,Ds,js,zs,Us,Ms,Bs,qs,Hs,Fs,Ys,Vs=s(57026),Gs=s(60471),$s=s(55210);function Ws(e){return c().createElement(Qs,(0,p.Z)({},e,{Form:Ks}))}class Qs extends c().Component{constructor(e){super(e),this.state={isLoaded:!1,isError:!1,categories:[]}}componentDidMount(){g.Z.get(misago.get("THREAD_EDITOR_API")).then((e=>{const t=e.map((e=>Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})));this.setState({isLoaded:!0,categories:t})}),(e=>{this.setState({isError:e.detail})}))}render(){return this.state.isError?(0,r.Z)(Xs,{message:this.state.isError}):this.state.isLoaded?c().createElement(Ks,(0,p.Z)({},this.props,{categories:this.state.categories})):Cs||(Cs=(0,r.Z)(Js,{}))}}class Ks extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onCategoryChange",(e=>{const t=e.target.value,s={category:t};this.acl[t].can_pin_threads{e.post&&(this.state.category||(this.state.category=e.id),this.acl[e.id]={can_pin_threads:e.post.pin,can_close_threads:e.post.close,can_hide_threads:e.post.hide})}))}clean(){return!!this.isValid()||(b.Z.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}send(){return g.Z.post(this.props.thread.api.posts.split,{title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed,posts:[this.props.post.id]})}handleSuccess(e){f.Z.dispatch(Ue.r$(this.props.post,{isDeleted:!0})),Z.Z.hide(),b.Z.success(gettext("Selected post was split into new thread."))}handleError(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),b.Z.error(gettext("Form contains errors."))):b.Z.apiError(e)}getWeightChoices(){const e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}renderWeightField(){return this.acl[this.state.category].can_pin_threads?(0,r.Z)(h.Z,{label:gettext("Thread weight"),for:"id_weight",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Gs.Z,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}renderHiddenField(){return this.acl[this.state.category].can_hide_threads?(0,r.Z)(h.Z,{label:gettext("Hide thread"),for:"id_is_hidden",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Gs.Z,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}renderClosedField(){return this.acl[this.state.category].can_close_threads?(0,r.Z)(h.Z,{label:gettext("Close thread"),for:"id_is_closed",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Gs.Z,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}render(){return(0,r.Z)(ea,{className:"modal-dialog"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{label:gettext("Thread title"),for:"id_title",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.title},void 0,(0,r.Z)("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),Ss||(Ss=(0,r.Z)("div",{className:"clearfix"})),(0,r.Z)(h.Z,{label:gettext("Category"),for:"id_category",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.category},void 0,(0,r.Z)(Vs.Z,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.state.categories})),Es||(Es=(0,r.Z)("div",{className:"clearfix"})),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)(Ee.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Split post")))))}}function Js(){return Ls||(Ls=(0,r.Z)(ea,{className:"modal-dialog"},void 0,(0,r.Z)(G.Z,{})))}function Xs(e){return(0,r.Z)(ea,{className:"modal-dialog modal-message"},void 0,Ts||(Ts=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("You can't move this post at the moment.")),(0,r.Z)("p",{},void 0,e.message)))}function ea(e){return(0,r.Z)("div",{className:e.className,role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,Ps||(Ps=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Split post into new thread"))),e.children))}function ta(e){return(0,r.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,c().createElement(sa,e),c().createElement(aa,e),c().createElement(ia,e),c().createElement(oa,e),c().createElement(na,e),c().createElement(ra,e),c().createElement(la,e),c().createElement(da,e),c().createElement(ca,e),c().createElement(pa,e),c().createElement(ua,e),c().createElement(ha,e),c().createElement(ma,e))}class sa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{let e=window.location.protocol+"//";e+=window.location.host,e+=this.props.post.url.index,prompt(gettext("Permament link to this post:"),e)}))}render(){return(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Os||(Os=(0,r.Z)("span",{className:"material-icon"},void 0,"link")),gettext("Permament link")))}}class aa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{ae.Z.open({mode:"EDIT",thread:this.props.thread,post:this.props.post,config:this.props.post.api.editor,submit:this.props.post.api.index})}))}render(){return this.props.post.acl.can_edit?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Rs||(Rs=(0,r.Z)("span",{className:"material-icon"},void 0,"edit")),gettext("Edit"))):null}}class ia extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Dt(this.props)}))}render(){const{post:e,thread:t}=this.props;return t.acl.can_mark_best_answer&&e.acl.can_mark_as_best_answer?e.id===t.best_answer||t.best_answer&&!t.acl.can_change_best_answer?null:(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,As||(As=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box")),gettext("Mark as best answer"))):null}}class oa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{post:t}=e;f.Z.dispatch(v.Vx({best_answer:null,best_answer_is_protected:!1,best_answer_marked_on:null,best_answer_marked_by:null,best_answer_marked_by_name:null,best_answer_marked_by_slug:null})),jt(e,[{op:"remove",path:"best-answer",value:t.id},{op:"add",path:"acl",value:!0}],{best_answer:e.thread.best_answer,best_answer_is_protected:e.thread.best_answer_is_protected,best_answer_marked_on:e.thread.best_answer_marked_on,best_answer_marked_by:e.thread.best_answer_marked_by,best_answer_marked_by_name:e.thread.best_answer_marked_by_name,best_answer_marked_by_slug:e.thread.best_answer_marked_by_slug})}(this.props)}))}render(){const{post:e,thread:t}=this.props;return e.id!==t.best_answer?null:t.acl.can_unmark_best_answer?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Is||(Is=(0,r.Z)("span",{className:"material-icon"},void 0,"check_box_outline_blank")),gettext("Unmark best answer"))):null}}class na extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)(ws,{post:this.props.post}))}))}render(){const e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;const s=ngettext("This post was edited %(edits)s time.","This post was edited %(edits)s times.",this.props.post.edits);return interpolate(s,{edits:this.props.post.edits},!0),(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Ds||(Ds=(0,r.Z)("span",{className:"material-icon"},void 0,"edit")),gettext("Changes history")))}}class ra extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_unapproved:!1})),It(e,[{op:"replace",path:"is-unapproved",value:!1}],{is_unapproved:e.post.is_unapproved})}))}render(){return this.props.post.acl.can_approve&&this.props.post.is_unapproved?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,js||(js=(0,r.Z)("span",{className:"material-icon"},void 0,"done")),gettext("Approve"))):null}}class la extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show(c().createElement(ns,this.props))}))}render(){return this.props.post.acl.can_move?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,zs||(zs=(0,r.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),gettext("Move"))):null}}class da extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show(c().createElement(Ws,this.props))}))}render(){return this.props.post.acl.can_move?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Us||(Us=(0,r.Z)("span",{className:"material-icon"},void 0,"call_split")),gettext("Split"))):null}}class ca extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_protected:!0})),It(e,[{op:"replace",path:"is-protected",value:!0}],{is_protected:e.post.is_protected})}))}render(){return this.props.post.acl.can_protect?this.props.post.is_protected?null:(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Ms||(Ms=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("Protect"))):null}}class pa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_protected:!1})),It(e,[{op:"replace",path:"is-protected",value:!1}],{is_protected:e.post.is_protected})}))}render(){return this.props.post.acl.can_protect&&this.props.post.is_protected?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Bs||(Bs=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_open")),gettext("Remove protection"))):null}}class ua extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_hidden:!0,hidden_on:j()(),hidden_by_name:e.user.username,url:Object.assign(e.post.url,{hidden_by:e.user.url})})),It(e,[{op:"replace",path:"is-hidden",value:!0}],{is_hidden:e.post.is_hidden,hidden_on:e.post.hidden_on,hidden_by_name:e.post.hidden_by_name,url:e.post.url})}))}render(){const{post:e,thread:t}=this.props;return e.id===t.best_answer?null:e.acl.can_hide?e.is_hidden?null:(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,qs||(qs=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility_off")),gettext("Hide"))):null}}class ha extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,f.Z.dispatch(Ue.r$(e.post,{is_hidden:!1})),It(e,[{op:"replace",path:"is-hidden",value:!1}],{is_hidden:e.post.is_hidden})}))}render(){return this.props.post.acl.can_unhide&&this.props.post.is_hidden?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Hs||(Hs=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Unhide"))):null}}class ma extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,window.confirm(gettext("Are you sure you want to delete this post? This action is not reversible!"))&&(f.Z.dispatch(Ue.r$(e.post,{isDeleted:!0})),g.Z.delete(e.post.api.index).then((()=>{b.Z.success(gettext("Post has been deleted."))}),(t=>{400===t.status?b.Z.error(t.detail):b.Z.apiError(t),f.Z.dispatch(Ue.r$(e.post,{isDeleted:!1}))})))}))}render(){const{post:e,thread:t}=this.props;return e.id===t.best_answer?null:e.acl.can_delete?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.onClick,type:"button"},void 0,Fs||(Fs=(0,r.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete"))):null}}function va(e){return(0,r.Z)("div",{className:"pull-right dropdown"},void 0,Ys||(Ys=(0,r.Z)("button",{"aria-expanded":"true","aria-haspopup":"true",className:"btn btn-default btn-icon dropdown-toggle","data-toggle":"dropdown",type:"button"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"expand_more"))),c().createElement(ta,e))}var ga,Za,ba,fa=s(21981),_a=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{this.props.post.isSelected?f.Z.dispatch(fa._H(this.props.post)):f.Z.dispatch(fa.Ys(this.props.post))}))}render(){return this.props.thread.acl.can_merge_posts||(e=this.props.post.acl).can_approve||e.can_hide||e.can_protect||e.can_unhide||e.can_delete||e.can_move?(0,r.Z)("div",{className:"pull-right"},void 0,(0,r.Z)("button",{className:"btn btn-default btn-icon",onClick:this.onClick,type:"button"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,this.props.post.isSelected?"check_box":"check_box_outline_blank"))):null;var e}},Na=s(24678);function xa(e){return(0,r.Z)("div",{className:"post-heading"},void 0,c().createElement(ya,e),c().createElement(wa,e),c().createElement(ka,e),c().createElement(Ca,e),c().createElement(Sa,e),c().createElement(Ea,e),c().createElement(La,e),c().createElement(_a,e),c().createElement(va,e))}function ya(e){return e.post.is_read?null:(0,r.Z)("span",{className:"label label-unread hidden-xs"},void 0,gettext("New post"))}function wa(e){return e.post.is_read?null:(0,r.Z)("span",{className:"label label-unread visible-xs-inline-block"},void 0,gettext("New"))}function ka(e){const t=interpolate(gettext("posted %(posted_on)s"),{posted_on:e.post.posted_on.format("LL, LT")},!0);return(0,r.Z)("a",{href:e.post.url.index,className:"btn btn-link posted-on hidden-xs",title:t},void 0,e.post.posted_on.fromNow())}function Ca(e){return(0,r.Z)("a",{href:e.post.url.index,className:"btn btn-link posted-on visible-xs-inline-block"},void 0,e.post.posted_on.fromNow())}class Sa extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show((0,r.Z)(ws,{post:this.props.post}))}))}render(){const e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;const s=ngettext("This post was edited %(edits)s time.","This post was edited %(edits)s times.",this.props.post.edits),a=interpolate(s,{edits:this.props.post.edits},!0),i=ngettext("edited %(edits)s time","edited %(edits)s times",this.props.post.edits);return(0,r.Z)("button",{className:"btn btn-link btn-see-edits hidden-xs",onClick:this.onClick,title:a,type:"button"},void 0,interpolate(i,{edits:this.props.post.edits},!0))}}class Ea extends Sa{render(){const e=this.props.post.is_hidden&&!this.props.post.acl.can_see_hidden,t=0===this.props.post.edits;if(e||t)return null;const s=ngettext("%(edits)s edit","%(edits)s edits",this.props.post.edits);return(0,r.Z)("button",{className:"btn btn-link btn-see-edits visible-xs-inline-block",onClick:this.onClick,type:"button"},void 0,interpolate(s,{edits:this.props.post.edits},!0))}}function La(e){const t=e.post.poster&&e.post.poster.id===e.user.id,s=e.post.acl.can_protect;return e.user.id&&e.post.is_protected&&(t||s)?(0,r.Z)("span",{className:"label label-protected hidden-xs",title:gettext("This post is protected and may not be edited.")},void 0,ga||(ga=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("protected")):null}function Ta(e){let{post:t,thread:s}=e;return(0,r.Z)("div",{className:"post-side post-side-anonymous"},void 0,(0,r.Z)(_a,{post:t,thread:s}),(0,r.Z)(va,{post:t,thread:s}),(0,r.Z)("div",{className:"media"},void 0,Za||(Za=(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("span",{},void 0,(0,r.Z)(L.ZP,{className:"poster-avatar",size:100})))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("span",{className:"media-heading item-title"},void 0,t.poster_name),(0,r.Z)("span",{className:"user-title user-title-anonymous"},void 0,gettext("Removed user")))))}function Pa(e){let{title:t,rank:s}=e;return s.is_tab||!!t||!!s.title}function Oa(e){let{poster:t}=e;const s=ngettext("%(posts)s post","%(posts)s posts",t.posts);let a="user-postcount";return Pa(t)&&(a+=" hidden-xs hidden-sm"),(0,r.Z)("span",{className:a},void 0,interpolate(s,{posts:t.posts},!0))}function Ra(e){let{poster:t}=e,s="hidden-xs";return Pa(t)&&(s+=" hidden-sm"),(0,r.Z)("span",{className:s},void 0,(0,r.Z)(Na.ZP,{status:t.status},void 0,(0,r.Z)(Na.pg,{status:t.status,user:t})))}function Aa(e){let{rank:t,title:s}=e,a=s||t.title;if(!a&&t.is_tab&&(a=t.name),!a)return null;let i="user-title";return t.css_class&&(i+=" user-title-"+t.css_class),t.is_tab?(0,r.Z)("div",{className:i},void 0,(0,r.Z)("a",{href:t.url},void 0,a)):(0,r.Z)("div",{className:i},void 0,a)}function Ia(e){let{post:t,thread:s}=e;const{poster:a}=t;return(0,r.Z)("div",{className:"post-side post-side-registered"},void 0,(0,r.Z)(_a,{post:t,thread:s}),(0,r.Z)(va,{post:t,thread:s}),(0,r.Z)("div",{className:"media"},void 0,(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("a",{href:a.url},void 0,(0,r.Z)(L.ZP,{className:"poster-avatar",size:100,user:a}))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("div",{className:"media-heading"},void 0,(0,r.Z)("a",{className:"item-title",href:a.url},void 0,a.username),(0,r.Z)(Na.ZP,{status:a.status},void 0,(0,r.Z)(Na.Jj,{status:a.status}))),(0,r.Z)(Aa,{rank:a.rank,title:a.title}),(0,r.Z)(Ra,{poster:a}),(0,r.Z)(Oa,{poster:a}))))}function Da(e){return e.post.poster?c().createElement(Ia,e):c().createElement(Ta,e)}function ja(e){let t="post";return e.post.isDeleted?t="hide":e.post.is_hidden&&!e.post.acl.can_see_hidden&&(t="post post-hidden"),e.post.poster&&e.post.poster.rank.css_class&&(t+=" post-"+e.post.poster.rank.css_class),e.post.is_read||(t+=" post-new"),(0,r.Z)("li",{id:"post-"+e.post.id,className:t},void 0,(0,r.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,c().createElement(Da,e),(0,r.Z)("div",{className:"panel-content"},void 0,c().createElement(xa,e),c().createElement(Tt,e),c().createElement(Ot,e),c().createElement(Rt,e),c().createElement(Pt,e),c().createElement(Ct,e),c().createElement(gt,e),c().createElement(Qt,e)))))}var za,Ua=()=>(0,r.Z)("li",{className:"post"},void 0,(0,r.Z)("div",{className:"panel panel-default panel-post"},void 0,(0,r.Z)("div",{className:"panel-body"},void 0,(0,r.Z)("div",{className:"post-side post-side-registered"},void 0,(0,r.Z)("div",{className:"media"},void 0,ba||(ba=(0,r.Z)("div",{className:"media-left"},void 0,(0,r.Z)("span",{},void 0,(0,r.Z)(L.ZP,{className:"poster-avatar",size:"100"})))),(0,r.Z)("div",{className:"media-body"},void 0,(0,r.Z)("span",{className:"media-heading item-title"},void 0,(0,r.Z)("span",{className:"ui-preview-text",style:{width:"80px"}},void 0," ")),(0,r.Z)("span",{className:"user-title user-title-anonymous"},void 0,(0,r.Z)("span",{className:"ui-preview-text",style:{width:"60px"}},void 0," "))))),(0,r.Z)("div",{className:"panel-content"},void 0,(0,r.Z)("div",{className:"post-body"},void 0,(0,r.Z)("article",{className:"misago-markup"},void 0,(0,r.Z)("p",{className:"ui-preview-text",style:{width:"100%"}},void 0," "),(0,r.Z)("p",{className:"ui-preview-text",style:{width:"70%"}},void 0," "),(0,r.Z)("p",{className:"ui-preview-text hidden-xs hidden-sm",style:{width:"85%"}},void 0," ")))))));function Ma(e){return e.posts.isLoaded?(0,r.Z)("ul",{className:"posts-list ui-ready"},void 0,e.posts.results.map((t=>c().createElement(Ba,(0,p.Z)({key:t.id,post:t},e))))):za||(za=(0,r.Z)("ul",{className:"posts-list ui-preview"},void 0,(0,r.Z)(Ua,{})))}function Ba(e){return e.post.is_event?c().createElement(lt,e):c().createElement(ja,e)}var qa,Ha,Fa,Ya=s(55547),Va=s(53328),Ga=s(78107),$a=s(59131),Wa=s(98936),Qa=s(50366),Ka=s(16768),Ja=e=>{let{thread:t}=e;return(0,r.Z)("div",{className:"thread-user-card"},void 0,(0,r.Z)("div",{className:"thread-user-card-media"},void 0,t.starter?(0,r.Z)("a",{href:t.url.starter},void 0,(0,r.Z)(L.ZP,{size:40,user:t.starter})):qa||(qa=(0,r.Z)(L.ZP,{size:40}))),(0,r.Z)("div",{className:"thread-user-card-body"},void 0,(0,r.Z)("div",{className:"thread-user-card-header"},void 0,t.starter?(0,r.Z)("a",{className:"item-title",href:t.url.starter,title:gettext("Thread author")},void 0,t.starter.username):(0,r.Z)("span",{className:"item-title",title:gettext("Thread author")},void 0,t.starter_name)),(0,r.Z)("div",{},void 0,(0,r.Z)("span",{className:"text-muted",title:interpolate(gettext("Started on: %(timestamp)s"),{timestamp:t.started_on.format("LLL")},!0)},void 0,t.started_on.fromNow()))))},Xa=s(99755),ei=s(12891),ti=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"handleSuccess",(e=>{this.handleSuccessUnmounted(e),this.setState({isLoading:!0}),Z.Z.hide()})),(0,l.Z)(this,"handleSuccessUnmounted",(e=>{f.Z.dispatch(v.Ar()),f.Z.dispatch(v.Vx(e))})),(0,l.Z)(this,"handleError",(e=>{f.Z.dispatch(v.Ar()),400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e)})),(0,l.Z)(this,"onChange",(e=>{this.changeValue("title",e.target.value)})),this.state={isLoading:!1,title:e.thread.title,validators:{title:(0,ei.jn)()},errors:{}}}clean(){if(!this.state.title.trim().length)return b.Z.error(gettext("You have to enter thread title.")),!1;const e=this.validate();return!e.title||(b.Z.error(e.title[0]),!1)}send(){return f.Z.dispatch(v.n6()),g.Z.patch(this.props.thread.api.index,[{op:"replace",path:"title",value:this.state.title}])}render(){return(0,r.Z)("div",{className:"modal-dialog modal-lg",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,Ha||(Ha=(0,r.Z)(si,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_modal_title",label:gettext("Thread title")},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_modal_title",onChange:this.onChange,value:this.state.title}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading||this.props.thread.isBusy},void 0,gettext("Change title"))))))}};function si(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,Fa||(Fa=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Change title")))}var ai,ii,oi,ni,ri,li,di,ci,pi=s(52753),ui=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"handleSuccess",(e=>{this.handleSuccessUnmounted(e),this.setState({isLoading:!0})})),(0,l.Z)(this,"handleSuccessUnmounted",(e=>{b.Z.success(gettext("Thread has been merged with other one.")),window.location=e.url})),(0,l.Z)(this,"handleError",(e=>{f.Z.dispatch(v.Ar()),400===e.status?e.best_answers||e.polls?Z.Z.show((0,r.Z)(pi.ZP,{api:this.props.thread.api.merge,bestAnswers:e.best_answers,data:{other_thread:this.state.url},polls:e.polls,onError:this.handleError,onSuccess:this.handleSuccessUnmounted})):e.best_answer?b.Z.error(e.best_answer[0]):e.poll?b.Z.error(e.poll[0]):b.Z.error(e.detail):b.Z.apiError(e)})),(0,l.Z)(this,"onUrlChange",(e=>{this.changeValue("url",e.target.value)})),this.state={isLoading:!1,url:"",validators:{url:[]},errors:{}}}clean(){return!!this.state.url.trim().length||(b.Z.error(gettext("You have to enter link to the other thread.")),!1)}send(){return f.Z.dispatch(v.n6()),g.Z.post(this.props.thread.api.merge,{other_thread:this.state.url})}render(){return(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,ai||(ai=(0,r.Z)(hi,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_url",label:gettext("Link to thread you want to merge with"),help_text:gettext("Merge will delete current thread and move its contents to the thread specified here.")},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading||this.props.thread.isBusy},void 0,gettext("Merge thread"))))))}};function hi(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ii||(ii=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Merge thread")))}var mi,vi,gi,Zi,bi,fi,_i,Ni,xi,yi,wi,ki,Ci=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onCategoryChange",(e=>{this.changeValue("category",e.target.value)})),this.state={isReady:!1,isLoading:!1,isError:!1,category:null,categories:[]}}componentDidMount(){g.Z.get(C.Z.get("THREAD_EDITOR_API")).then((e=>{let t=null;const s=e.map((e=>(!1===e.post||t||(t=e.id),Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id}))));this.setState({isReady:!0,category:t,categories:s})}),(e=>{this.setState({isError:e.detail})}))}send(){return f.Z.dispatch(v.n6()),g.Z.patch(this.props.thread.api.index,[{op:"replace",path:"category",value:this.state.category}])}handleSuccess(){g.Z.get(this.props.thread.api.posts.index,{page:this.props.posts.page}).then((e=>{f.Z.dispatch(v.gx(e)),f.Z.dispatch(fa.zD(e.post_set)),f.Z.dispatch(v.Ar()),b.Z.success(gettext("Thread has been moved.")),Z.Z.hide()}),(e=>{f.Z.dispatch(v.Ar()),b.Z.apiError(e)}))}handleError(e){400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e)}render(){return this.state.isReady?(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,oi||(oi=(0,r.Z)(Si,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_category",label:gettext("New category")},void 0,(0,r.Z)(Vs.Z,{choices:this.state.categories,disabled:this.state.isLoading||this.props.thread.isBusy,id:"id_category",onChange:this.onCategoryChange,value:this.state.category}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading||this.props.thread.isBusy},void 0,gettext("Move thread")))))):this.state.isError?(0,r.Z)(Li,{message:this.state.isError}):ni||(ni=(0,r.Z)(Ei,{}))}};function Si(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ri||(ri=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Move thread")))}function Ei(e){return li||(li=(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)(Si,{}),(0,r.Z)(G.Z,{}))))}function Li(e){return(0,r.Z)("div",{className:"modal-dialog modal-message",role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,di||(di=(0,r.Z)(Si,{})),ci||(ci=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("You can't move this thread at the moment.")),(0,r.Z)("p",{},void 0,e.message),(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok")))))}var Ti,Pi,Oi,Ri,Ai=class extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"callApi",((e,t)=>{f.Z.dispatch(v.n6()),e.push({op:"add",path:"acl",value:!0}),g.Z.patch(this.props.thread.api.index,e).then((e=>{f.Z.dispatch(v.Vx(e)),f.Z.dispatch(v.Ar()),b.Z.success(t)}),(e=>{f.Z.dispatch(v.Ar()),400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e)}))})),(0,l.Z)(this,"changeTitle",(()=>{Z.Z.show((0,r.Z)(ti,{thread:this.props.thread}))})),(0,l.Z)(this,"pinGlobally",(()=>{this.callApi([{op:"replace",path:"weight",value:2}],gettext("Thread has been pinned globally."))})),(0,l.Z)(this,"pinLocally",(()=>{this.callApi([{op:"replace",path:"weight",value:1}],gettext("Thread has been pinned locally."))})),(0,l.Z)(this,"unpin",(()=>{this.callApi([{op:"replace",path:"weight",value:0}],gettext("Thread has been unpinned."))})),(0,l.Z)(this,"approve",(()=>{this.callApi([{op:"replace",path:"is-unapproved",value:!1}],gettext("Thread has been approved."))})),(0,l.Z)(this,"open",(()=>{this.callApi([{op:"replace",path:"is-closed",value:!1}],gettext("Thread has been opened."))})),(0,l.Z)(this,"close",(()=>{this.callApi([{op:"replace",path:"is-closed",value:!0}],gettext("Thread has been closed."))})),(0,l.Z)(this,"unhide",(()=>{this.callApi([{op:"replace",path:"is-hidden",value:!1}],gettext("Thread has been made visible."))})),(0,l.Z)(this,"hide",(()=>{this.callApi([{op:"replace",path:"is-hidden",value:!0}],gettext("Thread has been made hidden."))})),(0,l.Z)(this,"move",(()=>{Z.Z.show((0,r.Z)(Ci,{posts:this.props.posts,thread:this.props.thread}))})),(0,l.Z)(this,"merge",(()=>{Z.Z.show((0,r.Z)(ui,{thread:this.props.thread}))})),(0,l.Z)(this,"delete",(()=>{window.confirm(gettext("Are you sure you want to delete this thread?"))&&(f.Z.dispatch(v.n6()),g.Z.delete(this.props.thread.api.index).then((e=>{b.Z.success(gettext("Thread has been deleted.")),window.location=this.props.thread.category.url.index}),(e=>{f.Z.dispatch(v.Ar()),b.Z.apiError(e)})))}))}render(){const{moderation:e}=this.props;return(0,r.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,!!e.edit&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.changeTitle,type:"button"},void 0,mi||(mi=(0,r.Z)("span",{className:"material-icon"},void 0,"edit")),gettext("Change title"))),!!e.pinGlobally&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.pinGlobally,type:"button"},void 0,vi||(vi=(0,r.Z)("span",{className:"material-icon"},void 0,"bookmark")),gettext("Pin globally"))),!!e.pinLocally&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.pinLocally,type:"button"},void 0,gi||(gi=(0,r.Z)("span",{className:"material-icon"},void 0,"bookmark_border")),gettext("Pin locally"))),!!e.unpin&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.unpin,type:"button"},void 0,Zi||(Zi=(0,r.Z)("span",{className:"material-icon"},void 0,"panorama_fish_eye")),gettext("Unpin"))),!!e.move&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.move,type:"button"},void 0,bi||(bi=(0,r.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),gettext("Move"))),!!e.merge&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.merge,type:"button"},void 0,fi||(fi=(0,r.Z)("span",{className:"material-icon"},void 0,"call_merge")),gettext("Merge"))),!!e.approve&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.approve,type:"button"},void 0,_i||(_i=(0,r.Z)("span",{className:"material-icon"},void 0,"done")),gettext("Approve"))),!!e.open&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.open,type:"button"},void 0,Ni||(Ni=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_open")),gettext("Open"))),!!e.close&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.close,type:"button"},void 0,xi||(xi=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("Close"))),!!e.unhide&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.unhide,type:"button"},void 0,yi||(yi=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Unhide"))),!!e.hide&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.hide,type:"button"},void 0,wi||(wi=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility_off")),gettext("Hide"))),!!e.delete&&(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:this.delete,type:"button"},void 0,ki||(ki=(0,r.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete"))))}},Ii=Ai,Di=e=>{let{thread:t,posts:s,moderation:a}=e;return(0,r.Z)("div",{className:"dropdown"},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle",title:gettext("Thread options"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:t.isBusy},void 0,Ti||(Ti=(0,r.Z)("span",{className:"material-icon"},void 0,"settings"))),(0,r.Z)(Ii,{thread:t,posts:s,moderation:a}))},ji=s(94184),zi=s.n(ji);function Ui(e,t,s){const a={subscription:e.subscription};f.Z.dispatch(v.Vx({subscription:t})),g.Z.patch(e.api.index,[{op:"replace",path:"subscription",value:s}]).then((e=>{f.Z.dispatch(v.Vx(e))}),(e=>{400===e.status?b.Z.error(e.detail[0]):b.Z.apiError(e),f.Z.dispatch(v.Vx(a))}))}var Mi,Bi,qi=e=>{let{stickToBottom:t,thread:s}=e;return(0,r.Z)("div",{className:"dropdown"},void 0,(0,r.Z)("button",{className:"btn btn-default btn-outline btn-block","aria-expanded":"true","aria-haspopup":"true","data-toggle":"dropdown",type:"button"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,!0===(a=s.subscription)?"star":!1===a?"star_half":"star_border"),function(e){return!0===e?gettext("E-mail"):!1===e?gettext("Enabled"):gettext("Disabled")}(s.subscription)),(0,r.Z)("ul",{className:zi()("dropdown-menu dropdown-menu-right",{"stick-to-bottom":t})},void 0,(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:()=>function(e){null!==e.subscription&&Ui(e,null,"unsubscribe")}(s)},void 0,Pi||(Pi=(0,r.Z)("span",{className:"material-icon"},void 0,"star_border")),gettext("Unsubscribe"))),(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:()=>function(e){!1!==e.subscription&&Ui(e,!1,"notify")}(s)},void 0,Oi||(Oi=(0,r.Z)("span",{className:"material-icon"},void 0,"star_half")),gettext("Subscribe"))),(0,r.Z)("li",{},void 0,(0,r.Z)("button",{className:"btn btn-link",onClick:()=>function(e){!0!==e.subscription&&Ui(e,!0,"email")}(s)},void 0,Ri||(Ri=(0,r.Z)("span",{className:"material-icon"},void 0,"star")),gettext("Subscribe with e-mail")))));var a},Hi=e=>{let{children:t,className:s}=e;return(0,r.Z)("ul",{className:zi()("breadcrumbs",s)},void 0,t)},Fi=e=>{let{category:t,className:s}=e;return(0,r.Z)("li",{className:zi()("breadcrumbs-item",s)},void 0,(0,r.Z)("a",{href:t.url.index},void 0,(0,r.Z)("span",{className:"material-icon",style:{color:t.color||"inherit"}},void 0,"label"),!!t.short_name&&(0,r.Z)("span",{className:"breadcrumbs-item-name hidden-sm hidden-md hidden-lg",title:t.name},void 0,t.short_name),!!t.short_name&&(0,r.Z)("span",{className:"breadcrumbs-item-name hidden-xs"},void 0,t.name),!t.short_name&&(0,r.Z)("span",{className:"breadcrumbs-item-name"},void 0,t.name)))},Yi=e=>{let{category:t,className:s}=e;return(0,r.Z)("li",{className:zi()("breadcrumbs-item",s)},void 0,(0,r.Z)("a",{href:t.url.index},void 0,Mi||(Mi=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_right")),(0,r.Z)("span",{className:"breadcrumbs-item-name"},void 0,"root_category"===t.special_role?gettext("Threads"):gettext("Private threads"))))},Vi=e=>{let{breadcrumbs:t}=e;return(0,r.Z)(Hi,{},void 0,t.map((e=>e.special_role?(0,r.Z)(Yi,{category:e},e.id):(0,r.Z)(Fi,{category:e},e.id))))};var Gi,$i,Wi,Qi,Ki,Ji,Xi,eo,to,so,ao,io=e=>{let{styleName:t,thread:s,posts:a,user:i,moderation:o}=e;return(0,r.Z)(Xa.sP,{},void 0,(0,r.Z)(Xa.mr,{styleName:t},void 0,(0,r.Z)(Xa.gC,{styleName:t},void 0,(0,r.Z)(Vi,{breadcrumbs:s.path}),(0,r.Z)("h1",{},void 0,s.title)),(0,r.Z)(Xa.eA,{className:"page-header-thread-details"},void 0,(0,r.Z)(Wa.gq,{},void 0,(0,r.Z)(Wa.kw,{auto:!0},void 0,(0,r.Z)(Wa.Z6,{shrink:!0},void 0,(0,r.Z)(Ja,{thread:s})),Bi||(Bi=(0,r.Z)(Wa.Z6,{auto:!0})),s.replies>0&&(0,r.Z)(Wa.Z6,{shrink:!0},void 0,(0,r.Z)(Ka.Z,{thread:s})),(e=>e.is_closed||e.is_hidden||e.is_unapproved||e.weight>0||e.best_answer||e.has_poll||e.has_unapproved_posts)(s)&&(0,r.Z)(Wa.Z6,{shrink:!0},void 0,(0,r.Z)(Qa.Z,{thread:s}))),i.is_authenticated&&(0,r.Z)(Wa.kw,{},void 0,(0,r.Z)(Wa.Z6,{},void 0,(0,r.Z)(qi,{thread:s})),o.enabled&&(0,r.Z)(Wa.Z6,{shrink:!0},void 0,(0,r.Z)(Di,{thread:s,posts:a,moderation:o})))))))},oo=s(92490),no=s(69987),ro=e=>{let{baseUrl:t,posts:s}=e;return(0,r.Z)("div",{className:"misago-pagination"},void 0,s.isLoaded&&s.first?(0,r.Z)(no.rU,{className:"btn btn-default btn-outline btn-icon",to:t,title:gettext("Go to first page")},void 0,Gi||(Gi=(0,r.Z)("span",{className:"material-icon"},void 0,"first_page"))):(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to first page"),type:"button",disabled:!0},void 0,$i||($i=(0,r.Z)("span",{className:"material-icon"},void 0,"first_page"))),s.isLoaded&&s.previous?(0,r.Z)(no.rU,{className:"btn btn-default btn-outline btn-icon",to:t+(s.previous>1?s.previous+"/":""),title:gettext("Go to previous page")},void 0,Wi||(Wi=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_left"))):(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to previous page"),type:"button",disabled:!0},void 0,Qi||(Qi=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_left"))),s.isLoaded&&s.next?(0,r.Z)(no.rU,{className:"btn btn-default btn-outline btn-icon",to:t+s.next+"/",title:gettext("Go to next page")},void 0,Ki||(Ki=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_right"))):(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to next page"),type:"button",disabled:!0},void 0,Ji||(Ji=(0,r.Z)("span",{className:"material-icon"},void 0,"chevron_right"))),s.isLoaded&&s.last?(0,r.Z)(no.rU,{className:"btn btn-default btn-outline btn-icon",to:t+s.last+"/",title:gettext("Go to last page")},void 0,Xi||(Xi=(0,r.Z)("span",{className:"material-icon"},void 0,"last_page"))):(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to last page"),type:"button",disabled:!0},void 0,eo||(eo=(0,r.Z)("span",{className:"material-icon"},void 0,"last_page"))))},lo=e=>{let{posts:t}=e;return t.more?(0,r.Z)("p",{},void 0,interpolate(ngettext("There is %(more)s more post in this thread.","There are %(more)s more posts in this thread.",t.more),{more:t.more},!0)):(0,r.Z)("p",{},void 0,gettext("There are no more posts in this thread."))};function co(e){let{errors:t,posts:s}=e;return(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,to||(to=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Moderation"))),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("One or more posts could not be changed:")),(0,r.Z)("ul",{className:"list-unstyled list-errored-items"},void 0,t.map((e=>(0,r.Z)(po,{errors:e.detail,post:s[e.id]},e.id)))))))}function po(e){let{errors:t,post:s}=e;const a=interpolate(gettext("%(username)s on %(posted_on)s"),{posted_on:s.posted_on.format("LL, LT"),username:s.poster_name},!0);return(0,r.Z)("li",{},void 0,(0,r.Z)("h5",{},void 0,a,":"),t.map(((e,t)=>(0,r.Z)("p",{},t,e))))}function uo(e,t,s,a){const{selection:i,thread:o}=e;s.forEach((e=>{Ue.r$(e,e)})),f.Z.dispatch(fa.kR());const n={ops:t,ids:i.map((e=>e.id))};g.Z.patch(o.api.posts.index,n).then((e=>{e.forEach((e=>{f.Z.dispatch(Ue.r$(e,e))}))}),(e=>{if(400!==e.status)return a.forEach((e=>{f.Z.dispatch(Ue.r$(e,e))})),b.Z.apiError(e);let t=[],s=[];e.forEach((e=>{e.detail?(t.push(e),s.push(e.id)):f.Z.dispatch(Ue.r$(e,e)),a.forEach((e=>{-1!==s.indexOf(e)&&f.Z.dispatch(Ue.r$(e,e))}))}));let o={};i.forEach((e=>{o[e.id]=e})),Z.Z.show((0,r.Z)(co,{errors:t,posts:o}))}))}var ho,mo,vo,go,Zo,bo,fo,_o,No,xo,yo,wo,ko,Co,So,Eo,Lo=class extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onUrlChange",(e=>{this.changeValue("url",e.target.value)})),this.state={isLoading:!1,url:"",validators:{url:[]},errors:{}}}clean(){return!!this.state.url.trim().length||(b.Z.error(gettext("You have to enter link to the other thread.")),!1)}send(){return g.Z.post(this.props.thread.api.posts.move,{new_thread:this.state.url,posts:this.props.selection.map((e=>e.id))})}handleSuccess(e){this.props.selection.forEach((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!0}))})),Z.Z.hide(),b.Z.success(gettext("Selected posts were moved to the other thread."))}handleError(e){400===e.status?b.Z.error(e.detail):b.Z.apiError(e)}render(){return(0,r.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,so||(so=(0,r.Z)(To,{})),(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{for:"id_url",label:gettext("Link to thread you want to move posts to")},void 0,(0,r.Z)("input",{className:"form-control",disabled:this.state.isLoading,id:"id_url",onChange:this.onUrlChange,value:this.state.url}))),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)("button",{className:"btn btn-primary",disabled:this.state.isLoading},void 0,gettext("Move posts"))))))}};function To(e){return(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,ao||(ao=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Move posts")))}function Po(e){return c().createElement(Oo,(0,p.Z)({},e,{Form:Ro}))}class Oo extends c().Component{constructor(e){super(e),this.state={isLoaded:!1,isError:!1,categories:[]}}componentDidMount(){g.Z.get(misago.get("THREAD_EDITOR_API")).then((e=>{const t=e.map((e=>Object.assign(e,{disabled:!1===e.post,label:e.name,value:e.id,post:e.post})));this.setState({isLoaded:!0,categories:t})}),(e=>{this.setState({isError:e.detail})}))}render(){return this.state.isError?(0,r.Z)(Io,{message:this.state.isError}):this.state.isLoaded?c().createElement(Ro,(0,p.Z)({},this.props,{categories:this.state.categories})):ho||(ho=(0,r.Z)(Ao,{}))}}class Ro extends u.Z{constructor(e){super(e),(0,l.Z)(this,"onCategoryChange",(e=>{const t=e.target.value,s={category:t};this.acl[t].can_pin_threads{e.post&&(this.state.category||(this.state.category=e.id),this.acl[e.id]={can_pin_threads:e.post.pin,can_close_threads:e.post.close,can_hide_threads:e.post.hide})}))}clean(){return!!this.isValid()||(b.Z.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}send(){return g.Z.post(this.props.thread.api.posts.split,{title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed,posts:this.props.selection.map((e=>e.id))})}handleSuccess(e){this.props.selection.forEach((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!0}))})),Z.Z.hide(),b.Z.success(gettext("Selected posts were split into new thread."))}handleError(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),b.Z.error(gettext("Form contains errors."))):403===e.status&&Array.isArray(e)?Z.Z.show((0,r.Z)(co,{errors:e})):b.Z.apiError(e)}getWeightChoices(){const e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}renderWeightField(){return this.acl[this.state.category].can_pin_threads?(0,r.Z)(h.Z,{label:gettext("Thread weight"),for:"id_weight",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Gs.Z,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}renderHiddenField(){return this.acl[this.state.category].can_hide_threads?(0,r.Z)(h.Z,{label:gettext("Hide thread"),for:"id_is_hidden",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Gs.Z,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}renderClosedField(){return this.acl[this.state.category].can_close_threads?(0,r.Z)(h.Z,{label:gettext("Close thread"),for:"id_is_closed",labelClass:"col-sm-4",controlClass:"col-sm-8"},void 0,(0,r.Z)(Gs.Z,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}render(){return(0,r.Z)(Do,{className:"modal-dialog"},void 0,(0,r.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,r.Z)("div",{className:"modal-body"},void 0,(0,r.Z)(h.Z,{label:gettext("Thread title"),for:"id_title",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.title},void 0,(0,r.Z)("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),mo||(mo=(0,r.Z)("div",{className:"clearfix"})),(0,r.Z)(h.Z,{label:gettext("Category"),for:"id_category",labelClass:"col-sm-4",controlClass:"col-sm-8",validation:this.state.errors.category},void 0,(0,r.Z)(Vs.Z,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.state.categories})),vo||(vo=(0,r.Z)("div",{className:"clearfix"})),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),(0,r.Z)("div",{className:"modal-footer"},void 0,(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,r.Z)(Ee.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Split posts")))))}}function Ao(){return go||(go=(0,r.Z)(Do,{className:"modal-dialog"},void 0,(0,r.Z)(G.Z,{})))}function Io(e){return(0,r.Z)(Do,{className:"modal-dialog modal-message"},void 0,Zo||(Zo=(0,r.Z)("div",{className:"message-icon"},void 0,(0,r.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,r.Z)("div",{className:"message-body"},void 0,(0,r.Z)("p",{className:"lead"},void 0,gettext("You can't move selected posts at the moment.")),(0,r.Z)("p",{},void 0,e.message),(0,r.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}function Do(e){return(0,r.Z)("div",{className:e.className,role:"document"},void 0,(0,r.Z)("div",{className:"modal-content"},void 0,(0,r.Z)("div",{className:"modal-header"},void 0,(0,r.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,bo||(bo=(0,r.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,r.Z)("h4",{className:"modal-title"},void 0,gettext("Split posts into new thread"))),e.children))}function jo(e){return(0,r.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,c().createElement(zo,e),c().createElement(Uo,e),c().createElement(Mo,e),c().createElement(Bo,e),c().createElement(qo,e),c().createElement(Ho,e),c().createElement(Yo,e),c().createElement(Fo,e),c().createElement(Vo,e))}class zo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((e=>({id:e.id,is_unapproved:!1}))),a=t.map((e=>({id:e.id,is_unapproved:e.is_unapproved})));uo(e,[{op:"replace",path:"is-unapproved",value:!1}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>e.acl.can_approve&&e.is_unapproved));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,fo||(fo=(0,r.Z)("span",{className:"material-icon"},void 0,"done")),gettext("Approve"))):null}}class Uo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{var e;e=this.props,window.confirm(gettext("Are you sure you want to merge selected posts? This action is not reversible!"))&&(e.selection.slice(1).map((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!0}))})),g.Z.post(e.thread.api.posts.merge,{posts:e.selection.map((e=>e.id))}).then((e=>{f.Z.dispatch(Ue.r$(e,Ue.ZB(e)))}),(t=>{400===t.status?b.Z.error(t.detail):b.Z.apiError(t),e.selection.slice(1).map((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!1}))}))})),f.Z.dispatch(fa.kR()))}))}render(){const e=this.props.selection.length>1&&this.props.selection.find((e=>e.acl.can_merge));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,_o||(_o=(0,r.Z)("span",{className:"material-icon"},void 0,"call_merge")),gettext("Merge"))):null}}class Mo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show(c().createElement(Lo,this.props))}))}render(){const e=this.props.selection.find((e=>e.acl.can_move));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,No||(No=(0,r.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),gettext("Move"))):null}}class Bo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{Z.Z.show(c().createElement(Po,this.props))}))}render(){const e=this.props.selection.find((e=>e.acl.can_move));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,xo||(xo=(0,r.Z)("span",{className:"material-icon"},void 0,"call_split")),gettext("Split"))):null}}class qo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((e=>({id:e.id,is_protected:!0}))),a=t.map((e=>({id:e.id,is_protected:e.is_protected})));uo(e,[{op:"replace",path:"is-protected",value:!0}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>!e.is_protected&&e.acl.can_protect));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,yo||(yo=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("Protect"))):null}}class Ho extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((e=>({id:e.id,is_protected:!1}))),a=t.map((e=>({id:e.id,is_protected:e.is_protected})));uo(e,[{op:"replace",path:"is-protected",value:!1}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>e.is_protected&&e.acl.can_protect));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,wo||(wo=(0,r.Z)("span",{className:"material-icon"},void 0,"lock_open")),gettext("Unprotect"))):null}}class Fo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((t=>({id:t.id,is_hidden:!0,hidden_on:j()(),hidden_by_name:e.user.username,url:Object.assign(t.url,{hidden_by:e.user.url})}))),a=t.map((e=>({id:e.id,is_hidden:e.is_hidden,hidden_on:e.hidden_on,hidden_by_name:e.hidden_by_name,url:e.url})));uo(e,[{op:"replace",path:"is-hidden",value:!0}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>e.acl.can_hide&&!e.is_hidden));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,ko||(ko=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility_off")),gettext("Hide"))):null}}class Yo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){const{selection:t}=e,s=t.map((t=>({id:t.id,is_hidden:!1,hidden_on:j()(),hidden_by_name:e.user.username,url:Object.assign(t.url,{hidden_by:e.user.url})}))),a=t.map((e=>({id:e.id,is_hidden:e.is_hidden,hidden_on:e.hidden_on,hidden_by_name:e.hidden_by_name,url:e.url})));uo(e,[{op:"replace",path:"is-hidden",value:!1}],s,a)}(this.props)}))}render(){const e=this.props.selection.find((e=>e.acl.can_unhide&&e.is_hidden));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,Co||(Co=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Unhide"))):null}}class Vo extends c().Component{constructor(){super(...arguments),(0,l.Z)(this,"onClick",(()=>{!function(e){if(!window.confirm(gettext("Are you sure you want to delete selected posts? This action is not reversible!")))return;e.selection.map((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!0}))}));const t=e.selection.map((e=>e.id));g.Z.delete(e.thread.api.posts.index,t).then((()=>{}),(t=>{400===t.status?b.Z.error(t.detail):b.Z.apiError(t),e.selection.map((e=>{f.Z.dispatch(Ue.r$(e,{isDeleted:!1}))}))})),f.Z.dispatch(fa.kR())}(this.props)}))}render(){const e=this.props.selection.find((e=>e.acl.can_delete));return e?(0,r.Z)("li",{},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-link",onClick:this.onClick},void 0,So||(So=(0,r.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete"))):null}}var Go,$o,Wo,Qo,Ko,Jo,Xo,en,tn,sn=e=>{let{thread:t,user:s,selection:a,dropup:i}=e;return(0,r.Z)("div",{className:i?"dropup":"dropdown"},void 0,(0,r.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle",title:gettext("Posts options"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:0===a.length},void 0,Eo||(Eo=(0,r.Z)("span",{className:"material-icon"},void 0,"settings"))),(0,r.Z)(jo,{thread:t,user:s,selection:a}))},an=e=>{let{onClick:t}=e;return(0,r.Z)("button",{className:"btn btn-primary btn-outline btn-block",type:"button",onClick:t},void 0,Go||(Go=(0,r.Z)("span",{className:"material-icon"},void 0,"chat")),gettext("Reply"))},on=e=>{let{thread:t,posts:s,user:a,selection:i,moderation:o,onReply:n}=e;return(0,r.Z)(oo.o8,{},void 0,(0,r.Z)(oo.Z2,{},void 0,(0,r.Z)(oo.Eg,{},void 0,(0,r.Z)(ro,{baseUrl:t.url.index,posts:s})),o.enabled&&(0,r.Z)(oo.Eg,{className:"hidden-sm hidden-md hidden-lg",shrink:!0},void 0,(0,r.Z)(sn,{thread:t,user:a,selection:i,dropup:!0}))),(0,r.Z)(oo.Z2,{className:"hidden-xs hidden-sm",auto:!0},void 0,(0,r.Z)(oo.Eg,{},void 0,(0,r.Z)(lo,{posts:s}))),$o||($o=(0,r.Z)(oo.tw,{className:"hidden-md hidden-lg"})),a.is_authenticated&&(0,r.Z)(oo.Z2,{},void 0,(0,r.Z)(oo.Eg,{},void 0,(0,r.Z)(qi,{thread:t})),t.acl.can_reply&&(0,r.Z)(oo.Eg,{},void 0,(0,r.Z)(an,{onClick:n})),o.enabled&&(0,r.Z)(oo.Eg,{className:"hidden-xs",shrink:!0},void 0,(0,r.Z)(sn,{thread:t,user:a,selection:i,dropup:!0}))))},nn=e=>{let{compact:t,disabled:s,onClick:a}=e;return(0,r.Z)("button",{className:zi()("btn btn-default btn-outline",{"btn-block":!t,"btn-icon":t}),type:"button",title:t?gettext("Add poll"):null,disabled:s,onClick:a},void 0,Wo||(Wo=(0,r.Z)("span",{className:"material-icon"},void 0,"poll")),!t&&gettext("Add poll"))},rn=e=>{let{user:t,thread:s}=e;return(0,r.Z)("div",{className:"dropdown"},void 0,(0,r.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Shortcuts"),"aria-expanded":"true","aria-haspopup":"true","data-toggle":"dropdown",type:"button"},void 0,Qo||(Qo=(0,r.Z)("span",{className:"material-icon"},void 0,"bookmark"))),(0,r.Z)("ul",{className:"dropdown-menu"},void 0,t.is_authenticated&&s.is_new&&(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"btn btn-link",href:s.url.new_post},void 0,Ko||(Ko=(0,r.Z)("span",{className:"material-icon"},void 0,"comment")),gettext("Go to new post"))),s.best_answer&&(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"btn btn-link",href:s.url.best_answer},void 0,Jo||(Jo=(0,r.Z)("span",{className:"material-icon"},void 0,"check_circle")),gettext("Go to best answer"))),s.has_unapproved_posts&&s.acl.can_approve&&(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"btn btn-link",href:s.url.unapproved_post},void 0,Xo||(Xo=(0,r.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Go to unapproved post"))),(0,r.Z)("li",{},void 0,(0,r.Z)("a",{className:"btn btn-link",href:s.url.last_post},void 0,en||(en=(0,r.Z)("span",{className:"material-icon"},void 0,"reply")),gettext("Go to last post")))))},ln=e=>{let{thread:t,posts:s,user:a,pollDisabled:i,selection:o,moderation:n,onPoll:l,onReply:d}=e;return(0,r.Z)(oo.o8,{},void 0,(0,r.Z)(oo.Z2,{className:"hidden-xs"},void 0,(0,r.Z)(oo.Eg,{},void 0,(0,r.Z)(rn,{thread:t,user:a})),(0,r.Z)(oo.Eg,{className:"hidden-xs hidden-sm"},void 0,(0,r.Z)(ro,{baseUrl:t.url.index,posts:s}))),tn||(tn=(0,r.Z)(oo.tw,{})),t.acl.can_start_poll&&!t.poll&&(0,r.Z)(oo.Z2,{className:"hidden-xs"},void 0,(0,r.Z)(oo.Eg,{},void 0,(0,r.Z)(nn,{disabled:i,onClick:l}))),t.acl.can_reply?(0,r.Z)(oo.Z2,{},void 0,(0,r.Z)(oo.Eg,{className:"hidden-sm hidden-md hidden-lg",shrink:!0},void 0,(0,r.Z)(rn,{thread:t,user:a})),(0,r.Z)(oo.Eg,{},void 0,(0,r.Z)(an,{onClick:d})),t.acl.can_start_poll&&!t.poll&&(0,r.Z)(oo.Eg,{className:"hidden-sm hidden-md hidden-lg",shrink:!0},void 0,(0,r.Z)(nn,{disabled:i,onClick:l,compact:!0})),n.enabled&&(0,r.Z)(oo.Eg,{className:"hidden-xs",shrink:!0},void 0,(0,r.Z)(sn,{thread:t,user:a,selection:o}))):(0,r.Z)(oo.Z2,{},void 0,(0,r.Z)(oo.Eg,{className:"hidden-sm hidden-md hidden-lg",shrink:!0},void 0,(0,r.Z)(rn,{thread:t,user:a})),t.acl.can_start_poll&&!t.poll&&(0,r.Z)(oo.Eg,{},void 0,(0,r.Z)(nn,{disabled:i,onClick:l})),n.enabled&&(0,r.Z)(oo.Eg,{shrink:!0},void 0,(0,r.Z)(sn,{thread:t,user:a,selection:o}))))},dn=class extends c().Component{constructor(e){super(e),(0,l.Z)(this,"update",(e=>{f.Z.dispatch(v.gx(e)),f.Z.dispatch(fa.zD(e.post_set)),e.participants&&f.Z.dispatch(m.gx(e.participants)),e.poll&&f.Z.dispatch(se.gx(e.poll)),this.setPageTitle()})),(0,l.Z)(this,"openPollForm",(()=>{this.setState({editPoll:!0})})),(0,l.Z)(this,"closePollForm",(()=>{this.setState({editPoll:!1})})),(0,l.Z)(this,"openReplyForm",(()=>{ae.Z.open({mode:"REPLY",thread:this.props.thread,config:this.props.thread.api.editor,submit:this.props.thread.api.posts.index})})),this.state={editPoll:!1}}componentDidMount(){this.shouldFetchData()&&(this.fetchData(),this.setPageTitle()),this.startPollingApi()}componentDidUpdate(){this.shouldFetchData()&&(this.fetchData(),this.startPollingApi(),this.setPageTitle())}componentWillUnmount(){this.stopPollingApi()}shouldFetchData(){return!!this.props.posts.isLoaded&&1*(this.props.params.page||1)!=this.props.posts.page}fetchData(){f.Z.dispatch(fa.Rz()),g.Z.get(this.props.thread.api.posts.index,{page:this.props.params.page||1},"posts").then((e=>{this.update(e)}),(e=>{b.Z.apiError(e)}))}startPollingApi(){Ya.Z.start({poll:"thread-posts",url:this.props.thread.api.posts.index,data:{page:this.props.params.page||1},update:this.update,frequency:12e4,delayed:!0})}stopPollingApi(){Ya.Z.stop("thread-posts")}setPageTitle(){Va.Z.set({title:this.props.thread.title,parent:this.props.thread.category.name,page:1*(this.props.params.page||1)})}render(){const e=this.props.thread.category;let t="page page-thread";e.css_class&&(t+=" page-thread-"+e.css_class);const s="private_threads"===e.special_role?"private-threads":e.css_class||"category-threads",a=cn(this.props.thread,this.props.user),i=pn(this.props.posts.results,this.props.user),o=this.props.posts.results.filter((e=>e.isSelected));return(0,r.Z)("div",{className:t},void 0,(0,r.Z)(io,{styleName:s,thread:this.props.thread,posts:this.props.posts,user:this.props.user,moderation:a}),(0,r.Z)($a.Z,{},void 0,(0,r.Z)(R,{participants:this.props.participants,thread:this.props.thread,user:this.props.user}),(0,r.Z)(ln,{thread:this.props.thread,posts:this.props.posts,user:this.props.user,selection:o,moderation:i,pollDisabled:this.state.editPoll,onPoll:this.openPollForm,onReply:this.openReplyForm}),this.state.editPoll?(0,r.Z)(Ie,{poll:this.props.poll,thread:this.props.thread,close:this.closePollForm}):(0,r.Z)(Te,{poll:this.props.poll,thread:this.props.thread,user:this.props.user,edit:this.openPollForm}),this.props.thread.acl.can_reply?(0,r.Z)(Ga.mv,{posting:{mode:"REPLY",thread:this.props.thread,config:this.props.thread.api.editor,submit:this.props.thread.api.posts.index}},void 0,c().createElement(Ma,this.props)):c().createElement(Ma,this.props),(0,r.Z)(on,{thread:this.props.thread,posts:this.props.posts,user:this.props.user,selection:o,moderation:i,onReply:this.openReplyForm})))}};const cn=(e,t)=>{const s={enabled:!1,edit:!1,approve:!1,close:!1,open:!1,hide:!1,unhide:!1,move:!1,merge:!1,pinGlobally:!1,pinLocally:!1,unpin:!1,delete:!1};return t.is_authenticated?(s.edit=e.acl.can_edit,s.approve=e.acl.can_approve&&e.is_unapproved,s.close=e.acl.can_close&&!e.is_closed,s.open=e.acl.can_close&&e.is_closed,s.hide=e.acl.can_hide&&!e.is_hidden,s.unhide=e.acl.can_unhide&&e.is_hidden,s.move=e.acl.can_move,s.merge=e.acl.can_merge,s.pinGlobally=e.acl.can_pin_globally&&e.weight<2,s.pinLocally=e.acl.can_pin&&1!==e.weight,s.unpin=e.acl.can_pin&&1===e.weight||e.acl.can_pin_globally&&2===e.weight,s.delete=e.acl.can_delete,s.enabled=s.edit||s.approve||s.close||s.open||s.hide||s.unhide||s.move||s.merge||s.pinGlobally||s.pinLocally||s.unpin||s.delete,s):s},pn=(e,t)=>{const s={enabled:!1,approve:!1,move:!1,merge:!1,protect:!1,hide:!1,delete:!1};return t.is_authenticated?(e.forEach((e=>{e.is_event||(e.acl.can_approve&&e.is_unapproved&&(s.approve=!0),e.acl.can_move&&(s.move=!0),e.acl.can_merge&&(s.merge=!0),(e.acl.can_protect||e.acl.can_unprotect)&&(s.protect=!0),(e.acl.can_hide||e.acl.can_unhide)&&(s.hide=!0),e.acl.can_delete&&(s.delete=!0),(s.approve||s.move||s.merge||s.protect||s.hide||s.delete)&&(s.enabled=!0))})),s):s};function un(e){return{participants:e.participants,poll:e.poll,posts:e.posts,thread:e.thread,tick:e.tick.tick,user:e.auth.user}}function hn(){const e=C.Z.get("THREAD"),t=e.url.index.replace(e.slug+"-"+e.pk,":slug");return[{path:t,component:(0,n.$j)(un)(dn)},{path:t+":page/",component:(0,n.$j)(un)(dn)}]}var mn=s(39633);C.Z.addInitializer({name:"component:thread",initializer:function(e){e.has("THREAD")&&e.has("POSTS")&&(0,mn.Z)({paths:hn()})},after:"store"})},72168:function(e,t,s){"use strict";var a=s(37424),i=s(22928),o=s(4942),n=s(57588),r=s.n(n),l=s(82211);function d(e,t){return e.last_post>t.last_post?-1:e.last_postt.weight?-1:2===t.weight&&e.weightt.weight?-1:e.weight{let{allItems:t,parentUrl:s,category:a,categories:o,list:n}=e;return(0,i.Z)("div",{className:"dropdown threads-category-picker"},void 0,(0,i.Z)("button",{type:"button",className:"btn btn-default btn-outline dropdown-toggle btn-block text-ellipsis","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,a&&(0,i.Z)("span",{className:"material-icon",style:{color:a.color||"inherit"}},void 0,"label"),a&&a.short_name&&(0,i.Z)("span",{className:a.short_name&&"hidden-md hidden-lg"},void 0,a.short_name),a?(0,i.Z)("span",{className:a.short_name&&"hidden-xs hidden-sm"},void 0,a.name):t),(0,i.Z)("ul",{className:"dropdown-menu"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)(Z.rU,{to:s+n.path},void 0,t)),u||(u=(0,i.Z)("li",{role:"separator",className:"divider"})),o.map((e=>(0,i.Z)("li",{},e.id,(0,i.Z)(Z.rU,{to:e.url.index+n.path},void 0,(0,i.Z)("span",{className:"material-icon",style:{color:e.color||"inherit"}},void 0,"label"),e.name))))))},f=e=>{let{baseUrl:t,list:s,lists:a}=e;return(0,i.Z)("div",{className:"dropdown threads-list-picker"},void 0,(0,i.Z)("button",{type:"button",className:"btn btn-default btn-outline dropdown-toggle btn-block","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,s.longName),(0,i.Z)("ul",{className:"dropdown-menu stick-to-bottom"},void 0,a.map((e=>(0,i.Z)("li",{},e.type,(0,i.Z)(Z.rU,{to:t+e.path},void 0,e.longName))))))},_=class extends r().Component{render(){return(0,i.Z)("div",{className:"modal-dialog",role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{"aria-label":pgettext("modal","Close"),className:"close","data-dismiss":"modal",type:"button"},void 0,h||(h=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Threads moderation"))),(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("One or more threads could not be deleted:")),(0,i.Z)("ul",{className:"list-unstyled list-errored-items"},void 0,this.props.errors.map((e=>(0,i.Z)(N,{errors:e.errors,thread:e.thread},e.thread.id)))))))}};function N(e){let{errors:t,thread:s}=e;return(0,i.Z)("li",{},void 0,(0,i.Z)("h5",{},void 0,s.title),t.map(((e,t)=>(0,i.Z)("p",{},void 0,e))))}var x,y,w,k,C,S,E,L,T,P,O,R,A,I,D,j,z,U,M,B,q,H,F,Y=s(43345),V=s(96359),G=s(57026),$=s(60471),W=s(32233),Q=s(61340),K=s(77751),J=s(52753),X=s(78657),ee=s(59801),te=s(53904),se=s(90287),ae=s(55210),ie=class extends Y.Z{constructor(e){super(e),(0,o.Z)(this,"getFormdata",(()=>({threads:this.props.threads.map((e=>e.id)),title:this.state.title,category:this.state.category,weight:this.state.weight,is_hidden:this.state.is_hidden,is_closed:this.state.is_closed}))),(0,o.Z)(this,"handleSuccess",(e=>{this.props.threads.forEach((e=>{this.props.freezeThread(e.id),this.props.deleteThread(e)})),se.Z.dispatch(K.YP()),this.props.addThreads([e]),se.Z.dispatch((0,Q.V8)(this.props.route.category,this.props.categoriesMap)),ee.Z.hide()})),(0,o.Z)(this,"handleError",(e=>{400===e.status?e.best_answers||e.polls?ee.Z.show((0,i.Z)(J.ZP,{api:W.Z.get("MERGE_THREADS_API"),bestAnswers:e.best_answers,data:this.getFormdata(),polls:e.polls,onError:this.handleError,onSuccess:this.handleSuccess})):(this.setState({errors:Object.assign({},this.state.errors,e)}),te.Z.error(gettext("Form contains errors."))):403===e.status&&Array.isArray(e)?ee.Z.show((0,i.Z)(_,{errors:e})):e.best_answer?te.Z.error(e.best_answer[0]):e.poll?te.Z.error(e.poll[0]):te.Z.apiError(e)})),(0,o.Z)(this,"onCategoryChange",(e=>{const t=e.target.value,s={category:t};this.acl[t].can_pin_threads{if(e.level>0){const t=this.acl[e.id],s=!t.can_start_threads||e.is_closed&&!t.can_close_threads;this.categoryChoices.push({value:e.id,disabled:s,level:e.level-1,label:e.name}),s||this.state.category||(this.state.category=e.id)}})),this.isHiddenChoices=[{value:0,icon:"visibility",label:gettext("No")},{value:1,icon:"visibility_off",label:gettext("Yes")}],this.isClosedChoices=[{value:!1,icon:"lock_outline",label:gettext("No")},{value:!0,icon:"lock",label:gettext("Yes")}]}clean(){return!!this.isValid()||(te.Z.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}send(){return X.Z.post(W.Z.get("MERGE_THREADS_API"),this.getFormdata())}getWeightChoices(){const e=[{value:0,icon:"remove",label:gettext("Not pinned")},{value:1,icon:"bookmark_border",label:gettext("Pinned locally")}];return 2==this.acl[this.state.category].can_pin_threads&&e.push({value:2,icon:"bookmark",label:gettext("Pinned globally")}),e}renderWeightField(){return this.acl[this.state.category].can_pin_threads?(0,i.Z)(V.Z,{label:gettext("Thread weight"),for:"id_weight"},void 0,(0,i.Z)($.Z,{id:"id_weight",onChange:this.bindInput("weight"),value:this.state.weight,choices:this.getWeightChoices()})):null}renderHiddenField(){return this.acl[this.state.category].can_hide_threads?(0,i.Z)(V.Z,{label:gettext("Hide thread"),for:"id_is_hidden"},void 0,(0,i.Z)($.Z,{id:"id_is_closed",onChange:this.bindInput("is_hidden"),value:this.state.is_hidden,choices:this.isHiddenChoices})):null}renderClosedField(){return this.acl[this.state.category].can_close_threads?(0,i.Z)(V.Z,{label:gettext("Close thread"),for:"id_is_closed"},void 0,(0,i.Z)($.Z,{id:"id_is_closed",onChange:this.bindInput("is_closed"),value:this.state.is_closed,choices:this.isClosedChoices})):null}renderForm(){return(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(V.Z,{label:gettext("Thread title"),for:"id_title",validation:this.state.errors.title},void 0,(0,i.Z)("input",{id:"id_title",className:"form-control",type:"text",onChange:this.bindInput("title"),value:this.state.title})),x||(x=(0,i.Z)("div",{className:"clearfix"})),(0,i.Z)(V.Z,{label:gettext("Category"),for:"id_category",validation:this.state.errors.category},void 0,(0,i.Z)(G.Z,{id:"id_category",onChange:this.onCategoryChange,value:this.state.category,choices:this.categoryChoices})),y||(y=(0,i.Z)("div",{className:"clearfix"})),this.renderWeightField(),this.renderHiddenField(),this.renderClosedField()),(0,i.Z)("div",{className:"modal-footer"},void 0,(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,i.Z)(l.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Merge threads"))))}renderCantMergeMessage(){return(0,i.Z)("div",{className:"modal-body"},void 0,w||(w=(0,i.Z)("div",{className:"message-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,i.Z)("div",{className:"message-body"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("You can't move threads because there are no categories you are allowed to move them to.")),(0,i.Z)("p",{},void 0,gettext("You need permission to start threads in category to be able to merge threads to it.")),(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}getClassName(){return this.state.category?"modal-dialog":"modal-dialog modal-message"}render(){return(0,i.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,k||(k=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Merge threads"))),this.state.category?this.renderForm():this.renderCantMergeMessage()))}},oe=class extends Y.Z{constructor(e){super(e),(0,o.Z)(this,"handleSubmit",(e=>{e.preventDefault(),ee.Z.hide(),this.props.callApi([{op:"replace",path:"category",value:this.state.category},{op:"replace",path:"flatten-categories",value:null},{op:"add",path:"acl",value:!0}],gettext("Selected threads were moved."),(()=>{se.Z.dispatch((0,Q.V8)(this.props.route.category,this.props.categoriesMap));const e=se.Z.getState(),t=e.threads.map((e=>e.id));se.Z.dispatch(K.$6(e.selection.filter((e=>-1!==t.indexOf(e)))))}))})),this.state={category:null};const t={};for(const s in e.user.acl.categories){if(!e.user.acl.categories.hasOwnProperty(s))continue;const a=e.user.acl.categories[s];t[a.id]=a}this.categoryChoices=[],e.categories.forEach((e=>{if(e.level>0){const s=t[e.id],a=!s.can_start_threads||e.is_closed&&!s.can_close_threads;this.categoryChoices.push({value:e.id,disabled:a,level:e.level-1,label:e.name}),a||this.state.category||(this.state.category=e.id)}}))}getClassName(){return this.state.category?"modal-dialog":"modal-dialog modal-message"}renderForm(){return(0,i.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,i.Z)("div",{className:"modal-body"},void 0,(0,i.Z)(V.Z,{label:gettext("New category"),for:"id_new_category"},void 0,(0,i.Z)(G.Z,{id:"id_new_category",onChange:this.bindInput("category"),value:this.state.category,choices:this.categoryChoices}))),(0,i.Z)("div",{className:"modal-footer"},void 0,(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,i.Z)("button",{className:"btn btn-primary"},void 0,gettext("Move threads"))))}renderCantMoveMessage(){return(0,i.Z)("div",{className:"modal-body"},void 0,C||(C=(0,i.Z)("div",{className:"message-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,i.Z)("div",{className:"message-body"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("You can't move threads because there are no categories you are allowed to move them to.")),(0,i.Z)("p",{},void 0,gettext("You need permission to start threads in category to be able to move threads to it.")),(0,i.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}render(){return(0,i.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,i.Z)("div",{className:"modal-content"},void 0,(0,i.Z)("div",{className:"modal-header"},void 0,(0,i.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,S||(S=(0,i.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,i.Z)("h4",{className:"modal-title"},void 0,gettext("Move threads"))),this.state.category?this.renderForm():this.renderCantMoveMessage()))}},ne=class extends r().Component{constructor(){var e;super(...arguments),e=this,(0,o.Z)(this,"callApi",(function(t,s){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;e.props.threads.forEach((t=>{e.props.freezeThread(t.id)}));const o=e.props.threads.map((e=>e.id));t.push({op:"add",path:"acl",value:!0}),X.Z.patch(e.props.api,{ids:o,ops:t}).then((t=>{e.props.threads.forEach((t=>{e.props.freezeThread(t.id)})),t.forEach((t=>{e.props.updateThread(t)})),te.Z.success(s),a&&a()}),(t=>{if(e.props.threads.forEach((t=>{e.props.freezeThread(t.id)})),400!==t.status)return te.Z.apiError(t);let s=[],a={};e.props.threads.forEach((e=>{a[e.id]=e})),t.forEach((e=>{let{id:t,detail:i}=e;void 0!==a[t]&&s.push({errors:i,thread:a[t]})})),ee.Z.show((0,i.Z)(_,{errors:s}))}))})),(0,o.Z)(this,"pinGlobally",(()=>{this.callApi([{op:"replace",path:"weight",value:2}],gettext("Selected threads were pinned globally."))})),(0,o.Z)(this,"pinLocally",(()=>{this.callApi([{op:"replace",path:"weight",value:1}],gettext("Selected threads were pinned locally."))})),(0,o.Z)(this,"unpin",(()=>{this.callApi([{op:"replace",path:"weight",value:0}],gettext("Selected threads were unpinned."))})),(0,o.Z)(this,"approve",(()=>{this.callApi([{op:"replace",path:"is-unapproved",value:!1}],gettext("Selected threads were approved."))})),(0,o.Z)(this,"open",(()=>{this.callApi([{op:"replace",path:"is-closed",value:!1}],gettext("Selected threads were opened."))})),(0,o.Z)(this,"close",(()=>{this.callApi([{op:"replace",path:"is-closed",value:!0}],gettext("Selected threads were closed."))})),(0,o.Z)(this,"unhide",(()=>{this.callApi([{op:"replace",path:"is-hidden",value:!1}],gettext("Selected threads were unhidden."))})),(0,o.Z)(this,"hide",(()=>{this.callApi([{op:"replace",path:"is-hidden",value:!0}],gettext("Selected threads were hidden."))})),(0,o.Z)(this,"move",(()=>{ee.Z.show((0,i.Z)(oe,{callApi:this.callApi,categories:this.props.categories,categoriesMap:this.props.categoriesMap,route:this.props.route,user:this.props.user}))})),(0,o.Z)(this,"merge",(()=>{const e=[];if(this.props.threads.forEach((t=>{t.acl.can_merge||e.append({id:t.id,title:t.title,errors:[gettext("You don't have permission to merge this thread with others.")]})})),this.props.threads.length<2)te.Z.info(gettext("You have to select at least two threads to merge."));else{if(e.length)return void ee.Z.show((0,i.Z)(_,{errors:e}));ee.Z.show(r().createElement(ie,this.props))}})),(0,o.Z)(this,"delete",(()=>{if(!window.confirm(gettext("Are you sure you want to delete selected threads?")))return;this.props.threads.map((e=>{this.props.freezeThread(e.id)}));const e=this.props.threads.map((e=>e.id));X.Z.delete(this.props.api,e).then((()=>{this.props.threads.map((e=>{this.props.freezeThread(e.id),this.props.deleteThread(e)})),te.Z.success(gettext("Selected threads were deleted."))}),(e=>{if(400===e.status){const t=e.map((e=>e.id));this.props.threads.map((e=>{this.props.freezeThread(e.id),-1===t.indexOf(e.id)&&this.props.deleteThread(e)})),ee.Z.show((0,i.Z)(_,{errors:e}))}else te.Z.apiError(e)}))}))}render(){const{moderation:e,threads:t}=this.props,s=0==this.props.selection.length;return(0,i.Z)("ul",{className:"dropdown-menu dropdown-menu-right stick-to-bottom"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",onClick:()=>se.Z.dispatch(K.$6(t.map((e=>e.id))))},void 0,E||(E=(0,i.Z)("span",{className:"material-icon"},void 0,"check_box")),gettext("Select all"))),(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:()=>se.Z.dispatch(K.YP())},void 0,L||(L=(0,i.Z)("span",{className:"material-icon"},void 0,"check_box_outline_blank")),gettext("Select none"))),T||(T=(0,i.Z)("li",{role:"separator",className:"divider"})),!!e.can_pin_globally&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.pinGlobally},void 0,P||(P=(0,i.Z)("span",{className:"material-icon"},void 0,"bookmark")),gettext("Pin threads globally"))),!!e.can_pin&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.pinLocally},void 0,O||(O=(0,i.Z)("span",{className:"material-icon"},void 0,"bookmark_border")),gettext("Pin threads locally"))),!!e.can_pin&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.unpin},void 0,R||(R=(0,i.Z)("span",{className:"material-icon"},void 0,"panorama_fish_eye")),gettext("Unpin threads"))),!!e.can_move&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.move},void 0,A||(A=(0,i.Z)("span",{className:"material-icon"},void 0,"arrow_forward")),gettext("Move threads"))),!!e.can_merge&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.merge},void 0,I||(I=(0,i.Z)("span",{className:"material-icon"},void 0,"call_merge")),gettext("Merge threads"))),!!e.can_approve&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.approve},void 0,D||(D=(0,i.Z)("span",{className:"material-icon"},void 0,"done")),gettext("Approve threads"))),!!e.can_close&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.open},void 0,j||(j=(0,i.Z)("span",{className:"material-icon"},void 0,"lock_open")),gettext("Open threads"))),!!e.can_close&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.close},void 0,z||(z=(0,i.Z)("span",{className:"material-icon"},void 0,"lock_outline")),gettext("Close threads"))),!!e.can_unhide&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.unhide},void 0,U||(U=(0,i.Z)("span",{className:"material-icon"},void 0,"visibility")),gettext("Unhide threads"))),!!e.can_hide&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.hide},void 0,M||(M=(0,i.Z)("span",{className:"material-icon"},void 0,"visibility_off")),gettext("Hide threads"))),!!e.can_delete&&(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn btn-link",type:"button",disabled:s,onClick:this.delete},void 0,B||(B=(0,i.Z)("span",{className:"material-icon"},void 0,"clear")),gettext("Delete threads"))))}},re=e=>{let{api:t,categoriesMap:s,categories:a,threads:o,addThreads:n,freezeThread:r,updateThread:l,deleteThread:d,selection:c,moderation:p,route:u,user:h,disabled:m}=e;return(0,i.Z)("div",{className:"dropdown threads-moderation"},void 0,(0,i.Z)("button",{type:"button",className:"btn btn-default btn-outline btn-icon dropdown-toggle",title:gettext("Moderation"),"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false",disabled:m},void 0,q||(q=(0,i.Z)("span",{className:"material-icon"},void 0,"settings"))),(0,i.Z)(ne,{api:t,categories:a,categoriesMap:s,threads:o,addThreads:n,freezeThread:r,updateThread:l,deleteThread:d,selection:c,moderation:p,route:u,user:h,disabled:m}))},le=e=>{let{api:t,baseUrl:s,category:a,categories:o,categoriesMap:n,topCategory:r,topCategories:d,subCategory:c,subCategories:p,list:u,lists:h,threads:m,addThreads:Z,startThread:_,freezeThread:N,updateThread:x,deleteThread:y,selection:w,moderation:k,route:C,user:S,disabled:E}=e;return(0,i.Z)(g.o8,{},void 0,d.length>0&&(0,i.Z)(g.Z2,{},void 0,(0,i.Z)(g.Eg,{},void 0,(0,i.Z)(b,{allItems:gettext("All categories"),parentUrl:u.path,category:r,categories:d,list:u})),r&&p.length>0&&(0,i.Z)(g.Eg,{},void 0,(0,i.Z)(b,{allItems:gettext("All subcategories"),parentUrl:r.url.index,category:c,categories:p,list:u}))),h.length>1&&(0,i.Z)(g.Z2,{className:"hidden-xs"},void 0,(0,i.Z)(g.Eg,{},void 0,(0,i.Z)(f,{baseUrl:s,list:u,lists:h}))),H||(H=(0,i.Z)(g.tw,{})),!!S.id&&(0,i.Z)(g.Z2,{},void 0,(0,i.Z)(g.Eg,{},void 0,(0,i.Z)(l.Z,{className:"btn-primary btn-outline btn-block",disabled:E,onClick:()=>{v.Z.open(_||{mode:"START",config:misago.get("THREAD_EDITOR_API"),submit:misago.get("THREADS_API"),category:a.id})}},void 0,F||(F=(0,i.Z)("span",{className:"material-icon"},void 0,"chat")),gettext("Start thread"))),!!k.allow&&(0,i.Z)(g.Eg,{shrink:!0},void 0,(0,i.Z)(re,{api:t,categories:o,categoriesMap:n,threads:m.filter((e=>-1!==w.indexOf(e.id))),addThreads:Z,freezeThread:N,updateThread:x,deleteThread:y,selection:w,moderation:k,route:C,user:S,disabled:E}))))},de=class extends r().Component{render(){const{root:e}=this.props,{category:t,categories:s,categoriesMap:a}=this.props.route,o=ce(e,t,a);return(0,i.Z)(m.Z,{},void 0,(0,i.Z)(le,{api:this.props.api,baseUrl:t.url.index,category:t,categories:s,categoriesMap:a,topCategory:o,topCategories:s.filter((t=>t.parent===e.id)),subCategories:o?s.filter((e=>e.parent===o.id)):[],subCategory:2===t.level?t:null,subcategories:this.props.subcategories,list:this.props.route.list,lists:this.props.route.lists,threads:this.props.threads,addThreads:this.props.addThreads,startThread:this.props.startThread,freezeThread:this.props.freezeThread,deleteThread:this.props.deleteThread,updateThread:this.props.updateThread,selection:this.props.selection,moderation:this.props.moderation,route:this.props.route,user:this.props.user,disabled:!this.props.isLoaded||this.props.isBusy||this.props.busyThreads.length}),this.props.children)}};const ce=(e,t,s)=>t.parent?t.parent===e.id?t:s[t.parent]:null;function pe(e,t){let s={};return e.forEach((function(e){s[e.id]=e})),t.filter((function(e){return!s[e.id]||function(e,t){return[e.title===t.title,e.weight===t.weight,e.category===t.category,e.last_post===t.last_post,e.last_poster_name===t.last_poster_name].indexOf(!1)>=0}(s[e.id],e)}))}function ue(e){let t={allow:!1,can_approve:0,can_close:0,can_delete:0,can_hide:0,can_merge:0,can_move:0,can_pin:0,can_pin_globally:0,can_unhide:0};return e.forEach((function(e){e.is_unapproved&&e.acl.can_approve>t.can_approve&&(t.can_approve=e.acl.can_approve),e.acl.can_close>t.can_close&&(t.can_close=e.acl.can_close),e.acl.can_delete>t.can_delete&&(t.can_delete=e.acl.can_delete),e.acl.can_hide>t.can_hide&&(t.can_hide=e.acl.can_hide),e.acl.can_merge>t.can_merge&&(t.can_merge=e.acl.can_merge),e.acl.can_move>t.can_move&&(t.can_move=e.acl.can_move),e.acl.can_pin>t.can_pin&&(t.can_pin=e.acl.can_pin),e.acl.can_pin_globally>t.can_pin_globally&&(t.can_pin_globally=e.acl.can_pin_globally),e.is_hidden&&e.acl.can_unhide>t.can_unhide&&(t.can_unhide=e.acl.can_unhide),t.allow=t.can_approve||t.can_close||t.can_delete||t.can_hide||t.can_merge||t.can_move||t.can_pin||t.can_pin_globally||t.can_unhide})),t}var he=e=>{let{category:t,list:s,message:a}=e;return"all"===s.type?a?(0,i.Z)("li",{className:"list-group-item empty-message"},void 0,(0,i.Z)("p",{className:"lead"},void 0,a),(0,i.Z)("p",{},void 0,gettext("Why not start one yourself?"))):(0,i.Z)("li",{className:"list-group-item empty-message"},void 0,(0,i.Z)("p",{className:"lead"},void 0,t.special_role?gettext("There are no threads on this forum... yet!"):gettext("There are no threads in this category.")),(0,i.Z)("p",{},void 0,gettext("Why not start one yourself?"))):(0,i.Z)("li",{className:"list-group-item empty-message"},void 0,(0,i.Z)("p",{className:"lead"},void 0,gettext("No threads matching specified criteria were found.")))},me=s(50366),ve=s(16768),ge=e=>{let{thread:t}=e;return(0,i.Z)("a",{href:t.url.last_post,className:"threads-list-item-last-activity",title:interpolate(gettext("Last activity: %(timestamp)s"),{timestamp:t.last_post_on.format("LLL")},!0)},void 0,t.last_post_on.fromNow(!0))};const Ze=e=>{let t="threads-list-item-category threads-list-category-label";return e.color&&(t+=" threads-list-category-label-color"),t};var be,fe,_e,Ne,xe=e=>{let{parent:t,category:s}=e;return(0,i.Z)("span",{},void 0,t&&(0,i.Z)("a",{href:t.url.index,className:Ze(t)+" threads-list-item-parent-category",style:t.color?{"--label-color":t.color}:null,title:t.short_name?t.name:null},void 0,t.short_name||t.name),(0,i.Z)("a",{href:s.url.index,className:Ze(s),style:s.color?{"--label-color":s.color}:null,title:s.short_name?s.name:null},void 0,s.short_name||s.name))},ye=e=>{let{checked:t,disabled:s,thread:a}=e;return(0,i.Z)("button",{className:"btn btn-default btn-icon",type:"button",disabled:s,onClick:()=>se.Z.dispatch(K.wc(a.id))},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,t?"check_box":"check_box_outline_blank"))},we=e=>{let{thread:t}=e,s="threads-list-icon";return t.is_read||(s+=" threads-list-icon-new"),(0,i.Z)("a",{title:t.is_read?gettext("No new posts"):gettext("New posts"),href:t.is_read?t.url.last_post:t.url.new_post,className:s},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,t.is_read?"chat_bubble_outline":"chat_bubble"))},ke=s(19605),Ce=e=>{let{thread:t}=e;return t.last_poster?(0,i.Z)("a",{href:t.url.last_poster,className:"threads-list-item-last-poster",title:interpolate(gettext("Last post by: %(poster)s"),{poster:t.last_poster.username},!0)},void 0,(0,i.Z)(ke.ZP,{size:32,user:t.last_poster})):(0,i.Z)("span",{className:"threads-list-item-last-poster",title:interpolate(gettext("Last post by: %(poster)s"),{poster:t.last_poster_name},!0)},void 0,be||(be=(0,i.Z)(ke.ZP,{size:32})))};const Se={unsubscribe:null,notify:!1,email:!0};class Ee extends r().Component{constructor(e){super(e),(0,o.Z)(this,"update",(e=>{const{thread:t}=this.props;this.setState({loading:!0}),se.Z.dispatch((0,Q.r$)(t,{subscription:Se[e]})),X.Z.patch(t.api.index,[{op:"replace",path:"subscription",value:e}]).then((()=>{}),(e=>{se.Z.dispatch((0,Q.r$)(t,{subscription:Se[t.subscription]})),te.Z.apiError(e)})).then((()=>this.setState({loading:!1})))})),(0,o.Z)(this,"render",(()=>{const{loading:e}=this.state,{disabled:t,thread:s}=this.props;return(0,i.Z)("ul",{className:"dropdown-menu dropdown-menu-right"},void 0,(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn-link",disabled:t||e||null===s.subscription,onClick:()=>this.update("unsubscribe")},void 0,fe||(fe=(0,i.Z)("span",{className:"material-icon"},void 0,"star_border")),gettext("Unsubscribe"))),(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn-link",disabled:t||e||!1===s.subscription,onClick:()=>this.update("notify")},void 0,_e||(_e=(0,i.Z)("span",{className:"material-icon"},void 0,"star_half")),gettext("Subscribe with alert"))),(0,i.Z)("li",{},void 0,(0,i.Z)("button",{className:"btn-link",disabled:t||e||!0===s.subscription,onClick:()=>this.update("email")},void 0,Ne||(Ne=(0,i.Z)("span",{className:"material-icon"},void 0,"star")),gettext("Subscribe with e-mail"))))})),this.state={loading:!1}}}var Le=Ee;var Te,Pe,Oe,Re,Ae,Ie,De,je,ze,Ue,Me,Be=e=>{let{disabled:t,thread:s}=e;return(0,i.Z)("div",{className:"dropdown"},void 0,(0,i.Z)("button",{className:"btn btn-default btn-icon",type:"button",title:(a=s.subscription,!0===a?gettext("Subscribed to e-mails"):!1===a?gettext("Subscribed to alerts"):gettext("Not subscribed")),disabled:t,"data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,(e=>!0===e?"star":!1===e?"star_half":"star_border")(s.subscription))),(0,i.Z)(Le,{disabled:t,thread:s}));var a},qe=e=>{let{activeCategory:t,categories:s,showOptions:a,showSubscription:o,thread:n,isBusy:r,isSelected:l}=e,d=null,c=null;t.id!==n.category&&(c=s[n.category],c.parent&&c.parent!==t.id&&s[c.parent]&&!s[c.parent].special_role&&(d=s[c.parent]));const p=n.is_closed||n.is_hidden||n.is_unapproved||n.weight>0||n.best_answer||n.has_poll||n.has_unapproved_posts,u=!!a&&n.is_new;return(0,i.Z)("li",{className:"list-group-item threads-list-item"+(r?" threads-list-item-is-busy":"")},void 0,(0,i.Z)("div",{className:"threads-list-item-top-row"},void 0,a&&(0,i.Z)("div",{className:"threads-list-item-col-icon"},void 0,(0,i.Z)(we,{thread:n})),(0,i.Z)("div",{className:"threads-list-item-col-title"},void 0,(0,i.Z)("a",{href:n.url.index,className:"threads-list-item-title"},void 0,n.title),(0,i.Z)("a",{href:u?n.url.new_post:n.url.index,className:"threads-list-item-title-sm"+(u?" threads-list-item-title-new":"")},void 0,n.title)),a&&n.moderation.length>0&&(0,i.Z)("div",{className:"threads-list-item-col-checkbox-sm"},void 0,(0,i.Z)(ye,{checked:l,disabled:r,thread:n}))),(0,i.Z)("div",{className:"threads-list-item-bottom-row"},void 0,p&&(0,i.Z)("div",{className:"threads-list-item-col-flags"},void 0,(0,i.Z)(me.Z,{thread:n})),!!c&&(0,i.Z)("div",{className:"threads-list-item-col-category"},void 0,(0,i.Z)(xe,{parent:d,category:c})),Te||(Te=(0,i.Z)("div",{className:"threads-list-item-col-spacer-xs"})),(0,i.Z)("div",{className:"threads-list-item-col-replies"},void 0,(0,i.Z)(ve.Z,{thread:n})),(0,i.Z)("div",{className:"threads-list-item-col-last-poster"},void 0,(0,i.Z)(Ce,{thread:n})),(0,i.Z)("div",{className:"threads-list-item-col-last-activity"},void 0,(0,i.Z)(ge,{thread:n})),a&&o&&(0,i.Z)("div",{className:"threads-list-item-col-subscription"},void 0,(0,i.Z)(Be,{disabled:r,thread:n})),a&&n.moderation.length>0&&(0,i.Z)("div",{className:"threads-list-item-col-checkbox"},void 0,(0,i.Z)(ye,{checked:l,disabled:r,thread:n}))))},He=e=>{let{width:t}=e;return(0,i.Z)("span",{className:"ui-preview-text",style:{width:t+"px"}},void 0," ")},Fe=e=>{let{showOptions:t}=e;return(0,i.Z)("div",{className:"threads-list threads-list-loader"},void 0,(0,i.Z)("ul",{className:"list-group"},void 0,(0,i.Z)("li",{className:"list-group-item threads-list-item"},void 0,(0,i.Z)("div",{className:"threads-list-item-top-row"},void 0,t&&(Pe||(Pe=(0,i.Z)("div",{className:"threads-list-item-col-icon"},void 0,(0,i.Z)("span",{className:"threads-list-icon ui-preview-img"})))),Oe||(Oe=(0,i.Z)("div",{className:"threads-list-item-col-title"},void 0,(0,i.Z)("span",{className:"threads-list-item-title"},void 0,(0,i.Z)(He,{width:"90"})," ",(0,i.Z)(He,{width:"40"})," ",(0,i.Z)(He,{width:"120"})),(0,i.Z)("span",{className:"threads-list-item-title-sm"},void 0,(0,i.Z)(He,{width:"90"})," ",(0,i.Z)(He,{width:"40"})," ",(0,i.Z)(He,{width:"120"}))))),Re||(Re=(0,i.Z)("div",{className:"threads-list-item-bottom-row"},void 0,(0,i.Z)("div",{className:"threads-list-item-col-category"},void 0,(0,i.Z)(He,{width:"70"})),(0,i.Z)("div",{className:"threads-list-item-col-replies"},void 0,(0,i.Z)(He,{width:"50"})),(0,i.Z)("div",{className:"threads-list-item-col-last-poster"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-poster"},void 0,(0,i.Z)(ke.ZP,{size:32}))),(0,i.Z)("div",{className:"threads-list-item-col-last-activity"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-activity"},void 0,(0,i.Z)(He,{width:"50"})))))),(0,i.Z)("li",{className:"list-group-item threads-list-item"},void 0,(0,i.Z)("div",{className:"threads-list-item-top-row"},void 0,t&&(Ae||(Ae=(0,i.Z)("div",{className:"threads-list-item-col-icon"},void 0,(0,i.Z)("span",{className:"threads-list-icon ui-preview-img"})))),Ie||(Ie=(0,i.Z)("div",{className:"threads-list-item-col-title"},void 0,(0,i.Z)("span",{className:"threads-list-item-title"},void 0,(0,i.Z)(He,{width:"120"})," ",(0,i.Z)(He,{width:"30"})," ",(0,i.Z)(He,{width:"60"})),(0,i.Z)("span",{className:"threads-list-item-title-sm"},void 0,(0,i.Z)(He,{width:"120"})," ",(0,i.Z)(He,{width:"30"})," ",(0,i.Z)(He,{width:"60"}))))),De||(De=(0,i.Z)("div",{className:"threads-list-item-bottom-row"},void 0,(0,i.Z)("div",{className:"threads-list-item-col-category"},void 0,(0,i.Z)(He,{width:"55"})),(0,i.Z)("div",{className:"threads-list-item-col-replies"},void 0,(0,i.Z)(He,{width:"60"})),(0,i.Z)("div",{className:"threads-list-item-col-last-poster"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-poster"},void 0,(0,i.Z)(ke.ZP,{size:32}))),(0,i.Z)("div",{className:"threads-list-item-col-last-activity"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-activity"},void 0,(0,i.Z)(He,{width:"70"})))))),(0,i.Z)("li",{className:"list-group-item threads-list-item"},void 0,(0,i.Z)("div",{className:"threads-list-item-top-row"},void 0,t&&(je||(je=(0,i.Z)("div",{className:"threads-list-item-col-icon"},void 0,(0,i.Z)("span",{className:"threads-list-icon ui-preview-img"})))),ze||(ze=(0,i.Z)("div",{className:"threads-list-item-col-title"},void 0,(0,i.Z)("span",{className:"threads-list-item-title"},void 0,(0,i.Z)(He,{width:"40"})," ",(0,i.Z)(He,{width:"120"})," ",(0,i.Z)(He,{width:"80"})),(0,i.Z)("span",{className:"threads-list-item-title-sm"},void 0,(0,i.Z)(He,{width:"40"})," ",(0,i.Z)(He,{width:"120"})," ",(0,i.Z)(He,{width:"80"}))))),Ue||(Ue=(0,i.Z)("div",{className:"threads-list-item-bottom-row"},void 0,(0,i.Z)("div",{className:"threads-list-item-col-category"},void 0,(0,i.Z)(He,{width:"75"})),(0,i.Z)("div",{className:"threads-list-item-col-replies"},void 0,(0,i.Z)(He,{width:"40"})),(0,i.Z)("div",{className:"threads-list-item-col-last-poster"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-poster"},void 0,(0,i.Z)(ke.ZP,{size:32}))),(0,i.Z)("div",{className:"threads-list-item-col-last-activity"},void 0,(0,i.Z)("span",{className:"threads-list-item-last-activity"},void 0,(0,i.Z)(He,{width:"60"}))))))))},Ye=e=>{let{threads:t,onClick:s}=e;return(0,i.Z)("li",{className:"list-group-item threads-list-update-prompt"},void 0,(0,i.Z)("button",{type:"button",className:"btn btn-block threads-list-update-prompt-btn",onClick:s},void 0,Me||(Me=(0,i.Z)("span",{className:"material-icon"},void 0,"cached")),(0,i.Z)("span",{className:"threads-list-update-prompt-message"},void 0,interpolate(ngettext("There is %(threads)s new or updated thread. Click here to show it.","There are %(threads)s new or updated threads. Click here to show them.",t),{threads:t},!0))))},Ve=e=>{let{list:t,categories:s,category:a,threads:o,busyThreads:n,selection:r,isLoaded:l,showOptions:d,updatedThreads:c,applyUpdate:p,emptyMessage:u}=e;return l?(0,i.Z)("div",{className:"threads-list"},void 0,o.length>0?(0,i.Z)("ul",{className:"list-group"},void 0,c>0&&(0,i.Z)(Ye,{threads:c,onClick:p}),o.map((e=>(0,i.Z)(qe,{activeCategory:a,categories:s,thread:e,showOptions:d,showSubscription:d&&"subscribed"===t.type,isBusy:n.indexOf(e.id)>=0,isSelected:r.indexOf(e.id)>=0},e.id)))):(0,i.Z)("ul",{className:"list-group"},void 0,c>0&&(0,i.Z)(Ye,{threads:c,onClick:p}),(0,i.Z)(he,{category:a,list:t,message:u}))):(0,i.Z)(Fe,{showOptions:d})},Ge=s(82125),$e=s(55547),We=s(53328),Qe=s(20370),Ke=s(99755),Je=class extends Ge.Z{constructor(e){super(e),(0,o.Z)(this,"loadMore",(()=>{this.setState({isBusy:!0}),this.loadThreads(this.getCategory(),this.state.next)})),(0,o.Z)(this,"pollResponse",(e=>{this.setState({diff:Object.assign({},e,{results:pe(this.props.threads,e.results)})})})),(0,o.Z)(this,"addThreads",(e=>{se.Z.dispatch((0,Q.R3)(e,this.getSorting()))})),(0,o.Z)(this,"applyDiff",(()=>{this.addThreads(this.state.diff.results),this.setState(Object.assign({},this.state.diff,{moderation:ue(se.Z.getState().threads),diff:{results:[]}}))})),(0,o.Z)(this,"freezeThread",(e=>{this.setState((function(t){return{busyThreads:Qe.ZN(t.busyThreads,e)}}))})),(0,o.Z)(this,"updateThread",(e=>{se.Z.dispatch((0,Q.r$)(e,e,this.getSorting()))})),(0,o.Z)(this,"deleteThread",(e=>{se.Z.dispatch((0,Q.l8)(e))})),this.state={isMounted:!0,isLoaded:!1,isBusy:!1,diff:{results:[]},moderation:[],busyThreads:[],dropdown:!1,subcategories:[],next:0};let t=this.getCategory();W.Z.has("THREADS")?this.initWithPreloadedData(t,W.Z.get("THREADS")):this.initWithoutPreloadedData(t)}getCategory(){return this.props.route.category.special_role?null:this.props.route.category.id}initWithPreloadedData(e,t){this.state=Object.assign(this.state,{moderation:ue(t.results),subcategories:t.subcategories,next:t.next}),this.startPolling(e)}initWithoutPreloadedData(e){this.loadThreads(e)}loadThreads(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;X.Z.get(this.props.options.api,{category:e,list:this.props.route.list.type,start:t||0},"threads").then((s=>{this.state.isMounted&&(0===t?se.Z.dispatch((0,Q.ZB)(s.results)):se.Z.dispatch((0,Q.R3)(s.results,this.getSorting())),this.setState({isLoaded:!0,isBusy:!1,moderation:ue(se.Z.getState().threads),subcategories:s.subcategories,next:s.next}),this.startPolling(e))}),(e=>{te.Z.apiError(e)}))}startPolling(e){$e.Z.start({poll:"threads",url:this.props.options.api,data:{category:e,list:this.props.route.list.type},frequency:12e4,update:this.pollResponse})}componentDidMount(){this.setPageTitle(),W.Z.has("THREADS")&&(se.Z.dispatch((0,Q.ZB)(W.Z.pop("THREADS").results)),this.setState({isLoaded:!0})),se.Z.dispatch(K.YP())}componentWillUnmount(){this.state.isMounted=!1,$e.Z.stop("threads")}getTitle(){return this.props.options.title?this.props.options.title:function(e){return e.category.level?e.category.name:W.Z.get("THREADS_ON_INDEX")?W.Z.get("SETTINGS").index_header?W.Z.get("SETTINGS").index_header:W.Z.get("SETTINGS").forum_name:gettext("Threads")}(this.props.route)}setPageTitle(){this.props.route.category.level||!W.Z.get("THREADS_ON_INDEX")?We.Z.set(function(e){return e.category.level?e.list.path?{title:e.list.longName,parent:e.category.name}:{title:e.category.name}:W.Z.get("THREADS_ON_INDEX")?e.list.path?{title:e.list.longName}:null:e.list.path?{title:e.list.longName,parent:gettext("Threads")}:{title:gettext("Threads")}}(this.props.route)):this.props.options.title?We.Z.set(this.props.options.title):W.Z.get("SETTINGS").index_title?document.title=W.Z.get("SETTINGS").index_title:document.title=W.Z.get("SETTINGS").forum_name}getSorting(){return this.props.route.category.level?p:c}getMoreButton(){return this.state.next?(0,i.Z)("div",{className:"pager-more"},void 0,(0,i.Z)(l.Z,{className:"btn btn-default btn-outline",loading:this.state.isBusy||this.state.busyThreads.length,onClick:this.loadMore},void 0,gettext("Show more"))):null}getClassName(){let e="page page-threads";var t;return e+=" page-threads-"+this.props.route.list.type,(t=this.props).route.category.level||!W.Z.get("THREADS_ON_INDEX")||t.options.title||(e+=" page-threads-index"),this.props.route.category.css_class&&(e+=" page-threads-"+this.props.route.category.css_class),e}render(){const e=this.props.route.categories[0],{category:t,list:s}=this.props.route,a=t.special_role;return(0,i.Z)("div",{className:this.getClassName()},void 0,"root_category"==a&&W.Z.get("THREADS_ON_INDEX")&&W.Z.get("SETTINGS").index_header&&(0,i.Z)(Ke.Iv,{header:W.Z.get("SETTINGS").index_header,message:t.description&&(0,i.Z)(Ke.Ql,{message:t.description.html}),styleName:"forum-index"}),"root_category"==a&&!W.Z.get("THREADS_ON_INDEX")&&(0,i.Z)(Ke.Iv,{header:gettext("Threads"),styleName:"threads"}),"private_threads"==a&&(0,i.Z)(Ke.Iv,{header:this.props.options.title,message:this.props.options.pageLead&&(0,i.Z)(Ke.bM,{},void 0,(0,i.Z)("p",{},void 0,this.props.options.pageLead)),styleName:"private-threads"}),!a&&(0,i.Z)(Ke.Iv,{header:t.name,message:t.description&&(0,i.Z)(Ke.Ql,{message:t.description.html}),styleName:t.css_class||"category-threads"}),(0,i.Z)(de,{api:this.props.options.api,root:e,route:this.props.route,user:this.props.user,pageLead:this.props.options.pageLead,threads:this.props.threads,threadsCount:this.state.count,moderation:this.state.moderation,selection:this.props.selection,busyThreads:this.state.busyThreads,addThreads:this.addThreads,startThread:this.props.options.startThread,freezeThread:this.freezeThread,deleteThread:this.deleteThread,updateThread:this.updateThread,isLoaded:this.state.isLoaded,isBusy:this.state.isBusy},void 0,(0,i.Z)(Ve,{category:t,categories:this.props.route.categoriesMap,list:s,selection:this.props.selection,threads:this.props.threads,updatedThreads:this.state.diff.results.length,applyUpdate:this.applyDiff,showOptions:!!this.props.user.id,isLoaded:this.state.isLoaded,busyThreads:this.state.busyThreads,emptyMessage:this.props.options.emptyMessage}),this.getMoreButton()))}};function Xe(e,t){let s=function(e){let t=[{type:"all",path:"",name:gettext("All"),longName:gettext("All threads")}];return e.id&&(t.push({type:"my",path:"my/",name:gettext("My"),longName:gettext("My threads")}),t.push({type:"new",path:"new/",name:gettext("New"),longName:gettext("New threads")}),t.push({type:"unread",path:"unread/",name:gettext("Unread"),longName:gettext("Unread threads")}),t.push({type:"subscribed",path:"subscribed/",name:gettext("Subscribed"),longName:gettext("Subscribed threads")}),e.acl.can_see_unapproved_content_lists&&t.push({type:"unapproved",path:"unapproved/",name:gettext("Unapproved"),longName:gettext("Unapproved content")})),t}(e),i=[],o={};return W.Z.get("CATEGORIES").forEach((function(e){s.forEach((function(n){var r;o[e.id]=e,i.push({path:e.url.index+n.path,component:(0,a.$j)((r=t,function(e){return{options:r,selection:e.selection,threads:e.threads,tick:e.tick.tick,user:e.auth.user}}))(Je),categories:W.Z.get("CATEGORIES"),categoriesMap:o,category:e,lists:s,list:n})}))})),i}var et=s(39633);const tt="misago:private-threads";function st(e){return e.get("CURRENT_LINK").substr(0,tt.length)===tt?{api:e.get("PRIVATE_THREADS_API"),startThread:{mode:"START_PRIVATE",submit:W.Z.get("PRIVATE_THREADS_API")},title:gettext("Private threads"),pageLead:gettext("Private threads are threads which only those that started them and those they have invited may see and participate in."),emptyMessage:gettext("You aren't participating in any private threads.")}:{api:e.get("THREADS_API")}}W.Z.addInitializer({name:"component:threads",initializer:function(e){e.has("THREADS")&&e.has("CATEGORIES")&&(0,et.Z)({paths:Xe(e.get("user"),st(e))})},after:"store"})},47806:function(e,t,s){"use strict";var a=s(37424),i=s(32233),o=s(22928),n=s(57588),r=s.n(n),l=s(19605),d=s(4942),c=s(78657),p=s(53904);function u(e){return e.filter((e=>e.results.count>0)).map((e=>Object.assign({},e,{count:e.results.count,results:e.results.results.slice(0,5)})))}var h=s(87462);const m="HEADER",v="RESULT",g="FOOTER";function Z(e){let{value:t,onChange:s}=e;return(0,o.Z)("input",{"aria-haspopup":"true","aria-expanded":"false","aria-controls":"dropdown-menu dropdown-search-results",autoComplete:"off",className:"form-control",value:t,onChange:s,placeholder:gettext("Search"),role:"combobox",type:"text"})}function b(e){let{children:t,onChange:s,query:a}=e;return(0,o.Z)("ul",{className:"dropdown-menu dropdown-search-results",role:"menu"},void 0,(0,o.Z)("li",{className:"form-group"},void 0,(0,o.Z)(Z,{value:a,onChange:s})),t)}function f(){return(0,o.Z)("li",{className:"dropdown-search-message"},void 0,gettext("Search returned no results."))}var _,N=s(37848);function x(e){let{message:t}=e;return _||(_=(0,o.Z)("li",{className:"dropdown-search-loader"},void 0,(0,o.Z)(N.Z,{})))}function y(e){let{provider:t,query:s}=e;const a=t.url+"?q="+encodeURI(s),i=ngettext('See full "%(provider)s" results page with %(count)s result.','See full "%(provider)s" results page with %(count)s results.',t.count);return(0,o.Z)("li",{className:"dropdown-search-footer"},void 0,(0,o.Z)("a",{href:a},void 0,interpolate(i,{count:t.count,provider:t.name},!0)))}function w(e){let{provider:t}=e;return(0,o.Z)("li",{className:"dropdown-search-header"},void 0,t.name)}var k,C,S,E=s(30381),L=s.n(E),T=s(19755);function P(e){let{result:t}=e;const{poster:s,thread:a}=t,i=gettext("Posted by %(poster)s on %(posted_on)s in %(category)s.");return(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:t.url.index,className:"dropdown-search-thread"},void 0,(0,o.Z)("h5",{},void 0,a.title),(0,o.Z)("small",{className:"dropdown-search-post-content"},void 0,T(t.content).text()),(0,o.Z)("small",{className:"dropdown-search-post-footer"},void 0,interpolate(i,{category:t.category.name,posted_on:L()(t.posted_on).format("LL"),poster:t.poster_name},!0))))}function O(e){let{result:t}=e;const{rank:s}=t,a=gettext("%(title)s, joined on %(joined_on)s"),i=t.title||s.title||s.name;return(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:t.url,className:"dropdown-search-user"},void 0,(0,o.Z)("div",{className:"media"},void 0,(0,o.Z)("div",{className:"media-left"},void 0,(0,o.Z)(l.ZP,{size:38,user:t})),(0,o.Z)("div",{className:"media-body"},void 0,(0,o.Z)("h5",{className:"media-heading"},void 0,t.username),(0,o.Z)("small",{},void 0,interpolate(a,{title:i,joined_on:L()(t.joined_on).format("LL")},!0))))))}function R(e){let{provider:t,result:s}=e;return"threads"===t.id?(0,o.Z)(P,{result:s}):(0,o.Z)(O,{result:s})}function A(e){let{provider:t,result:s,type:a,query:i}=e;return a===m?(0,o.Z)(w,{provider:t}):a===g?(0,o.Z)(y,{provider:t,query:i}):(0,o.Z)(R,{provider:t,result:s})}function I(e,t){const s=e.results.length;for(var a=0;a{const{type:t,provider:s,result:a}=e;return t===v?r().createElement(A,(0,h.Z)({key:[s.id,t,a.id].join("_")},e)):r().createElement(A,(0,h.Z)({key:[s.id,t].join("_"),query:i},e))})))}return t?(0,o.Z)(b,{onChange:s,query:i},void 0,k||(k=(0,o.Z)(x,{}))):(0,o.Z)(b,{onChange:s,query:i},void 0,C||(C=(0,o.Z)(f,{})))}var j=class extends r().Component{constructor(){super(),(0,d.Z)(this,"onToggle",(e=>{this.setState(((e,t)=>(e.isOpen||window.setTimeout((()=>{this.container.querySelector("input").focus()}),100),{isOpen:!e.isOpen})))})),(0,d.Z)(this,"onDocumentMouseDown",(e=>{let t=!0,s=e.target;for(;null!==s&&s!==document;){if(s===this.container)return void(t=!1);s=s.parentNode}t&&this.setState({isOpen:!1})})),(0,d.Z)(this,"onEscape",(e=>{"Escape"===e.key&&this.setState({isOpen:!1})})),(0,d.Z)(this,"onChange",(e=>{const t=e.target.value;this.setState({query:t}),this.loadResults(t.trim())})),this.state={isLoading:!1,isOpen:!1,query:"",results:[]},this.intervalId=null}componentDidMount(){document.addEventListener("mousedown",this.onDocumentMouseDown),document.addEventListener("keydown",this.onEscape)}componentWillUnmount(){document.removeEventListener("mousedown",this.onDocumentMouseDown),document.removeEventListener("keydown",this.onEscape)}loadResults(e){if(!e.length)return;const t=300+300*Math.random();this.intervalId&&window.clearTimeout(this.intervalId),this.setState({isLoading:!0}),this.intervalId=window.setTimeout((()=>{c.Z.get(i.Z.get("SEARCH_API"),{q:e}).then((e=>{this.setState({intervalId:null,isLoading:!1,results:u(e)})}),(e=>{p.Z.apiError(e),this.setState({intervalId:null,isLoading:!1,results:[]})}))}),t)}render(){let e="navbar-search dropdown";return this.state.isOpen&&(e+=" open"),r().createElement("div",{className:e,ref:e=>this.container=e},(0,o.Z)("a",{"aria-haspopup":"true","aria-expanded":"false",className:"navbar-icon","data-toggle":"dropdown",href:i.Z.get("SEARCH_URL"),onClick:this.onToggle},void 0,S||(S=(0,o.Z)("i",{className:"material-icon"},void 0,"search"))),(0,o.Z)(D,{isLoading:this.state.isLoading,onChange:this.onChange,results:this.state.results,query:this.state.query}))}},z=s(82211),U=s(43345),M=s(96359),B=s(59940);const q=["progress-bar-danger","progress-bar-warning","progress-bar-warning","progress-bar-primary","progress-bar-success"],H=[gettext("Entered password is very weak."),gettext("Entered password is weak."),gettext("Entered password is average."),gettext("Entered password is strong."),gettext("Entered password is very strong.")];var F,Y,V,G=class extends r().Component{constructor(e){super(e),this._score=0,this._password=null,this._inputs=[],this.state={loaded:!1}}componentDidMount(){B.Z.load().then((()=>{this.setState({loaded:!0})}))}getScore(e,t){let s=!1;return e!==this._password&&(s=!0),t.length!==this._inputs.length?s=!0:t.map(((e,t)=>{e.trim()!==this._inputs[t]&&(s=!0)})),s&&(this._score=B.Z.scorePassword(e,t),this._password=e,this._inputs=t.map((function(e){return e.trim()}))),this._score}render(){if(!this.state.loaded)return null;let e=this.getScore(this.props.password,this.props.inputs);return(0,o.Z)("div",{className:"help-block password-strength"},void 0,(0,o.Z)("div",{className:"progress"},void 0,(0,o.Z)("div",{className:"progress-bar "+q[e],style:{width:20+20*e+"%"},role:"progress-bar","aria-valuenow":e,"aria-valuemin":"0","aria-valuemax":"4"},void 0,(0,o.Z)("span",{className:"sr-only"},void 0,H[e]))),(0,o.Z)("p",{className:"text-small"},void 0,H[e]))}},$=s(26106),W=s(47235),Q=s(98274),K=s(93825),J=s(59801),X=s(93051),ee=s(55210);class te extends U.Z{constructor(e){super(e),(0,d.Z)(this,"handlePrivacyPolicyChange",(e=>{const t=e.target.value;this.handleToggleAgreement("privacyPolicy",t)})),(0,d.Z)(this,"handleTermsOfServiceChange",(e=>{const t=e.target.value;this.handleToggleAgreement("termsOfService",t)})),(0,d.Z)(this,"handleToggleAgreement",((e,t)=>{this.setState(((s,a)=>{if(null===s[e])return{errors:{...s.errors,[e]:null},[e]:t};const i=this.state.validators[e][0];return{errors:{...s.errors,[e]:[i(null)]},[e]:null}}))}));const{username:t,password:s}=this.props.criteria;let a=0;s.forEach((e=>{"MinimumLengthValidator"===e.name&&(a=e.min_length)}));const o={username:[ee.lG(),ee.HR(t.min_length),ee.gS(t.max_length)],email:[ee.Do()],password:[ee.Vb(a)],captcha:K.ZP.validator()};i.Z.get("TERMS_OF_SERVICE_ID")&&(o.termsOfService=[ee.fT()]),i.Z.get("PRIVACY_POLICY_ID")&&(o.privacyPolicy=[ee.jA()]),this.state={isLoading:!1,username:"",email:"",password:"",captcha:"",termsOfService:null,privacyPolicy:null,validators:o,errors:{}}}clean(){return!!this.isValid()||(p.Z.error(gettext("Form contains errors.")),this.setState({errors:this.validate()}),!1)}send(){return c.Z.post(i.Z.get("USERS_API"),{username:this.state.username,email:this.state.email,password:this.state.password,captcha:this.state.captcha,terms_of_service:this.state.termsOfService,privacy_policy:this.state.privacyPolicy})}handleSuccess(e){this.props.callback(e)}handleError(e){400===e.status?(this.setState({errors:Object.assign({},this.state.errors,e)}),e.__all__&&e.__all__.length>0?p.Z.error(e.__all__[0]):p.Z.error(gettext("Form contains errors."))):403===e.status&&e.ban?((0,X.Z)(e.ban),J.Z.hide()):p.Z.apiError(e)}render(){return(0,o.Z)("div",{className:"modal-dialog modal-register",role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,F||(F=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Register"))),(0,o.Z)("form",{onSubmit:this.handleSubmit},void 0,(0,o.Z)("input",{type:"type",style:{display:"none"}}),(0,o.Z)("input",{type:"password",style:{display:"none"}}),(0,o.Z)("div",{className:"modal-body"},void 0,(0,o.Z)(W.Z,{buttonClassName:"col-xs-12 col-sm-6",buttonLabel:gettext("Join with %(site)s"),formLabel:gettext("Or create forum account:")}),(0,o.Z)(M.Z,{label:gettext("Username"),for:"id_username",validation:this.state.errors.username},void 0,(0,o.Z)("input",{type:"text",id:"id_username",className:"form-control","aria-describedby":"id_username_status",disabled:this.state.isLoading,onChange:this.bindInput("username"),value:this.state.username})),(0,o.Z)(M.Z,{label:gettext("E-mail"),for:"id_email",validation:this.state.errors.email},void 0,(0,o.Z)("input",{type:"text",id:"id_email",className:"form-control","aria-describedby":"id_email_status",disabled:this.state.isLoading,onChange:this.bindInput("email"),value:this.state.email})),(0,o.Z)(M.Z,{label:gettext("Password"),for:"id_password",validation:this.state.errors.password,extra:(0,o.Z)(G,{password:this.state.password,inputs:[this.state.username,this.state.email]})},void 0,(0,o.Z)("input",{type:"password",id:"id_password",className:"form-control","aria-describedby":"id_password_status",disabled:this.state.isLoading,onChange:this.bindInput("password"),value:this.state.password})),K.ZP.component({form:this}),(0,o.Z)($.Z,{errors:this.state.errors,privacyPolicy:this.state.privacyPolicy,termsOfService:this.state.termsOfService,onPrivacyPolicyChange:this.handlePrivacyPolicyChange,onTermsOfServiceChange:this.handleTermsOfServiceChange})),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("button",{className:"btn btn-default","data-dismiss":"modal",disabled:this.state.isLoading,type:"button"},void 0,gettext("Cancel")),(0,o.Z)(z.Z,{className:"btn-primary",loading:this.state.isLoading},void 0,gettext("Register account"))))))}}class se extends r().Component{getLead(){return"user"===this.props.activation?gettext("%(username)s, your account has been created but you need to activate it before you will be able to sign in."):"admin"===this.props.activation?gettext("%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in."):void 0}getSubscript(){return"user"===this.props.activation?gettext("We have sent an e-mail to %(email)s with link that you have to click to activate your account."):"admin"===this.props.activation?gettext("We will send an e-mail to %(email)s when this takes place."):void 0}render(){return(0,o.Z)("div",{className:"modal-dialog modal-message modal-register",role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Y||(Y=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Registration complete"))),(0,o.Z)("div",{className:"modal-body"},void 0,V||(V=(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,"info_outline"))),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,interpolate(this.getLead(),{username:this.props.username},!0)),(0,o.Z)("p",{},void 0,interpolate(this.getSubscript(),{email:this.props.email},!0)),(0,o.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))))}}var ae,ie,oe,ne,re,le=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"completeRegistration",(e=>{"active"===e.activation?(J.Z.hide(),Q.Z.signIn(e)):this.setState({complete:e})})),this.state={complete:!1}}render(){return this.state.complete?(0,o.Z)(se,{activation:this.state.complete.activation,email:this.state.complete.email,username:this.state.complete.username}):r().createElement(te,(0,h.Z)({callback:this.completeRegistration},this.props))}},de=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"showRegisterForm",(()=>{"closed"===misago.get("SETTINGS").account_activation?p.Z.info(gettext("New registrations are currently disabled.")):this.state.isLoaded?J.Z.show((0,o.Z)(le,{criteria:this.state.criteria})):(this.setState({isLoading:!0}),Promise.all([K.ZP.load(),c.Z.get(misago.get("AUTH_CRITERIA_API"))]).then((e=>{this.setState({isLoading:!1,isLoaded:!0,criteria:e[1]}),J.Z.show((0,o.Z)(le,{criteria:e[1]}))}),(()=>{this.setState({isLoading:!1}),p.Z.error(gettext("Registration is currently unavailable due to an error."))})))})),this.state={isLoading:!1,isLoaded:!1,criteria:null}}getClassName(){return this.props.className+(this.state.isLoading?" btn-loading":"")}render(){return(0,o.Z)("button",{className:"btn "+this.getClassName(),disabled:this.state.isLoading,onClick:this.showRegisterForm,type:"button"},void 0,gettext("Register"),this.state.isLoading?ae||(ae=(0,o.Z)(N.Z,{})):null)}},ce=s(14467),pe=s(8621);class ue extends r().Component{showSignInModal(){J.Z.show(ce.Z)}componentDidMount(){"login"===new URLSearchParams(window.location.search).get("modal")&&window.setTimeout(this.showSignInModal,500)}render(){const e=i.Z.get("SETTINGS").DELEGATE_AUTH;return(0,o.Z)("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},void 0,(0,o.Z)("li",{className:"guest-preview"},void 0,(0,o.Z)("h4",{},void 0,gettext("You are browsing as guest.")),(0,o.Z)("p",{},void 0,gettext("Sign in or register to start and participate in discussions.")),e?(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-xs-12"},void 0,(0,o.Z)("a",{className:"btn btn-default btn-sign-in btn-block",href:i.Z.get("SETTINGS").LOGIN_URL},void 0,gettext("Sign in")))):(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-xs-6"},void 0,(0,o.Z)("button",{className:"btn btn-default btn-sign-in btn-block",onClick:this.showSignInModal,type:"button"},void 0,gettext("Sign in"))),(0,o.Z)("div",{className:"col-xs-6"},void 0,(0,o.Z)(de,{className:"btn-primary btn-register btn-block"},void 0,gettext("Register"))))))}}class he extends ue{render(){return i.Z.get("SETTINGS").DELEGATE_AUTH?(0,o.Z)("div",{className:"nav nav-guest"},void 0,(0,o.Z)("a",{className:"btn navbar-btn btn-default btn-sign-in",href:i.Z.get("SETTINGS").LOGIN_URL},void 0,gettext("Sign in")),ie||(ie=(0,o.Z)("div",{className:"navbar-left"},void 0,(0,o.Z)(j,{})))):(0,o.Z)("div",{className:"nav nav-guest"},void 0,(0,o.Z)("button",{className:"btn navbar-btn btn-default btn-sign-in",onClick:this.showSignInModal,type:"button"},void 0,gettext("Sign in")),(0,o.Z)(de,{className:"navbar-btn btn-primary btn-register"},void 0,gettext("Register")),oe||(oe=(0,o.Z)("div",{className:"navbar-left"},void 0,(0,o.Z)(j,{}))))}}class me extends r().Component{showGuestMenu(){pe.Z.show(ue)}render(){return(0,o.Z)("button",{type:"button",onClick:this.showGuestMenu},void 0,ne||(ne=(0,o.Z)(l.ZP,{size:"64"})))}}var ve,ge,Ze,be=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"setGravatar",(()=>{this.callApi("gravatar")})),(0,d.Z)(this,"setGenerated",(()=>{this.callApi("generated")})),this.state={isLoading:!1}}callApi(e){if(this.state.isLoading)return!1;this.setState({isLoading:!0}),c.Z.post(this.props.user.api.avatar,{avatar:e}).then((e=>{this.setState({isLoading:!1}),p.Z.success(e.detail),this.props.onComplete(e)}),(e=>{400===e.status?(p.Z.error(e.detail),this.setState({isLoading:!1})):this.props.showError(e)}))}getGravatarButton(){return this.props.options.gravatar?(0,o.Z)(z.Z,{onClick:this.setGravatar,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-gravatar"},void 0,gettext("Download my Gravatar")):null}getCropButton(){return this.props.options.crop_src?(0,o.Z)(z.Z,{className:"btn-default btn-block btn-avatar-crop",disabled:this.state.isLoading,onClick:this.props.showCrop},void 0,gettext("Re-crop uploaded image")):null}getUploadButton(){return this.props.options.upload?(0,o.Z)(z.Z,{className:"btn-default btn-block btn-avatar-upload",disabled:this.state.isLoading,onClick:this.props.showUpload},void 0,gettext("Upload new image")):null}getGalleryButton(){return this.props.options.galleries?(0,o.Z)(z.Z,{className:"btn-default btn-block btn-avatar-gallery",disabled:this.state.isLoading,onClick:this.props.showGallery},void 0,gettext("Pick avatar from gallery")):null}getAvatarPreview(){let e={id:this.props.user.id,avatars:this.props.options.avatars};return this.state.isLoading?(0,o.Z)("div",{className:"avatar-preview preview-loading"},void 0,(0,o.Z)(l.ZP,{size:"200",user:e}),re||(re=(0,o.Z)(N.Z,{}))):(0,o.Z)("div",{className:"avatar-preview"},void 0,(0,o.Z)(l.ZP,{size:"200",user:e}))}render(){return(0,o.Z)("div",{className:"modal-body modal-avatar-index"},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-5"},void 0,this.getAvatarPreview()),(0,o.Z)("div",{className:"col-md-7"},void 0,this.getGravatarButton(),(0,o.Z)(z.Z,{onClick:this.setGenerated,disabled:this.state.isLoading,className:"btn-default btn-block btn-avatar-generate"},void 0,gettext("Generate my individual avatar")),this.getCropButton(),this.getUploadButton(),this.getGalleryButton())))}},fe=s(19755),_e=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"cropAvatar",(()=>{if(this.state.isLoading)return!1;this.setState({isLoading:!0});let e=this.props.upload?"crop_tmp":"crop_src",t=fe(".crop-form");const s=t.cropit("exportZoom"),a=t.cropit("offset");c.Z.post(this.props.user.api.avatar,{avatar:e,crop:{offset:{x:a.x*s,y:a.y*s},zoom:t.cropit("zoom")*s}}).then((e=>{this.props.onComplete(e),p.Z.success(e.detail)}),(e=>{400===e.status?(p.Z.error(e.detail),this.setState({isLoading:!1})):this.props.showError(e)}))})),this.state={isLoading:!1,deviceRatio:1}}getAvatarSize(){return this.props.upload?this.props.options.crop_tmp.size:this.props.options.crop_src.size}getImagePath(){return this.props.upload?this.props.dataUrl:this.props.options.crop_src.url}componentDidMount(){let e=fe(".crop-form"),t=this.getAvatarSize();const s=e.width();for(;s{if(this.props.upload){let t=e.cropit("zoom"),s=e.cropit("imageSize");if(s.width>s.height){let a=(s.width*t-this.getAvatarSize())/-2;e.cropit("offset",{x:a,y:0})}else if(s.width{document.getElementById("avatar-hidden-upload").click()})),(0,d.Z)(this,"uploadFile",(()=>{let e=document.getElementById("avatar-hidden-upload").files[0];if(!e)return;let t=this.validateFile(e);if(t)return void p.Z.error(t);this.setState({image:e,preview:URL.createObjectURL(e),progress:0});let s=new FormData;s.append("avatar","upload"),s.append("image",e),c.Z.upload(this.props.user.api.avatar,s,(e=>{this.setState({progress:e})})).then((e=>{this.setState({options:e,uploaded:e.detail}),p.Z.info(gettext("Your image has been uploaded and you may now crop it."))}),(e=>{400===e.status||413===e.status?(p.Z.error(e.detail),this.setState({isLoading:!1,image:null,progress:0})):this.props.showError(e)}))})),this.state={image:null,preview:null,progress:0,uploaded:null,dataUrl:null}}validateFile(e){if(e.size>this.props.options.upload.limit)return interpolate(gettext("Selected file is too big. (%(filesize)s)"),{filesize:(0,Ne.Z)(e.size)},!0);let t=gettext("Selected file type is not supported.");if(-1===this.props.options.upload.allowed_mime_types.indexOf(e.type))return t;let s=!1,a=e.name.toLowerCase();return this.props.options.upload.allowed_extensions.map((function(e){a.substr(-1*e.length)===e&&(s=!0)})),!s&&t}getUploadRequirements(e){let t=e.allowed_extensions.map((function(e){return e.substr(1)}));return interpolate(gettext("%(files)s files smaller than %(limit)s"),{files:t.join(", "),limit:(0,Ne.Z)(e.limit)},!0)}getUploadButton(){return(0,o.Z)("div",{className:"modal-body modal-avatar-upload"},void 0,(0,o.Z)(z.Z,{className:"btn-pick-file",onClick:this.pickFile},void 0,ge||(ge=(0,o.Z)("div",{className:"material-icon"},void 0,"input")),gettext("Select file")),(0,o.Z)("p",{className:"text-muted"},void 0,this.getUploadRequirements(this.props.options.upload)))}getUploadProgressLabel(){return interpolate(gettext("%(progress)s % complete"),{progress:this.state.progress},!0)}getUploadProgress(){return(0,o.Z)("div",{className:"modal-body modal-avatar-upload"},void 0,(0,o.Z)("div",{className:"upload-progress"},void 0,(0,o.Z)("img",{src:this.state.preview}),(0,o.Z)("div",{className:"progress"},void 0,(0,o.Z)("div",{className:"progress-bar",role:"progressbar","aria-valuenow":"{this.state.progress}","aria-valuemin":"0","aria-valuemax":"100",style:{width:this.state.progress+"%"}},void 0,(0,o.Z)("span",{className:"sr-only"},void 0,this.getUploadProgressLabel())))))}renderUpload(){return(0,o.Z)("div",{},void 0,(0,o.Z)("input",{type:"file",id:"avatar-hidden-upload",className:"hidden-file-upload",onChange:this.uploadFile}),this.state.image?this.getUploadProgress():this.getUploadButton(),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)(z.Z,{onClick:this.props.showIndex,disabled:!!this.state.image,className:"btn-default btn-block"},void 0,gettext("Cancel")))))}renderCrop(){return(0,o.Z)(_e,{options:this.state.options,user:this.props.user,upload:this.state.uploaded,dataUrl:this.state.preview,onComplete:this.props.onComplete,showError:this.props.showError,showIndex:this.props.showIndex})}render(){return this.state.uploaded?this.renderCrop():this.renderUpload()}},ye=s(69130);class we extends r().Component{constructor(){super(...arguments),(0,d.Z)(this,"select",(()=>{this.props.select(this.props.id)}))}getClassName(){return this.props.selection===this.props.id?this.props.disabled?"btn btn-avatar btn-disabled avatar-selected":"btn btn-avatar avatar-selected":this.props.disabled?"btn btn-avatar btn-disabled":"btn btn-avatar"}render(){return(0,o.Z)("button",{type:"button",className:this.getClassName(),disabled:this.props.disabled,onClick:this.select},void 0,(0,o.Z)("img",{src:this.props.url}))}}class ke extends r().Component{render(){return(0,o.Z)("div",{className:"avatars-gallery"},void 0,(0,o.Z)("h3",{},void 0,this.props.name),(0,o.Z)("div",{className:"avatars-gallery-images"},void 0,(0,ye.Z)(this.props.images,4,null).map(((e,t)=>(0,o.Z)("div",{className:"row"},t,e.map(((e,t)=>(0,o.Z)("div",{className:"col-xs-3"},t,e?r().createElement(we,(0,h.Z)({disabled:this.props.disabled,select:this.props.select,selection:this.props.selection},e)):Ze||(Ze=(0,o.Z)("div",{className:"blank-avatar"}))))))))))}}var Ce,Se,Ee,Le=class extends r().Component{constructor(e){super(e),(0,d.Z)(this,"select",(e=>{this.setState({selection:e})})),(0,d.Z)(this,"save",(()=>{if(this.state.isLoading)return!1;this.setState({isLoading:!0}),c.Z.post(this.props.user.api.avatar,{avatar:"galleries",image:this.state.selection}).then((e=>{this.setState({isLoading:!1}),p.Z.success(e.detail),this.props.onComplete(e),this.props.showIndex()}),(e=>{400===e.status?(p.Z.error(e.detail),this.setState({isLoading:!1})):this.props.showError(e)}))})),this.state={selection:null,isLoading:!1}}render(){return(0,o.Z)("div",{},void 0,(0,o.Z)("div",{className:"modal-body modal-avatar-gallery"},void 0,this.props.options.galleries.map(((e,t)=>(0,o.Z)(ke,{name:e.name,images:e.images,selection:this.state.selection,disabled:this.state.isLoading,select:this.select},t)))),(0,o.Z)("div",{className:"modal-footer"},void 0,(0,o.Z)("div",{className:"row"},void 0,(0,o.Z)("div",{className:"col-md-6 col-md-offset-3"},void 0,(0,o.Z)(z.Z,{onClick:this.save,loading:this.state.isLoading,disabled:!this.state.selection,className:"btn-primary btn-block"},void 0,this.state.selection?gettext("Save choice"):gettext("Select avatar")),(0,o.Z)(z.Z,{onClick:this.props.showIndex,disabled:this.state.isLoading,className:"btn-default btn-block"},void 0,gettext("Cancel"))))))}},Te=s(3784),Pe=s(6935),Oe=s(90287);class Re extends r().Component{getErrorReason(){return this.props.reason?(0,o.Z)("p",{dangerouslySetInnerHTML:{__html:this.props.reason}}):null}render(){return(0,o.Z)("div",{className:"modal-body"},void 0,Ce||(Ce=(0,o.Z)("div",{className:"message-icon"},void 0,(0,o.Z)("span",{className:"material-icon"},void 0,"remove_circle_outline"))),(0,o.Z)("div",{className:"message-body"},void 0,(0,o.Z)("p",{className:"lead"},void 0,this.props.message),this.getErrorReason(),(0,o.Z)("button",{className:"btn btn-default","data-dismiss":"modal",type:"button"},void 0,gettext("Ok"))))}}var Ae,Ie,De,je,ze,Ue,Me,Be,qe,He,Fe,Ye,Ve,Ge,$e=class extends r().Component{constructor(){super(...arguments),(0,d.Z)(this,"showError",(e=>{this.setState({error:e})})),(0,d.Z)(this,"showIndex",(()=>{this.setState({component:be})})),(0,d.Z)(this,"showUpload",(()=>{this.setState({component:xe})})),(0,d.Z)(this,"showCrop",(()=>{this.setState({component:_e})})),(0,d.Z)(this,"showGallery",(()=>{this.setState({component:Le})})),(0,d.Z)(this,"completeFlow",(e=>{Oe.Z.dispatch((0,Pe.n1)(this.props.user,e.avatars)),this.setState({component:be,options:e})}))}componentDidMount(){c.Z.get(this.props.user.api.avatar).then((e=>{this.setState({component:be,options:e,error:null})}),(e=>{this.showError(e)}))}getBody(){return this.state?this.state.error?(0,o.Z)(Re,{message:this.state.error.detail,reason:this.state.error.reason}):(0,o.Z)(this.state.component,{options:this.state.options,user:this.props.user,onComplete:this.completeFlow,showError:this.showError,showIndex:this.showIndex,showCrop:this.showCrop,showUpload:this.showUpload,showGallery:this.showGallery}):Se||(Se=(0,o.Z)(Te.Z,{}))}getClassName(){return this.state&&this.state.error?"modal-dialog modal-message modal-change-avatar":"modal-dialog modal-change-avatar"}render(){return(0,o.Z)("div",{className:this.getClassName(),role:"document"},void 0,(0,o.Z)("div",{className:"modal-content"},void 0,(0,o.Z)("div",{className:"modal-header"},void 0,(0,o.Z)("button",{type:"button",className:"close","data-dismiss":"modal","aria-label":pgettext("modal","Close")},void 0,Ee||(Ee=(0,o.Z)("span",{"aria-hidden":"true"},void 0,"×"))),(0,o.Z)("h4",{className:"modal-title"},void 0,gettext("Change your avatar"))),this.getBody()))}};function We(e){return{user:e.auth.user}}class Qe extends r().Component{changeAvatar(){J.Z.show((0,a.$j)(We)($e))}render(){const{user:e}=this.props;return(0,o.Z)("ul",{className:"dropdown-menu user-dropdown dropdown-menu-right",role:"menu"},void 0,(0,o.Z)("li",{className:"dropdown-header"},void 0,(0,o.Z)("strong",{},void 0,e.username),(0,o.Z)("div",{className:"row user-stats"},void 0,(0,o.Z)("div",{className:"col-sm-3"},void 0,Ae||(Ae=(0,o.Z)("span",{className:"material-icon"},void 0,"message")),e.posts),(0,o.Z)("div",{className:"col-sm-3"},void 0,Ie||(Ie=(0,o.Z)("span",{className:"material-icon"},void 0,"forum")),e.threads),(0,o.Z)("div",{className:"col-sm-3"},void 0,De||(De=(0,o.Z)("span",{className:"material-icon"},void 0,"favorite")),e.followers),(0,o.Z)("div",{className:"col-sm-3"},void 0,je||(je=(0,o.Z)("span",{className:"material-icon"},void 0,"favorite_outline")),e.following))),ze||(ze=(0,o.Z)("li",{className:"divider"})),(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:e.url},void 0,Ue||(Ue=(0,o.Z)("span",{className:"material-icon"},void 0,"account_circle")),gettext("See your profile"))),(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:i.Z.get("USERCP_URL")},void 0,Me||(Me=(0,o.Z)("span",{className:"material-icon"},void 0,"done_all")),gettext("Change options"))),(0,o.Z)("li",{},void 0,(0,o.Z)("button",{className:"btn-link",onClick:this.changeAvatar,type:"button"},void 0,Be||(Be=(0,o.Z)("span",{className:"material-icon"},void 0,"portrait")),gettext("Change avatar"))),!!e.acl.can_use_private_threads&&(0,o.Z)("li",{},void 0,(0,o.Z)("a",{href:i.Z.get("PRIVATE_THREADS_URL")},void 0,qe||(qe=(0,o.Z)("span",{className:"material-icon"},void 0,"message")),gettext("Private threads"),(0,o.Z)(Ke,{user:e}))),He||(He=(0,o.Z)("li",{className:"divider"})),(0,o.Z)("li",{className:"dropdown-buttons"},void 0,(0,o.Z)("button",{className:"btn btn-default btn-block",onClick:()=>document.getElementById("hidden-logout-form").submit(),type:"button"},void 0,gettext("Log out"))))}}function Ke(e){let{user:t}=e;return t.unread_private_threads?(0,o.Z)("span",{className:"badge"},void 0,t.unread_private_threads):null}function Je(e){let{user:t}=e;return(0,o.Z)("ul",{className:"ul nav navbar-nav nav-user"},void 0,Fe||(Fe=(0,o.Z)("li",{},void 0,(0,o.Z)(j,{}))),(0,o.Z)(Xe,{user:t}),(0,o.Z)("li",{className:"dropdown"},void 0,(0,o.Z)("a",{"aria-haspopup":"true","aria-expanded":"false",className:"dropdown-toggle","data-toggle":"dropdown",href:t.url,role:"button"},void 0,(0,o.Z)(l.ZP,{user:t,size:"64"})),(0,o.Z)(Qe,{user:t})))}function Xe(e){let{user:t}=e;if(!t.acl.can_use_private_threads)return null;let s=null;return s=t.unread_private_threads?gettext("You have unread private threads!"):gettext("Private threads"),(0,o.Z)("li",{},void 0,(0,o.Z)("a",{className:"navbar-icon",href:i.Z.get("PRIVATE_THREADS_URL"),title:s},void 0,Ye||(Ye=(0,o.Z)("span",{className:"material-icon"},void 0,"message")),t.unread_private_threads>0&&(0,o.Z)("span",{className:"badge"},void 0,t.unread_private_threads)))}function et(e){return{user:e.auth.user}}class tt extends r().Component{showUserMenu(){pe.Z.showConnected("user-menu",(0,a.$j)(et)(Qe))}render(){return(0,o.Z)("button",{type:"button",onClick:this.showUserMenu},void 0,(0,o.Z)(l.ZP,{user:this.props.user,size:"50"}))}}class st extends r().Component{render(){return this.props.isAuthenticated?(0,o.Z)(Je,{user:this.props.user}):Ve||(Ve=(0,o.Z)(he,{}))}}class at extends r().Component{render(){return this.props.isAuthenticated?(0,o.Z)(tt,{user:this.props.user}):Ge||(Ge=(0,o.Z)(me,{}))}}function it(e){return e.auth}var ot=s(4869);i.Z.addInitializer({name:"component:user-menu",initializer:function(){(0,ot.Z)((0,a.$j)(it)(st),"user-menu-mount"),(0,ot.Z)((0,a.$j)(it)(at),"user-menu-compact-mount")},after:"store"})},77031:function(e,t,s){"use strict";var a,i=s(22928),o=s(57588),n=s.n(o),r=s(37424),l=s(4942),d=s(59131),c=s(69987),p=s(94417);const u=(e,t)=>{let s=e;return"rank"===t.component?s+=t.slug:s+=t.component,s+"/"};var h,m,v,g,Z=e=>{let{baseUrl:t,page:s,pages:o}=e;return(0,i.Z)("div",{className:"nav-container"},void 0,(0,i.Z)("div",{className:"dropdown hidden-sm hidden-md hidden-lg"},void 0,(0,i.Z)("button",{className:"btn btn-default btn-block btn-outline dropdown-toggle",type:"button","data-toggle":"dropdown","aria-haspopup":"true","aria-expanded":"false"},void 0,a||(a=(0,i.Z)("span",{className:"material-icon"},void 0,"menu")),s.name),(0,i.Z)("ul",{className:"dropdown-menu stick-to-bottom"},void 0,o.map((e=>{const s=u(t,e);return(0,i.Z)("li",{},s,(0,i.Z)(c.rU,{to:s},void 0,e.name))})))),(0,i.Z)("ul",{className:"nav nav-pills hidden-xs",role:"menu"},void 0,o.map((e=>{const s=u(t,e);return(0,i.Z)(p.Z,{path:s},s,(0,i.Z)(c.rU,{to:s},void 0,e.name))}))))},b=class extends n().Component{getEmptyMessage(){return interpolate(gettext("No users have posted any new messages during last %(days)s days."),{days:this.props.trackedPeriod},!0)}render(){return(0,i.Z)("div",{className:"active-posters-list"},void 0,(0,i.Z)(d.Z,{},void 0,(0,i.Z)(Z,{baseUrl:misago.get("USERS_LIST_URL"),page:this.props.page,pages:misago.get("USERS_LISTS")}),(0,i.Z)("p",{className:"lead"},void 0,this.getEmptyMessage())))}},f=s(19605),_=s(44039),N=class extends n().Component{shouldComponentUpdate(){return!1}getClassName(){return this.props.hiddenOnMobile?"list-group-item hidden-xs hidden-sm":"list-group-item"}render(){return(0,i.Z)("li",{className:this.getClassName()},void 0,h||(h=(0,i.Z)("div",{className:"rank-user-avatar"},void 0,(0,i.Z)("span",{},void 0,(0,i.Z)(f.ZP,{size:"50"})))),(0,i.Z)("div",{className:"rank-user"},void 0,(0,i.Z)("div",{className:"user-name"},void 0,(0,i.Z)("span",{className:"item-title"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(30,80)+"px"}},void 0," "))),(0,i.Z)("div",{className:"user-details"},void 0,(0,i.Z)("span",{className:"user-status"},void 0,m||(m=(0,i.Z)("span",{className:"status-icon ui-preview-text"},void 0," ")),(0,i.Z)("span",{className:"status-label ui-preview-text hidden-xs hidden-sm",style:{width:_.e(30,50)+"px"}},void 0," ")),(0,i.Z)("span",{className:"rank-name"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(30,50)+"px"}},void 0," ")),(0,i.Z)("span",{className:"user-title hidden-xs hidden-sm"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(30,50)+"px"}},void 0," "))),(0,i.Z)("div",{className:"user-compact-stats visible-xs-block"},void 0,(0,i.Z)("span",{className:"rank-position"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Rank"))),(0,i.Z)("span",{className:"rank-posts-counted"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Ranked posts"))))),(0,i.Z)("div",{className:"rank-position hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Rank"))),(0,i.Z)("div",{className:"rank-posts-counted hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Ranked posts"))),(0,i.Z)("div",{className:"rank-posts-total hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(20,30)+"px"}},void 0," ")),(0,i.Z)("small",{},void 0,gettext("Total posts"))))}},x=class extends n().Component{shouldComponentUpdate(){return!1}render(){return(0,i.Z)("div",{className:"active-posters-list"},void 0,(0,i.Z)(d.Z,{},void 0,(0,i.Z)(Z,{baseUrl:misago.get("USERS_LIST_URL"),page:this.props.page,pages:misago.get("USERS_LISTS")}),(0,i.Z)("p",{className:"lead ui-preview"},void 0,(0,i.Z)("span",{className:"ui-preview-text",style:{width:_.e(50,220)+"px"}},void 0," ")),(0,i.Z)("div",{className:"active-posters ui-preview"},void 0,(0,i.Z)("ul",{className:"list-group"},void 0,[0,1,2].map((e=>(0,i.Z)(N,{hiddenOnMobile:e>0},e)))))))}},y=s(24678),w=s(32233),k=class extends n().Component{getClassName(){return this.props.rank.css_class?"list-group-item list-group-rank-"+this.props.rank.css_class:"list-group-item"}getUserStatus(){return this.props.user.status?(0,i.Z)(y.ZP,{user:this.props.user,status:this.props.user.status},void 0,(0,i.Z)(y.Jj,{user:this.props.user,status:this.props.user.status}),(0,i.Z)(y.pg,{user:this.props.user,status:this.props.user.status,className:"status-label hidden-xs hidden-sm"})):(0,i.Z)("span",{className:"user-status"},void 0,v||(v=(0,i.Z)("span",{className:"status-icon ui-preview-text"},void 0," ")),(0,i.Z)("span",{className:"status-label ui-preview-text hidden-xs hidden-sm",style:{width:_.e(30,50)+"px"}},void 0," "))}getRankName(){if(!this.props.rank.is_tab)return(0,i.Z)("span",{className:"rank-name item-title"},void 0,this.props.rank.name);let e=w.Z.get("USERS_LIST_URL")+this.props.rank.slug+"/";return(0,i.Z)(c.rU,{to:e,className:"rank-name item-title"},void 0,this.props.rank.name)}getUserTitle(){return this.props.user.title?(0,i.Z)("span",{className:"user-title hidden-xs hidden-sm"},void 0,this.props.user.title):null}render(){return(0,i.Z)("li",{className:this.getClassName()},void 0,(0,i.Z)("div",{className:"rank-user-avatar"},void 0,(0,i.Z)("a",{href:this.props.user.url},void 0,(0,i.Z)(f.ZP,{user:this.props.user,size:50,size2x:64}))),(0,i.Z)("div",{className:"rank-user"},void 0,(0,i.Z)("div",{className:"user-name"},void 0,(0,i.Z)("a",{href:this.props.user.url,className:"item-title"},void 0,this.props.user.username)),(0,i.Z)("div",{className:"user-details"},void 0,this.getUserStatus(),this.getRankName(),this.getUserTitle()),(0,i.Z)("div",{className:"user-compact-stats visible-xs-block"},void 0,(0,i.Z)("span",{className:"rank-position"},void 0,(0,i.Z)("strong",{},void 0,"#",this.props.counter),(0,i.Z)("small",{},void 0,gettext("Rank"))),(0,i.Z)("span",{className:"rank-posts-counted"},void 0,(0,i.Z)("strong",{},void 0,this.props.user.meta.score),(0,i.Z)("small",{},void 0,gettext("Ranked posts"))))),(0,i.Z)("div",{className:"rank-position hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,"#",this.props.counter),(0,i.Z)("small",{},void 0,gettext("Rank"))),(0,i.Z)("div",{className:"rank-posts-counted hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,this.props.user.meta.score),(0,i.Z)("small",{},void 0,gettext("Ranked posts"))),(0,i.Z)("div",{className:"rank-posts-total hidden-xs"},void 0,(0,i.Z)("strong",{},void 0,this.props.user.posts),(0,i.Z)("small",{},void 0,gettext("Total posts"))))}},C=class extends n().Component{getLeadMessage(){let e=ngettext("%(posters)s top poster from last %(days)s days.","%(posters)s top posters from last %(days)s days.",this.props.count);return interpolate(e,{posters:this.props.count,days:this.props.trackedPeriod},!0)}render(){return(0,i.Z)("div",{className:"active-posters-list"},void 0,(0,i.Z)(d.Z,{},void 0,(0,i.Z)(Z,{baseUrl:misago.get("USERS_LIST_URL"),page:this.props.page,pages:misago.get("USERS_LISTS")}),(0,i.Z)("p",{className:"lead"},void 0,this.getLeadMessage()),(0,i.Z)("div",{className:"active-posters ui-ready"},void 0,(0,i.Z)("ul",{className:"list-group"},void 0,this.props.users.map(((e,t)=>(0,i.Z)(k,{user:e,rank:e.rank,counter:t+1},e.id)))))))}},S=s(6935),E=s(55547),L=s(90287),T=s(53328),P=class extends n().Component{constructor(e){super(e),(0,l.Z)(this,"update",(e=>{L.Z.dispatch((0,S.ZB)(e.results)),this.setState({isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count})})),w.Z.has("USERS")?this.initWithPreloadedData(w.Z.pop("USERS")):this.initWithoutPreloadedData(),this.startPolling()}initWithPreloadedData(e){this.state={isLoaded:!0,trackedPeriod:e.tracked_period,count:e.count},L.Z.dispatch((0,S.ZB)(e.results))}initWithoutPreloadedData(){this.state={isLoaded:!1}}startPolling(){E.Z.start({poll:"active-posters",url:w.Z.get("USERS_API"),data:{list:"active"},frequency:9e4,update:this.update})}componentDidMount(){T.Z.set({title:this.props.route.extra.name,parent:gettext("Users")})}componentWillUnmount(){E.Z.stop("active-posters")}render(){const e={name:this.props.route.extra.name};return this.state.isLoaded?this.state.count>0?(0,i.Z)(C,{page:e,users:this.props.users,trackedPeriod:this.state.trackedPeriod,count:this.state.count}):(0,i.Z)(b,{page:e,trackedPeriod:this.state.trackedPeriod}):(0,i.Z)(x,{page:e})}},O=class extends n().Component{getClassName(){return this.props.copy&&this.props.copy.length&&1===function(e,t){if(e=(e+"").toLowerCase(),(t=(t+"").toLowerCase()).length<=0)return 0;let s=0,a=0,i=t.length;for(;a=e.indexOf(t,a),a>=0;)s+=1,a+=i;return s}(this.props.copy,"{let{users:t}=e;return(0,i.Z)(R.Z,{cols:4,isReady:!0,showStatus:!0,users:t})};class I extends n().Component{constructor(){super(...arguments),(0,l.Z)(this,"render",(()=>g||(g=(0,i.Z)(R.Z,{cols:4,isReady:!1}))))}shouldComponentUpdate(){return!1}}var D,j,z,U,M,B,q,H,F,Y=I,V=s(92490),G=e=>{let{users:t}=e;return t.more?(0,i.Z)("p",{},void 0,interpolate(ngettext("There is %(more)s more member with this role.","There are %(more)s more members with this role.",t.more),{more:t.more},!0)):(0,i.Z)("p",{},void 0,gettext("There are no more members with this role."))},$=e=>{let{baseUrl:t,users:s}=e;return(0,i.Z)("div",{className:"misago-pagination"},void 0,s.isLoaded&&s.first?(0,i.Z)(c.rU,{className:"btn btn-default btn-outline btn-icon",to:t,title:gettext("Go to first page")},void 0,D||(D=(0,i.Z)("span",{className:"material-icon"},void 0,"first_page"))):(0,i.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to first page"),type:"button",disabled:!0},void 0,j||(j=(0,i.Z)("span",{className:"material-icon"},void 0,"first_page"))),s.isLoaded&&s.previous?(0,i.Z)(c.rU,{className:"btn btn-default btn-outline btn-icon",to:t+(s.previous>1?s.previous+"/":""),title:gettext("Go to previous page")},void 0,z||(z=(0,i.Z)("span",{className:"material-icon"},void 0,"chevron_left"))):(0,i.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to previous page"),type:"button",disabled:!0},void 0,U||(U=(0,i.Z)("span",{className:"material-icon"},void 0,"chevron_left"))),s.isLoaded&&s.next?(0,i.Z)(c.rU,{className:"btn btn-default btn-outline btn-icon",to:t+s.next+"/",title:gettext("Go to next page")},void 0,M||(M=(0,i.Z)("span",{className:"material-icon"},void 0,"chevron_right"))):(0,i.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to next page"),type:"button",disabled:!0},void 0,B||(B=(0,i.Z)("span",{className:"material-icon"},void 0,"chevron_right"))),s.isLoaded&&s.last?(0,i.Z)(c.rU,{className:"btn btn-default btn-outline btn-icon",to:t+s.last+"/",title:gettext("Go to last page")},void 0,q||(q=(0,i.Z)("span",{className:"material-icon"},void 0,"last_page"))):(0,i.Z)("button",{className:"btn btn-default btn-outline btn-icon",title:gettext("Go to last page"),type:"button",disabled:!0},void 0,H||(H=(0,i.Z)("span",{className:"material-icon"},void 0,"last_page"))))},W=e=>{let{baseUrl:t,users:s}=e;return(0,i.Z)(V.o8,{},void 0,(0,i.Z)(V.Z2,{},void 0,(0,i.Z)(V.Eg,{},void 0,(0,i.Z)($,{baseUrl:t,users:s}))),(0,i.Z)(V.Z2,{auto:!0},void 0,(0,i.Z)(V.Eg,{},void 0,(0,i.Z)(G,{users:s}))))},Q=class extends n().Component{constructor(e){super(e),(0,l.Z)(this,"update",(e=>{L.Z.dispatch((0,S.ZB)(e.results)),e.isLoaded=!0,this.setState(e)})),w.Z.has("USERS")?this.initWithPreloadedData(w.Z.pop("USERS")):this.initWithoutPreloadedData(),this.startPolling(e.params.page||1)}initWithPreloadedData(e){this.state=Object.assign(e,{isLoaded:!0}),L.Z.dispatch((0,S.ZB)(e.results))}initWithoutPreloadedData(){this.state={isLoaded:!1}}startPolling(e){E.Z.start({poll:"rank-users",url:w.Z.get("USERS_API"),data:{rank:this.props.route.rank.id,page:e},frequency:9e4,update:this.update})}componentDidMount(){T.Z.set({title:this.props.route.rank.name,page:this.props.params.page||null,parent:gettext("Users")})}componentWillUnmount(){E.Z.stop("rank-users")}componentWillReceiveProps(e){this.props.params.page!==e.params.page&&(T.Z.set({title:this.props.route.rank.name,page:e.params.page||null,parent:gettext("Users")}),this.setState({isLoaded:!1}),E.Z.stop("rank-users"),this.startPolling(e.params.page))}getClassName(){return this.props.route.rank.css_class?"rank-users-list rank-users-"+this.props.route.rank.css_class:"rank-users-list"}getRankDescription(){return this.props.route.rank.description?(0,i.Z)("div",{className:"rank-description"},void 0,(0,i.Z)(O,{copy:this.props.route.rank.description.html})):null}getComponent(){return this.state.isLoaded?this.state.count>0?(0,i.Z)(A,{users:this.props.users}):(0,i.Z)("p",{className:"lead"},void 0,gettext("There are no users with this rank at the moment.")):F||(F=(0,i.Z)(Y,{}))}render(){return(0,i.Z)("div",{className:this.getClassName()},void 0,(0,i.Z)(d.Z,{},void 0,(0,i.Z)(Z,{baseUrl:w.Z.get("USERS_LIST_URL"),page:{name:this.props.route.rank.name},pages:w.Z.get("USERS_LISTS")}),this.getRankDescription(),this.getComponent(),(0,i.Z)(W,{baseUrl:w.Z.get("USERS_LIST_URL")+this.props.route.rank.slug+"/",users:this.state})))}},K=s(82125),J=s(99755),X=class extends K.Z{render(){return(0,i.Z)("div",{className:"page page-users-lists"},void 0,(0,i.Z)(J.sP,{},void 0,(0,i.Z)(J.mr,{styleName:"users-lists"},void 0,(0,i.Z)(J.gC,{styleName:"users-lists"},void 0,(0,i.Z)("h1",{},void 0,gettext("Users"))))),this.props.children)}};function ee(e){return{tick:e.tick.tick,user:e.auth.user,users:e.users}}function te(){let e=[];return w.Z.get("USERS_LISTS").forEach((function(t){"rank"===t.component?(e.push({path:w.Z.get("USERS_LIST_URL")+t.slug+"/:page/",component:(0,r.$j)(ee)(Q),rank:t}),e.push({path:w.Z.get("USERS_LIST_URL")+t.slug+"/",component:(0,r.$j)(ee)(Q),rank:t})):"active-posters"===t.component&&e.push({path:w.Z.get("USERS_LIST_URL")+t.component+"/",component:(0,r.$j)(ee)(P),extra:{name:t.name}})})),e}var se=s(39633);w.Z.addInitializer({name:"component:users",initializer:function(e){e.has("USERS_LISTS")&&(0,se.Z)({root:w.Z.get("USERS_LIST_URL"),component:X,paths:te()})},after:"store"})},97751:function(e,t,s){"use strict";var a=s(32233),i=s(96142);a.Z.addInitializer({name:"include",initializer:function(e){i.Z.init(e.get("STATIC_URL"))}})},76093:function(e,t,s){"use strict";var a=s(32233),i=s(62833);a.Z.addInitializer({name:"local-storage",initializer:function(){i.Z.init("misago_")}})},19764:function(e,t,s){"use strict";var a=s(32233),i=s(8621);a.Z.addInitializer({name:"dropdown",initializer:function(){let e=document.getElementById("mobile-navbar-dropdown-mount");e&&i.Z.init(e)},before:"store"})},47549:function(e,t,s){"use strict";var a=s(32233),i=s(59801);a.Z.addInitializer({name:"modal",initializer:function(){let e=document.getElementById("modal-mount");e&&i.Z.init(e)},before:"store"})},22331:function(e,t,s){"use strict";var a=s(30381),i=s.n(a),o=s(32233),n=s(19755);o.Z.addInitializer({name:"moment",initializer:function(){i().locale(n("html").attr("lang"))}})},21513:function(e,t,s){"use strict";var a=s(32233),i=s(53328);a.Z.addInitializer({name:"page-title",initializer:function(e){i.Z.init(e.get("SETTINGS").forum_index_title,e.get("SETTINGS").forum_name)}})},98749:function(e,t,s){"use strict";var a=s(32233),i=s(78657),o=s(53904),n=s(55547);a.Z.addInitializer({name:"polls",initializer:function(){n.Z.init(i.Z,o.Z)}})},98251:function(e,t,s){"use strict";var a=s(32233),i=s(78657),o=s(64646),n=s(53904);a.Z.addInitializer({name:"posting",initializer:function(){o.Z.init(i.Z,n.Z,document.getElementById("posting-mount"))}})},6720:function(e,t,s){"use strict";var a=s(32233),i=s(35486),o=s(90287);a.Z.addInitializer({name:"reducer:auth",initializer:function(e){o.Z.addReducer("auth",i.ZP,Object.assign({isAuthenticated:e.get("isAuthenticated"),isAnonymous:!e.get("isAuthenticated"),user:e.get("user")},i.E3))},before:"store"})},10846:function(e,t,s){"use strict";var a=s(32233),i=s(8154),o=s(90287);a.Z.addInitializer({name:"reducer:participants",initializer:function(){let e=null;a.Z.has("THREAD")&&(e=a.Z.get("THREAD").participants),o.Z.addReducer("participants",i.ZP,e||[])},before:"store"})},18255:function(e,t,s){"use strict";var a=s(32233),i=s(59752),o=s(90287);a.Z.addInitializer({name:"reducer:poll",initializer:function(){let e=null;e=a.Z.has("THREAD")&&a.Z.get("THREAD").poll?(0,i.ZB)(a.Z.get("THREAD").poll):{},o.Z.addReducer("poll",i.ZP,e)},before:"store"})},14113:function(e,t,s){"use strict";var a=s(32233),i=s(21981),o=s(90287);a.Z.addInitializer({name:"reducer:posts",initializer:function(){let e=null;e=a.Z.has("POSTS")?(0,i.ZB)(a.Z.get("POSTS")):{isLoaded:!1,isBusy:!1},o.Z.addReducer("posts",i.ZP,e)},before:"store"})},24444:function(e,t,s){"use strict";var a=s(32233),i=s(58598),o=s(90287);a.Z.addInitializer({name:"reducer:profile-details",initializer:function(){let e=null;a.Z.has("PROFILE_DETAILS")&&(e=a.Z.get("PROFILE_DETAILS")),o.Z.addReducer("profile-details",i.ZP,e||{})},before:"store"})},1764:function(e,t,s){"use strict";var a=s(32233),i=s(27519),o=s(90287);a.Z.addInitializer({name:"reducer:profile-hydrate",initializer:function(){a.Z.has("PROFILE")&&o.Z.dispatch((0,i.ZB)(a.Z.get("PROFILE")))},after:"store"})},68351:function(e,t,s){"use strict";var a=s(32233),i=s(27519),o=s(90287);a.Z.addInitializer({name:"reducer:profile",initializer:function(){o.Z.addReducer("profile",i.ZP,{})},before:"store"})},81521:function(e,t,s){"use strict";var a=s(32233),i=s(16427),o=s(90287);a.Z.addInitializer({name:"reducer:search",initializer:function(){o.Z.addReducer("search",i.ZP,Object.assign({},i.E3,{providers:a.Z.get("SEARCH_PROVIDERS")||[],query:a.Z.get("SEARCH_QUERY")||""}))},before:"store"})},19984:function(e,t,s){"use strict";var a=s(32233),i=s(77751),o=s(90287);a.Z.addInitializer({name:"reducer:selection",initializer:function(){o.Z.addReducer("selection",i.ZP,[])},before:"store"})},41229:function(e,t,s){"use strict";var a=s(32233),i=s(27346),o=s(90287);a.Z.addInitializer({name:"reducer:snackbar",initializer:function(){o.Z.addReducer("snackbar",i.ZP,i.E3)},before:"store"})},43589:function(e,t,s){"use strict";var a=s(32233),i=s(7738),o=s(90287);a.Z.addInitializer({name:"reducer:thread",initializer:function(){let e=null;e=a.Z.has("THREAD")?(0,i.ZB)(a.Z.get("THREAD")):{isBusy:!1},o.Z.addReducer("thread",i.ZP,e)},before:"store"})},24108:function(e,t,s){"use strict";var a=s(32233),i=s(61340),o=s(90287);a.Z.addInitializer({name:"reducer:threads",initializer:function(){o.Z.addReducer("threads",i.ZP,[])},before:"store"})},33934:function(e,t,s){"use strict";var a=s(32233),i=s(85586),o=s(90287);a.Z.addInitializer({name:"reducer:tick",initializer:function(){o.Z.addReducer("tick",i.ZP,i.E3)},before:"store"})},85577:function(e,t,s){"use strict";var a=s(32233),i=s(48927),o=s(90287);a.Z.addInitializer({name:"reducer:username-history",initializer:function(){o.Z.addReducer("username-history",i.ZP,[])},before:"store"})},83526:function(e,t,s){"use strict";var a=s(32233),i=s(6935),o=s(90287);a.Z.addInitializer({name:"reducer:users",initializer:function(){o.Z.addReducer("users",i.ZP,[])},before:"store"})},43060:function(e,t,s){"use strict";var a=s(32233),i=s(53904),o=s(90287);a.Z.addInitializer({name:"snackbar",initializer:function(){i.Z.init(o.Z)},after:"store"})},92292:function(e,t,s){"use strict";var a=s(32233),i=s(90287);a.Z.addInitializer({name:"store",initializer:function(){i.Z.init()},before:"_end"})},33409:function(e,t,s){"use strict";var a=s(32233),i=s(85586),o=s(90287);a.Z.addInitializer({name:"tick-start",initializer:function(){window.setInterval((function(){o.Z.dispatch((0,i.bq)())}),5e4)},after:"store"})},31341:function(e,t,s){"use strict";var a=s(32233),i=s(96142),o=s(59940);a.Z.addInitializer({name:"zxcvbn",initializer:function(){o.Z.init(i.Z)}})},35486:function(e,t,s){"use strict";s.d(t,{E3:function(){return i},ZP:function(){return p},r$:function(){return l},w7:function(){return c},zB:function(){return d}});var a=s(6935),i={signedIn:!1,signedOut:!1};const o="PATCH_USER",n="SIGN_IN",r="SIGN_OUT";function l(e){return{type:o,patch:e}}function d(e){return{type:n,user:e}}function c(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return{type:r,soft:e}}function p(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case o:let s=Object.assign({},e);return s.user=Object.assign({},e.user,t.patch),s;case n:return Object.assign({},e,{signedIn:t.user});case r:return Object.assign({},e,{isAuthenticated:!1,isAnonymous:!0,signedOut:!t.soft});case a.oB:if(e.isAuthenticated&&e.user.id===t.userId){let s=Object.assign({},e);return s.user=Object.assign({},e.user,{avatars:t.avatars}),s}return e;case a.D9:if(e.isAuthenticated&&e.user.id===t.userId){let s=Object.assign({},e);return s.user=Object.assign({},e.user,{username:t.username,slug:t.slug}),s}return e;default:return e}}},8154:function(e,t,s){"use strict";s.d(t,{ZP:function(){return o},gx:function(){return i}});const a="REPLACE_PARTICIPANTS";function i(e){return{type:a,state:e}}function o(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===a?t.state:e}},59752:function(e,t,s){"use strict";s.d(t,{Ar:function(){return u},Od:function(){return m},ZB:function(){return c},ZH:function(){return r},ZP:function(){return v},b9:function(){return l},gx:function(){return h},n6:function(){return p}});var a=s(30381),i=s.n(a);const o="BUSY_POLL",n="RELEASE_POLL",r="REMOVE_POLL",l="REPLACE_POLL",d="UPDATE_POLL";function c(e){let t=!1;for(const s in e.choices)if(e.choices[s].selected){t=!0;break}return Object.assign({},e,{posted_on:i()(e.posted_on),hasSelectedChoices:t,endsOn:e.length?i()(e.posted_on).add(e.length,"days"):null,isBusy:!1})}function p(){return{type:o}}function u(){return{type:n}}function h(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{type:l,state:t?e:c(e)}}function m(){return{type:r}}function v(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case o:return Object.assign({},e,{isBusy:!0});case n:return Object.assign({},e,{isBusy:!1});case r:return{isBusy:!1};case l:return t.state;case d:return Object.assign({},e,t.data);default:return e}}},92747:function(e,t,s){"use strict";s.d(t,{Qu:function(){return n},ZB:function(){return r},ZP:function(){return c},r$:function(){return d}});var a=s(30381),i=s.n(a),o=s(6935);const n="PATCH_POST";function r(e){return Object.assign({},e,{posted_on:i()(e.posted_on),updated_on:i()(e.updated_on),hidden_on:i()(e.hidden_on),attachments:e.attachments?e.attachments.map(l):null,poster:e.poster?(0,o.Ru)(e.poster):null,isSelected:!1,isBusy:!1,isDeleted:!1})}function l(e){return Object.assign({},e,{uploaded_on:i()(e.uploaded_on)})}function d(e,t){return{type:n,post:e,patch:t}}function c(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===n&&e.id==t.post.id?Object.assign({},e,t.patch):e}},21981:function(e,t,s){"use strict";s.d(t,{R3:function(){return g},Rz:function(){return Z},Vx:function(){return b},Ys:function(){return p},ZB:function(){return m},ZP:function(){return f},_H:function(){return u},kR:function(){return h},zD:function(){return v}});var a=s(92747);const i="APPEND_POSTS",o="SELECT_POST",n="DESELECT_POST",r="DESELECT_POSTS",l="LOAD_POSTS",d="UNLOAD_POSTS",c="UPDATE_POSTS";function p(e){return{type:o,post:e}}function u(e){return{type:n,post:e}}function h(){return{type:r}}function m(e){return Object.assign({},e,{results:e.results.map(a.ZB),isLoaded:!0,isBusy:!1,isSelected:!1})}function v(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{type:l,state:t?e:m(e)}}function g(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{type:i,state:t?e:m(e)}}function Z(){return{type:d}}function b(e){return{type:c,update:e}}function f(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case o:const s=e.results.map((e=>e.id==t.post.id?Object.assign({},e,{isSelected:!0}):e));return Object.assign({},e,{results:s});case n:const p=e.results.map((e=>e.id==t.post.id?Object.assign({},e,{isSelected:!1}):e));return Object.assign({},e,{results:p});case r:const u=e.results.map((e=>Object.assign({},e,{isSelected:!1})));return Object.assign({},e,{results:u});case i:let h=e.results.slice();const m=e.results.map((e=>e.id));return t.state.results.map((e=>{-1===m.indexOf(e.id)&&h.push(e)})),Object.assign({},t.state,{results:h});case l:return t.state;case d:return Object.assign({},e,{isLoaded:!1});case c:return Object.assign({},e,t.update);case a.Qu:const v=e.results.map((e=>(0,a.ZP)(e,t)));return Object.assign({},e,{results:v});default:return e}}},58598:function(e,t,s){"use strict";s.d(t,{ZP:function(){return o},zD:function(){return i}});const a="LOAD_DETAILS";function i(e){return{type:a,newState:e}}function o(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===a?t.newState:e}},27519:function(e,t,s){"use strict";s.d(t,{ZB:function(){return l},ZP:function(){return c},r$:function(){return d}});var a=s(30381),i=s.n(a),o=s(6935);const n="HYDRATE_PROFILE",r="PATCH_PROFILE";function l(e){return{type:n,profile:e}}function d(e){return{type:r,patch:e}}function c(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return Object.assign({},t.profile,{joined_on:i()(t.profile.joined_on),status:(0,o.$q)(t.profile.status)});case r:return Object.assign({},e,t.patch);case o.oB:return e.id===t.userId?Object.assign({},e,{avatars:t.avatars}):e;case o.D9:return e.id===t.userId?Object.assign({},e,{username:t.username,slug:t.slug}):e;default:return e}}},16427:function(e,t,s){"use strict";s.d(t,{E3:function(){return n},P0:function(){return l},Vx:function(){return r},ZP:function(){return d}});const a="REPLACE_SEARCH",i="UPDATE_SEARCH",o="UPDATE_SEARCH_PROVIDER",n={isLoading:!1,query:"",providers:[]};function r(e){return{type:i,update:e}}function l(e){return{type:o,provider:e}}function d(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case a:return t.state;case i:return Object.assign({},e,t.update);case o:return Object.assign({},e,{providers:e.providers.map((e=>e.id===t.provider.id?t.provider:e))});default:return e}}},77751:function(e,t,s){"use strict";s.d(t,{$6:function(){return r},YP:function(){return l},ZP:function(){return c},wc:function(){return d}});var a=s(20370);const i="SELECT_ALL",o="SELECT_NONE",n="SELECT_ITEM";function r(e){return{type:i,items:e}}function l(){return{type:o}}function d(e){return{type:n,item:e}}function c(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case i:return t.items;case o:return[];case n:return(0,a.ZN)(e,t.item);default:return e}}},27346:function(e,t,s){"use strict";s.d(t,{E3:function(){return a},OV:function(){return n},ZP:function(){return l},p2:function(){return r}});var a={type:"info",message:"",isVisible:!1};const i="SHOW_SNACKBAR",o="HIDE_SNACKBAR";function n(e,t){return{type:i,message:e,messageType:t}}function r(){return{type:o}}function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:a,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===i?{type:t.messageType,message:t.message,isVisible:!0}:t.type===o?Object.assign({},e,{isVisible:!1}):e}},7738:function(e,t,s){"use strict";s.d(t,{Ar:function(){return h},Vx:function(){return v},ZB:function(){return p},ZP:function(){return Z},gx:function(){return m},n6:function(){return u},y8:function(){return g}});var a=s(30381),i=s.n(a),o=s(59752);const n="BUSY_THREAD",r="RELEASE_THREAD",l="REPLACE_THREAD",d="UPDATE_THREAD",c="UPDATE_THREAD_ACL";function p(e){return Object.assign({},e,{started_on:i()(e.started_on),last_post_on:i()(e.last_post_on),best_answer_marked_on:e.best_answer_marked_on?i()(e.best_answer_marked_on):null,isBusy:!1})}function u(){return{type:n}}function h(){return{type:r}}function m(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{type:l,state:t?e:p(e)}}function v(e){return{type:d,data:e}}function g(e){return{type:c,data:e}}function Z(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return Object.assign({},e,{isBusy:!0});case r:return Object.assign({},e,{isBusy:!1});case o.ZH:return Object.assign({},e,{poll:null});case o.b9:return Object.assign({},e,{poll:t.state});case l:return t.state;case d:return Object.assign({},e,t.data);case c:const s=Object.assign({},e.acl,t.data);return Object.assign({},e,{acl:s});default:return e}}},61340:function(e,t,s){"use strict";s.d(t,{R3:function(){return h},V8:function(){return v},ZB:function(){return g},ZP:function(){return _},l8:function(){return m},r$:function(){return Z}});var a=s(30381),i=s.n(a),o=s(89759);const n="APPEND_THREADS",r="DELETE_THREAD",l="FILTER_THREADS",d="HYDRATE_THREADS",c="PATCH_THREAD",p="SORT_THREADS",u=["can_announce","can_approve","can_close","can_hide","can_move","can_merge","can_pin","can_review"];function h(e,t){return{type:n,items:e,sorting:t}}function m(e){return{type:r,thread:e}}function v(e,t){return{type:l,category:e,categoriesMap:t}}function g(e){return{type:d,items:e}}function Z(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{type:c,thread:e,patch:t,sorting:s}}function b(e){let t=[];return u.forEach((function(s){e[s]&&t.push(s)})),t}function f(e){return Object.assign({},e,{started_on:i()(e.started_on),last_post_on:i()(e.last_post_on),moderation:b(e.acl)})}function _(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return(0,o.Z)(t.items.map(f),e).sort(t.sorting);case r:return e.filter((function(e){return e.id!==t.thread.id}));case l:return e.filter((function(e){const s=t.categoriesMap[e.category];return s.lft>=t.category.lft&&s.rght<=t.category.rght||2==e.weight}));case d:return t.items.map(f);case c:const s=e.map((function(e){return e.id===t.thread.id?Object.assign({},e,t.patch):e}));return t.sorting?s.sort(t.sorting):s;case p:return e.sort(t.sorting);default:return e}}},85586:function(e,t,s){"use strict";s.d(t,{E3:function(){return a},ZP:function(){return n},bq:function(){return o}});var a={tick:0};const i="TICK";function o(){return{type:i}}function n(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:a,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;return t.type===i?Object.assign({},e,{tick:e.tick+1}):e}},48927:function(e,t,s){"use strict";s.d(t,{KP:function(){return c},R3:function(){return p},ZB:function(){return u},ZP:function(){return m}});var a=s(30381),i=s.n(a),o=s(6935),n=s(89759);const r="ADD_NAME_CHANGE",l="APPEND_HISTORY",d="HYDRATE_HISTORY";function c(e,t,s){return{type:r,change:e,user:t,changedBy:s}}function p(e){return{type:l,items:e}}function u(e){return{type:d,items:e}}function h(e){return Object.assign({},e,{changed_on:i()(e.changed_on)})}function m(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case r:let s=e.slice();return s.unshift({id:Math.floor(Date.now()/1e3),changed_by:t.changedBy,changed_by_username:t.changedBy.username,changed_on:i()(),new_username:t.change.username,old_username:t.user.username}),s;case l:return(0,n.Z)(e,t.items.map(h));case d:return t.items.map(h);case o.oB:return e.map((function(e){return(e=Object.assign({},e)).changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{avatars:t.avatars})),e}));case o.D9:return e.map((function(e){return(e=Object.assign({},e)).changed_by&&e.changed_by.id===t.userId&&(e.changed_by=Object.assign({},e.changed_by,{username:t.username,slug:t.slug})),Object.assign({},e)}));default:return e}}},6935:function(e,t,s){"use strict";s.d(t,{$q:function(){return u},D9:function(){return d},R3:function(){return c},Ru:function(){return h},ZB:function(){return p},ZP:function(){return g},_S:function(){return v},n1:function(){return m},oB:function(){return l}});var a=s(30381),i=s.n(a),o=s(89759);const n="APPEND_USERS",r="HYDRATE_USERS",l="UPDATE_AVATAR",d="UPDATE_USERNAME";function c(e){return{type:n,items:e}}function p(e){return{type:r,items:e}}function u(e){return e?Object.assign({},e,{last_click:e.last_click?i()(e.last_click):null,banned_until:e.banned_until?i()(e.banned_until):null}):null}function h(e){return Object.assign({},e,{joined_on:i()(e.joined_on),status:u(e.status)})}function m(e,t){return{type:l,userId:e.id,avatars:t}}function v(e,t,s){return{type:d,userId:e.id,username:t,slug:s}}function g(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;switch(t.type){case n:return(0,o.Z)(e,t.items.map(h));case r:return t.items.map(h);case l:return e.map((function(e){return(e=Object.assign({},e)).id===t.userId&&(e.avatars=t.avatars),e}));default:return e}}},78657:function(e,t,s){"use strict";var a=s(19755);t.Z=new class{constructor(){this._cookieName=null,this._csrfToken=null,this._locks={}}init(e){this._cookieName=e}getCsrfToken(){if(-1!==document.cookie.indexOf(this._cookieName)){let e=new RegExp(this._cookieName+"=([^;]*)"),t=document.cookie.match(e)[0];return t?t.split("=")[1]:null}return null}request(e,t,s){let i=this;return new Promise((function(o,n){let r={url:t,method:e,headers:{"X-CSRFToken":i.getCsrfToken()},data:s?JSON.stringify(s):null,contentType:"application/json; charset=utf-8",dataType:"json",success:function(e){o(e)},error:function(e){let t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,n(t)}};a.ajax(r)}))}get(e,t,s){if(t&&(e+="?"+a.param(t)),s){let t=this;return this._locks[s]&&(this._locks[s].url=e),this._locks[s]&&this._locks[s].waiter?{then:function(){}}:this._locks[s]&&this._locks[s].wait?(this._locks[s].waiter=!0,new Promise((function(a,i){let o=function(e){t._locks[s].wait?window.setTimeout((function(){o(e)}),300):t._locks[s].url!==e?o(t._locks[s].url):(t._locks[s].waiter=!1,t.request("GET",t._locks[s].url).then((function(i){t._locks[s].url===e?a(i):(t._locks[s].waiter=!0,o(t._locks[s].url))}),(function(a){t._locks[s].url===e?i(a):(t._locks[s].waiter=!0,o(t._locks[s].url))})))};window.setTimeout((function(){o(e)}),300)}))):(this._locks[s]={url:e,wait:!0,waiter:!1},new Promise((function(a,i){t.request("GET",e).then((function(i){t._locks[s].wait=!1,t._locks[s].url===e&&a(i)}),(function(a){t._locks[s].wait=!1,t._locks[s].url===e&&i(a)}))})))}return this.request("GET",e)}post(e,t){return this.request("POST",e,t)}patch(e,t){return this.request("PATCH",e,t)}put(e,t){return this.request("PUT",e,t)}delete(e,t){return this.request("DELETE",e,t)}upload(e,t,s){let i=this;return new Promise((function(o,n){let r={url:e,method:"POST",headers:{"X-CSRFToken":i.getCsrfToken()},data:t,contentType:!1,processData:!1,xhr:function(){let e=new window.XMLHttpRequest;return e.upload.addEventListener("progress",(function(e){e.lengthComputable&&s(Math.round(e.loaded/e.total*100))}),!1),e},success:function(e){o(e)},error:function(e){let t=e.responseJSON||{};t.status=e.status,0===t.status&&(t.detail=gettext("Lost connection with application.")),413!==t.status||t.detail||(t.detail=gettext("Upload was rejected by server as too large.")),404===t.status&&(t.detail&&"NOT FOUND"!==t.detail||(t.detail=gettext("Action link is invalid."))),500!==t.status||t.detail||(t.detail=gettext("Unknown error has occured.")),t.statusText=e.statusText,n(t)}};a.ajax(r)}))}}},98274:function(e,t,s){"use strict";var a=s(35486);t.Z=new class{init(e,t,s){this._store=e,this._local=t,this._modal=s,this.syncSession(),this.watchState()}syncSession(){const e=this._store.getState().auth;e.isAuthenticated?this._local.set("auth",{isAuthenticated:!0,username:e.user.username}):this._local.set("auth",{isAuthenticated:!1})}watchState(){const e=this._store.getState().auth;this._local.watch("auth",(t=>{t.isAuthenticated?this._store.dispatch((0,a.zB)({username:t.username})):e.isAuthenticated&&this._store.dispatch((0,a.w7)())})),this._modal.hide()}signIn(e){this._store.dispatch((0,a.zB)(e)),this._local.set("auth",{isAuthenticated:!0,username:e.username}),this._modal.hide()}signOut(){this._store.dispatch((0,a.w7)()),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}softSignOut(){this._store.dispatch((0,a.w7)(!0)),this._local.set("auth",{isAuthenticated:!1}),this._modal.hide()}}},93825:function(e,t,s){"use strict";var a,i=s(22928),o=s(57588),n=s.n(o),r=s(96359);class l{init(e,t,s,a){this._context=e,this._ajax=t,this._include=s,this._snackbar=a}}class d extends l{load(){return new Promise((function(e){e()}))}validator(){return null}component(){return null}}class c extends l{load(){var e=this;return new Promise(((t,s)=>{e._ajax.get(e._context.get("CAPTCHA_API")).then((function(s){e.question=s.question,e.helpText=s.help_text,t()}),(function(){e._snackbar.error(gettext("Failed to load CAPTCHA.")),s()}))}))}validator(){return[]}component(e){return(0,i.Z)(r.Z,{label:this.question,for:"id_captcha",labelClass:e.labelClass||"",controlClass:e.controlClass||"",validation:e.form.state.errors.captcha,helpText:this.helpText||null},void 0,(0,i.Z)("input",{"aria-describedby":"id_captcha_status",className:"form-control",disabled:e.form.state.isLoading,id:"id_captcha",onChange:e.form.bindInput("captcha"),type:"text",value:e.form.state.captcha}))}}class p extends n().Component{componentDidMount(){grecaptcha.render("recaptcha",{sitekey:this.props.siteKey,callback:e=>{this.props.binding({target:{value:e}})}})}render(){return a||(a=(0,i.Z)("div",{id:"recaptcha"}))}}class u extends l{load(){return this._include.include("https://www.google.com/recaptcha/api.js",!0),new Promise((function(e){var t=function(){"undefined"==typeof grecaptcha?window.setTimeout((function(){t()}),200):e()};t()}))}validator(){return[]}component(e){return(0,i.Z)(r.Z,{label:gettext("Please solve the quick test"),for:"id_captcha",labelClass:e.labelClass||"",controlClass:e.controlClass||"",validation:e.form.state.errors.captcha,helpText:gettext("This test helps us prevent automated spam registrations on our site.")},void 0,(0,i.Z)(p,{binding:e.form.bindInput("captcha"),siteKey:this._context.get("SETTINGS").recaptcha_site_key}))}}t.ZP=new class{init(e,t,s,a){switch(e.get("SETTINGS").captcha_type){case"no":this._captcha=new d;break;case"qa":this._captcha=new c;break;case"re":this._captcha=new u}this._captcha.init(e,t,s,a)}load(){return this._captcha.load()}validator(){return this._captcha.validator()}component(e){return this._captcha.component(e)}}},96142:function(e,t,s){"use strict";var a=s(19755);t.Z=new class{init(e){this._staticUrl=e,this._included=[]}include(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];-1===this._included.indexOf(e)&&(this._included.push(e),this._include(e,t))}_include(e,t){a.ajax({url:(t?"":this._staticUrl)+e,cache:!0,dataType:"script"})}}},62833:function(e,t,s){"use strict";let a=window.localStorage;t.Z=new class{init(e){this._prefix=e,this._watchers=[],window.addEventListener("storage",(e=>{let t=JSON.parse(e.newValue);this._watchers.forEach((function(s){s.key===e.key&&e.oldValue!==e.newValue&&s.callback(t)}))}))}set(e,t){a.setItem(this._prefix+e,JSON.stringify(t))}get(e){let t=a.getItem(this._prefix+e);return t?JSON.parse(t):null}watch(e,t){this._watchers.push({key:this._prefix+e,callback:t})}}},8621:function(e,t,s){"use strict";var a=s(4869),i=s(19755);t.Z=new class{init(e){this._element=e,this._component=null}show(e){this._component===e?this.hide():(this._component=e,(0,a.Z)(e,this._element.id),i(this._element).addClass("open"))}showConnected(e,t){this._component===e?this.hide():(this._component=e,(0,a.Z)(t,this._element.id,!0),i(this._element).addClass("open"))}hide(){i(this._element).removeClass("open"),this._component=null}}},59801:function(e,t,s){"use strict";var a=s(73935),i=s.n(a),o=s(4869),n=s(19755);t.Z=new class{init(e){this._element=e,this._modal=n(e).modal({show:!1}),this._modal.on("hidden.bs.modal",(()=>{i().unmountComponentAtNode(this._element)}))}show(e){(0,o.Z)(e,this._element.id),this._modal.modal("show")}hide(){this._modal.modal("hide")}}},53328:function(e,t,s){"use strict";t.Z=new class{init(e,t){this._indexTitle=e,this._forumName=t}set(e){if(!e)return void(document.title=this._indexTitle||this._forumName);"string"==typeof e&&(e={title:e});let t=e.title;e.page>1&&(t+=" ("+interpolate(gettext("page: %(page)s"),{page:e.page},!0)+")"),e.parent&&(t+=" | "+e.parent),document.title=t+" | "+this._forumName}}},55547:function(e,t,s){"use strict";t.Z=new class{init(e,t){this._ajax=e,this._snackbar=t,this._polls={}}start(e){this.stop(e.poll);const t=()=>{this._polls[e.poll]=e,this._ajax.get(e.url,e.data||null).then((s=>{this._polls[e.poll]._stopped||(e.update(s),this._polls[e.poll].timeout=window.setTimeout(t,e.frequency))}),(t=>{this._polls[e.poll]._stopped||(e.error?e.error(t):this._snackbar.apiError(t))}))};e.delayed?this._polls[e.poll]={timeout:window.setTimeout(t,e.frequency)}:t()}stop(e){this._polls[e]&&(window.clearTimeout(this._polls[e].timeout),this._polls[e]._stopped=!0)}}},64646:function(e,t,s){"use strict";var a=s(4942),i=s(57588),o=s.n(i),n=s(73935),r=s.n(n),l=s(78107),d=s(4869);t.Z=new class{constructor(){(0,a.Z)(this,"close",(()=>{this.unsetBeforeUnload(),this._props=null,this._isOpen&&!this._isClosing&&(this._isClosing=!0,this._mount.classList.remove("show"),window.setTimeout((()=>{r().unmountComponentAtNode(this._mount),this._observer.unobserve(this._mount),this._spacer.style.height="0px;",this._isClosing=!1,this._isOpen=!1,this._mode=null}),300))}))}init(e,t,s){this._ajax=e,this._snackbar=t,this._mount=s,this._mode=null,this._spacer=document.getElementById("posting-spacer"),this._observer=new ResizeObserver((e=>{this._spacer.style.height=e[0].contentRect.height+"px"})),this._isOpen=!1,this._isClosing=!1,this._beforeunloadSet=!1,this._props=null}isOpen(){return this._isOpen}setBeforeUnload(){this._beforeunloadSet||(window.addEventListener("beforeunload",this.beforeUnload,{capture:!0}),this._beforeunloadSet=!0)}unsetBeforeUnload(){window.removeEventListener("beforeunload",this.beforeUnload,{capture:!0}),this._beforeunloadSet=!1}beforeUnload(e){return e.returnValue="true","true"}open(e){if(!1===this._isOpen)"QUOTE"===e.mode?this._mode="REPLY":this._mode=e.mode,this._isOpen=e.submit,this._realOpen(Object.assign({},e,{mode:this._mode}));else if("QUOTE"===e.mode)this._realOpen(Object.assign({},this._props,{config:e.config,context:e.context}));else if(this._isOpen!==e.submit){let t=gettext("You are already working on other message. Do you want to discard it?");window.confirm(t)&&(this._mode=e.mode,this._isOpen=e.submit,this._realOpen(e))}else"REPLY"==this._mode&&"REPLY"==e.mode&&this._realOpen(e)}_realOpen(e){(0,d.Z)(o().createElement(l.ZP,e),this._mount.id),this._props=e,this._mount.classList.add("show"),this._observer.observe(this._mount),this.setBeforeUnload()}}},53904:function(e,t,s){"use strict";var a=s(27346);t.Z=new class{init(e){this._store=e,this._timeout=null}alert(e,t){this._timeout?(window.clearTimeout(this._timeout),this._store.dispatch((0,a.p2)()),this._timeout=window.setTimeout((()=>{this._timeout=null,this.alert(e,t)}),300)):(this._store.dispatch((0,a.OV)(e,t)),this._timeout=window.setTimeout((()=>{this._store.dispatch((0,a.p2)()),this._timeout=null}),5e3))}info(e){this.alert(e,"info")}success(e){this.alert(e,"success")}warning(e){this.alert(e,"warning")}error(e){this.alert(e,"error")}apiError(e){let t=e.detail;t||(t=404===e.status?gettext("Action link is invalid."):gettext("Unknown error has occured.")),403===e.status&&"Permission denied"===t&&(t=gettext("You don't have permission to perform this action.")),this.error(t)}}},90287:function(e,t,s){"use strict";var a=s(41438);t.Z=new class{constructor(){this._store=null,this._reducers={},this._initialState={}}addReducer(e,t,s){this._reducers[e]=t,this._initialState[e]=s}init(){this._store=(0,a.createStore)((0,a.combineReducers)(this._reducers),this._initialState)}getStore(){return this._store}getState(){return this._store.getState()}dispatch(e){return this._store.dispatch(e)}}},59940:function(e,t,s){"use strict";t.Z=new class{init(e){this._include=e,this._isLoaded=!1}scorePassword(e,t){return this._isLoaded?zxcvbn(e,t).score:0}load(){return this._isLoaded?this._loadedPromise():(this._include.include("misago/js/zxcvbn.js"),this._loadingPromise())}_loadingPromise(){const e=this;return new Promise((function(t,s){var a=function(){let i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;i+=1,i>200?s():"undefined"==typeof zxcvbn?window.setTimeout((function(){a(i)}),200):(e._isLoaded=!0,t())};a()}))}_loadedPromise(){return new Promise((function(e){e()}))}}},93051:function(e,t,s){"use strict";s.d(t,{Z:function(){return g}});var a,i=s(22928),o=s(30381),n=s.n(o),r=s(57588),l=s.n(r),d=s(73935),c=s.n(d),p=s(37424),u=class extends l().Component{getReasonMessage(){return this.props.message.html?(0,i.Z)("div",{className:"lead",dangerouslySetInnerHTML:{__html:this.props.message.html}}):(0,i.Z)("p",{className:"lead"},void 0,this.props.message.plain)}getExpirationMessage(){if(this.props.expires){if(this.props.expires.isAfter(n()())){let e=interpolate(gettext("This ban expires on %(expires_on)s."),{expires_on:this.props.expires.format("LL, LT")},!0),t=interpolate(gettext("This ban expires %(expires_on)s."),{expires_on:this.props.expires.fromNow()},!0);return(0,i.Z)("abbr",{title:e},void 0,t)}return gettext("This ban has expired.")}return gettext("This ban is permanent.")}render(){return(0,i.Z)("div",{className:"page page-error page-error-banned"},void 0,(0,i.Z)("div",{className:"container"},void 0,(0,i.Z)("div",{className:"message-panel"},void 0,a||(a=(0,i.Z)("div",{className:"message-icon"},void 0,(0,i.Z)("span",{className:"material-icon"},void 0,"highlight_off"))),(0,i.Z)("div",{className:"message-body"},void 0,this.getReasonMessage(),(0,i.Z)("p",{className:"message-footnote"},void 0,this.getExpirationMessage())))))}},h=s(32233),m=s(90287);let v=(0,p.$j)((function(e){return e.tick}))(u);function g(e,t){if(c().render((0,i.Z)(p.zt,{store:m.Z.getStore()},void 0,(0,i.Z)(v,{message:e.message,expires:e.expires_on?n()(e.expires_on):null})),document.getElementById("page-mount")),void 0===t||t){let e=h.Z.get("SETTINGS").forum_name;document.title=gettext("You are banned")+" | "+e,window.history.pushState({},"",h.Z.get("BANNED_URL"))}}},69130:function(e,t,s){"use strict";function a(e,t){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=[],i=[];if(e.forEach((function(e){i.push(e),i.length===t&&(a.push(i),i=[])})),!1!==s&&i.length>0&&i.length":">",'"':""","'":"'"};function i(e){return e.replace(/[&<>"']/g,(function(e){return a[e]}))}},48772:function(e,t,s){"use strict";function a(e){return e>1073741824?i(e/1073741824)+" GB":e>1048576?i(e/1048576)+" MB":e>1024?i(e/1024)+" KB":i(e)+" B"}function i(e){return e.toFixed(1)}s.d(t,{Z:function(){return a}})},4869:function(e,t,s){"use strict";s.d(t,{Z:function(){return l}});var a=s(22928),i=(s(57588),s(73935)),o=s.n(i),n=s(37424),r=s(90287);function l(e,t){let s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=document.getElementById(t),l=e.props?e:(0,a.Z)(e,{});i&&(s?o().render((0,a.Z)(n.zt,{store:r.Z.getStore()},void 0,l),i):o().render(l,i))}},44039:function(e,t,s){"use strict";function a(e,t){return Math.floor(Math.random()*(t-e+1))+e}s.d(t,{e:function(){return a}})},39633:function(e,t,s){"use strict";s.d(t,{Z:function(){return c}});var a=s(22928),i=(s(57588),s(73935)),o=s.n(i),n=s(37424),r=s(69987),l=s(90287);const d=document.getElementById("page-mount");function c(e){let t={component:e.component||null,childRoutes:[]};e.root?t.childRoutes=[{path:e.root,onEnter:function(t,s){s(null,e.paths[0].path)}}].concat(e.paths):t.childRoutes=e.paths,o().render((0,a.Z)(n.zt,{store:l.Z.getStore()},void 0,(0,a.Z)(r.F0,{routes:t,history:r.mW})),d)}},20370:function(e,t,s){"use strict";function a(e,t){if(-1===e.indexOf(t)){let s=e.slice();return s.push(t),s}return e.filter((function(e){return e!==t}))}s.d(t,{ZN:function(){return a}})},55210:function(e,t,s){"use strict";s.d(t,{BS:function(){return p},C1:function(){return n},Do:function(){return d},Ei:function(){return c},HR:function(){return u},Vb:function(){return v},fT:function(){return r},gS:function(){return h},jA:function(){return l},lG:function(){return m}});var a=s(19755);const i=/^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i,o=new RegExp("^[0-9a-z]+$","i");function n(e){return function(t){if(!1===t||null===t||0===a.trim(t).length)return e||gettext("This field is required.")}}function r(e){const t=gettext("You have to accept the terms of service.");return n(e||t)}function l(e){const t=gettext("You have to accept the privacy policy.");return n(e||t)}function d(e){return function(t){if(!i.test(t))return e||gettext("Enter a valid email address.")}}function c(e,t){return function(s){var i="",o=a.trim(s).length;if(oe)return i=t?t(e,o):ngettext("Ensure this value has at most %(limit_value)s character (it has %(show_value)s).","Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).",e),interpolate(i,{limit_value:e,show_value:o},!0)}}function u(e){return c(e,(function(e){return ngettext("Username must be at least %(limit_value)s character long.","Username must be at least %(limit_value)s characters long.",e)}))}function h(e){return p(e,(function(e){return ngettext("Username cannot be longer than %(limit_value)s character.","Username cannot be longer than %(limit_value)s characters.",e)}))}function m(){return function(e){if(!o.test(a.trim(e)))return gettext("Username can only contain latin alphabet letters and digits.")}}function v(e){return function(t){const s=t.length;if(s=i)&&Object.keys(o.O).every((function(e){return o.O[e](s[l])}))?s.splice(l--,1):(r=!1,i0&&e[c-1][2]>i;c--)e[c]=e[c-1];e[c]=[s,a,i]},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,{a:t}),t},o.d=function(e,t){for(var s in t)o.o(t,s)&&!o.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},o.f={},o.e=function(e){return Promise.all(Object.keys(o.f).reduce((function(t,s){return o.f[s](e,t),t}),[]))},o.u=function(e){return"hljs.js"},o.miniCssF=function(e){},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t={},s="misago:",o.l=function(e,a,i,n){if(t[e])t[e].push(a);else{var r,l;if(void 0!==i)for(var d=document.getElementsByTagName("script"),c=0;c 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"misago:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRow = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default FlexRow\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowCol = ({ children, className, shrink }) => (\n \n {children}\n \n)\n\nexport default FlexRowCol\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowSection = ({ auto, children, className }) => (\n \n {children}\n \n)\n\nexport default FlexRowSection\n","import React from \"react\"\n\nconst PageContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeader = ({ children, className, styleName }) => (\n \n
    \n
    \n
    \n {children}\n
    \n
    \n
    \n)\n\nexport default PageHeader\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderBanner = ({ children, className, styleName }) => (\n \n
    \n
    {children}
    \n
    \n \n)\n\nexport default PageHeaderBanner\n","import React from \"react\"\n\nconst PageHeaderContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageHeaderContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderDetails = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default PageHeaderDetails\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderHTMLMessage = ({ className, message }) => (\n \n)\n\nexport default PageHeaderHTMLMessage\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderMessage = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default PageHeaderMessage\n","import React from \"react\"\nimport PageHeader from \"./PageHeader\"\nimport PageHeaderBanner from \"./PageHeaderBanner\"\nimport PageHeaderContainer from \"./PageHeaderContainer\"\nimport PageHeaderDetails from \"./PageHeaderDetails\"\n\nconst PageHeaderPlain = ({ styleName, header, message }) => (\n \n \n \n

    {header}

    \n
    \n {message && (\n {message}\n )}\n
    \n
    \n)\n\nexport default PageHeaderPlain\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst AGREEMENT_URL = '%(agreement)s'\n\nconst RegisterLegalFootnote = (props) => {\n const {\n errors,\n privacyPolicy,\n termsOfService,\n onPrivacyPolicyChange,\n onTermsOfServiceChange,\n } = props\n\n const termsOfServiceId = misago.get(\"TERMS_OF_SERVICE_ID\")\n const termsOfServiceUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n\n const privacyPolicyId = misago.get(\"PRIVACY_POLICY_ID\")\n const privacyPolicyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n\n if (!termsOfServiceId && !privacyPolicyId) return null\n\n return (\n
    \n \n \n
    \n )\n}\n\nconst LegalAgreement = (props) => {\n const { agreement, checked, errors, url, value, onChange } = props\n\n if (!url) return null\n\n const agreementHtml = interpolate(\n AGREEMENT_URL,\n { agreement: escapeHtml(agreement), url: escapeHtml(url) },\n true\n )\n const label = interpolate(\n gettext(\"I have read and accept %(agreement)s.\"),\n { agreement: agreementHtml },\n true\n )\n\n return (\n
    \n \n {errors &&\n errors.map((error, i) => (\n
    \n {error}\n
    \n ))}\n
    \n )\n}\n\nexport default RegisterLegalFootnote\n","import React from \"react\"\nimport misago from \"misago\"\n\nconst StartSocialAuth = (props) => {\n const { buttonClassName, buttonLabel, formLabel, header, labelClassName } =\n props\n const socialAuth = misago.get(\"SOCIAL_AUTH\")\n\n if (socialAuth.length === 0) return null\n\n return (\n
    \n \n
    \n {socialAuth.map(({ pk, name, button_text, button_color, url }) => {\n const className = \"btn btn-block btn-default btn-social-\" + pk\n const style = button_color ? { color: button_color } : null\n const finalButtonLabel =\n button_text || interpolate(buttonLabel, { site: name }, true)\n\n return (\n \n )\n })}\n
    \n
    \n \n
    \n )\n}\n\nconst FormHeader = ({ className, text }) => {\n if (!text) return null\n return
    {text}
    \n}\n\nexport default StartSocialAuth\n","import React from \"react\"\n\nconst ThreadFlags = ({ thread }) => (\n
      \n {thread.weight == 2 && (\n \n bookmark\n \n )}\n {thread.weight == 1 && (\n \n bookmark_outline\n \n )}\n {thread.best_answer && (\n
    • \n check_circle\n
    • \n )}\n {thread.has_poll && (\n
    • \n poll\n
    • \n )}\n {(thread.is_unapproved || thread.has_unapproved_posts) && (\n \n visibility\n \n )}\n {thread.is_closed && (\n
    • \n lock\n
    • \n )}\n {thread.is_hidden && (\n
    • \n visibility_off\n
    • \n )}\n
    \n)\n\nexport default ThreadFlags\n","import React from \"react\"\n\nconst ThreadReplies = ({ thread }) => (\n \n chat_bubble_outline\n {thread.replies > 980\n ? Math.round(thread.replies / 1000) + \"K\"\n : thread.replies}\n \n)\n\nexport default ThreadReplies\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Toolbar = ({ children, className }) => (\n \n)\n\nexport default Toolbar\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarItem = ({ children, className, shrink }) => (\n \n {children}\n \n)\n\nexport default ToolbarItem\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSection = ({ auto, children, className }) => (\n \n {children}\n \n)\n\nexport default ToolbarSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSpacer = ({ className }) => (\n
    \n)\n\nexport default ToolbarSpacer\n","import React from \"react\"\nimport misago from \"misago\"\n\nexport default function (props) {\n const size = props.size || 100\n const size2x = props.size2x || size\n\n return (\n \n )\n}\n\nexport function getSrc(user, size) {\n if (user && user.id) {\n // just avatar hash, size and user id\n return resolveAvatarForSize(user.avatars, size).url\n } else {\n // just append avatar size to file to produce no-avatar placeholder\n return misago.get(\"BLANK_AVATAR_URL\")\n }\n}\n\nexport function resolveAvatarForSize(avatars, size) {\n let avatar = avatars[0]\n avatars.forEach((av) => {\n if (av.size >= size) {\n avatar = av\n }\n })\n return avatar\n}\n","import React from \"react\"\nimport Loader from \"./loader\"\n\nexport default class Button extends React.Component {\n render() {\n let className = \"btn \" + this.props.className\n let disabled = this.props.disabled\n\n if (this.props.loading) {\n className += \" btn-loading\"\n disabled = true\n }\n\n return (\n \n {this.props.children}\n {this.props.loading ? : null}\n \n )\n }\n}\n\nButton.defaultProps = {\n className: \"btn-default\",\n\n type: \"submit\",\n\n loading: false,\n disabled: false,\n\n onClick: null,\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n \n {props.choices.map((item) => {\n return (\n \n {\"- - \".repeat(item.level) + item.label}\n \n )\n })}\n \n )\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n
    \n \n
    \n )\n}\n","import React from \"react\"\nimport Select from \"misago/components/select\"\n\nexport default class extends React.Component {\n onChange = (ev) => {\n const { field, onChange } = this.props\n onChange(field.fieldname, ev.target.value)\n }\n\n render() {\n const { disabled, field, value } = this.props\n const { input } = field\n\n if (input.type === \"select\") {\n return (\n \n )\n }\n\n if (input.type === \"textarea\") {\n return (\n \n )\n }\n\n if (input.type === \"text\") {\n return (\n \n )\n }\n\n return null\n }\n}\n","import React from \"react\"\nimport FieldInput from \"./field-input\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport default function ({ disabled, errors, fields, name, onChange, value }) {\n return (\n
    \n {name}\n {fields.map((field) => {\n return (\n \n \n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Fieldset from \"./fieldset\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n errors: {},\n }\n\n const groups = props.groups.length\n for (let i = 0; i < groups; i++) {\n const group = props.groups[i]\n const fields = group.fields.length\n for (let f = 0; f < fields; f++) {\n const fieldname = group.fields[f].fieldname\n const initial = group.fields[f].initial\n this.state[fieldname] = initial\n }\n }\n }\n\n send() {\n const data = Object.assign({}, this.state, {\n errors: null,\n isLoading: null,\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess(data) {\n this.props.onSuccess(data)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({ errors: rejection })\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onChange = (name, value) => {\n this.setState({\n [name]: value,\n })\n }\n\n render() {\n return (\n
    \n
    \n {this.props.groups.map((group, i) => {\n return (\n \n )\n })}\n
    \n
    \n {\" \"}\n \n
    \n
    \n )\n }\n}\n\nexport function CancelButton({ onCancel, disabled }) {\n if (!onCancel) return null\n\n return (\n \n {gettext(\"Cancel\")}\n \n )\n}\n","import React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport Loader from \"./loader\"\nimport Form from \"./form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n loading: true,\n groups: null,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.api).then(\n (groups) => {\n this.setState({\n loading: false,\n\n groups,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n if (this.props.cancel) {\n this.props.cancel()\n }\n }\n )\n }\n\n render() {\n const { groups, loading } = this.state\n\n return (\n
    \n
    \n

    {gettext(\"Edit details\")}

    \n
    \n \n \n \n
    \n )\n }\n}\n\nexport function FormDisplay({ api, display, groups, onCancel, onSuccess }) {\n if (!display) return null\n\n return (\n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isValidated() {\n return typeof this.props.validation !== \"undefined\"\n }\n\n getClassName() {\n let className = \"form-group\"\n if (this.isValidated()) {\n className += \" has-feedback\"\n if (this.props.validation === null) {\n className += \" has-success\"\n } else {\n className += \" has-error\"\n }\n }\n return className\n }\n\n getFeedback() {\n if (this.props.validation) {\n return (\n
    \n {this.props.validation.map((error, i) => {\n return

    {error}

    \n })}\n
    \n )\n } else {\n return null\n }\n }\n\n getFeedbackDescription() {\n if (this.isValidated()) {\n return (\n \n {this.props.validation ? gettext(\"(error)\") : gettext(\"(success)\")}\n \n )\n } else {\n return null\n }\n }\n\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n \n {this.props.label + \":\"}\n \n
    \n {this.props.children}\n {this.getFeedbackDescription()}\n {this.getFeedback()}\n {this.getHelpText()}\n {this.props.extra || null}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { required } from \"misago/utils/validators\"\nimport snackbar from \"misago/services/snackbar\"\n\nlet validateRequired = required()\n\nexport default class extends React.Component {\n validate() {\n let errors = {}\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: this.state.validators.required || this.state.validators,\n optional: this.state.validators.optional || {},\n }\n\n let validatedFields = []\n\n // add required fields to validation\n for (let name in validators.required) {\n if (\n validators.required.hasOwnProperty(name) &&\n validators.required[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // add optional fields to validation\n for (let name in validators.optional) {\n if (\n validators.optional.hasOwnProperty(name) &&\n validators.optional[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // validate fields values\n for (let i in validatedFields) {\n let name = validatedFields[i]\n let fieldErrors = this.validateField(name, this.state[name])\n\n if (fieldErrors === null) {\n errors[name] = null\n } else if (fieldErrors) {\n errors[name] = fieldErrors\n }\n }\n\n return errors\n }\n\n isValid() {\n let errors = this.validate()\n for (let field in errors) {\n if (errors.hasOwnProperty(field)) {\n if (errors[field] !== null) {\n return false\n }\n }\n }\n\n return true\n }\n\n validateField(name, value) {\n let errors = []\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: (this.state.validators.required || this.state.validators)[name],\n optional: (this.state.validators.optional || {})[name],\n }\n\n let requiredError = validateRequired(value) || false\n\n if (validators.required) {\n if (requiredError) {\n errors = [requiredError]\n } else {\n for (let i in validators.required) {\n let validationError = validators.required[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n }\n\n return errors.length ? errors : null\n } else if (requiredError === false && validators.optional) {\n for (let i in validators.optional) {\n let validationError = validators.optional[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n\n return errors.length ? errors : null\n }\n\n return false // false === field wasn't validated\n }\n\n bindInput = (name) => {\n return (event) => {\n this.changeValue(name, event.target.value)\n }\n }\n\n changeValue = (name, value) => {\n let newState = {\n [name]: value,\n }\n\n const formErrors = this.state.errors || {}\n formErrors[name] = this.validateField(name, newState[name])\n newState.errors = formErrors\n\n this.setState(newState)\n }\n\n clean() {\n return true\n }\n\n send() {\n return null\n }\n\n handleSuccess(success) {\n return\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n }\n\n handleSubmit = (event) => {\n // we don't reload page on submissions\n if (event) {\n event.preventDefault()\n }\n\n if (this.state.isLoading) {\n return\n }\n\n if (this.clean()) {\n this.setState({ isLoading: true })\n let promise = this.send()\n\n if (promise) {\n promise.then(\n (success) => {\n this.setState({ isLoading: false })\n this.handleSuccess(success)\n },\n (rejection) => {\n this.setState({ isLoading: false })\n this.handleError(rejection)\n }\n )\n } else {\n this.setState({ isLoading: false })\n }\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isActive() {\n if (this.props.isControlled) {\n return this.props.isActive\n } else {\n if (this.props.path) {\n return document.location.pathname.indexOf(this.props.path) === 0\n } else {\n return false\n }\n }\n }\n\n getClassName() {\n if (this.isActive()) {\n return (\n (this.props.className || \"\") +\n \" \" +\n (this.props.activeClassName || \"active\")\n )\n } else {\n return this.props.className || \"\"\n }\n }\n\n render() {\n return
  • {this.props.children}
  • \n }\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"./button\"\nimport Form from \"./form\"\nimport FormGroup from \"./form-group\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n bestAnswer: \"0\",\n poll: \"0\",\n }\n }\n\n clean() {\n if (this.props.polls && this.state.poll === \"0\") {\n const confirmation = window.confirm(\n gettext(\"Are you sure you want to delete all polls?\")\n )\n return confirmation\n }\n\n return true\n }\n\n send() {\n const data = Object.assign({}, this.props.data, {\n best_answer: this.state.bestAnswer,\n poll: this.state.poll,\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess = (success) => {\n this.props.onSuccess(success)\n modal.hide()\n }\n\n handleError = (rejection) => {\n this.props.onError(rejection)\n }\n\n onBestAnswerChange = (event) => {\n this.changeValue(\"bestAnswer\", event.target.value)\n }\n\n onPollChange = (event) => {\n this.changeValue(\"poll\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Merge threads\")}

    \n
    \n \n
    \n \n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n \n
    \n
    \n )\n }\n}\n\nexport function BestAnswerSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map((choice) => {\n return (\n \n )\n })}\n \n \n )\n}\n\nexport function PollSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map((choice) => {\n return (\n \n )\n })}\n \n \n )\n}\n","const ytRegExp = new RegExp(\n \"^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*\"\n)\n\nexport class OneBox {\n constructor() {\n this._youtube = {}\n }\n\n render = (element) => {\n if (!element) return\n this.highlightCode(element)\n this.embedYoutubePlayers(element)\n }\n\n highlightCode(element) {\n import(\"highlight\").then(({ default: hljs }) => {\n const codeblocks = element.querySelectorAll(\"pre>code\")\n for (let i = 0; i < codeblocks.length; i++) {\n hljs.highlightElement(codeblocks[i])\n }\n })\n }\n\n embedYoutubePlayers(element) {\n const anchors = element.querySelectorAll(\"p>a\")\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i]\n const p = a.parentNode\n const onlyChild = p.childNodes.length === 1\n\n if (!this._youtube[a.href]) {\n this._youtube[a.href] = parseYoutubeUrl(a.href)\n }\n\n const youtubeMovie = this._youtube[a.href]\n if (onlyChild && !!youtubeMovie && youtubeMovie.data !== false) {\n this.swapYoutubePlayer(a, youtubeMovie)\n }\n }\n }\n\n swapYoutubePlayer(element, youtube) {\n let url = \"https://www.youtube.com/embed/\"\n url += youtube.video\n url += \"?feature=oembed\"\n if (youtube.start) {\n url += \"&start=\" + youtube.start\n }\n\n const player = $(\n '\"\n )\n $(element).replaceWith(player)\n player.wrap('
    ')\n }\n}\n\nexport default new OneBox()\n\nexport function parseYoutubeUrl(url) {\n const cleanedUrl = cleanUrl(url)\n const video = getVideoIdFromUrl(cleanedUrl)\n\n if (!video) return null\n\n let start = 0\n if (cleanedUrl.indexOf(\"?\") > 0) {\n const query = cleanedUrl.substr(cleanedUrl.indexOf(\"?\") + 1)\n const timebit = query.split(\"&\").filter((i) => {\n return i.substr(0, 2) === \"t=\"\n })[0]\n\n if (timebit) {\n const bits = timebit.substr(2).split(\"m\")\n if (bits[0].substr(-1) === \"s\") {\n start += parseInt(bits[0].substr(0, bits[0].length - 1))\n } else {\n start += parseInt(bits[0]) * 60\n if (!!bits[1] && bits[1].substr(-1) === \"s\") {\n start += parseInt(bits[1].substr(0, bits[1].length - 1))\n }\n }\n }\n }\n\n return {\n start,\n video,\n }\n}\n\nexport function cleanUrl(url) {\n let clean = url\n\n if (url.substr(0, 8) === \"https://\") {\n clean = clean.substr(8)\n } else if (url.substr(0, 7) === \"http://\") {\n clean = clean.substr(7)\n }\n\n if (clean.substr(0, 4) === \"www.\") {\n clean = clean.substr(4)\n }\n\n return clean\n}\n\nexport function getVideoIdFromUrl(url) {\n if (url.indexOf(\"youtu\") === -1) return null\n\n const video = url.match(ytRegExp)\n if (video) {\n return video[1]\n }\n return null\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport onebox from \"misago/services/one-box\"\n\nexport default class extends React.Component {\n componentDidMount() {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n componentDidUpdate(prevProps, prevState) {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n return nextProps.markup !== this.props.markup\n }\n\n render() {\n return (\n {\n this.documentNode = node\n }}\n />\n )\n }\n}\n\nfunction revealSpoiler(event) {\n var btn = event.target\n $(btn).parent().parent().addClass(\"revealed\")\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends PanelMessage {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n \n {gettext(\"Ok\")}\n \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\n\nexport default function (props) {\n if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default(props) {\n return (\n
    \n \n
    \n )\n}\n\nexport function Invalid(props) {\n return (\n
    \n

    \n {gettext(\"This post's contents cannot be displayed.\")}\n

    \n

    \n {gettext(\"This error is caused by invalid post content manipulation.\")}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n const { category, thread } = post\n\n const tooltip = interpolate(\n gettext(\"posted %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n },\n true\n )\n\n return (\n
    \n \n {thread.title}\n \n \n {category.name}\n \n \n {post.posted_on.fromNow()}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n return (\n \n {gettext(\"See post\")}\n chevron_right\n \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\n\nexport default function ({ post }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n {post.poster_name}\n
    \n \n {gettext(\"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, poster }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Anonymous from \"./anonymous\"\nimport Registered from \"./registered\"\n\nexport default function ({ post, poster }) {\n if (poster && poster.id) {\n return \n }\n\n return \n}\n","import React from \"react\"\nimport Body from \"./body\"\nimport Header from \"./header\"\nimport PostSide from \"./post-side\"\n\nexport default function ({ post, poster }) {\n const user = poster || post.poster\n\n let className = \"post\"\n if (user && user.rank.css_class) {\n className += \" post-\" + user.rank.css_class\n }\n\n return (\n
  • \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default function () {\n return (\n
      \n
    • \n
      \n
      \n
      \n
      \n
      \n
      \n \n \n \n
      \n
      \n
      \n \n \n  \n \n \n
      \n \n \n  \n \n \n
      \n
      \n
      \n
      \n \n  \n \n
      \n
      \n
      \n

      \n \n  \n \n  \n \n  \n \n  \n \n  \n \n

      \n
      \n
      \n
      \n
      \n
      \n
    • \n
    \n )\n}\n","import React from \"react\"\nimport Post from \"./post\"\nimport Preview from \"./preview\"\n\nexport default function ({ isReady, posts, poster }) {\n if (!isReady) {\n return \n }\n\n return (\n
      \n {posts.map((post) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport posting from \"../../services/posting\"\nimport { getGlobalState, getQuoteMarkup } from \"../posting\"\n\nexport default class PostingQuoteSelection extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n range: null,\n rect: null,\n }\n\n this.element = null\n }\n\n selected = () => {\n if (this.element) {\n const range = getQuoteSelection(this.element) || null\n const rect = range ? range.getBoundingClientRect() : null\n\n this.setState({ range, rect })\n }\n }\n\n reply = () => {\n if (!posting.isOpen()) {\n const content = getQuoteMarkup(this.state.range)\n posting.open(Object.assign({}, this.props.posting, { default: content }))\n\n this.setState({ range: null, rect: null })\n\n window.setTimeout(focusEditor, 1000)\n } else {\n const globalState = getGlobalState()\n if (globalState && !globalState.disabled) {\n globalState.quote(getQuoteMarkup(this.state.range))\n this.setState({ range: null, rect: null })\n focusEditor()\n }\n }\n }\n\n render = () => (\n
    \n {\n if (element) {\n this.element = element\n }\n }}\n onMouseUp={this.selected}\n onTouchEnd={this.selected}\n >\n {this.props.children}\n
    \n {!!this.state.rect && (\n \n
    \n
    \n \n {pgettext(\"post reply\", \"Quote\")}\n \n
    \n
    \n )}\n
    \n )\n}\n\nfunction focusEditor() {\n const textarea = document.querySelector(\"#posting-mount textarea\")\n textarea.focus()\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length\n}\n\nconst getQuoteSelection = (container) => {\n if (typeof window.getSelection === \"undefined\") return\n\n // Validate that selection is of valid type and has one range\n const selection = window.getSelection()\n if (!selection) return\n if (selection.type !== \"Range\") return\n if (selection.rangeCount !== 1) return\n\n // Validate that selection is within the container and post's article\n const range = selection.getRangeAt(0)\n if (!isRangeContained(range, container)) return\n if (!isPostContained(range)) return\n if (!isAnyTextSelected(range.cloneContents())) return\n\n return range\n}\n\nconst isRangeContained = (range, container) => {\n const node = range.commonAncestorContainer\n if (node === container) return true\n\n let p = node.parentNode\n while (p) {\n if (p === container) return true\n p = p.parentNode\n }\n\n return false\n}\n\nconst isPostContained = (range) => {\n const element = range.commonAncestorContainer\n if (element.nodeName === \"ARTICLE\") return true\n if (element.dataset && element.dataset.noquote === \"1\") return false\n let p = element.parentNode\n while (p) {\n if (p.dataset && p.dataset.noquote === \"1\") return false\n if (p.nodeName === \"ARTICLE\") return true\n p = p.parentNode\n }\n return false\n}\n\nconst isAnyTextSelected = (node) => {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i]\n if (child.nodeType === Node.TEXT_NODE) {\n if (child.textContent && child.textContent.trim().length > 0) return true\n }\n if (child.nodeName === \"IMG\") return true\n if (isAnyTextSelected(child)) return true\n }\n\n return false\n}\n","const getQuoteMarkup = (range) => {\n const metadata = getQuoteMetadata(range)\n let markup = convertNodesToMarkup(range.cloneContents().childNodes, [])\n let prefix = metadata ? `[quote=\"${metadata}\"]\\n` : \"[quote]\\n\"\n let suffix = \"\\n[/quote]\\n\\n\"\n\n const codeBlock = getQuoteCodeBlock(range)\n if (codeBlock) {\n prefix += codeBlock.syntax ? `[code=${codeBlock.syntax}]\\n` : \"[code]\\n\"\n suffix = \"\\n[/code]\" + suffix\n } else if (isNodeInlineCodeBlock(range)) {\n markup = markup.trim()\n prefix += \"`\"\n suffix = \"`\" + suffix\n } else {\n markup = markup.trim()\n }\n\n return prefix + markup + suffix\n}\n\nexport default getQuoteMarkup\n\nconst getQuoteMetadata = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeElementWithQuoteMetadata(node)) {\n return getQuoteMetadataFromNode(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return getQuoteMetadataFromNode(p)\n }\n p = p.parentNode\n }\n\n return \"\"\n}\n\nconst isNodeElementWithQuoteMetadata = (node) => {\n if (node.nodeType !== Node.ELEMENT_NODE) return false\n if (node.nodeName === \"ARTICLE\") return true\n if (node.nodeName === \"BLOCKQUOTE\") {\n return node.dataset && node.dataset.block === \"quote\"\n }\n\n return false\n}\n\nconst getQuoteMetadataFromNode = (element) => {\n if (element.dataset) {\n return element.dataset.author || null\n }\n return null\n}\n\nconst getQuoteCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeCodeBlock(node)) {\n return getNodeCodeBlockMeta(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeCodeBlock(p)) {\n return getNodeCodeBlockMeta(p)\n }\n p = p.parentNode\n }\n\n return null\n}\n\nconst isNodeCodeBlock = (node) => {\n return node.nodeName === \"PRE\"\n}\n\nconst isNodeInlineCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (node.nodeName === \"CODE\") {\n return true\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return false\n }\n\n if (p.nodeName === \"CODE\") {\n return true\n }\n\n p = p.parentNode\n }\n\n return false\n}\n\nconst getNodeCodeBlockMeta = (node) => {\n if (!node.dataset) {\n return { syntax: null }\n }\n\n return { syntax: node.dataset.syntax || null }\n}\n\nconst convertNodesToMarkup = (nodes, stack) => {\n let markup = \"\"\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n markup += convertNodeToMarkup(node, stack)\n }\n return markup\n}\n\nconst SIMPLE_NODE_MAPPINGS = {\n H1: [\"\\n\\n# \", \"\"],\n H2: [\"\\n\\n## \", \"\"],\n H3: [\"\\n\\n### \", \"\"],\n H4: [\"\\n\\n#### \", \"\"],\n H5: [\"\\n\\n##### \", \"\"],\n H6: [\"\\n\\n###### \", \"\"],\n STRONG: [\"**\", \"**\"],\n EM: [\"*\", \"*\"],\n DEL: [\"~~\", \"~~\"],\n B: [\"[b]\", \"[/b]\"],\n U: [\"[u]\", \"[/u]\"],\n I: [\"[i]\", \"[/i]\"],\n SUB: [\"[sub]\", \"[/sub]\"],\n SUP: [\"[sup]\", \"[/sup]\"],\n}\n\nconst convertNodeToMarkup = (node, stack) => {\n const dataset = node.dataset || {}\n\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\"\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n if (dataset.quote) {\n return dataset.quote || \"\"\n }\n if (dataset.noquote === \"1\") return \"\"\n }\n\n if (\n node.nodeType === Node.ELEMENT_NODE &&\n dataset.quote &&\n dataset.quote.trim()\n ) {\n return \"\"\n }\n\n if (node.nodeName === \"HR\") {\n return \"\\n\\n- - -\"\n }\n\n if (SIMPLE_NODE_MAPPINGS[node.nodeName]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[node.nodeName]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, node.nodeName]) +\n suffix\n )\n }\n\n if (node.nodeName === \"A\") {\n const href = node.href\n const text = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (text) {\n return `[${text}](${href})`\n } else {\n return `!(${href})`\n }\n }\n\n if (node.nodeName === \"IMG\") {\n const src = node.src\n const alt = node.alt\n if (alt) {\n return `![${alt}](${src})`\n } else {\n return `!(${src})`\n }\n }\n\n if (node.nodeName === \"DIV\" || node.nodeName === \"ASIDE\") {\n const block = dataset.block && dataset.block.toUpperCase()\n if (block && SIMPLE_NODE_MAPPINGS[block]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[block]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, block]) +\n suffix\n )\n } else {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n }\n\n if (node.nodeName === \"BLOCKQUOTE\") {\n if (dataset.block === \"spoiler\") {\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"SPOILER\",\n ]).trim()\n\n if (!content) return \"\"\n\n let markup = \"\\n[spoiler]\\n\"\n markup += content\n markup += \"\\n[/spoiler]\"\n return markup\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"QUOTE\",\n ]).trim()\n\n if (!content) return \"\"\n\n const metadata = getQuoteMetadataFromNode(node)\n let markup = metadata ? `\\n[quote=${metadata}]\\n` : \"\\n\\n[quote]\\n\"\n markup += content\n markup += \"\\n[/quote]\"\n return markup\n }\n\n if (node.nodeName === \"PRE\") {\n const syntax = dataset.syntax || null\n const code = node.querySelector(\"code\")\n const content = code ? code.innerText || \"\" : \"\"\n\n if (!content.trim()) return \"\"\n\n return \"\\n[code\" + (syntax ? \"=\" + syntax : \"\") + \"]\" + content + \"[/code]\"\n }\n\n if (node.nodeName === \"CODE\") {\n return \"`\" + node.innerText + \"`\"\n }\n\n if (node.nodeName === \"P\") {\n return (\n \"\\n\" + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n const prefix = level === 0 ? \"\\n\" : \"\"\n return (\n prefix + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"LI\") {\n let prefix = \"\"\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n for (let i = 1; i < level; i++) {\n prefix += \" \"\n }\n\n const ordered = stack[stack.length - 1] === \"OL\"\n if (ordered) {\n prefix += dataset.index ? dataset.index + \". \" : \"1. \"\n } else {\n prefix += \"- \"\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (!content.trim()) return \"\"\n\n return \"\\n\" + prefix + content\n }\n\n if (node.nodeName === \"SPAN\") {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n\n return \"\"\n}\n","export function getGlobalState() {\n return window.misagoReply\n}\n\nexport function setGlobalState(disabled, quote) {\n window.misagoReply = { disabled, quote }\n}\n\nexport function clearGlobalState() {\n window.misagoReply = null\n}\n","import moment from \"moment\"\n\nexport function clean(attachments) {\n return attachments\n .filter((attachment) => {\n return attachment.id && !attachment.isRemoved\n })\n .map((a) => {\n return a.id\n })\n}\n\nexport function hydrate(attachments) {\n return attachments.map((attachment) => {\n return Object.assign({}, attachment, {\n uploaded_on: moment(attachment.uploaded_on),\n })\n })\n}\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupAttachmentModal({ attachment }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Attachment details\")}\n

    \n
    \n
    \n {!!attachment.is_image && (\n
    \n \n \"\"\n \n
    \n )}\n
    \n {attachment.filename}\n
    \n
    \n
    \n \n {attachment.filetype + \", \" + formatFilesize(attachment.size)}\n \n
    \n {pgettext(\"markup editor\", \"Type and size\")}\n
    \n
    \n
    \n \n \n {attachment.uploaded_on.fromNow()}\n \n \n
    \n {pgettext(\"markup editor\", \"Uploaded at\")}\n
    \n
    \n
    \n {attachment.url.uploader ? (\n \n {attachment.uploader_name}\n \n ) : (\n {attachment.uploader_name}\n )}\n
    \n {pgettext(\"markup editor\", \"Uploader\")}\n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n","const wrapSelection = (selection, update, prefix, suffix, def) => {\n const text = selection.text || def || \"\"\n let newValue = selection.prefix\n newValue += prefix + text + suffix\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.start + prefix.length\n selection.textarea.setSelectionRange(caret, caret + text.length)\n }, 250)\n}\n\nconst replaceSelection = (selection, update, text) => {\n let newValue = selection.prefix\n newValue += text\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.end + text.length\n selection.textarea.setSelectionRange(caret, caret)\n }, 250)\n}\n\nconst getSelection = (textarea) => {\n if (document.selection) {\n textarea.focus()\n const range = document.selection.createRange()\n const length = range.text.length\n range.moveStart(\"character\", -textarea.value.length)\n return createRange(textarea, range.text.length - length, range.text.length)\n }\n\n if (textarea.selectionStart || textarea.selectionStart == \"0\") {\n return createRange(textarea, textarea.selectionStart, textarea.selectionEnd)\n }\n}\n\nconst createRange = (textarea, start, end) => {\n return {\n textarea: textarea,\n start: start,\n end: end,\n text: textarea.value.substring(start, end),\n prefix: textarea.value.substring(0, start),\n suffix: textarea.value.substring(end),\n }\n}\n\nexport function focus(textarea) {\n const scroll = textarea.scrollTop\n textarea.focus()\n textarea.scrollTop = scroll\n}\n\nexport { getSelection, replaceSelection, wrapSelection }\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport MarkupAttachmentModal from \"./MarkupAttachmentModal\"\nimport { getSelection, replaceSelection } from \"./operations\"\n\nconst MarkupEditorAttachment = ({\n attachment,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n
    \n {attachment.id ? (\n {\n event.preventDefault()\n modal.show()\n }}\n >\n {attachment.filename}\n \n ) : (\n {attachment.filename}\n )}\n
    \n
      \n {!attachment.id &&
    • {attachment.progress + \"%\"}
    • }\n {!!attachment.filetype &&
    • {attachment.filetype}
    • }\n {attachment.size > 0 &&
    • {formatFilesize(attachment.size)}
    • }\n
    \n
    \n
    \n {!!attachment.id && (\n
    \n {\n const markup = getAttachmentMarkup(attachment)\n const selection = getSelection(element)\n replaceSelection(selection, update, markup)\n }}\n >\n flip_to_front\n \n {\n setState(({ attachments }) => {\n const confirm = window.confirm(\n pgettext(\"markup editor\", \"Remove this attachment?\")\n )\n\n if (confirm) {\n return {\n attachments: attachments.filter(\n ({ id }) => id !== attachment.id\n ),\n }\n }\n })\n }}\n >\n close\n \n
    \n )}\n {!attachment.id && !!attachment.key && (\n
    \n {attachment.error && (\n {\n snackbar.error(\n interpolate(\n pgettext(\"markup editor\", \"%(filename)s: %(error)s\"),\n { filename: attachment.filename, error: attachment.error },\n true\n )\n )\n }}\n >\n warning\n \n )}\n {\n setState(({ attachments }) => {\n return {\n attachments: attachments.filter(\n ({ key }) => key !== attachment.key\n ),\n }\n })\n }}\n >\n close\n \n
    \n )}\n
    \n
    \n)\n\nexport default MarkupEditorAttachment\n\nfunction getAttachmentMarkup(attachment) {\n let markup = \"[\"\n\n if (attachment.is_image) {\n markup += \"![\" + attachment.filename + \"]\"\n markup += \"(\" + (attachment.url.thumb || attachment.url.index) + \"?shva=1)\"\n } else {\n markup += attachment.filename\n }\n\n markup += \"](\" + attachment.url.index + \"?shva=1)\"\n return markup\n}\n","import React from \"react\"\nimport MarkupEditorAttachment from \"./MarkupEditorAttachment\"\n\nconst MarkupEditorAttachments = ({\n attachments,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n {attachments.map((attachment) => (\n \n ))}\n
    \n
    \n)\n\nexport default MarkupEditorAttachments\n","import React from \"react\"\nimport Button from \"../button\"\n\nconst MarkupEditorFooter = ({\n canProtect,\n disabled,\n empty,\n preview,\n isProtected,\n submitText,\n showPreview,\n closePreview,\n enableProtection,\n disableProtection,\n}) => (\n
    \n {!!canProtect && (\n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n \n )}\n {!!canProtect && (\n
    \n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n {isProtected\n ? pgettext(\"markup editor\", \"Protected\")\n : pgettext(\"markup editor\", \"Protect\")}\n \n
    \n )}\n
    \n {preview ? (\n \n {pgettext(\"markup editor\", \"Edit\")}\n \n ) : (\n \n {pgettext(\"markup editor\", \"Preview\")}\n \n )}\n \n
    \n)\n\nexport default MarkupEditorFooter\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupCodeModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n syntax: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const syntax = this.state.syntax.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n replaceSelection(\n Object.assign({}, selection, { text }),\n update,\n prefix + \"```\" + syntax + \"\\n\" + text + \"\\n```\\n\\n\"\n )\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Code\")}

    \n
    \n
    \n
    \n \n \n this.setState({ syntax: event.target.value })\n }\n >\n \n {LANGUAGES.map(({ value, name }) => (\n \n ))}\n \n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nconst LANGUAGES = [\n { value: \"bash\", name: \"Bash\" },\n { value: \"c\", name: \"C\" },\n { value: \"c#\", name: \"C#\" },\n { value: \"c++\", name: \"C++\" },\n { value: \"css\", name: \"CSS\" },\n { value: \"diff\", name: \"Diff\" },\n { value: \"go\", name: \"Go\" },\n { value: \"graphql\", name: \"GraphQL\" },\n { value: \"html,\", name: \"HTML\" },\n { value: \"xml\", name: \"XML\" },\n { value: \"json\", name: \"JSON\" },\n { value: \"java\", name: \"Java\" },\n { value: \"javascript\", name: \"JavaScript\" },\n { value: \"kotlin\", name: \"Kotlin\" },\n { value: \"less\", name: \"Less\" },\n { value: \"lua\", name: \"Lua\" },\n { value: \"makefile\", name: \"Makefile\" },\n { value: \"markdown\", name: \"Markdown\" },\n { value: \"objective-C\", name: \"Objective-C\" },\n { value: \"php\", name: \"PHP\" },\n { value: \"perl\", name: \"Perl\" },\n { value: \"plain\", name: \"Plain\" },\n { value: \"text\", name: \"text\" },\n { value: \"python\", name: \"Python\" },\n { value: \"repl\", name: \"REPL\" },\n { value: \"r\", name: \"R\" },\n { value: \"ruby\", name: \"Ruby\" },\n { value: \"rust\", name: \"Rust\" },\n { value: \"scss\", name: \"SCSS\" },\n { value: \"sql\", name: \"SQL\" },\n { value: \"shell\", name: \"Shell Session\" },\n { value: \"swift\", name: \"Swift\" },\n { value: \"toml\", name: \"TOML\" },\n { value: \"ini\", name: \"INI\" },\n { value: \"typescript\", name: \"TypeScript\" },\n { value: \"visualbasic\", name: \"Visual Basic .NET\" },\n { value: \"webassembly\", name: \"WebAssembly\" },\n { value: \"yaml\", name: \"YAML\" },\n]\n\nexport default MarkupCodeModal\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupFormattingHelpModal() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup help\", \"Formatting help\")}\n

    \n
    \n
    \n

    {pgettext(\"markup help\", \"Emphasis text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will have emphasis\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Removed text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be removed\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Underlined text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be underlined\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Italics text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be in italics\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link\")}

    \n \"\n result={\n

    \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link (BBCode)\")}

    \n \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image with alternate text\")}

    \n \n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image (BBCode)\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Mention user by their name\")}

    \n \n @username\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 1\")}

    \n {pgettext(\"markup help\", \"First level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 2\")}

    \n {pgettext(\"markup help\", \"Second level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 3\")}

    \n {pgettext(\"markup help\", \"Third level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 4\")}

    \n {pgettext(\"markup help\", \"Fourth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 5\")}

    \n {pgettext(\"markup help\", \"Fifth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Unordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Ordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text\")}

    \n \" + pgettext(\"markup help\", \"Quoted text\")}\n result={\n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text (BBCode)\")}

    \n \n
    \n {gettext(\"Quoted message:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text with title (BBCode)\")}

    \n \n
    \n {gettext(\"Quote title has written:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Spoiler\")}

    \n \n {pgettext(\"markup help\", \"Secret text\")}\n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Inline code\")}

    \n \n {pgettext(\"markup help\", \"Inline code\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\"markup help\", \"Code block with syntax highlighting\")}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block (BBCode)\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\n \"markup help\",\n \"Code block with syntax highlighting (BBCode)\"\n )}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule (BBCode)\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n\nfunction ExampleFormatting({ markup, result }) {\n return (\n
    \n
    \n
    \n          {markup}\n        
    \n
    \n
    \n
    {result}
    \n
    \n
    \n )\n}\n\nclass ExampleFormattingSpoiler extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n reveal: false,\n }\n }\n\n render() {\n return (\n \n
    \n

    {this.props.children}

    \n
    \n {!this.state.reveal && (\n
    \n {\n this.setState({ reveal: true })\n }}\n >\n {gettext(\"Reveal spoiler\")}\n \n
    \n )}\n \n )\n }\n}\n","const URL_PATTERN = new RegExp(\n \"^(https?:\\\\/\\\\/)?((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.)+[a-z]{2,}|((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))(\\\\:\\\\d+)?(\\\\/[-a-z\\\\d%_.~+]*)*(\\\\?[;&a-z\\\\d%_.~+=-]*)?(\\\\#[-a-z\\\\d_]*)?$\",\n \"i\"\n)\n\nexport default function (str) {\n return URL_PATTERN.test($.trim(str))\n}\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport isUrl from \"../../utils/is-url\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupImageModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (!isUrl(url)) {\n this.setState({ error: gettext(\"Enter a valid address.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"![\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"!(\" + url + \")\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Image\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupImageModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport isUrl from \"../../utils/is-url\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupLinkModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (!isUrl(url)) {\n this.setState({ error: gettext(\"Enter a valid address.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"[\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"<\" + url + \">\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Link\")}

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupLinkModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupQuoteModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n author: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const author = this.state.author.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n if (author) {\n replaceSelection(\n selection,\n update,\n prefix + '[quote=\"' + author + '\"]\\n' + text + \"\\n[/quote]\\n\\n\"\n )\n } else {\n replaceSelection(\n selection,\n update,\n prefix + \"[quote]\\n\" + text + \"\\n[/quote]\\n\\n\"\n )\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Quote\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ author: event.target.value })\n }\n />\n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupQuoteModal\n","import React from \"react\"\n\nconst MarkupEditorButton = ({ disabled, icon, title, onClick }) => (\n \n {icon}\n \n)\n\nexport default MarkupEditorButton\n","import moment from \"moment\"\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\n\nconst ID_LEN = 32\n\nconst uploadFile = (file, setState) => {\n const maxSize = misago.get(\"user\").acl.max_attachment_size * 1024\n\n if (file.size > maxSize) {\n snackbar.error(\n interpolate(\n pgettext(\n \"markup editor\",\n \"File %(filename)s is bigger than %(limit)s.\"\n ),\n { filename: file.name, limit: formatFilesize(maxSize) },\n true\n )\n )\n\n return\n }\n\n let upload = {\n id: null,\n key: getRandomString(ID_LEN),\n error: null,\n uploaded_on: null,\n progress: 0,\n filename: file.name,\n filetype: null,\n is_image: false,\n size: file.size,\n url: null,\n uploader_name: null,\n }\n\n setState(({ attachments }) => {\n return { attachments: [upload].concat(attachments) }\n })\n\n const refreshState = () => {\n setState(({ attachments }) => {\n return { attachments: attachments.concat() }\n })\n }\n\n const data = new FormData()\n data.append(\"upload\", file)\n\n ajax\n .upload(misago.get(\"ATTACHMENTS_API\"), data, (progress) => {\n upload.progress = progress\n refreshState()\n })\n .then(\n (data) => {\n Object.assign(upload, data, { uploaded_on: moment(data.uploaded_on) })\n refreshState()\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n upload.error = rejection.detail\n snackbar.error(rejection.detail)\n refreshState()\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n}\n\nconst ALPHA = \"12345678990abcdefghijklmnopqrstuvwxyz\"\nconst ALPHA_LEN = ALPHA.length\n\nconst getRandomString = (len) => {\n const chars = []\n for (let i = 0; i < len; i++) {\n const index = Math.floor(Math.random() * ALPHA_LEN)\n chars.push(ALPHA[index])\n }\n return chars.join(\"\")\n}\n\nexport default uploadFile\n","import React from \"react\"\nimport misago from \"../../\"\nimport modal from \"../../services/modal\"\nimport MarkupCodeModal from \"./MarkupCodeModal\"\nimport MarkupFormattingHelpModal from \"./MarkupFormattingHelpModal\"\nimport MarkupImageModal from \"./MarkupImageModal\"\nimport MarkupLinkModal from \"./MarkupLinkModal\"\nimport MarkupQuoteModal from \"./MarkupQuoteModal\"\nimport MarkupEditorButton from \"./MarkupEditorButton\"\nimport { getSelection, replaceSelection, wrapSelection } from \"./operations\"\nimport uploadFile from \"./uploadFile\"\n\nconst MarkupEditorToolbar = ({\n disabled,\n element,\n update,\n updateAttachments,\n}) => {\n const actions = [\n {\n name: pgettext(\"markup editor\", \"Strong\"),\n icon: \"format_bold\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"**\",\n \"**\",\n pgettext(\"example markup\", \"Strong text\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Emphasis\"),\n icon: \"format_italic\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"*\",\n \"*\",\n pgettext(\"example markup\", \"Text with emphasis\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Strikethrough\"),\n icon: \"format_strikethrough\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"~~\",\n \"~~\",\n pgettext(\"example markup\", \"Text with strikethrough\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Horizontal ruler\"),\n icon: \"remove\",\n onClick: () => {\n replaceSelection(getSelection(element), update, \"\\n\\n- - -\\n\\n\")\n },\n },\n {\n name: pgettext(\"markup editor\", \"Link\"),\n icon: \"insert_link\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Image\"),\n icon: \"insert_photo\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Quote\"),\n icon: \"format_quote\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Spoiler\"),\n icon: \"visibility_off\",\n onClick: () => {\n insertSpoiler(element, update)\n },\n },\n {\n name: pgettext(\"markup editor\", \"Code\"),\n icon: \"code\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n ]\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n actions.push({\n name: pgettext(\"markup editor\", \"Upload file\"),\n icon: \"file_upload\",\n onClick: () => uploadFiles(updateAttachments),\n })\n }\n\n return (\n
    \n
    \n {actions.map(({ name, icon, onClick }) => (\n \n ))}\n
    \n
    \n
    \n \n more_vert\n \n
      \n {actions.map(({ name, icon, onClick }) => (\n
    • \n \n {icon}\n {name}\n \n
    • \n ))}\n
    \n
    \n {\n modal.show()\n }}\n />\n
    \n
    \n )\n}\n\nconst insertSpoiler = (element, update) => {\n const selection = getSelection(element)\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n wrapSelection(\n selection,\n update,\n prefix + \"[spoiler]\\n\",\n \"\\n[/spoiler]\\n\\n\",\n pgettext(\"markup editor\", \"Spoiler text\")\n )\n}\n\nconst uploadFiles = (setState) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.multiple = \"multiple\"\n\n input.addEventListener(\"change\", function () {\n for (let i = 0; i < input.files.length; i++) {\n uploadFile(input.files[i], setState)\n }\n })\n\n input.click()\n}\n\nexport default MarkupEditorToolbar\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport MisagoMarkup from \"../misago-markup\"\nimport MarkupEditorAttachments from \"./MarkupEditorAttachments\"\nimport MarkupEditorFooter from \"./MarkupEditorFooter\"\nimport MarkupEditorToolbar from \"./MarkupEditorToolbar\"\nimport uploadFile from \"./uploadFile\"\n\nclass MarkupEditor extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n element: null,\n focused: false,\n loading: false,\n preview: false,\n parsed: null,\n }\n }\n\n showPreview = () => {\n if (this.state.loading) return\n\n this.setState({ loading: true, preview: true, element: null })\n\n ajax.post(misago.get(\"PARSE_MARKUP_API\"), { post: this.props.value }).then(\n (data) => {\n this.setState({ loading: false, parsed: data.parsed })\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n this.setState({ loading: false, preview: false })\n }\n )\n }\n\n closePreview = () => {\n this.setState({ loading: false, preview: false })\n }\n\n onDrop = (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!event.dataTransfer.files) return\n\n const { onAttachmentsChange: setState } = this.props\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < event.dataTransfer.files.length; i++) {\n const file = event.dataTransfer.files[i]\n uploadFile(file, setState)\n }\n }\n }\n\n onPaste = (event) => {\n const { onAttachmentsChange: setState } = this.props\n\n const files = []\n for (let i = 0; i < event.clipboardData.items.length; i++) {\n const item = event.clipboardData.items[i]\n if (item.kind === \"file\") {\n files.push(item.getAsFile())\n }\n }\n\n if (files.length) {\n event.preventDefault()\n event.stopPropagation()\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < files.length; i++) {\n uploadFile(files[i], setState)\n }\n }\n }\n }\n\n render = () => (\n \n this.props.onChange({ target: { value } })}\n updateAttachments={this.props.onAttachmentsChange}\n />\n {this.state.preview ? (\n
    \n {this.state.loading ? (\n
    \n
    \n \n
    \n
    \n ) : (\n \n )}\n
    \n ) : (\n {\n if (element && this.state.element !== element) {\n this.setState({ element })\n setMentions(this.props, element)\n }\n }}\n onChange={this.props.onChange}\n onDrop={this.onDrop}\n onFocus={() => this.setState({ focused: true })}\n onPaste={this.onPaste}\n onBlur={() => this.setState({ focused: false })}\n />\n )}\n {this.props.attachments.length > 0 && (\n this.props.onChange({ target: { value } })}\n />\n )}\n \n \n )\n}\n\nfunction setMentions(props, element) {\n $(element).atwho({\n at: \"@\",\n displayTpl: '
  • \"\"${username}
  • ',\n insertTpl: \"@${username}\",\n searchKey: \"username\",\n callbacks: {\n remoteFilter: function (query, callback) {\n $.getJSON(misago.get(\"MENTION_API\"), { q: query }, callback)\n },\n },\n })\n\n $(element).on(\"inserted.atwho\", (event, _storage, source, controller) => {\n const { query } = controller\n const username = source.target.innerText.trim()\n const prefix = event.target.value.substr(0, query.headPos)\n const suffix = event.target.value.substr(query.endPos)\n\n event.target.value = prefix + username + suffix\n props.onChange(event)\n\n const caret = query.headPos + username.length\n event.target.setSelectionRange(caret, caret)\n event.target.focus()\n })\n}\n\nexport default MarkupEditor\n","import MarkupEditor from \"./MarkupEditor\"\n\nexport default MarkupEditor\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nconst CLASS_ACTIVE = \"posting-active\"\nconst CLASS_DEFAULT = \"posting-default\"\nconst CLASS_MINIMIZED = \"posting-minimized\"\nconst CLASS_FULLSCREEN = \"posting-fullscreen\"\n\nclass PostingDialog extends React.Component {\n componentDidMount() {\n document.body.classList.add(CLASS_ACTIVE, CLASS_DEFAULT)\n }\n\n componentWillUnmount() {\n document.body.classList.remove(\n CLASS_ACTIVE,\n CLASS_DEFAULT,\n CLASS_MINIMIZED,\n CLASS_FULLSCREEN\n )\n }\n\n componentWillReceiveProps({ fullscreen, minimized }) {\n if (minimized) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_FULLSCREEN)\n document.body.classList.add(CLASS_MINIMIZED)\n } else {\n if (fullscreen) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_FULLSCREEN)\n } else {\n document.body.classList.remove(CLASS_FULLSCREEN, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_DEFAULT)\n }\n }\n }\n\n render() {\n const { children, fullscreen, minimized } = this.props\n\n return (\n \n
    {children}
    \n \n )\n }\n}\n\nexport default PostingDialog\n","import React from \"react\"\n\nconst PostingDialogBody = ({ children }) => (\n
    {children}
    \n)\n\nexport default PostingDialogBody\n","import React from \"react\"\n\nconst PostingDialogError = ({ close, message }) => (\n
    \n
    \n error_outlined\n
    \n
    \n

    {message}

    \n \n
    \n
    \n)\n\nexport default PostingDialogError\n","import React from \"react\"\n\nconst PostingDialogHeader = ({\n children,\n close,\n fullscreen,\n minimize,\n minimized,\n fullscreenEnter,\n fullscreenExit,\n open,\n}) => (\n
    \n
    {children}
    \n {minimized ? (\n \n expand_less\n \n ) : (\n \n expand_more\n \n )}\n {fullscreen ? (\n \n fullscreen_exit\n \n ) : (\n \n fullscreen\n \n )}\n \n close\n \n
    \n)\n\nexport default PostingDialogHeader\n","import React from \"react\"\n\nexport default function PostingThreadOptions({\n isClosed,\n isHidden,\n isPinned,\n disabled,\n options,\n close,\n open,\n hide,\n unhide,\n pinGlobally,\n pinLocally,\n unpin,\n}) {\n const icons = getIcons(isClosed, isHidden, isPinned)\n\n return (\n
    \n \n {icons.length > 0 ? (\n \n {icons.map((icon) => (\n \n {icon}\n \n ))}\n \n ) : (\n more_horiz\n )}\n \n
      \n {options.pin === 2 && isPinned !== 2 && (\n
    • \n \n bookmark\n {pgettext(\"post thread\", \"Pinned globally\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 1 && (\n
    • \n \n bookmark_outline\n {pgettext(\"post thread\", \"Pinned locally\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 0 && (\n
    • \n \n radio_button_unchecked\n {pgettext(\"post thread\", \"Not pinned\")}\n \n
    • \n )}\n {options.close && !!isClosed && (\n
    • \n \n lock_outline\n {pgettext(\"post thread\", \"Open\")}\n \n
    • \n )}\n {options.close && !isClosed && (\n
    • \n \n lock\n {pgettext(\"post thread\", \"Closed\")}\n \n
    • \n )}\n {options.hide && !!isHidden && (\n
    • \n \n visibility\n {pgettext(\"post thread\", \"Visible\")}\n \n
    • \n )}\n {options.hide && !isHidden && (\n
    • \n \n visibility_off\n {pgettext(\"post thread\", \"Hidden\")}\n \n
    • \n )}\n
    \n
    \n )\n}\n\nfunction getIcons(closed, hidden, pinned) {\n const icons = []\n if (pinned === 2) icons.push(\"bookmark\")\n if (pinned === 1) icons.push(\"bookmark_outline\")\n if (closed) icons.push(\"lock\")\n if (hidden) icons.push(\"visibility_off\")\n return icons\n}\n","import React from \"react\"\nimport CategorySelect from \"misago/components/category-select\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport PostingThreadOptions from \"./PostingThreadOptions\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n options: null,\n\n title: \"\",\n category: props.category || null,\n categories: [],\n post: \"\",\n attachments: [],\n close: false,\n hide: false,\n pin: 0,\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n }\n\n loadSuccess = (data) => {\n let category = null\n let options = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (\n item.post !== false &&\n (!category || item.id == this.state.category)\n ) {\n category = item.id\n options = item.post\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n options,\n\n categories,\n category,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n onCancel = () => {\n const cancel = window.confirm(\n pgettext(\"post thread\", \"Are you sure you want to discard thread?\")\n )\n if (cancel) {\n this.minimize()\n posting.close()\n }\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onCategoryChange = (event) => {\n const category = this.state.categories.find((item) => {\n return event.target.value == item.value\n })\n\n // if selected pin is greater than allowed, reduce it\n let pin = this.state.pin\n if (category.post.pin && category.post.pin < pin) {\n pin = category.post.pin\n }\n\n this.setState({\n category: category.id,\n categoryOptions: category.post,\n\n pin,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onClose = () => {\n this.changeValue(\"close\", true)\n }\n\n onOpen = () => {\n this.changeValue(\"close\", false)\n }\n\n onPinGlobally = () => {\n this.changeValue(\"pin\", 2)\n }\n\n onPinLocally = () => {\n this.changeValue(\"pin\", 1)\n }\n\n onUnpin = () => {\n this.changeValue(\"pin\", 0)\n }\n\n onHide = () => {\n this.changeValue(\"hide\", true)\n }\n\n onUnhide = () => {\n this.changeValue(\"hide\", false)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n clean() {\n if (!this.state.title.trim().length) {\n snackbar.error(gettext(\"You have to enter thread title.\"))\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(gettext(\"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n title: this.state.title,\n category: this.state.category,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n close: this.state.close,\n hide: this.state.hide,\n pin: this.state.pin,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n const showOptions = !!(\n this.state.options.close ||\n this.state.options.hide ||\n this.state.options.pin\n )\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n {showOptions && (\n \n \n \n )}\n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStart = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start new thread\")}\n \n {children}\n \n)\n","export default function (usernames) {\n const normalisedNames = usernames\n .split(\",\")\n .map((i) => i.trim().toLowerCase())\n const removedBlanks = normalisedNames.filter((i) => i.length > 0)\n const removedDuplicates = removedBlanks.filter((name, pos) => {\n return removedBlanks.indexOf(name) == pos\n })\n\n return removedDuplicates\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport cleanUsernames from \"./utils/usernames\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const to = (props.to || []).map((user) => user.username).join(\", \")\n\n this.state = {\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n to: to,\n title: \"\",\n post: \"\",\n attachments: [],\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n onCancel = () => {\n const cancel = window.confirm(\n pgettext(\n \"post thread\",\n \"Are you sure you want to discard private thread?\"\n )\n )\n if (cancel) {\n this.close()\n }\n }\n\n onToChange = (event) => {\n this.changeValue(\"to\", event.target.value)\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n clean() {\n if (!cleanUsernames(this.state.to).length) {\n snackbar.error(gettext(\"You have to enter at least one recipient.\"))\n return false\n }\n\n if (!this.state.title.trim().length) {\n snackbar.error(gettext(\"You have to enter thread title.\"))\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(gettext(\"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n to: cleanUsernames(this.state.to),\n title: this.state.title,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.to || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStartPrivate = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start private thread\")}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n post: this.props.default || \"\",\n attachments: [],\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax\n .get(this.props.config, this.props.context || null)\n .then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n if (context && newContext && context.reply === newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.setState({\n isReady: true,\n\n post: data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n const cancel = window.confirm(\n pgettext(\"post reply\", \"Are you sure you want to discard your reply?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(gettext(\"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.post(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"post reply\", \"Your reply has been posted.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n thread: this.props.thread,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n \n \n \n )\n }\n}\n\nconst PostingDialogReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n thread,\n}) => (\n \n \n {interpolate(\n pgettext(\"post reply\", \"Reply to: %(thread)s\"),\n { thread: thread.title },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: false,\n\n minimized: false,\n fullscreen: false,\n\n post: \"\",\n attachments: [],\n protect: false,\n\n canProtect: false,\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n if (context && newContext && context.reply === newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.setState({\n isReady: true,\n\n post: data.post,\n attachments: attachments.hydrate(data.attachments),\n protect: data.is_protected,\n\n canProtect: data.can_protect,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n const cancel = window.confirm(\n gettext(\"Are you sure you want to discard changes?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onProtect = () => {\n this.setState({\n protect: true,\n })\n }\n\n onUnprotect = () => {\n this.setState({\n protect: false,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(gettext(\"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.put(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n protect: this.state.protect,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(gettext(\"Reply has been edited.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n post: this.props.post,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n this.setState({ protect: true })}\n disableProtection={() => this.setState({ protect: false })}\n value={this.state.post}\n submitText={pgettext(\"edit reply submit\", \"Edit reply\")}\n disabled={this.state.isLoading}\n onAttachmentsChange={this.onAttachmentsChange}\n onChange={this.onPostChange}\n />\n \n \n )\n }\n}\n\nconst PostingDialogEditReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n post,\n}) => (\n \n \n {interpolate(\n pgettext(\"edit reply\", \"Edit reply by %(poster)s from %(date)s\"),\n {\n poster: post.poster ? post.poster.username : post.poster_name,\n date: post.posted_on.fromNow(),\n },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport PostingQuoteSelection from \"./PostingQuoteSelection\"\nimport getQuoteMarkup from \"./getQuoteMarkup\"\nimport { clearGlobalState, getGlobalState, setGlobalState } from \"./globalState\"\nimport Start from \"./start\"\nimport StartPrivate from \"./start-private\"\nimport Reply from \"./reply\"\nimport Edit from \"./edit\"\n\nexport default function (props) {\n switch (props.mode) {\n case \"START\":\n return \n\n case \"START_PRIVATE\":\n return \n\n case \"REPLY\":\n return \n\n case \"EDIT\":\n return \n\n default:\n return null\n }\n}\n\nexport {\n PostingQuoteSelection,\n clearGlobalState,\n getGlobalState,\n getQuoteMarkup,\n setGlobalState,\n}\n","import { maxLength, minLength } from \"misago/utils/validators\"\nimport misago from \"misago\"\n\nexport function getTitleValidators() {\n return [getTitleLengthMin(), getTitleLengthMax()]\n}\n\nexport function getPostValidators() {\n if (misago.get(\"SETTINGS\").post_length_max) {\n return [validatePostLengthMin(), validatePostLengthMax()]\n } else {\n return [validatePostLengthMin()]\n }\n}\n\nexport function getTitleLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").thread_title_length_min,\n (limitValue, length) => {\n const message = ngettext(\n \"Thread title should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function getTitleLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").thread_title_length_max,\n (limitValue, length) => {\n const message = ngettext(\n \"Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").post_length_min,\n (limitValue, length) => {\n const message = ngettext(\n \"Posted message should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").post_length_max || 1000000,\n (limitValue, length) => {\n const message = ngettext(\n \"Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getChoice() {\n let choice = null\n this.props.choices.map((item) => {\n if (item.value === this.props.value) {\n choice = item\n }\n })\n return choice\n }\n\n getIcon() {\n return this.getChoice().icon\n }\n\n getLabel() {\n return this.getChoice().label\n }\n\n change = (value) => {\n return () => {\n this.props.onChange({\n target: {\n value: value,\n },\n })\n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getLabel()}\n \n
      \n {this.props.choices.map((item, i) => {\n return (\n
    • \n \n \n {item.label}\n \n
    • \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport function Icon({ icon }) {\n if (!icon) return null\n\n return {icon}\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n showActivation: false,\n\n username: \"\",\n password: \"\",\n\n validators: {\n username: [],\n password: [],\n },\n }\n }\n\n clean() {\n if (!this.isValid()) {\n snackbar.error(gettext(\"Fill out both fields.\"))\n return false\n } else {\n return true\n }\n }\n\n send() {\n return ajax.post(misago.get(\"AUTH_API\"), {\n username: this.state.username,\n password: this.state.password,\n })\n }\n\n handleSuccess() {\n let form = $(\"#hidden-login-form\")\n\n form.append('')\n form.append('')\n\n // fill out form with user credentials and submit it, this will tell\n // Misago to redirect user back to right page, and will trigger browser's\n // key ring feature\n form.find('input[type=\"hidden\"]').val(ajax.getCsrfToken())\n form.find('input[name=\"redirect_to\"]').val(window.location.pathname)\n form.find('input[name=\"username\"]').val(this.state.username)\n form.find('input[name=\"password\"]').val(this.state.password)\n form.submit()\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.code === \"inactive_admin\") {\n snackbar.info(rejection.detail)\n } else if (rejection.code === \"inactive_user\") {\n snackbar.info(rejection.detail)\n this.setState({\n showActivation: true,\n })\n } else if (rejection.code === \"banned\") {\n showBannedPage(rejection.detail)\n modal.hide()\n } else {\n snackbar.error(rejection.detail)\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n getActivationButton() {\n if (!this.state.showActivation) return null\n\n return (\n \n {gettext(\"Activate account\")}\n \n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Sign in\")}

    \n
    \n
    \n
    \n \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n {this.getActivationButton()}\n \n {gettext(\"Sign in\")}\n \n \n {gettext(\"Forgot password?\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClass() {\n return getStatusClassName(this.props.status)\n }\n\n render() {\n return {this.props.children}\n }\n}\n\nexport class StatusIcon extends React.Component {\n getIcon() {\n if (this.props.status.is_banned) {\n return \"remove_circle_outline\"\n } else if (this.props.status.is_hidden) {\n return \"help_outline\"\n } else if (this.props.status.is_online_hidden) {\n return \"label\"\n } else if (this.props.status.is_offline_hidden) {\n return \"label_outline\"\n } else if (this.props.status.is_online) {\n return \"lens\"\n } else if (this.props.status.is_offline) {\n return \"panorama_fish_eye\"\n }\n }\n\n render() {\n return {this.getIcon()}\n }\n}\n\nexport class StatusLabel extends React.Component {\n getHelp() {\n return getStatusDescription(this.props.user, this.props.status)\n }\n\n getLabel() {\n if (this.props.status.is_banned) {\n return gettext(\"Banned\")\n } else if (this.props.status.is_hidden) {\n return gettext(\"Hidden\")\n } else if (this.props.status.is_online_hidden) {\n return gettext(\"Online (hidden)\")\n } else if (this.props.status.is_offline_hidden) {\n return gettext(\"Offline (hidden)\")\n } else if (this.props.status.is_online) {\n return gettext(\"Online\")\n } else if (this.props.status.is_offline) {\n return gettext(\"Offline\")\n }\n }\n\n render() {\n return (\n \n {this.getLabel()}\n \n )\n }\n}\n\nexport function getStatusClassName(status) {\n let className = \"\"\n if (status.is_banned) {\n className = \"banned\"\n } else if (status.is_hidden) {\n className = \"offline\"\n } else if (status.is_online_hidden) {\n className = \"online\"\n } else if (status.is_offline_hidden) {\n className = \"offline\"\n } else if (status.is_online) {\n className = \"online\"\n } else if (status.is_offline) {\n className = \"offline\"\n }\n\n return \"user-status user-\" + className\n}\n\nexport function getStatusDescription(user, status) {\n if (status.is_banned) {\n if (status.banned_until) {\n return interpolate(\n gettext(\"%(username)s is banned until %(ban_expires)s\"),\n {\n username: user.username,\n ban_expires: status.banned_until.format(\"LL, LT\"),\n },\n true\n )\n } else {\n return interpolate(\n gettext(\"%(username)s is banned\"),\n {\n username: user.username,\n },\n true\n )\n }\n } else if (status.is_hidden) {\n return interpolate(\n gettext(\"%(username)s is hiding presence\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_online_hidden) {\n return interpolate(\n gettext(\"%(username)s is online (hidden)\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline_hidden) {\n return interpolate(\n gettext(\"%(username)s was last seen %(last_click)s (hidden)\"),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n } else if (status.is_online) {\n return interpolate(\n gettext(\"%(username)s is online\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline) {\n return interpolate(\n gettext(\"%(username)s was last seen %(last_click)s\"),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n if (this.props.emptyMessage) {\n return this.props.emptyMessage\n } else {\n return gettext(\"No name changes have been recorded for your account.\")\n }\n }\n\n render() {\n return (\n
    \n
      \n
    • \n {this.getEmptyMessage()}\n
    • \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default class extends React.Component {\n renderUserAvatar() {\n if (this.props.change.changed_by) {\n return (\n \n \n \n )\n } else {\n return (\n \n \n \n )\n }\n }\n\n renderUsername() {\n if (this.props.change.changed_by) {\n return (\n \n {this.props.change.changed_by.username}\n \n )\n } else {\n return (\n \n {this.props.change.changed_by_username}\n \n )\n }\n }\n\n render() {\n return (\n
  • \n
    {this.renderUserAvatar()}
    \n
    {this.renderUsername()}
    \n
    \n {this.props.change.old_username}\n arrow_forward\n {this.props.change.new_username}\n
    \n
    \n \n {this.props.change.changed_on.fromNow()}\n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Change from \"misago/components/username-history/change\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n
      \n {this.props.changes.map((change) => {\n return \n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n  \n \n
    \n
    \n \n  \n \n arrow_forward\n \n  \n \n
    \n
    \n \n  \n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChangePreview from \"misago/components/username-history/change-preview\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/username-history/list-empty\"\nimport ListReady from \"misago/components/username-history/list-ready\"\nimport ListPreview from \"misago/components/username-history/list-preview\"\n\nexport default class extends React.Component {\n render() {\n if (this.props.isLoaded) {\n if (this.props.changes.length) {\n return \n } else {\n return \n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\n\nexport default function ({ showStatus, user }) {\n return (\n
      \n \n \n
    • \n \n \n \n
    \n )\n}\n\nexport function Status({ showStatus, user }) {\n if (!showStatus) return null\n\n return (\n
  • \n \n \n \n
  • \n )\n}\n\nexport function JoinDate({ user }) {\n const { joined_on } = user\n\n let title = interpolate(\n gettext(\"Joined on %(joined_on)s\"),\n {\n joined_on: joined_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n gettext(\"Joined %(joined_on)s\"),\n {\n joined_on: joined_on.fromNow(),\n },\n true\n )\n\n return (\n
  • \n {message}\n
  • \n )\n}\n\nexport function Posts({ user }) {\n const className = getStatClassName(\"user-stat-posts\", user.posts)\n const message = ngettext(\"%(posts)s post\", \"%(posts)s posts\", user.posts)\n\n return (\n
  • \n {interpolate(\n message,\n {\n posts: user.posts,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Threads({ user }) {\n const className = getStatClassName(\"user-stat-threads\", user.threads)\n const message = ngettext(\n \"%(threads)s thread\",\n \"%(threads)s threads\",\n user.threads\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n threads: user.threads,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Followers({ user }) {\n const className = getStatClassName(\"user-stat-followers\", user.followers)\n const message = ngettext(\n \"%(followers)s follower\",\n \"%(followers)s followers\",\n user.followers\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n followers: user.followers,\n },\n true\n )}\n
  • \n )\n}\n\nexport function getStatClassName(className, stat) {\n if (stat === 0) {\n return className + \" user-stat-empty\"\n }\n return className\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Stats from \"./stats\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ showStatus, user }) {\n const { rank } = user\n\n let className = \"panel user-card\"\n if (rank.css_class) {\n className += \" user-card-\" + rank.css_class\n }\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n \n
    \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n
    \n \n  \n \n
    \n
    \n \n  \n \n
    \n\n
    \n
      \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    • \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ colClassName, cols }) {\n const list = Array.apply(null, { length: cols }).map(Number.call, Number)\n\n return (\n
    \n
    \n {list.map((i) => {\n let className = colClassName\n if (i !== 0) className += \" hidden-xs\"\n if (i === 3) className += \" hidden-sm\"\n\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\nimport Preview from \"./preview\"\n\nexport default function ({ cols, isReady, showStatus, users }) {\n let colClassName = \"col-xs-12 col-sm-4\"\n if (cols === 4) {\n colClassName += \" col-md-3\"\n }\n\n if (!isReady) {\n return \n }\n\n return (\n
    \n
    \n {users.map((user) => {\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n dropdown: false,\n }\n }\n\n toggleNav = () => {\n this.setState({\n dropdown: !this.state.dropdown,\n })\n }\n\n hideNav = () => {\n this.setState({\n dropdown: false,\n })\n }\n\n getCompactNavClassName() {\n if (this.state.dropdown) {\n return \"compact-nav open\"\n } else {\n return \"compact-nav\"\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.value) {\n return \"btn btn-yes-no btn-yes-no-on\"\n } else {\n return \"btn btn-yes-no btn-yes-no-off\"\n }\n }\n\n getIcon() {\n if (!!this.props.value) {\n return this.props.iconOn || \"check_box\"\n } else {\n return this.props.iconOff || \"check_box_outline_blank\"\n }\n }\n\n getLabel() {\n if (!!this.props.value) {\n return this.props.labelOn || gettext(\"yes\")\n } else {\n return this.props.labelOff || gettext(\"no\")\n }\n }\n\n toggle = () => {\n this.props.onChange({\n target: {\n value: !this.props.value,\n },\n })\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","class OrderedList {\n constructor(items) {\n this.isOrdered = false\n this._items = items || []\n }\n\n add(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n\n after: order ? order.after || null : null,\n before: order ? order.before || null : null,\n })\n }\n\n get(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item\n }\n }\n\n return value\n }\n\n has(key) {\n return this.get(key) !== undefined\n }\n\n values() {\n var values = []\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item)\n }\n return values\n }\n\n order(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items)\n this.isOrdered = true\n }\n\n if (values_only || typeof values_only === \"undefined\") {\n return this.values()\n } else {\n return this._items\n }\n }\n\n orderedValues() {\n return this.order(true)\n }\n\n _order(unordered) {\n // Index of unordered items\n var index = []\n unordered.forEach(function (item) {\n index.push(item.key)\n })\n\n // Ordered items\n var ordered = []\n var ordering = []\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after)\n if (insertAt !== -1) {\n insertAt += 1\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before)\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item)\n ordering.splice(insertAt, 0, item.key)\n }\n }\n }\n\n var iterations = 200\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1\n unordered.forEach(insertItem)\n }\n\n return ordered\n }\n}\n\nexport default OrderedList\n","import \"bootstrap/js/transition\"\nimport \"bootstrap/js/affix\"\nimport \"bootstrap/js/modal\"\nimport \"bootstrap/js/dropdown\"\nimport \"at-js\"\nimport \"cropit\"\nimport \"waypoints\"\nimport \"jquery-caret\"\nimport OrderedList from \"misago/utils/ordered-list\"\nimport \"misago/style/index.less\"\n\nexport class Misago {\n constructor() {\n this._initializers = []\n this._context = {}\n }\n\n addInitializer(initializer) {\n this._initializers.push({\n key: initializer.name,\n\n item: initializer.initializer,\n\n after: initializer.after,\n before: initializer.before,\n })\n }\n\n init(context) {\n this._context = context\n\n var initOrder = new OrderedList(this._initializers).orderedValues()\n initOrder.forEach((initializer) => {\n initializer(this)\n })\n }\n\n // context accessors\n has(key) {\n return !!this._context[key]\n }\n\n get(key, fallback) {\n if (this.has(key)) {\n return this._context[key]\n } else {\n return fallback || undefined\n }\n }\n\n pop(key) {\n if (this.has(key)) {\n let value = this._context[key]\n this._context[key] = null\n return value\n } else {\n return undefined\n }\n }\n}\n\n// create singleton\nvar misago = new Misago()\n\n// expose it globally\nwindow.misago = misago\n\n// and export it for tests and stuff\nexport default misago\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\n\nexport default function initializer() {\n ajax.init(misago.get(\"CSRF_COOKIE_NAME\"))\n}\n\nmisago.addInitializer({\n name: \"ajax\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nconst AUTH_SYNC_RATE = 45 // sync user with backend every 45 seconds\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n window.setInterval(function () {\n ajax.get(context.get(\"AUTH_API\")).then(\n function (data) {\n store.dispatch(patch(data))\n },\n function (rejection) {\n snackbar.apiError(rejection)\n }\n )\n }, AUTH_SYNC_RATE * 1000)\n }\n}\n\nmisago.addInitializer({\n name: \"auth-sync\",\n initializer: initializer,\n after: \"auth\",\n})\n","import misago from \"misago/index\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport store from \"misago/services/store\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n auth.init(store, storage, modal)\n}\n\nmisago.addInitializer({\n name: \"auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport include from \"misago/services/include\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer(context) {\n captcha.init(context, ajax, include, snackbar)\n}\n\nmisago.addInitializer({\n name: \"captcha\",\n initializer: initializer,\n})\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class AcceptAgreement extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { submiting: false }\n }\n\n handleDecline = () => {\n if (this.state.submiting) return\n\n const confirmation = window.confirm(\n gettext(\n \"Declining will result in immediate deactivation and deletion of your account. This action is not reversible.\"\n )\n )\n if (!confirmation) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: false }).then(() => {\n window.location.reload(true)\n })\n }\n\n handleAccept = () => {\n if (this.state.submiting) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: true }).then(() => {\n window.location.reload(true)\n })\n }\n\n render() {\n return (\n
    \n \n {gettext(\"Decline\")}\n \n \n {gettext(\"Accept and continue\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport AcceptAgreement from \"misago/components/accept-agreement\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (document.getElementById(\"required-agreement-mount\")) {\n mount(\n ,\n \"required-agreement-mount\",\n false\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:accept-agreement\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nexport default class extends React.Component {\n refresh() {\n window.location.reload()\n }\n\n getMessage() {\n if (this.props.signedIn) {\n return interpolate(\n gettext(\n \"You have signed in as %(username)s. Please refresh the page before continuing.\"\n ),\n { username: this.props.signedIn.username },\n true\n )\n } else if (this.props.signedOut) {\n return interpolate(\n gettext(\n \"%(username)s, you have been signed out. Please refresh the page before continuing.\"\n ),\n { username: this.props.user.username },\n true\n )\n }\n }\n\n render() {\n let className = \"auth-message\"\n if (this.props.signedIn || this.props.signedOut) {\n className += \" show\"\n }\n\n return (\n
    \n
    \n

    {this.getMessage()}

    \n

    \n \n {gettext(\"Reload page\")}\n \n \n {\" \" + gettext(\"or press F5 key.\")}\n \n

    \n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n signedIn: state.auth.signedIn,\n signedOut: state.auth.signedOut,\n }\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport AuthMessage, { select } from \"misago/components/auth-message\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(AuthMessage), \"auth-message-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:auth-message\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default function initializer(context) {\n if (context.has(\"BAN_MESSAGE\")) {\n showBannedPage(context.get(\"BAN_MESSAGE\"), false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:banmed-page\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
      \n
    • \n

      \n {gettext(\n \"No categories exist or you don't have permission to see them.\"\n )}\n

      \n
    • \n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ category }) {\n if (!category.description) return null\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function ({ category }) {\n return (\n
    \n {getIcon(category)}\n
    \n )\n}\n\nexport function getClassName(category) {\n if (category.is_read) {\n return \"read-status item-read\"\n }\n\n return \"read-status item-new\"\n}\n\nexport function getTitle(category) {\n if (category.is_closed) {\n if (category.is_read) {\n return gettext(\"This category has no new posts. (closed)\")\n }\n\n return gettext(\"This category has new posts. (closed)\")\n }\n\n if (category.is_read) {\n return gettext(\"This category has no new posts.\")\n }\n\n return gettext(\"This category has new posts.\")\n}\n\nexport function getIcon(category) {\n if (category.is_closed) {\n if (category.is_read) {\n return \"lock_outline\"\n }\n\n return \"lock\"\n }\n\n if (category.is_read) {\n return \"chat_bubble_outline\"\n }\n\n return \"chat_bubble\"\n}\n","import React from \"react\"\nimport Description from \"./description\"\nimport Icon from \"./icon\"\n\nexport default function ({ category }) {\n return (\n
    \n
    \n
    \n \n
    \n
    \n

    \n {category.name}\n

    \n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function ({ category }) {\n return (\n
    \n \n \n \n \n
    \n )\n}\n\nexport function LastThread({ category }) {\n if (!category.acl.can_browse) return null\n if (!category.acl.can_see_all_threads) return null\n if (!category.last_thread_title) return null\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n \n {category.last_thread_title}\n \n
    \n \n
    \n
    \n )\n}\n\nexport function LastPosterAvatar({ category }) {\n if (category.last_poster) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n\nexport function LastPosterName({ category }) {\n if (category.last_poster) {\n return (\n \n {category.last_poster_name}\n \n )\n }\n\n return {category.last_poster_name}\n}\n\nexport function Empty({ category }) {\n if (!category.acl.can_browse) return null\n if (!category.acl.can_see_all_threads) return null\n if (category.last_thread_title) return null\n\n return (\n \n )\n}\n\nexport function Private({ category }) {\n if (!category.acl.can_browse) return null\n if (category.acl.can_see_all_threads) return null\n\n return (\n \n )\n}\n\nexport function Protected({ category }) {\n if (category.acl.can_browse) return null\n\n return (\n \n )\n}\n\nexport function Message({ message }) {\n return (\n
    \n
    \n info_outline\n
    \n
    \n

    {message}

    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function ({ category }) {\n return (\n
    \n
      \n \n \n
    \n
    \n )\n}\n\nexport function Threads({ threads }) {\n const message = ngettext(\"%(threads)s thread\", \"%(threads)s threads\", threads)\n\n return (\n
  • \n {interpolate(\n message,\n {\n threads: threads,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Posts({ posts }) {\n const message = ngettext(\"%(posts)s post\", \"%(posts)s posts\", posts)\n\n return (\n
  • \n {interpolate(\n message,\n {\n posts: posts,\n },\n true\n )}\n
  • \n )\n}\n","import React from \"react\"\n\nexport default function ({ category }) {\n let className = \"btn btn-default btn-block btn-sm btn-subcategory\"\n if (!category.is_read) {\n className += \" btn-subcategory-new\"\n }\n\n return (\n \n )\n}\n\nexport function getIcon(category) {\n if (category.is_closed) {\n if (category.is_read) {\n return \"lock_outline\"\n }\n\n return \"lock\"\n }\n\n if (category.is_read) {\n return \"chat_bubble_outline\"\n }\n\n return \"chat_bubble\"\n}\n","import React from \"react\"\nimport ListItem from \"./list-item\"\n\nexport default function ({ category, isFirst }) {\n if (isFirst) return null\n if (category.subcategories.length === 0) return null\n\n return (\n
    \n {category.subcategories.map((category) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport Main from \"./main\"\nimport LastThread from \"./last-thread\"\nimport Stats from \"./stats\"\nimport Subcategories from \"./subcategories\"\n\nexport default function ({ category, isFirst }) {\n let className = \"list-group-item\"\n\n if (category.description) {\n className += \" list-group-category-has-description\"\n } else {\n className += \" list-group-category-no-description\"\n }\n\n if (isFirst) {\n className += \" list-group-item-first\"\n }\n if (category.css_class) {\n className += \" list-group-category-has-flavor\"\n className += \" list-group-item-category-\" + category.css_class\n }\n\n return (\n
  • \n
    \n
    \n \n \n
    \n \n
  • \n )\n}\n","import React from \"react\"\nimport ListItem from \"./list-item\"\n\nexport default function ({ category }) {\n let className = \"list-group list-group-category\"\n if (category.css_class) {\n className += \" list-group-category-has-flavor\"\n className += \" list-group-category-\" + category.css_class\n }\n\n return (\n
      \n \n {category.subcategories.map((category) => {\n return (\n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Category from \"./category\"\n\nexport default function ({ categories }) {\n return (\n
    \n {categories.map((category) => {\n return \n })}\n
    \n )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport CategoriesList from \"./categories-list\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\n\nconst hydrate = function (category) {\n return Object.assign({}, category, {\n last_post_on: category.last_post_on ? moment(category.last_post_on) : null,\n subcategories: category.subcategories.map(hydrate),\n })\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n categories: misago.get(\"CATEGORIES\").map(hydrate),\n }\n\n this.startPolling(misago.get(\"CATEGORIES_API\"))\n }\n\n startPolling(api) {\n polls.start({\n poll: \"categories\",\n url: api,\n frequency: 180 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n this.setState({\n categories: data.map(hydrate),\n })\n }\n\n render() {\n const { categories } = this.state\n\n if (categories.length === 0) {\n return \n }\n\n return \n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n }\n}\n","import { connect } from \"react-redux\"\nimport Categories, { select } from \"misago/components/categories\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"categories-mount\")) {\n mount(connect(select)(Categories), \"categories-mount\")\n }\n}\n\nmisago.addInitializer({\n name: \"component:categories\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nexport function SideNav(props) {\n return (\n
    \n {props.options.map((option) => {\n return (\n \n {option.icon}\n {option.name}\n \n )\n })}\n
    \n )\n}\n\nexport function CompactNav(props) {\n return (\n
      \n {props.options.map((option) => {\n return (\n \n \n {option.icon}\n {option.name}\n \n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n password: \"\",\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Delete account\"),\n parent: gettext(\"Change your options\"),\n })\n }\n\n onPasswordChange = (event) => {\n this.setState({ password: event.target.value })\n }\n\n handleSubmit = (event) => {\n event.preventDefault()\n\n const { isLoading, password } = this.state\n const { user } = this.props\n\n if (password.length == 0) {\n snackbar.error(\n gettext(\"Enter your password to confirm account deletion.\")\n )\n return false\n }\n\n if (isLoading) return false\n this.setState({ isLoading: true })\n\n ajax.post(user.api.delete, { password }).then(\n (success) => {\n window.location.href = misago.get(\"MISAGO_PATH\")\n },\n (rejection) => {\n this.setState({ isLoading: false })\n if (rejection.password) {\n snackbar.error(rejection.password[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    {gettext(\"Delete account\")}

    \n
    \n
    \n

    \n {gettext(\n \"You are going to delete your account. This action is nonreversible, and will result in following data being deleted:\"\n )}\n

    \n\n

    \n -{\" \"}\n {gettext(\n \"Stored IP addresses associated with content that you have posted will be deleted.\"\n )}\n

    \n

    \n -{\" \"}\n {gettext(\n \"Your username will become available for other user to rename to or for new user to register their account with.\"\n )}\n

    \n

    \n -{\" \"}\n {gettext(\n \"Your e-mail will become available for use in new account registration.\"\n )}\n

    \n\n
    \n\n

    \n {gettext(\n \"All your posted content will NOT be deleted, but username associated with it will be changed to one shared by all deleted accounts.\"\n )}\n

    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n componentDidMount() {\n title.set({\n title: gettext(\"Edit details\"),\n parent: gettext(\"Change your options\"),\n })\n }\n\n onSuccess = () => {\n snackbar.info(gettext(\"Your details have been updated.\"))\n }\n\n render() {\n return (\n
    \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class DownloadData extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n isSubmiting: false,\n downloads: [],\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Download your data\"),\n parent: gettext(\"Change your options\"),\n })\n\n this.handleLoadDownloads()\n }\n\n handleLoadDownloads = () => {\n ajax.get(this.props.user.api.data_downloads).then(\n (data) => {\n this.setState({\n isLoading: false,\n downloads: data,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n handleRequestDataDownload = () => {\n this.setState({ isSubmiting: true })\n ajax.post(this.props.user.api.request_data_download).then(\n () => {\n this.handleLoadDownloads()\n snackbar.success(\n gettext(\"Your request for data download has been registered.\")\n )\n this.setState({ isSubmiting: false })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n this.setState({ isSubmiting: false })\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    {gettext(\"Download your data\")}

    \n
    \n
    \n

    \n {gettext(\n 'To download your data from the site, click the \"Request data download\" button. Depending on amount of data to be archived and number of users wanting to download their data at same time it may take up to few days for your download to be prepared. An e-mail with notification will be sent to you when your data is ready to be downloaded.'\n )}\n

    \n\n

    \n {gettext(\n \"The download will only be available for limited amount of time, after which it will be deleted from the site and marked as expired.\"\n )}\n

    \n
    \n \n \n \n \n \n \n \n \n {this.state.downloads.map((item) => {\n return (\n \n \n \n \n )\n })}\n {this.state.downloads.length == 0 ? (\n \n \n \n ) : null}\n \n
    {gettext(\"Requested on\")}{gettext(\"Download\")}
    \n {moment(item.requested_on).fromNow()}\n \n \n
    {gettext(\"You have no data downloads.\")}
    \n
    \n \n {gettext(\"Request data download\")}\n \n
    \n
    \n
    \n )\n }\n}\n\nconst rowStyle = {\n verticalAlign: \"middle\",\n}\n\nconst STATUS_PENDING = 0\nconst STATUS_PROCESSING = 1\n\nconst DownloadButton = ({ exportFile, status }) => {\n if (status === STATUS_PENDING || status === STATUS_PROCESSING) {\n return (\n \n {gettext(\"Download is being prepared\")}\n \n )\n }\n\n if (exportFile) {\n return (\n \n {gettext(\"Download your data\")}\n \n )\n }\n\n return (\n \n {gettext(\"Download is expired\")}\n \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Select from \"misago/components/select\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n is_hiding_presence: props.user.is_hiding_presence,\n limits_private_thread_invites_to:\n props.user.limits_private_thread_invites_to,\n subscribe_to_started_threads: props.user.subscribe_to_started_threads,\n subscribe_to_replied_threads: props.user.subscribe_to_replied_threads,\n\n errors: {},\n }\n\n this.privateThreadInvitesChoices = [\n {\n value: 0,\n icon: \"help_outline\",\n label: gettext(\"Everybody\"),\n },\n {\n value: 1,\n icon: \"done_all\",\n label: gettext(\"Users I follow\"),\n },\n {\n value: 2,\n icon: \"highlight_off\",\n label: gettext(\"Nobody\"),\n },\n ]\n\n this.subscribeToChoices = [\n {\n value: 0,\n icon: \"star_border\",\n label: gettext(\"No\"),\n },\n {\n value: 1,\n icon: \"star_half\",\n label: gettext(\"Notify\"),\n },\n {\n value: 2,\n icon: \"star\",\n label: gettext(\"Notify with e-mail\"),\n },\n ]\n }\n\n send() {\n return ajax.post(this.props.user.api.options, {\n is_hiding_presence: this.state.is_hiding_presence,\n limits_private_thread_invites_to:\n this.state.limits_private_thread_invites_to,\n subscribe_to_started_threads: this.state.subscribe_to_started_threads,\n subscribe_to_replied_threads: this.state.subscribe_to_replied_threads,\n })\n }\n\n handleSuccess() {\n store.dispatch(\n patch({\n is_hiding_presence: this.state.is_hiding_presence,\n limits_private_thread_invites_to:\n this.state.limits_private_thread_invites_to,\n subscribe_to_started_threads: this.state.subscribe_to_started_threads,\n subscribe_to_replied_threads: this.state.subscribe_to_replied_threads,\n })\n )\n snackbar.success(gettext(\"Your forum options have been changed.\"))\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Please reload page and try again.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Forum options\"),\n parent: gettext(\"Change your options\"),\n })\n }\n\n render() {\n return (\n \n
    \n
    \n

    {gettext(\"Change forum options\")}

    \n
    \n
    \n
    \n {gettext(\"Privacy settings\")}\n\n
    \n\n
    \n {gettext(\"Automatic subscriptions\")}\n\n \n \n \n\n \n \n \n
    \n
    \n
    \n \n
    \n
    \n \n )\n }\n}\n","import React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\n\nexport default function () {\n return (\n
    \n
    \n

    {gettext(\"Change username\")}

    \n
    \n \n
    \n )\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends React.Component {\n getHelpText() {\n if (this.props.options.next_on) {\n return interpolate(\n gettext(\"You will be able to change your username %(next_change)s.\"),\n { next_change: this.props.options.next_on.fromNow() },\n true\n )\n } else {\n return gettext(\"You have used up available name changes.\")\n }\n }\n\n render() {\n return (\n
    \n
    \n

    {gettext(\"Change username\")}

    \n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n username: \"\",\n\n validators: {\n username: [\n validators.usernameContent(),\n validators.usernameMinLength(props.options.length_min),\n validators.usernameMaxLength(props.options.length_max),\n ],\n },\n\n isLoading: false,\n }\n }\n\n getHelpText() {\n let phrases = []\n\n if (this.props.options.changes_left > 0) {\n let message = ngettext(\n \"You can change your username %(changes_left)s more time.\",\n \"You can change your username %(changes_left)s more times.\",\n this.props.options.changes_left\n )\n\n phrases.push(\n interpolate(\n message,\n {\n changes_left: this.props.options.changes_left,\n },\n true\n )\n )\n }\n\n if (this.props.user.acl.name_changes_expire > 0) {\n let message = ngettext(\n \"Used changes become available again after %(name_changes_expire)s day.\",\n \"Used changes become available again after %(name_changes_expire)s days.\",\n this.props.user.acl.name_changes_expire\n )\n\n phrases.push(\n interpolate(\n message,\n {\n name_changes_expire: this.props.user.acl.name_changes_expire,\n },\n true\n )\n )\n }\n\n return phrases.length ? phrases.join(\" \") : null\n }\n\n clean() {\n let errors = this.validate()\n if (errors.username) {\n snackbar.error(errors.username[0])\n return false\n }\n if (this.state.username.trim() === this.props.user.username) {\n snackbar.info(gettext(\"Your new username is same as current one.\"))\n return false\n } else {\n return true\n }\n }\n\n send() {\n return ajax.post(this.props.user.api.username, {\n username: this.state.username,\n })\n }\n\n handleSuccess(success) {\n this.setState({\n username: \"\",\n })\n\n this.props.complete(success.username, success.slug, success.options)\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    {gettext(\"Change username\")}

    \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n
    \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport FormLoading from \"misago/components/options/change-username/form-loading\"\nimport FormLocked from \"misago/components/options/change-username/form-locked\"\nimport Form from \"misago/components/options/change-username/form\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n options: null,\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Change username\"),\n parent: gettext(\"Change your options\"),\n })\n\n Promise.all([\n ajax.get(this.props.user.api.username),\n ajax.get(misago.get(\"USERNAME_CHANGES_API\"), {\n user: this.props.user.id,\n }),\n ]).then((data) => {\n store.dispatch(hydrate(data[1].results))\n\n this.setState({\n isLoaded: true,\n options: {\n changes_left: data[0].changes_left,\n length_min: data[0].length_min,\n length_max: data[0].length_max,\n next_on: data[0].next_on ? moment(data[0].next_on) : null,\n },\n })\n })\n }\n\n onComplete = (username, slug, options) => {\n this.setState({\n options,\n })\n\n store.dispatch(\n addNameChange({ username, slug }, this.props.user, this.props.user)\n )\n store.dispatch(updateUsername(this.props.user, username, slug))\n\n snackbar.success(gettext(\"Your username has been changed successfully.\"))\n }\n\n getChangeForm() {\n if (!this.state.isLoaded) {\n return \n }\n\n if (this.state.options.changes_left === 0) {\n return \n }\n\n return (\n \n )\n }\n\n render() {\n return (\n
    \n {this.getChangeForm()}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n new_email: \"\",\n password: \"\",\n\n validators: {\n new_email: [validators.email()],\n password: [],\n },\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.new_email.trim().length,\n this.state.password.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(gettext(\"Fill out all fields.\"))\n return false\n }\n\n if (errors.new_email) {\n snackbar.error(errors.new_email[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.user.api.change_email, {\n new_email: this.state.new_email,\n password: this.state.password,\n })\n }\n\n handleSuccess(response) {\n this.setState({\n new_email: \"\",\n password: \"\",\n })\n\n snackbar.success(response.detail)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.new_email) {\n snackbar.error(rejection.new_email)\n } else {\n snackbar.error(rejection.password)\n }\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n \n \n
    \n
    \n

    {gettext(\"Change e-mail address\")}

    \n
    \n
    \n \n \n \n\n
    \n\n \n \n \n
    \n
    \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n new_password: \"\",\n repeat_password: \"\",\n password: \"\",\n\n validators: {\n new_password: [],\n repeat_password: [],\n password: [],\n },\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.new_password.trim().length,\n this.state.repeat_password.trim().length,\n this.state.password.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(gettext(\"Fill out all fields.\"))\n return false\n }\n\n if (errors.new_password) {\n snackbar.error(errors.new_password[0])\n return false\n }\n\n if (this.state.new_password !== this.state.repeat_password) {\n snackbar.error(gettext(\"New passwords are different.\"))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.user.api.change_password, {\n new_password: this.state.new_password,\n password: this.state.password,\n })\n }\n\n handleSuccess(response) {\n this.setState({\n new_password: \"\",\n repeat_password: \"\",\n password: \"\",\n })\n\n snackbar.success(response.detail)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.new_password) {\n snackbar.error(rejection.new_password)\n } else {\n snackbar.error(rejection.password)\n }\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n \n \n
    \n
    \n

    {gettext(\"Change password\")}

    \n
    \n
    \n \n \n \n\n \n \n \n\n
    \n\n \n \n \n
    \n
    \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\n\nconst UnusablePasswordMessage = () => {\n return (\n
    \n
    \n

    {gettext(\"Change email or password\")}

    \n
    \n
    \n
    \n info_outline\n
    \n
    \n

    \n {gettext(\n \"You need to set a password for your account to be able to change your username or email.\"\n )}\n

    \n

    \n \n {gettext(\"Set password\")}\n \n

    \n
    \n
    \n
    \n )\n}\n\nexport default UnusablePasswordMessage\n","import React from \"react\"\nimport ChangeEmail from \"misago/components/options/sign-in-credentials/change-email\"\nimport ChangePassword from \"misago/components/options/sign-in-credentials/change-password\"\nimport misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\nimport UnusablePasswordMessage from \"./UnusablePasswordMessage\"\n\nexport default class extends React.Component {\n componentDidMount() {\n title.set({\n title: gettext(\"Change email or password\"),\n parent: gettext(\"Change your options\"),\n })\n }\n\n render() {\n if (!this.props.user.has_usable_password) {\n return \n }\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { SideNav, CompactNav } from \"misago/components/options/navs\"\nimport DeleteAccount from \"misago/components/options/delete-account\"\nimport EditDetails from \"misago/components/options/edit-details\"\nimport DownloadData from \"misago/components/options/download-data\"\nimport ChangeForumOptions from \"misago/components/options/forum-options\"\nimport ChangeUsername from \"misago/components/options/change-username/root\"\nimport ChangeSignInCredentials from \"misago/components/options/sign-in-credentials/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport PageContainer from \"../PageContainer\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n render() {\n const page = misago.get(\"USER_OPTIONS\").filter((page) => {\n const url = misago.get(\"USERCP_URL\") + page.component + \"/\"\n return this.props.location.pathname.substr(0, url.length) === url\n })[0]\n\n return (\n
    \n \n \n \n \n \n \n

    {gettext(\"Change your options\")}

    \n
    \n \n
    \n \n menu\n \n \n
    \n
    \n
    \n \n \n
    \n \n {page.icon}\n {page.name}\n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    {this.props.children}
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n user: store.auth.user,\n \"username-history\": store[\"username-history\"],\n }\n}\n\nexport function paths() {\n const paths = [\n {\n path: misago.get(\"USERCP_URL\") + \"forum-options/\",\n component: connect(select)(ChangeForumOptions),\n },\n {\n path: misago.get(\"USERCP_URL\") + \"edit-details/\",\n component: connect(select)(EditDetails),\n },\n ]\n\n const delegateAuth = misago.get(\"SETTINGS\").DELEGATE_AUTH\n if (!delegateAuth) {\n paths.push({\n path: misago.get(\"USERCP_URL\") + \"change-username/\",\n component: connect(select)(ChangeUsername),\n })\n paths.push({\n path: misago.get(\"USERCP_URL\") + \"sign-in-credentials/\",\n component: connect(select)(ChangeSignInCredentials),\n })\n }\n\n if (misago.get(\"ENABLE_DOWNLOAD_OWN_DATA\")) {\n paths.push({\n path: misago.get(\"USERCP_URL\") + \"download-data/\",\n component: connect(select)(DownloadData),\n })\n }\n\n if (!delegateAuth && misago.get(\"ENABLE_DELETE_OWN_ACCOUNT\")) {\n paths.push({\n path: misago.get(\"USERCP_URL\") + \"delete-account/\",\n component: connect(select)(DeleteAccount),\n })\n }\n\n return paths\n}\n","import Options, { paths } from \"misago/components/options/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"USER_OPTIONS\")) {\n mount({\n root: misago.get(\"USERCP_URL\"),\n component: Options,\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:options\",\n initializer: initializer,\n after: \"store\",\n})\n","import moment from \"moment\"\nimport React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\nimport PanelMessage from \"misago/components/panel-message\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_BAN\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_BAN\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.profile.api.ban)\n }\n\n initWithPreloadedData(ban) {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.state = {\n isLoaded: true,\n ban,\n }\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(api) {\n polls.start({\n poll: \"ban-details\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n error: this.error,\n })\n }\n\n update = (ban) => {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.setState({\n isLoaded: true,\n error: null,\n\n ban,\n })\n }\n\n error = (error) => {\n this.setState({\n isLoaded: true,\n error: error.detail,\n ban: null,\n })\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Ban details\"),\n parent: this.props.profile.username,\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"ban-details\")\n }\n\n getUserMessage() {\n if (this.state.ban.user_message) {\n return (\n
    \n

    {gettext(\"User-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getStaffMessage() {\n if (this.state.ban.staff_message) {\n return (\n
    \n

    {gettext(\"Team-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getExpirationMessage() {\n if (this.state.ban.expires_on) {\n if (this.state.ban.expires_on.isAfter(moment())) {\n let title = interpolate(\n gettext(\"This ban expires on %(expires_on)s.\"),\n {\n expires_on: this.state.ban.expires_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n gettext(\"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.state.ban.expires_on.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return gettext(\"This ban has expired.\")\n }\n } else {\n return interpolate(\n gettext(\"%(username)s's ban is permanent.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getPanelBody() {\n if (this.state.ban) {\n if (Object.keys(this.state.ban).length) {\n return (\n
    \n {this.getUserMessage()}\n {this.getStaffMessage()}\n\n
    \n

    {gettext(\"Ban expiration\")}

    \n

    {this.getExpirationMessage()}

    \n
    \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n } else if (this.state.error) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    {gettext(\"Ban details\")}

    \n
    \n\n {this.getPanelBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\n\nexport default function ({ api, display, onCancel, onSuccess }) {\n if (!display) return null\n\n return
    \n}\n","import React from \"react\"\n\nexport default function ({ isAuthenticated, profile }) {\n let message = null\n if (isAuthenticated) {\n message = gettext(\"You are not sharing any details with others.\")\n } else {\n message = interpolate(\n gettext(\"%(username)s is not sharing any details with others.\"),\n {\n username: profile.username,\n },\n true\n )\n }\n\n return (\n
    \n
    {message}
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ html, text, url }) {\n if (html) {\n return (\n \n )\n }\n\n return (\n
    \n \n
    \n )\n}\n\nexport function SafeValue({ text, url }) {\n if (url) {\n return (\n

    \n \n {text || url}\n \n

    \n )\n }\n\n if (text) {\n return

    {text}

    \n }\n\n return null\n}\n","import React from \"react\"\nimport FieldValue from \"./field-value\"\n\nexport default function (props) {\n return (\n
    \n {props.name}:\n \n
    \n )\n}\n","import React from \"react\"\nimport Field from \"./field\"\n\nexport default function ({ fields, name }) {\n return (\n
    \n
    \n

    {name}

    \n
    \n
    \n
    \n {fields.map(({ fieldname, html, name, text, url }) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport EmptyMessage from \"./empty-message\"\nimport Group from \"./group\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({\n display,\n groups,\n isAuthenticated,\n loading,\n profile,\n}) {\n if (!display) return null\n\n if (loading) {\n return \n }\n\n if (!groups.length) {\n return \n }\n\n return (\n
    \n {groups.map((group, i) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nconst ProfileDetailsHeader = ({ onEdit, showEditButton }) => (\n \n \n \n

    {gettext(\"Details\")}

    \n
    \n
    \n {showEditButton && (\n \n \n \n {gettext(\"Edit\")}\n \n \n \n )}\n
    \n)\n\nexport default ProfileDetailsHeader\n","import React from \"react\"\nimport { load } from \"misago/reducers/profile-details\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n componentDidMount() {\n const { data, dispatch, user } = this.props\n if (data && data.id === user.id) return\n\n ajax.get(this.props.user.api.details).then(\n (data) => {\n dispatch(load(data))\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return this.props.children\n }\n}\n","import React from \"react\"\nimport Form from \"./form\"\nimport GroupsList from \"./groups-list\"\nimport Header from \"./header\"\nimport ProfileDetailsData from \"misago/data/profile-details\"\nimport { load as loadDetails } from \"misago/reducers/profile-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editing: false,\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Details\"),\n parent: this.props.profile.username,\n })\n }\n\n onCancel = () => {\n this.setState({ editing: false })\n }\n\n onEdit = () => {\n this.setState({ editing: true })\n }\n\n onSuccess = (newDetails) => {\n const { dispatch, isAuthenticated, profile } = this.props\n\n let message = null\n if (isAuthenticated) {\n message = gettext(\"Your details have been updated.\")\n } else {\n message = interpolate(\n gettext(\"%(username)s's details have been updated.\"),\n {\n username: profile.username,\n },\n true\n )\n }\n\n snackbar.info(message)\n dispatch(loadDetails(newDetails))\n this.setState({ editing: false })\n }\n\n render() {\n const { dispatch, isAuthenticated, profile, profileDetails } = this.props\n const loading = profileDetails.id !== profile.id\n\n return (\n \n
    \n \n \n \n
    \n \n )\n }\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport * as posts from \"misago/reducers/posts\"\nimport title from \"misago/services/page-title\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n loadItems(start = 0) {\n ajax\n .get(this.props.api, {\n start: start || 0,\n })\n .then(\n (data) => {\n if (start === 0) {\n store.dispatch(posts.load(data))\n } else {\n store.dispatch(posts.append(data))\n }\n\n this.setState({\n isLoading: false,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.apiError(rejection)\n }\n )\n }\n\n loadMore = () => {\n this.setState({\n isLoading: true,\n })\n\n this.loadItems(this.props.posts.next)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.title,\n parent: this.props.profile.username,\n })\n\n this.loadItems()\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.props.header}

    \n
    \n
    \n
    \n \n
    \n )\n }\n}\n\nexport function Feed(props) {\n if (props.posts.isLoaded && !props.posts.results.length) {\n return

    {props.emptyMessage}

    \n }\n\n return (\n
    \n \n \n
    \n )\n}\n\nexport function LoadMoreButton(props) {\n if (!props.next) return null\n\n return (\n
    \n \n {gettext(\"Show older activity\")}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.className) {\n return \"form-search \" + this.props.className\n } else {\n return \"form-search\"\n }\n }\n\n render() {\n return (\n
    \n \n search\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsersList from \"misago/components/users-list\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.setSpecialProps()\n\n if (misago.has(this.PRELOADED_DATA_KEY)) {\n this.initWithPreloadedData(misago.pop(this.PRELOADED_DATA_KEY))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWERS\"\n this.TITLE = gettext(\"Followers\")\n this.API_FILTER = \"followers\"\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadUsers()\n }\n\n loadUsers(page = 1, search = null) {\n const apiUrl = this.props.profile.api[this.API_FILTER]\n\n ajax\n .get(\n apiUrl,\n {\n search: search,\n page: page || 1,\n },\n \"user-\" + this.API_FILTER\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: this.TITLE,\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadUsers(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadUsers(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return gettext(\"Loading...\")\n } else if (this.state.search) {\n let message = ngettext(\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = ngettext(\n \"You have %(users)s follower.\",\n \"You have %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = ngettext(\n \"%(username)s has %(users)s follower.\",\n \"%(username)s has %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return gettext(\"Search returned no users matching specified criteria.\")\n } else if (this.props.user.id === this.props.profile.id) {\n return gettext(\"You have no followers.\")\n } else {\n return interpolate(\n gettext(\"%(username)s has no followers.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n gettext(\"Show more (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n getListBody() {\n if (this.state.isLoaded && this.state.count === 0) {\n return

    {this.getEmptyMessage()}

    \n }\n\n return (\n
    \n \n\n {this.getMoreButton()}\n
    \n )\n }\n\n getClassName() {\n return \"profile-\" + this.API_FILTER\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n {this.getListBody()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/username-history\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_NAME_HISTORY\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_NAME_HISTORY\"))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadChanges()\n }\n\n loadChanges(page = 1, search = null) {\n ajax\n .get(\n misago.get(\"USERNAME_CHANGES_API\"),\n {\n user: this.props.profile.id,\n search: search,\n page: page || 1,\n },\n \"search-username-history\"\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Username history\"),\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadChanges(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadChanges(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return gettext(\"Loading...\")\n } else if (this.state.search) {\n let message = ngettext(\n \"Found %(changes)s username change.\",\n \"Found %(changes)s username changes.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = ngettext(\n \"Your username was changed %(changes)s time.\",\n \"Your username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else {\n let message = ngettext(\n \"%(username)s's username was changed %(changes)s time.\",\n \"%(username)s's username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n changes: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return gettext(\n \"Search returned no username changes matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return gettext(\"No name changes have been recorded for your account.\")\n } else {\n return interpolate(\n gettext(\"%(username)s's username was never changed.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n gettext(\"Show older (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n \n\n {this.getMoreButton()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport { patch } from \"misago/reducers/profile\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n getClassName() {\n if (this.props.profile.is_followed) {\n return this.props.className + \" btn-default btn-following\"\n } else {\n return this.props.className + \" btn-default btn-follow\"\n }\n }\n\n getIcon() {\n if (this.props.profile.is_followed) {\n return \"favorite\"\n } else {\n return \"favorite_border\"\n }\n }\n\n getLabel() {\n if (this.props.profile.is_followed) {\n return gettext(\"Following\")\n } else {\n return gettext(\"Follow\")\n }\n }\n\n action = () => {\n this.setState({\n isLoading: true,\n })\n\n if (this.props.profile.is_followed) {\n store.dispatch(\n patch({\n is_followed: false,\n followers: this.props.profile.followers - 1,\n })\n )\n } else {\n store.dispatch(\n patch({\n is_followed: true,\n followers: this.props.profile.followers + 1,\n })\n )\n }\n\n ajax.post(this.props.profile.api.follow).then(\n (data) => {\n this.setState({\n isLoading: false,\n })\n\n store.dispatch(patch(data))\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","import React from \"react\"\nimport posting from \"misago/services/posting\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"START_PRIVATE\",\n submit: misago.get(\"PRIVATE_THREADS_API\"),\n\n to: [this.props.profile],\n })\n }\n\n render() {\n const canMessage = this.props.user.acl.can_start_private_threads\n const isProfileOwner = this.props.user.id === this.props.profile.id\n\n if (!canMessage || isProfileOwner) return null\n\n return (\n \n comment\n {gettext(\"Message\")}\n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n is_avatar_locked: \"\",\n avatar_lock_user_message: \"\",\n avatar_lock_staff_message: \"\",\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_avatar).then(\n (options) => {\n this.setState({\n isLoaded: true,\n\n is_avatar_locked: options.is_avatar_locked,\n avatar_lock_user_message: options.avatar_lock_user_message || \"\",\n avatar_lock_staff_message: options.avatar_lock_staff_message || \"\",\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_avatar, {\n is_avatar_locked: this.state.is_avatar_locked,\n avatar_lock_user_message: this.state.avatar_lock_user_message,\n avatar_lock_staff_message: this.state.avatar_lock_staff_message,\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(updateAvatar(this.props.profile, apiResponse.avatar_hash))\n snackbar.success(gettext(\"Avatar controls have been changed.\"))\n }\n\n getFormBody() {\n return (\n \n
    \n \n \n \n\n \n \n \n\n \n \n \n
    \n
    \n \n {gettext(\"Close\")}\n \n \n
    \n \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-avatar-controls\"\n } else {\n return \"modal-dialog modal-avatar-controls\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Avatar controls\")}

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n username: \"\",\n validators: {\n username: [validators.usernameContent()],\n },\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_username).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_username, {\n username: this.state.username,\n })\n }\n\n handleSuccess(apiResponse) {\n this.setState({\n username: \"\",\n })\n\n store.dispatch(\n addNameChange(apiResponse, this.props.profile, this.props.user)\n )\n store.dispatch(\n updateUsername(this.props.profile, apiResponse.username, apiResponse.slug)\n )\n\n snackbar.success(gettext(\"Username has been changed.\"))\n }\n\n getFormBody() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-rename-user\"\n } else {\n return \"modal-dialog modal-rename-user\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Change username\")}

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n isDeleted: false,\n error: null,\n\n countdown: 5,\n confirm: false,\n\n with_content: false,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.delete).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n\n this.countdown()\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n countdown = () => {\n window.setTimeout(() => {\n if (this.state.countdown > 1) {\n this.setState({\n countdown: this.state.countdown - 1,\n })\n this.countdown()\n } else if (!this.state.confirm) {\n this.setState({\n confirm: true,\n })\n }\n }, 1000)\n }\n\n send() {\n return ajax.post(this.props.profile.api.delete, {\n with_content: this.state.with_content,\n })\n }\n\n handleSuccess() {\n polls.stop(\"user-profile\")\n\n if (this.state.with_content) {\n this.setState({\n isDeleted: interpolate(\n gettext(\n \"%(username)s's account, threads, posts and other content has been deleted.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n } else {\n this.setState({\n isDeleted: interpolate(\n gettext(\n \"%(username)s's account has been deleted and other content has been hidden.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n }\n }\n\n getButtonLabel() {\n if (this.state.confirm) {\n return interpolate(\n gettext(\"Delete %(username)s\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n } else {\n return interpolate(\n gettext(\"Please wait... (%(countdown)ss)\"),\n {\n countdown: this.state.countdown,\n },\n true\n )\n }\n }\n\n getForm() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n\n \n {this.getButtonLabel()}\n \n
    \n
    \n )\n }\n\n getDeletedBody() {\n return (\n
    \n
    \n info_outline\n
    \n
    \n

    {this.state.isDeleted}

    \n

    \n \n {gettext(\"Return to users list\")}\n \n

    \n
    \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n if (this.state.isDeleted) {\n return this.getDeletedBody()\n } else {\n return this.getForm()\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error || this.state.isDeleted) {\n return \"modal-dialog modal-message modal-delete-account\"\n } else {\n return \"modal-dialog modal-delete-account\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Delete user account\")}

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport AvatarControls from \"misago/components/profile/moderation/avatar-controls\"\nimport ChangeUsername from \"misago/components/profile/moderation/change-username\"\nimport DeleteAccount from \"misago/components/profile/moderation/delete-account\"\nimport modal from \"misago/services/modal\"\n\nlet select = function (store) {\n return {\n tick: store.tick,\n user: store.auth,\n profile: store.profile,\n }\n}\n\nexport default class extends React.Component {\n showAvatarDialog = () => {\n modal.show(connect(select)(AvatarControls))\n }\n\n showRenameDialog = () => {\n modal.show(connect(select)(ChangeUsername))\n }\n\n showDeleteDialog = () => {\n modal.show(connect(select)(DeleteAccount))\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.avatar && (\n
    • \n \n portrait\n {gettext(\"Avatar controls\")}\n \n
    • \n )}\n {!!moderation.rename && (\n
    • \n \n credit_card\n {gettext(\"Change username\")}\n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {gettext(\"Delete account\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Status, { StatusIcon, StatusLabel } from \"../user-status\"\n\nconst ProfileDataList = ({ profile }) => (\n
      \n {profile.is_active === false && (\n
    • \n \n {gettext(\"Account disabled\")}\n \n
    • \n )}\n
    • \n \n \n \n \n
    • \n {profile.rank.is_tab ? (\n
    • \n \n {profile.rank.name}\n \n
    • \n ) : (\n
    • \n {profile.rank.name}\n
    • \n )}\n {(profile.title || profile.rank.title) && (\n
    • {profile.title || profile.rank.title}
    • \n )}\n
    • \n \n {interpolate(\n gettext(\"Joined %(joined_on)s\"),\n {\n joined_on: profile.joined_on.fromNow(),\n },\n true\n )}\n \n
    • \n {profile.email && (\n
    • \n \n {profile.email}\n \n
    • \n )}\n
    \n)\n\nexport default ProfileDataList\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../PageHeader\"\nimport FollowButton from \"./follow-button\"\nimport MessageButton from \"./message-button\"\nimport ModerationOptions from \"./moderation/nav\"\nimport ProfileDataList from \"./ProfileDataList\"\n\nconst ProfileHeader = ({ profile, user, moderation, message, follow }) => (\n \n \n \n
    \n
    \n \n \n \n
    \n

    {profile.username}

    \n
    \n \n \n \n \n \n \n \n \n {message && (\n \n \n \n \n {moderation.available && !follow && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {follow && (\n \n \n \n \n {moderation.available && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {moderation.available && !follow && !message && (\n \n \n
    \n \n \n
    \n
    \n \n
    \n \n settings\n {gettext(\"Options\")}\n \n \n
    \n
    \n
    \n )}\n
    \n
    \n \n
    \n)\n\nconst ProfileModerationButton = () => (\n \n settings\n \n)\n\nexport default ProfileHeader\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst ProfileNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n {page.icon}\n {page.name}\n \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n)\n\nexport default ProfileNav\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport BanDetails from \"./ban-details\"\nimport Details from \"./details\"\nimport { Posts, Threads } from \"./feed\"\nimport Followers from \"./followers\"\nimport Follows from \"./follows\"\nimport UsernameHistory from \"./username-history\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport PageContainer from \"../PageContainer\"\nimport ProfileHeader from \"./ProfileHeader\"\nimport ProfileNav from \"./ProfileNav\"\n\nexport default class extends WithDropdown {\n constructor(props) {\n super(props)\n\n this.startPolling(props.profile.api.index)\n }\n\n startPolling(api) {\n polls.start({\n poll: \"user-profile\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data))\n }\n\n render() {\n const baseUrl = misago.get(\"PROFILE\").url\n const pages = misago.get(\"PROFILE_PAGES\")\n const page = pages.filter((page) => {\n const url = baseUrl + page.component + \"/\"\n return this.props.location.pathname === url\n })[0]\n const { profile, user } = this.props\n const moderation = getModeration(profile, user)\n const message =\n !!user.acl.can_start_private_threads && profile.id !== user.id\n const follow = !!profile.acl.can_follow && profile.id !== user.id\n\n return (\n
    \n \n \n \n\n {this.props.children}\n \n
    \n )\n }\n}\n\nconst getModeration = (profile, user) => {\n const moderation = {\n available: false,\n rename: false,\n avatar: false,\n delete: false,\n }\n\n if (user.is_anonymous) return moderation\n\n moderation.rename = profile.acl.can_rename\n moderation.avatar = profile.acl.can_moderate_avatar\n moderation.delete = profile.acl.can_delete\n moderation.available = !!(\n moderation.rename ||\n moderation.avatar ||\n moderation.delete\n )\n\n return moderation\n}\n\nexport function select(store) {\n return {\n isAuthenticated: store.auth.user.id === store.profile.id,\n\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n posts: store.posts,\n profile: store.profile,\n profileDetails: store[\"profile-details\"],\n \"username-history\": store[\"username-history\"],\n }\n}\n\nconst COMPONENTS = {\n posts: Posts,\n threads: Threads,\n followers: Followers,\n follows: Follows,\n details: Details,\n \"username-history\": UsernameHistory,\n \"ban-details\": BanDetails,\n}\n\nexport function paths() {\n let paths = []\n misago.get(\"PROFILE_PAGES\").forEach(function (item) {\n paths.push(\n Object.assign({}, item, {\n path: misago.get(\"PROFILE\").url + item.component + \"/\",\n component: connect(select)(COMPONENTS[item.component]),\n })\n )\n })\n\n return paths\n}\n","import React from \"react\"\nimport Route from \"./route\"\n\nexport function Threads(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = gettext(\"You have no started threads.\")\n } else {\n emptyMessage = interpolate(\n gettext(\"%(username)s started no threads.\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = gettext(\"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = ngettext(\n \"You have started %(threads)s thread.\",\n \"You have started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n threads: props.profile.threads,\n },\n true\n )\n } else {\n const message = ngettext(\n \"%(username)s has started %(threads)s thread.\",\n \"%(username)s has started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n threads: props.profile.threads,\n },\n true\n )\n }\n\n return (\n \n )\n}\n\nexport function Posts(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = gettext(\"You have posted no messages.\")\n } else {\n emptyMessage = interpolate(\n gettext(\"%(username)s posted no messages.\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = gettext(\"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = ngettext(\n \"You have posted %(posts)s message.\",\n \"You have posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n posts: props.profile.posts,\n },\n true\n )\n } else {\n const message = ngettext(\n \"%(username)s has posted %(posts)s message.\",\n \"%(username)s has posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n posts: props.profile.posts,\n },\n true\n )\n }\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Followers from \"misago/components/profile/followers\"\n\nexport default class extends Followers {\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWS\"\n this.TITLE = gettext(\"Follows\")\n this.API_FILTER = \"follows\"\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return gettext(\"Loading...\")\n } else if (this.state.search) {\n let message = ngettext(\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = ngettext(\n \"You are following %(users)s user.\",\n \"You are following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = ngettext(\n \"%(username)s is following %(users)s user.\",\n \"%(username)s is following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return gettext(\"Search returned no users matching specified criteria.\")\n } else if (this.props.user.id === this.props.profile.id) {\n return gettext(\"You are not following any users.\")\n } else {\n return interpolate(\n gettext(\"%(username)s is not following any users.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n}\n","import { connect } from \"react-redux\"\nimport Profile, { paths, select } from \"misago/components/profile/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"PROFILE\") && context.has(\"PROFILE_PAGES\")) {\n mount({\n root: misago.get(\"PROFILE\").url,\n component: connect(select)(Profile),\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:profile\",\n initializer: initializer,\n after: \"reducer:profile-hydrate\",\n})\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestLinkForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Enter a valid email address.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_ACTIVATION_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"already_active\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n snackbar.info(rejection.detail)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {gettext(\"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n gettext(\"Activation link was sent to %(email)s\"),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {gettext(\"Request another link\")}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n render() {\n if (this.state.complete) {\n return \n } else {\n return \n }\n }\n}\n","import misago from \"misago/index\"\nimport RequestActivationLink from \"misago/components/request-activation-link\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-activation-link-mount\")) {\n mount(RequestActivationLink, \"request-activation-link-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-activation-link\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestResetForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Enter a valid email address.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_PASSWORD_RESET_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"inactive_user\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n this.props.showInactivePage(rejection)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {gettext(\"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n gettext(\"Reset password link was sent to %(email)s\"),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {gettext(\"Request another link\")}\n \n
    \n
    \n )\n }\n}\n\nexport class AccountInactivePage extends React.Component {\n getActivateButton() {\n if (this.props.activation === \"inactive_user\") {\n return (\n

    \n \n {gettext(\"Activate your account.\")}\n \n

    \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n info_outline\n
    \n\n
    \n

    {gettext(\"Your account is inactive.\")}

    \n

    {this.props.message}

    \n {this.getActivateButton()}\n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n showInactivePage(apiResponse) {\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n if (this.state.complete) {\n return \n }\n\n return (\n \n )\n }\n}\n","import misago from \"misago/index\"\nimport RequestPasswordReset from \"misago/components/request-password-reset\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-password-reset-mount\")) {\n mount(RequestPasswordReset, \"request-password-reset-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-password-reset\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class ResetPasswordForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n password: \"\",\n }\n }\n\n clean() {\n if (this.state.password.trim().length) {\n return true\n } else {\n snackbar.error(gettext(\"Enter new password.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"CHANGE_PASSWORD_API\"), {\n password: this.state.password,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {gettext(\"Change password\")}\n \n \n
    \n )\n }\n}\n\nexport class PasswordChangedPage extends React.Component {\n getMessage() {\n return interpolate(\n gettext(\"%(username)s, your password has been changed successfully.\"),\n {\n username: this.props.user.username,\n },\n true\n )\n }\n\n showSignIn() {\n modal.show(SignInModal)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n check\n
    \n\n
    \n

    {this.getMessage()}

    \n

    \n {gettext(\n \"You will have to sign in using new password before continuing.\"\n )}\n

    \n

    \n \n {gettext(\"Sign in\")}\n \n

    \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n complete = (apiResponse) => {\n auth.softSignOut()\n\n // nuke \"redirect_to\" field so we don't end\n // coming back to error page after sign in\n $('#hidden-login-form input[name=\"redirect_to\"]').remove()\n\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n return \n }\n}\n","import misago from \"misago\"\nimport ResetPasswordForm from \"misago/components/reset-password-form\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"reset-password-form-mount\")) {\n mount(ResetPasswordForm, \"reset-password-form-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:reset-password-form\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport misago from \"misago\"\nimport Form from \"misago/components/form\"\nimport { load as updatePosts } from \"misago/reducers/posts\"\nimport { update as updateSearch } from \"misago/reducers/search\"\nimport { hydrate as updateUsers } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderContainer,\n PageHeaderBanner,\n PageHeaderDetails,\n} from \"../PageHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n query: props.search.query,\n }\n }\n\n componentDidMount() {\n if (this.state.query.length) {\n this.handleSubmit()\n }\n }\n\n onQueryChange = (event) => {\n this.changeValue(\"query\", event.target.value)\n }\n\n clean() {\n if (!this.state.query.trim().length) {\n snackbar.error(gettext(\"You have to enter search query.\"))\n return false\n }\n\n return true\n }\n\n send() {\n store.dispatch(\n updateSearch({\n isLoading: true,\n })\n )\n\n const query = this.state.query.trim()\n\n let url = window.location.href\n const urlQuery = url.indexOf(\"?q=\")\n if (urlQuery > 0) {\n url = url.substring(0, urlQuery + 3)\n }\n window.history.pushState({}, \"\", url + encodeURIComponent(query))\n\n return ajax.get(misago.get(\"SEARCH_API\"), { q: query })\n }\n\n handleSuccess(providers) {\n store.dispatch(\n updateSearch({\n query: this.state.query.trim(),\n isLoading: false,\n providers,\n })\n )\n\n providers.forEach((provider) => {\n if (provider.id === \"users\") {\n store.dispatch(updateUsers(provider.results.results))\n } else if (provider.id === \"threads\") {\n store.dispatch(updatePosts(provider.results))\n }\n })\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updateSearch({\n isLoading: false,\n })\n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {gettext(\"Search\")}

    \n
    \n \n \n \n \n \n \n \n \n search\n \n \n \n \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function (props) {\n return (\n
    \n {props.providers.map((provider) => {\n return (\n \n {provider.icon}\n {provider.name}\n \n \n )\n })}\n
    \n )\n}\n\nexport function Badge(props) {\n if (!props.results) return null\n\n let count = props.results.count\n if (count > 1000000) {\n count = Math.ceil(count / 1000000) + \"KK\"\n } else if (count > 1000) {\n count = Math.ceil(count / 1000) + \"K\"\n }\n\n return {count}\n}\n","import React from \"react\"\nimport PageContainer from \"../PageContainer\"\nimport SearchForm from \"./form\"\nimport SideNav from \"./sidenav\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n
    \n \n
    \n
    \n {props.children}\n \n
    \n
    \n
    \n
    \n )\n}\n\nexport function SearchTime(props) {\n let time = null\n props.search.providers.forEach((p) => {\n if (p.id === props.provider.id) {\n time = p.time\n }\n })\n\n if (time === null) return null\n\n const copy = gettext(\"Search took %(time)s s to complete\")\n\n return (\n
    \n

    {interpolate(copy, { time }, true)}

    \n
    \n )\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport {\n update as updatePosts,\n append as appendPosts,\n} from \"misago/reducers/posts\"\nimport { updateProvider } from \"misago/reducers/search\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n )\n}\n\nexport class LoadMore extends React.Component {\n onClick = () => {\n store.dispatch(\n updatePosts({\n isBusy: true,\n })\n )\n\n ajax\n .get(this.props.provider.api, {\n q: this.props.query,\n page: this.props.next,\n })\n .then(\n (providers) => {\n providers.forEach((provider) => {\n if (provider.id !== \"threads\") return\n store.dispatch(appendPosts(provider.results))\n store.dispatch(updateProvider(provider))\n })\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.more) return null\n\n return (\n
    \n \n {gettext(\"Show more\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport Results from \"./results\"\n\nexport default function (props) {\n return (\n \n \n \n
    \n \n )\n}\n\nexport function Blankslate({ children, loading, posts, query }) {\n if (posts && posts.count) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? gettext(\"Loading results...\")\n : gettext(\"No threads matching search query have been found.\")}\n

    \n )\n }\n\n return (\n

    \n {gettext(\"Enter at least two characters to search threads.\")}\n

    \n )\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport UsersList from \"misago/components/users-list\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, query, users }) {\n if (users.length) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? gettext(\"Loading results...\")\n : gettext(\"No users matching search query have been found.\")}\n

    \n )\n }\n\n return (\n

    \n {gettext(\"Enter at least two characters to search users.\")}\n

    \n )\n}\n","import { connect } from \"react-redux\"\nimport SearchThreads from \"./threads\"\nimport SearchUsers from \"./users\"\n\nconst components = {\n threads: SearchThreads,\n users: SearchUsers,\n}\n\nexport function select(store) {\n return {\n posts: store.posts,\n search: store.search,\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport default function (providers) {\n return providers.map((provider) => {\n return {\n path: provider.url,\n component: connect(select)(components[provider.id]),\n provider: provider,\n }\n })\n}\n","import paths from \"misago/components/search\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:search\") {\n mount({\n paths: paths(misago.get(\"SEARCH_PROVIDERS\")),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:search\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nconst TYPES_CLASSES = {\n info: \"alert-info\",\n success: \"alert-success\",\n warning: \"alert-warning\",\n error: \"alert-danger\",\n}\n\nexport class Snackbar extends React.Component {\n getSnackbarClass() {\n let snackbarClass = \"alerts-snackbar\"\n if (this.props.isVisible) {\n snackbarClass += \" in\"\n } else {\n snackbarClass += \" out\"\n }\n return snackbarClass\n }\n\n render() {\n return (\n
    \n

    \n {this.props.message}\n

    \n
    \n )\n }\n}\n\nexport function select(state) {\n return state.snackbar\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport { Snackbar, select } from \"misago/components/snackbar\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(Snackbar), \"snackbar-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:snackbar\",\n initializer: initializer,\n after: \"snackbar\",\n})\n","import React from \"react\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nconst Header = ({ backendName }) => {\n const pageTitleTpl = gettext(\"Sign in with %(backend)s\")\n const pageTitle = interpolate(pageTitleTpl, { backend: backendName }, true)\n\n return (\n \n \n \n

    {pageTitle}

    \n
    \n
    \n
    \n )\n}\n\nexport default Header\n","import React from \"react\"\nimport misago from \"misago\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nexport default class Register extends Form {\n constructor(props) {\n super(props)\n\n const formValidators = {\n email: [validators.email()],\n username: [validators.usernameContent()],\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n email: props.email || \"\",\n emailProtected: !!props.email,\n username: props.username || \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.email.trim().length,\n this.state.username.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(gettext(\"Fill out all fields.\"))\n return false\n }\n\n const { validators } = this.state\n\n const checkTermsOfService = !!misago.get(\"TERMS_OF_SERVICE_ID\")\n if (checkTermsOfService && this.state.termsOfService === null) {\n snackbar.error(validators.termsOfService[0](null))\n return false\n }\n\n const checkPrivacyPolicy = !!misago.get(\"PRIVACY_POLICY_ID\")\n if (checkPrivacyPolicy && this.state.privacyPolicy === null) {\n snackbar.error(validators.privacyPolicy[0](null))\n snackbar.error(gettext(\"You need to accept the privacy policy.\"))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.url, {\n email: this.state.email,\n username: this.state.username,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(response) {\n const { onRegistrationComplete } = this.props\n onRegistrationComplete(response)\n }\n\n handleError(rejection) {\n if (rejection.status === 200) {\n // We've entered \"errored\" state because response is HTML instead of exptected JSON\n const { onRegistrationComplete } = this.props\n const { username } = this.state\n onRegistrationComplete({ activation: \"active\", step: \"done\", username })\n } else if (rejection.status === 400) {\n const stateUpdate = { errors: rejection }\n if (rejection.email) {\n stateUpdate.emailProtected = false\n }\n this.setState(stateUpdate)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n const { backend_name } = this.props\n const { email, emailProtected, username, isLoading } = this.state\n\n let emailHelpText = null\n if (emailProtected) {\n const emailHelpTextTpl = gettext(\n \"Your e-mail address has been verified by %(backend)s.\"\n )\n emailHelpText = interpolate(\n emailHelpTextTpl,\n { backend: backend_name },\n true\n )\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n {gettext(\"Complete your details\")}\n

    \n
    \n
    \n \n \n \n \n \n \n \n
    \n
    \n \n {gettext(\"Sign in\")}\n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nconst Complete = ({ activation, backend_name, username }) => {\n let icon = \"\"\n let message = \"\"\n if (activation === \"user\") {\n message = gettext(\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (activation === \"admin\") {\n message = gettext(\n \"%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.\"\n )\n } else {\n message = gettext(\n \"%(username)s, your account has been created and you have been signed in to it.\"\n )\n }\n\n if (activation === \"active\") {\n icon = \"check\"\n } else {\n icon = \"info_outline\"\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n

    \n {gettext(\"Registration completed!\")}\n

    \n
    \n
    \n
    \n {icon}\n
    \n
    \n

    \n {interpolate(message, { username }, true)}\n

    \n

    \n \n {gettext(\"Return to forum index\")}\n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n}\n\nexport default Complete\n","import React from \"react\"\nimport Register from \"./register\"\nimport Complete from \"./complete\"\n\nexport default class SocialAuth extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n step: props.step,\n\n activation: props.activation || \"\",\n email: props.email || \"\",\n username: props.username || \"\",\n }\n }\n\n handleRegistrationComplete = ({ activation, email, step, username }) => {\n this.setState({ activation, email, step, username })\n }\n\n render() {\n const { backend_name, url } = this.props\n const { activation, email, step, username } = this.state\n\n if (step === \"register\") {\n return (\n \n )\n }\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport SocialAuth from \"misago/components/social-auth\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:social-complete\") {\n const props = context.get(\"SOCIAL_AUTH_FORM\")\n mount(, \"page-mount\")\n }\n}\n\nmisago.addInitializer({\n name: \"component:social-auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Form from \"./form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n }\n }\n\n onUsernameChange = (event) => {\n this.changeValue(\"username\", event.target.value)\n }\n\n clean() {\n if (!this.state.username.trim().length) {\n snackbar.error(gettext(\"You have to enter user name.\"))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.patch(this.props.thread.api.index, [\n { op: \"add\", path: \"participants\", value: this.state.username },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n }\n\n handleSuccess(data) {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n snackbar.success(gettext(\"New participant has been added to thread.\"))\n\n modal.hide()\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {gettext(\"Add participant\")}\n \n \n {gettext(\"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    {gettext(\"Add participant\")}

    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipantModal from \"misago/components/add-participant\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.thread.acl.can_add_participants) return null\n\n return (\n
    \n \n person_add\n {gettext(\"Add participant\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { changeOwner } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n gettext(\"Are you sure you want to take over this thread?\")\n )\n } else {\n const message = gettext(\n \"Are you sure you want to change thread owner to %(user)s?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n changeOwner(this.props.thread, this.props.participant)\n }\n\n render() {\n if (this.props.participant.is_owner) return null\n if (!this.props.thread.acl.can_change_owner) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function leave(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n ])\n .then(\n () => {\n snackbar.success(gettext(\"You have left this thread.\"))\n window.setTimeout(() => {\n window.location = misago.get(\"PRIVATE_THREADS_URL\")\n }, 3 * 1000)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function remove(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = gettext(\"%(user)s has been removed from this thread.\")\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function changeOwner(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"replace\", path: \"owner\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = gettext(\"%(user)s has been made new thread owner.\")\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n","import React from \"react\"\nimport { remove, leave } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n gettext(\"Are you sure you want to leave this thread?\")\n )\n } else {\n const message = gettext(\n \"Are you sure you want to remove %(user)s from this thread?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n if (this.isUser) {\n leave(this.props.thread, this.props.participant)\n } else {\n remove(this.props.thread, this.props.participant)\n }\n }\n\n render() {\n const isModerator = this.props.user.acl.can_moderate_private_threads\n\n if (!(this.props.userIsOwner || this.isUser || isModerator)) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport MakeOwner from \"./make-owner\"\nimport Remove from \"./remove\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function (props) {\n const participant = props.participant\n\n let className = \"btn btn-default\"\n if (participant.is_owner) {\n className = \"btn btn-primary\"\n }\n className += \" btn-user btn-block\"\n\n return (\n
    \n
    \n \n \n {participant.username}\n \n \n
    \n
    \n )\n}\n\nexport function UserStatus({ isOwner }) {\n if (!isOwner) return null\n\n return (\n
  • \n start\n {gettext(\"Thread owner\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ participants, thread, user, userIsOwner }) {\n return (\n
    \n
    \n {participants.map((participant) => {\n return (\n \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipant from \"./add-participant\"\nimport CardsList from \"./cards-list\"\nimport * as utils from \"./utils\"\n\nexport default function (props) {\n if (!props.participants.length) return null\n\n return (\n
    \n
    \n \n
    \n \n
    \n

    {utils.getParticipantsCopy(props.participants)}

    \n
    \n
    \n
    \n
    \n )\n}\n\nexport function getUserIsOwner(user, participants) {\n return participants[0].id === user.id\n}\n","export function getParticipantsCopy(participants) {\n const count = participants.length\n const message = ngettext(\n \"This thread has %(users)s participant.\",\n \"This thread has %(users)s participants.\",\n count\n )\n\n return interpolate(\n message,\n {\n users: count,\n },\n true\n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n {props.poll.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport function PollChoice(props) {\n let proc = 0\n if (props.choice.votes && props.poll.votes) {\n proc = Math.ceil((props.choice.votes * 100) / props.poll.votes)\n }\n\n return (\n
    \n
    {props.choice.label}
    \n
    \n
    \n \n \n {getVotesLabel(props.votes, props.proc)}\n \n
    \n \n
      \n \n \n
    \n
    \n
    \n )\n}\n\nexport function ChoiceVotes(props) {\n return (\n
  • \n {getVotesLabel(props.votes, props.proc)}\n
  • \n )\n}\n\nexport function getVotesLabel(votes, proc) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote, %(proc)s% of total.\",\n \"%(votes)s votes, %(proc)s% of total.\",\n votes\n )\n\n return interpolate(\n message,\n {\n votes: votes,\n proc: proc,\n },\n true\n )\n}\n\nexport function UserChoice(props) {\n if (!props.selected) return null\n\n return (\n
  • \n check_box\n {pgettext(\"thread poll\", \"You've voted on this choice.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: true,\n error: null,\n data: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.poll.api.votes).then(\n (data) => {\n const hydratedData = data.map((choice) => {\n return Object.assign({}, choice, {\n voters: choice.voters.map((voter) => {\n return Object.assign({}, voter, {\n voted_on: moment(voter.voted_on),\n })\n }),\n })\n })\n\n this.setState({\n isLoading: false,\n data: hydratedData,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread poll\", \"Poll votes\")}\n

    \n
    \n\n \n
    \n \n )\n }\n}\n\nexport function ModalBody(props) {\n if (props.isLoading) {\n return \n } else if (props.error) {\n return \n }\n\n return \n}\n\nexport function ChoicesList(props) {\n return (\n
    \n
      \n {props.data.map((choice) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function ChoiceDetails(props) {\n return (\n
  • \n

    {props.label}

    \n \n \n
    \n
  • \n )\n}\n\nexport function VotesCount(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s user has voted for this choice.\",\n \"%(votes)s users have voted for this choice.\",\n props.votes\n )\n\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return

    {label}

    \n}\n\nexport function VotesList(props) {\n if (!props.voters.length) return null\n\n return (\n
      \n {props.voters.map((user) => {\n return \n })}\n
    \n )\n}\n\nexport function Voter(props) {\n if (props.url) {\n return (\n
  • \n \n {props.username}\n {\" \"}\n \n
  • \n )\n }\n\n return (\n
  • \n {props.username} \n
  • \n )\n}\n\nexport function VoteDate(props) {\n return (\n \n {props.voted_on.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport Modal from \"./modal\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n const { isPollOver, poll, showVoting, thread } = props\n\n if (!isVisible(isPollOver, poll.acl, poll)) return null\n\n const controls = []\n\n const canVote = poll.acl.can_vote\n const canChangeVote = !poll.hasSelectedChoices || poll.allow_revotes\n\n if (canVote && canChangeVote) controls.push(0)\n if (poll.is_public || poll.acl.can_see_votes) controls.push(1)\n if (poll.acl.can_edit) controls.push(2)\n if (poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(isPollOver, acl, poll) {\n return (\n poll.is_public ||\n acl.can_delete ||\n acl.can_edit ||\n acl.can_see_votes ||\n (acl.can_vote &&\n !isPollOver &&\n (!poll.hasSelectedChoices || poll.allow_revotes))\n )\n}\n\nexport function getClassName(controls, control) {\n let className = \"col-xs-6\"\n\n if (controls.length === 1) {\n className = \"col-xs-12\"\n }\n\n if (controls.length === 3 && controls[0] === control) {\n className = \"col-xs-12\"\n }\n\n return className + \" col-sm-3 col-md-2\"\n}\n\nexport function ChangeVote(props) {\n const canVote = props.poll.acl.can_vote\n const canChangeVote =\n !props.poll.hasSelectedChoices || props.poll.allow_revotes\n\n if (!(canVote && canChangeVote)) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Vote\")}\n \n
    \n )\n}\n\nexport class SeeVotes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const seeVotes =\n this.props.poll.is_public || this.props.poll.acl.can_see_votes\n if (!seeVotes) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"See votes\")}\n \n
    \n )\n }\n}\n\nexport function Edit(props) {\n if (!props.poll.acl.can_edit) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Edit\")}\n \n
    \n )\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const deletePoll = window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to delete this poll? This action is not reversible.\"\n )\n )\n if (!deletePoll) return false\n\n store.dispatch(poll.busy())\n\n ajax\n .delete(this.props.poll.api.index)\n .then(this.handleSuccess, this.handleError)\n }\n\n handleSuccess = (newThreadAcl) => {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been deleted\"))\n store.dispatch(poll.remove())\n store.dispatch(thread.updateAcl(newThreadAcl))\n }\n\n handleError = (rejection) => {\n snackbar.apiError(rejection)\n store.dispatch(poll.release())\n }\n\n render() {\n if (!this.props.poll.acl.can_delete) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Delete\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n
    \n )\n}\n\nexport function PollCreation(props) {\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Started by %(poster)s %(posted_on)s.\")),\n {\n poster: getPoster(props.poll),\n posted_on: getPostedOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getPoster(poll) {\n if (poll.url.poster) {\n return interpolate(\n USER_URL,\n {\n url: escapeHtml(poll.url.poster),\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n }\n\n return interpolate(\n USER_SPAN,\n {\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n}\n\nexport function getPostedOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.posted_on.format(\"LLL\")),\n relative: escapeHtml(poll.posted_on.fromNow()),\n },\n true\n )\n}\n\nexport function PollLength(props) {\n if (!props.poll.length) {\n return null\n }\n\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Voting ends %(ends_on)s.\")),\n {\n ends_on: getEndsOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getEndsOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.endsOn.format(\"LLL\")),\n relative: escapeHtml(poll.endsOn.fromNow()),\n },\n true\n )\n}\n\nexport function PollVotes(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote.\",\n \"%(votes)s votes.\",\n props.votes\n )\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollIsPublic(props) {\n if (!props.poll.is_public) {\n return null\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Voting is public.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Chart from \"./chart\"\nimport Options from \"./options\"\nimport PollInfo from \"../info\"\n\nexport default function (props) {\n return (\n
    \n
    \n

    {props.poll.question}

    \n \n \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n
    \n )\n}\n\nexport function PollChoicesLeft({ choicesLeft }) {\n if (choicesLeft === 0) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can't select any more choices.\")}\n
  • \n )\n }\n\n const message = npgettext(\n \"thread poll\",\n \"You can select %(choices)s more choice.\",\n \"You can select %(choices)s more choices.\",\n choicesLeft\n )\n\n const label = interpolate(\n message,\n {\n choices: choicesLeft,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollAllowRevote(props) {\n if (props.poll.allow_revotes) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can change your vote later.\")}\n
  • \n )\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Votes are final.\")}\n
  • \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
      \n {props.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport class ChoiceSelect extends React.Component {\n onClick = () => {\n this.props.toggleChoice(this.props.choice.hash)\n }\n\n render() {\n return (\n
  • \n \n \n {this.props.choice.selected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n {this.props.choice.label}\n \n
  • \n )\n }\n}\n","export function getChoiceFromHash(choices, hash) {\n for (const i in choices) {\n const choice = choices[i]\n if (choice.hash === hash) {\n return choice\n }\n }\n\n return null\n}\n\nexport function getChoicesLeft(poll, choices) {\n let selection = []\n for (const i in choices) {\n const choice = choices[i]\n if (choice.selected) {\n selection.push(choice)\n }\n }\n\n return poll.allowed_choices - selection.length\n}\n","import React from \"react\"\nimport ChoicesHelp from \"./help\"\nimport ChoicesSelect from \"./select\"\nimport { getChoicesLeft, getChoiceFromHash } from \"./utils\"\nimport PollInfo from \"../info\"\nimport { Delete, Edit, getClassName } from \"../results/options\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n choices: props.poll.choices,\n choicesLeft: getChoicesLeft(props.poll, props.poll.choices),\n }\n }\n\n toggleChoice = (hash) => {\n const choice = getChoiceFromHash(this.state.choices, hash)\n\n let choices = null\n if (!choice.selected) {\n choices = this.selectChoice(choice, hash)\n } else {\n choices = this.deselectChoice(choice, hash)\n }\n\n this.setState({\n choices,\n choicesLeft: getChoicesLeft(this.props.poll, choices),\n })\n }\n\n selectChoice = (choice, hash) => {\n const choicesLeft = getChoicesLeft(this.props.poll, this.state.choices)\n\n if (!choicesLeft) {\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected && item.hash != hash) {\n item.selected = false\n break\n }\n }\n }\n\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? true : choice.selected,\n })\n })\n }\n\n deselectChoice = (choice, hash) => {\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? false : choice.selected,\n })\n })\n }\n\n clean() {\n if (this.state.choicesLeft === this.props.poll.allowed_choices) {\n snackbar.error(gettext(\"You need to select at least one choice\"))\n return false\n }\n\n return true\n }\n\n send() {\n let data = []\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected) {\n data.push(item.hash)\n }\n }\n\n return ajax.post(this.props.poll.api.votes, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n snackbar.success(gettext(\"Your vote has been saved.\"))\n\n this.props.showResults()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const controls = []\n\n if (this.props.poll.acl.can_vote) controls.push(0)\n if (this.props.poll.is_public || this.props.poll.acl.can_see_votes)\n controls.push(1)\n if (this.props.poll.acl.can_edit) controls.push(2)\n if (this.props.poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n
    \n
    \n

    {this.props.poll.question}

    \n \n \n \n
    \n
    \n
    \n
    \n \n {gettext(\"Save your vote\")}\n \n
    \n
    \n \n {gettext(\"See results\")}\n \n
    \n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Results from \"./results\"\nimport Voting from \"./voting\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n let showResults = true\n if (props.user.id && !props.poll.hasSelectedChoices) {\n showResults = false\n }\n\n this.state = {\n showResults,\n }\n }\n\n showResults = () => {\n this.setState({\n showResults: true,\n })\n }\n\n showVoting = () => {\n this.setState({\n showResults: false,\n })\n }\n\n render() {\n if (!this.props.thread.poll) return null\n\n const isPollOver = getIsPollOver(this.props.poll)\n\n if (\n !isPollOver &&\n this.props.poll.acl.can_vote &&\n !this.state.showResults\n ) {\n return \n } else {\n return (\n \n )\n }\n }\n}\n\nexport function getIsPollOver(poll) {\n if (poll.length) {\n return moment().isAfter(poll.endsOn)\n }\n return false\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n onAdd = () => {\n let choices = this.props.choices.slice()\n choices.push({\n hash: generateRandomHash(),\n label: \"\",\n })\n\n this.props.setChoices(choices)\n }\n\n onChange = (hash, label) => {\n const choices = this.props.choices.map((choice) => {\n if (choice.hash === hash) {\n choice.label = label\n }\n\n return choice\n })\n this.props.setChoices(choices)\n }\n\n onDelete = (hash) => {\n const choices = this.props.choices.filter((choice) => {\n return choice.hash !== hash\n })\n this.props.setChoices(choices)\n }\n\n render() {\n return (\n
    \n
      \n {this.props.choices.map((choice) => {\n return (\n 2}\n choice={choice}\n disabled={this.props.disabled}\n key={choice.hash}\n onChange={this.onChange}\n onDelete={this.onDelete}\n />\n )\n })}\n
    \n \n {pgettext(\"thread poll\", \"Add choice\")}\n \n
    \n )\n }\n}\n\nexport class PollChoice extends React.Component {\n onChange = (event) => {\n this.props.onChange(this.props.choice.hash, event.target.value)\n }\n\n onDelete = () => {\n const deleteItem = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to remove this choice?\")\n )\n if (deleteItem) {\n this.props.onDelete(this.props.choice.hash)\n }\n }\n\n render() {\n return (\n
  • \n \n close\n \n \n
  • \n )\n }\n}\n\nexport function generateRandomHash() {\n let randomHash = \"\"\n while (randomHash.length != 12) {\n randomHash = Math.random()\n .toString(36)\n .replace(/[^a-zA-Z0-9]+/g, \"\")\n .substr(1, 12)\n }\n return randomHash\n}\n","import React from \"react\"\nimport ChoicesControl from \"./choices-control\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const poll = props.poll.id\n ? props.poll\n : {\n question: \"\",\n choices: [\n {\n hash: \"choice-10000\",\n label: \"\",\n },\n {\n hash: \"choice-20000\",\n label: \"\",\n },\n ],\n length: 0,\n allowed_choices: 1,\n allow_revotes: 0,\n is_public: 0,\n }\n\n this.state = {\n isLoading: false,\n isEdit: !!poll.id,\n\n question: poll.question,\n choices: poll.choices,\n length: poll.length,\n allowed_choices: poll.allowed_choices,\n allow_revotes: poll.allow_revotes,\n is_public: poll.is_public,\n\n validators: {\n question: [],\n choices: [],\n length: [],\n allowed_choices: [],\n },\n\n errors: {},\n }\n }\n\n setChoices = (choices) => {\n const errors = Object.assign({}, errors, { choices: null })\n\n this.setState({\n choices,\n errors,\n })\n }\n\n onCancel = () => {\n let cancel = false\n\n if (!!this.props.poll) {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard changes?\")\n )\n } else {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard new poll?\")\n )\n }\n\n if (cancel) {\n this.props.close()\n }\n }\n\n send() {\n const data = {\n question: this.state.question,\n choices: this.state.choices,\n length: this.state.length,\n allowed_choices: this.state.allowed_choices,\n allow_revotes: this.state.allow_revotes,\n is_public: this.state.is_public,\n }\n\n if (this.state.isEdit) {\n return ajax.put(this.props.poll.api.index, data)\n }\n\n return ajax.post(this.props.thread.api.poll, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n\n if (this.state.isEdit) {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been edited.\"))\n } else {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been posted.\"))\n }\n\n this.props.close()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.non_field_errors) {\n rejection.allowed_choices = rejection.non_field_errors\n }\n\n this.setState({\n errors: Object.assign({}, rejection),\n })\n\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n

    \n {this.state.isEdit\n ? pgettext(\"thread poll\", \"Edit poll\")\n : pgettext(\"thread poll\", \"Add poll\")}\n

    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Question and choices\")}\n \n\n \n \n \n\n \n \n \n
    \n\n
    \n {pgettext(\"thread poll\", \"Voting\")}\n\n
    \n
    \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Cancel\")}\n {\" \"}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function PollPublicSwitch(props) {\n if (props.isEdit) return null\n\n return (\n
    \n \n \n \n
    \n )\n}\n","import React from \"react\"\n\nconst ICON = {\n changed_title: \"edit\",\n\n pinned_globally: \"bookmark\",\n pinned_locally: \"bookmark_border\",\n unpinned: \"panorama_fish_eye\",\n\n moved: \"arrow_forward\",\n merged: \"call_merge\",\n\n approved: \"done\",\n\n opened: \"lock_open\",\n closed: \"lock_outline\",\n\n unhid: \"visibility\",\n hid: \"visibility_off\",\n\n changed_owner: \"grade\",\n tookover: \"grade\",\n\n added_participant: \"person_add\",\n\n owner_left: \"person_outline\",\n participant_left: \"person_outline\",\n removed_participant: \"remove_circle_outline\",\n}\n\nconst EventIcon = (props) => (\n \n {ICON[props.post.event_type]}\n \n)\n\nexport default EventIcon\n","import React from \"react\"\nimport moment from \"moment\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n if (isVisible(props.post.acl)) {\n return (\n
  • \n \n \n \n
  • \n )\n } else {\n return null\n }\n}\n\nexport function isVisible(acl) {\n return acl.can_hide\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: this.props.user.username,\n url: Object.assign(this.props.post.url, {\n hidden_by: this.props.user.url,\n }),\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: true }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: false }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n })\n )\n }\n )\n }\n\n render() {\n if (this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const decision = window.confirm(\n gettext(\n \"Are you sure you wish to delete this event? This action is not reversible!\"\n )\n )\n if (decision) {\n this.delete()\n }\n }\n\n delete = () => {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(this.props.post.api.index).then(\n () => {\n snackbar.success(gettext(\"Event has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: false,\n })\n )\n }\n )\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport Controls from \"./controls\"\n\nconst DATE_ABBR = '%(relative)s'\nconst DATE_URL = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n
    \n )\n}\n\nexport function Hidden(props) {\n if (props.post.is_hidden) {\n let user = null\n if (props.post.url.hidden_by) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(gettext(\"Hidden by %(event_by)s %(event_on)s.\")),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n } else {\n return null\n }\n}\n\nexport function Poster(props) {\n let user = null\n if (props.post.poster) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.poster.url),\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_URL,\n {\n url: escapeHtml(props.post.url.index),\n absolute: escapeHtml(props.post.posted_on.format(\"LLL\")),\n relative: escapeHtml(props.post.posted_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(gettext(\"By %(event_by)s %(event_on)s.\")),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst MESSAGE = {\n pinned_globally: gettext(\"Thread has been pinned globally.\"),\n pinned_locally: gettext(\"Thread has been pinned locally.\"),\n unpinned: gettext(\"Thread has been unpinned.\"),\n\n approved: gettext(\"Thread has been approved.\"),\n\n opened: gettext(\"Thread has been opened.\"),\n closed: gettext(\"Thread has been closed.\"),\n\n unhid: gettext(\"Thread has been revealed.\"),\n hid: gettext(\"Thread has been made hidden.\"),\n\n tookover: gettext(\"Took thread over.\"),\n\n owner_left: gettext(\"Owner has left thread. This thread is now closed.\"),\n participant_left: gettext(\"Participant has left thread.\"),\n}\n\nconst ITEM_LINK = '%(name)s'\nconst ITEM_SPAN = '%(name)s'\n\nexport default function (props) {\n if (MESSAGE[props.post.event_type]) {\n return

    {MESSAGE[props.post.event_type]}

    \n } else if (props.post.event_type === \"changed_title\") {\n return \n } else if (props.post.event_type === \"moved\") {\n return \n } else if (props.post.event_type === \"merged\") {\n return \n } else if (props.post.event_type === \"changed_owner\") {\n return \n } else if (props.post.event_type === \"added_participant\") {\n return \n } else if (props.post.event_type === \"removed_participant\") {\n return \n } else {\n return null\n }\n}\n\nexport function ChangedTitle(props) {\n const msgstring = escapeHtml(\n gettext(\"Thread title has been changed from %(old_title)s.\")\n )\n const oldTitle = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.old_title),\n },\n true\n )\n const message = interpolate(\n msgstring,\n {\n old_title: oldTitle,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Moved(props) {\n const msgstring = escapeHtml(\n gettext(\"Thread has been moved from %(from_category)s.\")\n )\n const fromCategory = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.from_category.url),\n name: escapeHtml(props.post.event_context.from_category.name),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n from_category: fromCategory,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Merged(props) {\n const msgstring = escapeHtml(\n gettext(\"The %(merged_thread)s thread has been merged into this thread.\")\n )\n const mergedThread = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.merged_thread),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n merged_thread: mergedThread,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function ChangedOwner(props) {\n const msgstring = escapeHtml(gettext(\"Changed thread owner to %(user)s.\"))\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function AddedParticipant(props) {\n const msgstring = escapeHtml(gettext(\"Added %(user)s to thread.\"))\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function RemovedParticipant(props) {\n const msgstring = escapeHtml(gettext(\"Removed %(user)s from thread.\"))\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n if (post.is_read) return null\n\n return (\n
    \n {gettext(\"New event\")}\n
    \n )\n}\n","import React from \"react\"\nimport * as post from \"misago/reducers/post\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n /*\n Super naive and de-facto placeholder implementation for reading posts on scroll\n */\n componentDidMount() {\n if (this.props.post.is_read) return // don't register read tracker\n\n $(this.element).waypoint({\n handler: (direction) => {\n if (direction !== \"down\" || this.props.post.is_read) return\n\n // after 1500ms run flag post as read logic\n window.setTimeout(() => {\n // check if post's bottom edge is still in viewport\n const boundingClientRect = this.element.getBoundingClientRect()\n const offsetBottom =\n boundingClientRect.height + boundingClientRect.top\n const clientHeight = document.documentElement.clientHeight\n\n if (offsetBottom < 5) return // scrolled past the post\n if (offsetBottom > clientHeight) return // scrolled back up\n\n // mark post as read\n store.dispatch(\n post.patch(this.props.post, {\n is_read: true,\n })\n )\n\n // call API to let it know we have unread post\n ajax.post(this.props.post.api.read).then(\n (data) => {\n store.dispatch(\n thread.update(this.props.thread, {\n is_read: data.thread_is_read,\n })\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }, 1000)\n },\n offset: \"bottom-in-view\",\n })\n }\n\n render() {\n return (\n {\n if (node) this.element = node\n }}\n >\n {this.props.children}\n \n )\n }\n}\n","import React from \"react\"\nimport Icon from \"./icon\"\nimport Info from \"./info\"\nimport Message from \"./message\"\nimport UnreadLabel from \"./unread-label\"\nimport Waypoint from \"../waypoint\"\n\nexport default function (props) {\n let className = \"event\"\n if (props.post.isDeleted) {\n className = \"hide\"\n } else if (props.post.is_hidden) {\n className = \"event post-hidden\"\n }\n\n return (\n
  • \n \n
    \n
    \n \n
    \n \n \n \n \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport formatFilesize from \"misago/utils/file-size\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
    \n \n
    \n \n {props.attachment.filename}\n \n \n
    \n
    \n )\n}\n\nexport function AttachmentPreview(props) {\n if (props.attachment.is_image) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n}\n\nexport function AttachmentIcon(props) {\n return (\n \n insert_drive_file\n \n )\n}\n\nexport function AttachmentThumbnail(props) {\n const url = props.attachment.url.thumb || props.attachment.url.index\n return (\n \n )\n}\n\nexport function AttachmentDetails(props) {\n let user = null\n if (props.attachment.url.uploader) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.attachment.url.uploader),\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.attachment.uploaded_on.format(\"LLL\")),\n relative: escapeHtml(props.attachment.uploaded_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n gettext(\n \"%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.\"\n )\n ),\n {\n filetype: props.attachment.filetype,\n size: formatFilesize(props.attachment.size),\n uploader: user,\n uploaded_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport batch from \"misago/utils/batch\"\nimport Attachment from \"./attachment\"\n\nexport default function (props) {\n if (!isVisible(props.post)) {\n return null\n }\n\n return (\n
    \n {batch(props.post.attachments, 2).map((row) => {\n const key = row\n .map((a) => {\n return a ? a.id : 0\n })\n .join(\"_\")\n return \n })}\n
    \n )\n}\n\nexport function isVisible(post) {\n return (!post.is_hidden || post.acl.can_see_hidden) && post.attachments\n}\n\nexport function Row(props) {\n return (\n
    \n {props.row.map((attachment) => {\n return (\n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Waypoint from \"../waypoint\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst HIDDEN_BY_URL = '%(user)s'\nconst HIDDEN_BY_SPAN = '%(user)s'\nconst HIDDEN_ON =\n '%(relative)s'\n\nexport default function (props) {\n if (props.post.is_hidden && !props.post.acl.can_see_hidden) {\n return \n } else if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default({ post }) {\n const poster = \"@\" + (post.poster ? post.poster.username : post.poster_name)\n\n return (\n \n \n \n )\n}\n\nexport function Hidden(props) {\n let user = null\n if (props.post.hidden_by) {\n user = interpolate(\n HIDDEN_BY_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n HIDDEN_BY_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n HIDDEN_ON,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(gettext(\"Hidden by %(hidden_by)s %(hidden_on)s.\")),\n {\n hidden_by: user,\n hidden_on: date,\n },\n true\n )\n\n return (\n \n

    \n {gettext(\"This post is hidden. You cannot see its contents.\")}\n

    \n

    \n \n )\n}\n\nexport function Invalid(props) {\n return (\n \n

    \n {gettext(\"This post's contents cannot be displayed.\")}\n

    \n

    \n {gettext(\"This error is caused by invalid post content manipulation.\")}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport function FlagBestAnswer({ post, thread, user }) {\n if (!(isVisible(post) && post.id === thread.best_answer)) {\n return null\n }\n\n let message = null\n if (user.id && thread.best_answer_marked_by === user.id) {\n message = interpolate(\n gettext(\"Marked as best answer by you %(marked_on)s.\"),\n {\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n } else {\n message = interpolate(\n gettext(\"Marked as best answer by %(marked_by)s %(marked_on)s.\"),\n {\n marked_by: thread.best_answer_marked_by_name,\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n }\n\n return (\n
    \n check_box\n

    {message}

    \n
    \n )\n}\n\nexport function FlagHidden(props) {\n if (!(isVisible(props.post) && props.post.is_hidden)) {\n return null\n }\n\n return (\n
    \n visibility_off\n

    \n {gettext(\n \"This post is hidden. Only users with permission may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagUnapproved(props) {\n if (!(isVisible(props.post) && props.post.is_unapproved)) {\n return null\n }\n\n return (\n
    \n remove_circle_outline\n

    \n {gettext(\n \"This post is unapproved. Only users with permission to approve posts and its author may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagProtected(props) {\n if (!(isVisible(props.post) && props.post.is_protected)) {\n return null\n }\n\n return (\n
    \n lock_outline\n

    {gettext(\"This post is protected. Only moderators may change it.\")}

    \n
    \n )\n}\n\nexport function isVisible(post) {\n return !post.is_hidden || post.acl.can_see_hidden\n}\n","import moment from \"moment\"\nimport * as thread from \"misago/reducers/thread\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function approve(props) {\n store.dispatch(\n post.patch(props.post, {\n is_unapproved: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const previousState = {\n is_unapproved: props.post.is_unapproved,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function protect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: true,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unprotect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function hide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(props.post.url, {\n hidden_by: props.user.url,\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n hidden_on: props.post.hidden_on,\n hidden_by_name: props.post.hidden_by_name,\n url: props.post.url,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unhide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function like(props) {\n const lastLikes = props.post.last_likes || []\n const concatedLikes = [props.user].concat(lastLikes)\n const finalLikes =\n concatedLikes.length > 3 ? concatedLikes.slice(0, -1) : concatedLikes\n\n store.dispatch(\n post.patch(props.post, {\n is_liked: true,\n likes: props.post.likes + 1,\n last_likes: finalLikes,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: true }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unlike(props) {\n store.dispatch(\n post.patch(props.post, {\n is_liked: false,\n likes: props.post.likes - 1,\n last_likes: props.post.last_likes.filter((user) => {\n return !user.id || user.id !== props.user.id\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: false }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function patch(props, ops, previousState) {\n ajax.patch(props.post.api.index, ops).then(\n (newState) => {\n store.dispatch(post.patch(props.post, newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(post.patch(props.post, previousState))\n }\n )\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n gettext(\n \"Are you sure you want to delete this post? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(props.post.api.index).then(\n () => {\n snackbar.success(gettext(\"Post has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: false,\n })\n )\n }\n )\n}\n\nexport function markAsBestAnswer(props) {\n const { post, user } = props\n\n store.dispatch(\n thread.update({\n best_answer: post.id,\n best_answer_is_protected: post.is_protected,\n best_answer_marked_on: moment(),\n best_answer_marked_by: user.id,\n best_answer_marked_by_name: user.username,\n best_answer_marked_by_slug: user.slug,\n })\n )\n\n const ops = [\n { op: \"replace\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function unmarkBestAnswer(props) {\n const { post } = props\n\n store.dispatch(\n thread.update({\n best_answer: null,\n best_answer_is_protected: false,\n best_answer_marked_on: null,\n best_answer_marked_by: null,\n best_answer_marked_by_name: null,\n best_answer_marked_by_slug: null,\n })\n )\n\n const ops = [\n { op: \"remove\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function patchThread(props, ops, previousState) {\n ajax.patch(props.thread.api.index, ops).then(\n (newState) => {\n if (newState.best_answer_marked_on) {\n newState.best_answer_marked_on = moment(newState.best_answer_marked_on)\n }\n store.dispatch(thread.update(newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(thread.update(previousState))\n }\n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Avatar from \"misago/components/avatar\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n\n error: null,\n likes: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.post.api.likes).then(\n (data) => {\n this.setState({\n isReady: true,\n likes: data.map(hydrateLike),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n if (this.state.likes.length) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function hydrateLike(data) {\n return Object.assign({}, data, {\n liked_on: moment(data.liked_on),\n })\n}\n\nexport function ModalDialog({ className, children, likes }) {\n let title = gettext(\"Post Likes\")\n if (likes) {\n const likesCount = likes.length\n const message = ngettext(\"%(likes)s like\", \"%(likes)s likes\", likesCount)\n\n title = interpolate(message, { likes: likesCount }, true)\n }\n\n return (\n
    \n
    \n
    \n \n ×\n \n

    {title}

    \n
    \n {children}\n
    \n
    \n )\n}\n\nexport function LikesList(props) {\n return (\n
    \n
      \n {props.likes.map((like) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function LikeDetails(props) {\n if (props.url) {\n const user = {\n id: props.liker_id,\n avatars: props.avatars,\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n {props.username}\n {\" \"}\n \n
    \n
  • \n )\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n {props.username} \n
    \n
  • \n )\n}\n\nexport function LikeDate(props) {\n return (\n \n {props.likedOn.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport * as actions from \"./controls/actions\"\nimport LikesModal from \"misago/components/post-likes\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\n\nexport default function (props) {\n if (!isVisible(props.post)) return null\n\n return (\n
    \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(post) {\n return (\n (!post.is_hidden || post.acl.can_see_hidden) &&\n (post.acl.can_reply ||\n post.acl.can_edit ||\n (post.acl.can_see_likes && (post.last_likes || []).length) ||\n post.acl.can_like)\n )\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n {gettext(\"Best answer\")}\n \n )\n }\n}\n\nexport class MarkAsBestAnswerCompact extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n \n )\n }\n}\n\nexport class Like extends React.Component {\n onClick = () => {\n if (this.props.post.is_liked) {\n actions.unlike(this.props)\n } else {\n actions.like(this.props)\n }\n }\n\n render() {\n if (!this.props.post.acl.can_like) return null\n\n let className = \"btn btn-default btn-sm pull-left\"\n if (this.props.post.is_liked) {\n className = \"btn btn-success btn-sm pull-left\"\n }\n\n return (\n \n {this.props.post.is_liked ? gettext(\"Liked\") : gettext(\"Like\")}\n \n )\n }\n}\n\nexport class Likes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n \n )\n }\n\n return (\n

    \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n

    \n )\n }\n}\n\nexport class LikesCompact extends Likes {\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n favorite\n {this.props.likes}\n \n )\n }\n\n return (\n

    \n favorite\n {this.props.likes}\n

    \n )\n }\n}\n\nexport function getLikesMessage(likes, users) {\n const usernames = users.slice(0, 3).map((u) => u.username)\n\n if (usernames.length == 1) {\n return interpolate(\n gettext(\"%(user)s likes this.\"),\n {\n user: usernames[0],\n },\n true\n )\n }\n\n const hiddenLikes = likes - usernames.length\n\n const otherUsers = usernames.slice(0, -1).join(\", \")\n const lastUser = usernames.slice(-1)[0]\n\n const usernamesList = interpolate(\n gettext(\"%(users)s and %(last_user)s\"),\n {\n users: otherUsers,\n last_user: lastUser,\n },\n true\n )\n\n if (hiddenLikes === 0) {\n return interpolate(\n gettext(\"%(users)s like this.\"),\n {\n users: usernamesList,\n },\n true\n )\n }\n\n const message = ngettext(\n \"%(users)s and %(likes)s other user like this.\",\n \"%(users)s and %(likes)s other users like this.\",\n hiddenLikes\n )\n\n return interpolate(\n message,\n {\n users: usernames.join(\", \"),\n likes: hiddenLikes,\n },\n true\n )\n}\n\nexport class Reply extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n\n context: {\n reply: this.props.post.id,\n },\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {gettext(\"Reply\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_edit) {\n return (\n \n {gettext(\"Edit\")}\n \n )\n } else {\n return null\n }\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(gettext(\"You have to enter link to the other thread.\"))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(success) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(gettext(\"Selected post was moved to the other thread.\"))\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {gettext(\"Move post\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    {gettext(\"Move post\")}

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
      \n {props.diff.map((item, i) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function DiffItem(props) {\n if (props.item[0] === \"?\") return null\n\n return (\n
  • {cleanItem(props.item)}
  • \n )\n}\n\nexport function getItemClassName(item) {\n let className = \"diff-item\"\n if (item[0] === \"-\") {\n className += \" diff-item-sub\"\n } else if (item[0] === \"+\") {\n className += \" diff-item-add\"\n }\n return className\n}\n\nexport function cleanItem(item) {\n return item.substr(2)\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\n\nexport default class extends React.Component {\n onClick = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n if (!this.props.canRevert) return null\n\n return (\n
    \n \n {gettext(\"Revert\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default class extends React.Component {\n goLast = () => {\n this.props.goToEdit()\n }\n\n goForward = () => {\n this.props.goToEdit(this.props.edit.next)\n }\n\n goBack = () => {\n this.props.goToEdit(this.props.edit.previous)\n }\n\n revertEdit = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n )\n }\n}\n\nexport function GoBackBtn(props) {\n return (\n \n chevron_left\n \n )\n}\n\nexport function GoForwardBtn(props) {\n return (\n \n chevron_right\n \n )\n}\n\nexport function GoLastBtn(props) {\n return (\n \n last_page\n \n )\n}\n\nexport function RevertBtn(props) {\n if (!props.canRevert) return null\n\n return (\n
    \n \n {gettext(\"Revert\")}\n \n
    \n )\n}\n\nexport function Label(props) {\n let user = null\n if (props.edit.url.editor) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.edit.url.editor),\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.edit.edited_on.format(\"LLL\")),\n relative: escapeHtml(props.edit.edited_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(gettext(\"By %(edited_by)s %(edited_on)s.\")),\n {\n edited_by: user,\n edited_on: date,\n },\n true\n )\n\n return

    \n}\n","import moment from \"moment\"\n\nexport function hydrateEdit(json) {\n return Object.assign({}, json, {\n edited_on: moment(json.edited_on),\n })\n}\n","import React from \"react\"\nimport Diff from \"./diff\"\nimport Footer from \"./footer\"\nimport Toolbar from \"./toolbar\"\nimport { hydrateEdit } from \"./utils\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isBusy: true,\n\n canRevert: props.post.acl.can_edit,\n\n error: null,\n edit: null,\n }\n }\n\n componentDidMount() {\n this.goToEdit()\n }\n\n goToEdit = (edit = null) => {\n this.setState({\n isBusy: true,\n })\n\n let url = this.props.post.api.edits\n if (edit !== null) {\n url += \"?edit=\" + edit\n }\n\n ajax.get(url).then(\n (data) => {\n this.setState({\n isReady: true,\n isBusy: false,\n edit: hydrateEdit(data),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n isBusy: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n revertEdit = (edit) => {\n if (this.state.isBusy) return\n\n const confirmation = window.confirm(\n gettext(\n \"Are you sure you with to revert this post to the state from before this edit?\"\n )\n )\n if (!confirmation) return\n\n this.setState({\n isBusy: true,\n })\n\n const url = this.props.post.api.edits + \"?edit=\" + edit\n ajax.post(url).then(\n (data) => {\n const hydratedPost = post.hydrate(data)\n store.dispatch(post.patch(data, hydratedPost))\n\n snackbar.success(gettext(\"Post has been reverted to previous state.\"))\n modal.hide()\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n this.setState({\n isBusy: false,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function ModalDialog(props) {\n return (\n

    \n
    \n
    \n \n ×\n \n

    {gettext(\"Post edits history\")}

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: gettext(\"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: gettext(\"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: gettext(\"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: gettext(\"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(gettext(\"Selected post was split into new thread.\"))\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: gettext(\"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: gettext(\"Pinned locally\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: gettext(\"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {gettext(\"You can't move this post at the moment.\")}\n

    \n

    {props.message}

    \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {gettext(\"Split post into new thread\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Permalink extends React.Component {\n onClick = () => {\n let permaUrl = window.location.protocol + \"//\"\n permaUrl += window.location.host\n permaUrl += this.props.post.url.index\n\n prompt(gettext(\"Permament link to this post:\"), permaUrl)\n }\n\n render() {\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (!this.props.post.acl.can_edit) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n moderation.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (post.id === thread.best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class UnmarkMarkBestAnswer extends React.Component {\n onClick = () => {\n moderation.unmarkBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id !== thread.best_answer) return null\n if (!thread.acl.can_unmark_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class PostEdits extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isHidden =\n this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n const isUnedited = this.props.post.edits === 0\n if (isHidden || isUnedited) return null\n\n const message = ngettext(\n \"This post was edited %(edits)s time.\",\n \"This post was edited %(edits)s times.\",\n this.props.post.edits\n )\n\n const title = interpolate(\n message,\n {\n edits: this.props.post.edits,\n },\n true\n )\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_approve) return null\n if (!this.props.post.is_unapproved) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (!this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_hide) return null\n if (post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_unhide) return null\n if (!this.props.post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_delete) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Dropdown from \"./dropdown\"\n\nexport default function (props) {\n return (\n
    \n \n expand_more\n \n \n
    \n )\n}\n","import React from \"react\"\nimport * as posts from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n onClick = () => {\n if (this.props.post.isSelected) {\n store.dispatch(posts.deselect(this.props.post))\n } else {\n store.dispatch(posts.select(this.props.post))\n }\n }\n\n render() {\n if (\n !(this.props.thread.acl.can_merge_posts || isVisible(this.props.post.acl))\n ) {\n return null\n }\n\n return (\n
    \n \n \n {this.props.post.isSelected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n \n
    \n )\n }\n}\n\nexport function isVisible(acl) {\n return (\n acl.can_approve ||\n acl.can_hide ||\n acl.can_protect ||\n acl.can_unhide ||\n acl.can_delete ||\n acl.can_move\n )\n}\n","import React from \"react\"\nimport Controls from \"./controls\"\nimport Select from \"./select\"\nimport {\n StatusIcon,\n getStatusClassName,\n getStatusDescription,\n} from \"misago/components/user-status\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport modal from \"misago/services/modal\"\n\nexport default function (props) {\n return (\n
    \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n {post.poster_name}\n\n \n {gettext(\"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","export default function ({ title, rank }) {\n return rank.is_tab || !!title || !!rank.title\n}\n","import React from \"react\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n const message = ngettext(\"%(posts)s post\", \"%(posts)s posts\", poster.posts)\n\n let className = \"user-postcount\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-xs hidden-sm\"\n }\n\n return (\n \n {interpolate(\n message,\n {\n posts: poster.posts,\n },\n true\n )}\n \n )\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n let className = \"hidden-xs\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-sm\"\n }\n\n return (\n \n \n \n \n \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title\n if (!userTitle && rank.is_tab) {\n userTitle = rank.name\n }\n\n if (!userTitle) return null\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n )\n }\n\n return
    {userTitle}
    \n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Controls from \"misago/components/posts-list/post/controls\"\nimport Select from \"misago/components/posts-list/post/select\"\nimport UserStatus, { StatusIcon } from \"misago/components/user-status\"\nimport UserPostcount from \"./user-postcount\"\nimport UserStatusLabel from \"./user-status\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, thread }) {\n const { poster } = post\n\n return (\n
    \n \n \n {children}\n \n )\n}\n","import React from \"react\"\n\nexport default function () {\n return (\n
  • \n {gettext(\"Search returned no results.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ message }) {\n return (\n
  • \n \n
  • \n )\n}\n","import React from \"react\"\n\nexport default function ({ provider, query }) {\n const url = provider.url + \"?q=\" + encodeURI(query)\n const label = ngettext(\n 'See full \"%(provider)s\" results page with %(count)s result.',\n 'See full \"%(provider)s\" results page with %(count)s results.',\n provider.count\n )\n\n return (\n
  • \n \n {interpolate(\n label,\n {\n count: provider.count,\n provider: provider.name,\n },\n true\n )}\n \n
  • \n )\n}\n","import React from \"react\"\n\nexport default function ({ provider }) {\n return
  • {provider.name}
  • \n}\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default function ({ result }) {\n const { poster, thread } = result\n const footer = gettext(\n \"Posted by %(poster)s on %(posted_on)s in %(category)s.\"\n )\n\n return (\n
  • \n \n
    {thread.title}
    \n \n {$(result.content).text()}\n \n \n {interpolate(\n footer,\n {\n category: result.category.name,\n posted_on: moment(result.posted_on).format(\"LL\"),\n poster: result.poster_name,\n },\n true\n )}\n \n
    \n
  • \n )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function ({ result }) {\n const { rank } = result\n\n const detail = gettext(\"%(title)s, joined on %(joined_on)s\")\n const title = result.title || rank.title || rank.name\n\n return (\n
  • \n \n
    \n
    \n \n
    \n
    \n
    {result.username}
    \n \n {interpolate(\n detail,\n {\n title,\n joined_on: moment(result.joined_on).format(\"LL\"),\n },\n true\n )}\n \n
    \n
    \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport Thread from \"./thread\"\nimport User from \"./user\"\n\nexport default function ({ provider, result }) {\n if (provider.id === \"threads\") {\n return \n }\n\n return \n}\n","import React from \"react\"\nimport { HEADER, FOOTER } from \"../constants\"\nimport Footer from \"./footer\"\nimport Header from \"./header\"\nimport Result from \"./result\"\n\nexport default function ({ provider, result, type, query }) {\n if (type === HEADER) {\n return
    \n } else if (type === FOOTER) {\n return
    \n }\n\n return \n}\n","import { HEADER, RESULT, FOOTER } from \"./constants\"\n\nexport default function (results) {\n const flatlist = []\n flattenProviders(results, flatlist)\n return flatlist\n}\n\nfunction flattenProviders(results, flatlist) {\n const arrayLength = results.length\n for (var i = 0; i < arrayLength; i++) {\n const provider = results[i]\n\n flatlist.push({\n provider,\n type: HEADER,\n })\n\n flattenProvider(provider, flatlist)\n }\n}\n\nfunction flattenProvider(provider, flatlist) {\n const arrayLength = provider.results.length\n for (var i = 0; i < arrayLength; i++) {\n const result = provider.results[i]\n flatlist.push({\n provider,\n result,\n type: RESULT,\n })\n }\n\n flatlist.push({\n provider,\n type: FOOTER,\n })\n}\n","import React from \"react\"\nimport { RESULT } from \"./constants\"\nimport DropdownMenu from \"./dropdown-menu\"\nimport Empty from \"./empty\"\nimport Loader from \"./loader\"\nimport Result from \"./result\"\nimport flattenResults from \"./flatten-results\"\n\nexport default function ({ isLoading, onChange, results, query }) {\n if (!query.trim().length) {\n return \n }\n\n if (results.length) {\n const flatResults = flattenResults(results)\n\n return (\n \n {flatResults.map((props) => {\n const { type, provider, result } = props\n\n if (type === RESULT) {\n return (\n \n )\n }\n\n return (\n \n )\n })}\n \n )\n } else if (isLoading) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport misago from \"misago\"\nimport cleanResults from \"./clean-results\"\nimport Dropdown from \"./dropdown\"\n\nexport default class extends React.Component {\n constructor() {\n super()\n\n this.state = {\n isLoading: false,\n isOpen: false,\n query: \"\",\n results: [],\n }\n\n this.intervalId = null\n }\n\n componentDidMount() {\n document.addEventListener(\"mousedown\", this.onDocumentMouseDown)\n document.addEventListener(\"keydown\", this.onEscape)\n }\n\n componentWillUnmount() {\n document.removeEventListener(\"mousedown\", this.onDocumentMouseDown)\n document.removeEventListener(\"keydown\", this.onEscape)\n }\n\n onToggle = (ev) => {\n this.setState((prevState, props) => {\n if (!prevState.isOpen) {\n window.setTimeout(() => {\n this.container.querySelector(\"input\").focus()\n }, 100)\n }\n\n return { isOpen: !prevState.isOpen }\n })\n }\n\n onDocumentMouseDown = (ev) => {\n let closeResults = true\n let node = ev.target\n\n while (node !== null && node !== document) {\n if (node === this.container) {\n closeResults = false\n return\n }\n\n node = node.parentNode\n }\n\n if (closeResults) {\n this.setState({ isOpen: false })\n }\n }\n\n onEscape = (ev) => {\n if (ev.key === \"Escape\") {\n this.setState({ isOpen: false })\n }\n }\n\n onChange = (ev) => {\n const query = ev.target.value\n\n this.setState({ query })\n this.loadResults(query.trim())\n }\n\n loadResults(query) {\n if (!query.length) return\n\n const delay = 300 + Math.random() * 300\n\n if (this.intervalId) {\n window.clearTimeout(this.intervalId)\n }\n\n this.setState({ isLoading: true })\n\n this.intervalId = window.setTimeout(() => {\n ajax.get(misago.get(\"SEARCH_API\"), { q: query }).then(\n (data) => {\n this.setState({\n intervalId: null,\n isLoading: false,\n results: cleanResults(data),\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n this.setState({\n intervalId: null,\n isLoading: false,\n results: [],\n })\n }\n )\n }, delay)\n }\n\n render() {\n let className = \"navbar-search dropdown\"\n if (this.state.isOpen) className += \" open\"\n\n return (\n (this.container = container)}\n >\n \n search\n \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport const STYLES = [\n \"progress-bar-danger\",\n \"progress-bar-warning\",\n \"progress-bar-warning\",\n \"progress-bar-primary\",\n \"progress-bar-success\",\n]\n\nexport const LABELS = [\n gettext(\"Entered password is very weak.\"),\n gettext(\"Entered password is weak.\"),\n gettext(\"Entered password is average.\"),\n gettext(\"Entered password is strong.\"),\n gettext(\"Entered password is very strong.\"),\n]\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this._score = 0\n this._password = null\n this._inputs = []\n\n this.state = {\n loaded: false,\n }\n }\n\n componentDidMount() {\n zxcvbn.load().then(() => {\n this.setState({ loaded: true })\n })\n }\n\n getScore(password, inputs) {\n let cacheStale = false\n\n if (password !== this._password) {\n cacheStale = true\n }\n\n if (inputs.length !== this._inputs.length) {\n cacheStale = true\n } else {\n inputs.map((value, i) => {\n if (value.trim() !== this._inputs[i]) {\n cacheStale = true\n }\n })\n }\n\n if (cacheStale) {\n this._score = zxcvbn.scorePassword(password, inputs)\n this._password = password\n this._inputs = inputs.map(function (value) {\n return value.trim()\n })\n }\n\n return this._score\n }\n\n render() {\n if (!this.state.loaded) return null\n\n let score = this.getScore(this.props.password, this.props.inputs)\n\n return (\n
    \n
    \n \n {LABELS[score]}\n
    \n
    \n

    {LABELS[score]}

    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport PasswordStrength from \"misago/components/password-strength\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport captcha from \"misago/services/captcha\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\nimport * as validators from \"misago/utils/validators\"\n\nexport class RegisterForm extends Form {\n constructor(props) {\n super(props)\n\n const { username, password } = this.props.criteria\n\n let passwordMinLength = 0\n password.forEach((item) => {\n if (item.name === \"MinimumLengthValidator\") {\n passwordMinLength = item.min_length\n }\n })\n\n const formValidators = {\n username: [\n validators.usernameContent(),\n validators.usernameMinLength(username.min_length),\n validators.usernameMaxLength(username.max_length),\n ],\n email: [validators.email()],\n password: [validators.passwordMinLength(passwordMinLength)],\n captcha: captcha.validator(),\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n email: \"\",\n password: \"\",\n captcha: \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"USERS_API\"), {\n username: this.state.username,\n email: this.state.email,\n password: this.state.password,\n captcha: this.state.captcha,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n\n if (rejection.__all__ && rejection.__all__.length > 0) {\n snackbar.error(rejection.__all__[0])\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Register\")}

    \n
    \n
    \n \n \n
    \n \n\n \n \n \n\n \n \n \n\n \n }\n >\n \n \n\n {captcha.component({\n form: this,\n })}\n\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport class RegisterComplete extends React.Component {\n getLead() {\n if (this.props.activation === \"user\") {\n return gettext(\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (this.props.activation === \"admin\") {\n return gettext(\n \"%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.\"\n )\n }\n }\n\n getSubscript() {\n if (this.props.activation === \"user\") {\n return gettext(\n \"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\"\n )\n } else if (this.props.activation === \"admin\") {\n return gettext(\n \"We will send an e-mail to %(email)s when this takes place.\"\n )\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    {gettext(\"Registration complete\")}

    \n
    \n
    \n
    \n info_outline\n
    \n
    \n

    \n {interpolate(\n this.getLead(),\n { username: this.props.username },\n true\n )}\n

    \n

    \n {interpolate(\n this.getSubscript(),\n { email: this.props.email },\n true\n )}\n

    \n \n {gettext(\"Ok\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n completeRegistration = (apiResponse) => {\n if (apiResponse.activation === \"active\") {\n modal.hide()\n auth.signIn(apiResponse)\n } else {\n this.setState({\n complete: apiResponse,\n })\n }\n }\n\n render() {\n if (this.state.complete) {\n return (\n \n )\n }\n\n return \n }\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\nimport RegisterForm from \"misago/components/register.js\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n isLoaded: false,\n\n criteria: null,\n }\n }\n\n showRegisterForm = () => {\n if (misago.get(\"SETTINGS\").account_activation === \"closed\") {\n snackbar.info(gettext(\"New registrations are currently disabled.\"))\n } else if (this.state.isLoaded) {\n modal.show()\n } else {\n this.setState({ isLoading: true })\n\n Promise.all([\n captcha.load(),\n ajax.get(misago.get(\"AUTH_CRITERIA_API\")),\n ]).then(\n (result) => {\n this.setState({\n isLoading: false,\n isLoaded: true,\n criteria: result[1],\n })\n\n modal.show()\n },\n () => {\n this.setState({ isLoading: false })\n\n snackbar.error(\n gettext(\"Registration is currently unavailable due to an error.\")\n )\n }\n )\n }\n }\n\n getClassName() {\n return this.props.className + (this.state.isLoading ? \" btn-loading\" : \"\")\n }\n\n render() {\n return (\n \n {gettext(\"Register\")}\n {this.state.isLoading ? : null}\n \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport NavbarSearch from \"misago/components/navbar-search\"\nimport RegisterButton from \"misago/components/register-button\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport misago from \"misago\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\nimport modal from \"misago/services/modal\"\n\nexport class GuestMenu extends React.Component {\n showSignInModal() {\n modal.show(SignInModal)\n }\n\n componentDidMount() {\n const params = new URLSearchParams(window.location.search)\n\n if (params.get(\"modal\") === \"login\") {\n window.setTimeout(this.showSignInModal, 500)\n }\n }\n\n render() {\n const delegateAuth = misago.get(\"SETTINGS\").DELEGATE_AUTH\n\n return (\n \n
  • \n

    {gettext(\"You are browsing as guest.\")}

    \n

    \n {gettext(\n \"Sign in or register to start and participate in discussions.\"\n )}\n

    \n {delegateAuth ? (\n
    \n
    \n \n {gettext(\"Sign in\")}\n \n
    \n
    \n ) : (\n
    \n
    \n \n {gettext(\"Sign in\")}\n \n
    \n
    \n \n {gettext(\"Register\")}\n \n
    \n
    \n )}\n
  • \n \n )\n }\n}\n\nexport class GuestNav extends GuestMenu {\n render() {\n if (misago.get(\"SETTINGS\").DELEGATE_AUTH) {\n return (\n
    \n \n {gettext(\"Sign in\")}\n \n
    \n \n
    \n
    \n )\n }\n\n return (\n
    \n \n {gettext(\"Sign in\")}\n \n \n {gettext(\"Register\")}\n \n
    \n \n
    \n
    \n )\n }\n}\n\nexport class CompactGuestNav extends React.Component {\n showGuestMenu() {\n dropdown.show(GuestMenu)\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport Loader from \"misago/components/loader\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n callApi(avatarType) {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n setGravatar = () => {\n this.callApi(\"gravatar\")\n }\n\n setGenerated = () => {\n this.callApi(\"generated\")\n }\n\n getGravatarButton() {\n if (this.props.options.gravatar) {\n return (\n \n {gettext(\"Download my Gravatar\")}\n \n )\n } else {\n return null\n }\n }\n\n getCropButton() {\n if (!this.props.options.crop_src) return null\n\n return (\n \n {gettext(\"Re-crop uploaded image\")}\n \n )\n }\n\n getUploadButton() {\n if (!this.props.options.upload) return null\n\n return (\n \n {gettext(\"Upload new image\")}\n \n )\n }\n\n getGalleryButton() {\n if (!this.props.options.galleries) return null\n\n return (\n \n {gettext(\"Pick avatar from gallery\")}\n \n )\n }\n\n getAvatarPreview() {\n let userPeview = {\n id: this.props.user.id,\n avatars: this.props.options.avatars,\n }\n\n if (this.state.isLoading) {\n return (\n
    \n \n \n
    \n )\n }\n\n return (\n
    \n \n
    \n )\n }\n\n render() {\n return (\n
    \n
    \n
    {this.getAvatarPreview()}
    \n
    \n {this.getGravatarButton()}\n\n \n {gettext(\"Generate my individual avatar\")}\n \n\n {this.getCropButton()}\n {this.getUploadButton()}\n {this.getGalleryButton()}\n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n deviceRatio: 1,\n }\n }\n\n getAvatarSize() {\n if (this.props.upload) {\n return this.props.options.crop_tmp.size\n } else {\n return this.props.options.crop_src.size\n }\n }\n\n getImagePath() {\n if (this.props.upload) {\n return this.props.dataUrl\n } else {\n return this.props.options.crop_src.url\n }\n }\n\n componentDidMount() {\n let cropit = $(\".crop-form\")\n let cropperWidth = this.getAvatarSize()\n\n const initialWidth = cropit.width()\n while (initialWidth < cropperWidth) {\n cropperWidth = cropperWidth / 2\n }\n\n const deviceRatio = this.getAvatarSize() / cropperWidth\n\n cropit.width(cropperWidth)\n\n cropit.cropit({\n width: cropperWidth,\n height: cropperWidth,\n exportZoom: deviceRatio,\n imageState: {\n src: this.getImagePath(),\n },\n onImageLoaded: () => {\n if (this.props.upload) {\n // center uploaded image\n let zoomLevel = cropit.cropit(\"zoom\")\n let imageSize = cropit.cropit(\"imageSize\")\n\n // is it wider than taller?\n if (imageSize.width > imageSize.height) {\n let displayedWidth = imageSize.width * zoomLevel\n let offsetX = (displayedWidth - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: offsetX,\n y: 0,\n })\n } else if (imageSize.width < imageSize.height) {\n let displayedHeight = imageSize.height * zoomLevel\n let offsetY = (displayedHeight - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: 0,\n y: offsetY,\n })\n } else {\n cropit.cropit(\"offset\", {\n x: 0,\n y: 0,\n })\n }\n } else {\n // use preserved crop\n let crop = this.props.options.crop_src.crop\n\n if (crop) {\n cropit.cropit(\"zoom\", crop.zoom)\n cropit.cropit(\"offset\", {\n x: crop.x,\n y: crop.y,\n })\n }\n }\n },\n })\n }\n\n componentWillUnmount() {\n $(\".crop-form\").cropit(\"disable\")\n }\n\n cropAvatar = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n let avatarType = this.props.upload ? \"crop_tmp\" : \"crop_src\"\n let cropit = $(\".crop-form\")\n\n const deviceRatio = cropit.cropit(\"exportZoom\")\n const cropitOffset = cropit.cropit(\"offset\")\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n crop: {\n offset: {\n x: cropitOffset.x * deviceRatio,\n y: cropitOffset.y * deviceRatio,\n },\n zoom: cropit.cropit(\"zoom\") * deviceRatio,\n },\n })\n .then(\n (data) => {\n this.props.onComplete(data)\n snackbar.success(data.detail)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n {this.props.upload\n ? gettext(\"Set avatar\")\n : gettext(\"Crop image\")}\n \n\n \n {gettext(\"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport fileSize from \"misago/utils/file-size\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n image: null,\n preview: null,\n progress: 0,\n uploaded: null,\n dataUrl: null,\n }\n }\n\n validateFile(image) {\n if (image.size > this.props.options.upload.limit) {\n return interpolate(\n gettext(\"Selected file is too big. (%(filesize)s)\"),\n {\n filesize: fileSize(image.size),\n },\n true\n )\n }\n\n let invalidTypeMsg = gettext(\"Selected file type is not supported.\")\n if (\n this.props.options.upload.allowed_mime_types.indexOf(image.type) === -1\n ) {\n return invalidTypeMsg\n }\n\n let extensionFound = false\n let loweredFilename = image.name.toLowerCase()\n this.props.options.upload.allowed_extensions.map(function (extension) {\n if (loweredFilename.substr(extension.length * -1) === extension) {\n extensionFound = true\n }\n })\n\n if (!extensionFound) {\n return invalidTypeMsg\n }\n\n return false\n }\n\n pickFile = () => {\n document.getElementById(\"avatar-hidden-upload\").click()\n }\n\n uploadFile = () => {\n let image = document.getElementById(\"avatar-hidden-upload\").files[0]\n if (!image) return\n\n let validationError = this.validateFile(image)\n if (validationError) {\n snackbar.error(validationError)\n return\n }\n\n this.setState({\n image,\n preview: URL.createObjectURL(image),\n progress: 0,\n })\n\n let data = new FormData()\n data.append(\"avatar\", \"upload\")\n data.append(\"image\", image)\n\n ajax\n .upload(this.props.user.api.avatar, data, (progress) => {\n this.setState({\n progress,\n })\n })\n .then(\n (data) => {\n this.setState({\n options: data,\n uploaded: data.detail,\n })\n\n snackbar.info(\n gettext(\"Your image has been uploaded and you may now crop it.\")\n )\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n image: null,\n progress: 0,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n getUploadRequirements(options) {\n let extensions = options.allowed_extensions.map(function (extension) {\n return extension.substr(1)\n })\n\n return interpolate(\n gettext(\"%(files)s files smaller than %(limit)s\"),\n {\n files: extensions.join(\", \"),\n limit: fileSize(options.limit),\n },\n true\n )\n }\n\n getUploadButton() {\n return (\n
    \n \n

    \n {this.getUploadRequirements(this.props.options.upload)}\n

    \n
    \n )\n }\n\n getUploadProgressLabel() {\n return interpolate(\n gettext(\"%(progress)s % complete\"),\n {\n progress: this.state.progress,\n },\n true\n )\n }\n\n getUploadProgress() {\n return (\n
    \n
    \n \n\n
    \n \n {this.getUploadProgressLabel()}\n
    \n
    \n
    \n
    \n )\n }\n\n renderUpload() {\n return (\n
    \n \n {this.state.image ? this.getUploadProgress() : this.getUploadButton()}\n
    \n
    \n \n {gettext(\"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n\n renderCrop() {\n return (\n \n )\n }\n\n render() {\n if (this.state.uploaded) return this.renderCrop()\n\n return this.renderUpload()\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport batch from \"misago/utils/batch\"\n\nexport class GalleryItem extends React.Component {\n select = () => {\n this.props.select(this.props.id)\n }\n\n getClassName() {\n if (this.props.selection === this.props.id) {\n if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled avatar-selected\"\n } else {\n return \"btn btn-avatar avatar-selected\"\n }\n } else if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled\"\n } else {\n return \"btn btn-avatar\"\n }\n }\n\n render() {\n return (\n \n \n \n )\n }\n}\n\nexport class Gallery extends React.Component {\n render() {\n return (\n
    \n

    {this.props.name}

    \n\n
    \n {batch(this.props.images, 4, null).map((row, i) => {\n return (\n
    \n {row.map((item, i) => {\n return (\n
    \n {item ? (\n \n ) : (\n
    \n )}\n
    \n )\n })}\n
    \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n selection: null,\n isLoading: false,\n }\n }\n\n select = (image) => {\n this.setState({\n selection: image,\n })\n }\n\n save = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: \"galleries\",\n image: this.state.selection,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n this.props.showIndex()\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n {this.props.options.galleries.map((item, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n \n {this.state.selection\n ? gettext(\"Save choice\")\n : gettext(\"Select avatar\")}\n \n\n \n {gettext(\"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarIndex from \"misago/components/change-avatar/index\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport AvatarUpload from \"misago/components/change-avatar/upload\"\nimport AvatarGallery from \"misago/components/change-avatar/gallery\"\nimport Loader from \"misago/components/modal-loader\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport store from \"misago/services/store\"\n\nexport class ChangeAvatarError extends React.Component {\n getErrorReason() {\n if (this.props.reason) {\n return

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n

    \n
    \n remove_circle_outline\n
    \n
    \n

    {this.props.message}

    \n {this.getErrorReason()}\n \n {gettext(\"Ok\")}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n componentDidMount() {\n ajax.get(this.props.user.api.avatar).then(\n (options) => {\n this.setState({\n component: AvatarIndex,\n options: options,\n error: null,\n })\n },\n (rejection) => {\n this.showError(rejection)\n }\n )\n }\n\n showError = (error) => {\n this.setState({\n error,\n })\n }\n\n showIndex = () => {\n this.setState({\n component: AvatarIndex,\n })\n }\n\n showUpload = () => {\n this.setState({\n component: AvatarUpload,\n })\n }\n\n showCrop = () => {\n this.setState({\n component: AvatarCrop,\n })\n }\n\n showGallery = () => {\n this.setState({\n component: AvatarGallery,\n })\n }\n\n completeFlow = (options) => {\n store.dispatch(updateAvatar(this.props.user, options.avatars))\n\n this.setState({\n component: AvatarIndex,\n options,\n })\n }\n\n getBody() {\n if (this.state) {\n if (this.state.error) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state && this.state.error) {\n return \"modal-dialog modal-message modal-change-avatar\"\n } else {\n return \"modal-dialog modal-change-avatar\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Change your avatar\")}

    \n
    \n\n {this.getBody()}\n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport Avatar from \"misago/components/avatar\"\nimport ChangeAvatarModal, { select } from \"misago/components/change-avatar/root\"\nimport NavbarSearch from \"misago/components/navbar-search\"\nimport misago from \"misago\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\nimport modal from \"misago/services/modal\"\n\nexport class UserMenu extends React.Component {\n changeAvatar() {\n modal.show(connect(select)(ChangeAvatarModal))\n }\n\n render() {\n const { user } = this.props\n\n return (\n \n
  • \n {user.username}\n
    \n
    \n message\n {user.posts}\n
    \n
    \n forum\n {user.threads}\n
    \n
    \n favorite\n {user.followers}\n
    \n
    \n favorite_outline\n {user.following}\n
    \n
    \n
  • \n
  • \n
  • \n \n account_circle\n {gettext(\"See your profile\")}\n \n
  • \n
  • \n \n done_all\n {gettext(\"Change options\")}\n \n
  • \n
  • \n \n portrait\n {gettext(\"Change avatar\")}\n \n
  • \n {!!user.acl.can_use_private_threads && (\n
  • \n \n message\n {gettext(\"Private threads\")}\n \n \n
  • \n )}\n
  • \n
  • \n \n document.getElementById(\"hidden-logout-form\").submit()\n }\n type=\"button\"\n >\n {gettext(\"Log out\")}\n \n
  • \n \n )\n }\n}\n\nexport function PrivateThreadsBadge({ user }) {\n if (!user.unread_private_threads) return null\n\n return {user.unread_private_threads}\n}\n\nexport function UserNav({ user }) {\n return (\n
      \n
    • \n \n
    • \n \n
    • \n \n \n \n \n
    • \n
    \n )\n}\n\nexport function UserPrivateThreadsLink({ user }) {\n if (!user.acl.can_use_private_threads) return null\n\n let title = null\n if (user.unread_private_threads) {\n title = gettext(\"You have unread private threads!\")\n } else {\n title = gettext(\"Private threads\")\n }\n\n return (\n
  • \n \n message\n {user.unread_private_threads > 0 && (\n {user.unread_private_threads}\n )}\n \n
  • \n )\n}\n\nexport function selectUserMenu(state) {\n return {\n user: state.auth.user,\n }\n}\n\nexport class CompactUserNav extends React.Component {\n showUserMenu() {\n dropdown.showConnected(\"user-menu\", connect(selectUserMenu)(UserMenu))\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport { GuestNav, CompactGuestNav } from \"./guest-nav\"\nimport { UserNav, CompactUserNav } from \"./user-nav\"\n\nexport class UserMenu extends React.Component {\n render() {\n if (this.props.isAuthenticated) {\n return \n } else {\n return \n }\n }\n}\n\nexport class CompactUserMenu extends React.Component {\n render() {\n if (this.props.isAuthenticated) {\n return \n } else {\n return \n }\n }\n}\n\nexport function select(state) {\n return state.auth\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport {\n UserMenu,\n CompactUserMenu,\n select,\n} from \"misago/components/user-menu/root\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(UserMenu), \"user-menu-mount\")\n mount(connect(select)(CompactUserMenu), \"user-menu-compact-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:user-menu\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst UsersNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n menu\n {page.name}\n \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n)\n\nconst getPageUrl = (baseUrl, page) => {\n let url = baseUrl\n if (page.component === \"rank\") {\n url += page.slug\n } else {\n url += page.component\n }\n return url + \"/\"\n}\n\nexport default UsersNav\n","import React from \"react\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n return interpolate(\n gettext(\n \"No users have posted any new messages during last %(days)s days.\"\n ),\n { days: this.props.trackedPeriod },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getEmptyMessage()}

    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n
    \n \n \n  \n \n \n
    \n\n
    \n \n  \n \n  \n \n \n \n \n  \n \n \n \n \n  \n \n \n
    \n
    \n \n \n \n  \n \n \n {gettext(\"Rank\")}\n \n \n \n \n  \n \n \n {gettext(\"Ranked posts\")}\n \n
    \n
    \n\n
    \n \n \n  \n \n \n {gettext(\"Rank\")}\n
    \n\n
    \n \n \n  \n \n \n {gettext(\"Ranked posts\")}\n
    \n\n
    \n \n \n  \n \n \n {gettext(\"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ItemPreview from \"misago/components/users/active-posters/list-item-preview\"\nimport * as random from \"misago/utils/random\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n \n \n

    \n \n  \n \n

    \n\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Avatar from \"misago/components/avatar\"\nimport Status, { StatusIcon, StatusLabel } from \"misago/components/user-status\"\nimport misago from \"misago/index\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.rank.css_class) {\n return \"list-group-item list-group-rank-\" + this.props.rank.css_class\n } else {\n return \"list-group-item\"\n }\n }\n\n getUserStatus() {\n if (this.props.user.status) {\n return (\n \n \n \n \n )\n }\n\n return (\n \n  \n \n  \n \n \n )\n }\n\n getRankName() {\n if (!this.props.rank.is_tab) {\n return (\n {this.props.rank.name}\n )\n }\n\n let rankUrl = misago.get(\"USERS_LIST_URL\") + this.props.rank.slug + \"/\"\n return (\n \n {this.props.rank.name}\n \n )\n }\n\n getUserTitle() {\n if (!this.props.user.title) return null\n\n return (\n \n {this.props.user.title}\n \n )\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n \n
    \n {this.getUserStatus()}\n {this.getRankName()}\n {this.getUserTitle()}\n
    \n
    \n \n #{this.props.counter}\n {gettext(\"Rank\")}\n \n\n \n {this.props.user.meta.score}\n {gettext(\"Ranked posts\")}\n \n
    \n
    \n\n
    \n #{this.props.counter}\n {gettext(\"Rank\")}\n
    \n\n
    \n {this.props.user.meta.score}\n {gettext(\"Ranked posts\")}\n
    \n\n
    \n {this.props.user.posts}\n {gettext(\"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ListItem from \"misago/components/users/active-posters/list-item\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getLeadMessage() {\n let message = ngettext(\n \"%(posters)s top poster from last %(days)s days.\",\n \"%(posters)s top posters from last %(days)s days.\",\n this.props.count\n )\n\n return interpolate(\n message,\n {\n posters: this.props.count,\n days: this.props.trackedPeriod,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getLeadMessage()}

    \n\n
    \n
      \n {this.props.users.map((user, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/users/active-posters/list-empty\"\nimport ListPreview from \"misago/components/users/active-posters/list-preview\"\nimport ListReady from \"misago/components/users/active-posters/list-ready\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling()\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling() {\n polls.start({\n poll: \"active-posters\",\n url: misago.get(\"USERS_API\"),\n data: {\n list: \"active\",\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n this.setState({\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n })\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.extra.name,\n parent: gettext(\"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"active-posters\")\n }\n\n render() {\n const page = { name: this.props.route.extra.name }\n\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport stringCount from \"misago/utils/string-count\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.copy && this.props.copy.length) {\n if (\n stringCount(this.props.copy, \"\n )\n } else {\n return null\n }\n }\n}\n","export default function (string, subString) {\n string = (string + \"\").toLowerCase()\n subString = (subString + \"\").toLowerCase()\n\n if (subString.length <= 0) return 0\n\n let n = 0\n let pos = 0\n let step = subString.length\n\n while (true) {\n pos = string.indexOf(subString, pos)\n if (pos >= 0) {\n n += 1\n pos += step\n } else {\n break\n }\n }\n\n return n\n}\n","import React from \"react\"\nimport UsersList from \"../../users-list\"\n\nconst RankUsersList = ({ users }) => (\n \n)\n\nexport default RankUsersList\n","import React from \"react\"\nimport UsersList from \"misago/components/users-list\"\n\nclass RankUsersListLoader extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render = () => \n}\n\nexport default RankUsersListLoader\n","import React from \"react\"\n\nconst RankUsersLeft = ({ users }) => {\n if (users.more) {\n return (\n

    \n {interpolate(\n ngettext(\n \"There is %(more)s more member with this role.\",\n \"There are %(more)s more members with this role.\",\n users.more\n ),\n { more: users.more },\n true\n )}\n

    \n )\n }\n\n return

    {gettext(\"There are no more members with this role.\")}

    \n}\n\nexport default RankUsersLeft\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst RankUsersPagination = ({ baseUrl, users }) => (\n
    \n {users.isLoaded && users.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {users.isLoaded && users.previous ? (\n 1 ? users.previous + \"/\" : \"\")}\n title={gettext(\"Go to previous page\")}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n {users.isLoaded && users.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {users.isLoaded && users.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nexport default RankUsersPagination\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\nimport RankUsersLeft from \"./RankUsersLeft\"\nimport RankUsersPagination from \"./RankUsersPagination\"\n\nconst RankUsersToolbar = ({ baseUrl, users }) => (\n \n \n \n \n \n \n \n \n \n \n \n \n)\n\nexport default RankUsersToolbar\n","import React from \"react\"\nimport PageLead from \"misago/components/page-lead\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport PageContainer from \"../../PageContainer\"\nimport RankUsersList from \"./RankUsersList\"\nimport RankUsersListLoader from \"./RankUsersListLoader\"\nimport RankUsersToolbar from \"./RankUsersToolbar\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.params.page || 1)\n }\n\n initWithPreloadedData(data) {\n this.state = Object.assign(data, {\n isLoaded: true,\n })\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(page) {\n polls.start({\n poll: \"rank-users\",\n url: misago.get(\"USERS_API\"),\n data: {\n rank: this.props.route.rank.id,\n page: page,\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n data.isLoaded = true\n this.setState(data)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.rank.name,\n page: this.props.params.page || null,\n parent: gettext(\"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"rank-users\")\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.params.page !== nextProps.params.page) {\n title.set({\n title: this.props.route.rank.name,\n page: nextProps.params.page || null,\n parent: gettext(\"Users\"),\n })\n\n this.setState({\n isLoaded: false,\n })\n\n polls.stop(\"rank-users\")\n this.startPolling(nextProps.params.page)\n }\n }\n\n getClassName() {\n if (this.props.route.rank.css_class) {\n return \"rank-users-list rank-users-\" + this.props.route.rank.css_class\n } else {\n return \"rank-users-list\"\n }\n }\n\n getRankDescription() {\n if (this.props.route.rank.description) {\n return (\n
    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getComponent() {\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return \n } else {\n return (\n

    \n {gettext(\"There are no users with this rank at the moment.\")}\n

    \n )\n }\n } else {\n return \n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getRankDescription()}\n {this.getComponent()}\n \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport ActivePosters from \"misago/components/users/active-posters/root\"\nimport Rank from \"misago/components/users/rank/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n render() {\n return (\n
    \n \n \n \n

    {gettext(\"Users\")}

    \n
    \n
    \n
    \n {this.props.children}\n
    \n )\n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport function paths() {\n let paths = []\n\n misago.get(\"USERS_LISTS\").forEach(function (item) {\n if (item.component === \"rank\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/:page/\",\n component: connect(select)(Rank),\n rank: item,\n })\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/\",\n component: connect(select)(Rank),\n rank: item,\n })\n } else if (item.component === \"active-posters\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.component + \"/\",\n component: connect(select)(ActivePosters),\n extra: {\n name: item.name,\n },\n })\n }\n })\n\n return paths\n}\n","import Users, { paths } from \"misago/components/users/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"USERS_LISTS\")) {\n mount({\n root: misago.get(\"USERS_LIST_URL\"),\n component: Users,\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:users\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\n\nexport default function initializer(context) {\n include.init(context.get(\"STATIC_URL\"))\n}\n\nmisago.addInitializer({\n name: \"include\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n storage.init(\"misago_\")\n}\n\nmisago.addInitializer({\n name: \"local-storage\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\n\nexport default function initializer() {\n let element = document.getElementById(\"mobile-navbar-dropdown-mount\")\n if (element) {\n dropdown.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"dropdown\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport modal from \"misago/services/modal\"\n\nexport default function initializer() {\n let element = document.getElementById(\"modal-mount\")\n if (element) {\n modal.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"modal\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport misago from \"misago/index\"\n\nexport default function initializer() {\n moment.locale($(\"html\").attr(\"lang\"))\n}\n\nmisago.addInitializer({\n name: \"moment\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\n\nexport default function initializer(context) {\n title.init(\n context.get(\"SETTINGS\").forum_index_title,\n context.get(\"SETTINGS\").forum_name\n )\n}\n\nmisago.addInitializer({\n name: \"page-title\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport polls from \"misago/services/polls\"\n\nexport default function initializer() {\n polls.init(ajax, snackbar)\n}\n\nmisago.addInitializer({\n name: \"polls\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer() {\n posting.init(ajax, snackbar, document.getElementById(\"posting-mount\"))\n}\n\nmisago.addInitializer({\n name: \"posting\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/auth\"\nimport store from \"misago/services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\n \"auth\",\n reducer,\n Object.assign(\n {\n isAuthenticated: context.get(\"isAuthenticated\"),\n isAnonymous: !context.get(\"isAuthenticated\"),\n\n user: context.get(\"user\"),\n },\n initialState\n )\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:auth\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/participants\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = misago.get(\"THREAD\").participants\n }\n\n store.addReducer(\"participants\", reducer, initialState || [])\n}\n\nmisago.addInitializer({\n name: \"reducer:participants\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/poll\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\") && misago.get(\"THREAD\").poll) {\n initialState = hydrate(misago.get(\"THREAD\").poll)\n } else {\n initialState = {}\n }\n\n store.addReducer(\"poll\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:poll\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"POSTS\")) {\n initialState = hydrate(misago.get(\"POSTS\"))\n } else {\n initialState = {\n isLoaded: false,\n isBusy: false,\n }\n }\n\n store.addReducer(\"posts\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:posts\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile-details\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"PROFILE_DETAILS\")) {\n initialState = misago.get(\"PROFILE_DETAILS\")\n }\n\n store.addReducer(\"profile-details\", reducer, initialState || {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-details\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n if (misago.has(\"PROFILE\")) {\n store.dispatch(hydrate(misago.get(\"PROFILE\")))\n }\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-hydrate\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"profile\", reducer, {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago\"\nimport reducer, { initialState } from \"misago/reducers/search\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\n \"search\",\n reducer,\n Object.assign({}, initialState, {\n providers: misago.get(\"SEARCH_PROVIDERS\") || [],\n query: misago.get(\"SEARCH_QUERY\") || \"\",\n })\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:search\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/selection\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"selection\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:selection\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"snackbar\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:snackbar\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/thread\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = hydrate(misago.get(\"THREAD\"))\n } else {\n initialState = {\n isBusy: false,\n }\n }\n\n store.addReducer(\"thread\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:thread\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/threads\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"threads\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:threads\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"tick\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:tick\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/username-history\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"username-history\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:username-history\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/users\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"users\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:users\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n snackbar.init(store)\n}\n\nmisago.addInitializer({\n name: \"snackbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.init()\n}\n\nmisago.addInitializer({\n name: \"store\",\n initializer: initializer,\n before: \"_end\",\n})\n","import misago from \"misago/index\"\nimport { doTick } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nconst TICK_PERIOD = 50 * 1000 //do the tick every 50s\n\nexport default function initializer() {\n window.setInterval(function () {\n store.dispatch(doTick())\n }, TICK_PERIOD)\n}\n\nmisago.addInitializer({\n name: \"tick-start\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport default function initializer() {\n zxcvbn.init(include)\n}\n\nmisago.addInitializer({\n name: \"zxcvbn\",\n initializer: initializer,\n})\n","import { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\n\nexport var initialState = {\n signedIn: false,\n signedOut: false,\n}\n\nexport const PATCH_USER = \"PATCH_USER\"\nexport const SIGN_IN = \"SIGN_IN\"\nexport const SIGN_OUT = \"SIGN_OUT\"\n\nexport function patch(patch) {\n return {\n type: PATCH_USER,\n patch,\n }\n}\n\nexport function signIn(user) {\n return {\n type: SIGN_IN,\n user,\n }\n}\n\nexport function signOut(soft = false) {\n return {\n type: SIGN_OUT,\n soft,\n }\n}\n\nexport default function auth(state = initialState, action = null) {\n switch (action.type) {\n case PATCH_USER:\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, action.patch)\n return newState\n\n case SIGN_IN:\n return Object.assign({}, state, {\n signedIn: action.user,\n })\n\n case SIGN_OUT:\n return Object.assign({}, state, {\n isAuthenticated: false,\n isAnonymous: true,\n signedOut: !action.soft,\n })\n\n case UPDATE_AVATAR:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n avatars: action.avatars,\n })\n return newState\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n username: action.username,\n slug: action.slug,\n })\n return newState\n }\n return state\n\n default:\n return state\n }\n}\n","export const REPLACE_PARTICIPANTS = \"REPLACE_PARTICIPANTS\"\n\nexport function replace(newState) {\n return {\n type: REPLACE_PARTICIPANTS,\n state: newState,\n }\n}\n\nexport default function participants(state = [], action = null) {\n switch (action.type) {\n case REPLACE_PARTICIPANTS:\n return action.state\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\n\nexport const BUSY_POLL = \"BUSY_POLL\"\nexport const RELEASE_POLL = \"RELEASE_POLL\"\nexport const REMOVE_POLL = \"REMOVE_POLL\"\nexport const REPLACE_POLL = \"REPLACE_POLL\"\nexport const UPDATE_POLL = \"UPDATE_POLL\"\n\nexport function hydrate(json) {\n let hasSelectedChoices = false\n for (const i in json.choices) {\n const choice = json.choices[i]\n if (choice.selected) {\n hasSelectedChoices = true\n break\n }\n }\n\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n\n hasSelectedChoices,\n endsOn: json.length\n ? moment(json.posted_on).add(json.length, \"days\")\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_POLL,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_POLL,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_POLL,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_POLL,\n data,\n }\n}\n\nexport function remove() {\n return {\n type: REMOVE_POLL,\n }\n}\n\nexport default function poll(state = {}, action = null) {\n switch (action.type) {\n case BUSY_POLL:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_POLL:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return {\n isBusy: false,\n }\n\n case REPLACE_POLL:\n return action.state\n\n case UPDATE_POLL:\n return Object.assign({}, state, action.data)\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport { hydrateUser } from \"./users\"\n\nexport const PATCH_POST = \"PATCH_POST\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n updated_on: moment(json.updated_on),\n hidden_on: moment(json.hidden_on),\n\n attachments: json.attachments\n ? json.attachments.map(hydrateAttachment)\n : null,\n poster: json.poster ? hydrateUser(json.poster) : null,\n\n isSelected: false,\n isBusy: false,\n isDeleted: false,\n })\n}\n\nexport function hydrateAttachment(json) {\n return Object.assign({}, json, {\n uploaded_on: moment(json.uploaded_on),\n })\n}\n\nexport function patch(post, patch) {\n return {\n type: PATCH_POST,\n post,\n patch,\n }\n}\n\nexport default function post(state = {}, action = null) {\n switch (action.type) {\n case PATCH_POST:\n if (state.id == action.post.id) {\n return Object.assign({}, state, action.patch)\n }\n return state\n\n default:\n return state\n }\n}\n","import postReducer, {\n PATCH_POST,\n hydrate as hydratePost,\n} from \"misago/reducers/post\"\n\nexport const APPEND_POSTS = \"APPEND_POSTS\"\nexport const SELECT_POST = \"SELECT_POST\"\nexport const DESELECT_POST = \"DESELECT_POST\"\nexport const DESELECT_POSTS = \"DESELECT_POSTS\"\nexport const LOAD_POSTS = \"LOAD_POSTS\"\nexport const UNLOAD_POSTS = \"UNLOAD_POSTS\"\nexport const UPDATE_POSTS = \"UPDATE_POSTS\"\n\nexport function select(post) {\n return {\n type: SELECT_POST,\n post,\n }\n}\n\nexport function deselect(post) {\n return {\n type: DESELECT_POST,\n post,\n }\n}\n\nexport function deselectAll() {\n return {\n type: DESELECT_POSTS,\n }\n}\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n results: json.results.map(hydratePost),\n isLoaded: true,\n isBusy: false,\n isSelected: false,\n })\n}\n\nexport function load(newState, hydrated = false) {\n return {\n type: LOAD_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function append(newState, hydrated = false) {\n return {\n type: APPEND_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function unload() {\n return {\n type: UNLOAD_POSTS,\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_POSTS,\n update: newState,\n }\n}\n\nexport default function posts(state = {}, action = null) {\n switch (action.type) {\n case SELECT_POST:\n const selectedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: true,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: selectedPosts,\n })\n\n case DESELECT_POST:\n const deseletedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: false,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: deseletedPosts,\n })\n\n case DESELECT_POSTS:\n const deseletedAllPosts = state.results.map((post) => {\n return Object.assign({}, post, {\n isSelected: false,\n })\n })\n\n return Object.assign({}, state, {\n results: deseletedAllPosts,\n })\n\n case APPEND_POSTS:\n let results = state.results.slice()\n const resultsIds = state.results.map((post) => {\n return post.id\n })\n\n action.state.results.map((post) => {\n if (resultsIds.indexOf(post.id) === -1) {\n results.push(post)\n }\n })\n\n return Object.assign({}, action.state, {\n results,\n })\n\n case LOAD_POSTS:\n return action.state\n\n case UNLOAD_POSTS:\n return Object.assign({}, state, {\n isLoaded: false,\n })\n\n case UPDATE_POSTS:\n return Object.assign({}, state, action.update)\n\n case PATCH_POST:\n const reducedPosts = state.results.map((post) => {\n return postReducer(post, action)\n })\n\n return Object.assign({}, state, {\n results: reducedPosts,\n })\n\n default:\n return state\n }\n}\n","export const LOAD_DETAILS = \"LOAD_DETAILS\"\n\nexport function load(newState) {\n return {\n type: LOAD_DETAILS,\n\n newState,\n }\n}\n\nexport default function details(state = {}, action = null) {\n switch (action.type) {\n case LOAD_DETAILS:\n return action.newState\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport {\n UPDATE_AVATAR,\n UPDATE_USERNAME,\n hydrateStatus,\n} from \"misago/reducers/users\"\n\nexport const HYDRATE_PROFILE = \"HYDRATE_PROFILE\"\nexport const PATCH_PROFILE = \"PATCH_PROFILE\"\n\nexport function hydrate(profile) {\n return {\n type: HYDRATE_PROFILE,\n profile,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_PROFILE,\n patch,\n }\n}\n\nexport default function auth(state = {}, action = null) {\n switch (action.type) {\n case HYDRATE_PROFILE:\n return Object.assign({}, action.profile, {\n joined_on: moment(action.profile.joined_on),\n status: hydrateStatus(action.profile.status),\n })\n\n case PATCH_PROFILE:\n return Object.assign({}, state, action.patch)\n\n case UPDATE_AVATAR:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n avatars: action.avatars,\n })\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n username: action.username,\n slug: action.slug,\n })\n }\n return state\n\n default:\n return state\n }\n}\n","export const REPLACE_SEARCH = \"REPLACE_SEARCH\"\nexport const UPDATE_SEARCH = \"UPDATE_SEARCH\"\nexport const UPDATE_SEARCH_PROVIDER = \"UPDATE_SEARCH_PROVIDER\"\n\nexport const initialState = {\n isLoading: false,\n query: \"\",\n providers: [],\n}\n\nexport function replace(newState) {\n return {\n type: REPLACE_SEARCH,\n state: {\n isLoading: false,\n providers: newState,\n },\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_SEARCH,\n update: newState,\n }\n}\n\nexport function updateProvider(provider) {\n return {\n type: UPDATE_SEARCH_PROVIDER,\n provider: provider,\n }\n}\n\nexport default function participants(state = {}, action = null) {\n switch (action.type) {\n case REPLACE_SEARCH:\n return action.state\n\n case UPDATE_SEARCH:\n return Object.assign({}, state, action.update)\n\n case UPDATE_SEARCH_PROVIDER:\n return Object.assign({}, state, {\n providers: state.providers.map((provider) => {\n if (provider.id === action.provider.id) {\n return action.provider\n } else {\n return provider\n }\n }),\n })\n\n default:\n return state\n }\n}\n","import { toggle } from \"misago/utils/sets\"\n\nexport const SELECT_ALL = \"SELECT_ALL\"\nexport const SELECT_NONE = \"SELECT_NONE\"\nexport const SELECT_ITEM = \"SELECT_ITEM\"\n\nexport function all(itemsIds) {\n return {\n type: SELECT_ALL,\n items: itemsIds,\n }\n}\n\nexport function none() {\n return {\n type: SELECT_NONE,\n }\n}\n\nexport function item(itemId) {\n return {\n type: SELECT_ITEM,\n item: itemId,\n }\n}\n\nexport default function selection(state = [], action = null) {\n switch (action.type) {\n case SELECT_ALL:\n return action.items\n\n case SELECT_NONE:\n return []\n\n case SELECT_ITEM:\n return toggle(state, action.item)\n\n default:\n return state\n }\n}\n","export var initialState = {\n type: \"info\",\n message: \"\",\n isVisible: false,\n}\n\nexport const SHOW_SNACKBAR = \"SHOW_SNACKBAR\"\nexport const HIDE_SNACKBAR = \"HIDE_SNACKBAR\"\n\nexport function showSnackbar(message, type) {\n return {\n type: SHOW_SNACKBAR,\n message,\n messageType: type,\n }\n}\n\nexport function hideSnackbar() {\n return {\n type: HIDE_SNACKBAR,\n }\n}\n\nexport default function snackbar(state = initialState, action = null) {\n if (action.type === SHOW_SNACKBAR) {\n return {\n type: action.messageType,\n message: action.message,\n isVisible: true,\n }\n } else if (action.type === HIDE_SNACKBAR) {\n return Object.assign({}, state, {\n isVisible: false,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { REMOVE_POLL, REPLACE_POLL } from \"./poll\"\n\nexport const BUSY_THREAD = \"BUSY_THREAD\"\nexport const RELEASE_THREAD = \"RELEASE_THREAD\"\nexport const REPLACE_THREAD = \"REPLACE_THREAD\"\nexport const UPDATE_THREAD = \"UPDATE_THREAD\"\nexport const UPDATE_THREAD_ACL = \"UPDATE_THREAD_ACL\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n started_on: moment(json.started_on),\n last_post_on: moment(json.last_post_on),\n best_answer_marked_on: json.best_answer_marked_on\n ? moment(json.best_answer_marked_on)\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_THREAD,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_THREAD,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_THREAD,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_THREAD,\n data,\n }\n}\n\nexport function updateAcl(data) {\n return {\n type: UPDATE_THREAD_ACL,\n data,\n }\n}\n\nexport default function thread(state = {}, action = null) {\n switch (action.type) {\n case BUSY_THREAD:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_THREAD:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return Object.assign({}, state, { poll: null })\n\n case REPLACE_POLL:\n return Object.assign({}, state, { poll: action.state })\n\n case REPLACE_THREAD:\n return action.state\n\n case UPDATE_THREAD:\n return Object.assign({}, state, action.data)\n\n case UPDATE_THREAD_ACL:\n const acl = Object.assign({}, state.acl, action.data)\n return Object.assign({}, state, { acl })\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_THREADS = \"APPEND_THREADS\"\nexport const DELETE_THREAD = \"DELETE_THREAD\"\nexport const FILTER_THREADS = \"FILTER_THREADS\"\nexport const HYDRATE_THREADS = \"HYDRATE_THREADS\"\nexport const PATCH_THREAD = \"PATCH_THREAD\"\nexport const SORT_THREADS = \"SORT_THREADS\"\n\nexport const MODERATION_PERMISSIONS = [\n \"can_announce\",\n \"can_approve\",\n \"can_close\",\n \"can_hide\",\n \"can_move\",\n \"can_merge\",\n \"can_pin\",\n \"can_review\",\n]\n\nexport function append(items, sorting) {\n return {\n type: APPEND_THREADS,\n items,\n sorting,\n }\n}\n\nexport function deleteThread(thread) {\n return {\n type: DELETE_THREAD,\n thread,\n }\n}\n\nexport function filterThreads(category, categoriesMap) {\n return {\n type: FILTER_THREADS,\n category,\n categoriesMap,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_THREADS,\n items,\n }\n}\n\nexport function patch(thread, patch, sorting = null) {\n return {\n type: PATCH_THREAD,\n thread,\n patch,\n sorting,\n }\n}\n\nexport function sort(sorting) {\n return {\n type: SORT_THREADS,\n sorting,\n }\n}\n\nexport function getThreadModerationOptions(thread_acl) {\n let options = []\n MODERATION_PERMISSIONS.forEach(function (perm) {\n if (thread_acl[perm]) {\n options.push(perm)\n }\n })\n return options\n}\n\nexport function hydrateThread(thread) {\n return Object.assign({}, thread, {\n started_on: moment(thread.started_on),\n last_post_on: moment(thread.last_post_on),\n moderation: getThreadModerationOptions(thread.acl),\n })\n}\n\nexport default function thread(state = [], action = null) {\n switch (action.type) {\n case APPEND_THREADS:\n const mergedState = concatUnique(action.items.map(hydrateThread), state)\n return mergedState.sort(action.sorting)\n\n case DELETE_THREAD:\n return state.filter(function (item) {\n return item.id !== action.thread.id\n })\n\n case FILTER_THREADS:\n return state.filter(function (item) {\n const itemCategory = action.categoriesMap[item.category]\n if (\n itemCategory.lft >= action.category.lft &&\n itemCategory.rght <= action.category.rght\n ) {\n // same or sub category\n return true\n } else if (item.weight == 2) {\n // globally pinned\n return true\n } else {\n // thread moved outside displayed scope, hide it\n return false\n }\n })\n\n case HYDRATE_THREADS:\n return action.items.map(hydrateThread)\n\n case PATCH_THREAD:\n const patchedState = state.map(function (item) {\n if (item.id === action.thread.id) {\n return Object.assign({}, item, action.patch)\n } else {\n return item\n }\n })\n\n if (action.sorting) {\n return patchedState.sort(action.sorting)\n }\n return patchedState\n\n case SORT_THREADS:\n return state.sort(action.sorting)\n\n default:\n return state\n }\n}\n","export var initialState = {\n tick: 0,\n}\n\nexport const TICK = \"TICK\"\n\nexport function doTick() {\n return {\n type: TICK,\n }\n}\n\nexport default function tick(state = initialState, action = null) {\n if (action.type === TICK) {\n return Object.assign({}, state, {\n tick: state.tick + 1,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const ADD_NAME_CHANGE = \"ADD_NAME_CHANGE\"\nexport const APPEND_HISTORY = \"APPEND_HISTORY\"\nexport const HYDRATE_HISTORY = \"HYDRATE_HISTORY\"\n\nexport function addNameChange(change, user, changedBy) {\n return {\n type: ADD_NAME_CHANGE,\n change,\n user,\n changedBy,\n }\n}\n\nexport function append(items) {\n return {\n type: APPEND_HISTORY,\n items: items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_HISTORY,\n items: items,\n }\n}\n\nexport function hydrateNamechange(namechange) {\n return Object.assign({}, namechange, {\n changed_on: moment(namechange.changed_on),\n })\n}\n\nexport default function username(state = [], action = null) {\n switch (action.type) {\n case ADD_NAME_CHANGE:\n let newState = state.slice()\n newState.unshift({\n id: Math.floor(Date.now() / 1000), // just small hax for getting id\n changed_by: action.changedBy,\n changed_by_username: action.changedBy.username,\n changed_on: moment(),\n new_username: action.change.username,\n old_username: action.user.username,\n })\n return newState\n\n case APPEND_HISTORY:\n return concatUnique(state, action.items.map(hydrateNamechange))\n\n case HYDRATE_HISTORY:\n return action.items.map(hydrateNamechange)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n avatars: action.avatars,\n })\n }\n\n return item\n })\n\n case UPDATE_USERNAME:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n username: action.username,\n slug: action.slug,\n })\n }\n\n return Object.assign({}, item)\n })\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_USERS = \"APPEND_USERS\"\nexport const HYDRATE_USERS = \"HYDRATE_USERS\"\nexport const UPDATE_AVATAR = \"UPDATE_AVATAR\"\nexport const UPDATE_USERNAME = \"UPDATE_USERNAME\"\n\nexport function append(items) {\n return {\n type: APPEND_USERS,\n items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_USERS,\n items,\n }\n}\n\nexport function hydrateStatus(status) {\n if (status) {\n return Object.assign({}, status, {\n last_click: status.last_click ? moment(status.last_click) : null,\n banned_until: status.banned_until ? moment(status.banned_until) : null,\n })\n } else {\n return null\n }\n}\n\nexport function hydrateUser(user) {\n return Object.assign({}, user, {\n joined_on: moment(user.joined_on),\n status: hydrateStatus(user.status),\n })\n}\n\nexport function updateAvatar(user, avatars) {\n return {\n type: UPDATE_AVATAR,\n userId: user.id,\n avatars,\n }\n}\n\nexport function updateUsername(user, username, slug) {\n return {\n type: UPDATE_USERNAME,\n userId: user.id,\n username,\n slug,\n }\n}\n\nexport default function user(state = [], action = null) {\n switch (action.type) {\n case APPEND_USERS:\n return concatUnique(state, action.items.map(hydrateUser))\n\n case HYDRATE_USERS:\n return action.items.map(hydrateUser)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.id === action.userId) {\n item.avatars = action.avatars\n }\n\n return item\n })\n\n default:\n return state\n }\n}\n","export class Ajax {\n constructor() {\n this._cookieName = null\n this._csrfToken = null\n this._locks = {}\n }\n\n init(cookieName) {\n this._cookieName = cookieName\n }\n\n getCsrfToken() {\n if (document.cookie.indexOf(this._cookieName) !== -1) {\n let cookieRegex = new RegExp(this._cookieName + \"=([^;]*)\")\n let cookie = document.cookie.match(cookieRegex)[0]\n return cookie ? cookie.split(\"=\")[1] : null\n } else {\n return null\n }\n }\n\n request(method, url, data) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: method,\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data ? JSON.stringify(data) : null,\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n\n success: function (data) {\n resolve(data)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = gettext(\"Lost connection with application.\")\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = gettext(\"Action link is invalid.\")\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = gettext(\"Unknown error has occured.\")\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n\n get(url, params, lock) {\n if (params) {\n url += \"?\" + $.param(params)\n }\n\n if (lock) {\n let self = this\n\n // update url in existing lock?\n if (this._locks[lock]) {\n this._locks[lock].url = url\n }\n\n // immediately dereference promise handlers without doing anything\n // we are already waiting for existing response to resolve\n if (this._locks[lock] && this._locks[lock].waiter) {\n return {\n then: function () {\n return\n },\n }\n\n // return promise that will begin when original one resolves\n } else if (this._locks[lock] && this._locks[lock].wait) {\n this._locks[lock].waiter = true\n\n return new Promise(function (resolve, reject) {\n let wait = function (url) {\n // keep waiting on promise\n if (self._locks[lock].wait) {\n window.setTimeout(function () {\n wait(url)\n }, 300)\n\n // poll for new url\n } else if (self._locks[lock].url !== url) {\n wait(self._locks[lock].url)\n\n // ajax backend for response\n } else {\n self._locks[lock].waiter = false\n self.request(\"GET\", self._locks[lock].url).then(\n function (data) {\n if (self._locks[lock].url === url) {\n resolve(data)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n },\n function (rejection) {\n if (self._locks[lock].url === url) {\n reject(rejection)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n }\n )\n }\n }\n\n window.setTimeout(function () {\n wait(url)\n }, 300)\n })\n\n // setup new lock without waiter\n } else {\n this._locks[lock] = {\n url,\n wait: true,\n waiter: false,\n }\n\n return new Promise(function (resolve, reject) {\n self.request(\"GET\", url).then(\n function (data) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n resolve(data)\n }\n },\n function (rejection) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n reject(rejection)\n }\n }\n )\n })\n }\n } else {\n return this.request(\"GET\", url)\n }\n }\n\n post(url, data) {\n return this.request(\"POST\", url, data)\n }\n\n patch(url, data) {\n return this.request(\"PATCH\", url, data)\n }\n\n put(url, data) {\n return this.request(\"PUT\", url, data)\n }\n\n delete(url, data) {\n return this.request(\"DELETE\", url, data)\n }\n\n upload(url, data, progress) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: \"POST\",\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data,\n contentType: false,\n processData: false,\n\n xhr: function () {\n let xhr = new window.XMLHttpRequest()\n xhr.upload.addEventListener(\n \"progress\",\n function (evt) {\n if (evt.lengthComputable) {\n progress(Math.round((evt.loaded / evt.total) * 100))\n }\n },\n false\n )\n return xhr\n },\n\n success: function (response) {\n resolve(response)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = gettext(\"Lost connection with application.\")\n }\n\n if (rejection.status === 413 && !rejection.detail) {\n rejection.detail = gettext(\n \"Upload was rejected by server as too large.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = gettext(\"Action link is invalid.\")\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = gettext(\"Unknown error has occured.\")\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n}\n\nexport default new Ajax()\n","import { signIn, signOut } from \"misago/reducers/auth\"\n\nexport class Auth {\n init(store, local, modal) {\n this._store = store\n this._local = local\n this._modal = modal\n\n // tell other tabs what auth state is because we are most current with it\n this.syncSession()\n\n // listen for other tabs to tell us that state changed\n this.watchState()\n }\n\n syncSession() {\n const state = this._store.getState().auth\n if (state.isAuthenticated) {\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: state.user.username,\n })\n } else {\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n }\n }\n\n watchState() {\n const state = this._store.getState().auth\n this._local.watch(\"auth\", (newState) => {\n if (newState.isAuthenticated) {\n this._store.dispatch(\n signIn({\n username: newState.username,\n })\n )\n } else if (state.isAuthenticated) {\n // check if we are authenticated in this tab\n // because some browser plugins prune local store\n // aggressively, forcing erroneous message to display here\n // tracking bug #955\n this._store.dispatch(signOut())\n }\n })\n this._modal.hide()\n }\n\n signIn(user) {\n this._store.dispatch(signIn(user))\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: user.username,\n })\n this._modal.hide()\n }\n\n signOut() {\n this._store.dispatch(signOut())\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n\n softSignOut() {\n this._store.dispatch(signOut(true))\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n}\n\nexport default new Auth()\n","/* global grecaptcha */\nimport React from \"react\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport class BaseCaptcha {\n init(context, ajax, include, snackbar) {\n this._context = context\n this._ajax = ajax\n this._include = include\n this._snackbar = snackbar\n }\n}\n\nexport class NoCaptcha extends BaseCaptcha {\n load() {\n return new Promise(function (resolve) {\n // immediately resolve as we don't have anything to validate\n resolve()\n })\n }\n\n validator() {\n return null\n }\n\n component() {\n return null\n }\n}\n\nexport class QACaptcha extends BaseCaptcha {\n load() {\n var self = this\n return new Promise((resolve, reject) => {\n self._ajax.get(self._context.get(\"CAPTCHA_API\")).then(\n function (data) {\n self.question = data.question\n self.helpText = data.help_text\n resolve()\n },\n function () {\n self._snackbar.error(gettext(\"Failed to load CAPTCHA.\"))\n reject()\n }\n )\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class ReCaptchaComponent extends React.Component {\n componentDidMount() {\n grecaptcha.render(\"recaptcha\", {\n sitekey: this.props.siteKey,\n callback: (response) => {\n // fire fakey event to binding\n this.props.binding({\n target: {\n value: response,\n },\n })\n },\n })\n }\n\n render() {\n return
    \n }\n}\n\nexport class ReCaptcha extends BaseCaptcha {\n load() {\n this._include.include(\"https://www.google.com/recaptcha/api.js\", true)\n\n return new Promise(function (resolve) {\n var wait = function () {\n if (typeof grecaptcha === \"undefined\") {\n window.setTimeout(function () {\n wait()\n }, 200)\n } else {\n resolve()\n }\n }\n wait()\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class Captcha {\n init(context, ajax, include, snackbar) {\n switch (context.get(\"SETTINGS\").captcha_type) {\n case \"no\":\n this._captcha = new NoCaptcha()\n break\n\n case \"qa\":\n this._captcha = new QACaptcha()\n break\n\n case \"re\":\n this._captcha = new ReCaptcha()\n break\n }\n\n this._captcha.init(context, ajax, include, snackbar)\n }\n\n // accessors for underlying strategy\n\n load() {\n return this._captcha.load()\n }\n\n validator() {\n return this._captcha.validator()\n }\n\n component(kwargs) {\n return this._captcha.component(kwargs)\n }\n}\n\nexport default new Captcha()\n","export class Include {\n init(staticUrl) {\n this._staticUrl = staticUrl\n this._included = []\n }\n\n include(script, remote = false) {\n if (this._included.indexOf(script) === -1) {\n this._included.push(script)\n this._include(script, remote)\n }\n }\n\n _include(script, remote) {\n $.ajax({\n url: (!remote ? this._staticUrl : \"\") + script,\n cache: true,\n dataType: \"script\",\n })\n }\n}\n\nexport default new Include()\n","let storage = window.localStorage\n\nexport class LocalStorage {\n init(prefix) {\n this._prefix = prefix\n this._watchers = []\n\n window.addEventListener(\"storage\", (e) => {\n let newValueJson = JSON.parse(e.newValue)\n this._watchers.forEach(function (watcher) {\n if (watcher.key === e.key && e.oldValue !== e.newValue) {\n watcher.callback(newValueJson)\n }\n })\n })\n }\n\n set(key, value) {\n storage.setItem(this._prefix + key, JSON.stringify(value))\n }\n\n get(key) {\n let itemString = storage.getItem(this._prefix + key)\n if (itemString) {\n return JSON.parse(itemString)\n } else {\n return null\n }\n }\n\n watch(key, callback) {\n this._watchers.push({\n key: this._prefix + key,\n callback: callback,\n })\n }\n}\n\nexport default new LocalStorage()\n","import mount from \"misago/utils/mount-component\"\n\nexport class MobileNavbarDropdown {\n init(element) {\n this._element = element\n this._component = null\n }\n\n show(component) {\n if (this._component === component) {\n this.hide()\n } else {\n this._component = component\n mount(component, this._element.id)\n $(this._element).addClass(\"open\")\n }\n }\n\n showConnected(name, component) {\n if (this._component === name) {\n this.hide()\n } else {\n this._component = name\n mount(component, this._element.id, true)\n $(this._element).addClass(\"open\")\n }\n }\n\n hide() {\n $(this._element).removeClass(\"open\")\n this._component = null\n }\n}\n\nexport default new MobileNavbarDropdown()\n","import ReactDOM from \"react-dom\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Modal {\n init(element) {\n this._element = element\n\n this._modal = $(element).modal({ show: false })\n\n this._modal.on(\"hidden.bs.modal\", () => {\n ReactDOM.unmountComponentAtNode(this._element)\n })\n }\n\n show(component) {\n mount(component, this._element.id)\n this._modal.modal(\"show\")\n }\n\n hide() {\n this._modal.modal(\"hide\")\n }\n}\n\nexport default new Modal()\n","export class PageTitle {\n init(indexTitle, forumName) {\n this._indexTitle = indexTitle\n this._forumName = forumName\n }\n\n set(title) {\n if (!title) {\n document.title = this._indexTitle || this._forumName\n return\n }\n\n if (typeof title === \"string\") {\n title = { title: title }\n }\n\n let finalTitle = title.title\n\n if (title.page > 1) {\n const pageLabel = interpolate(\n gettext(\"page: %(page)s\"),\n {\n page: title.page,\n },\n true\n )\n\n finalTitle += \" (\" + pageLabel + \")\"\n }\n\n if (title.parent) {\n finalTitle += \" | \" + title.parent\n }\n\n document.title = finalTitle + \" | \" + this._forumName\n }\n}\n\nexport default new PageTitle()\n","export class Polls {\n init(ajax, snackbar) {\n this._ajax = ajax\n this._snackbar = snackbar\n\n this._polls = {}\n }\n\n start(kwargs) {\n this.stop(kwargs.poll)\n\n const poolServer = () => {\n this._polls[kwargs.poll] = kwargs\n\n this._ajax.get(kwargs.url, kwargs.data || null).then(\n (data) => {\n if (!this._polls[kwargs.poll]._stopped) {\n kwargs.update(data)\n\n this._polls[kwargs.poll].timeout = window.setTimeout(\n poolServer,\n kwargs.frequency\n )\n }\n },\n (rejection) => {\n if (!this._polls[kwargs.poll]._stopped) {\n if (kwargs.error) {\n kwargs.error(rejection)\n } else {\n this._snackbar.apiError(rejection)\n }\n }\n }\n )\n }\n\n if (kwargs.delayed) {\n this._polls[kwargs.poll] = {\n timeout: window.setTimeout(poolServer, kwargs.frequency),\n }\n } else {\n poolServer()\n }\n }\n\n stop(pollId) {\n if (this._polls[pollId]) {\n window.clearTimeout(this._polls[pollId].timeout)\n this._polls[pollId]._stopped = true\n }\n }\n}\n\nexport default new Polls()\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport PostingComponent from \"misago/components/posting\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Posting {\n init(ajax, snackbar, mount) {\n this._ajax = ajax\n this._snackbar = snackbar\n this._mount = mount\n\n this._mode = null\n this._spacer = document.getElementById(\"posting-spacer\")\n this._observer = new ResizeObserver((entries) => {\n this._spacer.style.height = entries[0].contentRect.height + \"px\"\n })\n\n this._isOpen = false\n this._isClosing = false\n\n this._beforeunloadSet = false\n }\n\n isOpen() {\n return this._isOpen\n }\n\n setBeforeUnload() {\n if (!this._beforeunloadSet) {\n window.addEventListener(\"beforeunload\", this.beforeUnload, { capture: true })\n this._beforeunloadSet = true\n }\n }\n\n unsetBeforeUnload() {\n window.removeEventListener(\"beforeunload\", this.beforeUnload, { capture: true })\n this._beforeunloadSet = false\n }\n\n beforeUnload(event) {\n event.returnValue = \"true\"\n return \"true\"\n }\n\n open(props) {\n if (this._isOpen === false) {\n this._mode = props.mode\n this._isOpen = props.submit\n this._realOpen(props)\n } else if (this._isOpen !== props.submit) {\n let message = gettext(\n \"You are already working on other message. Do you want to discard it?\"\n )\n\n const changeForm = window.confirm(message)\n if (changeForm) {\n this._mode = props.mode\n this._isOpen = props.submit\n this._realOpen(props)\n }\n } else if (this._mode == \"REPLY\" && props.mode == \"REPLY\") {\n this._realOpen(props)\n }\n }\n\n _realOpen(props) {\n mount(, this._mount.id)\n\n this._mount.classList.add(\"show\")\n this._observer.observe(this._mount)\n this.setBeforeUnload()\n }\n\n close = () => {\n this.unsetBeforeUnload()\n\n if (this._isOpen && !this._isClosing) {\n this._isClosing = true\n this._mount.classList.remove(\"show\")\n\n window.setTimeout(() => {\n ReactDOM.unmountComponentAtNode(this._mount)\n this._observer.unobserve(this._mount)\n this._spacer.style.height = \"0px;\"\n this._isClosing = false\n this._isOpen = false\n this._mode = null\n }, 300)\n }\n }\n}\n\nexport default new Posting()\n","import { showSnackbar, hideSnackbar } from \"misago/reducers/snackbar\"\n\nconst HIDE_ANIMATION_LENGTH = 300\nconst MESSAGE_SHOW_LENGTH = 5000\n\nexport class Snackbar {\n init(store) {\n this._store = store\n this._timeout = null\n }\n\n alert(message, type) {\n if (this._timeout) {\n window.clearTimeout(this._timeout)\n this._store.dispatch(hideSnackbar())\n\n this._timeout = window.setTimeout(() => {\n this._timeout = null\n this.alert(message, type)\n }, HIDE_ANIMATION_LENGTH)\n } else {\n this._store.dispatch(showSnackbar(message, type))\n this._timeout = window.setTimeout(() => {\n this._store.dispatch(hideSnackbar())\n this._timeout = null\n }, MESSAGE_SHOW_LENGTH)\n }\n }\n\n // shorthands for message types\n\n info(message) {\n this.alert(message, \"info\")\n }\n\n success(message) {\n this.alert(message, \"success\")\n }\n\n warning(message) {\n this.alert(message, \"warning\")\n }\n\n error(message) {\n this.alert(message, \"error\")\n }\n\n // shorthand for api errors\n\n apiError(rejection) {\n let message = rejection.detail\n\n if (!message) {\n if (rejection.status === 404) {\n message = gettext(\"Action link is invalid.\")\n } else {\n message = gettext(\"Unknown error has occured.\")\n }\n }\n\n if (rejection.status === 403 && message === \"Permission denied\") {\n message = gettext(\"You don't have permission to perform this action.\")\n }\n\n this.error(message)\n }\n}\n\nexport default new Snackbar()\n","import { combineReducers, createStore } from \"redux\"\n\nexport class StoreWrapper {\n constructor() {\n this._store = null\n this._reducers = {}\n this._initialState = {}\n }\n\n addReducer(name, reducer, initialState) {\n this._reducers[name] = reducer\n this._initialState[name] = initialState\n }\n\n init() {\n this._store = createStore(\n combineReducers(this._reducers),\n this._initialState\n )\n }\n\n getStore() {\n return this._store\n }\n\n // Store API\n\n getState() {\n return this._store.getState()\n }\n\n dispatch(action) {\n return this._store.dispatch(action)\n }\n}\n\nexport default new StoreWrapper()\n","/* global zxcvbn */\nexport class Zxcvbn {\n init(include) {\n this._include = include\n this._isLoaded = false\n }\n\n scorePassword(password, inputs) {\n // 0-4 score, the more the stronger password\n if (this._isLoaded) {\n return zxcvbn(password, inputs).score\n }\n\n return 0\n }\n\n load() {\n if (!this._isLoaded) {\n this._include.include(\"misago/js/zxcvbn.js\")\n return this._loadingPromise()\n } else {\n return this._loadedPromise()\n }\n }\n\n _loadingPromise() {\n const self = this\n\n return new Promise(function (resolve, reject) {\n var wait = function (tries = 0) {\n tries += 1\n if (tries > 200) {\n reject()\n } else if (typeof zxcvbn === \"undefined\") {\n window.setTimeout(function () {\n wait(tries)\n }, 200)\n } else {\n self._isLoaded = true\n resolve()\n }\n }\n wait()\n })\n }\n\n _loadedPromise() {\n // we have already loaded zxcvbn.js, resolve away!\n return new Promise(function (resolve) {\n resolve()\n })\n }\n}\n\nexport default new Zxcvbn()\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default class extends React.Component {\n getReasonMessage() {\n if (this.props.message.html) {\n return (\n \n )\n } else {\n return

    {this.props.message.plain}

    \n }\n }\n\n getExpirationMessage() {\n if (this.props.expires) {\n if (this.props.expires.isAfter(moment())) {\n let title = interpolate(\n gettext(\"This ban expires on %(expires_on)s.\"),\n {\n expires_on: this.props.expires.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n gettext(\"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.props.expires.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return gettext(\"This ban has expired.\")\n }\n } else {\n return gettext(\"This ban is permanent.\")\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n highlight_off\n
    \n
    \n {this.getReasonMessage()}\n

    {this.getExpirationMessage()}

    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider, connect } from \"react-redux\"\nimport BannedPage from \"misago/components/banned-page\"\nimport misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nlet select = function (state) {\n return state.tick\n}\n\nlet RedrawedBannedPage = connect(select)(BannedPage)\n\nexport default function (ban, changeState) {\n ReactDOM.render(\n \n \n ,\n\n document.getElementById(\"page-mount\")\n )\n\n if (typeof changeState === \"undefined\" || changeState) {\n let forumName = misago.get(\"SETTINGS\").forum_name\n document.title = gettext(\"You are banned\") + \" | \" + forumName\n window.history.pushState({}, \"\", misago.get(\"BANNED_URL\"))\n }\n}\n","export default function (list, rowWidth, padding = false) {\n let rows = []\n let row = []\n\n list.forEach(function (element) {\n row.push(element)\n if (row.length === rowWidth) {\n rows.push(row)\n row = []\n }\n })\n\n // pad row to required length?\n if (padding !== false && row.length > 0 && row.length < rowWidth) {\n for (let i = row.length; i < rowWidth; i++) {\n row.push(padding)\n }\n }\n\n if (row.length) {\n rows.push(row)\n }\n\n return rows\n}\n","export default function (a, b) {\n let ids = []\n return a.concat(b).filter(function (item) {\n if (ids.indexOf(item.id) === -1) {\n ids.push(item.id)\n return true\n } else {\n return false\n }\n })\n}\n","const map = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n}\n\nexport default function (text) {\n return text.replace(/[&<>\"']/g, function (m) {\n return map[m]\n })\n}\n","export default function (bytes) {\n if (bytes > 1024 * 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024 * 1024)) + \" GB\"\n } else if (bytes > 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024)) + \" MB\"\n } else if (bytes > 1024) {\n return roundSize(bytes / 1024) + \" KB\"\n } else {\n return roundSize(bytes) + \" B\"\n }\n}\n\nexport function roundSize(value) {\n return value.toFixed(1)\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport store from \"misago/services/store\"\n\nexport default function (Component, rootElementId, connected = true) {\n let rootElement = document.getElementById(rootElementId)\n\n let finalComponent = Component.props ? Component : \n\n if (rootElement) {\n if (connected) {\n ReactDOM.render(\n {finalComponent},\n\n rootElement\n )\n } else {\n ReactDOM.render(finalComponent, rootElement)\n }\n }\n}\n","export function int(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport function range(min, max) {\n let array = new Array(int(min, max))\n for (let i = 0; i < array.length; i++) {\n array[i] = i\n }\n\n return array\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { Router, browserHistory } from \"react-router\"\nimport store from \"misago/services/store\"\n\nconst rootElement = document.getElementById(\"page-mount\")\n\nexport default function (options) {\n let routes = {\n component: options.component || null,\n childRoutes: [],\n }\n\n if (options.root) {\n routes.childRoutes = [\n {\n path: options.root,\n onEnter: function (nextState, replaceState) {\n replaceState(null, options.paths[0].path)\n },\n },\n ].concat(options.paths)\n } else {\n routes.childRoutes = options.paths\n }\n\n ReactDOM.render(\n \n \n ,\n rootElement\n )\n}\n","export function push(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array\n }\n}\n\nexport function remove(array, value) {\n if (array.indexOf(value) >= 0) {\n return array.filter(function (i) {\n return i !== value\n })\n } else {\n return array\n }\n}\n\nexport function toggle(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array.filter(function (i) {\n return i !== value\n })\n }\n}\n","const EMAIL =\n /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i\nconst USERNAME = new RegExp(\"^[0-9a-z]+$\", \"i\")\n\nexport function required(message) {\n return function (value) {\n if (value === false || value === null || $.trim(value).length === 0) {\n return message || gettext(\"This field is required.\")\n }\n }\n}\n\nexport function requiredTermsOfService(message) {\n const error = gettext(\"You have to accept the terms of service.\")\n return required(message || error)\n}\n\nexport function requiredPrivacyPolicy(message) {\n const error = gettext(\"You have to accept the privacy policy.\")\n return required(message || error)\n}\n\nexport function email(message) {\n return function (value) {\n if (!EMAIL.test(value)) {\n return message || gettext(\"Enter a valid email address.\")\n }\n }\n}\n\nexport function minLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = $.trim(value).length\n\n if (length < limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = ngettext(\n \"Ensure this value has at least %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function maxLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = $.trim(value).length\n\n if (length > limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = ngettext(\n \"Ensure this value has at most %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function usernameMinLength(lengthMin) {\n var message = function (lengthMin) {\n return ngettext(\n \"Username must be at least %(limit_value)s character long.\",\n \"Username must be at least %(limit_value)s characters long.\",\n lengthMin\n )\n }\n return minLength(lengthMin, message)\n}\n\nexport function usernameMaxLength(lengthMax) {\n var message = function (lengthMax) {\n return ngettext(\n \"Username cannot be longer than %(limit_value)s character.\",\n \"Username cannot be longer than %(limit_value)s characters.\",\n lengthMax\n )\n }\n return maxLength(lengthMax, message)\n}\n\nexport function usernameContent() {\n return function (value) {\n if (!USERNAME.test($.trim(value))) {\n return gettext(\n \"Username can only contain latin alphabet letters and digits.\"\n )\n }\n }\n}\n\nexport function passwordMinLength(limitValue) {\n return function (value) {\n const length = value.length\n\n if (length < limitValue) {\n const returnMessage = ngettext(\n \"Valid password must be at least %(limit_value)s character long.\",\n \"Valid password must be at least %(limit_value)s characters long.\",\n limitValue\n )\n\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"hljs\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t174: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmisago\"] = self[\"webpackChunkmisago\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(32233); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(58339); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(64109); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(46226); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(93240); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(75147); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(4894); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(29223); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(3026); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(94795); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(95563); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(32488); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(11768); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(61323); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(15049); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(61814); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(95920); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(60630); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(72168); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(47806); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(77031); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(97751); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(76093); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(19764); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(47549); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(22331); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(21513); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(98749); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(98251); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(6720); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(10846); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(18255); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(14113); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(24444); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(1764); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(68351); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(81521); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(19984); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(41229); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(43589); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(24108); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(33934); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(85577); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(83526); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(43060); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(92292); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(33409); })\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], function() { return __webpack_require__(31341); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","children","className","classnames","shrink","auto","styleName","message","dangerouslySetInnerHTML","__html","header","LegalAgreement","props","agreement","checked","errors","url","value","onChange","agreementHtml","interpolate","escapeHtml","label","gettext","type","map","error","i","privacyPolicy","termsOfService","onPrivacyPolicyChange","onTermsOfServiceChange","termsOfServiceId","misago","termsOfServiceUrl","privacyPolicyId","privacyPolicyUrl","FormHeader","text","buttonClassName","buttonLabel","formLabel","labelClassName","socialAuth","length","pk","name","button_text","button_color","style","color","finalButtonLabel","site","href","thread","weight","title","best_answer","has_poll","is_unapproved","has_unapproved_posts","is_closed","is_hidden","ngettext","replies","Math","round","size","size2x","alt","src","getSrc","user","srcSet","width","height","id","avatars","avatar","forEach","av","resolveAvatarForSize","Button","React","render","this","disabled","loading","onClick","defaultProps","choices","item","repeat","level","display","helpText","ev","field","fieldname","target","input","rows","fields","for","help_text","validation","Form","constructor","super","setState","state","isLoading","groups","group","f","initial","send","data","Object","assign","ajax","api","handleSuccess","onSuccess","handleError","rejection","status","snackbar","onSubmit","handleSubmit","CancelButton","onCancel","componentDidMount","then","cancel","FormDisplay","isValidated","getClassName","getFeedback","getFeedbackDescription","getHelpText","labelClass","htmlFor","controlClass","extra","validateRequired","required","event","changeValue","newState","formErrors","validateField","preventDefault","clean","promise","success","validate","validators","optional","validatedFields","hasOwnProperty","push","fieldErrors","isValid","requiredError","validationError","isActive","isControlled","path","document","location","pathname","indexOf","activeClassName","BestAnswerSelect","choice","PollSelect","modal","onError","bestAnswer","poll","polls","window","confirm","role","pgettext","bestAnswers","onBestAnswerChange","onPollChange","ytRegExp","RegExp","element","highlightCode","embedYoutubePlayers","_youtube","default","hljs","codeblocks","querySelectorAll","highlightElement","anchors","a","onlyChild","parentNode","childNodes","parseYoutubeUrl","youtubeMovie","swapYoutubePlayer","youtube","video","start","player","$","replaceWith","wrap","cleanedUrl","substr","cleanUrl","match","getVideoIdFromUrl","timebit","split","filter","bits","parseInt","onebox","documentNode","find","click","revealSpoiler","componentDidUpdate","prevProps","prevState","shouldComponentUpdate","nextProps","nextState","markup","author","undefined","ref","node","btn","parent","addClass","PanelMessage","icon","post","content","Default","Invalid","category","tooltip","posted_on","format","index","fromNow","poster_name","rank","userTitle","css_class","is_tab","poster","username","random","isReady","posts","PostingQuoteSelection","range","getQuoteSelection","rect","getBoundingClientRect","posting","globalState","getGlobalState","quote","getQuoteMarkup","focusEditor","setTimeout","onMouseUp","selected","onTouchEnd","position","left","scrollX","top","bottom","scrollY","reply","textarea","querySelector","focus","selectionStart","selectionEnd","container","getSelection","selection","rangeCount","getRangeAt","isRangeContained","isPostContained","isAnyTextSelected","cloneContents","commonAncestorContainer","p","nodeName","dataset","noquote","child","nodeType","Node","TEXT_NODE","textContent","trim","metadata","getQuoteMetadata","convertNodesToMarkup","prefix","suffix","codeBlock","getQuoteCodeBlock","syntax","isNodeInlineCodeBlock","isNodeElementWithQuoteMetadata","getQuoteMetadataFromNode","ELEMENT_NODE","block","isNodeCodeBlock","getNodeCodeBlockMeta","nodes","stack","convertNodeToMarkup","SIMPLE_NODE_MAPPINGS","H1","H2","H3","H4","H5","H6","STRONG","EM","DEL","B","U","I","SUB","SUP","toUpperCase","code","innerText","misagoReply","setGlobalState","clearGlobalState","attachments","attachment","isRemoved","MarkupAttachmentModal","is_image","filename","filetype","formatFilesize","uploaded_on","uploader","uploader_name","wrapSelection","update","def","newValue","caret","setSelectionRange","replaceSelection","end","createRange","moveStart","substring","scroll","scrollTop","progress","thumb","getAttachmentMarkup","key","canProtect","empty","preview","isProtected","submitText","showPreview","closePreview","enableProtection","disableProtection","MarkupCodeModal","LANGUAGES","MarkupFormattingHelpModal","ExampleFormatting","result","ExampleFormattingSpoiler","reveal","URL_PATTERN","str","test","MarkupImageModal","isUrl","textUrl","MarkupLinkModal","MarkupQuoteModal","ALPHA","ALPHA_LEN","getRandomString","len","chars","floor","join","file","maxSize","acl","max_attachment_size","limit","upload","concat","refreshState","FormData","append","moment","detail","updateAttachments","actions","insertSpoiler","createElement","multiple","addEventListener","files","uploadFile","uploadFiles","MarkupEditor","parsed","stopPropagation","dataTransfer","onAttachmentsChange","clipboardData","items","kind","getAsFile","focused","placeholder","atwho","at","displayTpl","insertTpl","searchKey","callbacks","remoteFilter","query","callback","getJSON","q","on","_storage","source","controller","headPos","endPos","setMentions","onDrop","onFocus","onPaste","onBlur","post_length_min","CLASS_ACTIVE","CLASS_DEFAULT","CLASS_MINIMIZED","CLASS_FULLSCREEN","PostingDialog","body","classList","add","componentWillUnmount","remove","componentWillReceiveProps","fullscreen","minimized","close","minimize","fullscreenEnter","fullscreenExit","open","PostingThreadOptions","isClosed","isHidden","isPinned","options","hide","unhide","pinGlobally","pinLocally","unpin","icons","closed","hidden","pinned","getIcons","pin","categories","categoryOptions","getTitleValidators","getPostValidators","config","loadSuccess","loadError","submit","non_field_errors","dialogProps","PostingDialogStart","Toolbar","showOptions","onTitleChange","onCategoryChange","onClose","onOpen","onHide","onUnhide","onPinGlobally","onPinLocally","onUnpin","onPostChange","usernames","removedBlanks","toLowerCase","pos","to","cleanUsernames","PostingDialogStartPrivate","onToChange","newPost","context","onQuote","newContext","appendData","PostingDialogReply","method","protect","is_protected","can_protect","PostingDialogEditReply","date","mode","minLength","thread_title_length_min","limitValue","limit_value","show_value","maxLength","thread_title_length_max","post_length_max","validatePostLengthMin","Icon","getChoice","getIcon","getLabel","change","showActivation","password","form","val","showBannedPage","ban","getActivationButton","bindInput","getClass","is_banned","is_online_hidden","is_offline_hidden","is_online","is_offline","getStatusClassName","StatusIcon","StatusLabel","getHelp","banned_until","ban_expires","last_click","getEmptyMessage","emptyMessage","renderUserAvatar","changed_by","renderUsername","changed_by_username","old_username","new_username","changed_on","changes","hiddenOnMobile","isLoaded","showStatus","Status","JoinDate","Posts","Threads","Followers","joined_on","getStatClassName","threads","followers","stat","colClassName","cols","list","Array","apply","Number","call","users","dropdown","getCompactNavClassName","iconOn","iconOff","labelOn","labelOff","toggle","_initializers","_context","addInitializer","initializer","after","before","init","isOrdered","_items","order","get","has","values","values_only","_order","orderedValues","unordered","ordered","ordering","insertItem","insertAt","splice","iterations","fallback","pop","setInterval","store","patch","AUTH_SYNC_RATE","auth","storage","captcha","include","AcceptAgreement","submiting","accept","reload","handleDecline","handleAccept","getElementById","mount","refresh","getMessage","signedIn","signedOut","select","connect","AuthMessage","description","html","getTitle","is_read","LastThread","Empty","Private","Protected","can_browse","can_see_all_threads","last_thread_title","LastPosterAvatar","last_thread_new","LastPosterName","last_post","last_post_on","last_poster","last_poster_name","Message","isFirst","subcategories","hydrate","startPolling","frequency","tick","Categories","SideNav","option","baseUrl","component","CompactNav","hideNav","delete","onPasswordChange","edit_details","DownloadData","data_downloads","downloads","isSubmiting","request_data_download","handleLoadDownloads","rowStyle","requested_on","DownloadButton","exportFile","colSpan","handleRequestDataDownload","verticalAlign","is_hiding_presence","limits_private_thread_invites_to","subscribe_to_started_threads","subscribe_to_replied_threads","privateThreadInvitesChoices","subscribeToChoices","next_on","next_change","length_min","length_max","phrases","changes_left","name_changes_expire","complete","slug","addNameChange","updateUsername","Promise","all","results","getChangeForm","onComplete","new_email","change_email","response","new_password","repeat_password","change_password","has_usable_password","WithDropdown","page","PageHeader","FlexRow","PageContainer","paths","ChangeForumOptions","EditDetails","delegateAuth","DELEGATE_AUTH","ChangeUsername","ChangeSignInCredentials","DeleteAccount","root","Options","expires_on","initWithPreloadedData","initWithoutPreloadedData","profile","getUserMessage","user_message","getStaffMessage","staff_message","getExpirationMessage","isAfter","getPanelBody","keys","isAuthenticated","SafeValue","rel","onEdit","showEditButton","dispatch","details","load","editing","newDetails","loadDetails","profileDetails","edit","loadItems","next","Feed","loadMore","LoadMoreButton","isBusy","loadUsers","search","count","more","pages","setSpecialProps","PRELOADED_DATA_KEY","TITLE","API_FILTER","apiUrl","getMoreButton","getListBody","loadChanges","is_followed","follow","action","canMessage","can_start_private_threads","isProfileOwner","is_avatar_locked","avatar_lock_user_message","avatar_lock_staff_message","moderate_avatar","apiResponse","updateAvatar","avatar_hash","getFormBody","getModalBody","moderate_username","countdown","isDeleted","with_content","getButtonLabel","getForm","getDeletedBody","AvatarControls","moderation","showAvatarDialog","rename","showRenameDialog","showDeleteDialog","is_active","email","ProfileModerationButton","available","getModeration","can_follow","is_anonymous","can_rename","can_moderate_avatar","can_delete","COMPONENTS","follows","Details","UsernameHistory","BanDetails","Profile","RequestLinkForm","LinkSent","reset","RequestActivationLink","RequestResetForm","showInactivePage","AccountInactivePage","getActivateButton","activation","ReactDOM","RequestPasswordReset","ResetPasswordForm","PasswordChangedPage","showSignIn","SignInModal","updateSearch","urlQuery","history","pushState","encodeURIComponent","providers","provider","updateUsers","updatePosts","onQueryChange","Badge","ceil","SearchTime","time","copy","LoadMore","appendPosts","updateProvider","Blankslate","components","route","TYPES_CLASSES","info","warning","Snackbar","getSnackbarClass","snackbarClass","isVisible","backendName","pageTitleTpl","pageTitle","backend","Register","handleToggleAgreement","validator","formValidators","emailProtected","terms_of_service","privacy_policy","onRegistrationComplete","step","stateUpdate","backend_name","emailHelpText","emailHelpTextTpl","RegisterLegalFootnote","handlePrivacyPolicyChange","handleTermsOfServiceChange","SocialAuth","handleRegistrationComplete","op","updateAcl","participants","ModalHeader","onUsernameChange","can_add_participants","confirmed","isUser","participant","is_owner","can_change_owner","isModerator","can_moderate_private_threads","userIsOwner","UserStatus","isOwner","getUserIsOwner","utils","PollChoice","hash","proc","votes","getVotesLabel","ChoiceVotes","UserChoice","npgettext","hydratedData","voters","voter","voted_on","ModalBody","ChoicesList","ChoiceDetails","VotesCount","VotesList","Voter","VoteDate","isPollOver","showVoting","is_public","can_edit","can_see_votes","can_vote","hasSelectedChoices","allow_revotes","controls","canVote","canChangeVote","ChangeVote","SeeVotes","Edit","Delete","control","newThreadAcl","DATE_ABBR","PollVotes","PollLength","PollIsPublic","PollCreation","getPoster","getPostedOn","absolute","relative","ends_on","getEndsOn","endsOn","question","PollChoicesLeft","choicesLeft","PollAllowRevote","ChoiceSelect","toggleChoice","getChoicesLeft","allowed_choices","getChoiceFromHash","deselectChoice","selectChoice","slice","showResults","getIsPollOver","generateRandomHash","setChoices","canDelete","onDelete","onAdd","randomHash","toString","replace","isEdit","PollPublicSwitch","ICON","changed_title","pinned_globally","pinned_locally","unpinned","moved","merged","approved","opened","unhid","hid","changed_owner","tookover","added_participant","owner_left","participant_left","removed_participant","event_type","can_hide","Hide","Unhide","hidden_on","hidden_by_name","hidden_by","USER_SPAN","USER_URL","Hidden","Poster","event_by","event_on","MESSAGE","ITEM_LINK","ITEM_SPAN","ChangedTitle","Moved","Merged","ChangedOwner","AddedParticipant","RemovedParticipant","msgstring","oldTitle","event_context","old_title","fromCategory","from_category","mergedThread","merged_thread","newOwner","waypoint","handler","direction","boundingClientRect","offsetBottom","clientHeight","documentElement","read","thread_is_read","offset","AttachmentPreview","AttachmentDetails","AttachmentThumbnail","AttachmentIcon","backgroundImage","can_see_hidden","batch","row","Row","FlagBestAnswer","best_answer_marked_by","marked_on","best_answer_marked_on","marked_by","best_answer_marked_by_name","FlagHidden","FlagUnapproved","FlagProtected","ops","previousState","markAsBestAnswer","best_answer_is_protected","best_answer_marked_by_slug","patchThread","likes","hydrateLike","ModalDialog","LikesList","liked_on","likesCount","like","LikeDetails","liker_id","LikeDate","likedOn","can_reply","can_see_likes","last_likes","can_like","MarkAsBestAnswer","MarkAsBestAnswerCompact","Like","Likes","lastLikes","LikesCompact","Reply","can_mark_best_answer","can_mark_as_best_answer","can_change_best_answer","is_liked","concatedLikes","finalLikes","hasLikes","getLikesMessage","u","hiddenLikes","otherUsers","lastUser","usernamesList","last_user","editor","move","new_thread","onUrlChange","diff","DiffItem","getItemClassName","revertEdit","canRevert","goToEdit","previous","GoBackBtn","goBack","GoForwardBtn","goForward","GoLastBtn","goLast","Label","RevertBtn","editor_name","edited_on","edited_by","hydrateEdit","json","edits","hydratedPost","PostingConfig","ModerationForm","isError","Error","Loader","categoryId","can_pin_threads","can_hide_threads","can_close_threads","isHiddenChoices","isClosedChoices","getWeightChoices","renderWeightField","renderHiddenField","renderClosedField","Modal","Permalink","UnmarkMarkBestAnswer","PostEdits","Approve","Move","Split","Protect","Unprotect","permaUrl","protocol","host","prompt","can_unmark_best_answer","isUnedited","can_approve","can_move","can_unhide","isSelected","can_merge_posts","UnreadLabel","UnreadCompact","PostedOn","PostedOnCompact","PostEditsCompacts","ProtectedLabel","postAuthor","hasAcl","hasVisibleTitle","ListItem","is_event","starter","starter_name","timestamp","started_on","handleSuccessUnmounted","best_answers","merge","other_thread","post_set","ModalMessage","ModalLoading","successMessage","ThreadChangeTitleModal","callApi","changeTitle","approve","oldState","subscription","finalState","stickToBottom","unsubscribe","alert","short_name","special_role","breadcrumbs","ThreadReplies","hasFlags","ThreadFlags","is_authenticated","enabled","first","last","PostErrors","heading","ids","rollback","isArray","Merge","can_merge","dropup","onReply","compact","is_new","new_post","unapproved_post","pollDisabled","onPoll","can_start_poll","setPageTitle","editPoll","shouldFetchData","fetchData","startPollingApi","stopPollingApi","params","delayed","threadModeration","getThreadModeration","postsModeration","getPostsModeration","openPollForm","openReplyForm","closePollForm","can_close","can_pin_globally","can_pin","can_unprotect","basePath","Route","compareLastPostAge","b","compareGlobalWeight","compareWeight","allItems","parentUrl","lists","longName","ThreadErrors","freezeThread","deleteThread","addThreads","filterThreads","categoriesMap","getFormdata","categoryChoices","can_start_threads","renderForm","renderCantMergeMessage","storeState","leftThreads","acls","renderCantMoveMessage","updateThread","threadsMap","failedThreads","noSelection","t","topCategory","topCategories","subCategory","subCategories","startThread","allow","getTopCategory","cat","busyThreads","diffThreads","current","fromDb","currentMap","isThreadChanged","getModerationActions","SUBSCRIPTION","notify","ThreadsListItemSubscriptionOptions","getSubscriptionIcon","activeCategory","showSubscription","isNew","updatedThreads","applyUpdate","loadThreads","getCategory","getSorting","currentState","sets","isMounted","pollResponse","index_header","forum_name","getPageTitle","index_title","specialRole","pageLead","threadsCount","applyDiff","can_see_unapproved_content_lists","getLists","routes","PRIVATE_THREADS_LIST","getListOptions","section","HEADER","RESULT","FOOTER","autoComplete","encodeURI","footer","flattenProvider","flatlist","arrayLength","flatResults","flattenProviders","flattenResults","isOpen","closeResults","loadResults","intervalId","onDocumentMouseDown","onEscape","removeEventListener","delay","clearTimeout","cleanResults","onToggle","STYLES","LABELS","_score","_password","_inputs","loaded","zxcvbn","getScore","inputs","cacheStale","score","RegisterForm","criteria","passwordMinLength","min_length","max_length","__all__","StartSocialAuth","RegisterComplete","getLead","getSubscript","completeRegistration","account_activation","showRegisterForm","GuestMenu","showSignInModal","URLSearchParams","LOGIN_URL","GuestNav","CompactGuestNav","showGuestMenu","avatarType","showError","getGravatarButton","gravatar","setGravatar","getCropButton","crop_src","showCrop","getUploadButton","showUpload","getGalleryButton","galleries","showGallery","getAvatarPreview","userPeview","setGenerated","cropit","deviceRatio","cropitOffset","crop","x","y","zoom","getAvatarSize","crop_tmp","getImagePath","dataUrl","cropperWidth","initialWidth","exportZoom","imageState","onImageLoaded","zoomLevel","imageSize","offsetX","offsetY","cropAvatar","showIndex","image","validateFile","URL","createObjectURL","uploaded","filesize","fileSize","invalidTypeMsg","allowed_mime_types","extensionFound","loweredFilename","allowed_extensions","extension","getUploadRequirements","extensions","pickFile","getUploadProgressLabel","getUploadProgress","renderUpload","renderCrop","GalleryItem","Gallery","images","save","ChangeAvatarError","getErrorReason","reason","AvatarIndex","AvatarUpload","AvatarCrop","AvatarGallery","getBody","completeFlow","UserMenu","changeAvatar","ChangeAvatarModal","following","can_use_private_threads","PrivateThreadsBadge","unread_private_threads","UserNav","UserPrivateThreadsLink","selectUserMenu","CompactUserNav","showUserMenu","CompactUserMenu","getPageUrl","days","trackedPeriod","getUserStatus","getRankName","rankUrl","getUserTitle","counter","meta","getLeadMessage","posters","tracked_period","string","subString","n","stringCount","RankUsersListLoader","getRankDescription","getComponent","Rank","ActivePosters","Users","attr","forum_index_title","reducer","isAnonymous","initialState","doTick","PATCH_USER","SIGN_IN","SIGN_OUT","signIn","signOut","soft","UPDATE_AVATAR","userId","UPDATE_USERNAME","REPLACE_PARTICIPANTS","BUSY_POLL","RELEASE_POLL","REMOVE_POLL","REPLACE_POLL","UPDATE_POLL","busy","release","hydrated","PATCH_POST","updated_on","hydrateAttachment","hydrateUser","APPEND_POSTS","SELECT_POST","DESELECT_POST","DESELECT_POSTS","LOAD_POSTS","UNLOAD_POSTS","UPDATE_POSTS","deselect","deselectAll","hydratePost","unload","selectedPosts","deseletedPosts","deseletedAllPosts","resultsIds","reducedPosts","postReducer","LOAD_DETAILS","HYDRATE_PROFILE","PATCH_PROFILE","hydrateStatus","REPLACE_SEARCH","UPDATE_SEARCH","UPDATE_SEARCH_PROVIDER","SELECT_ALL","SELECT_NONE","SELECT_ITEM","itemsIds","none","itemId","SHOW_SNACKBAR","HIDE_SNACKBAR","showSnackbar","messageType","hideSnackbar","BUSY_THREAD","RELEASE_THREAD","REPLACE_THREAD","UPDATE_THREAD","UPDATE_THREAD_ACL","APPEND_THREADS","DELETE_THREAD","FILTER_THREADS","HYDRATE_THREADS","PATCH_THREAD","SORT_THREADS","MODERATION_PERMISSIONS","sorting","getThreadModerationOptions","thread_acl","perm","hydrateThread","concatUnique","sort","itemCategory","lft","rght","patchedState","TICK","ADD_NAME_CHANGE","APPEND_HISTORY","HYDRATE_HISTORY","changedBy","hydrateNamechange","namechange","unshift","Date","now","APPEND_USERS","HYDRATE_USERS","_cookieName","_csrfToken","_locks","cookieName","getCsrfToken","cookie","cookieRegex","request","self","resolve","reject","xhr","headers","JSON","stringify","contentType","dataType","jqXHR","responseJSON","statusText","lock","param","waiter","wait","put","processData","XMLHttpRequest","evt","lengthComputable","total","local","_store","_local","_modal","syncSession","watchState","getState","set","watch","softSignOut","BaseCaptcha","_ajax","_include","_snackbar","NoCaptcha","QACaptcha","kwargs","ReCaptchaComponent","grecaptcha","sitekey","siteKey","binding","ReCaptcha","recaptcha_site_key","captcha_type","_captcha","staticUrl","_staticUrl","_included","script","remote","cache","localStorage","_prefix","_watchers","e","newValueJson","parse","watcher","oldValue","setItem","itemString","getItem","_element","_component","show","showConnected","removeClass","indexTitle","forumName","_indexTitle","_forumName","finalTitle","_polls","stop","poolServer","_stopped","timeout","apiError","pollId","unsetBeforeUnload","_isOpen","_isClosing","_mount","_observer","unobserve","_spacer","_mode","ResizeObserver","entries","contentRect","_beforeunloadSet","setBeforeUnload","beforeUnload","capture","returnValue","_realOpen","observe","_timeout","_reducers","_initialState","addReducer","createStore","combineReducers","getStore","_isLoaded","scorePassword","_loadedPromise","_loadingPromise","tries","getReasonMessage","plain","expires","RedrawedBannedPage","BannedPage","changeState","rowWidth","padding","m","bytes","roundSize","toFixed","Component","rootElementId","connected","rootElement","finalComponent","int","min","max","childRoutes","onEnter","replaceState","browserHistory","array","EMAIL","USERNAME","requiredTermsOfService","requiredPrivacyPolicy","returnMessage","usernameMinLength","lengthMin","usernameMaxLength","lengthMax","usernameContent","webpackContext","req","webpackContextResolve","__webpack_require__","o","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","r","getter","__esModule","d","definition","defineProperty","enumerable","chunkId","reduce","promises","miniCssF","g","globalThis","Function","hmd","create","obj","prop","prototype","l","done","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","onerror","onload","doneFns","removeChild","bind","head","appendChild","Symbol","toStringTag","nmd","scriptUrl","importScripts","currentScript","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"misago.js","mappings":"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","sources":["webpack://misago/webpack/runtime/chunk loaded","webpack://misago/webpack/runtime/load script","webpack://misago/./src/components/FlexRow/FlexRow.jsx","webpack://misago/./src/components/FlexRow/FlexRowCol.jsx","webpack://misago/./src/components/FlexRow/FlexRowSection.jsx","webpack://misago/./src/components/PageContainer.jsx","webpack://misago/./src/components/PageHeader/PageHeader.jsx","webpack://misago/./src/components/PageHeader/PageHeaderBanner.jsx","webpack://misago/./src/components/PageHeader/PageHeaderContainer.jsx","webpack://misago/./src/components/PageHeader/PageHeaderDetails.jsx","webpack://misago/./src/components/PageHeader/PageHeaderHTMLMessage.jsx","webpack://misago/./src/components/PageHeader/PageHeaderMessage.jsx","webpack://misago/./src/components/PageHeader/PageHeaderPlain.jsx","webpack://misago/./src/components/RegisterLegalFootnote.js","webpack://misago/./src/components/StartSocialAuth.js","webpack://misago/./src/components/ThreadFlags.jsx","webpack://misago/./src/components/ThreadReplies.jsx","webpack://misago/./src/components/Toolbar/Toolbar.jsx","webpack://misago/./src/components/Toolbar/ToolbarItem.jsx","webpack://misago/./src/components/Toolbar/ToolbarSection.jsx","webpack://misago/./src/components/Toolbar/ToolbarSpacer.jsx","webpack://misago/./src/components/avatar.js","webpack://misago/./src/components/button.js","webpack://misago/./src/components/category-select.js","webpack://misago/./src/components/edit-details/blankslate.js","webpack://misago/./src/components/edit-details/loader.js","webpack://misago/./src/components/edit-details/field-input.js","webpack://misago/./src/components/edit-details/fieldset.js","webpack://misago/./src/components/edit-details/form.js","webpack://misago/./src/components/edit-details/index.js","webpack://misago/./src/components/form-group.js","webpack://misago/./src/components/form.js","webpack://misago/./src/components/li.js","webpack://misago/./src/components/loader.js","webpack://misago/./src/components/merge-conflict.js","webpack://misago/./src/services/one-box.js","webpack://misago/./src/components/misago-markup.js","webpack://misago/./src/components/modal-loader.js","webpack://misago/./src/components/modal-message.js","webpack://misago/./src/components/panel-loader.js","webpack://misago/./src/components/panel-message.js","webpack://misago/./src/components/post-feed/post/body.js","webpack://misago/./src/components/post-feed/post/header.js","webpack://misago/./src/components/post-feed/post/post-side/button.js","webpack://misago/./src/components/post-feed/post/post-side/anonymous.js","webpack://misago/./src/components/post-feed/post/post-side/user-title.js","webpack://misago/./src/components/post-feed/post/post-side/registered.js","webpack://misago/./src/components/post-feed/post/post-side/index.js","webpack://misago/./src/components/post-feed/post/index.js","webpack://misago/./src/components/post-feed/preview.js","webpack://misago/./src/components/post-feed/index.js","webpack://misago/./src/components/posting/PostingQuoteSelection.jsx","webpack://misago/./src/components/posting/getQuoteMarkup.js","webpack://misago/./src/components/posting/globalState.js","webpack://misago/./src/components/posting/utils/attachments.js","webpack://misago/./src/components/MarkupEditor/MarkupAttachmentModal.jsx","webpack://misago/./src/components/MarkupEditor/operations.js","webpack://misago/./src/components/MarkupEditor/MarkupEditorAttachment.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorAttachments.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorFooter.jsx","webpack://misago/./src/components/MarkupEditor/MarkupCodeModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupFormattingHelpModal.jsx","webpack://misago/./src/utils/is-url.js","webpack://misago/./src/components/MarkupEditor/MarkupImageModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupLinkModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupQuoteModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorButton.jsx","webpack://misago/./src/components/MarkupEditor/uploadFile.js","webpack://misago/./src/components/MarkupEditor/MarkupEditorToolbar.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditor.jsx","webpack://misago/./src/components/MarkupEditor/index.js","webpack://misago/./src/components/posting/PostingDialog.jsx","webpack://misago/./src/components/posting/PostingDialogBody.jsx","webpack://misago/./src/components/posting/PostingDialogError.jsx","webpack://misago/./src/components/posting/PostingDialogHeader.jsx","webpack://misago/./src/components/posting/PostingThreadOptions.jsx","webpack://misago/./src/components/posting/start.js","webpack://misago/./src/components/posting/utils/usernames.js","webpack://misago/./src/components/posting/start-private.js","webpack://misago/./src/components/posting/reply.js","webpack://misago/./src/components/posting/edit.js","webpack://misago/./src/components/posting/index.js","webpack://misago/./src/components/posting/utils/validators.js","webpack://misago/./src/components/select.js","webpack://misago/./src/components/sign-in.js","webpack://misago/./src/components/user-status.js","webpack://misago/./src/components/username-history/list-empty.js","webpack://misago/./src/components/username-history/change.js","webpack://misago/./src/components/username-history/list-ready.js","webpack://misago/./src/components/username-history/change-preview.js","webpack://misago/./src/components/username-history/list-preview.js","webpack://misago/./src/components/username-history/root.js","webpack://misago/./src/components/users-list/card/stats.js","webpack://misago/./src/components/users-list/card/user-title.js","webpack://misago/./src/components/users-list/card/index.js","webpack://misago/./src/components/users-list/preview/card.js","webpack://misago/./src/components/users-list/preview/index.js","webpack://misago/./src/components/users-list/index.js","webpack://misago/./src/components/with-dropdown.js","webpack://misago/./src/components/yes-no-switch.js","webpack://misago/./src/utils/ordered-list.js","webpack://misago/./src/index.js","webpack://misago/./src/initializers/ajax.js","webpack://misago/./src/initializers/auth-sync.js","webpack://misago/./src/initializers/auth.js","webpack://misago/./src/initializers/captcha.js","webpack://misago/./src/components/accept-agreement.js","webpack://misago/./src/initializers/components/accept-agreement.js","webpack://misago/./src/components/auth-message.js","webpack://misago/./src/initializers/components/auth-message.js","webpack://misago/./src/initializers/components/banned-page.js","webpack://misago/./src/components/categories/blankslate.js","webpack://misago/./src/components/categories/category/list-item/description.js","webpack://misago/./src/components/categories/category/list-item/icon.js","webpack://misago/./src/components/categories/category/list-item/main.js","webpack://misago/./src/components/categories/category/list-item/last-thread.js","webpack://misago/./src/components/categories/category/list-item/stats.js","webpack://misago/./src/components/categories/category/list-item/subcategories/list-item.js","webpack://misago/./src/components/categories/category/list-item/subcategories/index.js","webpack://misago/./src/components/categories/category/list-item/index.js","webpack://misago/./src/components/categories/category/index.js","webpack://misago/./src/components/categories/categories-list.js","webpack://misago/./src/components/categories/index.js","webpack://misago/./src/initializers/components/categories.js","webpack://misago/./src/components/options/navs.js","webpack://misago/./src/components/options/delete-account.js","webpack://misago/./src/components/options/edit-details.js","webpack://misago/./src/components/options/download-data.js","webpack://misago/./src/components/options/forum-options.js","webpack://misago/./src/components/options/change-username/form-loading.js","webpack://misago/./src/components/options/change-username/form-locked.js","webpack://misago/./src/components/options/change-username/form.js","webpack://misago/./src/components/options/change-username/root.js","webpack://misago/./src/components/options/sign-in-credentials/change-email.js","webpack://misago/./src/components/options/sign-in-credentials/change-password.js","webpack://misago/./src/components/options/sign-in-credentials/UnusablePasswordMessage.js","webpack://misago/./src/components/options/sign-in-credentials/root.js","webpack://misago/./src/components/options/root.js","webpack://misago/./src/initializers/components/options.js","webpack://misago/./src/components/profile/ban-details.js","webpack://misago/./src/components/profile/details/form.js","webpack://misago/./src/components/profile/details/empty-message.js","webpack://misago/./src/components/profile/details/field-value.js","webpack://misago/./src/components/profile/details/field.js","webpack://misago/./src/components/profile/details/group.js","webpack://misago/./src/components/profile/details/groups-list.js","webpack://misago/./src/components/profile/details/header.js","webpack://misago/./src/data/profile-details.js","webpack://misago/./src/components/profile/details/index.js","webpack://misago/./src/components/profile/feed/route.js","webpack://misago/./src/components/quick-search.js","webpack://misago/./src/components/profile/followers.js","webpack://misago/./src/components/profile/username-history.js","webpack://misago/./src/components/profile/follow-button.js","webpack://misago/./src/components/profile/message-button.js","webpack://misago/./src/components/profile/moderation/avatar-controls.js","webpack://misago/./src/components/profile/moderation/change-username.js","webpack://misago/./src/components/profile/moderation/delete-account.js","webpack://misago/./src/components/profile/moderation/nav.js","webpack://misago/./src/components/profile/ProfileDataList.jsx","webpack://misago/./src/components/profile/ProfileHeader.jsx","webpack://misago/./src/components/profile/ProfileNav.js","webpack://misago/./src/components/profile/root.js","webpack://misago/./src/components/profile/feed/index.js","webpack://misago/./src/components/profile/follows.js","webpack://misago/./src/initializers/components/profile.js","webpack://misago/./src/components/request-activation-link.js","webpack://misago/./src/initializers/components/request-activation-link.js","webpack://misago/./src/components/request-password-reset.js","webpack://misago/./src/initializers/components/request-password-reset.js","webpack://misago/./src/components/reset-password-form.js","webpack://misago/./src/initializers/components/reset-password-form.js","webpack://misago/./src/components/search/form.js","webpack://misago/./src/components/search/sidenav.js","webpack://misago/./src/components/search/page.js","webpack://misago/./src/components/search/threads/results.js","webpack://misago/./src/components/search/threads/index.js","webpack://misago/./src/components/search/users/index.js","webpack://misago/./src/components/search/index.js","webpack://misago/./src/initializers/components/search.js","webpack://misago/./src/components/snackbar.js","webpack://misago/./src/initializers/components/snackbar.js","webpack://misago/./src/components/social-auth/header.js","webpack://misago/./src/components/social-auth/register.js","webpack://misago/./src/components/social-auth/complete.js","webpack://misago/./src/components/social-auth/index.js","webpack://misago/./src/initializers/components/social-auth.js","webpack://misago/./src/components/add-participant.js","webpack://misago/./src/components/participants/add-participant.js","webpack://misago/./src/components/participants/cards-list/make-owner.js","webpack://misago/./src/components/participants/cards-list/actions.js","webpack://misago/./src/components/participants/cards-list/remove.js","webpack://misago/./src/components/participants/cards-list/card.js","webpack://misago/./src/components/participants/cards-list/index.js","webpack://misago/./src/components/participants/index.js","webpack://misago/./src/components/participants/utils.js","webpack://misago/./src/components/poll/results/chart.js","webpack://misago/./src/components/poll/results/modal.js","webpack://misago/./src/components/poll/results/options.js","webpack://misago/./src/components/poll/info.js","webpack://misago/./src/components/poll/results/index.js","webpack://misago/./src/components/poll/voting/help.js","webpack://misago/./src/components/poll/voting/select.js","webpack://misago/./src/components/poll/voting/utils.js","webpack://misago/./src/components/poll/voting/index.js","webpack://misago/./src/components/poll/poll.js","webpack://misago/./src/components/poll/form/choices-control.js","webpack://misago/./src/components/poll/form/index.js","webpack://misago/./src/components/posts-list/event/icon.js","webpack://misago/./src/components/posts-list/event/controls.js","webpack://misago/./src/components/posts-list/event/info.js","webpack://misago/./src/components/posts-list/event/message.js","webpack://misago/./src/components/posts-list/event/unread-label.js","webpack://misago/./src/components/posts-list/waypoint.js","webpack://misago/./src/components/posts-list/event/index.js","webpack://misago/./src/components/posts-list/post/attachments/attachment.js","webpack://misago/./src/components/posts-list/post/attachments/index.js","webpack://misago/./src/components/posts-list/post/body.js","webpack://misago/./src/components/posts-list/post/flags.js","webpack://misago/./src/components/posts-list/post/controls/actions.js","webpack://misago/./src/components/post-likes.js","webpack://misago/./src/components/posts-list/post/footer.js","webpack://misago/./src/components/posts-list/post/controls/move.js","webpack://misago/./src/components/post-changelog/diff.js","webpack://misago/./src/components/post-changelog/footer.js","webpack://misago/./src/components/post-changelog/toolbar.js","webpack://misago/./src/components/post-changelog/utils.js","webpack://misago/./src/components/post-changelog/index.js","webpack://misago/./src/components/posts-list/post/controls/split.js","webpack://misago/./src/components/posts-list/post/controls/dropdown.js","webpack://misago/./src/components/posts-list/post/controls/index.js","webpack://misago/./src/components/posts-list/post/select.js","webpack://misago/./src/components/posts-list/post/header.js","webpack://misago/./src/components/posts-list/post/post-side/anonymous.js","webpack://misago/./src/components/posts-list/post/post-side/has-visible-title.js","webpack://misago/./src/components/posts-list/post/post-side/user-postcount.js","webpack://misago/./src/components/posts-list/post/post-side/user-status.js","webpack://misago/./src/components/posts-list/post/post-side/user-title.js","webpack://misago/./src/components/posts-list/post/post-side/registered.js","webpack://misago/./src/components/posts-list/post/post-side/index.js","webpack://misago/./src/components/posts-list/post/index.js","webpack://misago/./src/components/posts-list/post/preview.js","webpack://misago/./src/components/posts-list/index.js","webpack://misago/./src/components/ThreadStarterCard.jsx","webpack://misago/./src/components/thread/moderation/thread/ThreadChangeTitleModal.jsx","webpack://misago/./src/components/thread/moderation/thread/merge.js","webpack://misago/./src/components/thread/moderation/thread/move.js","webpack://misago/./src/components/thread/moderation/thread/controls.js","webpack://misago/./src/components/thread/moderation/thread/index.js","webpack://misago/./src/components/thread/ThreadModeration.jsx","webpack://misago/./src/components/thread/ThreadSubscriptionButton.jsx","webpack://misago/./src/components/Breadcrumbs/Breadcrumbs.jsx","webpack://misago/./src/components/Breadcrumbs/BreadcrumbsCategory.jsx","webpack://misago/./src/components/Breadcrumbs/BreadcrumbsRootCategory.jsx","webpack://misago/./src/components/thread/ThreadHeader/ThreadHeaderBreadcrumbs.jsx","webpack://misago/./src/components/thread/ThreadHeader/ThreadHeader.jsx","webpack://misago/./src/components/thread/ThreadHeader/index.js","webpack://misago/./src/components/thread/ThreadPagination.jsx","webpack://misago/./src/components/thread/ThreadPostsLeft.jsx","webpack://misago/./src/components/thread/moderation/posts/errors-list.js","webpack://misago/./src/components/thread/moderation/posts/actions.js","webpack://misago/./src/components/thread/moderation/posts/move.js","webpack://misago/./src/components/thread/moderation/posts/split.js","webpack://misago/./src/components/thread/moderation/posts/dropdown.js","webpack://misago/./src/components/thread/ThreadPostsModeration.jsx","webpack://misago/./src/components/thread/ThreadReplyButton.jsx","webpack://misago/./src/components/thread/ThreadToolbarBottom.jsx","webpack://misago/./src/components/thread/ThreadPollButton.jsx","webpack://misago/./src/components/thread/ThreadShortcutsButton.jsx","webpack://misago/./src/components/thread/ThreadToolbarTop.jsx","webpack://misago/./src/components/thread/route.js","webpack://misago/./src/components/thread/root.js","webpack://misago/./src/initializers/components/thread.js","webpack://misago/./src/components/threads/compare.js","webpack://misago/./src/components/threads/ThreadsCategoryPicker.jsx","webpack://misago/./src/components/threads/ThreadsListPicker.jsx","webpack://misago/./src/components/threads/moderation/errors-list.js","webpack://misago/./src/components/threads/moderation/merge.js","webpack://misago/./src/components/threads/moderation/move.js","webpack://misago/./src/components/threads/moderation/controls.js","webpack://misago/./src/components/threads/ThreadsToolbarModeration.jsx","webpack://misago/./src/components/threads/ThreadsToolbar.jsx","webpack://misago/./src/components/threads/container.js","webpack://misago/./src/components/threads/utils.js","webpack://misago/./src/components/ThreadsList/ThreadsListEmpty.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemActivity.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemCategory.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemCheckbox.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemIcon.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemLastPoster.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemSubscriptionOptions.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemSubscription.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItem.jsx","webpack://misago/./src/components/UIPreview/UIPreviewText.js","webpack://misago/./src/components/ThreadsList/ThreadsListLoader.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListUpdatePrompt.jsx","webpack://misago/./src/components/ThreadsList/index.js","webpack://misago/./src/components/ThreadsList/ThreadsList.jsx","webpack://misago/./src/components/threads/route.js","webpack://misago/./src/components/threads/root.js","webpack://misago/./src/initializers/components/threads.js","webpack://misago/./src/components/navbar-search/clean-results.js","webpack://misago/./src/components/navbar-search/dropdown/constants.js","webpack://misago/./src/components/navbar-search/dropdown/input.js","webpack://misago/./src/components/navbar-search/dropdown/dropdown-menu.js","webpack://misago/./src/components/navbar-search/dropdown/empty.js","webpack://misago/./src/components/navbar-search/dropdown/loader.js","webpack://misago/./src/components/navbar-search/dropdown/result/footer.js","webpack://misago/./src/components/navbar-search/dropdown/result/header.js","webpack://misago/./src/components/navbar-search/dropdown/result/thread.js","webpack://misago/./src/components/navbar-search/dropdown/result/user.js","webpack://misago/./src/components/navbar-search/dropdown/result/result.js","webpack://misago/./src/components/navbar-search/dropdown/result/index.js","webpack://misago/./src/components/navbar-search/dropdown/flatten-results.js","webpack://misago/./src/components/navbar-search/dropdown/index.js","webpack://misago/./src/components/navbar-search/index.js","webpack://misago/./src/components/password-strength.js","webpack://misago/./src/components/register.js","webpack://misago/./src/components/register-button.js","webpack://misago/./src/components/user-menu/guest-nav.js","webpack://misago/./src/components/change-avatar/index.js","webpack://misago/./src/components/change-avatar/crop.js","webpack://misago/./src/components/change-avatar/upload.js","webpack://misago/./src/components/change-avatar/gallery.js","webpack://misago/./src/components/change-avatar/root.js","webpack://misago/./src/components/user-menu/user-nav.js","webpack://misago/./src/components/user-menu/root.js","webpack://misago/./src/initializers/components/user-menu.js","webpack://misago/./src/components/users/UsersNav.js","webpack://misago/./src/components/users/active-posters/list-empty.js","webpack://misago/./src/components/users/active-posters/list-item-preview.js","webpack://misago/./src/components/users/active-posters/list-preview.js","webpack://misago/./src/components/users/active-posters/list-item.js","webpack://misago/./src/components/users/active-posters/list-ready.js","webpack://misago/./src/components/users/active-posters/root.js","webpack://misago/./src/components/page-lead.js","webpack://misago/./src/utils/string-count.js","webpack://misago/./src/components/users/rank/RankUsersList.js","webpack://misago/./src/components/users/rank/RankUsersListLoader.js","webpack://misago/./src/components/users/rank/RankUsersLeft.jsx","webpack://misago/./src/components/users/rank/RankUsersPagination.jsx","webpack://misago/./src/components/users/rank/RankUsersToolbar.jsx","webpack://misago/./src/components/users/rank/root.js","webpack://misago/./src/components/users/root.js","webpack://misago/./src/initializers/components/users.js","webpack://misago/./src/initializers/include.js","webpack://misago/./src/initializers/local-storage.js","webpack://misago/./src/initializers/mobile-navbar-dropdown.js","webpack://misago/./src/initializers/modal.js","webpack://misago/./src/initializers/moment-locale.js","webpack://misago/./src/initializers/page-title.js","webpack://misago/./src/initializers/polls.js","webpack://misago/./src/initializers/posting.js","webpack://misago/./src/initializers/reducers/auth.js","webpack://misago/./src/initializers/reducers/participants.js","webpack://misago/./src/initializers/reducers/poll.js","webpack://misago/./src/initializers/reducers/posts.js","webpack://misago/./src/initializers/reducers/profile-details.js","webpack://misago/./src/initializers/reducers/profile-hydrate.js","webpack://misago/./src/initializers/reducers/profile.js","webpack://misago/./src/initializers/reducers/search.js","webpack://misago/./src/initializers/reducers/selection.js","webpack://misago/./src/initializers/reducers/snackbar.js","webpack://misago/./src/initializers/reducers/thread.js","webpack://misago/./src/initializers/reducers/threads.js","webpack://misago/./src/initializers/reducers/tick.js","webpack://misago/./src/initializers/reducers/username-history.js","webpack://misago/./src/initializers/reducers/users.js","webpack://misago/./src/initializers/snackbar.js","webpack://misago/./src/initializers/store.js","webpack://misago/./src/initializers/tick-start.js","webpack://misago/./src/initializers/zxcvbn.js","webpack://misago/./src/reducers/auth.js","webpack://misago/./src/reducers/participants.js","webpack://misago/./src/reducers/poll.js","webpack://misago/./src/reducers/post.js","webpack://misago/./src/reducers/posts.js","webpack://misago/./src/reducers/profile-details.js","webpack://misago/./src/reducers/profile.js","webpack://misago/./src/reducers/search.js","webpack://misago/./src/reducers/selection.js","webpack://misago/./src/reducers/snackbar.js","webpack://misago/./src/reducers/thread.js","webpack://misago/./src/reducers/threads.js","webpack://misago/./src/reducers/tick.js","webpack://misago/./src/reducers/username-history.js","webpack://misago/./src/reducers/users.js","webpack://misago/./src/services/ajax.js","webpack://misago/./src/services/auth.js","webpack://misago/./src/services/captcha.js","webpack://misago/./src/services/include.js","webpack://misago/./src/services/local-storage.js","webpack://misago/./src/services/mobile-navbar-dropdown.js","webpack://misago/./src/services/modal.js","webpack://misago/./src/services/page-title.js","webpack://misago/./src/services/polls.js","webpack://misago/./src/services/posting.js","webpack://misago/./src/services/snackbar.js","webpack://misago/./src/services/store.js","webpack://misago/./src/services/zxcvbn.js","webpack://misago/./src/components/banned-page.js","webpack://misago/./src/utils/banned-page.js","webpack://misago/./src/utils/batch.js","webpack://misago/./src/utils/concat-unique.js","webpack://misago/./src/utils/escape-html.js","webpack://misago/./src/utils/file-size.js","webpack://misago/./src/utils/mount-component.js","webpack://misago/./src/utils/random.js","webpack://misago/./src/utils/routed-component.js","webpack://misago/./src/utils/sets.js","webpack://misago/./src/utils/validators.js","webpack://misago/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://misago/webpack/bootstrap","webpack://misago/webpack/runtime/compat get default export","webpack://misago/webpack/runtime/define property getters","webpack://misago/webpack/runtime/ensure chunk","webpack://misago/webpack/runtime/get javascript chunk filename","webpack://misago/webpack/runtime/get mini-css chunk filename","webpack://misago/webpack/runtime/global","webpack://misago/webpack/runtime/harmony module decorator","webpack://misago/webpack/runtime/hasOwnProperty shorthand","webpack://misago/webpack/runtime/make namespace object","webpack://misago/webpack/runtime/node module decorator","webpack://misago/webpack/runtime/publicPath","webpack://misago/webpack/runtime/jsonp chunk loading","webpack://misago/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"misago:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRow = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default FlexRow\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowCol = ({ children, className, shrink }) => (\n \n {children}\n
    \n)\n\nexport default FlexRowCol\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowSection = ({ auto, children, className }) => (\n \n {children}\n
    \n)\n\nexport default FlexRowSection\n","import React from \"react\"\n\nconst PageContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeader = ({ children, className, styleName }) => (\n \n
    \n
    \n
    \n {children}\n
    \n
    \n
    \n)\n\nexport default PageHeader\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderBanner = ({ children, className, styleName }) => (\n \n
    \n
    {children}
    \n
    \n \n)\n\nexport default PageHeaderBanner\n","import React from \"react\"\n\nconst PageHeaderContainer = ({ children }) => (\n
    {children}
    \n)\n\nexport default PageHeaderContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderDetails = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default PageHeaderDetails\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderHTMLMessage = ({ className, message }) => (\n \n)\n\nexport default PageHeaderHTMLMessage\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderMessage = ({ children, className }) => (\n
    {children}
    \n)\n\nexport default PageHeaderMessage\n","import React from \"react\"\nimport PageHeader from \"./PageHeader\"\nimport PageHeaderBanner from \"./PageHeaderBanner\"\nimport PageHeaderContainer from \"./PageHeaderContainer\"\nimport PageHeaderDetails from \"./PageHeaderDetails\"\n\nconst PageHeaderPlain = ({ styleName, header, message }) => (\n \n \n \n

    {header}

    \n
    \n {message && (\n {message}\n )}\n
    \n
    \n)\n\nexport default PageHeaderPlain\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst AGREEMENT_URL = '%(agreement)s'\n\nconst RegisterLegalFootnote = (props) => {\n const {\n errors,\n privacyPolicy,\n termsOfService,\n onPrivacyPolicyChange,\n onTermsOfServiceChange,\n } = props\n\n const termsOfServiceId = misago.get(\"TERMS_OF_SERVICE_ID\")\n const termsOfServiceUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n\n const privacyPolicyId = misago.get(\"PRIVACY_POLICY_ID\")\n const privacyPolicyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n\n if (!termsOfServiceId && !privacyPolicyId) return null\n\n return (\n
    \n \n \n
    \n )\n}\n\nconst LegalAgreement = (props) => {\n const { agreement, checked, errors, url, value, onChange } = props\n\n if (!url) return null\n\n const agreementHtml = interpolate(\n AGREEMENT_URL,\n { agreement: escapeHtml(agreement), url: escapeHtml(url) },\n true\n )\n const label = interpolate(\n gettext(\"I have read and accept %(agreement)s.\"),\n { agreement: agreementHtml },\n true\n )\n\n return (\n
    \n \n {errors &&\n errors.map((error, i) => (\n
    \n {error}\n
    \n ))}\n
    \n )\n}\n\nexport default RegisterLegalFootnote\n","import React from \"react\"\nimport misago from \"misago\"\n\nconst StartSocialAuth = (props) => {\n const { buttonClassName, buttonLabel, formLabel, header, labelClassName } =\n props\n const socialAuth = misago.get(\"SOCIAL_AUTH\")\n\n if (socialAuth.length === 0) return null\n\n return (\n
    \n \n
    \n {socialAuth.map(({ pk, name, button_text, button_color, url }) => {\n const className = \"btn btn-block btn-default btn-social-\" + pk\n const style = button_color ? { color: button_color } : null\n const finalButtonLabel =\n button_text || interpolate(buttonLabel, { site: name }, true)\n\n return (\n \n )\n })}\n
    \n
    \n \n
    \n )\n}\n\nconst FormHeader = ({ className, text }) => {\n if (!text) return null\n return
    {text}
    \n}\n\nexport default StartSocialAuth\n","import React from \"react\"\n\nconst ThreadFlags = ({ thread }) => (\n
      \n {thread.weight == 2 && (\n \n bookmark\n \n )}\n {thread.weight == 1 && (\n \n bookmark_outline\n \n )}\n {thread.best_answer && (\n
    • \n check_circle\n
    • \n )}\n {thread.has_poll && (\n
    • \n poll\n
    • \n )}\n {(thread.is_unapproved || thread.has_unapproved_posts) && (\n \n visibility\n \n )}\n {thread.is_closed && (\n
    • \n lock\n
    • \n )}\n {thread.is_hidden && (\n
    • \n visibility_off\n
    • \n )}\n
    \n)\n\nexport default ThreadFlags\n","import React from \"react\"\n\nconst ThreadReplies = ({ thread }) => (\n \n chat_bubble_outline\n {thread.replies > 980\n ? Math.round(thread.replies / 1000) + \"K\"\n : thread.replies}\n \n)\n\nexport default ThreadReplies\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Toolbar = ({ children, className }) => (\n \n)\n\nexport default Toolbar\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarItem = ({ children, className, shrink }) => (\n \n {children}\n \n)\n\nexport default ToolbarItem\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSection = ({ auto, children, className }) => (\n \n {children}\n \n)\n\nexport default ToolbarSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSpacer = ({ className }) => (\n
    \n)\n\nexport default ToolbarSpacer\n","import React from \"react\"\nimport misago from \"misago\"\n\nexport default function (props) {\n const size = props.size || 100\n const size2x = props.size2x || size\n\n return (\n \n )\n}\n\nexport function getSrc(user, size) {\n if (user && user.id) {\n // just avatar hash, size and user id\n return resolveAvatarForSize(user.avatars, size).url\n } else {\n // just append avatar size to file to produce no-avatar placeholder\n return misago.get(\"BLANK_AVATAR_URL\")\n }\n}\n\nexport function resolveAvatarForSize(avatars, size) {\n let avatar = avatars[0]\n avatars.forEach((av) => {\n if (av.size >= size) {\n avatar = av\n }\n })\n return avatar\n}\n","import React from \"react\"\nimport Loader from \"./loader\"\n\nexport default class Button extends React.Component {\n render() {\n let className = \"btn \" + this.props.className\n let disabled = this.props.disabled\n\n if (this.props.loading) {\n className += \" btn-loading\"\n disabled = true\n }\n\n return (\n \n {this.props.children}\n {this.props.loading ? : null}\n \n )\n }\n}\n\nButton.defaultProps = {\n className: \"btn-default\",\n\n type: \"submit\",\n\n loading: false,\n disabled: false,\n\n onClick: null,\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n \n {props.choices.map((item) => {\n return (\n \n {\"- - \".repeat(item.level) + item.label}\n \n )\n })}\n \n )\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ display }) {\n if (!display) return null\n\n return (\n
    \n \n
    \n )\n}\n","import React from \"react\"\nimport Select from \"misago/components/select\"\n\nexport default class extends React.Component {\n onChange = (ev) => {\n const { field, onChange } = this.props\n onChange(field.fieldname, ev.target.value)\n }\n\n render() {\n const { disabled, field, value } = this.props\n const { input } = field\n\n if (input.type === \"select\") {\n return (\n \n )\n }\n\n if (input.type === \"textarea\") {\n return (\n \n )\n }\n\n if (input.type === \"text\") {\n return (\n \n )\n }\n\n return null\n }\n}\n","import React from \"react\"\nimport FieldInput from \"./field-input\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport default function ({ disabled, errors, fields, name, onChange, value }) {\n return (\n
    \n {name}\n {fields.map((field) => {\n return (\n \n \n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Fieldset from \"./fieldset\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n errors: {},\n }\n\n const groups = props.groups.length\n for (let i = 0; i < groups; i++) {\n const group = props.groups[i]\n const fields = group.fields.length\n for (let f = 0; f < fields; f++) {\n const fieldname = group.fields[f].fieldname\n const initial = group.fields[f].initial\n this.state[fieldname] = initial\n }\n }\n }\n\n send() {\n const data = Object.assign({}, this.state, {\n errors: null,\n isLoading: null,\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess(data) {\n this.props.onSuccess(data)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({ errors: rejection })\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onChange = (name, value) => {\n this.setState({\n [name]: value,\n })\n }\n\n render() {\n return (\n
    \n
    \n {this.props.groups.map((group, i) => {\n return (\n \n )\n })}\n
    \n
    \n {\" \"}\n \n
    \n
    \n )\n }\n}\n\nexport function CancelButton({ onCancel, disabled }) {\n if (!onCancel) return null\n\n return (\n \n {gettext(\"Cancel\")}\n \n )\n}\n","import React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport Loader from \"./loader\"\nimport Form from \"./form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n loading: true,\n groups: null,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.api).then(\n (groups) => {\n this.setState({\n loading: false,\n\n groups,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n if (this.props.cancel) {\n this.props.cancel()\n }\n }\n )\n }\n\n render() {\n const { groups, loading } = this.state\n\n return (\n
    \n
    \n

    {gettext(\"Edit details\")}

    \n
    \n \n \n \n
    \n )\n }\n}\n\nexport function FormDisplay({ api, display, groups, onCancel, onSuccess }) {\n if (!display) return null\n\n return (\n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isValidated() {\n return typeof this.props.validation !== \"undefined\"\n }\n\n getClassName() {\n let className = \"form-group\"\n if (this.isValidated()) {\n className += \" has-feedback\"\n if (this.props.validation === null) {\n className += \" has-success\"\n } else {\n className += \" has-error\"\n }\n }\n return className\n }\n\n getFeedback() {\n if (this.props.validation) {\n return (\n
    \n {this.props.validation.map((error, i) => {\n return

    {error}

    \n })}\n
    \n )\n } else {\n return null\n }\n }\n\n getFeedbackDescription() {\n if (this.isValidated()) {\n return (\n \n {this.props.validation ? gettext(\"(error)\") : gettext(\"(success)\")}\n \n )\n } else {\n return null\n }\n }\n\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n \n {this.props.label + \":\"}\n \n
    \n {this.props.children}\n {this.getFeedbackDescription()}\n {this.getFeedback()}\n {this.getHelpText()}\n {this.props.extra || null}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { required } from \"misago/utils/validators\"\nimport snackbar from \"misago/services/snackbar\"\n\nlet validateRequired = required()\n\nexport default class extends React.Component {\n validate() {\n let errors = {}\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: this.state.validators.required || this.state.validators,\n optional: this.state.validators.optional || {},\n }\n\n let validatedFields = []\n\n // add required fields to validation\n for (let name in validators.required) {\n if (\n validators.required.hasOwnProperty(name) &&\n validators.required[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // add optional fields to validation\n for (let name in validators.optional) {\n if (\n validators.optional.hasOwnProperty(name) &&\n validators.optional[name]\n ) {\n validatedFields.push(name)\n }\n }\n\n // validate fields values\n for (let i in validatedFields) {\n let name = validatedFields[i]\n let fieldErrors = this.validateField(name, this.state[name])\n\n if (fieldErrors === null) {\n errors[name] = null\n } else if (fieldErrors) {\n errors[name] = fieldErrors\n }\n }\n\n return errors\n }\n\n isValid() {\n let errors = this.validate()\n for (let field in errors) {\n if (errors.hasOwnProperty(field)) {\n if (errors[field] !== null) {\n return false\n }\n }\n }\n\n return true\n }\n\n validateField(name, value) {\n let errors = []\n if (!this.state.validators) {\n return errors\n }\n\n let validators = {\n required: (this.state.validators.required || this.state.validators)[name],\n optional: (this.state.validators.optional || {})[name],\n }\n\n let requiredError = validateRequired(value) || false\n\n if (validators.required) {\n if (requiredError) {\n errors = [requiredError]\n } else {\n for (let i in validators.required) {\n let validationError = validators.required[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n }\n\n return errors.length ? errors : null\n } else if (requiredError === false && validators.optional) {\n for (let i in validators.optional) {\n let validationError = validators.optional[i](value)\n if (validationError) {\n errors.push(validationError)\n }\n }\n\n return errors.length ? errors : null\n }\n\n return false // false === field wasn't validated\n }\n\n bindInput = (name) => {\n return (event) => {\n this.changeValue(name, event.target.value)\n }\n }\n\n changeValue = (name, value) => {\n let newState = {\n [name]: value,\n }\n\n const formErrors = this.state.errors || {}\n formErrors[name] = this.validateField(name, newState[name])\n newState.errors = formErrors\n\n this.setState(newState)\n }\n\n clean() {\n return true\n }\n\n send() {\n return null\n }\n\n handleSuccess(success) {\n return\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n }\n\n handleSubmit = (event) => {\n // we don't reload page on submissions\n if (event) {\n event.preventDefault()\n }\n\n if (this.state.isLoading) {\n return\n }\n\n if (this.clean()) {\n this.setState({ isLoading: true })\n let promise = this.send()\n\n if (promise) {\n promise.then(\n (success) => {\n this.setState({ isLoading: false })\n this.handleSuccess(success)\n },\n (rejection) => {\n this.setState({ isLoading: false })\n this.handleError(rejection)\n }\n )\n } else {\n this.setState({ isLoading: false })\n }\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n isActive() {\n if (this.props.isControlled) {\n return this.props.isActive\n } else {\n if (this.props.path) {\n return document.location.pathname.indexOf(this.props.path) === 0\n } else {\n return false\n }\n }\n }\n\n getClassName() {\n if (this.isActive()) {\n return (\n (this.props.className || \"\") +\n \" \" +\n (this.props.activeClassName || \"active\")\n )\n } else {\n return this.props.className || \"\"\n }\n }\n\n render() {\n return
  • {this.props.children}
  • \n }\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"./button\"\nimport Form from \"./form\"\nimport FormGroup from \"./form-group\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n bestAnswer: \"0\",\n poll: \"0\",\n }\n }\n\n clean() {\n if (this.props.polls && this.state.poll === \"0\") {\n const confirmation = window.confirm(\n gettext(\"Are you sure you want to delete all polls?\")\n )\n return confirmation\n }\n\n return true\n }\n\n send() {\n const data = Object.assign({}, this.props.data, {\n best_answer: this.state.bestAnswer,\n poll: this.state.poll,\n })\n\n return ajax.post(this.props.api, data)\n }\n\n handleSuccess = (success) => {\n this.props.onSuccess(success)\n modal.hide()\n }\n\n handleError = (rejection) => {\n this.props.onError(rejection)\n }\n\n onBestAnswerChange = (event) => {\n this.changeValue(\"bestAnswer\", event.target.value)\n }\n\n onPollChange = (event) => {\n this.changeValue(\"poll\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Merge threads\")}

    \n
    \n \n
    \n \n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n \n
    \n
    \n )\n }\n}\n\nexport function BestAnswerSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map((choice) => {\n return (\n \n )\n })}\n \n \n )\n}\n\nexport function PollSelect({ choices, onChange, value }) {\n if (!choices) return null\n\n return (\n \n \n {choices.map((choice) => {\n return (\n \n )\n })}\n \n \n )\n}\n","const ytRegExp = new RegExp(\n \"^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*\"\n)\n\nexport class OneBox {\n constructor() {\n this._youtube = {}\n }\n\n render = (element) => {\n if (!element) return\n this.highlightCode(element)\n this.embedYoutubePlayers(element)\n }\n\n highlightCode(element) {\n import(\"highlight\").then(({ default: hljs }) => {\n const codeblocks = element.querySelectorAll(\"pre>code\")\n for (let i = 0; i < codeblocks.length; i++) {\n hljs.highlightElement(codeblocks[i])\n }\n })\n }\n\n embedYoutubePlayers(element) {\n const anchors = element.querySelectorAll(\"p>a\")\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i]\n const p = a.parentNode\n const onlyChild = p.childNodes.length === 1\n\n if (!this._youtube[a.href]) {\n this._youtube[a.href] = parseYoutubeUrl(a.href)\n }\n\n const youtubeMovie = this._youtube[a.href]\n if (onlyChild && !!youtubeMovie && youtubeMovie.data !== false) {\n this.swapYoutubePlayer(a, youtubeMovie)\n }\n }\n }\n\n swapYoutubePlayer(element, youtube) {\n let url = \"https://www.youtube.com/embed/\"\n url += youtube.video\n url += \"?feature=oembed\"\n if (youtube.start) {\n url += \"&start=\" + youtube.start\n }\n\n const player = $(\n '\"\n )\n $(element).replaceWith(player)\n player.wrap('
    ')\n }\n}\n\nexport default new OneBox()\n\nexport function parseYoutubeUrl(url) {\n const cleanedUrl = cleanUrl(url)\n const video = getVideoIdFromUrl(cleanedUrl)\n\n if (!video) return null\n\n let start = 0\n if (cleanedUrl.indexOf(\"?\") > 0) {\n const query = cleanedUrl.substr(cleanedUrl.indexOf(\"?\") + 1)\n const timebit = query.split(\"&\").filter((i) => {\n return i.substr(0, 2) === \"t=\"\n })[0]\n\n if (timebit) {\n const bits = timebit.substr(2).split(\"m\")\n if (bits[0].substr(-1) === \"s\") {\n start += parseInt(bits[0].substr(0, bits[0].length - 1))\n } else {\n start += parseInt(bits[0]) * 60\n if (!!bits[1] && bits[1].substr(-1) === \"s\") {\n start += parseInt(bits[1].substr(0, bits[1].length - 1))\n }\n }\n }\n }\n\n return {\n start,\n video,\n }\n}\n\nexport function cleanUrl(url) {\n let clean = url\n\n if (url.substr(0, 8) === \"https://\") {\n clean = clean.substr(8)\n } else if (url.substr(0, 7) === \"http://\") {\n clean = clean.substr(7)\n }\n\n if (clean.substr(0, 4) === \"www.\") {\n clean = clean.substr(4)\n }\n\n return clean\n}\n\nexport function getVideoIdFromUrl(url) {\n if (url.indexOf(\"youtu\") === -1) return null\n\n const video = url.match(ytRegExp)\n if (video) {\n return video[1]\n }\n return null\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport onebox from \"misago/services/one-box\"\n\nexport default class extends React.Component {\n componentDidMount() {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n componentDidUpdate(prevProps, prevState) {\n onebox.render(this.documentNode)\n $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n return nextProps.markup !== this.props.markup\n }\n\n render() {\n return (\n {\n this.documentNode = node\n }}\n />\n )\n }\n}\n\nfunction revealSpoiler(event) {\n var btn = event.target\n $(btn).parent().parent().addClass(\"revealed\")\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends PanelMessage {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n \n {gettext(\"Ok\")}\n \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getHelpText() {\n if (this.props.helpText) {\n return

    {this.props.helpText}

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n \n {this.props.icon || \"info_outline\"}\n \n
    \n
    \n

    {this.props.message}

    \n {this.getHelpText()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\n\nexport default function (props) {\n if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default(props) {\n return (\n
    \n \n
    \n )\n}\n\nexport function Invalid(props) {\n return (\n
    \n

    \n {gettext(\"This post's contents cannot be displayed.\")}\n

    \n

    \n {gettext(\"This error is caused by invalid post content manipulation.\")}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n const { category, thread } = post\n\n const tooltip = interpolate(\n gettext(\"posted %(posted_on)s\"),\n {\n posted_on: post.posted_on.format(\"LL, LT\"),\n },\n true\n )\n\n return (\n
    \n \n {thread.title}\n \n \n {category.name}\n \n \n {post.posted_on.fromNow()}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n return (\n \n {gettext(\"See post\")}\n chevron_right\n \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\n\nexport default function ({ post }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n
    \n
    \n {post.poster_name}\n
    \n \n {gettext(\"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, poster }) {\n return (\n
    \n \n
    \n
    \n \n \n \n
    \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Anonymous from \"./anonymous\"\nimport Registered from \"./registered\"\n\nexport default function ({ post, poster }) {\n if (poster && poster.id) {\n return \n }\n\n return \n}\n","import React from \"react\"\nimport Body from \"./body\"\nimport Header from \"./header\"\nimport PostSide from \"./post-side\"\n\nexport default function ({ post, poster }) {\n const user = poster || post.poster\n\n let className = \"post\"\n if (user && user.rank.css_class) {\n className += \" post-\" + user.rank.css_class\n }\n\n return (\n
  • \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default function () {\n return (\n
      \n
    • \n
      \n
      \n
      \n
      \n
      \n
      \n \n \n \n
      \n
      \n
      \n \n \n  \n \n \n
      \n \n \n  \n \n \n
      \n
      \n
      \n
      \n \n  \n \n
      \n
      \n
      \n

      \n \n  \n \n  \n \n  \n \n  \n \n  \n \n

      \n
      \n
      \n
      \n
      \n
      \n
    • \n
    \n )\n}\n","import React from \"react\"\nimport Post from \"./post\"\nimport Preview from \"./preview\"\n\nexport default function ({ isReady, posts, poster }) {\n if (!isReady) {\n return \n }\n\n return (\n
      \n {posts.map((post) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport posting from \"../../services/posting\"\nimport { getGlobalState, getQuoteMarkup } from \"../posting\"\n\nexport default class PostingQuoteSelection extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n range: null,\n rect: null,\n }\n\n this.element = null\n }\n\n selected = () => {\n if (this.element) {\n const range = getQuoteSelection(this.element) || null\n const rect = range ? range.getBoundingClientRect() : null\n\n this.setState({ range, rect })\n }\n }\n\n reply = () => {\n if (!posting.isOpen()) {\n const content = getQuoteMarkup(this.state.range)\n posting.open(Object.assign({}, this.props.posting, { default: content }))\n\n this.setState({ range: null, rect: null })\n\n window.setTimeout(focusEditor, 1000)\n } else {\n const globalState = getGlobalState()\n if (globalState && !globalState.disabled) {\n globalState.quote(getQuoteMarkup(this.state.range))\n this.setState({ range: null, rect: null })\n focusEditor()\n }\n }\n }\n\n render = () => (\n
    \n {\n if (element) {\n this.element = element\n }\n }}\n onMouseUp={this.selected}\n onTouchEnd={this.selected}\n >\n {this.props.children}\n
    \n {!!this.state.rect && (\n \n
    \n
    \n \n {pgettext(\"post reply\", \"Quote\")}\n \n
    \n
    \n )}\n
    \n )\n}\n\nfunction focusEditor() {\n const textarea = document.querySelector(\"#posting-mount textarea\")\n textarea.focus()\n textarea.selectionStart = textarea.selectionEnd = textarea.value.length\n}\n\nconst getQuoteSelection = (container) => {\n if (typeof window.getSelection === \"undefined\") return\n\n // Validate that selection is of valid type and has one range\n const selection = window.getSelection()\n if (!selection) return\n if (selection.type !== \"Range\") return\n if (selection.rangeCount !== 1) return\n\n // Validate that selection is within the container and post's article\n const range = selection.getRangeAt(0)\n if (!isRangeContained(range, container)) return\n if (!isPostContained(range)) return\n if (!isAnyTextSelected(range.cloneContents())) return\n\n return range\n}\n\nconst isRangeContained = (range, container) => {\n const node = range.commonAncestorContainer\n if (node === container) return true\n\n let p = node.parentNode\n while (p) {\n if (p === container) return true\n p = p.parentNode\n }\n\n return false\n}\n\nconst isPostContained = (range) => {\n const element = range.commonAncestorContainer\n if (element.nodeName === \"ARTICLE\") return true\n if (element.dataset && element.dataset.noquote === \"1\") return false\n let p = element.parentNode\n while (p) {\n if (p.dataset && p.dataset.noquote === \"1\") return false\n if (p.nodeName === \"ARTICLE\") return true\n p = p.parentNode\n }\n return false\n}\n\nconst isAnyTextSelected = (node) => {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i]\n if (child.nodeType === Node.TEXT_NODE) {\n if (child.textContent && child.textContent.trim().length > 0) return true\n }\n if (child.nodeName === \"IMG\") return true\n if (isAnyTextSelected(child)) return true\n }\n\n return false\n}\n","const getQuoteMarkup = (range) => {\n const metadata = getQuoteMetadata(range)\n let markup = convertNodesToMarkup(range.cloneContents().childNodes, [])\n let prefix = metadata ? `[quote=\"${metadata}\"]\\n` : \"[quote]\\n\"\n let suffix = \"\\n[/quote]\\n\\n\"\n\n const codeBlock = getQuoteCodeBlock(range)\n if (codeBlock) {\n prefix += codeBlock.syntax ? `[code=${codeBlock.syntax}]\\n` : \"[code]\\n\"\n suffix = \"\\n[/code]\" + suffix\n } else if (isNodeInlineCodeBlock(range)) {\n markup = markup.trim()\n prefix += \"`\"\n suffix = \"`\" + suffix\n } else {\n markup = markup.trim()\n }\n\n return prefix + markup + suffix\n}\n\nexport default getQuoteMarkup\n\nconst getQuoteMetadata = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeElementWithQuoteMetadata(node)) {\n return getQuoteMetadataFromNode(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return getQuoteMetadataFromNode(p)\n }\n p = p.parentNode\n }\n\n return \"\"\n}\n\nconst isNodeElementWithQuoteMetadata = (node) => {\n if (node.nodeType !== Node.ELEMENT_NODE) return false\n if (node.nodeName === \"ARTICLE\") return true\n if (node.nodeName === \"BLOCKQUOTE\") {\n return node.dataset && node.dataset.block === \"quote\"\n }\n\n return false\n}\n\nconst getQuoteMetadataFromNode = (element) => {\n if (element.dataset) {\n return element.dataset.author || null\n }\n return null\n}\n\nconst getQuoteCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (isNodeCodeBlock(node)) {\n return getNodeCodeBlockMeta(node)\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeCodeBlock(p)) {\n return getNodeCodeBlockMeta(p)\n }\n p = p.parentNode\n }\n\n return null\n}\n\nconst isNodeCodeBlock = (node) => {\n return node.nodeName === \"PRE\"\n}\n\nconst isNodeInlineCodeBlock = (range) => {\n const node = range.commonAncestorContainer\n if (node.nodeName === \"CODE\") {\n return true\n }\n\n let p = node.parentNode\n while (p) {\n if (isNodeElementWithQuoteMetadata(p)) {\n return false\n }\n\n if (p.nodeName === \"CODE\") {\n return true\n }\n\n p = p.parentNode\n }\n\n return false\n}\n\nconst getNodeCodeBlockMeta = (node) => {\n if (!node.dataset) {\n return { syntax: null }\n }\n\n return { syntax: node.dataset.syntax || null }\n}\n\nconst convertNodesToMarkup = (nodes, stack) => {\n let markup = \"\"\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n markup += convertNodeToMarkup(node, stack)\n }\n return markup\n}\n\nconst SIMPLE_NODE_MAPPINGS = {\n H1: [\"\\n\\n# \", \"\"],\n H2: [\"\\n\\n## \", \"\"],\n H3: [\"\\n\\n### \", \"\"],\n H4: [\"\\n\\n#### \", \"\"],\n H5: [\"\\n\\n##### \", \"\"],\n H6: [\"\\n\\n###### \", \"\"],\n STRONG: [\"**\", \"**\"],\n EM: [\"*\", \"*\"],\n DEL: [\"~~\", \"~~\"],\n B: [\"[b]\", \"[/b]\"],\n U: [\"[u]\", \"[/u]\"],\n I: [\"[i]\", \"[/i]\"],\n SUB: [\"[sub]\", \"[/sub]\"],\n SUP: [\"[sup]\", \"[/sup]\"],\n}\n\nconst convertNodeToMarkup = (node, stack) => {\n const dataset = node.dataset || {}\n\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\"\n }\n\n if (node.nodeType === Node.ELEMENT_NODE) {\n if (dataset.quote) {\n return dataset.quote || \"\"\n }\n if (dataset.noquote === \"1\") return \"\"\n }\n\n if (\n node.nodeType === Node.ELEMENT_NODE &&\n dataset.quote &&\n dataset.quote.trim()\n ) {\n return \"\"\n }\n\n if (node.nodeName === \"HR\") {\n return \"\\n\\n- - -\"\n }\n\n if (SIMPLE_NODE_MAPPINGS[node.nodeName]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[node.nodeName]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, node.nodeName]) +\n suffix\n )\n }\n\n if (node.nodeName === \"A\") {\n const href = node.href\n const text = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (text) {\n return `[${text}](${href})`\n } else {\n return `!(${href})`\n }\n }\n\n if (node.nodeName === \"IMG\") {\n const src = node.src\n const alt = node.alt\n if (alt) {\n return `![${alt}](${src})`\n } else {\n return `!(${src})`\n }\n }\n\n if (node.nodeName === \"DIV\" || node.nodeName === \"ASIDE\") {\n const block = dataset.block && dataset.block.toUpperCase()\n if (block && SIMPLE_NODE_MAPPINGS[block]) {\n const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[block]\n return (\n prefix +\n convertNodesToMarkup(node.childNodes, [...stack, block]) +\n suffix\n )\n } else {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n }\n\n if (node.nodeName === \"BLOCKQUOTE\") {\n if (dataset.block === \"spoiler\") {\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"SPOILER\",\n ]).trim()\n\n if (!content) return \"\"\n\n let markup = \"\\n[spoiler]\\n\"\n markup += content\n markup += \"\\n[/spoiler]\"\n return markup\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n \"QUOTE\",\n ]).trim()\n\n if (!content) return \"\"\n\n const metadata = getQuoteMetadataFromNode(node)\n let markup = metadata ? `\\n[quote=${metadata}]\\n` : \"\\n\\n[quote]\\n\"\n markup += content\n markup += \"\\n[/quote]\"\n return markup\n }\n\n if (node.nodeName === \"PRE\") {\n const syntax = dataset.syntax || null\n const code = node.querySelector(\"code\")\n const content = code ? code.innerText || \"\" : \"\"\n\n if (!content.trim()) return \"\"\n\n return \"\\n[code\" + (syntax ? \"=\" + syntax : \"\") + \"]\" + content + \"[/code]\"\n }\n\n if (node.nodeName === \"CODE\") {\n return \"`\" + node.innerText + \"`\"\n }\n\n if (node.nodeName === \"P\") {\n return (\n \"\\n\" + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n const prefix = level === 0 ? \"\\n\" : \"\"\n return (\n prefix + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n )\n }\n\n if (node.nodeName === \"LI\") {\n let prefix = \"\"\n const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n for (let i = 1; i < level; i++) {\n prefix += \" \"\n }\n\n const ordered = stack[stack.length - 1] === \"OL\"\n if (ordered) {\n prefix += dataset.index ? dataset.index + \". \" : \"1. \"\n } else {\n prefix += \"- \"\n }\n\n const content = convertNodesToMarkup(node.childNodes, [\n ...stack,\n node.nodeName,\n ])\n if (!content.trim()) return \"\"\n\n return \"\\n\" + prefix + content\n }\n\n if (node.nodeName === \"SPAN\") {\n return convertNodesToMarkup(node.childNodes, stack)\n }\n\n return \"\"\n}\n","export function getGlobalState() {\n return window.misagoReply\n}\n\nexport function setGlobalState(disabled, quote) {\n window.misagoReply = { disabled, quote }\n}\n\nexport function clearGlobalState() {\n window.misagoReply = null\n}\n","import moment from \"moment\"\n\nexport function clean(attachments) {\n return attachments\n .filter((attachment) => {\n return attachment.id && !attachment.isRemoved\n })\n .map((a) => {\n return a.id\n })\n}\n\nexport function hydrate(attachments) {\n return attachments.map((attachment) => {\n return Object.assign({}, attachment, {\n uploaded_on: moment(attachment.uploaded_on),\n })\n })\n}\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupAttachmentModal({ attachment }) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Attachment details\")}\n

    \n
    \n
    \n {!!attachment.is_image && (\n
    \n \n \"\"\n \n
    \n )}\n
    \n {attachment.filename}\n
    \n
    \n
    \n \n {attachment.filetype + \", \" + formatFilesize(attachment.size)}\n \n
    \n {pgettext(\"markup editor\", \"Type and size\")}\n
    \n
    \n
    \n \n \n {attachment.uploaded_on.fromNow()}\n \n \n
    \n {pgettext(\"markup editor\", \"Uploaded at\")}\n
    \n
    \n
    \n {attachment.url.uploader ? (\n \n {attachment.uploader_name}\n \n ) : (\n {attachment.uploader_name}\n )}\n
    \n {pgettext(\"markup editor\", \"Uploader\")}\n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n","const wrapSelection = (selection, update, prefix, suffix, def) => {\n const text = selection.text || def || \"\"\n let newValue = selection.prefix\n newValue += prefix + text + suffix\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.start + prefix.length\n selection.textarea.setSelectionRange(caret, caret + text.length)\n }, 250)\n}\n\nconst replaceSelection = (selection, update, text) => {\n let newValue = selection.prefix\n newValue += text\n newValue += selection.suffix\n update(newValue)\n\n window.setTimeout(() => {\n focus(selection.textarea)\n\n const caret = selection.end + text.length\n selection.textarea.setSelectionRange(caret, caret)\n }, 250)\n}\n\nconst getSelection = (textarea) => {\n if (document.selection) {\n textarea.focus()\n const range = document.selection.createRange()\n const length = range.text.length\n range.moveStart(\"character\", -textarea.value.length)\n return createRange(textarea, range.text.length - length, range.text.length)\n }\n\n if (textarea.selectionStart || textarea.selectionStart == \"0\") {\n return createRange(textarea, textarea.selectionStart, textarea.selectionEnd)\n }\n}\n\nconst createRange = (textarea, start, end) => {\n return {\n textarea: textarea,\n start: start,\n end: end,\n text: textarea.value.substring(start, end),\n prefix: textarea.value.substring(0, start),\n suffix: textarea.value.substring(end),\n }\n}\n\nexport function focus(textarea) {\n const scroll = textarea.scrollTop\n textarea.focus()\n textarea.scrollTop = scroll\n}\n\nexport { getSelection, replaceSelection, wrapSelection }\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport MarkupAttachmentModal from \"./MarkupAttachmentModal\"\nimport { getSelection, replaceSelection } from \"./operations\"\n\nconst MarkupEditorAttachment = ({\n attachment,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n
    \n {attachment.id ? (\n {\n event.preventDefault()\n modal.show()\n }}\n >\n {attachment.filename}\n \n ) : (\n {attachment.filename}\n )}\n
    \n
      \n {!attachment.id &&
    • {attachment.progress + \"%\"}
    • }\n {!!attachment.filetype &&
    • {attachment.filetype}
    • }\n {attachment.size > 0 &&
    • {formatFilesize(attachment.size)}
    • }\n
    \n
    \n
    \n {!!attachment.id && (\n
    \n {\n const markup = getAttachmentMarkup(attachment)\n const selection = getSelection(element)\n replaceSelection(selection, update, markup)\n }}\n >\n flip_to_front\n \n {\n setState(({ attachments }) => {\n const confirm = window.confirm(\n pgettext(\"markup editor\", \"Remove this attachment?\")\n )\n\n if (confirm) {\n return {\n attachments: attachments.filter(\n ({ id }) => id !== attachment.id\n ),\n }\n }\n })\n }}\n >\n close\n \n
    \n )}\n {!attachment.id && !!attachment.key && (\n
    \n {attachment.error && (\n {\n snackbar.error(\n interpolate(\n pgettext(\"markup editor\", \"%(filename)s: %(error)s\"),\n { filename: attachment.filename, error: attachment.error },\n true\n )\n )\n }}\n >\n warning\n \n )}\n {\n setState(({ attachments }) => {\n return {\n attachments: attachments.filter(\n ({ key }) => key !== attachment.key\n ),\n }\n })\n }}\n >\n close\n \n
    \n )}\n
    \n
    \n)\n\nexport default MarkupEditorAttachment\n\nfunction getAttachmentMarkup(attachment) {\n let markup = \"[\"\n\n if (attachment.is_image) {\n markup += \"![\" + attachment.filename + \"]\"\n markup += \"(\" + (attachment.url.thumb || attachment.url.index) + \"?shva=1)\"\n } else {\n markup += attachment.filename\n }\n\n markup += \"](\" + attachment.url.index + \"?shva=1)\"\n return markup\n}\n","import React from \"react\"\nimport MarkupEditorAttachment from \"./MarkupEditorAttachment\"\n\nconst MarkupEditorAttachments = ({\n attachments,\n disabled,\n element,\n setState,\n update,\n}) => (\n
    \n
    \n {attachments.map((attachment) => (\n \n ))}\n
    \n
    \n)\n\nexport default MarkupEditorAttachments\n","import React from \"react\"\nimport Button from \"../button\"\n\nconst MarkupEditorFooter = ({\n canProtect,\n disabled,\n empty,\n preview,\n isProtected,\n submitText,\n showPreview,\n closePreview,\n enableProtection,\n disableProtection,\n}) => (\n
    \n {!!canProtect && (\n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n \n )}\n {!!canProtect && (\n
    \n {\n if (isProtected) {\n disableProtection()\n } else {\n enableProtection()\n }\n }}\n >\n \n {isProtected ? \"lock\" : \"lock_open\"}\n \n {isProtected\n ? pgettext(\"markup editor\", \"Protected\")\n : pgettext(\"markup editor\", \"Protect\")}\n \n
    \n )}\n
    \n {preview ? (\n \n {pgettext(\"markup editor\", \"Edit\")}\n \n ) : (\n \n {pgettext(\"markup editor\", \"Preview\")}\n \n )}\n \n
    \n)\n\nexport default MarkupEditorFooter\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupCodeModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n syntax: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const syntax = this.state.syntax.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n replaceSelection(\n Object.assign({}, selection, { text }),\n update,\n prefix + \"```\" + syntax + \"\\n\" + text + \"\\n```\\n\\n\"\n )\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Code\")}

    \n
    \n
    \n
    \n \n \n this.setState({ syntax: event.target.value })\n }\n >\n \n {LANGUAGES.map(({ value, name }) => (\n \n ))}\n \n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nconst LANGUAGES = [\n { value: \"bash\", name: \"Bash\" },\n { value: \"c\", name: \"C\" },\n { value: \"c#\", name: \"C#\" },\n { value: \"c++\", name: \"C++\" },\n { value: \"css\", name: \"CSS\" },\n { value: \"diff\", name: \"Diff\" },\n { value: \"go\", name: \"Go\" },\n { value: \"graphql\", name: \"GraphQL\" },\n { value: \"html,\", name: \"HTML\" },\n { value: \"xml\", name: \"XML\" },\n { value: \"json\", name: \"JSON\" },\n { value: \"java\", name: \"Java\" },\n { value: \"javascript\", name: \"JavaScript\" },\n { value: \"kotlin\", name: \"Kotlin\" },\n { value: \"less\", name: \"Less\" },\n { value: \"lua\", name: \"Lua\" },\n { value: \"makefile\", name: \"Makefile\" },\n { value: \"markdown\", name: \"Markdown\" },\n { value: \"objective-C\", name: \"Objective-C\" },\n { value: \"php\", name: \"PHP\" },\n { value: \"perl\", name: \"Perl\" },\n { value: \"plain\", name: \"Plain\" },\n { value: \"text\", name: \"text\" },\n { value: \"python\", name: \"Python\" },\n { value: \"repl\", name: \"REPL\" },\n { value: \"r\", name: \"R\" },\n { value: \"ruby\", name: \"Ruby\" },\n { value: \"rust\", name: \"Rust\" },\n { value: \"scss\", name: \"SCSS\" },\n { value: \"sql\", name: \"SQL\" },\n { value: \"shell\", name: \"Shell Session\" },\n { value: \"swift\", name: \"Swift\" },\n { value: \"toml\", name: \"TOML\" },\n { value: \"ini\", name: \"INI\" },\n { value: \"typescript\", name: \"TypeScript\" },\n { value: \"visualbasic\", name: \"Visual Basic .NET\" },\n { value: \"webassembly\", name: \"WebAssembly\" },\n { value: \"yaml\", name: \"YAML\" },\n]\n\nexport default MarkupCodeModal\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupFormattingHelpModal() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup help\", \"Formatting help\")}\n

    \n
    \n
    \n

    {pgettext(\"markup help\", \"Emphasis text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will have emphasis\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Removed text\")}

    \n \n \n {pgettext(\"markup help\", \"This text will be removed\")}\n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Bold text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be bold\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Underlined text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be underlined\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Italics text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"This text will be in italics\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link\")}

    \n \"\n result={\n

    \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link (BBCode)\")}

    \n \n example.com\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Link with text (BBCode)\")}

    \n \n {pgettext(\"markup help\", \"Link text\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image with alternate text\")}

    \n \n \n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Image (BBCode)\")}

    \n \n \"\"\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Mention user by their name\")}

    \n \n @username\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 1\")}

    \n {pgettext(\"markup help\", \"First level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 2\")}

    \n {pgettext(\"markup help\", \"Second level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 3\")}

    \n {pgettext(\"markup help\", \"Third level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 4\")}

    \n {pgettext(\"markup help\", \"Fourth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Heading 5\")}

    \n {pgettext(\"markup help\", \"Fifth level heading\")}}\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Unordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Ordered list\")}

    \n \n
  • Lorem ipsum
  • \n
  • Dolor met
  • \n
  • Vulputate lectus
  • \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text\")}

    \n \" + pgettext(\"markup help\", \"Quoted text\")}\n result={\n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text (BBCode)\")}

    \n \n
    \n {gettext(\"Quoted message:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Quote text with title (BBCode)\")}

    \n \n
    \n {gettext(\"Quote title has written:\")}\n
    \n
    \n

    {pgettext(\"markup help\", \"Quoted text\")}

    \n
    \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Spoiler\")}

    \n \n {pgettext(\"markup help\", \"Secret text\")}\n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Inline code\")}

    \n \n {pgettext(\"markup help\", \"Inline code\")}\n

    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\"markup help\", \"Code block with syntax highlighting\")}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Code block (BBCode)\")}

    \n \n alert(\"Hello world!\");\n \n }\n />\n\n
    \n\n

    \n {pgettext(\n \"markup help\",\n \"Code block with syntax highlighting (BBCode)\"\n )}\n

    \n \n \n print(\"Hello world!\");\n \n \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n\n
    \n\n

    {pgettext(\"markup help\", \"Horizontal rule (BBCode)\")}

    \n \n

    Lorem ipsum

    \n
    \n

    Dolor met

    \n
    \n }\n />\n
    \n
    \n \n {pgettext(\"modal\", \"Close\")}\n \n
    \n
    \n
    \n )\n}\n\nfunction ExampleFormatting({ markup, result }) {\n return (\n
    \n
    \n
    \n          {markup}\n        
    \n
    \n
    \n
    {result}
    \n
    \n
    \n )\n}\n\nclass ExampleFormattingSpoiler extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n reveal: false,\n }\n }\n\n render() {\n return (\n \n
    \n

    {this.props.children}

    \n
    \n {!this.state.reveal && (\n
    \n {\n this.setState({ reveal: true })\n }}\n >\n {gettext(\"Reveal spoiler\")}\n \n
    \n )}\n \n )\n }\n}\n","const URL_PATTERN = new RegExp(\n \"^(https?:\\\\/\\\\/)?((([a-z\\\\d]([a-z\\\\d-]*[a-z\\\\d])*)\\\\.)+[a-z]{2,}|((\\\\d{1,3}\\\\.){3}\\\\d{1,3}))(\\\\:\\\\d+)?(\\\\/[-a-z\\\\d%_.~+]*)*(\\\\?[;&a-z\\\\d%_.~+=-]*)?(\\\\#[-a-z\\\\d_]*)?$\",\n \"i\"\n)\n\nexport default function (str) {\n return URL_PATTERN.test($.trim(str))\n}\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport isUrl from \"../../utils/is-url\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupImageModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (!isUrl(url)) {\n this.setState({ error: gettext(\"Enter a valid address.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"![\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"!(\" + url + \")\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Image\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupImageModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport isUrl from \"../../utils/is-url\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupLinkModal extends React.Component {\n constructor(props) {\n super(props)\n\n const text = props.selection.text.trim()\n const textUrl = isUrl(text)\n\n this.state = {\n error: null,\n text: textUrl ? \"\" : text,\n url: textUrl ? text : \"\",\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const text = this.state.text.trim()\n const url = this.state.url.trim()\n\n if (url.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n if (!isUrl(url)) {\n this.setState({ error: gettext(\"Enter a valid address.\") })\n return false\n }\n\n if (text.length > 0) {\n replaceSelection(selection, update, \"[\" + text + \"](\" + url + \")\")\n } else {\n replaceSelection(selection, update, \"<\" + url + \">\")\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {pgettext(\"markup editor\", \"Link\")}

    \n
    \n
    \n
    \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n \n \n this.setState({ url: event.target.value })\n }\n />\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupLinkModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupQuoteModal extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n error: null,\n author: \"\",\n text: props.selection.text,\n }\n }\n\n handleSubmit = (ev) => {\n ev.preventDefault()\n\n const { selection, update } = this.props\n const author = this.state.author.trim()\n const text = this.state.text.trim()\n\n if (text.length === 0) {\n this.setState({ error: gettext(\"This field is required.\") })\n return false\n }\n\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n if (author) {\n replaceSelection(\n selection,\n update,\n prefix + '[quote=\"' + author + '\"]\\n' + text + \"\\n[/quote]\\n\\n\"\n )\n } else {\n replaceSelection(\n selection,\n update,\n prefix + \"[quote]\\n\" + text + \"\\n[/quote]\\n\\n\"\n )\n }\n\n modal.hide()\n\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"markup editor\", \"Quote\")}\n

    \n
    \n
    \n
    \n \n \n this.setState({ author: event.target.value })\n }\n />\n \n \n \n this.setState({ text: event.target.value })\n }\n />\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default MarkupQuoteModal\n","import React from \"react\"\n\nconst MarkupEditorButton = ({ disabled, icon, title, onClick }) => (\n \n {icon}\n \n)\n\nexport default MarkupEditorButton\n","import moment from \"moment\"\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\n\nconst ID_LEN = 32\n\nconst uploadFile = (file, setState) => {\n const maxSize = misago.get(\"user\").acl.max_attachment_size * 1024\n\n if (file.size > maxSize) {\n snackbar.error(\n interpolate(\n pgettext(\n \"markup editor\",\n \"File %(filename)s is bigger than %(limit)s.\"\n ),\n { filename: file.name, limit: formatFilesize(maxSize) },\n true\n )\n )\n\n return\n }\n\n let upload = {\n id: null,\n key: getRandomString(ID_LEN),\n error: null,\n uploaded_on: null,\n progress: 0,\n filename: file.name,\n filetype: null,\n is_image: false,\n size: file.size,\n url: null,\n uploader_name: null,\n }\n\n setState(({ attachments }) => {\n return { attachments: [upload].concat(attachments) }\n })\n\n const refreshState = () => {\n setState(({ attachments }) => {\n return { attachments: attachments.concat() }\n })\n }\n\n const data = new FormData()\n data.append(\"upload\", file)\n\n ajax\n .upload(misago.get(\"ATTACHMENTS_API\"), data, (progress) => {\n upload.progress = progress\n refreshState()\n })\n .then(\n (data) => {\n Object.assign(upload, data, { uploaded_on: moment(data.uploaded_on) })\n refreshState()\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n upload.error = rejection.detail\n snackbar.error(rejection.detail)\n refreshState()\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n}\n\nconst ALPHA = \"12345678990abcdefghijklmnopqrstuvwxyz\"\nconst ALPHA_LEN = ALPHA.length\n\nconst getRandomString = (len) => {\n const chars = []\n for (let i = 0; i < len; i++) {\n const index = Math.floor(Math.random() * ALPHA_LEN)\n chars.push(ALPHA[index])\n }\n return chars.join(\"\")\n}\n\nexport default uploadFile\n","import React from \"react\"\nimport misago from \"../../\"\nimport modal from \"../../services/modal\"\nimport MarkupCodeModal from \"./MarkupCodeModal\"\nimport MarkupFormattingHelpModal from \"./MarkupFormattingHelpModal\"\nimport MarkupImageModal from \"./MarkupImageModal\"\nimport MarkupLinkModal from \"./MarkupLinkModal\"\nimport MarkupQuoteModal from \"./MarkupQuoteModal\"\nimport MarkupEditorButton from \"./MarkupEditorButton\"\nimport { getSelection, replaceSelection, wrapSelection } from \"./operations\"\nimport uploadFile from \"./uploadFile\"\n\nconst MarkupEditorToolbar = ({\n disabled,\n element,\n update,\n updateAttachments,\n}) => {\n const actions = [\n {\n name: pgettext(\"markup editor\", \"Strong\"),\n icon: \"format_bold\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"**\",\n \"**\",\n pgettext(\"example markup\", \"Strong text\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Emphasis\"),\n icon: \"format_italic\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"*\",\n \"*\",\n pgettext(\"example markup\", \"Text with emphasis\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Strikethrough\"),\n icon: \"format_strikethrough\",\n onClick: () => {\n wrapSelection(\n getSelection(element),\n update,\n \"~~\",\n \"~~\",\n pgettext(\"example markup\", \"Text with strikethrough\")\n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Horizontal ruler\"),\n icon: \"remove\",\n onClick: () => {\n replaceSelection(getSelection(element), update, \"\\n\\n- - -\\n\\n\")\n },\n },\n {\n name: pgettext(\"markup editor\", \"Link\"),\n icon: \"insert_link\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Image\"),\n icon: \"insert_photo\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Quote\"),\n icon: \"format_quote\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n {\n name: pgettext(\"markup editor\", \"Spoiler\"),\n icon: \"visibility_off\",\n onClick: () => {\n insertSpoiler(element, update)\n },\n },\n {\n name: pgettext(\"markup editor\", \"Code\"),\n icon: \"code\",\n onClick: () => {\n const selection = getSelection(element)\n modal.show(\n \n )\n },\n },\n ]\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n actions.push({\n name: pgettext(\"markup editor\", \"Upload file\"),\n icon: \"file_upload\",\n onClick: () => uploadFiles(updateAttachments),\n })\n }\n\n return (\n
    \n
    \n {actions.map(({ name, icon, onClick }) => (\n \n ))}\n
    \n
    \n
    \n \n more_vert\n \n
      \n {actions.map(({ name, icon, onClick }) => (\n
    • \n \n {icon}\n {name}\n \n
    • \n ))}\n
    \n
    \n {\n modal.show()\n }}\n />\n
    \n
    \n )\n}\n\nconst insertSpoiler = (element, update) => {\n const selection = getSelection(element)\n const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n wrapSelection(\n selection,\n update,\n prefix + \"[spoiler]\\n\",\n \"\\n[/spoiler]\\n\\n\",\n pgettext(\"markup editor\", \"Spoiler text\")\n )\n}\n\nconst uploadFiles = (setState) => {\n const input = document.createElement(\"input\")\n input.type = \"file\"\n input.multiple = \"multiple\"\n\n input.addEventListener(\"change\", function () {\n for (let i = 0; i < input.files.length; i++) {\n uploadFile(input.files[i], setState)\n }\n })\n\n input.click()\n}\n\nexport default MarkupEditorToolbar\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport MisagoMarkup from \"../misago-markup\"\nimport MarkupEditorAttachments from \"./MarkupEditorAttachments\"\nimport MarkupEditorFooter from \"./MarkupEditorFooter\"\nimport MarkupEditorToolbar from \"./MarkupEditorToolbar\"\nimport uploadFile from \"./uploadFile\"\n\nclass MarkupEditor extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n element: null,\n focused: false,\n loading: false,\n preview: false,\n parsed: null,\n }\n }\n\n showPreview = () => {\n if (this.state.loading) return\n\n this.setState({ loading: true, preview: true, element: null })\n\n ajax.post(misago.get(\"PARSE_MARKUP_API\"), { post: this.props.value }).then(\n (data) => {\n this.setState({ loading: false, parsed: data.parsed })\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n this.setState({ loading: false, preview: false })\n }\n )\n }\n\n closePreview = () => {\n this.setState({ loading: false, preview: false })\n }\n\n onDrop = (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!event.dataTransfer.files) return\n\n const { onAttachmentsChange: setState } = this.props\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < event.dataTransfer.files.length; i++) {\n const file = event.dataTransfer.files[i]\n uploadFile(file, setState)\n }\n }\n }\n\n onPaste = (event) => {\n const { onAttachmentsChange: setState } = this.props\n\n const files = []\n for (let i = 0; i < event.clipboardData.items.length; i++) {\n const item = event.clipboardData.items[i]\n if (item.kind === \"file\") {\n files.push(item.getAsFile())\n }\n }\n\n if (files.length) {\n event.preventDefault()\n event.stopPropagation()\n\n if (misago.get(\"user\").acl.max_attachment_size) {\n for (let i = 0; i < files.length; i++) {\n uploadFile(files[i], setState)\n }\n }\n }\n }\n\n render = () => (\n \n this.props.onChange({ target: { value } })}\n updateAttachments={this.props.onAttachmentsChange}\n />\n {this.state.preview ? (\n
    \n {this.state.loading ? (\n
    \n
    \n \n
    \n
    \n ) : (\n \n )}\n
    \n ) : (\n {\n if (element && this.state.element !== element) {\n this.setState({ element })\n setMentions(this.props, element)\n }\n }}\n onChange={this.props.onChange}\n onDrop={this.onDrop}\n onFocus={() => this.setState({ focused: true })}\n onPaste={this.onPaste}\n onBlur={() => this.setState({ focused: false })}\n />\n )}\n {this.props.attachments.length > 0 && (\n this.props.onChange({ target: { value } })}\n />\n )}\n \n \n )\n}\n\nfunction setMentions(props, element) {\n $(element).atwho({\n at: \"@\",\n displayTpl: '
  • \"\"${username}
  • ',\n insertTpl: \"@${username}\",\n searchKey: \"username\",\n callbacks: {\n remoteFilter: function (query, callback) {\n $.getJSON(misago.get(\"MENTION_API\"), { q: query }, callback)\n },\n },\n })\n\n $(element).on(\"inserted.atwho\", (event, _storage, source, controller) => {\n const { query } = controller\n const username = source.target.innerText.trim()\n const prefix = event.target.value.substr(0, query.headPos)\n const suffix = event.target.value.substr(query.endPos)\n\n event.target.value = prefix + username + suffix\n props.onChange(event)\n\n const caret = query.headPos + username.length\n event.target.setSelectionRange(caret, caret)\n event.target.focus()\n })\n}\n\nexport default MarkupEditor\n","import MarkupEditor from \"./MarkupEditor\"\n\nexport default MarkupEditor\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nconst CLASS_ACTIVE = \"posting-active\"\nconst CLASS_DEFAULT = \"posting-default\"\nconst CLASS_MINIMIZED = \"posting-minimized\"\nconst CLASS_FULLSCREEN = \"posting-fullscreen\"\n\nclass PostingDialog extends React.Component {\n componentDidMount() {\n document.body.classList.add(CLASS_ACTIVE, CLASS_DEFAULT)\n }\n\n componentWillUnmount() {\n document.body.classList.remove(\n CLASS_ACTIVE,\n CLASS_DEFAULT,\n CLASS_MINIMIZED,\n CLASS_FULLSCREEN\n )\n }\n\n componentWillReceiveProps({ fullscreen, minimized }) {\n if (minimized) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_FULLSCREEN)\n document.body.classList.add(CLASS_MINIMIZED)\n } else {\n if (fullscreen) {\n document.body.classList.remove(CLASS_DEFAULT, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_FULLSCREEN)\n } else {\n document.body.classList.remove(CLASS_FULLSCREEN, CLASS_MINIMIZED)\n document.body.classList.add(CLASS_DEFAULT)\n }\n }\n }\n\n render() {\n const { children, fullscreen, minimized } = this.props\n\n return (\n \n
    {children}
    \n \n )\n }\n}\n\nexport default PostingDialog\n","import React from \"react\"\n\nconst PostingDialogBody = ({ children }) => (\n
    {children}
    \n)\n\nexport default PostingDialogBody\n","import React from \"react\"\n\nconst PostingDialogError = ({ close, message }) => (\n
    \n
    \n error_outlined\n
    \n
    \n

    {message}

    \n \n
    \n
    \n)\n\nexport default PostingDialogError\n","import React from \"react\"\n\nconst PostingDialogHeader = ({\n children,\n close,\n fullscreen,\n minimize,\n minimized,\n fullscreenEnter,\n fullscreenExit,\n open,\n}) => (\n
    \n
    {children}
    \n {minimized ? (\n \n expand_less\n \n ) : (\n \n expand_more\n \n )}\n {fullscreen ? (\n \n fullscreen_exit\n \n ) : (\n \n fullscreen\n \n )}\n \n close\n \n
    \n)\n\nexport default PostingDialogHeader\n","import React from \"react\"\n\nexport default function PostingThreadOptions({\n isClosed,\n isHidden,\n isPinned,\n disabled,\n options,\n close,\n open,\n hide,\n unhide,\n pinGlobally,\n pinLocally,\n unpin,\n}) {\n const icons = getIcons(isClosed, isHidden, isPinned)\n\n return (\n
    \n \n {icons.length > 0 ? (\n \n {icons.map((icon) => (\n \n {icon}\n \n ))}\n \n ) : (\n more_horiz\n )}\n \n
      \n {options.pin === 2 && isPinned !== 2 && (\n
    • \n \n bookmark\n {pgettext(\"post thread\", \"Pinned globally\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 1 && (\n
    • \n \n bookmark_outline\n {pgettext(\"post thread\", \"Pinned locally\")}\n \n
    • \n )}\n {options.pin >= isPinned && isPinned !== 0 && (\n
    • \n \n radio_button_unchecked\n {pgettext(\"post thread\", \"Not pinned\")}\n \n
    • \n )}\n {options.close && !!isClosed && (\n
    • \n \n lock_outline\n {pgettext(\"post thread\", \"Open\")}\n \n
    • \n )}\n {options.close && !isClosed && (\n
    • \n \n lock\n {pgettext(\"post thread\", \"Closed\")}\n \n
    • \n )}\n {options.hide && !!isHidden && (\n
    • \n \n visibility\n {pgettext(\"post thread\", \"Visible\")}\n \n
    • \n )}\n {options.hide && !isHidden && (\n
    • \n \n visibility_off\n {pgettext(\"post thread\", \"Hidden\")}\n \n
    • \n )}\n
    \n
    \n )\n}\n\nfunction getIcons(closed, hidden, pinned) {\n const icons = []\n if (pinned === 2) icons.push(\"bookmark\")\n if (pinned === 1) icons.push(\"bookmark_outline\")\n if (closed) icons.push(\"lock\")\n if (hidden) icons.push(\"visibility_off\")\n return icons\n}\n","import React from \"react\"\nimport CategorySelect from \"misago/components/category-select\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport PostingThreadOptions from \"./PostingThreadOptions\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n options: null,\n\n title: \"\",\n category: props.category || null,\n categories: [],\n post: \"\",\n attachments: [],\n close: false,\n hide: false,\n pin: 0,\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n }\n\n loadSuccess = (data) => {\n let category = null\n let options = null\n\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n // pick first category that allows posting and if it may, override it with initial one\n if (\n item.post !== false &&\n (!category || item.id == this.state.category)\n ) {\n category = item.id\n options = item.post\n }\n\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n })\n })\n\n this.setState({\n isReady: true,\n options,\n\n categories,\n category,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n onCancel = () => {\n const cancel = window.confirm(\n pgettext(\"post thread\", \"Are you sure you want to discard thread?\")\n )\n if (cancel) {\n this.minimize()\n posting.close()\n }\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onCategoryChange = (event) => {\n const category = this.state.categories.find((item) => {\n return event.target.value == item.value\n })\n\n // if selected pin is greater than allowed, reduce it\n let pin = this.state.pin\n if (category.post.pin && category.post.pin < pin) {\n pin = category.post.pin\n }\n\n this.setState({\n category: category.id,\n categoryOptions: category.post,\n\n pin,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onClose = () => {\n this.changeValue(\"close\", true)\n }\n\n onOpen = () => {\n this.changeValue(\"close\", false)\n }\n\n onPinGlobally = () => {\n this.changeValue(\"pin\", 2)\n }\n\n onPinLocally = () => {\n this.changeValue(\"pin\", 1)\n }\n\n onUnpin = () => {\n this.changeValue(\"pin\", 0)\n }\n\n onHide = () => {\n this.changeValue(\"hide\", true)\n }\n\n onUnhide = () => {\n this.changeValue(\"hide\", false)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n clean() {\n if (!this.state.title.trim().length) {\n snackbar.error(gettext(\"You have to enter thread title.\"))\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(gettext(\"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n title: this.state.title,\n category: this.state.category,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n close: this.state.close,\n hide: this.state.hide,\n pin: this.state.pin,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n const showOptions = !!(\n this.state.options.close ||\n this.state.options.hide ||\n this.state.options.pin\n )\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n {showOptions && (\n \n \n \n )}\n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStart = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start new thread\")}\n \n {children}\n \n)\n","export default function (usernames) {\n const normalisedNames = usernames\n .split(\",\")\n .map((i) => i.trim().toLowerCase())\n const removedBlanks = normalisedNames.filter((i) => i.length > 0)\n const removedDuplicates = removedBlanks.filter((name, pos) => {\n return removedBlanks.indexOf(name) == pos\n })\n\n return removedDuplicates\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport cleanUsernames from \"./utils/usernames\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const to = (props.to || []).map((user) => user.username).join(\", \")\n\n this.state = {\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n to: to,\n title: \"\",\n post: \"\",\n attachments: [],\n\n validators: {\n title: getTitleValidators(),\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n onCancel = () => {\n const cancel = window.confirm(\n pgettext(\n \"post thread\",\n \"Are you sure you want to discard private thread?\"\n )\n )\n if (cancel) {\n this.close()\n }\n }\n\n onToChange = (event) => {\n this.changeValue(\"to\", event.target.value)\n }\n\n onTitleChange = (event) => {\n this.changeValue(\"title\", event.target.value)\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n clean() {\n if (!cleanUsernames(this.state.to).length) {\n snackbar.error(gettext(\"You have to enter at least one recipient.\"))\n return false\n }\n\n if (!this.state.title.trim().length) {\n snackbar.error(gettext(\"You have to enter thread title.\"))\n return false\n }\n\n if (!this.state.post.trim().length) {\n snackbar.error(gettext(\"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.title) {\n snackbar.error(errors.title[0])\n return false\n }\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.submit, {\n to: cleanUsernames(this.state.to),\n title: this.state.title,\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n window.location = success.url\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.to || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n return (\n \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n }\n}\n\nconst PostingDialogStartPrivate = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n}) => (\n \n \n {pgettext(\"post thread\", \"Start private thread\")}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: null,\n\n minimized: false,\n fullscreen: false,\n\n post: this.props.default || \"\",\n attachments: [],\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax\n .get(this.props.config, this.props.context || null)\n .then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n // User clicked \"reply\" instead of \"quote\"\n if (context && newContext && !newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.setState({\n isReady: true,\n\n post: data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n : this.state.post,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n const cancel = window.confirm(\n pgettext(\"post reply\", \"Are you sure you want to discard your reply?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(gettext(\"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.post(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(pgettext(\"post reply\", \"Your reply has been posted.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n thread: this.props.thread,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n \n \n \n )\n }\n}\n\nconst PostingDialogReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n thread,\n}) => (\n \n \n {interpolate(\n pgettext(\"post reply\", \"Reply to: %(thread)s\"),\n { thread: thread.title },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isLoading: false,\n\n error: false,\n\n minimized: false,\n fullscreen: false,\n\n post: \"\",\n attachments: [],\n protect: false,\n\n canProtect: false,\n\n validators: {\n post: getPostValidators(),\n },\n errors: {},\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n\n setGlobalState(false, this.onQuote)\n }\n\n componentWillUnmount() {\n clearGlobalState()\n }\n\n componentWillReceiveProps(nextProps) {\n const context = this.props.context\n const newContext = nextProps.context\n\n if (context && newContext && context.reply === newContext.reply) return\n\n ajax\n .get(nextProps.config, nextProps.context || null)\n .then(this.appendData, snackbar.apiError)\n }\n\n loadSuccess = (data) => {\n this.setState({\n isReady: true,\n\n post: data.post,\n attachments: attachments.hydrate(data.attachments),\n protect: data.is_protected,\n\n canProtect: data.can_protect,\n })\n }\n\n loadError = (rejection) => {\n this.setState({\n error: rejection.detail,\n })\n }\n\n appendData = (data) => {\n const newPost = data.post\n ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n : \"\"\n\n this.setState((prevState, props) => {\n if (prevState.post.length > 0) {\n return {\n post: prevState.post.trim() + \"\\n\\n\" + newPost,\n }\n }\n\n return {\n post: newPost,\n }\n })\n\n this.open()\n }\n\n onCancel = () => {\n const cancel = window.confirm(\n gettext(\"Are you sure you want to discard changes?\")\n )\n if (cancel) {\n this.close()\n }\n }\n\n onProtect = () => {\n this.setState({\n protect: true,\n })\n }\n\n onUnprotect = () => {\n this.setState({\n protect: false,\n })\n }\n\n onPostChange = (event) => {\n this.changeValue(\"post\", event.target.value)\n }\n\n onAttachmentsChange = (attachments) => {\n this.setState(attachments)\n }\n\n onQuote = (quote) => {\n this.setState(({ post }) => {\n if (post.length > 0) {\n return { post: post.trim() + \"\\n\\n\" + quote }\n }\n\n return { post: quote }\n })\n\n this.open()\n }\n\n clean() {\n if (!this.state.post.trim().length) {\n snackbar.error(gettext(\"You have to enter a message.\"))\n return false\n }\n\n const errors = this.validate()\n\n if (errors.post) {\n snackbar.error(errors.post[0])\n return false\n }\n\n return true\n }\n\n send() {\n setGlobalState(true, this.onQuote)\n\n return ajax.put(this.props.submit, {\n post: this.state.post,\n attachments: attachments.clean(this.state.attachments),\n protect: this.state.protect,\n })\n }\n\n handleSuccess(success) {\n this.setState({ isLoading: true })\n this.close()\n\n setGlobalState(false, this.onQuote)\n\n snackbar.success(gettext(\"Reply has been edited.\"))\n window.location = success.url.index\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n const errors = [].concat(\n rejection.non_field_errors || [],\n rejection.category || [],\n rejection.title || [],\n rejection.post || [],\n rejection.attachments || []\n )\n\n snackbar.error(errors[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n setGlobalState(false, this.onQuote)\n }\n\n close = () => {\n this.minimize()\n posting.close()\n }\n\n minimize = () => {\n this.setState({ fullscreen: false, minimized: true })\n }\n\n open = () => {\n this.setState({ minimized: false })\n if (this.state.fullscreen) {\n }\n }\n\n fullscreenEnter = () => {\n this.setState({ fullscreen: true, minimized: false })\n }\n\n fullscreenExit = () => {\n this.setState({ fullscreen: false, minimized: false })\n }\n\n render() {\n const dialogProps = {\n post: this.props.post,\n\n minimized: this.state.minimized,\n minimize: this.minimize,\n open: this.open,\n\n fullscreen: this.state.fullscreen,\n fullscreenEnter: this.fullscreenEnter,\n fullscreenExit: this.fullscreenExit,\n\n close: this.onCancel,\n }\n\n if (this.state.error) {\n return (\n \n \n \n )\n }\n\n if (!this.state.isReady) {\n return (\n \n
    \n {}}\n onChange={() => {}}\n />\n
    \n
    \n )\n }\n\n return (\n \n \n this.setState({ protect: true })}\n disableProtection={() => this.setState({ protect: false })}\n value={this.state.post}\n submitText={pgettext(\"edit reply submit\", \"Edit reply\")}\n disabled={this.state.isLoading}\n onAttachmentsChange={this.onAttachmentsChange}\n onChange={this.onPostChange}\n />\n \n \n )\n }\n}\n\nconst PostingDialogEditReply = ({\n children,\n close,\n minimized,\n minimize,\n open,\n fullscreen,\n fullscreenEnter,\n fullscreenExit,\n post,\n}) => (\n \n \n {interpolate(\n pgettext(\"edit reply\", \"Edit reply by %(poster)s from %(date)s\"),\n {\n poster: post.poster ? post.poster.username : post.poster_name,\n date: post.posted_on.fromNow(),\n },\n true\n )}\n \n {children}\n \n)\n","import React from \"react\"\nimport PostingQuoteSelection from \"./PostingQuoteSelection\"\nimport getQuoteMarkup from \"./getQuoteMarkup\"\nimport { clearGlobalState, getGlobalState, setGlobalState } from \"./globalState\"\nimport Start from \"./start\"\nimport StartPrivate from \"./start-private\"\nimport Reply from \"./reply\"\nimport Edit from \"./edit\"\n\nexport default function (props) {\n switch (props.mode) {\n case \"START\":\n return \n\n case \"START_PRIVATE\":\n return \n\n case \"REPLY\":\n return \n\n case \"EDIT\":\n return \n\n default:\n return null\n }\n}\n\nexport {\n PostingQuoteSelection,\n clearGlobalState,\n getGlobalState,\n getQuoteMarkup,\n setGlobalState,\n}\n","import { maxLength, minLength } from \"misago/utils/validators\"\nimport misago from \"misago\"\n\nexport function getTitleValidators() {\n return [getTitleLengthMin(), getTitleLengthMax()]\n}\n\nexport function getPostValidators() {\n if (misago.get(\"SETTINGS\").post_length_max) {\n return [validatePostLengthMin(), validatePostLengthMax()]\n } else {\n return [validatePostLengthMin()]\n }\n}\n\nexport function getTitleLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").thread_title_length_min,\n (limitValue, length) => {\n const message = ngettext(\n \"Thread title should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function getTitleLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").thread_title_length_max,\n (limitValue, length) => {\n const message = ngettext(\n \"Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMin() {\n return minLength(\n misago.get(\"SETTINGS\").post_length_min,\n (limitValue, length) => {\n const message = ngettext(\n \"Posted message should be at least %(limit_value)s character long (it has %(show_value)s).\",\n \"Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n\nexport function validatePostLengthMax() {\n return maxLength(\n misago.get(\"SETTINGS\").post_length_max || 1000000,\n (limitValue, length) => {\n const message = ngettext(\n \"Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n \"Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n\n return interpolate(\n message,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getChoice() {\n let choice = null\n this.props.choices.map((item) => {\n if (item.value === this.props.value) {\n choice = item\n }\n })\n return choice\n }\n\n getIcon() {\n return this.getChoice().icon\n }\n\n getLabel() {\n return this.getChoice().label\n }\n\n change = (value) => {\n return () => {\n this.props.onChange({\n target: {\n value: value,\n },\n })\n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getLabel()}\n \n
      \n {this.props.choices.map((item, i) => {\n return (\n
    • \n \n \n {item.label}\n \n
    • \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport function Icon({ icon }) {\n if (!icon) return null\n\n return {icon}\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n showActivation: false,\n\n username: \"\",\n password: \"\",\n\n validators: {\n username: [],\n password: [],\n },\n }\n }\n\n clean() {\n if (!this.isValid()) {\n snackbar.error(gettext(\"Fill out both fields.\"))\n return false\n } else {\n return true\n }\n }\n\n send() {\n return ajax.post(misago.get(\"AUTH_API\"), {\n username: this.state.username,\n password: this.state.password,\n })\n }\n\n handleSuccess() {\n let form = $(\"#hidden-login-form\")\n\n form.append('')\n form.append('')\n\n // fill out form with user credentials and submit it, this will tell\n // Misago to redirect user back to right page, and will trigger browser's\n // key ring feature\n form.find('input[type=\"hidden\"]').val(ajax.getCsrfToken())\n form.find('input[name=\"redirect_to\"]').val(window.location.pathname)\n form.find('input[name=\"username\"]').val(this.state.username)\n form.find('input[name=\"password\"]').val(this.state.password)\n form.submit()\n\n // keep form loading\n this.setState({\n isLoading: true,\n })\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.code === \"inactive_admin\") {\n snackbar.info(rejection.detail)\n } else if (rejection.code === \"inactive_user\") {\n snackbar.info(rejection.detail)\n this.setState({\n showActivation: true,\n })\n } else if (rejection.code === \"banned\") {\n showBannedPage(rejection.detail)\n modal.hide()\n } else {\n snackbar.error(rejection.detail)\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n getActivationButton() {\n if (!this.state.showActivation) return null\n\n return (\n \n {gettext(\"Activate account\")}\n \n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Sign in\")}

    \n
    \n
    \n
    \n \n\n
    \n
    \n \n
    \n
    \n\n
    \n
    \n \n
    \n
    \n
    \n
    \n {this.getActivationButton()}\n \n {gettext(\"Sign in\")}\n \n \n {gettext(\"Forgot password?\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClass() {\n return getStatusClassName(this.props.status)\n }\n\n render() {\n return {this.props.children}\n }\n}\n\nexport class StatusIcon extends React.Component {\n getIcon() {\n if (this.props.status.is_banned) {\n return \"remove_circle_outline\"\n } else if (this.props.status.is_hidden) {\n return \"help_outline\"\n } else if (this.props.status.is_online_hidden) {\n return \"label\"\n } else if (this.props.status.is_offline_hidden) {\n return \"label_outline\"\n } else if (this.props.status.is_online) {\n return \"lens\"\n } else if (this.props.status.is_offline) {\n return \"panorama_fish_eye\"\n }\n }\n\n render() {\n return {this.getIcon()}\n }\n}\n\nexport class StatusLabel extends React.Component {\n getHelp() {\n return getStatusDescription(this.props.user, this.props.status)\n }\n\n getLabel() {\n if (this.props.status.is_banned) {\n return gettext(\"Banned\")\n } else if (this.props.status.is_hidden) {\n return gettext(\"Hidden\")\n } else if (this.props.status.is_online_hidden) {\n return gettext(\"Online (hidden)\")\n } else if (this.props.status.is_offline_hidden) {\n return gettext(\"Offline (hidden)\")\n } else if (this.props.status.is_online) {\n return gettext(\"Online\")\n } else if (this.props.status.is_offline) {\n return gettext(\"Offline\")\n }\n }\n\n render() {\n return (\n \n {this.getLabel()}\n \n )\n }\n}\n\nexport function getStatusClassName(status) {\n let className = \"\"\n if (status.is_banned) {\n className = \"banned\"\n } else if (status.is_hidden) {\n className = \"offline\"\n } else if (status.is_online_hidden) {\n className = \"online\"\n } else if (status.is_offline_hidden) {\n className = \"offline\"\n } else if (status.is_online) {\n className = \"online\"\n } else if (status.is_offline) {\n className = \"offline\"\n }\n\n return \"user-status user-\" + className\n}\n\nexport function getStatusDescription(user, status) {\n if (status.is_banned) {\n if (status.banned_until) {\n return interpolate(\n gettext(\"%(username)s is banned until %(ban_expires)s\"),\n {\n username: user.username,\n ban_expires: status.banned_until.format(\"LL, LT\"),\n },\n true\n )\n } else {\n return interpolate(\n gettext(\"%(username)s is banned\"),\n {\n username: user.username,\n },\n true\n )\n }\n } else if (status.is_hidden) {\n return interpolate(\n gettext(\"%(username)s is hiding presence\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_online_hidden) {\n return interpolate(\n gettext(\"%(username)s is online (hidden)\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline_hidden) {\n return interpolate(\n gettext(\"%(username)s was last seen %(last_click)s (hidden)\"),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n } else if (status.is_online) {\n return interpolate(\n gettext(\"%(username)s is online\"),\n {\n username: user.username,\n },\n true\n )\n } else if (status.is_offline) {\n return interpolate(\n gettext(\"%(username)s was last seen %(last_click)s\"),\n {\n username: user.username,\n last_click: status.last_click.fromNow(),\n },\n true\n )\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n if (this.props.emptyMessage) {\n return this.props.emptyMessage\n } else {\n return gettext(\"No name changes have been recorded for your account.\")\n }\n }\n\n render() {\n return (\n
    \n
      \n
    • \n {this.getEmptyMessage()}\n
    • \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default class extends React.Component {\n renderUserAvatar() {\n if (this.props.change.changed_by) {\n return (\n \n \n \n )\n } else {\n return (\n \n \n \n )\n }\n }\n\n renderUsername() {\n if (this.props.change.changed_by) {\n return (\n \n {this.props.change.changed_by.username}\n \n )\n } else {\n return (\n \n {this.props.change.changed_by_username}\n \n )\n }\n }\n\n render() {\n return (\n
  • \n
    {this.renderUserAvatar()}
    \n
    {this.renderUsername()}
    \n
    \n {this.props.change.old_username}\n arrow_forward\n {this.props.change.new_username}\n
    \n
    \n \n {this.props.change.changed_on.fromNow()}\n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Change from \"misago/components/username-history/change\"\n\nexport default class extends React.Component {\n render() {\n return (\n
    \n
      \n {this.props.changes.map((change) => {\n return \n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n  \n \n
    \n
    \n \n  \n \n arrow_forward\n \n  \n \n
    \n
    \n \n  \n \n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ChangePreview from \"misago/components/username-history/change-preview\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/username-history/list-empty\"\nimport ListReady from \"misago/components/username-history/list-ready\"\nimport ListPreview from \"misago/components/username-history/list-preview\"\n\nexport default class extends React.Component {\n render() {\n if (this.props.isLoaded) {\n if (this.props.changes.length) {\n return \n } else {\n return \n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\n\nexport default function ({ showStatus, user }) {\n return (\n
      \n \n \n
    • \n \n \n \n
    \n )\n}\n\nexport function Status({ showStatus, user }) {\n if (!showStatus) return null\n\n return (\n
  • \n \n \n \n
  • \n )\n}\n\nexport function JoinDate({ user }) {\n const { joined_on } = user\n\n let title = interpolate(\n gettext(\"Joined on %(joined_on)s\"),\n {\n joined_on: joined_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n gettext(\"Joined %(joined_on)s\"),\n {\n joined_on: joined_on.fromNow(),\n },\n true\n )\n\n return (\n
  • \n {message}\n
  • \n )\n}\n\nexport function Posts({ user }) {\n const className = getStatClassName(\"user-stat-posts\", user.posts)\n const message = ngettext(\"%(posts)s post\", \"%(posts)s posts\", user.posts)\n\n return (\n
  • \n {interpolate(\n message,\n {\n posts: user.posts,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Threads({ user }) {\n const className = getStatClassName(\"user-stat-threads\", user.threads)\n const message = ngettext(\n \"%(threads)s thread\",\n \"%(threads)s threads\",\n user.threads\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n threads: user.threads,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Followers({ user }) {\n const className = getStatClassName(\"user-stat-followers\", user.followers)\n const message = ngettext(\n \"%(followers)s follower\",\n \"%(followers)s followers\",\n user.followers\n )\n\n return (\n
  • \n {interpolate(\n message,\n {\n followers: user.followers,\n },\n true\n )}\n
  • \n )\n}\n\nexport function getStatClassName(className, stat) {\n if (stat === 0) {\n return className + \" user-stat-empty\"\n }\n return className\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title || rank.name\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n {userTitle}\n \n )\n }\n\n return {userTitle}\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Stats from \"./stats\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ showStatus, user }) {\n const { rank } = user\n\n let className = \"panel user-card\"\n if (rank.css_class) {\n className += \" user-card-\" + rank.css_class\n }\n\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n \n
    \n \n
    \n\n
    \n \n
    \n
    \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n\n
    \n \n  \n \n
    \n
    \n \n  \n \n
    \n\n
    \n
      \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    • \n
    • \n \n  \n \n
    • \n
    • \n \n  \n \n
    • \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ colClassName, cols }) {\n const list = Array.apply(null, { length: cols }).map(Number.call, Number)\n\n return (\n
    \n
    \n {list.map((i) => {\n let className = colClassName\n if (i !== 0) className += \" hidden-xs\"\n if (i === 3) className += \" hidden-sm\"\n\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\nimport Preview from \"./preview\"\n\nexport default function ({ cols, isReady, showStatus, users }) {\n let colClassName = \"col-xs-12 col-sm-4\"\n if (cols === 4) {\n colClassName += \" col-md-3\"\n }\n\n if (!isReady) {\n return \n }\n\n return (\n
    \n
    \n {users.map((user) => {\n return (\n
    \n \n
    \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n dropdown: false,\n }\n }\n\n toggleNav = () => {\n this.setState({\n dropdown: !this.state.dropdown,\n })\n }\n\n hideNav = () => {\n this.setState({\n dropdown: false,\n })\n }\n\n getCompactNavClassName() {\n if (this.state.dropdown) {\n return \"compact-nav open\"\n } else {\n return \"compact-nav\"\n }\n }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.value) {\n return \"btn btn-yes-no btn-yes-no-on\"\n } else {\n return \"btn btn-yes-no btn-yes-no-off\"\n }\n }\n\n getIcon() {\n if (!!this.props.value) {\n return this.props.iconOn || \"check_box\"\n } else {\n return this.props.iconOff || \"check_box_outline_blank\"\n }\n }\n\n getLabel() {\n if (!!this.props.value) {\n return this.props.labelOn || gettext(\"yes\")\n } else {\n return this.props.labelOff || gettext(\"no\")\n }\n }\n\n toggle = () => {\n this.props.onChange({\n target: {\n value: !this.props.value,\n },\n })\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","class OrderedList {\n constructor(items) {\n this.isOrdered = false\n this._items = items || []\n }\n\n add(key, item, order) {\n this._items.push({\n key: key,\n item: item,\n\n after: order ? order.after || null : null,\n before: order ? order.before || null : null,\n })\n }\n\n get(key, value) {\n for (var i = 0; i < this._items.length; i++) {\n if (this._items[i].key === key) {\n return this._items[i].item\n }\n }\n\n return value\n }\n\n has(key) {\n return this.get(key) !== undefined\n }\n\n values() {\n var values = []\n for (var i = 0; i < this._items.length; i++) {\n values.push(this._items[i].item)\n }\n return values\n }\n\n order(values_only) {\n if (!this.isOrdered) {\n this._items = this._order(this._items)\n this.isOrdered = true\n }\n\n if (values_only || typeof values_only === \"undefined\") {\n return this.values()\n } else {\n return this._items\n }\n }\n\n orderedValues() {\n return this.order(true)\n }\n\n _order(unordered) {\n // Index of unordered items\n var index = []\n unordered.forEach(function (item) {\n index.push(item.key)\n })\n\n // Ordered items\n var ordered = []\n var ordering = []\n\n // First pass: register items that\n // don't specify their order\n unordered.forEach(function (item) {\n if (!item.after && !item.before) {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Second pass: register items that\n // specify their before to \"_end\"\n unordered.forEach(function (item) {\n if (item.before === \"_end\") {\n ordered.push(item)\n ordering.push(item.key)\n }\n })\n\n // Third pass: keep iterating items\n // until we hit iterations limit or finish\n // ordering list\n function insertItem(item) {\n var insertAt = -1\n if (ordering.indexOf(item.key) === -1) {\n if (item.after) {\n insertAt = ordering.indexOf(item.after)\n if (insertAt !== -1) {\n insertAt += 1\n }\n } else if (item.before) {\n insertAt = ordering.indexOf(item.before)\n }\n\n if (insertAt !== -1) {\n ordered.splice(insertAt, 0, item)\n ordering.splice(insertAt, 0, item.key)\n }\n }\n }\n\n var iterations = 200\n while (iterations > 0 && index.length !== ordering.length) {\n iterations -= 1\n unordered.forEach(insertItem)\n }\n\n return ordered\n }\n}\n\nexport default OrderedList\n","import \"bootstrap/js/transition\"\nimport \"bootstrap/js/affix\"\nimport \"bootstrap/js/modal\"\nimport \"bootstrap/js/dropdown\"\nimport \"at-js\"\nimport \"cropit\"\nimport \"waypoints\"\nimport \"jquery-caret\"\nimport OrderedList from \"misago/utils/ordered-list\"\nimport \"misago/style/index.less\"\n\nexport class Misago {\n constructor() {\n this._initializers = []\n this._context = {}\n }\n\n addInitializer(initializer) {\n this._initializers.push({\n key: initializer.name,\n\n item: initializer.initializer,\n\n after: initializer.after,\n before: initializer.before,\n })\n }\n\n init(context) {\n this._context = context\n\n var initOrder = new OrderedList(this._initializers).orderedValues()\n initOrder.forEach((initializer) => {\n initializer(this)\n })\n }\n\n // context accessors\n has(key) {\n return !!this._context[key]\n }\n\n get(key, fallback) {\n if (this.has(key)) {\n return this._context[key]\n } else {\n return fallback || undefined\n }\n }\n\n pop(key) {\n if (this.has(key)) {\n let value = this._context[key]\n this._context[key] = null\n return value\n } else {\n return undefined\n }\n }\n}\n\n// create singleton\nvar misago = new Misago()\n\n// expose it globally\nwindow.misago = misago\n\n// and export it for tests and stuff\nexport default misago\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\n\nexport default function initializer() {\n ajax.init(misago.get(\"CSRF_COOKIE_NAME\"))\n}\n\nmisago.addInitializer({\n name: \"ajax\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nconst AUTH_SYNC_RATE = 45 // sync user with backend every 45 seconds\n\nexport default function initializer(context) {\n if (context.get(\"isAuthenticated\")) {\n window.setInterval(function () {\n ajax.get(context.get(\"AUTH_API\")).then(\n function (data) {\n store.dispatch(patch(data))\n },\n function (rejection) {\n snackbar.apiError(rejection)\n }\n )\n }, AUTH_SYNC_RATE * 1000)\n }\n}\n\nmisago.addInitializer({\n name: \"auth-sync\",\n initializer: initializer,\n after: \"auth\",\n})\n","import misago from \"misago/index\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport store from \"misago/services/store\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n auth.init(store, storage, modal)\n}\n\nmisago.addInitializer({\n name: \"auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport include from \"misago/services/include\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer(context) {\n captcha.init(context, ajax, include, snackbar)\n}\n\nmisago.addInitializer({\n name: \"captcha\",\n initializer: initializer,\n})\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class AcceptAgreement extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = { submiting: false }\n }\n\n handleDecline = () => {\n if (this.state.submiting) return\n\n const confirmation = window.confirm(\n gettext(\n \"Declining will result in immediate deactivation and deletion of your account. This action is not reversible.\"\n )\n )\n if (!confirmation) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: false }).then(() => {\n window.location.reload(true)\n })\n }\n\n handleAccept = () => {\n if (this.state.submiting) return\n\n this.setState({ submiting: true })\n\n ajax.post(this.props.api, { accept: true }).then(() => {\n window.location.reload(true)\n })\n }\n\n render() {\n return (\n
    \n \n {gettext(\"Decline\")}\n \n \n {gettext(\"Accept and continue\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport AcceptAgreement from \"misago/components/accept-agreement\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (document.getElementById(\"required-agreement-mount\")) {\n mount(\n ,\n \"required-agreement-mount\",\n false\n )\n }\n}\n\nmisago.addInitializer({\n name: \"component:accept-agreement\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nexport default class extends React.Component {\n refresh() {\n window.location.reload()\n }\n\n getMessage() {\n if (this.props.signedIn) {\n return interpolate(\n gettext(\n \"You have signed in as %(username)s. Please refresh the page before continuing.\"\n ),\n { username: this.props.signedIn.username },\n true\n )\n } else if (this.props.signedOut) {\n return interpolate(\n gettext(\n \"%(username)s, you have been signed out. Please refresh the page before continuing.\"\n ),\n { username: this.props.user.username },\n true\n )\n }\n }\n\n render() {\n let className = \"auth-message\"\n if (this.props.signedIn || this.props.signedOut) {\n className += \" show\"\n }\n\n return (\n
    \n
    \n

    {this.getMessage()}

    \n

    \n \n {gettext(\"Reload page\")}\n \n \n {\" \" + gettext(\"or press F5 key.\")}\n \n

    \n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n signedIn: state.auth.signedIn,\n signedOut: state.auth.signedOut,\n }\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport AuthMessage, { select } from \"misago/components/auth-message\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(AuthMessage), \"auth-message-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:auth-message\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default function initializer(context) {\n if (context.has(\"BAN_MESSAGE\")) {\n showBannedPage(context.get(\"BAN_MESSAGE\"), false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:banmed-page\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
      \n
    • \n

      \n {gettext(\n \"No categories exist or you don't have permission to see them.\"\n )}\n

      \n
    • \n
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ category }) {\n if (!category.description) return null\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function ({ category }) {\n return (\n
    \n {getIcon(category)}\n
    \n )\n}\n\nexport function getClassName(category) {\n if (category.is_read) {\n return \"read-status item-read\"\n }\n\n return \"read-status item-new\"\n}\n\nexport function getTitle(category) {\n if (category.is_closed) {\n if (category.is_read) {\n return gettext(\"This category has no new posts. (closed)\")\n }\n\n return gettext(\"This category has new posts. (closed)\")\n }\n\n if (category.is_read) {\n return gettext(\"This category has no new posts.\")\n }\n\n return gettext(\"This category has new posts.\")\n}\n\nexport function getIcon(category) {\n if (category.is_closed) {\n if (category.is_read) {\n return \"lock_outline\"\n }\n\n return \"lock\"\n }\n\n if (category.is_read) {\n return \"chat_bubble_outline\"\n }\n\n return \"chat_bubble\"\n}\n","import React from \"react\"\nimport Description from \"./description\"\nimport Icon from \"./icon\"\n\nexport default function ({ category }) {\n return (\n
    \n
    \n
    \n \n
    \n
    \n

    \n {category.name}\n

    \n \n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function ({ category }) {\n return (\n
    \n \n \n \n \n
    \n )\n}\n\nexport function LastThread({ category }) {\n if (!category.acl.can_browse) return null\n if (!category.acl.can_see_all_threads) return null\n if (!category.last_thread_title) return null\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n \n {category.last_thread_title}\n \n
    \n \n
    \n
    \n )\n}\n\nexport function LastPosterAvatar({ category }) {\n if (category.last_poster) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n\nexport function LastPosterName({ category }) {\n if (category.last_poster) {\n return (\n \n {category.last_poster_name}\n \n )\n }\n\n return {category.last_poster_name}\n}\n\nexport function Empty({ category }) {\n if (!category.acl.can_browse) return null\n if (!category.acl.can_see_all_threads) return null\n if (category.last_thread_title) return null\n\n return (\n \n )\n}\n\nexport function Private({ category }) {\n if (!category.acl.can_browse) return null\n if (category.acl.can_see_all_threads) return null\n\n return (\n \n )\n}\n\nexport function Protected({ category }) {\n if (category.acl.can_browse) return null\n\n return (\n \n )\n}\n\nexport function Message({ message }) {\n return (\n
    \n
    \n info_outline\n
    \n
    \n

    {message}

    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function ({ category }) {\n return (\n
    \n
      \n \n \n
    \n
    \n )\n}\n\nexport function Threads({ threads }) {\n const message = ngettext(\"%(threads)s thread\", \"%(threads)s threads\", threads)\n\n return (\n
  • \n {interpolate(\n message,\n {\n threads: threads,\n },\n true\n )}\n
  • \n )\n}\n\nexport function Posts({ posts }) {\n const message = ngettext(\"%(posts)s post\", \"%(posts)s posts\", posts)\n\n return (\n
  • \n {interpolate(\n message,\n {\n posts: posts,\n },\n true\n )}\n
  • \n )\n}\n","import React from \"react\"\n\nexport default function ({ category }) {\n let className = \"btn btn-default btn-block btn-sm btn-subcategory\"\n if (!category.is_read) {\n className += \" btn-subcategory-new\"\n }\n\n return (\n \n )\n}\n\nexport function getIcon(category) {\n if (category.is_closed) {\n if (category.is_read) {\n return \"lock_outline\"\n }\n\n return \"lock\"\n }\n\n if (category.is_read) {\n return \"chat_bubble_outline\"\n }\n\n return \"chat_bubble\"\n}\n","import React from \"react\"\nimport ListItem from \"./list-item\"\n\nexport default function ({ category, isFirst }) {\n if (isFirst) return null\n if (category.subcategories.length === 0) return null\n\n return (\n
    \n {category.subcategories.map((category) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport Main from \"./main\"\nimport LastThread from \"./last-thread\"\nimport Stats from \"./stats\"\nimport Subcategories from \"./subcategories\"\n\nexport default function ({ category, isFirst }) {\n let className = \"list-group-item\"\n\n if (category.description) {\n className += \" list-group-category-has-description\"\n } else {\n className += \" list-group-category-no-description\"\n }\n\n if (isFirst) {\n className += \" list-group-item-first\"\n }\n if (category.css_class) {\n className += \" list-group-category-has-flavor\"\n className += \" list-group-item-category-\" + category.css_class\n }\n\n return (\n
  • \n
    \n
    \n \n \n
    \n \n
  • \n )\n}\n","import React from \"react\"\nimport ListItem from \"./list-item\"\n\nexport default function ({ category }) {\n let className = \"list-group list-group-category\"\n if (category.css_class) {\n className += \" list-group-category-has-flavor\"\n className += \" list-group-category-\" + category.css_class\n }\n\n return (\n
      \n \n {category.subcategories.map((category) => {\n return (\n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Category from \"./category\"\n\nexport default function ({ categories }) {\n return (\n
    \n {categories.map((category) => {\n return \n })}\n
    \n )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport CategoriesList from \"./categories-list\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\n\nconst hydrate = function (category) {\n return Object.assign({}, category, {\n last_post_on: category.last_post_on ? moment(category.last_post_on) : null,\n subcategories: category.subcategories.map(hydrate),\n })\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n categories: misago.get(\"CATEGORIES\").map(hydrate),\n }\n\n this.startPolling(misago.get(\"CATEGORIES_API\"))\n }\n\n startPolling(api) {\n polls.start({\n poll: \"categories\",\n url: api,\n frequency: 180 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n this.setState({\n categories: data.map(hydrate),\n })\n }\n\n render() {\n const { categories } = this.state\n\n if (categories.length === 0) {\n return \n }\n\n return \n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n }\n}\n","import { connect } from \"react-redux\"\nimport Categories, { select } from \"misago/components/categories\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"categories-mount\")) {\n mount(connect(select)(Categories), \"categories-mount\")\n }\n}\n\nmisago.addInitializer({\n name: \"component:categories\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nexport function SideNav(props) {\n return (\n
    \n {props.options.map((option) => {\n return (\n \n {option.icon}\n {option.name}\n \n )\n })}\n
    \n )\n}\n\nexport function CompactNav(props) {\n return (\n
      \n {props.options.map((option) => {\n return (\n \n \n {option.icon}\n {option.name}\n \n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n password: \"\",\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Delete account\"),\n parent: gettext(\"Change your options\"),\n })\n }\n\n onPasswordChange = (event) => {\n this.setState({ password: event.target.value })\n }\n\n handleSubmit = (event) => {\n event.preventDefault()\n\n const { isLoading, password } = this.state\n const { user } = this.props\n\n if (password.length == 0) {\n snackbar.error(\n gettext(\"Enter your password to confirm account deletion.\")\n )\n return false\n }\n\n if (isLoading) return false\n this.setState({ isLoading: true })\n\n ajax.post(user.api.delete, { password }).then(\n (success) => {\n window.location.href = misago.get(\"MISAGO_PATH\")\n },\n (rejection) => {\n this.setState({ isLoading: false })\n if (rejection.password) {\n snackbar.error(rejection.password[0])\n } else {\n snackbar.apiError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    {gettext(\"Delete account\")}

    \n
    \n
    \n

    \n {gettext(\n \"You are going to delete your account. This action is nonreversible, and will result in following data being deleted:\"\n )}\n

    \n\n

    \n -{\" \"}\n {gettext(\n \"Stored IP addresses associated with content that you have posted will be deleted.\"\n )}\n

    \n

    \n -{\" \"}\n {gettext(\n \"Your username will become available for other user to rename to or for new user to register their account with.\"\n )}\n

    \n

    \n -{\" \"}\n {gettext(\n \"Your e-mail will become available for use in new account registration.\"\n )}\n

    \n\n
    \n\n

    \n {gettext(\n \"All your posted content will NOT be deleted, but username associated with it will be changed to one shared by all deleted accounts.\"\n )}\n

    \n
    \n
    \n
    \n \n \n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n componentDidMount() {\n title.set({\n title: gettext(\"Edit details\"),\n parent: gettext(\"Change your options\"),\n })\n }\n\n onSuccess = () => {\n snackbar.info(gettext(\"Your details have been updated.\"))\n }\n\n render() {\n return (\n
    \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class DownloadData extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n isSubmiting: false,\n downloads: [],\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Download your data\"),\n parent: gettext(\"Change your options\"),\n })\n\n this.handleLoadDownloads()\n }\n\n handleLoadDownloads = () => {\n ajax.get(this.props.user.api.data_downloads).then(\n (data) => {\n this.setState({\n isLoading: false,\n downloads: data,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n handleRequestDataDownload = () => {\n this.setState({ isSubmiting: true })\n ajax.post(this.props.user.api.request_data_download).then(\n () => {\n this.handleLoadDownloads()\n snackbar.success(\n gettext(\"Your request for data download has been registered.\")\n )\n this.setState({ isSubmiting: false })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n this.setState({ isSubmiting: false })\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    {gettext(\"Download your data\")}

    \n
    \n
    \n

    \n {gettext(\n 'To download your data from the site, click the \"Request data download\" button. Depending on amount of data to be archived and number of users wanting to download their data at same time it may take up to few days for your download to be prepared. An e-mail with notification will be sent to you when your data is ready to be downloaded.'\n )}\n

    \n\n

    \n {gettext(\n \"The download will only be available for limited amount of time, after which it will be deleted from the site and marked as expired.\"\n )}\n

    \n
    \n \n \n \n \n \n \n \n \n {this.state.downloads.map((item) => {\n return (\n \n \n \n \n )\n })}\n {this.state.downloads.length == 0 ? (\n \n \n \n ) : null}\n \n
    {gettext(\"Requested on\")}{gettext(\"Download\")}
    \n {moment(item.requested_on).fromNow()}\n \n \n
    {gettext(\"You have no data downloads.\")}
    \n
    \n \n {gettext(\"Request data download\")}\n \n
    \n
    \n
    \n )\n }\n}\n\nconst rowStyle = {\n verticalAlign: \"middle\",\n}\n\nconst STATUS_PENDING = 0\nconst STATUS_PROCESSING = 1\n\nconst DownloadButton = ({ exportFile, status }) => {\n if (status === STATUS_PENDING || status === STATUS_PROCESSING) {\n return (\n \n {gettext(\"Download is being prepared\")}\n \n )\n }\n\n if (exportFile) {\n return (\n \n {gettext(\"Download your data\")}\n \n )\n }\n\n return (\n \n {gettext(\"Download is expired\")}\n \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Select from \"misago/components/select\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n is_hiding_presence: props.user.is_hiding_presence,\n limits_private_thread_invites_to:\n props.user.limits_private_thread_invites_to,\n subscribe_to_started_threads: props.user.subscribe_to_started_threads,\n subscribe_to_replied_threads: props.user.subscribe_to_replied_threads,\n\n errors: {},\n }\n\n this.privateThreadInvitesChoices = [\n {\n value: 0,\n icon: \"help_outline\",\n label: gettext(\"Everybody\"),\n },\n {\n value: 1,\n icon: \"done_all\",\n label: gettext(\"Users I follow\"),\n },\n {\n value: 2,\n icon: \"highlight_off\",\n label: gettext(\"Nobody\"),\n },\n ]\n\n this.subscribeToChoices = [\n {\n value: 0,\n icon: \"star_border\",\n label: gettext(\"No\"),\n },\n {\n value: 1,\n icon: \"star_half\",\n label: gettext(\"Notify\"),\n },\n {\n value: 2,\n icon: \"star\",\n label: gettext(\"Notify with e-mail\"),\n },\n ]\n }\n\n send() {\n return ajax.post(this.props.user.api.options, {\n is_hiding_presence: this.state.is_hiding_presence,\n limits_private_thread_invites_to:\n this.state.limits_private_thread_invites_to,\n subscribe_to_started_threads: this.state.subscribe_to_started_threads,\n subscribe_to_replied_threads: this.state.subscribe_to_replied_threads,\n })\n }\n\n handleSuccess() {\n store.dispatch(\n patch({\n is_hiding_presence: this.state.is_hiding_presence,\n limits_private_thread_invites_to:\n this.state.limits_private_thread_invites_to,\n subscribe_to_started_threads: this.state.subscribe_to_started_threads,\n subscribe_to_replied_threads: this.state.subscribe_to_replied_threads,\n })\n )\n snackbar.success(gettext(\"Your forum options have been changed.\"))\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(gettext(\"Please reload page and try again.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Forum options\"),\n parent: gettext(\"Change your options\"),\n })\n }\n\n render() {\n return (\n \n
    \n
    \n

    {gettext(\"Change forum options\")}

    \n
    \n
    \n
    \n {gettext(\"Privacy settings\")}\n\n
    \n\n
    \n {gettext(\"Automatic subscriptions\")}\n\n \n \n \n\n \n \n \n
    \n
    \n
    \n \n
    \n
    \n \n )\n }\n}\n","import React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\n\nexport default function () {\n return (\n
    \n
    \n

    {gettext(\"Change username\")}

    \n
    \n \n
    \n )\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends React.Component {\n getHelpText() {\n if (this.props.options.next_on) {\n return interpolate(\n gettext(\"You will be able to change your username %(next_change)s.\"),\n { next_change: this.props.options.next_on.fromNow() },\n true\n )\n } else {\n return gettext(\"You have used up available name changes.\")\n }\n }\n\n render() {\n return (\n
    \n
    \n

    {gettext(\"Change username\")}

    \n
    \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n username: \"\",\n\n validators: {\n username: [\n validators.usernameContent(),\n validators.usernameMinLength(props.options.length_min),\n validators.usernameMaxLength(props.options.length_max),\n ],\n },\n\n isLoading: false,\n }\n }\n\n getHelpText() {\n let phrases = []\n\n if (this.props.options.changes_left > 0) {\n let message = ngettext(\n \"You can change your username %(changes_left)s more time.\",\n \"You can change your username %(changes_left)s more times.\",\n this.props.options.changes_left\n )\n\n phrases.push(\n interpolate(\n message,\n {\n changes_left: this.props.options.changes_left,\n },\n true\n )\n )\n }\n\n if (this.props.user.acl.name_changes_expire > 0) {\n let message = ngettext(\n \"Used changes become available again after %(name_changes_expire)s day.\",\n \"Used changes become available again after %(name_changes_expire)s days.\",\n this.props.user.acl.name_changes_expire\n )\n\n phrases.push(\n interpolate(\n message,\n {\n name_changes_expire: this.props.user.acl.name_changes_expire,\n },\n true\n )\n )\n }\n\n return phrases.length ? phrases.join(\" \") : null\n }\n\n clean() {\n let errors = this.validate()\n if (errors.username) {\n snackbar.error(errors.username[0])\n return false\n }\n if (this.state.username.trim() === this.props.user.username) {\n snackbar.info(gettext(\"Your new username is same as current one.\"))\n return false\n } else {\n return true\n }\n }\n\n send() {\n return ajax.post(this.props.user.api.username, {\n username: this.state.username,\n })\n }\n\n handleSuccess(success) {\n this.setState({\n username: \"\",\n })\n\n this.props.complete(success.username, success.slug, success.options)\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    {gettext(\"Change username\")}

    \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n
    \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport FormLoading from \"misago/components/options/change-username/form-loading\"\nimport FormLocked from \"misago/components/options/change-username/form-locked\"\nimport Form from \"misago/components/options/change-username/form\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n options: null,\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Change username\"),\n parent: gettext(\"Change your options\"),\n })\n\n Promise.all([\n ajax.get(this.props.user.api.username),\n ajax.get(misago.get(\"USERNAME_CHANGES_API\"), {\n user: this.props.user.id,\n }),\n ]).then((data) => {\n store.dispatch(hydrate(data[1].results))\n\n this.setState({\n isLoaded: true,\n options: {\n changes_left: data[0].changes_left,\n length_min: data[0].length_min,\n length_max: data[0].length_max,\n next_on: data[0].next_on ? moment(data[0].next_on) : null,\n },\n })\n })\n }\n\n onComplete = (username, slug, options) => {\n this.setState({\n options,\n })\n\n store.dispatch(\n addNameChange({ username, slug }, this.props.user, this.props.user)\n )\n store.dispatch(updateUsername(this.props.user, username, slug))\n\n snackbar.success(gettext(\"Your username has been changed successfully.\"))\n }\n\n getChangeForm() {\n if (!this.state.isLoaded) {\n return \n }\n\n if (this.state.options.changes_left === 0) {\n return \n }\n\n return (\n \n )\n }\n\n render() {\n return (\n
    \n {this.getChangeForm()}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n new_email: \"\",\n password: \"\",\n\n validators: {\n new_email: [validators.email()],\n password: [],\n },\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.new_email.trim().length,\n this.state.password.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(gettext(\"Fill out all fields.\"))\n return false\n }\n\n if (errors.new_email) {\n snackbar.error(errors.new_email[0])\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.user.api.change_email, {\n new_email: this.state.new_email,\n password: this.state.password,\n })\n }\n\n handleSuccess(response) {\n this.setState({\n new_email: \"\",\n password: \"\",\n })\n\n snackbar.success(response.detail)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.new_email) {\n snackbar.error(rejection.new_email)\n } else {\n snackbar.error(rejection.password)\n }\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n \n \n
    \n
    \n

    {gettext(\"Change e-mail address\")}

    \n
    \n
    \n \n \n \n\n
    \n\n \n \n \n
    \n
    \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n new_password: \"\",\n repeat_password: \"\",\n password: \"\",\n\n validators: {\n new_password: [],\n repeat_password: [],\n password: [],\n },\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.new_password.trim().length,\n this.state.repeat_password.trim().length,\n this.state.password.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(gettext(\"Fill out all fields.\"))\n return false\n }\n\n if (errors.new_password) {\n snackbar.error(errors.new_password[0])\n return false\n }\n\n if (this.state.new_password !== this.state.repeat_password) {\n snackbar.error(gettext(\"New passwords are different.\"))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.user.api.change_password, {\n new_password: this.state.new_password,\n password: this.state.password,\n })\n }\n\n handleSuccess(response) {\n this.setState({\n new_password: \"\",\n repeat_password: \"\",\n password: \"\",\n })\n\n snackbar.success(response.detail)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.new_password) {\n snackbar.error(rejection.new_password)\n } else {\n snackbar.error(rejection.password)\n }\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n \n \n
    \n
    \n

    {gettext(\"Change password\")}

    \n
    \n
    \n \n \n \n\n \n \n \n\n
    \n\n \n \n \n
    \n
    \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\n\nconst UnusablePasswordMessage = () => {\n return (\n
    \n
    \n

    {gettext(\"Change email or password\")}

    \n
    \n
    \n
    \n info_outline\n
    \n
    \n

    \n {gettext(\n \"You need to set a password for your account to be able to change your username or email.\"\n )}\n

    \n

    \n \n {gettext(\"Set password\")}\n \n

    \n
    \n
    \n
    \n )\n}\n\nexport default UnusablePasswordMessage\n","import React from \"react\"\nimport ChangeEmail from \"misago/components/options/sign-in-credentials/change-email\"\nimport ChangePassword from \"misago/components/options/sign-in-credentials/change-password\"\nimport misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\nimport UnusablePasswordMessage from \"./UnusablePasswordMessage\"\n\nexport default class extends React.Component {\n componentDidMount() {\n title.set({\n title: gettext(\"Change email or password\"),\n parent: gettext(\"Change your options\"),\n })\n }\n\n render() {\n if (!this.props.user.has_usable_password) {\n return \n }\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { SideNav, CompactNav } from \"misago/components/options/navs\"\nimport DeleteAccount from \"misago/components/options/delete-account\"\nimport EditDetails from \"misago/components/options/edit-details\"\nimport DownloadData from \"misago/components/options/download-data\"\nimport ChangeForumOptions from \"misago/components/options/forum-options\"\nimport ChangeUsername from \"misago/components/options/change-username/root\"\nimport ChangeSignInCredentials from \"misago/components/options/sign-in-credentials/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport PageContainer from \"../PageContainer\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n render() {\n const page = misago.get(\"USER_OPTIONS\").filter((page) => {\n const url = misago.get(\"USERCP_URL\") + page.component + \"/\"\n return this.props.location.pathname.substr(0, url.length) === url\n })[0]\n\n return (\n
    \n \n \n \n \n \n \n

    {gettext(\"Change your options\")}

    \n
    \n \n
    \n \n menu\n \n \n
    \n
    \n
    \n \n \n
    \n \n {page.icon}\n {page.name}\n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    {this.props.children}
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n user: store.auth.user,\n \"username-history\": store[\"username-history\"],\n }\n}\n\nexport function paths() {\n const paths = [\n {\n path: misago.get(\"USERCP_URL\") + \"forum-options/\",\n component: connect(select)(ChangeForumOptions),\n },\n {\n path: misago.get(\"USERCP_URL\") + \"edit-details/\",\n component: connect(select)(EditDetails),\n },\n ]\n\n const delegateAuth = misago.get(\"SETTINGS\").DELEGATE_AUTH\n if (!delegateAuth) {\n paths.push({\n path: misago.get(\"USERCP_URL\") + \"change-username/\",\n component: connect(select)(ChangeUsername),\n })\n paths.push({\n path: misago.get(\"USERCP_URL\") + \"sign-in-credentials/\",\n component: connect(select)(ChangeSignInCredentials),\n })\n }\n\n if (misago.get(\"ENABLE_DOWNLOAD_OWN_DATA\")) {\n paths.push({\n path: misago.get(\"USERCP_URL\") + \"download-data/\",\n component: connect(select)(DownloadData),\n })\n }\n\n if (!delegateAuth && misago.get(\"ENABLE_DELETE_OWN_ACCOUNT\")) {\n paths.push({\n path: misago.get(\"USERCP_URL\") + \"delete-account/\",\n component: connect(select)(DeleteAccount),\n })\n }\n\n return paths\n}\n","import Options, { paths } from \"misago/components/options/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"USER_OPTIONS\")) {\n mount({\n root: misago.get(\"USERCP_URL\"),\n component: Options,\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:options\",\n initializer: initializer,\n after: \"store\",\n})\n","import moment from \"moment\"\nimport React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\nimport PanelMessage from \"misago/components/panel-message\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_BAN\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_BAN\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.profile.api.ban)\n }\n\n initWithPreloadedData(ban) {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.state = {\n isLoaded: true,\n ban,\n }\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(api) {\n polls.start({\n poll: \"ban-details\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n error: this.error,\n })\n }\n\n update = (ban) => {\n if (ban.expires_on) {\n ban.expires_on = moment(ban.expires_on)\n }\n\n this.setState({\n isLoaded: true,\n error: null,\n\n ban,\n })\n }\n\n error = (error) => {\n this.setState({\n isLoaded: true,\n error: error.detail,\n ban: null,\n })\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Ban details\"),\n parent: this.props.profile.username,\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"ban-details\")\n }\n\n getUserMessage() {\n if (this.state.ban.user_message) {\n return (\n
    \n

    {gettext(\"User-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getStaffMessage() {\n if (this.state.ban.staff_message) {\n return (\n
    \n

    {gettext(\"Team-shown ban message\")}

    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getExpirationMessage() {\n if (this.state.ban.expires_on) {\n if (this.state.ban.expires_on.isAfter(moment())) {\n let title = interpolate(\n gettext(\"This ban expires on %(expires_on)s.\"),\n {\n expires_on: this.state.ban.expires_on.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n gettext(\"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.state.ban.expires_on.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return gettext(\"This ban has expired.\")\n }\n } else {\n return interpolate(\n gettext(\"%(username)s's ban is permanent.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getPanelBody() {\n if (this.state.ban) {\n if (Object.keys(this.state.ban).length) {\n return (\n
    \n {this.getUserMessage()}\n {this.getStaffMessage()}\n\n
    \n

    {gettext(\"Ban expiration\")}

    \n

    {this.getExpirationMessage()}

    \n
    \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n } else if (this.state.error) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n

    {gettext(\"Ban details\")}

    \n
    \n\n {this.getPanelBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\n\nexport default function ({ api, display, onCancel, onSuccess }) {\n if (!display) return null\n\n return
    \n}\n","import React from \"react\"\n\nexport default function ({ isAuthenticated, profile }) {\n let message = null\n if (isAuthenticated) {\n message = gettext(\"You are not sharing any details with others.\")\n } else {\n message = interpolate(\n gettext(\"%(username)s is not sharing any details with others.\"),\n {\n username: profile.username,\n },\n true\n )\n }\n\n return (\n
    \n
    {message}
    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function ({ html, text, url }) {\n if (html) {\n return (\n \n )\n }\n\n return (\n
    \n \n
    \n )\n}\n\nexport function SafeValue({ text, url }) {\n if (url) {\n return (\n

    \n \n {text || url}\n \n

    \n )\n }\n\n if (text) {\n return

    {text}

    \n }\n\n return null\n}\n","import React from \"react\"\nimport FieldValue from \"./field-value\"\n\nexport default function (props) {\n return (\n
    \n {props.name}:\n \n
    \n )\n}\n","import React from \"react\"\nimport Field from \"./field\"\n\nexport default function ({ fields, name }) {\n return (\n
    \n
    \n

    {name}

    \n
    \n
    \n
    \n {fields.map(({ fieldname, html, name, text, url }) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n )\n}\n","import React from \"react\"\nimport EmptyMessage from \"./empty-message\"\nimport Group from \"./group\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({\n display,\n groups,\n isAuthenticated,\n loading,\n profile,\n}) {\n if (!display) return null\n\n if (loading) {\n return \n }\n\n if (!groups.length) {\n return \n }\n\n return (\n
    \n {groups.map((group, i) => {\n return \n })}\n
    \n )\n}\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nconst ProfileDetailsHeader = ({ onEdit, showEditButton }) => (\n \n \n \n

    {gettext(\"Details\")}

    \n
    \n
    \n {showEditButton && (\n \n \n \n {gettext(\"Edit\")}\n \n \n \n )}\n
    \n)\n\nexport default ProfileDetailsHeader\n","import React from \"react\"\nimport { load } from \"misago/reducers/profile-details\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n componentDidMount() {\n const { data, dispatch, user } = this.props\n if (data && data.id === user.id) return\n\n ajax.get(this.props.user.api.details).then(\n (data) => {\n dispatch(load(data))\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return this.props.children\n }\n}\n","import React from \"react\"\nimport Form from \"./form\"\nimport GroupsList from \"./groups-list\"\nimport Header from \"./header\"\nimport ProfileDetailsData from \"misago/data/profile-details\"\nimport { load as loadDetails } from \"misago/reducers/profile-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n editing: false,\n }\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Details\"),\n parent: this.props.profile.username,\n })\n }\n\n onCancel = () => {\n this.setState({ editing: false })\n }\n\n onEdit = () => {\n this.setState({ editing: true })\n }\n\n onSuccess = (newDetails) => {\n const { dispatch, isAuthenticated, profile } = this.props\n\n let message = null\n if (isAuthenticated) {\n message = gettext(\"Your details have been updated.\")\n } else {\n message = interpolate(\n gettext(\"%(username)s's details have been updated.\"),\n {\n username: profile.username,\n },\n true\n )\n }\n\n snackbar.info(message)\n dispatch(loadDetails(newDetails))\n this.setState({ editing: false })\n }\n\n render() {\n const { dispatch, isAuthenticated, profile, profileDetails } = this.props\n const loading = profileDetails.id !== profile.id\n\n return (\n \n
    \n \n \n \n
    \n \n )\n }\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport * as posts from \"misago/reducers/posts\"\nimport title from \"misago/services/page-title\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n loadItems(start = 0) {\n ajax\n .get(this.props.api, {\n start: start || 0,\n })\n .then(\n (data) => {\n if (start === 0) {\n store.dispatch(posts.load(data))\n } else {\n store.dispatch(posts.append(data))\n }\n\n this.setState({\n isLoading: false,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.apiError(rejection)\n }\n )\n }\n\n loadMore = () => {\n this.setState({\n isLoading: true,\n })\n\n this.loadItems(this.props.posts.next)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.title,\n parent: this.props.profile.username,\n })\n\n this.loadItems()\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.props.header}

    \n
    \n
    \n
    \n \n
    \n )\n }\n}\n\nexport function Feed(props) {\n if (props.posts.isLoaded && !props.posts.results.length) {\n return

    {props.emptyMessage}

    \n }\n\n return (\n
    \n \n \n
    \n )\n}\n\nexport function LoadMoreButton(props) {\n if (!props.next) return null\n\n return (\n
    \n \n {gettext(\"Show older activity\")}\n \n
    \n )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.className) {\n return \"form-search \" + this.props.className\n } else {\n return \"form-search\"\n }\n }\n\n render() {\n return (\n
    \n \n search\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsersList from \"misago/components/users-list\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.setSpecialProps()\n\n if (misago.has(this.PRELOADED_DATA_KEY)) {\n this.initWithPreloadedData(misago.pop(this.PRELOADED_DATA_KEY))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWERS\"\n this.TITLE = gettext(\"Followers\")\n this.API_FILTER = \"followers\"\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadUsers()\n }\n\n loadUsers(page = 1, search = null) {\n const apiUrl = this.props.profile.api[this.API_FILTER]\n\n ajax\n .get(\n apiUrl,\n {\n search: search,\n page: page || 1,\n },\n \"user-\" + this.API_FILTER\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: this.TITLE,\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadUsers(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadUsers(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return gettext(\"Loading...\")\n } else if (this.state.search) {\n let message = ngettext(\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = ngettext(\n \"You have %(users)s follower.\",\n \"You have %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = ngettext(\n \"%(username)s has %(users)s follower.\",\n \"%(username)s has %(users)s followers.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return gettext(\"Search returned no users matching specified criteria.\")\n } else if (this.props.user.id === this.props.profile.id) {\n return gettext(\"You have no followers.\")\n } else {\n return interpolate(\n gettext(\"%(username)s has no followers.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n gettext(\"Show more (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n getListBody() {\n if (this.state.isLoaded && this.state.count === 0) {\n return

    {this.getEmptyMessage()}

    \n }\n\n return (\n
    \n \n\n {this.getMoreButton()}\n
    \n )\n }\n\n getClassName() {\n return \"profile-\" + this.API_FILTER\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n {this.getListBody()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/username-history\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"PROFILE_NAME_HISTORY\")) {\n this.initWithPreloadedData(misago.pop(\"PROFILE_NAME_HISTORY\"))\n } else {\n this.initWithoutPreloadedData()\n }\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n isBusy: false,\n\n search: \"\",\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n isBusy: false,\n\n search: \"\",\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n }\n\n this.loadChanges()\n }\n\n loadChanges(page = 1, search = null) {\n ajax\n .get(\n misago.get(\"USERNAME_CHANGES_API\"),\n {\n user: this.props.profile.id,\n search: search,\n page: page || 1,\n },\n \"search-username-history\"\n )\n .then(\n (data) => {\n if (page === 1) {\n store.dispatch(hydrate(data.results))\n } else {\n store.dispatch(append(data.results))\n }\n\n this.setState({\n isLoaded: true,\n isBusy: false,\n\n count: data.count,\n more: data.more,\n\n page: data.page,\n pages: data.pages,\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }\n\n componentDidMount() {\n title.set({\n title: gettext(\"Username history\"),\n parent: this.props.profile.username,\n })\n }\n\n loadMore = () => {\n this.setState({\n isBusy: true,\n })\n\n this.loadChanges(this.state.page + 1, this.state.search)\n }\n\n search = (ev) => {\n this.setState({\n isLoaded: false,\n isBusy: true,\n\n search: ev.target.value,\n\n count: 0,\n more: 0,\n\n page: 1,\n pages: 1,\n })\n\n this.loadChanges(1, ev.target.value)\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return gettext(\"Loading...\")\n } else if (this.state.search) {\n let message = ngettext(\n \"Found %(changes)s username change.\",\n \"Found %(changes)s username changes.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = ngettext(\n \"Your username was changed %(changes)s time.\",\n \"Your username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n changes: this.state.count,\n },\n true\n )\n } else {\n let message = ngettext(\n \"%(username)s's username was changed %(changes)s time.\",\n \"%(username)s's username was changed %(changes)s times.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n changes: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return gettext(\n \"Search returned no username changes matching specified criteria.\"\n )\n } else if (this.props.user.id === this.props.profile.id) {\n return gettext(\"No name changes have been recorded for your account.\")\n } else {\n return interpolate(\n gettext(\"%(username)s's username was never changed.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n\n getMoreButton() {\n if (!this.state.more) return null\n\n return (\n
    \n \n {interpolate(\n gettext(\"Show older (%(more)s)\"),\n {\n more: this.state.more,\n },\n true\n )}\n \n
    \n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {this.getLabel()}

    \n
    \n
    \n \n \n \n \n \n
    \n\n \n\n {this.getMoreButton()}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport { patch } from \"misago/reducers/profile\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n getClassName() {\n if (this.props.profile.is_followed) {\n return this.props.className + \" btn-default btn-following\"\n } else {\n return this.props.className + \" btn-default btn-follow\"\n }\n }\n\n getIcon() {\n if (this.props.profile.is_followed) {\n return \"favorite\"\n } else {\n return \"favorite_border\"\n }\n }\n\n getLabel() {\n if (this.props.profile.is_followed) {\n return gettext(\"Following\")\n } else {\n return gettext(\"Follow\")\n }\n }\n\n action = () => {\n this.setState({\n isLoading: true,\n })\n\n if (this.props.profile.is_followed) {\n store.dispatch(\n patch({\n is_followed: false,\n followers: this.props.profile.followers - 1,\n })\n )\n } else {\n store.dispatch(\n patch({\n is_followed: true,\n followers: this.props.profile.followers + 1,\n })\n )\n }\n\n ajax.post(this.props.profile.api.follow).then(\n (data) => {\n this.setState({\n isLoading: false,\n })\n\n store.dispatch(patch(data))\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n })\n snackbar.apiError(rejection)\n }\n )\n }\n\n render() {\n return (\n \n {this.getIcon()}\n {this.getLabel()}\n \n )\n }\n}\n","import React from \"react\"\nimport posting from \"misago/services/posting\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"START_PRIVATE\",\n submit: misago.get(\"PRIVATE_THREADS_API\"),\n\n to: [this.props.profile],\n })\n }\n\n render() {\n const canMessage = this.props.user.acl.can_start_private_threads\n const isProfileOwner = this.props.user.id === this.props.profile.id\n\n if (!canMessage || isProfileOwner) return null\n\n return (\n \n comment\n {gettext(\"Message\")}\n \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n is_avatar_locked: \"\",\n avatar_lock_user_message: \"\",\n avatar_lock_staff_message: \"\",\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_avatar).then(\n (options) => {\n this.setState({\n isLoaded: true,\n\n is_avatar_locked: options.is_avatar_locked,\n avatar_lock_user_message: options.avatar_lock_user_message || \"\",\n avatar_lock_staff_message: options.avatar_lock_staff_message || \"\",\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_avatar, {\n is_avatar_locked: this.state.is_avatar_locked,\n avatar_lock_user_message: this.state.avatar_lock_user_message,\n avatar_lock_staff_message: this.state.avatar_lock_staff_message,\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(updateAvatar(this.props.profile, apiResponse.avatar_hash))\n snackbar.success(gettext(\"Avatar controls have been changed.\"))\n }\n\n getFormBody() {\n return (\n \n
    \n \n \n \n\n \n \n \n\n \n \n \n
    \n
    \n \n {gettext(\"Close\")}\n \n \n
    \n \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-avatar-controls\"\n } else {\n return \"modal-dialog modal-avatar-controls\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Avatar controls\")}

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n error: null,\n\n username: \"\",\n validators: {\n username: [validators.usernameContent()],\n },\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.moderate_username).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(this.validate().username[0])\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.profile.api.moderate_username, {\n username: this.state.username,\n })\n }\n\n handleSuccess(apiResponse) {\n this.setState({\n username: \"\",\n })\n\n store.dispatch(\n addNameChange(apiResponse, this.props.profile, this.props.user)\n )\n store.dispatch(\n updateUsername(this.props.profile, apiResponse.username, apiResponse.slug)\n )\n\n snackbar.success(gettext(\"Username has been changed.\"))\n }\n\n getFormBody() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n return this.getFormBody()\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error) {\n return \"modal-dialog modal-message modal-rename-user\"\n } else {\n return \"modal-dialog modal-rename-user\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Change username\")}

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isLoading: false,\n isDeleted: false,\n error: null,\n\n countdown: 5,\n confirm: false,\n\n with_content: false,\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.profile.api.delete).then(\n () => {\n this.setState({\n isLoaded: true,\n })\n\n this.countdown()\n },\n (rejection) => {\n this.setState({\n isLoaded: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n countdown = () => {\n window.setTimeout(() => {\n if (this.state.countdown > 1) {\n this.setState({\n countdown: this.state.countdown - 1,\n })\n this.countdown()\n } else if (!this.state.confirm) {\n this.setState({\n confirm: true,\n })\n }\n }, 1000)\n }\n\n send() {\n return ajax.post(this.props.profile.api.delete, {\n with_content: this.state.with_content,\n })\n }\n\n handleSuccess() {\n polls.stop(\"user-profile\")\n\n if (this.state.with_content) {\n this.setState({\n isDeleted: interpolate(\n gettext(\n \"%(username)s's account, threads, posts and other content has been deleted.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n } else {\n this.setState({\n isDeleted: interpolate(\n gettext(\n \"%(username)s's account has been deleted and other content has been hidden.\"\n ),\n {\n username: this.props.profile.username,\n },\n true\n ),\n })\n }\n }\n\n getButtonLabel() {\n if (this.state.confirm) {\n return interpolate(\n gettext(\"Delete %(username)s\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n } else {\n return interpolate(\n gettext(\"Please wait... (%(countdown)ss)\"),\n {\n countdown: this.state.countdown,\n },\n true\n )\n }\n }\n\n getForm() {\n return (\n
    \n
    \n \n \n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n\n \n {this.getButtonLabel()}\n \n
    \n
    \n )\n }\n\n getDeletedBody() {\n return (\n
    \n
    \n info_outline\n
    \n
    \n

    {this.state.isDeleted}

    \n

    \n \n {gettext(\"Return to users list\")}\n \n

    \n
    \n
    \n )\n }\n\n getModalBody() {\n if (this.state.error) {\n return (\n \n )\n } else if (this.state.isLoaded) {\n if (this.state.isDeleted) {\n return this.getDeletedBody()\n } else {\n return this.getForm()\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state.error || this.state.isDeleted) {\n return \"modal-dialog modal-message modal-delete-account\"\n } else {\n return \"modal-dialog modal-delete-account\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Delete user account\")}

    \n
    \n {this.getModalBody()}\n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport AvatarControls from \"misago/components/profile/moderation/avatar-controls\"\nimport ChangeUsername from \"misago/components/profile/moderation/change-username\"\nimport DeleteAccount from \"misago/components/profile/moderation/delete-account\"\nimport modal from \"misago/services/modal\"\n\nlet select = function (store) {\n return {\n tick: store.tick,\n user: store.auth,\n profile: store.profile,\n }\n}\n\nexport default class extends React.Component {\n showAvatarDialog = () => {\n modal.show(connect(select)(AvatarControls))\n }\n\n showRenameDialog = () => {\n modal.show(connect(select)(ChangeUsername))\n }\n\n showDeleteDialog = () => {\n modal.show(connect(select)(DeleteAccount))\n }\n\n render() {\n const { moderation } = this.props\n\n return (\n
      \n {!!moderation.avatar && (\n
    • \n \n portrait\n {gettext(\"Avatar controls\")}\n \n
    • \n )}\n {!!moderation.rename && (\n
    • \n \n credit_card\n {gettext(\"Change username\")}\n \n
    • \n )}\n {!!moderation.delete && (\n
    • \n \n clear\n {gettext(\"Delete account\")}\n \n
    • \n )}\n
    \n )\n }\n}\n","import React from \"react\"\nimport Status, { StatusIcon, StatusLabel } from \"../user-status\"\n\nconst ProfileDataList = ({ profile }) => (\n
      \n {profile.is_active === false && (\n
    • \n \n {gettext(\"Account disabled\")}\n \n
    • \n )}\n
    • \n \n \n \n \n
    • \n {profile.rank.is_tab ? (\n
    • \n \n {profile.rank.name}\n \n
    • \n ) : (\n
    • \n {profile.rank.name}\n
    • \n )}\n {(profile.title || profile.rank.title) && (\n
    • {profile.title || profile.rank.title}
    • \n )}\n
    • \n \n {interpolate(\n gettext(\"Joined %(joined_on)s\"),\n {\n joined_on: profile.joined_on.fromNow(),\n },\n true\n )}\n \n
    • \n {profile.email && (\n
    • \n \n {profile.email}\n \n
    • \n )}\n
    \n)\n\nexport default ProfileDataList\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n PageHeaderDetails,\n} from \"../PageHeader\"\nimport FollowButton from \"./follow-button\"\nimport MessageButton from \"./message-button\"\nimport ModerationOptions from \"./moderation/nav\"\nimport ProfileDataList from \"./ProfileDataList\"\n\nconst ProfileHeader = ({ profile, user, moderation, message, follow }) => (\n \n \n \n
    \n
    \n \n \n \n
    \n

    {profile.username}

    \n
    \n \n \n \n \n \n \n \n \n {message && (\n \n \n \n \n {moderation.available && !follow && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {follow && (\n \n \n \n \n {moderation.available && (\n \n
    \n \n \n
    \n
    \n )}\n
    \n )}\n {moderation.available && !follow && !message && (\n \n \n
    \n \n \n
    \n
    \n \n
    \n \n settings\n {gettext(\"Options\")}\n \n \n
    \n
    \n
    \n )}\n
    \n
    \n \n
    \n)\n\nconst ProfileModerationButton = () => (\n \n settings\n \n)\n\nexport default ProfileHeader\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst ProfileNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n {page.icon}\n {page.name}\n \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n
      \n {pages.map((page) => (\n
    • \n \n {page.icon}\n {page.name}\n \n
    • \n ))}\n
    \n
    \n)\n\nexport default ProfileNav\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport BanDetails from \"./ban-details\"\nimport Details from \"./details\"\nimport { Posts, Threads } from \"./feed\"\nimport Followers from \"./followers\"\nimport Follows from \"./follows\"\nimport UsernameHistory from \"./username-history\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport PageContainer from \"../PageContainer\"\nimport ProfileHeader from \"./ProfileHeader\"\nimport ProfileNav from \"./ProfileNav\"\n\nexport default class extends WithDropdown {\n constructor(props) {\n super(props)\n\n this.startPolling(props.profile.api.index)\n }\n\n startPolling(api) {\n polls.start({\n poll: \"user-profile\",\n url: api,\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data))\n }\n\n render() {\n const baseUrl = misago.get(\"PROFILE\").url\n const pages = misago.get(\"PROFILE_PAGES\")\n const page = pages.filter((page) => {\n const url = baseUrl + page.component + \"/\"\n return this.props.location.pathname === url\n })[0]\n const { profile, user } = this.props\n const moderation = getModeration(profile, user)\n const message =\n !!user.acl.can_start_private_threads && profile.id !== user.id\n const follow = !!profile.acl.can_follow && profile.id !== user.id\n\n return (\n
    \n \n \n \n\n {this.props.children}\n \n
    \n )\n }\n}\n\nconst getModeration = (profile, user) => {\n const moderation = {\n available: false,\n rename: false,\n avatar: false,\n delete: false,\n }\n\n if (user.is_anonymous) return moderation\n\n moderation.rename = profile.acl.can_rename\n moderation.avatar = profile.acl.can_moderate_avatar\n moderation.delete = profile.acl.can_delete\n moderation.available = !!(\n moderation.rename ||\n moderation.avatar ||\n moderation.delete\n )\n\n return moderation\n}\n\nexport function select(store) {\n return {\n isAuthenticated: store.auth.user.id === store.profile.id,\n\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n posts: store.posts,\n profile: store.profile,\n profileDetails: store[\"profile-details\"],\n \"username-history\": store[\"username-history\"],\n }\n}\n\nconst COMPONENTS = {\n posts: Posts,\n threads: Threads,\n followers: Followers,\n follows: Follows,\n details: Details,\n \"username-history\": UsernameHistory,\n \"ban-details\": BanDetails,\n}\n\nexport function paths() {\n let paths = []\n misago.get(\"PROFILE_PAGES\").forEach(function (item) {\n paths.push(\n Object.assign({}, item, {\n path: misago.get(\"PROFILE\").url + item.component + \"/\",\n component: connect(select)(COMPONENTS[item.component]),\n })\n )\n })\n\n return paths\n}\n","import React from \"react\"\nimport Route from \"./route\"\n\nexport function Threads(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = gettext(\"You have no started threads.\")\n } else {\n emptyMessage = interpolate(\n gettext(\"%(username)s started no threads.\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = gettext(\"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = ngettext(\n \"You have started %(threads)s thread.\",\n \"You have started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n threads: props.profile.threads,\n },\n true\n )\n } else {\n const message = ngettext(\n \"%(username)s has started %(threads)s thread.\",\n \"%(username)s has started %(threads)s threads.\",\n props.profile.threads\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n threads: props.profile.threads,\n },\n true\n )\n }\n\n return (\n \n )\n}\n\nexport function Posts(props) {\n let emptyMessage = null\n if (props.user.id === props.profile.id) {\n emptyMessage = gettext(\"You have posted no messages.\")\n } else {\n emptyMessage = interpolate(\n gettext(\"%(username)s posted no messages.\"),\n {\n username: props.profile.username,\n },\n true\n )\n }\n\n let header = null\n if (!props.posts.isLoaded) {\n header = gettext(\"Loading...\")\n } else if (props.profile.id === props.user.id) {\n const message = ngettext(\n \"You have posted %(posts)s message.\",\n \"You have posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n posts: props.profile.posts,\n },\n true\n )\n } else {\n const message = ngettext(\n \"%(username)s has posted %(posts)s message.\",\n \"%(username)s has posted %(posts)s messages.\",\n props.profile.posts\n )\n\n header = interpolate(\n message,\n {\n username: props.profile.username,\n posts: props.profile.posts,\n },\n true\n )\n }\n\n return (\n \n )\n}\n","import React from \"react\"\nimport Followers from \"misago/components/profile/followers\"\n\nexport default class extends Followers {\n setSpecialProps() {\n this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWS\"\n this.TITLE = gettext(\"Follows\")\n this.API_FILTER = \"follows\"\n }\n\n getLabel() {\n if (!this.state.isLoaded) {\n return gettext(\"Loading...\")\n } else if (this.state.search) {\n let message = ngettext(\n \"Found %(users)s user.\",\n \"Found %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else if (this.props.profile.id === this.props.user.id) {\n let message = ngettext(\n \"You are following %(users)s user.\",\n \"You are following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n users: this.state.count,\n },\n true\n )\n } else {\n let message = ngettext(\n \"%(username)s is following %(users)s user.\",\n \"%(username)s is following %(users)s users.\",\n this.state.count\n )\n\n return interpolate(\n message,\n {\n username: this.props.profile.username,\n users: this.state.count,\n },\n true\n )\n }\n }\n\n getEmptyMessage() {\n if (this.state.search) {\n return gettext(\"Search returned no users matching specified criteria.\")\n } else if (this.props.user.id === this.props.profile.id) {\n return gettext(\"You are not following any users.\")\n } else {\n return interpolate(\n gettext(\"%(username)s is not following any users.\"),\n {\n username: this.props.profile.username,\n },\n true\n )\n }\n }\n}\n","import { connect } from \"react-redux\"\nimport Profile, { paths, select } from \"misago/components/profile/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"PROFILE\") && context.has(\"PROFILE_PAGES\")) {\n mount({\n root: misago.get(\"PROFILE\").url,\n component: connect(select)(Profile),\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:profile\",\n initializer: initializer,\n after: \"reducer:profile-hydrate\",\n})\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestLinkForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Enter a valid email address.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_ACTIVATION_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"already_active\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n snackbar.info(rejection.detail)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {gettext(\"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n gettext(\"Activation link was sent to %(email)s\"),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {gettext(\"Request another link\")}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n render() {\n if (this.state.complete) {\n return \n } else {\n return \n }\n }\n}\n","import misago from \"misago/index\"\nimport RequestActivationLink from \"misago/components/request-activation-link\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-activation-link-mount\")) {\n mount(RequestActivationLink, \"request-activation-link-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-activation-link\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestResetForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n email: \"\",\n\n validators: {\n email: [validators.email()],\n },\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Enter a valid email address.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"SEND_PASSWORD_RESET_API\"), {\n email: this.state.email,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if ([\"inactive_user\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n this.props.showInactivePage(rejection)\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {gettext(\"Send link\")}\n \n \n
    \n )\n }\n}\n\nexport class LinkSent extends React.Component {\n getMessage() {\n return interpolate(\n gettext(\"Reset password link was sent to %(email)s\"),\n {\n email: this.props.user.email,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n check\n
    \n
    \n

    {this.getMessage()}

    \n
    \n \n {gettext(\"Request another link\")}\n \n
    \n
    \n )\n }\n}\n\nexport class AccountInactivePage extends React.Component {\n getActivateButton() {\n if (this.props.activation === \"inactive_user\") {\n return (\n

    \n \n {gettext(\"Activate your account.\")}\n \n

    \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n info_outline\n
    \n\n
    \n

    {gettext(\"Your account is inactive.\")}

    \n

    {this.props.message}

    \n {this.getActivateButton()}\n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n complete = (apiResponse) => {\n this.setState({\n complete: apiResponse,\n })\n }\n\n reset = () => {\n this.setState({\n complete: false,\n })\n }\n\n showInactivePage(apiResponse) {\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n if (this.state.complete) {\n return \n }\n\n return (\n \n )\n }\n}\n","import misago from \"misago/index\"\nimport RequestPasswordReset from \"misago/components/request-password-reset\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"request-password-reset-mount\")) {\n mount(RequestPasswordReset, \"request-password-reset-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:request-password-reset\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class ResetPasswordForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n password: \"\",\n }\n }\n\n clean() {\n if (this.state.password.trim().length) {\n return true\n } else {\n snackbar.error(gettext(\"Enter new password.\"))\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"CHANGE_PASSWORD_API\"), {\n password: this.state.password,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n\n \n {gettext(\"Change password\")}\n \n \n
    \n )\n }\n}\n\nexport class PasswordChangedPage extends React.Component {\n getMessage() {\n return interpolate(\n gettext(\"%(username)s, your password has been changed successfully.\"),\n {\n username: this.props.user.username,\n },\n true\n )\n }\n\n showSignIn() {\n modal.show(SignInModal)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n check\n
    \n\n
    \n

    {this.getMessage()}

    \n

    \n {gettext(\n \"You will have to sign in using new password before continuing.\"\n )}\n

    \n

    \n \n {gettext(\"Sign in\")}\n \n

    \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n complete = (apiResponse) => {\n auth.softSignOut()\n\n // nuke \"redirect_to\" field so we don't end\n // coming back to error page after sign in\n $('#hidden-login-form input[name=\"redirect_to\"]').remove()\n\n ReactDOM.render(\n ,\n document.getElementById(\"page-mount\")\n )\n }\n\n render() {\n return \n }\n}\n","import misago from \"misago\"\nimport ResetPasswordForm from \"misago/components/reset-password-form\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n if (document.getElementById(\"reset-password-form-mount\")) {\n mount(ResetPasswordForm, \"reset-password-form-mount\", false)\n }\n}\n\nmisago.addInitializer({\n name: \"component:reset-password-form\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport misago from \"misago\"\nimport Form from \"misago/components/form\"\nimport { load as updatePosts } from \"misago/reducers/posts\"\nimport { update as updateSearch } from \"misago/reducers/search\"\nimport { hydrate as updateUsers } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n PageHeader,\n PageHeaderContainer,\n PageHeaderBanner,\n PageHeaderDetails,\n} from \"../PageHeader\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n query: props.search.query,\n }\n }\n\n componentDidMount() {\n if (this.state.query.length) {\n this.handleSubmit()\n }\n }\n\n onQueryChange = (event) => {\n this.changeValue(\"query\", event.target.value)\n }\n\n clean() {\n if (!this.state.query.trim().length) {\n snackbar.error(gettext(\"You have to enter search query.\"))\n return false\n }\n\n return true\n }\n\n send() {\n store.dispatch(\n updateSearch({\n isLoading: true,\n })\n )\n\n const query = this.state.query.trim()\n\n let url = window.location.href\n const urlQuery = url.indexOf(\"?q=\")\n if (urlQuery > 0) {\n url = url.substring(0, urlQuery + 3)\n }\n window.history.pushState({}, \"\", url + encodeURIComponent(query))\n\n return ajax.get(misago.get(\"SEARCH_API\"), { q: query })\n }\n\n handleSuccess(providers) {\n store.dispatch(\n updateSearch({\n query: this.state.query.trim(),\n isLoading: false,\n providers,\n })\n )\n\n providers.forEach((provider) => {\n if (provider.id === \"users\") {\n store.dispatch(updateUsers(provider.results.results))\n } else if (provider.id === \"threads\") {\n store.dispatch(updatePosts(provider.results))\n }\n })\n }\n\n handleError(rejection) {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updateSearch({\n isLoading: false,\n })\n )\n }\n\n render() {\n return (\n
    \n \n \n \n

    {gettext(\"Search\")}

    \n
    \n \n \n \n \n \n \n \n \n search\n \n \n \n \n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function (props) {\n return (\n
    \n {props.providers.map((provider) => {\n return (\n \n {provider.icon}\n {provider.name}\n \n \n )\n })}\n
    \n )\n}\n\nexport function Badge(props) {\n if (!props.results) return null\n\n let count = props.results.count\n if (count > 1000000) {\n count = Math.ceil(count / 1000000) + \"KK\"\n } else if (count > 1000) {\n count = Math.ceil(count / 1000) + \"K\"\n }\n\n return {count}\n}\n","import React from \"react\"\nimport PageContainer from \"../PageContainer\"\nimport SearchForm from \"./form\"\nimport SideNav from \"./sidenav\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n
    \n \n
    \n
    \n {props.children}\n \n
    \n
    \n
    \n
    \n )\n}\n\nexport function SearchTime(props) {\n let time = null\n props.search.providers.forEach((p) => {\n if (p.id === props.provider.id) {\n time = p.time\n }\n })\n\n if (time === null) return null\n\n const copy = gettext(\"Search took %(time)s s to complete\")\n\n return (\n
    \n

    {interpolate(copy, { time }, true)}

    \n
    \n )\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport {\n update as updatePosts,\n append as appendPosts,\n} from \"misago/reducers/posts\"\nimport { updateProvider } from \"misago/reducers/search\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n return (\n
    \n \n \n
    \n )\n}\n\nexport class LoadMore extends React.Component {\n onClick = () => {\n store.dispatch(\n updatePosts({\n isBusy: true,\n })\n )\n\n ajax\n .get(this.props.provider.api, {\n q: this.props.query,\n page: this.props.next,\n })\n .then(\n (providers) => {\n providers.forEach((provider) => {\n if (provider.id !== \"threads\") return\n store.dispatch(appendPosts(provider.results))\n store.dispatch(updateProvider(provider))\n })\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n store.dispatch(\n updatePosts({\n isBusy: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.more) return null\n\n return (\n
    \n \n {gettext(\"Show more\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport Results from \"./results\"\n\nexport default function (props) {\n return (\n \n \n \n
    \n \n )\n}\n\nexport function Blankslate({ children, loading, posts, query }) {\n if (posts && posts.count) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? gettext(\"Loading results...\")\n : gettext(\"No threads matching search query have been found.\")}\n

    \n )\n }\n\n return (\n

    \n {gettext(\"Enter at least two characters to search threads.\")}\n

    \n )\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport UsersList from \"misago/components/users-list\"\n\nexport default function (props) {\n return (\n \n \n \n \n \n )\n}\n\nexport function Blankslate({ children, loading, query, users }) {\n if (users.length) return children\n\n if (query.length) {\n return (\n

    \n {loading\n ? gettext(\"Loading results...\")\n : gettext(\"No users matching search query have been found.\")}\n

    \n )\n }\n\n return (\n

    \n {gettext(\"Enter at least two characters to search users.\")}\n

    \n )\n}\n","import { connect } from \"react-redux\"\nimport SearchThreads from \"./threads\"\nimport SearchUsers from \"./users\"\n\nconst components = {\n threads: SearchThreads,\n users: SearchUsers,\n}\n\nexport function select(store) {\n return {\n posts: store.posts,\n search: store.search,\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport default function (providers) {\n return providers.map((provider) => {\n return {\n path: provider.url,\n component: connect(select)(components[provider.id]),\n provider: provider,\n }\n })\n}\n","import paths from \"misago/components/search\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:search\") {\n mount({\n paths: paths(misago.get(\"SEARCH_PROVIDERS\")),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:search\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\n\nconst TYPES_CLASSES = {\n info: \"alert-info\",\n success: \"alert-success\",\n warning: \"alert-warning\",\n error: \"alert-danger\",\n}\n\nexport class Snackbar extends React.Component {\n getSnackbarClass() {\n let snackbarClass = \"alerts-snackbar\"\n if (this.props.isVisible) {\n snackbarClass += \" in\"\n } else {\n snackbarClass += \" out\"\n }\n return snackbarClass\n }\n\n render() {\n return (\n
    \n

    \n {this.props.message}\n

    \n
    \n )\n }\n}\n\nexport function select(state) {\n return state.snackbar\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport { Snackbar, select } from \"misago/components/snackbar\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(Snackbar), \"snackbar-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:snackbar\",\n initializer: initializer,\n after: \"snackbar\",\n})\n","import React from \"react\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nconst Header = ({ backendName }) => {\n const pageTitleTpl = gettext(\"Sign in with %(backend)s\")\n const pageTitle = interpolate(pageTitleTpl, { backend: backendName }, true)\n\n return (\n \n \n \n

    {pageTitle}

    \n
    \n
    \n
    \n )\n}\n\nexport default Header\n","import React from \"react\"\nimport misago from \"misago\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nexport default class Register extends Form {\n constructor(props) {\n super(props)\n\n const formValidators = {\n email: [validators.email()],\n username: [validators.usernameContent()],\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n email: props.email || \"\",\n emailProtected: !!props.email,\n username: props.username || \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n\n isLoading: false,\n }\n }\n\n clean() {\n let errors = this.validate()\n let lengths = [\n this.state.email.trim().length,\n this.state.username.trim().length,\n ]\n\n if (lengths.indexOf(0) !== -1) {\n snackbar.error(gettext(\"Fill out all fields.\"))\n return false\n }\n\n const { validators } = this.state\n\n const checkTermsOfService = !!misago.get(\"TERMS_OF_SERVICE_ID\")\n if (checkTermsOfService && this.state.termsOfService === null) {\n snackbar.error(validators.termsOfService[0](null))\n return false\n }\n\n const checkPrivacyPolicy = !!misago.get(\"PRIVACY_POLICY_ID\")\n if (checkPrivacyPolicy && this.state.privacyPolicy === null) {\n snackbar.error(validators.privacyPolicy[0](null))\n snackbar.error(gettext(\"You need to accept the privacy policy.\"))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.url, {\n email: this.state.email,\n username: this.state.username,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(response) {\n const { onRegistrationComplete } = this.props\n onRegistrationComplete(response)\n }\n\n handleError(rejection) {\n if (rejection.status === 200) {\n // We've entered \"errored\" state because response is HTML instead of exptected JSON\n const { onRegistrationComplete } = this.props\n const { username } = this.state\n onRegistrationComplete({ activation: \"active\", step: \"done\", username })\n } else if (rejection.status === 400) {\n const stateUpdate = { errors: rejection }\n if (rejection.email) {\n stateUpdate.emailProtected = false\n }\n this.setState(stateUpdate)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n const { backend_name } = this.props\n const { email, emailProtected, username, isLoading } = this.state\n\n let emailHelpText = null\n if (emailProtected) {\n const emailHelpTextTpl = gettext(\n \"Your e-mail address has been verified by %(backend)s.\"\n )\n emailHelpText = interpolate(\n emailHelpTextTpl,\n { backend: backend_name },\n true\n )\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n

    \n {gettext(\"Complete your details\")}\n

    \n
    \n
    \n \n \n \n \n \n \n \n
    \n
    \n \n {gettext(\"Sign in\")}\n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nconst Complete = ({ activation, backend_name, username }) => {\n let icon = \"\"\n let message = \"\"\n if (activation === \"user\") {\n message = gettext(\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (activation === \"admin\") {\n message = gettext(\n \"%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.\"\n )\n } else {\n message = gettext(\n \"%(username)s, your account has been created and you have been signed in to it.\"\n )\n }\n\n if (activation === \"active\") {\n icon = \"check\"\n } else {\n icon = \"info_outline\"\n }\n\n return (\n
    \n
    \n \n
    \n
    \n
    \n
    \n

    \n {gettext(\"Registration completed!\")}\n

    \n
    \n
    \n
    \n {icon}\n
    \n
    \n

    \n {interpolate(message, { username }, true)}\n

    \n

    \n \n {gettext(\"Return to forum index\")}\n \n

    \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n )\n}\n\nexport default Complete\n","import React from \"react\"\nimport Register from \"./register\"\nimport Complete from \"./complete\"\n\nexport default class SocialAuth extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n step: props.step,\n\n activation: props.activation || \"\",\n email: props.email || \"\",\n username: props.username || \"\",\n }\n }\n\n handleRegistrationComplete = ({ activation, email, step, username }) => {\n this.setState({ activation, email, step, username })\n }\n\n render() {\n const { backend_name, url } = this.props\n const { activation, email, step, username } = this.state\n\n if (step === \"register\") {\n return (\n \n )\n }\n\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport SocialAuth from \"misago/components/social-auth\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n if (context.get(\"CURRENT_LINK\") === \"misago:social-complete\") {\n const props = context.get(\"SOCIAL_AUTH_FORM\")\n mount(, \"page-mount\")\n }\n}\n\nmisago.addInitializer({\n name: \"component:social-auth\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport Form from \"./form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n }\n }\n\n onUsernameChange = (event) => {\n this.changeValue(\"username\", event.target.value)\n }\n\n clean() {\n if (!this.state.username.trim().length) {\n snackbar.error(gettext(\"You have to enter user name.\"))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.patch(this.props.thread.api.index, [\n { op: \"add\", path: \"participants\", value: this.state.username },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n }\n\n handleSuccess(data) {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n snackbar.success(gettext(\"New participant has been added to thread.\"))\n\n modal.hide()\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {gettext(\"Add participant\")}\n \n \n {gettext(\"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    {gettext(\"Add participant\")}

    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipantModal from \"misago/components/add-participant\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.thread.acl.can_add_participants) return null\n\n return (\n
    \n \n person_add\n {gettext(\"Add participant\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { changeOwner } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n gettext(\"Are you sure you want to take over this thread?\")\n )\n } else {\n const message = gettext(\n \"Are you sure you want to change thread owner to %(user)s?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n changeOwner(this.props.thread, this.props.participant)\n }\n\n render() {\n if (this.props.participant.is_owner) return null\n if (!this.props.thread.acl.can_change_owner) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function leave(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n ])\n .then(\n () => {\n snackbar.success(gettext(\"You have left this thread.\"))\n window.setTimeout(() => {\n window.location = misago.get(\"PRIVATE_THREADS_URL\")\n }, 3 * 1000)\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function remove(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"remove\", path: \"participants\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = gettext(\"%(user)s has been removed from this thread.\")\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n\nexport function changeOwner(thread, participant) {\n ajax\n .patch(thread.api.index, [\n { op: \"replace\", path: \"owner\", value: participant.id },\n { op: \"add\", path: \"acl\", value: 1 },\n ])\n .then(\n (data) => {\n store.dispatch(updateAcl(data))\n store.dispatch(participants.replace(data.participants))\n\n const message = gettext(\"%(user)s has been made new thread owner.\")\n snackbar.success(\n interpolate(\n message,\n {\n user: participant.username,\n },\n true\n )\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n}\n","import React from \"react\"\nimport { remove, leave } from \"./actions\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.isUser = props.participant.id === props.user.id\n }\n\n onClick = () => {\n let confirmed = false\n if (this.isUser) {\n confirmed = window.confirm(\n gettext(\"Are you sure you want to leave this thread?\")\n )\n } else {\n const message = gettext(\n \"Are you sure you want to remove %(user)s from this thread?\"\n )\n confirmed = window.confirm(\n interpolate(\n message,\n {\n user: this.props.participant.username,\n },\n true\n )\n )\n }\n\n if (!confirmed) return\n\n if (this.isUser) {\n leave(this.props.thread, this.props.participant)\n } else {\n remove(this.props.thread, this.props.participant)\n }\n }\n\n render() {\n const isModerator = this.props.user.acl.can_moderate_private_threads\n\n if (!(this.props.userIsOwner || this.isUser || isModerator)) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport MakeOwner from \"./make-owner\"\nimport Remove from \"./remove\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function (props) {\n const participant = props.participant\n\n let className = \"btn btn-default\"\n if (participant.is_owner) {\n className = \"btn btn-primary\"\n }\n className += \" btn-user btn-block\"\n\n return (\n
    \n
    \n \n \n {participant.username}\n \n \n
    \n
    \n )\n}\n\nexport function UserStatus({ isOwner }) {\n if (!isOwner) return null\n\n return (\n
  • \n start\n {gettext(\"Thread owner\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ participants, thread, user, userIsOwner }) {\n return (\n
    \n
    \n {participants.map((participant) => {\n return (\n \n )\n })}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport AddParticipant from \"./add-participant\"\nimport CardsList from \"./cards-list\"\nimport * as utils from \"./utils\"\n\nexport default function (props) {\n if (!props.participants.length) return null\n\n return (\n
    \n
    \n \n
    \n \n
    \n

    {utils.getParticipantsCopy(props.participants)}

    \n
    \n
    \n
    \n
    \n )\n}\n\nexport function getUserIsOwner(user, participants) {\n return participants[0].id === user.id\n}\n","export function getParticipantsCopy(participants) {\n const count = participants.length\n const message = ngettext(\n \"This thread has %(users)s participant.\",\n \"This thread has %(users)s participants.\",\n count\n )\n\n return interpolate(\n message,\n {\n users: count,\n },\n true\n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n {props.poll.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport function PollChoice(props) {\n let proc = 0\n if (props.choice.votes && props.poll.votes) {\n proc = Math.ceil((props.choice.votes * 100) / props.poll.votes)\n }\n\n return (\n
    \n
    {props.choice.label}
    \n
    \n
    \n \n \n {getVotesLabel(props.votes, props.proc)}\n \n
    \n \n
      \n \n \n
    \n
    \n
    \n )\n}\n\nexport function ChoiceVotes(props) {\n return (\n
  • \n {getVotesLabel(props.votes, props.proc)}\n
  • \n )\n}\n\nexport function getVotesLabel(votes, proc) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote, %(proc)s% of total.\",\n \"%(votes)s votes, %(proc)s% of total.\",\n votes\n )\n\n return interpolate(\n message,\n {\n votes: votes,\n proc: proc,\n },\n true\n )\n}\n\nexport function UserChoice(props) {\n if (!props.selected) return null\n\n return (\n
  • \n check_box\n {pgettext(\"thread poll\", \"You've voted on this choice.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: true,\n error: null,\n data: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.poll.api.votes).then(\n (data) => {\n const hydratedData = data.map((choice) => {\n return Object.assign({}, choice, {\n voters: choice.voters.map((voter) => {\n return Object.assign({}, voter, {\n voted_on: moment(voter.voted_on),\n })\n }),\n })\n })\n\n this.setState({\n isLoading: false,\n data: hydratedData,\n })\n },\n (rejection) => {\n this.setState({\n isLoading: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    \n {pgettext(\"thread poll\", \"Poll votes\")}\n

    \n
    \n\n \n
    \n \n )\n }\n}\n\nexport function ModalBody(props) {\n if (props.isLoading) {\n return \n } else if (props.error) {\n return \n }\n\n return \n}\n\nexport function ChoicesList(props) {\n return (\n
    \n
      \n {props.data.map((choice) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function ChoiceDetails(props) {\n return (\n
  • \n

    {props.label}

    \n \n \n
    \n
  • \n )\n}\n\nexport function VotesCount(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s user has voted for this choice.\",\n \"%(votes)s users have voted for this choice.\",\n props.votes\n )\n\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return

    {label}

    \n}\n\nexport function VotesList(props) {\n if (!props.voters.length) return null\n\n return (\n
      \n {props.voters.map((user) => {\n return \n })}\n
    \n )\n}\n\nexport function Voter(props) {\n if (props.url) {\n return (\n
  • \n \n {props.username}\n {\" \"}\n \n
  • \n )\n }\n\n return (\n
  • \n {props.username} \n
  • \n )\n}\n\nexport function VoteDate(props) {\n return (\n \n {props.voted_on.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport Modal from \"./modal\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n const { isPollOver, poll, showVoting, thread } = props\n\n if (!isVisible(isPollOver, poll.acl, poll)) return null\n\n const controls = []\n\n const canVote = poll.acl.can_vote\n const canChangeVote = !poll.hasSelectedChoices || poll.allow_revotes\n\n if (canVote && canChangeVote) controls.push(0)\n if (poll.is_public || poll.acl.can_see_votes) controls.push(1)\n if (poll.acl.can_edit) controls.push(2)\n if (poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(isPollOver, acl, poll) {\n return (\n poll.is_public ||\n acl.can_delete ||\n acl.can_edit ||\n acl.can_see_votes ||\n (acl.can_vote &&\n !isPollOver &&\n (!poll.hasSelectedChoices || poll.allow_revotes))\n )\n}\n\nexport function getClassName(controls, control) {\n let className = \"col-xs-6\"\n\n if (controls.length === 1) {\n className = \"col-xs-12\"\n }\n\n if (controls.length === 3 && controls[0] === control) {\n className = \"col-xs-12\"\n }\n\n return className + \" col-sm-3 col-md-2\"\n}\n\nexport function ChangeVote(props) {\n const canVote = props.poll.acl.can_vote\n const canChangeVote =\n !props.poll.hasSelectedChoices || props.poll.allow_revotes\n\n if (!(canVote && canChangeVote)) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Vote\")}\n \n
    \n )\n}\n\nexport class SeeVotes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const seeVotes =\n this.props.poll.is_public || this.props.poll.acl.can_see_votes\n if (!seeVotes) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"See votes\")}\n \n
    \n )\n }\n}\n\nexport function Edit(props) {\n if (!props.poll.acl.can_edit) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Edit\")}\n \n
    \n )\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const deletePoll = window.confirm(\n pgettext(\n \"thread poll\",\n \"Are you sure you want to delete this poll? This action is not reversible.\"\n )\n )\n if (!deletePoll) return false\n\n store.dispatch(poll.busy())\n\n ajax\n .delete(this.props.poll.api.index)\n .then(this.handleSuccess, this.handleError)\n }\n\n handleSuccess = (newThreadAcl) => {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been deleted\"))\n store.dispatch(poll.remove())\n store.dispatch(thread.updateAcl(newThreadAcl))\n }\n\n handleError = (rejection) => {\n snackbar.apiError(rejection)\n store.dispatch(poll.release())\n }\n\n render() {\n if (!this.props.poll.acl.can_delete) return null\n\n return (\n
    \n \n {pgettext(\"thread poll\", \"Delete\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n
    \n )\n}\n\nexport function PollCreation(props) {\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Started by %(poster)s %(posted_on)s.\")),\n {\n poster: getPoster(props.poll),\n posted_on: getPostedOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getPoster(poll) {\n if (poll.url.poster) {\n return interpolate(\n USER_URL,\n {\n url: escapeHtml(poll.url.poster),\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n }\n\n return interpolate(\n USER_SPAN,\n {\n user: escapeHtml(poll.poster_name),\n },\n true\n )\n}\n\nexport function getPostedOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.posted_on.format(\"LLL\")),\n relative: escapeHtml(poll.posted_on.fromNow()),\n },\n true\n )\n}\n\nexport function PollLength(props) {\n if (!props.poll.length) {\n return null\n }\n\n const message = interpolate(\n escapeHtml(pgettext(\"thread poll\", \"Voting ends %(ends_on)s.\")),\n {\n ends_on: getEndsOn(props.poll),\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function getEndsOn(poll) {\n return interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(poll.endsOn.format(\"LLL\")),\n relative: escapeHtml(poll.endsOn.fromNow()),\n },\n true\n )\n}\n\nexport function PollVotes(props) {\n const message = npgettext(\n \"thread poll\",\n \"%(votes)s vote.\",\n \"%(votes)s votes.\",\n props.votes\n )\n const label = interpolate(\n message,\n {\n votes: props.votes,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollIsPublic(props) {\n if (!props.poll.is_public) {\n return null\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Voting is public.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Chart from \"./chart\"\nimport Options from \"./options\"\nimport PollInfo from \"../info\"\n\nexport default function (props) {\n return (\n
    \n
    \n

    {props.poll.question}

    \n \n \n \n
    \n
    \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n
    \n )\n}\n\nexport function PollChoicesLeft({ choicesLeft }) {\n if (choicesLeft === 0) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can't select any more choices.\")}\n
  • \n )\n }\n\n const message = npgettext(\n \"thread poll\",\n \"You can select %(choices)s more choice.\",\n \"You can select %(choices)s more choices.\",\n choicesLeft\n )\n\n const label = interpolate(\n message,\n {\n choices: choicesLeft,\n },\n true\n )\n\n return
  • {label}
  • \n}\n\nexport function PollAllowRevote(props) {\n if (props.poll.allow_revotes) {\n return (\n
  • \n {pgettext(\"thread poll\", \"You can change your vote later.\")}\n
  • \n )\n }\n\n return (\n
  • \n {pgettext(\"thread poll\", \"Votes are final.\")}\n
  • \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
      \n {props.choices.map((choice) => {\n return (\n \n )\n })}\n
    \n )\n}\n\nexport class ChoiceSelect extends React.Component {\n onClick = () => {\n this.props.toggleChoice(this.props.choice.hash)\n }\n\n render() {\n return (\n
  • \n \n \n {this.props.choice.selected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n {this.props.choice.label}\n \n
  • \n )\n }\n}\n","export function getChoiceFromHash(choices, hash) {\n for (const i in choices) {\n const choice = choices[i]\n if (choice.hash === hash) {\n return choice\n }\n }\n\n return null\n}\n\nexport function getChoicesLeft(poll, choices) {\n let selection = []\n for (const i in choices) {\n const choice = choices[i]\n if (choice.selected) {\n selection.push(choice)\n }\n }\n\n return poll.allowed_choices - selection.length\n}\n","import React from \"react\"\nimport ChoicesHelp from \"./help\"\nimport ChoicesSelect from \"./select\"\nimport { getChoicesLeft, getChoiceFromHash } from \"./utils\"\nimport PollInfo from \"../info\"\nimport { Delete, Edit, getClassName } from \"../results/options\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n choices: props.poll.choices,\n choicesLeft: getChoicesLeft(props.poll, props.poll.choices),\n }\n }\n\n toggleChoice = (hash) => {\n const choice = getChoiceFromHash(this.state.choices, hash)\n\n let choices = null\n if (!choice.selected) {\n choices = this.selectChoice(choice, hash)\n } else {\n choices = this.deselectChoice(choice, hash)\n }\n\n this.setState({\n choices,\n choicesLeft: getChoicesLeft(this.props.poll, choices),\n })\n }\n\n selectChoice = (choice, hash) => {\n const choicesLeft = getChoicesLeft(this.props.poll, this.state.choices)\n\n if (!choicesLeft) {\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected && item.hash != hash) {\n item.selected = false\n break\n }\n }\n }\n\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? true : choice.selected,\n })\n })\n }\n\n deselectChoice = (choice, hash) => {\n return this.state.choices.map((choice) => {\n return Object.assign({}, choice, {\n selected: choice.hash == hash ? false : choice.selected,\n })\n })\n }\n\n clean() {\n if (this.state.choicesLeft === this.props.poll.allowed_choices) {\n snackbar.error(gettext(\"You need to select at least one choice\"))\n return false\n }\n\n return true\n }\n\n send() {\n let data = []\n for (const i in this.state.choices.slice()) {\n const item = this.state.choices[i]\n if (item.selected) {\n data.push(item.hash)\n }\n }\n\n return ajax.post(this.props.poll.api.votes, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n snackbar.success(gettext(\"Your vote has been saved.\"))\n\n this.props.showResults()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n const controls = []\n\n if (this.props.poll.acl.can_vote) controls.push(0)\n if (this.props.poll.is_public || this.props.poll.acl.can_see_votes)\n controls.push(1)\n if (this.props.poll.acl.can_edit) controls.push(2)\n if (this.props.poll.acl.can_delete) controls.push(3)\n\n return (\n
    \n
    \n
    \n

    {this.props.poll.question}

    \n \n \n \n
    \n
    \n
    \n
    \n \n {gettext(\"Save your vote\")}\n \n
    \n
    \n \n {gettext(\"See results\")}\n \n
    \n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Results from \"./results\"\nimport Voting from \"./voting\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n let showResults = true\n if (props.user.id && !props.poll.hasSelectedChoices) {\n showResults = false\n }\n\n this.state = {\n showResults,\n }\n }\n\n showResults = () => {\n this.setState({\n showResults: true,\n })\n }\n\n showVoting = () => {\n this.setState({\n showResults: false,\n })\n }\n\n render() {\n if (!this.props.thread.poll) return null\n\n const isPollOver = getIsPollOver(this.props.poll)\n\n if (\n !isPollOver &&\n this.props.poll.acl.can_vote &&\n !this.state.showResults\n ) {\n return \n } else {\n return (\n \n )\n }\n }\n}\n\nexport function getIsPollOver(poll) {\n if (poll.length) {\n return moment().isAfter(poll.endsOn)\n }\n return false\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n onAdd = () => {\n let choices = this.props.choices.slice()\n choices.push({\n hash: generateRandomHash(),\n label: \"\",\n })\n\n this.props.setChoices(choices)\n }\n\n onChange = (hash, label) => {\n const choices = this.props.choices.map((choice) => {\n if (choice.hash === hash) {\n choice.label = label\n }\n\n return choice\n })\n this.props.setChoices(choices)\n }\n\n onDelete = (hash) => {\n const choices = this.props.choices.filter((choice) => {\n return choice.hash !== hash\n })\n this.props.setChoices(choices)\n }\n\n render() {\n return (\n
    \n
      \n {this.props.choices.map((choice) => {\n return (\n 2}\n choice={choice}\n disabled={this.props.disabled}\n key={choice.hash}\n onChange={this.onChange}\n onDelete={this.onDelete}\n />\n )\n })}\n
    \n \n {pgettext(\"thread poll\", \"Add choice\")}\n \n
    \n )\n }\n}\n\nexport class PollChoice extends React.Component {\n onChange = (event) => {\n this.props.onChange(this.props.choice.hash, event.target.value)\n }\n\n onDelete = () => {\n const deleteItem = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to remove this choice?\")\n )\n if (deleteItem) {\n this.props.onDelete(this.props.choice.hash)\n }\n }\n\n render() {\n return (\n
  • \n \n close\n \n \n
  • \n )\n }\n}\n\nexport function generateRandomHash() {\n let randomHash = \"\"\n while (randomHash.length != 12) {\n randomHash = Math.random()\n .toString(36)\n .replace(/[^a-zA-Z0-9]+/g, \"\")\n .substr(1, 12)\n }\n return randomHash\n}\n","import React from \"react\"\nimport ChoicesControl from \"./choices-control\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n const poll = props.poll.id\n ? props.poll\n : {\n question: \"\",\n choices: [\n {\n hash: \"choice-10000\",\n label: \"\",\n },\n {\n hash: \"choice-20000\",\n label: \"\",\n },\n ],\n length: 0,\n allowed_choices: 1,\n allow_revotes: 0,\n is_public: 0,\n }\n\n this.state = {\n isLoading: false,\n isEdit: !!poll.id,\n\n question: poll.question,\n choices: poll.choices,\n length: poll.length,\n allowed_choices: poll.allowed_choices,\n allow_revotes: poll.allow_revotes,\n is_public: poll.is_public,\n\n validators: {\n question: [],\n choices: [],\n length: [],\n allowed_choices: [],\n },\n\n errors: {},\n }\n }\n\n setChoices = (choices) => {\n const errors = Object.assign({}, errors, { choices: null })\n\n this.setState({\n choices,\n errors,\n })\n }\n\n onCancel = () => {\n let cancel = false\n\n if (!!this.props.poll) {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard changes?\")\n )\n } else {\n cancel = window.confirm(\n pgettext(\"thread poll\", \"Are you sure you want to discard new poll?\")\n )\n }\n\n if (cancel) {\n this.props.close()\n }\n }\n\n send() {\n const data = {\n question: this.state.question,\n choices: this.state.choices,\n length: this.state.length,\n allowed_choices: this.state.allowed_choices,\n allow_revotes: this.state.allow_revotes,\n is_public: this.state.is_public,\n }\n\n if (this.state.isEdit) {\n return ajax.put(this.props.poll.api.index, data)\n }\n\n return ajax.post(this.props.thread.api.poll, data)\n }\n\n handleSuccess(data) {\n store.dispatch(poll.replace(data))\n\n if (this.state.isEdit) {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been edited.\"))\n } else {\n snackbar.success(pgettext(\"thread poll\", \"Poll has been posted.\"))\n }\n\n this.props.close()\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n if (rejection.non_field_errors) {\n rejection.allowed_choices = rejection.non_field_errors\n }\n\n this.setState({\n errors: Object.assign({}, rejection),\n })\n\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n

    \n {this.state.isEdit\n ? pgettext(\"thread poll\", \"Edit poll\")\n : pgettext(\"thread poll\", \"Add poll\")}\n

    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Question and choices\")}\n \n\n \n \n \n\n \n \n \n
    \n\n
    \n {pgettext(\"thread poll\", \"Voting\")}\n\n
    \n
    \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n\n
    \n \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n {pgettext(\"thread poll\", \"Cancel\")}\n {\" \"}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function PollPublicSwitch(props) {\n if (props.isEdit) return null\n\n return (\n
    \n \n \n \n
    \n )\n}\n","import React from \"react\"\n\nconst ICON = {\n changed_title: \"edit\",\n\n pinned_globally: \"bookmark\",\n pinned_locally: \"bookmark_border\",\n unpinned: \"panorama_fish_eye\",\n\n moved: \"arrow_forward\",\n merged: \"call_merge\",\n\n approved: \"done\",\n\n opened: \"lock_open\",\n closed: \"lock_outline\",\n\n unhid: \"visibility\",\n hid: \"visibility_off\",\n\n changed_owner: \"grade\",\n tookover: \"grade\",\n\n added_participant: \"person_add\",\n\n owner_left: \"person_outline\",\n participant_left: \"person_outline\",\n removed_participant: \"remove_circle_outline\",\n}\n\nconst EventIcon = (props) => (\n \n {ICON[props.post.event_type]}\n \n)\n\nexport default EventIcon\n","import React from \"react\"\nimport moment from \"moment\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n if (isVisible(props.post.acl)) {\n return (\n
  • \n \n \n \n
  • \n )\n } else {\n return null\n }\n}\n\nexport function isVisible(acl) {\n return acl.can_hide\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: this.props.user.username,\n url: Object.assign(this.props.post.url, {\n hidden_by: this.props.user.url,\n }),\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: true }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n }\n )\n }\n\n render() {\n if (!this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: false,\n })\n )\n\n const op = { op: \"replace\", path: \"is-hidden\", value: false }\n\n ajax.patch(this.props.post.api.index, [op]).then(\n (patch) => {\n store.dispatch(post.patch(this.props.post, patch))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n is_hidden: true,\n })\n )\n }\n )\n }\n\n render() {\n if (this.props.post.is_hidden) {\n return (\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n const decision = window.confirm(\n gettext(\n \"Are you sure you wish to delete this event? This action is not reversible!\"\n )\n )\n if (decision) {\n this.delete()\n }\n }\n\n delete = () => {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(this.props.post.api.index).then(\n () => {\n snackbar.success(gettext(\"Event has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: false,\n })\n )\n }\n )\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport Controls from \"./controls\"\n\nconst DATE_ABBR = '%(relative)s'\nconst DATE_URL = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
      \n \n \n \n
    \n )\n}\n\nexport function Hidden(props) {\n if (props.post.is_hidden) {\n let user = null\n if (props.post.url.hidden_by) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(gettext(\"Hidden by %(event_by)s %(event_on)s.\")),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n } else {\n return null\n }\n}\n\nexport function Poster(props) {\n let user = null\n if (props.post.poster) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.post.poster.url),\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.post.poster_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_URL,\n {\n url: escapeHtml(props.post.url.index),\n absolute: escapeHtml(props.post.posted_on.format(\"LLL\")),\n relative: escapeHtml(props.post.posted_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(gettext(\"By %(event_by)s %(event_on)s.\")),\n {\n event_by: user,\n event_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst MESSAGE = {\n pinned_globally: gettext(\"Thread has been pinned globally.\"),\n pinned_locally: gettext(\"Thread has been pinned locally.\"),\n unpinned: gettext(\"Thread has been unpinned.\"),\n\n approved: gettext(\"Thread has been approved.\"),\n\n opened: gettext(\"Thread has been opened.\"),\n closed: gettext(\"Thread has been closed.\"),\n\n unhid: gettext(\"Thread has been revealed.\"),\n hid: gettext(\"Thread has been made hidden.\"),\n\n tookover: gettext(\"Took thread over.\"),\n\n owner_left: gettext(\"Owner has left thread. This thread is now closed.\"),\n participant_left: gettext(\"Participant has left thread.\"),\n}\n\nconst ITEM_LINK = '%(name)s'\nconst ITEM_SPAN = '%(name)s'\n\nexport default function (props) {\n if (MESSAGE[props.post.event_type]) {\n return

    {MESSAGE[props.post.event_type]}

    \n } else if (props.post.event_type === \"changed_title\") {\n return \n } else if (props.post.event_type === \"moved\") {\n return \n } else if (props.post.event_type === \"merged\") {\n return \n } else if (props.post.event_type === \"changed_owner\") {\n return \n } else if (props.post.event_type === \"added_participant\") {\n return \n } else if (props.post.event_type === \"removed_participant\") {\n return \n } else {\n return null\n }\n}\n\nexport function ChangedTitle(props) {\n const msgstring = escapeHtml(\n gettext(\"Thread title has been changed from %(old_title)s.\")\n )\n const oldTitle = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.old_title),\n },\n true\n )\n const message = interpolate(\n msgstring,\n {\n old_title: oldTitle,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Moved(props) {\n const msgstring = escapeHtml(\n gettext(\"Thread has been moved from %(from_category)s.\")\n )\n const fromCategory = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.from_category.url),\n name: escapeHtml(props.post.event_context.from_category.name),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n from_category: fromCategory,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function Merged(props) {\n const msgstring = escapeHtml(\n gettext(\"The %(merged_thread)s thread has been merged into this thread.\")\n )\n const mergedThread = interpolate(\n ITEM_SPAN,\n {\n name: escapeHtml(props.post.event_context.merged_thread),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n merged_thread: mergedThread,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function ChangedOwner(props) {\n const msgstring = escapeHtml(gettext(\"Changed thread owner to %(user)s.\"))\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function AddedParticipant(props) {\n const msgstring = escapeHtml(gettext(\"Added %(user)s to thread.\"))\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n\nexport function RemovedParticipant(props) {\n const msgstring = escapeHtml(gettext(\"Removed %(user)s from thread.\"))\n const newOwner = interpolate(\n ITEM_LINK,\n {\n url: escapeHtml(props.post.event_context.user.url),\n name: escapeHtml(props.post.event_context.user.username),\n },\n true\n )\n\n const message = interpolate(\n msgstring,\n {\n user: newOwner,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n if (post.is_read) return null\n\n return (\n
    \n {gettext(\"New event\")}\n
    \n )\n}\n","import React from \"react\"\nimport * as post from \"misago/reducers/post\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n /*\n Super naive and de-facto placeholder implementation for reading posts on scroll\n */\n componentDidMount() {\n if (this.props.post.is_read) return // don't register read tracker\n\n $(this.element).waypoint({\n handler: (direction) => {\n if (direction !== \"down\" || this.props.post.is_read) return\n\n // after 1500ms run flag post as read logic\n window.setTimeout(() => {\n // check if post's bottom edge is still in viewport\n const boundingClientRect = this.element.getBoundingClientRect()\n const offsetBottom =\n boundingClientRect.height + boundingClientRect.top\n const clientHeight = document.documentElement.clientHeight\n\n if (offsetBottom < 5) return // scrolled past the post\n if (offsetBottom > clientHeight) return // scrolled back up\n\n // mark post as read\n store.dispatch(\n post.patch(this.props.post, {\n is_read: true,\n })\n )\n\n // call API to let it know we have unread post\n ajax.post(this.props.post.api.read).then(\n (data) => {\n store.dispatch(\n thread.update(this.props.thread, {\n is_read: data.thread_is_read,\n })\n )\n },\n (rejection) => {\n snackbar.apiError(rejection)\n }\n )\n }, 1000)\n },\n offset: \"bottom-in-view\",\n })\n }\n\n render() {\n return (\n {\n if (node) this.element = node\n }}\n >\n {this.props.children}\n \n )\n }\n}\n","import React from \"react\"\nimport Icon from \"./icon\"\nimport Info from \"./info\"\nimport Message from \"./message\"\nimport UnreadLabel from \"./unread-label\"\nimport Waypoint from \"../waypoint\"\n\nexport default function (props) {\n let className = \"event\"\n if (props.post.isDeleted) {\n className = \"hide\"\n } else if (props.post.is_hidden) {\n className = \"event post-hidden\"\n }\n\n return (\n
  • \n \n
    \n
    \n \n
    \n \n \n \n \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport formatFilesize from \"misago/utils/file-size\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default function (props) {\n return (\n
    \n \n
    \n \n {props.attachment.filename}\n \n \n
    \n
    \n )\n}\n\nexport function AttachmentPreview(props) {\n if (props.attachment.is_image) {\n return (\n
    \n \n
    \n )\n } else {\n return (\n
    \n \n
    \n )\n }\n}\n\nexport function AttachmentIcon(props) {\n return (\n \n insert_drive_file\n \n )\n}\n\nexport function AttachmentThumbnail(props) {\n const url = props.attachment.url.thumb || props.attachment.url.index\n return (\n \n )\n}\n\nexport function AttachmentDetails(props) {\n let user = null\n if (props.attachment.url.uploader) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.attachment.url.uploader),\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.attachment.uploader_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.attachment.uploaded_on.format(\"LLL\")),\n relative: escapeHtml(props.attachment.uploaded_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(\n gettext(\n \"%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.\"\n )\n ),\n {\n filetype: props.attachment.filetype,\n size: formatFilesize(props.attachment.size),\n uploader: user,\n uploaded_on: date,\n },\n true\n )\n\n return (\n \n )\n}\n","import React from \"react\"\nimport batch from \"misago/utils/batch\"\nimport Attachment from \"./attachment\"\n\nexport default function (props) {\n if (!isVisible(props.post)) {\n return null\n }\n\n return (\n
    \n {batch(props.post.attachments, 2).map((row) => {\n const key = row\n .map((a) => {\n return a ? a.id : 0\n })\n .join(\"_\")\n return \n })}\n
    \n )\n}\n\nexport function isVisible(post) {\n return (!post.is_hidden || post.acl.can_see_hidden) && post.attachments\n}\n\nexport function Row(props) {\n return (\n
    \n {props.row.map((attachment) => {\n return (\n \n )\n })}\n
    \n )\n}\n","import React from \"react\"\nimport Waypoint from \"../waypoint\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst HIDDEN_BY_URL = '%(user)s'\nconst HIDDEN_BY_SPAN = '%(user)s'\nconst HIDDEN_ON =\n '%(relative)s'\n\nexport default function (props) {\n if (props.post.is_hidden && !props.post.acl.can_see_hidden) {\n return \n } else if (props.post.content) {\n return \n } else {\n return \n }\n}\n\nexport function Default({ post }) {\n const poster = \"@\" + (post.poster ? post.poster.username : post.poster_name)\n\n return (\n \n \n \n )\n}\n\nexport function Hidden(props) {\n let user = null\n if (props.post.hidden_by) {\n user = interpolate(\n HIDDEN_BY_URL,\n {\n url: escapeHtml(props.post.url.hidden_by),\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n } else {\n user = interpolate(\n HIDDEN_BY_SPAN,\n {\n user: escapeHtml(props.post.hidden_by_name),\n },\n true\n )\n }\n\n const date = interpolate(\n HIDDEN_ON,\n {\n absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n relative: escapeHtml(props.post.hidden_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(gettext(\"Hidden by %(hidden_by)s %(hidden_on)s.\")),\n {\n hidden_by: user,\n hidden_on: date,\n },\n true\n )\n\n return (\n \n

    \n {gettext(\"This post is hidden. You cannot see its contents.\")}\n

    \n

    \n \n )\n}\n\nexport function Invalid(props) {\n return (\n \n

    \n {gettext(\"This post's contents cannot be displayed.\")}\n

    \n

    \n {gettext(\"This error is caused by invalid post content manipulation.\")}\n

    \n
    \n )\n}\n","import React from \"react\"\n\nexport function FlagBestAnswer({ post, thread, user }) {\n if (!(isVisible(post) && post.id === thread.best_answer)) {\n return null\n }\n\n let message = null\n if (user.id && thread.best_answer_marked_by === user.id) {\n message = interpolate(\n gettext(\"Marked as best answer by you %(marked_on)s.\"),\n {\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n } else {\n message = interpolate(\n gettext(\"Marked as best answer by %(marked_by)s %(marked_on)s.\"),\n {\n marked_by: thread.best_answer_marked_by_name,\n marked_on: thread.best_answer_marked_on.fromNow(),\n },\n true\n )\n }\n\n return (\n
    \n check_box\n

    {message}

    \n
    \n )\n}\n\nexport function FlagHidden(props) {\n if (!(isVisible(props.post) && props.post.is_hidden)) {\n return null\n }\n\n return (\n
    \n visibility_off\n

    \n {gettext(\n \"This post is hidden. Only users with permission may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagUnapproved(props) {\n if (!(isVisible(props.post) && props.post.is_unapproved)) {\n return null\n }\n\n return (\n
    \n remove_circle_outline\n

    \n {gettext(\n \"This post is unapproved. Only users with permission to approve posts and its author may see its contents.\"\n )}\n

    \n
    \n )\n}\n\nexport function FlagProtected(props) {\n if (!(isVisible(props.post) && props.post.is_protected)) {\n return null\n }\n\n return (\n
    \n lock_outline\n

    {gettext(\"This post is protected. Only moderators may change it.\")}

    \n
    \n )\n}\n\nexport function isVisible(post) {\n return !post.is_hidden || post.acl.can_see_hidden\n}\n","import moment from \"moment\"\nimport * as thread from \"misago/reducers/thread\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function approve(props) {\n store.dispatch(\n post.patch(props.post, {\n is_unapproved: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n const previousState = {\n is_unapproved: props.post.is_unapproved,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function protect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: true,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unprotect(props) {\n store.dispatch(\n post.patch(props.post, {\n is_protected: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n const previousState = {\n is_protected: props.post.is_protected,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function hide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: true,\n hidden_on: moment(),\n hidden_by_name: props.user.username,\n url: Object.assign(props.post.url, {\n hidden_by: props.user.url,\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n hidden_on: props.post.hidden_on,\n hidden_by_name: props.post.hidden_by_name,\n url: props.post.url,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unhide(props) {\n store.dispatch(\n post.patch(props.post, {\n is_hidden: false,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n const previousState = {\n is_hidden: props.post.is_hidden,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function like(props) {\n const lastLikes = props.post.last_likes || []\n const concatedLikes = [props.user].concat(lastLikes)\n const finalLikes =\n concatedLikes.length > 3 ? concatedLikes.slice(0, -1) : concatedLikes\n\n store.dispatch(\n post.patch(props.post, {\n is_liked: true,\n likes: props.post.likes + 1,\n last_likes: finalLikes,\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: true }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function unlike(props) {\n store.dispatch(\n post.patch(props.post, {\n is_liked: false,\n likes: props.post.likes - 1,\n last_likes: props.post.last_likes.filter((user) => {\n return !user.id || user.id !== props.user.id\n }),\n })\n )\n\n const ops = [{ op: \"replace\", path: \"is-liked\", value: false }]\n\n const previousState = {\n is_liked: props.post.is_liked,\n likes: props.post.likes,\n last_likes: props.post.last_likes,\n }\n\n patch(props, ops, previousState)\n}\n\nexport function patch(props, ops, previousState) {\n ajax.patch(props.post.api.index, ops).then(\n (newState) => {\n store.dispatch(post.patch(props.post, newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(post.patch(props.post, previousState))\n }\n )\n}\n\nexport function remove(props) {\n let confirmed = window.confirm(\n gettext(\n \"Are you sure you want to delete this post? This action is not reversible!\"\n )\n )\n if (!confirmed) {\n return\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: true,\n })\n )\n\n ajax.delete(props.post.api.index).then(\n () => {\n snackbar.success(gettext(\"Post has been deleted.\"))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(\n post.patch(props.post, {\n isDeleted: false,\n })\n )\n }\n )\n}\n\nexport function markAsBestAnswer(props) {\n const { post, user } = props\n\n store.dispatch(\n thread.update({\n best_answer: post.id,\n best_answer_is_protected: post.is_protected,\n best_answer_marked_on: moment(),\n best_answer_marked_by: user.id,\n best_answer_marked_by_name: user.username,\n best_answer_marked_by_slug: user.slug,\n })\n )\n\n const ops = [\n { op: \"replace\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function unmarkBestAnswer(props) {\n const { post } = props\n\n store.dispatch(\n thread.update({\n best_answer: null,\n best_answer_is_protected: false,\n best_answer_marked_on: null,\n best_answer_marked_by: null,\n best_answer_marked_by_name: null,\n best_answer_marked_by_slug: null,\n })\n )\n\n const ops = [\n { op: \"remove\", path: \"best-answer\", value: post.id },\n { op: \"add\", path: \"acl\", value: true },\n ]\n\n const previousState = {\n best_answer: props.thread.best_answer,\n best_answer_is_protected: props.thread.best_answer_is_protected,\n best_answer_marked_on: props.thread.best_answer_marked_on,\n best_answer_marked_by: props.thread.best_answer_marked_by,\n best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n }\n\n patchThread(props, ops, previousState)\n}\n\nexport function patchThread(props, ops, previousState) {\n ajax.patch(props.thread.api.index, ops).then(\n (newState) => {\n if (newState.best_answer_marked_on) {\n newState.best_answer_marked_on = moment(newState.best_answer_marked_on)\n }\n store.dispatch(thread.update(newState))\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail[0])\n } else {\n snackbar.apiError(rejection)\n }\n\n store.dispatch(thread.update(previousState))\n }\n )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Avatar from \"misago/components/avatar\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n\n error: null,\n likes: [],\n }\n }\n\n componentDidMount() {\n ajax.get(this.props.post.api.likes).then(\n (data) => {\n this.setState({\n isReady: true,\n likes: data.map(hydrateLike),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n error: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n if (this.state.likes.length) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function hydrateLike(data) {\n return Object.assign({}, data, {\n liked_on: moment(data.liked_on),\n })\n}\n\nexport function ModalDialog({ className, children, likes }) {\n let title = gettext(\"Post Likes\")\n if (likes) {\n const likesCount = likes.length\n const message = ngettext(\"%(likes)s like\", \"%(likes)s likes\", likesCount)\n\n title = interpolate(message, { likes: likesCount }, true)\n }\n\n return (\n
    \n
    \n
    \n \n ×\n \n

    {title}

    \n
    \n {children}\n
    \n
    \n )\n}\n\nexport function LikesList(props) {\n return (\n
    \n
      \n {props.likes.map((like) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function LikeDetails(props) {\n if (props.url) {\n const user = {\n id: props.liker_id,\n avatars: props.avatars,\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n \n {props.username}\n {\" \"}\n \n
    \n
  • \n )\n }\n\n return (\n
  • \n
    \n \n \n \n
    \n
    \n {props.username} \n
    \n
  • \n )\n}\n\nexport function LikeDate(props) {\n return (\n \n {props.likedOn.fromNow()}\n \n )\n}\n","import React from \"react\"\nimport * as actions from \"./controls/actions\"\nimport LikesModal from \"misago/components/post-likes\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\n\nexport default function (props) {\n if (!isVisible(props.post)) return null\n\n return (\n
    \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport function isVisible(post) {\n return (\n (!post.is_hidden || post.acl.can_see_hidden) &&\n (post.acl.can_reply ||\n post.acl.can_edit ||\n (post.acl.can_see_likes && (post.last_likes || []).length) ||\n post.acl.can_like)\n )\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n {pgettext(\"post control\", \"Best answer\")}\n \n )\n }\n}\n\nexport class MarkAsBestAnswerCompact extends React.Component {\n onClick = () => {\n actions.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n \n check_box\n \n )\n }\n}\n\nexport class Like extends React.Component {\n onClick = () => {\n if (this.props.post.is_liked) {\n actions.unlike(this.props)\n } else {\n actions.like(this.props)\n }\n }\n\n render() {\n if (!this.props.post.acl.can_like) return null\n\n let className = \"btn btn-default btn-sm pull-left\"\n if (this.props.post.is_liked) {\n className = \"btn btn-success btn-sm pull-left\"\n }\n\n return (\n \n {this.props.post.is_liked ? gettext(\"Liked\") : gettext(\"Like\")}\n \n )\n }\n}\n\nexport class Likes extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n \n )\n }\n\n return (\n

    \n {getLikesMessage(this.props.likes, this.props.lastLikes)}\n

    \n )\n }\n}\n\nexport class LikesCompact extends Likes {\n render() {\n const hasLikes = (this.props.post.last_likes || []).length > 0\n if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n if (this.props.post.acl.can_see_likes === 2) {\n return (\n \n favorite\n {this.props.likes}\n \n )\n }\n\n return (\n

    \n favorite\n {this.props.likes}\n

    \n )\n }\n}\n\nexport function getLikesMessage(likes, users) {\n const usernames = users.slice(0, 3).map((u) => u.username)\n\n if (usernames.length == 1) {\n return interpolate(\n gettext(\"%(user)s likes this.\"),\n {\n user: usernames[0],\n },\n true\n )\n }\n\n const hiddenLikes = likes - usernames.length\n\n const otherUsers = usernames.slice(0, -1).join(\", \")\n const lastUser = usernames.slice(-1)[0]\n\n const usernamesList = interpolate(\n gettext(\"%(users)s and %(last_user)s\"),\n {\n users: otherUsers,\n last_user: lastUser,\n },\n true\n )\n\n if (hiddenLikes === 0) {\n return interpolate(\n gettext(\"%(users)s like this.\"),\n {\n users: usernamesList,\n },\n true\n )\n }\n\n const message = ngettext(\n \"%(users)s and %(likes)s other user like this.\",\n \"%(users)s and %(likes)s other users like this.\",\n hiddenLikes\n )\n\n return interpolate(\n message,\n {\n users: usernames.join(\", \"),\n likes: hiddenLikes,\n },\n true\n )\n}\n\nexport class Reply extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"REPLY\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post control\", \"Reply\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Quote extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"QUOTE\",\n\n thread: this.props.thread,\n config: this.props.thread.api.editor,\n submit: this.props.thread.api.posts.index,\n\n context: {\n reply: this.props.post.id,\n },\n })\n }\n\n render() {\n if (this.props.post.acl.can_reply) {\n return (\n \n {pgettext(\"post control\", \"Quote\")}\n \n )\n } else {\n return null\n }\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (this.props.post.acl.can_edit) {\n return (\n \n {pgettext(\"post control\", \"Edit\")}\n \n )\n } else {\n return null\n }\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n url: \"\",\n\n validators: {\n url: [],\n },\n errors: {},\n }\n }\n\n clean() {\n if (!this.state.url.trim().length) {\n snackbar.error(gettext(\"You have to enter link to the other thread.\"))\n return false\n }\n\n return true\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.move, {\n new_thread: this.state.url,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(success) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(gettext(\"Selected post was moved to the other thread.\"))\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onUrlChange = (event) => {\n this.changeValue(\"url\", event.target.value)\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n
    \n \n \n \n
    \n
    \n \n {gettext(\"Move post\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport function ModalHeader(props) {\n return (\n
    \n \n ×\n \n

    {gettext(\"Move post\")}

    \n
    \n )\n}\n","import React from \"react\"\n\nexport default function (props) {\n return (\n
    \n
      \n {props.diff.map((item, i) => {\n return \n })}\n
    \n
    \n )\n}\n\nexport function DiffItem(props) {\n if (props.item[0] === \"?\") return null\n\n return (\n
  • {cleanItem(props.item)}
  • \n )\n}\n\nexport function getItemClassName(item) {\n let className = \"diff-item\"\n if (item[0] === \"-\") {\n className += \" diff-item-sub\"\n } else if (item[0] === \"+\") {\n className += \" diff-item-add\"\n }\n return className\n}\n\nexport function cleanItem(item) {\n return item.substr(2)\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\n\nexport default class extends React.Component {\n onClick = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n if (!this.props.canRevert) return null\n\n return (\n
    \n \n {gettext(\"Revert\")}\n \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '%(relative)s'\nconst USER_SPAN = '%(user)s'\nconst USER_URL = '%(user)s'\n\nexport default class extends React.Component {\n goLast = () => {\n this.props.goToEdit()\n }\n\n goForward = () => {\n this.props.goToEdit(this.props.edit.next)\n }\n\n goBack = () => {\n this.props.goToEdit(this.props.edit.previous)\n }\n\n revertEdit = () => {\n this.props.revertEdit(this.props.edit.id)\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n )\n }\n}\n\nexport function GoBackBtn(props) {\n return (\n \n chevron_left\n \n )\n}\n\nexport function GoForwardBtn(props) {\n return (\n \n chevron_right\n \n )\n}\n\nexport function GoLastBtn(props) {\n return (\n \n last_page\n \n )\n}\n\nexport function RevertBtn(props) {\n if (!props.canRevert) return null\n\n return (\n
    \n \n {gettext(\"Revert\")}\n \n
    \n )\n}\n\nexport function Label(props) {\n let user = null\n if (props.edit.url.editor) {\n user = interpolate(\n USER_URL,\n {\n url: escapeHtml(props.edit.url.editor),\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n } else {\n user = interpolate(\n USER_SPAN,\n {\n user: escapeHtml(props.edit.editor_name),\n },\n true\n )\n }\n\n const date = interpolate(\n DATE_ABBR,\n {\n absolute: escapeHtml(props.edit.edited_on.format(\"LLL\")),\n relative: escapeHtml(props.edit.edited_on.fromNow()),\n },\n true\n )\n\n const message = interpolate(\n escapeHtml(gettext(\"By %(edited_by)s %(edited_on)s.\")),\n {\n edited_by: user,\n edited_on: date,\n },\n true\n )\n\n return

    \n}\n","import moment from \"moment\"\n\nexport function hydrateEdit(json) {\n return Object.assign({}, json, {\n edited_on: moment(json.edited_on),\n })\n}\n","import React from \"react\"\nimport Diff from \"./diff\"\nimport Footer from \"./footer\"\nimport Toolbar from \"./toolbar\"\nimport { hydrateEdit } from \"./utils\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isReady: false,\n isBusy: true,\n\n canRevert: props.post.acl.can_edit,\n\n error: null,\n edit: null,\n }\n }\n\n componentDidMount() {\n this.goToEdit()\n }\n\n goToEdit = (edit = null) => {\n this.setState({\n isBusy: true,\n })\n\n let url = this.props.post.api.edits\n if (edit !== null) {\n url += \"?edit=\" + edit\n }\n\n ajax.get(url).then(\n (data) => {\n this.setState({\n isReady: true,\n isBusy: false,\n edit: hydrateEdit(data),\n })\n },\n (rejection) => {\n this.setState({\n isReady: true,\n isBusy: false,\n error: rejection.detail,\n })\n }\n )\n }\n\n revertEdit = (edit) => {\n if (this.state.isBusy) return\n\n const confirmation = window.confirm(\n gettext(\n \"Are you sure you with to revert this post to the state from before this edit?\"\n )\n )\n if (!confirmation) return\n\n this.setState({\n isBusy: true,\n })\n\n const url = this.props.post.api.edits + \"?edit=\" + edit\n ajax.post(url).then(\n (data) => {\n const hydratedPost = post.hydrate(data)\n store.dispatch(post.patch(data, hydratedPost))\n\n snackbar.success(gettext(\"Post has been reverted to previous state.\"))\n modal.hide()\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n this.setState({\n isBusy: false,\n })\n }\n )\n }\n\n render() {\n if (this.state.error) {\n return (\n \n \n \n )\n } else if (this.state.isReady) {\n return (\n \n \n \n \n \n )\n }\n\n return (\n \n \n \n )\n }\n}\n\nexport function ModalDialog(props) {\n return (\n

    \n
    \n
    \n \n ×\n \n

    {gettext(\"Post edits history\")}

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default function (props) {\n return \n}\n\nexport class PostingConfig extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoaded: false,\n isError: false,\n\n categories: [],\n }\n }\n\n componentDidMount() {\n ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n (data) => {\n // hydrate categories, extract posting options\n const categories = data.map((item) => {\n return Object.assign(item, {\n disabled: item.post === false,\n label: item.name,\n value: item.id,\n post: item.post,\n })\n })\n\n this.setState({\n isLoaded: true,\n categories,\n })\n },\n (rejection) => {\n this.setState({\n isError: rejection.detail,\n })\n }\n )\n }\n\n render() {\n if (this.state.isError) {\n return \n } else if (this.state.isLoaded) {\n return (\n \n )\n } else {\n return \n }\n }\n}\n\nexport class ModerationForm extends Form {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n\n title: \"\",\n category: null,\n categories: props.categories,\n weight: 0,\n is_hidden: 0,\n is_closed: false,\n\n validators: {\n title: [validators.required()],\n },\n\n errors: {},\n }\n\n this.isHiddenChoices = [\n {\n value: 0,\n icon: \"visibility\",\n label: gettext(\"No\"),\n },\n {\n value: 1,\n icon: \"visibility_off\",\n label: gettext(\"Yes\"),\n },\n ]\n\n this.isClosedChoices = [\n {\n value: false,\n icon: \"lock_outline\",\n label: gettext(\"No\"),\n },\n {\n value: true,\n icon: \"lock\",\n label: gettext(\"Yes\"),\n },\n ]\n\n this.acl = {}\n this.props.categories.forEach((category) => {\n if (category.post) {\n if (!this.state.category) {\n this.state.category = category.id\n }\n\n this.acl[category.id] = {\n can_pin_threads: category.post.pin,\n can_close_threads: category.post.close,\n can_hide_threads: category.post.hide,\n }\n }\n })\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(this.props.thread.api.posts.split, {\n title: this.state.title,\n category: this.state.category,\n weight: this.state.weight,\n is_hidden: this.state.is_hidden,\n is_closed: this.state.is_closed,\n posts: [this.props.post.id],\n })\n }\n\n handleSuccess(apiResponse) {\n store.dispatch(\n post.patch(this.props.post, {\n isDeleted: true,\n })\n )\n\n modal.hide()\n\n snackbar.success(gettext(\"Selected post was split into new thread.\"))\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n snackbar.error(gettext(\"Form contains errors.\"))\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n onCategoryChange = (ev) => {\n const categoryId = ev.target.value\n const newState = {\n category: categoryId,\n }\n\n if (this.acl[categoryId].can_pin_threads < newState.weight) {\n newState.weight = 0\n }\n\n if (!this.acl[categoryId].can_hide_threads) {\n newState.is_hidden = 0\n }\n\n if (!this.acl[categoryId].can_close_threads) {\n newState.is_closed = false\n }\n\n this.setState(newState)\n }\n\n getWeightChoices() {\n const choices = [\n {\n value: 0,\n icon: \"remove\",\n label: gettext(\"Not pinned\"),\n },\n {\n value: 1,\n icon: \"bookmark_border\",\n label: gettext(\"Pinned locally\"),\n },\n ]\n\n if (this.acl[this.state.category].can_pin_threads == 2) {\n choices.push({\n value: 2,\n icon: \"bookmark\",\n label: gettext(\"Pinned globally\"),\n })\n }\n\n return choices\n }\n\n renderWeightField() {\n if (this.acl[this.state.category].can_pin_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderHiddenField() {\n if (this.acl[this.state.category].can_hide_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n renderClosedField() {\n if (this.acl[this.state.category].can_close_threads) {\n return (\n \n \n \n )\n } else {\n return null\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n \n \n
    \n\n \n \n \n
    \n\n {this.renderWeightField()}\n {this.renderHiddenField()}\n {this.renderClosedField()}\n
    \n
    \n \n
    \n \n \n )\n }\n}\n\nexport function Loader() {\n return (\n \n \n \n )\n}\n\nexport function Error(props) {\n return (\n \n
    \n info_outline\n
    \n
    \n

    \n {gettext(\"You can't move this post at the moment.\")}\n

    \n

    {props.message}

    \n
    \n
    \n )\n}\n\nexport function Modal(props) {\n return (\n
    \n
    \n
    \n \n ×\n \n

    \n {gettext(\"Split post into new thread\")}\n

    \n
    \n {props.children}\n
    \n
    \n )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n return (\n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n )\n}\n\nexport class Permalink extends React.Component {\n onClick = () => {\n let permaUrl = window.location.protocol + \"//\"\n permaUrl += window.location.host\n permaUrl += this.props.post.url.index\n\n prompt(gettext(\"Permament link to this post:\"), permaUrl)\n }\n\n render() {\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Edit extends React.Component {\n onClick = () => {\n posting.open({\n mode: \"EDIT\",\n\n thread: this.props.thread,\n post: this.props.post,\n config: this.props.post.api.editor,\n submit: this.props.post.api.index,\n })\n }\n\n render() {\n if (!this.props.post.acl.can_edit) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n onClick = () => {\n moderation.markAsBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (!thread.acl.can_mark_best_answer) return null\n if (!post.acl.can_mark_as_best_answer) return null\n if (post.id === thread.best_answer) return null\n if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class UnmarkMarkBestAnswer extends React.Component {\n onClick = () => {\n moderation.unmarkBestAnswer(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id !== thread.best_answer) return null\n if (!thread.acl.can_unmark_best_answer) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class PostEdits extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n const isHidden =\n this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n const isUnedited = this.props.post.edits === 0\n if (isHidden || isUnedited) return null\n\n const message = ngettext(\n \"This post was edited %(edits)s time.\",\n \"This post was edited %(edits)s times.\",\n this.props.post.edits\n )\n\n const title = interpolate(\n message,\n {\n edits: this.props.post.edits,\n },\n true\n )\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Approve extends React.Component {\n onClick = () => {\n moderation.approve(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_approve) return null\n if (!this.props.post.is_unapproved) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Move extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Split extends React.Component {\n onClick = () => {\n modal.show()\n }\n\n render() {\n if (!this.props.post.acl.can_move) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Protect extends React.Component {\n onClick = () => {\n moderation.protect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unprotect extends React.Component {\n onClick = () => {\n moderation.unprotect(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_protect) return null\n if (!this.props.post.is_protected) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Hide extends React.Component {\n onClick = () => {\n moderation.hide(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_hide) return null\n if (post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Unhide extends React.Component {\n onClick = () => {\n moderation.unhide(this.props)\n }\n\n render() {\n if (!this.props.post.acl.can_unhide) return null\n if (!this.props.post.is_hidden) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n\nexport class Delete extends React.Component {\n onClick = () => {\n moderation.remove(this.props)\n }\n\n render() {\n const { post, thread } = this.props\n\n if (post.id === thread.best_answer) return null\n if (!post.acl.can_delete) return null\n\n return (\n
  • \n \n
  • \n )\n }\n}\n","import React from \"react\"\nimport Dropdown from \"./dropdown\"\n\nexport default function (props) {\n return (\n
    \n \n expand_more\n \n \n
    \n )\n}\n","import React from \"react\"\nimport * as posts from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n onClick = () => {\n if (this.props.post.isSelected) {\n store.dispatch(posts.deselect(this.props.post))\n } else {\n store.dispatch(posts.select(this.props.post))\n }\n }\n\n render() {\n if (\n !(this.props.thread.acl.can_merge_posts || isVisible(this.props.post.acl))\n ) {\n return null\n }\n\n return (\n
    \n \n \n {this.props.post.isSelected\n ? \"check_box\"\n : \"check_box_outline_blank\"}\n \n \n
    \n )\n }\n}\n\nexport function isVisible(acl) {\n return (\n acl.can_approve ||\n acl.can_hide ||\n acl.can_protect ||\n acl.can_unhide ||\n acl.can_delete ||\n acl.can_move\n )\n}\n","import React from \"react\"\nimport Controls from \"./controls\"\nimport Select from \"./select\"\nimport {\n StatusIcon,\n getStatusClassName,\n getStatusDescription,\n} from \"misago/components/user-status\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport modal from \"misago/services/modal\"\n\nexport default function (props) {\n return (\n
    \n \n \n \n \n \n \n \n \n \n
    \n
    \n \n \n \n
    \n
    \n {post.poster_name}\n\n \n {gettext(\"Removed user\")}\n \n
    \n
    \n
    \n )\n}\n","export default function ({ title, rank }) {\n return rank.is_tab || !!title || !!rank.title\n}\n","import React from \"react\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n const message = ngettext(\"%(posts)s post\", \"%(posts)s posts\", poster.posts)\n\n let className = \"user-postcount\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-xs hidden-sm\"\n }\n\n return (\n \n {interpolate(\n message,\n {\n posts: poster.posts,\n },\n true\n )}\n \n )\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n let className = \"hidden-xs\"\n if (hasVisibleTitle(poster)) {\n className += \" hidden-sm\"\n }\n\n return (\n \n \n \n \n \n )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n let userTitle = title || rank.title\n if (!userTitle && rank.is_tab) {\n userTitle = rank.name\n }\n\n if (!userTitle) return null\n\n let className = \"user-title\"\n if (rank.css_class) {\n className += \" user-title-\" + rank.css_class\n }\n\n if (rank.is_tab) {\n return (\n \n )\n }\n\n return
    {userTitle}
    \n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Controls from \"misago/components/posts-list/post/controls\"\nimport Select from \"misago/components/posts-list/post/select\"\nimport UserStatus, { StatusIcon } from \"misago/components/user-status\"\nimport UserPostcount from \"./user-postcount\"\nimport UserStatusLabel from \"./user-status\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, thread }) {\n const { poster } = post\n\n return (\n
    \n \n \n {children}\n \n )\n}\n","import React from \"react\"\n\nexport default function () {\n return (\n
  • \n {gettext(\"Search returned no results.\")}\n
  • \n )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ message }) {\n return (\n
  • \n \n
  • \n )\n}\n","import React from \"react\"\n\nexport default function ({ provider, query }) {\n const url = provider.url + \"?q=\" + encodeURI(query)\n const label = ngettext(\n 'See full \"%(provider)s\" results page with %(count)s result.',\n 'See full \"%(provider)s\" results page with %(count)s results.',\n provider.count\n )\n\n return (\n
  • \n \n {interpolate(\n label,\n {\n count: provider.count,\n provider: provider.name,\n },\n true\n )}\n \n
  • \n )\n}\n","import React from \"react\"\n\nexport default function ({ provider }) {\n return
  • {provider.name}
  • \n}\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default function ({ result }) {\n const { poster, thread } = result\n const footer = gettext(\n \"Posted by %(poster)s on %(posted_on)s in %(category)s.\"\n )\n\n return (\n
  • \n \n
    {thread.title}
    \n \n {$(result.content).text()}\n \n \n {interpolate(\n footer,\n {\n category: result.category.name,\n posted_on: moment(result.posted_on).format(\"LL\"),\n poster: result.poster_name,\n },\n true\n )}\n \n
    \n
  • \n )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function ({ result }) {\n const { rank } = result\n\n const detail = gettext(\"%(title)s, joined on %(joined_on)s\")\n const title = result.title || rank.title || rank.name\n\n return (\n
  • \n \n
    \n
    \n \n
    \n
    \n
    {result.username}
    \n \n {interpolate(\n detail,\n {\n title,\n joined_on: moment(result.joined_on).format(\"LL\"),\n },\n true\n )}\n \n
    \n
    \n
    \n
  • \n )\n}\n","import React from \"react\"\nimport Thread from \"./thread\"\nimport User from \"./user\"\n\nexport default function ({ provider, result }) {\n if (provider.id === \"threads\") {\n return \n }\n\n return \n}\n","import React from \"react\"\nimport { HEADER, FOOTER } from \"../constants\"\nimport Footer from \"./footer\"\nimport Header from \"./header\"\nimport Result from \"./result\"\n\nexport default function ({ provider, result, type, query }) {\n if (type === HEADER) {\n return
    \n } else if (type === FOOTER) {\n return
    \n }\n\n return \n}\n","import { HEADER, RESULT, FOOTER } from \"./constants\"\n\nexport default function (results) {\n const flatlist = []\n flattenProviders(results, flatlist)\n return flatlist\n}\n\nfunction flattenProviders(results, flatlist) {\n const arrayLength = results.length\n for (var i = 0; i < arrayLength; i++) {\n const provider = results[i]\n\n flatlist.push({\n provider,\n type: HEADER,\n })\n\n flattenProvider(provider, flatlist)\n }\n}\n\nfunction flattenProvider(provider, flatlist) {\n const arrayLength = provider.results.length\n for (var i = 0; i < arrayLength; i++) {\n const result = provider.results[i]\n flatlist.push({\n provider,\n result,\n type: RESULT,\n })\n }\n\n flatlist.push({\n provider,\n type: FOOTER,\n })\n}\n","import React from \"react\"\nimport { RESULT } from \"./constants\"\nimport DropdownMenu from \"./dropdown-menu\"\nimport Empty from \"./empty\"\nimport Loader from \"./loader\"\nimport Result from \"./result\"\nimport flattenResults from \"./flatten-results\"\n\nexport default function ({ isLoading, onChange, results, query }) {\n if (!query.trim().length) {\n return \n }\n\n if (results.length) {\n const flatResults = flattenResults(results)\n\n return (\n \n {flatResults.map((props) => {\n const { type, provider, result } = props\n\n if (type === RESULT) {\n return (\n \n )\n }\n\n return (\n \n )\n })}\n \n )\n } else if (isLoading) {\n return (\n \n \n \n )\n }\n\n return (\n \n \n \n )\n}\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport misago from \"misago\"\nimport cleanResults from \"./clean-results\"\nimport Dropdown from \"./dropdown\"\n\nexport default class extends React.Component {\n constructor() {\n super()\n\n this.state = {\n isLoading: false,\n isOpen: false,\n query: \"\",\n results: [],\n }\n\n this.intervalId = null\n }\n\n componentDidMount() {\n document.addEventListener(\"mousedown\", this.onDocumentMouseDown)\n document.addEventListener(\"keydown\", this.onEscape)\n }\n\n componentWillUnmount() {\n document.removeEventListener(\"mousedown\", this.onDocumentMouseDown)\n document.removeEventListener(\"keydown\", this.onEscape)\n }\n\n onToggle = (ev) => {\n this.setState((prevState, props) => {\n if (!prevState.isOpen) {\n window.setTimeout(() => {\n this.container.querySelector(\"input\").focus()\n }, 100)\n }\n\n return { isOpen: !prevState.isOpen }\n })\n }\n\n onDocumentMouseDown = (ev) => {\n let closeResults = true\n let node = ev.target\n\n while (node !== null && node !== document) {\n if (node === this.container) {\n closeResults = false\n return\n }\n\n node = node.parentNode\n }\n\n if (closeResults) {\n this.setState({ isOpen: false })\n }\n }\n\n onEscape = (ev) => {\n if (ev.key === \"Escape\") {\n this.setState({ isOpen: false })\n }\n }\n\n onChange = (ev) => {\n const query = ev.target.value\n\n this.setState({ query })\n this.loadResults(query.trim())\n }\n\n loadResults(query) {\n if (!query.length) return\n\n const delay = 300 + Math.random() * 300\n\n if (this.intervalId) {\n window.clearTimeout(this.intervalId)\n }\n\n this.setState({ isLoading: true })\n\n this.intervalId = window.setTimeout(() => {\n ajax.get(misago.get(\"SEARCH_API\"), { q: query }).then(\n (data) => {\n this.setState({\n intervalId: null,\n isLoading: false,\n results: cleanResults(data),\n })\n },\n (rejection) => {\n snackbar.apiError(rejection)\n\n this.setState({\n intervalId: null,\n isLoading: false,\n results: [],\n })\n }\n )\n }, delay)\n }\n\n render() {\n let className = \"navbar-search dropdown\"\n if (this.state.isOpen) className += \" open\"\n\n return (\n (this.container = container)}\n >\n \n search\n \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport const STYLES = [\n \"progress-bar-danger\",\n \"progress-bar-warning\",\n \"progress-bar-warning\",\n \"progress-bar-primary\",\n \"progress-bar-success\",\n]\n\nexport const LABELS = [\n gettext(\"Entered password is very weak.\"),\n gettext(\"Entered password is weak.\"),\n gettext(\"Entered password is average.\"),\n gettext(\"Entered password is strong.\"),\n gettext(\"Entered password is very strong.\"),\n]\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this._score = 0\n this._password = null\n this._inputs = []\n\n this.state = {\n loaded: false,\n }\n }\n\n componentDidMount() {\n zxcvbn.load().then(() => {\n this.setState({ loaded: true })\n })\n }\n\n getScore(password, inputs) {\n let cacheStale = false\n\n if (password !== this._password) {\n cacheStale = true\n }\n\n if (inputs.length !== this._inputs.length) {\n cacheStale = true\n } else {\n inputs.map((value, i) => {\n if (value.trim() !== this._inputs[i]) {\n cacheStale = true\n }\n })\n }\n\n if (cacheStale) {\n this._score = zxcvbn.scorePassword(password, inputs)\n this._password = password\n this._inputs = inputs.map(function (value) {\n return value.trim()\n })\n }\n\n return this._score\n }\n\n render() {\n if (!this.state.loaded) return null\n\n let score = this.getScore(this.props.password, this.props.inputs)\n\n return (\n
    \n
    \n \n {LABELS[score]}\n
    \n
    \n

    {LABELS[score]}

    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport PasswordStrength from \"misago/components/password-strength\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport captcha from \"misago/services/captcha\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\nimport * as validators from \"misago/utils/validators\"\n\nexport class RegisterForm extends Form {\n constructor(props) {\n super(props)\n\n const { username, password } = this.props.criteria\n\n let passwordMinLength = 0\n password.forEach((item) => {\n if (item.name === \"MinimumLengthValidator\") {\n passwordMinLength = item.min_length\n }\n })\n\n const formValidators = {\n username: [\n validators.usernameContent(),\n validators.usernameMinLength(username.min_length),\n validators.usernameMaxLength(username.max_length),\n ],\n email: [validators.email()],\n password: [validators.passwordMinLength(passwordMinLength)],\n captcha: captcha.validator(),\n }\n\n if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n formValidators.termsOfService = [validators.requiredTermsOfService()]\n }\n\n if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n }\n\n this.state = {\n isLoading: false,\n\n username: \"\",\n email: \"\",\n password: \"\",\n captcha: \"\",\n\n termsOfService: null,\n privacyPolicy: null,\n\n validators: formValidators,\n errors: {},\n }\n }\n\n clean() {\n if (this.isValid()) {\n return true\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n this.setState({\n errors: this.validate(),\n })\n return false\n }\n }\n\n send() {\n return ajax.post(misago.get(\"USERS_API\"), {\n username: this.state.username,\n email: this.state.email,\n password: this.state.password,\n captcha: this.state.captcha,\n terms_of_service: this.state.termsOfService,\n privacy_policy: this.state.privacyPolicy,\n })\n }\n\n handleSuccess(apiResponse) {\n this.props.callback(apiResponse)\n }\n\n handleError(rejection) {\n if (rejection.status === 400) {\n this.setState({\n errors: Object.assign({}, this.state.errors, rejection),\n })\n\n if (rejection.__all__ && rejection.__all__.length > 0) {\n snackbar.error(rejection.__all__[0])\n } else {\n snackbar.error(gettext(\"Form contains errors.\"))\n }\n } else if (rejection.status === 403 && rejection.ban) {\n showBannedPage(rejection.ban)\n modal.hide()\n } else {\n snackbar.apiError(rejection)\n }\n }\n\n handlePrivacyPolicyChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"privacyPolicy\", value)\n }\n\n handleTermsOfServiceChange = (event) => {\n const value = event.target.value\n this.handleToggleAgreement(\"termsOfService\", value)\n }\n\n handleToggleAgreement = (agreement, value) => {\n this.setState((prevState, props) => {\n if (prevState[agreement] === null) {\n const errors = { ...prevState.errors, [agreement]: null }\n return { errors, [agreement]: value }\n }\n\n const validator = this.state.validators[agreement][0]\n const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n return { errors, [agreement]: null }\n })\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Register\")}

    \n
    \n
    \n \n \n
    \n \n\n \n \n \n\n \n \n \n\n \n }\n >\n \n \n\n {captcha.component({\n form: this,\n })}\n\n \n
    \n
    \n \n {gettext(\"Cancel\")}\n \n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport class RegisterComplete extends React.Component {\n getLead() {\n if (this.props.activation === \"user\") {\n return gettext(\n \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n )\n } else if (this.props.activation === \"admin\") {\n return gettext(\n \"%(username)s, your account has been created but board administrator will have to activate it before you will be able to sign in.\"\n )\n }\n }\n\n getSubscript() {\n if (this.props.activation === \"user\") {\n return gettext(\n \"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\"\n )\n } else if (this.props.activation === \"admin\") {\n return gettext(\n \"We will send an e-mail to %(email)s when this takes place.\"\n )\n }\n }\n\n render() {\n return (\n \n
    \n
    \n \n ×\n \n

    {gettext(\"Registration complete\")}

    \n
    \n
    \n
    \n info_outline\n
    \n
    \n

    \n {interpolate(\n this.getLead(),\n { username: this.props.username },\n true\n )}\n

    \n

    \n {interpolate(\n this.getSubscript(),\n { email: this.props.email },\n true\n )}\n

    \n \n {gettext(\"Ok\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n complete: false,\n }\n }\n\n completeRegistration = (apiResponse) => {\n if (apiResponse.activation === \"active\") {\n modal.hide()\n auth.signIn(apiResponse)\n } else {\n this.setState({\n complete: apiResponse,\n })\n }\n }\n\n render() {\n if (this.state.complete) {\n return (\n \n )\n }\n\n return \n }\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\nimport RegisterForm from \"misago/components/register.js\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n isLoaded: false,\n\n criteria: null,\n }\n }\n\n showRegisterForm = () => {\n if (misago.get(\"SETTINGS\").account_activation === \"closed\") {\n snackbar.info(gettext(\"New registrations are currently disabled.\"))\n } else if (this.state.isLoaded) {\n modal.show()\n } else {\n this.setState({ isLoading: true })\n\n Promise.all([\n captcha.load(),\n ajax.get(misago.get(\"AUTH_CRITERIA_API\")),\n ]).then(\n (result) => {\n this.setState({\n isLoading: false,\n isLoaded: true,\n criteria: result[1],\n })\n\n modal.show()\n },\n () => {\n this.setState({ isLoading: false })\n\n snackbar.error(\n gettext(\"Registration is currently unavailable due to an error.\")\n )\n }\n )\n }\n }\n\n getClassName() {\n return this.props.className + (this.state.isLoading ? \" btn-loading\" : \"\")\n }\n\n render() {\n return (\n \n {gettext(\"Register\")}\n {this.state.isLoading ? : null}\n \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport NavbarSearch from \"misago/components/navbar-search\"\nimport RegisterButton from \"misago/components/register-button\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport misago from \"misago\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\nimport modal from \"misago/services/modal\"\n\nexport class GuestMenu extends React.Component {\n showSignInModal() {\n modal.show(SignInModal)\n }\n\n componentDidMount() {\n const params = new URLSearchParams(window.location.search)\n\n if (params.get(\"modal\") === \"login\") {\n window.setTimeout(this.showSignInModal, 500)\n }\n }\n\n render() {\n const delegateAuth = misago.get(\"SETTINGS\").DELEGATE_AUTH\n\n return (\n \n
  • \n

    {gettext(\"You are browsing as guest.\")}

    \n

    \n {gettext(\n \"Sign in or register to start and participate in discussions.\"\n )}\n

    \n {delegateAuth ? (\n
    \n
    \n \n {gettext(\"Sign in\")}\n \n
    \n
    \n ) : (\n
    \n
    \n \n {gettext(\"Sign in\")}\n \n
    \n
    \n \n {gettext(\"Register\")}\n \n
    \n
    \n )}\n
  • \n \n )\n }\n}\n\nexport class GuestNav extends GuestMenu {\n render() {\n if (misago.get(\"SETTINGS\").DELEGATE_AUTH) {\n return (\n
    \n \n {gettext(\"Sign in\")}\n \n
    \n \n
    \n
    \n )\n }\n\n return (\n
    \n \n {gettext(\"Sign in\")}\n \n \n {gettext(\"Register\")}\n \n
    \n \n
    \n
    \n )\n }\n}\n\nexport class CompactGuestNav extends React.Component {\n showGuestMenu() {\n dropdown.show(GuestMenu)\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport Loader from \"misago/components/loader\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n }\n }\n\n callApi(avatarType) {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n setGravatar = () => {\n this.callApi(\"gravatar\")\n }\n\n setGenerated = () => {\n this.callApi(\"generated\")\n }\n\n getGravatarButton() {\n if (this.props.options.gravatar) {\n return (\n \n {gettext(\"Download my Gravatar\")}\n \n )\n } else {\n return null\n }\n }\n\n getCropButton() {\n if (!this.props.options.crop_src) return null\n\n return (\n \n {gettext(\"Re-crop uploaded image\")}\n \n )\n }\n\n getUploadButton() {\n if (!this.props.options.upload) return null\n\n return (\n \n {gettext(\"Upload new image\")}\n \n )\n }\n\n getGalleryButton() {\n if (!this.props.options.galleries) return null\n\n return (\n \n {gettext(\"Pick avatar from gallery\")}\n \n )\n }\n\n getAvatarPreview() {\n let userPeview = {\n id: this.props.user.id,\n avatars: this.props.options.avatars,\n }\n\n if (this.state.isLoading) {\n return (\n
    \n \n \n
    \n )\n }\n\n return (\n
    \n \n
    \n )\n }\n\n render() {\n return (\n
    \n
    \n
    {this.getAvatarPreview()}
    \n
    \n {this.getGravatarButton()}\n\n \n {gettext(\"Generate my individual avatar\")}\n \n\n {this.getCropButton()}\n {this.getUploadButton()}\n {this.getGalleryButton()}\n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n isLoading: false,\n deviceRatio: 1,\n }\n }\n\n getAvatarSize() {\n if (this.props.upload) {\n return this.props.options.crop_tmp.size\n } else {\n return this.props.options.crop_src.size\n }\n }\n\n getImagePath() {\n if (this.props.upload) {\n return this.props.dataUrl\n } else {\n return this.props.options.crop_src.url\n }\n }\n\n componentDidMount() {\n let cropit = $(\".crop-form\")\n let cropperWidth = this.getAvatarSize()\n\n const initialWidth = cropit.width()\n while (initialWidth < cropperWidth) {\n cropperWidth = cropperWidth / 2\n }\n\n const deviceRatio = this.getAvatarSize() / cropperWidth\n\n cropit.width(cropperWidth)\n\n cropit.cropit({\n width: cropperWidth,\n height: cropperWidth,\n exportZoom: deviceRatio,\n imageState: {\n src: this.getImagePath(),\n },\n onImageLoaded: () => {\n if (this.props.upload) {\n // center uploaded image\n let zoomLevel = cropit.cropit(\"zoom\")\n let imageSize = cropit.cropit(\"imageSize\")\n\n // is it wider than taller?\n if (imageSize.width > imageSize.height) {\n let displayedWidth = imageSize.width * zoomLevel\n let offsetX = (displayedWidth - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: offsetX,\n y: 0,\n })\n } else if (imageSize.width < imageSize.height) {\n let displayedHeight = imageSize.height * zoomLevel\n let offsetY = (displayedHeight - this.getAvatarSize()) / -2\n\n cropit.cropit(\"offset\", {\n x: 0,\n y: offsetY,\n })\n } else {\n cropit.cropit(\"offset\", {\n x: 0,\n y: 0,\n })\n }\n } else {\n // use preserved crop\n let crop = this.props.options.crop_src.crop\n\n if (crop) {\n cropit.cropit(\"zoom\", crop.zoom)\n cropit.cropit(\"offset\", {\n x: crop.x,\n y: crop.y,\n })\n }\n }\n },\n })\n }\n\n componentWillUnmount() {\n $(\".crop-form\").cropit(\"disable\")\n }\n\n cropAvatar = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n let avatarType = this.props.upload ? \"crop_tmp\" : \"crop_src\"\n let cropit = $(\".crop-form\")\n\n const deviceRatio = cropit.cropit(\"exportZoom\")\n const cropitOffset = cropit.cropit(\"offset\")\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: avatarType,\n crop: {\n offset: {\n x: cropitOffset.x * deviceRatio,\n y: cropitOffset.y * deviceRatio,\n },\n zoom: cropit.cropit(\"zoom\") * deviceRatio,\n },\n })\n .then(\n (data) => {\n this.props.onComplete(data)\n snackbar.success(data.detail)\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n {this.props.upload\n ? gettext(\"Set avatar\")\n : gettext(\"Crop image\")}\n \n\n \n {gettext(\"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport fileSize from \"misago/utils/file-size\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n image: null,\n preview: null,\n progress: 0,\n uploaded: null,\n dataUrl: null,\n }\n }\n\n validateFile(image) {\n if (image.size > this.props.options.upload.limit) {\n return interpolate(\n gettext(\"Selected file is too big. (%(filesize)s)\"),\n {\n filesize: fileSize(image.size),\n },\n true\n )\n }\n\n let invalidTypeMsg = gettext(\"Selected file type is not supported.\")\n if (\n this.props.options.upload.allowed_mime_types.indexOf(image.type) === -1\n ) {\n return invalidTypeMsg\n }\n\n let extensionFound = false\n let loweredFilename = image.name.toLowerCase()\n this.props.options.upload.allowed_extensions.map(function (extension) {\n if (loweredFilename.substr(extension.length * -1) === extension) {\n extensionFound = true\n }\n })\n\n if (!extensionFound) {\n return invalidTypeMsg\n }\n\n return false\n }\n\n pickFile = () => {\n document.getElementById(\"avatar-hidden-upload\").click()\n }\n\n uploadFile = () => {\n let image = document.getElementById(\"avatar-hidden-upload\").files[0]\n if (!image) return\n\n let validationError = this.validateFile(image)\n if (validationError) {\n snackbar.error(validationError)\n return\n }\n\n this.setState({\n image,\n preview: URL.createObjectURL(image),\n progress: 0,\n })\n\n let data = new FormData()\n data.append(\"avatar\", \"upload\")\n data.append(\"image\", image)\n\n ajax\n .upload(this.props.user.api.avatar, data, (progress) => {\n this.setState({\n progress,\n })\n })\n .then(\n (data) => {\n this.setState({\n options: data,\n uploaded: data.detail,\n })\n\n snackbar.info(\n gettext(\"Your image has been uploaded and you may now crop it.\")\n )\n },\n (rejection) => {\n if (rejection.status === 400 || rejection.status === 413) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n image: null,\n progress: 0,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n getUploadRequirements(options) {\n let extensions = options.allowed_extensions.map(function (extension) {\n return extension.substr(1)\n })\n\n return interpolate(\n gettext(\"%(files)s files smaller than %(limit)s\"),\n {\n files: extensions.join(\", \"),\n limit: fileSize(options.limit),\n },\n true\n )\n }\n\n getUploadButton() {\n return (\n
    \n \n

    \n {this.getUploadRequirements(this.props.options.upload)}\n

    \n
    \n )\n }\n\n getUploadProgressLabel() {\n return interpolate(\n gettext(\"%(progress)s % complete\"),\n {\n progress: this.state.progress,\n },\n true\n )\n }\n\n getUploadProgress() {\n return (\n
    \n
    \n \n\n
    \n \n {this.getUploadProgressLabel()}\n
    \n
    \n
    \n
    \n )\n }\n\n renderUpload() {\n return (\n
    \n \n {this.state.image ? this.getUploadProgress() : this.getUploadButton()}\n
    \n
    \n \n {gettext(\"Cancel\")}\n \n
    \n
    \n
    \n )\n }\n\n renderCrop() {\n return (\n \n )\n }\n\n render() {\n if (this.state.uploaded) return this.renderCrop()\n\n return this.renderUpload()\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport batch from \"misago/utils/batch\"\n\nexport class GalleryItem extends React.Component {\n select = () => {\n this.props.select(this.props.id)\n }\n\n getClassName() {\n if (this.props.selection === this.props.id) {\n if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled avatar-selected\"\n } else {\n return \"btn btn-avatar avatar-selected\"\n }\n } else if (this.props.disabled) {\n return \"btn btn-avatar btn-disabled\"\n } else {\n return \"btn btn-avatar\"\n }\n }\n\n render() {\n return (\n \n \n \n )\n }\n}\n\nexport class Gallery extends React.Component {\n render() {\n return (\n
    \n

    {this.props.name}

    \n\n
    \n {batch(this.props.images, 4, null).map((row, i) => {\n return (\n
    \n {row.map((item, i) => {\n return (\n
    \n {item ? (\n \n ) : (\n
    \n )}\n
    \n )\n })}\n
    \n )\n })}\n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n this.state = {\n selection: null,\n isLoading: false,\n }\n }\n\n select = (image) => {\n this.setState({\n selection: image,\n })\n }\n\n save = () => {\n if (this.state.isLoading) {\n return false\n }\n\n this.setState({\n isLoading: true,\n })\n\n ajax\n .post(this.props.user.api.avatar, {\n avatar: \"galleries\",\n image: this.state.selection,\n })\n .then(\n (response) => {\n this.setState({\n isLoading: false,\n })\n\n snackbar.success(response.detail)\n this.props.onComplete(response)\n this.props.showIndex()\n },\n (rejection) => {\n if (rejection.status === 400) {\n snackbar.error(rejection.detail)\n this.setState({\n isLoading: false,\n })\n } else {\n this.props.showError(rejection)\n }\n }\n )\n }\n\n render() {\n return (\n
    \n
    \n {this.props.options.galleries.map((item, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n \n {this.state.selection\n ? gettext(\"Save choice\")\n : gettext(\"Select avatar\")}\n \n\n \n {gettext(\"Cancel\")}\n \n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport AvatarIndex from \"misago/components/change-avatar/index\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport AvatarUpload from \"misago/components/change-avatar/upload\"\nimport AvatarGallery from \"misago/components/change-avatar/gallery\"\nimport Loader from \"misago/components/modal-loader\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport store from \"misago/services/store\"\n\nexport class ChangeAvatarError extends React.Component {\n getErrorReason() {\n if (this.props.reason) {\n return

    \n } else {\n return null\n }\n }\n\n render() {\n return (\n

    \n
    \n remove_circle_outline\n
    \n
    \n

    {this.props.message}

    \n {this.getErrorReason()}\n \n {gettext(\"Ok\")}\n \n
    \n
    \n )\n }\n}\n\nexport default class extends React.Component {\n componentDidMount() {\n ajax.get(this.props.user.api.avatar).then(\n (options) => {\n this.setState({\n component: AvatarIndex,\n options: options,\n error: null,\n })\n },\n (rejection) => {\n this.showError(rejection)\n }\n )\n }\n\n showError = (error) => {\n this.setState({\n error,\n })\n }\n\n showIndex = () => {\n this.setState({\n component: AvatarIndex,\n })\n }\n\n showUpload = () => {\n this.setState({\n component: AvatarUpload,\n })\n }\n\n showCrop = () => {\n this.setState({\n component: AvatarCrop,\n })\n }\n\n showGallery = () => {\n this.setState({\n component: AvatarGallery,\n })\n }\n\n completeFlow = (options) => {\n store.dispatch(updateAvatar(this.props.user, options.avatars))\n\n this.setState({\n component: AvatarIndex,\n options,\n })\n }\n\n getBody() {\n if (this.state) {\n if (this.state.error) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n\n getClassName() {\n if (this.state && this.state.error) {\n return \"modal-dialog modal-message modal-change-avatar\"\n } else {\n return \"modal-dialog modal-change-avatar\"\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n \n ×\n \n

    {gettext(\"Change your avatar\")}

    \n
    \n\n {this.getBody()}\n
    \n
    \n )\n }\n}\n\nexport function select(state) {\n return {\n user: state.auth.user,\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport Avatar from \"misago/components/avatar\"\nimport ChangeAvatarModal, { select } from \"misago/components/change-avatar/root\"\nimport NavbarSearch from \"misago/components/navbar-search\"\nimport misago from \"misago\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\nimport modal from \"misago/services/modal\"\n\nexport class UserMenu extends React.Component {\n changeAvatar() {\n modal.show(connect(select)(ChangeAvatarModal))\n }\n\n render() {\n const { user } = this.props\n\n return (\n \n
  • \n {user.username}\n
    \n
    \n message\n {user.posts}\n
    \n
    \n forum\n {user.threads}\n
    \n
    \n favorite\n {user.followers}\n
    \n
    \n favorite_outline\n {user.following}\n
    \n
    \n
  • \n
  • \n
  • \n \n account_circle\n {gettext(\"See your profile\")}\n \n
  • \n
  • \n \n done_all\n {gettext(\"Change options\")}\n \n
  • \n
  • \n \n portrait\n {gettext(\"Change avatar\")}\n \n
  • \n {!!user.acl.can_use_private_threads && (\n
  • \n \n message\n {gettext(\"Private threads\")}\n \n \n
  • \n )}\n
  • \n
  • \n \n document.getElementById(\"hidden-logout-form\").submit()\n }\n type=\"button\"\n >\n {gettext(\"Log out\")}\n \n
  • \n \n )\n }\n}\n\nexport function PrivateThreadsBadge({ user }) {\n if (!user.unread_private_threads) return null\n\n return {user.unread_private_threads}\n}\n\nexport function UserNav({ user }) {\n return (\n
      \n
    • \n \n
    • \n \n
    • \n \n \n \n \n
    • \n
    \n )\n}\n\nexport function UserPrivateThreadsLink({ user }) {\n if (!user.acl.can_use_private_threads) return null\n\n let title = null\n if (user.unread_private_threads) {\n title = gettext(\"You have unread private threads!\")\n } else {\n title = gettext(\"Private threads\")\n }\n\n return (\n
  • \n \n message\n {user.unread_private_threads > 0 && (\n {user.unread_private_threads}\n )}\n \n
  • \n )\n}\n\nexport function selectUserMenu(state) {\n return {\n user: state.auth.user,\n }\n}\n\nexport class CompactUserNav extends React.Component {\n showUserMenu() {\n dropdown.showConnected(\"user-menu\", connect(selectUserMenu)(UserMenu))\n }\n\n render() {\n return (\n \n )\n }\n}\n","import React from \"react\"\nimport { GuestNav, CompactGuestNav } from \"./guest-nav\"\nimport { UserNav, CompactUserNav } from \"./user-nav\"\n\nexport class UserMenu extends React.Component {\n render() {\n if (this.props.isAuthenticated) {\n return \n } else {\n return \n }\n }\n}\n\nexport class CompactUserMenu extends React.Component {\n render() {\n if (this.props.isAuthenticated) {\n return \n } else {\n return \n }\n }\n}\n\nexport function select(state) {\n return state.auth\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport {\n UserMenu,\n CompactUserMenu,\n select,\n} from \"misago/components/user-menu/root\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n mount(connect(select)(UserMenu), \"user-menu-mount\")\n mount(connect(select)(CompactUserMenu), \"user-menu-compact-mount\")\n}\n\nmisago.addInitializer({\n name: \"component:user-menu\",\n initializer: initializer,\n after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst UsersNav = ({ baseUrl, page, pages }) => (\n
    \n
    \n \n menu\n {page.name}\n \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n
      \n {pages.map((page) => {\n const url = getPageUrl(baseUrl, page)\n return (\n
    • \n {page.name}\n
    • \n )\n })}\n
    \n
    \n)\n\nconst getPageUrl = (baseUrl, page) => {\n let url = baseUrl\n if (page.component === \"rank\") {\n url += page.slug\n } else {\n url += page.component\n }\n return url + \"/\"\n}\n\nexport default UsersNav\n","import React from \"react\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getEmptyMessage() {\n return interpolate(\n gettext(\n \"No users have posted any new messages during last %(days)s days.\"\n ),\n { days: this.props.trackedPeriod },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getEmptyMessage()}

    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n getClassName() {\n if (this.props.hiddenOnMobile) {\n return \"list-group-item hidden-xs hidden-sm\"\n } else {\n return \"list-group-item\"\n }\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n
    \n \n \n  \n \n \n
    \n\n
    \n \n  \n \n  \n \n \n \n \n  \n \n \n \n \n  \n \n \n
    \n
    \n \n \n \n  \n \n \n {gettext(\"Rank\")}\n \n \n \n \n  \n \n \n {gettext(\"Ranked posts\")}\n \n
    \n
    \n\n
    \n \n \n  \n \n \n {gettext(\"Rank\")}\n
    \n\n
    \n \n \n  \n \n \n {gettext(\"Ranked posts\")}\n
    \n\n
    \n \n \n  \n \n \n {gettext(\"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ItemPreview from \"misago/components/users/active-posters/list-item-preview\"\nimport * as random from \"misago/utils/random\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render() {\n return (\n
    \n \n \n

    \n \n  \n \n

    \n\n
    \n
      \n {[0, 1, 2].map((i) => {\n return 0} key={i} />\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Avatar from \"misago/components/avatar\"\nimport Status, { StatusIcon, StatusLabel } from \"misago/components/user-status\"\nimport misago from \"misago/index\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.rank.css_class) {\n return \"list-group-item list-group-rank-\" + this.props.rank.css_class\n } else {\n return \"list-group-item\"\n }\n }\n\n getUserStatus() {\n if (this.props.user.status) {\n return (\n \n \n \n \n )\n }\n\n return (\n \n  \n \n  \n \n \n )\n }\n\n getRankName() {\n if (!this.props.rank.is_tab) {\n return (\n {this.props.rank.name}\n )\n }\n\n let rankUrl = misago.get(\"USERS_LIST_URL\") + this.props.rank.slug + \"/\"\n return (\n \n {this.props.rank.name}\n \n )\n }\n\n getUserTitle() {\n if (!this.props.user.title) return null\n\n return (\n \n {this.props.user.title}\n \n )\n }\n\n render() {\n return (\n
  • \n
    \n \n \n \n
    \n\n
    \n \n
    \n {this.getUserStatus()}\n {this.getRankName()}\n {this.getUserTitle()}\n
    \n
    \n \n #{this.props.counter}\n {gettext(\"Rank\")}\n \n\n \n {this.props.user.meta.score}\n {gettext(\"Ranked posts\")}\n \n
    \n
    \n\n
    \n #{this.props.counter}\n {gettext(\"Rank\")}\n
    \n\n
    \n {this.props.user.meta.score}\n {gettext(\"Ranked posts\")}\n
    \n\n
    \n {this.props.user.posts}\n {gettext(\"Total posts\")}\n
    \n
  • \n )\n }\n}\n","import React from \"react\"\nimport ListItem from \"misago/components/users/active-posters/list-item\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n getLeadMessage() {\n let message = ngettext(\n \"%(posters)s top poster from last %(days)s days.\",\n \"%(posters)s top posters from last %(days)s days.\",\n this.props.count\n )\n\n return interpolate(\n message,\n {\n posters: this.props.count,\n days: this.props.trackedPeriod,\n },\n true\n )\n }\n\n render() {\n return (\n
    \n \n \n

    {this.getLeadMessage()}

    \n\n
    \n
      \n {this.props.users.map((user, i) => {\n return (\n \n )\n })}\n
    \n
    \n
    \n
    \n )\n }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/users/active-posters/list-empty\"\nimport ListPreview from \"misago/components/users/active-posters/list-preview\"\nimport ListReady from \"misago/components/users/active-posters/list-ready\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling()\n }\n\n initWithPreloadedData(data) {\n this.state = {\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n }\n\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling() {\n polls.start({\n poll: \"active-posters\",\n url: misago.get(\"USERS_API\"),\n data: {\n list: \"active\",\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n this.setState({\n isLoaded: true,\n\n trackedPeriod: data.tracked_period,\n count: data.count,\n })\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.extra.name,\n parent: gettext(\"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"active-posters\")\n }\n\n render() {\n const page = { name: this.props.route.extra.name }\n\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return (\n \n )\n } else {\n return (\n \n )\n }\n } else {\n return \n }\n }\n}\n","import React from \"react\"\nimport stringCount from \"misago/utils/string-count\"\n\nexport default class extends React.Component {\n getClassName() {\n if (this.props.copy && this.props.copy.length) {\n if (\n stringCount(this.props.copy, \"\n )\n } else {\n return null\n }\n }\n}\n","export default function (string, subString) {\n string = (string + \"\").toLowerCase()\n subString = (subString + \"\").toLowerCase()\n\n if (subString.length <= 0) return 0\n\n let n = 0\n let pos = 0\n let step = subString.length\n\n while (true) {\n pos = string.indexOf(subString, pos)\n if (pos >= 0) {\n n += 1\n pos += step\n } else {\n break\n }\n }\n\n return n\n}\n","import React from \"react\"\nimport UsersList from \"../../users-list\"\n\nconst RankUsersList = ({ users }) => (\n \n)\n\nexport default RankUsersList\n","import React from \"react\"\nimport UsersList from \"misago/components/users-list\"\n\nclass RankUsersListLoader extends React.Component {\n shouldComponentUpdate() {\n return false\n }\n\n render = () => \n}\n\nexport default RankUsersListLoader\n","import React from \"react\"\n\nconst RankUsersLeft = ({ users }) => {\n if (users.more) {\n return (\n

    \n {interpolate(\n ngettext(\n \"There is %(more)s more member with this role.\",\n \"There are %(more)s more members with this role.\",\n users.more\n ),\n { more: users.more },\n true\n )}\n

    \n )\n }\n\n return

    {gettext(\"There are no more members with this role.\")}

    \n}\n\nexport default RankUsersLeft\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst RankUsersPagination = ({ baseUrl, users }) => (\n
    \n {users.isLoaded && users.first ? (\n \n first_page\n \n ) : (\n \n first_page\n \n )}\n {users.isLoaded && users.previous ? (\n 1 ? users.previous + \"/\" : \"\")}\n title={gettext(\"Go to previous page\")}\n >\n chevron_left\n \n ) : (\n \n chevron_left\n \n )}\n {users.isLoaded && users.next ? (\n \n chevron_right\n \n ) : (\n \n chevron_right\n \n )}\n {users.isLoaded && users.last ? (\n \n last_page\n \n ) : (\n \n last_page\n \n )}\n
    \n)\n\nexport default RankUsersPagination\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\nimport RankUsersLeft from \"./RankUsersLeft\"\nimport RankUsersPagination from \"./RankUsersPagination\"\n\nconst RankUsersToolbar = ({ baseUrl, users }) => (\n \n \n \n \n \n \n \n \n \n \n \n \n)\n\nexport default RankUsersToolbar\n","import React from \"react\"\nimport PageLead from \"misago/components/page-lead\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport PageContainer from \"../../PageContainer\"\nimport RankUsersList from \"./RankUsersList\"\nimport RankUsersListLoader from \"./RankUsersListLoader\"\nimport RankUsersToolbar from \"./RankUsersToolbar\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n constructor(props) {\n super(props)\n\n if (misago.has(\"USERS\")) {\n this.initWithPreloadedData(misago.pop(\"USERS\"))\n } else {\n this.initWithoutPreloadedData()\n }\n\n this.startPolling(props.params.page || 1)\n }\n\n initWithPreloadedData(data) {\n this.state = Object.assign(data, {\n isLoaded: true,\n })\n store.dispatch(hydrate(data.results))\n }\n\n initWithoutPreloadedData() {\n this.state = {\n isLoaded: false,\n }\n }\n\n startPolling(page) {\n polls.start({\n poll: \"rank-users\",\n url: misago.get(\"USERS_API\"),\n data: {\n rank: this.props.route.rank.id,\n page: page,\n },\n frequency: 90 * 1000,\n update: this.update,\n })\n }\n\n update = (data) => {\n store.dispatch(hydrate(data.results))\n\n data.isLoaded = true\n this.setState(data)\n }\n\n componentDidMount() {\n title.set({\n title: this.props.route.rank.name,\n page: this.props.params.page || null,\n parent: gettext(\"Users\"),\n })\n }\n\n componentWillUnmount() {\n polls.stop(\"rank-users\")\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.params.page !== nextProps.params.page) {\n title.set({\n title: this.props.route.rank.name,\n page: nextProps.params.page || null,\n parent: gettext(\"Users\"),\n })\n\n this.setState({\n isLoaded: false,\n })\n\n polls.stop(\"rank-users\")\n this.startPolling(nextProps.params.page)\n }\n }\n\n getClassName() {\n if (this.props.route.rank.css_class) {\n return \"rank-users-list rank-users-\" + this.props.route.rank.css_class\n } else {\n return \"rank-users-list\"\n }\n }\n\n getRankDescription() {\n if (this.props.route.rank.description) {\n return (\n
    \n \n
    \n )\n } else {\n return null\n }\n }\n\n getComponent() {\n if (this.state.isLoaded) {\n if (this.state.count > 0) {\n return \n } else {\n return (\n

    \n {gettext(\"There are no users with this rank at the moment.\")}\n

    \n )\n }\n } else {\n return \n }\n }\n\n render() {\n return (\n
    \n \n \n {this.getRankDescription()}\n {this.getComponent()}\n \n \n
    \n )\n }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport ActivePosters from \"misago/components/users/active-posters/root\"\nimport Rank from \"misago/components/users/rank/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport {\n PageHeader,\n PageHeaderBanner,\n PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n render() {\n return (\n
    \n \n \n \n

    {gettext(\"Users\")}

    \n
    \n
    \n
    \n {this.props.children}\n
    \n )\n }\n}\n\nexport function select(store) {\n return {\n tick: store.tick.tick,\n user: store.auth.user,\n users: store.users,\n }\n}\n\nexport function paths() {\n let paths = []\n\n misago.get(\"USERS_LISTS\").forEach(function (item) {\n if (item.component === \"rank\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/:page/\",\n component: connect(select)(Rank),\n rank: item,\n })\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/\",\n component: connect(select)(Rank),\n rank: item,\n })\n } else if (item.component === \"active-posters\") {\n paths.push({\n path: misago.get(\"USERS_LIST_URL\") + item.component + \"/\",\n component: connect(select)(ActivePosters),\n extra: {\n name: item.name,\n },\n })\n }\n })\n\n return paths\n}\n","import Users, { paths } from \"misago/components/users/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n if (context.has(\"USERS_LISTS\")) {\n mount({\n root: misago.get(\"USERS_LIST_URL\"),\n component: Users,\n paths: paths(),\n })\n }\n}\n\nmisago.addInitializer({\n name: \"component:users\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\n\nexport default function initializer(context) {\n include.init(context.get(\"STATIC_URL\"))\n}\n\nmisago.addInitializer({\n name: \"include\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n storage.init(\"misago_\")\n}\n\nmisago.addInitializer({\n name: \"local-storage\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\n\nexport default function initializer() {\n let element = document.getElementById(\"mobile-navbar-dropdown-mount\")\n if (element) {\n dropdown.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"dropdown\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport modal from \"misago/services/modal\"\n\nexport default function initializer() {\n let element = document.getElementById(\"modal-mount\")\n if (element) {\n modal.init(element)\n }\n}\n\nmisago.addInitializer({\n name: \"modal\",\n initializer: initializer,\n before: \"store\",\n})\n","import moment from \"moment\"\nimport misago from \"misago/index\"\n\nexport default function initializer() {\n moment.locale($(\"html\").attr(\"lang\"))\n}\n\nmisago.addInitializer({\n name: \"moment\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\n\nexport default function initializer(context) {\n title.init(\n context.get(\"SETTINGS\").forum_index_title,\n context.get(\"SETTINGS\").forum_name\n )\n}\n\nmisago.addInitializer({\n name: \"page-title\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport polls from \"misago/services/polls\"\n\nexport default function initializer() {\n polls.init(ajax, snackbar)\n}\n\nmisago.addInitializer({\n name: \"polls\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer() {\n posting.init(ajax, snackbar, document.getElementById(\"posting-mount\"))\n}\n\nmisago.addInitializer({\n name: \"posting\",\n initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/auth\"\nimport store from \"misago/services/store\"\n\nexport default function initializer(context) {\n store.addReducer(\n \"auth\",\n reducer,\n Object.assign(\n {\n isAuthenticated: context.get(\"isAuthenticated\"),\n isAnonymous: !context.get(\"isAuthenticated\"),\n\n user: context.get(\"user\"),\n },\n initialState\n )\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:auth\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/participants\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = misago.get(\"THREAD\").participants\n }\n\n store.addReducer(\"participants\", reducer, initialState || [])\n}\n\nmisago.addInitializer({\n name: \"reducer:participants\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/poll\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\") && misago.get(\"THREAD\").poll) {\n initialState = hydrate(misago.get(\"THREAD\").poll)\n } else {\n initialState = {}\n }\n\n store.addReducer(\"poll\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:poll\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"POSTS\")) {\n initialState = hydrate(misago.get(\"POSTS\"))\n } else {\n initialState = {\n isLoaded: false,\n isBusy: false,\n }\n }\n\n store.addReducer(\"posts\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:posts\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile-details\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"PROFILE_DETAILS\")) {\n initialState = misago.get(\"PROFILE_DETAILS\")\n }\n\n store.addReducer(\"profile-details\", reducer, initialState || {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-details\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n if (misago.has(\"PROFILE\")) {\n store.dispatch(hydrate(misago.get(\"PROFILE\")))\n }\n}\n\nmisago.addInitializer({\n name: \"reducer:profile-hydrate\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"profile\", reducer, {})\n}\n\nmisago.addInitializer({\n name: \"reducer:profile\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago\"\nimport reducer, { initialState } from \"misago/reducers/search\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\n \"search\",\n reducer,\n Object.assign({}, initialState, {\n providers: misago.get(\"SEARCH_PROVIDERS\") || [],\n query: misago.get(\"SEARCH_QUERY\") || \"\",\n })\n )\n}\n\nmisago.addInitializer({\n name: \"reducer:search\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/selection\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"selection\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:selection\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"snackbar\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:snackbar\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/thread\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n let initialState = null\n if (misago.has(\"THREAD\")) {\n initialState = hydrate(misago.get(\"THREAD\"))\n } else {\n initialState = {\n isBusy: false,\n }\n }\n\n store.addReducer(\"thread\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:thread\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/threads\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"threads\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:threads\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"tick\", reducer, initialState)\n}\n\nmisago.addInitializer({\n name: \"reducer:tick\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/username-history\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"username-history\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:username-history\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/users\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.addReducer(\"users\", reducer, [])\n}\n\nmisago.addInitializer({\n name: \"reducer:users\",\n initializer: initializer,\n before: \"store\",\n})\n","import misago from \"misago/index\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n snackbar.init(store)\n}\n\nmisago.addInitializer({\n name: \"snackbar\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n store.init()\n}\n\nmisago.addInitializer({\n name: \"store\",\n initializer: initializer,\n before: \"_end\",\n})\n","import misago from \"misago/index\"\nimport { doTick } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nconst TICK_PERIOD = 50 * 1000 //do the tick every 50s\n\nexport default function initializer() {\n window.setInterval(function () {\n store.dispatch(doTick())\n }, TICK_PERIOD)\n}\n\nmisago.addInitializer({\n name: \"tick-start\",\n initializer: initializer,\n after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport default function initializer() {\n zxcvbn.init(include)\n}\n\nmisago.addInitializer({\n name: \"zxcvbn\",\n initializer: initializer,\n})\n","import { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\n\nexport var initialState = {\n signedIn: false,\n signedOut: false,\n}\n\nexport const PATCH_USER = \"PATCH_USER\"\nexport const SIGN_IN = \"SIGN_IN\"\nexport const SIGN_OUT = \"SIGN_OUT\"\n\nexport function patch(patch) {\n return {\n type: PATCH_USER,\n patch,\n }\n}\n\nexport function signIn(user) {\n return {\n type: SIGN_IN,\n user,\n }\n}\n\nexport function signOut(soft = false) {\n return {\n type: SIGN_OUT,\n soft,\n }\n}\n\nexport default function auth(state = initialState, action = null) {\n switch (action.type) {\n case PATCH_USER:\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, action.patch)\n return newState\n\n case SIGN_IN:\n return Object.assign({}, state, {\n signedIn: action.user,\n })\n\n case SIGN_OUT:\n return Object.assign({}, state, {\n isAuthenticated: false,\n isAnonymous: true,\n signedOut: !action.soft,\n })\n\n case UPDATE_AVATAR:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n avatars: action.avatars,\n })\n return newState\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.isAuthenticated && state.user.id === action.userId) {\n let newState = Object.assign({}, state)\n newState.user = Object.assign({}, state.user, {\n username: action.username,\n slug: action.slug,\n })\n return newState\n }\n return state\n\n default:\n return state\n }\n}\n","export const REPLACE_PARTICIPANTS = \"REPLACE_PARTICIPANTS\"\n\nexport function replace(newState) {\n return {\n type: REPLACE_PARTICIPANTS,\n state: newState,\n }\n}\n\nexport default function participants(state = [], action = null) {\n switch (action.type) {\n case REPLACE_PARTICIPANTS:\n return action.state\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\n\nexport const BUSY_POLL = \"BUSY_POLL\"\nexport const RELEASE_POLL = \"RELEASE_POLL\"\nexport const REMOVE_POLL = \"REMOVE_POLL\"\nexport const REPLACE_POLL = \"REPLACE_POLL\"\nexport const UPDATE_POLL = \"UPDATE_POLL\"\n\nexport function hydrate(json) {\n let hasSelectedChoices = false\n for (const i in json.choices) {\n const choice = json.choices[i]\n if (choice.selected) {\n hasSelectedChoices = true\n break\n }\n }\n\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n\n hasSelectedChoices,\n endsOn: json.length\n ? moment(json.posted_on).add(json.length, \"days\")\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_POLL,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_POLL,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_POLL,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_POLL,\n data,\n }\n}\n\nexport function remove() {\n return {\n type: REMOVE_POLL,\n }\n}\n\nexport default function poll(state = {}, action = null) {\n switch (action.type) {\n case BUSY_POLL:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_POLL:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return {\n isBusy: false,\n }\n\n case REPLACE_POLL:\n return action.state\n\n case UPDATE_POLL:\n return Object.assign({}, state, action.data)\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport { hydrateUser } from \"./users\"\n\nexport const PATCH_POST = \"PATCH_POST\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n posted_on: moment(json.posted_on),\n updated_on: moment(json.updated_on),\n hidden_on: moment(json.hidden_on),\n\n attachments: json.attachments\n ? json.attachments.map(hydrateAttachment)\n : null,\n poster: json.poster ? hydrateUser(json.poster) : null,\n\n isSelected: false,\n isBusy: false,\n isDeleted: false,\n })\n}\n\nexport function hydrateAttachment(json) {\n return Object.assign({}, json, {\n uploaded_on: moment(json.uploaded_on),\n })\n}\n\nexport function patch(post, patch) {\n return {\n type: PATCH_POST,\n post,\n patch,\n }\n}\n\nexport default function post(state = {}, action = null) {\n switch (action.type) {\n case PATCH_POST:\n if (state.id == action.post.id) {\n return Object.assign({}, state, action.patch)\n }\n return state\n\n default:\n return state\n }\n}\n","import postReducer, {\n PATCH_POST,\n hydrate as hydratePost,\n} from \"misago/reducers/post\"\n\nexport const APPEND_POSTS = \"APPEND_POSTS\"\nexport const SELECT_POST = \"SELECT_POST\"\nexport const DESELECT_POST = \"DESELECT_POST\"\nexport const DESELECT_POSTS = \"DESELECT_POSTS\"\nexport const LOAD_POSTS = \"LOAD_POSTS\"\nexport const UNLOAD_POSTS = \"UNLOAD_POSTS\"\nexport const UPDATE_POSTS = \"UPDATE_POSTS\"\n\nexport function select(post) {\n return {\n type: SELECT_POST,\n post,\n }\n}\n\nexport function deselect(post) {\n return {\n type: DESELECT_POST,\n post,\n }\n}\n\nexport function deselectAll() {\n return {\n type: DESELECT_POSTS,\n }\n}\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n results: json.results.map(hydratePost),\n isLoaded: true,\n isBusy: false,\n isSelected: false,\n })\n}\n\nexport function load(newState, hydrated = false) {\n return {\n type: LOAD_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function append(newState, hydrated = false) {\n return {\n type: APPEND_POSTS,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function unload() {\n return {\n type: UNLOAD_POSTS,\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_POSTS,\n update: newState,\n }\n}\n\nexport default function posts(state = {}, action = null) {\n switch (action.type) {\n case SELECT_POST:\n const selectedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: true,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: selectedPosts,\n })\n\n case DESELECT_POST:\n const deseletedPosts = state.results.map((post) => {\n if (post.id == action.post.id) {\n return Object.assign({}, post, {\n isSelected: false,\n })\n } else {\n return post\n }\n })\n\n return Object.assign({}, state, {\n results: deseletedPosts,\n })\n\n case DESELECT_POSTS:\n const deseletedAllPosts = state.results.map((post) => {\n return Object.assign({}, post, {\n isSelected: false,\n })\n })\n\n return Object.assign({}, state, {\n results: deseletedAllPosts,\n })\n\n case APPEND_POSTS:\n let results = state.results.slice()\n const resultsIds = state.results.map((post) => {\n return post.id\n })\n\n action.state.results.map((post) => {\n if (resultsIds.indexOf(post.id) === -1) {\n results.push(post)\n }\n })\n\n return Object.assign({}, action.state, {\n results,\n })\n\n case LOAD_POSTS:\n return action.state\n\n case UNLOAD_POSTS:\n return Object.assign({}, state, {\n isLoaded: false,\n })\n\n case UPDATE_POSTS:\n return Object.assign({}, state, action.update)\n\n case PATCH_POST:\n const reducedPosts = state.results.map((post) => {\n return postReducer(post, action)\n })\n\n return Object.assign({}, state, {\n results: reducedPosts,\n })\n\n default:\n return state\n }\n}\n","export const LOAD_DETAILS = \"LOAD_DETAILS\"\n\nexport function load(newState) {\n return {\n type: LOAD_DETAILS,\n\n newState,\n }\n}\n\nexport default function details(state = {}, action = null) {\n switch (action.type) {\n case LOAD_DETAILS:\n return action.newState\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport {\n UPDATE_AVATAR,\n UPDATE_USERNAME,\n hydrateStatus,\n} from \"misago/reducers/users\"\n\nexport const HYDRATE_PROFILE = \"HYDRATE_PROFILE\"\nexport const PATCH_PROFILE = \"PATCH_PROFILE\"\n\nexport function hydrate(profile) {\n return {\n type: HYDRATE_PROFILE,\n profile,\n }\n}\n\nexport function patch(patch) {\n return {\n type: PATCH_PROFILE,\n patch,\n }\n}\n\nexport default function auth(state = {}, action = null) {\n switch (action.type) {\n case HYDRATE_PROFILE:\n return Object.assign({}, action.profile, {\n joined_on: moment(action.profile.joined_on),\n status: hydrateStatus(action.profile.status),\n })\n\n case PATCH_PROFILE:\n return Object.assign({}, state, action.patch)\n\n case UPDATE_AVATAR:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n avatars: action.avatars,\n })\n }\n return state\n\n case UPDATE_USERNAME:\n if (state.id === action.userId) {\n return Object.assign({}, state, {\n username: action.username,\n slug: action.slug,\n })\n }\n return state\n\n default:\n return state\n }\n}\n","export const REPLACE_SEARCH = \"REPLACE_SEARCH\"\nexport const UPDATE_SEARCH = \"UPDATE_SEARCH\"\nexport const UPDATE_SEARCH_PROVIDER = \"UPDATE_SEARCH_PROVIDER\"\n\nexport const initialState = {\n isLoading: false,\n query: \"\",\n providers: [],\n}\n\nexport function replace(newState) {\n return {\n type: REPLACE_SEARCH,\n state: {\n isLoading: false,\n providers: newState,\n },\n }\n}\n\nexport function update(newState) {\n return {\n type: UPDATE_SEARCH,\n update: newState,\n }\n}\n\nexport function updateProvider(provider) {\n return {\n type: UPDATE_SEARCH_PROVIDER,\n provider: provider,\n }\n}\n\nexport default function participants(state = {}, action = null) {\n switch (action.type) {\n case REPLACE_SEARCH:\n return action.state\n\n case UPDATE_SEARCH:\n return Object.assign({}, state, action.update)\n\n case UPDATE_SEARCH_PROVIDER:\n return Object.assign({}, state, {\n providers: state.providers.map((provider) => {\n if (provider.id === action.provider.id) {\n return action.provider\n } else {\n return provider\n }\n }),\n })\n\n default:\n return state\n }\n}\n","import { toggle } from \"misago/utils/sets\"\n\nexport const SELECT_ALL = \"SELECT_ALL\"\nexport const SELECT_NONE = \"SELECT_NONE\"\nexport const SELECT_ITEM = \"SELECT_ITEM\"\n\nexport function all(itemsIds) {\n return {\n type: SELECT_ALL,\n items: itemsIds,\n }\n}\n\nexport function none() {\n return {\n type: SELECT_NONE,\n }\n}\n\nexport function item(itemId) {\n return {\n type: SELECT_ITEM,\n item: itemId,\n }\n}\n\nexport default function selection(state = [], action = null) {\n switch (action.type) {\n case SELECT_ALL:\n return action.items\n\n case SELECT_NONE:\n return []\n\n case SELECT_ITEM:\n return toggle(state, action.item)\n\n default:\n return state\n }\n}\n","export var initialState = {\n type: \"info\",\n message: \"\",\n isVisible: false,\n}\n\nexport const SHOW_SNACKBAR = \"SHOW_SNACKBAR\"\nexport const HIDE_SNACKBAR = \"HIDE_SNACKBAR\"\n\nexport function showSnackbar(message, type) {\n return {\n type: SHOW_SNACKBAR,\n message,\n messageType: type,\n }\n}\n\nexport function hideSnackbar() {\n return {\n type: HIDE_SNACKBAR,\n }\n}\n\nexport default function snackbar(state = initialState, action = null) {\n if (action.type === SHOW_SNACKBAR) {\n return {\n type: action.messageType,\n message: action.message,\n isVisible: true,\n }\n } else if (action.type === HIDE_SNACKBAR) {\n return Object.assign({}, state, {\n isVisible: false,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { REMOVE_POLL, REPLACE_POLL } from \"./poll\"\n\nexport const BUSY_THREAD = \"BUSY_THREAD\"\nexport const RELEASE_THREAD = \"RELEASE_THREAD\"\nexport const REPLACE_THREAD = \"REPLACE_THREAD\"\nexport const UPDATE_THREAD = \"UPDATE_THREAD\"\nexport const UPDATE_THREAD_ACL = \"UPDATE_THREAD_ACL\"\n\nexport function hydrate(json) {\n return Object.assign({}, json, {\n started_on: moment(json.started_on),\n last_post_on: moment(json.last_post_on),\n best_answer_marked_on: json.best_answer_marked_on\n ? moment(json.best_answer_marked_on)\n : null,\n\n isBusy: false,\n })\n}\n\nexport function busy() {\n return {\n type: BUSY_THREAD,\n }\n}\n\nexport function release() {\n return {\n type: RELEASE_THREAD,\n }\n}\n\nexport function replace(newState, hydrated = false) {\n return {\n type: REPLACE_THREAD,\n state: hydrated ? newState : hydrate(newState),\n }\n}\n\nexport function update(data) {\n return {\n type: UPDATE_THREAD,\n data,\n }\n}\n\nexport function updateAcl(data) {\n return {\n type: UPDATE_THREAD_ACL,\n data,\n }\n}\n\nexport default function thread(state = {}, action = null) {\n switch (action.type) {\n case BUSY_THREAD:\n return Object.assign({}, state, { isBusy: true })\n\n case RELEASE_THREAD:\n return Object.assign({}, state, { isBusy: false })\n\n case REMOVE_POLL:\n return Object.assign({}, state, { poll: null })\n\n case REPLACE_POLL:\n return Object.assign({}, state, { poll: action.state })\n\n case REPLACE_THREAD:\n return action.state\n\n case UPDATE_THREAD:\n return Object.assign({}, state, action.data)\n\n case UPDATE_THREAD_ACL:\n const acl = Object.assign({}, state.acl, action.data)\n return Object.assign({}, state, { acl })\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_THREADS = \"APPEND_THREADS\"\nexport const DELETE_THREAD = \"DELETE_THREAD\"\nexport const FILTER_THREADS = \"FILTER_THREADS\"\nexport const HYDRATE_THREADS = \"HYDRATE_THREADS\"\nexport const PATCH_THREAD = \"PATCH_THREAD\"\nexport const SORT_THREADS = \"SORT_THREADS\"\n\nexport const MODERATION_PERMISSIONS = [\n \"can_announce\",\n \"can_approve\",\n \"can_close\",\n \"can_hide\",\n \"can_move\",\n \"can_merge\",\n \"can_pin\",\n \"can_review\",\n]\n\nexport function append(items, sorting) {\n return {\n type: APPEND_THREADS,\n items,\n sorting,\n }\n}\n\nexport function deleteThread(thread) {\n return {\n type: DELETE_THREAD,\n thread,\n }\n}\n\nexport function filterThreads(category, categoriesMap) {\n return {\n type: FILTER_THREADS,\n category,\n categoriesMap,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_THREADS,\n items,\n }\n}\n\nexport function patch(thread, patch, sorting = null) {\n return {\n type: PATCH_THREAD,\n thread,\n patch,\n sorting,\n }\n}\n\nexport function sort(sorting) {\n return {\n type: SORT_THREADS,\n sorting,\n }\n}\n\nexport function getThreadModerationOptions(thread_acl) {\n let options = []\n MODERATION_PERMISSIONS.forEach(function (perm) {\n if (thread_acl[perm]) {\n options.push(perm)\n }\n })\n return options\n}\n\nexport function hydrateThread(thread) {\n return Object.assign({}, thread, {\n started_on: moment(thread.started_on),\n last_post_on: moment(thread.last_post_on),\n moderation: getThreadModerationOptions(thread.acl),\n })\n}\n\nexport default function thread(state = [], action = null) {\n switch (action.type) {\n case APPEND_THREADS:\n const mergedState = concatUnique(action.items.map(hydrateThread), state)\n return mergedState.sort(action.sorting)\n\n case DELETE_THREAD:\n return state.filter(function (item) {\n return item.id !== action.thread.id\n })\n\n case FILTER_THREADS:\n return state.filter(function (item) {\n const itemCategory = action.categoriesMap[item.category]\n if (\n itemCategory.lft >= action.category.lft &&\n itemCategory.rght <= action.category.rght\n ) {\n // same or sub category\n return true\n } else if (item.weight == 2) {\n // globally pinned\n return true\n } else {\n // thread moved outside displayed scope, hide it\n return false\n }\n })\n\n case HYDRATE_THREADS:\n return action.items.map(hydrateThread)\n\n case PATCH_THREAD:\n const patchedState = state.map(function (item) {\n if (item.id === action.thread.id) {\n return Object.assign({}, item, action.patch)\n } else {\n return item\n }\n })\n\n if (action.sorting) {\n return patchedState.sort(action.sorting)\n }\n return patchedState\n\n case SORT_THREADS:\n return state.sort(action.sorting)\n\n default:\n return state\n }\n}\n","export var initialState = {\n tick: 0,\n}\n\nexport const TICK = \"TICK\"\n\nexport function doTick() {\n return {\n type: TICK,\n }\n}\n\nexport default function tick(state = initialState, action = null) {\n if (action.type === TICK) {\n return Object.assign({}, state, {\n tick: state.tick + 1,\n })\n } else {\n return state\n }\n}\n","import moment from \"moment\"\nimport { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const ADD_NAME_CHANGE = \"ADD_NAME_CHANGE\"\nexport const APPEND_HISTORY = \"APPEND_HISTORY\"\nexport const HYDRATE_HISTORY = \"HYDRATE_HISTORY\"\n\nexport function addNameChange(change, user, changedBy) {\n return {\n type: ADD_NAME_CHANGE,\n change,\n user,\n changedBy,\n }\n}\n\nexport function append(items) {\n return {\n type: APPEND_HISTORY,\n items: items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_HISTORY,\n items: items,\n }\n}\n\nexport function hydrateNamechange(namechange) {\n return Object.assign({}, namechange, {\n changed_on: moment(namechange.changed_on),\n })\n}\n\nexport default function username(state = [], action = null) {\n switch (action.type) {\n case ADD_NAME_CHANGE:\n let newState = state.slice()\n newState.unshift({\n id: Math.floor(Date.now() / 1000), // just small hax for getting id\n changed_by: action.changedBy,\n changed_by_username: action.changedBy.username,\n changed_on: moment(),\n new_username: action.change.username,\n old_username: action.user.username,\n })\n return newState\n\n case APPEND_HISTORY:\n return concatUnique(state, action.items.map(hydrateNamechange))\n\n case HYDRATE_HISTORY:\n return action.items.map(hydrateNamechange)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n avatars: action.avatars,\n })\n }\n\n return item\n })\n\n case UPDATE_USERNAME:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.changed_by && item.changed_by.id === action.userId) {\n item.changed_by = Object.assign({}, item.changed_by, {\n username: action.username,\n slug: action.slug,\n })\n }\n\n return Object.assign({}, item)\n })\n\n default:\n return state\n }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_USERS = \"APPEND_USERS\"\nexport const HYDRATE_USERS = \"HYDRATE_USERS\"\nexport const UPDATE_AVATAR = \"UPDATE_AVATAR\"\nexport const UPDATE_USERNAME = \"UPDATE_USERNAME\"\n\nexport function append(items) {\n return {\n type: APPEND_USERS,\n items,\n }\n}\n\nexport function hydrate(items) {\n return {\n type: HYDRATE_USERS,\n items,\n }\n}\n\nexport function hydrateStatus(status) {\n if (status) {\n return Object.assign({}, status, {\n last_click: status.last_click ? moment(status.last_click) : null,\n banned_until: status.banned_until ? moment(status.banned_until) : null,\n })\n } else {\n return null\n }\n}\n\nexport function hydrateUser(user) {\n return Object.assign({}, user, {\n joined_on: moment(user.joined_on),\n status: hydrateStatus(user.status),\n })\n}\n\nexport function updateAvatar(user, avatars) {\n return {\n type: UPDATE_AVATAR,\n userId: user.id,\n avatars,\n }\n}\n\nexport function updateUsername(user, username, slug) {\n return {\n type: UPDATE_USERNAME,\n userId: user.id,\n username,\n slug,\n }\n}\n\nexport default function user(state = [], action = null) {\n switch (action.type) {\n case APPEND_USERS:\n return concatUnique(state, action.items.map(hydrateUser))\n\n case HYDRATE_USERS:\n return action.items.map(hydrateUser)\n\n case UPDATE_AVATAR:\n return state.map(function (item) {\n item = Object.assign({}, item)\n if (item.id === action.userId) {\n item.avatars = action.avatars\n }\n\n return item\n })\n\n default:\n return state\n }\n}\n","export class Ajax {\n constructor() {\n this._cookieName = null\n this._csrfToken = null\n this._locks = {}\n }\n\n init(cookieName) {\n this._cookieName = cookieName\n }\n\n getCsrfToken() {\n if (document.cookie.indexOf(this._cookieName) !== -1) {\n let cookieRegex = new RegExp(this._cookieName + \"=([^;]*)\")\n let cookie = document.cookie.match(cookieRegex)[0]\n return cookie ? cookie.split(\"=\")[1] : null\n } else {\n return null\n }\n }\n\n request(method, url, data) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: method,\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data ? JSON.stringify(data) : null,\n contentType: \"application/json; charset=utf-8\",\n dataType: \"json\",\n\n success: function (data) {\n resolve(data)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = gettext(\"Lost connection with application.\")\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = gettext(\"Action link is invalid.\")\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = gettext(\"Unknown error has occured.\")\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n\n get(url, params, lock) {\n if (params) {\n url += \"?\" + $.param(params)\n }\n\n if (lock) {\n let self = this\n\n // update url in existing lock?\n if (this._locks[lock]) {\n this._locks[lock].url = url\n }\n\n // immediately dereference promise handlers without doing anything\n // we are already waiting for existing response to resolve\n if (this._locks[lock] && this._locks[lock].waiter) {\n return {\n then: function () {\n return\n },\n }\n\n // return promise that will begin when original one resolves\n } else if (this._locks[lock] && this._locks[lock].wait) {\n this._locks[lock].waiter = true\n\n return new Promise(function (resolve, reject) {\n let wait = function (url) {\n // keep waiting on promise\n if (self._locks[lock].wait) {\n window.setTimeout(function () {\n wait(url)\n }, 300)\n\n // poll for new url\n } else if (self._locks[lock].url !== url) {\n wait(self._locks[lock].url)\n\n // ajax backend for response\n } else {\n self._locks[lock].waiter = false\n self.request(\"GET\", self._locks[lock].url).then(\n function (data) {\n if (self._locks[lock].url === url) {\n resolve(data)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n },\n function (rejection) {\n if (self._locks[lock].url === url) {\n reject(rejection)\n } else {\n self._locks[lock].waiter = true\n wait(self._locks[lock].url)\n }\n }\n )\n }\n }\n\n window.setTimeout(function () {\n wait(url)\n }, 300)\n })\n\n // setup new lock without waiter\n } else {\n this._locks[lock] = {\n url,\n wait: true,\n waiter: false,\n }\n\n return new Promise(function (resolve, reject) {\n self.request(\"GET\", url).then(\n function (data) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n resolve(data)\n }\n },\n function (rejection) {\n self._locks[lock].wait = false\n if (self._locks[lock].url === url) {\n reject(rejection)\n }\n }\n )\n })\n }\n } else {\n return this.request(\"GET\", url)\n }\n }\n\n post(url, data) {\n return this.request(\"POST\", url, data)\n }\n\n patch(url, data) {\n return this.request(\"PATCH\", url, data)\n }\n\n put(url, data) {\n return this.request(\"PUT\", url, data)\n }\n\n delete(url, data) {\n return this.request(\"DELETE\", url, data)\n }\n\n upload(url, data, progress) {\n let self = this\n return new Promise(function (resolve, reject) {\n let xhr = {\n url: url,\n method: \"POST\",\n headers: {\n \"X-CSRFToken\": self.getCsrfToken(),\n },\n\n data: data,\n contentType: false,\n processData: false,\n\n xhr: function () {\n let xhr = new window.XMLHttpRequest()\n xhr.upload.addEventListener(\n \"progress\",\n function (evt) {\n if (evt.lengthComputable) {\n progress(Math.round((evt.loaded / evt.total) * 100))\n }\n },\n false\n )\n return xhr\n },\n\n success: function (response) {\n resolve(response)\n },\n\n error: function (jqXHR) {\n let rejection = jqXHR.responseJSON || {}\n\n rejection.status = jqXHR.status\n\n if (rejection.status === 0) {\n rejection.detail = gettext(\"Lost connection with application.\")\n }\n\n if (rejection.status === 413 && !rejection.detail) {\n rejection.detail = gettext(\n \"Upload was rejected by server as too large.\"\n )\n }\n\n if (rejection.status === 404) {\n if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n rejection.detail = gettext(\"Action link is invalid.\")\n }\n }\n\n if (rejection.status === 500 && !rejection.detail) {\n rejection.detail = gettext(\"Unknown error has occured.\")\n }\n\n rejection.statusText = jqXHR.statusText\n\n reject(rejection)\n },\n }\n\n $.ajax(xhr)\n })\n }\n}\n\nexport default new Ajax()\n","import { signIn, signOut } from \"misago/reducers/auth\"\n\nexport class Auth {\n init(store, local, modal) {\n this._store = store\n this._local = local\n this._modal = modal\n\n // tell other tabs what auth state is because we are most current with it\n this.syncSession()\n\n // listen for other tabs to tell us that state changed\n this.watchState()\n }\n\n syncSession() {\n const state = this._store.getState().auth\n if (state.isAuthenticated) {\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: state.user.username,\n })\n } else {\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n }\n }\n\n watchState() {\n const state = this._store.getState().auth\n this._local.watch(\"auth\", (newState) => {\n if (newState.isAuthenticated) {\n this._store.dispatch(\n signIn({\n username: newState.username,\n })\n )\n } else if (state.isAuthenticated) {\n // check if we are authenticated in this tab\n // because some browser plugins prune local store\n // aggressively, forcing erroneous message to display here\n // tracking bug #955\n this._store.dispatch(signOut())\n }\n })\n this._modal.hide()\n }\n\n signIn(user) {\n this._store.dispatch(signIn(user))\n this._local.set(\"auth\", {\n isAuthenticated: true,\n username: user.username,\n })\n this._modal.hide()\n }\n\n signOut() {\n this._store.dispatch(signOut())\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n\n softSignOut() {\n this._store.dispatch(signOut(true))\n this._local.set(\"auth\", {\n isAuthenticated: false,\n })\n this._modal.hide()\n }\n}\n\nexport default new Auth()\n","/* global grecaptcha */\nimport React from \"react\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport class BaseCaptcha {\n init(context, ajax, include, snackbar) {\n this._context = context\n this._ajax = ajax\n this._include = include\n this._snackbar = snackbar\n }\n}\n\nexport class NoCaptcha extends BaseCaptcha {\n load() {\n return new Promise(function (resolve) {\n // immediately resolve as we don't have anything to validate\n resolve()\n })\n }\n\n validator() {\n return null\n }\n\n component() {\n return null\n }\n}\n\nexport class QACaptcha extends BaseCaptcha {\n load() {\n var self = this\n return new Promise((resolve, reject) => {\n self._ajax.get(self._context.get(\"CAPTCHA_API\")).then(\n function (data) {\n self.question = data.question\n self.helpText = data.help_text\n resolve()\n },\n function () {\n self._snackbar.error(gettext(\"Failed to load CAPTCHA.\"))\n reject()\n }\n )\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class ReCaptchaComponent extends React.Component {\n componentDidMount() {\n grecaptcha.render(\"recaptcha\", {\n sitekey: this.props.siteKey,\n callback: (response) => {\n // fire fakey event to binding\n this.props.binding({\n target: {\n value: response,\n },\n })\n },\n })\n }\n\n render() {\n return
    \n }\n}\n\nexport class ReCaptcha extends BaseCaptcha {\n load() {\n this._include.include(\"https://www.google.com/recaptcha/api.js\", true)\n\n return new Promise(function (resolve) {\n var wait = function () {\n if (typeof grecaptcha === \"undefined\") {\n window.setTimeout(function () {\n wait()\n }, 200)\n } else {\n resolve()\n }\n }\n wait()\n })\n }\n\n validator() {\n return []\n }\n\n component(kwargs) {\n return (\n \n \n \n )\n }\n}\n\nexport class Captcha {\n init(context, ajax, include, snackbar) {\n switch (context.get(\"SETTINGS\").captcha_type) {\n case \"no\":\n this._captcha = new NoCaptcha()\n break\n\n case \"qa\":\n this._captcha = new QACaptcha()\n break\n\n case \"re\":\n this._captcha = new ReCaptcha()\n break\n }\n\n this._captcha.init(context, ajax, include, snackbar)\n }\n\n // accessors for underlying strategy\n\n load() {\n return this._captcha.load()\n }\n\n validator() {\n return this._captcha.validator()\n }\n\n component(kwargs) {\n return this._captcha.component(kwargs)\n }\n}\n\nexport default new Captcha()\n","export class Include {\n init(staticUrl) {\n this._staticUrl = staticUrl\n this._included = []\n }\n\n include(script, remote = false) {\n if (this._included.indexOf(script) === -1) {\n this._included.push(script)\n this._include(script, remote)\n }\n }\n\n _include(script, remote) {\n $.ajax({\n url: (!remote ? this._staticUrl : \"\") + script,\n cache: true,\n dataType: \"script\",\n })\n }\n}\n\nexport default new Include()\n","let storage = window.localStorage\n\nexport class LocalStorage {\n init(prefix) {\n this._prefix = prefix\n this._watchers = []\n\n window.addEventListener(\"storage\", (e) => {\n let newValueJson = JSON.parse(e.newValue)\n this._watchers.forEach(function (watcher) {\n if (watcher.key === e.key && e.oldValue !== e.newValue) {\n watcher.callback(newValueJson)\n }\n })\n })\n }\n\n set(key, value) {\n storage.setItem(this._prefix + key, JSON.stringify(value))\n }\n\n get(key) {\n let itemString = storage.getItem(this._prefix + key)\n if (itemString) {\n return JSON.parse(itemString)\n } else {\n return null\n }\n }\n\n watch(key, callback) {\n this._watchers.push({\n key: this._prefix + key,\n callback: callback,\n })\n }\n}\n\nexport default new LocalStorage()\n","import mount from \"misago/utils/mount-component\"\n\nexport class MobileNavbarDropdown {\n init(element) {\n this._element = element\n this._component = null\n }\n\n show(component) {\n if (this._component === component) {\n this.hide()\n } else {\n this._component = component\n mount(component, this._element.id)\n $(this._element).addClass(\"open\")\n }\n }\n\n showConnected(name, component) {\n if (this._component === name) {\n this.hide()\n } else {\n this._component = name\n mount(component, this._element.id, true)\n $(this._element).addClass(\"open\")\n }\n }\n\n hide() {\n $(this._element).removeClass(\"open\")\n this._component = null\n }\n}\n\nexport default new MobileNavbarDropdown()\n","import ReactDOM from \"react-dom\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Modal {\n init(element) {\n this._element = element\n\n this._modal = $(element).modal({ show: false })\n\n this._modal.on(\"hidden.bs.modal\", () => {\n ReactDOM.unmountComponentAtNode(this._element)\n })\n }\n\n show(component) {\n mount(component, this._element.id)\n this._modal.modal(\"show\")\n }\n\n hide() {\n this._modal.modal(\"hide\")\n }\n}\n\nexport default new Modal()\n","export class PageTitle {\n init(indexTitle, forumName) {\n this._indexTitle = indexTitle\n this._forumName = forumName\n }\n\n set(title) {\n if (!title) {\n document.title = this._indexTitle || this._forumName\n return\n }\n\n if (typeof title === \"string\") {\n title = { title: title }\n }\n\n let finalTitle = title.title\n\n if (title.page > 1) {\n const pageLabel = interpolate(\n gettext(\"page: %(page)s\"),\n {\n page: title.page,\n },\n true\n )\n\n finalTitle += \" (\" + pageLabel + \")\"\n }\n\n if (title.parent) {\n finalTitle += \" | \" + title.parent\n }\n\n document.title = finalTitle + \" | \" + this._forumName\n }\n}\n\nexport default new PageTitle()\n","export class Polls {\n init(ajax, snackbar) {\n this._ajax = ajax\n this._snackbar = snackbar\n\n this._polls = {}\n }\n\n start(kwargs) {\n this.stop(kwargs.poll)\n\n const poolServer = () => {\n this._polls[kwargs.poll] = kwargs\n\n this._ajax.get(kwargs.url, kwargs.data || null).then(\n (data) => {\n if (!this._polls[kwargs.poll]._stopped) {\n kwargs.update(data)\n\n this._polls[kwargs.poll].timeout = window.setTimeout(\n poolServer,\n kwargs.frequency\n )\n }\n },\n (rejection) => {\n if (!this._polls[kwargs.poll]._stopped) {\n if (kwargs.error) {\n kwargs.error(rejection)\n } else {\n this._snackbar.apiError(rejection)\n }\n }\n }\n )\n }\n\n if (kwargs.delayed) {\n this._polls[kwargs.poll] = {\n timeout: window.setTimeout(poolServer, kwargs.frequency),\n }\n } else {\n poolServer()\n }\n }\n\n stop(pollId) {\n if (this._polls[pollId]) {\n window.clearTimeout(this._polls[pollId].timeout)\n this._polls[pollId]._stopped = true\n }\n }\n}\n\nexport default new Polls()\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport PostingComponent from \"misago/components/posting\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Posting {\n init(ajax, snackbar, mount) {\n this._ajax = ajax\n this._snackbar = snackbar\n this._mount = mount\n\n this._mode = null\n this._spacer = document.getElementById(\"posting-spacer\")\n this._observer = new ResizeObserver((entries) => {\n this._spacer.style.height = entries[0].contentRect.height + \"px\"\n })\n\n this._isOpen = false\n this._isClosing = false\n\n this._beforeunloadSet = false\n this._props = null\n }\n\n isOpen() {\n return this._isOpen\n }\n\n setBeforeUnload() {\n if (!this._beforeunloadSet) {\n window.addEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = true\n }\n }\n\n unsetBeforeUnload() {\n window.removeEventListener(\"beforeunload\", this.beforeUnload, {\n capture: true,\n })\n this._beforeunloadSet = false\n }\n\n beforeUnload(event) {\n event.returnValue = \"true\"\n return \"true\"\n }\n\n open(props) {\n if (this._isOpen === false) {\n if (props.mode === \"QUOTE\") {\n this._mode = \"REPLY\"\n } else {\n this._mode = props.mode\n }\n\n this._isOpen = props.submit\n this._realOpen(\n Object.assign({}, props, {mode: this._mode})\n )\n } else if (props.mode === \"QUOTE\") {\n this._realOpen(\n Object.assign({}, this._props, {\n config: props.config,\n context: props.context,\n })\n )\n } else if (this._isOpen !== props.submit) {\n let message = gettext(\n \"You are already working on other message. Do you want to discard it?\"\n )\n\n const changeForm = window.confirm(message)\n if (changeForm) {\n this._mode = props.mode\n this._isOpen = props.submit\n this._realOpen(props)\n }\n } else if (this._mode == \"REPLY\" && props.mode == \"REPLY\") {\n this._realOpen(props)\n }\n }\n\n _realOpen(props) {\n mount(, this._mount.id)\n\n this._props = props\n this._mount.classList.add(\"show\")\n this._observer.observe(this._mount)\n this.setBeforeUnload()\n }\n\n close = () => {\n this.unsetBeforeUnload()\n this._props = null\n\n if (this._isOpen && !this._isClosing) {\n this._isClosing = true\n this._mount.classList.remove(\"show\")\n\n window.setTimeout(() => {\n ReactDOM.unmountComponentAtNode(this._mount)\n this._observer.unobserve(this._mount)\n this._spacer.style.height = \"0px;\"\n this._isClosing = false\n this._isOpen = false\n this._mode = null\n }, 300)\n }\n }\n}\n\nexport default new Posting()\n","import { showSnackbar, hideSnackbar } from \"misago/reducers/snackbar\"\n\nconst HIDE_ANIMATION_LENGTH = 300\nconst MESSAGE_SHOW_LENGTH = 5000\n\nexport class Snackbar {\n init(store) {\n this._store = store\n this._timeout = null\n }\n\n alert(message, type) {\n if (this._timeout) {\n window.clearTimeout(this._timeout)\n this._store.dispatch(hideSnackbar())\n\n this._timeout = window.setTimeout(() => {\n this._timeout = null\n this.alert(message, type)\n }, HIDE_ANIMATION_LENGTH)\n } else {\n this._store.dispatch(showSnackbar(message, type))\n this._timeout = window.setTimeout(() => {\n this._store.dispatch(hideSnackbar())\n this._timeout = null\n }, MESSAGE_SHOW_LENGTH)\n }\n }\n\n // shorthands for message types\n\n info(message) {\n this.alert(message, \"info\")\n }\n\n success(message) {\n this.alert(message, \"success\")\n }\n\n warning(message) {\n this.alert(message, \"warning\")\n }\n\n error(message) {\n this.alert(message, \"error\")\n }\n\n // shorthand for api errors\n\n apiError(rejection) {\n let message = rejection.detail\n\n if (!message) {\n if (rejection.status === 404) {\n message = gettext(\"Action link is invalid.\")\n } else {\n message = gettext(\"Unknown error has occured.\")\n }\n }\n\n if (rejection.status === 403 && message === \"Permission denied\") {\n message = gettext(\"You don't have permission to perform this action.\")\n }\n\n this.error(message)\n }\n}\n\nexport default new Snackbar()\n","import { combineReducers, createStore } from \"redux\"\n\nexport class StoreWrapper {\n constructor() {\n this._store = null\n this._reducers = {}\n this._initialState = {}\n }\n\n addReducer(name, reducer, initialState) {\n this._reducers[name] = reducer\n this._initialState[name] = initialState\n }\n\n init() {\n this._store = createStore(\n combineReducers(this._reducers),\n this._initialState\n )\n }\n\n getStore() {\n return this._store\n }\n\n // Store API\n\n getState() {\n return this._store.getState()\n }\n\n dispatch(action) {\n return this._store.dispatch(action)\n }\n}\n\nexport default new StoreWrapper()\n","/* global zxcvbn */\nexport class Zxcvbn {\n init(include) {\n this._include = include\n this._isLoaded = false\n }\n\n scorePassword(password, inputs) {\n // 0-4 score, the more the stronger password\n if (this._isLoaded) {\n return zxcvbn(password, inputs).score\n }\n\n return 0\n }\n\n load() {\n if (!this._isLoaded) {\n this._include.include(\"misago/js/zxcvbn.js\")\n return this._loadingPromise()\n } else {\n return this._loadedPromise()\n }\n }\n\n _loadingPromise() {\n const self = this\n\n return new Promise(function (resolve, reject) {\n var wait = function (tries = 0) {\n tries += 1\n if (tries > 200) {\n reject()\n } else if (typeof zxcvbn === \"undefined\") {\n window.setTimeout(function () {\n wait(tries)\n }, 200)\n } else {\n self._isLoaded = true\n resolve()\n }\n }\n wait()\n })\n }\n\n _loadedPromise() {\n // we have already loaded zxcvbn.js, resolve away!\n return new Promise(function (resolve) {\n resolve()\n })\n }\n}\n\nexport default new Zxcvbn()\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default class extends React.Component {\n getReasonMessage() {\n if (this.props.message.html) {\n return (\n \n )\n } else {\n return

    {this.props.message.plain}

    \n }\n }\n\n getExpirationMessage() {\n if (this.props.expires) {\n if (this.props.expires.isAfter(moment())) {\n let title = interpolate(\n gettext(\"This ban expires on %(expires_on)s.\"),\n {\n expires_on: this.props.expires.format(\"LL, LT\"),\n },\n true\n )\n\n let message = interpolate(\n gettext(\"This ban expires %(expires_on)s.\"),\n {\n expires_on: this.props.expires.fromNow(),\n },\n true\n )\n\n return {message}\n } else {\n return gettext(\"This ban has expired.\")\n }\n } else {\n return gettext(\"This ban is permanent.\")\n }\n }\n\n render() {\n return (\n
    \n
    \n
    \n
    \n highlight_off\n
    \n
    \n {this.getReasonMessage()}\n

    {this.getExpirationMessage()}

    \n
    \n
    \n
    \n
    \n )\n }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider, connect } from \"react-redux\"\nimport BannedPage from \"misago/components/banned-page\"\nimport misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nlet select = function (state) {\n return state.tick\n}\n\nlet RedrawedBannedPage = connect(select)(BannedPage)\n\nexport default function (ban, changeState) {\n ReactDOM.render(\n \n \n ,\n\n document.getElementById(\"page-mount\")\n )\n\n if (typeof changeState === \"undefined\" || changeState) {\n let forumName = misago.get(\"SETTINGS\").forum_name\n document.title = gettext(\"You are banned\") + \" | \" + forumName\n window.history.pushState({}, \"\", misago.get(\"BANNED_URL\"))\n }\n}\n","export default function (list, rowWidth, padding = false) {\n let rows = []\n let row = []\n\n list.forEach(function (element) {\n row.push(element)\n if (row.length === rowWidth) {\n rows.push(row)\n row = []\n }\n })\n\n // pad row to required length?\n if (padding !== false && row.length > 0 && row.length < rowWidth) {\n for (let i = row.length; i < rowWidth; i++) {\n row.push(padding)\n }\n }\n\n if (row.length) {\n rows.push(row)\n }\n\n return rows\n}\n","export default function (a, b) {\n let ids = []\n return a.concat(b).filter(function (item) {\n if (ids.indexOf(item.id) === -1) {\n ids.push(item.id)\n return true\n } else {\n return false\n }\n })\n}\n","const map = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n}\n\nexport default function (text) {\n return text.replace(/[&<>\"']/g, function (m) {\n return map[m]\n })\n}\n","export default function (bytes) {\n if (bytes > 1024 * 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024 * 1024)) + \" GB\"\n } else if (bytes > 1024 * 1024) {\n return roundSize(bytes / (1024 * 1024)) + \" MB\"\n } else if (bytes > 1024) {\n return roundSize(bytes / 1024) + \" KB\"\n } else {\n return roundSize(bytes) + \" B\"\n }\n}\n\nexport function roundSize(value) {\n return value.toFixed(1)\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport store from \"misago/services/store\"\n\nexport default function (Component, rootElementId, connected = true) {\n let rootElement = document.getElementById(rootElementId)\n\n let finalComponent = Component.props ? Component : \n\n if (rootElement) {\n if (connected) {\n ReactDOM.render(\n {finalComponent},\n\n rootElement\n )\n } else {\n ReactDOM.render(finalComponent, rootElement)\n }\n }\n}\n","export function int(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport function range(min, max) {\n let array = new Array(int(min, max))\n for (let i = 0; i < array.length; i++) {\n array[i] = i\n }\n\n return array\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { Router, browserHistory } from \"react-router\"\nimport store from \"misago/services/store\"\n\nconst rootElement = document.getElementById(\"page-mount\")\n\nexport default function (options) {\n let routes = {\n component: options.component || null,\n childRoutes: [],\n }\n\n if (options.root) {\n routes.childRoutes = [\n {\n path: options.root,\n onEnter: function (nextState, replaceState) {\n replaceState(null, options.paths[0].path)\n },\n },\n ].concat(options.paths)\n } else {\n routes.childRoutes = options.paths\n }\n\n ReactDOM.render(\n \n \n ,\n rootElement\n )\n}\n","export function push(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array\n }\n}\n\nexport function remove(array, value) {\n if (array.indexOf(value) >= 0) {\n return array.filter(function (i) {\n return i !== value\n })\n } else {\n return array\n }\n}\n\nexport function toggle(array, value) {\n if (array.indexOf(value) === -1) {\n let copy = array.slice()\n copy.push(value)\n return copy\n } else {\n return array.filter(function (i) {\n return i !== value\n })\n }\n}\n","const EMAIL =\n /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i\nconst USERNAME = new RegExp(\"^[0-9a-z]+$\", \"i\")\n\nexport function required(message) {\n return function (value) {\n if (value === false || value === null || $.trim(value).length === 0) {\n return message || gettext(\"This field is required.\")\n }\n }\n}\n\nexport function requiredTermsOfService(message) {\n const error = gettext(\"You have to accept the terms of service.\")\n return required(message || error)\n}\n\nexport function requiredPrivacyPolicy(message) {\n const error = gettext(\"You have to accept the privacy policy.\")\n return required(message || error)\n}\n\nexport function email(message) {\n return function (value) {\n if (!EMAIL.test(value)) {\n return message || gettext(\"Enter a valid email address.\")\n }\n }\n}\n\nexport function minLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = $.trim(value).length\n\n if (length < limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = ngettext(\n \"Ensure this value has at least %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function maxLength(limitValue, message) {\n return function (value) {\n var returnMessage = \"\"\n var length = $.trim(value).length\n\n if (length > limitValue) {\n if (message) {\n returnMessage = message(limitValue, length)\n } else {\n returnMessage = ngettext(\n \"Ensure this value has at most %(limit_value)s character (it has %(show_value)s).\",\n \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\n limitValue\n )\n }\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n\nexport function usernameMinLength(lengthMin) {\n var message = function (lengthMin) {\n return ngettext(\n \"Username must be at least %(limit_value)s character long.\",\n \"Username must be at least %(limit_value)s characters long.\",\n lengthMin\n )\n }\n return minLength(lengthMin, message)\n}\n\nexport function usernameMaxLength(lengthMax) {\n var message = function (lengthMax) {\n return ngettext(\n \"Username cannot be longer than %(limit_value)s character.\",\n \"Username cannot be longer than %(limit_value)s characters.\",\n lengthMax\n )\n }\n return maxLength(lengthMax, message)\n}\n\nexport function usernameContent() {\n return function (value) {\n if (!USERNAME.test($.trim(value))) {\n return gettext(\n \"Username can only contain latin alphabet letters and digits.\"\n )\n }\n }\n}\n\nexport function passwordMinLength(limitValue) {\n return function (value) {\n const length = value.length\n\n if (length < limitValue) {\n const returnMessage = ngettext(\n \"Valid password must be at least %(limit_value)s character long.\",\n \"Valid password must be at least %(limit_value)s characters long.\",\n limitValue\n )\n\n return interpolate(\n returnMessage,\n {\n limit_value: limitValue,\n show_value: length,\n },\n true\n )\n }\n }\n}\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"hljs\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t174: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmisago\"] = self[\"webpackChunkmisago\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(32233); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(58339); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(64109); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(46226); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(93240); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(75147); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(4894); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(29223); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(3026); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(94795); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(95563); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(32488); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(11768); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(61323); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(15049); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(61814); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(95920); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(60630); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(72168); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(47806); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(77031); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(97751); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(76093); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(19764); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(47549); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(22331); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(21513); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(98749); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(98251); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(6720); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(10846); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(18255); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(14113); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(24444); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(1764); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(68351); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(81521); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(19984); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(41229); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(43589); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(24108); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(33934); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(85577); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(83526); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(43060); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(92292); })\n__webpack_require__.O(undefined, [736], function() { return __webpack_require__(33409); })\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], function() { return __webpack_require__(31341); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","children","className","classnames","shrink","auto","styleName","message","dangerouslySetInnerHTML","__html","header","LegalAgreement","props","agreement","checked","errors","url","value","onChange","agreementHtml","interpolate","escapeHtml","label","gettext","type","map","error","i","privacyPolicy","termsOfService","onPrivacyPolicyChange","onTermsOfServiceChange","termsOfServiceId","misago","termsOfServiceUrl","privacyPolicyId","privacyPolicyUrl","FormHeader","text","buttonClassName","buttonLabel","formLabel","labelClassName","socialAuth","length","pk","name","button_text","button_color","style","color","finalButtonLabel","site","href","thread","weight","title","best_answer","has_poll","is_unapproved","has_unapproved_posts","is_closed","is_hidden","ngettext","replies","Math","round","size","size2x","alt","src","getSrc","user","srcSet","width","height","id","avatars","avatar","forEach","av","resolveAvatarForSize","Button","React","render","this","disabled","loading","onClick","defaultProps","choices","item","repeat","level","display","helpText","ev","field","fieldname","target","input","rows","fields","for","help_text","validation","Form","constructor","super","setState","state","isLoading","groups","group","f","initial","send","data","Object","assign","ajax","api","handleSuccess","onSuccess","handleError","rejection","status","snackbar","onSubmit","handleSubmit","CancelButton","onCancel","componentDidMount","then","cancel","FormDisplay","isValidated","getClassName","getFeedback","getFeedbackDescription","getHelpText","labelClass","htmlFor","controlClass","extra","validateRequired","required","event","changeValue","newState","formErrors","validateField","preventDefault","clean","promise","success","validate","validators","optional","validatedFields","hasOwnProperty","push","fieldErrors","isValid","requiredError","validationError","isActive","isControlled","path","document","location","pathname","indexOf","activeClassName","BestAnswerSelect","choice","PollSelect","modal","onError","bestAnswer","poll","polls","window","confirm","role","pgettext","bestAnswers","onBestAnswerChange","onPollChange","ytRegExp","RegExp","element","highlightCode","embedYoutubePlayers","_youtube","default","hljs","codeblocks","querySelectorAll","highlightElement","anchors","a","onlyChild","parentNode","childNodes","parseYoutubeUrl","youtubeMovie","swapYoutubePlayer","youtube","video","start","player","$","replaceWith","wrap","cleanedUrl","substr","cleanUrl","match","getVideoIdFromUrl","timebit","split","filter","bits","parseInt","onebox","documentNode","find","click","revealSpoiler","componentDidUpdate","prevProps","prevState","shouldComponentUpdate","nextProps","nextState","markup","author","undefined","ref","node","btn","parent","addClass","PanelMessage","icon","post","content","Default","Invalid","category","tooltip","posted_on","format","index","fromNow","poster_name","rank","userTitle","css_class","is_tab","poster","username","random","isReady","posts","PostingQuoteSelection","range","getQuoteSelection","rect","getBoundingClientRect","posting","globalState","getGlobalState","quote","getQuoteMarkup","focusEditor","setTimeout","onMouseUp","selected","onTouchEnd","position","left","scrollX","top","bottom","scrollY","reply","textarea","querySelector","focus","selectionStart","selectionEnd","container","getSelection","selection","rangeCount","getRangeAt","isRangeContained","isPostContained","isAnyTextSelected","cloneContents","commonAncestorContainer","p","nodeName","dataset","noquote","child","nodeType","Node","TEXT_NODE","textContent","trim","metadata","getQuoteMetadata","convertNodesToMarkup","prefix","suffix","codeBlock","getQuoteCodeBlock","syntax","isNodeInlineCodeBlock","isNodeElementWithQuoteMetadata","getQuoteMetadataFromNode","ELEMENT_NODE","block","isNodeCodeBlock","getNodeCodeBlockMeta","nodes","stack","convertNodeToMarkup","SIMPLE_NODE_MAPPINGS","H1","H2","H3","H4","H5","H6","STRONG","EM","DEL","B","U","I","SUB","SUP","toUpperCase","code","innerText","misagoReply","setGlobalState","clearGlobalState","attachments","attachment","isRemoved","MarkupAttachmentModal","is_image","filename","filetype","formatFilesize","uploaded_on","uploader","uploader_name","wrapSelection","update","def","newValue","caret","setSelectionRange","replaceSelection","end","createRange","moveStart","substring","scroll","scrollTop","progress","thumb","getAttachmentMarkup","key","canProtect","empty","preview","isProtected","submitText","showPreview","closePreview","enableProtection","disableProtection","MarkupCodeModal","LANGUAGES","MarkupFormattingHelpModal","ExampleFormatting","result","ExampleFormattingSpoiler","reveal","URL_PATTERN","str","test","MarkupImageModal","isUrl","textUrl","MarkupLinkModal","MarkupQuoteModal","ALPHA","ALPHA_LEN","getRandomString","len","chars","floor","join","file","maxSize","acl","max_attachment_size","limit","upload","concat","refreshState","FormData","append","moment","detail","updateAttachments","actions","insertSpoiler","createElement","multiple","addEventListener","files","uploadFile","uploadFiles","MarkupEditor","parsed","stopPropagation","dataTransfer","onAttachmentsChange","clipboardData","items","kind","getAsFile","focused","placeholder","atwho","at","displayTpl","insertTpl","searchKey","callbacks","remoteFilter","query","callback","getJSON","q","on","_storage","source","controller","headPos","endPos","setMentions","onDrop","onFocus","onPaste","onBlur","post_length_min","CLASS_ACTIVE","CLASS_DEFAULT","CLASS_MINIMIZED","CLASS_FULLSCREEN","PostingDialog","body","classList","add","componentWillUnmount","remove","componentWillReceiveProps","fullscreen","minimized","close","minimize","fullscreenEnter","fullscreenExit","open","PostingThreadOptions","isClosed","isHidden","isPinned","options","hide","unhide","pinGlobally","pinLocally","unpin","icons","closed","hidden","pinned","getIcons","pin","categories","categoryOptions","getTitleValidators","getPostValidators","config","loadSuccess","loadError","submit","non_field_errors","dialogProps","PostingDialogStart","Toolbar","showOptions","onTitleChange","onCategoryChange","onClose","onOpen","onHide","onUnhide","onPinGlobally","onPinLocally","onUnpin","onPostChange","usernames","removedBlanks","toLowerCase","pos","to","cleanUsernames","PostingDialogStartPrivate","onToChange","newPost","context","onQuote","newContext","appendData","PostingDialogReply","method","protect","is_protected","can_protect","PostingDialogEditReply","date","mode","minLength","thread_title_length_min","limitValue","limit_value","show_value","maxLength","thread_title_length_max","post_length_max","validatePostLengthMin","Icon","getChoice","getIcon","getLabel","change","showActivation","password","form","val","showBannedPage","ban","getActivationButton","bindInput","getClass","is_banned","is_online_hidden","is_offline_hidden","is_online","is_offline","getStatusClassName","StatusIcon","StatusLabel","getHelp","banned_until","ban_expires","last_click","getEmptyMessage","emptyMessage","renderUserAvatar","changed_by","renderUsername","changed_by_username","old_username","new_username","changed_on","changes","hiddenOnMobile","isLoaded","showStatus","Status","JoinDate","Posts","Threads","Followers","joined_on","getStatClassName","threads","followers","stat","colClassName","cols","list","Array","apply","Number","call","users","dropdown","getCompactNavClassName","iconOn","iconOff","labelOn","labelOff","toggle","_initializers","_context","addInitializer","initializer","after","before","init","isOrdered","_items","order","get","has","values","values_only","_order","orderedValues","unordered","ordered","ordering","insertItem","insertAt","splice","iterations","fallback","pop","setInterval","store","patch","AUTH_SYNC_RATE","auth","storage","captcha","include","AcceptAgreement","submiting","accept","reload","handleDecline","handleAccept","getElementById","mount","refresh","getMessage","signedIn","signedOut","select","connect","AuthMessage","description","html","getTitle","is_read","LastThread","Empty","Private","Protected","can_browse","can_see_all_threads","last_thread_title","LastPosterAvatar","last_thread_new","LastPosterName","last_post","last_post_on","last_poster","last_poster_name","Message","isFirst","subcategories","hydrate","startPolling","frequency","tick","Categories","SideNav","option","baseUrl","component","CompactNav","hideNav","delete","onPasswordChange","edit_details","DownloadData","data_downloads","downloads","isSubmiting","request_data_download","handleLoadDownloads","rowStyle","requested_on","DownloadButton","exportFile","colSpan","handleRequestDataDownload","verticalAlign","is_hiding_presence","limits_private_thread_invites_to","subscribe_to_started_threads","subscribe_to_replied_threads","privateThreadInvitesChoices","subscribeToChoices","next_on","next_change","length_min","length_max","phrases","changes_left","name_changes_expire","complete","slug","addNameChange","updateUsername","Promise","all","results","getChangeForm","onComplete","new_email","change_email","response","new_password","repeat_password","change_password","has_usable_password","WithDropdown","page","PageHeader","FlexRow","PageContainer","paths","ChangeForumOptions","EditDetails","delegateAuth","DELEGATE_AUTH","ChangeUsername","ChangeSignInCredentials","DeleteAccount","root","Options","expires_on","initWithPreloadedData","initWithoutPreloadedData","profile","getUserMessage","user_message","getStaffMessage","staff_message","getExpirationMessage","isAfter","getPanelBody","keys","isAuthenticated","SafeValue","rel","onEdit","showEditButton","dispatch","details","load","editing","newDetails","loadDetails","profileDetails","edit","loadItems","next","Feed","loadMore","LoadMoreButton","isBusy","loadUsers","search","count","more","pages","setSpecialProps","PRELOADED_DATA_KEY","TITLE","API_FILTER","apiUrl","getMoreButton","getListBody","loadChanges","is_followed","follow","action","canMessage","can_start_private_threads","isProfileOwner","is_avatar_locked","avatar_lock_user_message","avatar_lock_staff_message","moderate_avatar","apiResponse","updateAvatar","avatar_hash","getFormBody","getModalBody","moderate_username","countdown","isDeleted","with_content","getButtonLabel","getForm","getDeletedBody","AvatarControls","moderation","showAvatarDialog","rename","showRenameDialog","showDeleteDialog","is_active","email","ProfileModerationButton","available","getModeration","can_follow","is_anonymous","can_rename","can_moderate_avatar","can_delete","COMPONENTS","follows","Details","UsernameHistory","BanDetails","Profile","RequestLinkForm","LinkSent","reset","RequestActivationLink","RequestResetForm","showInactivePage","AccountInactivePage","getActivateButton","activation","ReactDOM","RequestPasswordReset","ResetPasswordForm","PasswordChangedPage","showSignIn","SignInModal","updateSearch","urlQuery","history","pushState","encodeURIComponent","providers","provider","updateUsers","updatePosts","onQueryChange","Badge","ceil","SearchTime","time","copy","LoadMore","appendPosts","updateProvider","Blankslate","components","route","TYPES_CLASSES","info","warning","Snackbar","getSnackbarClass","snackbarClass","isVisible","backendName","pageTitleTpl","pageTitle","backend","Register","handleToggleAgreement","validator","formValidators","emailProtected","terms_of_service","privacy_policy","onRegistrationComplete","step","stateUpdate","backend_name","emailHelpText","emailHelpTextTpl","RegisterLegalFootnote","handlePrivacyPolicyChange","handleTermsOfServiceChange","SocialAuth","handleRegistrationComplete","op","updateAcl","participants","ModalHeader","onUsernameChange","can_add_participants","confirmed","isUser","participant","is_owner","can_change_owner","isModerator","can_moderate_private_threads","userIsOwner","UserStatus","isOwner","getUserIsOwner","utils","PollChoice","hash","proc","votes","getVotesLabel","ChoiceVotes","UserChoice","npgettext","hydratedData","voters","voter","voted_on","ModalBody","ChoicesList","ChoiceDetails","VotesCount","VotesList","Voter","VoteDate","isPollOver","showVoting","is_public","can_edit","can_see_votes","can_vote","hasSelectedChoices","allow_revotes","controls","canVote","canChangeVote","ChangeVote","SeeVotes","Edit","Delete","control","newThreadAcl","DATE_ABBR","PollVotes","PollLength","PollIsPublic","PollCreation","getPoster","getPostedOn","absolute","relative","ends_on","getEndsOn","endsOn","question","PollChoicesLeft","choicesLeft","PollAllowRevote","ChoiceSelect","toggleChoice","getChoicesLeft","allowed_choices","getChoiceFromHash","deselectChoice","selectChoice","slice","showResults","getIsPollOver","generateRandomHash","setChoices","canDelete","onDelete","onAdd","randomHash","toString","replace","isEdit","PollPublicSwitch","ICON","changed_title","pinned_globally","pinned_locally","unpinned","moved","merged","approved","opened","unhid","hid","changed_owner","tookover","added_participant","owner_left","participant_left","removed_participant","event_type","can_hide","Hide","Unhide","hidden_on","hidden_by_name","hidden_by","USER_SPAN","USER_URL","Hidden","Poster","event_by","event_on","MESSAGE","ITEM_LINK","ITEM_SPAN","ChangedTitle","Moved","Merged","ChangedOwner","AddedParticipant","RemovedParticipant","msgstring","oldTitle","event_context","old_title","fromCategory","from_category","mergedThread","merged_thread","newOwner","waypoint","handler","direction","boundingClientRect","offsetBottom","clientHeight","documentElement","read","thread_is_read","offset","AttachmentPreview","AttachmentDetails","AttachmentThumbnail","AttachmentIcon","backgroundImage","can_see_hidden","batch","row","Row","FlagBestAnswer","best_answer_marked_by","marked_on","best_answer_marked_on","marked_by","best_answer_marked_by_name","FlagHidden","FlagUnapproved","FlagProtected","ops","previousState","markAsBestAnswer","best_answer_is_protected","best_answer_marked_by_slug","patchThread","likes","hydrateLike","ModalDialog","LikesList","liked_on","likesCount","like","LikeDetails","liker_id","LikeDate","likedOn","can_reply","can_see_likes","last_likes","can_like","MarkAsBestAnswer","MarkAsBestAnswerCompact","Like","Likes","lastLikes","LikesCompact","Reply","Quote","can_mark_best_answer","can_mark_as_best_answer","can_change_best_answer","is_liked","concatedLikes","finalLikes","hasLikes","getLikesMessage","u","hiddenLikes","otherUsers","lastUser","usernamesList","last_user","editor","move","new_thread","onUrlChange","diff","DiffItem","getItemClassName","revertEdit","canRevert","goToEdit","previous","GoBackBtn","goBack","GoForwardBtn","goForward","GoLastBtn","goLast","Label","RevertBtn","editor_name","edited_on","edited_by","hydrateEdit","json","edits","hydratedPost","PostingConfig","ModerationForm","isError","Error","Loader","categoryId","can_pin_threads","can_hide_threads","can_close_threads","isHiddenChoices","isClosedChoices","getWeightChoices","renderWeightField","renderHiddenField","renderClosedField","Modal","Permalink","UnmarkMarkBestAnswer","PostEdits","Approve","Move","Split","Protect","Unprotect","permaUrl","protocol","host","prompt","can_unmark_best_answer","isUnedited","can_approve","can_move","can_unhide","isSelected","can_merge_posts","UnreadLabel","UnreadCompact","PostedOn","PostedOnCompact","PostEditsCompacts","ProtectedLabel","postAuthor","hasAcl","hasVisibleTitle","ListItem","is_event","starter","starter_name","timestamp","started_on","handleSuccessUnmounted","best_answers","merge","other_thread","post_set","ModalMessage","ModalLoading","successMessage","ThreadChangeTitleModal","callApi","changeTitle","approve","oldState","subscription","finalState","stickToBottom","unsubscribe","alert","short_name","special_role","breadcrumbs","ThreadReplies","hasFlags","ThreadFlags","is_authenticated","enabled","first","last","PostErrors","heading","ids","rollback","isArray","Merge","can_merge","dropup","onReply","compact","is_new","new_post","unapproved_post","pollDisabled","onPoll","can_start_poll","setPageTitle","editPoll","shouldFetchData","fetchData","startPollingApi","stopPollingApi","params","delayed","threadModeration","getThreadModeration","postsModeration","getPostsModeration","openPollForm","openReplyForm","closePollForm","can_close","can_pin_globally","can_pin","can_unprotect","basePath","Route","compareLastPostAge","b","compareGlobalWeight","compareWeight","allItems","parentUrl","lists","longName","ThreadErrors","freezeThread","deleteThread","addThreads","filterThreads","categoriesMap","getFormdata","categoryChoices","can_start_threads","renderForm","renderCantMergeMessage","storeState","leftThreads","acls","renderCantMoveMessage","updateThread","threadsMap","failedThreads","noSelection","t","topCategory","topCategories","subCategory","subCategories","startThread","allow","getTopCategory","cat","busyThreads","diffThreads","current","fromDb","currentMap","isThreadChanged","getModerationActions","SUBSCRIPTION","notify","ThreadsListItemSubscriptionOptions","getSubscriptionIcon","activeCategory","showSubscription","isNew","updatedThreads","applyUpdate","loadThreads","getCategory","getSorting","currentState","sets","isMounted","pollResponse","index_header","forum_name","getPageTitle","index_title","specialRole","pageLead","threadsCount","applyDiff","can_see_unapproved_content_lists","getLists","routes","PRIVATE_THREADS_LIST","getListOptions","section","HEADER","RESULT","FOOTER","autoComplete","encodeURI","footer","flattenProvider","flatlist","arrayLength","flatResults","flattenProviders","flattenResults","isOpen","closeResults","loadResults","intervalId","onDocumentMouseDown","onEscape","removeEventListener","delay","clearTimeout","cleanResults","onToggle","STYLES","LABELS","_score","_password","_inputs","loaded","zxcvbn","getScore","inputs","cacheStale","score","RegisterForm","criteria","passwordMinLength","min_length","max_length","__all__","StartSocialAuth","RegisterComplete","getLead","getSubscript","completeRegistration","account_activation","showRegisterForm","GuestMenu","showSignInModal","URLSearchParams","LOGIN_URL","GuestNav","CompactGuestNav","showGuestMenu","avatarType","showError","getGravatarButton","gravatar","setGravatar","getCropButton","crop_src","showCrop","getUploadButton","showUpload","getGalleryButton","galleries","showGallery","getAvatarPreview","userPeview","setGenerated","cropit","deviceRatio","cropitOffset","crop","x","y","zoom","getAvatarSize","crop_tmp","getImagePath","dataUrl","cropperWidth","initialWidth","exportZoom","imageState","onImageLoaded","zoomLevel","imageSize","offsetX","offsetY","cropAvatar","showIndex","image","validateFile","URL","createObjectURL","uploaded","filesize","fileSize","invalidTypeMsg","allowed_mime_types","extensionFound","loweredFilename","allowed_extensions","extension","getUploadRequirements","extensions","pickFile","getUploadProgressLabel","getUploadProgress","renderUpload","renderCrop","GalleryItem","Gallery","images","save","ChangeAvatarError","getErrorReason","reason","AvatarIndex","AvatarUpload","AvatarCrop","AvatarGallery","getBody","completeFlow","UserMenu","changeAvatar","ChangeAvatarModal","following","can_use_private_threads","PrivateThreadsBadge","unread_private_threads","UserNav","UserPrivateThreadsLink","selectUserMenu","CompactUserNav","showUserMenu","CompactUserMenu","getPageUrl","days","trackedPeriod","getUserStatus","getRankName","rankUrl","getUserTitle","counter","meta","getLeadMessage","posters","tracked_period","string","subString","n","stringCount","RankUsersListLoader","getRankDescription","getComponent","Rank","ActivePosters","Users","attr","forum_index_title","reducer","isAnonymous","initialState","doTick","PATCH_USER","SIGN_IN","SIGN_OUT","signIn","signOut","soft","UPDATE_AVATAR","userId","UPDATE_USERNAME","REPLACE_PARTICIPANTS","BUSY_POLL","RELEASE_POLL","REMOVE_POLL","REPLACE_POLL","UPDATE_POLL","busy","release","hydrated","PATCH_POST","updated_on","hydrateAttachment","hydrateUser","APPEND_POSTS","SELECT_POST","DESELECT_POST","DESELECT_POSTS","LOAD_POSTS","UNLOAD_POSTS","UPDATE_POSTS","deselect","deselectAll","hydratePost","unload","selectedPosts","deseletedPosts","deseletedAllPosts","resultsIds","reducedPosts","postReducer","LOAD_DETAILS","HYDRATE_PROFILE","PATCH_PROFILE","hydrateStatus","REPLACE_SEARCH","UPDATE_SEARCH","UPDATE_SEARCH_PROVIDER","SELECT_ALL","SELECT_NONE","SELECT_ITEM","itemsIds","none","itemId","SHOW_SNACKBAR","HIDE_SNACKBAR","showSnackbar","messageType","hideSnackbar","BUSY_THREAD","RELEASE_THREAD","REPLACE_THREAD","UPDATE_THREAD","UPDATE_THREAD_ACL","APPEND_THREADS","DELETE_THREAD","FILTER_THREADS","HYDRATE_THREADS","PATCH_THREAD","SORT_THREADS","MODERATION_PERMISSIONS","sorting","getThreadModerationOptions","thread_acl","perm","hydrateThread","concatUnique","sort","itemCategory","lft","rght","patchedState","TICK","ADD_NAME_CHANGE","APPEND_HISTORY","HYDRATE_HISTORY","changedBy","hydrateNamechange","namechange","unshift","Date","now","APPEND_USERS","HYDRATE_USERS","_cookieName","_csrfToken","_locks","cookieName","getCsrfToken","cookie","cookieRegex","request","self","resolve","reject","xhr","headers","JSON","stringify","contentType","dataType","jqXHR","responseJSON","statusText","lock","param","waiter","wait","put","processData","XMLHttpRequest","evt","lengthComputable","total","local","_store","_local","_modal","syncSession","watchState","getState","set","watch","softSignOut","BaseCaptcha","_ajax","_include","_snackbar","NoCaptcha","QACaptcha","kwargs","ReCaptchaComponent","grecaptcha","sitekey","siteKey","binding","ReCaptcha","recaptcha_site_key","captcha_type","_captcha","staticUrl","_staticUrl","_included","script","remote","cache","localStorage","_prefix","_watchers","e","newValueJson","parse","watcher","oldValue","setItem","itemString","getItem","_element","_component","show","showConnected","removeClass","indexTitle","forumName","_indexTitle","_forumName","finalTitle","_polls","stop","poolServer","_stopped","timeout","apiError","pollId","unsetBeforeUnload","_props","_isOpen","_isClosing","_mount","_observer","unobserve","_spacer","_mode","ResizeObserver","entries","contentRect","_beforeunloadSet","setBeforeUnload","beforeUnload","capture","returnValue","_realOpen","observe","_timeout","_reducers","_initialState","addReducer","createStore","combineReducers","getStore","_isLoaded","scorePassword","_loadedPromise","_loadingPromise","tries","getReasonMessage","plain","expires","RedrawedBannedPage","BannedPage","changeState","rowWidth","padding","m","bytes","roundSize","toFixed","Component","rootElementId","connected","rootElement","finalComponent","int","min","max","childRoutes","onEnter","replaceState","browserHistory","array","EMAIL","USERNAME","requiredTermsOfService","requiredPrivacyPolicy","returnMessage","usernameMinLength","lengthMin","usernameMaxLength","lengthMax","usernameContent","webpackContext","req","webpackContextResolve","__webpack_require__","o","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","r","getter","__esModule","d","definition","defineProperty","enumerable","chunkId","reduce","promises","miniCssF","g","globalThis","Function","hmd","create","obj","prop","prototype","l","done","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","setAttribute","onScriptComplete","prev","onerror","onload","doneFns","removeChild","bind","head","appendChild","Symbol","toStringTag","nmd","scriptUrl","importScripts","currentScript","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/misago/templates/misago/thread/posts/post/footer.html b/misago/templates/misago/thread/posts/post/footer.html index e12e324251..8527a99247 100644 --- a/misago/templates/misago/thread/posts/post/footer.html +++ b/misago/templates/misago/thread/posts/post/footer.html @@ -22,13 +22,16 @@

    {% endif %} {% if post.acl.can_reply %} - + {% endif %} {% if post.acl.can_edit %} - {% endif %}