Social: add/delete comments using social_posts API

pull/4161/head
Angel Fernando Quiroz Campos 4 years ago
parent b5e929ed50
commit 2df26177bc
  1. 39
      assets/vue/components/social/CommentForm.vue
  2. 91
      assets/vue/components/social/WallComment.vue
  3. 16
      assets/vue/components/social/WallPost.vue

@ -8,6 +8,7 @@
<div class="row justify-end"> <div class="row justify-end">
<q-btn <q-btn
:label="$t('Post')" :label="$t('Post')"
:loading="isLoading"
icon="send" icon="send"
@click="sendComment" @click="sendComment"
/> />
@ -18,7 +19,9 @@
<script> <script>
import {ref} from "vue"; import {ref} from "vue";
import {useStore} from "vuex"; import {useStore} from "vuex";
import {MESSAGE_TYPE_WALL} from "../message/constants"; import axios from "axios";
import {ENTRYPOINT} from "../../config/entrypoint";
import {SOCIAL_TYPE_WALL_COMMENT} from "./constants";
export default { export default {
name: "WallCommentForm", name: "WallCommentForm",
@ -28,28 +31,40 @@ export default {
required: true, required: true,
} }
}, },
setup(props) { emits: ["comment-posted"],
setup(props, {emit}) {
const store = useStore(); const store = useStore();
const currentUser = store.getters['security/getUser']; const currentUser = store.getters['security/getUser'];
const comment = ref(''); const comment = ref('');
const isLoading = ref(false);
async function sendComment() { function sendComment() {
await store.dispatch('message/create', { isLoading.value = true;
title: 'Comment',
content: comment.value,
msgType: MESSAGE_TYPE_WALL,
sender: currentUser['@id'],
parent: props.post['@id'],
});
comment.value = ''; axios
.post(ENTRYPOINT + 'social_posts', {
content: comment.value,
type: SOCIAL_TYPE_WALL_COMMENT,
sender: currentUser['@id'],
parent: props.post['@id'],
})
.then(response => {
emit('comment-posted', response.data);
comment.value = '';
})
.finally(() => {
isLoading.value = false
})
;
} }
return { return {
sendComment, sendComment,
comment comment,
isLoading,
}; };
} }
} }

@ -1,49 +1,66 @@
<template> <template>
<q-item bordered> <q-item>
<q-item-section avatar top> <q-item-section avatar top>
<q-avatar> <q-avatar>
<img :src="comment.sender.illustrationUrl"> <img :src="comment.sender.illustrationUrl">
</q-avatar> </q-avatar>
</q-item-section> </q-item-section>
<q-item-section> <q-item-section top>
<q-item-label class="font-bold" lines="1">{{ comment.sender.username }}</q-item-label> <q-item-label lines="1">
<span class="text-weight-medium">{{ comment.sender.fullName }}</span>
</q-item-label>
<q-item-label v-html="comment.content" /> <q-item-label v-html="comment.content" />
<q-item-label caption>{{ $filters.relativeDatetime(comment.sendDate) }}</q-item-label> <q-item-label
:title="$filters.abbreviatedDatetime(comment.sendDate)"
caption
>
{{ $filters.relativeDatetime(comment.sendDate) }}
</q-item-label>
</q-item-section> </q-item-section>
<q-item-section side top> <q-item-section side top>
<q-btn <div class="text-grey-8 q-gutter-xs">
v-if="enableFeedback" <q-btn
:label="comment.countFeedbackLikes" v-if="enableFeedback"
:title="$t('Like')" :label="comment.countFeedbackLikes"
dense :title="$t('Like')"
flat class="gt-xs"
icon="mdi-heart-plus" dense
/> flat
<q-btn icon="mdi-heart-plus"
v-if="enableFeedback && !disableDislike" size="12px"
:label="comment.countFeedbackDislikes" />
:title="$t('Dislike')" <q-btn
dense v-if="enableFeedback && !disableDislike"
flat :label="comment.countFeedbackDislikes"
icon="mdi-heart-remove" :title="$t('Dislike')"
/> class="gt-xs"
<q-btn dense
v-if="isOwner" flat
:title="$t('Delete comment')" icon="mdi-heart-remove"
dense size="12px"
flat />
icon="delete" <q-btn
@click="deleteComment" v-if="isOwner"
/> :loading="isLoading"
:title="$t('Delete comment')"
class="gt-xs"
dense
flat
icon="delete"
size="12px"
@click="deleteComment"
/>
</div>
</q-item-section> </q-item-section>
</q-item> </q-item>
</template> </template>
<script> <script>
import {useStore} from "vuex"; import {useStore} from "vuex";
import {ref} from "vue"; import {computed, ref} from "vue";
import axios from "axios";
export default { export default {
name: "WallComment", name: "WallComment",
@ -53,16 +70,21 @@ export default {
required: true required: true
} }
}, },
emits: ['deleted'], emits: ['comment-deleted'],
setup(props, context) { setup(props, context) {
const store = useStore(); const store = useStore();
const isLoading = ref(false);
const currentUser = store.getters['security/getUser']; const currentUser = store.getters['security/getUser'];
function deleteComment() { function deleteComment() {
store isLoading.value = true;
.dispatch('socialpost/del', props.comment)
.then(() => context.emit('deleted')); axios
.delete(props.comment['@id'])
.then(() => context.emit('comment-deleted', props.comment))
.finally(() => isLoading.value = false)
;
} }
const enableFeedback = ref(window.config['social.social_enable_messages_feedback'] === 'true'); const enableFeedback = ref(window.config['social.social_enable_messages_feedback'] === 'true');
@ -70,9 +92,10 @@ export default {
return { return {
deleteComment, deleteComment,
isOwner: currentUser['@id'] === props.comment.sender['@id'], isOwner: computed(() => currentUser['@id'] === props.comment.sender['@id']),
enableFeedback, enableFeedback,
disableDislike, disableDislike,
isLoading,
}; };
} }
} }

@ -64,11 +64,11 @@
v-for="(comment, index) in comments" v-for="(comment, index) in comments"
:key="index" :key="index"
:comment="comment" :comment="comment"
@deleted="onDeletedComment(index)" @comment-deleted="onCommentDeleted(index, $event)"
/> />
</q-list> </q-list>
<WallCommentForm :post="post" /> <WallCommentForm :post="post" @comment-posted="onCommentPosted" />
</q-card> </q-card>
</template> </template>
@ -104,13 +104,18 @@ export default {
itemsPerPage: 3, itemsPerPage: 3,
} }
}) })
.then(response => comments.push(...response.data['hydra:member'])); .then(response => comments.push(...response.data['hydra:member']))
;
} }
function onDeletedComment(index) { function onCommentDeleted(index, event) {
comments.splice(index, 1); comments.splice(index, 1);
} }
function onCommentPosted(newComment) {
comments.unshift(newComment);
}
onMounted(loadComments); onMounted(loadComments);
return { return {
@ -118,7 +123,8 @@ export default {
containsImage, containsImage,
containsVideo, containsVideo,
comments, comments,
onDeletedComment, onCommentDeleted,
onCommentPosted,
} }
} }
} }

Loading…
Cancel
Save