Skip to content
This repository has been archived by the owner on Feb 11, 2023. It is now read-only.

Commit

Permalink
Merge pull request #159 from nashaofu/dev
Browse files Browse the repository at this point in the history
release 2.0.11
  • Loading branch information
nashaofu authored Dec 16, 2018
2 parents 40e89e5 + fe2a1a6 commit c12fc38
Show file tree
Hide file tree
Showing 11 changed files with 183 additions and 115 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "dingtalk",
"version": "2.0.10",
"version": "2.0.11",
"description": "钉钉桌面版,基于electron和钉钉网页版开发,支持Windows、Linux和macOS",
"author": "nashaofu <[email protected]>",
"main": "dist/main.js",
Expand Down Expand Up @@ -43,7 +43,7 @@
"babel-preset-stage-2": "^6.24.1",
"chalk": "^2.3.0",
"css-loader": "^0.28.9",
"electron": "^2.0.14",
"electron": "^2.0.15",
"electron-builder": "<=20.34.0",
"electron-debug": "^2.0.0",
"electron-dev-webpack-plugin": "0.0.11",
Expand Down
Binary file modified resources/dingtalk.psd
Binary file not shown.
8 changes: 4 additions & 4 deletions src/main/dingtalk.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { app, Menu, ipcMain, BrowserWindow } from 'electron'
import { initSetting, readSetting, writeSetting } from './setting'
import tray from './tray'
import online from './online'
import Notify from './notify'
import mainWin from './mainWin'
import emailWin from './emailWin'
import errorWin from './errorWin'
import aboutWin from './aboutWin'
import settingWin from './settingWin'
import autoUpdate from './autoUpdate'
import shortcut from './shortcut'
import autoUpdate from './autoUpdate'
import settingWin from './settingWin'
import DingtalkTray from './dingtalkTray'
import ShortcutCapture from 'shortcut-capture'

