{"version":3,"sources":["webpack:///route-panel.chunk.8ead8.js","webpack:///./routes/panel/thread.js","webpack:///./routes/panel/login.js","webpack:///./routes/panel/index.js","webpack:///./routes/panel/style.css?2613"],"names":["webpackJsonp","6Bts","module","__webpack_exports__","__webpack_require__","_possibleConstructorReturn","self","call","ReferenceError","_inherits","subClass","superClass","TypeError","prototype","Object","create","constructor","value","enumerable","writable","configurable","setPrototypeOf","__proto__","formatDate","d","Date","toISOString","slice","replace","login__classCallCheck","instance","Constructor","login__possibleConstructorReturn","login__inherits","panel__classCallCheck","panel__possibleConstructorReturn","panel__inherits","defineProperty","preact_min","style","style_default","n","Thread","props","reload","bind","deleteComment","undoDelete","handleBodyChange","handleAuthorChange","_Component","id","this","comments","find","x","Id","updateComment","commentId","hard","window","http","XMLHttpRequest","open","url","context","onreadystatechange","readyState","status","filter","setState","send","JSON","stringify","CommentId","Hard","render","comment","ReplyTo","DeletedAt","length","map","class","mouthful_comment","key","mouthful_author_input","type","Author","onChange","e","target","mouthful_date","CreatedAt","mouthful_comment_input","Body","buttons","mouthful_reply_button","onClick","Confirmed","replies","mouthful_comment_reply","smallButton","thread","Path","Component","Login","state","onLogin","handleChange","handleSubmit","handleOauthClick","provider","location","event","preventDefault","setRequestHeader","password","login","onSubmit","passwordTitle","mouthful_submit","loginDiv","config","disablePasswordLogin","providersListItems","oauthProviders","mouthful_admin_li","mouthful_admin_oauth_a","mouthful_login","panel_Panel","_extends","assign","i","arguments","source","hasOwnProperty","handleStateChange","stateChange","loaded","authorized","parse","responseText","getUrl","path","origin","index","href","indexOf","substring","Panel","threads","error","showPending","showDeleted","configLoaded","undefined","loadThreads","loadComments","loggedIn","hidePending","fetchConfig","body","author","confirmed","parsedResponse","console","log","componentWillMount","mouthful_container","sort","a","b","t","pendingFilter","showAll","deletedFilter","c","ThreadId","resultDiv","nothing","mouthful_wrapper","mouthful_buttons","mouthful_buttonActive","mouthful_button","HzJC","exports"],"mappings":"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","file":"route-panel.chunk.8ead8.js","sourcesContent":["webpackJsonp([0],{\n\n/***/ \"6Bts\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n\n// EXTERNAL MODULE: ../node_modules/preact/dist/preact.min.js\nvar preact_min = __webpack_require__(\"KM04\");\nvar preact_min_default = /*#__PURE__*/__webpack_require__.n(preact_min);\n\n// EXTERNAL MODULE: ./routes/panel/style.css\nvar style = __webpack_require__(\"HzJC\");\nvar style_default = /*#__PURE__*/__webpack_require__.n(style);\n\n// CONCATENATED MODULE: ./routes/panel/thread.js\n\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nfunction formatDate(d) {\n\tvar dd = new Date(d);\n\treturn dd.toISOString().slice(0, 19).replace(\"T\", \" \");\n}\n\nvar thread_Thread = function (_Component) {\n\t_inherits(Thread, _Component);\n\n\tfunction Thread(props) {\n\t\t_classCallCheck(this, Thread);\n\n\t\tvar _this = _possibleConstructorReturn(this, _Component.call(this, props));\n\n\t\t_this.reload = _this.reload.bind(_this);\n\t\t_this.deleteComment = _this.deleteComment.bind(_this);\n\t\t_this.undoDelete = _this.undoDelete.bind(_this);\n\t\t_this.handleBodyChange = _this.handleBodyChange.bind(_this);\n\t\t_this.handleAuthorChange = _this.handleAuthorChange.bind(_this);\n\t\treturn _this;\n\t}\n\n\tThread.prototype.handleAuthorChange = function handleAuthorChange(id, value) {\n\t\tvar found = this.props.comments.find(function (x) {\n\t\t\treturn x.Id == id;\n\t\t});\n\t\tif (found) {\n\t\t\tthis.props.updateComment(id, null, value, null);\n\t\t}\n\t};\n\n\tThread.prototype.handleBodyChange = function handleBodyChange(id, value) {\n\t\tvar found = this.props.comments.find(function (x) {\n\t\t\treturn x.Id == id;\n\t\t});\n\t\tif (found) {\n\t\t\tthis.props.updateComment(id, value, null, null);\n\t\t}\n\t};\n\n\tThread.prototype.reload = function reload() {\n\t\tthis.props.reload();\n\t};\n\n\tThread.prototype.deleteComment = function deleteComment(commentId, hard) {\n\t\tif (typeof window == \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = this.props.url + \"v1/admin/comments\";\n\t\thttp.open(\"DELETE\", url, true);\n\t\tvar context = this;\n\t\thttp.onreadystatechange = function () {\n\t\t\tif (http.readyState == 4 && http.status == 204) {\n\t\t\t\tvar comments = context.props.comments.filter(function (x) {\n\t\t\t\t\treturn x.Id != commentId;\n\t\t\t\t});\n\t\t\t\tcontext.setState({ comments: comments });\n\t\t\t\tcontext.reload();\n\t\t\t} else if (http.readyState == 4 && http.status == 401) {\n\t\t\t\tcontext.reload();\n\t\t\t} else {\n\t\t\t\tcontext.reload();\n\t\t\t}\n\t\t};\n\t\tif (hard === true) {\n\t\t\thttp.send(JSON.stringify({ CommentId: commentId, Hard: true }));\n\t\t} else {\n\t\t\thttp.send(JSON.stringify({ CommentId: commentId }));\n\t\t}\n\t};\n\n\tThread.prototype.undoDelete = function undoDelete(commentId) {\n\t\tif (typeof window == \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = this.props.url + \"v1/admin/comments/restore\";\n\t\thttp.open(\"POST\", url, true);\n\t\tvar context = this;\n\t\thttp.onreadystatechange = function () {\n\t\t\tif (http.readyState == 4 && http.status == 204) {\n\t\t\t\tvar comments = context.props.comments.filter(function (x) {\n\t\t\t\t\treturn x.Id != commentId;\n\t\t\t\t});\n\t\t\t\tcontext.setState({ comments: comments });\n\t\t\t\tcontext.reload();\n\t\t\t} else if (http.readyState == 4 && http.status == 401) {\n\t\t\t\tcontext.reload();\n\t\t\t} else {\n\t\t\t\tcontext.reload();\n\t\t\t}\n\t\t};\n\t\thttp.send(JSON.stringify({ CommentId: commentId }));\n\t};\n\n\tThread.prototype.render = function render() {\n\t\tvar _this2 = this;\n\n\t\tvar comments = \"\";\n\t\t// this is a terrible hack for showing unconfirmeds\n\t\tif (this.props.comments.filter(function (comment) {\n\t\t\treturn comment.ReplyTo == null && comment.DeletedAt == null;\n\t\t}).length == 0) {\n\t\t\tcomments = this.props.comments.map(function (comment) {\n\t\t\t\treturn Object(preact_min[\"h\"])(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': style_default.a.mouthful_comment, key: \"___comment\" + comment.Id },\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tObject(preact_min[\"h\"])('input', { 'class': style_default.a.mouthful_author_input, type: 'text', value: comment.Author, onChange: function onChange(e) {\n\t\t\t\t\t\t\t\t_this2.handleAuthorChange(comment.Id, e.target.value);\n\t\t\t\t\t\t\t} }),\n\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_date },\n\t\t\t\t\t\t\tformatDate(comment.CreatedAt)\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tObject(preact_min[\"h\"])('textarea', { 'class': style_default.a.mouthful_comment_input, value: comment.Body, onChange: function onChange(e) {\n\t\t\t\t\t\t\t\t_this2.handleBodyChange(comment.Id, e.target.value);\n\t\t\t\t\t\t\t} })\n\t\t\t\t\t),\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': style_default.a.buttons },\n\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.props.updateComment(comment.Id, comment.Body, comment.Author, comment.Confirmed);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Update'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcomment.DeletedAt == null ? Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.deleteComment(comment.Id);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Delete'\n\t\t\t\t\t\t) : Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.undoDelete(comment.Id);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Undo delete'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcomment.Confirmed ? \"\" : Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.props.updateComment(comment.Id, null, null, true);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Confirm'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcomment.DeletedAt != null ? Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.deleteComment(comment.Id, true);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Hard delete'\n\t\t\t\t\t\t) : null\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t});\n\t\t} else {\n\t\t\tcomments = this.props.comments.filter(function (comment) {\n\t\t\t\treturn comment.ReplyTo == null || comment.DeletedAt != null;\n\t\t\t}).map(function (comment) {\n\t\t\t\tvar replies = _this2.props.comments.filter(function (x) {\n\t\t\t\t\treturn x.ReplyTo === comment.Id;\n\t\t\t\t}).map(function (x) {\n\t\t\t\t\treturn Object(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': style_default.a.mouthful_comment_reply, key: \"___comment\" + x.Id },\n\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tObject(preact_min[\"h\"])('input', { 'class': style_default.a.mouthful_author_input, type: 'text', value: x.Author, onChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t_this2.handleAuthorChange(x.Id, e.target.value);\n\t\t\t\t\t\t\t\t} }),\n\t\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_date },\n\t\t\t\t\t\t\t\tformatDate(x.CreatedAt)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t),\n\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tObject(preact_min[\"h\"])('textarea', { 'class': style_default.a.mouthful_comment_input, value: x.Body, onChange: function onChange(e) {\n\t\t\t\t\t\t\t\t\t_this2.handleBodyChange(x.Id, e.target.value);\n\t\t\t\t\t\t\t\t} })\n\t\t\t\t\t\t),\n\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\t\treturn _this2.props.updateComment(x.Id, x.Body, x.Author, x.Confirmed);\n\t\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t\t'Update'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tx.DeletedAt == null ? Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\t\treturn _this2.deleteComment(x.Id);\n\t\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t\t'Delete'\n\t\t\t\t\t\t\t) : Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ 'class': style_default.a.smallButton, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\t\treturn _this2.undoDelete(x.Id);\n\t\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t\t'Undo delete'\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tx.Confirmed ? \"\" : Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\t\treturn _this2.props.updateComment(x.Id, null, null, true);\n\t\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t\t'Confirm'\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});\n\t\t\t\treturn Object(preact_min[\"h\"])(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': style_default.a.mouthful_comment, key: \"___comment\" + comment.Id },\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tObject(preact_min[\"h\"])('input', { 'class': style_default.a.mouthful_author_input, type: 'text', value: comment.Author, onChange: function onChange(e) {\n\t\t\t\t\t\t\t\t_this2.handleAuthorChange(comment.Id, e.target.value);\n\t\t\t\t\t\t\t} }),\n\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'span',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_date },\n\t\t\t\t\t\t\tformatDate(comment.CreatedAt)\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tObject(preact_min[\"h\"])('textarea', { 'class': style_default.a.mouthful_comment_input, value: comment.Body, onChange: function onChange(e) {\n\t\t\t\t\t\t\t\t_this2.handleBodyChange(comment.Id, e.target.value);\n\t\t\t\t\t\t\t} })\n\t\t\t\t\t),\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.props.updateComment(comment.Id, comment.Body, comment.Author, comment.Confirmed);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Update'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcomment.DeletedAt == null ? Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.deleteComment(comment.Id, false);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Delete'\n\t\t\t\t\t\t) : Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.undoDelete(comment.Id);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Undo delete'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcomment.Confirmed ? \"\" : Object(preact_min[\"h\"])(\n\t\t\t\t\t\t\t'div',\n\t\t\t\t\t\t\t{ 'class': style_default.a.mouthful_reply_button, onClick: function onClick() {\n\t\t\t\t\t\t\t\t\treturn _this2.props.updateComment(comment.Id, null, null, true);\n\t\t\t\t\t\t\t\t} },\n\t\t\t\t\t\t\t'Confirm'\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ style: 'margin-left:30px' },\n\t\t\t\t\t\treplies\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t\tvar fullThread = comments.length > 0 ? Object(preact_min[\"h\"])(\n\t\t\t'div',\n\t\t\t{ 'class': 'thread' },\n\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t'h2',\n\t\t\t\tnull,\n\t\t\t\tthis.props.thread.Path\n\t\t\t),\n\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': 'comments' },\n\t\t\t\tcomments\n\t\t\t)\n\t\t) : null;\n\t\treturn fullThread;\n\t};\n\n\treturn Thread;\n}(preact_min[\"Component\"]);\n\n\n// CONCATENATED MODULE: ./routes/panel/login.js\n\n\nfunction login__classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction login__possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction login__inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\nvar login_Login = function (_Component) {\n\tlogin__inherits(Login, _Component);\n\n\tfunction Login(props) {\n\t\tlogin__classCallCheck(this, Login);\n\n\t\tvar _this = login__possibleConstructorReturn(this, _Component.call(this, props));\n\n\t\t_this.state = { value: '' };\n\t\t_this.onLogin = props.onLogin;\n\n\t\t_this.handleChange = _this.handleChange.bind(_this);\n\t\t_this.handleSubmit = _this.handleSubmit.bind(_this);\n\t\t_this.handleOauthClick = _this.handleOauthClick.bind(_this);\n\t\treturn _this;\n\t}\n\n\tLogin.prototype.handleOauthClick = function handleOauthClick(provider) {\n\t\twindow.location.replace(this.props.url + \"v1/oauth/auth/\" + provider);\n\t};\n\n\tLogin.prototype.handleChange = function handleChange(event) {\n\t\tthis.setState({ value: event.target.value });\n\t};\n\n\tLogin.prototype.handleSubmit = function handleSubmit(event) {\n\t\tvar context = this;\n\n\t\tevent.preventDefault();\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = this.props.url + \"v1/admin/login\";\n\t\thttp.open(\"POST\", url, true);\n\n\t\t//Send the proper header information along with the request\n\t\thttp.setRequestHeader(\"Content-type\", \"application/json\");\n\t\thttp.onreadystatechange = function () {\n\t\t\t//Call a function when the state changes.\n\t\t\tif (http.readyState == 4 && http.status == 204) {\n\t\t\t\tcontext.onLogin();\n\t\t\t}\n\t\t};\n\t\thttp.send(JSON.stringify({ password: context.state.value }));\n\t};\n\n\tLogin.prototype.render = function render() {\n\t\tvar _this2 = this;\n\n\t\tvar login = Object(preact_min[\"h\"])(\n\t\t\t'form',\n\t\t\t{ onSubmit: this.handleSubmit },\n\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t'label',\n\t\t\t\t{ 'class': style_default.a.passwordTitle },\n\t\t\t\t'Password:'\n\t\t\t),\n\t\t\tObject(preact_min[\"h\"])('input', { type: 'password', value: this.state.value, onChange: this.handleChange }),\n\t\t\tObject(preact_min[\"h\"])('input', { 'class': style_default.a.mouthful_submit, type: 'submit', value: 'Submit' })\n\t\t);\n\t\tvar loginDiv = this.props.config.disablePasswordLogin ? null : login;\n\t\tvar providersListItems = this.props.config.oauthProviders && this.props.config.oauthProviders.length > 0 ? this.props.config.oauthProviders.map(function (x) {\n\t\t\treturn Object(preact_min[\"h\"])(\n\t\t\t\t'li',\n\t\t\t\t{ 'class': style_default.a.mouthful_admin_li },\n\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t'a',\n\t\t\t\t\t{ 'class': style_default.a.mouthful_admin_oauth_a, onClick: function onClick() {\n\t\t\t\t\t\t\treturn _this2.handleOauthClick(x);\n\t\t\t\t\t\t} },\n\t\t\t\t\t'Log in with ',\n\t\t\t\t\tx\n\t\t\t\t)\n\t\t\t);\n\t\t}) : null;\n\t\tvar oauthProviders = Object(preact_min[\"h\"])(\n\t\t\t'div',\n\t\t\tnull,\n\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t'ul',\n\t\t\t\tnull,\n\t\t\t\tprovidersListItems\n\t\t\t)\n\t\t);\n\t\treturn Object(preact_min[\"h\"])(\n\t\t\t'div',\n\t\t\t{ 'class': style_default.a.mouthful_login },\n\t\t\tloginDiv,\n\t\t\toauthProviders\n\t\t);\n\t};\n\n\treturn Login;\n}(preact_min[\"Component\"]);\n\n\n// CONCATENATED MODULE: ../node_modules/babel-loader/lib??ref--0!./routes/panel/index.js\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return panel_Panel; });\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\n\n\nfunction panel__classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction panel__possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction panel__inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\n\n\n\n\nvar handleStateChange = function handleStateChange(http, context, key) {\n\tif (http.readyState == 4 && http.status == 200) {\n\t\tvar stateChange = { loaded: true, authorized: true };\n\t\tstateChange[key] = JSON.parse(http.responseText);\n\t\tcontext.setState(stateChange);\n\t} else if (http.readyState == 4 && http.status == 401) {\n\t\tcontext.setState({ authorized: false, loaded: true });\n\t}\n};\nvar getUrl = function getUrl(state, window) {\n\tif (state.path) {\n\t\treturn window.location.origin + state.path;\n\t}\n\tvar index = window.location.href.indexOf(\"v1/oauth\");\n\tif (index > 0) {\n\t\treturn window.location.href.substring(0, index);\n\t}\n\treturn window.location.href;\n};\n\nvar panel_Panel = function (_Component) {\n\tpanel__inherits(Panel, _Component);\n\n\tfunction Panel() {\n\t\tpanel__classCallCheck(this, Panel);\n\n\t\tvar _this = panel__possibleConstructorReturn(this, _Component.call(this));\n\n\t\t_this.state = { threads: [], comments: [], error: false, authorized: false, loaded: false, showPending: true, showDeleted: false, configLoaded: false, config: {}, path: undefined };\n\t\t_this.loadThreads = _this.loadThreads.bind(_this);\n\t\t_this.loadComments = _this.loadComments.bind(_this);\n\t\t_this.loggedIn = _this.loggedIn.bind(_this);\n\t\t_this.showPending = _this.showPending.bind(_this);\n\t\t_this.hidePending = _this.hidePending.bind(_this);\n\t\t_this.reload = _this.reload.bind(_this);\n\t\t_this.showDeleted = _this.showDeleted.bind(_this);\n\t\t_this.updateComment = _this.updateComment.bind(_this);\n\t\t_this.fetchConfig = _this.fetchConfig.bind(_this);\n\t\treturn _this;\n\t}\n\n\tPanel.prototype.showPending = function showPending() {\n\t\tthis.setState({ showPending: true });\n\t\tthis.setState({ showDeleted: false });\n\t};\n\n\tPanel.prototype.hidePending = function hidePending() {\n\t\tthis.setState({ showPending: false });\n\t\tthis.setState({ showDeleted: false });\n\t};\n\n\tPanel.prototype.showDeleted = function showDeleted() {\n\t\tthis.setState({ showPending: false });\n\t\tthis.setState({ showDeleted: true });\n\t};\n\n\tPanel.prototype.loadThreads = function loadThreads(context) {\n\t\tif (typeof window == \"undefined\") {\n\t\t\treturn;\n\t\t}\n\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = getUrl(this.state, window) + \"v1/admin/threads\";\n\t\thttp.open(\"GET\", url, true);\n\n\t\thttp.onreadystatechange = function () {\n\t\t\thandleStateChange(http, context, \"threads\");\n\t\t};\n\t\thttp.send();\n\t};\n\n\tPanel.prototype.loadComments = function loadComments(context) {\n\t\tif (typeof window == \"undefined\") {\n\t\t\treturn;\n\t\t}\n\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = getUrl(this.state, window) + \"v1/admin/comments/all\";\n\t\thttp.open(\"GET\", url, true);\n\n\t\thttp.onreadystatechange = function () {\n\t\t\thandleStateChange(http, context, \"comments\");\n\t\t};\n\n\t\thttp.send();\n\t};\n\n\tPanel.prototype.updateComment = function updateComment(commentId, body, author, confirmed) {\n\t\tif (typeof window == \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = getUrl(this.state, window) + \"v1/admin/comments\";\n\t\thttp.open(\"PATCH\", url, true);\n\t\tvar context = this;\n\t\thttp.onreadystatechange = function () {\n\t\t\tif (http.readyState == 4 && http.status == 204) {\n\t\t\t\tcontext.reload();\n\t\t\t} else if (http.readyState == 4 && http.status == 401) {\n\t\t\t\tcontext.reload();\n\t\t\t} else {\n\t\t\t\tcontext.reload();\n\t\t\t}\n\t\t};\n\t\thttp.send(JSON.stringify({ CommentId: commentId, Body: body, Author: author, Confirmed: confirmed }));\n\t};\n\n\tPanel.prototype.loggedIn = function loggedIn() {\n\t\tthis.setState({ authorized: true });\n\t\tthis.setState({ loaded: false });\n\t};\n\n\tPanel.prototype.fetchConfig = function fetchConfig() {\n\t\tif (typeof window == \"undefined\") {\n\t\t\treturn;\n\t\t}\n\t\tvar context = this;\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = getUrl(this.state, window) + \"v1/admin/config\";\n\t\thttp.open(\"GET\", url, true);\n\t\thttp.onreadystatechange = function () {\n\t\t\tif (http.readyState != 4) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (http.status == 200) {\n\t\t\t\tvar parsedResponse = JSON.parse(http.responseText);\n\t\t\t\tcontext.setState({ configLoaded: true, config: _extends(context.state.config, parsedResponse), path: parsedResponse.path });\n\t\t\t} else {\n\t\t\t\tcontext.setState({ configLoaded: true, error: true });\n\t\t\t\tconsole.log(\"error while fetching config\");\n\t\t\t}\n\t\t};\n\t\thttp.send();\n\t};\n\n\tPanel.prototype.reload = function reload() {\n\t\tthis.setState({ loaded: false, threads: [], comments: [] });\n\t};\n\n\tPanel.prototype.componentWillMount = function componentWillMount() {\n\t\tthis.loggedIn();\n\t\tif (!this.state.configLoaded) {\n\t\t\tthis.fetchConfig();\n\t\t}\n\t};\n\n\tPanel.prototype.render = function render() {\n\t\tvar _this2 = this;\n\n\t\tif (!this.state.authorized) {\n\t\t\tvar url = getUrl(this.state, window);\n\t\t\treturn Object(preact_min[\"h\"])(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': style_default.a.mouthful_container },\n\t\t\t\tObject(preact_min[\"h\"])(login_Login, { url: url, onLogin: this.loggedIn, config: this.state.config })\n\t\t\t);\n\t\t}\n\t\tif (!this.state.loaded) {\n\t\t\tthis.loadThreads(this);\n\t\t\tthis.loadComments(this);\n\t\t}\n\t\tif (this.state.error == true) {\n\t\t\treturn Object(preact_min[\"h\"])(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': style_default.a.mouthful_container },\n\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': style_default.a.mouthful_login },\n\t\t\t\t\t'There was an error while fetching the config'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\t// if we have no threads or comments\n\t\tif (!(this.state.threads && this.state.comments && this.state.threads.length && this.state.comments.length)) {\n\t\t\treturn Object(preact_min[\"h\"])(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': style_default.a.mouthful_container },\n\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': style_default.a.mouthful_login },\n\t\t\t\t\t'No comments yet!'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tvar threads = this.state.threads.sort(function (a, b) {\n\t\t\ta = new Date(a.CreatedAt);\n\t\t\tb = new Date(b.CreatedAt);\n\t\t\treturn a > b ? -1 : a < b ? 1 : 0;\n\t\t}).map(function (t) {\n\t\t\tvar comments = _this2.state.comments;\n\t\t\tvar pendingFilter = function pendingFilter(x) {\n\t\t\t\treturn !x.Confirmed && x.DeletedAt == null;\n\t\t\t};\n\t\t\tvar showAll = function showAll(x) {\n\t\t\t\treturn x.DeletedAt == null;\n\t\t\t};\n\t\t\tvar deletedFilter = function deletedFilter(x) {\n\t\t\t\treturn x.DeletedAt != null;\n\t\t\t};\n\n\t\t\tvar c = comments.filter(function (x) {\n\t\t\t\treturn x.ThreadId == t.Id;\n\t\t\t});\n\t\t\tvar filter = _this2.state.showPending ? pendingFilter : showAll;\n\t\t\tfilter = _this2.state.showDeleted ? deletedFilter : filter;\n\n\t\t\tc = c.filter(filter);\n\t\t\tif (c.length != 0) {\n\t\t\t\treturn Object(preact_min[\"h\"])(thread_Thread, { url: getUrl(_this2.state, window), key: \"___thread\" + t.Id, thread: t, comments: c, reload: _this2.reload, updateComment: _this2.updateComment });\n\t\t\t}\n\t\t\treturn null;\n\t\t});\n\t\tvar resultDiv = threads.filter(function (x) {\n\t\t\treturn x != null;\n\t\t}).length > 0 ? threads : Object(preact_min[\"h\"])(\n\t\t\t'div',\n\t\t\t{ 'class': style_default.a.nothing },\n\t\t\t'Nothing to display'\n\t\t);\n\t\treturn Object(preact_min[\"h\"])(\n\t\t\t'div',\n\t\t\t{ 'class': style_default.a.mouthful_container },\n\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t'div',\n\t\t\t\t{ 'class': style_default.a.mouthful_wrapper },\n\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t'div',\n\t\t\t\t\t{ 'class': style_default.a.mouthful_buttons },\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': this.state.showPending ? style_default.a.mouthful_buttonActive : style_default.a.mouthful_button, onClick: this.showPending },\n\t\t\t\t\t\t'Show unconfirmed'\n\t\t\t\t\t),\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': this.state.showPending == false && this.state.showDeleted == false ? style_default.a.mouthful_buttonActive : style_default.a.mouthful_button, onClick: this.hidePending },\n\t\t\t\t\t\t'Show all'\n\t\t\t\t\t),\n\t\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t\t'div',\n\t\t\t\t\t\t{ 'class': this.state.showDeleted ? style_default.a.mouthful_buttonActive : style_default.a.mouthful_button, onClick: this.showDeleted },\n\t\t\t\t\t\t'Show deleted'\n\t\t\t\t\t)\n\t\t\t\t),\n\t\t\t\tObject(preact_min[\"h\"])(\n\t\t\t\t\t'div',\n\t\t\t\t\tnull,\n\t\t\t\t\tresultDiv\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\t};\n\n\treturn Panel;\n}(preact_min[\"Component\"]);\n\n\n\n/***/ }),\n\n/***/ \"HzJC\":\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\nmodule.exports = {\"mouthful_wrapper\":\"mouthful_wrapper__3WEzv\",\"mouthful_login\":\"mouthful_login__fadGC\",\"mouthful_button\":\"mouthful_button__E2hr2\",\"mouthful_buttonActive\":\"mouthful_buttonActive__1vLuv\",\"mouthful_buttons\":\"mouthful_buttons__bbuNt\",\"mouthful_container\":\"mouthful_container__1eO2q\",\"mouthful_date\":\"mouthful_date__2Mv2_\",\"nothing\":\"nothing__3OSja\",\"passwordTitle\":\"passwordTitle__229oE\",\"mouthful_submit\":\"mouthful_submit__1oO5q\",\"mouthful_reply_button\":\"mouthful_reply_button__MesQM\",\"mouthful_moderation\":\"mouthful_moderation__2FkCO\",\"mouthful_comment\":\"mouthful_comment__2hEiv\",\"mouthful_comment_reply\":\"mouthful_comment_reply__3ZjGX\",\"mouthful_author\":\"mouthful_author__NHLrx\",\"mouthful_comment_body\":\"mouthful_comment_body__y4ISK\",\"mouthful_form\":\"mouthful_form__xH6p9\",\"mouthful_form_invisible\":\"mouthful_form_invisible__85EZm\",\"mouthful_author_input\":\"mouthful_author_input__wgG2y\",\"mouthful_comment_input\":\"mouthful_comment_input__2YJ0O\",\"mouthful_admin_li\":\"mouthful_admin_li__MWHSz\",\"mouthful_admin_oauth_a\":\"mouthful_admin_oauth_a__2rCPY\"};\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// route-panel.chunk.8ead8.js","import { h, Component } from 'preact';\nimport style from './style';\n\n\nfunction formatDate(d) {\n\tvar dd = new Date(d)\n\treturn dd.toISOString().slice(0, 19).replace(\"T\", \" \")\n}\n\nexport default class Thread extends Component {\n\tconstructor(props) {\n\t\tsuper(props);\n\t\tthis.reload = this.reload.bind(this)\n\t\tthis.deleteComment = this.deleteComment.bind(this)\n\t\tthis.undoDelete = this.undoDelete.bind(this)\n\t\tthis.handleBodyChange = this.handleBodyChange.bind(this);\n\t\tthis.handleAuthorChange = this.handleAuthorChange.bind(this);\n\t}\n\thandleAuthorChange(id, value) {\n\t\tconst found = this.props.comments.find(x => x.Id == id)\n\t\tif (found) {\n\t\t\tthis.props.updateComment(id, null, value, null)\n\t\t}\n\t}\n\thandleBodyChange(id, value) {\n\t\tconst found = this.props.comments.find(x => x.Id == id)\n\t\tif (found) {\n\t\t\tthis.props.updateComment(id, value, null, null)\n\t\t}\n\t}\n\treload() {\n\t\tthis.props.reload()\n\t}\n\tdeleteComment(commentId, hard) {\n\t\tif (typeof window == \"undefined\") { return }\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = this.props.url + \"v1/admin/comments\";\n\t\thttp.open(\"DELETE\", url, true);\n\t\tvar context = this;\n\t\thttp.onreadystatechange = function () {\n\t\t\tif (http.readyState == 4 && http.status == 204) {\n\t\t\t\tvar comments = context.props.comments.filter(x => x.Id != commentId)\n\t\t\t\tcontext.setState({ comments })\n\t\t\t\tcontext.reload()\n\t\t\t} else if (http.readyState == 4 && http.status == 401) {\n\t\t\t\tcontext.reload()\n\t\t\t} else {\n\t\t\t\tcontext.reload()\n\t\t\t}\n\t\t}\n\t\tif (hard === true) {\n\t\t\thttp.send(JSON.stringify({ CommentId: commentId, Hard: true }))\n\t\t} else {\n\t\t\thttp.send(JSON.stringify({ CommentId: commentId }))\n\t\t}\n\t}\n\tundoDelete(commentId) {\n\t\tif (typeof window == \"undefined\") { return }\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = this.props.url + \"v1/admin/comments/restore\";\n\t\thttp.open(\"POST\", url, true);\n\t\tvar context = this;\n\t\thttp.onreadystatechange = function () {\n\t\t\tif (http.readyState == 4 && http.status == 204) {\n\t\t\t\tvar comments = context.props.comments.filter(x => x.Id != commentId)\n\t\t\t\tcontext.setState({ comments })\n\t\t\t\tcontext.reload()\n\t\t\t} else if (http.readyState == 4 && http.status == 401) {\n\t\t\t\tcontext.reload()\n\t\t\t} else {\n\t\t\t\tcontext.reload()\n\t\t\t}\n\t\t}\n\t\thttp.send(JSON.stringify({ CommentId: commentId }))\n\t}\n\n\n\trender() {\n\t\tlet comments = \"\"\n\t\t// this is a terrible hack for showing unconfirmeds\n\t\tif (this.props.comments.filter(comment => comment.ReplyTo == null && comment.DeletedAt == null).length == 0) {\n\t\t\tcomments = this.props.comments.map(comment => {\n\t\t\t\treturn
\n\t\t\t\t\t
{\n\t\t\t\t\t\tthis.handleAuthorChange(comment.Id, e.target.value)\n\t\t\t\t\t}}>\n\t\t\t\t\t{formatDate(comment.CreatedAt)}\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
this.props.updateComment(comment.Id, comment.Body, comment.Author, comment.Confirmed)}>Update
\n\t\t\t\t\t\t{comment.DeletedAt == null ?
this.deleteComment(comment.Id)}>Delete
:
this.undoDelete(comment.Id)}>Undo delete
}\n\t\t\t\t\t\t{comment.Confirmed ? \"\" :
this.props.updateComment(comment.Id, null, null, true)}>Confirm
}\n\t\t\t\t\t\t{comment.DeletedAt != null ?
this.deleteComment(comment.Id, true)}>Hard delete
: null}\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
;\n\t\t\t})\n\t\t} else {\n\t\t\tcomments = this.props.comments.filter(comment => comment.ReplyTo == null || comment.DeletedAt != null).map(comment => {\n\t\t\t\tvar replies = this.props.comments.filter(x => x.ReplyTo === comment.Id).map(x => {\n\t\t\t\t\treturn
\n\t\t\t\t\t\t
{\n\t\t\t\t\t\t\tthis.handleAuthorChange(x.Id, e.target.value)\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t{formatDate(x.CreatedAt)}\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
this.props.updateComment(x.Id, x.Body, x.Author, x.Confirmed)}>Update
\n\t\t\t\t\t\t\t{x.DeletedAt == null ?
this.deleteComment(x.Id)}>Delete
:
this.undoDelete(x.Id)}>Undo delete
}\n\t\t\t\t\t\t\t{x.Confirmed ? \"\" :
this.props.updateComment(x.Id, null, null, true)}>Confirm
}\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t});\n\t\t\t\treturn
\n\t\t\t\t\t
{\n\t\t\t\t\t\tthis.handleAuthorChange(comment.Id, e.target.value)\n\t\t\t\t\t}}>\n\t\t\t\t\t{formatDate(comment.CreatedAt)}\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
this.props.updateComment(comment.Id, comment.Body, comment.Author, comment.Confirmed)}>Update
\n\t\t\t\t\t\t{comment.DeletedAt == null ?
this.deleteComment(comment.Id, false)}>Delete
:
this.undoDelete(comment.Id)}>Undo delete
}\n\t\t\t\t\t\t{comment.Confirmed ? \"\" :
this.props.updateComment(comment.Id, null, null, true)}>Confirm
}\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t{replies}\n\t\t\t\t\t
\n\t\t\t\t
;\n\t\t\t})\n\t\t}\n\t\tconst fullThread = comments.length > 0 ? (
\n\t\t\t

{this.props.thread.Path}

\n\t\t\t
\n\t\t\t\t{comments}\n\t\t\t
\n\t\t
) : null\n\t\treturn fullThread\n\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./routes/panel/thread.js","import { h, Component } from 'preact';\nimport style from './style';\n\n\nexport default class Login extends Component {\n\tconstructor(props) {\n super(props);\n\t\tthis.state = { value: '' };\n this.onLogin = props.onLogin;\n \n\t\tthis.handleChange = this.handleChange.bind(this);\n\t\tthis.handleSubmit = this.handleSubmit.bind(this);\n\t\tthis.handleOauthClick = this.handleOauthClick.bind(this);\n\t}\n\thandleOauthClick(provider) {\n\t\twindow.location.replace(this.props.url + \"v1/oauth/auth/\" + provider);\n\t}\n\thandleChange(event) {\n\t\tthis.setState({ value: event.target.value });\n\t}\n\n\thandleSubmit(event) {\n\t\tvar context = this;\n \n\t\tevent.preventDefault();\t\t\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = this.props.url + \"v1/admin/login\";\n\t\thttp.open(\"POST\", url, true);\n\t\t\n\t\t//Send the proper header information along with the request\n\t\thttp.setRequestHeader(\"Content-type\", \"application/json\");\n\t\thttp.onreadystatechange = function() {//Call a function when the state changes.\n\t\t\tif(http.readyState == 4 && http.status == 204) {\n context.onLogin();\n\t\t\t} \n\t\t}\n\t\thttp.send(JSON.stringify({password: context.state.value}));\n\t}\n\trender() {\n\t\tvar login =
\n\t\t\n\t\t\n\t\t\n\t\t
\n\t\tvar loginDiv = this.props.config.disablePasswordLogin ? null : login;\n\t\tvar providersListItems = this.props.config.oauthProviders && this.props.config.oauthProviders.length > 0 \n\t\t? this.props.config.oauthProviders.map(x =>
  • this.handleOauthClick(x)}>Log in with {x}
  • )\n\t\t: null\n\t\tvar oauthProviders =
    \n\t\t\t\n\t\t
    \n\t\treturn (\n\t\t\t
    \n\t\t\t\t{loginDiv}\n\t\t\t\t{oauthProviders}\n\t\t\t
    \n\t\t);\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./routes/panel/login.js","import { h, Component } from 'preact';\nimport style from './style';\nimport Thread from './thread';\nimport Login from './login';\n\nconst handleStateChange = (http, context, key) => {\n\tif (http.readyState == 4 && http.status == 200) {\n\t\tvar stateChange = { loaded: true, authorized: true }\n\t\tstateChange[key] = JSON.parse(http.responseText)\n\t\tcontext.setState(stateChange)\n\t} else if (http.readyState == 4 && http.status == 401) {\n\t\tcontext.setState({ authorized: false, loaded: true })\n\t}\n}\nconst getUrl = (state, window) => {\n\tif (state.path) {\n\t\treturn window.location.origin + state.path\n\t} \n\tlet index = window.location.href.indexOf(\"v1/oauth\")\n\tif (index > 0) {\n\t\treturn window.location.href.substring(0, index)\n\t}\n\treturn window.location.href\n}\nexport default class Panel extends Component {\n\tconstructor() {\n\t\tsuper();\n\t\tthis.state = { threads: [], comments: [], error: false, authorized: false, loaded: false, showPending: true, showDeleted: false, configLoaded: false, config: {}, path:undefined };\n\t\tthis.loadThreads = this.loadThreads.bind(this);\n\t\tthis.loadComments = this.loadComments.bind(this);\n\t\tthis.loggedIn = this.loggedIn.bind(this);\n\t\tthis.showPending = this.showPending.bind(this);\n\t\tthis.hidePending = this.hidePending.bind(this);\n\t\tthis.reload = this.reload.bind(this);\n\t\tthis.showDeleted = this.showDeleted.bind(this);\n\t\tthis.updateComment = this.updateComment.bind(this);\n\t\tthis.fetchConfig = this.fetchConfig.bind(this);\n\t}\n\n\tshowPending() {\n\t\tthis.setState({ showPending: true })\n\t\tthis.setState({ showDeleted: false})\n\t}\n\n\thidePending() {\n\t\tthis.setState({ showPending: false })\n\t\tthis.setState({ showDeleted: false })\n\t}\n\n\tshowDeleted() {\n\t\tthis.setState({ showPending: false })\n\t\tthis.setState({ showDeleted: true })\n\t}\n\n\tloadThreads(context) {\n\t\tif (typeof window == \"undefined\") { return }\n\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = getUrl(this.state, window) + \"v1/admin/threads\";\n\t\thttp.open(\"GET\", url, true);\n\n\t\thttp.onreadystatechange = function () {\n\t\t\thandleStateChange(http, context, \"threads\")\n\t\t}\n\t\thttp.send()\n\t}\n\n\tloadComments(context) {\n\t\tif (typeof window == \"undefined\") { return }\n\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = getUrl(this.state, window) + \"v1/admin/comments/all\";\n\t\thttp.open(\"GET\", url, true);\n\n\t\thttp.onreadystatechange = function () {\n\t\t\thandleStateChange(http, context, \"comments\")\n\t\t}\n\n\t\thttp.send()\n\t}\n\n\tupdateComment(commentId, body, author, confirmed) {\n\t\tif (typeof window == \"undefined\") { return }\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = getUrl(this.state, window) + \"v1/admin/comments\";\n\t\thttp.open(\"PATCH\", url, true);\n\t\tvar context = this;\n\t\thttp.onreadystatechange = function () {\n\t\t\tif (http.readyState == 4 && http.status == 204) {\n\t\t\t\tcontext.reload()\n\t\t\t} else if (http.readyState == 4 && http.status == 401) {\n\t\t\t\tcontext.reload()\n\t\t\t} else {\n\t\t\t\tcontext.reload()\n\t\t\t}\n\t\t}\n\t\thttp.send(JSON.stringify({ CommentId: commentId, Body: body, Author: author, Confirmed: confirmed }))\n\t}\n\t\n\n\tloggedIn() {\n\t\tthis.setState({ authorized: true })\n\t\tthis.setState({ loaded: false })\n\t}\n\tfetchConfig() {\n\t\tif (typeof window == \"undefined\") { return }\n\t\tvar context = this;\n\t\tvar http = new XMLHttpRequest();\n\t\tvar url = getUrl(this.state, window) + \"v1/admin/config\";\n\t\thttp.open(\"GET\", url, true);\n\t\thttp.onreadystatechange = function () {\n\t\t if (http.readyState != 4) {\n\t\t\treturn\n\t\t }\n\t\t if (http.status == 200) {\n\t\t\tvar parsedResponse = JSON.parse(http.responseText)\n\t\t\tcontext.setState({ configLoaded: true, config: Object.assign(context.state.config, parsedResponse), path: parsedResponse.path })\n\t\t } else {\n\t\t\tcontext.setState({ configLoaded: true, error: true })\n\t\t\tconsole.log(\"error while fetching config\");\n\t\t }\n\t\t}\n\t\thttp.send()\n\t}\n\treload() {\n\t\tthis.setState({ loaded: false, threads: [], comments: [] })\n\t}\n\tcomponentWillMount() {\n\t\tthis.loggedIn();\n\t\tif (!this.state.configLoaded) {\n\t\t\tthis.fetchConfig()\n\t\t}\n\t}\n\trender() {\n\t\tif (!this.state.authorized) {\n\t\t\tvar url = getUrl(this.state, window)\n\t\t\treturn (
    \n\t\t\t\n\t\t\t
    )\n\t\t}\n\t\tif (!this.state.loaded) {\n\t\t\tthis.loadThreads(this)\n\t\t\tthis.loadComments(this)\n\t\t}\n\t\tif (this.state.error == true) {\n\t\t\treturn
    There was an error while fetching the config
    \n\t\t}\n\t\t// if we have no threads or comments\n\t\tif (!(this.state.threads && this.state.comments && this.state.threads.length && this.state.comments.length)) {\n\t\t\treturn
    No comments yet!
    \n\t\t}\n\t\tvar threads = this.state.threads.sort((a, b) => {\n\t\t\ta = new Date(a.CreatedAt);\n\t\t\tb = new Date(b.CreatedAt);\n\t\t\treturn a>b ? -1 : a {\n\t\t\tvar comments = this.state.comments\n\t\t\tconst pendingFilter = x => {\n\t\t\t\treturn !x.Confirmed && x.DeletedAt == null\n\t\t\t}\n\t\t\tconst showAll = x => {\n\t\t\t\treturn x.DeletedAt == null\n\t\t\t}\n\t\t\tconst deletedFilter = x => {\n\t\t\t\treturn x.DeletedAt != null\n\t\t\t}\n\t\t\t\n\t\t\tvar c = comments.filter(x => {\n\t\t\t\treturn x.ThreadId == t.Id\n\t\t\t})\n\t\t\tlet filter = this.state.showPending ? pendingFilter : showAll\n\t\t\tfilter = this.state.showDeleted ? deletedFilter : filter\n\n\t\t\tc = c.filter(filter)\n\t\t\tif (c.length != 0) {\n\t\t\t\treturn \n\t\t\t}\n\t\t\treturn null;\n\t\t})\n\t\tvar resultDiv = threads.filter(x => x != null).length > 0 ? threads :
    Nothing to display
    \n\t\treturn (\n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t
    Show unconfirmed
    \n\t\t\t\t\t
    Show all
    \n\t\t\t\t\t
    Show deleted
    \n\t\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t{resultDiv}\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t);\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./routes/panel/index.js","// removed by extract-text-webpack-plugin\nmodule.exports = {\"mouthful_wrapper\":\"mouthful_wrapper__3WEzv\",\"mouthful_login\":\"mouthful_login__fadGC\",\"mouthful_button\":\"mouthful_button__E2hr2\",\"mouthful_buttonActive\":\"mouthful_buttonActive__1vLuv\",\"mouthful_buttons\":\"mouthful_buttons__bbuNt\",\"mouthful_container\":\"mouthful_container__1eO2q\",\"mouthful_date\":\"mouthful_date__2Mv2_\",\"nothing\":\"nothing__3OSja\",\"passwordTitle\":\"passwordTitle__229oE\",\"mouthful_submit\":\"mouthful_submit__1oO5q\",\"mouthful_reply_button\":\"mouthful_reply_button__MesQM\",\"mouthful_moderation\":\"mouthful_moderation__2FkCO\",\"mouthful_comment\":\"mouthful_comment__2hEiv\",\"mouthful_comment_reply\":\"mouthful_comment_reply__3ZjGX\",\"mouthful_author\":\"mouthful_author__NHLrx\",\"mouthful_comment_body\":\"mouthful_comment_body__y4ISK\",\"mouthful_form\":\"mouthful_form__xH6p9\",\"mouthful_form_invisible\":\"mouthful_form_invisible__85EZm\",\"mouthful_author_input\":\"mouthful_author_input__wgG2y\",\"mouthful_comment_input\":\"mouthful_comment_input__2YJ0O\",\"mouthful_admin_li\":\"mouthful_admin_li__MWHSz\",\"mouthful_admin_oauth_a\":\"mouthful_admin_oauth_a__2rCPY\"};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./routes/panel/style.css\n// module id = HzJC\n// module chunks = 0"],"sourceRoot":""}