aboutsummaryrefslogtreecommitdiff
path: root/src/components/conversation/conversation.js
diff options
context:
space:
mode:
authorTusooa Zhu <tusooa@kazv.moe>2021-08-06 20:18:27 -0400
committerTusooa Zhu <tusooa@kazv.moe>2022-03-07 19:19:29 -0500
commit0582f19e7c2c6f916b427d5ecfbbb571178ce841 (patch)
treea45f9f9a7845867b66c2c2acc74464028d1da6f8 /src/components/conversation/conversation.js
parent7e1e8ea42925dffbce1d75e463f38a2c051c764d (diff)
Add tree-style thread display
Diffstat (limited to 'src/components/conversation/conversation.js')
-rw-r--r--src/components/conversation/conversation.js60
1 files changed, 58 insertions, 2 deletions
diff --git a/src/components/conversation/conversation.js b/src/components/conversation/conversation.js
index 069c0b40..e663ba15 100644
--- a/src/components/conversation/conversation.js
+++ b/src/components/conversation/conversation.js
@@ -1,5 +1,8 @@
import { reduce, filter, findIndex, clone, get } from 'lodash'
import Status from '../status/status.vue'
+import ThreadTree from '../thread_tree/thread_tree.vue'
+
+const debug = console.log
const sortById = (a, b) => {
const idA = a.type === 'retweet' ? a.retweeted_status.id : a.id
@@ -53,6 +56,15 @@ const conversation = {
}
},
computed: {
+ displayStyle () {
+ return this.$store.state.config.conversationDisplay
+ },
+ isTreeView () {
+ return this.displayStyle === 'tree'
+ },
+ isLinearView () {
+ return this.displayStyle === 'linear'
+ },
hideStatus () {
if (this.$refs.statusComponent && this.$refs.statusComponent[0]) {
return this.virtualHidden && this.$refs.statusComponent[0].suspendable
@@ -90,6 +102,49 @@ const conversation = {
return sortAndFilterConversation(conversation, this.status)
},
+ threadTree () {
+ const reverseLookupTable = this.conversation.reduce((table, status, index) => {
+ table[status.id] = index
+ return table
+ }, {})
+
+ const threads = this.conversation.reduce((a, cur) => {
+ const id = cur.id
+ a.forest[id] = this.getReplies(id)
+ .map(s => s.id)
+ .sort((a, b) => reverseLookupTable[a] - reverseLookupTable[b])
+
+ a.topLevel = a.topLevel.filter(k => a.forest[id].contains(k))
+ return a
+ }, {
+ forest: {},
+ topLevel: this.conversation.map(s => s.id)
+ })
+
+ const walk = (forest, topLevel, depth = 0, processed = {}) => topLevel.map(id => {
+ if (processed[id]) {
+ return []
+ }
+
+ processed[id] = true
+ return [{
+ status: this.conversation[reverseLookupTable[id]],
+ id,
+ depth
+ }, walk(forest, forest[child], depth + 1, processed)].reduce((a, b) => a.concat(b), [])
+ }).reduce((a, b) => a.concat(b), [])
+
+ const linearized = walk(threads.forest, threads.topLevel)
+
+ return linearized
+ },
+ topLevel () {
+ const topLevel = this.conversation.reduce((tl, cur) =>
+ tl.filter(k => this.getReplies(cur.id).map(v => v.id).indexOf(k.id) === -1), this.conversation)
+ debug("toplevel =", topLevel)
+ debug("toplevel =", topLevel)
+ return topLevel
+ },
replies () {
let i = 1
// eslint-disable-next-line camelcase
@@ -109,7 +164,7 @@ const conversation = {
}, {})
},
isExpanded () {
- return this.expanded || this.isPage
+ return !!(this.expanded || this.isPage)
},
hiddenStyle () {
const height = (this.status && this.status.virtualHeight) || '120px'
@@ -117,7 +172,8 @@ const conversation = {
}
},
components: {
- Status
+ Status,
+ ThreadTree
},
watch: {
statusId (newVal, oldVal) {