forked from React-Group/interstellar_ai
		
	Compare commits
	
		
			10 commits
		
	
	
		
			363a7d2fc3
			...
			219b301d62
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 219b301d62 | |||
| 
							 | 
						427a48a64d | ||
| 
							 | 
						70196beeff | ||
| 
							 | 
						f268a1b930 | ||
| 
							 | 
						57a4fe3edc | ||
| 
							 | 
						31918868a8 | ||
| 
							 | 
						a592cf0e18 | ||
| 1fbfa077cd | |||
| 
							 | 
						6435bfad8d | ||
| 5adb7ff56e | 
					 8 changed files with 164 additions and 81 deletions
				
			
		| 
						 | 
				
			
			@ -40,7 +40,8 @@ python3 api.py
 | 
			
		|||
```
 | 
			
		||||
3. In the main project folder, you will run:
 | 
			
		||||
```
 | 
			
		||||
npm run dev
 | 
			
		||||
npm run build
 | 
			
		||||
npm start
 | 
			
		||||
npx electron .
 | 
			
		||||
```
 | 
			
		||||
4. Open http://localhost:3000/ in your browser.
 | 
			
		||||
5. Enjoy!
 | 
			
		||||
4. Enjoy!
 | 
			
		||||
| 
						 | 
				
			
			@ -5,6 +5,7 @@ import {
 | 
			
		|||
  getSettings
 | 
			
		||||
} from '../backend/database';
 | 
			
		||||
import Settings from './settings/Settings'; // Import the Settings component
 | 
			
		||||
import { importDatabase } from './settings/settingUtils';
 | 
			
		||||
 | 
			
		||||
const Login: React.FC = () => {
 | 
			
		||||
  // State to handle popup visibility
 | 
			
		||||
| 
						 | 
				
			
			@ -23,9 +24,9 @@ const Login: React.FC = () => {
 | 
			
		|||
 | 
			
		||||
  // On component mount, check if there are credentials in localStorage
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    let savedAccountName:string|null;
 | 
			
		||||
    let savedAccountEmail:string|null;
 | 
			
		||||
    let savedAccountPassword:string|null;
 | 
			
		||||
    let savedAccountName: string | null;
 | 
			
		||||
    let savedAccountEmail: string | null;
 | 
			
		||||
    let savedAccountPassword: string | null;
 | 
			
		||||
    if (typeof localStorage !== 'undefined') {
 | 
			
		||||
      savedAccountName = localStorage.getItem('accountName');
 | 
			
		||||
      savedAccountEmail = localStorage.getItem('accountEmail');
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +41,14 @@ const Login: React.FC = () => {
 | 
			
		|||
          if (savedAccountName !== null && savedAccountPassword !== null) {
 | 
			
		||||
            const success = await checkCredentials(savedAccountName, savedAccountPassword);
 | 
			
		||||
            setIsLoggedIn(success); // Automatically log in
 | 
			
		||||
            const useName = localStorage.getItem("accountName");
 | 
			
		||||
            const usePassword = localStorage.getItem("accountPassword");
 | 
			
		||||
 | 
			
		||||
            if (useName && usePassword) {
 | 
			
		||||
              await importDatabase(useName, usePassword);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          }
 | 
			
		||||
        };
 | 
			
		||||
        check();
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +78,14 @@ const Login: React.FC = () => {
 | 
			
		|||
          }
 | 
			
		||||
        }
 | 
			
		||||
        setShowLoginPopup(false); // Close the login popup
 | 
			
		||||
        const useName = localStorage.getItem("accountName");
 | 
			
		||||
        const usePassword = localStorage.getItem("accountPassword");
 | 
			
		||||
 | 
			
		||||
        if (useName && usePassword) {
 | 
			
		||||
          await importDatabase(useName, usePassword);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        window.location.reload();
 | 
			
		||||
      } else {
 | 
			
		||||
        alert('Incorrect credentials');
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
//#region imports
 | 
			
		||||
import React, { useState, useEffect } from 'react';
 | 
			
		||||
import { applyTheme } from './theme';
 | 
			
		||||
import { exportSettings, importSettings } from './settingUtils'; // Import utility functions
 | 
			
		||||
import { exportSettings, importSettings, sendToDatabase, importDatabase } from './settingUtils'; // Import utility functions
 | 
			
		||||
import { getAllLocalStorageItems } from '../../backend/GetLocalStorage';
 | 
			
		||||
import ColorSetting from './ColorSettings';
 | 
			
		||||
import TextSettings from './TextSettings'
 | 
			
		||||
| 
						 | 
				
			
			@ -15,8 +15,6 @@ import {
 | 
			
		|||
  changeSettings,
 | 
			
		||||
  createAccount,
 | 
			
		||||
  deleteAccount,
 | 
			
		||||
  getSettings,
 | 
			
		||||
  sendToDatabase
 | 
			
		||||
} from '../../backend/database';
 | 
			
		||||
import ThemeDropdown from './DropDownTheme';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -314,27 +312,6 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
 | 
			
		|||
    }
 | 
			
		||||
  }, []); // Runs only once when the component mounts
 | 
			
		||||
 | 
			
		||||
  const importDatabase = async (useName: string, usePassword: string) => {
 | 
			
		||||
    const databaseSettings = await getSettings(useName, usePassword);
 | 
			
		||||
 | 
			
		||||
    // Ensure user settings exist before flattening and storing
 | 
			
		||||
    if (typeof databaseSettings == 'object' && databaseSettings) {
 | 
			
		||||
      JSON.stringify(importSettings(databaseSettings), null, 2); // Pass only the current user's settings
 | 
			
		||||
    } else {
 | 
			
		||||
      console.error('Database settings are not in the expected format.');
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const sendToDatabase = async () => {
 | 
			
		||||
    let useName = localStorage.getItem("accountName")
 | 
			
		||||
    let usePassword = localStorage.getItem("accountPassword")
 | 
			
		||||
    if (useName && usePassword) {
 | 
			
		||||
        if (await changeSettings(useName, usePassword, JSON.parse(exportSettings()))) {
 | 
			
		||||
          alert('Data has been transferred')
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // Effect hooks to update localStorage whenever any state changes
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    // Flatten nested objects
 | 
			
		||||
| 
						 | 
				
			
			@ -593,7 +570,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
 | 
			
		|||
            )}
 | 
			
		||||
          </div>
 | 
			
		||||
        );
 | 
			
		||||
        //#region custom --> foss
 | 
			
		||||
      //#region custom --> foss
 | 
			
		||||
      case 'foss':
 | 
			
		||||
        return (
 | 
			
		||||
          <div className="settings-section">
 | 
			
		||||
| 
						 | 
				
			
			@ -606,7 +583,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
 | 
			
		|||
          </div>
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        //#region account
 | 
			
		||||
      //#region account
 | 
			
		||||
      case 'account':
 | 
			
		||||
        return (
 | 
			
		||||
          <div className="settings-section">
 | 
			
		||||
| 
						 | 
				
			
			@ -649,7 +626,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
 | 
			
		|||
            />
 | 
			
		||||
          </div>
 | 
			
		||||
        );
 | 
			
		||||
        //#region api
 | 
			
		||||
      //#region api
 | 
			
		||||
      case 'api':
 | 
			
		||||
        return (
 | 
			
		||||
          <div className="settings-section">
 | 
			
		||||
| 
						 | 
				
			
			@ -703,7 +680,7 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
 | 
			
		|||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        );
 | 
			
		||||
        //#region import export
 | 
			
		||||
      //#region import export
 | 
			
		||||
      case 'im/export':
 | 
			
		||||
        return (
 | 
			
		||||
          <div className="settings-section">
 | 
			
		||||
| 
						 | 
				
			
			@ -759,52 +736,51 @@ const Settings: React.FC<{ closeSettings: () => void; accountName: string }> = (
 | 
			
		|||
  //#region overall export
 | 
			
		||||
  return (
 | 
			
		||||
    <div className="popup-overlay">
 | 
			
		||||
        <div className="settings-content">
 | 
			
		||||
            <div className="settings-container">
 | 
			
		||||
                {/* Sidebar for desktop */}
 | 
			
		||||
                <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-content">
 | 
			
		||||
        <div className="settings-container">
 | 
			
		||||
          {/* Sidebar for desktop */}
 | 
			
		||||
          <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">
 | 
			
		||||
                    {/* Dropdown for selections in responsive mode */}
 | 
			
		||||
                    <div className="settings-option dropdown">
 | 
			
		||||
                      <div className="dropdown-header"><h2>Select a Setting</h2></div>
 | 
			
		||||
                      <select onChange={(e) => setActiveSection(e.target.value)} value={activeSection}>
 | 
			
		||||
                          <option value="general">General</option>
 | 
			
		||||
                          <option value="privacy">Privacy</option>
 | 
			
		||||
                          <option value="theme">Theme</option>
 | 
			
		||||
                          <option value="foss">FOSS</option>
 | 
			
		||||
                          <option value="account">Account</option>
 | 
			
		||||
                          <option value="api">API Keys</option>
 | 
			
		||||
                          <option value="im/export">Import/Export</option>
 | 
			
		||||
                      </select>
 | 
			
		||||
                    </div>
 | 
			
		||||
                    <h2>Settings for {accountName}</h2>
 | 
			
		||||
                    {renderSettingsContent()}
 | 
			
		||||
                    <button className="close-popup" onClick={closeSettings}>Close</button>
 | 
			
		||||
                    <button className="apply" onClick={async () => {
 | 
			
		||||
                      getAllLocalStorageItems();
 | 
			
		||||
                      closeSettings();
 | 
			
		||||
                      sendToDatabase();
 | 
			
		||||
                      window.location.reload();
 | 
			
		||||
                    }}>
 | 
			
		||||
                      Apply
 | 
			
		||||
                    </button>
 | 
			
		||||
 | 
			
		||||
                </div>
 | 
			
		||||
          <div className="settings-main">
 | 
			
		||||
            {/* Dropdown for selections in responsive mode */}
 | 
			
		||||
            <div className="settings-option dropdown">
 | 
			
		||||
              <div className="dropdown-header"><h2>Select a Setting</h2></div>
 | 
			
		||||
              <select onChange={(e) => setActiveSection(e.target.value)} value={activeSection}>
 | 
			
		||||
                <option value="general">General</option>
 | 
			
		||||
                <option value="privacy">Privacy</option>
 | 
			
		||||
                <option value="theme">Theme</option>
 | 
			
		||||
                <option value="foss">FOSS</option>
 | 
			
		||||
                <option value="account">Account</option>
 | 
			
		||||
                <option value="api">API Keys</option>
 | 
			
		||||
                <option value="im/export">Import/Export</option>
 | 
			
		||||
              </select>
 | 
			
		||||
            </div>
 | 
			
		||||
            <h2>Settings for {accountName}</h2>
 | 
			
		||||
            {renderSettingsContent()}
 | 
			
		||||
            <button className="close-popup" onClick={closeSettings}>Close</button>
 | 
			
		||||
            <button className="apply" onClick={async () => {
 | 
			
		||||
              getAllLocalStorageItems();
 | 
			
		||||
              closeSettings();
 | 
			
		||||
              sendToDatabase();
 | 
			
		||||
            }}>
 | 
			
		||||
              Apply
 | 
			
		||||
            </button>
 | 
			
		||||
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
);
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
// settingsManager.ts
 | 
			
		||||
import { changeSettings, getSettings } from "@/app/backend/database";
 | 
			
		||||
 | 
			
		||||
// Method to export localStorage to a JSON object
 | 
			
		||||
export function exportSettings(): string {
 | 
			
		||||
| 
						 | 
				
			
			@ -37,3 +38,27 @@ export function importSettings(jsonData: string): void {
 | 
			
		|||
        console.error("Invalid JSON data:", error);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const sendToDatabase = async () => {
 | 
			
		||||
    let useName = localStorage.getItem("accountName")
 | 
			
		||||
    let usePassword = localStorage.getItem("accountPassword")
 | 
			
		||||
    if (useName && usePassword) {
 | 
			
		||||
        let result = await changeSettings(useName, usePassword, JSON.parse(exportSettings()))
 | 
			
		||||
        if (result == true) {
 | 
			
		||||
            alert('Data has been transferred')
 | 
			
		||||
            window.location.reload();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    window.location.reload();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const importDatabase = async (useName: string, usePassword: string) => {
 | 
			
		||||
    const databaseSettings = await getSettings(useName, usePassword);
 | 
			
		||||
 | 
			
		||||
    // Ensure user settings exist before flattening and storing
 | 
			
		||||
    if (typeof databaseSettings == 'object' && databaseSettings) {
 | 
			
		||||
        importSettings(JSON.stringify(databaseSettings, null, 2)); // Pass only the current user's settings
 | 
			
		||||
    } else {
 | 
			
		||||
        console.error('Database settings are not in the expected format.');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										22
									
								
								deployment_scripts/linux/prepare-free.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								deployment_scripts/linux/prepare-free.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
chmod +x root.sh
 | 
			
		||||
pkexec ./root.sh
 | 
			
		||||
npm install
 | 
			
		||||
npm run build
 | 
			
		||||
 | 
			
		||||
cd py
 | 
			
		||||
python3 -m venv venv
 | 
			
		||||
source venv/bin/activate
 | 
			
		||||
python3 -m pip install -r requirements.txt
 | 
			
		||||
 | 
			
		||||
ollama pull qwen2-math:1.5b
 | 
			
		||||
ollama pull starcoder2
 | 
			
		||||
ollama pull llama3.2
 | 
			
		||||
 | 
			
		||||
ollama pull wizard-math
 | 
			
		||||
ollama pull starcoder2:7b
 | 
			
		||||
ollama pull llama3.1
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
chmod +x run.sh
 | 
			
		||||
							
								
								
									
										22
									
								
								deployment_scripts/linux/prepare-nonfree.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								deployment_scripts/linux/prepare-nonfree.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
chmod +x root.sh
 | 
			
		||||
pkexec ./root.sh
 | 
			
		||||
npm install
 | 
			
		||||
npm run build
 | 
			
		||||
 | 
			
		||||
cd py
 | 
			
		||||
python3 -m venv venv
 | 
			
		||||
source venv/bin/activate
 | 
			
		||||
python3 -m pip install -r requirements.txt
 | 
			
		||||
 | 
			
		||||
ollama pull qwen2-math:1.5b
 | 
			
		||||
ollama pull qwen2.5-coder:1.5b
 | 
			
		||||
ollama pull phi3.5
 | 
			
		||||
 | 
			
		||||
ollama pull mathstral
 | 
			
		||||
ollama pull qwen2.5-coder
 | 
			
		||||
ollama pull qwen2.5
 | 
			
		||||
 | 
			
		||||
cd ..
 | 
			
		||||
chmod +x run.sh
 | 
			
		||||
							
								
								
									
										7
									
								
								deployment_scripts/linux/root.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								deployment_scripts/linux/root.sh
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
apt install npm nodejs python3-full -y
 | 
			
		||||
if ! ollama; then
 | 
			
		||||
    curl -fsSL https://ollama.com/install.sh | sh
 | 
			
		||||
fi
 | 
			
		||||
systemctl enable ollama --now
 | 
			
		||||
							
								
								
									
										13
									
								
								deployment_scripts/linux/run.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								deployment_scripts/linux/run.sh
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
cd py
 | 
			
		||||
python api.py &
 | 
			
		||||
pid_py=$!
 | 
			
		||||
 | 
			
		||||
npm start &
 | 
			
		||||
pid_node=$!
 | 
			
		||||
 | 
			
		||||
npx electron .
 | 
			
		||||
 | 
			
		||||
kill $pid_py
 | 
			
		||||
kill $pid_node
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue