"use client"; import { useState, useEffect } from "react"; import { Button } from "./ui/button"; import { Lock, CheckCircle, AlertCircle } from "lucide-react"; import { useRegisterModal } from "./modal/ModalStackProvider"; import { api } from "~/trpc/react"; import type { Storage } from "~/server/services/storageService"; interface PBSCredentialsModalProps { isOpen: boolean; onClose: () => void; serverId: number; serverName: string; storage: Storage; } export function PBSCredentialsModal({ isOpen, onClose, serverId, serverName: _serverName, storage, }: PBSCredentialsModalProps) { const [pbsIp, setPbsIp] = useState(""); const [pbsDatastore, setPbsDatastore] = useState(""); const [pbsPassword, setPbsPassword] = useState(""); const [pbsFingerprint, setPbsFingerprint] = useState(""); const [isLoading, setIsLoading] = useState(false); // Extract PBS info from storage object const pbsIpFromStorage = (storage as { server?: string }).server ?? null; const pbsDatastoreFromStorage = (storage as { datastore?: string }).datastore ?? null; // Fetch existing credentials const { data: credentialData, refetch } = api.pbsCredentials.getCredentialsForStorage.useQuery( { serverId, storageName: storage.name }, { enabled: isOpen }, ); // Initialize form with storage config values or existing credentials useEffect(() => { if (isOpen) { if (credentialData?.success && credentialData.credential) { // Load existing credentials setPbsIp(String(credentialData.credential.pbs_ip)); setPbsDatastore(String(credentialData.credential.pbs_datastore)); setPbsPassword(""); // Don't show password setPbsFingerprint( String(credentialData.credential.pbs_fingerprint ?? ""), ); } else { // Initialize with storage config values setPbsIp(pbsIpFromStorage ?? ""); setPbsDatastore(pbsDatastoreFromStorage ?? ""); setPbsPassword(""); setPbsFingerprint(""); } } }, [isOpen, credentialData, pbsIpFromStorage, pbsDatastoreFromStorage]); const saveCredentials = api.pbsCredentials.saveCredentials.useMutation({ onSuccess: () => { void refetch(); onClose(); }, onError: (error) => { console.error("Failed to save PBS credentials:", error); alert(`Failed to save credentials: ${error.message}`); }, }); const deleteCredentials = api.pbsCredentials.deleteCredentials.useMutation({ onSuccess: () => { void refetch(); onClose(); }, onError: (error) => { console.error("Failed to delete PBS credentials:", error); alert(`Failed to delete credentials: ${error.message}`); }, }); useRegisterModal(isOpen, { id: "pbs-credentials-modal", allowEscape: true, onClose, }); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!pbsIp || !pbsDatastore || !pbsFingerprint) { alert("Please fill in all required fields (IP, Datastore, Fingerprint)"); return; } // Password is optional when updating existing credentials setIsLoading(true); try { await saveCredentials.mutateAsync({ serverId, storageName: storage.name, pbs_ip: pbsIp, pbs_datastore: pbsDatastore, pbs_password: pbsPassword || undefined, // Undefined means keep existing password pbs_fingerprint: pbsFingerprint, }); } finally { setIsLoading(false); } }; const handleDelete = async () => { if ( !confirm( "Are you sure you want to delete the PBS credentials for this storage?", ) ) { return; } setIsLoading(true); try { await deleteCredentials.mutateAsync({ serverId, storageName: storage.name, }); } finally { setIsLoading(false); } }; if (!isOpen) return null; const hasCredentials = credentialData?.success && credentialData.credential; return (