11import { A } from "@solidjs/router"
2+ import { createSignal , onMount } from "solid-js"
23import { LanguagePicker } from "~/component/language-picker"
34import { useI18n } from "~/context/i18n"
45import { useLanguage } from "~/context/language"
6+ import "./legal.css"
57
68export function Legal ( ) {
79 const i18n = useI18n ( )
@@ -11,6 +13,9 @@ export function Legal() {
1113 < span >
1214 ©{ new Date ( ) . getFullYear ( ) } < a href = "https://anoma.ly" > Anomaly</ a >
1315 </ span >
16+ < span >
17+ < SystemStatusLink />
18+ </ span >
1419 < span >
1520 < A href = { language . route ( "/brand" ) } > { i18n . t ( "legal.brand" ) } </ A >
1621 </ span >
@@ -26,3 +31,30 @@ export function Legal() {
2631 </ div >
2732 )
2833}
34+
35+ const systemStatuses = [ "operational" , "degraded" , "outage" , "unknown" ] as const
36+ type SystemStatus = ( typeof systemStatuses ) [ number ]
37+
38+ function SystemStatusLink ( ) {
39+ const i18n = useI18n ( )
40+ const [ status , setStatus ] = createSignal < SystemStatus > ( "unknown" )
41+
42+ onMount ( ( ) => {
43+ fetch ( "/status/api/summary" , { signal : AbortSignal . timeout ( 10_000 ) } )
44+ . then ( ( response ) => ( response . ok ? response . json ( ) : undefined ) )
45+ . then ( ( body : unknown ) => setStatus ( readSystemStatus ( body ) ) )
46+ . catch ( ( ) => setStatus ( "unknown" ) )
47+ } )
48+
49+ // The status page lives outside this app and is not localized, so bypass the locale route and client router.
50+ return (
51+ < a data-slot = "status" data-status = { status ( ) } href = "/status" rel = "external" >
52+ { i18n . t ( `legal.status.${ status ( ) } ` ) }
53+ </ a >
54+ )
55+ }
56+
57+ function readSystemStatus ( body : unknown ) {
58+ if ( ! body || typeof body !== "object" || ! ( "status" in body ) ) return "unknown"
59+ return systemStatuses . find ( ( status ) => status === body . status ) ?? "unknown"
60+ }
0 commit comments