import { type Signal, useSignal } from '@preact/signals' import { useEffect } from 'preact/hooks' import { JSX } from 'preact' import { requestApi } from ':src/utils.ts' type NetworkConnection = { addEventListener: ( type: 'change', listener: (event: Event) => void | Promise, ) => void } export default function IsOnline( { online, offline }: { online?: string; offline: string }, ) { const status = useSignal(offline) const connection = 'connection' in navigator ? navigator.connection as NetworkConnection : null useEffect(() => { // Update connection status on network changes connection?.addEventListener('change', () => { updateNetworkStatus(status, online, offline) }) // Update connection status on 1st load updateNetworkStatus(status, online, offline) // Update connection status on interval (10s) setInterval(() => updateNetworkStatus(status, online, offline), 10_000) }) return <>{status} } async function updateNetworkStatus( status: Signal, online: string | undefined, offline: string, ) { const isOnline = await requestApi( '/serviceworker/is-online', 'POST', ).catch(() => false) if (isOnline) { status.value = online === undefined ? : {online} } else { status.value = {offline} } }