Skip to content

Commit 616273d

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

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

components/items/WebtoonItem.vue

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
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+
const cookieToken = useCookie("token");
12+
813
const 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>

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)