diff --git a/src/App.js b/src/App.js index 6637a08e..5310d504 100644 --- a/src/App.js +++ b/src/App.js @@ -12,6 +12,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' @@ -35,6 +36,7 @@ export default { UserReportingModal, PostStatusModal, EditStatusModal, + StatusHistoryModal, GlobalNoticeList }, data: () => ({ diff --git a/src/App.vue b/src/App.vue index 1e2cd343..7aad1a65 100644 --- a/src/App.vue +++ b/src/App.vue @@ -59,6 +59,7 @@ + diff --git a/src/components/extra_buttons/extra_buttons.js b/src/components/extra_buttons/extra_buttons.js index 2a375a80..27b9b7c9 100644 --- a/src/components/extra_buttons/extra_buttons.js +++ b/src/components/extra_buttons/extra_buttons.js @@ -7,7 +7,8 @@ import { faEyeSlash, faThumbtack, faShareAlt, - faExternalLinkAlt + faExternalLinkAlt, + faHistory } from '@fortawesome/free-solid-svg-icons' import { faBookmark as faBookmarkReg, @@ -22,7 +23,8 @@ library.add( faThumbtack, faShareAlt, faExternalLinkAlt, - faFlag + faFlag, + faHistory ) const ExtraButtons = { @@ -114,6 +116,20 @@ const ExtraButtons = { visibility: this.status.visibility, statusContentType: data.content_type })) + }, + showStatusHistory () { + let originalStatus = {} + Object.assign(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 + this.$store.dispatch('openStatusHistoryModal', originalStatus) } }, computed: { @@ -147,6 +163,9 @@ const ExtraButtons = { }, shouldConfirmDelete () { return this.$store.getters.mergedConfig.modalOnDelete + }, + isEdited () { + return this.status.edited_at !== null } } } diff --git a/src/components/extra_buttons/extra_buttons.vue b/src/components/extra_buttons/extra_buttons.vue index b3ccb370..b10ceb2b 100644 --- a/src/components/extra_buttons/extra_buttons.vue +++ b/src/components/extra_buttons/extra_buttons.vue @@ -84,6 +84,17 @@ icon="pen" />{{ $t("status.edit") }} + + {{ $t("status.status_history") }} + { + this.statuses = data + }) + }, + closeModal () { + this.$store.dispatch('closeStatusHistoryModal') + } + } +} + +export default StatusHistoryModal diff --git a/src/components/status_history_modal/status_history_modal.vue b/src/components/status_history_modal/status_history_modal.vue new file mode 100644 index 00000000..d6680df2 --- /dev/null +++ b/src/components/status_history_modal/status_history_modal.vue @@ -0,0 +1,46 @@ + + + + + {{ $t('status.status_history') }} ({{ historyCount }}) + + + + + + + + + + + + + diff --git a/src/main.js b/src/main.js index 098dfc5a..e4a793f6 100644 --- a/src/main.js +++ b/src/main.js @@ -20,6 +20,7 @@ import pollsModule from './modules/polls.js' import postStatusModule from './modules/postStatus.js' import announcementsModule from './modules/announcements.js' import editStatusModule from './modules/editStatus.js' +import statusHistoryModule from './modules/statusHistory.js' import { createI18n } from 'vue-i18n' @@ -83,7 +84,8 @@ const persistedStateOptions = { polls: pollsModule, postStatus: postStatusModule, announcements: announcementsModule, - editStatus: editStatusModule + editStatus: editStatusModule, + statusHistory: statusHistoryModule }, plugins, strict: false // Socket modifies itself, let's ignore this for now. diff --git a/src/modules/statusHistory.js b/src/modules/statusHistory.js new file mode 100644 index 00000000..db3d6d4b --- /dev/null +++ b/src/modules/statusHistory.js @@ -0,0 +1,25 @@ +const statusHistory = { + state: { + params: {}, + modalActivated: false + }, + mutations: { + openStatusHistoryModal (state, params) { + state.params = params + state.modalActivated = true + }, + closeStatusHistoryModal (state) { + state.modalActivated = false + } + }, + actions: { + openStatusHistoryModal ({ commit }, params) { + commit('openStatusHistoryModal', params) + }, + closeStatusHistoryModal ({ commit }) { + commit('closeStatusHistoryModal') + } + } +} + +export default statusHistory diff --git a/src/modules/statuses.js b/src/modules/statuses.js index fc1a3750..1080462c 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -613,6 +613,9 @@ const statuses = { fetchStatusSource ({ rootState, dispatch }, status) { return apiService.fetchStatusSource({ id: status.id, credentials: rootState.users.currentUser.credentials }) }, + fetchStatusHistory ({ rootState, dispatch }, status) { + return apiService.fetchStatusHistory({ status }) + }, deleteStatus ({ rootState, commit }, status) { commit('setDeleted', { status }) apiService.deleteStatus({ id: status.id, credentials: rootState.users.currentUser.credentials }) diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 8a0a66ae..8c7f80db 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -527,17 +527,16 @@ const fetchStatusSource = ({ id, credentials }) => { .then((data) => parseSource(data)) } -const fetchStatusHistory = ({ id, credentials }) => { - let url = MASTODON_STATUS_HISTORY_URL(id) - return fetch(url, { headers: authHeaders(credentials) }) +const fetchStatusHistory = ({ status, credentials }) => { + let url = MASTODON_STATUS_HISTORY_URL(status.id) + return promisedRequest({ url, credentials }) .then((data) => { - if (data.ok) { - return data - } - throw new Error('Error fetching history', data) + data.reverse() + return data.map((item) => { + item.originalStatus = status + return parseStatus(item) + }) }) - .then((data) => data.json()) - .then((data) => parseStatus(data)) } const tagUser = ({ tag, credentials, user }) => { diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index a4b3e21f..b1aded33 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -273,7 +273,7 @@ export const parseStatus = (data) => { output.tags = data.tags - output.is_edited = data.edited_at !== null + output.edited_at = data.edited_at if (data.pleroma) { const { pleroma } = data @@ -386,6 +386,10 @@ export const parseStatus = (data) => { output.favoritedBy = [] output.rebloggedBy = [] + if (data.hasOwnProperty('originalStatus')) { + Object.assign(output, data.originalStatus) + } + return output }