Whalebird-desktop-client-ma.../src/renderer/components/TimelineSpace/Modals/NewToot/Quote.vue

174 lines
3.8 KiB
Vue

<template>
<div class="quote-target">
<div class="icon">
<FailoverImg :src="message.account.avatar" />
</div>
<div class="detail">
<div class="toot-header">
<div class="user">
<span class="display-name"><bdi v-html="username(message.account)"></bdi></span>
<span class="acct">{{ accountName(message.account) }}</span>
</div>
<div class="clearfix"></div>
</div>
<div class="content-wrapper">
<div class="spoiler" v-html="emojiText(message.spoiler_text, message.emojis)"></div>
<div class="content" v-html="emojiText(message.content, message.emojis)"></div>
</div>
</div>
<div class="clearfix"></div>
</div>
</template>
<script lang="ts">
import { defineComponent, toRefs } from 'vue'
import DisplayStyle from '~/src/constants/displayStyle'
import FailoverImg from '@/components/atoms/FailoverImg.vue'
import emojify from '@/utils/emojify'
import { Entity } from 'megalodon'
export default defineComponent({
new: 'quote-target',
components: {
FailoverImg
},
props: {
message: {
type: Object,
default: {}
},
displayNameStyle: {
type: Number,
default: 0
}
},
setup(props) {
const { displayNameStyle } = toRefs(props)
const username = (account: Entity.Account) => {
switch (displayNameStyle.value) {
case DisplayStyle.DisplayNameAndUsername.value:
if (account.display_name !== '') {
return emojify(account.display_name, account.emojis)
} else {
return account.acct
}
case DisplayStyle.DisplayName.value:
if (account.display_name !== '') {
return emojify(account.display_name, account.emojis)
} else {
return account.acct
}
default:
return account.acct
}
}
const accountName = (account: Entity.Account) => {
switch (displayNameStyle.value) {
case DisplayStyle.DisplayNameAndUsername.value:
return `@${account.acct}`
case DisplayStyle.DisplayName.value:
default:
return ''
}
}
const emojiText = (content: string, emojis: Array<Entity.Emoji>) => {
return emojify(content, emojis)
}
return {
username,
accountName,
emojiText
}
}
})
</script>
<style lang="scss" scoped>
.quote-target {
background-color: var(--theme-background-color);
padding: 8px 12px;
.icon {
float: left;
img {
width: 28px;
height: 28px;
border-radius: 4px;
display: block;
}
}
.detail {
margin: 0 8px 0 8px;
float: left;
width: calc(100% - 52px);
.content-wrapper {
font-size: var(--base-font-size);
color: var(--theme-primary-color);
blockquote {
padding-left: 10px;
border-left: 3px solid #9baec8;
color: #9baec8;
margin: 0;
}
.content {
margin: var(--toot-padding) 0;
word-wrap: break-word;
pre {
white-space: pre-wrap;
}
}
.content p {
unicode-bidi: plaintext;
}
}
.content-wrapper :deep(.emojione) {
width: 20px;
height: 20px;
}
.toot-header {
.user {
float: left;
font-size: var(--base-font-size);
white-space: nowrap;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
.display-name {
font-weight: 800;
color: var(--theme-primary-color);
}
.display-name :deep(.emojione) {
max-width: 14px;
max-height: 14px;
}
.acct {
font-weight: normal;
color: var(--theme-secondary-color);
}
}
}
.spoiler {
margin: 8px 0;
&:empty {
display: none;
}
}
}
}
</style>