feat: add threaded drafts & posts (#2715)

Co-authored-by: Sebastian Di Luzio <sebastian.di-luzio@iu.org>
Co-authored-by: Emanuel Pina <contacto@emanuelpina.pt>
Co-authored-by: lazzzis <lazzzis@outlook.com>
Co-authored-by: Joaquín Sánchez <userquin@gmail.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
Co-authored-by: Francesco <129339155+katullo11@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: patak-dev <matias.capeletto@gmail.com>
This commit is contained in:
Sebastian Di Luzio 2024-04-08 11:53:26 +02:00 committed by GitHub
parent 0538f97ada
commit 1234fb2dd1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 634 additions and 377 deletions

View file

@ -1,5 +1,6 @@
<script setup lang="ts">
import { formatTimeAgo } from '@vueuse/core'
import type { DraftItem } from '~/types'
const route = useRoute()
const { formatNumber } = useHumanReadableNumber()
@ -20,35 +21,39 @@ watchEffect(() => {
onDeactivated(() => {
clearEmptyDrafts()
})
function firstDraftItemOf(drafts: DraftItem | Array<DraftItem>): DraftItem {
if (Array.isArray(drafts))
return drafts[0]
return drafts
}
</script>
<template>
<div flex="~ col" pt-6 h-screen>
<div flex="~ col" pb-6>
<div inline-flex justify-end h-8>
<VDropdown v-if="nonEmptyDrafts.length" placement="bottom-end">
<button btn-text flex="inline center">
{{ $t('compose.drafts', nonEmptyDrafts.length, { named: { v: formatNumber(nonEmptyDrafts.length) } }) }}&#160;<div aria-hidden="true" i-ri:arrow-down-s-line />
{{ $t('compose.drafts', nonEmptyDrafts.length, { named: { v: formatNumber(nonEmptyDrafts.length) } }) }}&#160;
<div aria-hidden="true" i-ri:arrow-down-s-line />
</button>
<template #popper="{ hide }">
<div flex="~ col">
<NuxtLink
v-for="[key, draft] of nonEmptyDrafts" :key="key"
border="b base" text-left py2 px4 hover:bg-active
:replace="true"
:to="`/compose?draft=${encodeURIComponent(key)}`"
@click="hide()"
v-for="[key, drafts] of nonEmptyDrafts" :key="key" border="b base" text-left py2 px4
hover:bg-active :replace="true" :to="`/compose?draft=${encodeURIComponent(key)}`" @click="hide()"
>
<div>
<div flex="~ gap-1" items-center>
<i18n-t keypath="compose.draft_title">
<code>{{ key }}</code>
</i18n-t>
<span v-if="draft.lastUpdated" text-secondary text-sm>
&middot; {{ formatTimeAgo(new Date(draft.lastUpdated), timeAgoOptions) }}
<span v-if="firstDraftItemOf(drafts).lastUpdated" text-secondary text-sm>
&middot; {{ formatTimeAgo(new Date(firstDraftItemOf(drafts).lastUpdated), timeAgoOptions) }}
</span>
</div>
<div text-secondary>
{{ htmlToText(draft.params.status).slice(0, 50) }}
{{ htmlToText(firstDraftItemOf(drafts).params.status).slice(0, 50) }}
</div>
</div>
</NuxtLink>
@ -57,7 +62,7 @@ onDeactivated(() => {
</VDropdown>
</div>
<div>
<PublishWidget :key="draftKey" expanded class="min-h-100!" :draft-key="draftKey" />
<PublishWidgetList expanded class="min-h-100!" :draft-key="draftKey" />
</div>
</div>
</template>