commit: d22079cf7392a1ef184d7c03ff7cb680e3e1c99c
parent d72486f3e4f2af9db95535f3f93e6257c675e155
Author: tusooa <tusooa@kazv.moe>
Date: Thu, 13 Jul 2023 00:37:57 -0400
Handle recursive quotes
Diffstat:
6 files changed, 73 insertions(+), 5 deletions(-)
diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js
@@ -281,7 +281,7 @@ const PostStatusForm = {
repliedStatus.visibility === 'local') {
return true
} else if (repliedStatus.visibility === 'private') {
- return repliedStatus.account.id === this.$store.state.users.currentUser.id
+ return repliedStatus.user.id === this.$store.state.users.currentUser.id
}
},
...mapGetters(['mergedConfig']),
diff --git a/src/components/status/status.js b/src/components/status/status.js
@@ -133,6 +133,7 @@ const Status = {
'showPinned',
'inProfile',
'profileUserId',
+ 'inQuote',
'simpleTree',
'controlledThreadDisplayStatus',
@@ -159,7 +160,8 @@ const Status = {
uncontrolledMediaPlaying: [],
suspendable: true,
error: null,
- headTailLinks: null
+ headTailLinks: null,
+ displayQuote: !this.inQuote
}
},
computed: {
@@ -402,8 +404,17 @@ const Status = {
editingAvailable () {
return this.$store.state.instance.editingAvailable
},
+ hasVisibleQuote () {
+ return this.status.quote_url && this.status.quote_visible
+ },
+ hasInvisibleQuote () {
+ return this.status.quote_url && !this.status.quote_visible
+ },
quotedStatus () {
return this.status.quote_id ? this.$store.state.statuses.allStatusesObject[this.status.quote_id] : undefined
+ },
+ shouldDisplayQuote () {
+ return this.quotedStatus && this.displayQuote
}
},
methods: {
@@ -472,6 +483,18 @@ const Status = {
window.scrollBy(0, rect.bottom - window.innerHeight + 50)
}
}
+ },
+ toggleDisplayQuote () {
+ if (this.shouldDisplayQuote) {
+ this.displayQuote = false
+ } else if (!this.quotedStatus) {
+ this.$store.dispatch('fetchStatus', this.status.quote_id)
+ .then(() => {
+ this.displayQuote = true
+ })
+ } else {
+ this.displayQuote = true
+ }
}
},
watch: {
diff --git a/src/components/status/status.scss b/src/components/status/status.scss
@@ -427,5 +427,17 @@
margin-top: 0.5em;
border: 1px solid var(--border, $fallback--border);
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
+
+ &.-unavailable-prompt {
+ padding: 0.5em;
+ }
+ }
+
+ .display-quoted-status-button {
+ margin: 0.5em;
+
+ &-icon {
+ color: inherit;
+ }
}
}
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
@@ -365,13 +365,43 @@
/>
<article
- v-if="quotedStatus"
+ v-if="hasVisibleQuote"
class="quoted-status"
>
+ <button
+ class="button-unstyled -link display-quoted-status-button"
+ :aria-expanded="shouldDisplayQuote"
+ @click="toggleDisplayQuote"
+ >
+ {{ shouldDisplayQuote ? $t('status.hide_quote') : $t('status.display_quote') }}
+ <FAIcon
+ class="display-quoted-status-button-icon"
+ :icon="shouldDisplayQuote ? 'chevron-up' : 'chevron-down'"
+ />
+ </button>
<Status
+ v-if="shouldDisplayQuote"
:statusoid="quotedStatus"
+ :in-quote="true"
/>
</article>
+ <p
+ v-else-if="hasInvisibleQuote"
+ class="quoted-status -unavailable-prompt"
+ >
+ <i18n-t keypath="status.invisible_quote">
+ <template #link>
+ <bdi>
+ <a
+ :href="status.quote_url"
+ target="_blank"
+ >
+ {{ status.quote_url }}
+ </a>
+ </bdi>
+ </template>
+ </i18n-t>
+ </p>
<div
v-if="inConversation && !isPreview && replies && replies.length"
diff --git a/src/i18n/en.json b/src/i18n/en.json
@@ -1030,7 +1030,10 @@
"show_all_conversation": "Show full conversation ({numStatus} other status) | Show full conversation ({numStatus} other statuses)",
"show_only_conversation_under_this": "Only show replies to this status",
"status_history": "Status history",
- "reaction_count_label": "{num} person reacted | {num} people reacted"
+ "reaction_count_label": "{num} person reacted | {num} people reacted",
+ "hide_quote": "Hide the quoted status",
+ "display_quote": "Display the quoted status",
+ "invisible_quote": "Quoted status unavailable: {link}"
},
"user_card": {
"approve": "Approve",
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -326,7 +326,7 @@ export const parseStatus = (data) => {
output.emoji_reactions = pleroma.emoji_reactions
output.parent_visible = pleroma.parent_visible === undefined ? true : pleroma.parent_visible
output.quote = pleroma.quote ? parseStatus(pleroma.quote) : undefined
- output.quote_id = output.quote ? output.quote.id : undefined
+ output.quote_id = pleroma.quote_id ? pleroma.quote_id : (output.quote ? output.quote.id : undefined)
output.quote_url = pleroma.quote_url
output.quote_visible = pleroma.quote_visible
} else {