gui/modules/desktop/electron/electron.ts
2023-02-14 14:31:06 +08:00

141 lines
3.2 KiB
TypeScript

import windowStateManager from "electron-window-state";
import { app, BrowserWindow, ipcMain } from "electron";
import contextMenu from "electron-context-menu";
import serve from "electron-serve";
import { getInstalledPackages } from "./libs/teaDir";
import { readSessionData, writeSessionData } from "./libs/auth";
import type { Session } from "../src/libs/types";
import { installPackage, openTerminal } from "./libs/cli";
// try {
// //@ts-ignore only used in dev should not be packaged inprod
// /* eslint-disable */
// const er = require('electron-reloader');
// er(module);
// } catch (e) {
// console.error(e);
// }
const serveURL = serve({ directory: "." });
const port = process.env.PORT || 3000;
const dev = !app.isPackaged;
let mainWindow: BrowserWindow | null;
function createWindow() {
const windowState = windowStateManager({
defaultWidth: 800,
defaultHeight: 600
});
const mainWindow = new BrowserWindow({
backgroundColor: "whitesmoke",
autoHideMenuBar: true,
trafficLightPosition: {
x: 17,
y: 32
},
minHeight: 450,
minWidth: 500,
webPreferences: {
// enableRemoteModule: true,
contextIsolation: false,
nodeIntegration: true,
spellcheck: false,
webSecurity: false,
devTools: dev
// preload: path.join(app.getAppPath(), 'preload.cjs')
},
x: windowState.x,
y: windowState.y,
width: windowState.width,
height: windowState.height
});
windowState.manage(mainWindow);
mainWindow.once("ready-to-show", () => {
mainWindow.show();
mainWindow.focus();
});
mainWindow.on("close", () => {
windowState.saveState(mainWindow);
});
return mainWindow;
}
contextMenu({
showLookUpSelection: false,
showSearchWithGoogle: false,
showCopyImage: false,
prepend: (defaultActions, params, browserWindow) => [
{
label: "Make App 💻"
}
]
});
function loadVite(port) {
mainWindow?.loadURL(`http://localhost:${port}`).catch((e) => {
console.log("Error loading URL, retrying", e);
setTimeout(() => {
loadVite(port);
}, 200);
});
}
function createMainWindow() {
mainWindow = createWindow();
mainWindow.once("close", () => {
mainWindow = null;
});
if (dev) loadVite(port);
else serveURL(mainWindow);
}
app.once("ready", createMainWindow);
app.on("activate", () => {
if (!mainWindow) {
createMainWindow();
}
});
app.on("window-all-closed", () => {
if (process.platform !== "darwin") app.quit();
});
ipcMain.on("to-main", (event, count) => {
return mainWindow?.webContents.send("from-main", `next count is ${count + 1}`);
});
ipcMain.handle("get-installed-packages", async () => {
const pkgs = await getInstalledPackages();
return pkgs;
});
ipcMain.handle("get-session", async () => {
const session = await readSessionData();
return session;
});
ipcMain.handle("update-session", async (_, data) => {
await writeSessionData(data as Session);
});
ipcMain.handle("install-package", async (_, data) => {
const result = await installPackage(data.full_name);
return result;
});
ipcMain.handle("open-terminal", async (_, data) => {
const { cmd } = data as { cmd: string };
try {
// TODO: detect if mac or linux
// current openTerminal is only design for Mac
await openTerminal(cmd);
} catch (error) {
console.error("elast:", error);
}
});