main-site/src/routes/services/+page.svelte

97 lines
2.3 KiB
Svelte
Raw Normal View History

2024-01-01 18:40:02 +01:00
<svelte:options runes={true} />
<script lang="ts">
import ServiceCard from '$lib/components/ServiceCard.svelte';
2024-01-01 20:10:19 +01:00
import type { Service } from '$lib/types/data-types';
2024-01-03 20:40:52 +01:00
import { io } from 'socket.io-client';
import type { Heartbeat } from '$lib/types/uptime-kuma-types';
2024-01-06 14:02:30 +01:00
import { socketStore } from '$lib/stores/socketStore';
import { onDestroy } from 'svelte';
import { uptimeStore } from '$lib/stores/uptimeStore';
let { data }: { data: { promise: Promise<string> } } = $props();
let token = $state();
data.promise.then((jwt) => {
token = jwt;
2024-01-04 00:01:02 +01:00
});
let services: readonly Service[] = $state.frozen([]);
let icons: readonly string[] = $state.frozen([]);
let monitorList = $state($uptimeStore);
let socket = $socketStore;
$effect(() => {
if (token) {
if (!socket.connected) {
socket.connect();
2024-01-06 14:02:30 +01:00
} else {
console.log('connected');
}
socket.on('connect', () => {
2024-01-06 14:02:30 +01:00
console.log('login');
2024-01-04 00:01:02 +01:00
socket.emit('loginByToken', token, () => {});
});
socket.on('heartbeatList', (_: string, data) => {
let recent = data[data.length - 1];
let monitor: Heartbeat = {
monitorID: recent.monitor_id,
status: recent.status,
time: recent.time,
msg: recent.msg,
ping: recent.ping,
important: recent.important,
duration: recent.duration
2024-01-03 20:40:52 +01:00
};
monitorList.set(monitor.monitorID, monitor);
monitorList = new Map(monitorList.entries());
$uptimeStore = monitorList;
2024-01-03 20:40:52 +01:00
});
socket.on('heartbeat', (data) => {
monitorList.set(data.monitorID, data);
monitorList = new Map(monitorList.entries());
$uptimeStore = monitorList;
2024-01-03 20:40:52 +01:00
});
}
2024-01-03 20:40:52 +01:00
});
async function get(url: string): Promise<any> {
2024-01-02 02:39:22 +01:00
let res = await fetch(url);
if (res.ok) {
2024-01-02 02:39:22 +01:00
let data = await res.json();
return data;
} else {
return Promise.reject();
}
}
$effect(() => {
2024-01-02 02:39:22 +01:00
get('/data/services').then((data: Service[]) => {
services = data;
});
});
$effect(() => {
2024-01-02 02:39:22 +01:00
get('/assets/icons').then((data: string[]) => {
icons = data;
});
});
</script>
2024-01-01 19:36:42 +01:00
<svelte:head>
2024-01-01 20:00:35 +01:00
<title>Services</title>
<meta name="description" content="Overview of Services running on neshweb.net" />
2024-01-01 19:36:42 +01:00
</svelte:head>
<div class="flex max-h-full flex-row flex-wrap justify-center gap-10 overflow-auto p-8 pt-24">
2024-01-01 20:00:35 +01:00
{#each services as service}
<ServiceCard {service} {icons} monitor={monitorList.get(service.id)} />
2024-01-01 20:00:35 +01:00
{/each}
</div>