import React, { useState, useEffect } from "react"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Input, Button, } from "../.."; import { SecretTypeData } from "@flyde/core"; // Define a minimal EditorPorts interface with just what we need interface EditorPorts { getAvailableSecrets: () => Promise; addNewSecret: (dto: { key: string; value: string }) => Promise; } export function SecretSelector({ value, onChange, ports, typeEditorData, }: { value: string; onChange: (value: string) => void; ports: EditorPorts; typeEditorData?: SecretTypeData; }) { const [secrets, setSecrets] = useState([]); const [isAddingSecret, setIsAddingSecret] = useState(false); const [newSecretKey, setNewSecretKey] = useState(""); const [newSecretValue, setNewSecretValue] = useState(""); const [isLoading, setIsLoading] = useState(true); useEffect(() => { const fetchSecrets = async () => { setIsLoading(true); try { const availableSecrets = await ports.getAvailableSecrets(); setSecrets(availableSecrets); } catch (error) { console.error("Failed to fetch secrets:", error); } finally { setIsLoading(false); } }; fetchSecrets(); }, [ports]); const handleAddSecret = async () => { if (!newSecretKey || !newSecretValue) { return; } try { const updatedSecrets = await ports.addNewSecret({ key: newSecretKey, value: newSecretValue, }); setSecrets(updatedSecrets); onChange(newSecretKey); setIsAddingSecret(false); setNewSecretKey(""); setNewSecretValue(""); } catch (error) { console.error("Failed to add secret:", error); } }; const startAddingSecret = () => { setIsAddingSecret(true); if (typeEditorData?.defaultName) { setNewSecretKey(typeEditorData.defaultName); } }; const handleValueChange = (newValue: string) => { if (newValue === "__add_new_secret") { startAddingSecret(); } else { onChange(newValue); } }; if (isAddingSecret) { return (
setNewSecretKey(e.target.value)} /> setNewSecretValue(e.target.value)} />
); } if (!isLoading && secrets.length === 0) { return (

No secrets available.

); } return ( ); }