import type { EnvironmentConnectionPhase } from "@t3tools/client-runtime/connection"; /** * What the floating pill says. Connection, syncing, and working share one * element so the label swaps in place instead of one pill fading out for * another. The connection variant is tappable and triggers a reconnect. */ export type FloatingWorkingStatus = | { readonly kind: "working"; readonly startedAt: string } | { readonly kind: "syncing"; readonly label: string } | { readonly kind: "compacting" } // A task whose thread the server has not created yet: the worktree may // still be checking out, so there is no turn to time. | { readonly kind: "preparing"; readonly label: string } | { readonly kind: "connection"; readonly tone: "reconnecting" | "unavailable"; readonly label: string; readonly onPress: () => void; }; /** * The pill's connection variant, or null once the environment is connected and * the pill is free to report sync and working state instead. */ export function connectionFloatingStatus(input: { readonly connectionError: string | null; readonly connectionState: EnvironmentConnectionPhase; readonly environmentLabel: string | null; readonly onReconnect: () => void; }): FloatingWorkingStatus | null { const environmentLabel = input.environmentLabel ?? "Environment"; const unavailable = (label: string): FloatingWorkingStatus => ({ kind: "connection", tone: "unavailable", label, onPress: input.onReconnect, }); switch (input.connectionState) { case "connecting": case "reconnecting": return { kind: "connection", tone: "reconnecting", label: input.connectionError === null ? `Reconnecting to ${environmentLabel}...` : `Failed to connect. Retrying ${environmentLabel}...`, onPress: input.onReconnect, }; case "offline": return unavailable("You are offline"); case "error": return unavailable( input.connectionError ? `Failed to connect to ${environmentLabel}: ${input.connectionError}` : `Failed to connect to ${environmentLabel}`, ); case "available": return unavailable(`${environmentLabel} is not connected`); case "connected": return null; } }