diff --git a/src/app/settings/components/PanelAccessSettingsPanel.tsx b/src/app/settings/components/PanelAccessSettingsPanel.tsx index 04b60f5..ddac263 100644 --- a/src/app/settings/components/PanelAccessSettingsPanel.tsx +++ b/src/app/settings/components/PanelAccessSettingsPanel.tsx @@ -6,6 +6,7 @@ import { ChevronDown, Globe2, Loader2, + RotateCcw, ShieldCheck, } from "lucide-react"; import { @@ -60,7 +61,7 @@ export default function PanelAccessSettingsPanel({ const [panelDomain, setPanelDomain] = useState(initialDomain); const [panelProxy, setPanelProxy] = useState("NGINX"); const [panelAutoSsl, setPanelAutoSsl] = useState( - settings.general.panelUrl.startsWith("https://") || !initialDomain, + Boolean(initialDomain) && settings.general.panelUrl.startsWith("https://"), ); const [capabilities, setCapabilities] = useState(null); @@ -72,6 +73,13 @@ export default function PanelAccessSettingsPanel({ const selectedCapability = capabilities?.proxies.find( (proxy) => proxy.type === panelProxy, ); + const hasProvisionableProxy = Boolean( + capabilities?.proxies.some( + (proxy) => proxy.available && proxy.supportsProvisioning, + ), + ); + const sslDisabled = !panelDomain.trim() || !hasProvisionableProxy; + const hasCustomDomain = Boolean(initialDomain); const canProvision = Boolean( panelDomain.trim() && selectedCapability?.available && @@ -121,7 +129,7 @@ export default function PanelAccessSettingsPanel({ const response = await settingsApi.provisionPanelDomain({ domain: panelDomain.trim(), proxy: panelProxy, - autoSsl: panelAutoSsl, + autoSsl: panelAutoSsl && !sslDisabled, }); setMessage(response.message || response.data.provision.message); onProvisioned?.(response.data.settings, response.message); @@ -134,6 +142,34 @@ export default function PanelAccessSettingsPanel({ } }; + const resetPanelDomain = async () => { + if ( + !window.confirm( + "Reset the custom panel domain? This only removes it from Doktainer settings; reverse-proxy and SSL configuration on the server will remain unchanged.", + ) + ) { + return; + } + + setProvisioning(true); + setError(null); + setMessage(null); + + try { + const response = await settingsApi.resetPanelDomain(); + setPanelDomain(""); + setPanelAutoSsl(false); + setMessage(response.message || "Custom panel domain reset"); + onProvisioned?.(response.data, response.message); + } catch (err) { + setError( + err instanceof Error ? err.message : "Failed to reset panel domain", + ); + } finally { + setProvisioning(false); + } + }; + return (
setPanelAutoSsl((current) => !current)} + disabled={sslDisabled} /> + {sslDisabled ? ( +
+ {!panelDomain.trim() + ? "Enter a domain to enable HTTPS / SSL." + : "HTTPS / SSL is unavailable because no reverse proxy can be provisioned."} +
+ ) : null} {capabilities?.autoSsl.reason ? (
+