Added toast timer functions

This commit is contained in:
Alexis
2021-03-21 00:28:33 +01:00
parent ea83e946d8
commit bf9d3537b3
6 changed files with 89 additions and 37 deletions

View File

@@ -16,7 +16,7 @@ import ToastsList from "@/components/toast/ToastsList.vue";
export default defineComponent({
components: {
Navbar,
ToastsList,
ToastsList
}
});
</script>

View File

@@ -85,7 +85,7 @@
<div class="card-actions">
<button
@click="toggleFav(celestial.id)"
@click="toggleFav(celestial)"
class="favourite no-style"
:class="isFav ? 'active' : ''"
>
@@ -120,9 +120,25 @@ export default defineComponent({
celestial: Object
},
methods: {
toggleFav: (celestialId: string) => {
store.dispatch("toggleFav", celestialId);
console.log(store.state.user.favourites);
toggleFav: (celestial: any) => {
store.dispatch("toggleFav", celestial.id);
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
});
}
}
}
});

View File

@@ -1,5 +1,5 @@
<template>
<div class="toast-card" :class="variant">
<div class="toast-card" :class="toast.category">
<div class="toast-title">
<slot name="title" />
</div>
@@ -15,7 +15,25 @@ import { defineComponent } from "vue";
export default defineComponent({
name: "ToastCard",
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>
@@ -23,11 +41,12 @@ export default defineComponent({
<style lang="scss" scoped>
.toast-card {
position: relative;
width: 300px;
padding: 20px 30px 26px;
border-radius: 5px;
animation: fadeIn 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 {
margin-bottom: 5px;
font-size: 16px;

View File

@@ -1,34 +1,10 @@
<template>
<div class="toast-wrapper">
<div class="toast-item">
<toast-card variant="info">
<template #title>Toast informant</template>
<div class="toast-item" v-for="toast in queue" :key="toast.id">
<toast-card :variant="toast.category" :toast="toast">
<template #title>{{ toast.title }}</template>
<template #message>
Ce message est utilisé pour informer.
</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.
{{ toast.message }}
</template>
</toast-card>
</div>
@@ -37,12 +13,23 @@
<script>
import { defineComponent } from "vue";
import ToastCard from "./ToastCard.vue";
export default defineComponent({
name: "ToastsList",
components: {
ToastCard
},
computed: {
queue() {
return this.$store.state.toasts.queue;
}
},
watch: {
queue(next, old) {
console.log(old, next);
}
}
});
</script>

View File

@@ -1,5 +1,7 @@
import { createStore } from "vuex";
import toastStore from "./toasts";
export default createStore({
state: () => ({
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
View 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);
}
}
};