diff --git a/main.js b/main.js index c942700..a611d85 100644 --- a/main.js +++ b/main.js @@ -10,6 +10,7 @@ const { dialog, crashReporter, desktopCapturer, + powerSaveBlocker, } = require('electron'); const path = require('node:path') const updateJs = require('./src/utils/package/update') @@ -28,6 +29,10 @@ let regKey; let connection = null; let envStr; let startNumber = 0; +let buildStatus = false; //true 打包开发版本 false 本地开发 +powerSaveBlocker.start('prevent-display-sleep') +const id = powerSaveBlocker.start('prevent-display-sleep') +powerSaveBlocker.stop(id) class AppWindow extends BrowserWindow { constructor(config) { @@ -49,7 +54,11 @@ class AppWindow extends BrowserWindow { super(finalConfig); if (env === 'development') { // 开发 - this.loadURL('http://localhost:3000'); + if (buildStatus) { + this.loadFile(path.resolve(__dirname, './dist/index.html')); + } else { + this.loadURL('http://localhost:3000'); + } } else { // 测试 | 生产 this.loadFile(path.resolve(__dirname, './dist/index.html')); @@ -62,33 +71,12 @@ class AppWindow extends BrowserWindow { function quit() { app.quit() } - +let tray; function createTray() { const iconPath = `${__dirname}/src/assets/${updateJs.getIcon(envStr)}.png`; const trayIcon = nativeImage.createFromPath(iconPath); - const tray = new Tray(trayIcon); - const contextMenu = Menu.buildFromTemplate([ - { - label: '打开', click: () => { - mainWindow.webContents.send('isOpenWindows'); - }, - // icon: iconPath, - }, - { - label: '最小化到系统托盘', click: () => { - mainWindow.hide(); - }, - // icon: iconPath, - }, - { - label: '退出', click: async () => { - quit() - }, - // icon: iconPath, - }, - ]); + tray = new Tray(trayIcon); tray.setToolTip(updateJs.getTitle(envStr)); - tray.setContextMenu(contextMenu); tray.on('click', () => { mainWindow.webContents.send('isOpenWindows'); }); @@ -97,6 +85,13 @@ function createTray() { function createWindow() { mainWindow = new AppWindow(); mainWindow.focus(); + mainWindow.hookWindowMessage(278, function (e) { + mainWindow.setEnabled(false);//窗口禁用 + setTimeout(() => { + mainWindow.setEnabled(true);//窗口启用 + }, 100); + return true; + }) } const additionalData = { myKey: 'myValue' } app.on('ready', () => { @@ -136,6 +131,12 @@ app.on('ready', () => { mainWindow.webContents.openDevTools() } }); + mainWindow.on('focus', () => { + mainWindow.show() + }); + mainWindow.on('maximize', () => { + mainWindow.show() + }); // 监听移动 mainWindow.on('move', () => { // 如果是全屏自动恢复到上次窗口大小 @@ -182,6 +183,8 @@ app.on('ready', () => { connection.off('SetDriver'); connection.off('ShowDriverList'); connection.off('ModifyNickName'); + connection.off('JoinChannelCallback'); + connection.off('ExitSharedScreen'); } }); ipcMain.handle('onStop', (event) => { @@ -201,7 +204,6 @@ app.on('ready', () => { await connection.invoke(str, data.roomNum, data.msg) break; case 'sendOper': - // 4:屏幕共享 await connection.invoke(str, data.roomNum, data.type) break; case 'getDrivers': @@ -217,11 +219,11 @@ app.on('ready', () => { await connection.invoke(str, data.uid, data.driversJsonString) break; case 'joinChannel': - // 设置某个人的设备列表 + // 加入房间 await connection.invoke(str, data.roomNum, data.enableMicr, data.enableCamera, data.isRoomManager || false) break; case 'levelChannel': - // 设置某个人的设备列表 + // 退出房间 await connection.invoke(str, data.roomNum) break; } @@ -379,6 +381,19 @@ app.on('ready', () => { nickName }) }); + // 加入房间回调 + connection.on("JoinChannelCallback", (isSuccess) => { + mainWindow.webContents.send('onSignalr', { + key: 'JoinChannelCallback', + isSuccess, + }) + }); + // 退出共享 + connection.on("ExitSharedScreen", () => { + mainWindow.webContents.send('onSignalr', { + key: 'ExitSharedScreen' + }) + }); } }); // 放大缩小退出窗口 @@ -489,9 +504,32 @@ app.on('ready', () => { // 设置桌面应用基础属性 ipcMain.handle('setMainWindowSize', (event, config) => { if (config.width === 250) { + const contextMenu = Menu.buildFromTemplate([ + { + label: '退出', + click: () => quit(), + }, + ]); + tray.setContextMenu(contextMenu); mainWindow.setSkipTaskbar(true) mainWindow.setResizable(false) mainWindow.setAlwaysOnTop(true, 'screen-saver') + } else { + const contextMenu = Menu.buildFromTemplate([ + { + label: '打开', + click: () => mainWindow.webContents.send('isOpenWindows'), + }, + { + label: '最小化到系统托盘', + click: () => mainWindow.hide(), + }, + { + label: '退出', + click: () => quit(), + }, + ]); + tray.setContextMenu(contextMenu); } // 设置最小窗口尺寸 mainWindow.setMinimumSize(config.width, config.height); @@ -551,11 +589,22 @@ app.on('ready', () => { }) if (envStr === 'development') { // 开发 - child.loadURL(config.url) + if (buildStatus) { + child.loadURL(`file://${path.join(__dirname, './dist/index.html')}#/${config.key}`); + } else { + child.loadURL(config.url) + } } else { // 测试 | 生产 child.loadURL(`file://${path.join(__dirname, './dist/index.html')}#/${config.key}`); } + child.hookWindowMessage(278, function (e) { + child.setEnabled(false);//窗口禁用 + setTimeout(() => { + child.setEnabled(true);//窗口启用 + }, 100); + return true; + }) childWindow[config.key] = child child.once('ready-to-show', () => { if (config.show) { diff --git a/package.json b/package.json index ce35f53..98dada8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "WGShare.Metting", "private": true, - "version": "0.6.3", + "version": "0.6.5", "main": "main.js", "authors": "yj", "description": "智汇享", diff --git a/src/api/Home/Index/index.ts b/src/api/Home/Index/index.ts index d18265e..8756a7d 100644 --- a/src/api/Home/Index/index.ts +++ b/src/api/Home/Index/index.ts @@ -5,6 +5,12 @@ export const GetRoom = (data: { pageIndex: number, pageSize: number }) => method: 'get' }) +export const PostFeedback = (data: any) => + request({ + url: `/home/feedback`, + method: 'post', + data, + }) export const PostRoom = (data: any) => request({ url: `/home/room`, diff --git a/src/api/Meeting/index.ts b/src/api/Meeting/index.ts index 22db4c8..6bf6328 100644 --- a/src/api/Meeting/index.ts +++ b/src/api/Meeting/index.ts @@ -154,4 +154,14 @@ export const PutAlterUname = (data: any) => url: `/room/alter-uname`, method: 'put', data + }) +export const GetSharedScreen = (roomNum: string) => + request({ + url: `/room/shared-screen?roomNum=${roomNum}`, + method: 'get' + }) +export const PostSharedScreen = (roomNum: string) => + request({ + url: `/room/shared-screen?roomNum=${roomNum}`, + method: 'post' }) \ No newline at end of file diff --git a/src/assets/icon56-active.png b/src/assets/icon56-active.png new file mode 100644 index 0000000..8e637e8 Binary files /dev/null and b/src/assets/icon56-active.png differ diff --git a/src/assets/icon56.png b/src/assets/icon56.png new file mode 100644 index 0000000..3bd9904 Binary files /dev/null and b/src/assets/icon56.png differ diff --git a/src/components/FeedBackModel/index.module.scss b/src/components/FeedBackModel/index.module.scss new file mode 100644 index 0000000..689f213 --- /dev/null +++ b/src/components/FeedBackModel/index.module.scss @@ -0,0 +1,45 @@ +.feedBackModel { + max-height: 80vh; + display: flex; + flex-direction: column; + .feedBackModelContent { + flex-grow: 1; + overflow-y: auto; + margin: 10px 0; + + .feedBackModelContentRate { + margin-bottom: 20px; + background-color: #101215; + padding: 10px 20px 30px; + box-sizing: border-box; + } + + .feedBackModelContentList { + margin-bottom: 20px; + + >div:nth-child(2) { + >div { + background-color: #101215; + margin-bottom: 10px; + cursor: pointer; + color: #7F859B; + font-size: 14px; + padding: 4px 8px; + box-sizing: border-box; + border: 1px transparent solid; + } + + .active { + color: white; + border: 1px #495EAD solid; + } + } + } + } + + .feedBackModelFooter { + flex-shrink: 0; + display: flex; + justify-content: flex-end; + } +} \ No newline at end of file diff --git a/src/components/FeedBackModel/index.tsx b/src/components/FeedBackModel/index.tsx new file mode 100644 index 0000000..f46997a --- /dev/null +++ b/src/components/FeedBackModel/index.tsx @@ -0,0 +1,138 @@ +import { PostFeedback } from '@/api/Home/Index'; +import styles from '@/components/FeedBackModel/index.module.scss' +import { Button, message, Modal, Rate } from 'antd'; +import TextArea from 'antd/es/input/TextArea'; +import { useState, useImperativeHandle, forwardRef } from "react"; +const FeedBackModel = forwardRef((_props: any, ref: any) => { + useImperativeHandle(ref, () => ({ + changeModal: () => { + setIsFeedBackModel(true) + }, + })) + const [isFeedBackModel, setIsFeedBackModel] = useState(false); + const [feedBackForm, setFeedBackForm] = useState({ + rateValue: 0, + otherContent: '', + }); + const [feedBackList, setFeedBackList] = useState([ + { + text: "软件卡顿", + value: 2, + active: false, + }, + { + text: "设计不合理", + value: 3, + active: false, + }, + { + text: "功能太少", + value: 4, + active: false, + }, + { + text: "通话不流畅", + value: 5, + active: false, + }, + { + text: "视频卡顿", + value: 6, + active: false, + }, + { + text: "操作麻烦", + value: 7, + active: false, + }, + { + text: "其他,需要手动填写", + value: 1, + active: false, + }, + ]); + return ( + <> + setIsFeedBackModel(false)} + centered + width={'500px'} + > +
+
+
+
评分:
+
+ { + setFeedBackForm({ + ...feedBackForm, + rateValue: e + }) + }} /> +
+
+
+
建议:
+
+ { + feedBackList.map((item, index) => { + return ( +
{ + const feedBackListTemp = [...feedBackList] + feedBackListTemp[index].active = !feedBackListTemp[index].active + setFeedBackList(feedBackListTemp) + }}> + {item.text} +
+ ) + }) + } +
+
+
+