Files
Modrinth-plus/apps/frontend/src/pages/dashboard.vue
xinyihl 453369ca07 feat(frontend): Make dashboard page localizable (#5727)
* Make dashboard page localizable

* dashboard sidebar

* prepr:frontend

* don't change the keys

* undo fix

* fix any err

* don't i18n csv

* prepr:frontend

* fix: do not use button key

* prepr:frontend

* capitalize string date

---------

Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
2026-04-26 13:09:08 +00:00

129 lines
3.1 KiB
Vue

<template>
<div class="normal-page !mt-8">
<div class="normal-page__sidebar">
<NavStack
:items="[
{ type: 'heading', label: formatMessage(messages.dashboard) },
{ link: '/dashboard', label: formatMessage(messages.overview), icon: DashboardIcon },
{
link: '/dashboard/notifications',
label: formatMessage(messages.notifications),
icon: NotificationsIcon,
},
{
link: '/dashboard/reports',
label: formatMessage(messages.activeReports),
icon: ReportIcon,
},
{
link: '/dashboard/collections',
label: formatMessage(commonMessages.collectionsLabel),
icon: LibraryIcon,
},
{ type: 'heading', label: formatMessage(messages.creators) },
{ link: '/dashboard/projects', label: formatMessage(messages.projects), icon: ListIcon },
{
link: '/dashboard/organizations',
label: formatMessage(messages.organizations),
icon: OrganizationIcon,
},
{
link: '/dashboard/analytics',
label: formatMessage(messages.analytics),
icon: ChartIcon,
},
{
link: '/dashboard/affiliate-links',
label: formatMessage(commonMessages.affiliateLinksButton),
icon: AffiliateIcon,
shown: !!isAffiliate,
},
{
link: '/dashboard/revenue',
label: formatMessage(messages.revenue),
icon: CurrencyIcon,
matchNested: true,
},
]"
/>
</div>
<div class="normal-page__content mt-4 lg:!mt-0">
<NuxtPage :route="route" />
</div>
</div>
</template>
<script setup lang="ts">
import {
AffiliateIcon,
BellIcon as NotificationsIcon,
ChartIcon,
CurrencyIcon,
DashboardIcon,
LibraryIcon,
ListIcon,
OrganizationIcon,
ReportIcon,
} from '@modrinth/assets'
import { commonMessages, defineMessages, useVIntl } from '@modrinth/ui'
import { type User, UserBadge } from '@modrinth/utils'
import NavStack from '~/components/ui/NavStack.vue'
const auth = (await useAuth()) as Ref<{ user: User | null }>
const isAffiliate = computed(() => {
return auth.value.user && auth.value.user.badges & UserBadge.AFFILIATE
})
const { formatMessage } = useVIntl()
const messages = defineMessages({
dashboard: {
id: 'dashboard.sidebar.label.dashboard',
defaultMessage: 'Dashboard',
},
overview: {
id: 'dashboard.sidebar.label.overview',
defaultMessage: 'Overview',
},
notifications: {
id: 'dashboard.sidebar.label.notifications',
defaultMessage: 'Notifications',
},
activeReports: {
id: 'dashboard.sidebar.label.activeReports',
defaultMessage: 'Active reports',
},
creators: {
id: 'dashboard.sidebar.label.creators',
defaultMessage: 'Creators',
},
projects: {
id: 'dashboard.sidebar.label.projects',
defaultMessage: 'Projects',
},
organizations: {
id: 'dashboard.sidebar.label.organizations',
defaultMessage: 'Organizations',
},
analytics: {
id: 'dashboard.sidebar.label.analytics',
defaultMessage: 'Analytics',
},
revenue: {
id: 'dashboard.sidebar.label.revenue',
defaultMessage: 'Revenue',
},
})
definePageMeta({
middleware: 'auth',
})
useSeoMeta({
robots: 'noindex',
})
const route = useNativeRoute()
</script>