176 lines
5.8 KiB
JavaScript
176 lines
5.8 KiB
JavaScript
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
|
|
|
|
/*
|
|
<div id="disqus_thread"></div>
|
|
<script>
|
|
|
|
/**
|
|
* RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
|
|
* LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/
|
|
/*
|
|
var disqus_config = function () {
|
|
this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable
|
|
this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
|
|
};
|
|
/
|
|
(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);
|
|
})();
|
|
</script>
|
|
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
|
*/
|