| import type { FC } from 'react'; | |
| import { BookCopy } from 'lucide-react'; | |
| import { TooltipAnchor } from '@librechat/client'; | |
| import { Content, Portal, Root, Trigger } from '@radix-ui/react-popover'; | |
| import { EditPresetDialog, PresetItems } from './Presets'; | |
| import { useLocalize, usePresets } from '~/hooks'; | |
| import { useChatContext } from '~/Providers'; | |
| const PresetsMenu: FC = () => { | |
| const localize = useLocalize(); | |
| const { | |
| presetsQuery, | |
| onSetDefaultPreset, | |
| onFileSelected, | |
| onSelectPreset, | |
| onChangePreset, | |
| clearAllPresets, | |
| onDeletePreset, | |
| submitPreset, | |
| exportPreset, | |
| } = usePresets(); | |
| const { preset } = useChatContext(); | |
| return ( | |
| <Root> | |
| <Trigger asChild> | |
| <TooltipAnchor | |
| id="presets-button" | |
| aria-label={localize('com_endpoint_examples')} | |
| description={localize('com_endpoint_examples')} | |
| tabIndex={0} | |
| role="button" | |
| data-testid="presets-button" | |
| className="inline-flex size-10 flex-shrink-0 items-center justify-center rounded-xl border border-border-light bg-transparent text-text-primary transition-all ease-in-out hover:bg-surface-tertiary disabled:pointer-events-none disabled:opacity-50 radix-state-open:bg-surface-tertiary" | |
| > | |
| <BookCopy size={16} aria-label="Preset Icon" /> | |
| </TooltipAnchor> | |
| </Trigger> | |
| <Portal> | |
| <div | |
| style={{ | |
| position: 'fixed', | |
| left: '0px', | |
| top: '0px', | |
| transform: 'translate3d(268px, 50px, 0px)', | |
| minWidth: 'max-content', | |
| zIndex: 'auto', | |
| }} | |
| > | |
| <Content | |
| side="bottom" | |
| align="center" | |
| className="mt-2 max-h-[495px] overflow-x-hidden rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-700 dark:text-white md:min-w-[400px]" | |
| > | |
| <PresetItems | |
| presets={presetsQuery.data} | |
| onSetDefaultPreset={onSetDefaultPreset} | |
| onSelectPreset={onSelectPreset} | |
| onChangePreset={onChangePreset} | |
| onDeletePreset={onDeletePreset} | |
| clearAllPresets={clearAllPresets} | |
| onFileSelected={onFileSelected} | |
| /> | |
| </Content> | |
| </div> | |
| </Portal> | |
| {preset && <EditPresetDialog submitPreset={submitPreset} exportPreset={exportPreset} />} | |
| </Root> | |
| ); | |
| }; | |
| export default PresetsMenu; | |