diff --git a/electron/menu.js b/electron/menu.js index ac00af758..b497c897b 100644 --- a/electron/menu.js +++ b/electron/menu.js @@ -54,12 +54,21 @@ function getMenu(window) { { label: api.isListening() ? 'Disable Server' : 'Enable Server', click: (async () => { + let success = false; try { await api.toggleServer(); + success = true; } catch (error) { log.error(error); utils.showErrorBox('Error Toggling Server', error); } + if (success && api.isListening()) { + utils.writeToast(window, "Started API Server", "success"); + } else if (success && !api.isListening()) { + utils.writeToast(window, "Stopped API Server", "success"); + } else { + utils.writeToast(window, 'Error Toggling Server', "error"); + } refreshMenu(window); }) }, @@ -67,6 +76,11 @@ function getMenu(window) { label: api.isAutostart() ? 'Disable Autostart' : 'Enable Autostart', click: (async () => { api.toggleAutostart(); + if (api.isAutostart()) { + utils.writeToast(window, "Enabled API Server Autostart", "success"); + } else { + utils.writeToast(window, "Disabled API Server Autostart", "success"); + } refreshMenu(window); }) }, @@ -76,6 +90,7 @@ function getMenu(window) { const token = api.getAuthenticationToken(); log.log('Wrote authentication token to clipboard'); clipboard.writeText(token); + utils.writeToast(window, "Copied Authentication Token to Clipboard", "info"); }) }, { diff --git a/electron/utils.js b/electron/utils.js index ed88a01f9..03175b57b 100644 --- a/electron/utils.js +++ b/electron/utils.js @@ -93,6 +93,16 @@ async function exportSave(window) { .executeJavaScript(`${exportSaveFromIndexedDb.toString()}; exportSaveFromIndexedDb();`, true); } +async function writeTerminal(window, message, type = null) { + await window.webContents + .executeJavaScript(`window.appNotifier.terminal("${message}", "${type}");`, true) +} + +async function writeToast(window, message, type = "info", duration = 2000) { + await window.webContents + .executeJavaScript(`window.appNotifier.toast("${message}", "${type}", ${duration});`, true) +} + function openExternal(url) { shell.openExternal(url); global.app_playerOpenedExternalLink = true; @@ -101,5 +111,5 @@ function openExternal(url) { module.exports = { reloadAndKill, showErrorBox, exportSave, attachUnresponsiveAppHandler, detachUnresponsiveAppHandler, - openExternal, + openExternal, writeTerminal, writeToast, } diff --git a/src/Electron.tsx b/src/Electron.tsx index ba2e9866a..9931d3a5e 100644 --- a/src/Electron.tsx +++ b/src/Electron.tsx @@ -22,6 +22,9 @@ import { Server } from "./Server/Server"; import { Router } from "./ui/GameRoot"; import { Page } from "./ui/Router"; import { removeLeadingSlash } from "./Terminal/DirectoryHelpers"; +import { Terminal } from './Terminal'; +import { SnackbarEvents } from "./ui/React/Snackbar"; +import { IMap } from "./types"; interface Achievement { ID: string; @@ -417,6 +420,7 @@ export function initElectron(): void { setAchievements([]); initWebserver(); setInterval(calculateAchievements, 5000); + initAppNotifier(); } function initWebserver(): void { @@ -451,3 +455,27 @@ function initWebserver(): void { return "not a script file"; }; } + +// Expose certain alert functions to allow the wrapper to sends message to the game +function initAppNotifier(): void { + const funcs = { + terminal: (message: string, type?: string) => { + const typesFn: IMap<(s: string) => void> = { + info: Terminal.info, + warn: Terminal.warn, + error: Terminal.error, + success: Terminal.success + }; + let fn; + if (type) fn = typesFn[type]; + if (!fn) fn = Terminal.print; + fn.bind(Terminal)(message); + }, + toast: (message: string, type: "info" | "success" | "warning" | "error" , duration = 2000) => + SnackbarEvents.emit(message, type, duration), + } + + // Will be consumud by the electron wrapper. + // @ts-ignore + window.appNotifier = funcs; +}