import { useState } from 'react'; import { Plus, Trash2, Loader2, Key, Eye, EyeOff } from 'lucide-react'; import { usePluginContext } from './client'; import type { S3Credential } from './types'; const API_BASE = '/api/v1/plugin/data_analytics'; interface Props { credentials: S3Credential[]; loading: boolean; onChanged: () => void; } export function CredentialPanel({ credentials, loading, onChanged }: Props) { const { client } = usePluginContext(); const [showForm, setShowForm] = useState(false); const [showSecret, setShowSecret] = useState(false); const [busy, setBusy] = useState(false); const [error, setError] = useState(''); const [form, setForm] = useState({ display_name: '', endpoint_url: '', region: 'us-east-1', access_key: '', secret_key: '', }); const reset = () => { setForm({ display_name: '', endpoint_url: '', region: 'us-east-1', access_key: '', secret_key: '' }); setError(''); setShowSecret(false); }; const submit = async () => { if (!form.display_name.trim() || !form.access_key.trim() || !form.secret_key.trim()) { setError('显示名 / Access Key / Secret Key 必填'); return; } setBusy(true); setError(''); try { await client.post(`${API_BASE}/credentials`, { display_name: form.display_name.trim(), endpoint_url: form.endpoint_url.trim() || null, region: form.region.trim() || 'us-east-1', access_key: form.access_key, secret_key: form.secret_key, }); reset(); setShowForm(false); onChanged(); } catch (e: unknown) { const msg = (e as { response?: { data?: { detail?: string } } }).response?.data?.detail; setError(msg || '保存失败'); } finally { setBusy(false); } }; const remove = async (cred_id: string) => { if (!confirm('确定删除该凭证?删除后该凭证下的任务将无法继续运行。')) return; try { await client.delete(`${API_BASE}/credentials/${cred_id}`); onChanged(); } catch (e) { console.error(e); } }; return (

S3 凭证

访问密钥加密存储于本地 SQLite。

{showForm && (
setForm({ ...form, display_name: e.target.value })} /> setForm({ ...form, endpoint_url: e.target.value })} /> setForm({ ...form, region: e.target.value })} /> setForm({ ...form, access_key: e.target.value })} />
setForm({ ...form, secret_key: e.target.value })} />
{error &&
{error}
}
)} {loading ? (
) : credentials.length === 0 ? (
还没有凭证,点右上角「新增」开始。
) : (
{credentials.map((c) => (
{c.display_name}
{c.endpoint_url || 'aws-s3'} · {c.region} · {c.access_key}
))}
)}
); }