import React, { useState, useRef } from 'react'; import * as Tabs from '@radix-ui/react-tabs'; import { MessageSquare, Command, DollarSign } from 'lucide-react'; import { SettingsTabValues } from 'librechat-data-provider'; import { useGetStartupConfig } from '~/data-provider'; import type { TDialogProps } from '~/common'; import { Dialog, DialogPanel, DialogTitle, Transition, TransitionChild } from '@headlessui/react'; import { Personalization, Commands, General, Account, Balance, Speech, Data, Chat, } from './SettingsTabs'; import { GearIcon, DataIcon, SpeechIcon, UserIcon, PersonalizationIcon } from '~/components/svg'; import usePersonalizationAccess from '~/hooks/usePersonalizationAccess'; import { useMediaQuery, useLocalize, TranslationKeys } from '~/hooks'; import { cn } from '~/utils'; export default function Settings({ open, onOpenChange }: TDialogProps) { const isSmallScreen = useMediaQuery('(max-width: 767px)'); const { data: startupConfig } = useGetStartupConfig(); const localize = useLocalize(); const [activeTab, setActiveTab] = useState(SettingsTabValues.GENERAL); const tabRefs = useRef({}); const { hasAnyPersonalizationFeature, hasMemoryOptOut } = usePersonalizationAccess(); const handleKeyDown = (event: React.KeyboardEvent) => { const tabs: SettingsTabValues[] = [ SettingsTabValues.GENERAL, SettingsTabValues.CHAT, SettingsTabValues.COMMANDS, SettingsTabValues.SPEECH, ...(hasAnyPersonalizationFeature ? [SettingsTabValues.PERSONALIZATION] : []), SettingsTabValues.DATA, ...(startupConfig?.balance?.enabled ? [SettingsTabValues.BALANCE] : []), SettingsTabValues.ACCOUNT, ]; const currentIndex = tabs.indexOf(activeTab); switch (event.key) { case 'ArrowDown': event.preventDefault(); setActiveTab(tabs[(currentIndex + 1) % tabs.length]); break; case 'ArrowUp': event.preventDefault(); setActiveTab(tabs[(currentIndex - 1 + tabs.length) % tabs.length]); break; case 'Home': event.preventDefault(); setActiveTab(tabs[0]); break; case 'End': event.preventDefault(); setActiveTab(tabs[tabs.length - 1]); break; } }; const settingsTabs: { value: SettingsTabValues; icon: React.JSX.Element; label: TranslationKeys; }[] = [ { value: SettingsTabValues.GENERAL, icon: , label: 'com_nav_setting_general', }, { value: SettingsTabValues.CHAT, icon: , label: 'com_nav_setting_chat', }, { value: SettingsTabValues.COMMANDS, icon: , label: 'com_nav_commands', }, { value: SettingsTabValues.SPEECH, icon: , label: 'com_nav_setting_speech', }, ...(hasAnyPersonalizationFeature ? [ { value: SettingsTabValues.PERSONALIZATION, icon: , label: 'com_nav_setting_personalization' as TranslationKeys, }, ] : []), { value: SettingsTabValues.DATA, icon: , label: 'com_nav_setting_data', }, ...(startupConfig?.balance?.enabled ? [ { value: SettingsTabValues.BALANCE, icon: , label: 'com_nav_setting_balance' as TranslationKeys, }, ] : ([] as { value: SettingsTabValues; icon: React.JSX.Element; label: TranslationKeys }[])), { value: SettingsTabValues.ACCOUNT, icon: , label: 'com_nav_setting_account', }, ]; const handleTabChange = (value: string) => { setActiveTab(value as SettingsTabValues); }; return ( ); }