production-taskbar-client / src / main / ipc / mainChannel.js
mainChannel.js
Raw
import { app, ipcMain, desktopCapturer } from "electron";
import { spawn } from "child_process";
import log from "electron-log";
import fs from "fs";
import path from "path";
import { promisify } from "util";
import settings from "../settings";
import { sendAdmin } from "../utils/nodemailer";

const rm = promisify(fs.rm);

const isWin = process.platform === "win32";
const isDev = process.env.NODE_ENV === "development";
const dbPath = path.normalize(path.join(app.getPath("userData"), "IndexedDB"));
let relaunchLock = false;
let pruneDBLock = false;

const setFloating = (bool) => {
  const mainWindowSettings = settings.get("mainWindowSettings");
  settings.set("mainWindowSettings", {
    ...mainWindowSettings,
    isFloating: bool,
  });
};

const relaunch = () => {
  app.relaunch();
  app.quit();
};

export default function initMainChannel() {
  ipcMain.handle("main", async (_e, { event, payload }) => {
    switch (event) {
      case "delete-db": {
        const err = await rm(dbPath, { recursive: true, force: true });
        if (err) return { result: "error", error: err };
        return { result: "success" };
      }
      case "exit-app":
        app.quit();
        break;
      case "relaunch-app":
        relaunch();
        break;
      case "switch-to-compact":
        if (!relaunchLock) {
          relaunchLock = true;
          setFloating(true);
          relaunch();
        }
        break;
      case "switch-to-normal":
        if (!relaunchLock) {
          relaunchLock = true;
          setFloating(false);
          relaunch();
        }
        break;
      case "sendmail-admin": {
        if (!isDev)
          sendAdmin({
            error: payload,
            versions: `renderer, ${app.getVersion()}`,
          });
        break;
      }
      case "get-screens": {
        return desktopCapturer.getSources({ types: ["screen"] });
      }
      case "prune-db-and-restart": {
        if (isWin && !pruneDBLock) {
          pruneDBLock = true;
          const exePath = app.getPath("exe");
          const exeDir = path.dirname(exePath);
          const taskillCmd = `taskkill /f /IM ${path.basename(exePath)}`;
          const pruneDBCmd = `rmdir /s /q ${dbPath}`;
          const startCmd = `start /D ${exeDir} ${exePath}`;
          const command = `${taskillCmd} & ${pruneDBCmd} & ${startCmd}`;
          log.info(`prune-db-and-restart command executed:\n${command}`);
          spawn(`"cmd.exe" /c ${command}`, {
            shell: true,
            detached: true,
            stdio: "ignore",
          });
          pruneDBLock = false;
        }
        break;
      }
      default:
        break;
    }
    return null;
  });
}