ohmysearch
Version:
Ohmysearch - customizable all in one search tool to boost developer productivity
248 lines (226 loc) • 6.55 kB
text/typescript
import {
app,
globalShortcut,
BrowserWindow,
Menu,
Tray,
webContents,
shell,
ipcMain,
} from "electron";
import config from "./config";
const Fuse = require("fuse.js");
const loudness = require("loudness");
import { autoUpdater } from "electron-updater";
const path = require("path");
const isDevelopment = !app.isPackaged;
const assetsDirectory = path.join(__dirname, "main-assets");
let pinnedSpotlight = false;
const openCommand = process.platform === "win32" ? "Alt+Space" : "Option+Space";
const closeCommand = "Esc";
let mainWindow: BrowserWindow | undefined;
let getMainWindow = (): BrowserWindow | undefined => mainWindow;
const gotTheLock = app.requestSingleInstanceLock();
console.log("[main/index.ts] electron version", app.getVersion());
const createTray = () => {
tray = new Tray(path.join(assetsDirectory, "sunTemplate.png"));
const contextMenu = Menu.buildFromTemplate([
{
label: "Open Spotlight",
type: "normal",
click: () => {
showWindow();
},
},
{
label: "Open Devtool",
type: "normal",
click: () => {
getMainWindow()?.webContents.openDevTools({
mode: "detach",
});
},
},
{
label: "Quit",
type: "normal",
click: () => {
getMainWindow()?.close();
getMainWindow()?.destroy();
app.quit();
},
},
]);
tray.setToolTip("set");
tray.setContextMenu(contextMenu);
tray.on("click", function (event) {});
};
function registerIpc() {
ipcMain.on("open-url", (event, arg) => {
console.log("event open url", arg);
shell.openExternal(arg.url);
});
ipcMain.on("pin-spotlight", (event, arg) => {
pinnedSpotlight = true;
});
ipcMain.on("unpin-spotlight", (event, arg) => {
pinnedSpotlight = false;
});
ipcMain.on("unmute-volume", async (event, arg) => {
console.log("unmute");
await loudness.setMuted(false);
});
ipcMain.on("mute-volume", async (event, arg) => {
await loudness.setMuted(true);
console.log("mute");
});
ipcMain.on("search-request", (event, arg) => {
let data = [] as any;
if (data.length > config.output.max) {
//max nr of items shown
getMainWindow()?.setSize(
config.mainWindow.width,
config.mainWindow.height +
config.output.heightPerItem * config.output.max
);
} else {
//lower nr of items
getMainWindow()?.setSize(
config.mainWindow.width,
config.mainWindow.height + config.output.heightPerItem * data.length
);
}
event.sender.send("search-reply", data);
});
// to be used in the future if i want to reset other things
ipcMain.on("reset", (event, arg) => {
if (arg) {
switch (arg) {
case "size":
getMainWindow().setSize(
config.mainWindow.width,
config.mainWindow.height
);
break;
}
}
});
ipcMain.on("app-version", (event) => {
event.sender.send("app-version", { version: app.getVersion() });
});
}
function createWindow() {
// Create the browser window.
mainWindow = new BrowserWindow(config.mainWindow);
mainWindow.setBackgroundColor("#ffffff");
const port = process.env.PORT || 3344;
if (isDevelopment) {
console.log("app", port);
void getMainWindow()?.loadURL(`http://localhost:${port}`);
} else {
void getMainWindow()?.loadFile("./renderer/index.html");
// and load the index.html of the app.
// mainWindow.loadURL(url.format({
// pathname: path.join(process.cwd(), './src/index.html'),
// protocol: 'file:',
// slashes: true
// }))
}
getMainWindow()?.webContents.focus();
registerIpc();
getMainWindow()?.on("closed", function () {
mainWindow = undefined;
});
getMainWindow()?.on("show", () => {
getMainWindow()?.webContents.executeJavaScript(
`document.getElementById('oms-input')?.focus()`
);
});
getMainWindow()?.on("ready-to-show", () => {
autoUpdater.checkForUpdatesAndNotify();
});
}
if (!gotTheLock) {
console.log("!got the lock");
app.quit();
} else {
app.on("second-instance", (event, commandLine, workingDir) => {
console.log("second-instance");
if (mainWindow) {
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.focus();
}
});
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(() => {
if (process.platform === "darwin") {
app.dock.hide();
}
createTray();
const ret = globalShortcut.register(openCommand, () => {
showWindow();
});
if (!ret) {
console.error("registration failed");
}
const rett = globalShortcut.register(closeCommand, () => {
if (!pinnedSpotlight) {
getMainWindow()?.hide();
}
});
console.log(globalShortcut.isRegistered(openCommand));
});
}
let tray: Tray | undefined;
function showWindow() {
if (!mainWindow) {
createWindow();
}
getMainWindow()?.show();
getMainWindow()?.focus();
getMainWindow()?.webContents.focus();
}
// Quit when all windows are closed.
app.on("window-all-closed", function () {
console.log("window-all-closed");
globalShortcut.unregister(openCommand);
globalShortcut.unregisterAll();
// On OS X it is common for applications and their menu bar
// to stay active until the user quits explicitly with Cmd + Q
if (process.platform !== "darwin") {
app.quit();
}
});
app.on("browser-window-blur", (event, win) => {
console.log("electron window blur");
if (!pinnedSpotlight) {
getMainWindow()?.hide();
}
globalShortcut.unregister(closeCommand);
});
app.on("browser-window-focus", (event, win) => {
const rett = globalShortcut.register(closeCommand, () => {
if (!pinnedSpotlight) {
getMainWindow()?.hide();
}
});
console.log(globalShortcut.isRegistered(openCommand));
});
app.on("activate", function () {
console.log("activate");
// On OS X it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (mainWindow === null) {
showWindow();
}
});
autoUpdater.on("update-available", () => {
getMainWindow()?.webContents.send("update-available");
console.log("update downloaded");
});
autoUpdater.on("update-downloaded", () => {
console.log("update downloaded");
getMainWindow()?.webContents.send("update-downloaded");
});