import { A } from "@solidjs/router" import { Show, createEffect, createSignal, onCleanup } from "solid-js" import { getProfilePicture, type ProfileContent } from "applesauce-core/helpers/profile" import type { Relay } from "@/lib/api" import menuDotsIcon from "@/assets/menu-dots-2.svg" import { shortenPubkey } from "@/lib/pubkey" import { RELAY_DOMAIN } from "@/lib/subdomain" const STATUS_STYLES: Record = { active: "bg-green-50 text-green-700 border-green-200", inactive: "bg-gray-100 text-gray-500 border-gray-200", } export function StatusBadge(props: { status: string }) { const styles = () => STATUS_STYLES[props.status] ?? "bg-gray-100 text-gray-500 border-gray-200" const label = () => props.status.replace(/_/g, " ") return ( {label()} ) } // Presentational header for RelayDetailCard: icon/title/status, the WSS link, the // optional tenant profile link, the sync_error banner, and the actions dropdown. // The dropdown owns its own open/close UI state and document listeners; all relay // mutations are surfaced as callbacks. Props are reactive only when read lazily, // so access props.* (and accessor props like props.relay()) inside JSX, never // destructure at the top. type RelayCardHeaderProps = { relay: () => Relay showTenant?: boolean tenantProfile: () => ProfileContent | undefined editHref?: string deactivating?: boolean reactivating?: boolean onRequestDeactivate?: () => void onRequestReactivate?: () => void } export default function RelayCardHeader(props: RelayCardHeaderProps) { const r = () => props.relay() const metadata = () => props.tenantProfile() const [menuOpen, setMenuOpen] = createSignal(false) let menuContainerRef: HTMLDivElement | undefined createEffect(() => { if (!menuOpen()) return const handleClickOutside = (event: MouseEvent) => { const target = event.target as Node | null if (target && !menuContainerRef?.contains(target)) { setMenuOpen(false) } } const handleEscape = (event: KeyboardEvent) => { if (event.key === "Escape") { setMenuOpen(false) } } document.addEventListener("mousedown", handleClickOutside) document.addEventListener("keydown", handleEscape) onCleanup(() => { document.removeEventListener("mousedown", handleClickOutside) document.removeEventListener("keydown", handleEscape) }) }) return ( <> {/* Header */}
setMenuOpen(false)} > Edit Details

Provisioning error

{r().sync_error}

) }