feat: transfer tab state to popout window and close tab in main window

- Restore transfer-tab-data IPC for transferring tab state
- Create usePopOutTab hook to receive tab data in new window
- Update handlePopOut to transfer data and close tab in main window
- Add PopOutTabData interface for type safety
This commit is contained in:
2026-03-21 23:52:02 +08:00
parent c37e6ab4f2
commit aa5895873b
7 changed files with 106 additions and 2 deletions

View File

@@ -491,6 +491,20 @@ ipcMain.handle('create-window', async (_event, tabData: { route: string; title:
}
});
ipcMain.handle('transfer-tab-data', async (_event, windowId: number, tabData: any) => {
try {
const win = electronState.getWindow(windowId);
if (!win) {
return { success: false, error: 'Window not found' };
}
win.webContents.send('tab-data-received', tabData);
return { success: true };
} catch (error: any) {
log.error('[PopOut] Failed to transfer tab data:', error);
return { success: false, error: error.message };
}
});
ipcMain.handle('window-minimize', async (event) => {
const win = BrowserWindow.fromWebContents(event.sender);
if (win) {

View File

@@ -54,6 +54,12 @@ contextBridge.exposeInMainWorld('electronAPI', {
terminalGetStatus: () => ipcRenderer.invoke('terminal-get-status'),
terminalGetPort: () => ipcRenderer.invoke('terminal-get-port'),
createWindow: (tabData: { route: string; title: string }) => ipcRenderer.invoke('create-window', tabData),
transferTabData: (windowId: number, tabData: any) => ipcRenderer.invoke('transfer-tab-data', windowId, tabData),
onTabDataReceived: (callback: (tabData: any) => void) => {
const handler = (_event: Electron.IpcRendererEvent, tabData: any) => callback(tabData);
ipcRenderer.on('tab-data-received', handler);
return () => ipcRenderer.removeListener('tab-data-received', handler);
},
windowMinimize: () => ipcRenderer.invoke('window-minimize'),
windowMaximize: () => ipcRenderer.invoke('window-maximize'),
windowClose: () => ipcRenderer.invoke('window-close'),