import React, { useState, useRef } from 'react'; import { useSelector } from 'react-redux'; import { DropdownMenuRadioItem } from '../ui/DropdownMenu.tsx'; 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'; export default function ModelItem({ modelName, value, onSelect }) { 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'); if (value === 'chatgptCustom') { return ( {modelName} $ ); } if (initial[value]) { return ( {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({ value: currentName.toLowerCase() }); // await mutate(); onSelect('chatgpt', true); }; const handleKeyDown = (e) => { if (e.key === 'Enter') { onRename(e); } }; const buttonClass = { className: '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 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' }; const showButtons = isHovering && !initial[value]; return ( { onSelect(value, true); }} onMouseOver={handleMouseOver} onMouseOut={handleMouseOut} > {customModel === value && ( )} {renaming === true ? ( e.stopPropagation()} onChange={(e) => setModelInput(e.target.value)} onBlur={onRename} onKeyDown={handleKeyDown} /> ) : ( modelInput )} {value === 'chatgpt' && $} {showButtons && ( <> )} ); }