Files
AstralRinth/packages/ui/src/components/project/ProjectSidebarDetails.vue
T

149 lines
4.1 KiB
Vue

<template>
<div class="flex flex-col gap-3">
<h2 class="text-lg m-0">{{ formatMessage(commonMessages.detailsLabel) }}</h2>
<div class="flex flex-col gap-3 font-semibold [&>div]:flex [&>div]:gap-2 [&>div]:items-center">
<div v-if="!hideLicense">
<BookTextIcon aria-hidden="true" />
<div>
<IntlFormatted :message-id="messages.licensed">
<template #~license>
<a
v-if="project.license.url"
class="text-link hover:underline"
:href="project.license.url"
:target="linkTarget"
rel="noopener nofollow ugc"
>
{{ licenseIdDisplay }}
<ExternalIcon aria-hidden="true" class="external-icon ml-1 mt-[-1px] inline" />
</a>
<span
v-else-if="
project.license.id === 'LicenseRef-All-Rights-Reserved' ||
!project.license.id.includes('LicenseRef')
"
>
{{ licenseIdDisplay }}
</span>
<span v-else>{{ licenseIdDisplay }}</span>
</template>
</IntlFormatted>
</div>
</div>
<div v-if="showFollowers">
<HeartIcon aria-hidden="true" />
<div>
{{ formatMessage(commonMessages.projectFollowers, { count: project.followers }) }}
</div>
</div>
<div
v-if="project.approved"
v-tooltip="dayjs(project.approved).format('MMMM D, YYYY [at] h:mm A')"
>
<CalendarIcon aria-hidden="true" />
<div>
{{
capitalizeString(
formatMessage(commonMessages.projectPublished, { date: publishedDate }),
)
}}
</div>
</div>
<div v-else v-tooltip="dayjs(project.published).format('MMMM D, YYYY [at] h:mm A')">
<CalendarIcon aria-hidden="true" />
<div>
{{
capitalizeString(formatMessage(commonMessages.projectCreated, { date: createdDate }))
}}
</div>
</div>
<div
v-if="project.status === 'processing' && project.queued"
v-tooltip="dayjs(project.queued).format('MMMM D, YYYY [at] h:mm A')"
>
<ScaleIcon aria-hidden="true" />
<div>
{{
capitalizeString(
formatMessage(commonMessages.projectSubmitted, { date: submittedDate }),
)
}}
</div>
</div>
<div
v-if="hasVersions && project.updated"
v-tooltip="dayjs(project.updated).format('MMMM D, YYYY [at] h:mm A')"
>
<VersionIcon aria-hidden="true" />
<div>
{{
capitalizeString(formatMessage(commonMessages.projectUpdated, { date: updatedDate }))
}}
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import {
BookTextIcon,
CalendarIcon,
ExternalIcon,
HeartIcon,
ScaleIcon,
VersionIcon,
} from '@modrinth/assets'
import { capitalizeString } from '@modrinth/utils'
import dayjs from 'dayjs'
import { computed } from 'vue'
import { useRelativeTime } from '../../composables'
import { defineMessages, useVIntl } from '../../composables/i18n'
import { commonMessages } from '../../utils/common-messages'
import { IntlFormatted } from '../base'
const { formatMessage } = useVIntl()
const formatRelativeTime = useRelativeTime()
const props = defineProps<{
project: Labrinth.Projects.v2.Project
linkTarget: string
hasVersions: boolean
hideLicense?: boolean
showFollowers?: boolean
}>()
const createdDate = computed(() =>
props.project.published ? formatRelativeTime(props.project.published) : 'unknown',
)
const submittedDate = computed(() =>
props.project.queued ? formatRelativeTime(props.project.queued) : 'unknown',
)
const publishedDate = computed(() =>
props.project.approved ? formatRelativeTime(props.project.approved) : 'unknown',
)
const updatedDate = computed(() =>
props.project.updated ? formatRelativeTime(props.project.updated) : 'unknown',
)
const licenseIdDisplay = computed(() => {
const id = props.project.license.id
if (id === 'LicenseRef-All-Rights-Reserved') {
return 'ARR'
} else if (id.includes('LicenseRef')) {
return id.replaceAll('LicenseRef-', '').replaceAll('-', ' ')
} else {
return id
}
})
const messages = defineMessages({
licensed: {
id: 'project.about.details.licensed',
defaultMessage: 'Licensed {license}',
},
})
</script>