import { useState, useEffect } from 'react'; import { getPrompt, getPrompts, PromptContentResponse, Template, resetPrompt, savePrompt, } from '../../api'; import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; import { Button } from '../ui/button'; import { AlertTriangle, RotateCcw, ArrowLeft } from 'lucide-react'; import { toast } from 'react-toastify'; export default function PromptsSettingsSection() { const [prompts, setPrompts] = useState([]); const [selectedPrompt, setSelectedPrompt] = useState(null); const [promptData, setPromptData] = useState(null); const [content, setContent] = useState(''); const [hasChanges, setHasChanges] = useState(false); const fetchPrompts = async () => { try { const response = await getPrompts(); if (response.data) { setPrompts(response.data.prompts); } } catch (error) { console.error('Failed to fetch prompts:', error); toast.error('Failed to load prompts'); } }; useEffect(() => { fetchPrompts(); }, []); useEffect(() => { if (selectedPrompt) { const fetchPrompt = async () => { try { const response = await getPrompt({ path: { name: selectedPrompt } }); if (response.data) { setPromptData(response.data); setContent(response.data.content); } } catch (error) { console.error('Failed to fetch prompt:', error); toast.error('Failed to load prompt'); } }; fetchPrompt(); } }, [selectedPrompt]); useEffect(() => { if (promptData) { setHasChanges(content !== promptData.content); } }, [content, promptData]); const handleResetAll = async () => { if ( !window.confirm( 'Are you sure you want to reset all prompts to their defaults? This cannot be undone.' ) ) { return; } try { const customizedPrompts = prompts.filter((p) => p.is_customized); for (const prompt of customizedPrompts) { await resetPrompt({ path: { name: prompt.name } }); } toast.success('All prompts reset to defaults'); fetchPrompts(); } catch (error) { console.error('Failed to reset all prompts:', error); toast.error('Failed to reset prompts'); } }; const handleSave = async () => { if (!selectedPrompt) return; try { await savePrompt({ path: { name: selectedPrompt }, body: { content }, }); toast.success('Prompt saved'); setPromptData((prev) => (prev ? { ...prev, content, is_customized: true } : null)); fetchPrompts(); } catch (error) { console.error('Failed to save prompt:', error); toast.error('Failed to save prompt'); } }; const handleReset = async () => { if (!selectedPrompt) return; if ( !window.confirm( 'Are you sure you want to reset this prompt to its default? This cannot be undone.' ) ) { return; } try { await resetPrompt({ path: { name: selectedPrompt } }); if (promptData) { setContent(promptData.default_content); setPromptData({ ...promptData, content: promptData.default_content, is_customized: false }); } fetchPrompts(); toast.success('Prompt reset to default'); } catch (error) { console.error('Failed to reset prompt:', error); toast.error('Failed to reset prompt'); } }; const handleRestoreDefault = () => { if (promptData) { if (hasChanges) { if (!window.confirm('Replace current content with default? Your changes will be lost.')) { return; } } setContent(promptData.default_content); } }; const handleBack = () => { if (hasChanges) { if (!window.confirm('You have unsaved changes. Are you sure you want to go back?')) { return; } } setSelectedPrompt(null); setPromptData(null); setContent(''); }; const hasCustomizedPrompts = prompts.some((p) => p.is_customized); if (selectedPrompt) { return (
{promptData?.is_customized && ( )}
Edit: {selectedPrompt} {promptData?.is_customized && ( Customized )}

Tip: Template variables like{' '} {'{{ extensions }}'} or{' '} {'{% for item in list %}'} {' '} are replaced with actual values at runtime. Be careful not to remove required variables.

{promptData?.is_customized && content !== promptData.default_content && ( )}