Skip to content

Commit e6e8c7e

Browse files
committed
✨ Add like/unlike functionality to webtoon items and improve layout for better responsiveness
1 parent 860c770 commit e6e8c7e

File tree

2 files changed

+35
-13
lines changed

2 files changed

+35
-13
lines changed

components/items/WebtoonItem.vue

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22
import Image from "~/components/misc/Image.vue";
33
44
const 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+
812
const genres = computed(()=>{
913
return props.webtoon.genres.map((genre: string) => {
1014
if (genre.length > 2)
@@ -16,24 +20,42 @@ const genres = computed(()=>{
1620
return genre;
1721
});
1822
});
23+
24+
function toggleLike(){
25+
if (likedState.value){
26+
emits("unlike", props.webtoon.id);
27+
} else {
28+
emits("like", props.webtoon.id);
29+
}
30+
likedState.value = !likedState.value;
31+
}
1932
</script>
2033

2134
<template>
22-
<NuxtLink class="flex border border-t-0 hover:cursor-pointer hover:bg-secondary" :to="`/webtoon/${webtoon.id}`">
35+
<NuxtLink class="flex w-full border border-t-0 hover:cursor-pointer hover:bg-secondary" :to="`/webtoon/${webtoon.id}`">
2336
<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>
37+
<div class="flex w-full min-w-0 flex-1 flex-col items-start justify-between p-2">
38+
<div class="flex w-full flex-col">
39+
<div class="flex w-full min-w-0 items-center gap-2">
40+
<UiBadge v-if="props.webtoon.isNew" variant="default" class="h-max shrink-0">New</UiBadge>
41+
<UiBadge v-if="props.webtoon.hasNewEpisodes && !webtoon.isNew" variant="secondary" class="h-max shrink-0">Updated</UiBadge>
42+
<h3 class="min-w-0 flex-1 truncate">{{webtoon.title}}</h3>
3043
</div>
31-
<p>{{webtoon.author}}</p>
44+
<p class="truncate">{{webtoon.author}}</p>
3245
</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>
46+
<div class="flex w-full gap-2 overflow-x-hidden">
47+
<UiBadge variant="secondary" class="shrink-0">{{webtoon.language.toUpperCase()}}</UiBadge>
48+
<div class="flex flex-nowrap gap-2 overflow-x-hidden">
49+
<UiBadge v-for="(genre, i) in genres" :key="i" variant="outline" class="shrink-0 whitespace-nowrap">
50+
{{genre}}
51+
</UiBadge>
52+
</div>
3653
</div>
3754
</div>
55+
<div class="flex items-center p-2">
56+
<UiButton variant="outline" @click.stop.prevent="toggleLike">
57+
<Icon name="iconoir:heart"/>
58+
</UiButton>
59+
</div>
3860
</NuxtLink>
3961
</template>

pages/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const sortedWebtoons = computed(() => {
3737
<UiScrollArea class="h-dvh">
3838
<div class="flex flex-col">
3939
<div class="w-full justify-center self-center md:w-[40rem] lg:w-[50rem]">
40-
<WebtoonItem v-for="(webtoon, i) in sortedWebtoons" :key="i" :webtoon="webtoon"/>
40+
<WebtoonItem v-for="(webtoon, i) in sortedWebtoons" :key="i" :webtoon="webtoon" :liked="false"/>
4141
</div>
4242
</div>
4343
</UiScrollArea>

0 commit comments

Comments
 (0)