import React, { useCallback, useState } from "react"; import { Keyboard, KeyboardAvoidingView, Platform, Pressable, ScrollView, Text, TextInput, TouchableWithoutFeedback, View, } from "react-native"; import { SafeAreaView } from "react-native-safe-area-context"; import { router } from "expo-router"; import { useConnection } from "../contexts/ConnectionContext"; import { StatusDot } from "../components/ui/StatusDot"; import { ServerConfig } from "../types"; export default function SettingsScreen() { const { serverConfig, status, connect, disconnect, saveServerConfig } = useConnection(); const [host, setHost] = useState(serverConfig?.host ?? ""); const [port, setPort] = useState( serverConfig?.port ? String(serverConfig.port) : "" ); const [saved, setSaved] = useState(false); const handleSave = useCallback(async () => { const trimmedHost = host.trim(); const portNum = parseInt(port.trim(), 10); if (!trimmedHost || isNaN(portNum) || portNum < 1 || portNum > 65535) { return; } const config: ServerConfig = { host: trimmedHost, port: portNum }; await saveServerConfig(config); setSaved(true); setTimeout(() => setSaved(false), 2000); }, [host, port, saveServerConfig]); const handleConnect = useCallback(() => { if (status === "connected" || status === "connecting") { disconnect(); } else { connect(); } }, [status, connect, disconnect]); const isFormValid = host.trim().length > 0 && parseInt(port, 10) > 0; return ( {/* Header */} router.back()} className="w-9 h-9 items-center justify-center rounded-full bg-pai-bg-tertiary mr-3" > Settings {/* Connection status card */} Connection Status {status === "connected" ? "Connected" : status === "connecting" ? "Connecting..." : "Disconnected"} {serverConfig && ( ws://{serverConfig.host}:{serverConfig.port} )} {/* Server config */} Server Configuration {/* Host */} Host / IP Address {/* Port */} Port {/* Save button */} {saved ? "Saved!" : "Save Configuration"} {/* Connect/Disconnect button */} {status === "connected" ? "Disconnect" : status === "connecting" ? "Connecting..." : "Connect"} ); }