mixit/src/services/mastodon/Status.vue

119 lines
4.7 KiB
Vue
Raw Normal View History

2019-05-01 15:07:08 +00:00
<template lang="pug">
.status
account(v-if="withAccount" :account="status.account" :showMedia="showMedia")
span.text-icon.letter(v-if="status.reblog")
2019-05-03 15:03:13 +00:00
a.date(target="_blank" :href="status.uri") {{ fromNow(status.created_at) }}
2019-05-01 15:07:08 +00:00
.content(:class="{ avatared: showMedia }")
template(v-if="!status.reblog")
.spoiler(v-if="status.spoiler_text" @click.stop.prevent="status.sensitive = !status.sensitive").
{{ status.spoiler_text || 'Spoiler' }} {{ status.sensitive ? '&rarr;' : '&darr;' }}
div(v-if="!status.spoiler_text || !status.sensitive")
.text(v-html="parseEmojis(status.content, status.emojis, showMedia)")
2019-05-28 09:51:06 +00:00
.poll(v-if="status.poll")
.date {{ fromNow(status.poll.expires_at) }}
form.options(@submit.prevent="makeVote(status, $event.target.elements)")
.option(v-for="option in status.poll.options")
input(v-if="!status.poll.expired && !status.poll.voted" :type="status.poll.multiple ? 'checkbox' : 'radio'" :id="status.poll.id + option.title" :value="option.title" :name="status.poll.id")
label(:for="status.poll.id + option.title")
| {{ option.title }}
span.note {{ option.votes_count }}
button(v-if="status.poll.voted") voted
button(v-else-if="status.poll.expired") expired
input(v-else type="submit" value="vote")
2019-05-01 15:07:08 +00:00
a.media(v-for="media in status.media_attachments" :href="media.url" target="_blank")
template(v-if="showMedia")
img(v-if="media.type == 'image' || media.type == 'gifv'" :src="media.preview_url" :alt="media.description" :title="media.description")
template(v-else) Wrong type
.gif(v-if="media.type == 'gifv'") GIF
2019-05-27 12:31:43 +00:00
template(v-else) Hidden media {{ media.description }}
a.card(v-if="status.card" :href="status.card.url" target="_blank")
a.provider(v-if="status.card.provider_name" :src="status.card.provider_url" target="_blank") {{ status.card.provider_name }}
.title {{ status.card.title }}
.descr {{ status.card.description }}
template(v-if="status.card.image")
img(v-if="showMedia" :src="status.card.image")
a(v-else-if="status.card.type == 'photo'" :src="status.card.image" target="_blank") Hidden media
2019-05-29 07:02:43 +00:00
status.reblog(v-else :status="status.reblog" :showMedia="showMedia" @mark="passMark" @vote="passVote" @context="passContext")
2019-05-01 15:07:08 +00:00
.meta(v-if="!status.reblog")
a.replies(@click.stop.prevent="makeReply(status)")
span.text-icon
| {{ status.replies_count }}
a.reblogs(:class="{ colored: status.reblogged }" @click.stop.prevent="makeReblog(status)")
span.text-icon
| {{ status.reblogs_count }}
a.favourites(:class="{ colored: status.favourited }" @click.stop.prevent="makeFav(status)")
span.text-icon
| {{ status.favourites_count }}
2019-05-27 13:44:49 +00:00
a.visibility
template(v-if="status.visibility == 'public'")
template(v-else-if="status.visibility == 'unlisted'") 👁
template(v-else-if="status.visibility == 'private'")
template(v-else-if="status.visibility == 'direct'")
2019-05-29 07:02:43 +00:00
a.fil(@click.stop.prevent="passContext(status)")
span.text-icon
2019-05-01 15:07:08 +00:00
</template>
<script lang="ts">
import { Component, Emit, Mixins, Prop } from 'vue-property-decorator'
2019-05-03 15:03:13 +00:00
import FromNowMixin from '@/components/FromNowMixin'
2019-05-02 16:28:00 +00:00
import ShowMediaMixin from '@/components/ShowMediaMixin'
2019-05-03 15:03:13 +00:00
import Account from './Account.vue'
2019-05-01 15:07:08 +00:00
import { ParseEmojisMixin } from './ParseEmojisMixin'
2019-05-28 09:51:06 +00:00
import { Card, MarkStatus, MarkStatusType, Poll, PollVote, Status as IStatus } from './Types'
2019-05-01 15:07:08 +00:00
2019-05-03 15:03:13 +00:00
@Component({ components: { Account } })
export default class Status extends Mixins(ParseEmojisMixin, ShowMediaMixin, FromNowMixin) {
2019-05-01 15:07:08 +00:00
@Prop(Object)
readonly status!: IStatus
@Prop({ type: Boolean, default: true })
readonly withAccount!: boolean
2019-05-28 09:51:06 +00:00
@Emit('mark')
passMark(action: MarkStatus) {
return action
}
@Emit('vote')
passVote(action: PollVote) {
return action
}
2019-05-29 07:02:43 +00:00
@Emit('context')
passContext(status: IStatus) {
return status
}
2019-05-28 09:51:06 +00:00
makeVote(status: IStatus, elements: HTMLInputElement[]) {
const choices = Object.values(elements).filter(e => e.checked).map(e => e.value)
if(choices.length > 0) {
2019-05-29 07:02:43 +00:00
this.passVote({ id: status.id, poll: status.poll!.id, choices })
2019-05-01 15:07:08 +00:00
}
}
2019-05-29 07:02:43 +00:00
makeMark(status: IStatus, action: string, undo: boolean) {
this.passMark({
id: status.id, type: (undo ? 'un' : '') + action as MarkStatusType
})
}
2019-05-01 15:07:08 +00:00
makeReblog(status: IStatus) {
2019-05-29 07:02:43 +00:00
this.makeMark(status, 'reblog', status.reblogged)
2019-05-01 15:07:08 +00:00
}
makeFav(status: IStatus) {
2019-05-29 07:02:43 +00:00
this.makeMark(status, 'favourite', status.favourited)
}
makeReply(status: IStatus) {
throw status.id // TODO:
2019-05-01 15:07:08 +00:00
}
}
</script>