+
+
+ {{ $t('COMPONENTS.MEDIA.AUDIO_UNAVAILABLE') }}
+
+
diff --git a/app/javascript/dashboard/composables/loadWithRetry.js b/app/javascript/dashboard/composables/loadWithRetry.js
index 0246c1e44..d83000efd 100644
--- a/app/javascript/dashboard/composables/loadWithRetry.js
+++ b/app/javascript/dashboard/composables/loadWithRetry.js
@@ -3,6 +3,7 @@ import { ref } from 'vue';
export const useLoadWithRetry = (config = {}) => {
const maxRetry = config.max_retry || 3;
const backoff = config.backoff || 1000;
+ const mediaType = config.mediaType || 'image';
const isLoaded = ref(false);
const hasError = ref(false);
@@ -10,19 +11,23 @@ export const useLoadWithRetry = (config = {}) => {
const loadWithRetry = async url => {
const attemptLoad = () => {
return new Promise((resolve, reject) => {
- const img = new Image();
-
- img.onload = () => {
+ const onSuccess = () => {
isLoaded.value = true;
hasError.value = false;
resolve();
};
- img.onerror = () => {
- reject(new Error('Failed to load image'));
- };
-
- img.src = url;
+ let element;
+ if (mediaType === 'audio') {
+ element = new Audio();
+ element.preload = 'metadata';
+ element.onloadedmetadata = onSuccess;
+ } else {
+ element = new Image();
+ element.onload = onSuccess;
+ }
+ element.onerror = () => reject(new Error('Failed to load resource'));
+ element.src = url;
});
};
diff --git a/app/javascript/dashboard/i18n/locale/en/settings.json b/app/javascript/dashboard/i18n/locale/en/settings.json
index d885cf8ce..a999a320d 100644
--- a/app/javascript/dashboard/i18n/locale/en/settings.json
+++ b/app/javascript/dashboard/i18n/locale/en/settings.json
@@ -284,6 +284,7 @@
},
"MEDIA": {
"IMAGE_UNAVAILABLE": "This image is no longer available.",
+ "AUDIO_UNAVAILABLE": "This audio is no longer available.",
"LOADING_FAILED": "Loading failed"
}
},