@@ -5,13 +5,19 @@ import { computed, type PropType, toRefs } from 'vue';
5
5
6
6
import { useRoute } from ' vue-router' ;
7
7
8
+ import type { ShowProgress } from ' ~/models/list-scroll.model' ;
8
9
import type { TraktEpisodeShort } from ' ~/models/trakt/trakt-episode.model' ;
9
10
import type { ShowSeasons } from ' ~/stores/data/show.store' ;
10
11
11
12
import ButtonLink from ' ~/components/common/buttons/ButtonLink.vue' ;
12
13
import { useI18n } from ' ~/utils' ;
13
14
14
15
const props = defineProps ({
16
+ mode: {
17
+ type: String as PropType <' show' | ' season' | ' episode' >,
18
+ required: false ,
19
+ default: ' episode' ,
20
+ },
15
21
seasons: {
16
22
type: Object as PropType <ShowSeasons >,
17
23
required: false ,
@@ -20,34 +26,40 @@ const props = defineProps({
20
26
type: Array as PropType <TraktEpisodeShort []>,
21
27
required: false ,
22
28
},
23
- mode : {
24
- type: String as PropType <' show ' | ' season ' | ' episode ' >,
29
+ progress : {
30
+ type: Object as PropType <ShowProgress >,
25
31
required: false ,
26
- default: ' episode' ,
27
32
},
28
33
});
29
34
30
- const { seasons, episodes } = toRefs (props );
35
+ const { seasons, episodes, progress } = toRefs (props );
31
36
32
37
const { meta } = useRoute ();
33
38
34
39
const seasonsLinks = computed (() => {
35
40
if (! seasons ?.value ) return ;
36
- return Object .entries (seasons .value ).map (([_number , _season ]) => ({
37
- number: Number (_number ),
38
- link: { name: ` ${meta .base }-season ` , params: { seasonNumber: _number } },
39
- }));
41
+ return Object .entries (seasons .value ).map (([_number , _season ]) => {
42
+ const number = Number (_number );
43
+ return {
44
+ number ,
45
+ link: { name: ` ${meta .base }-season ` , params: { seasonNumber: _number } },
46
+ finished: progress ?.value ?.seasons ?.find (s => s .number === number )?.finished ,
47
+ };
48
+ });
40
49
});
41
50
42
51
const episodeLinks = computed (() => {
43
52
if (! episodes ?.value ) return ;
44
53
if (! episodes ?.value ?.length ) return [];
45
- return episodes .value .map (_episode => ({
54
+ return episodes .value .map (( _episode , i ) => ({
46
55
number: _episode .number ,
47
56
link: {
48
57
name: ` ${meta .base }-episode ` ,
49
58
params: { episodeNumber: _episode .number , seasonNumber: _episode .season },
50
59
},
60
+ finished: progress ?.value ?.seasons
61
+ ?.find (s => s .number === _episode .season )
62
+ ?.episodes ?.find (e => e .number === _episode .number )?.completed ,
51
63
}));
52
64
});
53
65
@@ -62,9 +74,10 @@ const i18n = useI18n('panel', 'picker');
62
74
<NFlex class =" numbers" size =" small" >
63
75
<template v-if =" seasonsLinks ?.length " >
64
76
<ButtonLink
65
- v-for =" { link, number } in seasonsLinks"
77
+ v-for =" { link, number, finished } in seasonsLinks"
66
78
:key =" `season-${number}`"
67
79
:link =" { to: link }"
80
+ :button =" { type: finished ? 'primary' : undefined }"
68
81
>
69
82
{{ number }}
70
83
</ButtonLink >
@@ -80,10 +93,11 @@ const i18n = useI18n('panel', 'picker');
80
93
<NFlex class =" numbers episodes" size =" small" >
81
94
<template v-if =" episodeLinks ?.length " >
82
95
<ButtonLink
83
- v-for =" { link, number } in episodeLinks"
96
+ v-for =" { link, number, finished } in episodeLinks"
84
97
:key =" `episode-${ number }`"
85
98
v-slot =" { isActive }"
86
99
:link =" { to: link }"
100
+ :button =" { type: finished ? 'primary' : undefined }"
87
101
class =" link"
88
102
>
89
103
<span class =" label" :class =" { active: isActive }" >{{ number }}</span >
0 commit comments