Jonatan Nilsson
6565409e52
nfp_moe: Complete re-thinking of all loading. Smarter loading and lighter site. Better user experience among other things.
169 lines
4.8 KiB
JavaScript
169 lines
4.8 KiB
JavaScript
const m = require('mithril')
|
|
const Article = require('./article')
|
|
const api = require('./api')
|
|
const media = require('./media')
|
|
const NotFoundView = require('./site_404')
|
|
|
|
window.LoadComments = false
|
|
window.HyvorLoaded = false
|
|
window.HYVOR_TALK_WEBSITE = 7544
|
|
|
|
const SiteArticle = {
|
|
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 = window.__nfpdata
|
|
window.__nfpdata = null
|
|
this.afterData()
|
|
} 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
|
|
}
|
|
|
|
api.sendRequest({
|
|
method: 'GET',
|
|
url: '/api/articles/' + this.path,
|
|
})
|
|
.then((result) => {
|
|
this.data = result
|
|
this.afterData()
|
|
}, (err) => {
|
|
this.error = err.message
|
|
})
|
|
.then(() => {
|
|
clearTimeout(this.showLoading)
|
|
this.showLoading = null
|
|
this.loading = false
|
|
m.redraw()
|
|
})
|
|
},
|
|
|
|
afterData: function() {
|
|
if (!this.data.article) {
|
|
this.error = 'Article not found'
|
|
}
|
|
},
|
|
|
|
view: function(vnode) {
|
|
let article = this.data.article
|
|
|
|
return [
|
|
this.loading
|
|
? m('.inside.vertical', [
|
|
m('div.actions', m('div.lb-link')),
|
|
m('article.fullsize', [
|
|
m('h2.title', m('div.lb-main.lb--long')),
|
|
m('div.row', [
|
|
m('div.cover', m('picture.lb.nobg')),
|
|
m('div.description', [
|
|
m('div.lb-main.lb--long'),
|
|
m('div.lb-main'),
|
|
m('div.lb-main.lb--medium'),
|
|
m('div.lb-main.lb--medium'),
|
|
m('div.lb-main'),
|
|
m('p', m.trust(' ')),
|
|
m('fileinfo', [
|
|
m('div.lb-main.lb--slim.lb--longest'),
|
|
m('ul', [
|
|
m('li', m('div.lb-main.lb--slim.lb--longest')),
|
|
m('li', m('div.lb-main.lb--slim.lb--longest')),
|
|
])
|
|
]),
|
|
]),
|
|
]),
|
|
]),
|
|
])
|
|
: null,
|
|
!this.loading && this.error === 'Article not found'
|
|
? NotFoundView.view()
|
|
: null,
|
|
!this.loading && this.error && this.error !== 'Article not found'
|
|
? m('div.wrapper', m('div.error', {
|
|
onclick: () => {
|
|
this.error = ''
|
|
this.fetchPage(vnode)
|
|
},
|
|
}, 'Article error: ' + this.error + '. Click here to try again'))
|
|
: null,
|
|
(!this.loading && article
|
|
? m('.inside.vertical', [
|
|
m('div.actions', [
|
|
'« ',
|
|
m(m.route.Link, {
|
|
href: article.page_path
|
|
? '/page/' + article.page_path
|
|
: '/'
|
|
}, article.page_name || 'Home'),
|
|
Authentication.currentUser
|
|
? [
|
|
m('div.filler'),
|
|
'Actions:',
|
|
m(m.route.Link, { href: '/admin/articles/' + article.id }, 'Edit article'),
|
|
]
|
|
: null,
|
|
]),
|
|
article ? m(Article, { full: true, files: this.data.files, article: article }) : null,
|
|
window.LoadComments
|
|
? m('div#hyvor-talk-view', { oncreate: function() {
|
|
window.HYVOR_TALK_CONFIG = {
|
|
url: false,
|
|
id: article.path,
|
|
loadMode: scroll,
|
|
}
|
|
if (!window.HyvorLoaded) {
|
|
window.HyvorLoaded = true
|
|
var s = document.createElement('script')
|
|
s.src = 'https://talk.hyvor.com/web-api/embed.js';
|
|
s.type = 'text/javascript'
|
|
// s.setAttribute('crossorigin', '')
|
|
// s.setAttribute('data-timestamp', +new Date());
|
|
document.body.appendChild(s);
|
|
} else {
|
|
hyvor_talk.reload()
|
|
}
|
|
}}, m('div.loading-spinner'))
|
|
: m('button.comments', {
|
|
style: 'display: none',
|
|
onclick: function() { window.LoadComments = true },
|
|
}, 'Open comment discussion'),
|
|
])
|
|
: null),
|
|
]
|
|
},
|
|
}
|
|
|
|
module.exports = SiteArticle
|