import React, { useState, useRef } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { DropdownMenuRadioItem } from '../ui/DropdownMenu.tsx'; import { setModels } from '~/store/modelSlice'; import { Circle } from 'lucide-react'; import { DialogTrigger } from '../ui/Dialog.tsx'; import RenameButton from '../Conversations/RenameButton'; import TrashIcon from '../svg/TrashIcon'; import manualSWR from '~/utils/fetchers'; import { getIconOfModel } from '../../utils'; export default function ModelItem({ modelName, value, onSelect, id, chatGptLabel, promptPrefix }) { const dispatch = useDispatch(); const { customModel } = useSelector((state) => state.submit); const { initial } = useSelector((state) => state.models); const [isHovering, setIsHovering] = useState(false); const [renaming, setRenaming] = useState(false); const [currentName, setCurrentName] = useState(modelName); const [modelInput, setModelInput] = useState(modelName); const inputRef = useRef(null); const rename = manualSWR(`/api/customGpts`, 'post'); const deleteCustom = manualSWR(`/api/customGpts/delete`, 'post', (res) => { const fetchedModels = res.data.map((modelItem) => ({ ...modelItem, name: modelItem.chatGptLabel })); dispatch(setModels(fetchedModels)); }); const icon = getIconOfModel({ size: 16, sender: modelName, isCreatedByUser: false, model: value, chatGptLabel, promptPrefix, error: false, className: "mr-2" }); if (value === 'chatgptCustom') { return ( {icon} {modelName} $ ); } if (initial[value]) { return ( {icon} {modelName} {value === 'chatgpt' && $} ); } const handleMouseOver = () => { setIsHovering(true); }; const handleMouseOut = () => { setIsHovering(false); }; const renameHandler = (e) => { e.preventDefault(); e.stopPropagation(); setRenaming(true); setTimeout(() => { inputRef.current.focus(); }, 25); }; const onRename = (e) => { e.preventDefault(); setRenaming(false); if (modelInput === modelName) { return; } rename.trigger({ prevLabel: currentName, chatGptLabel: modelInput, value: modelInput.toLowerCase() }); setCurrentName(modelInput); }; const onDelete = async (e) => { e.preventDefault(); await deleteCustom.trigger({ _id: id }); onSelect('chatgpt', true); }; const handleKeyDown = (e) => { if (e.key === 'Enter') { onRename(e); } }; const buttonClass = { className: 'invisible group-hover:visible z-50 rounded-md m-0 text-gray-400 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200' }; const itemClass = { className: 'relative flex group cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm font-medium outline-none hover:bg-slate-100 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 dark:hover:bg-slate-700 dark:font-semibold dark:text-gray-100 dark:hover:bg-gray-800' }; return ( { if (isHovering) { return; } onSelect(value, true); }} > {customModel === value && ( )} {icon} {renaming === true ? ( e.stopPropagation()} onChange={(e) => setModelInput(e.target.value)} // onBlur={onRename} onKeyDown={handleKeyDown} /> ) : (
{modelInput}
)} {value === 'chatgpt' && $}
); }