Watch: status, environment and notifications screens

A gear on the feed opens a status overview that leads with what is wrong:
offline hosts, hosts on a fallback route, tokens expiring within 7 days,
and push problems, with healthy hosts folded into one row. Each host opens
its route ladder with Reconnect. The notifications page shows registration,
the last push, Send test and Unpair. Demo mode gains a Laptop on its VPN
fallback, and snapshot tests render the three screens.
This commit is contained in:
gib committed 2026-11-01 15:16:18 -05:00
1 parent 9707daf1fe
commit 7ca0362745
17 files changed
+1063 -14

No files matched your search

+22
View File
@@ -52,6 +52,12 @@ protocol GatewayAPI: Sendable {
func projects() async throws -> ProjectsResponse
func newThread(_ request: NewThreadRequest) async throws -> NewThreadResponse
func registerPush(_ registration: PushRegistration) async throws
func status() async throws -> StatusResponse
/// Connects the host again from its first route.
func reconnect(hostId: String) async throws
func testPush() async throws -> PushResult
/// Revokes this watch's device token.
func unpair() async throws
}
struct GatewayClient: GatewayAPI {
@@ -101,6 +107,22 @@ struct GatewayClient: GatewayAPI {
try await callIgnoringBody("PUT", ["v1", "device", "push"], body: registration)
}
func status() async throws -> StatusResponse {
try await call("GET", ["v1", "status"])
}
func reconnect(hostId: String) async throws {
try await callIgnoringBody("POST", ["v1", "hosts", hostId, "reconnect"], body: nil as SendMessageRequest?)
}
func testPush() async throws -> PushResult {
try await call("POST", ["v1", "device", "test-push"])
}
func unpair() async throws {
try await callIgnoringBody("DELETE", ["v1", "device"], body: nil as SendMessageRequest?)
}
// MARK: - Plumbing
private func call<Response: Decodable>(_ method: String, _ path: [String]) async throws -> Response {