1
1
<script setup lang="ts">
2
2
import { NFlex , NSkeleton } from ' naive-ui' ;
3
- import { onActivated , onDeactivated , ref , toRefs } from ' vue' ;
3
+ import { computed , onActivated , onDeactivated , ref , toRefs } from ' vue' ;
4
4
5
+ import { useRoute } from ' vue-router' ;
6
+
7
+ import type { PosterItem } from ' ~/models/poster.model' ;
5
8
import type { TraktEpisodeExtended } from ' ~/models/trakt/trakt-episode.model' ;
6
9
import type { TraktShowExtended } from ' ~/models/trakt/trakt-show.model' ;
7
10
11
+ import type { ImageQuery } from ' ~/stores/data/image.store' ;
12
+
13
+ import PosterComponent from ' ~/components/common/poster/PosterComponent.vue' ;
8
14
import { type ShowSeasons , useShowStore } from ' ~/stores/data/show.store' ;
9
15
10
16
const props = defineProps ({
@@ -30,18 +36,56 @@ const episode = ref<TraktEpisodeExtended>();
30
36
31
37
const { showId, seasonNumber, episodeNumber } = toRefs (props );
32
38
39
+ const seasonNb = computed (() => {
40
+ if (! seasonNumber ?.value ) return ;
41
+ const _seasonNumber = Number (seasonNumber .value );
42
+ if (Number .isNaN (_seasonNumber )) return ;
43
+ return _seasonNumber ;
44
+ });
45
+
46
+ const episodeNb = computed (() => {
47
+ if (! episodeNumber ?.value ) return ;
48
+ const _episodeNumber = Number (episodeNumber .value );
49
+ if (Number .isNaN (_episodeNumber )) return ;
50
+ return _episodeNumber ;
51
+ });
52
+
53
+ const size = computed (() => window ?.innerWidth ?? 800 / 2 );
54
+
55
+ const { query } = useRoute ();
56
+ const posterItem = computed <PosterItem | undefined >(() => {
57
+ const poster = query .poster ?.toString ();
58
+ if (poster ) return { poster } satisfies PosterItem ;
59
+
60
+ const tmdb = query .tmdb ?.toString ();
61
+ if (! tmdb ) return ;
62
+ const imageQuery: ImageQuery = {
63
+ id: tmdb ,
64
+ season: seasonNb .value ,
65
+ episode: episodeNb .value ,
66
+ type: ' show' ,
67
+ };
68
+ if (episodeNb .value ) imageQuery .type = ' episode' ;
69
+ else if (seasonNb .value ) imageQuery .type = ' season' ;
70
+
71
+ return {
72
+ posterRef: ref (),
73
+ getPosterQuery : () => imageQuery ,
74
+ };
75
+ });
76
+
33
77
const subscriptions = new Set <() => void >();
34
78
35
79
onActivated (() => {
36
80
if (showId ?.value ) subscriptions .add (getShowRef (showId .value , show ).unsub );
37
81
if (showId ?.value ) subscriptions .add (getShowSeasonsRef (showId .value , seasons ).unsub );
38
- if (showId ?.value && seasonNumber ?.value && episodeNumber ?.value ) {
82
+ if (showId ?.value && seasonNb ?.value && episodeNb ?.value ) {
39
83
subscriptions .add (
40
84
getShowEpisodeRef (
41
85
{
42
86
id: showId .value ,
43
- season: Number ( seasonNumber .value ) ,
44
- episode: Number ( episodeNumber .value ) ,
87
+ season: seasonNb .value ,
88
+ episode: episodeNb .value ,
45
89
},
46
90
episode ,
47
91
).unsub ,
@@ -59,14 +103,25 @@ onDeactivated(() => {
59
103
</script >
60
104
61
105
<template >
62
- <NFlex justify =" center" align =" center" > </NFlex >
63
- <div >show {{ showId }}</div >
64
- <div v-if =" show" >show : {{ show?.title }}</div >
65
- <NSkeleton v-else />
66
- <div >season {{ seasonNumber }}</div >
67
- <div v-if =" seasons" >season {{ Object.keys(seasons) }}</div >
68
- <NSkeleton v-else />
69
- <div >episode {{ episodeNumber }}</div >
70
- <div v-if =" episode" >episode {{ episode?.title }}</div >
71
- <NSkeleton v-else />
106
+ <NFlex justify =" center" align =" center" vertical >
107
+ <NFlex v-if =" posterItem" class =" poster-container" >
108
+ <PosterComponent :item =" posterItem" :episode =" !!episodeNumber" :size =" size" />
109
+ </NFlex >
110
+ <div >show {{ showId }}</div >
111
+ <div v-if =" show" >show : {{ show?.title }}</div >
112
+ <NSkeleton v-else />
113
+ <div >season {{ seasonNumber }}</div >
114
+ <div v-if =" seasons" >season {{ Object.keys(seasons) }}</div >
115
+ <NSkeleton v-else />
116
+ <div >episode {{ episodeNumber }}</div >
117
+ <div v-if =" episode" >episode {{ episode?.title }}</div >
118
+ <NSkeleton v-else
119
+ /></NFlex >
72
120
</template >
121
+
122
+ <style lang="scss" scoped>
123
+ .poster-container {
124
+ --poster-width : 50 dvw;
125
+ --poster-height : calc (var (--poster-width ) * (9 / 16 ));
126
+ }
127
+ </style >
0 commit comments