@@ -5,6 +5,14 @@ import { normalizeSearchParam } from '#shared/utils/url'
55const route = useRoute (' /profile/[handle]' )
66const router = useRouter ()
77
8+ type LikesResult = {
9+ records: {
10+ value: {
11+ subjectRef: string
12+ }
13+ }[]
14+ }
15+
816const handle = computed (() => route .params .handle )
917
1018const { data : profile }: { data? : NPMXProfile } = useFetch (
@@ -15,11 +23,18 @@ const { data: profile }: { data?: NPMXProfile } = useFetch(
1523 },
1624)
1725
26+ const { data : likes, status } = await useProfileLikes (handle )
27+
1828useSeoMeta ({
1929 title : () => ` ${handle .value } - npmx ` ,
2030 description : () => ` npmx profile by ${handle .value } ` ,
2131})
2232
33+ function extractPackageFromRef(ref : string ) {
34+ const { pkg } = / https:\/\/ npmx. dev\/ package\/ (?<pkg >. * )/ .exec (ref ).groups
35+ return pkg
36+ }
37+
2338/**
2439defineOgImageComponent('Default', {
2540 title: () => `~${username.value}`,
@@ -42,14 +57,36 @@ defineOgImageComponent('Default', {
4257 </div >
4358 </header >
4459
45- <!-- Empty state (no packages found for user) -->
46- <div class =" flex-1 flex items-center justify-center" >
47- <div class =" text-center" >
48- <p class =" text-fg-muted font-mono" >
49- {{ $t('user.page.no_packages') }} <span class =" text-fg" >~{{ handle }}</span >
50- </p >
51- <p class =" text-fg-subtle text-sm mt-2" >{{ $t('user.page.no_packages_hint') }}</p >
60+ <section class =" flex flex-col gap-3" >
61+ <h1
62+ class =" font-mono text-2xl sm:text-3xl font-medium min-w-0 break-words"
63+ :title =" Likes"
64+ dir =" ltr"
65+ >
66+ Likes <span v-if =" status === 'success'" >({{ likes.likes.records.length ?? 0 }})</span >
67+ </h1 >
68+ <div v-if =" status === 'pending'" >
69+ <p >Loading...</p >
70+ </div >
71+ <div v-else-if =" status === 'error'" >
72+ <p >Error</p >
73+ </div >
74+ <div v-else class =" grid grid-cols-1 lg:grid-cols-3 gap-4" >
75+ <NuxtLink
76+ :to =" {
77+ name: 'package-pkg',
78+ params: { pkg: extractPackageFromRef(like.value.subjectRef) },
79+ }"
80+ v-for =" like in likes.likes.records"
81+ >
82+ <BaseCard class =" group font-mono flex justify-between" >
83+ <p >
84+ {{ extractPackageFromRef(like.value.subjectRef) }}
85+ </p >
86+ <p class =" transition-transform duration-150 group-hover:rotate-45" >↗</p >
87+ </BaseCard >
88+ </NuxtLink >
5289 </div >
53- </div >
90+ </section >
5491 </main >
5592</template >
0 commit comments