Files: e2fb4d766af3a45d510a0558e410b04dd3366e13 / app / page / channelShow.js
3242 bytesRaw
1 | const nest = require('depnest') |
2 | const { h, Value, computed, map, when, resolve } = require('mutant') |
3 | const pull = require('pull-stream') |
4 | |
5 | exports.gives = nest('app.page.channelShow') |
6 | |
7 | exports.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 | |
26 | exports.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