From 1a333aabba759fb68449ead9c47e986f456e8c8c Mon Sep 17 00:00:00 2001 From: Sean King Date: Tue, 7 Jun 2022 21:31:48 -0600 Subject: [PATCH 01/28] Add edit status functionality --- CONTRIBUTORS.md | 1 + src/App.js | 2 + src/App.vue | 1 + .../edit_status_modal/edit_status_modal.js | 75 ++++++++++++++++ .../edit_status_modal/edit_status_modal.vue | 48 ++++++++++ src/components/extra_buttons/extra_buttons.js | 13 +++ .../extra_buttons/extra_buttons.vue | 11 +++ .../post_status_form/post_status_form.js | 45 +++++++--- .../post_status_form/post_status_form.vue | 1 + src/i18n/en.json | 2 + src/main.js | 3 + src/modules/api.js | 2 + src/modules/editStatus.js | 25 ++++++ src/modules/statuses.js | 6 ++ src/services/api/api.service.js | 88 ++++++++++++++++++- .../entity_normalizer.service.js | 12 +++ .../status_poster/status_poster.service.js | 42 +++++++++ 17 files changed, 365 insertions(+), 12 deletions(-) create mode 100644 src/components/edit_status_modal/edit_status_modal.js create mode 100644 src/components/edit_status_modal/edit_status_modal.vue create mode 100644 src/modules/editStatus.js diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index f666a4ef02..18f4a93056 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -10,3 +10,4 @@ Contributors of this project. - shpuld (shpuld@shitposter.club): CSS and styling - Vincent Guth (https://unsplash.com/photos/XrwVIFy6rTw): Background images. - hj (hj@shigusegubu.club): Code +- Sean King (seanking@freespeechextremist.com): Code diff --git a/src/App.js b/src/App.js index f01f878826..6e0e34a8a7 100644 --- a/src/App.js +++ b/src/App.js @@ -11,6 +11,7 @@ import MobilePostStatusButton from './components/mobile_post_status_button/mobil import MobileNav from './components/mobile_nav/mobile_nav.vue' import DesktopNav from './components/desktop_nav/desktop_nav.vue' import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue' +import EditStatusModal from './components/edit_status_modal/edit_status_modal.vue' import PostStatusModal from './components/post_status_modal/post_status_modal.vue' import GlobalNoticeList from './components/global_notice_list/global_notice_list.vue' import { windowWidth, windowHeight } from './services/window_utils/window_utils' @@ -35,6 +36,7 @@ export default { SettingsModal, UserReportingModal, PostStatusModal, + EditStatusModal, GlobalNoticeList }, data: () => ({ diff --git a/src/App.vue b/src/App.vue index 5b4489729a..9484f99350 100644 --- a/src/App.vue +++ b/src/App.vue @@ -52,6 +52,7 @@ +
@@ -257,7 +257,7 @@ @keydown.enter.prevent="" >

- {{ localDescription }} + {{ attachment.description }}

From 80ec88beabefd41e75040dd35364a94783e423a0 Mon Sep 17 00:00:00 2001 From: Sean King Date: Sat, 11 Jun 2022 16:32:46 -0600 Subject: [PATCH 05/28] Use statusId instead of repliedUser.id --- src/components/edit_status_modal/edit_status_modal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/edit_status_modal/edit_status_modal.js b/src/components/edit_status_modal/edit_status_modal.js index 14320d2145..75adfea755 100644 --- a/src/components/edit_status_modal/edit_status_modal.js +++ b/src/components/edit_status_modal/edit_status_modal.js @@ -29,7 +29,7 @@ const EditStatusModal = { }, watch: { params (newVal, oldVal) { - if (get(newVal, 'repliedUser.id') !== get(oldVal, 'repliedUser.id')) { + if (get(newVal, 'statusId') !== get(oldVal, 'statusId')) { this.resettingForm = true this.$nextTick(() => { this.resettingForm = false From 32ecdfdd8738befa004f865f496b7df17a4c2030 Mon Sep 17 00:00:00 2001 From: Sean King Date: Sat, 11 Jun 2022 16:38:03 -0600 Subject: [PATCH 06/28] Don't pollute the original timeline when new media attachment is added --- src/components/extra_buttons/extra_buttons.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/extra_buttons/extra_buttons.js b/src/components/extra_buttons/extra_buttons.js index 9508a7075a..8a703953ad 100644 --- a/src/components/extra_buttons/extra_buttons.js +++ b/src/components/extra_buttons/extra_buttons.js @@ -80,7 +80,7 @@ const ExtraButtons = { statusText: data.text, statusIsSensitive: this.status.nsfw, statusPoll: this.status.poll, - statusFiles: this.status.attachments, + statusFiles: [...this.status.attachments], visibility: this.status.visibility, statusContentType: data.content_type })) From 29e7972d8b46e9ad15ecc0cdd398f6054fe0004a Mon Sep 17 00:00:00 2001 From: Sean King Date: Sat, 11 Jun 2022 16:44:08 -0600 Subject: [PATCH 07/28] Credit to the chad tusooa --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 18f4a93056..bfc41ac4e2 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -11,3 +11,4 @@ Contributors of this project. - Vincent Guth (https://unsplash.com/photos/XrwVIFy6rTw): Background images. - hj (hj@shigusegubu.club): Code - Sean King (seanking@freespeechextremist.com): Code +- Tusooa Zhu (tusooa@kazv.moe): Code From c195e3571c113d29778ad86f4cbea019716fe787 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Sat, 11 Jun 2022 20:33:12 -0400 Subject: [PATCH 08/28] Handle explicit mention changes in status updates --- src/components/status_body/status_body.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/status_body/status_body.js b/src/components/status_body/status_body.js index b8f6f9a0b6..0a3dcf7992 100644 --- a/src/components/status_body/status_body.js +++ b/src/components/status_body/status_body.js @@ -125,6 +125,13 @@ const StatusContent = { generateTagLink (tag) { return `/tag/${tag}` } + }, + watch: { + 'status.raw_html' (newVal, oldVal) { + if (newVal !== oldVal) { + this.parseReadyDone = false + } + } } } From 6e42409b8a0002ecbc75433b4f0881f10eb58bff Mon Sep 17 00:00:00 2001 From: Sean King Date: Sat, 11 Jun 2022 19:30:29 -0600 Subject: [PATCH 09/28] Fetch status when highlighting it --- src/components/conversation/conversation.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/conversation/conversation.js b/src/components/conversation/conversation.js index 2ef2977aff..1e6c0008b6 100644 --- a/src/components/conversation/conversation.js +++ b/src/components/conversation/conversation.js @@ -395,6 +395,7 @@ const conversation = { setHighlight (id) { if (!id) return this.highlight = id + this.$store.dispatch('fetchStatus', id) this.$store.dispatch('fetchFavsAndRepeats', id) this.$store.dispatch('fetchEmojiReactionsBy', id) }, From 8dac3932fed30e4238c2a7ef9cef8255a5c83a5a Mon Sep 17 00:00:00 2001 From: Sean King Date: Sat, 11 Jun 2022 20:10:16 -0600 Subject: [PATCH 10/28] Only refetch status on highlight if streaming is not enabled --- src/components/conversation/conversation.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/conversation/conversation.js b/src/components/conversation/conversation.js index 1e6c0008b6..f8df9eb537 100644 --- a/src/components/conversation/conversation.js +++ b/src/components/conversation/conversation.js @@ -1,6 +1,8 @@ import { reduce, filter, findIndex, clone, get } from 'lodash' import Status from '../status/status.vue' import ThreadTree from '../thread_tree/thread_tree.vue' +import { WSConnectionStatus } from '../../services/api/api.service.js' +import { mapGetters, mapState } from 'vuex' import { library } from '@fortawesome/fontawesome-svg-core' import { @@ -77,6 +79,9 @@ const conversation = { const maxDepth = this.$store.getters.mergedConfig.maxDepthInThread - 2 return maxDepth >= 1 ? maxDepth : 1 }, + streamingEnabled () { + return this.mergedConfig.useStreamingApi && this.mastoUserSocketStatus === WSConnectionStatus.JOINED + }, displayStyle () { return this.$store.getters.mergedConfig.conversationDisplay }, @@ -339,7 +344,11 @@ const conversation = { }, maybeHighlight () { return this.isExpanded ? this.highlight : null - } + }, + ...mapGetters(['mergedConfig']), + ...mapState({ + mastoUserSocketStatus: state => state.api.mastoUserSocketStatus + }) }, components: { Status, @@ -395,7 +404,11 @@ const conversation = { setHighlight (id) { if (!id) return this.highlight = id - this.$store.dispatch('fetchStatus', id) + + if (!this.streamingEnabled) { + this.$store.dispatch('fetchStatus', id) + } + this.$store.dispatch('fetchFavsAndRepeats', id) this.$store.dispatch('fetchEmojiReactionsBy', id) }, From 87fa7b82fb597ea597ee228c97cb2350a7d6c044 Mon Sep 17 00:00:00 2001 From: Sean King Date: Sat, 11 Jun 2022 20:40:53 -0600 Subject: [PATCH 11/28] Add warning for editing statuses --- src/components/post_status_form/post_status_form.js | 3 +++ src/components/post_status_form/post_status_form.vue | 8 ++++++++ src/i18n/en.json | 2 ++ 3 files changed, 13 insertions(+) diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js index d73219adc2..ae81bfa6c8 100644 --- a/src/components/post_status_form/post_status_form.js +++ b/src/components/post_status_form/post_status_form.js @@ -261,6 +261,9 @@ const PostStatusForm = { uploadFileLimitReached () { return this.newStatus.files.length >= this.fileLimit }, + isEdit () { + return typeof this.statusId !== 'undefined' && this.statusId.trim() !== '' + }, ...mapGetters(['mergedConfig']), ...mapState({ mobileLayout: state => state.interface.mobileLayout diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 60cab74533..650b5b8c62 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -66,6 +66,14 @@ {{ $t('post_status.direct_warning_to_first_only') }} {{ $t('post_status.direct_warning_to_all') }}

+

+ {{ $t('post_status.edit_remote_warning') }} +
+ {{ $t('post_status.edit_unsupported_warning') }} +

Date: Sat, 11 Jun 2022 23:51:13 -0600 Subject: [PATCH 12/28] Clarification on unsupported edit features warning --- src/i18n/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/en.json b/src/i18n/en.json index a303c0e822..b7a1dcbf14 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -217,7 +217,7 @@ "direct_warning_to_all": "This post will be visible to all the mentioned users.", "direct_warning_to_first_only": "This post will only be visible to the mentioned users at the beginning of the message.", "edit_remote_warning": "Other remote instances may not support editing and unable to receive the latest version of your post.", - "edit_unsupported_warning": "Pleroma currently does not support editing mentions or polls.", + "edit_unsupported_warning": "Pleroma does not support removing mentions or editing polls.", "posting": "Posting", "post": "Post", "preview": "Preview", From 1b796691b0c396c1780e5520bf285e22923f3b6a Mon Sep 17 00:00:00 2001 From: Sean King Date: Sun, 12 Jun 2022 10:16:56 -0600 Subject: [PATCH 13/28] Change message on unsupported edit features --- src/i18n/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/en.json b/src/i18n/en.json index b7a1dcbf14..7b1bac79ca 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -217,7 +217,7 @@ "direct_warning_to_all": "This post will be visible to all the mentioned users.", "direct_warning_to_first_only": "This post will only be visible to the mentioned users at the beginning of the message.", "edit_remote_warning": "Other remote instances may not support editing and unable to receive the latest version of your post.", - "edit_unsupported_warning": "Pleroma does not support removing mentions or editing polls.", + "edit_unsupported_warning": "Pleroma does not support editing mentions or polls.", "posting": "Posting", "post": "Post", "preview": "Preview", From fa5d35523dd081b6948d38325374cac5707b7868 Mon Sep 17 00:00:00 2001 From: Sean King Date: Mon, 20 Jun 2022 22:52:08 -0600 Subject: [PATCH 14/28] Add ability to view status history for edited statuses --- src/App.js | 2 + src/App.vue | 1 + src/components/extra_buttons/extra_buttons.js | 23 ++++++- .../extra_buttons/extra_buttons.vue | 11 ++++ .../status_history_modal.js | 60 +++++++++++++++++++ .../status_history_modal.vue | 46 ++++++++++++++ src/i18n/en.json | 3 +- src/main.js | 2 + src/modules/statusHistory.js | 25 ++++++++ src/modules/statuses.js | 3 + src/services/api/api.service.js | 17 +++--- .../entity_normalizer.service.js | 6 +- 12 files changed, 186 insertions(+), 13 deletions(-) create mode 100644 src/components/status_history_modal/status_history_modal.js create mode 100644 src/components/status_history_modal/status_history_modal.vue create mode 100644 src/modules/statusHistory.js diff --git a/src/App.js b/src/App.js index 6e0e34a8a7..af638a1c99 100644 --- a/src/App.js +++ b/src/App.js @@ -13,6 +13,7 @@ import DesktopNav from './components/desktop_nav/desktop_nav.vue' import UserReportingModal from './components/user_reporting_modal/user_reporting_modal.vue' import EditStatusModal from './components/edit_status_modal/edit_status_modal.vue' import PostStatusModal from './components/post_status_modal/post_status_modal.vue' +import StatusHistoryModal from './components/status_history_modal/status_history_modal.vue' import GlobalNoticeList from './components/global_notice_list/global_notice_list.vue' import { windowWidth, windowHeight } from './services/window_utils/window_utils' import { mapGetters } from 'vuex' @@ -37,6 +38,7 @@ export default { UserReportingModal, PostStatusModal, EditStatusModal, + StatusHistoryModal, GlobalNoticeList }, data: () => ({ diff --git a/src/App.vue b/src/App.vue index 9484f99350..1b513e086c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -53,6 +53,7 @@ +
:first-child { + margin-top: 0; + } + + > :last-child { + margin-bottom: 0; + } + } + .media-upload-icon, .poll-icon, .emoji-icon { font-size: 1.85em; line-height: 1.1; From ed8bc6102290cb50d44c1c7aa5696aac5624d907 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Wed, 22 Jun 2022 16:05:27 -0400 Subject: [PATCH 17/28] Add last edited at indicator in status --- src/components/status/status.js | 6 ++++++ src/components/status/status.scss | 3 ++- src/components/status/status.vue | 24 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/components/status/status.js b/src/components/status/status.js index a925f30be5..b7f2037470 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -392,6 +392,12 @@ const Status = { }, visibilityLocalized () { return this.$i18n.t('general.scope_in_timeline.' + this.status.visibility) + }, + isEdited () { + return this.status.edited_at !== null + }, + editingAvailable () { + return this.$store.state.instance.editingAvailable } }, methods: { diff --git a/src/components/status/status.scss b/src/components/status/status.scss index b3ad3818c6..ada9841e41 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -156,7 +156,8 @@ margin-right: 0.2em; } - & .heading-reply-row { + & .heading-reply-row, + & .heading-edited-row { position: relative; align-content: baseline; font-size: 0.85em; diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 67ce999a45..a9630a53e9 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -328,6 +328,30 @@ class="mentions-line" />
+
+ + + +
Date: Wed, 22 Jun 2022 16:05:44 -0400 Subject: [PATCH 18/28] Add English translation for last edited at indicator --- src/i18n/en.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/en.json b/src/i18n/en.json index f125c2496b..c4a044f5d9 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -748,6 +748,7 @@ "repeats": "Repeats", "delete": "Delete status", "edit": "Edit status", + "edited_at": "(last edited {time})", "pin": "Pin on profile", "unpin": "Unpin from profile", "pinned": "Pinned", From acd53957e09a499b04c8f901e5829607f7363b57 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Wed, 22 Jun 2022 16:14:19 -0400 Subject: [PATCH 19/28] Do not show edited indicator in history items --- src/components/status/status.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/status/status.vue b/src/components/status/status.vue index a9630a53e9..00462f0ae1 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -329,7 +329,7 @@ />
Date: Sun, 26 Jun 2022 13:25:36 -0600 Subject: [PATCH 20/28] Use watch to change localDescription --- src/components/attachment/attachment.js | 3 +++ src/components/attachment/attachment.vue | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/attachment/attachment.js b/src/components/attachment/attachment.js index d62a4adc21..5dc5047556 100644 --- a/src/components/attachment/attachment.js +++ b/src/components/attachment/attachment.js @@ -129,6 +129,9 @@ const Attachment = { ...mapGetters(['mergedConfig']) }, watch: { + 'attachment.description' (newVal) { + this.localDescription = newVal + }, localDescription (newVal) { this.onEdit(newVal) } diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue index 14f6a0ae81..2a89886d7d 100644 --- a/src/components/attachment/attachment.vue +++ b/src/components/attachment/attachment.vue @@ -166,7 +166,7 @@ :icon="placeholderIconClass" />

- {{ edit ? localDescription : attachment.description }} + {{ localDescription }}

@@ -244,7 +244,7 @@
@@ -257,7 +257,7 @@ @keydown.enter.prevent="" >

- {{ attachment.description }} + {{ localDescription }}

From 6f4b57e84559871f8c59f968d5cf17f2971e74c3 Mon Sep 17 00:00:00 2001 From: Sean King Date: Sun, 26 Jun 2022 17:41:21 -0600 Subject: [PATCH 21/28] Use a better way to clone the original status --- src/components/extra_buttons/extra_buttons.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/extra_buttons/extra_buttons.js b/src/components/extra_buttons/extra_buttons.js index 92eb63b047..5ddb7f0feb 100644 --- a/src/components/extra_buttons/extra_buttons.js +++ b/src/components/extra_buttons/extra_buttons.js @@ -88,8 +88,7 @@ const ExtraButtons = { })) }, showStatusHistory () { - let originalStatus = {} - Object.assign(originalStatus, this.status) + let originalStatus = { ...this.status } delete originalStatus.attachments delete originalStatus.created_at delete originalStatus.emojis From 29ff63d1b420d0c36fb16c72389fdccd1294205a Mon Sep 17 00:00:00 2001 From: Sean King Date: Sun, 26 Jun 2022 18:10:30 -0600 Subject: [PATCH 22/28] Refactor to delete the properties for originalStatus in showStatusHistory in a better way --- src/components/extra_buttons/extra_buttons.js | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/components/extra_buttons/extra_buttons.js b/src/components/extra_buttons/extra_buttons.js index 5ddb7f0feb..ef040d26ef 100644 --- a/src/components/extra_buttons/extra_buttons.js +++ b/src/components/extra_buttons/extra_buttons.js @@ -88,16 +88,9 @@ const ExtraButtons = { })) }, showStatusHistory () { - let originalStatus = { ...this.status } - delete originalStatus.attachments - delete originalStatus.created_at - delete originalStatus.emojis - delete originalStatus.text - delete originalStatus.raw_html - delete originalStatus.nsfw - delete originalStatus.poll - delete originalStatus.summary - delete originalStatus.summary_raw_html + const originalStatus = { ...this.status } + const stripFieldsList = ['attachments', 'created_at', 'emojis', 'text', 'raw_html', 'nsfw', 'poll', 'summary', 'summary_raw_html'] + stripFieldsList.forEach(p => delete originalStatus[p]) this.$store.dispatch('openStatusHistoryModal', originalStatus) } }, From 75216c5feb32b32e24952663ffa4233410585785 Mon Sep 17 00:00:00 2001 From: Sean King Date: Sun, 10 Jul 2022 21:07:47 -0600 Subject: [PATCH 23/28] Remove guard for raw_html --- src/components/status_body/status_body.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/components/status_body/status_body.js b/src/components/status_body/status_body.js index 0a3dcf7992..b8f6f9a0b6 100644 --- a/src/components/status_body/status_body.js +++ b/src/components/status_body/status_body.js @@ -125,13 +125,6 @@ const StatusContent = { generateTagLink (tag) { return `/tag/${tag}` } - }, - watch: { - 'status.raw_html' (newVal, oldVal) { - if (newVal !== oldVal) { - this.parseReadyDone = false - } - } } } From 232cc72df8352db15ac3e6b11c1f9c5908069771 Mon Sep 17 00:00:00 2001 From: Sean King Date: Mon, 1 Aug 2022 18:45:52 -0600 Subject: [PATCH 24/28] Fix lint errors and warnings --- .../edit_status_modal/edit_status_modal.vue | 6 +++--- src/components/status/status.vue | 12 +++++------- .../status_history_modal/status_history_modal.vue | 4 ++-- src/services/api/api.service.js | 6 +++--- .../entity_normalizer/entity_normalizer.service.js | 2 +- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/components/edit_status_modal/edit_status_modal.vue b/src/components/edit_status_modal/edit_status_modal.vue index 00dde7deed..1dbacaab46 100644 --- a/src/components/edit_status_modal/edit_status_modal.vue +++ b/src/components/edit_status_modal/edit_status_modal.vue @@ -11,10 +11,10 @@ diff --git a/src/components/status/status.vue b/src/components/status/status.vue index a13e5ab03f..5ddb94b411 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -340,13 +340,11 @@ keypath="time.in_past" tag="span" > - + diff --git a/src/components/status_history_modal/status_history_modal.vue b/src/components/status_history_modal/status_history_modal.vue index d6680df238..990be35bc9 100644 --- a/src/components/status_history_modal/status_history_modal.vue +++ b/src/components/status_history_modal/status_history_modal.vue @@ -17,9 +17,9 @@ v-for="status in history" :key="status.id" :statusoid="status" - :isPreview="true" + :is-preview="true" class="conversation-status status-fadein panel-body" - /> + /> diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 41c1459655..381dd112c7 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -417,7 +417,7 @@ const fetchStatus = ({ id, credentials }) => { } const fetchStatusSource = ({ id, credentials }) => { - let url = MASTODON_STATUS_SOURCE_URL(id) + const url = MASTODON_STATUS_SOURCE_URL(id) return fetch(url, { headers: authHeaders(credentials) }) .then((data) => { if (data.ok) { @@ -430,7 +430,7 @@ const fetchStatusSource = ({ id, credentials }) => { } const fetchStatusHistory = ({ status, credentials }) => { - let url = MASTODON_STATUS_HISTORY_URL(status.id) + const url = MASTODON_STATUS_HISTORY_URL(status.id) return promisedRequest({ url, credentials }) .then((data) => { data.reverse() @@ -767,7 +767,7 @@ const editStatus = ({ }) } - let putHeaders = authHeaders(credentials) + const putHeaders = authHeaders(credentials) return fetch(MASTODON_STATUS_URL(id), { body: form, diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index c00e97961c..c1b2ffac7a 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -378,7 +378,7 @@ export const parseStatus = (data) => { output.favoritedBy = [] output.rebloggedBy = [] - if (data.hasOwnProperty('originalStatus')) { + if (Object.prototype.hasOwnProperty.call(data, 'originalStatus')) { Object.assign(output, data.originalStatus) } From b70d50407cef26926635b1b47131c01e597fcfc6 Mon Sep 17 00:00:00 2001 From: Sean King Date: Mon, 1 Aug 2022 21:25:08 -0600 Subject: [PATCH 25/28] Refresh the relative time object for a Timeago component if the time changes --- src/components/timeago/timeago.vue | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/timeago/timeago.vue b/src/components/timeago/timeago.vue index 2b487dfdda..fce9605be8 100644 --- a/src/components/timeago/timeago.vue +++ b/src/components/timeago/timeago.vue @@ -34,6 +34,13 @@ export default { unmounted () { clearTimeout(this.interval) }, + watch: { + time (newVal, oldVal) { + if (oldVal !== newVal) { + this.refreshRelativeTimeObject() + } + } + }, methods: { refreshRelativeTimeObject () { const nowThreshold = typeof this.nowThreshold === 'number' ? this.nowThreshold : 1 From 04e62df377fdd2ea563f58dcd23ea8048fc1c140 Mon Sep 17 00:00:00 2001 From: Sean King Date: Tue, 2 Aug 2022 23:19:25 -0600 Subject: [PATCH 26/28] Allow for template inside Timeago component that shows unless the time string is 'just now' --- src/components/status/status.vue | 16 ++++++---------- src/components/timeago/timeago.vue | 26 ++++++++++++++++++-------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 5ddb94b411..8036ddf422 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -336,16 +336,12 @@ tag="span" > diff --git a/src/components/timeago/timeago.vue b/src/components/timeago/timeago.vue index fce9605be8..b5f495154d 100644 --- a/src/components/timeago/timeago.vue +++ b/src/components/timeago/timeago.vue @@ -3,7 +3,7 @@ :datetime="time" :title="localeDateString" > - {{ $tc(relativeTime.key, relativeTime.num, [relativeTime.num]) }} + {{ relativeTimeString }} @@ -13,7 +13,7 @@ import localeService from 'src/services/locale/locale.service.js' export default { name: 'Timeago', - props: ['time', 'autoUpdate', 'longFormat', 'nowThreshold'], + props: ['time', 'autoUpdate', 'longFormat', 'nowThreshold', 'templateKey'], data () { return { relativeTime: { key: 'time.now', num: 0 }, @@ -26,21 +26,31 @@ export default { return typeof this.time === 'string' ? new Date(Date.parse(this.time)).toLocaleString(browserLocale) : this.time.toLocaleString(browserLocale) + }, + relativeTimeString () { + const timeString = this.$i18n.tc(this.relativeTime.key, this.relativeTime.num, [this.relativeTime.num]) + + if (typeof this.templateKey === 'string' && this.relativeTime.key !== 'time.now') { + return this.$i18n.t(this.templateKey, [timeString]) + } + + return timeString } }, - created () { - this.refreshRelativeTimeObject() - }, - unmounted () { - clearTimeout(this.interval) - }, watch: { time (newVal, oldVal) { if (oldVal !== newVal) { + clearTimeout(this.interval) this.refreshRelativeTimeObject() } } }, + created () { + this.refreshRelativeTimeObject() + }, + unmounted () { + clearTimeout(this.interval) + }, methods: { refreshRelativeTimeObject () { const nowThreshold = typeof this.nowThreshold === 'number' ? this.nowThreshold : 1 From 420f29b6a460ead0a5b4d9ff61e3d3ca097bd798 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 23 Aug 2022 02:01:56 +0300 Subject: [PATCH 27/28] add a mask to load shape to flow text around quicker --- src/assets/pleromatan_apology_fox_mask.png | Bin 0 -> 2827 bytes src/assets/pleromatan_apology_mask.png | Bin 0 -> 2366 bytes .../update_notification/update_notification.js | 5 ++++- 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 src/assets/pleromatan_apology_fox_mask.png create mode 100644 src/assets/pleromatan_apology_mask.png diff --git a/src/assets/pleromatan_apology_fox_mask.png b/src/assets/pleromatan_apology_fox_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1990d52258de84495cd8900f436004d3fe8c03 GIT binary patch literal 2827 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 Date: Tue, 23 Aug 2022 02:06:54 +0300 Subject: [PATCH 28/28] fetch text height only after mask has been loaded --- .../update_notification/update_notification.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/update_notification/update_notification.js b/src/components/update_notification/update_notification.js index 6cfe893c8e..c389750d8a 100644 --- a/src/components/update_notification/update_notification.js +++ b/src/components/update_notification/update_notification.js @@ -60,9 +60,14 @@ const UpdateNotification = { } }, mounted () { - setTimeout(() => { - this.contentHeight = this.$refs.animatedText.scrollHeight - }, 1000) + // Workaround to get the text height only after mask loaded. A bit hacky. + const newImg = new Image() + newImg.onload = () => { + setTimeout(() => { + this.contentHeight = this.$refs.animatedText.scrollHeight + }, 100) + } + newImg.src = this.pleromaTanVariant === pleromaTan ? pleromaTanMask : pleromaTanFoxMask } }