Skip to content

Commit 3cc19e1

Browse files
committed
fix(image): adds poster cache to prevent flickering
1 parent 15abc67 commit 3cc19e1

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/components/common/poster/PosterComponent.vue

+18-8
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type { PosterItem } from '~/models/poster.model';
77
88
import PosterPlaceholder from '~/assets/images/poster-placholder.webp';
99
import { Logger } from '~/services/logger.service';
10-
import { useImageStore } from '~/stores/data/image.store';
10+
import { type ImageStoreMedias, useImageStore } from '~/stores/data/image.store';
1111
1212
const props = defineProps({
1313
item: {
@@ -38,12 +38,20 @@ const onLoad = () => {
3838
imgLoaded.value = true;
3939
};
4040
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();
4246
4347
const resolvedPoster = computed(() => {
4448
if (poster?.value) return poster.value;
4549
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+
}
4755
if (!image) return;
4856
if (typeof image === 'string') return image;
4957
if (backdrop.value && 'backdrop' in image) return image.backdrop;
@@ -60,11 +68,9 @@ const timeout = ref();
6068
const { getImageUrl } = useImageStore();
6169
6270
const getPosters = async (_item: PosterItem) => {
63-
if (poster?.value) return;
64-
if (_item.poster) return;
71+
if (resolvedPoster.value) return;
6572
6673
imgLoaded.value = false;
67-
if (_item.posterRef?.value) return;
6874
const query = _item.getPosterQuery?.();
6975
if (!query) return;
7076
if (!backdrop.value && _item.type === 'episode') {
@@ -76,13 +82,17 @@ const getPosters = async (_item: PosterItem) => {
7682
transition.value = true;
7783
}, 100);
7884
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+
});
8090
} catch (error) {
8191
Logger.error('Failed to fetch poster', error);
8292
}
8393
};
8494
85-
watch(item, getPosters, { immediate: true, flush: 'post' });
95+
watch(item, getPosters, { immediate: true, flush: 'pre' });
8696
8797
onBeforeUnmount(() => {
8898
clearTimeout(timeout.value);

0 commit comments

Comments
 (0)