Migrate app from Tauri to Electron

Replace the Tauri/sidecar architecture with an Electron main process. Adds an electron/ directory (main, preload, handlers, core integrations for @xmcl/*), electron-builder.yml, TypeScript electron config and declarations, and updated IPC utilities (ipc.ts) so frontend uses ipcRenderer/ipcMain. Removes Tauri sidecar and src-tauri artifacts, deletes sidecar sources and keys, updates .gitignore, VSCode recommendations, package scripts and icons, and updates documentation (README, AGENTS, DEV) and frontend stores/apis to reflect the Electron-based architecture and config/auth persistence changes.
This commit is contained in:
2026-06-28 03:37:07 +08:00
parent 5b2e2860de
commit 9cb6a6e571
152 changed files with 8449 additions and 9562 deletions
+94
View File
@@ -0,0 +1,94 @@
import electron from 'electron';
import { loadConfig, saveConfig } from '../config';
const { ipcMain } = electron;
export function registerBackgroundHandlers() {
ipcMain.handle('background:set-image', async (_event, payload: { url: string; blur?: number; opacity?: number }) => {
try {
const config = loadConfig();
config.background.bgType = 'image';
config.background.image = payload.url;
if (payload.blur !== undefined) config.background.blur = payload.blur;
if (payload.opacity !== undefined) config.background.opacity = payload.opacity;
saveConfig(config);
return { success: true, data: config.background, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
ipcMain.handle('background:set-color', async (_event, payload: { color: string }) => {
try {
const config = loadConfig();
config.background.bgType = 'color';
config.background.image = payload.color;
saveConfig(config);
return { success: true, data: config.background, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
ipcMain.handle('background:set-blur', async (_event, payload: { blur: number }) => {
try {
const config = loadConfig();
config.background.blur = payload.blur;
saveConfig(config);
return { success: true, data: config.background, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
ipcMain.handle('background:set-opacity', async (_event, payload: { opacity: number }) => {
try {
const config = loadConfig();
config.background.opacity = payload.opacity;
saveConfig(config);
return { success: true, data: config.background, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
ipcMain.handle('background:set-animation', async (_event, payload: { type: string; speed?: number }) => {
try {
// Animation config is not persisted in current design, return defaults
return { success: true, data: { bgType: 'image', image: '/background.png', blur: 0, opacity: 100 }, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
ipcMain.handle('background:get', async () => {
try {
const config = loadConfig();
return { success: true, data: config.background, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
ipcMain.handle('background:set-theme', async (_event, payload: { theme: string }) => {
try {
const config = loadConfig();
config.theme.darkMode = payload.theme;
saveConfig(config);
return { success: true, data: config.background, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
ipcMain.handle('background:reset', async () => {
try {
const config = loadConfig();
config.background = { bgType: 'image', image: '/background.png', blur: 0, opacity: 100 };
saveConfig(config);
return { success: true, data: config.background, error: null };
} catch (e: unknown) {
return { success: false, data: null, error: String(e) };
}
});
}