| import { EModelEndpoint } from 'librechat-data-provider'; | |
| import { MessagesSquared, GPTIcon } from '~/components/svg'; | |
| import { useRecoilState } from 'recoil'; | |
| import { Button } from '~/components'; | |
| import { cn } from '~/utils/'; | |
| import store from '~/store'; | |
| type TPopoverButton = { | |
| label: string; | |
| buttonClass: string; | |
| handler: () => void; | |
| icon: React.ReactNode; | |
| }; | |
| export default function PopoverButtons({ | |
| endpoint, | |
| buttonClass, | |
| iconClass = '', | |
| }: { | |
| endpoint: EModelEndpoint; | |
| buttonClass?: string; | |
| iconClass?: string; | |
| }) { | |
| const [optionSettings, setOptionSettings] = useRecoilState(store.optionSettings); | |
| const [showAgentSettings, setShowAgentSettings] = useRecoilState(store.showAgentSettings); | |
| const { showExamples, isCodeChat } = optionSettings; | |
| const triggerExamples = () => | |
| setOptionSettings((prev) => ({ ...prev, showExamples: !prev.showExamples })); | |
| const buttons: { [key: string]: TPopoverButton[] } = { | |
| google: [ | |
| { | |
| label: (showExamples ? 'Hide' : 'Show') + ' Examples', | |
| buttonClass: isCodeChat ? 'disabled' : '', | |
| handler: triggerExamples, | |
| icon: <MessagesSquared className={cn('mr-1 w-[14px]', iconClass)} />, | |
| }, | |
| ], | |
| gptPlugins: [ | |
| { | |
| label: `Show ${showAgentSettings ? 'Completion' : 'Agent'} Settings`, | |
| buttonClass: '', | |
| handler: () => setShowAgentSettings((prev) => !prev), | |
| icon: <GPTIcon className={cn('mr-1 mt-[2px] w-[14px]', iconClass)} size={14} />, | |
| }, | |
| ], | |
| }; | |
| const endpointButtons = buttons[endpoint]; | |
| if (!endpointButtons) { | |
| return null; | |
| } | |
| return ( | |
| <div> | |
| {endpointButtons.map((button, index) => ( | |
| <Button | |
| key={`${endpoint}-button-${index}`} | |
| type="button" | |
| className={cn( | |
| button.buttonClass, | |
| 'ml-1 h-auto justify-start bg-transparent px-2 py-1 text-xs font-medium font-normal text-black hover:bg-slate-200 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-700 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0', | |
| buttonClass ?? '', | |
| )} | |
| onClick={button.handler} | |
| > | |
| {button.icon} | |
| {button.label} | |
| </Button> | |
| ))} | |
| </div> | |
| ); | |
| } | |