import React, { useState, useEffect } from 'react'; import { applyTheme, applyCustomTheme } from './theme'; import { exportSettings, importSettings } from './settingUtils'; // Import utility functions import { getAllLocalStorageItems } from '../backend/GetLocalStorage'; import { changePassword, changeData, deleteAccount, } from '../backend/database'; const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = ({ closeSettings, accountName }) => { const getItemFromLocalStorage = (key: string) => { const item = localStorage.getItem(key); if (item) { try { return JSON.parse(item); // Attempt to parse the item } catch (e) { console.error(`Error parsing JSON for key "${key}":`, e); return false; // Return false if parsing fails } } return false; // Default to false if item is null or empty }; interface SettingsProps { closeSettings: () => void; accountName: string; handleLogout: () => void; // Add this line to accept handleLogout as a prop } // Active section const [activeSection, setActiveSection] = useState(() => localStorage.getItem('activeSection') || 'general'); // Language setting const [preferredLanguage, setPreferredLanguage] = useState(() => localStorage.getItem('preferredLanguage') || 'en'); // Currency setting const [preferredCurrency, setPreferredCurrency] = useState(() => localStorage.getItem('preferredCurrency') || 'usd'); // Date and time format settings const [dateFormat, setDateFormat] = useState(() => localStorage.getItem('dateFormat') || 'mm/dd/yyyy'); const [timeFormat, setTimeFormat] = useState(() => localStorage.getItem('timeFormat') || '12-hour'); const [timeZone, setTimeZone] = useState(() => localStorage.getItem('timeZone') || 'GMT'); // Online AI and chat history settings const [selectedOption, setSelectedOption] = useState('Offline'); // Default to 'Offline' const [disableChatHistory, setDisableChatHistory] = useState(() => getItemFromLocalStorage('disableChatHistory')); const [disableAIMemory, setDisableAIMemory] = useState(() => getItemFromLocalStorage('disableAIMemory')); const [openSourceMode, setOpenSourceMode] = useState(() => getItemFromLocalStorage('openSourceMode')); // User credentials const [newName, setNewName] = useState(() => localStorage.getItem('newName') || ''); const [newEmail, setNewEmail] = useState(() => localStorage.getItem('newEmail') || ''); const [newPassword, setNewPassword] = useState(() => localStorage.getItem('newPassword') || ''); const [currentPassword, setCurrentPassword] = useState(''); // Measurement setting const [preferredMeasurement, setPreferredMeasurement] = useState(() => localStorage.getItem('preferredMeasurement') || 'Metric'); // Theme settings const [backgroundColor, setBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--background-color').trim()); const [textColor, setTextColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--text-color').trim()); const [inputBackgroundColor, setInputBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--input-background-color').trim()); const [inputButtonColor, setInputButtonColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--input-button-color').trim()); const [inputButtonHoverColor, setInputButtonHoverColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--input-button-hover-color').trim()); const [userMessageBackgroundColor, setUserMessageBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--user-message-background-color').trim()); const [userMessageTextColor, setUserMessageTextColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--user-message-text-color').trim()); const [aiMessageBackgroundColor, setAiMessageBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--ai-message-background-color').trim()); const [aiMessageTextColor, setAiMessageTextColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--ai-message-text-color').trim()); const [buttonBackgroundColor, setButtonBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--button-background-color').trim()); const [buttonHoverBackgroundColor, setButtonHoverBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--button-hover-background-color').trim()); const [modelsBackgroundColor, setModelsBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--models-background-color').trim()); const [historyBackgroundColor, setHistoryBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--history-background-color').trim()); const [leftPanelBackgroundColor, setLeftPanelBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--left-panel-background-color').trim()); const [conversationBackgroundColor, setConversationBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--conversation-background-color').trim()); const [popUpTextColor, setPopUpTextColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--pop-up-text').trim()); const [inputBorderColor, setInputBorderColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--input-border-color').trim()); const [fontFamily, setFontFamily] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--font-family').trim()); const [fontSize, setFontSize] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--font-size').trim()); const [burgerMenu, setBurgerMenu] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--burger-menu-background-color').trim()); const [faqBackgroundColor, setFaqBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--faq-background-color').trim()); const [faqHeadingColor, setFaqHeadingColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--faq-heading-color').trim()); const [faqItemBackgroundColor, setFaqItemBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--faq-item-background-color').trim()); const [faqItemHeadingColor, setFaqItemHeadingColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--faq-item-heading-color').trim()); const [faqItemTextColor, setFaqItemTextColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--faq-item-text-color').trim()); const [faqItemHoverBackgroundColor, setFaqItemHoverBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--faq-item-hover-background-color').trim()); const [popupBackgroundColor, setPopupBackgroundColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--popup-background-color').trim()); const [overlayTextColor, setOverlayTextColor] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--overlay-text-color').trim()); // Theme selection const [selectedTheme, setSelectedTheme] = useState<string>(''); useEffect(() => { const savedTheme = localStorage.getItem('selectedTheme'); if (savedTheme) { setSelectedTheme(savedTheme); applyTheme(savedTheme); } }, []); // Runs only once when the component mounts // API Keys const [mistral, setmistral] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--online-la-plateforme').trim()); const [openai, setopenai] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-openai').trim()); const [anthropic, setAnthropic] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-anthropic').trim()); const [google, setGoogle] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-google').trim()); const [isLoggedIn, setIsLoggedIn] = useState(false); const handleLogout = () => { setIsLoggedIn(false); localStorage.removeItem('accountName'); localStorage.removeItem('accountEmail'); localStorage.removeItem('accountPassword'); }; const settings = { userPreferences: { activeSection, preferredLanguage, preferredCurrency, dateFormat, timeFormat, timeZone, selectedOption, disableChatHistory, disableAIMemory, openSourceMode, newName, newEmail, newPassword, preferredMeasurement, }, theme: { backgroundColor, textColor, inputBackgroundColor, inputButtonColor, inputButtonHoverColor, userMessageBackgroundColor, userMessageTextColor, aiMessageBackgroundColor, aiMessageTextColor, buttonBackgroundColor, buttonHoverBackgroundColor, modelsBackgroundColor, historyBackgroundColor, leftPanelBackgroundColor, conversationBackgroundColor, popUpTextColor, inputBorderColor, fontFamily, fontSize, selectedTheme, faqSettings: { faqBackgroundColor, faqHeadingColor, faqItemBackgroundColor, faqItemHeadingColor, faqItemTextColor, faqItemHoverBackgroundColor, }, popupSettings: { popupBackgroundColor, overlayTextColor, }, }, apiKeys: { mistral, openai, anthropic, google, }, generalSettings: { burgerMenu, }, }; // Effect hooks to update localStorage whenever any state changes useEffect(() => { // Flatten nested objects const flattenedSettings = { ...settings.userPreferences, ...settings.theme, ...settings.theme.faqSettings, ...settings.theme.popupSettings, ...settings.apiKeys, ...settings.generalSettings, }; // Update localStorage for all settings for (const [key, value] of Object.entries(flattenedSettings)) { localStorage.setItem(key, typeof value === 'boolean' ? JSON.stringify(value) : value); } }, [ ...Object.values(settings.userPreferences), ...Object.values(settings.theme), ...Object.values(settings.theme.faqSettings), ...Object.values(settings.theme.popupSettings), ...Object.values(settings.apiKeys), ...Object.values(settings.generalSettings), ]); useEffect(() => { const savedOption = localStorage.getItem('radioSelection'); if (savedOption) { setSelectedOption(savedOption); // Set saved selection } }, []); const handleRadioChange = (newValue: string) => { setSelectedOption(newValue); // Update the state with the selected option if (openSourceMode){ newValue += " (FOSS)" } localStorage.setItem('radioSelection', newValue); // Save the selection for persistence }; // Function to handle updating all credentials const handleUpdateCredentials = async () => { // Update account information const newData = { name: newName || accountName, // Keep old name if new name is not provided email: newEmail || '', // Optionally use empty string if not provided }; // First change the data const dataSuccess = await changeData(accountName, currentPassword, newData); // Then change the password if a new password is provided const passwordSuccess = newPassword ? await changePassword(accountName, currentPassword, newPassword) : true; // If no new password, treat as success if (dataSuccess && passwordSuccess) { alert('Credentials updated successfully!'); closeSettings(); // Close settings after updating } else { alert('Failed to update credentials. Please check your current password.'); } }; // Function to handle account deletion const handleDeleteAccount = async () => { const success = await deleteAccount(accountName, currentPassword); if (success) { alert('Account deleted successfully!'); closeSettings(); // Close settings after deletion // Optionally, redirect or reset state here } else { alert('Account deletion failed. Please check your password.'); } }; // Render settings content based on the active section const renderSettingsContent = () => { switch (activeSection) { case 'general': return ( <div className="settings-section"> <h2>General Settings</h2> <div className="settings-option"> <label>Preferred Language</label> <select value={preferredLanguage} onChange={(e) => setPreferredLanguage(e.target.value)} > <option value="en">English</option> <option value="es">Spanish</option> <option value="fr">French</option> <option value="de">German</option> <option value="it">Italian</option> <option value="pt">Portuguese</option> <option value="zh">Chinese</option> <option value="ja">Japanese</option> <option value="ru">Russian</option> <option value="ar">Arabic</option> </select> </div> <div className="settings-option"> <label>Preferred Currency</label> <select value={preferredCurrency} onChange={(e) => setPreferredCurrency(e.target.value)} > <option value="usd">USD</option> <option value="eur">EUR</option> <option value="gbp">GBP</option> <option value="jpy">JPY</option> <option value="cad">CAD</option> <option value="aud">AUD</option> <option value="chf">CHF</option> <option value="cny">CNY</option> <option value="inr">INR</option> </select> </div> <div className="settings-option"> <label>Date Format</label> <select value={dateFormat} onChange={(e) => setDateFormat(e.target.value)} > <option value="mm/dd/yyyy">MM/DD/YYYY</option> <option value="dd/mm/yyyy">DD/MM/YYYY</option> <option value="yyyy-mm-dd">YYYY-MM-DD</option> <option value="mm-dd-yyyy">MM-DD-YYYY</option> <option value="dd-mm-yyyy">DD-MM-YYYY</option> </select> </div> <div className="settings-option"> <label>Time Format</label> <select value={timeFormat} onChange={(e) => setTimeFormat(e.target.value)} > <option value="12-hour">12 Hour</option> <option value="24-hour">24 Hour</option> </select> </div> <div className="settings-option"> <label>Time Zone</label> <select value={timeZone} onChange={(e) => setTimeZone(e.target.value)} > <option value="GMT">GMT</option> <option value="EST">EST</option> <option value="CST">CST</option> <option value="MST">MST</option> <option value="PST">PST</option> <option value="UTC">UTC</option> <option value="BST">BST</option> <option value="IST">IST</option> <option value="CET">CET</option> <option value="JST">JST</option> </select> </div> {/* New Preferred Measurement Option */} <div className="settings-option"> <label>Preferred Measurement</label> <select value={preferredMeasurement} onChange={(e) => setPreferredMeasurement(e.target.value)} > <option value="Metric">Metric</option> <option value="Imperial">Imperial</option> </select> </div> </div> ); case 'privacy': return ( <div className="settings-section"> <h2>Privacy Settings</h2> {/* AI Mode Radio Options */} <div className="settings-option"> <p>Disable Options:</p> <div className="slider"> {/* Offline */} <div className={`slider-option ${selectedOption === 'Offline' ? 'active' : ''}`} onClick={() => handleRadioChange('Offline')} // Allow selection only if not in open-source mode > Offline tools{openSourceMode ? ' (FOSS)' : ''} </div> {/* Online */} <div className={`slider-option ${selectedOption === 'Online' ? 'active' : ''}`} onClick={() => handleRadioChange('Online')} > Online tools{openSourceMode ? ' (FOSS)' : ''} </div> {/* None */} <div className={`slider-option ${selectedOption === 'None' ? 'active' : ''}`} onClick={() => handleRadioChange('None')} > None{openSourceMode ? ' (FOSS)' : ''} </div> </div> <br /> <p> After changing the preferred settings, please reload the website so it can update itself properly. </p> </div> {/* Disable Chat History Checkbox */} <div className="settings-option"> <label> <input type="checkbox" checked={disableChatHistory} onChange={() => setDisableChatHistory(!disableChatHistory)} /> Disable Chat History </label> </div> {/* Disable AI Memory Checkbox */} <div className="settings-option"> <label> <input type="checkbox" checked={disableAIMemory} onChange={() => setDisableAIMemory(!disableAIMemory)} /> Disable AI Memory </label> </div> </div> ); case 'theme': return ( <div className="settings-section"> <h2>Theme Settings</h2> {/* Dropdown to select theme */} <div className="settings-option"> <p>Select Theme</p> <select value={selectedTheme} onChange={(e) => { const theme = e.target.value; if (theme !== "default") { setSelectedTheme(theme); localStorage.setItem("selectedTheme", theme); // Apply the appropriate theme based on selection applyTheme(theme); } }} > <option value="default">Select your style...</option> <option value="IOMARKET">IOMARKET</option> <option value="WHITE">WHITE</option> <option value="BLACK">BLACK</option> <option value="CUSTOM">CUSTOM</option> </select> </div> {/* Conditionally render theme settings only if "CUSTOM" is selected */} {selectedTheme === 'CUSTOM' && ( <> {/* Font Size */} <div className="settings-option"> <p>Font Size</p> <input type="range" min="12" max="30" value={parseInt(fontSize, 10)} // Ensure value is a number onChange={(e) => { const newSize = `${e.target.value}px`; setFontSize(newSize); document.documentElement.style.setProperty('--font-size', newSize); }} /> <span>{fontSize}</span> </div> {/* Background Color */} <div className="settings-option"> <p>Background Color</p> <input type="color" value={backgroundColor} onChange={(e) => { const newColor = e.target.value; setBackgroundColor(newColor); document.documentElement.style.setProperty('--background-color', newColor); }} /> </div> {/* Text Color */} <div className="settings-option"> <p>Text Color</p> <input type="color" value={textColor} onChange={(e) => { const newColor = e.target.value; setTextColor(newColor); document.documentElement.style.setProperty('--text-color', newColor); }} /> </div> {/* Input Background Color */} <div className="settings-option"> <p>Input Background Color</p> <input type="color" value={inputBackgroundColor} onChange={(e) => { const newColor = e.target.value; setInputBackgroundColor(newColor); document.documentElement.style.setProperty('--input-background-color', newColor); }} /> </div> {/* Input Button Color */} <div className="settings-option"> <p>Input Button Color</p> <input type="color" value={inputButtonColor} onChange={(e) => { const newColor = e.target.value; setInputButtonColor(newColor); document.documentElement.style.setProperty('--input-button-color', newColor); }} /> </div> {/* Input Button Hover Color */} <div className="settings-option"> <p>Input Button Hover Color</p> <input type="color" value={inputButtonHoverColor} onChange={(e) => { const newColor = e.target.value; setInputButtonHoverColor(newColor); document.documentElement.style.setProperty('--input-button-hover-color', newColor); }} /> </div> {/* User Message Background Color */} <div className="settings-option"> <p>User Message Background Color</p> <input type="color" value={userMessageBackgroundColor} onChange={(e) => { const newColor = e.target.value; setUserMessageBackgroundColor(newColor); document.documentElement.style.setProperty('--user-message-background-color', newColor); }} /> </div> {/* User Message Text Color */} <div className="settings-option"> <p>User Message Text Color</p> <input type="color" value={userMessageTextColor} onChange={(e) => { const newColor = e.target.value; setUserMessageTextColor(newColor); document.documentElement.style.setProperty('--user-message-text-color', newColor); }} /> </div> {/* AI Message Background Color */} <div className="settings-option"> <p>AI Message Background Color</p> <input type="color" value={aiMessageBackgroundColor} onChange={(e) => { const newColor = e.target.value; setAiMessageBackgroundColor(newColor); document.documentElement.style.setProperty('--ai-message-background-color', newColor); }} /> </div> {/* AI Message Text Color */} <div className="settings-option"> <p>AI Message Text Color</p> <input type="color" value={aiMessageTextColor} onChange={(e) => { const newColor = e.target.value; setAiMessageTextColor(newColor); document.documentElement.style.setProperty('--ai-message-text-color', newColor); }} /> </div> {/* Button Background Color */} <div className="settings-option"> <p>Button Background Color</p> <input type="color" value={buttonBackgroundColor} onChange={(e) => { const newColor = e.target.value; setButtonBackgroundColor(newColor); document.documentElement.style.setProperty('--button-background-color', newColor); }} /> </div> {/* Button Hover Background Color */} <div className="settings-option"> <p>Button Hover Background Color</p> <input type="color" value={buttonHoverBackgroundColor} onChange={(e) => { const newColor = e.target.value; setButtonHoverBackgroundColor(newColor); document.documentElement.style.setProperty('--button-hover-background-color', newColor); }} /> </div> {/* Models Background Color */} <div className="settings-option"> <p>Models Background Color</p> <input type="color" value={modelsBackgroundColor} onChange={(e) => { const newColor = e.target.value; setModelsBackgroundColor(newColor); document.documentElement.style.setProperty('--models-background-color', newColor); }} /> </div> {/* History Background Color */} <div className="settings-option"> <p>History Background Color</p> <input type="color" value={historyBackgroundColor} onChange={(e) => { const newColor = e.target.value; setHistoryBackgroundColor(newColor); document.documentElement.style.setProperty('--history-background-color', newColor); }} /> </div> {/* Left Panel Background Color */} <div className="settings-option"> <p>Left Panel Background Color</p> <input type="color" value={leftPanelBackgroundColor} onChange={(e) => { const newColor = e.target.value; setLeftPanelBackgroundColor(newColor); document.documentElement.style.setProperty('--left-panel-background-color', newColor); }} /> </div> {/* Conversation Background Color */} <div className="settings-option"> <p>Conversation Background Color</p> <input type="color" value={conversationBackgroundColor} onChange={(e) => { const newColor = e.target.value; setConversationBackgroundColor(newColor); document.documentElement.style.setProperty('--conversation-background-color', newColor); }} /> </div> {/* Pop-up Text Color */} <div className="settings-option"> <p>Pop-up Text Color</p> <input type="color" value={popUpTextColor} onChange={(e) => { const newColor = e.target.value; setPopUpTextColor(newColor); document.documentElement.style.setProperty('--pop-up-text', newColor); }} /> </div> {/* Input Border Color */} <div className="settings-option"> <p>Input Border Color</p> <input type="color" value={inputBorderColor} onChange={(e) => { const newColor = e.target.value; setInputBorderColor(newColor); document.documentElement.style.setProperty('--input-border-color', newColor); }} /> </div> {/* Font Family */} <div className="settings-option"> <p>Font Family</p> <select value={fontFamily} onChange={(e) => { const newFont = e.target.value; setFontFamily(newFont); document.documentElement.style.setProperty('--font-family', newFont); }} > <option value="'Poppins', sans-serif">Poppins</option> <option value="'Inconsolata', monospace">Inconsolata</option> <option value="'Merriweather', serif">Merriweather</option> <option value="'Noto Sans', sans-serif">Noto Sans</option> <option value="'Noto Serif', serif">Noto Serif</option> <option value="'Playfair Display', serif">Playfair Display</option> <option value="'Roboto', sans-serif">Roboto</option> <option value="'Ubuntu', sans-serif">Ubuntu</option> <option value="'Bangers', cursive">Bangers</option> <option value="'Caveat', cursive">Caveat</option> <option value="'Frederika the Great', cursive">Frederika the Great</option> <option value="'Rock Salt', cursive">Rock Salt</option> <option value="'Sofadi One', sans-serif">Sofadi One</option> <option value="'Zilla Slab Highlight', serif">Zilla Slab Highlight</option> </select> </div> {/* FAQ Background Color */} <div className="settings-option"> <p>FAQ Background Color</p> <input type="color" value={faqBackgroundColor} onChange={(e) => { const newColor = e.target.value; setFaqBackgroundColor(newColor); document.documentElement.style.setProperty('--faq-background-color', newColor); }} /> </div> {/* FAQ Heading Color */} <div className="settings-option"> <p>FAQ Heading Color</p> <input type="color" value={faqHeadingColor} onChange={(e) => { const newColor = e.target.value; setFaqHeadingColor(newColor); document.documentElement.style.setProperty('--faq-heading-color', newColor); }} /> </div> {/* FAQ Item Background Color */} <div className="settings-option"> <p>FAQ Item Background Color</p> <input type="color" value={faqItemBackgroundColor} onChange={(e) => { const newColor = e.target.value; setFaqItemBackgroundColor(newColor); document.documentElement.style.setProperty('--faq-item-background-color', newColor); }} /> </div> {/* FAQ Item Heading Color */} <div className="settings-option"> <p>FAQ Item Heading Color</p> <input type="color" value={faqItemHeadingColor} onChange={(e) => { const newColor = e.target.value; setFaqItemHeadingColor(newColor); document.documentElement.style.setProperty('--faq-item-heading-color', newColor); }} /> </div> {/* FAQ Item Text Color */} <div className="settings-option"> <p>FAQ Item Text Color</p> <input type="color" value={faqItemTextColor} onChange={(e) => { const newColor = e.target.value; setFaqItemTextColor(newColor); document.documentElement.style.setProperty('--faq-item-text-color', newColor); }} /> </div> {/* FAQ Item Hover Background Color */} <div className="settings-option"> <p>FAQ Item Hover Background Color</p> <input type="color" value={faqItemHoverBackgroundColor} onChange={(e) => { const newColor = e.target.value; setFaqItemHoverBackgroundColor(newColor); document.documentElement.style.setProperty('--faq-item-hover-background-color', newColor); }} /> </div> {/* Popup Background Color */} <div className="settings-option"> <p>Popup Background Color</p> <input type="color" value={popupBackgroundColor} onChange={(e) => { const newColor = e.target.value; setPopupBackgroundColor(newColor); document.documentElement.style.setProperty('--popup-background-color', newColor); }} /> </div> {/* Overlay Text Color */} <div className="settings-option"> <p>Overlay Text Color</p> <input type="color" value={overlayTextColor} onChange={(e) => { const newColor = e.target.value; setOverlayTextColor(newColor); document.documentElement.style.setProperty('--overlay-text-color', newColor); }} /> </div> </> )} </div> ); case 'foss': return ( <div className="settings-section"> <h2>Open Source Settings</h2> <div className="settings-option"> <label> <input type="checkbox" checked={openSourceMode} onChange={() => { const newValue = !openSourceMode; setOpenSourceMode(newValue); // Update radio selection based on the new openSourceMode value if (newValue) { setSelectedOption('FOSS'); // Set to FOSS if enabling open source mode } else { setSelectedOption('None'); // Or any other default value when disabling } }} /> Enable Open Source Mode </label> </div> </div> ); case 'account': return ( <div className="settings-section"> <h2>Account Settings</h2> <div className="settings-option"> <label>New Name</label> <input type="text" value={newName} onChange={(e) => setNewName(e.target.value)} /> </div> <div className="settings-option"> <label>New Email</label> <input type="email" value={newEmail} onChange={(e) => setNewEmail(e.target.value)} /> </div> <div className="settings-option"> <label>New Password</label> <input type="password" value={newPassword} onChange={(e) => setNewPassword(e.target.value)} /> </div> <div className="settings-option"> <label>Current Password</label> <input type="password" value={currentPassword} onChange={(e) => setCurrentPassword(e.target.value)} /> </div> <div className="settings-option"> <button onClick={handleUpdateCredentials} // Update all credentials className="update-credentials-button" > Update Credentials </button> </div> <div className="settings-option"> <button onClick={handleDeleteAccount} // Delete account className="delete-account-button" > Delete Account </button> </div> </div> ); case 'api': return ( <div className="settings-section"> <div className="settings-option"> <label>La Plateforme</label> <input type="text" value={mistral} onChange={(e) => setmistral(e.target.value)} /> </div> <div className="settings-option"> <label>OpenAI</label> <input type="text" value={openai} onChange={(e) => setopenai(e.target.value)} /> </div> <div className="settings-option"> <label>Anthropic</label> <input type="text" value={anthropic} onChange={(e) => setAnthropic(e.target.value)} /> </div> <div className="settings-option"> <label>Google</label> <input type="text" value={google} onChange={(e) => setGoogle(e.target.value)} /> </div> </div> ); case 'im/export': return ( <div className="settings-section"> <h2>Import & Export</h2> <div className="settings-option"> <h3>Export the settings</h3> <button onClick={() => exportSettings(currentSettings)} className='export-button'>Export Settings</button> </div> <div className="settings-option"> <h3>Import the settings</h3> <input type="file" onChange={handleImport} accept=".json" className='import-file'/> </div> </div> ); default: return null; } }; // Handle file import const handleImport = (event: React.ChangeEvent<HTMLInputElement>) => { if (event.target.files && event.target.files.length > 0) { const file = event.target.files[0]; importSettings(file, applyCustomTheme); } }; // Gather all settings into an object // Gather current settings into an object const currentSettings = { ...settings.userPreferences, ...settings.theme, ...settings.theme.faqSettings, ...settings.theme.popupSettings, ...settings.apiKeys, ...settings.generalSettings, }; return ( <div className="popup-overlay"> <div className="settings-content"> <div className="settings-container"> <div className="sidebar"> <ul> <li onClick={() => setActiveSection('general')}>General</li> <li onClick={() => setActiveSection('privacy')}>Privacy</li> <li onClick={() => setActiveSection('theme')}>Theme</li> <li onClick={() => setActiveSection('foss')}>FOSS</li> <li onClick={() => setActiveSection('account')}>Account</li> <li onClick={() => setActiveSection('api')}>API Keys</li> <li onClick={() => setActiveSection('im/export')}>Import/Export</li> </ul> </div> <div className="settings-main"> <h2>Settings for {accountName}</h2> {renderSettingsContent()} <button className="close-popup" onClick={closeSettings}>Close</button> <button className="apply" onClick={() => { getAllLocalStorageItems(); closeSettings(); }}> Apply </button> </div> </div> </div> </div> ); }; export default Settings;