Commit 073f7adfddd31252faca6d3c503e202ad1aef088
Handle unused tags and deleting tags better
Josiah Witt committed on 2/22/2018, 3:52:54 AMParent: eaa2308c20b5db8566955893f8328f5440f973a9
Files changed
tag/obs/tagged.js | changed |
tag/obs/tagged.js | ||
---|---|---|
@@ -2,9 +2,11 @@ | ||
2 | 2 … | var pull = require('pull-stream') |
3 | 3 … | var nest = require('depnest') |
4 | 4 … | var ref = require('ssb-ref') |
5 | 5 … | var set = require('lodash/set') |
6 … | +var unset = require('lodash/unset') | |
6 | 7 … | var get = require('lodash/get') |
8 … | +var isEmpty = require('lodash/isEmpty') | |
7 | 9 … | |
8 | 10 … | exports.needs = nest({ |
9 | 11 … | 'sbot.pull.stream': 'first' |
10 | 12 … | }) |
@@ -39,9 +41,9 @@ | ||
39 | 41 … | } |
40 | 42 … | |
41 | 43 … | function messageTags(msgId) { |
42 | 44 … | if (!ref.isLink(msgId)) throw new Error('Requires an ssb ref!') |
43 | - return withSync(computed(getObs(msgId, messagesCache), Object.keys)) | |
45 … | + return withSync(computed(getObs(msgId, messagesCache), getMessageTags)) | |
44 | 46 … | } |
45 | 47 … | |
46 | 48 … | function allTagsFrom(author) { |
47 | 49 … | if (!ref.isFeed(author)) throw new Error('Requires an ssb ref!') |
@@ -82,13 +84,24 @@ | ||
82 | 84 … | const lastState = state() |
83 | 85 … | var changed = false |
84 | 86 … | |
85 | 87 … | for (const tag in values) { |
88 … | + const lastTag = lastState[tag] | |
89 … | + const isUnusedTag = isEmpty(values[tag]) && (lastTag === undefined || !isEmpty(lastTag)) | |
90 … | + if (isUnusedTag) { | |
91 … | + set(lastState, [ tag ], {}) | |
92 … | + changed = true | |
93 … | + continue | |
94 … | + } | |
86 | 95 … | for (const key in values[tag]) { |
87 | - var value = get(values, [ tag, key ]) | |
88 | - var lastValue = get(lastState, [ tag, key ]) | |
96 … | + const value = get(values, [ tag, key ]) | |
97 … | + const lastValue = get(lastState, [ tag, key ]) | |
89 | 98 … | if (value !== lastValue) { |
90 | - set(lastState, [tag, key], value) | |
99 … | + if (value) { | |
100 … | + set(lastState, [ tag, key ], value) | |
101 … | + } else { | |
102 … | + unset(lastState, [ tag, key ]) | |
103 … | + } | |
91 | 104 … | changed = true |
92 | 105 … | } |
93 | 106 … | } |
94 | 107 … | } |
@@ -123,13 +136,18 @@ | ||
123 | 136 … | |
124 | 137 … | if (!sync()) { |
125 | 138 … | sync.set(true) |
126 | 139 … | } |
127 | - } else if (item && ref.isLink(item.tag) && ref.isFeed(item.author) && ref.isLink(item.message)) { | |
140 … | + } else if (item && ref.isLink(item.tagKey) && ref.isFeed(item.author) && ref.isLink(item.message)) { | |
128 | 141 … | // handle realtime updates |
129 | - const { tag, author, message, tagged, timestamp } = item | |
130 | - update(author, { [tag]: { [message]: timestamp } }, tagsCache) | |
131 | - update(message, { [tag]: { [author]: timestamp } }, messagesCache) | |
142 … | + const { tagKey, author, message, tagged, timestamp } = item | |
143 … | + if (tagged) { | |
144 … | + update(author, { [tagKey]: { [message]: timestamp } }, tagsCache) | |
145 … | + update(message, { [tagKey]: { [author]: timestamp } }, messagesCache) | |
146 … | + } else { | |
147 … | + update(author, { [tagKey]: { [message]: false } }, tagsCache) | |
148 … | + update(message, { [tagKey]: { [author]: false } }, messagesCache) | |
149 … | + } | |
132 | 150 … | } |
133 | 151 … | }) |
134 | 152 … | ) |
135 | 153 … | } |
@@ -144,14 +162,13 @@ | ||
144 | 162 … | } |
145 | 163 … | return messages |
146 | 164 … | } |
147 | 165 … | |
148 | -function getMessageTags(lookup, tagId) { | |
149 | - const tags = {} | |
150 | - for (const author in lookup[tagId]) { | |
151 | - if (lookup[tagId][author]) { | |
152 | - if (!tags[tagId]) tags[tagId] = {} | |
153 | - tags[tagId][author] = lookup[tagId][author] | |
166 … | +function getMessageTags(lookup) { | |
167 … | + const tags = [] | |
168 … | + for (const tag in lookup) { | |
169 … | + if (!isEmpty(lookup[tag])) { | |
170 … | + tags.push(tag) | |
154 | 171 … | } |
155 | 172 … | } |
156 | 173 … | return tags |
157 | 174 … | } |
Built with git-ssb-web