Piped/src/components/CommentItem.vue

99 lines
3.6 KiB
Vue
Raw Normal View History

2021-07-21 10:19:51 +00:00
<template>
<div class="comment flex mt-1.5">
<img
:src="comment.thumbnail"
2021-12-27 14:46:36 +00:00
class="comment-avatar rounded-full w-12 h-12"
2021-11-01 20:23:04 +00:00
height="48"
width="48"
loading="lazy"
alt="Avatar"
/>
2021-07-21 10:19:51 +00:00
2021-12-27 14:46:36 +00:00
<div class="comment-content pl-2">
<div class="comment-header">
<div v-if="comment.pinned" class="comment-pinned">
2021-12-27 22:33:55 +00:00
<font-awesome-icon icon="thumbtack" />
<span class="ml-1.5" v-text="$t('comment.pinned_by')" />
2021-12-27 16:29:25 +00:00
<span v-text="uploader" />
</div>
2021-07-21 10:19:51 +00:00
<div class="comment-author">
<router-link class="font-bold link" :to="comment.commentorUrl" v-text="comment.author" />
2021-12-27 22:33:55 +00:00
<font-awesome-icon class="ml-1.5" v-if="comment.verified" icon="check" />
</div>
<div class="comment-meta text-sm mb-1.5" v-text="comment.commentedTime" />
</div>
2021-12-27 16:29:25 +00:00
<div class="whitespace-pre-wrap" v-text="comment.commentText" />
<div class="comment-footer mt-1">
2021-12-27 22:33:55 +00:00
<font-awesome-icon icon="thumbs-up" />
2021-12-27 16:29:25 +00:00
<span class="ml-1" v-text="numberFormat(comment.likeCount)" />
2021-12-27 22:33:55 +00:00
<font-awesome-icon class="ml-1" v-if="comment.hearted" icon="heart" />
</div>
<template v-if="comment.repliesPage && (!loadingReplies || !showingReplies)">
<div @click="loadReplies" class="cursor-pointer">
<a v-t="'actions.show_replies'" />
<font-awesome-icon class="ml-1.5" icon="level-down-alt" />
2021-11-01 20:23:04 +00:00
</div>
</template>
<template v-if="showingReplies">
<div @click="hideReplies" class="cursor-pointer">
<a v-t="'actions.hide_replies'" />
<font-awesome-icon class="ml-1.5" icon="level-up-alt" />
</div>
</template>
2021-12-27 14:46:36 +00:00
<div v-show="showingReplies" v-if="replies" class="replies">
<div v-for="reply in replies" :key="reply.commentId" class="w-full">
<CommentItem :comment="reply" :uploader="uploader" :video-id="videoId" />
2021-11-01 20:23:04 +00:00
</div>
<div v-if="nextpage" @click="loadReplies" class="cursor-pointer">
<a v-t="'actions.load_more_replies'" />
<font-awesome-icon class="ml-1.5" icon="level-down-alt" />
2021-11-01 20:23:04 +00:00
</div>
</div>
2021-07-21 10:19:51 +00:00
</div>
</div>
</template>
<script>
export default {
2021-07-21 10:19:51 +00:00
props: {
comment: {
type: Object,
default: () => {
return {};
},
},
uploader: { type: String, default: null },
2021-11-01 20:23:04 +00:00
videoId: { type: String, default: null },
},
data() {
return {
loadingReplies: false,
showingReplies: false,
2021-11-01 20:23:04 +00:00
replies: [],
nextpage: null,
};
},
methods: {
async loadReplies() {
if (!this.showingReplies && this.loadingReplies) {
this.showingReplies = true;
return;
}
this.loadingReplies = true;
this.showingReplies = true;
2021-11-01 20:23:04 +00:00
this.fetchJson(this.apiUrl() + "/nextpage/comments/" + this.videoId, {
nextpage: this.nextpage || this.comment.repliesPage,
}).then(json => {
this.replies = this.replies.concat(json.comments);
this.nextpage = json.nextpage;
});
},
async hideReplies() {
this.showingReplies = false;
},
},
};
</script>