feat(smart-cards): handle dynamic loading error

pull/925/head
Bastien Wirtz 2025-05-04 15:12:06 +02:00
parent acb304adec
commit a5eeb1e44e
4 changed files with 40 additions and 8 deletions

View File

@ -55,6 +55,10 @@
background-color: var(--card-background); background-color: var(--card-background);
} }
} }
.component-error .card {
border: 1px solid rgba(255, 33, 33, 0.664);
background-color: rgba(255, 58, 58, 0.24);
}
.message { .message {
.message-body { .message-body {

View File

@ -5,7 +5,7 @@
<script> <script>
import { defineAsyncComponent } from "vue"; import { defineAsyncComponent } from "vue";
import errorComponent from "./services/_error.vue";
const defaultService = "Generic"; const defaultService = "Generic";
export default { export default {
@ -19,9 +19,11 @@ export default {
return defaultService === (this.item.type || defaultService); return defaultService === (this.item.type || defaultService);
}, },
component() { component() {
return defineAsyncComponent( return defineAsyncComponent({
() => import(`./services/${this.item.type}.vue`), loader: () => import(`./services/${this.item.type}.vue`),
); errorComponent: errorComponent,
timeout: 3000,
});
}, },
}, },
}; };

View File

@ -1,5 +1,5 @@
<template> <template>
<div> <div :class="{ 'component-error': error }">
<div class="card" :class="item.class"> <div class="card" :class="item.class">
<a <a
:href="`https://openweathermap.org/city/${id}`" :href="`https://openweathermap.org/city/${id}`"
@ -18,10 +18,12 @@
</figure> </figure>
</div> </div>
<div class="media-content"> <div class="media-content">
<p v-if="error" class="error">Data could not be retrieved</p> <div>
<div v-else>
<p class="title is-4">{{ name }}</p> <p class="title is-4">{{ name }}</p>
<p class="subtitle is-6"> <p v-if="error" class="subtitle is-6">
Fail to load weather information
</p>
<p v-else class="subtitle is-6">
<span> <span>
{{ temperature }} {{ temperature }}
</span> </span>
@ -31,6 +33,7 @@
</p> </p>
</div> </div>
</div> </div>
<div v-if="error" name="indicator" class="indicator"></div>
</div> </div>
<div v-if="item.tag" class="tag" :class="item.tagstyle"> <div v-if="item.tag" class="tag" :class="item.tagstyle">
<strong class="tag-text">#{{ item.tag }}</strong> <strong class="tag-text">#{{ item.tag }}</strong>
@ -109,6 +112,7 @@ export default {
}) })
.catch((e) => { .catch((e) => {
console.log(e); console.log(e);
this.name = this.item.name;
this.error = true; this.error = true;
}); });
}, },

View File

@ -0,0 +1,22 @@
<template>
<Generic :item="item" :title="error.message" class="component-error">
<template #content>
<p class="title is-4">{{ item.name }}</p>
<p class="subtitle is-6">Failed to load component</p>
</template>
<template #indicator></template>
</Generic>
</template>
<script>
import service from "@/mixins/service.js";
export default {
name: "Error",
mixins: [service],
props: {
item: Object,
error: Object,
},
};
</script>