Compare commits

...

2 commits

Author SHA1 Message Date
ddaf7638ac settings 2024-09-26 09:45:31 +02:00
a05b9d6a5f Trying to fix the settings 2024-09-26 09:29:04 +02:00
10 changed files with 230 additions and 199 deletions

View file

@ -1,23 +1,37 @@
import React, { useState, useEffect } from 'react';
const Models: React.FC = () => {
const modelOptions = [
'Offline Fast',
'Offline Fast (FOSS)',
'Offline Slow',
'Offline Slow (FOSS)',
'Online (La Plateforme)',
'Online (FOSS) (La Plateforme)',
'Online Cheap (OpenAI)',
'Online Expensive (OpenAI)',
'Online Cheap (Anthropic)',
'Online Expensive (Anthropic)',
'Online Cheap (Google)',
'Online Expensive (Google)',
];
// Define the available model options
const offlineModels = [
'Offline Fast',
'Offline Fast (FOSS)',
'Offline Slow',
'Offline Slow (FOSS)',
];
const onlineModels = [
'Online (La Plateforme)',
'Online (FOSS) (La Plateforme)',
'Online Cheap (OpenAI)',
'Online Expensive (OpenAI)',
'Online Cheap (Anthropic)',
'Online Expensive (Anthropic)',
'Online Cheap (Google)',
'Online Expensive (Google)',
];
const fossModels = [
'Offline Fast (FOSS)',
'Offline Slow (FOSS)',
'Online (FOSS) (La Plateforme)',
];
// Define the properties passed to the Models component
interface ModelsProps {
selectedOption: string; // Privacy setting: "Offline", "AI Online", "None"
}
const Models: React.FC<ModelsProps> = ({ selectedOption }) => {
const [selectedModel, setSelectedModel] = useState<string>(() => {
// Load the selected model from localStorage on initial render
return localStorage.getItem('selectedModel') || 'Offline Fast';
});
@ -26,31 +40,45 @@ const Models: React.FC = () => {
setSelectedModel(newModel);
};
const isOfflineModel = (model: string) => {
return model.includes('Offline');
};
const isOfflineModel = (model: string) => offlineModels.includes(model);
const isOnlineModel = (model: string) => onlineModels.includes(model);
const isFossModel = (model: string) => fossModels.includes(model);
// Save selected model to localStorage whenever it changes
useEffect(() => {
localStorage.setItem('selectedModel', selectedModel);
}, [selectedModel]);
const filteredModels = (() => {
switch (selectedOption) {
case 'Offline':
return offlineModels; // Show only offline models
case 'AI Online':
return onlineModels; // Show only online models
default:
return [...offlineModels, ...onlineModels]; // Show all models
}
})();
return (
<div className="model-background">
<div className="models">
<div className="titel">
<h1>Different AI models</h1>
<div className="title">
<h3>Different AI models</h3>
</div>
{/* Model Selection Dropdown */}
<div className="model-dropdown">
<label htmlFor="model-select">Select AI Model:</label>
<select id="model-select" value={selectedModel} onChange={handleModelChange}>
{modelOptions.map((model) => (
{filteredModels.map((model) => (
<option key={model} value={model}>
{model}
</option>
))}
</select>
</div>
{/* Model Grid with Cards */}
<div className="grid">
<button className="code-model model-box">
<div className="overlay">

View file

@ -6,7 +6,17 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
const getItemFromLocalStorage = (key: string) => {
const item = localStorage.getItem(key);
return item ? JSON.parse(item) : false; // Default to false if item is null
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
};
// Active section
@ -14,30 +24,29 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
// 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
// State declarations
const [disableOnlineAI, setDisableOnlineAI] = useState(() => getItemFromLocalStorage('disableOnlineAI'));
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') || '');
// 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());
@ -58,174 +67,124 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
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 [burgerMenu, setBurgerMenu] = useState(() => getComputedStyle(document.documentElement).getPropertyValue('--burger-menu-background-color').trim());
// Theme selection
const [selectedTheme, setSelectedTheme] = useState(() => localStorage.getItem('selectedTheme') || 'default');
// API Keys
const [laPlateforme, setLaPlateforme] = 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());
// Effect hooks to update localStorage whenever any state changes
useEffect(() => {
localStorage.setItem('activeSection', activeSection);
}, [activeSection]);
useEffect(() => {
localStorage.setItem('preferredLanguage', preferredLanguage);
}, [preferredLanguage]);
useEffect(() => {
localStorage.setItem('preferredCurrency', preferredCurrency);
}, [preferredCurrency]);
useEffect(() => {
localStorage.setItem('dateFormat', dateFormat);
}, [dateFormat]);
useEffect(() => {
localStorage.setItem('timeFormat', timeFormat);
}, [timeFormat]);
useEffect(() => {
localStorage.setItem('timeZone', timeZone);
}, [timeZone]);
useEffect(() => {
localStorage.setItem('disableOnlineAI', JSON.stringify(disableOnlineAI));
}, [disableOnlineAI]);
useEffect(() => {
localStorage.setItem('disableChatHistory', JSON.stringify(disableChatHistory));
}, [disableChatHistory]);
useEffect(() => {
localStorage.setItem('disableAIMemory', JSON.stringify(disableAIMemory));
}, [disableAIMemory]);
useEffect(() => {
localStorage.setItem('openSourceMode', JSON.stringify(openSourceMode));
}, [openSourceMode]);
useEffect(() => {
localStorage.setItem('newName', newName);
}, [newName]);
useEffect(() => {
localStorage.setItem('newEmail', newEmail);
}, [newEmail]);
useEffect(() => {
localStorage.setItem('newPassword', newPassword);
}, [newPassword]);
useEffect(() => {
localStorage.setItem('preferredMeasurement', preferredMeasurement);
}, [preferredMeasurement]);
useEffect(() => {
localStorage.setItem('backgroundColor', backgroundColor);
}, [backgroundColor]);
useEffect(() => {
localStorage.setItem('textColor', textColor);
}, [textColor]);
useEffect(() => {
localStorage.setItem('inputBackgroundColor', inputBackgroundColor);
}, [inputBackgroundColor]);
useEffect(() => {
localStorage.setItem('inputButtonColor', inputButtonColor);
}, [inputButtonColor]);
useEffect(() => {
localStorage.setItem('inputButtonHoverColor', inputButtonHoverColor);
}, [inputButtonHoverColor]);
useEffect(() => {
localStorage.setItem('userMessageBackgroundColor', userMessageBackgroundColor);
}, [userMessageBackgroundColor]);
useEffect(() => {
localStorage.setItem('userMessageTextColor', userMessageTextColor);
}, [userMessageTextColor]);
useEffect(() => {
localStorage.setItem('aiMessageBackgroundColor', aiMessageBackgroundColor);
}, [aiMessageBackgroundColor]);
useEffect(() => {
localStorage.setItem('aiMessageTextColor', aiMessageTextColor);
}, [aiMessageTextColor]);
useEffect(() => {
localStorage.setItem('buttonBackgroundColor', buttonBackgroundColor);
}, [buttonBackgroundColor]);
useEffect(() => {
localStorage.setItem('buttonHoverBackgroundColor', buttonHoverBackgroundColor);
}, [buttonHoverBackgroundColor]);
useEffect(() => {
localStorage.setItem('modelsBackgroundColor', modelsBackgroundColor);
}, [modelsBackgroundColor]);
useEffect(() => {
localStorage.setItem('historyBackgroundColor', historyBackgroundColor);
}, [historyBackgroundColor]);
useEffect(() => {
localStorage.setItem('leftPanelBackgroundColor', leftPanelBackgroundColor);
}, [leftPanelBackgroundColor]);
useEffect(() => {
localStorage.setItem('conversationBackgroundColor', conversationBackgroundColor);
}, [conversationBackgroundColor]);
useEffect(() => {
localStorage.setItem('popUpTextColor', popUpTextColor);
}, [popUpTextColor]);
useEffect(() => {
localStorage.setItem('inputBorderColor', inputBorderColor);
}, [inputBorderColor]);
useEffect(() => {
localStorage.setItem('fontFamily', fontFamily);
}, [fontFamily]);
useEffect(() => {
localStorage.setItem('fontSize', fontSize);
}, [fontSize]);
const settings = {
activeSection,
preferredLanguage,
preferredCurrency,
dateFormat,
timeFormat,
timeZone,
selectedOption,
disableChatHistory,
disableAIMemory,
openSourceMode,
newName,
newEmail,
newPassword,
preferredMeasurement,
backgroundColor,
textColor,
inputBackgroundColor,
inputButtonColor,
inputButtonHoverColor,
userMessageBackgroundColor,
userMessageTextColor,
aiMessageBackgroundColor,
aiMessageTextColor,
buttonBackgroundColor,
buttonHoverBackgroundColor,
modelsBackgroundColor,
historyBackgroundColor,
leftPanelBackgroundColor,
conversationBackgroundColor,
popUpTextColor,
inputBorderColor,
fontFamily,
fontSize,
burgerMenu,
selectedTheme,
laPlateforme,
openAI,
anthropic,
google,
};
// Update local storage
for (const [key, value] of Object.entries(settings)) {
if (typeof value === 'boolean') {
localStorage.setItem(key, JSON.stringify(value));
} else {
localStorage.setItem(key, value);
}
}
}, [
activeSection,
preferredLanguage,
preferredCurrency,
dateFormat,
timeFormat,
timeZone,
selectedOption,
disableChatHistory,
disableAIMemory,
openSourceMode,
newName,
newEmail,
newPassword,
preferredMeasurement,
backgroundColor,
textColor,
inputBackgroundColor,
inputButtonColor,
inputButtonHoverColor,
userMessageBackgroundColor,
userMessageTextColor,
aiMessageBackgroundColor,
aiMessageTextColor,
buttonBackgroundColor,
buttonHoverBackgroundColor,
modelsBackgroundColor,
historyBackgroundColor,
leftPanelBackgroundColor,
conversationBackgroundColor,
popUpTextColor,
inputBorderColor,
fontFamily,
fontSize,
burgerMenu,
selectedTheme,
laPlateforme,
openAI,
anthropic,
google,
]);
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
localStorage.setItem('radioSelection', newValue); // Save the selection for persistence
};
useEffect(() => {
localStorage.setItem('burgerMenu', burgerMenu);
}, [fontSize]);
useEffect(() => {
localStorage.setItem('selectedTheme', selectedTheme);
}, [selectedTheme]);
useEffect(() => {
localStorage.setItem('laPlateforme', laPlateforme);
}, [laPlateforme]);
useEffect(() => {
localStorage.setItem('openAI', openAI);
}, [openAI]);
useEffect(() => {
localStorage.setItem('anthropic', anthropic);
}, [anthropic]);
useEffect(() => {
localStorage.setItem('google', google);
}, [google]);
// Apply imported settings to the CSS variables
const applySettings = (settings: any) => {
if (settings.backgroundColor) {
@ -439,16 +398,33 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
return (
<div className="settings-section">
<h2>Privacy Settings</h2>
{/* AI Mode Radio Options */}
<div className="settings-option">
<label>
<input
type="checkbox"
checked={disableOnlineAI}
onChange={() => setDisableOnlineAI(!disableOnlineAI)}
/>
Disable Online AI
</label>
<p>Disable Options:</p>
<div className="slider">
<div
className={`slider-option ${selectedOption === 'Offline' ? 'active' : ''}`}
onClick={() => handleRadioChange('Offline')} // Handle selection
>
Offline tools
</div>
<div
className={`slider-option ${selectedOption === 'AI Online' ? 'active' : ''}`}
onClick={() => handleRadioChange('AI Online')}
>
Online tools
</div>
<div
className={`slider-option ${selectedOption === 'None' ? 'active' : ''}`}
onClick={() => handleRadioChange('None')}
>
None
</div>
</div>
</div>
{/* Disable Chat History Checkbox */}
<div className="settings-option">
<label>
<input
@ -459,6 +435,8 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
Disable Chat History
</label>
</div>
{/* Disable AI Memory Checkbox */}
<div className="settings-option">
<label>
<input
@ -941,7 +919,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
dateFormat,
timeFormat,
timeZone,
disableOnlineAI,
selectedOption,
disableChatHistory,
disableAIMemory,
openSourceMode,

View file

@ -159,4 +159,29 @@
background-color: var(--button-hover-background-color);
padding: 10px;
margin: 10px;
}
}
.slider {
display: flex;
justify-content: space-between;
margin-top: 10px;
}
.slider-option {
cursor: pointer;
padding: 10px;
border: 1px solid #ccc;
border-radius: 5px;
transition: background-color 0.3s;
}
.slider-option.active {
background-color: #007bff; /* Change to your active color */
color: white;
border-color: #007bff;
}
input[type="radio"] {
display: none; /* Hide the default radio buttons */
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 555 KiB

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB