Merge pull request #81 from PR0M3TH3AN/codex/fix-gui-text-field-display-issue

Add editable fields in Electron GUI
This commit is contained in:
thePR0M3TH3AN
2025-06-21 15:01:18 -04:00
committed by GitHub
3 changed files with 50 additions and 6 deletions

View File

@@ -6,12 +6,40 @@
</head>
<body>
<h1>VoxVera</h1>
<button id="quickstart">Quickstart</button>
<form id="config-form">
<div><label>Name <input type="text" id="name"></label></div>
<div><label>Subdomain <input type="text" id="subdomain"></label></div>
<div><label>Title <input type="text" id="title"></label></div>
<div><label>Subtitle <input type="text" id="subtitle"></label></div>
<div><label>Headline <input type="text" id="headline"></label></div>
<div><label>Content<br><textarea id="content" rows="5" cols="60"></textarea></label></div>
<div><label>URL Message <input type="text" id="url_message"></label></div>
<div><label>URL <input type="text" id="url"></label></div>
<div><label>Tear-off link <input type="text" id="tear_off_link"></label></div>
<div><label>Binary message <input type="text" id="binary_message"></label></div>
<button type="button" id="quickstart">Generate &amp; Serve</button>
</form>
<p id="onion-address"></p>
<script>
document.getElementById('quickstart').addEventListener('click', () => {
window.voxvera.quickstart();
async function load() {
const cfg = await window.voxvera.loadConfig();
for (const [k, v] of Object.entries(cfg)) {
const el = document.getElementById(k);
if (el) el.value = v;
}
}
document.addEventListener('DOMContentLoaded', load);
document.getElementById('quickstart').addEventListener('click', async () => {
const ids = ['name','subdomain','title','subtitle','headline','content','url_message','url','tear_off_link','binary_message'];
const cfg = {};
ids.forEach(id => {
const el = document.getElementById(id);
if (el) cfg[id] = el.value;
});
await window.voxvera.quickstart(cfg);
});
window.voxvera.onOnionUrl(url => {
document.getElementById('onion-address').textContent = `Onion address: ${url}`;
});

View File

@@ -2,6 +2,7 @@ const { app, BrowserWindow, ipcMain, dialog } = require('electron');
const { spawn } = require('child_process');
const path = require('path');
const which = require('which');
const fs = require('fs');
let mainWindow;
@@ -18,7 +19,21 @@ function createWindow() {
app.whenReady().then(createWindow);
ipcMain.handle('run-quickstart', async () => {
function getConfigPath() {
return path.join(__dirname, '..', '..', 'voxvera', 'src', 'config.json');
}
ipcMain.handle('load-config', async () => {
const p = getConfigPath();
const raw = fs.readFileSync(p, 'utf8');
return JSON.parse(raw);
});
ipcMain.handle('run-quickstart', async (_, config) => {
const configPath = getConfigPath();
if (config && typeof config === 'object') {
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
}
const voxveraPath = which.sync('voxvera', { nothrow: true });
if (!voxveraPath) {
dialog.showErrorBox(
@@ -28,7 +43,7 @@ ipcMain.handle('run-quickstart', async () => {
return -1;
}
return new Promise((resolve, reject) => {
const proc = spawn(voxveraPath, ['quickstart']);
const proc = spawn(voxveraPath, ['--config', configPath, 'quickstart']);
proc.stdout.on('data', data => {
const line = data.toString();
process.stdout.write(line);

View File

@@ -1,6 +1,7 @@
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('voxvera', {
quickstart: () => ipcRenderer.invoke('run-quickstart'),
loadConfig: () => ipcRenderer.invoke('load-config'),
quickstart: (config) => ipcRenderer.invoke('run-quickstart', config),
onOnionUrl: (cb) => ipcRenderer.on('onion-url', (_, url) => cb(url))
});