diff --git a/web/components/monitors/MonitorForm.tsx b/web/components/monitors/MonitorForm.tsx index 017aa8e..bd98417 100644 --- a/web/components/monitors/MonitorForm.tsx +++ b/web/components/monitors/MonitorForm.tsx @@ -138,193 +138,197 @@ export function MonitorForm({ const downAfter = formatDuration(new Date(Date.now() - intervalSec * Math.max(retries, 1) * 1000).toISOString()); return ( -
-
- - setName(e.target.value)} placeholder="Billing API" required /> - + +
+
+ + setName(e.target.value)} placeholder="Billing API" required /> + -
- Kind -
- {(Object.keys(typeCopy) as MonitorType[]).map((t) => ( - - ))} + + {typeCopy[t].title} + + {typeCopy[t].blurb} + + ))} +
-
- {type === "http" && ( - <> - + {type === "http" && ( + <> + + setUrl(e.target.value)} + placeholder="https://example.com/healthz" + required + /> + +
+ + + + + setExpectedStatus(Number(e.target.value))} + /> + +
+ + setKeyword(e.target.value)} placeholder="ok" /> + + + + )} + + {(type === "tcp" || type === "tls" || type === "icmp") && ( +
+ + setHost(e.target.value)} + placeholder="example.com" + required + /> + + {type !== "icmp" && ( + + setPort(Number(e.target.value))} + /> + + )} +
+ )} + + {type === "tls" && ( + setUrl(e.target.value)} - placeholder="https://example.com/healthz" - required + type="number" + className={`${inputClass} font-mono tabular-nums`} + value={tlsWarnDays} + onChange={(e) => setTlsWarnDays(Number(e.target.value))} + min={1} /> + )} +
+ +
+
- - - - + setExpectedStatus(Number(e.target.value))} + value={intervalSec} + onChange={(e) => setIntervalSec(Number(e.target.value))} + min={10} + /> + + + setRetries(Number(e.target.value))} + min={1} />
- - setKeyword(e.target.value)} placeholder="ok" /> - - - - )} - {(type === "tcp" || type === "tls" || type === "icmp") && ( -
- - setHost(e.target.value)} - placeholder="example.com" - required - /> + + - {type !== "icmp" && ( - - setPort(Number(e.target.value))} - /> - + +

+ Checked every {intervalSec} s from {runnerName}. Reported down after {retries}{" "} + {retries === 1 ? "failure" : "consecutive failures"} — roughly {downAfter}. +

+
+ +
0 ? `${channelIds.length} selected` : undefined}> + {!channels || channels.length === 0 ? ( +

+ No channels exist yet, so nobody will be told when this check fails.{" "} + + Add a channel + + . +

+ ) : ( +
+ {channels.map((ch) => ( + + setChannelIds((prev) => (v ? [...prev, ch.channel_id] : prev.filter((id) => id !== ch.channel_id))) + } + title={ch.name} + detail={ + + {ch.type} + {!ch.enabled && " · disabled, sends nothing"} + + } + /> + ))} +
)} -
- )} - {type === "tls" && ( - - setTlsWarnDays(Number(e.target.value))} - min={1} + - - )} - - -
-
- - setIntervalSec(Number(e.target.value))} - min={10} - /> - - - setRetries(Number(e.target.value))} - min={1} - /> - +
- - - - - -

- Checked every {intervalSec} s from {runnerName}. Reported down after {retries}{" "} - {retries === 1 ? "failure" : "consecutive failures"} — roughly {downAfter}. -

- - -
0 ? `${channelIds.length} selected` : undefined}> - {!channels || channels.length === 0 ? ( -

- No channels exist yet, so nobody will be told when this check fails.{" "} - - Add a channel - - . -

- ) : ( -
- {channels.map((ch) => ( - - setChannelIds((prev) => (v ? [...prev, ch.channel_id] : prev.filter((id) => id !== ch.channel_id))) - } - title={ch.name} - detail={ - - {ch.type} - {!ch.enabled && " · disabled, sends nothing"} - - } - /> - ))} -
- )} - - -
+ {error && (

{error.message}