22import Image from " ~/components/misc/Image.vue" ;
33
44const props = defineProps <{
5- webtoon: Webtoon
5+ webtoon: Webtoon ,
6+ liked: boolean ,
67}>();
78
9+ const likedState = ref (props .liked );
10+ const emits = defineEmits ([" like" , " unlike" ]);
11+ const cookieToken = useCookie (" token" );
12+
813const genres = computed (()=> {
914 return props .webtoon .genres .map ((genre : string ) => {
1015 if (genre .length > 2 )
@@ -16,24 +21,43 @@ const genres = computed(()=>{
1621 return genre ;
1722 });
1823});
24+
25+ function toggleLike(){
26+ if (likedState .value ){
27+ emits (" unlike" , props .webtoon .id );
28+ } else {
29+ emits (" like" , props .webtoon .id );
30+ }
31+ likedState .value = ! likedState .value ;
32+ }
1933 </script >
2034
2135<template >
22- <NuxtLink class =" flex border border-t-0 hover:cursor-pointer hover:bg-secondary" :to =" `/webtoon/${webtoon.id}`" >
36+ <NuxtLink class =" flex w-full border border-t-0 hover:cursor-pointer hover:bg-secondary" :to =" `/webtoon/${webtoon.id}`" >
2337 <Image :sum =" webtoon.thumbnail" />
24- <div class =" flex w-full flex-col items-start justify-between p-2" >
25- <div class =" flex flex-col" >
26- <div class =" flex w-full items-center gap-2 md:w-[30rem] lg:w-[40rem] " >
27- <UiBadge v-if =" props.webtoon.isNew" variant =" default" class =" h-max" >New</UiBadge >
28- <UiBadge v-if =" props.webtoon.hasNewEpisodes && !webtoon.isNew" variant =" secondary" class =" h-max" >Updated</UiBadge >
29- <h3 class =" truncate" >{{webtoon.title}}</h3 >
38+ <div class =" flex w-full min-w-0 flex-1 flex-col items-start justify-between p-2" >
39+ <div class =" flex w-full flex-col" >
40+ <div class =" flex w-full min-w-0 items-center gap-2" >
41+ <UiBadge v-if =" props.webtoon.isNew" variant =" default" class =" h-max shrink-0 " >New</UiBadge >
42+ <UiBadge v-if =" props.webtoon.hasNewEpisodes && !webtoon.isNew" variant =" secondary" class =" h-max shrink-0 " >Updated</UiBadge >
43+ <h3 class =" min-w-0 flex-1 truncate" >{{webtoon.title}}</h3 >
3044 </div >
31- <p >{{webtoon.author}}</p >
45+ <p class = " truncate " >{{webtoon.author}}</p >
3246 </div >
33- <div class =" flex gap-2" >
34- <UiBadge variant =" secondary" >{{webtoon.language.toUpperCase()}}</UiBadge >
35- <UiBadge v-for =" (genre, i) in genres" :key =" i" variant =" outline" >{{genre}}</UiBadge >
47+ <div class =" flex w-full gap-2 overflow-x-hidden" >
48+ <UiBadge variant =" secondary" class =" shrink-0" >{{webtoon.language.toUpperCase()}}</UiBadge >
49+ <div class =" flex flex-nowrap gap-2 overflow-x-hidden" >
50+ <UiBadge v-for =" (genre, i) in genres" :key =" i" variant =" outline" class =" shrink-0 whitespace-nowrap" >
51+ {{genre}}
52+ </UiBadge >
53+ </div >
3654 </div >
3755 </div >
56+ <div v-if =" cookieToken" class =" flex items-center p-2" >
57+ <UiButton variant =" outline" @click.stop.prevent =" toggleLike" >
58+ <Icon v-if =" likedState" class =" size-4 lg:size-5" name =" iconoir:heart-solid" />
59+ <Icon v-else class =" size-4 lg:size-5" name =" iconoir:heart" />
60+ </UiButton >
61+ </div >
3862 </NuxtLink >
3963</template >
0 commit comments