diff --git a/electron.vite.config.ts b/electron.vite.config.ts
index 0ffb64b8..4caf9ce3 100644
--- a/electron.vite.config.ts
+++ b/electron.vite.config.ts
@@ -7,15 +7,7 @@ export default defineConfig({
plugins: [externalizeDepsPlugin()]
},
preload: {
- plugins: [externalizeDepsPlugin()],
- build: {
- rollupOptions: {
- input: {
- index: resolve(__dirname, 'src/preload/index.ts'),
- minapp: resolve(__dirname, 'src/preload/minapp.ts')
- }
- }
- }
+ plugins: [externalizeDepsPlugin()]
},
renderer: {
resolve: {
diff --git a/resources/minapp.html b/resources/minapp.html
deleted file mode 100644
index f782f790..00000000
--- a/resources/minapp.html
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
- MinApp
-
-
-
-
-
-
-
diff --git a/src/main/index.ts b/src/main/index.ts
index 432063f0..de0adf5d 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -50,7 +50,13 @@ app.whenReady().then(() => {
ipcMain.handle('save-file', saveFile)
ipcMain.handle('minapp', (_, args) => {
- createMinappWindow(args)
+ createMinappWindow({
+ url: args.url,
+ windowOptions: {
+ ...mainWindow.getBounds(),
+ ...args.windowOptions
+ }
+ })
})
ipcMain.handle('set-theme', (_, theme: 'light' | 'dark') => {
diff --git a/src/main/utils.ts b/src/main/utils.ts
deleted file mode 100644
index 6d2e4423..00000000
--- a/src/main/utils.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * 将 JavaScript 对象转换为 URL 查询参数字符串
- * @param obj - 要转换的对象
- * @param options - 配置选项
- * @returns 转换后的查询参数字符串
- */
-export function objectToQueryParams(
- obj: Record,
- options: {
- skipNull?: boolean
- skipUndefined?: boolean
- } = {}
-): string {
- const { skipNull = false, skipUndefined = false } = options
-
- const params = new URLSearchParams()
-
- for (const [key, value] of Object.entries(obj)) {
- if (skipNull && value === null) continue
- if (skipUndefined && value === undefined) continue
-
- if (Array.isArray(value)) {
- value.forEach((item) => params.append(key, String(item)))
- } else if (typeof value === 'object' && value !== null) {
- params.append(key, JSON.stringify(value))
- } else if (value !== undefined && value !== null) {
- params.append(key, String(value))
- }
- }
-
- return params.toString()
-}
diff --git a/src/main/window.ts b/src/main/window.ts
index eeadee29..cf6fefb3 100644
--- a/src/main/window.ts
+++ b/src/main/window.ts
@@ -1,11 +1,10 @@
import { is } from '@electron-toolkit/utils'
-import { app, BrowserView, BrowserWindow, Menu, MenuItem, shell } from 'electron'
+import { BrowserWindow, Menu, MenuItem, shell } from 'electron'
import windowStateKeeper from 'electron-window-state'
import { join } from 'path'
import icon from '../../build/icon.png?asset'
import { appConfig, titleBarOverlayDark, titleBarOverlayLight } from './config'
-import { objectToQueryParams } from './utils'
export function createMainWindow() {
// Load the previous state with fallback to defaults
@@ -62,14 +61,7 @@ export function createMainWindow() {
})
mainWindow.webContents.setWindowOpenHandler((details) => {
- const websiteReg = /accounts.google.com/i
-
- if (websiteReg.test(details.url)) {
- createMinappWindow({ url: details.url, windowOptions: { width: 1000, height: 680 } })
- } else {
- shell.openExternal(details.url)
- }
-
+ shell.openExternal(details.url)
return { action: 'deny' }
})
@@ -107,45 +99,23 @@ export function createMinappWindow({
url: string
windowOptions?: Electron.BrowserWindowConstructorOptions
}) {
- const width = 1000
- const height = 680
- const headerHeight = 40
+ const width = windowOptions?.width || 1000
+ const height = windowOptions?.height || 680
const minappWindow = new BrowserWindow({
width,
height,
autoHideMenuBar: true,
- alwaysOnTop: true,
- titleBarOverlay: titleBarOverlayDark,
- titleBarStyle: 'hidden',
+ title: 'Cherry Studio',
...windowOptions,
webPreferences: {
preload: join(__dirname, '../preload/minapp.js'),
- sandbox: false
+ sandbox: false,
+ contextIsolation: false
}
})
- const view = new BrowserView()
- view.setBounds({ x: 0, y: headerHeight, width, height: height - headerHeight })
- view.webContents.loadURL(url)
-
- const minappWindowParams = {
- title: windowOptions?.title || 'CherryStudio'
- }
-
- const appPath = app.getAppPath()
- const minappHtmlPath = appPath + '/resources/minapp.html'
-
- minappWindow.loadURL('file://' + minappHtmlPath + '?' + objectToQueryParams(minappWindowParams))
- minappWindow.setBrowserView(view)
- minappWindow.on('resize', () => {
- view.setBounds({
- x: 0,
- y: headerHeight,
- width: minappWindow.getBounds().width,
- height: minappWindow.getBounds().height - headerHeight
- })
- })
+ minappWindow.loadURL(url)
return minappWindow
}
diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts
index 22e25b25..91c11553 100644
--- a/src/preload/index.d.ts
+++ b/src/preload/index.d.ts
@@ -14,7 +14,7 @@ declare global {
setProxy: (proxy: string | undefined) => void
saveFile: (path: string, content: string) => void
setTheme: (theme: 'light' | 'dark') => void
- minApp: (url: string) => void
+ minApp: (options: { url: string; windowOptions?: Electron.BrowserWindowConstructorOptions }) => void
}
}
}
diff --git a/src/preload/minapp.ts b/src/preload/minapp.ts
deleted file mode 100644
index 9ace85b5..00000000
--- a/src/preload/minapp.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { contextBridge } from 'electron'
-
-const api = {}
-
-if (process.contextIsolated) {
- try {
- contextBridge.exposeInMainWorld('api', api)
- } catch (error) {
- console.error(error)
- }
-} else {
- // @ts-ignore (define in dts)
- window.api = api
-}
diff --git a/src/renderer/src/config/provider.ts b/src/renderer/src/config/provider.ts
index 2c3da572..3f89ea87 100644
--- a/src/renderer/src/config/provider.ts
+++ b/src/renderer/src/config/provider.ts
@@ -354,7 +354,7 @@ export const PROVIDER_CONFIG = {
},
app: {
name: 'Groq',
- url: 'https://groq.com/',
+ url: 'https://chat.groq.com/',
logo: GroqProviderLogo
}
},
diff --git a/src/renderer/src/pages/apps/App.tsx b/src/renderer/src/pages/apps/App.tsx
index 989a78d7..d3e85120 100644
--- a/src/renderer/src/pages/apps/App.tsx
+++ b/src/renderer/src/pages/apps/App.tsx
@@ -12,6 +12,13 @@ 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)
}