diff --git a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer-executable.ts b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer-executable.ts deleted file mode 100644 index 98d0106..0000000 --- a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-download-puppeteer-executable.ts +++ /dev/null @@ -1,103 +0,0 @@ -import * as path from 'node:path' -import * as os from 'node:os' -import * as fs from 'node:fs' -import type { InstalledBrowser } from '@puppeteer/browsers' -import { is } from '@electron-toolkit/utils' -import electron from 'electron' -import { saveLastUsedAndAvailableBrowserInfo, BrowserInfo } from './history-utils' - -export const EXPECT_CHROMIUM_BUILD_ID = '113.0.5672.63' -const cacheDir = path.join( - os.homedir(), - '.geekgeekrun', - 'cache' -) - -const getPuppeteerManagerModule = async () => { - let puppeteerManager - if (is.dev) { - puppeteerManager = await import('@puppeteer/browsers') - } else { - puppeteerManager = ( - await import( - 'file://' + - path.resolve( - electron.app.getAppPath(), - '..', - 'external-node-runtime-dependencies/index.mjs' - ) - ) - ).puppeteerManager - } - - return puppeteerManager -} - -export const getExpectCachedPuppeteerExecutable = async (): Promise => { - const puppeteerManager = await getPuppeteerManagerModule() - - const executablePath = puppeteerManager.computeExecutablePath({ - browser: puppeteerManager.Browser.CHROME, - cacheDir, - buildId: EXPECT_CHROMIUM_BUILD_ID - }) - - const browser = puppeteerManager.Browser.CHROME[0].toUpperCase() + puppeteerManager.Browser.CHROME.slice(1) + ' ' + EXPECT_CHROMIUM_BUILD_ID - return { - executablePath, - browser - } -} - -export const checkCachedPuppeteerExecutable = async () => { - try { - const executablePath = (await getExpectCachedPuppeteerExecutable()).executablePath - return fs.existsSync(executablePath) - } catch { - // should limit [ERR_MODULE_NOT_FOUND] - return false - } -} - -const checkAndDownloadPuppeteerExecutable = async ( - options: { - downloadProgressCallback?: (downloadedBytes: number, totalBytes: number) => void - confirmContinuePromise?: Promise - } = {} -) => { - const puppeteerManager = await getPuppeteerManagerModule() - let installedBrowser: InstalledBrowser - if (!(await checkCachedPuppeteerExecutable())) { - try { - await options.confirmContinuePromise - } catch { - throw new Error('USER_CANCEL_DOWNLOAD_PUPPETEER') - } - // maybe the exist installation is broken. - await puppeteerManager.uninstall({ - cacheDir, - buildId: EXPECT_CHROMIUM_BUILD_ID, - browser: puppeteerManager.Browser.CHROME - }) - installedBrowser = await puppeteerManager.install({ - browser: puppeteerManager.Browser.CHROME, - cacheDir, - buildId: EXPECT_CHROMIUM_BUILD_ID, - downloadProgressCallback: options.downloadProgressCallback - }) - } else { - installedBrowser = ( - await puppeteerManager.getInstalledBrowsers({ - cacheDir - }) - ).find((it) => it.buildId === EXPECT_CHROMIUM_BUILD_ID)! - } - await saveLastUsedAndAvailableBrowserInfo({ - executablePath: installedBrowser.executablePath, - browser: installedBrowser.browser[0].toUpperCase() + installedBrowser.browser.slice(1) + ' ' + EXPECT_CHROMIUM_BUILD_ID - }) - - return installedBrowser -} - -export default checkAndDownloadPuppeteerExecutable diff --git a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-locate-existed-chromium-executable.ts b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-locate-existed-chromium-executable.ts deleted file mode 100644 index 2b8f15d..0000000 --- a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/check-and-locate-existed-chromium-executable.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { is } from '@electron-toolkit/utils' -import electron from 'electron' -import * as os from 'node:os' -import * as fs from 'node:fs' -import path from 'node:path' -import { EXPECT_CHROMIUM_BUILD_ID } from './check-and-download-puppeteer-executable' -import { - getExecutableFileVersion -} from '@geekgeekrun/utils/windows-only/file.mjs' -import { BrowserInfo } from './history-utils' - -export default async function findAndLocateExistedChromiumExecutable(): Promise { - const exceptChromiumMainVersion = Number(EXPECT_CHROMIUM_BUILD_ID.split('.')[0]) - // For windows, try to find Edge(chromium) - if (os.platform() === 'win32') { - // TODO: handle windows - const edgeExecutableLocation = path.join( - process.env['ProgramFiles(x86)']!, - 'Microsoft/Edge/Application', - 'msedge.exe' - ) - if ( - fs.existsSync(edgeExecutableLocation) - ) { - try { - const version = await getExecutableFileVersion(edgeExecutableLocation) - const mainVersion = Number(version.split('.')[0]) - if ( mainVersion >= exceptChromiumMainVersion) { - return { - executablePath: edgeExecutableLocation, - browser: `Edge ${version}` - } - } - } catch(err) { - console.log(err) - } - } - } - - // For other, use findChrome - let findChrome: typeof import('find-chrome-bin').findChrome - if (is.dev) { - findChrome = (await import('find-chrome-bin')).findChrome - } else { - findChrome = ( - await import( - 'file://' + - path.resolve( - electron.app.getAppPath(), - '..', - 'external-node-runtime-dependencies/index.mjs' - ) - ) - ).findChromeBin.findChrome - } - const targetBrowser = await findChrome({ - min: exceptChromiumMainVersion - }) - if (!targetBrowser?.executablePath) { - throw new Error('NO_EXPECT_CHROMIUM_FOUND') - } - return { - executablePath: targetBrowser.executablePath, - browser: targetBrowser.browser - } -} diff --git a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts index 2767ce9..f2bb775 100644 --- a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts +++ b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index.ts @@ -1,53 +1,14 @@ import { app } from 'electron' -import checkAndDownloadPuppeteerExecutable, { - checkCachedPuppeteerExecutable, - getExpectCachedPuppeteerExecutable -} from './check-and-download-puppeteer-executable' +import { checkAndDownloadPuppeteerExecutable } from './utils/puppeteer-executable/index' import * as fs from 'fs' import { pipeWriteRegardlessError } from '../utils/pipe' -import { - removeLastUsedAndAvailableBrowserPath, - getLastUsedAndAvailableBrowser, - saveLastUsedAndAvailableBrowserInfo, - BrowserInfo -} from './history-utils' -import findAndLocateExistedChromiumExecutable from './check-and-locate-existed-chromium-executable' -import { - sleep -} from '@geekgeekrun/utils/sleep.mjs' +import { sleep } from '@geekgeekrun/utils/sleep.mjs' export enum DOWNLOAD_ERROR_EXIT_CODE { NO_ERROR = 0, DOWNLOAD_ERROR = 1 } -export const getAnyAvailablePuppeteerExecutable = async (): Promise => { - const lastUsedOne = await getLastUsedAndAvailableBrowser() - if (lastUsedOne) { - return lastUsedOne - } - // find existed browser - the one maybe actively installed by user or ship with os like Edge on windows - try { - const existedOne = (await findAndLocateExistedChromiumExecutable()) - await saveLastUsedAndAvailableBrowserInfo(existedOne) - // save its path - return existedOne - } catch { - console.log('no existed browser path found') - } - // find existed browser - the fallback one - if (await checkCachedPuppeteerExecutable()) { - const cachedOne = await getExpectCachedPuppeteerExecutable() - await saveLastUsedAndAvailableBrowserInfo(cachedOne) - - return cachedOne - } - - // if no one available, then return null and remove last used browser - await removeLastUsedAndAvailableBrowserPath() - return null -} - export const checkAndDownloadDependenciesForInit = async () => { process.on('disconnect', () => app.exit()) app.dock?.hide() diff --git a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/history-utils.ts b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/browser-history.ts similarity index 86% rename from packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/history-utils.ts rename to packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/browser-history.ts index 21ff1d1..d8506eb 100644 --- a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/history-utils.ts +++ b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/browser-history.ts @@ -4,8 +4,8 @@ import * as fs from 'fs' import * as fsPromise from 'fs/promises' export interface BrowserInfo { - browser: string; - executablePath: string; + browser: string + executablePath: string } const runtimeFolderPath = path.join(os.homedir(), '.geekgeekrun') @@ -27,7 +27,7 @@ export const getLastUsedAndAvailableBrowser = async (): Promise it.trim()) + const [path, browser] = fileContent.split('\n').map((it) => it.trim()) if (!path || !fs.existsSync(path)) { await removeLastUsedAndAvailableBrowserPath() return null @@ -48,10 +48,8 @@ export const saveLastUsedAndAvailableBrowserInfo = async (browserInfo: BrowserIn await fsPromise.mkdir(runtimeFolderPath) } await fsPromise.writeFile( - lastUsedBrowserRecordFilePath, [ - browserInfo.executablePath, - browserInfo.browser - ].join('\n') + lastUsedBrowserRecordFilePath, + [browserInfo.executablePath, browserInfo.browser].join('\n') ) } catch { console.warn('lastUsedBrowserRecordFile write error') diff --git a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/puppeteer-executable/index.ts b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/puppeteer-executable/index.ts new file mode 100644 index 0000000..73c10f4 --- /dev/null +++ b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/puppeteer-executable/index.ts @@ -0,0 +1,213 @@ +import * as path from 'node:path' +import * as os from 'node:os' +import * as fs from 'node:fs' +import type { InstalledBrowser } from '@puppeteer/browsers' +import { + saveLastUsedAndAvailableBrowserInfo, + BrowserInfo, + getLastUsedAndAvailableBrowser, + removeLastUsedAndAvailableBrowserPath +} from '../browser-history' +import { getExecutableFileVersion } from '@geekgeekrun/utils/windows-only/file.mjs' +import CheckAndLocateExistedChromiumExecutableWorker from './worker/find-and-locate-existed-chromium-executable?nodeWorker&url' +import { type Worker } from 'worker_threads' + +const getPuppeteerManagerModule = async () => { + const electron = await import('electron') + + let puppeteerManager + if (process.env.NODE_ENV === 'development') { + puppeteerManager = await import('@puppeteer/browsers') + } else { + puppeteerManager = ( + await import( + 'file://' + + path.resolve( + electron.app.getAppPath(), + '..', + 'external-node-runtime-dependencies/index.mjs' + ) + ) + ).puppeteerManager + } + + return puppeteerManager +} + +const EXPECT_CHROMIUM_BUILD_ID = '113.0.5672.63' +const cacheDir = path.join(os.homedir(), '.geekgeekrun', 'cache') + +const getExpectCachedPuppeteerExecutable = async (): Promise => { + const puppeteerManager = await getPuppeteerManagerModule() + + const executablePath = puppeteerManager.computeExecutablePath({ + browser: puppeteerManager.Browser.CHROME, + cacheDir, + buildId: EXPECT_CHROMIUM_BUILD_ID + }) + + const browser = + puppeteerManager.Browser.CHROME[0].toUpperCase() + + puppeteerManager.Browser.CHROME.slice(1) + + ' ' + + EXPECT_CHROMIUM_BUILD_ID + return { + executablePath, + browser + } +} + +const checkCachedPuppeteerExecutable = async () => { + try { + const executablePath = (await getExpectCachedPuppeteerExecutable()).executablePath + return fs.existsSync(executablePath) + } catch { + // should limit [ERR_MODULE_NOT_FOUND] + return false + } +} + +export const checkAndDownloadPuppeteerExecutable = async ( + options: { + downloadProgressCallback?: (downloadedBytes: number, totalBytes: number) => void + confirmContinuePromise?: Promise + } = {} +) => { + const puppeteerManager = await getPuppeteerManagerModule() + let installedBrowser: InstalledBrowser + if (!(await checkCachedPuppeteerExecutable())) { + try { + await options.confirmContinuePromise + } catch { + throw new Error('USER_CANCEL_DOWNLOAD_PUPPETEER') + } + // maybe the exist installation is broken. + await puppeteerManager.uninstall({ + cacheDir, + buildId: EXPECT_CHROMIUM_BUILD_ID, + browser: puppeteerManager.Browser.CHROME + }) + installedBrowser = await puppeteerManager.install({ + browser: puppeteerManager.Browser.CHROME, + cacheDir, + buildId: EXPECT_CHROMIUM_BUILD_ID, + downloadProgressCallback: options.downloadProgressCallback + }) + } else { + installedBrowser = ( + await puppeteerManager.getInstalledBrowsers({ + cacheDir + }) + ).find((it) => it.buildId === EXPECT_CHROMIUM_BUILD_ID)! + } + await saveLastUsedAndAvailableBrowserInfo({ + executablePath: installedBrowser.executablePath, + browser: + installedBrowser.browser[0].toUpperCase() + + installedBrowser.browser.slice(1) + + ' ' + + EXPECT_CHROMIUM_BUILD_ID + }) + + return installedBrowser +} + +export const getAnyAvailablePuppeteerExecutable = async (): Promise => { + const lastUsedOne = await getLastUsedAndAvailableBrowser() + if (lastUsedOne) { + return lastUsedOne + } + // find existed browser - the one maybe actively installed by user or ship with os like Edge on windows + try { + const existedOne = await findAndLocateUserInstalledChromiumExecutable() + await saveLastUsedAndAvailableBrowserInfo(existedOne) + // save its path + return existedOne + } catch (err) { + console.error(err) + console.log('no existed browser path found') + } + // find existed browser - the fallback one + if (await checkCachedPuppeteerExecutable()) { + const cachedOne = await getExpectCachedPuppeteerExecutable() + await saveLastUsedAndAvailableBrowserInfo(cachedOne) + + return cachedOne + } + + // if no one available, then return null and remove last used browser + await removeLastUsedAndAvailableBrowserPath() + return null +} + +export async function findAndLocateUserInstalledChromiumExecutableSync(): Promise { + const electron = await import('electron') + + const exceptChromiumMainVersion = Number(EXPECT_CHROMIUM_BUILD_ID.split('.')[0]) + // For windows, try to find Edge(chromium) + if (os.platform() === 'win32') { + // TODO: handle windows + const edgeExecutableLocation = path.join( + process.env['ProgramFiles(x86)']!, + 'Microsoft/Edge/Application', + 'msedge.exe' + ) + if (fs.existsSync(edgeExecutableLocation)) { + try { + const version = await getExecutableFileVersion(edgeExecutableLocation) + const mainVersion = Number(version.split('.')[0]) + if (mainVersion >= exceptChromiumMainVersion) { + return { + executablePath: edgeExecutableLocation, + browser: `Edge ${version}` + } + } + } catch (err) { + console.log(err) + } + } + } + + // For other, use findChrome + let findChrome: typeof import('find-chrome-bin').findChrome + if (process.env.NODE_ENV === 'development') { + findChrome = (await import('find-chrome-bin')).findChrome + } else { + findChrome = ( + await import( + 'file://' + + path.resolve( + electron.app.getAppPath(), + '..', + 'external-node-runtime-dependencies/index.mjs' + ) + ) + ).findChromeBin.findChrome + } + const targetBrowser = await findChrome({ + min: exceptChromiumMainVersion + }) + if (!targetBrowser?.executablePath) { + throw new Error('NO_EXPECT_CHROMIUM_FOUND') + } + return { + executablePath: targetBrowser.executablePath, + browser: targetBrowser.browser + } +} + +export async function findAndLocateUserInstalledChromiumExecutable(): Promise { + return new Promise((resolve, reject) => { + const worker: Worker = new CheckAndLocateExistedChromiumExecutableWorker() + worker.once('message', (data) => { + if (data.type === 'RESULT') { + resolve(data.data) + } + }) + worker.once('message', (data) => { + if (data.type === 'ERROR') { + reject(data.error) + } + }) + }) +} diff --git a/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/puppeteer-executable/worker/find-and-locate-existed-chromium-executable.ts b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/puppeteer-executable/worker/find-and-locate-existed-chromium-executable.ts new file mode 100644 index 0000000..cb08de0 --- /dev/null +++ b/packages/ui/src/main/flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/puppeteer-executable/worker/find-and-locate-existed-chromium-executable.ts @@ -0,0 +1,18 @@ +import { parentPort } from 'node:worker_threads' +import { findAndLocateUserInstalledChromiumExecutableSync } from '../index' +;(async () => { + try { + const result = await findAndLocateUserInstalledChromiumExecutableSync() + parentPort?.postMessage({ + type: 'RESULT', + data: result + }) + } catch (error) { + parentPort?.postMessage({ + type: 'ERROR', + error + }) + } + + process.exit(0) +})() diff --git a/packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS.ts b/packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS/index.ts similarity index 93% rename from packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS.ts rename to packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS/index.ts index ede306d..1dbc345 100644 --- a/packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS.ts +++ b/packages/ui/src/main/flow/GEEK_AUTO_START_CHAT_WITH_BOSS/index.ts @@ -3,8 +3,8 @@ import { app } from 'electron' import { SyncHook, AsyncSeriesHook } from 'tapable' import { readConfigFile } from '@geekgeekrun/geek-auto-start-chat-with-boss/runtime-file-utils.mjs' import * as fs from 'fs' -import { pipeWriteRegardlessError } from './utils/pipe' -import { getAnyAvailablePuppeteerExecutable } from './CHECK_AND_DOWNLOAD_DEPENDENCIES' +import { pipeWriteRegardlessError } from '../utils/pipe' +import { getAnyAvailablePuppeteerExecutable } from '../CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/puppeteer-executable' const { groupRobotAccessToken: dingTalkAccessToken } = readConfigFile('dingtalk.json') diff --git a/packages/ui/src/main/flow/LAUNCH_BOSS_ZHIPIN_LOGIN_PAGE_WITH_PRELOAD_EXTENSION.ts b/packages/ui/src/main/flow/LAUNCH_BOSS_ZHIPIN_LOGIN_PAGE_WITH_PRELOAD_EXTENSION.ts index 6a0d63b..e8aa9f0 100644 --- a/packages/ui/src/main/flow/LAUNCH_BOSS_ZHIPIN_LOGIN_PAGE_WITH_PRELOAD_EXTENSION.ts +++ b/packages/ui/src/main/flow/LAUNCH_BOSS_ZHIPIN_LOGIN_PAGE_WITH_PRELOAD_EXTENSION.ts @@ -3,11 +3,6 @@ import { main, loginEventBus } from '@geekgeekrun/launch-bosszhipin-login-page-w import { pipeWriteRegardlessError } from './utils/pipe' import fs from "node:fs"; -export enum DOWNLOAD_ERROR_EXIT_CODE { - NO_ERROR = 0, - DOWNLOAD_ERROR = 1 -} - export const launchBossZhipinLoginPageWithPreloadExtension = async () => { process.on('disconnect', () => app.exit()) app.dock?.hide() diff --git a/packages/ui/src/main/index.ts b/packages/ui/src/main/index.ts index 1b52921..7b6eb25 100644 --- a/packages/ui/src/main/index.ts +++ b/packages/ui/src/main/index.ts @@ -1,4 +1,4 @@ -import { runAutoChat } from './flow/GEEK_AUTO_START_CHAT_WITH_BOSS' +import { runAutoChat } from './flow/GEEK_AUTO_START_CHAT_WITH_BOSS/index' import { openSettingWindow } from './flow/OPEN_SETTING_WINDOW' import { checkAndDownloadDependenciesForInit } from './flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index' import { launchBossZhipinLoginPageWithPreloadExtension } from './flow/LAUNCH_BOSS_ZHIPIN_LOGIN_PAGE_WITH_PRELOAD_EXTENSION' diff --git a/packages/ui/src/main/window/mainWindow.ts b/packages/ui/src/main/window/mainWindow.ts index 61259ce..03e5dae 100644 --- a/packages/ui/src/main/window/mainWindow.ts +++ b/packages/ui/src/main/window/mainWindow.ts @@ -1,11 +1,9 @@ import { BrowserWindow, ipcMain, shell } from 'electron' import path from 'path' import * as childProcess from 'node:child_process' -import { is } from '@electron-toolkit/utils' import { ensureConfigFileExist, ensureStorageFileExist, - configFileNameList, readConfigFile, writeConfigFile, @@ -15,10 +13,8 @@ import { import { ChildProcess } from 'child_process' import * as JSONStream from 'JSONStream' import { checkCookieListFormat } from '../../common/utils/cookie' -import { - DOWNLOAD_ERROR_EXIT_CODE, - getAnyAvailablePuppeteerExecutable -} from '../flow/CHECK_AND_DOWNLOAD_DEPENDENCIES' +import { getAnyAvailablePuppeteerExecutable } from '../flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/utils/puppeteer-executable/index' +import { DOWNLOAD_ERROR_EXIT_CODE } from '../flow/CHECK_AND_DOWNLOAD_DEPENDENCIES/index' import { sleep } from '@geekgeekrun/utils/sleep.mjs' let mainWindow: BrowserWindow | null = null @@ -31,8 +27,8 @@ export function createMainWindow(): void { autoHideMenuBar: true, ...(process.platform === 'linux' ? { - /* icon */ - } + /* icon */ + } : {}), webPreferences: { preload: path.join(__dirname, '../preload/index.js'), @@ -40,7 +36,7 @@ export function createMainWindow(): void { } }) - is.dev && mainWindow.webContents.openDevTools() + process.env.NODE_ENV === 'development' && mainWindow.webContents.openDevTools() mainWindow.on('ready-to-show', () => { mainWindow.show() @@ -53,7 +49,7 @@ export function createMainWindow(): void { // HMR for renderer base on electron-vite cli. // Load the remote URL for development or the local html file for production. - if (is.dev && process.env['ELECTRON_RENDERER_URL']) { + if (process.env.NODE_ENV === 'development' && process.env['ELECTRON_RENDERER_URL']) { mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) } else { mainWindow.loadFile(path.join(__dirname, '../renderer/index.html')) @@ -70,7 +66,7 @@ export function createMainWindow(): void { return readConfigFile(fileName) }) const result = { - config: {}, + config: {} } configFileNameList.forEach((fileName, index) => { @@ -106,17 +102,28 @@ export function createMainWindow(): void { // const currentExecutablePath = app.getPath('exe') // console.log(currentExecutablePath) + ipcMain.handle('prepare-run-geek-auto-start-chat-with-boss', async () => { + mainWindow?.webContents.send('locating-puppeteer-executable') + const puppeteerExecutable = await getAnyAvailablePuppeteerExecutable() + if (!puppeteerExecutable) { + return Promise.reject('NEED_TO_CHECK_RUNTIME_DEPENDENCIES') + } + mainWindow?.webContents.send('puppeteer-executable-is-located') + }) let subProcessOfPuppeteer: ChildProcess | null = null ipcMain.handle('run-geek-auto-start-chat-with-boss', async () => { if (subProcessOfPuppeteer) { return } - + const puppeteerExecutable = await getAnyAvailablePuppeteerExecutable() + if (!puppeteerExecutable) { + return Promise.reject('NEED_TO_CHECK_RUNTIME_DEPENDENCIES') + } const subProcessEnv = { ...process.env, MAIN_BOSSGEEKGO_UI_RUN_MODE: 'geekAutoStartWithBoss', - PUPPETEER_EXECUTABLE_PATH: (await getAnyAvailablePuppeteerExecutable())!.executablePath + PUPPETEER_EXECUTABLE_PATH: puppeteerExecutable.executablePath } subProcessOfPuppeteer = childProcess.spawn(process.argv[0], process.argv.slice(1), { env: subProcessEnv, @@ -171,7 +178,7 @@ export function createMainWindow(): void { } const subProcessEnv = { ...process.env, - MAIN_BOSSGEEKGO_UI_RUN_MODE: 'checkAndDownloadDependenciesForInit', + MAIN_BOSSGEEKGO_UI_RUN_MODE: 'checkAndDownloadDependenciesForInit' } subProcessOfCheckAndDownloadDependencies = childProcess.spawn( process.argv[0], @@ -194,7 +201,7 @@ export function createMainWindow(): void { } case 'PUPPETEER_DOWNLOAD_ENCOUNTER_ERROR': { console.error(data) - break; + break } default: { return diff --git a/packages/ui/src/renderer/src/App.vue b/packages/ui/src/renderer/src/App.vue index e2a2122..cb291fa 100644 --- a/packages/ui/src/renderer/src/App.vue +++ b/packages/ui/src/renderer/src/App.vue @@ -1,6 +1,8 @@ diff --git a/packages/ui/src/renderer/src/features/DependenciesSetupProgressIndicatorDialog/operations.ts b/packages/ui/src/renderer/src/features/DependenciesSetupProgressIndicatorDialog/operations.ts deleted file mode 100644 index 4ecbed1..0000000 --- a/packages/ui/src/renderer/src/features/DependenciesSetupProgressIndicatorDialog/operations.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { createApp } from 'vue' -import ElementPlus from 'element-plus' -import DependenciesSetupProgressIndicatorDialog from './index.vue' - -export const mountGlobalDialog = (o: { dependenciesStatus: Record, processWaitee? }) => { - const containerElId = `elForDependenciesSetupProgressIndicatorDialog` - - if (document.getElementById(containerElId)) { - return - } - let containerEl: null | HTMLElement = (() => { - const el = document.createElement('div') - el.id = containerElId - return el - })() - document.body.append(containerEl) - - const dispose = () => { - app?.unmount() - containerEl?.remove() - - app = null - containerEl = null - } - let app: null | ReturnType = createApp(DependenciesSetupProgressIndicatorDialog, { - modelValue: true, - onClosed() { - dispose() - }, - dispose, - dependenciesStatus: o?.dependenciesStatus, - processWaitee: o?.processWaitee - }).use(ElementPlus) - app.mount(containerEl) - - return { - dispose - } -} diff --git a/packages/ui/src/renderer/src/features/FlyingCompanyLogoList/index.vue b/packages/ui/src/renderer/src/features/FlyingCompanyLogoList/index.vue index a2e5c65..0d8385b 100644 --- a/packages/ui/src/renderer/src/features/FlyingCompanyLogoList/index.vue +++ b/packages/ui/src/renderer/src/features/FlyingCompanyLogoList/index.vue @@ -1,106 +1,116 @@ -.dot { - display: block; - --dot-run-duration: 1s; - animation: fly-in var(--dot-run-duration) linear infinite; - transform-origin: center; - mix-blend-mode: darken; - width: 200px; + diff --git a/packages/ui/src/renderer/src/features/WaitForLoginDialog/operations.ts b/packages/ui/src/renderer/src/features/WaitForLoginDialog/operations.ts deleted file mode 100644 index 98f773b..0000000 --- a/packages/ui/src/renderer/src/features/WaitForLoginDialog/operations.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { createApp } from 'vue' -import ElementPlus from 'element-plus' -import WaitForLogin from './index.vue' - -export const mountGlobalDialog = (o: { processWaitee? }) => { - const containerElId = `elForWaitForLogin` - - if (document.getElementById(containerElId)) { - return - } - let containerEl: null | HTMLElement = (() => { - const el = document.createElement('div') - el.id = containerElId - return el - })() - document.body.append(containerEl) - - const dispose = () => { - app?.unmount() - containerEl?.remove() - - app = null - containerEl = null - } - let app: null | ReturnType = createApp(WaitForLogin, { - modelValue: true, - onClosed() { - dispose() - }, - dispose, - processWaitee: o?.processWaitee - }).use(ElementPlus) - app.mount(containerEl) - - return { - dispose - } -} diff --git a/packages/ui/src/renderer/src/page/BootstrapSplash/index.vue b/packages/ui/src/renderer/src/page/BootstrapSplash/index.vue new file mode 100644 index 0000000..02bc028 --- /dev/null +++ b/packages/ui/src/renderer/src/page/BootstrapSplash/index.vue @@ -0,0 +1,41 @@ + + + diff --git a/packages/ui/src/renderer/src/features/DependenciesSetupProgressIndicatorDialog/index.vue b/packages/ui/src/renderer/src/page/BootstrapSplash/page/DownloadingDependencies.vue similarity index 69% rename from packages/ui/src/renderer/src/features/DependenciesSetupProgressIndicatorDialog/index.vue rename to packages/ui/src/renderer/src/page/BootstrapSplash/page/DownloadingDependencies.vue index 64eddb8..b5b4701 100644 --- a/packages/ui/src/renderer/src/features/DependenciesSetupProgressIndicatorDialog/index.vue +++ b/packages/ui/src/renderer/src/page/BootstrapSplash/page/DownloadingDependencies.vue @@ -1,20 +1,12 @@ diff --git a/packages/ui/src/renderer/src/page/Configuration/index.vue b/packages/ui/src/renderer/src/page/Configuration/index.vue index 6d249b5..83f3af7 100644 --- a/packages/ui/src/renderer/src/page/Configuration/index.vue +++ b/packages/ui/src/renderer/src/page/Configuration/index.vue @@ -2,9 +2,8 @@ diff --git a/packages/ui/src/renderer/src/features/WaitForLoginDialog/index.vue b/packages/ui/src/renderer/src/page/CookieAssistant/index.vue similarity index 87% rename from packages/ui/src/renderer/src/features/WaitForLoginDialog/index.vue rename to packages/ui/src/renderer/src/page/CookieAssistant/index.vue index 040f7f2..ca259fe 100644 --- a/packages/ui/src/renderer/src/features/WaitForLoginDialog/index.vue +++ b/packages/ui/src/renderer/src/page/CookieAssistant/index.vue @@ -1,14 +1,6 @@ + + diff --git a/packages/ui/src/renderer/src/page/GeekAutoStartChatWithBoss/index.vue b/packages/ui/src/renderer/src/page/GeekAutoStartChatWithBoss/index.vue index f21a49f..fedf5d5 100644 --- a/packages/ui/src/renderer/src/page/GeekAutoStartChatWithBoss/index.vue +++ b/packages/ui/src/renderer/src/page/GeekAutoStartChatWithBoss/index.vue @@ -1 +1,37 @@ - + + + diff --git a/packages/ui/src/renderer/src/router/index.ts b/packages/ui/src/renderer/src/router/index.ts index 21ff40a..9f59f86 100644 --- a/packages/ui/src/renderer/src/router/index.ts +++ b/packages/ui/src/renderer/src/router/index.ts @@ -1,12 +1,13 @@ -import { defineComponent, h } from 'vue' import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' +import BootstrapSplash from '@renderer/page/BootstrapSplash/index.vue' const routes: Array = [ { - path: '/', - component: defineComponent({ setup: () => h('div') }), - redirect: '/configuration', - children: [] + path: '/cookieAssistant', + component: () => import('@renderer/page/CookieAssistant/index.vue'), + meta: { + title: 'Cookie 助手' + } }, { path: '/configuration', @@ -26,6 +27,13 @@ const routes: Array = [ path: '/geekAutoStartChatWithBoss', component: () => import('@renderer/page/GeekAutoStartChatWithBoss/index.vue'), children: [ + { + path: 'prepareRun', + component: () => import('@renderer/page/GeekAutoStartChatWithBoss/PrepareRun.vue'), + meta: { + title: 'BOSS炸弹 正在预热' + } + }, { path: 'runningStatus', component: () => import('@renderer/page/GeekAutoStartChatWithBoss/RunningStatus.vue'), @@ -34,7 +42,23 @@ const routes: Array = [ } } ] - } + }, + { + path: '/', + component: BootstrapSplash, + meta: { + title: '薪想事成' + }, + children: [ + { + path: '/downloadingDependencies', + component: () => import('@renderer/page/BootstrapSplash/page/DownloadingDependencies.vue'), + meta: { + title: '正在下载浏览器' + }, + } + ] + }, ] const router = createRouter({