From de45332543a7e60b81647618996f6b30dcf19a79 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 14 Jun 2022 14:15:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=AA=97=E5=8F=A3=E6=BF=80?= =?UTF-8?q?=E6=B4=BB=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/electron.js | 8 +++ resources/assets/js/App.vue | 49 +++++++++++++------ resources/assets/js/pages/manage.vue | 31 +++--------- .../js/pages/manage/components/DialogView.vue | 9 +++- .../pages/manage/components/DialogWrapper.vue | 5 +- resources/assets/js/store/state.js | 3 ++ 6 files changed, 60 insertions(+), 45 deletions(-) diff --git a/electron/electron.js b/electron/electron.js index b5bc9d81a..6d783aca4 100644 --- a/electron/electron.js +++ b/electron/electron.js @@ -206,6 +206,14 @@ app.on('before-quit', () => { willQuitApp = true }) +app.on('browser-window-blur', () => { + mainWindow.webContents.send("browserWindowBlur", {}) +}) + +app.on('browser-window-focus', () => { + mainWindow.webContents.send("browserWindowFocus", {}) +}) + /** * 打开文件 * @param args {path} diff --git a/resources/assets/js/App.vue b/resources/assets/js/App.vue index 4683cedb2..5f0172fee 100755 --- a/resources/assets/js/App.vue +++ b/resources/assets/js/App.vue @@ -59,13 +59,14 @@ export default { created() { this.electronEvents(); this.eeuiEvents(); + this.otherEvents(); + this.synchThemeLanguage(); }, mounted() { window.addEventListener('resize', this.windowSizeListener); window.addEventListener('scroll', this.windowScrollListener); this.searchInter = setInterval(this.searchEnter, 1000); - this.synchThemeLanguage(); }, beforeDestroy() { @@ -76,6 +77,10 @@ export default { computed: { ...mapState(['ws', 'themeMode']), + + isSoftware() { + return this.$Electron || this.$isEEUiApp; + }, }, watch: { @@ -175,6 +180,16 @@ export default { }); }, + synchThemeLanguage() { + if (this.isSoftware) { + this.iframes = this.iframes.filter(({key}) => key != 'synchThemeLanguage') + this.iframes.push({ + key: 'synchThemeLanguage', + url: $A.apiUrl(`../setting/theme_language?theme=${this.themeMode}&language=${this.languageType}`) + }) + } + }, + windowSizeListener() { this.$store.state.windowWidth = $A(window).width() this.$store.state.windowHeight = $A(window).height() @@ -202,6 +217,12 @@ export default { let {action, data} = args; this.$store.dispatch(action, data); }) + this.$Electron.registerMsgListener('browserWindowBlur', _ => { + this.$store.state.windowActive = false; + }) + this.$Electron.registerMsgListener('browserWindowFocus', _ => { + this.$store.state.windowActive = true; + }) this.iframes.push({ key: 'manifest', url: $A.apiUrl("../manifest") @@ -214,17 +235,12 @@ export default { } // 页面失活 window.__onPagePause = () => { - if (this.$openLog) { - console.log('onPagePause'); - } - this.$store.dispatch("getBasicData", -1) + this.$store.state.windowActive = false; + this.$store.dispatch("getBasicData", -1); } // 页面激活 window.__onPageResume = (num) => { - if (this.$openLog) { - console.log('onPageResume', num); - console.log('ws', this.ws, this.ws ? this.ws.readyState : null); - } + this.$store.state.windowActive = true; if (num > 0) { this.$store.dispatch("getBasicData", 600) if (this.ws === null) { @@ -240,13 +256,14 @@ export default { } }, - synchThemeLanguage() { - if (this.$Electron || this.$isEEUiApp) { - this.iframes = this.iframes.filter(({key}) => key != 'synchThemeLanguage') - this.iframes.push({ - key: 'synchThemeLanguage', - url: $A.apiUrl(`../setting/theme_language?theme=${this.themeMode}&language=${this.languageType}`) - }) + otherEvents() { + if (!this.isSoftware) { + // 非客户端监听窗口激活 + const hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : 'mozHidden' in document ? 'mozHidden' : null; + const visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange'); + document.addEventListener(visibilityChangeEvent, () => { + this.$store.state.windowActive = !document[hiddenProperty] + }); } }, } diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 8f69d3ef6..53d51e476 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -431,7 +431,6 @@ export default { allProjectShow: false, archivedProjectShow: false, - natificationHidden: false, natificationReady: false, notificationManage: null, @@ -451,7 +450,6 @@ export default { } // this.notificationInit(); - this.onVisibilityChange(); // this.addTaskSubscribe = Store.subscribe('addTask', this.onAddTask); this.dialogMsgSubscribe = Store.subscribe('dialogMsgPush', this.addDialogMsg); @@ -501,6 +499,7 @@ export default { 'clientNewVersion', 'cacheTaskBrowse', + 'windowActive', 'dialogIns', ]), @@ -663,15 +662,6 @@ export default { }, 600); }, - natificationHidden(val) { - clearTimeout(this.notificationTimeout); - if (!val && this.notificationManage) { - this.notificationTimeout = setTimeout(() => { - this.notificationManage.close(); - }, 6000); - } - }, - wsOpenNum(num) { if (num <= 1) return this.$store.dispatch("getBasicData", 600).then(this.getReportUnread) @@ -903,17 +893,17 @@ export default { addDialogMsg(data) { if (!this.natificationReady && !this.$isEEUiApp) { - return; // 通知未准备好 + return; // 通知未准备好不通知 } - if ($A.last(this.dialogIns)?.dialog_id === data.dialog_id) { - return; // 最后打开的会话是通知的会话时不通知 + if (this.windowActive && data.dialog_id === $A.last(this.dialogIns)?.dialog_id) { + return; // 窗口激活且最后打开的会话是通知的会话时不通知 } // const {id, dialog_id, type, msg, userid} = data; if (userid == this.userId) { - return; // 自己的消息不弹出通知 + return; // 自己的消息不通知 } - let body = ''; + let body; switch (type) { case 'text': body = $A.getMsgTextPreview(msg.text) @@ -1092,15 +1082,6 @@ export default { }; this.notificationManage.initNotification(userSelectFn); }, - - onVisibilityChange() { - let hiddenProperty = 'hidden' in document ? 'hidden' : 'webkitHidden' in document ? 'webkitHidden' : 'mozHidden' in document ? 'mozHidden' : null; - let visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange'); - let visibilityChangeListener = () => { - this.natificationHidden = !!document[hiddenProperty] - } - document.addEventListener(visibilityChangeEvent, visibilityChangeListener); - }, } } diff --git a/resources/assets/js/pages/manage/components/DialogView.vue b/resources/assets/js/pages/manage/components/DialogView.vue index 5944e3d64..6536f6f5d 100644 --- a/resources/assets/js/pages/manage/components/DialogView.vue +++ b/resources/assets/js/pages/manage/components/DialogView.vue @@ -171,7 +171,7 @@ export default { }, computed: { - ...mapState(['dialogMsgs', 'audioPlaying']), + ...mapState(['dialogMsgs', 'audioPlaying', 'windowActive']), viewClass() { const {msgData, operateAction, operateEnter} = this; @@ -235,6 +235,11 @@ export default { }, immediate: true, }, + windowActive(active) { + if (active) { + this.msgRead(); + } + }, operateAction(val) { this.operateEnter = false; if (val) { @@ -255,7 +260,7 @@ export default { }, msgRead() { - if (this.msgData._r === true) { + if (!this.windowActive || this.msgData._r === true) { return; } this.msgData._r = true; diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index deced3678..5afb85cda 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -116,7 +116,7 @@