Merge pull request 'Settings' (#41) from sageTheDm/interstellar_ai:main into main
Reviewed-on: https://interstellardevelopment.org/code/code/React-Group/interstellar_ai/pulls/41
This commit is contained in:
commit
71bfbc9ebb
1 changed files with 218 additions and 45 deletions
|
@ -1,51 +1,224 @@
|
||||||
import React, { useState } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { exportSettings, importSettings } from './settingUtils'; // Import utility functions
|
import { exportSettings, importSettings } from './settingUtils'; // Import utility functions
|
||||||
|
|
||||||
const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = ({ closeSettings, accountName }) => {
|
const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = ({ closeSettings, accountName }) => {
|
||||||
const [activeSection, setActiveSection] = useState('general');
|
|
||||||
const [preferredLanguage, setPreferredLanguage] = useState('en');
|
|
||||||
const [preferredCurrency, setPreferredCurrency] = useState('usd');
|
|
||||||
const [dateFormat, setDateFormat] = useState('mm/dd/yyyy');
|
|
||||||
const [timeFormat, setTimeFormat] = useState('12-hour');
|
|
||||||
const [timeZone, setTimeZone] = useState('GMT');
|
|
||||||
const [disableOnlineAI, setDisableOnlineAI] = useState(false);
|
|
||||||
const [disableChatHistory, setDisableChatHistory] = useState(false);
|
|
||||||
const [disableAIMemory, setDisableAIMemory] = useState(false);
|
|
||||||
const [openSourceMode, setOpenSourceMode] = useState(false);
|
|
||||||
const [newName, setNewName] = useState('');
|
|
||||||
const [newEmail, setNewEmail] = useState('');
|
|
||||||
const [newPassword, setNewPassword] = useState('');
|
|
||||||
const [preferredMessurement, setPreferredMessurement] = useState('Metric');
|
|
||||||
|
|
||||||
// Theme settings state
|
const getItemFromLocalStorage = (key: string) => {
|
||||||
const [backgroundColor, setBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--background-color').trim());
|
const item = localStorage.getItem(key);
|
||||||
const [textColor, setTextColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--text-color').trim());
|
return item ? JSON.parse(item) : false; // Default to false if item is null
|
||||||
const [inputBackgroundColor, setInputBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--input-background-color').trim());
|
};
|
||||||
const [inputButtonColor, setInputButtonColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--input-button-color').trim());
|
|
||||||
const [inputButtonHoverColor, setInputButtonHoverColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--input-button-hover-color').trim());
|
|
||||||
const [userMessageBackgroundColor, setUserMessageBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--user-message-background-color').trim());
|
|
||||||
const [userMessageTextColor, setUserMessageTextColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--user-message-text-color').trim());
|
|
||||||
const [aiMessageBackgroundColor, setAiMessageBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--ai-message-background-color').trim());
|
|
||||||
const [aiMessageTextColor, setAiMessageTextColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--ai-message-text-color').trim());
|
|
||||||
const [buttonBackgroundColor, setButtonBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--button-background-color').trim());
|
|
||||||
const [buttonHoverBackgroundColor, setButtonHoverBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--button-hover-background-color').trim());
|
|
||||||
const [modelsBackgroundColor, setModelsBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--models-background-color').trim());
|
|
||||||
const [historyBackgroundColor, setHistoryBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--history-background-color').trim());
|
|
||||||
const [leftPanelBackgroundColor, setLeftPanelBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--left-panel-background-color').trim());
|
|
||||||
const [conversationBackgroundColor, setConversationBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--conversation-background-color').trim());
|
|
||||||
const [popUpTextColor, setPopUpTextColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--pop-up-text').trim());
|
|
||||||
const [inputBorderColor, setInputBorderColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--input-border-color').trim());
|
|
||||||
const [fontFamily, setFontFamily] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--font-family').trim());
|
|
||||||
const [fontSize, setFontSize] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--font-size').trim());
|
|
||||||
|
|
||||||
// Theme selection
|
// Active section
|
||||||
const [selectedTheme, setSelectedTheme] = useState<string>('default');
|
const [activeSection, setActiveSection] = useState(() => localStorage.getItem('activeSection') || 'general');
|
||||||
|
|
||||||
// API Keys
|
// Language setting
|
||||||
const [laPlateforme, setLaPlateforme] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--online-la-plateforme').trim());
|
const [preferredLanguage, setPreferredLanguage] = useState(() => localStorage.getItem('preferredLanguage') || 'en');
|
||||||
const [openAI, setOpenAI] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-openai').trim());
|
|
||||||
const [anthropic, setAnthropic] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-anthropic').trim());
|
// Currency setting
|
||||||
const [google, setGoogle] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--online-cheap-google').trim());
|
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 [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());
|
||||||
|
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());
|
||||||
|
|
||||||
|
// 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]);
|
||||||
|
|
||||||
|
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
|
// Apply imported settings to the CSS variables
|
||||||
const applySettings = (settings: any) => {
|
const applySettings = (settings: any) => {
|
||||||
|
@ -241,8 +414,8 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
<div className="settings-option">
|
<div className="settings-option">
|
||||||
<label>Preferred Measurement</label>
|
<label>Preferred Measurement</label>
|
||||||
<select
|
<select
|
||||||
value={preferredMessurement}
|
value={preferredMeasurement}
|
||||||
onChange={(e) => setPreferredMessurement(e.target.value)}
|
onChange={(e) => setPreferredMeasurement(e.target.value)}
|
||||||
>
|
>
|
||||||
<option value="Metric">Metric</option>
|
<option value="Metric">Metric</option>
|
||||||
<option value="Imperial">Imperial</option>
|
<option value="Imperial">Imperial</option>
|
||||||
|
@ -810,7 +983,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
|
||||||
fontSize,
|
fontSize,
|
||||||
preferredLanguage,
|
preferredLanguage,
|
||||||
preferredCurrency,
|
preferredCurrency,
|
||||||
preferredMessurement,
|
preferredMeasurement,
|
||||||
dateFormat,
|
dateFormat,
|
||||||
timeFormat,
|
timeFormat,
|
||||||
timeZone,
|
timeZone,
|
||||||
|
|
Loading…
Reference in a new issue