chore(control): improve app startup and display status ping behavior

This commit is contained in:
E44
2026-01-18 13:17:53 +01:00
parent b57ea762bf
commit 922b47bd1e
3 changed files with 67 additions and 25 deletions
+42 -9
View File
@@ -5,26 +5,59 @@ import { update_folder_elements_recursively } from './stores/files';
import { db } from './database'; import { db } from './database';
const update_display_status_interval_seconds = 20; const update_display_status_interval_seconds = 20;
const update_display_loading_status_interval_seconds = 2;
export async function on_start() { const loading_display_ids: string[] = [];
export async function on_app_start() {
await db.files.clear(); await db.files.clear();
await db.files_on_display.clear(); await db.files_on_display.clear();
await update_all_display_status(); await update_all_display_status(false);
await setInterval(update_all_display_status, update_display_status_interval_seconds * 1000); await setInterval(
() => update_all_display_status(false),
update_display_status_interval_seconds * 1000
);
await setInterval(
() => update_all_display_status(true),
update_display_loading_status_interval_seconds * 1000
);
} }
async function update_all_display_status() { async function update_all_display_status(only_loading_displays: boolean) {
const all_displays: Display[] = await db.displays.toArray(); const not_loading_displays: Display[] = await db.displays
for (const display of all_displays) { .filter((d) =>
only_loading_displays
? loading_display_ids.includes(d.id)
: !loading_display_ids.includes(d.id)
)
.toArray();
for (const display of not_loading_displays) {
await update_display_status(display);
}
}
export async function update_display_status(display: Display) {
const new_status = await ping_ip(display.ip); const new_status = await ping_ip(display.ip);
if (new_status === null && display.status !== null) continue; if (new_status === null && display.status !== null) return;
if (new_status === 'app_online' && display.status !== 'app_online') { if (new_status !== display.status) {
// status change
if (new_status === 'app_offline') {
loading_display_ids.push(display.id);
} else {
remove_display_from_loading_displays(display.id);
if (new_status === 'app_online') {
on_display_start(display); on_display_start(display);
} }
if (new_status !== display.status) { }
display.status = new_status; display.status = new_status;
await db.displays.put(display); // save await db.displays.put(display); // save
} }
}
export function remove_display_from_loading_displays(display_id: string) {
const index = loading_display_ids.indexOf(display_id);
if (index !== -1) {
loading_display_ids.splice(index, 1);
} }
} }
+11 -6
View File
@@ -12,6 +12,7 @@ import { get_screenshot } from '../api_handler';
import { delete_and_deselect_unique_files_from_display } from './files'; import { delete_and_deselect_unique_files_from_display } from './files';
import { db } from '../database'; import { db } from '../database';
import { dev } from '$app/environment'; import { dev } from '$app/environment';
import { remove_display_from_loading_displays } from '../main';
export const local_displays: Writable<DisplayIdGroup[]> = writable<DisplayIdGroup[]>([]); export const local_displays: Writable<DisplayIdGroup[]> = writable<DisplayIdGroup[]>([]);
@@ -25,8 +26,8 @@ export async function add_display(
mac: string | null, mac: string | null,
name: string, name: string,
status: DisplayStatus status: DisplayStatus
) { ): Promise<Display | null> {
if (await is_display_name_taken(name)) return; if (await is_display_name_taken(name)) return null;
const new_id = get_uuid(); const new_id = get_uuid();
const group = await db.display_groups.toCollection().first(); const group = await db.display_groups.toCollection().first();
let group_id: string; let group_id: string;
@@ -38,7 +39,7 @@ export async function add_display(
} }
const element_count_in_group = (await db.displays.where('group_id').equals(group_id).toArray()) const element_count_in_group = (await db.displays.where('group_id').equals(group_id).toArray())
.length; .length;
await db.displays.put({ const display = {
id: new_id, id: new_id,
ip, ip,
mac, mac,
@@ -47,7 +48,9 @@ export async function add_display(
group_id: group_id, group_id: group_id,
name, name,
status status
}); };
await db.displays.put(display);
return display;
} }
export async function edit_display_data( export async function edit_display_data(
@@ -55,11 +58,12 @@ export async function edit_display_data(
ip: string, ip: string,
mac: string | null, mac: string | null,
name: string name: string
) { ): Promise<Display | null> {
let display = await db.displays.get(display_id); let display = await db.displays.get(display_id);
if (!display) return; if (!display) return null;
display = { ...display, ip: ip, mac: mac, name: name }; display = { ...display, ip: ip, mac: mac, name: name };
await db.displays.put(display); // save await db.displays.put(display); // save
return display;
} }
export async function remove_display(display_id: string) { export async function remove_display(display_id: string) {
@@ -71,6 +75,7 @@ export async function remove_display(display_id: string) {
if (group_id && (await db.displays.where('group_id').equals(group_id).toArray()).length === 0) { if (group_id && (await db.displays.where('group_id').equals(group_id).toArray()).length === 0) {
await db.display_groups.delete(group_id); // delete empty group await db.display_groups.delete(group_id); // delete empty group
} }
await remove_display_from_loading_displays(display_id);
} }
export async function all_displays_of_group_selected( export async function all_displays_of_group_selected(
+9 -5
View File
@@ -5,7 +5,7 @@
import ControlView from './ControlView.svelte'; import ControlView from './ControlView.svelte';
import DisplayView from './DisplayView.svelte'; import DisplayView from './DisplayView.svelte';
import PopUp from '$lib/components/PopUp.svelte'; import PopUp from '$lib/components/PopUp.svelte';
import { type PopupContent } from '$lib/ts/types'; import { type Display, type PopupContent } from '$lib/ts/types';
import TextInput from '$lib/components/TextInput.svelte'; import TextInput from '$lib/components/TextInput.svelte';
import { import {
add_display, add_display,
@@ -17,7 +17,7 @@
import { notifications } from '$lib/ts/stores/notification'; import { notifications } from '$lib/ts/stores/notification';
import { ping_ip } from '$lib/ts/api_handler'; import { ping_ip } from '$lib/ts/api_handler';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { on_start } from '$lib/ts/main'; import { on_app_start, update_display_status } from '$lib/ts/main';
import { display_status_to_info } from '$lib/ts/utils'; import { display_status_to_info } from '$lib/ts/utils';
import HighlightedText from '$lib/components/HighlightedText.svelte'; import HighlightedText from '$lib/components/HighlightedText.svelte';
@@ -55,11 +55,15 @@
const ip = text_inputs_valid.ip.value; const ip = text_inputs_valid.ip.value;
const mac = text_inputs_valid.mac.value === '' ? null : text_inputs_valid.mac.value; const mac = text_inputs_valid.mac.value === '' ? null : text_inputs_valid.mac.value;
const name = text_inputs_valid.name.value; const name = text_inputs_valid.name.value;
let display: Display | null = null;
if (!!existing_display_id) { if (!!existing_display_id) {
await edit_display_data(existing_display_id, ip, mac, name); display = await edit_display_data(existing_display_id, ip, mac, name);
} else { } else {
const status = await ping_ip(text_inputs_valid.ip.value); const status = await ping_ip(text_inputs_valid.ip.value);
await add_display(ip, mac, name, status); display = await add_display(ip, mac, name, status);
}
if (!!display) {
await update_display_status(display);
} }
} }
@@ -112,7 +116,7 @@
}; };
}; };
onMount(on_start); onMount(on_app_start);
</script> </script>
{#snippet remove_display_popup(display_id: string)} {#snippet remove_display_popup(display_id: string)}