import { memo, useState, useRef, useMemo, useCallback, KeyboardEvent } from 'react'; import { Trans } from 'react-i18next'; import { EarthIcon, Pen } from 'lucide-react'; import { useNavigate, useParams } from 'react-router-dom'; import { PermissionBits, ResourceType, type TPromptGroup } from 'librechat-data-provider'; import { Input, Label, 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 { useLiveAnnouncer } from '~/Providers'; import { cn } from '~/utils'; interface DashGroupItemProps { group: TPromptGroup; } function DashGroupItemComponent({ group }: DashGroupItemProps) { const params = useParams(); const navigate = useNavigate(); const localize = useLocalize(); const { announcePolite } = useLiveAnnouncer(); const blurTimeoutRef = useRef(null); const [nameInputValue, setNameInputValue] = useState(group.name); const { hasPermission } = useResourcePermissions(ResourceType.PROMPTGROUP, group._id || ''); const canEdit = hasPermission(PermissionBits.EDIT); const canDelete = hasPermission(PermissionBits.DELETE); const isPublicGroup = useMemo(() => group.isPublic === true, [group.isPublic]); const updateGroup = useUpdatePromptGroup({ onMutate: () => { if (blurTimeoutRef.current) { clearTimeout(blurTimeoutRef.current); } }, }); const deleteGroup = useDeletePromptGroup({ onSuccess: (_response, variables) => { if (variables.id === group._id) { const announcement = localize('com_ui_prompt_deleted', { 0: group.name }); announcePolite({ message: announcement, isStatus: true }); 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.key === ' ') { 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 (
{canEdit && (
setNameInputValue(e.target.value)} className="w-full" aria-label={localize('com_ui_rename_prompt_name', { name: 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);