Toast disappear functionnalities

This commit is contained in:
Alexis
2021-03-21 11:21:32 +01:00
parent bf9d3537b3
commit e686ca9a75
8 changed files with 85 additions and 14 deletions

37
package-lock.json generated
View File

@@ -1377,6 +1377,12 @@
} }
} }
}, },
"@types/uuid": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz",
"integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==",
"dev": true
},
"@types/webpack": { "@types/webpack": {
"version": "4.41.26", "version": "4.41.26",
"resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.26.tgz", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.26.tgz",
@@ -9959,6 +9965,14 @@
"tough-cookie": "~2.5.0", "tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0", "tunnel-agent": "^0.6.0",
"uuid": "^3.3.2" "uuid": "^3.3.2"
},
"dependencies": {
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"dev": true
}
} }
}, },
"require-directory": { "require-directory": {
@@ -10604,6 +10618,14 @@
"faye-websocket": "^0.11.3", "faye-websocket": "^0.11.3",
"uuid": "^3.4.0", "uuid": "^3.4.0",
"websocket-driver": "^0.7.4" "websocket-driver": "^0.7.4"
},
"dependencies": {
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"dev": true
}
} }
}, },
"sockjs-client": { "sockjs-client": {
@@ -11838,10 +11860,9 @@
"dev": true "dev": true
}, },
"uuid": { "uuid": {
"version": "3.4.0", "version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
"dev": true
}, },
"v8-compile-cache": { "v8-compile-cache": {
"version": "2.2.0", "version": "2.2.0",
@@ -12666,6 +12687,14 @@
"requires": { "requires": {
"ansi-colors": "^3.0.0", "ansi-colors": "^3.0.0",
"uuid": "^3.3.2" "uuid": "^3.3.2"
},
"dependencies": {
"uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"dev": true
}
} }
}, },
"webpack-merge": { "webpack-merge": {

View File

@@ -10,11 +10,13 @@
"dependencies": { "dependencies": {
"axios": "^0.21.1", "axios": "^0.21.1",
"core-js": "^3.6.5", "core-js": "^3.6.5",
"uuid": "^8.3.2",
"vue": "^3.0.0", "vue": "^3.0.0",
"vue-router": "^4.0.0-0", "vue-router": "^4.0.0-0",
"vuex": "^4.0.0-0" "vuex": "^4.0.0-0"
}, },
"devDependencies": { "devDependencies": {
"@types/uuid": "^8.3.0",
"@typescript-eslint/eslint-plugin": "^2.33.0", "@typescript-eslint/eslint-plugin": "^2.33.0",
"@typescript-eslint/parser": "^2.33.0", "@typescript-eslint/parser": "^2.33.0",
"@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-babel": "~4.5.0",

View File

@@ -27,6 +27,15 @@
} }
} }
@keyframes fadeOut {
from {
opacity: 100%;
}
to {
opacity: 0;
}
}
@keyframes fromBottom { @keyframes fromBottom {
from { from {
transform: translateY(20px); transform: translateY(20px);
@@ -45,6 +54,15 @@
} }
} }
@keyframes slideFromLeft {
from {
transform: translateX(0);
}
to {
transform: translateX(100%);
}
}
@keyframes paneBgAround { @keyframes paneBgAround {
0% { 0% {
background-position: -10vw 0%; background-position: -10vw 0%;

View File

@@ -98,6 +98,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from "vue"; import { defineComponent } from "vue";
import { v4 as uuidv4 } from "uuid";
import store from "@/store"; import store from "@/store";
@@ -124,7 +125,7 @@ export default defineComponent({
store.dispatch("toggleFav", celestial.id); store.dispatch("toggleFav", celestial.id);
if (store.getters.isFav(celestial.id)) { if (store.getters.isFav(celestial.id)) {
store.dispatch("toasts/pushToast", { store.dispatch("toasts/pushToast", {
id: 200, id: uuidv4(),
title: "Favori ajouté", title: "Favori ajouté",
message: `${celestial.name} a été ajouté à la liste des favoris.`, message: `${celestial.name} a été ajouté à la liste des favoris.`,
category: "valid", category: "valid",
@@ -132,7 +133,7 @@ export default defineComponent({
}); });
} else { } else {
store.dispatch("toasts/pushToast", { store.dispatch("toasts/pushToast", {
id: 200, id: uuidv4(),
title: "Favori retiré", title: "Favori retiré",
message: `${celestial.name} a été retiré de la liste des favoris.`, message: `${celestial.name} a été retiré de la liste des favoris.`,
category: "valid", category: "valid",

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="toast-card" :class="toast.category"> <div class="toast-card" :class="[toast.category, closing ? 'closing' : '']">
<div class="toast-title"> <div class="toast-title">
<slot name="title" /> <slot name="title" />
</div> </div>
@@ -12,8 +12,15 @@
<script> <script>
import { defineComponent } from "vue"; import { defineComponent } from "vue";
import store from "@/store";
export default defineComponent({ export default defineComponent({
name: "ToastCard", name: "ToastCard",
data() {
return {
closing: false
};
},
props: { props: {
toast: Object toast: Object
}, },
@@ -25,10 +32,17 @@ export default defineComponent({
setTimeout(() => { setTimeout(() => {
timeToLive = timeToLive - 1; timeToLive = timeToLive - 1;
this.countdown(timeToLive); this.countdown(timeToLive);
}, 800); }, 900);
} else { } else {
// When timer ends // When timer ends
this.closing = true;
setTimeout(() => {
this.close();
}, 1200);
} }
},
close() {
store.dispatch("toasts/purgeToast", this.toast.id);
} }
}, },
mounted() { mounted() {
@@ -76,5 +90,9 @@ export default defineComponent({
&.danger { &.danger {
background-color: $danger; background-color: $danger;
} }
&.closing {
animation: fadeOut 1.2s cubic-bezier(0.175, 1, 0.32, 1),
slideFromLeft 1.2s cubic-bezier(0.175, 1, 0.32, 1);
}
} }
</style> </style>

View File

@@ -25,11 +25,6 @@ export default defineComponent({
queue() { queue() {
return this.$store.state.toasts.queue; return this.$store.state.toasts.queue;
} }
},
watch: {
queue(next, old) {
console.log(old, next);
}
} }
}); });
</script> </script>

2
src/shims-vue.d.ts vendored
View File

@@ -4,3 +4,5 @@ declare module '*.vue' {
const component: DefineComponent<{}, {}, any> const component: DefineComponent<{}, {}, any>
export default component export default component
} }
declare module 'uuid';

View File

@@ -1,7 +1,7 @@
export default { export default {
state: { state: {
queue: Array<{ queue: Array<{
id: number; id: string;
title: string; title: string;
message: string; message: string;
category: string; category: string;
@@ -11,11 +11,17 @@ export default {
mutations: { mutations: {
pushToast: (state: any, toast: any) => { pushToast: (state: any, toast: any) => {
state.queue.push(toast); state.queue.push(toast);
},
purgeToast: (state: any, toastId: string) => {
state.queue = state.queue.filter((toast: any) => toast.id != toastId);
} }
}, },
actions: { actions: {
pushToast: ({ commit }: any, toast: any) => { pushToast: ({ commit }: any, toast: any) => {
commit("pushToast", toast); commit("pushToast", toast);
},
purgeToast: ({ commit }: any, toastId: string) => {
commit("purgeToast", toastId);
} }
} }
}; };