Remove Electron settings panel (breaking change)

- Remove electron/settings/ folder
- Remove config-manager.ts and settings-window.ts
- Remove Configuration menu from app menu
- Remove config-presets IPC handlers
- Update README.md
- Clean up electron.d.ts

Note: This is a breaking change - users will lose existing presets
This commit is contained in:
Dayuan Jiang
2025-12-25 13:49:48 +09:00
parent 51858dbf5d
commit c7e88b0711
13 changed files with 15 additions and 1793 deletions

View File

@@ -2,17 +2,13 @@
/**
* Development script for running Electron with Next.js
* 1. Reads preset configuration (if exists)
* 2. Starts Next.js dev server with preset env vars
* 3. Waits for it to be ready
* 4. Compiles Electron TypeScript
* 5. Launches Electron
* 6. Watches for preset changes and restarts Next.js
* 1. Starts Next.js dev server
* 2. Waits for it to be ready
* 3. Compiles Electron TypeScript
* 4. Launches Electron
*/
import { spawn } from "node:child_process"
import { existsSync, readFileSync, watch } from "node:fs"
import os from "node:os"
import path from "node:path"
import { fileURLToPath } from "node:url"
@@ -22,64 +18,6 @@ const rootDir = path.join(__dirname, "..")
const NEXT_PORT = 6002
const NEXT_URL = `http://localhost:${NEXT_PORT}`
/**
* Get the user data path (same as Electron's app.getPath("userData"))
*/
function getUserDataPath() {
const appName = "next-ai-draw-io"
switch (process.platform) {
case "darwin":
return path.join(
os.homedir(),
"Library",
"Application Support",
appName,
)
case "win32":
return path.join(
process.env.APPDATA ||
path.join(os.homedir(), "AppData", "Roaming"),
appName,
)
default:
return path.join(os.homedir(), ".config", appName)
}
}
/**
* Load preset configuration from config file
*/
function loadPresetConfig() {
const configPath = path.join(getUserDataPath(), "config-presets.json")
if (!existsSync(configPath)) {
console.log("📋 No preset configuration found, using .env.local")
return null
}
try {
const content = readFileSync(configPath, "utf-8")
const data = JSON.parse(content)
if (!data.currentPresetId) {
console.log("📋 No active preset, using .env.local")
return null
}
const preset = data.presets.find((p) => p.id === data.currentPresetId)
if (!preset) {
console.log("📋 Active preset not found, using .env.local")
return null
}
console.log(`📋 Using preset: "${preset.name}"`)
return preset.config
} catch (error) {
console.error("Failed to load preset config:", error.message)
return null
}
}
/**
* Wait for the Next.js server to be ready
*/
@@ -129,25 +67,14 @@ function runCommand(command, args, options = {}) {
}
/**
* Start Next.js dev server with preset environment
* Start Next.js dev server
*/
function startNextServer(presetEnv) {
const env = { ...process.env }
// Apply preset environment variables
if (presetEnv) {
for (const [key, value] of Object.entries(presetEnv)) {
if (value !== undefined && value !== "") {
env[key] = value
}
}
}
function startNextServer() {
const nextProcess = spawn("npm", ["run", "dev"], {
cwd: rootDir,
stdio: "inherit",
shell: true,
env,
env: process.env,
})
nextProcess.on("error", (err) => {
@@ -163,12 +90,9 @@ function startNextServer(presetEnv) {
async function main() {
console.log("🚀 Starting Electron development environment...\n")
// Load preset configuration
const presetEnv = loadPresetConfig()
// Start Next.js dev server with preset env
// Start Next.js dev server
console.log("1. Starting Next.js development server...")
let nextProcess = startNextServer(presetEnv)
const nextProcess = startNextServer()
// Wait for Next.js to be ready
try {
@@ -203,75 +127,14 @@ async function main() {
},
})
// Watch for preset config changes
const configPath = path.join(getUserDataPath(), "config-presets.json")
let configWatcher = null
let restartPending = false
function setupConfigWatcher() {
if (!existsSync(path.dirname(configPath))) {
// Directory doesn't exist yet, check again later
setTimeout(setupConfigWatcher, 5000)
return
}
try {
configWatcher = watch(
configPath,
{ persistent: false },
async (eventType) => {
if (eventType === "change" && !restartPending) {
restartPending = true
console.log(
"\n🔄 Preset configuration changed, restarting Next.js server...",
)
// Kill current Next.js process
nextProcess.kill()
// Wait a bit for process to die
await new Promise((r) => setTimeout(r, 1000))
// Reload preset and restart
const newPresetEnv = loadPresetConfig()
nextProcess = startNextServer(newPresetEnv)
try {
await waitForServer(NEXT_URL)
console.log(
"✅ Next.js server restarted with new configuration\n",
)
} catch (err) {
console.error(
"❌ Failed to restart Next.js:",
err.message,
)
}
restartPending = false
}
},
)
console.log("👀 Watching for preset configuration changes...")
} catch (err) {
// File might not exist yet, that's ok
setTimeout(setupConfigWatcher, 5000)
}
}
// Start watching after a delay (config file might not exist yet)
setTimeout(setupConfigWatcher, 2000)
electronProcess.on("close", (code) => {
console.log(`\nElectron exited with code ${code}`)
if (configWatcher) configWatcher.close()
nextProcess.kill()
process.exit(code || 0)
})
electronProcess.on("error", (err) => {
console.error("Electron error:", err)
if (configWatcher) configWatcher.close()
nextProcess.kill()
process.exit(1)
})
@@ -279,7 +142,6 @@ async function main() {
// Handle termination signals
const cleanup = () => {
console.log("\n🛑 Shutting down...")
if (configWatcher) configWatcher.close()
electronProcess.kill()
nextProcess.kill()
process.exit(0)