Skip to content

Commit 13fc093

Browse files
committed
feat: add hide all webview
1 parent 476e4a7 commit 13fc093

File tree

6 files changed

+73
-11
lines changed

6 files changed

+73
-11
lines changed

src/main/preload.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron';
55
export type Channels =
66
| 'mount-webview'
77
| 'update-webview-rect'
8-
| 'clear-webview';
8+
| 'hide-all-webview'
9+
| 'clear-all-webview';
910

1011
const electronHandler = {
1112
ipcRenderer: {

src/main/webviewManager.ts

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { BrowserView, BrowserWindow, ipcMain, Rectangle } from 'electron';
22

3-
const webviewMap = new Map<string, BrowserView>();
3+
interface WebviewInfo {
4+
view: BrowserView;
5+
hidden: boolean;
6+
}
7+
8+
const webviewMap = new Map<string, WebviewInfo>();
49

510
/**
611
* fix rect into correct size
@@ -16,19 +21,21 @@ function fixRect(rect: Rectangle): Rectangle {
1621

1722
export function initWebviewManager(win: BrowserWindow) {
1823
ipcMain.on('mount-webview', (e, info) => {
24+
console.log('[mount-webview] info:', info);
25+
1926
const key = info.key;
2027
const url = info.url;
2128
if (!url) {
2229
return;
2330
}
2431

2532
if (webviewMap.has(key)) {
26-
win.setTopBrowserView(webviewMap.get(key)!);
33+
const webview = webviewMap.get(key)!;
34+
win.setTopBrowserView(webview.view);
35+
webview.view.setBounds(fixRect(info.rect));
2736
return;
2837
}
2938

30-
console.log('[mount-webview] info:', info);
31-
3239
const view = new BrowserView({
3340
webPreferences: {
3441
nodeIntegration: false,
@@ -37,19 +44,27 @@ export function initWebviewManager(win: BrowserWindow) {
3744
win.addBrowserView(view);
3845
view.setBounds(fixRect(info.rect));
3946
view.webContents.loadURL(url);
40-
webviewMap.set(key, view);
47+
webviewMap.set(key, { view, hidden: false });
4148
});
4249

4350
ipcMain.on('update-webview-rect', (e, info) => {
4451
console.log('[update-webview-rect] info:', info);
4552

46-
Array.from(webviewMap.values()).forEach((view) => {
53+
Array.from(webviewMap.values()).forEach(({ view }) => {
4754
view.setBounds(fixRect(info.rect));
4855
});
4956
});
5057

51-
ipcMain.on('clear-webview', (e) => {
52-
console.log('[clear-webview]');
58+
ipcMain.on('hide-all-webview', (e) => {
59+
console.log('[hide-all-webview]');
60+
61+
Array.from(webviewMap.values()).forEach((webview) => {
62+
hideWebView(webview);
63+
});
64+
});
65+
66+
ipcMain.on('clear-all-webview', (e) => {
67+
console.log('[clear-all-webview]');
5368

5469
win.getBrowserViews().forEach((view) => {
5570
win.removeBrowserView(view);
@@ -58,3 +73,37 @@ export function initWebviewManager(win: BrowserWindow) {
5873
webviewMap.clear();
5974
});
6075
}
76+
77+
const HIDDEN_OFFSET = 3000;
78+
79+
/**
80+
* Show webview with remove offset in y
81+
*/
82+
function showWebView(webview: WebviewInfo) {
83+
if (webview.hidden === false) {
84+
return;
85+
}
86+
87+
webview.hidden = false;
88+
const oldBounds = webview.view.getBounds();
89+
webview.view.setBounds({
90+
...oldBounds,
91+
y: oldBounds.y - HIDDEN_OFFSET,
92+
});
93+
}
94+
95+
/**
96+
* Hide webview with append offset in y
97+
*/
98+
function hideWebView(webview: WebviewInfo) {
99+
if (webview.hidden === true) {
100+
return;
101+
}
102+
103+
webview.hidden = true;
104+
const oldBounds = webview.view.getBounds();
105+
webview.view.setBounds({
106+
...oldBounds,
107+
y: oldBounds.y + HIDDEN_OFFSET,
108+
});
109+
}

src/renderer/components/ClearWebsiteBtn.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const ClearWebsiteBtn: React.FC = React.memo(() => {
1111
long={true}
1212
onClick={() => {
1313
setSelectedNode(null);
14-
window.electron.ipcRenderer.sendMessage('clear-webview');
14+
window.electron.ipcRenderer.sendMessage('clear-all-webview');
1515
}}
1616
>
1717
Clear Website

src/renderer/components/SideTree.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { generateFakeNode, WebsiteTreeNode, useTreeStore } from '../store/tree';
55
import { AddWebsiteBtn } from './AddWebsiteBtn';
66
import styled from 'styled-components';
77
import { ClearWebsiteBtn } from './ClearWebsiteBtn';
8+
import { stopPropagation } from '../utils/dom';
89

910
const StyledTree = styled(Tree)`
1011
margin-top: 0.5rem;
@@ -64,7 +65,8 @@ export const SideTree: React.FC = React.memo(() => {
6465
<StyledMenu>
6566
<Menu.Item
6667
key="del"
67-
onClick={() => {
68+
onClick={(e) => {
69+
stopPropagation(e);
6870
if (props.dataRef && props.dataRef.key) {
6971
deleteTreeNode(props.dataRef.key);
7072
}

src/renderer/store/tree.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ export const useTreeStore = create<TreeStoreState>()(
139139
},
140140
deleteTreeNode: (key: string) => {
141141
set((state) => {
142+
if (state.selectedNode && state.selectedNode.key === key) {
143+
state.selectedNode = null;
144+
}
145+
142146
deleteTreeNode(state.treeData, key);
143147
});
144148
},

src/renderer/utils/dom.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// react stopPropagation
2+
export function stopPropagation(e: React.BaseSyntheticEvent) {
3+
if (e && e.stopPropagation) {
4+
e.stopPropagation();
5+
}
6+
}

0 commit comments

Comments
 (0)