diff --git a/package-lock.json b/package-lock.json index b94e84c52c883093f13c85e454cec21b461f4593..e401c8c6582b1af238a9e0f5647bc7c544f1cce7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "requires": true, "packages": { "": { - "version": "0.3.3", + "version": "0.2.14", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -61,7 +61,6 @@ "@teamsupercell/typings-for-css-modules-loader": "^2.5.2", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", - "@types/electron": "^1.6.10", "@types/jest": "^29.5.2", "@types/node": "20.2.5", "@types/react": "^18.2.8", @@ -4541,16 +4540,6 @@ "@types/ms": "*" } }, - "node_modules/@types/electron": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@types/electron/-/electron-1.6.10.tgz", - "integrity": "sha512-MOCVyzIwkBEloreoCVrTV108vSf8fFIJPsGruLCoAoBZdxtnJUqKA4lNonf/2u1twSjAspPEfmEheC+TLm/cMw==", - "deprecated": "This is a stub types definition for electron (https://github.com/electron/electron). electron provides its own type definitions, so you don't need @types/electron installed!", - "dev": true, - "dependencies": { - "electron": "*" - } - }, "node_modules/@types/eslint": { "version": "8.44.3", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.3.tgz", @@ -6659,13 +6648,13 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.5", + "content-type": "~1.0.4", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -6673,7 +6662,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.2", + "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -7818,9 +7807,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, "engines": { "node": ">= 0.6" @@ -9135,9 +9124,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "dependencies": { "jake": "^10.8.5" @@ -10882,17 +10871,17 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -17865,9 +17854,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -19897,9 +19886,9 @@ } }, "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -21380,9 +21369,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -22026,4 +22015,4 @@ } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index 94283ce87f615658b728d70d8cb59ed5c627fd5e..2f7c58d7aa979859e56877af2672228322f33a5b 100644 --- a/package.json +++ b/package.json @@ -28,23 +28,18 @@ "version": "0.3.3", "main": "./src/main/main.ts", "scripts": { - " ----------------- BUILD -----------------": "", "build": "concurrently \"npm run build:main\" \"npm run build:renderer\"", "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts", "postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts", + "lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx", "package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never", "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app", - " ----------------- PROD -----------------": "", "start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run start:renderer", "start:main": "cross-env NODE_ENV=development electronmon -r ts-node/register/transpile-only .", "start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts", "start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts", - " ----------------- TEST -----------------": "", - "test": "jest", - " ----------------- UTILS -----------------": "", - "lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx", - "typecheck": "tsc --noEmit" + "test": "jest" }, "browserslist": [], "prettier": { @@ -146,7 +141,6 @@ "@teamsupercell/typings-for-css-modules-loader": "^2.5.2", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", - "@types/electron": "^1.6.10", "@types/jest": "^29.5.2", "@types/node": "20.2.5", "@types/react": "^18.2.8", @@ -274,7 +268,7 @@ } }, "devEngines": { - "node": ">=20.x", + "node": ">=14.x", "npm": ">=7.x" }, "electronmon": { @@ -284,4 +278,4 @@ ], "logLevel": "quiet" } -} +} \ No newline at end of file diff --git a/release/app/package-lock.json b/release/app/package-lock.json index 9bc612701611b581dc0352103415899061aca957..a3a251a4a319449e2fa9fd107662f764b2768188 100644 --- a/release/app/package-lock.json +++ b/release/app/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "transformerlab", - "version": "0.3.3", + "version": "0.2.14", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -147,4 +147,4 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" } } -} +} \ No newline at end of file diff --git a/src/main/preload.ts b/src/main/preload.ts index 47ff3204b5e10e2c161f8f3f25e3974e064e1d94..7ab343a82b3f6a7d704d35181657fdfdf5f139ed 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -81,13 +81,11 @@ contextBridge.exposeInMainWorld('storage', { }); contextBridge.exposeInMainWorld('sshClient', { - connect: (data: string) => ipcRenderer.invoke('ssh:connect', data), - data: (data: string) => ipcRenderer.send('ssh:data', data), + connect: (data) => ipcRenderer.invoke('ssh:connect', data), + data: (data) => ipcRenderer.send('ssh:data', data), - onData: (data: any) => ipcRenderer.on('ssh:data', data), - onSSHConnected: (callback: { - (event: IpcRendererEvent, data: string): void; - }) => ipcRenderer.on('ssh:connected', callback), + onData: (data) => ipcRenderer.on('ssh:data', data), + onSSHConnected: (callback) => ipcRenderer.on('ssh:connected', callback), removeAllListeners: () => { ipcRenderer.removeAllListeners('ssh:data'); @@ -96,5 +94,5 @@ contextBridge.exposeInMainWorld('sshClient', { }); contextBridge.exposeInMainWorld('autoUpdater', { - onMessage: (data: any) => ipcRenderer.on('autoUpdater', data), + onMessage: (data) => ipcRenderer.on('autoUpdater', data), }); diff --git a/src/main/ssh-client.js b/src/main/ssh-client.js index c752860b9529489596dc61ae87354622c49a28f4..70a9b2d3f8ad613be0f6fcac61f9e1f55cbbc0da 100644 --- a/src/main/ssh-client.js +++ b/src/main/ssh-client.js @@ -8,7 +8,7 @@ const HOME_DIR = app.getPath('home'); const default_private_key = ''; const default_private_key_location = HOME_DIR + '/.ssh/id_rsa'; -let mainWindow = null; +var mainWindow = null; function sendToRenderer(channel, data) { if (mainWindow === null) { @@ -119,6 +119,6 @@ ipcMain.handle('ssh:connect', (event, key) => { export default function setupSSHClient(browserWindow) { console.log('setting up ssh client'); - // console.log(browserWindow); + console.log(browserWindow); mainWindow = browserWindow; } diff --git a/src/main/util.ts b/src/main/util.ts index 18bcd55a73af533d0aa3786c84a6cb05f82a8a53..1abafac94260e4f68fbdd075f39c597bffe96067 100644 --- a/src/main/util.ts +++ b/src/main/util.ts @@ -1,7 +1,6 @@ /* eslint import/prefer-default-export: off */ import { URL } from 'url'; import path from 'path'; -import { ExecException } from 'child_process'; const fs = require('fs'); const os = require('os'); const { spawn, exec, ChildProcess } = require('child_process'); @@ -133,21 +132,21 @@ export async function startLocalServer() { console.log('Local server started with pid', localServer.pid); return new Promise((resolve) => { - let err_msg: string; + let err_msg; // if there was an error spawning then stderr will be null if (localServer.stderr) { - localServer.stderr.on('data', (data: string) => { + localServer.stderr.on('data', (data) => { console.error(`stderr: ${data}`); }); } - localServer.on('error', (err: string) => { - console.log(`child process failed: ${err}`); - err_msg = err; + localServer.on('error', (error_msg) => { + console.log(`child process failed: ${error_msg}`); + err_msg = error_msg; }); - localServer.on('close', (code: number) => { + localServer.on('close', (code) => { console.log(`child process exited with code ${code}`); if (code === 0) { @@ -171,7 +170,7 @@ export function killLocalServer() { `Killing local server with pid ${localServer.pid} and all it children` ); var kill = require('tree-kill'); - kill(localServer.pid, 'SIGTERM', function (err: string) { + kill(localServer.pid, 'SIGTERM', function (err) { console.log('Finished killing local server'); console.log(err); resolve(err); @@ -202,10 +201,10 @@ export async function installLocalServer() { ? {} : { shell: '/bin/bash', cwd: root_dir }; try { - exec( + const child = exec( installScriptCommand, options, - (error: ExecException | null, stdout: string, stderr: string) => { + (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; @@ -236,7 +235,7 @@ export async function checkDependencies() { let response = { status: '', message: '', - data: {}, + data: [], }; // check if we've done an install/update of dependencies with this build @@ -277,7 +276,7 @@ export async function checkDependencies() { return response; } - const pipListNames = pipList.map((x: { name: string }) => x.name); + const pipListNames = pipList.map((x) => x.name); const keyDependencies = [ 'fastapi', 'pydantic', @@ -300,9 +299,9 @@ export async function checkDependencies() { response.data = missingDependencies; console.log('missingDependencies', missingDependencies); - if (missingDependencies.length > 0) { + if (missingDependencies.legnth > 0) { response.status = 'error'; - const missingList = missingDependencies.join(', '); + const missingList = missingDependencies.data?.join(', '); response.message = `Missing dependencies including: ${missingList}...`; } else { response.status = 'success'; @@ -320,7 +319,7 @@ export async function checkIfCondaEnvironmentExists() { let response = { status: '', message: '', - data: {}, + data: [], }; console.log(JSON.stringify({ error, stdout, stderr })); @@ -353,29 +352,18 @@ export async function checkIfCondaEnvironmentExists() { } } -interface ExecError extends Error { - code?: number; // Exit code of the shell command if the process exited on its own. - stdout?: string; // Standard output from the command. - stderr?: string; // Standard error output from the command. -} - /** * * @param argument parameter to pass to install.sh * @returns the stdout of the process or false on failure. */ -export async function executeInstallStep(argument: string): Promise<{ - error: ExecException | null; - stdout: string; - stderr: string; -}> { +export async function executeInstallStep(argument: string) { const server_dir = await getTransformerLabCodeDir(); if (!fs.existsSync(server_dir)) { - return { - error: new Error('TransformerLab directory has not been setup.'), - stdout: 'TransformerLab directory has not been setup.', - stderr: 'TransformerLab directory has not been setup.', - }; + console.log( + 'Install step failed. TransformerLab directory has not been setup.' + ); + return false; } const installScriptFilename = 'install.sh'; @@ -395,19 +383,14 @@ export async function executeInstallStep(argument: string): Promise<{ try { ({ error, stdout, stderr } = await awaitExec(exec_cmd, options)); } catch (err) { - console.log('Failed to execute install step', err); console.log(JSON.stringify(err)); - if (err instanceof Error) { - const execError = err as ExecError; - return { - error: new Error(String(execError.code)), - stdout: execError.stdout?.toString() ?? '', - stderr: execError.stderr?.toString() ?? '', - }; - } + return { + error: err?.code, + stdout: err?.stdout?.toString(), + stderr: err?.stderr?.toString(), + }; } - if (stdout) console.log(`${installScriptFilename} stdout:`, stdout); if (stderr) console.error(`${installScriptFilename} stderr:`, stderr); return { error, stdout, stderr }; diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index e318c51ee56aae8f6821ab44ede4729db1a7bec3..4fe74ca12d8e0d33b4ac3e06733e05efb77ce77d 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -18,7 +18,7 @@ import XtermJSDrawer from './components/Connect/XtermJS'; // import OutputTerminal from './components/OutputTerminal'; // import AutoUpdateModal from './components/AutoUpdateModal'; -const fetcher = (url: string) => fetch(url).then((res) => res.json()); +const fetcher = (url) => fetch(url).then((res) => res.json()); export default function App() { const [experimentId, setExperimentId] = useState(''); diff --git a/src/renderer/components/AutoUpdateModal.tsx b/src/renderer/components/AutoUpdateModal.tsx index bf21d5a307f5bd1f7ccc1d7d3ccf9d6f0318ddb2..4843b175e45135b20caf46a1cd487e5a23e8f0c1 100644 --- a/src/renderer/components/AutoUpdateModal.tsx +++ b/src/renderer/components/AutoUpdateModal.tsx @@ -1,14 +1,13 @@ import React from 'react'; -import { Modal, ModalClose, Sheet, Typography } from '@mui/joy'; -window.autoUpdater.onMessage((message: Node) => { - // console.log('autoupdate message', message); - const container = document.getElementById('messages') as HTMLDivElement; - // const m = document.createElement('div'); - // m.innerHTML = text; +import { Modal, ModalClose, Sheet, Typography } from '@mui/joy'; +window.autoUpdater.onMessage((message) => { + console.log('autoupdate message', message); + var container = document.getElementById('messages'); + var m = document.createElement('div'); + m.innerHTML = text; container?.appendChild(message); }); - export default function AutoUpdateModal({}) { const [open, setOpen] = React.useState<boolean>(true); diff --git a/src/renderer/components/Computer.tsx b/src/renderer/components/Computer.tsx index 81b66bc5de66f893be1e687b1bb66b4141c5dcef..90274d0f46923197d7f29075b2d4fa02ad2faff1 100644 --- a/src/renderer/components/Computer.tsx +++ b/src/renderer/components/Computer.tsx @@ -24,25 +24,11 @@ import { formatBytes } from 'renderer/lib/utils'; import { useServerStats } from 'renderer/lib/transformerlab-api-sdk'; function getSystemProperties() { - const information = document.getElementById('info') as HTMLPreElement; + const information = document.getElementById('info'); information.innerText = `This app is using Chrome (v${window.platform.chrome()}), Node.js (v${window.platform.node()}), and Electron (v${window.platform.electron()})`; } -interface ComputerCardProps { - title: string; - description?: string; - chip?: string; - icon: React.ReactNode; - children: React.ReactNode; -} - -function ComputerCard({ - children, - title, - description = '', - chip = '', - icon, -}: ComputerCardProps) { +function ComputerCard({ children, title, description = '', chip = '', icon }) { return ( <Card variant="outlined"> <CardContent> @@ -113,7 +99,7 @@ export default function Computer() { title="GPU Specs" image={undefined} > - {server.gpu?.map((g: Record<string, any>) => { + {server.gpu?.map((g) => { return ( <> 🔥 {g.name} diff --git a/src/renderer/components/Connect/LocalConnection.tsx b/src/renderer/components/Connect/LocalConnection.tsx index 7412a0b5d0f82bf52bfa0fb597a97c4268710d5e..8f4cbeb559ccc0d0792ceb0ab00c5784da5c202f 100644 --- a/src/renderer/components/Connect/LocalConnection.tsx +++ b/src/renderer/components/Connect/LocalConnection.tsx @@ -13,24 +13,43 @@ import { import { CheckCircle2, PlayIcon, RotateCcwIcon } from 'lucide-react'; import { useEffect, useState } from 'react'; import { useCheckLocalConnection } from 'renderer/lib/transformerlab-api-sdk'; + import { FaApple } from 'react-icons/fa6'; -import { - LocalConnectionProvider, - useLocalConnectionContext, -} from './context/localConnectionContext'; -import { setIntervalXTimes, isStep, Steps } from './utils'; -import { Message } from './types/Message'; -function CheckIfInstalled() { - const { activeStep, setActiveStep } = useLocalConnectionContext(); +// Runs a callback every delay milliseconds, up to repetitions times. +// If the callback returns true, the interval is cleared. +// If the callback returns false, and the interval has run repetitions times, the notSuccessful callback is run. +function setIntervalXTimes(callback, notSuccessful, delay, repetitions) { + var x = 0; + var intervalID = window.setInterval(async function () { + console.log(`trying ${x} times`); + const response = await callback(); + + if (response) { + window.clearInterval(intervalID); + } else if (++x === repetitions) { + notSuccessful(); + window.clearInterval(intervalID); + } + }, delay); +} +const Steps = [ + 'CHECK_IF_INSTALLED', + 'CHECK_VERSION', + 'CHECK_IF_CONDA_INSTALLED', + 'CHECK_IF_CONDA_ENVIRONMENT_EXISTS', + 'CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED', + 'CHECK_IF_SERVER_RUNNING_ON_PORT_8000', + 'CHECK_FOR_IMPORTANT_PLUGINS', +]; + +function CheckIfInstalled({ activeStep, setActiveStep }) { const [installStatus, setInstallStatus] = useState('notstarted'); // notstarted, pending, success, error - const [installErrorMessage, setInstallErrorMessage] = useState<string | null>( - null - ); + const [installErrorMessage, setInstallErrorMessage] = useState(null); useEffect(() => { - if (!isStep(activeStep)) return; + if (activeStep !== Steps.indexOf('CHECK_IF_INSTALLED')) return; (async () => { // First check if there are any system requirement issues // If not, then check if installed locally @@ -123,9 +142,7 @@ function CheckIfInstalled() { ); } -function CheckCurrentVersion() { - const { activeStep = 0, setActiveStep } = useLocalConnectionContext(); - +function CheckCurrentVersion({ activeStep, setActiveStep }) { const [version, setVersion] = useState('pending'); // pending, or #.#.# const [release, setRelease] = useState(''); const [installStatus, setInstallStatus] = useState('notstarted'); // notstarted, pending, success, error @@ -221,9 +238,7 @@ function CheckCurrentVersion() { ); } -function RunServer() { - const { activeStep, setActiveStep } = useLocalConnectionContext(); - +function RunServer({ activeStep, setActiveStep }) { const [thinking, setThinking] = useState(false); const { server, @@ -256,70 +271,72 @@ function RunServer() { }, [activeStep, server]); return ( - <Stack spacing={1}> - {activeStep >= Steps.indexOf('CHECK_IF_SERVER_RUNNING_ON_PORT_8000') && - server && - !serverError && <Chip color="success">Success!</Chip>} - {activeStep >= Steps.indexOf('CHECK_IF_SERVER_RUNNING_ON_PORT_8000') && - (!server || serverError) && <Chip color="danger">Not Running</Chip>} - <ButtonGroup variant="plain" spacing={1}> - {activeStep == Steps.indexOf('CHECK_IF_SERVER_RUNNING_ON_PORT_8000') && - (!server || serverError ? ( - thinking ? ( - <CircularProgress color="primary" /> - ) : ( - <> - <Button - variant="solid" - onClick={async () => { - setThinking(true); - const start_process = - await window.electron.ipcRenderer.invoke( - 'server:startLocalServer' - ); - - if (start_process?.status == 'error') { - const response_text = - 'Failed to start server: \n' + start_process?.message; - alert(response_text); - setThinking(false); - return; - } - //set interval to check if server is running every 2 seconds, 15 times: - setIntervalXTimes( - async () => { - if (!server || serverError) return false; - setThinking(false); - setActiveStep( - Steps.indexOf( - 'CHECK_IF_SERVER_RUNNING_ON_PORT_8000' - ) + 1 + <> + <Stack spacing={1}> + {activeStep >= Steps.indexOf('CHECK_IF_SERVER_RUNNING_ON_PORT_8000') && + server && + !serverError && <Chip color="success">Success!</Chip>} + {activeStep >= Steps.indexOf('CHECK_IF_SERVER_RUNNING_ON_PORT_8000') && + (!server || serverError) && <Chip color="danger">Not Running</Chip>} + <ButtonGroup variant="plain" spacing={1}> + {activeStep == + Steps.indexOf('CHECK_IF_SERVER_RUNNING_ON_PORT_8000') && + (!server || serverError ? ( + thinking ? ( + <CircularProgress color="primary" /> + ) : ( + <> + <Button + variant="solid" + onClick={async () => { + setThinking(true); + const start_process = + await window.electron.ipcRenderer.invoke( + 'server:startLocalServer' ); - return true; - }, - () => { + + if (start_process?.status == 'error') { + const response_text = + 'Failed to start server: \n' + start_process?.message; + alert(response_text); setThinking(false); - }, - 2000, - 15 - ); - }} - > - Start - </Button> - </> - ) - ) : ( - '' - ))} - </ButtonGroup> - </Stack> + return; + } + //set interval to check if server is running every 2 seconds, 15 times: + setIntervalXTimes( + async () => { + if (!server || serverError) return false; + setThinking(false); + setActiveStep( + Steps.indexOf( + 'CHECK_IF_SERVER_RUNNING_ON_PORT_8000' + ) + 1 + ); + return true; + }, + () => { + setThinking(false); + }, + 2000, + 15 + ); + }} + > + Start + </Button> + </> + ) + ) : ( + '' + ))} + </ButtonGroup> + </Stack> + </> ); } -function CheckForPlugins() { - const { activeStep, setActiveStep } = useLocalConnectionContext(); - const [missingPlugins, setMissingPlugins] = useState([]); +function CheckForPlugins({ activeStep, setActiveStep }) { + const [missingPlugins, setMissingPlugins] = useState(null); const [installing, setInstalling] = useState(false); useEffect(() => { @@ -348,7 +365,7 @@ function CheckForPlugins() { )} <Typography level="body-sm"> - {window.platform.isMac() && window.platform.arch() == 'arm64' && ( + {platform.isMac() && platform.arch() == 'arm64' && ( <> You are running on a <FaApple /> Mac with <b>Apple Silicon</b> . @@ -420,8 +437,7 @@ function CheckForPlugins() { ); } -function CheckIfCondaInstalled() { - const { activeStep, setActiveStep } = useLocalConnectionContext(); +function CheckIfCondaInstalled({ activeStep, setActiveStep }) { const [installStatus, setInstallStatus] = useState(''); // notstarted, pending, success, error useEffect(() => { @@ -503,15 +519,9 @@ function CheckIfCondaInstalled() { ); } -function CheckIfCondaEnvironmentExists() { - const { activeStep, setActiveStep } = useLocalConnectionContext(); - const [installStatus, setInstallStatus] = useState< - 'success' | 'notstarted' | 'pending' | 'error' | '' - >(''); // notstarted, pending, success, error - const [errorMessage, setErrorMessage] = useState<{ - message: string; - data: any; - } | null>(null); +function CheckIfCondaEnvironmentExists({ activeStep, setActiveStep }) { + const [installStatus, setInstallStatus] = useState(''); // notstarted, pending, success, error + const [errorMessage, setErrorMessage] = useState(null); useEffect(() => { if (activeStep !== Steps.indexOf('CHECK_IF_CONDA_ENVIRONMENT_EXISTS')) @@ -618,10 +628,9 @@ function CheckIfCondaEnvironmentExists() { ); } -function CheckDependencies() { - const { activeStep, setActiveStep } = useLocalConnectionContext(); +function CheckDependencies({ activeStep, setActiveStep }) { const [installStatus, setInstallStatus] = useState(''); // notstarted, pending, success, error - const [errorMessage, setErrorMessage] = useState<Message>(null); + const [errorMessage, setErrorMessage] = useState(null); useEffect(() => { if (activeStep !== Steps.indexOf('CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED')) @@ -632,7 +641,10 @@ function CheckDependencies() { 'server:checkDependencies' ); - if (ipcResponse?.status == 'success' && ipcResponse?.data?.length == 0) { + if ( + ipcResponse?.status == 'success' && + ipcResponse?.data?.length == 0 + ) { setInstallStatus('success'); setActiveStep( Steps.indexOf('CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED') + 1 @@ -653,78 +665,76 @@ function CheckDependencies() { }, [activeStep]); return ( - <Stack spacing={1}> - {installStatus == 'success' && <Chip color="success">Success!</Chip>} - {installStatus == 'pending' && ( - <> - <CircularProgress color="primary" /> - <Typography level="body-sm" color="warning"> - Installing. This can take a long while. - </Typography> - </> - )} - {activeStep == Steps.indexOf('CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED') && - installStatus == 'notstarted' && ( - <ButtonGroup variant="plain" spacing={1}> - <Button - variant="solid" - size="sm" - startDecorator={<RotateCcwIcon size="16px" />} - onClick={async () => { - setInstallStatus('pending'); - setErrorMessage(null); - await window.electron.ipcRenderer.invoke( - 'server:install_install-dependencies' - ); + <> + <Stack spacing={1}> + {installStatus == 'success' && <Chip color="success">Success!</Chip>} + {installStatus == 'pending' && ( + <> + <CircularProgress color="primary" /> + <Typography level="body-sm" color="warning"> + Installing. This can take a long while. + </Typography> + </> + )} + {activeStep == + Steps.indexOf('CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED') && + installStatus == 'notstarted' && ( + <ButtonGroup variant="plain" spacing={1}> + <Button + variant="solid" + size="sm" + startDecorator={<RotateCcwIcon size="16px" />} + onClick={async () => { + setInstallStatus('pending'); + setErrorMessage(null); + await window.electron.ipcRenderer.invoke( + 'server:install_install-dependencies' + ); - const ipcResponse = await window.electron.ipcRenderer.invoke( - 'server:checkDependencies' - ); + const ipcResponse = + await window.electron.ipcRenderer.invoke( + 'server:checkDependencies' + ); - if ( - ipcResponse?.status == 'success' && - ipcResponse?.data?.length == 0 - ) { - setInstallStatus('success'); - setActiveStep( - Steps.indexOf('CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED') + 1 - ); - return; - } - - if (ipcResponse?.status == 'error') { - setErrorMessage({ - message: ipcResponse?.message, - data: ipcResponse?.data, - }); - } else { - setErrorMessage(null); - } - }} - > - Install Dependencies - </Button> - </ButtonGroup> - )} + if ( + ipcResponse?.status == 'success' && + ipcResponse?.data?.length == 0 + ) { + setInstallStatus('success'); + setActiveStep( + Steps.indexOf('CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED') + + 1 + ); + return; + } - <Typography level="body-sm" color="warning"> - {errorMessage?.message} - </Typography> - <Typography level="body-sm" color="neutral"> - {errorMessage?.data?.stdout} {errorMessage?.data?.stderr} - </Typography> - </Stack> - ); -} + if (ipcResponse?.status == 'error') { + setErrorMessage({ + message: ipcResponse?.message, + data: ipcResponse?.data, + }); + } else { + setErrorMessage(null); + } + }} + > + Install Dependencies + </Button> + </ButtonGroup> + )} -interface InstallStepProps { - children: React.ReactNode; - title: string; - thisStep: number; + <Typography level="body-sm" color="warning"> + {errorMessage?.message} + </Typography> + <Typography level="body-sm" color="neutral"> + {errorMessage?.data?.stdout} {errorMessage?.data?.stderr} + </Typography> + </Stack> + </> + ); } -function InstallStep({ children, thisStep, title }: InstallStepProps) { - const { activeStep, setActiveStep } = useLocalConnectionContext(); +function InstallStep({ children, thisStep, title, activeStep, setActiveStep }) { return ( <Step indicator={ @@ -744,84 +754,108 @@ function InstallStep({ children, thisStep, title }: InstallStepProps) { ); } -interface InstallStepperProps { - setServer: (server: string) => void; -} - -function InstallStepper({ setServer }: InstallStepperProps) { +function InstallStepper({ setServer }) { const [activeStep, setActiveStep] = useState( Steps.indexOf('CHECK_IF_INSTALLED') - ); + ); // 0, 1, 2 function tryToConnect() { const fullServer = 'http://' + 'localhost' + ':' + '8000' + '/'; - window.TransformerLab = { - API_URL: fullServer, - }; - + window.TransformerLab = {}; + window.TransformerLab.API_URL = fullServer; setActiveStep(Steps.indexOf('CHECK_IF_INSTALLED')); setServer(fullServer); } - return ( - <LocalConnectionProvider> - <Sheet - sx={{ - display: 'flex', - flexDirection: 'column', - overflow: 'hidden', - height: '100%', - }} + <Sheet + sx={{ + display: 'flex', + flexDirection: 'column', + overflow: 'hidden', + height: '100%', + }} + > + <Stepper + orientation="vertical" + sx={{ display: 'flex', overflow: 'auto' }} > - <Stepper - orientation="vertical" - sx={{ display: 'flex', overflow: 'auto' }} + {/* Active Step: {activeStep} */} + <InstallStep + thisStep={Steps.indexOf('CHECK_IF_INSTALLED')} + title="Check if Server is Installed at ~/.transformerlab/" + activeStep={activeStep} + setActiveStep={setActiveStep} > - {/* Active Step: {activeStep} */} - <InstallStep - thisStep={Steps.indexOf('CHECK_IF_INSTALLED')} - title="Check if Server is Installed at ~/.transformerlab/" - > - <CheckIfInstalled /> - </InstallStep> - <InstallStep - thisStep={Steps.indexOf('CHECK_VERSION')} - title="Check Current Version" - > - <CheckCurrentVersion /> - </InstallStep> - <InstallStep - thisStep={Steps.indexOf('CHECK_IF_CONDA_INSTALLED')} - title="Check if Conda is Installed at ~/.transformerlab/miniconda3/" - > - <CheckIfCondaInstalled /> - </InstallStep> - <InstallStep - thisStep={Steps.indexOf('CHECK_IF_CONDA_ENVIRONMENT_EXISTS')} - title="Check if Conda Environment 'transformerlab' Exists" - > - <CheckIfCondaEnvironmentExists /> - </InstallStep> - <InstallStep - thisStep={Steps.indexOf('CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED')} - title="Check if Python Dependencies are Installed" - > - <CheckDependencies /> - </InstallStep> - <InstallStep - thisStep={Steps.indexOf('CHECK_IF_SERVER_RUNNING_ON_PORT_8000')} - title="Check if Server is Running Locally on Port 8000" - > - <RunServer /> - </InstallStep> - <InstallStep - thisStep={Steps.indexOf('CHECK_FOR_IMPORTANT_PLUGINS')} - title="Check for Important Plugins" - > - <CheckForPlugins /> - </InstallStep> - </Stepper> - + <CheckIfInstalled + activeStep={activeStep} + setActiveStep={setActiveStep} + /> + </InstallStep> + <InstallStep + thisStep={Steps.indexOf('CHECK_VERSION')} + title="Check Current Version" + activeStep={activeStep} + setActiveStep={setActiveStep} + > + <CheckCurrentVersion + activeStep={activeStep} + setActiveStep={setActiveStep} + /> + </InstallStep> + <InstallStep + thisStep={Steps.indexOf('CHECK_IF_CONDA_INSTALLED')} + title="Check if Conda is Installed at ~/.transformerlab/miniconda3/" + activeStep={activeStep} + setActiveStep={setActiveStep} + > + <CheckIfCondaInstalled + activeStep={activeStep} + setActiveStep={setActiveStep} + /> + </InstallStep> + <InstallStep + thisStep={Steps.indexOf('CHECK_IF_CONDA_ENVIRONMENT_EXISTS')} + title="Check if Conda Environment 'transformerlab' Exists" + activeStep={activeStep} + setActiveStep={setActiveStep} + > + <CheckIfCondaEnvironmentExists + activeStep={activeStep} + setActiveStep={setActiveStep} + /> + </InstallStep> + <InstallStep + thisStep={Steps.indexOf('CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED')} + title="Check if Python Dependencies are Installed" + activeStep={activeStep} + setActiveStep={setActiveStep} + > + <CheckDependencies + activeStep={activeStep} + setActiveStep={setActiveStep} + /> + </InstallStep> + <InstallStep + thisStep={Steps.indexOf('CHECK_IF_SERVER_RUNNING_ON_PORT_8000')} + title="Check if Server is Running Locally on Port 8000" + activeStep={activeStep} + setActiveStep={setActiveStep} + > + <RunServer activeStep={activeStep} setActiveStep={setActiveStep} /> + </InstallStep> + <InstallStep + thisStep={Steps.indexOf('CHECK_FOR_IMPORTANT_PLUGINS')} + title="Check for Important Plugins" + activeStep={activeStep} + setActiveStep={setActiveStep} + > + <CheckForPlugins + activeStep={activeStep} + setActiveStep={setActiveStep} + /> + </InstallStep> + </Stepper> + { <Button size="lg" variant="solid" @@ -833,9 +867,13 @@ function InstallStepper({ setServer }: InstallStepperProps) { > Connect </Button> - </Sheet> - </LocalConnectionProvider> + } + </Sheet> ); } -export default InstallStepper; +function LocalConnection({ setServer }) { + return <InstallStepper setServer={setServer} />; +} + +export default LocalConnection; diff --git a/src/renderer/components/Connect/context/index.ts b/src/renderer/components/Connect/context/index.ts deleted file mode 100644 index 65db0994f24a7eb181da75e296925f441d695987..0000000000000000000000000000000000000000 --- a/src/renderer/components/Connect/context/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './localConnectionContext' diff --git a/src/renderer/components/Connect/context/localConnectionContext.tsx b/src/renderer/components/Connect/context/localConnectionContext.tsx deleted file mode 100644 index f8eea5ea1c3f35d4363bc5cd528cef6800b7fccf..0000000000000000000000000000000000000000 --- a/src/renderer/components/Connect/context/localConnectionContext.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { createContext, useContext, useState } from 'react'; - -interface LocalConnectionContext { - children?: React.ReactNode; - activeStep: number; - setActiveStep: React.Dispatch<React.SetStateAction<number>>; -} - -const LocalConnectionContext = createContext<LocalConnectionContext>({ - activeStep: 0, - setActiveStep: (_val) => {}, -}); - -const LocalConnectionProvider: React.FC<{ - children: React.ReactNode; -}> = ({ children }) => { - const [activeStep, setActiveStep] = useState<number>(0); - return ( - <LocalConnectionContext.Provider value={{ activeStep, setActiveStep }}> - {children} - </LocalConnectionContext.Provider> - ); -}; - -const useLocalConnectionContext = () => { - const context = useContext(LocalConnectionContext); - if (!context) { - throw new Error( - 'useLocalConnectionContext must be used within a LocalConnectionProvider' - ); - } - return context; -}; - -export { LocalConnectionProvider, useLocalConnectionContext }; diff --git a/src/renderer/components/Connect/types/Message.ts b/src/renderer/components/Connect/types/Message.ts deleted file mode 100644 index cd385c70c9fbc7a49af236686570e79bed23fdba..0000000000000000000000000000000000000000 --- a/src/renderer/components/Connect/types/Message.ts +++ /dev/null @@ -1,4 +0,0 @@ -export type Message = { - message: string; - data: any -} | null; diff --git a/src/renderer/components/Connect/utils/index.ts b/src/renderer/components/Connect/utils/index.ts deleted file mode 100644 index 45cb61e4f0e26a53b4091d0a5119577430006343..0000000000000000000000000000000000000000 --- a/src/renderer/components/Connect/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './isStep' -export * from './setIntervalXTimes' diff --git a/src/renderer/components/Connect/utils/isStep.ts b/src/renderer/components/Connect/utils/isStep.ts deleted file mode 100644 index ae4662ef9dc50c22f99a3fee65f28db25ce4dfe3..0000000000000000000000000000000000000000 --- a/src/renderer/components/Connect/utils/isStep.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const Steps = [ - 'CHECK_IF_INSTALLED', - 'CHECK_VERSION', - 'CHECK_IF_CONDA_INSTALLED', - 'CHECK_IF_CONDA_ENVIRONMENT_EXISTS', - 'CHECK_IF_PYTHON_DEPENDENCIES_INSTALLED', - 'CHECK_IF_SERVER_RUNNING_ON_PORT_8000', - 'CHECK_FOR_IMPORTANT_PLUGINS', -] as const; -export type Step = (typeof Steps)[number]; - -export function isStep(value: any): value is Step { - return Steps.includes(value as Step); -} diff --git a/src/renderer/components/Connect/utils/setIntervalXTimes.ts b/src/renderer/components/Connect/utils/setIntervalXTimes.ts deleted file mode 100644 index 0cbabf2b21d0db3c00ace2d69d90169a8a281e78..0000000000000000000000000000000000000000 --- a/src/renderer/components/Connect/utils/setIntervalXTimes.ts +++ /dev/null @@ -1,24 +0,0 @@ -// Runs a callback every delay milliseconds, up to repetitions times. -// If the callback returns true, the interval is cleared. -// If the callback returns false, and the interval has run repetitions times, the notSuccessful callback is run. -export function setIntervalXTimes( - callback: () => any, - notSuccessful: () => void, - delay: number, - repetitions: number -) { - let x = 0; - const intervalID = window.setInterval(async function () { - console.log(`trying ${x} times`); - const response = await callback(); - - if (response) { - window.clearInterval(intervalID); - } else if (++x === repetitions) { - notSuccessful(); - window.clearInterval(intervalID); - } - }, delay); - - return intervalID; -} diff --git a/src/renderer/components/Logs.tsx b/src/renderer/components/Logs.tsx index 92d8924c01a932f1848994a6dfd738b4a633aa65..748e15be5561c754b8a54f4c1eca94a45da295a3 100644 --- a/src/renderer/components/Logs.tsx +++ b/src/renderer/components/Logs.tsx @@ -14,16 +14,14 @@ import * as chatAPI from 'renderer/lib/transformerlab-api-sdk'; import useSWR from 'swr'; -const fetcher = (url: string) => fetch(url).then((res) => res.text()); +const fetcher = (url) => fetch(url).then((res) => res.text()); -function objectMinusPrompt({ - prompt, - ...rest -}: Record<string, any>): Record<string, any> { +function objectMinusPrompt(obj) { + const { prompt, ...rest } = obj; return rest; } -function renderJSONLinesLog(logs: string) { +function renderJSONLinesLog(logs) { return logs?.split('\n').map((line, i) => { try { const line_object = JSON.parse(line); @@ -69,7 +67,7 @@ export default function Logs({}) { flexDirection: 'column', }} > - <AccordionGroup>{renderJSONLinesLog(data ?? '')}</AccordionGroup> + <AccordionGroup>{renderJSONLinesLog(data)}</AccordionGroup> </Box> </Sheet> ); diff --git a/src/renderer/components/MainAppPanel.tsx b/src/renderer/components/MainAppPanel.tsx index 3f8c93ef2adfbcd2e7157e0df18993b2683dd403..019f1c3595bffed026f270523f73baa47d8f4cdb 100644 --- a/src/renderer/components/MainAppPanel.tsx +++ b/src/renderer/components/MainAppPanel.tsx @@ -86,7 +86,7 @@ export default function MainAppPanel({ updateConfigs(); } - function setAdaptor(name: string) { + function setAdaptor(name) { fetch( chatAPI.GET_EXPERIMENT_UPDATE_CONFIG_URL( experimentInfo?.id, diff --git a/src/renderer/components/ModelCurrentlyPlayingBar.tsx b/src/renderer/components/ModelCurrentlyPlayingBar.tsx index 0b27f3a2218680d11d347b970eb7c87e30e2bd9e..9ffb032abd71e1242c705c74ab23acb335939379 100644 --- a/src/renderer/components/ModelCurrentlyPlayingBar.tsx +++ b/src/renderer/components/ModelCurrentlyPlayingBar.tsx @@ -6,13 +6,7 @@ import { import { Box, Button, CircularProgress, Typography } from '@mui/joy'; import TinyCircle from './Shared/TinyCircle'; -interface ModelCurrentlyPlayingProps { - experimentInfo: Record<string, any>; -} - -export default function ModelCurrentlyPlaying({ - experimentInfo, -}: ModelCurrentlyPlayingProps) { +export default function ModelCurrentlyPlaying({ experimentInfo }) { const { models, isError, isLoading } = useModelStatus(); const inferenceParams = experimentInfo?.config?.inferenceParams @@ -56,7 +50,7 @@ export default function ModelCurrentlyPlaying({ variant="plain" sx={{ display: models?.length > 0 ? 'flex' : 'none' }} > - {models?.length === 0 ? ( + {models?.length == 0 ? ( <CircularProgress color="warning" /> ) : ( <StopCircleIcon /> diff --git a/src/renderer/components/TransformerLabSettings.tsx b/src/renderer/components/TransformerLabSettings.tsx index aa72337b900ede7e1b2ebb41fcdb6c0b3fbb26a5..4134fa3f1d02d04ccca0935b51773204f680f854 100644 --- a/src/renderer/components/TransformerLabSettings.tsx +++ b/src/renderer/components/TransformerLabSettings.tsx @@ -17,7 +17,7 @@ import * as chatAPI from 'renderer/lib/transformerlab-api-sdk'; import useSWR from 'swr'; import { EyeIcon, EyeOffIcon } from 'lucide-react'; -const fetcher = (url: string) => fetch(url).then((res) => res.json()); +const fetcher = (url) => fetch(url).then((res) => res.json()); export default function TransformerLabSettings({}) { const [showPassword, setShowPassword] = React.useState(false); @@ -52,16 +52,12 @@ export default function TransformerLabSettings({}) { endDecorator={ <IconButton onClick={() => { - const hfToken = document.getElementsByName( - 'hftoken' - )[0] as HTMLInputElement; - - if (hfToken.type === 'text') { - hfToken.type = 'password'; + var x = document.getElementsByName('hftoken')[0]; + if (x.type === 'text') { + x.type = 'password'; } else { - hfToken.type = 'text'; + x.type = 'text'; } - setShowPassword(!showPassword); }} > @@ -72,10 +68,7 @@ export default function TransformerLabSettings({}) { )} <Button onClick={async () => { - const tokenElement = document.getElementsByName( - 'hftoken' - )[0] as HTMLInputElement; - const token = tokenElement.value; + const token = document.getElementsByName('hftoken')[0].value; await fetch( chatAPI.Endpoints.Config.Set( 'HuggingfaceUserAccessToken', diff --git a/src/renderer/components/Welcome.tsx b/src/renderer/components/Welcome.tsx index a16faec4497a5d08ed1e50c0fb878aa7e4d9ee7d..fded8eceb3c7b127b7cb147a129c3235f7e90967 100644 --- a/src/renderer/components/Welcome.tsx +++ b/src/renderer/components/Welcome.tsx @@ -1,8 +1,12 @@ /* eslint-disable jsx-a11y/anchor-is-valid */ -import { Sheet, Stack, Typography } from '@mui/joy'; +import { Button, Sheet, Stack, Typography } from '@mui/joy'; +import { ArrowRightCircleIcon, FlaskConicalIcon } from 'lucide-react'; + +async function testStore() {} import labImage from '../img/lab.jpg'; + import flaskLogo from '../img/flask.png'; function LogoComponent() { @@ -10,15 +14,13 @@ function LogoComponent() { <img src={flaskLogo} width="38" - style={{ - verticalAlign: 'middle', - marginBottom: '10px', - display: 'inline-block', - }} + style={{ verticalAlign: 'middle', marginBottom: '10px' }} /> ); } +testStore(); + export default function Welcome() { return ( <Sheet diff --git a/src/renderer/preload.d.ts b/src/renderer/preload.d.ts index 3ca15afc70a423ca534d696004b6d5120dc56841..3ff48d7b91ae443f317367c9f4ef75e7d41615f9 100644 --- a/src/renderer/preload.d.ts +++ b/src/renderer/preload.d.ts @@ -1,27 +1,10 @@ import { ElectronHandler } from 'main/preload'; -interface Platform { - node: () => string, - chrome: () => string, - electron: () => string, - isMac: () => string, - isWindows: () => string, - isLinux: () => string, - platform: () => string, - arch: () => string, -} - declare global { // eslint-disable-next-line no-unused-vars interface Window { electron: ElectronHandler; - TransformerLab: { - API_URL?: string; - } - platform: Platform - storage: Storage } - } export {};