import {
addHost,
getPaseoClient,
useHosts,
usePaseo,
type PluginSurfaceProps,
type PluginHost,
} from "@getpaseo/plugin/client";
import { useCallback, useMemo, useState } from "react";
import { Pressable, Text, TextInput, View } from "react-native";
export function Hosts({ theme }: PluginSurfaceProps) {
const hosts = useHosts();
const selected = usePaseo();
const [result, setResult] = useState("");
const [connection, setConnection] = useState("");
const add = useCallback(async () => {
try {
const outcome = await addHost({ connection });
if (outcome.status === "saved") setResult(`Added ${outcome.host.label}`);
else if (outcome.status === "cancelled") setResult("Host addition cancelled");
else setResult("Add ?password= and retry");
} catch (error) {
setResult(error instanceof Error ? error.message : String(error));
}
}, [connection]);
const addPressed = useCallback(() => {
void add();
}, [add]);
const list = useCallback(
async (serverId?: string) => {
try {
const client = serverId ? getPaseoClient(serverId) : selected;
const { entries } = await client.agents.list();
setResult(`${serverId ?? "Selected host"}: ${entries.length} agents`);
} catch (error) {
setResult(error instanceof Error ? error.message : String(error));
}
},
[selected],
);
const styles = useMemo(
() => ({
root: { padding: 16, gap: 12, backgroundColor: theme.colors.surface0 },
text: { color: theme.colors.foreground },
}),
[theme],
);
const listSelected = useCallback(() => {
void list();
}, [list]);
return (
Add host
List selected host agents
{hosts.map((host) => (
))}
{result}
);
}
function HostRow({
host,
color,
list,
}: {
host: PluginHost;
color: string;
list: (serverId: string) => Promise;
}) {
const style = useMemo(() => ({ color }), [color]);
const rowStyle = useMemo(() => ({ gap: 4 }), []);
const listAgents = useCallback(() => void list(host.serverId), [host, list]);
const update = useCallback(
() => void host.update({ label: `${host.label} (build)`, appearance: { color: "sky" } }),
[host],
);
const open = useCallback(() => host.openSettings(), [host]);
const remove = useCallback(() => void host.remove(), [host]);
return (
{host.label}: {host.status} ยท{" "}
{host.connections.map((connection) => connection.uri ?? "via another host").join(", ")}
List agents
Rename and color
Host settings
Remove host
);
}