summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2019-07-11 13:24:32 -0100
committerGitHub <noreply@github.com>2019-07-11 13:24:32 -0100
commitb3e1c5a50c559116985001d4e799f88b29f0720b (patch)
treeed24dde759141fde8ff9ec538891f2859f0cd2f5
parent14868bc763537ced27d5c1204c6d1b420b94ae23 (diff)
parent3d1aba30a901dbbc87c0f7c248cbfb2d35573fab (diff)
Merge pull request #621 from StCyr/StCyr_fix617
[WIP] Add a like button
-rw-r--r--lib/Controller/LocalController.php4
-rw-r--r--lib/Service/LikeService.php6
-rw-r--r--src/components/TimelinePost.vue20
-rw-r--r--src/store/timeline.js40
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) => {