diff --git a/app/frontend/src/App.svelte b/app/frontend/src/App.svelte index 5fa20347..6f61709e 100644 --- a/app/frontend/src/App.svelte +++ b/app/frontend/src/App.svelte @@ -2,11 +2,18 @@ import { onMount } from 'svelte'; import store from './store.js'; import Navbar from "./components/Navbar.svelte"; - import DeviceCard from "./components/DeviceCard.svelte" + import DeviceCard from "./components/DeviceCard.svelte"; + import Toast from "./components/Toast.svelte"; let visitors = 0; let devices = []; let settings = {} + let toast = { + title: "", + message: "", + color: "", + show: false + } onMount(() => { store.subscribe(currentMessage => { @@ -32,9 +39,9 @@ // set device status if (currentMessage.message.up == true) { - setUp(currentMessage.message.id); + setUp(currentMessage.message); } else { - setDown(currentMessage.message.id); + setDown(currentMessage.message); } } else if (currentMessage.type == "wake") { // set device waking @@ -71,10 +78,13 @@ }) }) - function setUp(id) { - const dot = document.querySelector(`#dot-${id}`) - const spinner = document.querySelector(`#spinner-${id}`); + function setUp(device) { + const dot = document.querySelector(`#dot-${device.id}`) + const spinner = document.querySelector(`#spinner-${device.id}`); if (dot) { + if (dot.classList.contains("danger")) { + showToast(device.name, "Device is up!", "success") + } dot.style.animation = "none"; dot.offsetWidth; if (!spinner.classList.contains("d-none")) { @@ -89,10 +99,13 @@ } } - function setDown(id) { - const dot = document.querySelector(`#dot-${id}`) - const spinner = document.querySelector(`#spinner-${id}`); + function setDown(device) { + const dot = document.querySelector(`#dot-${device.id}`) + const spinner = document.querySelector(`#spinner-${device.id}`); if (dot) { + if (dot.classList.contains("success")) { + showToast(device.name, "Device is down!", "danger") + } dot.style.animation = "none"; dot.offsetWidth; if (!spinner.classList.contains("d-none")) { @@ -114,6 +127,19 @@ spinner.classList.remove("d-none"); } + function showToast(title, message, color) { + if (settings.notifications === false) { + return + } + toast.title = title; + toast.message = message; + toast.color = color; + toast.show = true; + setTimeout(() => { + toast.show = false; + }, 4000) + } + function compare(a, b) { if (a.name < b.name){ return -1; @@ -135,14 +161,86 @@ {/each} + diff --git a/app/frontend/src/components/Navbar.svelte b/app/frontend/src/components/Navbar.svelte index 0b30e986..7ba48ead 100644 --- a/app/frontend/src/components/Navbar.svelte +++ b/app/frontend/src/components/Navbar.svelte @@ -1,5 +1,6 @@ -