"use client"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; import { Check, InfoIcon, Pencil, ShieldCheck, ShieldOff, X } from "lucide-react"; import { useResourceContext } from "@app/hooks/useResourceContext"; import CopyToClipboard from "@app/components/CopyToClipboard"; import { InfoSection, InfoSectionContent, InfoSections, InfoSectionTitle } from "@app/components/InfoSection"; import { useTranslations } from "next-intl"; import CertificateStatus from "@app/components/private/CertificateStatus"; import { toUnicode } from "punycode"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { Button } from "./ui/button"; import { Input } from "./ui/input"; import { createApiClient, formatAxiosError } from "@app/lib/api"; import { useState } from "react"; import { useToast } from "@app/hooks/useToast"; import { UpdateResourceResponse } from "@server/routers/resource"; import { AxiosResponse } from "axios"; type ResourceInfoBoxType = {}; export default function ResourceInfoBox({ }: ResourceInfoBoxType) { const { resource, authInfo, updateResource } = useResourceContext(); const { env } = useEnvContext(); const api = createApiClient(useEnvContext()); const [isEditing, setIsEditing] = useState(false); const [niceId, setNiceId] = useState(resource.niceId); const [tempNiceId, setTempNiceId] = useState(resource.niceId); const [isLoading, setIsLoading] = useState(false); const { toast } = useToast(); const t = useTranslations(); const fullUrl = `${resource.ssl ? "https" : "http"}://${toUnicode(resource.fullDomain || "")}`; const handleEdit = () => { setTempNiceId(niceId); setIsEditing(true); }; const handleCancel = () => { setTempNiceId(niceId); setIsEditing(false); }; const handleSave = async () => { if (tempNiceId.trim() === "") { toast({ variant: "destructive", title: t("error"), description: t("niceIdCannotBeEmpty") }); return; } if (tempNiceId === niceId) { setIsEditing(false); return; } setIsLoading(true); try { const res = await api .post>( `resource/${resource?.resourceId}`, { niceId: tempNiceId.trim() } ) setNiceId(tempNiceId.trim()); setIsEditing(false); updateResource({ niceId: tempNiceId.trim() }); toast({ title: t("niceIdUpdated"), description: t("niceIdUpdatedSuccessfully") }); } catch (e: any) { toast({ variant: "destructive", title: t("niceIdUpdateError"), description: formatAxiosError( e, t("niceIdUpdateErrorDescription") ) }); } finally { setIsLoading(false); } }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { handleSave(); } else if (e.key === "Escape") { handleCancel(); } }; return ( {/* 4 cols because of the certs */} {t("niceId")}
{isEditing ? ( <> setTempNiceId(e.target.value)} onKeyDown={handleKeyDown} disabled={isLoading} className="flex-1" autoFocus /> ) : ( <> {niceId} )}
{resource.http ? ( <> {t("authentication")} {authInfo.password || authInfo.pincode || authInfo.sso || authInfo.whitelist || authInfo.headerAuth ? (
{t("protected")}
) : (
{t("notProtected")}
)}
URL {/* {isEnabled && ( Socket {isAvailable ? (
Online
) : (
Offline
)}
)} */} ) : ( <> {t("protocol")} {resource.protocol.toUpperCase()} {t("port")} {/* {build == "oss" && ( {t("externalProxyEnabled")} {resource.enableProxy ? t("enabled") : t("disabled")} )} */} )} {/* */} {/* {t('visibility')} */} {/* */} {/* */} {/* {resource.enabled ? t('enabled') : t('disabled')} */} {/* */} {/* */} {/* */} {/* Certificate Status Column */} {resource.http && resource.domainId && resource.fullDomain && env.flags.usePangolinDns && ( {t("certificateStatus", { defaultValue: "Certificate" })} )} {t("visibility")} {resource.enabled ? t("enabled") : t("disabled")}
); }