const m = require('mithril') const ApiArticle = require('../api/article.p') const Authentication = require('../authentication') const Fileinfo = require('../widgets/fileinfo') const Article = { oninit: function(vnode) { this.error = '' this.loading = false this.showLoading = null this.data = { article: null, files: [], } this.showcomments = false if (window.__nfpdata) { this.path = m.route.param('id') this.data.article = window.__nfpdata window.__nfpdata = null } else { this.fetchArticle(vnode) } }, onbeforeupdate: function(vnode) { if (this.path !== m.route.param('id')) { this.fetchArticle(vnode) } }, fetchArticle: function(vnode) { this.error = '' this.path = m.route.param('id') this.showcomments = false if (this.showLoading) { clearTimeout(this.showLoading) } if (this.data.article) { this.showLoading = setTimeout(() => { this.showLoading = null this.loading = true m.redraw() }, 150) } else { this.loading = true } ApiArticle.getArticle(this.path) .then((result) => { this.data = result if (!this.data.article) { this.error = 'Article not found' } }, (err) => { this.error = err.message }) .then(() => { clearTimeout(this.showLoading) this.showLoading = null this.loading = false m.redraw() }) }, view: function(vnode) { var deviceWidth = window.innerWidth var imagePath = '' if (this.data.article && this.data.article.media) { var pixelRatio = window.devicePixelRatio || 1 if ((deviceWidth < 800 && pixelRatio <= 1) || (deviceWidth < 600 && pixelRatio > 1)) { imagePath = this.data.article.media.medium_url } else { imagePath = this.data.article.media.large_url } } return ( this.loading ? m('article.article', m('div.loading-spinner')) : this.error ? m('div.error-wrapper', m('div.error', { onclick: function() { vnode.state.error = '' vnode.state.fetchArticle(vnode) }, }, 'Article error: ' + this.error)) : m('article.article', [ this.data.article.page_path ? m('div.goback', ['« ', m(m.route.Link, { href: '/page/' + this.data.article.page_path }, this.data.article.page_name)]) : null, m('header', m('h1', this.data.article.name)), m('.fr-view', [ this.data.article.media ? m('a.cover', { rel: 'noopener', href: this.data.article.media.link, }, m('img', { src: imagePath, alt: 'Cover image for ' + this.data.article.name })) : null, this.data.article.content ? m.trust(this.data.article.content) : null, this.data.files.map(function(file) { return m(Fileinfo, { file: file }) }), m('div.entrymeta', [ 'Posted ', this.data.article.page_path ? [ 'in', m(m.route.Link, { href: '/page/' + this.data.article.page_path }, this.data.article.page_name) ] : '', 'at ' + (this.data.article.publish_at.replace('T', ' ').split('.')[0]).substr(0, 16), ' by ' + (this.data.article.admin_name || 'Admin'), ]), ]), Authentication.currentUser ? m('div.admin-actions', [ m('span', 'Admin controls:'), m(m.route.Link, { href: '/admin/articles/' + this.data.article.path }, 'Edit article'), ]) : null, this.showcomments ? m('div.commentcontainer', [ m('div#disqus_thread', { oncreate: function() { let fullhost = window.location.protocol + '//' + window.location.host /*eslint-disable */ window.disqus_config = function () { this.page.url = fullhost + '/article/' + vnode.state.article.path this.page.identifier = 'article-' + vnode.state.article.id }; (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://nfp-moe.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })() /*eslint-enable */ }}, m('div.loading-spinner')), ]) : m('button.opencomments', { onclick: function() { vnode.state.showcomments = true }, }, 'Open comment discussion'), ]) ) }, } module.exports = Article /*
*/