import { useState, useRef, useMemo } from 'react'; import { MenuIcon, EarthIcon } from 'lucide-react'; import { useNavigate, useParams } from 'react-router-dom'; import { SystemRoles, type TPromptGroup } from 'librechat-data-provider'; import { useDeletePromptGroup, useUpdatePromptGroup } from '~/data-provider'; import { Input, Label, Button, OGDialog, DropdownMenu, OGDialogTrigger, DropdownMenuGroup, DropdownMenuContent, DropdownMenuTrigger, DropdownMenuItem, } from '~/components/ui'; import CategoryIcon from '~/components/Prompts/Groups/CategoryIcon'; import OGDialogTemplate from '~/components/ui/OGDialogTemplate'; import { useLocalize, useAuthContext } from '~/hooks'; import { TrashIcon } from '~/components/svg'; import { cn } from '~/utils/'; export default function DashGroupItem({ group, instanceProjectId, }: { group: TPromptGroup; instanceProjectId?: string; }) { const params = useParams(); const navigate = useNavigate(); const localize = useLocalize(); const { user } = useAuthContext(); const blurTimeoutRef = useRef(); const [nameEditFlag, setNameEditFlag] = useState(false); const [nameInputField, setNameInputField] = useState(group.name); const isOwner = useMemo(() => user?.id === group.author, [user, group]); const groupIsGlobal = useMemo( () => instanceProjectId != null && group.projectIds?.includes(instanceProjectId), [group, instanceProjectId], ); const updateGroup = useUpdatePromptGroup({ onMutate: () => { clearTimeout(blurTimeoutRef.current); setNameEditFlag(false); }, }); const deletePromptGroupMutation = useDeletePromptGroup({ onSuccess: (response, variables) => { if (variables.id === group._id) { navigate('/d/prompts'); } }, }); const cancelRename = () => { setNameEditFlag(false); }; const saveRename = () => { updateGroup.mutate({ payload: { name: nameInputField }, id: group._id ?? '' }); }; const handleBlur = () => { blurTimeoutRef.current = setTimeout(() => { cancelRename(); }, 100); }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault(); navigate(`/d/prompts/${group._id}`, { replace: true }); } }; const handleRename = (e: Event) => { e.stopPropagation(); setNameEditFlag(true); }; const handleDelete = () => { deletePromptGroupMutation.mutate({ id: group._id ?? '' }); }; return (
{ if (!nameEditFlag) { navigate(`/d/prompts/${group._id}`, { replace: true }); } }} onKeyDown={handleKeyDown} role="button" tabIndex={0} aria-label={`${group.name} prompt group`} >
{nameEditFlag ? ( <>
e.stopPropagation()} onChange={(e) => setNameInputField(e.target.value)} onKeyDown={(e) => { if (e.key === 'Escape') { cancelRename(); } else if (e.key === 'Enter') { saveRename(); } }} onBlur={handleBlur} aria-label={localize('com_ui_rename_group')} />
{localize('com_ui_renaming_var', group.name)}
) : ( <>
{groupIsGlobal === true && ( )} {(isOwner || user?.role === SystemRoles.ADMIN) && ( <> {localize('com_ui_rename')}
} selection={{ selectHandler: handleDelete, selectClasses: 'bg-red-600 dark:bg-red-600 hover:bg-red-700 dark:hover:bg-red-800 text-white', selectText: localize('com_ui_delete'), }} />
)}
{group.oneliner ?? '' ? group.oneliner : group.productionPrompt?.prompt ?? ''}
)}
); }