Added toast timer functions
This commit is contained in:
@@ -16,7 +16,7 @@ import ToastsList from "@/components/toast/ToastsList.vue";
|
|||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
Navbar,
|
Navbar,
|
||||||
ToastsList,
|
ToastsList
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -85,7 +85,7 @@
|
|||||||
|
|
||||||
<div class="card-actions">
|
<div class="card-actions">
|
||||||
<button
|
<button
|
||||||
@click="toggleFav(celestial.id)"
|
@click="toggleFav(celestial)"
|
||||||
class="favourite no-style"
|
class="favourite no-style"
|
||||||
:class="isFav ? 'active' : ''"
|
:class="isFav ? 'active' : ''"
|
||||||
>
|
>
|
||||||
@@ -120,9 +120,25 @@ export default defineComponent({
|
|||||||
celestial: Object
|
celestial: Object
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
toggleFav: (celestialId: string) => {
|
toggleFav: (celestial: any) => {
|
||||||
store.dispatch("toggleFav", celestialId);
|
store.dispatch("toggleFav", celestial.id);
|
||||||
console.log(store.state.user.favourites);
|
if (store.getters.isFav(celestial.id)) {
|
||||||
|
store.dispatch("toasts/pushToast", {
|
||||||
|
id: 200,
|
||||||
|
title: "Favori ajouté",
|
||||||
|
message: `${celestial.name} a été ajouté à la liste des favoris.`,
|
||||||
|
category: "valid",
|
||||||
|
timer: 3
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
store.dispatch("toasts/pushToast", {
|
||||||
|
id: 200,
|
||||||
|
title: "Favori retiré",
|
||||||
|
message: `${celestial.name} a été retiré de la liste des favoris.`,
|
||||||
|
category: "valid",
|
||||||
|
timer: 3
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="toast-card" :class="variant">
|
<div class="toast-card" :class="toast.category">
|
||||||
<div class="toast-title">
|
<div class="toast-title">
|
||||||
<slot name="title" />
|
<slot name="title" />
|
||||||
</div>
|
</div>
|
||||||
@@ -15,7 +15,25 @@ import { defineComponent } from "vue";
|
|||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ToastCard",
|
name: "ToastCard",
|
||||||
props: {
|
props: {
|
||||||
variant: String
|
toast: Object
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// Counts down until 0 is reached
|
||||||
|
countdown(timeToLive) {
|
||||||
|
if (timeToLive > 0) {
|
||||||
|
console.log(timeToLive);
|
||||||
|
setTimeout(() => {
|
||||||
|
timeToLive = timeToLive - 1;
|
||||||
|
this.countdown(timeToLive);
|
||||||
|
}, 800);
|
||||||
|
} else {
|
||||||
|
// When timer ends
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// Starts countdown to initial timer value
|
||||||
|
this.countdown(this.toast.timer);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -23,11 +41,12 @@ export default defineComponent({
|
|||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.toast-card {
|
.toast-card {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
width: 300px;
|
||||||
padding: 20px 30px 26px;
|
padding: 20px 30px 26px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
animation: fadeIn 1s cubic-bezier(0.175, 1, 0.32, 1),
|
animation: fadeIn 1s cubic-bezier(0.175, 1, 0.32, 1),
|
||||||
slideFromRight 1s cubic-bezier(0.175, 1, 0.32, 1);
|
slideFromRight 1s cubic-bezier(0.175, 1, 0.32, 1);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
.toast-title {
|
.toast-title {
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
|||||||
@@ -1,34 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="toast-wrapper">
|
<div class="toast-wrapper">
|
||||||
<div class="toast-item">
|
<div class="toast-item" v-for="toast in queue" :key="toast.id">
|
||||||
<toast-card variant="info">
|
<toast-card :variant="toast.category" :toast="toast">
|
||||||
<template #title>Toast informant</template>
|
<template #title>{{ toast.title }}</template>
|
||||||
<template #message>
|
<template #message>
|
||||||
Ce message est utilisé pour informer.
|
{{ toast.message }}
|
||||||
</template>
|
|
||||||
</toast-card>
|
|
||||||
</div>
|
|
||||||
<div class="toast-item">
|
|
||||||
<toast-card variant="valid">
|
|
||||||
<template #title>Toast validant</template>
|
|
||||||
<template #message>
|
|
||||||
Ce message est utilisé pour valider.
|
|
||||||
</template>
|
|
||||||
</toast-card>
|
|
||||||
</div>
|
|
||||||
<div class="toast-item">
|
|
||||||
<toast-card variant="warning">
|
|
||||||
<template #title>Toast avertissant</template>
|
|
||||||
<template #message>
|
|
||||||
Ce message est utilisé pour avertir.
|
|
||||||
</template>
|
|
||||||
</toast-card>
|
|
||||||
</div>
|
|
||||||
<div class="toast-item">
|
|
||||||
<toast-card variant="danger">
|
|
||||||
<template #title>Toast d'alerte</template>
|
|
||||||
<template #message>
|
|
||||||
Ce message est utilisé pour alerter.
|
|
||||||
</template>
|
</template>
|
||||||
</toast-card>
|
</toast-card>
|
||||||
</div>
|
</div>
|
||||||
@@ -37,12 +13,23 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { defineComponent } from "vue";
|
import { defineComponent } from "vue";
|
||||||
|
|
||||||
import ToastCard from "./ToastCard.vue";
|
import ToastCard from "./ToastCard.vue";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "ToastsList",
|
name: "ToastsList",
|
||||||
components: {
|
components: {
|
||||||
ToastCard
|
ToastCard
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
queue() {
|
||||||
|
return this.$store.state.toasts.queue;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
queue(next, old) {
|
||||||
|
console.log(old, next);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import { createStore } from "vuex";
|
import { createStore } from "vuex";
|
||||||
|
|
||||||
|
import toastStore from "./toasts";
|
||||||
|
|
||||||
export default createStore({
|
export default createStore({
|
||||||
state: () => ({
|
state: () => ({
|
||||||
user: {
|
user: {
|
||||||
@@ -39,5 +41,12 @@ export default createStore({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
modules: {}
|
modules: {
|
||||||
|
toasts: {
|
||||||
|
namespaced: true,
|
||||||
|
state: toastStore.state,
|
||||||
|
mutations: toastStore.mutations,
|
||||||
|
actions: toastStore.actions
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
21
src/store/toasts/index.ts
Normal file
21
src/store/toasts/index.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
export default {
|
||||||
|
state: {
|
||||||
|
queue: Array<{
|
||||||
|
id: number;
|
||||||
|
title: string;
|
||||||
|
message: string;
|
||||||
|
category: string;
|
||||||
|
timer: number;
|
||||||
|
}>()
|
||||||
|
},
|
||||||
|
mutations: {
|
||||||
|
pushToast: (state: any, toast: any) => {
|
||||||
|
state.queue.push(toast);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
pushToast: ({ commit }: any, toast: any) => {
|
||||||
|
commit("pushToast", toast);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user