diff --git a/main.js b/main.js index ac6b73b..96aee97 100644 --- a/main.js +++ b/main.js @@ -12,7 +12,7 @@ const { } = require('electron'); const path = require('node:path') const fs = require('fs'); -const {autoUpdater, CancellationToken} = require('electron-updater'); +const { autoUpdater, CancellationToken } = require('electron-updater'); const cancellationToken = new CancellationToken() app.allowRendererProcessReuse = false; let mainWindow = null; @@ -34,7 +34,7 @@ class AppWindow extends BrowserWindow { backgroundColor: '#00000000', transparent: true, }; - const finalConfig = {...basicConfig, ...config}; + const finalConfig = { ...basicConfig, ...config }; super(finalConfig); const env = process.argv.find((arg) => arg.startsWith('--env='))?.split('=')[1]; if (env === 'development') { @@ -247,7 +247,7 @@ app.on('ready', () => { mainWindow.setMinimumSize(config.width, config.height); // 设置最大尺寸 const primaryDisplay = screen.getPrimaryDisplay() - const {width, height} = primaryDisplay.workAreaSize + const { width, height } = primaryDisplay.workAreaSize if (config.key === 'login') { mainWindow.setMaximumSize(config.width, config.height); } else { @@ -256,11 +256,37 @@ app.on('ready', () => { // 设置窗口尺寸 mainWindow.setSize(config.width, config.height) // 设置窗口位置使其居中于当前屏幕 - const display = screen.getDisplayMatching({...mainWindow.getBounds()}); + const display = screen.getDisplayMatching({ ...mainWindow.getBounds() }); const x = Math.round((display.workArea.width - mainWindow.getSize()[0]) / 2); const y = Math.round((display.workArea.height - mainWindow.getSize()[1]) / 2); mainWindow.setPosition(x, y); }); + // 打开新窗口 + ipcMain.handle('oepnWindow', (event, data) => { + const newWindow = new BrowserWindow({ + width: 1200, + height: 800, + maxWidth: 1200, + minHeight: 800, + webPreferences: { + contextIsolation: false, + nodeIntegration: true, + enableRemoteModule: true, + nodeIntegrationInWorker: true, + allowMediaDevices: true, + preload: path.join(__dirname, 'preload.js') + }, + frame: false, + backgroundColor: '#00000000', + transparent: true, + }); + newWindow.loadURL(data.url); + newWindow.webContents.on('before-input-event', (event, input) => { + if (input.key === 'F12') { + newWindow.webContents.openDevTools() + } + }); + }); }); // 检测更新,在你想要检查更新的时候执行,renderer事件触发后的操作自行编写 @@ -283,7 +309,7 @@ function updateHandle() { sendUpdateMessage(message.checking) }) autoUpdater.on('update-available', function (info) { - let messageStr = JSON.stringify({type: '0'}) + let messageStr = JSON.stringify({ type: '0' }) setTimeout(() => { sendUpdateMessage(messageStr) }, 5000) diff --git a/preload.js b/preload.js index 886b87a..c67c731 100644 --- a/preload.js +++ b/preload.js @@ -57,4 +57,8 @@ window.electron = { downFile: (callback) => { ipcRenderer.on('downFile', callback) }, + // 打开新窗口 + oepnWindow: (data) => { + ipcRenderer.invoke('oepnWindow', data) + }, } diff --git a/src/App.tsx b/src/App.tsx index 24530cc..a4f6d36 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,6 +17,7 @@ import { PostLogin } from "@/api/Login"; import agora from "@/utils/package/agora"; import QuitTips from "@/components/QuitTips"; import { GetLeave } from "@/api/Meeting"; +import UserVideo from "./page/UserVideo"; const fs = require('fs').promises; const { exec } = require('child_process'); const App: React.FC = () => { @@ -31,29 +32,127 @@ const App: React.FC = () => { }); const [spinning, setSpinning] = useState(false); const [isState, setIsState] = useState(true); - useEffect(() => { - let userInfo = JSON.parse(storage.getItem('user') as string) - let loginInfo = JSON.parse(storage.getItem('login') as string) - if (userInfo) { - if (loginInfo && loginInfo.isAutoLogin) { - PostLogin({ - account: loginInfo.account, - pwd: CryptoJS.MD5(loginInfo.password).toString(CryptoJS.enc.Hex) - }).then(async (res) => { - if (res.code === 200) { - storage.setItem('user', JSON.stringify(res.data)) - toSrc('/home') - await startSignalr() - } else { - toSrc('/login') - } - }) + const urlWindow = ['#/userVideo'] + if (urlWindow.indexOf(location.hash) === -1) { + useEffect(() => { + let userInfo = JSON.parse(storage.getItem('user') as string) + let loginInfo = JSON.parse(storage.getItem('login') as string) + if (userInfo) { + if (loginInfo && loginInfo.isAutoLogin) { + PostLogin({ + account: loginInfo.account, + pwd: CryptoJS.MD5(loginInfo.password).toString(CryptoJS.enc.Hex) + }).then(async (res) => { + if (res.code === 200) { + storage.setItem('user', JSON.stringify(res.data)) + toSrc('/home') + await startSignalr() + } else { + toSrc('/login') + } + }) + } else { + toSrc('/login') + } } else { toSrc('/login') } - } else { - toSrc('/login') - } + window.addEventListener('resize', handleResize); + window.addEventListener('online', handleNetworkChange); + window.addEventListener('offline', handleNetworkChange); + const originalSetItem = window.localStorage.setItem; + window.localStorage.setItem = function (key, value) { + originalSetItem.call(this, key, value); + const event = new Event('customStorageChange') as any; + event.key = key + event.value = value + window.dispatchEvent(event); + }; + window.addEventListener('customStorageChange', handleCustomStorageChange); + return () => { + window.removeEventListener('resize', handleResize); + window.removeEventListener('customStorageChange', handleCustomStorageChange); + window.removeEventListener('online', handleNetworkChange); + window.removeEventListener('offline', handleNetworkChange); + }; + }, []); + useEffect(() => { + window.electron.downFile(async (_e: any, data: any) => { + const response = await fetch(data.filePath); + const arrayBuffer = await response.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + fs.writeFile(`${data.downFilePaths}${data.fileName}`, buffer, {}); + message.success(`下载成功!文件已保存至:${data.downFilePaths}`) + await fs.access(data.downFilePaths, fs.constants.F_OK); + if (process.platform === 'win32') { + exec(`explorer "${data.downFilePaths}"`); + } else if (process.platform === 'darwin') { + exec(`open "${data.downFilePaths}"`); + } + }) + window.electron.onFilePath(async (_e: any, filePath: string, key: string) => { + const setting = await JSON.parse(storage.getItem('setting') as string) + if (key === 'recordingFilesPath') { + setting.recordingFilesPath = filePath + } else { + setting.shareFilesPath = filePath + } + storage.setItem('setting', JSON.stringify(setting)) + }) + window.electron.quitAndInstall(async (_e: any) => { + leaveChannel() + }) + }, []) + useEffect(() => { + window.electron.onUpdate((_e: any, data: any) => { + if (location.hash.indexOf('/meeting') === -1) { + updateModalRef.current.changeModal(data) + } + }) + if (!storage.getItem('setting')) { + storage.setItem('setting', JSON.stringify({ + videoDeviceId: '', //摄像头id + ecordingDeviceId: "", //输入设备id + playBackDeviceId: "", //输出设备id + ecordingVolume: '', //输入音量 + playBackVolume: '', //输出音量 + autoEcordingVolume: true, //是否自动调整麦克风音量 + recordingFilesPath: '', //本地录制保存路径 + shareFilesPath: '', //共享文件保存路径 + isShareSavePath: true, //是否下载钱询问每个文件保存的位置 + closeSetting: 'hide', //关闭按钮设置 + })) + } + }, []) + useEffect(() => { + if (isState) { + setIsState(false) + window.electron.onQuit(async () => { + if (location.hash.indexOf('/login') === 1) { + window.electron.quit() + } else { + if (storage.getItem('isTips') === 'true') { + const setting = JSON.parse(storage.getItem('setting') as string) + if (setting.closeSetting === 'hide') { + window.electron.setViewStatus(setting.closeSetting) + } else { + window.electron.quit() + } + } else { + quitTipsRef.current.changeModal() + } + } + }) + } + storage.setItem('stateInfo', JSON.stringify(state)) + }, [state]) + useEffect(() => { + if (location.href.indexOf('/login') !== -1) { + onStop() + } + }, [navigate]) + } + useEffect(() => { if (import.meta.env.VITE_ENV !== 'development') { document.addEventListener('keydown', (event) => { if ((event.ctrlKey || event.metaKey) && event.key === 'r') { @@ -64,100 +163,7 @@ const App: React.FC = () => { } }); } - window.addEventListener('resize', handleResize); - window.addEventListener('online', handleNetworkChange); - window.addEventListener('offline', handleNetworkChange); - const originalSetItem = window.localStorage.setItem; - window.localStorage.setItem = function (key, value) { - originalSetItem.call(this, key, value); - const event = new Event('customStorageChange') as any; - event.key = key - event.value = value - window.dispatchEvent(event); - }; - window.addEventListener('customStorageChange', handleCustomStorageChange); - return () => { - window.removeEventListener('resize', handleResize); - window.removeEventListener('customStorageChange', handleCustomStorageChange); - window.removeEventListener('online', handleNetworkChange); - window.removeEventListener('offline', handleNetworkChange); - }; - }, []); - useEffect(() => { - window.electron.downFile(async (_e: any, data: any) => { - const response = await fetch(data.filePath); - const arrayBuffer = await response.arrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - fs.writeFile(`${data.downFilePaths}${data.fileName}`, buffer, {}); - message.success(`下载成功!文件已保存至:${data.downFilePaths}`) - await fs.access(data.downFilePaths, fs.constants.F_OK); - if (process.platform === 'win32') { - exec(`explorer "${data.downFilePaths}"`); - } else if (process.platform === 'darwin') { - exec(`open "${data.downFilePaths}"`); - } - }) - window.electron.onFilePath(async (_e: any, filePath: string, key: string) => { - const setting = await JSON.parse(storage.getItem('setting') as string) - if (key === 'recordingFilesPath') { - setting.recordingFilesPath = filePath - } else { - setting.shareFilesPath = filePath - } - storage.setItem('setting', JSON.stringify(setting)) - }) - window.electron.quitAndInstall(async (_e: any) => { - leaveChannel() - }) }, []) - useEffect(() => { - window.electron.onUpdate((_e: any, data: any) => { - if (location.hash.indexOf('/meeting') === -1) { - updateModalRef.current.changeModal(data) - } - }) - if (!storage.getItem('setting')) { - storage.setItem('setting', JSON.stringify({ - videoDeviceId: '', //摄像头id - ecordingDeviceId: "", //输入设备id - playBackDeviceId: "", //输出设备id - ecordingVolume: '', //输入音量 - playBackVolume: '', //输出音量 - autoEcordingVolume: true, //是否自动调整麦克风音量 - recordingFilesPath: '', //本地录制保存路径 - shareFilesPath: '', //共享文件保存路径 - isShareSavePath: true, //是否下载钱询问每个文件保存的位置 - closeSetting: 'hide', //关闭按钮设置 - })) - } - }, []) - useEffect(() => { - if (isState) { - setIsState(false) - window.electron.onQuit(async () => { - if (location.hash.indexOf('/login') === 1) { - window.electron.quit() - } else { - if (storage.getItem('isTips') === 'true') { - const setting = JSON.parse(storage.getItem('setting') as string) - if (setting.closeSetting === 'hide') { - window.electron.setViewStatus(setting.closeSetting) - } else { - window.electron.quit() - } - } else { - quitTipsRef.current.changeModal() - } - } - }) - } - storage.setItem('stateInfo', JSON.stringify(state)) - }, [state]) - useEffect(() => { - if (location.href.indexOf('/login') !== -1) { - onStop() - } - }, [navigate]) const handleResize = (): void => { setWindowSize({ width: window.innerWidth, @@ -260,6 +266,7 @@ const App: React.FC = () => { } /> } /> + } /> } /> diff --git a/src/page/Home/Index/index.tsx b/src/page/Home/Index/index.tsx index 4184ede..da7e741 100644 --- a/src/page/Home/Index/index.tsx +++ b/src/page/Home/Index/index.tsx @@ -125,6 +125,9 @@ const Index: React.FC = () => {