import { memo, useState, useRef, useMemo, useCallback, KeyboardEvent } from 'react'; import { EarthIcon, Pen } from 'lucide-react'; import { useNavigate, useParams } from 'react-router-dom'; import { PERMISSION_BITS, type TPromptGroup } from 'librechat-data-provider'; import { Input, Label, Button, OGDialog, OGDialogTrigger, OGDialogTemplate, TrashIcon, } from '@librechat/client'; import { useDeletePromptGroup, useUpdatePromptGroup } from '~/data-provider'; import CategoryIcon from '~/components/Prompts/Groups/CategoryIcon'; import { useLocalize, useResourcePermissions } from '~/hooks'; import { cn } from '~/utils'; interface DashGroupItemProps { group: TPromptGroup; instanceProjectId?: string; } function DashGroupItemComponent({ group, instanceProjectId }: DashGroupItemProps) { const params = useParams(); const navigate = useNavigate(); const localize = useLocalize(); const blurTimeoutRef = useRef(null); const [nameInputValue, setNameInputValue] = useState(group.name); const { hasPermission } = useResourcePermissions('promptGroup', group._id || ''); const canEdit = hasPermission(PERMISSION_BITS.EDIT); const canDelete = hasPermission(PERMISSION_BITS.DELETE); const isGlobalGroup = useMemo( () => instanceProjectId && group.projectIds?.includes(instanceProjectId), [group.projectIds, instanceProjectId], ); const updateGroup = useUpdatePromptGroup({ onMutate: () => { if (blurTimeoutRef.current) { clearTimeout(blurTimeoutRef.current); } }, }); const deleteGroup = useDeletePromptGroup({ onSuccess: (_response, variables) => { if (variables.id === group._id) { navigate('/d/prompts'); } }, }); const { isLoading } = updateGroup; const handleSaveRename = useCallback(() => { console.log(group._id ?? '', { name: nameInputValue }); updateGroup.mutate({ id: group._id ?? '', payload: { name: nameInputValue } }); }, [group._id, nameInputValue, updateGroup]); const handleKeyDown = useCallback( (e: KeyboardEvent) => { if (e.key === 'Enter') { e.preventDefault(); navigate(`/d/prompts/${group._id}`, { replace: true }); } }, [group._id, navigate], ); const triggerDelete = useCallback(() => { deleteGroup.mutate({ id: group._id ?? '' }); }, [group._id, deleteGroup]); const handleContainerClick = useCallback(() => { navigate(`/d/prompts/${group._id}`, { replace: true }); }, [group._id, navigate]); return (
{isGlobalGroup && ( )} {canEdit && (
setNameInputValue(e.target.value)} className="w-full" aria-label={localize('com_ui_rename_prompt') + ' ' + group.name} />
} selection={{ selectHandler: handleSaveRename, selectClasses: 'bg-surface-submit hover:bg-surface-submit-hover text-white disabled:hover:bg-surface-submit', selectText: localize('com_ui_save'), isLoading, }} /> )} {canDelete && (
} selection={{ selectHandler: triggerDelete, selectClasses: 'bg-red-600 dark:bg-red-600 hover:bg-red-700 dark:hover:bg-red-800 text-white', selectText: localize('com_ui_delete'), }} /> )}
); } export default memo(DashGroupItemComponent);