diff --git a/packages/ui/src/main/features/config-with-browser-assistant.ts b/packages/ui/src/main/features/config-with-browser-assistant.ts
index 8f6562e..27c315c 100644
--- a/packages/ui/src/main/features/config-with-browser-assistant.ts
+++ b/packages/ui/src/main/features/config-with-browser-assistant.ts
@@ -4,9 +4,9 @@ import {
browserAssistantWindow
} from '../window/browserAssistantWindow'
-export async function configWithBrowserAssistant({ windowOption } = {}) {
+export async function configWithBrowserAssistant({ windowOption, autoFind } = {}) {
return new Promise((resolve, reject) => {
- createBrowserAssistantWindow({ ...windowOption })
+ createBrowserAssistantWindow({ ...windowOption }, { autoFind })
let processDone = false
function handler() {
diff --git a/packages/ui/src/main/features/first-launch-notice-window.ts b/packages/ui/src/main/features/first-launch-notice-window.ts
index 5aa3055..4a25343 100644
--- a/packages/ui/src/main/features/first-launch-notice-window.ts
+++ b/packages/ui/src/main/features/first-launch-notice-window.ts
@@ -3,6 +3,11 @@ import os from 'os'
import path from 'path'
import buildInfo from '../../common/build-info.json'
import { ensureStorageFileExist } from '@geekgeekrun/geek-auto-start-chat-with-boss/runtime-file-utils.mjs'
+import {
+ createFirstLaunchNoticeWindow,
+ firstLaunchNoticeWindow
+} from '../window/firstLaunchNoticeWindow'
+import { ipcMain } from 'electron'
export const firstLaunchNoticeApproveFlagPath = path.join(
os.homedir(),
@@ -10,8 +15,28 @@ export const firstLaunchNoticeApproveFlagPath = path.join(
'ui-first-launch-notice-flag'
)
-export const isFirstLaunchNoticeApproveFlagExist = () => fs.existsSync(firstLaunchNoticeApproveFlagPath)
+export const isFirstLaunchNoticeApproveFlagExist = () =>
+ fs.existsSync(firstLaunchNoticeApproveFlagPath)
export const createFirstLaunchNoticeApproveFlag = () => {
ensureStorageFileExist()
fs.writeFileSync(firstLaunchNoticeApproveFlagPath, buildInfo.version)
}
+export async function waitForUserApproveAgreement({ windowOption } = {}) {
+ return new Promise((resolve, reject) => {
+ createFirstLaunchNoticeWindow({ ...windowOption })
+ let processDone = false
+ function handler() {
+ processDone = true
+ firstLaunchNoticeWindow.close()
+ }
+ ipcMain.once('first-launch-notice-approve', handler)
+ firstLaunchNoticeWindow.once('closed', () => {
+ ipcMain.off('first-launch-notice-approve', handler)
+ if (processDone) {
+ resolve(true)
+ } else {
+ reject(new Error('USER_CANCELLED'))
+ }
+ })
+ })
+}
diff --git a/packages/ui/src/main/window/browserAssistantWindow.ts b/packages/ui/src/main/window/browserAssistantWindow.ts
index 73bc8be..7973351 100644
--- a/packages/ui/src/main/window/browserAssistantWindow.ts
+++ b/packages/ui/src/main/window/browserAssistantWindow.ts
@@ -19,7 +19,8 @@ const registerHandleWithWindow = (
}
export function createBrowserAssistantWindow(
- opt?: Electron.BrowserWindowConstructorOptions
+ opt?: Electron.BrowserWindowConstructorOptions,
+ { autoFind } = {}
): BrowserWindow {
// Create the browser window.
if (browserAssistantWindow) {
@@ -45,11 +46,15 @@ export function createBrowserAssistantWindow(
// HMR for renderer base on electron-vite cli.
// Load the remote URL for development or the local html file for production.
+ let routePath = '#/browserAssistant'
+ if (autoFind) {
+ routePath = '#/browserAutoFind'
+ }
if (process.env.NODE_ENV === 'development' && process.env['ELECTRON_RENDERER_URL']) {
- browserAssistantWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + '#/browserAssistant')
+ browserAssistantWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + routePath)
} else {
browserAssistantWindow.loadURL(
- 'file://' + path.join(__dirname, '../renderer/index.html') + '#/browserAssistant'
+ 'file://' + path.join(__dirname, '../renderer/index.html') + routePath
)
}
diff --git a/packages/ui/src/main/window/firstLaunchNoticeWindow.ts b/packages/ui/src/main/window/firstLaunchNoticeWindow.ts
index 626f380..45dd4d8 100644
--- a/packages/ui/src/main/window/firstLaunchNoticeWindow.ts
+++ b/packages/ui/src/main/window/firstLaunchNoticeWindow.ts
@@ -1,6 +1,5 @@
-import { BrowserWindow, ipcMain } from 'electron'
+import { BrowserWindow } from 'electron'
import path from 'path'
-import { createFirstLaunchNoticeApproveFlag } from '../features/first-launch-notice-window'
export let firstLaunchNoticeWindow: BrowserWindow | null = null
export function createFirstLaunchNoticeWindow(
@@ -41,11 +40,3 @@ export function createFirstLaunchNoticeWindow(
return firstLaunchNoticeWindow!
}
-
-export const initIpc = () => {
- ipcMain.handle('first-launch-notice-approve', () => {
- createFirstLaunchNoticeApproveFlag()
- firstLaunchNoticeWindow?.close()
- })
-}
-initIpc()
diff --git a/packages/ui/src/main/window/mainWindow.ts b/packages/ui/src/main/window/mainWindow.ts
index 850ab9a..226cde3 100644
--- a/packages/ui/src/main/window/mainWindow.ts
+++ b/packages/ui/src/main/window/mainWindow.ts
@@ -1,9 +1,14 @@
-import { BrowserWindow, shell } from 'electron'
+import { app, BrowserWindow, shell } from 'electron'
import path from 'path'
import { openDevTools } from '../commands'
-import { createFirstLaunchNoticeWindow } from './firstLaunchNoticeWindow'
-import { isFirstLaunchNoticeApproveFlagExist } from '../features/first-launch-notice-window'
+import {
+ createFirstLaunchNoticeApproveFlag,
+ isFirstLaunchNoticeApproveFlagExist,
+ waitForUserApproveAgreement
+} from '../features/first-launch-notice-window'
import { daemonEE } from '../flow/OPEN_SETTING_WINDOW/connect-to-daemon'
+import { getLastUsedAndAvailableBrowser } from '../flow/DOWNLOAD_DEPENDENCIES/utils/browser-history'
+import { configWithBrowserAssistant } from '../features/config-with-browser-assistant'
export let mainWindow: BrowserWindow | null = null
export function createMainWindow(): BrowserWindow {
@@ -29,12 +34,34 @@ export function createMainWindow(): BrowserWindow {
mainWindow.show()
})
mainWindow.on('ready-to-show', async () => {
- !isFirstLaunchNoticeApproveFlagExist() &&
- createFirstLaunchNoticeWindow({
- parent: mainWindow!,
- modal: true,
- show: true
- })
+ if (!isFirstLaunchNoticeApproveFlagExist()) {
+ try {
+ await waitForUserApproveAgreement({
+ windowOption: {
+ parent: mainWindow!,
+ modal: true,
+ show: true
+ }
+ })
+ createFirstLaunchNoticeApproveFlag()
+ } catch {
+ app.exit(0)
+ return
+ }
+ }
+ const lastBrowser = await getLastUsedAndAvailableBrowser()
+ if (!lastBrowser) {
+ try {
+ await configWithBrowserAssistant({
+ windowOption: {
+ parent: mainWindow!,
+ modal: true,
+ show: true
+ },
+ autoFind: true
+ })
+ } catch (err) {}
+ }
})
mainWindow.on('ready-to-show', async () => {
process.env.NODE_ENV === 'development' &&
diff --git a/packages/ui/src/renderer/src/page/BrowserAssistant/index.vue b/packages/ui/src/renderer/src/page/BrowserAssistant/index.vue
index 7bd11e8..6aa185e 100644
--- a/packages/ui/src/renderer/src/page/BrowserAssistant/index.vue
+++ b/packages/ui/src/renderer/src/page/BrowserAssistant/index.vue
@@ -50,11 +50,14 @@
@click="autoDetectPuppeteerExecutable"
>自动检测按钮再次尝试。目前(2026.2.7)已知 Chrome 最新版本为 144.0.7559.133
- ,多数情况下本程序都可以正常工作,但由于浏览器会自动升级,版本不固定,可能存在浏览器升级后某些功能不兼容导致本程序不能正确运行的问题。您可以的问题。如果您确实遇到不能正常运行的问题,请提交 Issue来反馈新版本浏览器不能正常运行的问题,同时请再尝试方案一。
+ >来反馈,同时请再尝试方案一。
@@ -202,7 +205,9 @@ const handleFeedbackClick = () => {
}
const handleClickLaunchBrowserDownloader = async () => {
gtagRenderer('launch_browser_downloader_clicked')
- const downloadedBrowserPath = await electron.ipcRenderer.invoke('download-browser-with-downloader')
+ const downloadedBrowserPath = await electron.ipcRenderer.invoke(
+ 'download-browser-with-downloader'
+ )
if (downloadedBrowserPath) {
formData.value.browserPath = downloadedBrowserPath
ElMessage({
diff --git a/packages/ui/src/renderer/src/page/BrowserAutoFind/index.vue b/packages/ui/src/renderer/src/page/BrowserAutoFind/index.vue
new file mode 100644
index 0000000..5e668fa
--- /dev/null
+++ b/packages/ui/src/renderer/src/page/BrowserAutoFind/index.vue
@@ -0,0 +1,58 @@
+
+
+
+
你可能是第一次安装本程序
+
正在查找可用浏览器,请稍等...
+
+
+
+
+
+
+
diff --git a/packages/ui/src/renderer/src/page/FirstRunReadme/index.vue b/packages/ui/src/renderer/src/page/FirstRunReadme/index.vue
index 1c088cf..a578ae3 100644
--- a/packages/ui/src/renderer/src/page/FirstRunReadme/index.vue
+++ b/packages/ui/src/renderer/src/page/FirstRunReadme/index.vue
@@ -129,7 +129,7 @@ const readmeItemCheckStatusList = ref([])
const handleCancel = async () => {
gtagRenderer('cancel_clicked')
await sleep(500)
- electron.ipcRenderer.invoke('exit-app-immediately')
+ window.close()
}
const unreadItemsAfterClickSubmit = ref>({})
@@ -150,7 +150,7 @@ const handleSubmit = () => {
}
return
}
- electron.ipcRenderer.invoke('first-launch-notice-approve')
+ electron.ipcRenderer.send('first-launch-notice-approve')
gtagRenderer('submit_done')
}
const handleReadmeItemCheckStatusListChange = (value: number[]) => {
diff --git a/packages/ui/src/renderer/src/router/index.ts b/packages/ui/src/renderer/src/router/index.ts
index 0d6e606..c390b61 100644
--- a/packages/ui/src/renderer/src/router/index.ts
+++ b/packages/ui/src/renderer/src/router/index.ts
@@ -24,6 +24,13 @@ const routes: Array = [
title: '浏览器助手'
}
},
+ {
+ path: '/browserAutoFind',
+ component: () => import('@renderer/page/BrowserAutoFind/index.vue'),
+ meta: {
+ title: '浏览器助手 - 自动查找浏览器'
+ }
+ },
{
path: '/browserDownloadProgress',
component: () => import('@renderer/page/BrowserDownloadProgress/index.vue'),