diff --git a/src/components/PageComponents/Connect/HTTP.tsx b/src/components/PageComponents/Connect/HTTP.tsx index 092b79bf..b50dbcf5 100644 --- a/src/components/PageComponents/Connect/HTTP.tsx +++ b/src/components/PageComponents/Connect/HTTP.tsx @@ -11,6 +11,7 @@ import { MeshDevice } from "@meshtastic/core"; import { TransportHTTP } from "@meshtastic/transport-http"; import { useState } from "react"; import { useForm, useController } from "react-hook-form"; +import { AlertTriangle } from "lucide-react"; interface FormData { ip: string; @@ -39,23 +40,33 @@ export const HTTP = ({ closeDialog }: TabElementProps) => { } = useController({ name: "tls", control }); const [connectionInProgress, setConnectionInProgress] = useState(false); + const [connectionError, setConnectionError] = useState<{ host: string; secure: boolean } | null>(null); const onSubmit = handleSubmit(async (data) => { setConnectionInProgress(true); - const id = randId(); - const device = addDevice(id); - const transport = await TransportHTTP.create(data.ip, data.tls); - const connection = new MeshDevice(transport, id); - connection.configure(); - setSelectedDevice(id); - device.addConnection(connection); - subscribeAll(device, connection); - closeDialog(); + setConnectionError(null); + + try { + const id = randId(); + const transport = await TransportHTTP.create(data.ip, data.tls); + const device = addDevice(id); + const connection = new MeshDevice(transport, id); + connection.configure(); + setSelectedDevice(id); + device.addConnection(connection); + subscribeAll(device, connection); + closeDialog(); + } catch (error) { + console.error("Connection error:", error); + // Capture all connection errors regardless of type + setConnectionError({ host: data.ip, secure: data.tls }); + setConnectionInProgress(false); + } }); return (
-
+
{ {...register("tls")} /> -
+ + {connectionError && ( +
+
+ +
+

+ Connection Failed +

+

+ Could not connect to the device. If using HTTPS, you may need to accept a self-signed certificate first. Please open{" "} + + {`${connectionError.secure ? "https" : "http"}://${connectionError.host}`} + + {" "}in a new tab, accept any certificate warnings if prompted, then return here to try connecting again. +

+
+
+
+ )}