// License: LGPL-3.0-or-later const R = require('ramda') const h = require('snabbdom/h') const flyd = require('flyd') const moment = require('moment') const flatMap = require('flyd/module/flatmap') const request = require('../../../../common/request') const flyd_mergeAll = require('flyd/module/mergeall') const generateContent = require('./generate-content') function init(parentState) { const activitiesWithJson$ = flyd.map( R.map(parseActivityJson) , parentState.activities$ ) const response$ = flyd.merge( flyd.stream([]) // default to empty array on pageload , activitiesWithJson$ ) const loading$ = flyd_mergeAll([ flyd.map(() => false, response$) ]) return {response$, loading$} } // Return js object if the string is json, otherwise return the string const tryJSON = str => { try { return JSON.parse(str) } catch(e) { return str } } // Parse the cached `json_data` column for activities // Also, parse the nested `dedicaton` json if it is present const parseActivityJson = data => { var json_data = JSON.parse(data.json_data || '{}') json_data.dedication = tryJSON(json_data.dedication) return R.merge(data, {json_data}) } const view = parentState => { var state = parentState.activities if(state.loading$()) { return h('div', [ h('p.u-color--grey', [h('i.fa.fa-spin.fa-gear'), ' Loading timeline...']) ]) } if(!state.loading$() && !state.response$().length) { return h('div', [ h('p.u-color--grey', 'No activity yet...') ]) } return h('ul.timeline-activities', R.map(activityContent(parentState), state.response$())) } // used to construct each activitiy list element const activityContent = parentState => data => { const contentFn = generateContent[data.kind] if(!contentFn) return '' const content = contentFn(data, parentState) return h('li.timeline-activity', [ h('div.timeline-activity-icon', [h(`i.fa.${content.icon}`)]) , h('div.timeline-activity-card', [ h('div', [ h('small.u-color--grey', moment(data.date).format("ddd, MMMM Do YYYY")) , h('div.u-fontSize--15', [ h('strong', content.title) , h('div', content.body) ]) ]) ]) ]) } module.exports = {init, view}