interstellar_ai/app/components/Settings.tsx

433 lines
19 KiB
TypeScript
Raw Normal View History

2024-09-23 11:55:58 +02:00
import React, { useState, useEffect } from 'react';
2024-09-20 10:00:54 +02:00
const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = ({ closeSettings, accountName }) => {
const [activeSection, setActiveSection] = useState('general');
2024-09-23 11:55:58 +02:00
// Theme settings state
const [backgroundColor, setBackgroundColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--background-color').trim());
const [textColor, setTextColor] = useState<string>(getComputedStyle(document.documentElement).getPropertyValue('--text-color').trim());
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());
// General settings state
const [preferredLanguage, setPreferredLanguage] = useState<string>('English');
const [preferredCurrency, setPreferredCurrency] = useState<string>('USD');
const [dateFormat, setDateFormat] = useState<string>('MM/DD/YYYY');
const [timeFormat, setTimeFormat] = useState<string>('12-hour');
const [timeZone, setTimeZone] = useState<string>('UTC');
// Privacy settings state
const [disableOnlineAI, setDisableOnlineAI] = useState<boolean>(false);
const [disableChatHistory, setDisableChatHistory] = useState<boolean>(false);
const [disableAIMemory, setDisableAIMemory] = useState<boolean>(false);
// FOSS settings state
const [openSourceMode, setOpenSourceMode] = useState<boolean>(false);
// Account settings state
const [newName, setNewName] = useState<string>('');
const [newEmail, setNewEmail] = useState<string>('');
const [newPassword, setNewPassword] = useState<string>('');
// Effect to update CSS variables on theme state change
useEffect(() => {
document.documentElement.style.setProperty('--background-color', backgroundColor);
document.documentElement.style.setProperty('--text-color', textColor);
document.documentElement.style.setProperty('--input-background-color', inputBackgroundColor);
document.documentElement.style.setProperty('--input-button-color', inputButtonColor);
document.documentElement.style.setProperty('--input-button-hover-color', inputButtonHoverColor);
document.documentElement.style.setProperty('--user-message-background-color', userMessageBackgroundColor);
document.documentElement.style.setProperty('--user-message-text-color', userMessageTextColor);
document.documentElement.style.setProperty('--ai-message-background-color', aiMessageBackgroundColor);
document.documentElement.style.setProperty('--ai-message-text-color', aiMessageTextColor);
document.documentElement.style.setProperty('--button-background-color', buttonBackgroundColor);
document.documentElement.style.setProperty('--button-hover-background-color', buttonHoverBackgroundColor);
document.documentElement.style.setProperty('--models-background-color', modelsBackgroundColor);
document.documentElement.style.setProperty('--history-background-color', historyBackgroundColor);
document.documentElement.style.setProperty('--left-panel-background-color', leftPanelBackgroundColor);
document.documentElement.style.setProperty('--conversation-background-color', conversationBackgroundColor);
document.documentElement.style.setProperty('--pop-up-text', popUpTextColor);
document.documentElement.style.setProperty('--input-border-color', inputBorderColor);
document.documentElement.style.setProperty('--font-family', fontFamily);
document.documentElement.style.setProperty('--font-size', fontSize);
}, [
backgroundColor,
textColor,
inputBackgroundColor,
inputButtonColor,
inputButtonHoverColor,
userMessageBackgroundColor,
userMessageTextColor,
aiMessageBackgroundColor,
aiMessageTextColor,
buttonBackgroundColor,
buttonHoverBackgroundColor,
modelsBackgroundColor,
historyBackgroundColor,
leftPanelBackgroundColor,
conversationBackgroundColor,
popUpTextColor,
inputBorderColor,
fontFamily,
fontSize
]);
2024-09-20 10:00:54 +02:00
const renderSettingsContent = () => {
switch (activeSection) {
case 'general':
return (
<div className="settings-section">
<h2>General Settings</h2>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>Preferred Language</label>
<input
type="text"
value={preferredLanguage}
onChange={(e) => setPreferredLanguage(e.target.value)}
/>
2024-09-20 10:00:54 +02:00
</div>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>Preferred Currency</label>
<input
type="text"
value={preferredCurrency}
onChange={(e) => setPreferredCurrency(e.target.value)}
/>
2024-09-20 10:00:54 +02:00
</div>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>Date Format</label>
<input
type="text"
value={dateFormat}
onChange={(e) => setDateFormat(e.target.value)}
/>
2024-09-20 10:00:54 +02:00
</div>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>Time Format</label>
<input
type="text"
value={timeFormat}
onChange={(e) => setTimeFormat(e.target.value)}
/>
2024-09-20 10:00:54 +02:00
</div>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>Time Zone</label>
<input
type="text"
value={timeZone}
onChange={(e) => setTimeZone(e.target.value)}
/>
2024-09-20 10:00:54 +02:00
</div>
</div>
);
2024-09-23 11:55:58 +02:00
2024-09-20 10:00:54 +02:00
case 'privacy':
return (
<div className="settings-section">
<h2>Privacy Settings</h2>
<div className="settings-option">
<label>
2024-09-23 11:55:58 +02:00
<input
type="checkbox"
checked={disableOnlineAI}
onChange={() => setDisableOnlineAI(!disableOnlineAI)}
/>
Disable Online AI
2024-09-20 10:00:54 +02:00
</label>
</div>
<div className="settings-option">
<label>
2024-09-23 11:55:58 +02:00
<input
type="checkbox"
checked={disableChatHistory}
onChange={() => setDisableChatHistory(!disableChatHistory)}
/>
Disable Chat History Save
2024-09-20 10:00:54 +02:00
</label>
</div>
<div className="settings-option">
<label>
2024-09-23 11:55:58 +02:00
<input
type="checkbox"
checked={disableAIMemory}
onChange={() => setDisableAIMemory(!disableAIMemory)}
/>
Disable AI Memory
2024-09-20 10:00:54 +02:00
</label>
</div>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<button onClick={() => {/* Export data logic */}}>Export My Data</button>
2024-09-20 10:00:54 +02:00
</div>
</div>
);
2024-09-23 11:55:58 +02:00
case 'theme':
return (
<div className="settings-section">
<h2>Theme Settings</h2>
<div className="settings-option">
2024-09-20 10:00:54 +02:00
<p>Font Size</p>
2024-09-23 11:55:58 +02:00
<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); // Update the CSS variable
}}
/>
<span>{fontSize}</span>
</div>
<div className="settings-option">
<p>Background Color</p>
<input
type="color"
value={backgroundColor}
onChange={(e) => setBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Text Color</p>
<input
type="color"
value={textColor}
onChange={(e) => setTextColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Input Background Color</p>
<input
type="color"
value={inputBackgroundColor}
onChange={(e) => setInputBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Input Button Color</p>
<input
type="color"
value={inputButtonColor}
onChange={(e) => setInputButtonColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Input Button Hover Color</p>
<input
type="color"
value={inputButtonHoverColor}
onChange={(e) => setInputButtonHoverColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>User Message Background Color</p>
<input
type="color"
value={userMessageBackgroundColor}
onChange={(e) => setUserMessageBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>User Message Text Color</p>
<input
type="color"
value={userMessageTextColor}
onChange={(e) => setUserMessageTextColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>AI Message Background Color</p>
<input
type="color"
value={aiMessageBackgroundColor}
onChange={(e) => setAiMessageBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>AI Message Text Color</p>
<input
type="color"
value={aiMessageTextColor}
onChange={(e) => setAiMessageTextColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Button Background Color</p>
<input
type="color"
value={buttonBackgroundColor}
onChange={(e) => setButtonBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Button Hover Background Color</p>
<input
type="color"
value={buttonHoverBackgroundColor}
onChange={(e) => setButtonHoverBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Models Background Color</p>
<input
type="color"
value={modelsBackgroundColor}
onChange={(e) => setModelsBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>History Background Color</p>
<input
type="color"
value={historyBackgroundColor}
onChange={(e) => setHistoryBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Left Panel Background Color</p>
<input
type="color"
value={leftPanelBackgroundColor}
onChange={(e) => setLeftPanelBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Conversation Background Color</p>
<input
type="color"
value={conversationBackgroundColor}
onChange={(e) => setConversationBackgroundColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Pop-up Text Color</p>
<input
type="color"
value={popUpTextColor}
onChange={(e) => setPopUpTextColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Input Border Color</p>
<input
type="color"
value={inputBorderColor}
onChange={(e) => setInputBorderColor(e.target.value)}
/>
</div>
<div className="settings-option">
<p>Font Family</p>
<select
value={fontFamily}
onChange={(e) => setFontFamily(e.target.value)}
>
<option value="'Arial', sans-serif">Arial</option>
<option value="'Calibri', sans-serif">Calibri</option>
<option value="'Helvetica', sans-serif">Helvetica</option>
<option value="'Times New Roman', serif">Times New Roman</option>
<option value="'Poppins', sans-serif">Poppins</option>
</select>
</div>
2024-09-20 10:00:54 +02:00
</div>
2024-09-23 11:55:58 +02:00
);
case 'foss':
return (
<div className="settings-section">
<h2>FOSS Settings</h2>
2024-09-20 10:00:54 +02:00
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>
<input
type="checkbox"
checked={openSourceMode}
onChange={() => setOpenSourceMode(!openSourceMode)}
/>
Enable Open Source Mode
</label>
<p>(ONLY OPEN SOURCE MODULES WORK IN THERE)</p>
2024-09-20 10:00:54 +02:00
</div>
</div>
);
2024-09-23 11:55:58 +02:00
2024-09-20 10:00:54 +02:00
case 'account':
return (
<div className="settings-section">
<h2>Account Settings</h2>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>Change Name</label>
<input
type="text"
value={newName}
onChange={(e) => setNewName(e.target.value)}
/>
2024-09-20 10:00:54 +02:00
</div>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>Change Email</label>
<input
type="email"
value={newEmail}
onChange={(e) => setNewEmail(e.target.value)}
/>
2024-09-20 10:00:54 +02:00
</div>
<div className="settings-option">
2024-09-23 11:55:58 +02:00
<label>Change Password</label>
<input
type="password"
value={newPassword}
onChange={(e) => setNewPassword(e.target.value)}
/>
2024-09-20 10:00:54 +02:00
</div>
2024-09-23 11:55:58 +02:00
<div className="danger-zone">
<h3>DANGER ZONE</h3>
<button onClick={() => {/* Delete account logic */}}>Delete Account</button>
2024-09-20 10:00:54 +02:00
</div>
</div>
);
2024-09-23 11:55:58 +02:00
2024-09-20 10:00:54 +02:00
default:
return null;
}
};
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>
2024-09-23 11:55:58 +02:00
<li onClick={() => setActiveSection('foss')}>FOSS</li>
2024-09-20 10:00:54 +02:00
<li onClick={() => setActiveSection('account')}>Account</li>
</ul>
</div>
<div className="settings-main">
<h2>Settings for {accountName}</h2>
{renderSettingsContent()}
<button className="close-popup" onClick={closeSettings}>Close</button>
</div>
</div>
</div>
</div>
);
};
2024-09-23 11:55:58 +02:00
export default Settings;