This commit is contained in:
José Conde 2022-09-04 12:03:12 +02:00
commit a13c963a75
10 changed files with 15852 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
node_modules
out
.history

33
app_main/index.htm_ Normal file
View File

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src *;">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Fire Sale</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<section class="controls">
<button id="new-file">New File</button>
<button id="open-file">Open File</button>
<button id="save-markdown" disabled>Save File</button>
<button id="revert" disabled>Revert</button>
<button id="save-html">Save HTML</button>
<button id="show-file" disabled>Show File</button>
<button id="open-in-default" disabled>Open in Default Application</button>
</section>
<section class="content">
<label for="markdown" hidden>Markdown Content</label>
<textarea class="raw-markdown" id="markdown"></textarea>
<div class="rendered-html" id="html"></div>
</section>
</body>
<script src="./renderer.js"></script>
</html>

34
app_main/index.html Normal file
View File

@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'" />
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'" />
<title>Hello from Electron renderer!</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<h1>Hello from Electron renderer!</h1>
<p>👋</p>
<p id="info"></p>
<section class="controls">
<button id="new-file">New File</button>
<button id="open-file">Open File</button>
<button id="save-markdown" disabled>Save File</button>
<button id="revert" disabled>Revert</button>
<button id="save-html">Save HTML</button>
<button id="show-file" disabled>Show File</button>
<button id="open-in-default" disabled>Open in Default Application</button>
</section>
<section class="content">
<label for="markdown" hidden>Markdown Content</label>
<textarea class="raw-markdown" id="markdown"></textarea>
<div class="rendered-html" id="html"></div>
</section>
</body>
<script src="./renderer.js"></script>
</html>

45
app_main/main.js Normal file
View File

@ -0,0 +1,45 @@
const { app, BrowserWindow, ipcMain, net } = require('electron');
const path = require('path');
const { marked } = require('marked');
const { get } = require('./request')
function createWindow() {
const mainWindow = new BrowserWindow({
// width: 800,
// height: 600,
show: false,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
nodeIntegration: true,
}
});
ipcMain.handle('ping', () => 'pong');
ipcMain.handle('renderMarkdownToHtml', (event, markdown) => {
return marked.parse(markdown);
});
ipcMain.handle('acars', async() => {
const url = 'http://lsaapi.gairacalabs.com:3100/api/acars';
// const url = 'http://lsaapi.gairacalabs.com:3100/graphql';
const response = await get(url);
return response;
});
mainWindow.loadFile(path.join(__dirname, 'index.html'));
// Open the DevTools.
mainWindow.webContents.openDevTools()
mainWindow.show();
}
app.whenReady().then(() => {
createWindow();
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
})
});
app.on('window-all-closed', function() {
if (process.platform !== 'darwin') app.quit()
});

11
app_main/preload.js Normal file
View File

@ -0,0 +1,11 @@
const { contextBridge, ipcRenderer } = require('electron');
const marked = require('marked');
contextBridge.exposeInMainWorld('versions', {
node: () => process.versions.node,
chrome: () => process.versions.chrome,
electron: () => process.versions.electron,
ping: () => ipcRenderer.invoke('ping'),
renderMarkdownToHtml: (currentContent) => ipcRenderer.invoke('renderMarkdownToHtml', currentContent),
acars: () => ipcRenderer.invoke('acars'),
});

33
app_main/renderer.js Normal file
View File

@ -0,0 +1,33 @@
const markdownView = document.querySelector('#markdown');
const htmlView = document.querySelector('#html');
// const newFileButton = document.querySelector('#new-file');
// const openFileButton = document.querySelector('#open-file');
// const saveMarkdownButton = document.querySelector('#save-markdown');
// const revertButton = document.querySelector('#revert');
// const saveHtmlButton = document.querySelector('#save-html');
// const showFileButton = document.querySelector('#show-file');
// const openInDefaultButton = document.querySelector('#open-in-default');
console.log(document.querySelector('#markdown'));
const renderMarkdownToHtml = async(markdown) => {
const response = await window.versions.renderMarkdownToHtml(markdown);
htmlView.innerHTML = response;
};
markdownView.addEventListener('keyup', event => {
const currentContent = event.target.value;
console.log('currentContent :>> ', currentContent);
renderMarkdownToHtml(currentContent);
});
const information = document.getElementById('info')
information.innerText = `This app is using Chrome (v${versions.chrome()}), Node.js (v${versions.node()}), and Electron (v${versions.electron()})`
const func = async() => {
const acars = await window.versions.acars()
const response = await window.versions.ping()
console.log(acars) // prints out 'pong'
}
func()

