Skip to content

Commit 41d5e08

Browse files
committed
fix(image): simplify transiiton logic
1 parent 3cc19e1 commit 41d5e08

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

src/components/common/poster/PosterComponent.vue

+14-17
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,6 @@ const props = defineProps({
3232
3333
const { backdrop, poster, item, size } = toRefs(props);
3434
35-
const imgLoaded = ref(true);
36-
37-
const onLoad = () => {
38-
imgLoaded.value = true;
39-
};
40-
4135
// Local poster is used when the item has no poster ref of its own.
4236
const localPoster = ref<ImageStoreMedias>();
4337
@@ -63,22 +57,30 @@ const objectFit = computed(() =>
6357
);
6458
6559
const transition = ref(false);
66-
const timeout = ref();
60+
61+
const imgLoaded = ref(false);
62+
const loading = computed(() => !imgLoaded.value || !resolvedPoster.value);
63+
64+
const onLoad = () => {
65+
imgLoaded.value = true;
66+
};
6767
6868
const { getImageUrl } = useImageStore();
6969
70+
const timeout = ref();
7071
const getPosters = async (_item: PosterItem) => {
7172
if (resolvedPoster.value) return;
7273
73-
imgLoaded.value = false;
7474
const query = _item.getPosterQuery?.();
7575
if (!query) return;
7676
if (!backdrop.value && _item.type === 'episode') {
7777
query.type = 'show';
7878
delete query.episode;
7979
}
80-
setTimeout(() => {
81-
if (imgLoaded.value) return;
80+
// If the image is not loaded after 100ms, show transition
81+
clearTimeout(timeout.value);
82+
timeout.value = setTimeout(() => {
83+
if (!loading.value) return;
8284
transition.value = true;
8385
}, 100);
8486
try {
@@ -105,7 +107,7 @@ onBeforeUnmount(() => {
105107
class="poster"
106108
:class="{
107109
backdrop,
108-
loading: !imgLoaded,
110+
loading,
109111
transition,
110112
}"
111113
:object-fit="objectFit"
@@ -139,18 +141,13 @@ onBeforeUnmount(() => {
139141
height: var(--poster-height, 8rem);
140142
border-radius: var(--poster-radius, 8px);
141143
opacity: 1;
142-
will-change: opacity;
143144
144145
&.loading {
145146
opacity: 0;
146147
}
147148
148149
&.transition {
149-
transition: opacity 0.5s var(--n-bezier);
150-
151-
&.loading {
152-
transition: opacity 0.1s;
153-
}
150+
transition: opacity 0.3s var(--n-bezier);
154151
}
155152
156153
&.backdrop {

0 commit comments

Comments
 (0)