import { BookUser, ChevronDown, CheckSquare, Square, Settings, User, Loader2, } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Popover, PopoverButton, PopoverPanel, Transition, } from '@headlessui/react'; import { Fragment, useEffect, useState } from 'react'; interface SystemPrompt { id: string; name: string; type: 'system' | 'persona'; } interface SystemPromptSelectorProps { selectedPromptIds: string[]; onSelectedPromptIdsChange: (ids: string[]) => void; } const SystemPromptSelector = ({ selectedPromptIds, onSelectedPromptIdsChange, }: SystemPromptSelectorProps) => { const [availablePrompts, setAvailablePrompts] = useState([]); const [isOpen, setIsOpen] = useState(false); const [isLoading, setIsLoading] = useState(true); useEffect(() => { if (!isOpen) return; // Only fetch when popover is open or about to open const fetchPrompts = async () => { try { setIsLoading(true); const response = await fetch('/api/system-prompts'); if (response.ok) { const prompts = await response.json(); setAvailablePrompts(prompts); // Check if any currently selected prompt IDs are not in the API response const availablePromptIds = prompts.map( (prompt: SystemPrompt) => prompt.id, ); const validSelectedIds = selectedPromptIds.filter((id) => availablePromptIds.includes(id), ); // If some selected IDs are no longer available, update the selection if (validSelectedIds.length !== selectedPromptIds.length) { onSelectedPromptIdsChange(validSelectedIds); } } else { console.error('Failed to load system prompts.'); } } catch (error) { console.error('Error loading system prompts.'); console.error(error); } finally { setIsLoading(false); } }; fetchPrompts(); }, [isOpen, selectedPromptIds, onSelectedPromptIdsChange]); const handleTogglePrompt = (promptId: string) => { const newSelectedIds = selectedPromptIds.includes(promptId) ? selectedPromptIds.filter((id) => id !== promptId) : [...selectedPromptIds, promptId]; onSelectedPromptIdsChange(newSelectedIds); }; const selectedCount = selectedPromptIds.length; return ( {({ open }) => { if (open && !isOpen) setIsOpen(true); if (!open && isOpen) setIsOpen(false); return ( <> 0 ? 'text-[#24A0ED] hover:text-blue-200' : 'text-black/60 hover:text-black/30 dark:text-white/60 dark:hover:*:text-white/30', )} title="Select Prompts" > {selectedCount > 0 ? {selectedCount} : null}

Select Prompts

Choose instructions to guide the AI.

{isLoading ? (
) : (
{availablePrompts.length === 0 && (

No prompts configured.
Go to{' '} settings {' '} to add some.

)} {availablePrompts.filter((p) => p.type === 'system') .length > 0 && (
System Prompts
{availablePrompts .filter((p) => p.type === 'system') .map((prompt) => (
handleTogglePrompt(prompt.id)} className="flex items-center gap-2.5 p-2.5 rounded-md hover:bg-light-100 dark:hover:bg-dark-100 cursor-pointer" > {selectedPromptIds.includes(prompt.id) ? ( ) : ( )} {prompt.name}
))}
)} {availablePrompts.filter((p) => p.type === 'persona') .length > 0 && (
Persona Prompts
{availablePrompts .filter((p) => p.type === 'persona') .map((prompt) => (
handleTogglePrompt(prompt.id)} className="flex items-center gap-2.5 p-2.5 rounded-md hover:bg-light-100 dark:hover:bg-dark-100 cursor-pointer" > {selectedPromptIds.includes(prompt.id) ? ( ) : ( )} {prompt.name}
))}
)}
)}
); }}
); }; export default SystemPromptSelector;