57
app_main/request.js Normal file
View File

@ -0,0 +1,57 @@
const { net } = require('electron');
async function get(url) {
return request({ url, method: 'GET' })
}
async function post(url, body) {
return request({ url, method: 'POST' }, body)
}
async function request(options, body) {
return new Promise((resolve, reject) => {
const responseBody = [];
let responseHeaders;
let responseStatus;
console.log(options);
const request = net.request(options);
request.on('response', (response) => {
responseStatus = response.statusCode;
responseHeaders = response.headers;
response.on('data', (chunk) => {
if (chunk) {
responseBody.push(`${chunk}`);
}
});
response.on('end', () => {
resolve({
status: responseStatus,
headers: responseHeaders,
body: JSON.parse(responseBody.join('')),
});
});
response.on('aborted', () => console.log('request aborted'));
response.on('error', (error) => reject(error));
});
request.on('error', (error) => reject(error));
request.setHeader('Content-Type', 'application/json');
if (['POST'].includes(options.method.toUpperCase())) {
request.write(body, 'utf-8')
}
request.end();
});
}
module.exports = {
get
};

99
app_main/style.css Normal file
View File

@ -0,0 +1,99 @@
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
html,
body {
height: 100%;
width: 100%;
overflow: hidden;
}
body {
margin: 0;
padding: 0;
position: absolute;
}
body,
input {
font: menu;
}
textarea,
input,
div,
button {
outline: none;
margin: 0;
}
.controls {
background-color: rgb(217, 241, 238);
padding: 10px 10px 10px 10px;
}
button {
font-size: 14px;
background-color: rgb(181, 220, 216);
border: none;
padding: 0.5em 1em;
}
button:hover {
background-color: rgb(156, 198, 192);
}
button:active {
background-color: rgb(144, 182, 177);
}
button:disabled {
background-color: rgb(196, 204, 202);
}
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
min-width: 100vw;
position: relative;
}
.content {
height: 100vh;
display: flex;
}
.raw-markdown,
.rendered-html {
min-height: 100%;
max-width: 50%;
flex-grow: 1;
padding: 1em;
overflow: scroll;
font-size: 16px;
}
.raw-markdown {
border: 5px solid rgb(238, 252, 250);
;
background-color: rgb(238, 252, 250);
font-family: monospace;
}
.raw-markdown.drag-over {
background-color: rgb(181, 220, 216);
border-color: rgb(75, 160, 151);
}
.raw-markdown.drag-error {
background-color: rgba(170, 57, 57, 1);
border-color: rgba(255, 170, 170, 1);
}

15480
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

57
package.json Normal file
View File

@ -0,0 +1,57 @@
{
"name": "firesale",
"version": "1.0.0",
"description": "Salud y Vida Timesheet",
"main": "app_main/main.js",
"scripts": {
"start": "electron-forge start",
"postinstall": "electron-rebuild",
"package": "electron-forge package",
"make": "electron-forge make"
},
"keywords": [],
"author": "José Conde",
"license": "ISC",
"dependencies": {
"electron-squirrel-startup": "^1.0.0",
"marked": "^4.1.0"
},
"devDependencies": {
"@electron-forge/cli": "^6.0.0-beta.65",
"@electron-forge/maker-deb": "^6.0.0-beta.65",
"@electron-forge/maker-rpm": "^6.0.0-beta.65",
"@electron-forge/maker-squirrel": "^6.0.0-beta.65",
"@electron-forge/maker-zip": "^6.0.0-beta.65",
"babel-eslint": "^10.1.0",
"devtron": "^1.4.0",
"electron": "^20.1.1",
"eslint": "^8.23.0",
"eslint-plugin-import": "^2.26.0"
},
"config": {
"forge": {
"packagerConfig": {},
"makers": [{
"name": "@electron-forge/maker-squirrel",
"config": {
"name": "firesale"
}
},
{
"name": "@electron-forge/maker-zip",
"platforms": [
"darwin"
]
},
{
"name": "@electron-forge/maker-deb",
"config": {}
},
{
"name": "@electron-forge/maker-rpm",
"config": {}
}
]
}
}
}