Skip to content

Commit 48a0f36

Browse files
committed
feat: add key and url check
add min size, and perf some detail
1 parent 2b314d7 commit 48a0f36

File tree

12 files changed

+111
-24
lines changed

12 files changed

+111
-24
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,14 @@
9898
"electron-log": "^4.4.8",
9999
"electron-updater": "^5.3.0",
100100
"immer": "^9.0.19",
101+
"nanoid": "^4.0.1",
101102
"react": "^18.2.0",
102103
"react-dom": "^18.2.0",
103104
"react-is": "^18.2.0",
104105
"react-router-dom": "^6.8.0",
105106
"source-map-support": "^0.5.21",
106107
"styled-components": "^5.3.6",
108+
"url-regex": "^5.0.0",
107109
"zustand": "^4.3.2"
108110
},
109111
"devDependencies": {

pnpm-lock.yaml

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/main.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ const createWindow = async () => {
7474
show: false,
7575
width: 1024,
7676
height: 728,
77+
minWidth: 800,
78+
minHeight: 600,
7779
icon: getAssetPath('icon.png'),
7880
webPreferences: {
7981
preload: app.isPackaged

src/main/webviewManager.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export function initWebviewManager(win: BrowserWindow) {
4646
return;
4747
}
4848

49+
hideAllWebview();
4950
const view = new BrowserView({
5051
webPreferences: {
5152
nodeIntegration: false,
@@ -60,17 +61,17 @@ export function initWebviewManager(win: BrowserWindow) {
6061
ipcMain.on('update-webview-rect', (e, info) => {
6162
console.log('[update-webview-rect] info:', info);
6263

63-
Array.from(webviewMap.values()).forEach(({ view }) => {
64-
view.setBounds(fixRect(info.rect));
65-
});
64+
const webview = webviewMap.get(info.key);
65+
if (webview) {
66+
webview.hidden = false;
67+
webview.view.setBounds(fixRect(info.rect));
68+
}
6669
});
6770

6871
ipcMain.on('hide-all-webview', (e) => {
6972
console.log('[hide-all-webview]');
7073

71-
Array.from(webviewMap.values()).forEach((webview) => {
72-
hideWebView(webview);
73-
});
74+
hideAllWebview();
7475
});
7576

7677
ipcMain.on('clear-all-webview', (e) => {
@@ -122,3 +123,9 @@ function hideWebView(webview: WebviewInfo) {
122123
y: oldBounds.y + HIDDEN_OFFSET,
123124
});
124125
}
126+
127+
function hideAllWebview() {
128+
Array.from(webviewMap.values()).forEach((webview) => {
129+
hideWebView(webview);
130+
});
131+
}

src/renderer/components/AddWebsiteBtn.tsx

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,20 @@
1-
import { Button, Modal } from '@arco-design/web-react';
2-
import React, { useState } from 'react';
3-
import { generateFakeNode, useTreeStore } from '../store/tree';
1+
import { Button } from '@arco-design/web-react';
2+
import React from 'react';
3+
import { generateDefaultNode, useTreeStore } from '../store/tree';
44

55
export const AddWebsiteBtn: React.FC = React.memo(() => {
66
const { addTreeNode } = useTreeStore();
7-
const [visible, setVisible] = useState(false);
87

98
return (
109
<>
1110
<Button
1211
long={true}
1312
onClick={() => {
14-
// setVisible(true);
15-
addTreeNode(generateFakeNode());
13+
addTreeNode(generateDefaultNode());
1614
}}
1715
>
1816
Add Website
1917
</Button>
20-
21-
<Modal visible={visible} onCancel={() => setVisible(false)}>
22-
<div>Fooo</div>
23-
</Modal>
2418
</>
2519
);
2620
});

src/renderer/components/SideTree.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { Menu, Tooltip, Tree, Trigger } from '@arco-design/web-react';
22
import { IconDown, IconPlus } from '@arco-design/web-react/icon';
33
import React from 'react';
4-
import { generateFakeNode, WebsiteTreeNode, useTreeStore } from '../store/tree';
4+
import {
5+
generateDefaultNode,
6+
WebsiteTreeNode,
7+
useTreeStore,
8+
} from '../store/tree';
59
import { AddWebsiteBtn } from './AddWebsiteBtn';
610
import styled from 'styled-components';
711
import { ClearWebsiteBtn } from './ClearWebsiteBtn';
@@ -102,7 +106,7 @@ export const SideTree: React.FC = React.memo(() => {
102106
return;
103107
}
104108

105-
addTreeNodeChildren(node._key!, generateFakeNode());
109+
addTreeNodeChildren(node._key!, generateDefaultNode());
106110
}}
107111
/>
108112
);

src/renderer/components/main/WebContent.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import { Input } from '@arco-design/web-react';
22
import React from 'react';
33
import styled from 'styled-components';
44
import { useTreeStore } from '../../store/tree';
5+
import { isValidUrl } from '../../utils';
56
import { useEditValue } from '../../utils/hooks/useEditValue';
7+
import { WebInvalidUrl } from './WebInvalidUrl';
68
import { WebPlaceholder } from './WebPlaceholder';
79
import { WebviewRender } from './WebviewRender';
810

@@ -56,7 +58,11 @@ export const WebContent: React.FC = React.memo(() => {
5658
/>
5759
</div>
5860
<div className="main">
59-
<WebviewRender node={selectedNode} />
61+
{isValidUrl(selectedNode.url) ? (
62+
<WebviewRender node={selectedNode} />
63+
) : (
64+
<WebInvalidUrl />
65+
)}
6066
</div>
6167
</Root>
6268
);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react';
2+
import { useEffect } from 'react';
3+
import styled from 'styled-components';
4+
import webpageSvg from '../../assets/web-page.svg';
5+
6+
const WebInvalidUrlRoot = styled.div`
7+
height: 100%;
8+
width: 100%;
9+
display: flex;
10+
justify-content: center;
11+
align-items: center;
12+
font-size: 24px;
13+
flex-direction: column;
14+
15+
img {
16+
width: 120px;
17+
}
18+
`;
19+
20+
export const WebInvalidUrl: React.FC = React.memo(() => {
21+
useEffect(() => {
22+
window.electron.ipcRenderer.sendMessage('hide-all-webview');
23+
}, []);
24+
25+
return (
26+
<WebInvalidUrlRoot>
27+
<div>
28+
<img src={webpageSvg} />
29+
</div>
30+
<div>Please input valid url to load Url</div>
31+
</WebInvalidUrlRoot>
32+
);
33+
});
34+
WebInvalidUrl.displayName = 'WebInvalidUrl';

src/renderer/components/main/WebPlaceholder.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const WebPlaceholder: React.FC = React.memo(() => {
2828
<div>
2929
<img src={webpageSvg} />
3030
</div>
31-
<div>Please Select Any Page on Left</div>
31+
<div>Please Select Any Page on Left Website Tree</div>
3232
<div>
3333
<small>OR</small>
3434
</div>

src/renderer/components/main/WebviewRender.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export const WebviewRender: React.FC<{ node: WebsiteTreeNode }> = React.memo(
4040
const rect = target.getBoundingClientRect();
4141

4242
window.electron.ipcRenderer.sendMessage('update-webview-rect', {
43+
key: node.key,
4344
rect: {
4445
x: rect.x,
4546
y: rect.y,

0 commit comments

Comments
 (0)