Skip to content

Commit b5816d8

Browse files
committed
✨ Implement webtoon reading
1 parent 35a0828 commit b5816d8

File tree

3 files changed

+53
-4
lines changed

3 files changed

+53
-4
lines changed

layouts/FreeNavLayout.vue

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<script setup lang="ts">
2+
3+
import {Toaster} from "~/components/ui/toast";
4+
</script>
5+
6+
<template>
7+
<div>
8+
<Toaster/>
9+
<div class="flex flex-col min-h-dvh min-w-vw max-h-dvh max-w-vw">
10+
<TopMenu class="w-full bg-background z-10"/>
11+
<slot/>
12+
</div>
13+
</div>
14+
</template>
15+
16+
<style scoped>
17+
18+
</style>

pages/episode/[id].vue

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,44 @@
11
<script setup lang="ts">
22
import * as apiurlMiddleware from "~/middleware/apiurl.middleware";
3+
import {getEpisodeImages} from "~/utils/api";
4+
import VisibilityObserver from "~/components/utils/VisibilityObserver.vue";
35
46
definePageMeta({
57
middleware: [
68
apiurlMiddleware.default
79
],
8-
layout: "nav-layout"
10+
layout: "free-nav-layout"
11+
});
12+
13+
const id = useRoute().params.id as any as number;
14+
15+
const episodeImages = ref<string[]>([]);
16+
const maxIndex = ref<number>(10);
17+
18+
function increaseMaxIndex(){
19+
maxIndex.value += 10;
20+
}
21+
22+
onMounted(async() => {
23+
const episodeState: any = useState(`episode-${id}`);
24+
if (episodeState.value && episodeState.value.length){
25+
episodeImages.value = episodeState.value;
26+
return;
27+
}
28+
const response = await getEpisodeImages(id);
29+
episodeImages.value = response.data;
30+
episodeState.value = episodeImages.value;
931
});
1032
</script>
1133

1234
<template>
13-
<div class="flex justify-center h-[calc(theme(height.dvh)-70px)]">
14-
<h1>Work in progress</h1>
35+
<div class="flex flex-col">
36+
<div v-for="image of episodeImages.slice(0, maxIndex)" :key="episodeImages.indexOf(image)" class="flex justify-center">
37+
<NuxtImg v-if="episodeImages.indexOf(image) < maxIndex - 1" :src="sumToImageUrl(image)" alt="Episode Image" class="w-full md:w-2/3 lg:w-1/2 xl:w-1/3"/>
38+
<VisibilityObserver v-else @on-display="increaseMaxIndex">
39+
<NuxtImg :src="sumToImageUrl(image)" alt="Episode Image" class="w-full md:w-2/3 lg:w-1/2 xl:w-1/3"/>
40+
</VisibilityObserver>
41+
</div>
1542
</div>
1643
</template>
1744

utils/api.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,9 @@ export function getRandomThumbnail(): Promise<any>{
3131
}
3232

3333
export function getWebtoon(webtoonId: number): Promise<any>{
34-
return axios.get(`/webtoons/${webtoonId}`);
34+
return axios.get(`/webtoons/${webtoonId}/raw`);
35+
}
36+
37+
export function getEpisodeImages(episodeId: number): Promise<any>{
38+
return axios.get(`/webtoons/episodes/${episodeId}/images/raw`);
3539
}

0 commit comments

Comments
 (0)