mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-10 10:11:46 +00:00
add inline doc
This commit is contained in:
18
index.js
18
index.js
@ -110,8 +110,8 @@ function createMainWindow() {
|
||||
titleBarStyle: useInlineMenu
|
||||
? "hidden"
|
||||
: is.macOS()
|
||||
? "hiddenInset"
|
||||
: "default",
|
||||
? "hiddenInset"
|
||||
: "default",
|
||||
autoHideMenuBar: config.get("options.hideMenu"),
|
||||
});
|
||||
if (windowPosition) {
|
||||
@ -156,7 +156,7 @@ function createMainWindow() {
|
||||
|
||||
let createdWindow = false;
|
||||
app.on("browser-window-created", (event, win) => {
|
||||
//Ensure listeners aren't registered when creating input dialog
|
||||
//Ensures listeners are registered only once
|
||||
if (createdWindow) {
|
||||
return;
|
||||
}
|
||||
@ -172,7 +172,7 @@ app.on("browser-window-created", (event, win) => {
|
||||
frameProcessId,
|
||||
frameRoutingId,
|
||||
) => {
|
||||
let log = {
|
||||
const log = {
|
||||
error: "did-fail-load",
|
||||
event,
|
||||
errorCode,
|
||||
@ -183,7 +183,7 @@ app.on("browser-window-created", (event, win) => {
|
||||
frameRoutingId,
|
||||
};
|
||||
if (is.dev()) {
|
||||
console.log(log);
|
||||
console.log(log.toString());
|
||||
}
|
||||
win.webContents.send("log", log);
|
||||
win.webContents.loadFile(path.join(__dirname, "error.html"));
|
||||
@ -306,13 +306,11 @@ app.on("ready", () => {
|
||||
}
|
||||
|
||||
// Optimized for Mac OS X
|
||||
if (is.macOS()) {
|
||||
if (!config.get("options.appVisible")) {
|
||||
app.dock.hide();
|
||||
}
|
||||
if (is.macOS() && !config.get("options.appVisible")) {
|
||||
app.dock.hide();
|
||||
}
|
||||
|
||||
var forceQuit = false;
|
||||
let forceQuit = false;
|
||||
app.on("before-quit", () => {
|
||||
forceQuit = true;
|
||||
});
|
||||
|
||||
1
menu.js
1
menu.js
@ -12,6 +12,7 @@ const pluginEnabledMenu = (win, plugin, label = "", hasSubmenu = false) => ({
|
||||
label: label || plugin,
|
||||
type: "checkbox",
|
||||
checked: config.plugins.isEnabled(plugin),
|
||||
//Submenu check used in in-app-menu
|
||||
hasSubmenu: hasSubmenu || undefined,
|
||||
click: (item) => {
|
||||
if (item.checked) {
|
||||
|
||||
@ -1,11 +1,15 @@
|
||||
const { ipcRenderer } = require("electron");
|
||||
|
||||
function logToString(log) {
|
||||
let string = (typeof log === "string") ? log : log.toString();
|
||||
if (!string || string.includes("[object Object]")) {
|
||||
string = JSON.stringify(log);
|
||||
}
|
||||
return string;
|
||||
}
|
||||
|
||||
module.exports = () => {
|
||||
ipcRenderer.on("log", (event, log) => {
|
||||
let string = log || log.toString();
|
||||
if (!string || string === "[object Object]") {
|
||||
string = JSON.stringify(log);
|
||||
}
|
||||
console.log(string);
|
||||
})
|
||||
};
|
||||
ipcRenderer.on("log", (event, log) => {
|
||||
console.log(logToString(log));
|
||||
});
|
||||
};
|
||||
|
||||
@ -10,8 +10,10 @@ const DEFAULT_HEIGHT = 160;
|
||||
|
||||
function electronPrompt(options, parentWindow) {
|
||||
return new Promise((resolve, reject) => {
|
||||
//id used to ensure unique listeners per window
|
||||
const id = `${Date.now()}-${Math.random()}`;
|
||||
|
||||
//custom options override default
|
||||
const options_ = Object.assign(
|
||||
{
|
||||
width: DEFAULT_WIDTH,
|
||||
@ -19,12 +21,12 @@ function electronPrompt(options, parentWindow) {
|
||||
minWidth: DEFAULT_WIDTH,
|
||||
minHeight: DEFAULT_HEIGHT,
|
||||
resizable: false,
|
||||
title: 'Prompt',
|
||||
label: 'Please input a value:',
|
||||
title: "Prompt",
|
||||
label: "Please input a value:",
|
||||
buttonLabels: null,
|
||||
alwaysOnTop: false,
|
||||
value: null,
|
||||
type: 'input',
|
||||
type: "input",
|
||||
selectOptions: null,
|
||||
icon: null,
|
||||
useHtmlLabel: false,
|
||||
@ -70,10 +72,7 @@ function electronPrompt(options, parentWindow) {
|
||||
promptWindow.setMenu(null);
|
||||
promptWindow.setMenuBarVisibility(options_.menuBarVisible);
|
||||
|
||||
const getOptionsListener = event => {
|
||||
event.returnValue = JSON.stringify(options_);
|
||||
};
|
||||
|
||||
//called on exit
|
||||
const cleanup = () => {
|
||||
ipcMain.removeListener("prompt-get-options:" + id, getOptionsListener);
|
||||
ipcMain.removeListener("prompt-post-data:" + id, postDataListener);
|
||||
@ -85,6 +84,12 @@ function electronPrompt(options, parentWindow) {
|
||||
}
|
||||
};
|
||||
|
||||
///transfer options to front
|
||||
const getOptionsListener = event => {
|
||||
event.returnValue = JSON.stringify(options_);
|
||||
};
|
||||
|
||||
//get input from front
|
||||
const postDataListener = (event, value) => {
|
||||
resolve(value);
|
||||
event.returnValue = null;
|
||||
@ -96,12 +101,14 @@ function electronPrompt(options, parentWindow) {
|
||||
cleanup();
|
||||
};
|
||||
|
||||
//get error from front
|
||||
const errorListener = (event, message) => {
|
||||
reject(new Error(message));
|
||||
event.returnValue = null;
|
||||
cleanup();
|
||||
};
|
||||
|
||||
//attach listeners
|
||||
ipcMain.on("prompt-get-options:" + id, getOptionsListener);
|
||||
ipcMain.on("prompt-post-data:" + id, postDataListener);
|
||||
ipcMain.on("prompt-error:" + id, errorListener);
|
||||
@ -113,13 +120,23 @@ function electronPrompt(options, parentWindow) {
|
||||
resolve(null);
|
||||
});
|
||||
|
||||
const promptUrl = url.format({
|
||||
protocol: "file",
|
||||
slashes: true,
|
||||
pathname: path.join(__dirname, "page", "prompt.html"),
|
||||
hash: id
|
||||
//should never happen
|
||||
promptWindow.webContents.on("did-fail-load", (
|
||||
event,
|
||||
errorCode,
|
||||
errorDescription,
|
||||
validatedURL,
|
||||
) => {
|
||||
const log = {
|
||||
error: "did-fail-load",
|
||||
errorCode,
|
||||
errorDescription,
|
||||
validatedURL,
|
||||
};
|
||||
reject(new Error("prompt.html did-fail-load, log:\n", + log.toString()));
|
||||
});
|
||||
|
||||
//Finally, load prompt
|
||||
promptWindow.loadURL(promptUrl);
|
||||
});
|
||||
}
|
||||
|
||||
@ -5,6 +5,93 @@ const docReady = require("doc-ready");
|
||||
let promptId = null;
|
||||
let promptOptions = null;
|
||||
|
||||
|
||||
docReady(promptRegister);
|
||||
//start here
|
||||
function promptRegister() {
|
||||
//get custom session id
|
||||
promptId = document.location.hash.replace("#", "");
|
||||
|
||||
//get options from back
|
||||
try {
|
||||
promptOptions = JSON.parse(ipcRenderer.sendSync("prompt-get-options:" + promptId));
|
||||
} catch (error) {
|
||||
return promptError(error);
|
||||
}
|
||||
|
||||
//set label
|
||||
if (promptOptions.useHtmlLabel) {
|
||||
document.querySelector("#label").innerHTML = promptOptions.label;
|
||||
} else {
|
||||
document.querySelector("#label").textContent = promptOptions.label;
|
||||
}
|
||||
|
||||
//set button label
|
||||
if (promptOptions.buttonLabels && promptOptions.buttonLabels.ok) {
|
||||
document.querySelector("#ok").textContent = promptOptions.buttonLabels.ok;
|
||||
}
|
||||
|
||||
if (promptOptions.buttonLabels && promptOptions.buttonLabels.cancel) {
|
||||
document.querySelector("#cancel").textContent = promptOptions.buttonLabels.cancel;
|
||||
}
|
||||
|
||||
//inject custom stylesheet from options
|
||||
if (promptOptions.customStylesheet) {
|
||||
try {
|
||||
const customStyleContent = fs.readFileSync(promptOptions.customStylesheet);
|
||||
if (customStyleContent) {
|
||||
const customStyle = document.createElement("style");
|
||||
customStyle.setAttribute("rel", "stylesheet");
|
||||
customStyle.append(document.createTextNode(customStyleContent));
|
||||
document.head.append(customStyle);
|
||||
}
|
||||
} catch (error) {
|
||||
return promptError(error);
|
||||
}
|
||||
}
|
||||
|
||||
//add button listeners
|
||||
document.querySelector("#form").addEventListener("submit", promptSubmit);
|
||||
document.querySelector("#cancel").addEventListener("click", promptCancel);
|
||||
|
||||
|
||||
//create input/select
|
||||
const dataContainerElement = document.querySelector("#data-container");
|
||||
let dataElement;
|
||||
if (promptOptions.type === "input") {
|
||||
dataElement = promptCreateInput();
|
||||
} else if (promptOptions.type === "select") {
|
||||
dataElement = promptCreateSelect();
|
||||
} else {
|
||||
return promptError(`Unhandled input type '${promptOptions.type}'`);
|
||||
}
|
||||
|
||||
dataContainerElement.append(dataElement);
|
||||
dataElement.setAttribute("id", "data");
|
||||
|
||||
dataElement.focus();
|
||||
if (promptOptions.type === "input") {
|
||||
dataElement.select();
|
||||
}
|
||||
|
||||
//load custom script from options
|
||||
if (promptOptions.customScript) {
|
||||
try {
|
||||
const customScript = require(promptOptions.customScript);
|
||||
customScript();
|
||||
} catch (error) {
|
||||
return promptError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("error", error => {
|
||||
if (promptId) {
|
||||
promptError("An error has occured on the prompt window: \n" + error);
|
||||
}
|
||||
});
|
||||
|
||||
//send error to back
|
||||
function promptError(error) {
|
||||
if (error instanceof Error) {
|
||||
error = error.message;
|
||||
@ -13,10 +100,12 @@ function promptError(error) {
|
||||
ipcRenderer.sendSync("prompt-error:" + promptId, error);
|
||||
}
|
||||
|
||||
//send to back: input=null
|
||||
function promptCancel() {
|
||||
ipcRenderer.sendSync("prompt-post-data:" + promptId, null);
|
||||
}
|
||||
|
||||
//transfer input data to back
|
||||
function promptSubmit() {
|
||||
const dataElement = document.querySelector("#data");
|
||||
let data = null;
|
||||
@ -32,6 +121,7 @@ function promptSubmit() {
|
||||
ipcRenderer.sendSync("prompt-post-data:" + promptId, data);
|
||||
}
|
||||
|
||||
//creates input box
|
||||
function promptCreateInput() {
|
||||
const dataElement = document.createElement("input");
|
||||
dataElement.setAttribute("type", "text");
|
||||
@ -42,6 +132,7 @@ function promptCreateInput() {
|
||||
dataElement.value = "";
|
||||
}
|
||||
|
||||
//insert custom input attributes if in options
|
||||
if (promptOptions.inputAttrs && typeof (promptOptions.inputAttrs) === "object") {
|
||||
for (const k in promptOptions.inputAttrs) {
|
||||
if (!Object.prototype.hasOwnProperty.call(promptOptions.inputAttrs, k)) {
|
||||
@ -52,12 +143,14 @@ function promptCreateInput() {
|
||||
}
|
||||
}
|
||||
|
||||
//Cancel/Exit on 'Escape'
|
||||
dataElement.addEventListener("keyup", event => {
|
||||
if (event.key === "Escape") {
|
||||
promptCancel();
|
||||
}
|
||||
});
|
||||
|
||||
//Confrim on 'Enter'
|
||||
dataElement.addEventListener("keypress", event => {
|
||||
if (event.key === "Enter") {
|
||||
event.preventDefault();
|
||||
@ -68,6 +161,7 @@ function promptCreateInput() {
|
||||
return dataElement;
|
||||
}
|
||||
|
||||
//create multiple select
|
||||
function promptCreateSelect() {
|
||||
const dataElement = document.createElement("select");
|
||||
let optionElement;
|
||||
@ -90,79 +184,5 @@ function promptCreateSelect() {
|
||||
return dataElement;
|
||||
}
|
||||
|
||||
function promptRegister() {
|
||||
promptId = document.location.hash.replace("#", "");
|
||||
|
||||
try {
|
||||
promptOptions = JSON.parse(ipcRenderer.sendSync("prompt-get-options:" + promptId));
|
||||
} catch (error) {
|
||||
return promptError(error);
|
||||
}
|
||||
|
||||
if (promptOptions.useHtmlLabel) {
|
||||
document.querySelector("#label").innerHTML = promptOptions.label;
|
||||
} else {
|
||||
document.querySelector("#label").textContent = promptOptions.label;
|
||||
}
|
||||
|
||||
if (promptOptions.buttonLabels && promptOptions.buttonLabels.ok) {
|
||||
document.querySelector("#ok").textContent = promptOptions.buttonLabels.ok;
|
||||
}
|
||||
|
||||
if (promptOptions.buttonLabels && promptOptions.buttonLabels.cancel) {
|
||||
document.querySelector("#cancel").textContent = promptOptions.buttonLabels.cancel;
|
||||
}
|
||||
|
||||
if (promptOptions.customStylesheet) {
|
||||
try {
|
||||
const customStyleContent = fs.readFileSync(promptOptions.customStylesheet);
|
||||
if (customStyleContent) {
|
||||
const customStyle = document.createElement("style");
|
||||
customStyle.setAttribute("rel", "stylesheet");
|
||||
customStyle.append(document.createTextNode(customStyleContent));
|
||||
document.head.append(customStyle);
|
||||
}
|
||||
} catch (error) {
|
||||
return promptError(error);
|
||||
}
|
||||
}
|
||||
|
||||
document.querySelector("#form").addEventListener("submit", promptSubmit);
|
||||
document.querySelector("#cancel").addEventListener("click", promptCancel);
|
||||
|
||||
const dataContainerElement = document.querySelector("#data-container");
|
||||
|
||||
let dataElement;
|
||||
if (promptOptions.type === "input") {
|
||||
dataElement = promptCreateInput();
|
||||
} else if (promptOptions.type === "select") {
|
||||
dataElement = promptCreateSelect();
|
||||
} else {
|
||||
return promptError(`Unhandled input type '${promptOptions.type}'`);
|
||||
}
|
||||
|
||||
dataContainerElement.append(dataElement);
|
||||
dataElement.setAttribute("id", "data");
|
||||
|
||||
dataElement.focus();
|
||||
if (promptOptions.type === "input") {
|
||||
dataElement.select();
|
||||
}
|
||||
|
||||
if (promptOptions.customScript) {
|
||||
try {
|
||||
const customScript = require(promptOptions.customScript);
|
||||
customScript();
|
||||
} catch (error) {
|
||||
return promptError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("error", error => {
|
||||
if (promptId) {
|
||||
promptError("An error has occured on the prompt window: \n" + error);
|
||||
}
|
||||
});
|
||||
|
||||
docReady(promptRegister);
|
||||
|
||||
@ -3,11 +3,14 @@
|
||||
<p align="center"><img width="482" alt="prompt-preview" src="https://user-images.githubusercontent.com/17620180/111753337-09c0c680-8897-11eb-8ce8-43de29c143bd.png"></p>
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
prompt([options, parentBrowserWindow]).then(...).catch(...)
|
||||
```
|
||||
Promise resolve returns input
|
||||
|
||||
If user presses cancel/exit window, input = null;
|
||||
|
||||
On error, Prompise reject returns custom error message
|
||||
## Example
|
||||
|
||||
```js
|
||||
|
||||
Reference in New Issue
Block a user