initial commit
This commit is contained in:
commit
00530f0bd0
|
|
@ -0,0 +1,2 @@
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>RVV – Offline</title>
|
||||||
|
<style>
|
||||||
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 100vh;
|
||||||
|
background: #f5f5f5;
|
||||||
|
color: #333;
|
||||||
|
text-align: center;
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
.container { max-width: 480px; }
|
||||||
|
h1 { font-size: 1.5rem; margin-bottom: 1rem; }
|
||||||
|
p { margin-bottom: 1.5rem; line-height: 1.6; }
|
||||||
|
button {
|
||||||
|
padding: 0.75rem 1.5rem;
|
||||||
|
font-size: 1rem;
|
||||||
|
background: #0066cc;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
button:hover { background: #0052a3; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<h1>Keine Verbindung</h1>
|
||||||
|
<p>Die Website rvv.de konnte nicht geladen werden. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.</p>
|
||||||
|
<button onclick="window.location.href='https://www.rvv.de'">Erneut versuchen</button>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,108 @@
|
||||||
|
const { app, BrowserWindow, Tray, Menu, shell } = require('electron');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const TARGET_URL = 'https://www.rvv.de';
|
||||||
|
|
||||||
|
let mainWindow = null;
|
||||||
|
let tray = null;
|
||||||
|
|
||||||
|
function createWindow() {
|
||||||
|
mainWindow = new BrowserWindow({
|
||||||
|
width: 414,
|
||||||
|
height: 896,
|
||||||
|
title: 'RVV',
|
||||||
|
webPreferences: {
|
||||||
|
preload: path.join(__dirname, 'preload.js'),
|
||||||
|
contextIsolation: true,
|
||||||
|
nodeIntegration: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
mainWindow.loadURL(TARGET_URL);
|
||||||
|
|
||||||
|
// Minimize to tray instead of closing
|
||||||
|
mainWindow.on('close', (event) => {
|
||||||
|
if (!app.isQuitting) {
|
||||||
|
event.preventDefault();
|
||||||
|
mainWindow.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Open external links in the system browser
|
||||||
|
mainWindow.webContents.setWindowOpenHandler(({ url }) => {
|
||||||
|
const targetHost = new URL(TARGET_URL).host;
|
||||||
|
const linkHost = new URL(url).host;
|
||||||
|
if (!linkHost.endsWith(targetHost)) {
|
||||||
|
shell.openExternal(url);
|
||||||
|
return { action: 'deny' };
|
||||||
|
}
|
||||||
|
return { action: 'allow' };
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle navigation to external sites
|
||||||
|
mainWindow.webContents.on('will-navigate', (event, url) => {
|
||||||
|
const targetHost = new URL(TARGET_URL).host;
|
||||||
|
try {
|
||||||
|
const linkHost = new URL(url).host;
|
||||||
|
if (!linkHost.endsWith(targetHost)) {
|
||||||
|
event.preventDefault();
|
||||||
|
shell.openExternal(url);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// allow navigation if URL parsing fails
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Show fallback page if the site fails to load
|
||||||
|
mainWindow.webContents.on('did-fail-load', (_event, _code, _desc, url) => {
|
||||||
|
if (url.startsWith(TARGET_URL)) {
|
||||||
|
mainWindow.loadFile('fallback.html');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createTray() {
|
||||||
|
tray = new Tray(path.join(__dirname, 'rvv-icon.png'));
|
||||||
|
|
||||||
|
const contextMenu = Menu.buildFromTemplate([
|
||||||
|
{
|
||||||
|
label: 'Show RVV',
|
||||||
|
click: () => {
|
||||||
|
mainWindow.show();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{
|
||||||
|
label: 'Quit',
|
||||||
|
click: () => {
|
||||||
|
app.isQuitting = true;
|
||||||
|
app.quit();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
tray.setToolTip('RVV');
|
||||||
|
tray.setContextMenu(contextMenu);
|
||||||
|
|
||||||
|
// Click on tray icon shows the window
|
||||||
|
tray.on('click', () => {
|
||||||
|
mainWindow.show();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
createWindow();
|
||||||
|
createTray();
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow();
|
||||||
|
} else {
|
||||||
|
mainWindow.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
// Don't quit on window close — we live in the tray
|
||||||
|
});
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"name": "rvv-app",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Electron wrapper for rvv.de",
|
||||||
|
"main": "main.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "electron .",
|
||||||
|
"build": "electron-builder"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "MIT",
|
||||||
|
"build": {
|
||||||
|
"icon": "rvv-icon.png",
|
||||||
|
"linux": {
|
||||||
|
"category": "Utility;Maps"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"electron": "35.1.5",
|
||||||
|
"electron-builder": "26.0.12"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
// Preload script — runs in a sandboxed context before the page loads.
|
||||||
|
// Add any contextBridge or ipcRenderer bindings here if needed in the future.
|
||||||
|
|
||||||
|
window.addEventListener('DOMContentLoaded', () => {
|
||||||
|
// App is ready
|
||||||
|
});
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
Loading…
Reference in New Issue