import { Autocomplete, Button, TextField } from "@mui/material"; import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { ChangeEvent, useState } from "react"; import { cancelConnectPortalAtom, connectPortalAtom, } from "../../atoms/connectPortal"; import { switchGatewayAtom } from "../../atoms/gateway"; import { allPortalsAtom, portalAddressAtom } from "../../atoms/portal"; import { backgroundServiceStartedAtom, isProcessingAtom, statusAtom, } from "../../atoms/status"; import { disconnectVpnAtom } from "../../atoms/vpn"; function normalizePortalAddress(input: string) { const address = input.trim(); if (/^https?:\/\//.test(address)) { try { return new URL(address).hostname; } catch (e) {} } return address; } export default function PortalForm() { const backgroundServiceStarted = useAtomValue(backgroundServiceStartedAtom); const allPortals = useAtomValue(allPortalsAtom); const [portalAddress, setPortalAddress] = useAtom(portalAddressAtom); // Use useAtom instead of useSetAtom, otherwise the onMount of the atom is not triggered const [, connectPortal] = useAtom(connectPortalAtom); const cancelConnectPortal = useSetAtom(cancelConnectPortalAtom); const isProcessing = useAtomValue(isProcessingAtom); const status = useAtomValue(statusAtom); const disconnectVpn = useSetAtom(disconnectVpnAtom); const switchingGateway = useAtomValue(switchGatewayAtom); const readOnly = status !== "disconnected" || switchingGateway; function handlePortalAddressChange(e: unknown, value: string) { setPortalAddress(normalizePortalAddress(value)); } function handleSubmit(e: ChangeEvent) { e.preventDefault(); connectPortal(); } return (
( )} /> {status === "disconnected" && !switchingGateway && ( )} {isProcessing && ( )} {status === "connected" && ( )} ); }