|
import type { TPresetItemProps } from '~/common'; |
|
import type { TPreset } from 'librechat-data-provider'; |
|
import { DropdownMenuRadioItem, EditIcon, TrashIcon } from '~/components'; |
|
import { Icon } from '~/components/Endpoints'; |
|
|
|
export default function PresetItem({ |
|
preset = {} as TPreset, |
|
value, |
|
onChangePreset, |
|
onDeletePreset, |
|
}: TPresetItemProps) { |
|
const { endpoint } = preset; |
|
|
|
const icon = Icon({ |
|
size: 20, |
|
endpoint: preset?.endpoint, |
|
model: preset?.model, |
|
error: false, |
|
className: 'mr-2', |
|
isCreatedByUser: false, |
|
}); |
|
|
|
const getPresetTitle = () => { |
|
let _title = `${endpoint}`; |
|
const { chatGptLabel, modelLabel, model, jailbreak, toneStyle } = preset; |
|
|
|
if (endpoint === 'azureOpenAI' || endpoint === 'openAI') { |
|
if (model) { |
|
_title += `: ${model}`; |
|
} |
|
if (chatGptLabel) { |
|
_title += ` as ${chatGptLabel}`; |
|
} |
|
} else if (endpoint === 'google') { |
|
if (model) { |
|
_title += `: ${model}`; |
|
} |
|
if (modelLabel) { |
|
_title += ` as ${modelLabel}`; |
|
} |
|
} else if (endpoint === 'bingAI') { |
|
if (toneStyle) { |
|
_title += `: ${toneStyle}`; |
|
} |
|
if (jailbreak) { |
|
_title += ' as Sydney'; |
|
} |
|
} else if (endpoint === 'chatGPTBrowser') { |
|
if (model) { |
|
_title += `: ${model}`; |
|
} |
|
} else if (endpoint === 'gptPlugins') { |
|
if (model) { |
|
_title += `: ${model}`; |
|
} |
|
} else if (endpoint === null) { |
|
null; |
|
} else { |
|
null; |
|
} |
|
return _title; |
|
}; |
|
|
|
|
|
return ( |
|
<DropdownMenuRadioItem |
|
/* @ts-ignore, value can be an object as well */ |
|
value={value} |
|
className="group flex h-10 max-h-[44px] flex-row justify-between dark:font-semibold dark:text-gray-100 dark:hover:bg-gray-800 sm:h-auto" |
|
> |
|
<div className="flex items-center justify-start"> |
|
{icon} |
|
<small className="text-[11px]">{preset?.title}</small> |
|
<small className="invisible ml-1 flex w-0 flex-shrink text-[10px] sm:visible sm:w-auto"> |
|
({getPresetTitle()}) |
|
</small> |
|
</div> |
|
<div className="flex h-full items-center justify-end"> |
|
<button |
|
className="m-0 mr-1 h-full rounded-md px-4 text-gray-400 hover:text-gray-700 dark:bg-gray-700 dark:text-gray-400 dark:hover:text-gray-200 sm:invisible sm:p-2 sm:group-hover:visible" |
|
onClick={(e) => { |
|
e.preventDefault(); |
|
onChangePreset(preset); |
|
}} |
|
> |
|
<EditIcon /> |
|
</button> |
|
<button |
|
className="m-0 h-full rounded-md px-4 text-gray-400 hover:text-gray-700 dark:bg-gray-700 dark:text-gray-400 dark:hover:text-gray-200 sm:invisible sm:p-2 sm:group-hover:visible" |
|
onClick={(e) => { |
|
e.preventDefault(); |
|
onDeletePreset(preset); |
|
}} |
|
> |
|
<TrashIcon /> |
|
</button> |
|
</div> |
|
</DropdownMenuRadioItem> |
|
); |
|
} |
|
|