modules/thread.jsView |
---|
| 1 … | +var ui = require('patchbay/ui') |
| 2 … | +var pull = require('pull-stream') |
| 3 … | +var Cat = require('pull-cat') |
| 4 … | +var sort = require('ssb-sort') |
| 5 … | +var ref = require('ssb-ref') |
| 6 … | +var h = require('hyperscript') |
| 7 … | +var u = require('patchbay/util') |
| 8 … | +var Scroller = require('pull-scroll') |
| 9 … | + |
| 10 … | + |
| 11 … | +function once (cont) { |
| 12 … | + var ended = false |
| 13 … | + return function (abort, cb) { |
| 14 … | + if(abort) return cb(abort) |
| 15 … | + else if (ended) return cb(ended) |
| 16 … | + else |
| 17 … | + cont(function (err, data) { |
| 18 … | + if(err) return cb(ended = err) |
| 19 … | + ended = true |
| 20 … | + cb(null, data) |
| 21 … | + }) |
| 22 … | + } |
| 23 … | +} |
| 24 … | + |
| 25 … | +var plugs = require('patchbay/plugs') |
| 26 … | + |
| 27 … | +var message_render = plugs.first(exports.message_render = []) |
| 28 … | +var message_name = plugs.first(exports.message_name = []) |
| 29 … | +var message_compose = plugs.first(exports.message_compose = []) |
| 30 … | +var message_unbox = plugs.first(exports.message_unbox = []) |
| 31 … | + |
| 32 … | +var sbot_get = plugs.first(exports.sbot_get = []) |
| 33 … | +var sbot_links = plugs.first(exports.sbot_links = []) |
| 34 … | +var get_id = plugs.first(exports.get_id = []) |
| 35 … | + |
| 36 … | +function getThread (root, cb) { |
| 37 … | + |
| 38 … | + |
| 39 … | + |
| 40 … | + sbot_get(root, function (err, value) { |
| 41 … | + var msg = {key: root, value: value} |
| 42 … | + |
| 43 … | + |
| 44 … | + pull( |
| 45 … | + sbot_links({rel: 'root', dest: root, values: true, keys: true}), |
| 46 … | + pull.collect(function (err, ary) { |
| 47 … | + if(err) return cb(err) |
| 48 … | + ary.unshift(msg) |
| 49 … | + cb(null, ary) |
| 50 … | + }) |
| 51 … | + ) |
| 52 … | + }) |
| 53 … | + |
| 54 … | +} |
| 55 … | + |
| 56 … | +exports.screen_view = function (id) { |
| 57 … | + if(ref.isMsg(id)) { |
| 58 … | + var meta = { |
| 59 … | + type: 'post', |
| 60 … | + root: id, |
| 61 … | + branch: id |
| 62 … | + } |
| 63 … | + |
| 64 … | + var lastId = id |
| 65 … | + var content = h('div.column.scroller__content') |
| 66 … | + var div = h('div.column.scroller', |
| 67 … | + {style: {'overflow-y': 'auto'}}, |
| 68 … | + h('div.scroller__wrapper', |
| 69 … | + content, |
| 70 … | + message_compose(meta, {shrink: false, placeholder: 'Write a reply'}) |
| 71 … | + ) |
| 72 … | + ) |
| 73 … | + |
| 74 … | + message_name(id, function (err, name) { |
| 75 … | + div.title = name |
| 76 … | + }) |
| 77 … | + |
| 78 … | + pull( |
| 79 … | + sbot_links({ |
| 80 … | + rel: 'root', dest: id, keys: true, old: false |
| 81 … | + }), |
| 82 … | + pull.drain(function (msg) { |
| 83 … | + loadThread() |
| 84 … | + }, function () {} ) |
| 85 … | + ) |
| 86 … | + |
| 87 … | + |
| 88 … | + function loadThread () { |
| 89 … | + getThread(id, function (err, thread) { |
| 90 … | + |
| 91 … | + |
| 92 … | + |
| 93 … | + content.innerHTML = '' |
| 94 … | + |
| 95 … | + thread = thread.map(function (msg) { |
|
| 96 … | + return 'string' === typeof msg.value.content ? message_unbox(msg) : msg |
| 97 … | + }) |
| 98 … | + |
| 99 … | + if(err) return content.appendChild(h('pre', err.stack)) |
| 100 … | + sort(thread).map((msg) => { |
| 101 … | + var result = message_render(msg, true, lastId) |
| 102 … | + lastId = msg.key |
| 103 … | + return result |
| 104 … | + }).filter(Boolean).forEach(function (el) { |
| 105 … | + content.appendChild(el) |
| 106 … | + }) |
| 107 … | + |
| 108 … | + var branches = sort.heads(thread) |
| 109 … | + meta.branch = branches.length > 1 ? branches : branches[0] |
| 110 … | + meta.root = thread[0].value.content.root || thread[0].key |
| 111 … | + meta.channel = thread[0].value.content.channel |
| 112 … | + |
| 113 … | + var recps = thread[0].value.content.recps |
| 114 … | + var private = thread[0].value.private |
| 115 … | + if(private) { |
| 116 … | + if(recps) |
| 117 … | + meta.recps = recps |
| 118 … | + else |
| 119 … | + meta.recps = [thread[0].value.author, get_id()] |
| 120 … | + } |
| 121 … | + }) |
| 122 … | + } |
| 123 … | + |
| 124 … | + loadThread() |
| 125 … | + return div |
| 126 … | + } |
| 127 … | +} |