git ssb

2+

mixmix / ticktack



Tree: e2fb4d766af3a45d510a0558e410b04dd3366e13

Files: e2fb4d766af3a45d510a0558e410b04dd3366e13 / app / page / channelShow.js

3242 bytesRaw
1const nest = require('depnest')
2const { h, Value, computed, map, when, resolve } = require('mutant')
3const pull = require('pull-stream')
4
5exports.gives = nest('app.page.channelShow')
6
7exports.needs = nest({
8 'app.html.sideNav': 'first',
9 'app.html.topNav': 'first',
10 'app.html.scroller': 'first',
11 'app.html.blogCard': 'first',
12 'channel.obs.recent': 'first',
13 'feed.pull.channel': 'first',
14 'feed.pull.public': 'first',
15 'history.sync.push': 'first',
16 'keys.sync.id': 'first',
17 'message.html.channel': 'first',
18 'translations.sync.strings': 'first',
19 'unread.sync.isUnread': 'first',
20 'channel.obs.subscribed': 'first',
21 'channel.async.subscribe': 'first',
22 'channel.async.unsubscribe': 'first',
23 'channel.sync.isSubscribedTo': 'first'
24})
25
26exports.create = (api) => {
27 return nest('app.page.channelShow', channelShow)
28
29 function channelShow(location) {
30
31 var strings = api.translations.sync.strings()
32 const myId = api.keys.sync.id()
33 const { subscribed } = api.channel.obs
34 const { subscribe, unsubscribe } = api.channel.async
35 const { isSubscribedTo } = api.channel.sync
36 const myChannels = subscribed(myId)
37 let cs = myChannels().values()
38 const youSubscribe = Value(isSubscribedTo(location.channel, myId))
39
40 let cb = () => {
41 youSubscribe.set(isSubscribedTo(location.channel, myId))
42 }
43
44 var searchVal = resolve(location.channel)
45 var searchResults = computed([api.channel.obs.recent(), searchVal], (channels, val) => {
46 if (val.length < 2) return []
47
48 return channels.filter(c => c.toLowerCase().indexOf(val.toLowerCase()) > -1)
49 })
50
51
52
53 createStream = api.feed.pull.channel(location.channel)
54
55
56 const prepend = [
57 api.app.html.topNav(location),
58 h('section.about', [
59 h('h1', location.channel),
60 h('div.actions', [
61 when(youSubscribe,
62 h('Button', { 'ev-click': () => subscribe(location.channel, cb) }, strings.channelShow.action.unsubscribe),
63 h('Button', { 'ev-click': () => unsubscribe(location.channel, cb) }, strings.channelShow.action.subscribe)
64 )
65 ])
66 ]),
67 ]
68
69 var channelPosts = api.app.html.scroller({
70 classList: ['content'],
71 prepend,
72 stream: createStream,
73 filter: () => pull(
74 pull.filter(msg => {
75 const type = msg.value.content.type
76 return type === 'post' || type === 'blog'
77 }),
78 pull.filter(msg => !msg.value.content.root) // show only root messages
79 ),
80 // FUTURE : if we need better perf, we can add a persistent cache. At the moment this page is fast enough though.
81 // See implementation of app.html.sideNav for example
82 // store: recentMsgCache,
83 // updateTop: updateRecentMsgCache,
84 // updateBottom: updateRecentMsgCache,
85 render
86 })
87
88 return h('Page -channelShow', { title: strings.home }, [
89 api.app.html.sideNav(location),
90 channelPosts
91 ])
92 }
93
94
95 function render(blog) {
96 const { recps, channel } = blog.value.content
97 var onClick
98 if (channel && !recps)
99 onClick = (ev) => api.history.sync.push(Object.assign({}, blog, { page: 'blogShow' }))
100
101 return api.app.html.blogCard(blog, { onClick })
102 }
103}
104
105
106

Built with git-ssb-web