diff options
author | Maxence Lange <maxence@artificial-owl.com> | 2019-07-11 13:24:32 -0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-11 13:24:32 -0100 |
commit | b3e1c5a50c559116985001d4e799f88b29f0720b (patch) | |
tree | ed24dde759141fde8ff9ec538891f2859f0cd2f5 | |
parent | 14868bc763537ced27d5c1204c6d1b420b94ae23 (diff) | |
parent | 3d1aba30a901dbbc87c0f7c248cbfb2d35573fab (diff) |
Merge pull request #621 from StCyr/StCyr_fix617
[WIP] Add a like button
-rw-r--r-- | lib/Controller/LocalController.php | 4 | ||||
-rw-r--r-- | lib/Service/LikeService.php | 6 | ||||
-rw-r--r-- | src/components/TimelinePost.vue | 20 | ||||
-rw-r--r-- | src/store/timeline.js | 40 |
4 files changed, 65 insertions, 5 deletions
diff --git a/lib/Controller/LocalController.php b/lib/Controller/LocalController.php index a08d7aa0..8ba30850 100644 --- a/lib/Controller/LocalController.php +++ b/lib/Controller/LocalController.php @@ -261,7 +261,7 @@ class LocalController extends Controller { /** - * Create a new boost. + * Like a post. * * @NoAdminRequired * @@ -287,7 +287,7 @@ class LocalController extends Controller { /** - * Delete a boost. + * unlike a post. * * @NoAdminRequired * diff --git a/lib/Service/LikeService.php b/lib/Service/LikeService.php index 4af98f34..044cf1c4 100644 --- a/lib/Service/LikeService.php +++ b/lib/Service/LikeService.php @@ -129,9 +129,9 @@ class LikeService { throw new StreamNotFoundException('Stream is not a Note'); } - if (!$note->isPublic()) { - throw new StreamNotFoundException('Stream is not Public'); - } +// if (!$note->isPublic()) { +// throw new StreamNotFoundException('Stream is not Public'); +// } $like->setObjectId($note->getId()); $this->assignInstance($like, $actor, $note); diff --git a/src/components/TimelinePost.vue b/src/components/TimelinePost.vue index 6108e698..6a37fb92 100644 --- a/src/components/TimelinePost.vue +++ b/src/components/TimelinePost.vue @@ -29,6 +29,7 @@ <a v-if="item.actor_info.account !== cloudId" v-tooltip.bottom="t('social', 'Boost')" :class="(isBoosted) ? 'icon-boosted' : 'icon-boost'" @click.prevent="boost" /> + <a v-tooltip.bottom="t('social', 'Like')" :class="(isLiked) ? 'icon-starred' : 'icon-favorite'" @click.prevent="like" /> <div v-if="popoverMenu.length > 0" v-tooltip.bottom="menuOpened ? '' : t('social', 'More actions')" class="post-actions-more"> <a class="icon-more" @click.prevent="togglePopoverMenu" /> <div :class="{open: menuOpened}" class="popovermenu menu-center"> @@ -122,6 +123,12 @@ export default { return false } return !!this.item.action.values.boosted + }, + isLiked() { + if (typeof this.item.action === 'undefined') { + return false + } + return !!this.item.action.values.liked } }, methods: { @@ -141,6 +148,17 @@ export default { } else { this.$store.dispatch('postBoost', params) } + }, + like() { + let params = { + post: this.item, + parentAnnounce: this.parentAnnounce + } + if (this.isLiked) { + this.$store.dispatch('postUnlike', params) + } else { + this.$store.dispatch('postLike', params) + } } } } @@ -184,6 +202,8 @@ export default { .icon-reply, .icon-boost, .icon-boosted, + .icon-starred, + .icon-favorite, .icon-more { display: inline-block; width: 44px; diff --git a/src/store/timeline.js b/src/store/timeline.js index accf5a7b..3146a194 100644 --- a/src/store/timeline.js +++ b/src/store/timeline.js @@ -54,6 +54,22 @@ const mutations = { setAccount(state, account) { state.account = account }, + likePost(state, { post, parentAnnounce }) { + if (typeof state.timeline[post.id] !== 'undefined') { + Vue.set(state.timeline[post.id].action.values, 'liked', true) + } + if (typeof parentAnnounce.id !== 'undefined') { + Vue.set(state.timeline[parentAnnounce.id].cache[parentAnnounce.object].object.action.values, 'liked', true) + } + }, + unlikePost(state, { post, parentAnnounce }) { + if (typeof state.timeline[post.id] !== 'undefined') { + Vue.set(state.timeline[post.id].action.values, 'liked', false) + } + if (typeof parentAnnounce.id !== 'undefined') { + Vue.set(state.timeline[parentAnnounce.id].cache[parentAnnounce.object].object.action.values, 'liked', false) + } + }, boostPost(state, { post, parentAnnounce }) { if (typeof state.timeline[post.id] !== 'undefined') { Vue.set(state.timeline[post.id].action.values, 'boosted', true) @@ -113,6 +129,30 @@ const actions = { console.error('Failed to delete the post', error) }) }, + postLike(context, { post, parentAnnounce }) { + return new Promise((resolve, reject) => { + axios.post(OC.generateUrl(`apps/social/api/v1/post/like?postId=${post.id}`)).then((response) => { + context.commit('likePost', { post, parentAnnounce }) + // eslint-disable-next-line no-console + console.log('Post liked with token ' + response.data.result.token) + resolve(response) + }).catch((error) => { + OC.Notification.showTemporary('Failed to like post') + console.error('Failed to like post', error.response) + reject(error) + }) + }) + }, + postUnlike(context, { post, parentAnnounce }) { + return axios.delete(OC.generateUrl(`apps/social/api/v1/post/like?postId=${post.id}`)).then((response) => { + context.commit('unlikePost', { post, parentAnnounce }) + // eslint-disable-next-line no-console + console.log('Post unliked with token ' + response.data.result.token) + }).catch((error) => { + OC.Notification.showTemporary('Failed to unlike post') + console.error('Failed to unlike post', error) + }) + }, postBoost(context, { post, parentAnnounce }) { return new Promise((resolve, reject) => { axios.post(OC.generateUrl(`apps/social/api/v1/post/boost?postId=${post.id}`)).then((response) => { |