diff --git a/src/main/window.ts b/src/main/window.ts index 9579763d..38c325e8 100644 --- a/src/main/window.ts +++ b/src/main/window.ts @@ -34,7 +34,8 @@ export function createMainWindow() { webPreferences: { preload: join(__dirname, '../preload/index.js'), sandbox: false, - webSecurity: false + webSecurity: false, + webviewTag: true // devTools: !app.isPackaged, } }) diff --git a/src/renderer/src/components/MinApp/index.tsx b/src/renderer/src/components/MinApp/index.tsx index e7b74c82..a3b4e4dc 100644 --- a/src/renderer/src/components/MinApp/index.tsx +++ b/src/renderer/src/components/MinApp/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react/no-unknown-property */ import { CloseOutlined, ExportOutlined, ReloadOutlined } from '@ant-design/icons' import { isMac, isWindows } from '@renderer/config/constant' import { useBridge } from '@renderer/hooks/useBridge' @@ -5,7 +6,8 @@ import store from '@renderer/store' import { setMinappShow } from '@renderer/store/runtime' import { MinAppType } from '@renderer/types' import { Drawer } from 'antd' -import { useRef, useState } from 'react' +import { WebviewTag } from 'electron' +import { useEffect, useRef, useState } from 'react' import styled from 'styled-components' import { TopView } from '../TopView' @@ -17,7 +19,7 @@ interface Props { const PopupContainer: React.FC = ({ app, resolve }) => { const [open, setOpen] = useState(true) - const iframeRef = useRef(null) + const webviewRef = useRef(null) useBridge() @@ -29,8 +31,8 @@ const PopupContainer: React.FC = ({ app, resolve }) => { } const onReload = () => { - if (iframeRef.current) { - iframeRef.current.src = app.url + if (webviewRef.current) { + webviewRef.current.src = app.url } } @@ -59,6 +61,27 @@ const PopupContainer: React.FC = ({ app, resolve }) => { ) } + useEffect(() => { + const webview = webviewRef.current + + if (webview) { + const handleNewWindow = (event: any) => { + event.preventDefault() + if (webview.loadURL) { + webview.loadURL(event.url) + } + } + + webview.addEventListener('new-window', handleNewWindow) + + return () => { + webview.removeEventListener('new-window', handleNewWindow) + } + } + + return () => {} + }, []) + return ( } @@ -72,17 +95,17 @@ const PopupContainer: React.FC = ({ app, resolve }) => { maskClosable={false} closeIcon={null} style={{ marginLeft: 'var(--sidebar-width)' }}> - + ) } -const Frame = styled.iframe` - width: calc(100vw - var(--sidebar-width)); - height: calc(100vh - var(--navbar-height)); - border: none; - background-color: white; -` +const WebviewStyle: React.CSSProperties = { + width: 'calc(100vw - var(--sidebar-width))', + height: 'calc(100vh - var(--navbar-height))', + backgroundColor: 'white', + display: 'inline-flex' +} const TitleContainer = styled.div` display: flex; diff --git a/src/renderer/src/pages/apps/App.tsx b/src/renderer/src/pages/apps/App.tsx index cd7aaaf4..1df2d1e3 100644 --- a/src/renderer/src/pages/apps/App.tsx +++ b/src/renderer/src/pages/apps/App.tsx @@ -12,13 +12,6 @@ const App: FC = ({ app }) => { const { theme } = useTheme() const onClick = () => { - const websiteReg = /claude|chatgpt|groq/i - - if (websiteReg.test(app.url)) { - window.api.minApp({ url: app.url, windowOptions: { title: app.name } }) - return - } - MinApp.start(app) } diff --git a/src/renderer/src/pages/apps/AppsPage.tsx b/src/renderer/src/pages/apps/AppsPage.tsx index 9fd803e1..340620cf 100644 --- a/src/renderer/src/pages/apps/AppsPage.tsx +++ b/src/renderer/src/pages/apps/AppsPage.tsx @@ -64,7 +64,7 @@ const _apps: MinAppType[] = [ { name: 'DEVV_', logo: DevvAppLogo, - url: 'https://devv.ai/referral?code=dvl5am34asqo' + url: 'https://devv.ai/' } ]