diff --git a/app/src/lib/types/models.ts b/app/src/lib/types/models.ts index 7387797..ac53ff3 100644 --- a/app/src/lib/types/models.ts +++ b/app/src/lib/types/models.ts @@ -190,3 +190,32 @@ export type ServoConfiguration = { servo_oscillator_frequency: number servos: Servo[] } + +export interface MDNSServiceQuery { + services: MDNSServiceItem[] +} + +export interface MDNSServiceItem { + ip: string + port: number + name: string +} + +export interface MDNSService { + service: string + protocol: string + port: number +} + +export interface MDNSTxtRecord { + key: string + value: string +} + +export interface MDNSStatus { + started: boolean + hostname: string + instance: string + services: MDNSService[] + global_txt_records: MDNSTxtRecord[] +} diff --git a/app/src/lib/utilities/string-utilities.ts b/app/src/lib/utilities/string-utilities.ts index 0f62434..e4b6c80 100644 --- a/app/src/lib/utilities/string-utilities.ts +++ b/app/src/lib/utilities/string-utilities.ts @@ -1,36 +1,47 @@ export const humanFileSize = (size: number): string => { - const units = ['B', 'kB', 'MB', 'GB', 'TB']; - var i = size == 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024)); - return Number((size / Math.pow(1024, i)).toFixed(2)) * 1 + units[i]; -}; + const units = ['B', 'kB', 'MB', 'GB', 'TB'] + const i = size == 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024)) + return Number((size / Math.pow(1024, i)).toFixed(2)) * 1 + units[i] +} export const capitalize = (str: string): string => { - return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); -}; + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase() +} export const convertSeconds = (seconds: number) => { - // Calculate the number of seconds, minutes, hours, and days - let minutes = Math.floor(seconds / 60); - let hours = Math.floor(minutes / 60); - let days = Math.floor(hours / 24); + // Calculate the number of seconds, minutes, hours, and days + let minutes = Math.floor(seconds / 60) + let hours = Math.floor(minutes / 60) + const days = Math.floor(hours / 24) - // Calculate the remaining hours, minutes, and seconds - hours = hours % 24; - minutes = minutes % 60; - seconds = seconds % 60; + // Calculate the remaining hours, minutes, and seconds + hours = hours % 24 + minutes = minutes % 60 + seconds = seconds % 60 - // Create the formatted string - let result = ''; - if (days > 0) { - result += days + ' day' + (days > 1 ? 's' : '') + ' '; - } - if (hours > 0) { - result += hours + ' hour' + (hours > 1 ? 's' : '') + ' '; - } - if (minutes > 0) { - result += minutes + ' minute' + (minutes > 1 ? 's' : '') + ' '; - } - result += seconds + ' second' + (seconds > 1 ? 's' : ''); + // Create the formatted string + let result = '' + if (days > 0) { + result += days + ' day' + (days > 1 ? 's' : '') + ' ' + } + if (hours > 0) { + result += hours + ' hour' + (hours > 1 ? 's' : '') + ' ' + } + if (minutes > 0) { + result += minutes + ' minute' + (minutes > 1 ? 's' : '') + ' ' + } + result += seconds + ' second' + (seconds > 1 ? 's' : '') - return result; -}; \ No newline at end of file + return result +} + +export const compareIp = (ip1: string, ip2: string) => { + const ip1Parts = ip1.split('.').map(Number) + const ip2Parts = ip2.split('.').map(Number) + for (let i = 0; i < 4; i++) { + if (ip1Parts[i] !== ip2Parts[i]) { + return ip1Parts[i] > ip2Parts[i] ? 1 : -1 + } + } + return 0 +} diff --git a/app/src/routes/wifi/mdns/MDNS.svelte b/app/src/routes/wifi/mdns/MDNS.svelte index 56f977b..d5d92d9 100644 --- a/app/src/routes/wifi/mdns/MDNS.svelte +++ b/app/src/routes/wifi/mdns/MDNS.svelte @@ -7,8 +7,10 @@ import StatusItem from '$lib/components/StatusItem.svelte' import { cubicOut } from 'svelte/easing' import { slide } from 'svelte/transition' + import type { MDNSStatus, MDNSServiceItem, MDNSServiceQuery } from '$lib/types/models' + import { compareIp } from '$lib/utilities' - let mdnsStatus: MDNSStatus = $state() + let mdnsStatus: MDNSStatus | undefined = $state() let services: MDNSServiceItem[] = $state([]) let isLoading = $state(false) @@ -31,44 +33,15 @@ console.error('Error:', result.inner) return } - services = result.inner.services.sort((a, b) => b.name.localeCompare(a.name)) + services = result.inner.services.sort((a, b) => compareIp(a.ip, b.ip)) isLoading = false } - onMount(() => { - getMDNSStatus() - queryMDNSServices() + onMount(async () => { + await getMDNSStatus() + await queryMDNSServices() }) - interface MDNSServiceQuery { - services: MDNSServiceItem[] - } - - interface MDNSServiceItem { - ip: string - port: number - name: string - } - - interface MDNSService { - service: string - protocol: string - port: number - } - - interface MDNSTxtRecord { - key: string - value: string - } - - interface MDNSStatus { - started: boolean - hostname: string - instance: string - services: MDNSService[] - global_txt_records: MDNSTxtRecord[] - } - const triggerScan = async () => { await queryMDNSServices() } @@ -91,9 +64,7 @@ {/snippet}