ahhhhhhhhhhhh #92
					 4 changed files with 153 additions and 125 deletions
				
			
		|  | @ -23,7 +23,7 @@ const InputOutputBackend: React.FC = () => { | ||||||
|   const [timeZone, setTimeZone] = useState<string>("GMT"); |   const [timeZone, setTimeZone] = useState<string>("GMT"); | ||||||
|   const [dateFormat, setDateFormat] = useState<string>("DD-MM-YYYY"); |   const [dateFormat, setDateFormat] = useState<string>("DD-MM-YYYY"); | ||||||
|   const [messages, setMessages] = useState<Message[]>([]); |   const [messages, setMessages] = useState<Message[]>([]); | ||||||
|   const [myBoolean, setMyBoolean] = useState<boolean>(() => localStorage.getItem('myBoolean') === 'true'); |   const [myBoolean, setMyBoolean] = useState<boolean>(() => localStorage.getItem('myBoolean') === 'true') || false; | ||||||
| 
 | 
 | ||||||
|   // Fetch local storage values and update state on component mount
 |   // Fetch local storage values and update state on component mount
 | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|  | @ -50,7 +50,6 @@ const InputOutputBackend: React.FC = () => { | ||||||
|       You are only able to change language if the user specifically states you must.  |       You are only able to change language if the user specifically states you must.  | ||||||
|       Do not answer in multiple languages or multiple measurement systems under any circumstances other than the user requesting it.` |       Do not answer in multiple languages or multiple measurement systems under any circumstances other than the user requesting it.` | ||||||
|       : "You are a helpful assistant"; |       : "You are a helpful assistant"; | ||||||
| 
 |  | ||||||
|     setMessages([ |     setMessages([ | ||||||
|       { role: "system", content: systemMessage }, |       { role: "system", content: systemMessage }, | ||||||
|       { role: "assistant", content: "Hello! How may I help you?" }, |       { role: "assistant", content: "Hello! How may I help you?" }, | ||||||
|  |  | ||||||
|  | @ -655,35 +655,51 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = ( | ||||||
|           <h2>Import & Export</h2> |           <h2>Import & Export</h2> | ||||||
|           <div className="settings-option"> |           <div className="settings-option"> | ||||||
|             <h3>Export the settings</h3> |             <h3>Export the settings</h3> | ||||||
|               <button onClick={() => exportSettings(currentSettings)} className='export-button'>Export Settings</button> |             <button onClick={handleExport} className="export-button"> | ||||||
|  |               Export Settings | ||||||
|  |             </button> | ||||||
|           </div> |           </div> | ||||||
|           <div className="settings-option"> |           <div className="settings-option"> | ||||||
|             <h3>Import the settings</h3> |             <h3>Import the settings</h3> | ||||||
|               <input type="file" onChange={handleImport} accept=".json" className='import-file' /> |             <input | ||||||
|  |               type="file" | ||||||
|  |               onChange={handleImport} | ||||||
|  |               accept=".json" | ||||||
|  |               className="import-file" | ||||||
|  |             /> | ||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|       ); |       ); | ||||||
| 
 |  | ||||||
|       default: |       default: | ||||||
|         return null; |         return null; | ||||||
|     } |     } | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   // Handle file import
 |  | ||||||
|   const handleImport = (event: React.ChangeEvent<HTMLInputElement>) => { |   const handleImport = (event: React.ChangeEvent<HTMLInputElement>) => { | ||||||
|     if (event.target.files && event.target.files.length > 0) { |     const file = event.target.files?.[0]; | ||||||
|       const file = event.target.files[0]; |     if (file) { | ||||||
|       importSettings(file, applyCustomTheme); |       const reader = new FileReader(); | ||||||
|  |       reader.onload = (e) => { | ||||||
|  |         const fileContent = e.target?.result as string; | ||||||
|  |         importSettings(fileContent); // Call the importSettings function with the file content
 | ||||||
|  |       }; | ||||||
|  |       reader.readAsText(file); | ||||||
|     } |     } | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   const currentSettings = { |   const handleExport = () => { | ||||||
|     ...settings.userPreferences, |     const settingsData = exportSettings(); | ||||||
|     ...settings.theme, | 
 | ||||||
|     ...settings.theme.faqSettings, |     // Create a blob and download the exported settings
 | ||||||
|     ...settings.theme.popupSettings, |     const blob = new Blob([settingsData], { type: 'application/json' }); | ||||||
|     ...settings.apiKeys, |     const url = URL.createObjectURL(blob); | ||||||
|     ...settings.generalSettings, |     const a = document.createElement('a'); | ||||||
|  |     a.href = url; | ||||||
|  |     a.download = 'settings.json'; | ||||||
|  |     document.body.appendChild(a); | ||||||
|  |     a.click(); | ||||||
|  |     document.body.removeChild(a); | ||||||
|  |     URL.revokeObjectURL(url); // Clean up the URL object
 | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|  |  | ||||||
|  | @ -1,23 +1,36 @@ | ||||||
| // settingsUtils.ts
 | // settingsManager.ts
 | ||||||
| 
 | 
 | ||||||
| // Export the current settings as a JSON file
 | // Method to export localStorage to a JSON object
 | ||||||
| export const exportSettings = (settings: any) => { | export function exportSettings(): string { | ||||||
|     const blob = new Blob([JSON.stringify(settings)], { type: 'application/json' }); |   const settings: { [key: string]: any } = {}; | ||||||
|     const link = document.createElement('a'); |  | ||||||
|     link.href = URL.createObjectURL(blob); |  | ||||||
|     link.download = 'settings.json'; |  | ||||||
|     link.click(); |  | ||||||
|   }; |  | ||||||
| 
 | 
 | ||||||
|   // Import settings from a JSON file
 |   // Loop through all keys in localStorage and add them to the settings object
 | ||||||
|   export const importSettings = (file: File, applySettings: (settings: any) => void) => { |   for (let i = 0; i < localStorage.length; i++) { | ||||||
|     const reader = new FileReader(); |       const key = localStorage.key(i); | ||||||
|     reader.onload = (e) => { |       if (key) { | ||||||
|       const content = e.target?.result as string; |           settings[key] = localStorage.getItem(key); | ||||||
|       const importedSettings = JSON.parse(content); |       } | ||||||
|       applySettings(importedSettings); |   } | ||||||
|     }; |  | ||||||
|     reader.readAsText(file); |  | ||||||
|   }; |  | ||||||
| 
 | 
 | ||||||
|  |   // Convert settings object to JSON string
 | ||||||
|  |   return JSON.stringify(settings, null, 2); | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | // Method to import settings from a JSON object, clearing old localStorage
 | ||||||
|  | export function importSettings(jsonData: string): void { | ||||||
|  |   try { | ||||||
|  |       const parsedSettings = JSON.parse(jsonData); | ||||||
|  | 
 | ||||||
|  |       // Clear the current localStorage
 | ||||||
|  |       localStorage.clear(); | ||||||
|  | 
 | ||||||
|  |       // Loop through parsed settings and save them in localStorage
 | ||||||
|  |       Object.keys(parsedSettings).forEach((key) => { | ||||||
|  |           localStorage.setItem(key, parsedSettings[key]); | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       console.log("Settings imported successfully!"); | ||||||
|  |   } catch (error) { | ||||||
|  |       console.error("Invalid JSON data:", error); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										30
									
								
								app/page.tsx
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								app/page.tsx
									
										
									
									
									
								
							|  | @ -7,35 +7,34 @@ import Documentation from './components/Documentation'; // Ensure the import pat | ||||||
| import History from './components/History'; | import History from './components/History'; | ||||||
| import Models from './components/Models'; | import Models from './components/Models'; | ||||||
| import Credits from './components/Credits'; | import Credits from './components/Credits'; | ||||||
| import { applyIOMarketTheme, applyWhiteTheme, applyBlackTheme, applyCustomTheme, applyBasicCustomTheme } from './components/settings/theme' | import { applyIOMarketTheme, applyWhiteTheme, applyBlackTheme, applyCustomTheme, applyBasicCustomTheme } from './components/settings/theme'; | ||||||
| import './styles/master.css'; | import './styles/master.css'; | ||||||
| 
 | 
 | ||||||
| const LandingPage: React.FC = () => { | const LandingPage: React.FC = () => { | ||||||
|   const [showDivs, setShowDivs] = useState(true); |   const [showDivs, setShowDivs] = useState(true); | ||||||
|   const [view, setView] = useState<'AI' | 'FAQ' | 'Documentation' | 'Credits'>('AI'); // Added 'Credits' here
 |   const [view, setView] = useState<'AI' | 'FAQ' | 'Documentation' | 'Credits'>('AI'); | ||||||
|   const conversationRef = useRef<HTMLDivElement>(null); |   const conversationRef = useRef<HTMLDivElement>(null); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|   const [primaryColor, setPrimaryColor] = useState(localStorage.getItem("primaryColor") || "#fefefe"); |   const [primaryColor, setPrimaryColor] = useState(localStorage.getItem("primaryColor") || "#fefefe"); | ||||||
|   const [secondaryColor, setSecondaryColor] = useState(localStorage.getItem("secondaryColor") || "#fefefe"); |   const [secondaryColor, setSecondaryColor] = useState(localStorage.getItem("secondaryColor") || "#fefefe"); | ||||||
|   const [accentColor, setAccentColor] = useState(localStorage.getItem("accentColor") || "#fefefe"); |   const [accentColor, setAccentColor] = useState(localStorage.getItem("accentColor") || "#fefefe"); | ||||||
|   const [basicBackgroundColor, setBasicBackgroundColor] = useState(localStorage.getItem("basicBackgroundColor") || "#fefefe"); |   const [basicBackgroundColor, setBasicBackgroundColor] = useState(localStorage.getItem("basicBackgroundColor") || "#fefefe"); | ||||||
|   const [basicTextColor, setBasicTextColor] = useState(localStorage.getItem("basicTextColor") || "#fefefe"); |   const [basicTextColor, setBasicTextColor] = useState(localStorage.getItem("basicTextColor") || "#fefefe"); | ||||||
| 
 | 
 | ||||||
|  |   // Synchronize state with local storage on mount
 | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     setPrimaryColor(localStorage.getItem("primaryColor") || "#fefefe") |     setPrimaryColor(localStorage.getItem("primaryColor") || "#fefefe"); | ||||||
|     setSecondaryColor(localStorage.getItem("secondaryColor") || "#fefefe") |     setSecondaryColor(localStorage.getItem("secondaryColor") || "#fefefe"); | ||||||
|     setAccentColor(localStorage.getItem("accentColor") || "#fefefe") |     setAccentColor(localStorage.getItem("accentColor") || "#fefefe"); | ||||||
|     setBasicBackgroundColor(localStorage.getItem("basicBackgroundColor") || "#fefefe") |     setBasicBackgroundColor(localStorage.getItem("basicBackgroundColor") || "#fefefe"); | ||||||
|     setBasicTextColor(localStorage.getItem("basicTextColor") || "#fefefe") |     setBasicTextColor(localStorage.getItem("basicTextColor") || "#fefefe"); | ||||||
|   }) |   }, []); | ||||||
|    |  | ||||||
| 
 | 
 | ||||||
|   const toggleDivs = () => { |   const toggleDivs = () => { | ||||||
|     setShowDivs(prevState => !prevState); |     setShowDivs(prevState => !prevState); | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   const handleViewChange = (view: 'AI' | 'FAQ' | 'Documentation' | 'Credits') => { // Added 'Credits' here as well
 |   const handleViewChange = (view: 'AI' | 'FAQ' | 'Documentation' | 'Credits') => { | ||||||
|     setView(view); |     setView(view); | ||||||
|     if (view !== 'AI') { |     if (view !== 'AI') { | ||||||
|       setShowDivs(false); |       setShowDivs(false); | ||||||
|  | @ -44,11 +43,11 @@ const LandingPage: React.FC = () => { | ||||||
| 
 | 
 | ||||||
|   const [selectedTheme, setSelectedTheme] = useState<string>(''); |   const [selectedTheme, setSelectedTheme] = useState<string>(''); | ||||||
| 
 | 
 | ||||||
|  |   // Apply theme based on selectedTheme and color settings
 | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     const savedTheme = localStorage.getItem('selectedTheme'); |     const savedTheme = localStorage.getItem('selectedTheme'); | ||||||
|     if (savedTheme) { |     if (savedTheme) { | ||||||
|       setSelectedTheme(savedTheme); |       setSelectedTheme(savedTheme); | ||||||
|         // Apply the saved theme on initial load
 |  | ||||||
|       switch (savedTheme) { |       switch (savedTheme) { | ||||||
|         case 'IOMARKET': |         case 'IOMARKET': | ||||||
|           applyIOMarketTheme(); |           applyIOMarketTheme(); | ||||||
|  | @ -76,7 +75,7 @@ const LandingPage: React.FC = () => { | ||||||
|           break; |           break; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     }, []); // Runs only once when the component mounts          
 |   }, [primaryColor, secondaryColor, accentColor, basicBackgroundColor, basicTextColor]); // Watch color states and apply themes accordingly
 | ||||||
| 
 | 
 | ||||||
|   return ( |   return ( | ||||||
|     <> |     <> | ||||||
|  | @ -85,7 +84,7 @@ const LandingPage: React.FC = () => { | ||||||
|         showDivs={showDivs} |         showDivs={showDivs} | ||||||
|         onViewChange={handleViewChange} |         onViewChange={handleViewChange} | ||||||
|         showHistoryModelsToggle={true} |         showHistoryModelsToggle={true} | ||||||
|           showToggle={view === 'AI'} // Pass the condition here
 |         showToggle={view === 'AI'} | ||||||
|       /> |       /> | ||||||
|       <div className="container"> |       <div className="container"> | ||||||
|         <div className={`left-panel ${showDivs ? 'visible' : 'hidden'}`}> |         <div className={`left-panel ${showDivs ? 'visible' : 'hidden'}`}> | ||||||
|  | @ -100,7 +99,7 @@ const LandingPage: React.FC = () => { | ||||||
|           {view === 'AI' && <AI />} |           {view === 'AI' && <AI />} | ||||||
|           {view === 'FAQ' && <FAQ />} |           {view === 'FAQ' && <FAQ />} | ||||||
|           {view === 'Documentation' && <Documentation />} |           {view === 'Documentation' && <Documentation />} | ||||||
|           {view === 'Credits' && <Credits />} {/* Now Credits will render properly */} |           {view === 'Credits' && <Credits />} | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|     </> |     </> | ||||||
|  | @ -108,3 +107,4 @@ const LandingPage: React.FC = () => { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export default LandingPage; | export default LandingPage; | ||||||
|  |    | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue