import { Alert, AlertDescription } from "@/components/ui/alert"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { useFormState } from "react-dom"; import { useEffect } from "react"; import { createProxyHostAction, deleteProxyHostAction, updateProxyHostAction } from "@/app/(dashboard)/proxy-hosts/actions"; import { INITIAL_ACTION_STATE } from "@/lib/actions"; import { AccessList } from "@/lib/models/access-lists"; import { Certificate } from "@/lib/models/certificates"; import { ProxyHost } from "@/lib/models/proxy-hosts"; import { AuthentikSettings } from "@/lib/settings"; import { AppDialog } from "@/components/ui/AppDialog"; import { AuthentikFields } from "./AuthentikFields"; import { DnsResolverFields } from "./DnsResolverFields"; import { LoadBalancerFields } from "./LoadBalancerFields"; import { SettingsToggles } from "./SettingsToggles"; import { UpstreamDnsResolutionFields } from "./UpstreamDnsResolutionFields"; import { UpstreamInput } from "./UpstreamInput"; import { GeoBlockFields } from "./GeoBlockFields"; import { WafFields } from "./WafFields"; import { MtlsFields } from "./MtlsConfig"; import { CpmForwardAuthFields } from "./CpmForwardAuthFields"; import { RedirectsFields } from "./RedirectsFields"; import { LocationRulesFields } from "./LocationRulesFields"; import { RewriteFields } from "./RewriteFields"; import type { CaCertificate } from "@/lib/models/ca-certificates"; import type { MtlsRole } from "@/lib/models/mtls-roles"; import type { IssuedClientCertificate } from "@/lib/models/issued-client-certificates"; type ForwardAuthUser = { id: number; email: string; name: string | null; role: string }; type ForwardAuthGroup = { id: number; name: string; description: string | null; member_count: number }; type ForwardAuthAccessData = { userIds: number[]; groupIds: number[] }; export function CreateHostDialog({ open, onClose, certificates, accessLists, authentikDefaults, initialData, caCertificates = [], mtlsRoles = [], issuedClientCerts = [], forwardAuthUsers = [], forwardAuthGroups = [], }: { open: boolean; onClose: () => void; certificates: Certificate[]; accessLists: AccessList[]; authentikDefaults: AuthentikSettings | null; initialData?: ProxyHost | null; caCertificates?: CaCertificate[]; mtlsRoles?: MtlsRole[]; issuedClientCerts?: IssuedClientCertificate[]; forwardAuthUsers?: ForwardAuthUser[]; forwardAuthGroups?: ForwardAuthGroup[]; }) { const [state, formAction] = useFormState(createProxyHostAction, INITIAL_ACTION_STATE); useEffect(() => { if (state.status === "success") { setTimeout(onClose, 1000); } }, [state.status, onClose]); return ( { (document.getElementById("create-host-form") as HTMLFormElement)?.requestSubmit(); }} > {state.status !== "idle" && state.message && ( {state.message} )} Name Domains One per line or comma-separated. Wildcards like *.example.com are supported. Certificate Managed by Caddy (Auto) {certificates.map((cert) => ( {cert.name} ))} Access List None {accessLists.map((list) => ( {list.name} ))} Custom Pre-Handlers (JSON) Optional JSON array of Caddy handlers Custom Reverse Proxy (JSON) Deep-merge into reverse_proxy handler (only applies in proxy mode) ); } export function EditHostDialog({ open, host, onClose, certificates, accessLists, caCertificates = [], mtlsRoles = [], issuedClientCerts = [], forwardAuthUsers = [], forwardAuthGroups = [], forwardAuthAccess, }: { open: boolean; host: ProxyHost; onClose: () => void; certificates: Certificate[]; accessLists: AccessList[]; caCertificates?: CaCertificate[]; mtlsRoles?: MtlsRole[]; issuedClientCerts?: IssuedClientCertificate[]; forwardAuthUsers?: ForwardAuthUser[]; forwardAuthGroups?: ForwardAuthGroup[]; forwardAuthAccess?: ForwardAuthAccessData | null; }) { const [state, formAction] = useFormState(updateProxyHostAction.bind(null, host.id), INITIAL_ACTION_STATE); useEffect(() => { if (state.status === "success") { setTimeout(onClose, 1000); } }, [state.status, onClose]); return ( { (document.getElementById("edit-host-form") as HTMLFormElement)?.requestSubmit(); }} > {state.status !== "idle" && state.message && ( {state.message} )} Name Domains One per line or comma-separated. Wildcards like *.example.com are supported. Certificate Managed by Caddy (Auto) {certificates.map((cert) => ( {cert.name} ))} Access List None {accessLists.map((list) => ( {list.name} ))} Custom Pre-Handlers (JSON) Optional JSON array of Caddy handlers Custom Reverse Proxy (JSON) Deep-merge into reverse_proxy handler (only applies in proxy mode) ); } export function DeleteHostDialog({ open, host, onClose }: { open: boolean; host: ProxyHost; onClose: () => void; }) { const [state, formAction] = useFormState(deleteProxyHostAction.bind(null, host.id), INITIAL_ACTION_STATE); useEffect(() => { if (state.status === "success") { setTimeout(onClose, 1000); } }, [state.status, onClose]); return ( { (document.getElementById("delete-host-form") as HTMLFormElement)?.requestSubmit(); }} > {state.status !== "idle" && state.message && ( {state.message} )} Are you sure you want to delete the proxy host {host.name}? This will remove the configuration for: • Domains: {host.domains.join(", ")} • Upstreams: {host.upstreams.join(", ")} This action cannot be undone. ); }
One per line or comma-separated. Wildcards like *.example.com are supported.
Optional JSON array of Caddy handlers
Deep-merge into reverse_proxy handler (only applies in proxy mode)
Are you sure you want to delete the proxy host {host.name}?
This will remove the configuration for:
• Domains: {host.domains.join(", ")}
• Upstreams: {host.upstreams.join(", ")}
This action cannot be undone.