import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Separator } from "@/components/ui/separator"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet"; import { Key, User, Calendar, Hash, Folder, Edit3, Copy, Shield, Clock, Server, Eye, EyeOff, AlertTriangle, CheckCircle, FileText, } from "lucide-react"; import { getCredentialDetails, getCredentialHosts } from "@/ui/main-axios"; import { toast } from "sonner"; import { useTranslation } from "react-i18next"; import type { Credential, HostInfo, CredentialViewerProps, } from "../../../types/index.js"; const CredentialViewer: React.FC = ({ credential, onClose, onEdit, }) => { const { t } = useTranslation(); const [credentialDetails, setCredentialDetails] = useState( null, ); const [hostsUsing, setHostsUsing] = useState([]); const [loading, setLoading] = useState(true); const [showSensitive, setShowSensitive] = useState>( {}, ); const [activeTab, setActiveTab] = useState<"overview" | "security" | "usage">( "overview", ); useEffect(() => { fetchCredentialDetails(); fetchHostsUsing(); }, [credential.id]); const fetchCredentialDetails = async () => { try { const response = await getCredentialDetails(credential.id); setCredentialDetails(response); } catch { toast.error(t("credentials.failedToFetchCredentialDetails")); } }; const fetchHostsUsing = async () => { try { const response = await getCredentialHosts(credential.id); setHostsUsing(response); } catch { toast.error(t("credentials.failedToFetchHostsUsing")); } finally { setLoading(false); } }; const toggleSensitiveVisibility = (field: string) => { setShowSensitive((prev) => ({ ...prev, [field]: !prev[field], })); }; const copyToClipboard = async (text: string, fieldName: string) => { try { await navigator.clipboard.writeText(text); toast.success(t("copiedToClipboard", { field: fieldName })); } catch { toast.error(t("credentials.failedToCopy")); } }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleString(); }; const getAuthIcon = (authType: string) => { return authType === "password" ? ( ) : ( ); }; const renderSensitiveField = ( value: string | undefined, fieldName: string, label: string, isMultiline = false, ) => { if (!value) return null; const isVisible = showSensitive[fieldName]; return (
{isVisible ? (
              {value}
            
) : (
{"•".repeat(isMultiline ? 50 : 20)}
)}
); }; if (loading || !credentialDetails) { return (
); } return (
{getAuthIcon(credentialDetails.authType)}
{credentialDetails.name}
{credentialDetails.description}
{credentialDetails.authType} {credentialDetails.keyType && ( {credentialDetails.keyType} )}
{activeTab === "overview" && (
{t("credentials.basicInformation")}
{t("common.username")}
{credentialDetails.username}
{credentialDetails.folder && (
{t("common.folder")}
{credentialDetails.folder}
)} {credentialDetails.tags.length > 0 && (
{t("hosts.tags")}
{credentialDetails.tags.map((tag, index) => ( {tag} ))}
)}
{t("credentials.created")}
{formatDate(credentialDetails.createdAt)}
{t("credentials.lastModified")}
{formatDate(credentialDetails.updatedAt)}
{t("credentials.usageStatistics")}
{credentialDetails.usageCount}
{t("credentials.timesUsed")}
{credentialDetails.lastUsed && (
{t("credentials.lastUsed")}
{formatDate(credentialDetails.lastUsed)}
)}
{t("credentials.connectedHosts")}
{hostsUsing.length}
)} {activeTab === "security" && ( {t("credentials.securityDetails")} {t("credentials.securityDetailsDescription")}
{t("credentials.credentialSecured")}
{t("credentials.credentialSecuredDescription")}
{credentialDetails.authType === "password" && (

{t("credentials.passwordAuthentication")}

{renderSensitiveField( credentialDetails.password, "password", t("common.password"), )}
)} {credentialDetails.authType === "key" && (

{t("credentials.keyAuthentication")}

{t("credentials.keyType")}
{credentialDetails.keyType?.toUpperCase() || t("unknown").toUpperCase()}
{renderSensitiveField( credentialDetails.key, "key", t("credentials.privateKey"), true, )} {credentialDetails.keyPassword && renderSensitiveField( credentialDetails.keyPassword, "keyPassword", t("credentials.keyPassphrase"), )}
)}
{t("credentials.securityReminder")}
{t("credentials.securityReminderText")}
)} {activeTab === "usage" && ( {t("credentials.hostsUsingCredential")} {hostsUsing.length} {hostsUsing.length === 0 ? (

{t("credentials.noHostsUsingCredential")}

) : (
{hostsUsing.map((host) => (
{host.name || `${host.ip}:${host.port}`}
{host.ip}:{host.port}
{formatDate(host.createdAt)}
))}
)}
)}
); }; export default CredentialViewer;