@@ -7,7 +7,7 @@ import type { PosterItem } from '~/models/poster.model';
7
7
8
8
import PosterPlaceholder from ' ~/assets/images/poster-placholder.webp' ;
9
9
import { Logger } from ' ~/services/logger.service' ;
10
- import { useImageStore } from ' ~/stores/data/image.store' ;
10
+ import { type ImageStoreMedias , useImageStore } from ' ~/stores/data/image.store' ;
11
11
12
12
const props = defineProps ({
13
13
item: {
@@ -38,12 +38,20 @@ const onLoad = () => {
38
38
imgLoaded .value = true ;
39
39
};
40
40
41
- const localPoster = ref <string >();
41
+ // Local poster is used when the item has no poster ref of its own.
42
+ const localPoster = ref <ImageStoreMedias >();
43
+
44
+ // cache poster image to prevent flickering
45
+ const cache: Map <string , ImageStoreMedias > = new Map ();
42
46
43
47
const resolvedPoster = computed (() => {
44
48
if (poster ?.value ) return poster .value ;
45
49
if (item .value .poster ) return item .value .poster ;
46
- const image = (item .value .posterRef ?? localPoster )?.value ;
50
+ let image = (item .value .posterRef ?? localPoster )?.value ;
51
+ if (item ?.value ?.key ) {
52
+ if (image ) cache .set (item .value .key , image );
53
+ else image = cache .get (item .value .key );
54
+ }
47
55
if (! image ) return ;
48
56
if (typeof image === ' string' ) return image ;
49
57
if (backdrop .value && ' backdrop' in image ) return image .backdrop ;
@@ -60,11 +68,9 @@ const timeout = ref();
60
68
const { getImageUrl } = useImageStore ();
61
69
62
70
const getPosters = async (_item : PosterItem ) => {
63
- if (poster ?.value ) return ;
64
- if (_item .poster ) return ;
71
+ if (resolvedPoster .value ) return ;
65
72
66
73
imgLoaded .value = false ;
67
- if (_item .posterRef ?.value ) return ;
68
74
const query = _item .getPosterQuery ?.();
69
75
if (! query ) return ;
70
76
if (! backdrop .value && _item .type === ' episode' ) {
@@ -76,13 +82,17 @@ const getPosters = async (_item: PosterItem) => {
76
82
transition .value = true ;
77
83
}, 100 );
78
84
try {
79
- await getImageUrl (query , size .value , _item .posterRef ?? localPoster );
85
+ await getImageUrl ({
86
+ query ,
87
+ size: size .value ,
88
+ response: _item .posterRef ?? localPoster ,
89
+ });
80
90
} catch (error ) {
81
91
Logger .error (' Failed to fetch poster' , error );
82
92
}
83
93
};
84
94
85
- watch (item , getPosters , { immediate: true , flush: ' post ' });
95
+ watch (item , getPosters , { immediate: true , flush: ' pre ' });
86
96
87
97
onBeforeUnmount (() => {
88
98
clearTimeout (timeout .value );
0 commit comments