feat: create menu items with check for updates action
This commit is contained in:
parent
34103b9701
commit
0a5a39c720
185
electron/main.ts
185
electron/main.ts
@ -1,30 +1,41 @@
|
||||
import {
|
||||
app,
|
||||
BrowserWindow,
|
||||
screen as electronScreen,
|
||||
ipcMain,
|
||||
dialog,
|
||||
shell,
|
||||
} from "electron";
|
||||
import { app, BrowserWindow, ipcMain, dialog, shell } from "electron";
|
||||
import { readdirSync } from "fs";
|
||||
import { resolve, join, extname } from "path";
|
||||
import { rmdir, unlink, createWriteStream } from "fs";
|
||||
import isDev = require("electron-is-dev");
|
||||
import { init } from "./core/plugin-manager/pluginMgr";
|
||||
const { autoUpdater } = require("electron-updater");
|
||||
const Store = require("electron-store");
|
||||
import { setupMenu } from "./utils/menu";
|
||||
|
||||
import isDev = require("electron-is-dev");
|
||||
// @ts-ignore
|
||||
import request = require("request");
|
||||
// @ts-ignore
|
||||
import progress = require("request-progress");
|
||||
const { autoUpdater } = require("electron-updater");
|
||||
const Store = require("electron-store");
|
||||
|
||||
let mainWindow: BrowserWindow | undefined = undefined;
|
||||
const store = new Store();
|
||||
|
||||
autoUpdater.autoDownload = false;
|
||||
autoUpdater.autoInstallOnAppQuit = true;
|
||||
app
|
||||
.whenReady()
|
||||
.then(migratePlugins)
|
||||
.then(setupPlugins)
|
||||
.then(setupMenu)
|
||||
.then(handleIPCs)
|
||||
.then(handleAppUpdates)
|
||||
.then(createMainWindow)
|
||||
.then(() => {
|
||||
app.on("activate", () => {
|
||||
if (!BrowserWindow.getAllWindows().length) {
|
||||
createMainWindow();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const createMainWindow = () => {
|
||||
app.on("window-all-closed", () => {
|
||||
app.quit();
|
||||
});
|
||||
|
||||
function createMainWindow() {
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 1200,
|
||||
height: 800,
|
||||
@ -37,6 +48,61 @@ const createMainWindow = () => {
|
||||
},
|
||||
});
|
||||
|
||||
const startURL = isDev
|
||||
? "http://localhost:3000"
|
||||
: `file://${join(__dirname, "../renderer/index.html")}`;
|
||||
|
||||
mainWindow.loadURL(startURL);
|
||||
|
||||
mainWindow.once("ready-to-show", () => mainWindow?.show());
|
||||
mainWindow.on("closed", () => {
|
||||
if (process.platform !== "darwin") app.quit();
|
||||
});
|
||||
|
||||
if (isDev) mainWindow.webContents.openDevTools();
|
||||
}
|
||||
|
||||
function handleAppUpdates() {
|
||||
/*New Update Available*/
|
||||
autoUpdater.on("update-available", async (_info: any) => {
|
||||
const action = await dialog.showMessageBox({
|
||||
message: `Update available. Do you want to download the latest update?`,
|
||||
buttons: ["Download", "Later"],
|
||||
});
|
||||
if (action.response === 0) await autoUpdater.downloadUpdate();
|
||||
});
|
||||
|
||||
/*App Update Completion Message*/
|
||||
autoUpdater.on("update-downloaded", async (_info: any) => {
|
||||
mainWindow?.webContents.send("APP_UPDATE_COMPLETE", {});
|
||||
const action = await dialog.showMessageBox({
|
||||
message: `Update downloaded. Please restart the application to apply the updates.`,
|
||||
buttons: ["Restart", "Later"],
|
||||
});
|
||||
if (action.response === 0) {
|
||||
autoUpdater.quitAndInstall();
|
||||
}
|
||||
});
|
||||
|
||||
/*App Update Error */
|
||||
autoUpdater.on("error", (info: any) => {
|
||||
dialog.showMessageBox({ message: info.message });
|
||||
mainWindow?.webContents.send("APP_UPDATE_ERROR", {});
|
||||
});
|
||||
|
||||
/*App Update Progress */
|
||||
autoUpdater.on("download-progress", (progress: any) => {
|
||||
console.log("app update progress: ", progress.percent);
|
||||
mainWindow?.webContents.send("APP_UPDATE_PROGRESS", {
|
||||
percent: progress.percent,
|
||||
});
|
||||
});
|
||||
autoUpdater.autoDownload = false;
|
||||
autoUpdater.autoInstallOnAppQuit = true;
|
||||
autoUpdater.checkForUpdates();
|
||||
}
|
||||
|
||||
function handleIPCs() {
|
||||
ipcMain.handle(
|
||||
"invokePluginFunc",
|
||||
async (_event, modulePath, method, ...args) => {
|
||||
@ -56,30 +122,7 @@ const createMainWindow = () => {
|
||||
.catch((err) => console.log(err));
|
||||
}
|
||||
);
|
||||
|
||||
const startURL = isDev
|
||||
? "http://localhost:3000"
|
||||
: `file://${join(__dirname, "../renderer/index.html")}`;
|
||||
|
||||
mainWindow.loadURL(startURL);
|
||||
|
||||
mainWindow.once("ready-to-show", () => mainWindow?.show());
|
||||
mainWindow.on("closed", () => {
|
||||
if (process.platform !== "darwin") app.quit();
|
||||
});
|
||||
|
||||
if (isDev) mainWindow.webContents.openDevTools();
|
||||
};
|
||||
|
||||
app
|
||||
.whenReady()
|
||||
.then(migratePlugins)
|
||||
.then(() => {
|
||||
createMainWindow();
|
||||
setupPlugins();
|
||||
autoUpdater.checkForUpdates();
|
||||
|
||||
ipcMain.handle("basePlugins", async (event) => {
|
||||
ipcMain.handle("basePlugins", async (_event) => {
|
||||
const basePluginPath = join(
|
||||
__dirname,
|
||||
"../",
|
||||
@ -90,13 +133,13 @@ app
|
||||
.map((file) => join(basePluginPath, file));
|
||||
});
|
||||
|
||||
ipcMain.handle("pluginPath", async (event) => {
|
||||
ipcMain.handle("pluginPath", async (_event) => {
|
||||
return join(app.getPath("userData"), "plugins");
|
||||
});
|
||||
ipcMain.handle("appVersion", async (event) => {
|
||||
ipcMain.handle("appVersion", async (_event) => {
|
||||
return app.getVersion();
|
||||
});
|
||||
ipcMain.handle("openExternalUrl", async (event, url) => {
|
||||
ipcMain.handle("openExternalUrl", async (_event, url) => {
|
||||
shell.openExternal(url);
|
||||
});
|
||||
|
||||
@ -116,9 +159,7 @@ app
|
||||
} else {
|
||||
result = "File deleted successfully";
|
||||
}
|
||||
console.log(
|
||||
`Delete file ${filePath} from ${fullPath} result: ${result}`
|
||||
);
|
||||
console.log(`Delete file ${filePath} from ${fullPath} result: ${result}`);
|
||||
});
|
||||
|
||||
return result;
|
||||
@ -151,57 +192,11 @@ app
|
||||
})
|
||||
.pipe(createWriteStream(destination));
|
||||
});
|
||||
|
||||
app.on("activate", () => {
|
||||
if (!BrowserWindow.getAllWindows().length) {
|
||||
createMainWindow();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/*New Update Available*/
|
||||
autoUpdater.on("update-available", async (info: any) => {
|
||||
const action = await dialog.showMessageBox({
|
||||
message: `Update available. Do you want to download the latest update?`,
|
||||
buttons: ["Download", "Later"],
|
||||
});
|
||||
if (action.response === 0) await autoUpdater.downloadUpdate();
|
||||
});
|
||||
|
||||
/*App Update Completion Message*/
|
||||
autoUpdater.on("update-downloaded", async (info: any) => {
|
||||
mainWindow?.webContents.send("APP_UPDATE_COMPLETE", {});
|
||||
const action = await dialog.showMessageBox({
|
||||
message: `Update downloaded. Please restart the application to apply the updates.`,
|
||||
buttons: ["Restart", "Later"],
|
||||
});
|
||||
if (action.response === 0) {
|
||||
autoUpdater.quitAndInstall();
|
||||
}
|
||||
});
|
||||
|
||||
/*App Update Error */
|
||||
autoUpdater.on("error", (info: any) => {
|
||||
dialog.showMessageBox({ message: info.message });
|
||||
mainWindow?.webContents.send("APP_UPDATE_ERROR", {});
|
||||
});
|
||||
|
||||
/*App Update Progress */
|
||||
autoUpdater.on("download-progress", (progress: any) => {
|
||||
console.log("app update progress: ", progress.percent);
|
||||
mainWindow?.webContents.send("APP_UPDATE_PROGRESS", {
|
||||
percent: progress.percent,
|
||||
});
|
||||
});
|
||||
|
||||
app.on("window-all-closed", () => {
|
||||
if (process.platform !== "darwin") {
|
||||
app.quit();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function migratePlugins() {
|
||||
return new Promise((resolve) => {
|
||||
const store = new Store();
|
||||
if (store.get("migrated_version") !== app.getVersion()) {
|
||||
console.log("start migration:", store.get("migrated_version"));
|
||||
const userDataPath = app.getPath("userData");
|
||||
@ -217,12 +212,12 @@ function migratePlugins() {
|
||||
resolve(undefined);
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
function setupPlugins() {
|
||||
init({
|
||||
// Function to check from the main process that user wants to install a plugin
|
||||
confirmInstall: async (plugins: string[]) => {
|
||||
confirmInstall: async (_plugins: string[]) => {
|
||||
return true;
|
||||
},
|
||||
// Path to install plugin to
|
||||
|
||||
98
electron/utils/menu.ts
Normal file
98
electron/utils/menu.ts
Normal file
@ -0,0 +1,98 @@
|
||||
// @ts-nocheck
|
||||
const { app, Menu } = require("electron");
|
||||
const isMac = process.platform === "darwin";
|
||||
const { autoUpdater } = require("electron-updater");
|
||||
|
||||
const template: (Electron.MenuItemConstructorOptions | Electron.MenuItem)[] = [
|
||||
...(isMac
|
||||
? [
|
||||
{
|
||||
label: app.name,
|
||||
submenu: [
|
||||
{ role: "about" },
|
||||
{
|
||||
label: "Check for Updates...",
|
||||
click: () => autoUpdater.checkForUpdates(),
|
||||
},
|
||||
{ type: "separator" },
|
||||
{ role: "services" },
|
||||
{ type: "separator" },
|
||||
{ role: "hide" },
|
||||
{ role: "hideOthers" },
|
||||
{ role: "unhide" },
|
||||
{ type: "separator" },
|
||||
{ role: "quit" },
|
||||
],
|
||||
},
|
||||
]
|
||||
: []),
|
||||
{
|
||||
label: "Edit",
|
||||
submenu: [
|
||||
{ role: "undo" },
|
||||
{ role: "redo" },
|
||||
{ type: "separator" },
|
||||
{ role: "cut" },
|
||||
{ role: "copy" },
|
||||
{ role: "paste" },
|
||||
...(isMac
|
||||
? [
|
||||
{ role: "pasteAndMatchStyle" },
|
||||
{ role: "delete" },
|
||||
{ role: "selectAll" },
|
||||
{ type: "separator" },
|
||||
{
|
||||
label: "Speech",
|
||||
submenu: [{ role: "startSpeaking" }, { role: "stopSpeaking" }],
|
||||
},
|
||||
]
|
||||
: [{ role: "delete" }, { type: "separator" }, { role: "selectAll" }]),
|
||||
],
|
||||
},
|
||||
{
|
||||
label: "View",
|
||||
submenu: [
|
||||
{ role: "reload" },
|
||||
{ role: "forceReload" },
|
||||
{ role: "toggleDevTools" },
|
||||
{ type: "separator" },
|
||||
{ role: "resetZoom" },
|
||||
{ role: "zoomIn" },
|
||||
{ role: "zoomOut" },
|
||||
{ type: "separator" },
|
||||
{ role: "togglefullscreen" },
|
||||
],
|
||||
},
|
||||
{
|
||||
label: "Window",
|
||||
submenu: [
|
||||
{ role: "minimize" },
|
||||
{ role: "zoom" },
|
||||
...(isMac
|
||||
? [
|
||||
{ type: "separator" },
|
||||
{ role: "front" },
|
||||
{ type: "separator" },
|
||||
{ role: "window" },
|
||||
]
|
||||
: [{ role: "close" }]),
|
||||
],
|
||||
},
|
||||
{
|
||||
role: "help",
|
||||
submenu: [
|
||||
{
|
||||
label: "Learn More",
|
||||
click: async () => {
|
||||
const { shell } = require("electron");
|
||||
await shell.openExternal("https://jan.ai/");
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export const setupMenu = () => {
|
||||
const menu = Menu.buildFromTemplate(template);
|
||||
Menu.setApplicationMenu(menu);
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user