display AI use types

This commit is contained in:
Prospector
2026-08-07 15:20:27 -07:00
parent 4d481acd41
commit 1626c9b436
2 changed files with 57 additions and 18 deletions
@@ -31,9 +31,7 @@
<SparklesIcon aria-hidden="true" /> <SparklesIcon aria-hidden="true" />
<div class="flex flex-col gap-1"> <div class="flex flex-col gap-1">
<span> <span>
{{ {{ capitalizeString(aiGeneratedLabel) }}
capitalizeString(formatMessage(messages.aiGeneratedContent, { type: aiContentType }))
}}
</span> </span>
<span v-if="aiDisclosure.note" class="text-sm text-secondary"> <span v-if="aiDisclosure.note" class="text-sm text-secondary">
{{ aiDisclosure.note }} {{ aiDisclosure.note }}
@@ -224,7 +222,7 @@ import { useQuery } from '@tanstack/vue-query'
import { computed, ref, useTemplateRef } from 'vue' import { computed, ref, useTemplateRef } from 'vue'
import { useFormatDateTime, useRelativeTime } from '../../composables' import { useFormatDateTime, useRelativeTime } from '../../composables'
import { defineMessages, useVIntl } from '../../composables/i18n' import { defineMessage, defineMessages, useVIntl } from '../../composables/i18n'
import { injectModrinthClient } from '../../providers' import { injectModrinthClient } from '../../providers'
import { commonMessages } from '../../utils/common-messages' import { commonMessages } from '../../utils/common-messages'
import { Avatar, IntlFormatted } from '../base' import { Avatar, IntlFormatted } from '../base'
@@ -233,7 +231,7 @@ import { NewModal } from '../modal'
const LICENSE_STALE_TIME = 1000 * 60 * 10 const LICENSE_STALE_TIME = 1000 * 60 * 10
const DISCLOSURE_STALE_TIME = 1000 * 60 * 5 const DISCLOSURE_STALE_TIME = 1000 * 60 * 5
const { formatMessage } = useVIntl() const { formatMessage, locale } = useVIntl()
const { labrinth } = injectModrinthClient() const { labrinth } = injectModrinthClient()
const formatRelativeTime = useRelativeTime() const formatRelativeTime = useRelativeTime()
const formatDateTime = useFormatDateTime({ const formatDateTime = useFormatDateTime({
@@ -241,6 +239,8 @@ const formatDateTime = useFormatDateTime({
dateStyle: 'long', dateStyle: 'long',
}) })
const AI_USE_ORDER: Labrinth.Projects.v3.AiUsage[] = ['code', 'assets', 'text', 'functionality']
const props = defineProps<{ const props = defineProps<{
project: Labrinth.Projects.v2.Project project: Labrinth.Projects.v2.Project
linkTarget: string linkTarget: string
@@ -278,8 +278,7 @@ const messages = defineMessages({
}, },
aiGeneratedContent: { aiGeneratedContent: {
id: 'project.disclosure.ai-generated-content.title', id: 'project.disclosure.ai-generated-content.title',
defaultMessage: defaultMessage: 'Contains AI-generated {types}',
'Contains AI-generated {type, select, code {code} assets {assets} code_assets {code and assets} text {text} functionality {functionality} other {content}}',
}, },
derivativeWork: { derivativeWork: {
id: 'project.disclosure.derivative-work.title', id: 'project.disclosure.derivative-work.title',
@@ -322,20 +321,45 @@ const derivativeWorkDisclosure = computed(() => findDisclosure('derivative_work'
const photosensitivityDisclosure = computed(() => findDisclosure('epilepsy_triggers')) const photosensitivityDisclosure = computed(() => findDisclosure('epilepsy_triggers'))
const systemInteractionsDisclosure = computed(() => findDisclosure('system_interactions')) const systemInteractionsDisclosure = computed(() => findDisclosure('system_interactions'))
const aiContentType = computed(() => { const aiUseLabels = {
code: defineMessage({
id: 'project.disclosure.ai-generated-content.use.code',
defaultMessage: 'code',
}),
assets: defineMessage({
id: 'project.disclosure.ai-generated-content.use.assets',
defaultMessage: 'assets',
}),
text: defineMessage({
id: 'project.disclosure.ai-generated-content.use.text',
defaultMessage: 'text',
}),
functionality: defineMessage({
id: 'project.disclosure.ai-generated-content.use.functionality',
defaultMessage: 'functionality',
}),
content: defineMessage({
id: 'project.disclosure.ai-generated-content.use.content',
defaultMessage: 'content',
}),
} as const
const aiGeneratedLabel = computed(() => {
const disclosure = aiDisclosure.value const disclosure = aiDisclosure.value
if (!disclosure) { if (!disclosure) {
return 'other' return ''
} }
const uses = new Set(disclosure.uses) const orderedUses = AI_USE_ORDER.filter((use) => disclosure.uses.includes(use))
if (uses.size === 2 && uses.has('code') && uses.has('assets')) { const types =
return 'code_assets' orderedUses.length === 0
} ? formatMessage(aiUseLabels.content)
if (uses.size === 1) { : new Intl.ListFormat(locale.value, {
return uses.values().next().value style: 'long',
} type: 'conjunction',
return 'other' }).format(orderedUses.map((use) => formatMessage(aiUseLabels[use])))
return formatMessage(messages.aiGeneratedContent, { types })
}) })
const createdDate = computed(() => const createdDate = computed(() =>
+16 -1
View File
@@ -3246,7 +3246,22 @@
"defaultMessage": "Contains advertising" "defaultMessage": "Contains advertising"
}, },
"project.disclosure.ai-generated-content.title": { "project.disclosure.ai-generated-content.title": {
"defaultMessage": "Contains AI-generated {type, select, code {code} assets {assets} code_assets {code and assets} text {text} functionality {functionality} other {content}}" "defaultMessage": "Contains AI-generated {types}"
},
"project.disclosure.ai-generated-content.use.assets": {
"defaultMessage": "assets"
},
"project.disclosure.ai-generated-content.use.code": {
"defaultMessage": "code"
},
"project.disclosure.ai-generated-content.use.content": {
"defaultMessage": "content"
},
"project.disclosure.ai-generated-content.use.functionality": {
"defaultMessage": "functionality"
},
"project.disclosure.ai-generated-content.use.text": {
"defaultMessage": "text"
}, },
"project.disclosure.derivative-work.title": { "project.disclosure.derivative-work.title": {
"defaultMessage": "This is a derivative work of:" "defaultMessage": "This is a derivative work of:"