From fb65b686feaa81cd2e0f177acf92e1d5095de1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= <jus@bitgrid.net> Date: Fri, 11 Jan 2019 10:15:31 +0100 Subject: [PATCH] Implement post deletion and add animation to timeline list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl <jus@bitgrid.net> --- src/components/TimelineEntry.vue | 24 +++++++++++++++--------- src/components/TimelineList.vue | 20 +++++++++++++++++++- src/store/timeline.js | 13 +++++++++++++ 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/components/TimelineEntry.vue b/src/components/TimelineEntry.vue index ed9dd7b0..6e201294 100644 --- a/src/components/TimelineEntry.vue +++ b/src/components/TimelineEntry.vue @@ -32,7 +32,7 @@ </div> <div v-click-outside="hidePopoverMenu" class="post-actions"> <a class="icon-more" @click.prevent="togglePopoverMenu" /> - <div :class="{open: menuOpened}" class="popovermenu menu-center"> + <div :class="{open: menuOpened}" class="popovermenu"> <popover-menu :menu="popoverMenu" /> </div> </div> @@ -48,6 +48,7 @@ import pluginTag from 'linkifyjs/plugins/hashtag' import pluginMention from 'linkifyjs/plugins/mention' import 'linkifyjs/string' import popoverMenu from './../mixins/popoverMenu' +import currentUser from './../mixins/currentUserMixin' pluginTag(linkify) pluginMention(linkify) @@ -57,7 +58,7 @@ export default { components: { Avatar }, - mixins: [popoverMenu], + mixins: [popoverMenu, currentUser], props: { item: { type: Object, default: () => {} } }, @@ -74,13 +75,18 @@ export default { text: t('social', 'Reply to post') } ] - actions.push( - { - action: () => { }, - icon: 'icon-delete', - text: t('social', 'Delete post') - } - ) + if (this.item.actor_info.account === this.cloudId) { + actions.push( + { + action: () => { + this.$store.dispatch('postDelete', this.item) + this.hidePopoverMenu() + }, + icon: 'icon-delete', + text: t('social', 'Delete post') + } + ) + } return actions }, relativeTimestamp() { diff --git a/src/components/TimelineList.vue b/src/components/TimelineList.vue index 94d51935..9d405b16 100644 --- a/src/components/TimelineList.vue +++ b/src/components/TimelineList.vue @@ -22,7 +22,9 @@ <template> <div class="social__timeline"> - <timeline-entry v-for="entry in timeline" :key="entry.id" :item="entry" /> + <transition-group name="list" tag="div"> + <timeline-entry v-for="entry in timeline" :key="entry.id" :item="entry" /> + </transition-group> <infinite-loading ref="infiniteLoading" @infinite="infiniteHandler"> <div slot="spinner"> <div class="icon-loading" /> @@ -37,6 +39,22 @@ </div> </template> +<style scoped> + .list-item { + } + .list-enter-active, .list-leave-active { + transition: all .5s; + } + .list-enter { + opacity: 0; + transform: translateY(-30px); + } + .list-leave-to { + opacity: 0; + transform: translateX(-100px); + } +</style> + <script> import InfiniteLoading from 'vue-infinite-loading' import TimelineEntry from './../components/TimelineEntry' diff --git a/src/store/timeline.js b/src/store/timeline.js index be1ca66c..38f9e090 100644 --- a/src/store/timeline.js +++ b/src/store/timeline.js @@ -37,6 +37,9 @@ const mutations = { Vue.set(state.timeline, data[item].id, data[item]) } }, + removePost(state, post) { + Vue.delete(state.timeline, post.id) + }, resetTimeline(state) { state.timeline = {} state.since = Math.floor(Date.now() / 1000) + 1 @@ -83,6 +86,16 @@ const actions = { }) }) }, + postDelete(context, post) { + return axios.delete(OC.generateUrl(`apps/social/api/v1/post?id=${post.id}`)).then((response) => { + context.commit('removePost', post) + // eslint-disable-next-line no-console + console.log('Post deleted with token ' + response.data.result.token) + }).catch((error) => { + OC.Notification.showTemporary('Failed to delete the post') + console.error('Failed to delete the post', error) + }) + }, refreshTimeline(context) { return this.dispatch('fetchTimeline', { sinceTimestamp: Math.floor(Date.now() / 1000) + 1 }) },