1
1
<script lang="ts" setup>
2
2
import { NFlex , NSkeleton } from ' naive-ui' ;
3
3
4
- import { computed , type PropType , toRefs } from ' vue' ;
4
+ import { computed , type ComputedRef , type PropType , toRefs } from ' vue' ;
5
5
6
- import { RouterLink , useRoute } from ' vue-router' ;
6
+ import { type RouteLocationRaw , RouterLink , useRoute } from ' vue-router' ;
7
7
8
8
import type { TraktEpisodeShort } from ' @dvcol/trakt-http-client/models' ;
9
9
import type { ShowProgress } from ' ~/models/list-scroll.model' ;
@@ -43,7 +43,14 @@ const { meta } = useRoute();
43
43
const showLink = computed (() => ({ name: ` ${meta .base }-show ` }));
44
44
const seasonLink = computed (() => ({ name: ` ${meta .base }-season ` }));
45
45
46
- const seasonsLinks = computed (() => {
46
+ type SeasonLink = {
47
+ number: number ;
48
+ link: RouteLocationRaw ;
49
+ finished? : boolean ;
50
+ collected? : boolean ;
51
+ aired? : boolean ;
52
+ };
53
+ const seasonsLinks: ComputedRef <SeasonLink [] | undefined > = computed (() => {
47
54
if (! seasons ?.value ) return ;
48
55
return Object .entries (seasons .value ).map (([_number , _season ]) => {
49
56
const number = Number (_number );
@@ -52,11 +59,21 @@ const seasonsLinks = computed(() => {
52
59
link: { name: ` ${meta .base }-season ` , params: { seasonNumber: _number } },
53
60
finished: progress ?.value ?.seasons ?.find (s => s .number === number )?.finished ,
54
61
collected: collection ?.value ?.seasons ?.find (s => s .number === number )?.finished ,
62
+ aired: _season ?.first_aired
63
+ ? new Date (_season .first_aired ) < new Date ()
64
+ : undefined ,
55
65
};
56
66
});
57
67
});
58
68
59
- const episodeLinks = computed (() => {
69
+ type EpisodeLink = {
70
+ number: number ;
71
+ link: RouteLocationRaw ;
72
+ finished? : boolean ;
73
+ collected? : boolean ;
74
+ aired? : boolean ;
75
+ };
76
+ const episodeLinks: ComputedRef <EpisodeLink [] | undefined > = computed (() => {
60
77
if (! episodes ?.value ) return ;
61
78
if (! episodes ?.value ?.length ) return [];
62
79
return episodes .value .map ((_episode , i ) => ({
@@ -71,6 +88,7 @@ const episodeLinks = computed(() => {
71
88
collected: collection ?.value ?.seasons
72
89
?.find (s => s .number === _episode .season )
73
90
?.episodes ?.find (e => e .number === _episode .number )?.completed ,
91
+ aired: (seasons ?.value ?.[_episode .season ]?.aired_episodes ?? 0 ) >= _episode .number ,
74
92
}));
75
93
});
76
94
@@ -87,10 +105,11 @@ const i18n = useI18n('panel', 'picker');
87
105
<NFlex class =" numbers" size =" small" >
88
106
<template v-if =" seasonsLinks ?.length " >
89
107
<ButtonLink
90
- v-for =" { link, number, finished, collected } in seasonsLinks"
108
+ v-for =" { link, number, finished, collected, aired } in seasonsLinks"
91
109
:key =" `season-${number}`"
92
110
:link =" { to: link }"
93
111
:button =" { type: finished ? 'primary' : collected ? 'info' : undefined }"
112
+ :style =" { opacity: aired ? 1 : 0.75 }"
94
113
>
95
114
{{ number }}
96
115
</ButtonLink >
@@ -108,11 +127,12 @@ const i18n = useI18n('panel', 'picker');
108
127
<NFlex class =" numbers episodes" size =" small" >
109
128
<template v-if =" episodeLinks ?.length " >
110
129
<ButtonLink
111
- v-for =" { link, number, finished, collected } in episodeLinks"
130
+ v-for =" { link, number, finished, collected, aired } in episodeLinks"
112
131
:key =" `episode-${ number }`"
113
132
v-slot =" { isActive }"
114
133
:link =" { to: link }"
115
134
:button =" { type: finished ? 'primary' : collected ? 'info' : undefined }"
135
+ :style =" { opacity: aired ? 1 : 0.75 }"
116
136
>
117
137
<span class =" label" :class =" { active: isActive }" >{{ number }}</span >
118
138
</ButtonLink >
0 commit comments