| import { useState } from 'react'; |
| import { Settings2 } from 'lucide-react'; |
| import { TooltipAnchor } from '@librechat/client'; |
| import { Root, Anchor } from '@radix-ui/react-popover'; |
| import { isParamEndpoint, getEndpointField, tConvoUpdateSchema } from 'librechat-data-provider'; |
| import type { TPreset, TInterfaceConfig } from 'librechat-data-provider'; |
| import { EndpointSettings, SaveAsPresetDialog, AlternativeSettings } from '~/components/Endpoints'; |
| import { useSetIndexOptions, useLocalize } from '~/hooks'; |
| import { useGetEndpointsQuery } from '~/data-provider'; |
| import OptionsPopover from './OptionsPopover'; |
| import PopoverButtons from './PopoverButtons'; |
| import { useChatContext } from '~/Providers'; |
|
|
| export default function HeaderOptions({ |
| interfaceConfig, |
| }: { |
| interfaceConfig?: Partial<TInterfaceConfig>; |
| }) { |
| const { data: endpointsConfig } = useGetEndpointsQuery(); |
|
|
| const [saveAsDialogShow, setSaveAsDialogShow] = useState<boolean>(false); |
| const localize = useLocalize(); |
|
|
| const { showPopover, conversation, setShowPopover } = useChatContext(); |
| const { setOption } = useSetIndexOptions(); |
| const { endpoint } = conversation ?? {}; |
|
|
| const saveAsPreset = () => { |
| setSaveAsDialogShow(true); |
| }; |
|
|
| if (!endpoint) { |
| return null; |
| } |
|
|
| const triggerAdvancedMode = () => setShowPopover((prev) => !prev); |
|
|
| const endpointType = getEndpointField(endpointsConfig, endpoint, 'type'); |
| const paramEndpoint = isParamEndpoint(endpoint, endpointType); |
|
|
| return ( |
| <Root |
| open={showPopover} |
| // onOpenChange={} // called when the open state of the popover changes. |
| > |
| <Anchor> |
| <div className="my-auto lg:max-w-2xl xl:max-w-3xl"> |
| <span className="flex w-full flex-col items-center justify-center gap-0 md:order-none md:m-auto md:gap-2"> |
| <div className="z-[61] flex w-full items-center justify-center gap-2"> |
| {interfaceConfig?.parameters === true && paramEndpoint === false && ( |
| <TooltipAnchor |
| id="parameters-button" |
| aria-label={localize('com_ui_model_parameters')} |
| description={localize('com_ui_model_parameters')} |
| tabIndex={0} |
| role="button" |
| onClick={triggerAdvancedMode} |
| data-testid="parameters-button" |
| className="inline-flex size-10 items-center justify-center rounded-lg 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" |
| > |
| <Settings2 size={16} aria-label="Settings/Parameters Icon" /> |
| </TooltipAnchor> |
| )} |
| </div> |
| {interfaceConfig?.parameters === true && paramEndpoint === false && ( |
| <OptionsPopover |
| visible={showPopover} |
| saveAsPreset={saveAsPreset} |
| presetsDisabled={!(interfaceConfig.presets ?? false)} |
| PopoverButtons={<PopoverButtons />} |
| closePopover={() => setShowPopover(false)} |
| > |
| <div className="px-4 py-4"> |
| <EndpointSettings |
| className="[&::-webkit-scrollbar]:w-2" |
| conversation={conversation} |
| setOption={setOption} |
| /> |
| <AlternativeSettings conversation={conversation} setOption={setOption} /> |
| </div> |
| </OptionsPopover> |
| )} |
| {interfaceConfig?.presets === true && ( |
| <SaveAsPresetDialog |
| open={saveAsDialogShow} |
| onOpenChange={setSaveAsDialogShow} |
| preset={ |
| tConvoUpdateSchema.parse({ |
| ...conversation, |
| }) as TPreset |
| } |
| /> |
| )} |
| </span> |
| </div> |
| </Anchor> |
| </Root> |
| ); |
| } |
|
|