-
-
Notifications
You must be signed in to change notification settings - Fork 341
Open
Labels
Description
What problem is this solving
Currently, there is no straightforward way to display a loading indicator while the url from useStorageFileUrl is being fetched.
I am referring to the time it takes to fetch the URL itself, not the time it takes to load the image after the URL is available.
Most other composables in VueFire export a convenient boolean pending ref to indicate loading status, but useStorageFileUrl is missing this pending ref.
Adding this feature would be useful for avoiding flashes of text or other UI inconsistencies while the URL is loading.
Proposed solution
const {
url,
refresh,
promise,
pending // <-- Add this
} = useStorageFileUrl(mountainFileRef)
Describe alternatives you've considered
This is my current workaround. Not as clean or as consistent as having a ready made pending ref.
<template>
<img v-if="logoUrl" :src="logoUrl ?? ''" :alt="My Great App" />
<div v-else-if="!loading && !logoUrl" class="text-center">
My Great App
</div>
</template>
<script setup lang="ts">
import { getProjectData } from '@repo/project-config';
import { ref as storageRef } from 'firebase/storage';
import { onMounted, ref } from 'vue';
import { useFirebaseStorage, useStorageFileUrl } from 'vuefire';
const loading = ref(false);
const storage = useFirebaseStorage();
const logoFileRef = storageRef(
storage,
'public/images/logos/logo-rectangle.svg',
);
const { promise: logoUrlPromise, url: logoUrl } =
useStorageFileUrl(logoFileRef);
onMounted(async () => {
try {
loading.value = true;
await logoUrlPromise.value;
} catch (error) {
console.error('Failed to load logo:', error);
} finally {
loading.value = false;
}
});
</script>