export default class DingTalk {
Expand Down Expand Up @@ -88,7 +88,7 @@ export default class DingTalk {
* 初始化托盘图标
*/
initTray () {
this.$tray = tray(this)()
this.$tray = new DingtalkTray({ dingtalk: this })
}

/**
Expand Down
96 changes: 96 additions & 0 deletions src/main/dingtalkTray.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import { Tray, Menu } from 'electron'
import { getMessageTrayIcon, getNoMessageTrayIcon } from './logo'

export default class DingtalkTray {
_dingtalk = null
// 图标闪烁定时
_flickerTimer = null

// 托盘对象
$tray = null

constructor ({ dingtalk }) {
this._dingtalk = dingtalk
// 生成托盘图标及其菜单项实例
this.$tray = new Tray(getNoMessageTrayIcon())
// 设置鼠标悬浮时的标题
this.$tray.setToolTip('钉钉')
this.initMenu()
this.initEvent()
}

/**
* 初始化菜单
*/
initMenu () {
// 绑定菜单
this.$tray.setContextMenu(
Menu.buildFromTemplate([
{
label: '显示窗口',
click: () => this._dingtalk.showMainWin()
},
{
label: '屏幕截图',
click: () => this._dingtalk.shortcutCapture()
},
{
label: '设置',
click: () => this._dingtalk.showSettingWin()
},
{
label: '关于',
click: () => this._dingtalk.showAboutWin()
},
{
label: '退出',
click: () => this._dingtalk.quit()
}
])
)
}

/**
* 初始化事件
*/
initEvent () {
this.$tray.on('click', () => this._dingtalk.showMainWin())
this.$tray.on('double-click', () => this._dingtalk.showMainWin())
}

/**
* 控制图标是否闪烁
* @param {Boolean} is
*/
flicker (is) {
const messageTrayIcon = getMessageTrayIcon()
const noMessageTrayIcon = getNoMessageTrayIcon()
if (is) {
// 防止连续调用多次,导致图标切换时间间隔不是500ms
if (this._flickerTimer !== null) return
let icon = messageTrayIcon
this._flickerTimer = setInterval(() => {
this.$tray.setImage(icon)
icon = icon === messageTrayIcon ? noMessageTrayIcon : messageTrayIcon
}, 500)
} else {
clearInterval(this._flickerTimer)
this._flickerTimer = null
this.$tray.setImage(noMessageTrayIcon)
}
}

/**
* 判断托盘是否销毁
*/
isDestroyed () {
return this.$tray.isDestroyed()
}

/**
* 销毁托盘图标
*/
destroy () {
return this.$tray.destroy()
}
}
27 changes: 20 additions & 7 deletions src/main/emailWin.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,13 @@ import logo from './logo'
import contextMenu from './contextMenu'
import { app, BrowserWindow } from 'electron'

export default dingtalk => storage => {
export default dingtalk => url => {
if (dingtalk.$emailWin) {
dingtalk.$emailWin.show()
dingtalk.$emailWin.focus()
return dingtalk.$emailWin
}
const url = Object
.keys(storage.localStorage)
.find(key => /^\d+_mailUrl/.test(key))
if (!url) return

const $win = new BrowserWindow({
title: '钉邮',
width: 980,
Expand All @@ -39,14 +35,31 @@ export default dingtalk => storage => {
})

$win.webContents.on('dom-ready', () => {
dingtalk.$mainWin.webContents.session.cookies.get({ domain: '.dingtalk.com' }, (err, cookies) => {
if (err) return
cookies.forEach(cookie => {
if (cookie.domain !== '.dingtalk.com') return
$win.webContents.session.cookies.set(
{
...cookie,
url: 'https://mail.dingtalk.com'
},
err => {
// 回调函数为必传,否则会报错
console.log('dingtalk emailWin cookies log:', err)
}
)
})
})

const filename = path.join(app.getAppPath(), './dist/preload/emailWin.js')
// 读取js文件并执行
fs.access(filename, fs.constants.R_OK, err => {
if (err) return
fs.readFile(filename, (error, data) => {
if (error || $win.webContents.isDestroyed()) return
$win.webContents.executeJavaScript(data.toString(), () => {
if (!$win.webContents.isDestroyed()) $win.webContents.send('dom-ready', storage)
if (!$win.webContents.isDestroyed()) $win.webContents.send('dom-ready')
})
})
})
Expand All @@ -59,6 +72,6 @@ export default dingtalk => storage => {
})

// 加载URL地址
$win.loadURL(decodeURIComponent(storage.localStorage[url]))
$win.loadURL(url)
return $win
}
30 changes: 19 additions & 11 deletions src/main/mainWin.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
import fs from 'fs'
import path from 'path'
import logo, { getNoMessageTrayIcon, getMessageTrayIcon } from './logo'
import logo from './logo'
import download from './download'
import contextMenu from './contextMenu'
import { app, BrowserWindow, shell, ipcMain } from 'electron'

/**
* 打开外部链接
* @param {String} url
*/
function openExternal (url) {
if (url === 'about:blank') return
if (url === 'https://im.dingtalk.com/') return
if (url.indexOf('https://space.dingtalk.com/auth/download') === 0) return
shell.openExternal(url)
}

export default dingtalk => () => {
if (dingtalk.$mainWin) {
dingtalk.showMainWin()
Expand Down Expand Up @@ -44,6 +55,8 @@ export default dingtalk => () => {
})

$win.webContents.on('dom-ready', () => {
// 页面初始化图标不跳动
if (dingtalk.$tray) dingtalk.$tray.flicker(false)
const filename = path.join(app.getAppPath(), './dist/preload/mainWin.js')
// 读取js文件并执行
fs.access(filename, fs.constants.R_OK, err => {
Expand All @@ -66,17 +79,13 @@ export default dingtalk => () => {
// 浏览器中打开链接
$win.webContents.on('new-window', (e, url) => {
e.preventDefault()
if (url !== 'about:blank') {
shell.openExternal(url)
}
openExternal(url)
})

// 主窗口导航拦截
$win.webContents.on('will-navigate', (e, url) => {
e.preventDefault()
if (url !== 'about:blank' && url !== 'https://im.dingtalk.com/') {
shell.openExternal(url)
}
openExternal(url)
})

ipcMain.on('MAINWIN:window-minimize', () => $win.minimize())
Expand All @@ -90,17 +99,16 @@ export default dingtalk => () => {
})

ipcMain.on('MAINWIN:window-close', () => $win.hide())
ipcMain.on('MAINWIN:open-email', (e, storage) => dingtalk.showEmailWin(storage))
ipcMain.on('MAINWIN:open-email', (e, url) => dingtalk.showEmailWin(url))

ipcMain.on('MAINWIN:window-show', () => {
$win.show()
$win.focus()
})

ipcMain.on('MAINWIN:badge', (e, count) => {
app.setBadgeCount(count)
if (dingtalk.$tray) {
dingtalk.$tray.setImage(count ? getMessageTrayIcon() : getNoMessageTrayIcon())
}
if (dingtalk.$tray) dingtalk.$tray.flicker(!!count)
if (app.dock) {
app.dock.show()
app.dock.bounce('critical')
Expand Down
41 changes: 0 additions & 41 deletions src/main/tray.js

This file was deleted.

30 changes: 1 addition & 29 deletions src/preload/emailWin/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,19 @@ const { ipcRenderer, webFrame } = require('electron')

class EmailWinInjector {
constructor () {
this.href = null
this.cookie = null
this.localStorage = null
this.sessionStorage = null
this.init()
}

// 初始化
init () {
ipcRenderer.on('dom-ready', (e, storage) => {
const url = Object
.keys(storage.localStorage)
.find(key => /^\d+_mailUrl/.test(key))
this.href = decodeURIComponent(storage.localStorage[url])
this.cookie = storage.cookie
this.localStorage = storage.localStorage
this.sessionStorage = storage.sessionStorage
ipcRenderer.on('dom-ready', () => {
this.injectJs()
})
}

// 注入JS
injectJs () {
this.setZoomLevel()
this.setStorage()
}

setZoomLevel () {
Expand All @@ -35,22 +23,6 @@ class EmailWinInjector {
webFrame.setZoomLevel(0)
webFrame.setVisualZoomLevelLimits(1, 1)
}

/**
* 本来以为在本地写入localStorage等信息
* 就可以正常使用钉邮了
* 结果我想是我想多了
* 代码先留着吧
*/
setStorage () {
document.cookie = this.cookie
Object
.keys(this.localStorage)
.forEach(key => localStorage.setItem(key, this.localStorage[key]))
Object
.keys(this.sessionStorage)
.forEach(key => sessionStorage.setItem(key, this.sessionStorage[key]))
}
}

new EmailWinInjector()
Loading

0 comments on commit c12fc38

Please sign in to comment.