import { useState, useMemo, memo, useRef } from 'react'; import { Link } from 'react-router-dom'; import { PermissionBits, ResourceType } from 'librechat-data-provider'; import { Menu as MenuIcon, Edit as EditIcon, EarthIcon, TextSearch } from 'lucide-react'; import { DropdownMenu, DropdownMenuItem, DropdownMenuGroup, DropdownMenuContent, DropdownMenuTrigger, } from '@librechat/client'; import type { TPromptGroup } from 'librechat-data-provider'; import { useLocalize, useSubmitMessage, useResourcePermissions } from '~/hooks'; import VariableDialog from '~/components/Prompts/Groups/VariableDialog'; import PreviewPrompt from '~/components/Prompts/PreviewPrompt'; import ListCard from '~/components/Prompts/Groups/ListCard'; import { detectVariables } from '~/utils'; function ChatGroupItem({ group, instanceProjectId, }: { group: TPromptGroup; instanceProjectId?: string; }) { const localize = useLocalize(); const { submitPrompt } = useSubmitMessage(); const [isPreviewDialogOpen, setPreviewDialogOpen] = useState(false); const [isVariableDialogOpen, setVariableDialogOpen] = useState(false); const groupIsGlobal = useMemo( () => instanceProjectId != null && group.projectIds?.includes(instanceProjectId), [group, instanceProjectId], ); // Check permissions for the promptGroup const { hasPermission } = useResourcePermissions(ResourceType.PROMPTGROUP, group._id || ''); const canEdit = hasPermission(PermissionBits.EDIT); const triggerButtonRef = useRef(null); const onCardClick: React.MouseEventHandler = () => { const text = group.productionPrompt?.prompt; if (!text?.trim()) { return; } if (detectVariables(text)) { setVariableDialogOpen(true); return; } submitPrompt(text); }; return ( <>
0 ? group.oneliner : (group.productionPrompt?.prompt ?? '') } > {groupIsGlobal === true && (
)}
{ e.stopPropagation(); setPreviewDialogOpen(true); }} onKeyDown={(e) => { e.stopPropagation(); }} className="w-full cursor-pointer rounded-lg text-text-primary hover:bg-surface-hover focus:bg-surface-hover disabled:cursor-not-allowed" > {canEdit && ( )}
{ requestAnimationFrame(() => { triggerButtonRef.current?.focus({ preventScroll: true }); }); }} /> setVariableDialogOpen(false)} group={group} /> ); } export default memo(ChatGroupItem);