elk/components/status/StatusContent.vue

75 lines
3.2 KiB
Vue
Raw Normal View History

2022-12-26 07:37:42 +00:00
<script setup lang="ts">
2023-01-08 06:21:09 +00:00
import type { mastodon } from 'masto'
2022-12-26 07:37:42 +00:00
const { status, context } = defineProps<{
2023-01-08 06:21:09 +00:00
status: mastodon.v1.Status
2023-01-18 15:59:37 +00:00
newer?: mastodon.v1.Status
2023-01-08 06:21:09 +00:00
context?: mastodon.v2.FilterContext | 'details'
2023-02-15 10:34:23 +00:00
isPreview?: boolean
2023-03-19 20:55:19 +00:00
inNotification?: boolean
2022-12-26 07:37:42 +00:00
}>()
const isDM = computed(() => status.visibility === 'direct')
const isDetails = computed(() => context === 'details')
2022-12-26 07:37:42 +00:00
// Content Filter logic
const filterResult = computed(() => status.filtered?.length ? status.filtered[0] : null)
const filter = computed(() => filterResult.value?.filter)
2022-12-26 07:37:42 +00:00
const filterPhrase = computed(() => filter.value?.title)
const isFiltered = computed(() => status.account.id !== currentUser.value?.account.id && filterPhrase && context && context !== 'details' && !!filter.value?.context.includes(context))
2023-02-05 15:05:42 +00:00
// check spoiler text or media attachment
// needed to handle accounts that mark all their posts as sensitive
const spoilerTextPresent = computed(() => !!status.spoilerText && status.spoilerText.trim().length > 0)
const hasSpoilerOrSensitiveMedia = computed(() => spoilerTextPresent.value || (status.sensitive && !!status.mediaAttachments.length))
const isSensitiveNonSpoiler = computed(() => status.sensitive && !status.spoilerText && !!status.mediaAttachments.length)
const hideAllMedia = computed(
() => {
return currentUser.value ? (getHideMediaByDefault(currentUser.value.account) && (!!status.mediaAttachments.length || !!status.card?.html)) : false
},
)
const embeddedMediaPreference = usePreferences('experimentalEmbeddedMedia')
const allowEmbeddedMedia = computed(() => status.card?.html && embeddedMediaPreference.value)
2022-12-26 07:37:42 +00:00
</script>
<template>
<div
space-y-3
:class="{
2023-01-10 05:58:07 +00:00
'pt2 pb0.5 px3.5 bg-dm rounded-4 me--1': isDM,
2023-01-03 16:25:43 +00:00
'ms--3.5 mt--1 ms--1': isDM && context !== 'details',
2022-12-26 07:37:42 +00:00
}"
>
<StatusBody v-if="(!isFiltered && isSensitiveNonSpoiler) || hideAllMedia" :status="status" :newer="newer" :with-action="!isDetails" :class="isDetails ? 'text-xl' : ''" />
<StatusSpoiler :enabled="hasSpoilerOrSensitiveMedia || isFiltered" :filter="isFiltered" :sensitive-non-spoiler="isSensitiveNonSpoiler || hideAllMedia" :is-d-m="isDM">
<template v-if="spoilerTextPresent" #spoiler>
<p>{{ status.spoilerText }}</p>
</template>
2023-02-05 15:05:42 +00:00
<template v-else-if="filterPhrase" #spoiler>
<p>{{ `${$t('status.filter_hidden_phrase')}: ${filterPhrase}` }}</p>
</template>
<StatusBody v-if="!(isSensitiveNonSpoiler || hideAllMedia)" :status="status" :newer="newer" :with-action="!isDetails" :class="isDetails ? 'text-xl' : ''" />
<StatusTranslation :status="status" />
<StatusPoll v-if="status.poll" :status="status" />
2022-12-26 07:37:42 +00:00
<StatusMedia
v-if="status.mediaAttachments?.length"
:status="status"
2023-02-15 10:34:23 +00:00
:is-preview="isPreview"
2022-12-26 07:37:42 +00:00
/>
<StatusPreviewCard
v-if="status.card && !allowEmbeddedMedia"
2022-12-26 07:37:42 +00:00
:card="status.card"
:small-picture-only="status.mediaAttachments?.length > 0"
/>
<StatusEmbeddedMedia v-if="allowEmbeddedMedia" :status="status" />
2022-12-26 07:37:42 +00:00
<StatusCard
v-if="status.reblog"
:status="status.reblog" border="~ rounded"
:actions="false"
/>
<div v-if="isDM" />
</StatusSpoiler>
</div>
</template>