import { memo, useState, useRef, useMemo, useCallback, KeyboardEvent } from 'react'; import { EarthIcon, Pen } 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, OGDialogTrigger } 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/'; interface DashGroupItemProps { group: TPromptGroup; instanceProjectId?: string; } function DashGroupItemComponent({ group, instanceProjectId }: DashGroupItemProps) { const params = useParams(); const navigate = useNavigate(); const localize = useLocalize(); const { user } = useAuthContext(); const blurTimeoutRef = useRef(null); const [nameInputValue, setNameInputValue] = useState(group.name); const isOwner = useMemo(() => user?.id === group.author, [user?.id, group.author]); 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 && ( )} {(isOwner || user?.role === SystemRoles.ADMIN) && ( <>
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, }} />
} 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);