Commit 0c6abd793f009544b7ae0cda6266da58bff2c66c
Add bookmark actions via tags
Josiah Witt committed on 11/27/2017, 10:30:34 PMParent: d6861e3a6c97728f151fbc42d87fe7b565358976
Files changed
bookmark/html/render.js | changed |
bookmark/html/action/archive.js | added |
bookmark/html/action/favourite.js | added |
bookmark/html/action/read.js | added |
bookmark/html/tag.js | added |
bookmark/obs/bookmark.js | changed |
bookmark/html/render.js | ||
---|---|---|
@@ -1,64 +1,53 @@ | ||
1 | -const { h, Value, when, computed } = require('mutant') | |
1 … | +const { h, Value, when, computed, map } = require('mutant') | |
2 | 2 … | const nest = require('depnest') |
3 | 3 … | |
4 | 4 … | exports.needs = nest({ |
5 | 5 … | 'blob.sync.url': 'first', |
6 | 6 … | 'bookmark.obs.bookmark': 'first', |
7 | 7 … | 'feed.html.render': 'first', |
8 | 8 … | 'keys.sync.load': 'first', |
9 | 9 … | 'about.html.link': 'first', |
10 | - 'about.html.image': 'first', | |
10 … | + 'bookmark.html.action': 'map', | |
11 | 11 … | 'message.html': { |
12 | 12 … | decorate: 'reduce', |
13 | - link: 'first', | |
14 | - markdown: 'first', | |
15 | - backlinks: 'first', | |
16 | - meta: 'map', | |
17 | - action: 'map', | |
18 | 13 … | timestamp: 'first', |
19 | 14 … | }, |
20 | 15 … | }) |
21 | 16 … | |
22 | 17 … | exports.gives = nest({ |
23 | - 'message.html': [ 'render' ], | |
18 … | + // 'message.html': [ 'render' ], | |
24 | 19 … | 'bookmark.html': [ 'render' ] |
25 | 20 … | }) |
26 | 21 … | |
27 | 22 … | exports.create = function(api) { |
28 | - const { timestamp, meta, backlinks, action } = api.message.html | |
29 | - | |
30 | 23 … | return nest({ |
31 | - 'message.html.render': renderBookmark, | |
24 … | + // 'message.html.render': renderBookmark, | |
32 | 25 … | 'bookmark.html.render': renderBookmark |
33 | 26 … | }) |
34 | 27 … | |
35 | 28 … | function renderBookmark(msg, { pageId } = {}) { |
36 | 29 … | if (!msg.value || (msg.value.content.type !== 'bookmark')) return |
37 | 30 … | |
38 | 31 … | const bookmark = api.bookmark.obs.bookmark(msg.key) |
32 … | + console.log(bookmark()) | |
39 | 33 … | |
40 | 34 … | const content = [ |
41 | 35 … | h('a', { href: bookmark.messageId }, [ |
42 | 36 … | h('.details', [ |
43 | 37 … | h('Title', bookmark.title), |
44 | 38 … | h('Description', bookmark.description), |
45 | - h('Tags', bookmark.tags().map(tag => | |
46 | - h('Tag', tag) | |
47 | - )) | |
39 … | + h('Tags', map(bookmark.tags, tag => h('Tag', tag))) | |
48 | 40 … | ]) |
49 | 41 … | ]) |
50 | 42 … | ] |
51 | 43 … | |
52 | 44 … | const message = h( |
53 | 45 … | 'Message -bookmark', |
54 | 46 … | [ |
55 | - h('section.avatar', {}, api.about.html.image(msg.value.author)), | |
56 | - h('section.timestamp', {}, timestamp(msg)), | |
57 | - h('section.meta', {}, meta(msg)), | |
47 … | + h('section.timestamp', {}, api.message.html.timestamp(msg)), | |
58 | 48 … | h('section.content', {}, content), |
59 | - h('section.actions', {}, action(msg)), | |
60 | - h('footer.backlinks', {}, backlinks(msg)) | |
49 … | + h('section.actions', {}, api.bookmark.html.action(msg)) | |
61 | 50 … | ] |
62 | 51 … | ) |
63 | 52 … | |
64 | 53 … | const element = h( |
bookmark/html/action/archive.js | ||
---|---|---|
@@ -1,0 +1,15 @@ | ||
1 … | +var nest = require('depnest') | |
2 … | + | |
3 … | +exports.needs = nest({ | |
4 … | + 'bookmark.html.tag': 'first' | |
5 … | +}) | |
6 … | + | |
7 … | +exports.gives = nest('bookmark.html.action') | |
8 … | + | |
9 … | +exports.create = (api) => { | |
10 … | + return nest('bookmark.html.action', archive) | |
11 … | + | |
12 … | + function archive(msg) { | |
13 … | + return api.bookmark.html.tag('archived', 'Archive', 'Unarchive')(msg) | |
14 … | + } | |
15 … | +} |
bookmark/html/action/favourite.js | ||
---|---|---|
@@ -1,0 +1,15 @@ | ||
1 … | +var nest = require('depnest') | |
2 … | + | |
3 … | +exports.needs = nest({ | |
4 … | + 'bookmark.html.tag': 'first' | |
5 … | +}) | |
6 … | + | |
7 … | +exports.gives = nest('bookmark.html.action') | |
8 … | + | |
9 … | +exports.create = (api) => { | |
10 … | + return nest('bookmark.html.action', favourite) | |
11 … | + | |
12 … | + function favourite(msg) { | |
13 … | + return api.bookmark.html.tag('favourite', 'Favourite', 'Unfavourite')(msg) | |
14 … | + } | |
15 … | +} |
bookmark/html/action/read.js | ||
---|---|---|
@@ -1,0 +1,15 @@ | ||
1 … | +var nest = require('depnest') | |
2 … | + | |
3 … | +exports.needs = nest({ | |
4 … | + 'bookmark.html.tag': 'first' | |
5 … | +}) | |
6 … | + | |
7 … | +exports.gives = nest('bookmark.html.action') | |
8 … | + | |
9 … | +exports.create = (api) => { | |
10 … | + return nest('bookmark.html.action', read) | |
11 … | + | |
12 … | + function read(msg) { | |
13 … | + return api.bookmark.html.tag('read', 'Read', 'Unread')(msg) | |
14 … | + } | |
15 … | +} |
bookmark/html/tag.js | ||
---|---|---|
@@ -1,0 +1,51 @@ | ||
1 … | +var { h, computed, when } = require('mutant') | |
2 … | +var nest = require('depnest') | |
3 … | + | |
4 … | +exports.needs = nest({ | |
5 … | + 'bookmark.obs.bookmark': 'first', | |
6 … | + 'bookmark.async.tags': 'first' | |
7 … | +}) | |
8 … | + | |
9 … | +exports.gives = nest('bookmark.html.tag') | |
10 … | + | |
11 … | +exports.create = (api) => { | |
12 … | + return nest('bookmark.html.tag', tag) | |
13 … | + | |
14 … | + function tag(tagValue, doActionText, undoActionText) { | |
15 … | + return function(msg) { | |
16 … | + var bookmark = api.bookmark.obs.bookmark(msg.key) | |
17 … | + console.log(bookmark()) | |
18 … | + var tagged = computed([bookmark.tags, tagValue], isTagged) | |
19 … | + return when(tagged, | |
20 … | + h('a.undoAction', { | |
21 … | + href: '#', | |
22 … | + 'ev-click': () => publishAction(msg, bookmark.tags, tagValue, false) | |
23 … | + }, undoActionText), | |
24 … | + h('a.doAction', { | |
25 … | + href: '#', | |
26 … | + 'ev-click': () => publishAction(msg, bookmark.tags, tagValue, true) | |
27 … | + }, doActionText) | |
28 … | + ) | |
29 … | + } | |
30 … | + } | |
31 … | + | |
32 … | + function publishAction(msg, tags, tagValue, status = true) { | |
33 … | + var currentTags = tags() || [] | |
34 … | + var nextTags | |
35 … | + if (status) { | |
36 … | + nextTags = currentTags | |
37 … | + nextTags.push(tagValue) | |
38 … | + } else { | |
39 … | + nextTags = currentTags.filter(t => t !== tagValue) | |
40 … | + } | |
41 … | + api.bookmark.async.tags({ | |
42 … | + bookmark: msg.key, | |
43 … | + tags: [ nextTags ], | |
44 … | + public: true | |
45 … | + }, console.log) | |
46 … | + } | |
47 … | +} | |
48 … | + | |
49 … | +function isTagged(tags, tag) { | |
50 … | + return tags.includes(tag) | |
51 … | +} |
bookmark/obs/bookmark.js | ||
---|---|---|
@@ -4,25 +4,27 @@ | ||
4 | 4 … | const { computed } = require('mutant') |
5 | 5 … | |
6 | 6 … | exports.needs = nest({ |
7 | 7 … | 'about.obs.latestValue': 'first', |
8 | - 'about.obs.groupedValues': 'first', | |
9 | - 'bookmark.obs.struct': 'first' | |
8 … | + 'about.obs.valueFrom': 'first', | |
9 … | + 'bookmark.obs.struct': 'first', | |
10 … | + 'keys.sync.id': 'first' | |
10 | 11 … | }) |
11 | 12 … | |
12 | 13 … | exports.gives = nest('bookmark.obs.bookmark') |
13 | 14 … | |
14 | 15 … | exports.create = function(api) { |
15 | 16 … | return nest('bookmark.obs.bookmark', function(bookmarkId) { |
16 | 17 … | if (!ref.isLink(bookmarkId)) throw new Error('an id must be specified') |
17 | 18 … | |
18 | - const { latestValue, groupedValues } = api.about.obs | |
19 … | + const { latestValue, valueFrom } = api.about.obs | |
20 … | + const id = api.keys.sync.id() | |
19 | 21 … | |
20 | 22 … | const bookmark = api.bookmark.obs.struct({ |
21 | 23 … | title: latestValue(bookmarkId, 'title'), |
22 | 24 … | description: latestValue(bookmarkId, 'description'), |
23 | 25 … | messageId: latestValue(bookmarkId, 'messageId'), |
24 | - tags: computed([groupedValues(bookmarkId, 'tags')], Object.keys) | |
26 … | + tags: valueFrom(bookmarkId, 'tags', id) | |
25 | 27 … | }) |
26 | 28 … | |
27 | 29 … | return bookmark |
28 | 30 … | }) |
Built with git-ssb-web