feat: online side widget
This commit is contained in:
parent
75bf26a279
commit
b807b7c577
8 changed files with 67 additions and 21 deletions
|
|
@ -17,7 +17,7 @@
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<section class="font-mono !py-2.5 min-w-40 h-min">
|
<section class="side">
|
||||||
<legend>clock</legend>
|
<legend>clock</legend>
|
||||||
|
|
||||||
<span class="block font-bold text-lg">{clock}</span>
|
<span class="block font-bold text-lg">{clock}</span>
|
||||||
|
|
|
||||||
|
|
@ -2,22 +2,7 @@
|
||||||
import { Area, Axis, Chart, Highlight, LinearGradient, Svg, Tooltip } from "layerchart";
|
import { Area, Axis, Chart, Highlight, LinearGradient, Svg, Tooltip } from "layerchart";
|
||||||
import { scaleTime } from "d3-scale";
|
import { scaleTime } from "d3-scale";
|
||||||
import { onMount } from "svelte";
|
import { onMount } from "svelte";
|
||||||
|
import { computerData } from "../states.svelte";
|
||||||
interface ApiResponse {
|
|
||||||
online: boolean;
|
|
||||||
uptimeStart: number;
|
|
||||||
totals: {
|
|
||||||
keys: number;
|
|
||||||
clicks: number;
|
|
||||||
};
|
|
||||||
graph: {
|
|
||||||
timestamp: string;
|
|
||||||
cpu: number;
|
|
||||||
ram: number;
|
|
||||||
keys: number;
|
|
||||||
clicks: number;
|
|
||||||
}[];
|
|
||||||
}
|
|
||||||
|
|
||||||
type GraphData = {
|
type GraphData = {
|
||||||
timestamp: Date;
|
timestamp: Date;
|
||||||
|
|
@ -44,8 +29,8 @@
|
||||||
let uptimeStart: Date;
|
let uptimeStart: Date;
|
||||||
|
|
||||||
const get = async () => {
|
const get = async () => {
|
||||||
const request = await fetch("https://api.trafficlunar.net/computer");
|
const data = computerData.data; // no point in this; looks better
|
||||||
const data = (await request.json()) as ApiResponse;
|
if (!data) return;
|
||||||
|
|
||||||
online = data.online;
|
online = data.online;
|
||||||
uptimeStart = new Date(data.uptimeStart * 1000); // convert to milliseconds
|
uptimeStart = new Date(data.uptimeStart * 1000); // convert to milliseconds
|
||||||
|
|
|
||||||
31
src/components/Online.svelte
Normal file
31
src/components/Online.svelte
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
<script lang="ts">
|
||||||
|
import { onMount } from "svelte";
|
||||||
|
import { computerData } from "../states.svelte";
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
const get = async () => {
|
||||||
|
const request = await fetch("https://api.trafficlunar.net/computer");
|
||||||
|
const data = (await request.json()) as ApiResponse;
|
||||||
|
computerData.data = data;
|
||||||
|
};
|
||||||
|
|
||||||
|
get();
|
||||||
|
const interval = setInterval(get, 30000);
|
||||||
|
return () => clearInterval(interval);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<section class="side">
|
||||||
|
<legend>status</legend>
|
||||||
|
|
||||||
|
<div class="flex justify-center items-center absolute -top-2 right-2 -z-10">
|
||||||
|
<div class="size-4 rounded-full {computerData.data?.online ? 'bg-green' : 'bg-red'}"></div>
|
||||||
|
<div
|
||||||
|
class="size-4 rounded-full absolute animate-duration-2s animate-delay-2s {computerData.data?.online ? 'bg-green animate-ping' : 'bg-red'}"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span>I'M</span>
|
||||||
|
<span class={`font-black ${computerData.data?.online ? "text-green" : "text-red"}`}>{computerData.data?.online ? "ONLINE" : "OFFLINE"}.</span>
|
||||||
|
<p class="text-surface2 text-xs mt-1">feel free to reach out!</p>
|
||||||
|
</section>
|
||||||
|
|
@ -9,7 +9,7 @@ import LastFMIcon from "../assets/icons/socials/lastfm.svg";
|
||||||
import MailIcon from "../assets/icons/socials/mail.svg";
|
import MailIcon from "../assets/icons/socials/mail.svg";
|
||||||
---
|
---
|
||||||
|
|
||||||
<section class="!p-2 min-w-40">
|
<section class="side !p-2">
|
||||||
<legend>socials</legend>
|
<legend>socials</legend>
|
||||||
<ul class="grid grid-cols-4 [&_a]:flex [&_a]:justify-center [&_a]:size-full [&_a]:py-1">
|
<ul class="grid grid-cols-4 [&_a]:flex [&_a]:justify-center [&_a]:size-full [&_a]:py-1">
|
||||||
<li class="z-50">
|
<li class="z-50">
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import "../style.css";
|
||||||
|
|
||||||
import Socials from "../components/Socials.astro";
|
import Socials from "../components/Socials.astro";
|
||||||
import Clock from "../components/Clock.svelte";
|
import Clock from "../components/Clock.svelte";
|
||||||
|
import Online from "../components/Online.svelte";
|
||||||
import Footer from "../components/Footer.astro";
|
import Footer from "../components/Footer.astro";
|
||||||
|
|
||||||
import KawaiiLogo from "../assets/kawaii.svg";
|
import KawaiiLogo from "../assets/kawaii.svg";
|
||||||
|
|
@ -49,6 +50,7 @@ import Lunar from "../assets/lunar.svg";
|
||||||
<div class="flex flex-col justify-center w-fit max-[60rem]:flex-row max-[60rem]:mt-0 max-[60rem]:gap-2">
|
<div class="flex flex-col justify-center w-fit max-[60rem]:flex-row max-[60rem]:mt-0 max-[60rem]:gap-2">
|
||||||
<Socials />
|
<Socials />
|
||||||
<Clock client:only />
|
<Clock client:only />
|
||||||
|
<Online client:only />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
9
src/states.svelte.ts
Normal file
9
src/states.svelte.ts
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
type ComputerData = {
|
||||||
|
data: ApiResponse | undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
// prevents sending 2 requests to the same route in my API
|
||||||
|
// check Online.svelte for where data is fetched
|
||||||
|
export let computerData = $state<ComputerData>({
|
||||||
|
data: undefined,
|
||||||
|
});
|
||||||
|
|
@ -76,7 +76,11 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
section {
|
section {
|
||||||
@apply bg-base-darker p-4 rounded-lg relative border border-surface0 shadow-md;
|
@apply bg-base-darker p-4 rounded-lg relative border border-surface0 shadow-md h-min;
|
||||||
|
}
|
||||||
|
|
||||||
|
section.side {
|
||||||
|
@apply w-40 font-mono py-2.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
section:has(legend) {
|
section:has(legend) {
|
||||||
|
|
|
||||||
15
src/types.d.ts
vendored
Normal file
15
src/types.d.ts
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
interface ApiResponse {
|
||||||
|
online: boolean;
|
||||||
|
uptimeStart: number;
|
||||||
|
totals: {
|
||||||
|
keys: number;
|
||||||
|
clicks: number;
|
||||||
|
};
|
||||||
|
graph: {
|
||||||
|
timestamp: string;
|
||||||
|
cpu: number;
|
||||||
|
ram: number;
|
||||||
|
keys: number;
|
||||||
|
clicks: number;
|
||||||
|
}[];
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue