Files
prompt-gen/frontend/src/components/Settings.jsx
T
Space-Banane 20f06d0a57 Initial commit: prompt template manager
React + Tailwind frontend, FastAPI backend, settings.json storage.
Supports preset CRUD, live variable filling, and AI rewrite via OpenAI.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 15:38:17 +02:00

73 lines
2.7 KiB
React
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React, { useState } from 'react'
export default function Settings({ apiKeySet, onSaved, onClose }) {
const [key, setKey] = useState('')
const [saving, setSaving] = useState(false)
const [error, setError] = useState('')
const [saved, setSaved] = useState(false)
async function handleSave() {
if (!key.trim()) { setError('Enter an API key'); return }
setSaving(true)
setError('')
try {
const res = await fetch('/api/settings', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ openai_api_key: key.trim() }),
})
if (!res.ok) { const d = await res.json(); throw new Error(d.detail) }
setSaved(true)
onSaved()
setTimeout(() => setSaved(false), 2000)
} catch (e) {
setError(e.message)
} finally {
setSaving(false)
}
}
return (
<div className="fixed inset-0 bg-black/60 flex items-center justify-center z-50">
<div className="bg-zinc-900 border border-zinc-700 rounded-xl p-6 w-full max-w-md shadow-xl">
<div className="flex items-center justify-between mb-4">
<h2 className="text-white font-semibold text-base">Settings</h2>
<button onClick={onClose} className="text-zinc-500 hover:text-zinc-300 text-xl leading-none">×</button>
</div>
<div className="flex flex-col gap-1 mb-4">
<label className="text-xs font-medium text-zinc-400 uppercase tracking-wide">OpenAI API Key</label>
<p className="text-xs text-zinc-500 mb-1.5">
{apiKeySet ? 'A key is already saved. Enter a new one to replace it.' : 'Required for AI rewrite feature.'}
</p>
<input
type="password"
value={key}
onChange={e => setKey(e.target.value)}
placeholder="sk-..."
className="bg-zinc-800 border border-zinc-700 rounded-md px-3 py-2 text-sm text-white placeholder-zinc-500 focus:outline-none focus:ring-2 focus:ring-indigo-500"
/>
</div>
{error && <p className="text-red-400 text-xs mb-3">{error}</p>}
<div className="flex justify-end gap-2">
<button
onClick={onClose}
className="px-3 py-1.5 text-sm rounded-md bg-zinc-700 hover:bg-zinc-600 text-zinc-200 transition-colors"
>
Cancel
</button>
<button
onClick={handleSave}
disabled={saving}
className="px-3 py-1.5 text-sm rounded-md bg-indigo-600 hover:bg-indigo-500 text-white font-medium transition-colors disabled:opacity-50"
>
{saved ? 'Saved!' : saving ? 'Saving…' : 'Save'}
</button>
</div>
</div>
</div>
)
}