Compare commits

...

84 Commits

Author SHA1 Message Date
Riceneeder
01493bd37a
修复保存的图片没有加.jpg后缀
Merge pull request  from silentdoer/master
2023-05-23 01:02:47 +00:00
silentdoer
4bb999e514 修复保存的图片没有附加后缀 2023-05-22 23:37:32 +08:00
Riceneeder
46d9cdce48
修改package.json
Merge pull request  from Riceneeder/N/A
2023-04-04 09:47:46 +00:00
Riceneeder
fe46d42a0f
修改package.json
Signed-off-by: Riceneeder <845541909@qq.com>
2023-04-04 09:47:23 +00:00
Riceneeder
52ed587a5c
support arm64
Merge pull request  from Riceneeder/auto-7828755-master-804f47a1
2023-04-04 09:11:19 +00:00
Riceneeder
e568e29870
github加速
Merge pull request  from Riceneeder/tmp
2023-04-04 09:04:12 +00:00
Riceneeder
43d497a3b7
github加速
Signed-off-by: Riceneeder <845541909@qq.com>
2023-04-04 09:03:05 +00:00
Riceneeder
aa6d25ea1e
electron依赖链接地址修正
Merge pull request  from Riceneeder/tmp
2023-04-04 06:58:22 +00:00
Riceneeder
678f880b7e
electron依赖链接地址修正
Signed-off-by: Riceneeder <845541909@qq.com>
2023-04-04 06:56:56 +00:00
Riceneeder
16821fd070
更改electron依赖拉取网络位置
Merge pull request  from Riceneeder/tmp
2023-04-04 06:52:57 +00:00
Riceneeder
e46f74aa04
更改electron依赖拉取位置
Signed-off-by: Riceneeder <845541909@qq.com>
2023-04-04 06:51:16 +00:00
Riceneeder
8bc00785a2 support arm64 2023-04-03 20:26:47 +08:00
Riceneeder
dd982b2086
Merge branch 'master' of https://gitee.com/spark-community-works-collections/wewechat-plus-plus
Merge pull request  from Riceneeder/auto-7828755-master-a74786b5
2022-11-18 11:51:31 +00:00
梵高先生
f1d3a3f99e Merge branch 'master' of https://gitee.com/spark-community-works-collections/wewechat-plus-plus 2022-11-19 03:51:01 +08:00
梵高先生
05f7912754 1.2.5 2022-11-19 03:50:34 +08:00
梵高先生
63770b7016 Merge branch 'master' of https://gitee.com/spark-community-works-collections/wewechat-plus-plus 2022-11-19 03:41:50 +08:00
梵高先生
96143fd0b9 fix 2022-11-19 03:41:45 +08:00
梵高先生
9ca18d51c5 更新记录 2022-11-19 03:37:20 +08:00
梵高先生
858086e29f change:禁用记住上次聊天内容,等待修复 2022-11-19 03:35:46 +08:00
梵高先生
7b89d45783 fix:翻译错误 2022-11-19 03:32:41 +08:00
梵高先生
3ae3cdd270 fix:setting界面反馈按钮邮箱错误 2022-11-19 03:26:47 +08:00
Riceneeder
cd96af99bf
Merge branch 'master' of https://gitee.com/spark-community-works-collections/wewechat-plus-plus
Merge pull request  from Riceneeder/auto-7828755-master-f8496f93
2022-11-18 11:43:06 +00:00
Riceneeder
75c553d4bb
Merge pull request  from Riceneeder/auto-7828755-master-3b4c5980
2022-11-18 11:39:25 +00:00
Riceneeder
c8c59d3519
发布v1.2.4
v1.2.4 更多的翻译;为darkmode添加过渡动画;删去不必要的代码,去除自动检查更新;修改托盘图标让其更加明显
2022-09-10 10:37:52 +00:00
Riceneeder
8d2fbd1773 fix package.json 2022-09-10 17:59:27 +08:00
Riceneeder
a3f04e6efb v1.2.4 2022-09-10 17:48:52 +08:00
Riceneeder
1e5e250f6a
优化,减少可能到来的1.2.4的工作量
1.增加翻译
2.为darkmode添加过度动画
3.修改package.json
2022-09-03 13:29:19 +00:00
Riceneeder
5ad1fc333e 优化,减少可能到来的1.2.4的工作量
1.增加翻译
2.为darkmode添加过度动画
3.修改package.json
2022-09-03 21:22:56 +08:00
Riceneeder
8cc58d9e68
v1.2.3
Merge pull request  from Riceneeder/dev;
v1.2.3 增添darkmode,调整优化界面、颜色,以适应darkmode
2022-09-03 02:48:28 +00:00
Riceneeder
8794bf428e Merge branch 'master' of gitee.com:spark-community-works-collections/wewechat-plus-plus into dev
Signed-off-by: Riceneeder <845541909@qq.com>
2022-09-03 02:18:10 +00:00
Riceneeder
f07197c39f v1.2.3
v1.2.3 增添darkmode,调整优化界面、颜色,以适应darkmode

Signed-off-by: Riceneeder <86492950+Riceneeder@users.noreply.github.com>
2022-09-03 10:07:48 +08:00
Riceneeder
e625954b2a
1.2.2
Merge pull request  from shenmo/auto-4915358-master-5d4eb191
2022-09-02 13:09:19 +00:00
90d68492eb single 2022-09-02 14:18:11 +08:00
4c2cdd9499 single 2022-09-02 14:08:16 +08:00
ff988aa446 single 2022-09-02 14:02:41 +08:00
62c2d3d99d single 2022-09-02 13:59:05 +08:00
442489dce2 1.2.2 2022-09-02 13:15:27 +08:00
fbc14e854a 更多翻译 2022-09-02 13:11:12 +08:00
96d67f0b6a
update pipeline-build-20220901.yml 2022-09-02 03:49:18 +00:00
223edaf650
1.2.1 release
Merge pull request  from shenmo/auto-4915358-master-c04635a6
2022-09-02 03:47:53 +00:00
9e9cd47a6f 1.2.1 release 2022-09-02 11:47:37 +08:00
7b396be00b 更正错误翻译 美观优化 准备发布1.2.1
* Merge branch 'master' of gitee.com:spark-community-works-collections/w…
* 更正错误翻译
* 翻译
2022-09-02 03:46:43 +00:00
b119fab5a4
update pipeline-build-pr-20220902.yml 2022-09-02 03:37:00 +00:00
fe92afef48
create pipeline-build-pr-20220902.yml 2022-09-02 03:36:42 +00:00
295b455e50
update pipeline-build-20220901.yml 2022-09-02 03:35:42 +00:00
ae58bf7a27 翻译
* 翻译
2022-09-02 03:33:04 +00:00
Riceneeder
29ef5be718
修改: main.js 修改: package.json
Merge pull request  from shenmo/auto-4915358-master-4a4e0891
2022-09-02 03:08:56 +00:00
d45193bbfe 修改: main.js
修改:     package.json
2022-09-02 10:36:18 +08:00
Riceneeder
9c8aaa2f8d
翻译
Merge pull request  from shenmo/auto-4915358-master-8749a79f
2022-09-02 02:10:11 +00:00
Riceneeder
adc2b60992
upgrade .gitignore
Merge pull request  from Riceneeder/auto-7828755-master-e346c694
2022-09-02 02:03:12 +00:00
3bfde67f69 修改: .workflow/pipeline-build-20220901.yml
修改:     main.js
	删除:     main.js.autosave
	修改:     package.json
2022-09-02 10:01:41 +08:00
68c8b93d4b 翻译 2022-09-02 09:52:16 +08:00
Riceneeder
064a554383 upgrade .gitignore 2022-09-02 09:44:06 +08:00
a9fc0b6160 修改: main.js
修改:     src/js/pages/Login/index.js
2022-09-02 09:40:28 +08:00
7b1f97a6b0
update pipeline-build-20220901.yml 2022-09-02 01:23:32 +00:00
608c164ef2
update package.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-09-01 17:30:35 +00:00
2f960e06ab
update pipeline-build-20220901.yml 2022-09-01 17:30:13 +00:00
9763b56387
update pipeline-build-20220901.yml 2022-09-01 17:25:07 +00:00
e63e4cbae6
update pipeline-build-20220901.yml 2022-09-01 17:18:47 +00:00
de8ae1160c
update package.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-09-01 17:18:30 +00:00
62c6fd3cee
update package.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-09-01 17:08:46 +00:00
16fae28bec
update pipeline-build-20220901.yml 2022-09-01 17:04:13 +00:00
0dfdcb4e59
update pipeline-build-20220901.yml 2022-09-01 16:58:48 +00:00
e9fa7cfeb2
update pipeline-build-20220901.yml 2022-09-01 16:48:52 +00:00
27a68c9a2f
update pipeline-build-20220901.yml 2022-09-01 16:44:39 +00:00
0dba00a789
update pipeline-build-20220901.yml 2022-09-01 16:37:53 +00:00
30e0b31cf4
update package.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-09-01 16:31:30 +00:00
55da47be2e
update package.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-09-01 16:23:56 +00:00
5454152d42
update package.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-09-01 16:18:50 +00:00
f1ce7ad848
update pipeline-build-20220901.yml 2022-09-01 16:18:27 +00:00
bd55a0f918
update pipeline-build-20220901.yml 2022-09-01 15:55:54 +00:00
41e16c067b
update package.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-09-01 15:41:35 +00:00
6c0d92d332
update package.json.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2022-09-01 15:29:56 +00:00
523316b34f
update pipeline-build-20220901.yml 2022-09-01 15:11:05 +00:00
4ccf7ba00d
update pipeline-build-20220901.yml 2022-09-01 14:41:01 +00:00
73b82e0822
update pipeline-build-20220901.yml 2022-09-01 14:37:28 +00:00
494372e0b2
update pipeline-build-20220901.yml 2022-09-01 14:24:17 +00:00
26f5928656
update pipeline-build-20220901.yml 2022-09-01 14:17:37 +00:00
ca11918754
update pipeline-build-20220901.yml 2022-09-01 14:09:55 +00:00
cda3db4105
update pipeline-build-20220901.yml 2022-09-01 14:05:01 +00:00
e148ae1975
update pipeline-build-20220901.yml 2022-09-01 13:49:36 +00:00
d6a322d990
create pipeline-build-20220901.yml 2022-09-01 13:48:38 +00:00
Riceneeder
69e2bcb928 change repo url 2022-09-01 21:05:47 +08:00
Riceneeder
0ecde84844 'client-version': '2.0.0' -> '2.1.5' 2022-09-01 21:02:53 +08:00
39 changed files with 355 additions and 290 deletions

1
.gitignore vendored

@ -7,6 +7,7 @@
dist/ dist/
release/ release/
package-lock.json package-lock.json
yarn.lock
# Xcode # Xcode
# #

@ -0,0 +1,76 @@
version: '1.0'
name: pipeline-build-20220901
displayName: pipeline-build
triggers:
trigger: auto
push:
tags:
prefix:
- ''
stages:
- name: stage-82deebcf
displayName: 构建
strategy: naturally
trigger: auto
executor: []
steps:
- step: build@nodejs
name: build_nodejs
displayName: Nodejs 构建
nodeVersion: 16.14.2
commands:
- '# 设置NPM源提升安装速度'
- npm config set registry https://registry.npmmirror.com
- npm i yarn -g
- yarn config set registry "https://registry.npmmirror.com"
- yarn config set electron_builder_binaries_mirror "https://npmmirror.com/mirrors/electron-builder-binaries/"
- yarn config set electron_mirror "https://ghproxy.com/https://github.com/Riceneeder/electron-releases/raw/master/"
- mkdir -p /root/.cache/electron-builder/app-builder/
- mkdir ../release
- ELECTRON_BUILDER_BINARIES_MIRROR =https://registry.npmmirror.com/binary.html?path=electron-builder-binaries/
- '###'
- mkdir -p /root/.cache/electron-builder/app-builder/app-builder-v0.6.1-x64
- WORK_DIR=`pwd`
- cd /root/.cache/electron-builder/app-builder/app-builder-v0.6.1-x64
- 'wget https://ghproxy.com/https://github.com/Riceneeder/electron-releases/raw/master/fpm-1.9.3-2.3.1-linux-x86_64.7z'
- '7z x app-builder-v0.6.1-linux-x64.7z '
- cd $WORK_DIR
- '###'
- mkdir -p /root/.cache/electron-builder/appimage/appimage-9.0.5
- cd /root/.cache/electron-builder/appimage/appimage-9.0.5
- wget https://ghproxy.com/https://github.com/Riceneeder/electron-releases/raw/master/appimage-9.0.5.7z
- 7z x appimage-9.0.5.7z
- cd $WORK_DIR
- '###'
- 'mkdir -p /root/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86_64 '
- 'cd /root/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86_64 '
- wget https://ghproxy.com/https://github.com/Riceneeder/electron-releases/raw/master/fpm-1.9.3-2.3.1-linux-x86_64.7z
- 7z x fpm-1.9.3-2.3.1-linux-x86_64.7z
- cd $WORK_DIR
- '###'
- yarn
- yarn package-linux
- mv ../release ./release
- rm -r ./release/linux-unpacked
artifacts:
- name: BUILD_ARTIFACT
path:
- ./release
caches: []
notify: []
strategy:
retry: '0'
- name: stage-cd5d9e5b
displayName: 上传制品
strategy: naturally
trigger: auto
executor: []
steps:
- step: publish@general_artifacts
name: publish_general_artifacts
displayName: 上传制品
dependArtifact: BUILD_ARTIFACT
artifactName: output
notify: []
strategy:
retry: '0'

@ -0,0 +1,76 @@
version: '1.0'
name: pipeline-build-pr-20220902
displayName: pipeline-build-pr
triggers:
trigger: auto
pr:
branches:
prefix:
- ''
stages:
- name: stage-82deebcf
displayName: 构建
strategy: naturally
trigger: auto
executor: []
steps:
- step: build@nodejs
name: build_nodejs
displayName: Nodejs 构建
nodeVersion: 16.14.2
commands:
- '# 设置NPM源提升安装速度'
- npm config set registry https://registry.npmmirror.com
- npm i yarn -g
- yarn config set registry "https://registry.npmmirror.com"
- yarn config set electron_builder_binaries_mirror "https://npmmirror.com/mirrors/electron-builder-binaries/"
- yarn config set electron_mirror "https://ghproxy.com/https://github.com/Riceneeder/electron-releases/raw/master/"
- mkdir -p /root/.cache/electron-builder/app-builder/
- mkdir ../release
- ELECTRON_BUILDER_BINARIES_MIRROR =https://registry.npmmirror.com/binary.html?path=electron-builder-binaries/
- '###'
- mkdir -p /root/.cache/electron-builder/app-builder/app-builder-v0.6.1-x64
- WORK_DIR=`pwd`
- cd /root/.cache/electron-builder/app-builder/app-builder-v0.6.1-x64
- 'wget https://ghproxy.com/https://github.com/Riceneeder/electron-releases/raw/master/app-builder-v0.6.1-linux-x64.7z '
- '7z x app-builder-v0.6.1-linux-x64.7z '
- cd $WORK_DIR
- '###'
- mkdir -p /root/.cache/electron-builder/appimage/appimage-9.0.5
- cd /root/.cache/electron-builder/appimage/appimage-9.0.5
- wget https://ghproxy.com/https://github.com/Riceneeder/electron-releases/raw/master/appimage-9.0.5.7z
- 7z x appimage-9.0.5.7z
- cd $WORK_DIR
- '###'
- 'mkdir -p /root/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86_64 '
- 'cd /root/.cache/electron-builder/fpm/fpm-1.9.3-2.3.1-linux-x86_64 '
- wget https://ghproxy.com/https://github.com/Riceneeder/electron-releases/raw/master/fpm-1.9.3-2.3.1-linux-x86_64.7z
- 7z x fpm-1.9.3-2.3.1-linux-x86_64.7z
- cd $WORK_DIR
- '###'
- yarn
- yarn package-linux
- mv ../release ./release
- rm -r ./release/linux-unpacked
artifacts:
- name: BUILD_ARTIFACT
path:
- ./release
caches: []
notify: []
strategy:
retry: '0'
- name: stage-cd5d9e5b
displayName: 上传制品
strategy: naturally
trigger: auto
executor: []
steps:
- step: publish@general_artifacts
name: publish_general_artifacts
displayName: 上传制品
dependArtifact: BUILD_ARTIFACT
artifactName: output
notify: []
strategy:
retry: '0'

@ -1,71 +0,0 @@
# 1.1.4
### 2017-09-22
#### Improvements
- 发送消息后滚动到对话窗口最下面
#### Bug fixed
- 修复 #34 快速`enter`时会重复发送消息
- 修复点击状态栏小图标展开菜单后,收到消息后重新创建小图标导致程序退出的问题
# 1.1.3
### 2017-09-19
#### Bug fixed
- #36 #34 优化内存使用修复由于1.1.1显示头像到菜单栏接收新消息时刷新菜单中会话列表重复创建nativeImage导致GC无法及时回收所造成内存占用过高
# 1.1.2
### 2017-09-18
#### Improvements
- 增加自动更新
# 1.1.1
### 2017-09-14
#### Improvements
- 增加用户头像到菜单栏
#### Bug fixed
- 修复登出时网络错误,导致未提示客户端已离线
### 2017-09-12
#29 替换`html`为对应`emoji`
### 2017-09-11
#28 在 windows 和 linux 上不显示菜单
### 2017-09-10
#### Bug fixed
- 联系人列表只显示好友,不显示临时联系人
### 2017-09-08
#### Improvements
- 添加文件助手, #27
#### Bug fixed
- 修改样式,防止文字信息内容过长
### 2017-09-07
#### Improvements
- 调整表情框表情大小
- 聊天窗口用户名取消换行
#### Feature
- 多文件拖拽发送
#### Bug fixed
- 仅在聊天开启时允许文件拖拽
- 修复手机端消息同步客户端错误
- 修复图片加载失败使用错误`src`进行回滚导致客户端卡死的问题

185
main.js

@ -1,16 +1,14 @@
import fs from 'fs'; import fs from 'fs';
import tmp from 'tmp'; import tmp from 'tmp';
import { app, powerMonitor, BrowserWindow, Tray, Menu, ipcMain, clipboard, shell, nativeImage, dialog } from 'electron'; import { app, powerMonitor, BrowserWindow, Tray, Menu, ipcMain, clipboard, shell, nativeImage, Notification } from 'electron';
import windowStateKeeper from 'electron-window-state'; import windowStateKeeper from 'electron-window-state';
import AutoLaunch from 'auto-launch'; import AutoLaunch from 'auto-launch';
import { autoUpdater } from 'electron-updater';
import axios from 'axios'; import axios from 'axios';
import pkg from './package.json'; import pkg from './package.json';
let forceQuit = false; let forceQuit = false;
let downloading = false;
let mainWindow; let mainWindow;
let tray; let tray;
let settings = {}; let settings = {};
@ -28,9 +26,20 @@ let mainMenu = [
{ {
label: `About ${pkg.name}`, label: `About ${pkg.name}`,
selector: 'orderFrontStandardAboutPanel:', selector: 'orderFrontStandardAboutPanel:',
click() {
let note = new Notification({
title: 'WeweChat',
subtitle: 'about',
icon: `${__dirname}/src/assets/images/dock.png`,
body: `Made with 💖 by trazyn.\nRevise with 🔥 By Riceneeder\nversion: ${pkg.version}`,
silent: true,
closeButtonText: '了解了'
});
note.show();
}
}, },
{ {
label: 'Preferences...', label: '首选项...',
accelerator: !isOsx ? 'Ctrl+,' : 'Cmd+,', accelerator: !isOsx ? 'Ctrl+,' : 'Cmd+,',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -58,17 +67,17 @@ let mainMenu = [
role: 'unhide' role: 'unhide'
}, },
{ {
label: 'Check for updates', label: '检查更新',
accelerator: !isOsx ? 'Ctrl+U' : 'Cmd+U', accelerator: !isOsx ? 'Ctrl+U' : 'Cmd+U',
click() { click() {
checkForUpdates(); shell.openExternal('spk://store/chat/wewechat');
} }
}, },
{ {
type: 'separator' type: 'separator'
}, },
{ {
label: 'Quit weweChat', label: '退出 weweChat',
accelerator: !isOsx ? 'Alt+Q' : 'Command+Q', accelerator: !isOsx ? 'Alt+Q' : 'Command+Q',
selector: 'terminate:', selector: 'terminate:',
click() { click() {
@ -80,10 +89,10 @@ let mainMenu = [
] ]
}, },
{ {
label: 'File', label: '聊天操作',
submenu: [ submenu: [
{ {
label: 'New Chat', label: '新建聊天',
accelerator: !isOsx ? 'Ctrl+N' : 'Cmd+N', accelerator: !isOsx ? 'Ctrl+N' : 'Cmd+N',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -91,7 +100,7 @@ let mainMenu = [
} }
}, },
{ {
label: 'Search...', label: '搜索',
accelerator: !isOsx ? 'Ctrl+F' : 'Cmd+F', accelerator: !isOsx ? 'Ctrl+F' : 'Cmd+F',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -99,7 +108,7 @@ let mainMenu = [
} }
}, },
{ {
label: 'Batch Send Message', label: '群发消息',
accelerator: !isOsx ? 'Ctrl+B' : 'Cmd+B', accelerator: !isOsx ? 'Ctrl+B' : 'Cmd+B',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -110,7 +119,7 @@ let mainMenu = [
type: 'separator', type: 'separator',
}, },
{ {
label: 'Insert emoji', label: '插入表情符号',
accelerator: !isOsx ? 'Ctrl+I' : 'Cmd+I', accelerator: !isOsx ? 'Ctrl+I' : 'Cmd+I',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -121,7 +130,7 @@ let mainMenu = [
type: 'separator', type: 'separator',
}, },
{ {
label: 'Next conversation', label: '下一个聊天',
accelerator: !isOsx ? 'Ctrl+J' : 'Cmd+J', accelerator: !isOsx ? 'Ctrl+J' : 'Cmd+J',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -129,7 +138,7 @@ let mainMenu = [
} }
}, },
{ {
label: 'Previous conversation', label: '上一个聊天',
accelerator: !isOsx ? 'Ctrl+K' : 'Cmd+K', accelerator: !isOsx ? 'Ctrl+K' : 'Cmd+K',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -139,7 +148,7 @@ let mainMenu = [
] ]
}, },
{ {
label: 'Conversations', label: '聊天列表',
submenu: [ submenu: [
{ {
label: 'Loading...', label: 'Loading...',
@ -147,7 +156,7 @@ let mainMenu = [
], ],
}, },
{ {
label: 'Contacts', label: '联系人',
submenu: [ submenu: [
{ {
label: 'Loading...', label: 'Loading...',
@ -155,10 +164,7 @@ let mainMenu = [
], ],
}, },
{ {
label: '编辑',
},
{
label: 'Edit',
submenu: [ submenu: [
{ {
role: 'undo' role: 'undo'
@ -203,7 +209,7 @@ let mainMenu = [
} }
}, },
{ {
label: 'Toggle Conversations', label: '显示聊天列表',
accelerator: !isOsx ? 'Ctrl+Shift+M' : 'Shift+Cmd+M', accelerator: !isOsx ? 'Ctrl+Shift+M' : 'Shift+Cmd+M',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -214,7 +220,12 @@ let mainMenu = [
type: 'separator', type: 'separator',
}, },
{ {
label: '' label: 'Darkmode',
accelerator: !isOsx ? 'Ctrl+Shift+D' : 'Shift+Cmd+D',
click() {
mainWindow.show();
mainWindow.webContents.send('darkmode');
}
}, },
{ {
type: 'separator', type: 'separator',
@ -242,15 +253,15 @@ let mainMenu = [
role: 'help', role: 'help',
submenu: [ submenu: [
{ {
label: '反馈(不一定解决)', label: '反馈',
click() { click() {
shell.openExternal('https://github.com/Riceneeder/weweChat/issues'); shell.openExternal('https://gitee.com/spark-community-works-collections/wewechat-plus-plus/issues');
} }
}, },
{ {
label: 'Fork me on Github', label: '在Gitee主页查看',
click() { click() {
shell.openExternal('https://github.com/Riceneeder/weweChat'); shell.openExternal('https://gitee.com/spark-community-works-collections/wewechat-plus-plus');
} }
}, },
] ]
@ -258,14 +269,14 @@ let mainMenu = [
]; ];
let trayMenu = [ let trayMenu = [
{ {
label: `You have 0 messages`, label: `您有0条未读消息`,
click() { click() {
mainWindow.show(); mainWindow.show();
mainWindow.webContents.send('show-messages'); mainWindow.webContents.send('show-messages');
} }
}, },
{ {
label: 'Toggle main window', label: '打开主窗口',
click() { click() {
let isVisible = mainWindow.isVisible(); let isVisible = mainWindow.isVisible();
isVisible ? mainWindow.hide() : mainWindow.show(); isVisible ? mainWindow.hide() : mainWindow.show();
@ -275,7 +286,7 @@ let trayMenu = [
type: 'separator' type: 'separator'
}, },
{ {
label: 'Preferences...', label: '首选项...',
accelerator: !isOsx ? 'Ctrl+,' : 'Cmd+,', accelerator: !isOsx ? 'Ctrl+,' : 'Cmd+,',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -283,16 +294,16 @@ let trayMenu = [
} }
}, },
{ {
label: 'Fork me on Github', label: '在Gitee主页查看',
click() { click() {
shell.openExternal('https://github.com/Riceneeder/weweChat'); shell.openExternal('https://gitee.com/spark-community-works-collections/wewechat-plus-plus');
} }
}, },
{ {
type: 'separator' type: 'separator'
}, },
{ {
label: 'Toggle DevTools', label: '打开开发者工具',
accelerator: !isOsx ? 'Ctrl+Alt+I' : 'Alt+Command+I', accelerator: !isOsx ? 'Ctrl+Alt+I' : 'Alt+Command+I',
click() { click() {
mainWindow.show(); mainWindow.show();
@ -300,7 +311,7 @@ let trayMenu = [
} }
}, },
{ {
label: 'Hide menu bar icon', label: '隐藏菜单栏图标',
click() { click() {
mainWindow.webContents.send('hide-tray'); mainWindow.webContents.send('hide-tray');
} }
@ -309,14 +320,14 @@ let trayMenu = [
type: 'separator' type: 'separator'
}, },
{ {
label: 'Check for updates', label: '检查更新',
accelerator: !isOsx ? 'Ctrl+U' : 'Cmd+U', accelerator: !isOsx ? 'Ctrl+U' : 'Cmd+U',
click() { click() {
checkForUpdates(); shell.openExternal('spk://store/chat/wewechat');
} }
}, },
{ {
label: 'Quit weweChat', label: '退出 weweChat',
accelerator: !isOsx ? 'Alt+Q' : 'Command+Q', accelerator: !isOsx ? 'Alt+Q' : 'Command+Q',
selector: 'terminate:', selector: 'terminate:',
click() { click() {
@ -370,22 +381,6 @@ async function getIcon(cookies, userid, src) {
return image; return image;
} }
function checkForUpdates() {
if (downloading) {
dialog.showMessageBox({
type: 'info',
buttons: ['OK'],
title: pkg.name,
message: `Downloading...`,
detail: `Please leave the app open, the new version is downloading. You'll receive a new dialog when downloading is finished.`
});
return;
}
autoUpdater.checkForUpdates();
}
function updateTray(unread = 0) { function updateTray(unread = 0) {
if (!isOsx) { if (!isOsx) {
// Always show the tray icon on windows // Always show the tray icon on windows
@ -393,7 +388,7 @@ function updateTray(unread = 0) {
} }
// Update unread mesage count // Update unread mesage count
trayMenu[0].label = `You have ${unread} messages`; trayMenu[0].label = `您有 ${unread} 条未读消息`;
if (settings.showOnTray) { if (settings.showOnTray) {
if (tray if (tray
@ -477,6 +472,14 @@ function createMenu() {
mainWindow.setMenu(menu); mainWindow.setMenu(menu);
} }
} }
const shouldQuit = app.makeSingleInstance(() => {
if (mainWindow) {
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.show();
mainWindow.focus();
}
});
shouldQuit && app.quit();
const createMainWindow = () => { const createMainWindow = () => {
var mainWindowState = windowStateKeeper({ var mainWindowState = windowStateKeeper({
@ -548,8 +551,8 @@ const createMainWindow = () => {
ipcMain.on('menu-update', async(event, args) => { ipcMain.on('menu-update', async(event, args) => {
var { cookies, contacts = [], conversations = [] } = args; var { cookies, contacts = [], conversations = [] } = args;
var conversationsMenu = mainMenu.find(e => e.label === 'Conversations'); var conversationsMenu = mainMenu.find(e => e.label === '群聊');
var contactsMenu = mainMenu.find(e => e.label === 'Contacts'); var contactsMenu = mainMenu.find(e => e.label === '私聊');
var shouldUpdate = false; var shouldUpdate = false;
// if (!isOsx) { // if (!isOsx) {
@ -659,7 +662,7 @@ const createMainWindow = () => {
}); });
ipcMain.on('open-image', async(event, args) => { ipcMain.on('open-image', async(event, args) => {
var filename = `${imagesCacheDir}/img_${args.dataset.id}`; var filename = `${imagesCacheDir}/img_${args.dataset.id}.jpg`;
fs.writeFileSync(filename, args.base64.replace(/^data:image\/png;base64,/, ''), 'base64'); fs.writeFileSync(filename, args.base64.replace(/^data:image\/png;base64,/, ''), 'base64');
shell.openItem(filename); shell.openItem(filename);
@ -684,15 +687,15 @@ const createMainWindow = () => {
isSuspend = true; isSuspend = true;
}); });
if (isOsx) { // if (isOsx) {
app.setAboutPanelOptions({ // app.setAboutPanelOptions({
applicationName: pkg.name, // applicationName: pkg.name,
applicationVersion: pkg.version, // applicationVersion: pkg.version,
copyright: 'Made with 💖 by trazyn. \n https://github.com/trazyn/weweChat \nRevise By Riceneeder \n https://github.com/Riceneeder/weweChat', // copyright: 'Made with 💖 by trazyn. \n https://github.com/trazyn/weweChat \nRevise By Riceneeder \n https://gitee.com/spark-community-works-collections/wewechat-plus-plus',
credits: `With the invaluable help of: \n web.wechat.com`, // credits: `With the invaluable help of: \n web.wechat.com`,
version: pkg.version // version: pkg.version
}); // });
} // }
[imagesCacheDir, voicesCacheDir].map(e => { [imagesCacheDir, voicesCacheDir].map(e => {
if (!fs.existsSync(e)) { if (!fs.existsSync(e)) {
@ -717,55 +720,3 @@ app.on('activate', e => {
mainWindow.show(); mainWindow.show();
} }
}); });
autoUpdater.on('update-not-available', e => {
dialog.showMessageBox({
type: 'info',
buttons: ['OK'],
title: pkg.name,
message: `${pkg.name} is up to date :)`,
detail: `${pkg.name} ${pkg.version} is currently the newest version available, It looks like you're already rocking the latest version!`
});
console.log('Update not available.');
});
autoUpdater.on('update-available', e => {
downloading = true;
checkForUpdates();
});
autoUpdater.on('error', err => {
dialog.showMessageBox({
type: 'error',
buttons: ['Cancel update'],
title: pkg.name,
message: `Failed to update ${pkg.name} :(`,
detail: `An error occurred in retrieving update information, Please try again later.`,
});
downloading = false;
console.error(err);
});
autoUpdater.on('update-downloaded', info => {
var { releaseNotes, releaseName } = info;
var index = dialog.showMessageBox({
type: 'info',
buttons: ['Restart', 'Later'],
title: pkg.name,
message: `The new version has been downloaded. Please restart the application to apply the updates.`,
detail: `${releaseName}\n\n${releaseNotes}`
});
downloading = false;
if (index === 1) {
return;
}
autoUpdater.quitAndInstall();
setTimeout(() => {
mainWindow = null;
app.quit();
});
});

@ -1,10 +1,10 @@
{ {
"name": "wewechat", "name": "wewechat",
"version": "1.2.0", "version": "1.2.5",
"description": "make weweChat great again!!!", "description": "make weweChat great again!!!",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "yarn build && ./node_modules/.bin/electron ./dist/main.js",
"js-lint": "node node_modules/.bin/eslint .", "js-lint": "node node_modules/.bin/eslint .",
"css-lint": "stylelint --fix src/**/*.css", "css-lint": "stylelint --fix src/**/*.css",
"lint": "yarn css-lint && yarn js-lint", "lint": "yarn css-lint && yarn js-lint",
@ -23,9 +23,10 @@
"author": { "author": {
"email": "845541909@qq.com" "email": "845541909@qq.com"
}, },
"homepage": "https://gitee.com/spark-community-works-collections/wewechat-plus-plus/README.md",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/Riceneeder/weweChat" "url": "https://gitee.com/spark-community-works-collections/wewechat-plus-plus"
}, },
"license": "MIT", "license": "MIT",
"build": { "build": {
@ -56,9 +57,13 @@
"category": "Chat", "category": "Chat",
"executableName": "wewechat", "executableName": "wewechat",
"target": [ "target": [
"deb", {
"rpm", "target": "deb",
"AppImage" "arch":[
"x64",
"arm64"
]
}
] ]
}, },
"win": { "win": {
@ -75,9 +80,8 @@
}, },
"publish": [ "publish": [
{ {
"provider": "github", "provider": "generic",
"owner": "riceneeder", "url": "https://gitee.com/spark-community-works-collections/wewechat-plus-plus/raw/master/"
"repo": "weweChat"
} }
] ]
}, },
@ -86,6 +90,7 @@
"axios": "^0.18.0", "axios": "^0.18.0",
"browser-md5-file": "^1.0.0", "browser-md5-file": "^1.0.0",
"classname": "^0.0.0", "classname": "^0.0.0",
"darkmode-js": "^1.5.7",
"delegate": "^3.1.3", "delegate": "^3.1.3",
"electron-context-menu": "^0.10.0", "electron-context-menu": "^0.10.0",
"electron-json-storage": "^4.0.2", "electron-json-storage": "^4.0.2",
@ -125,7 +130,6 @@
"css-loader": "^1.0.0", "css-loader": "^1.0.0",
"electron": "^2.0.16", "electron": "^2.0.16",
"electron-builder": "^19.56.2", "electron-builder": "^19.56.2",
"electron-updater": "^3.0.1",
"eslint": "^5.1.0", "eslint": "^5.1.0",
"eslint-config-standard": "^11.0.0", "eslint-config-standard": "^11.0.0",
"eslint-config-standard-react": "^6.0.0", "eslint-config-standard-react": "^6.0.0",
@ -156,4 +160,4 @@
"webpack-dev-middleware": "^3.1.3", "webpack-dev-middleware": "^3.1.3",
"webpack-hot-middleware": "^2.20.0" "webpack-hot-middleware": "^2.20.0"
} }
} }

@ -4,6 +4,7 @@ import { render } from 'react-dom';
import { Provider } from 'mobx-react'; import { Provider } from 'mobx-react';
import { HashRouter } from 'react-router-dom'; import { HashRouter } from 'react-router-dom';
import { ipcRenderer } from 'electron'; import { ipcRenderer } from 'electron';
import Darkmode from 'darkmode-js';
import './global.css'; import './global.css';
import './assets/fonts/icomoon/style.css'; import './assets/fonts/icomoon/style.css';
@ -27,6 +28,11 @@ class App extends Component {
componentDidMount() { componentDidMount() {
var navigator = this.refs.navigator; var navigator = this.refs.navigator;
const options = {
time: '0.5s',
mixColor: '#cccccc',
};
const darkmode = new Darkmode(options);
// Hide the tray icon // Hide the tray icon
ipcRenderer.on('hide-tray', () => { ipcRenderer.on('hide-tray', () => {
@ -130,6 +136,11 @@ class App extends Component {
ipcRenderer.on('show-errors', (event, args) => { ipcRenderer.on('show-errors', (event, args) => {
stores.snackbar.showMessage(args.message); stores.snackbar.showMessage(args.message);
}); });
// Dark mode
ipcRenderer.on('darkmode', () => {
darkmode.toggle();
});
} }
render() { render() {

Binary file not shown.

Before

(image error) Size: 14 KiB

After

(image error) Size: 676 B

Binary file not shown.

Before

(image error) Size: 15 KiB

After

(image error) Size: 1.1 KiB

Binary file not shown.

Before

(image error) Size: 4.8 KiB

After

(image error) Size: 20 KiB

@ -5,6 +5,13 @@
<meta charset="utf-8"> <meta charset="utf-8">
<title>weweChat</title> <title>weweChat</title>
</head> </head>
<style>
.darkmode-layer {
width: 100%;
height: 1px;
top: -1px;
}
</style>
<body> <body>
<div id="root"></div> <div id="root"></div>
<script> <script>

@ -29,7 +29,7 @@ export default class MessageInput extends Component {
&& user.length === 1 && user.length === 1
&& user.slice(-1).pop().UserName === this.props.me.UserName && user.slice(-1).pop().UserName === this.props.me.UserName
) { ) {
this.props.showMessage('Can\'t send messages to yourself.'); this.props.showMessage('不能向自己发送消息');
return false; return false;
} }
@ -62,7 +62,7 @@ export default class MessageInput extends Component {
); );
if (!res) { if (!res) {
await this.props.showMessage(batch ? `Sending message to ${e.NickName} has failed!` : 'Failed to send message.'); await this.props.showMessage(batch ? `Sending message to ${e.NickName} has failed!` : '消息发送失败');
} }
return true; return true;
@ -114,7 +114,7 @@ export default class MessageInput extends Component {
continue; continue;
} }
// In batch mode just show the failed message // In batch mode just show the failed message
showMessage('Failed to send image.'); showMessage('发送图片失败');
} }
} }
} }
@ -180,7 +180,7 @@ export default class MessageInput extends Component {
id="messageInput" id="messageInput"
ref="input" ref="input"
type="text" type="text"
placeholder="Type something to send..." placeholder="在此输入内容..."
readOnly={!canisend} readOnly={!canisend}
onPaste={e => this.handlePaste(e)} onPaste={e => this.handlePaste(e)}
onKeyPress={e => this.handleEnter(e)} onKeyPress={e => this.handleEnter(e)}

@ -14,7 +14,7 @@
border: 0; border: 0;
padding-right: 17px; padding-right: 17px;
background: 0; background: 0;
color: #333; color: #808080;
font-size: 14px; font-size: 14px;
outline: 0; outline: 0;
} }

@ -25,9 +25,9 @@ export default class Avatar extends Component {
className="disabledDrag" className="disabledDrag"
src="assets/images/offline.png" /> src="assets/images/offline.png" />
<h1>Oops, seems like you are offline!</h1> <h1>离线了离线了!</h1>
<button onClick={e => window.location.reload()}>Reload</button> <button onClick={e => window.location.reload()}>尝试重新加载</button>
</div> </div>
</div> </div>
); );

@ -145,7 +145,7 @@ export default class UserList extends Component {
return ( return (
<li className={classes.notfound}> <li className={classes.notfound}>
<img src="assets/images/crash.png" /> <img src="assets/images/crash.png" />
<h3>Can't find any people matching '{searching}'</h3> <h3>没有搜索到 '{searching}'</h3>
</li> </li>
); );
} }
@ -180,7 +180,7 @@ export default class UserList extends Component {
autoFocus={true} autoFocus={true}
onKeyUp={e => this.navigation(e)} onKeyUp={e => this.navigation(e)}
onInput={e => this.search(e.target.value)} onInput={e => this.search(e.target.value)}
placeholder="Type to Search..." placeholder="输入需要搜索的对象"
ref="input" ref="input"
type="text" /> type="text" />

@ -27,18 +27,18 @@ export default class AddFriend extends Component {
onCancel={e => close()} onCancel={e => close()}
show={show}> show={show}>
<ModalBody className={classes.container}> <ModalBody className={classes.container}>
Send friend request first 发送好友请求
<input <input
autoFocus={true} autoFocus={true}
defaultValue={`Hallo, im ${me && me.User.NickName}`} defaultValue={`你好,我是 ${me && me.User.NickName}`}
ref="input" ref="input"
type="text" /> type="text" />
<div> <div>
<button onClick={e => this.addFriend()}>Send</button> <button onClick={e => this.addFriend()}>发送</button>
<button onClick={e => close()}>Cancel</button> <button onClick={e => close()}>取消</button>
</div> </div>
</ModalBody> </ModalBody>
</Modal> </Modal>

@ -88,7 +88,7 @@ export default class AddMember extends Component {
onCancel={e => this.close()} onCancel={e => this.close()}
show={this.props.show}> show={this.props.show}>
<ModalBody className={classes.container}> <ModalBody className={classes.container}>
Add Members 添加群组
<div className={classes.avatars}> <div className={classes.avatars}>
{ {
@ -110,10 +110,10 @@ export default class AddMember extends Component {
<button <button
disabled={!this.state.selected.length} disabled={!this.state.selected.length}
onClick={e => this.add(this.state.selected)}> onClick={e => this.add(this.state.selected)}>
Add 添加
</button> </button>
<button onClick={e => this.close()}>Cancel</button> <button onClick={e => this.close()}>取消</button>
</div> </div>
</ModalBody> </ModalBody>
</Modal> </Modal>

@ -103,7 +103,7 @@ export default class BatchSend extends Component {
<input <input
autoFocus={true} autoFocus={true}
onInput={e => this.search(e.target.value)} onInput={e => this.search(e.target.value)}
placeholder="Batch to send message, Choose one or more user." placeholder="批量发送消息,选择一个或多个用户"
type="text" /> type="text" />
<span> <span>
@ -126,7 +126,7 @@ export default class BatchSend extends Component {
(searching && filtered.length === 0) && ( (searching && filtered.length === 0) && (
<div className={classes.notfound}> <div className={classes.notfound}>
<img src="assets/images/crash.png" /> <img src="assets/images/crash.png" />
<h1>Can't find any people matching '{searching}'</h1> <h1>不能找到 '{searching}'</h1>
</div> </div>
) )
} }

@ -49,14 +49,14 @@ export default class ConfirmImagePaste extends Component {
fullscreen={true} fullscreen={true}
show={show}> show={show}>
<ModalBody className={classes.container}> <ModalBody className={classes.container}>
Send image ? 发送图片 ?
<img src={image} /> <img src={image} />
<div> <div>
<input onKeyUp={e => this.navigation(e)} id="imageInputHidden" style={{'zIndex': '-1', 'position': 'absolute', 'top': '-20px'}} /> <input onKeyUp={e => this.navigation(e)} id="imageInputHidden" style={{'zIndex': '-1', 'position': 'absolute', 'top': '-20px'}} />
<button onClick={e => ok()}>Send</button> <button onClick={e => ok()}>发送</button>
<button onClick={e => cancel()}>Cancel</button> <button onClick={e => cancel()}>取消</button>
</div> </div>
</ModalBody> </ModalBody>
</Modal> </Modal>

@ -58,7 +58,7 @@ export default class Contacts extends Component {
dangerouslySetInnerHTML={{__html: e.RemarkName || e.NickName}} /> dangerouslySetInnerHTML={{__html: e.RemarkName || e.NickName}} />
<p <p
className={classes.signature} className={classes.signature}
dangerouslySetInnerHTML={{__html: e.Signature || 'No Signature'}} /> dangerouslySetInnerHTML={{__html: e.Signature || '无签名'}} />
</div> </div>
</div> </div>
); );
@ -82,7 +82,7 @@ export default class Contacts extends Component {
<div className={clazz(classes.container, classes.notfound)}> <div className={clazz(classes.container, classes.notfound)}>
<div className={classes.inner}> <div className={classes.inner}>
<img src="assets/images/crash.png" /> <img src="assets/images/crash.png" />
<h1>Can't find any people matching '{query}'</h1> <h1>找不到 '{query}'</h1>
</div> </div>
</div> </div>
); );

@ -37,13 +37,13 @@ export default class Filter extends Component {
<div className={classes.contacts}> <div className={classes.contacts}>
<input <input
onInput={e => this.doFilter(e.target.value)} onInput={e => this.doFilter(e.target.value)}
placeholder="Type something to search..." placeholder="在此搜索..."
ref="filter" ref="filter"
type="text" /> type="text" />
<div className={classes.action}> <div className={classes.action}>
<label htmlFor="showGroup"> <label htmlFor="showGroup">
<span className={classes.options}>Show Groups</span> <span className={classes.options}>显示群聊</span>
<Switch <Switch
defaultChecked={this.props.showGroup} defaultChecked={this.props.showGroup}
id="showGroup" id="showGroup"

@ -9,18 +9,18 @@ export default class Placeholder extends Component {
<div className={classes.settings}> <div className={classes.settings}>
<a <a
className={classes.button} className={classes.button}
href="mailto:var.845541909@qq.com?Subject=WeWeChat%20Feedback" href="mailto:845541909@qq.com?Subject=WeWeChat%20Feedback"
target="_blank"> target="_blank">
Send feedback 发送反馈
<i className="icon-ion-ios-email-outline" /> <i className="icon-ion-ios-email-outline" />
</a> </a>
<a <a
className={classes.button} className={classes.button}
href="https://github.com/Riceneeder/weweChat" href="https://gitee.com/spark-community-works-collections/wewechat-plus-plus"
target="_blank"> target="_blank">
Fork on Github 查看代码
<i className="icon-ion-social-github" /> <i className="icon-ion-fork-repo" />
</a> </a>
</div> </div>
); );

@ -7,7 +7,6 @@
.footer { .footer {
position: relative; position: relative;
background: #fff;
box-shadow: inset 0 1px 0 0 var(--shadow-color); box-shadow: inset 0 1px 0 0 var(--shadow-color);
z-index: 9; z-index: 9;
@ -78,7 +77,7 @@
line-height: 60px; line-height: 60px;
border: 0; border: 0;
background: 0; background: 0;
color: #333; color: #808080;
font-size: 14px; font-size: 14px;
outline: 0; outline: 0;
} }
@ -107,7 +106,7 @@
position: relative; position: relative;
margin-right: 17px; margin-right: 17px;
width: 166px; width: 166px;
color: rgba(0, 0, 0, .8); color: #808080;
font-size: 14px; font-size: 14px;
padding: 9px 8px; padding: 9px 8px;
font-family: 'Roboto'; font-family: 'Roboto';

@ -78,7 +78,7 @@ export default class Forward extends Component {
onCancel={e => this.close()} onCancel={e => this.close()}
show={this.props.show}> show={this.props.show}>
<ModalBody className={classes.container}> <ModalBody className={classes.container}>
Forward Message 转发消息
<div className={classes.avatars}> <div className={classes.avatars}>
{ {
@ -100,10 +100,10 @@ export default class Forward extends Component {
<button <button
disabled={!this.state.selected.length} disabled={!this.state.selected.length}
onClick={e => this.send(this.state.selected)}> onClick={e => this.send(this.state.selected)}>
Send Message 发送消息
</button> </button>
<button onClick={e => this.close()}>Cancel</button> <button onClick={e => this.close()}>取消</button>
</div> </div>
</ModalBody> </ModalBody>
</Modal> </Modal>

@ -8,7 +8,7 @@
font-family: "system-ui"; font-family: "system-ui";
font-weight: normal; font-weight: normal;
width: 100%; width: 100%;
color: #777; color: #c3c3c3;
text-align: center; text-align: center;
background: rgba(255, 255, 255, 1); background: rgba(255, 255, 255, 1);
-webkit-user-select: none; -webkit-user-select: none;

@ -155,7 +155,7 @@ export default class ChatContent extends Component {
return ` return `
<div class="${classes.invalidEmoji}"> <div class="${classes.invalidEmoji}">
<div></div> <div></div>
<span>Send an emoji, view it on mobile</span> <span>不支持的emoji请在其他客户端查看</span>
</div> </div>
`; `;
@ -201,7 +201,7 @@ export default class ChatContent extends Component {
console.error('Invalid video message: %o', message); console.error('Invalid video message: %o', message);
return ` return `
Receive an invalid video message, please see the console output. 收到无法解析的视频消息请参阅控制台输出
`; `;
} }
@ -215,7 +215,7 @@ export default class ChatContent extends Component {
return ` return `
<div class="${classes.transfer}"> <div class="${classes.transfer}">
<h4>Money Transfer</h4> <h4>转账消息</h4>
<span>💰 ${transfer.money}</span> <span>💰 ${transfer.money}</span>
<p>如需收钱请打开手机微信确认收款</p> <p>如需收钱请打开手机微信确认收款</p>
</div> </div>
@ -229,7 +229,7 @@ export default class ChatContent extends Component {
/* eslint-disable */ /* eslint-disable */
return ` return `
<div class="${classes.file}" data-id="${message.MsgId}"> <div class="${classes.file}" data-id="${message.MsgId}">
<img src="assets/images/filetypes/${helper.getFiletypeIcon(file.extension)}" class="disabledDrag" /> <img src="assets/images/filetypes/${helper.getFiletypeIcon(file.extension)}" class="disabledDrag" />
<div> <div>
@ -257,7 +257,7 @@ export default class ChatContent extends Component {
return ` return `
<div class="${classes.locationSharing}"> <div class="${classes.locationSharing}">
<i class="icon-ion-ios-location"></i> <i class="icon-ion-ios-location"></i>
Location sharing, Please check your phone. 位置分享请查看其他客户端
</div> </div>
`; `;
} }
@ -448,7 +448,7 @@ export default class ChatContent extends Component {
var caniforward = [1, 3, 47, 43, 49 + 6].includes(message.MsgType); var caniforward = [1, 3, 47, 43, 49 + 6].includes(message.MsgType);
var templates = [ var templates = [
{ {
label: 'Delete', label: '删除',
click: () => { click: () => {
this.props.deleteMessage(message.MsgId); this.props.deleteMessage(message.MsgId);
} }
@ -458,7 +458,7 @@ export default class ChatContent extends Component {
if (caniforward) { if (caniforward) {
templates.unshift({ templates.unshift({
label: 'Forward', label: '转发',
click: () => { click: () => {
this.props.showForward(message); this.props.showForward(message);
} }
@ -468,7 +468,7 @@ export default class ChatContent extends Component {
if (message.isme if (message.isme
&& message.CreateTime - new Date() < 2 * 60 * 1000) { && message.CreateTime - new Date() < 2 * 60 * 1000) {
templates.unshift({ templates.unshift({
label: 'Recall', label: '撤回',
click: () => { click: () => {
this.props.recallMessage(message); this.props.recallMessage(message);
} }
@ -485,7 +485,7 @@ export default class ChatContent extends Component {
var user = this.props.user; var user = this.props.user;
var menu = new remote.Menu.buildFromTemplate([ var menu = new remote.Menu.buildFromTemplate([
{ {
label: 'Toggle the conversation', label: '切换对话',
click: () => { click: () => {
this.props.toggleConversation(); this.props.toggleConversation();
} }
@ -494,7 +494,7 @@ export default class ChatContent extends Component {
type: 'separator', type: 'separator',
}, },
{ {
label: 'Empty Content', label: '清空聊天内容',
click: () => { click: () => {
this.props.empty(user); this.props.empty(user);
} }
@ -503,13 +503,13 @@ export default class ChatContent extends Component {
type: 'separator' type: 'separator'
}, },
{ {
label: helper.isTop(user) ? 'Unsticky' : 'Sticky on Top', label: helper.isTop(user) ? '取消置顶' : '聊天置顶',
click: () => { click: () => {
this.props.sticky(user); this.props.sticky(user);
} }
}, },
{ {
label: 'Delete', label: '删除',
click: () => { click: () => {
this.props.removeChat(user); this.props.removeChat(user);
} }
@ -535,7 +535,7 @@ export default class ChatContent extends Component {
}); });
if (counter) { if (counter) {
tips.innerHTML = `You has ${counter} unread messages.`; tips.innerHTML = `你有${counter}个未读消息`;
tips.classList.add(classes.show); tips.classList.add(classes.show);
} else { } else {
tips.classList.remove(classes.show); tips.classList.remove(classes.show);
@ -573,7 +573,7 @@ export default class ChatContent extends Component {
let counter = viewport.querySelectorAll(`.${classes.message}.unread`).length; let counter = viewport.querySelectorAll(`.${classes.message}.unread`).length;
if (counter) { if (counter) {
tips.innerHTML = `You has ${counter} unread messages.`; tips.innerHTML = `你有${counter}个未读消息`;
tips.classList.add(classes.show); tips.classList.add(classes.show);
} }
return; return;
@ -670,7 +670,7 @@ export default class ChatContent extends Component {
<img <img
className="disabledDrag" className="disabledDrag"
src="assets/images/noselected.png" /> src="assets/images/noselected.png" />
<h1>No Chat selected :(</h1> <h1>未选择聊天 :(</h1>
</div> </div>
) )
} }

@ -114,7 +114,7 @@
width: 32px; width: 32px;
border-radius: 0; border-radius: 0;
z-index: 9; z-index: 9;
box-shadow: 0 0 10px 0 rgba(0, 0, 0, .5); box-shadow: 0 0 10px 0 rgba(225, 225, 225, 0.5);
cursor: pointer; cursor: pointer;
} }
@ -165,7 +165,7 @@
& .content { & .content {
position: relative; position: relative;
max-width: 100%; max-width: 100%;
background: #fff; background: rgba(225, 225, 225, 0.5);
box-shadow: 0 6px 28px 0 rgba(230, 230, 230, 100); box-shadow: 0 6px 28px 0 rgba(230, 230, 230, 100);
} }
@ -538,7 +538,7 @@
} }
& .content { & .content {
background: #7ebef8; background: rgba(0, 0, 200, 0.5);
} }
& p { & p {

@ -56,7 +56,7 @@ export default class Chats extends Component {
showContextMenu(user) { showContextMenu(user) {
var menu = new remote.Menu.buildFromTemplate([ var menu = new remote.Menu.buildFromTemplate([
{ {
label: 'Send Message', label: '发送消息',
click: () => { click: () => {
this.props.chatTo(user); this.props.chatTo(user);
} }
@ -65,19 +65,19 @@ export default class Chats extends Component {
type: 'separator' type: 'separator'
}, },
{ {
label: helper.isTop(user) ? 'Unsticky' : 'Sticky on Top', label: helper.isTop(user) ? '取消置顶' : '聊天置顶',
click: () => { click: () => {
this.props.sticky(user); this.props.sticky(user);
} }
}, },
{ {
label: 'Delete', label: '删除',
click: () => { click: () => {
this.props.removeChat(user); this.props.removeChat(user);
} }
}, },
{ {
label: 'Mark as Read', label: '标为已读',
click: () => { click: () => {
this.props.markedRead(user.UserName); this.props.markedRead(user.UserName);
} }
@ -146,7 +146,7 @@ export default class Chats extends Component {
<span <span
className={classes.message} className={classes.message}
dangerouslySetInnerHTML={{__html: helper.getMessageContent(message) || 'No Message'}} /> dangerouslySetInnerHTML={{__html: helper.getMessageContent(message) || '未收到消息'}} />
</div> </div>
</div> </div>

@ -209,7 +209,7 @@ export default class SearchBar extends Component {
onFocus={e => this.filter(e.target.value)} onFocus={e => this.filter(e.target.value)}
onInput={e => this.filter(e.target.value)} onInput={e => this.filter(e.target.value)}
onKeyUp={e => this.navigation(e)} onKeyUp={e => this.navigation(e)}
placeholder="Search ..." placeholder="搜索 ..."
ref="search" ref="search"
type="text" /> type="text" />
{ {

@ -3,7 +3,6 @@
height: calc(100vh - 100px); height: calc(100vh - 100px);
overflow: hidden; overflow: hidden;
overflow-y: auto; overflow-y: auto;
background: rgba(255, 255, 255, .8);
box-shadow: inset 0 1px 0 0 #eaedea; box-shadow: inset 0 1px 0 0 #eaedea;
filter: blur(0); filter: blur(0);
transition: .2s; transition: .2s;

@ -195,7 +195,7 @@ export default class Layout extends Component {
<i className="icon-ion-ios-cloud-upload-outline" /> <i className="icon-ion-ios-cloud-upload-outline" />
<h2>Drop your file here</h2> <h2>将文件拖到此处</h2>
</div> </div>
</div> </div>
</div> </div>

@ -24,8 +24,8 @@ export default class Login extends Component {
src={this.props.avatar} /> src={this.props.avatar} />
} }
<p>Scan successful</p> <p>扫码成功</p>
<p>Confirm login on mobile WeChat</p> <p>请在手机微信上确认登陆</p>
</div> </div>
); );
} }
@ -39,10 +39,10 @@ export default class Login extends Component {
code && (<img className="disabledDrag" src={`https://login.weixin.qq.com/qrcode/${code}`} />) code && (<img className="disabledDrag" src={`https://login.weixin.qq.com/qrcode/${code}`} />)
} }
<a href={window.location.pathname + '?' + +new Date()}>Refresh the QR Code</a> <a href={window.location.pathname + '?' + +new Date()}>刷新二维码</a>
<p>Scan to log in to WeChat</p> <p>扫描二维码登录微信</p>
<p>Log in on phone to use WeChat on Web</p> <p>使用手机登录网页版微信</p>
</div> </div>
); );
} }

@ -68,7 +68,7 @@ export default class Members extends Component {
(searching && filtered.length === 0) && ( (searching && filtered.length === 0) && (
<div className={classes.notfound}> <div className={classes.notfound}>
<img src="assets/images/crash.png" /> <img src="assets/images/crash.png" />
<h1>Can't find any people matching '{searching}'</h1> <h1>找不到 '{searching}'</h1>
</div> </div>
) )
} }
@ -109,7 +109,7 @@ export default class Members extends Component {
id="messageInput" id="messageInput"
maxLength={30} maxLength={30}
onInput={e => this.props.search(e.target.value)} onInput={e => this.props.search(e.target.value)}
placeholder="Type something to search..." placeholder="在此搜索..."
ref="input" ref="input"
type="text" /> type="text" />
</div> </div>

@ -114,10 +114,10 @@ export default class NewChat extends Component {
<button <button
disabled={!this.state.selected.length} disabled={!this.state.selected.length}
onClick={e => this.chat()}> onClick={e => this.chat()}>
Chat 发送消息
</button> </button>
<button onClick={e => this.close()}>Cancel</button> <button onClick={e => this.close()}>取消</button>
</div> </div>
</ModalBody> </ModalBody>
</Modal> </Modal>

@ -1,6 +1,6 @@
.container { .container {
background: #fff; background: rgba(142, 142, 142, 0.6);
height: 100vh; height: 100vh;
width: 100vw; width: 100vw;
display: flex; display: flex;

@ -66,14 +66,14 @@ export default class Settings extends Component {
return ( return (
<div className={classes.container}> <div className={classes.container}>
<div className={classes.column}> <div className={classes.column}>
<h2>Settings</h2> <h2>设置</h2>
<ul> <ul>
{ {
user && ( user && (
<li className={classes.user}> <li className={classes.user}>
<Avatar src={this.props.user.User.HeadImgUrl} /> <Avatar src={this.props.user.User.HeadImgUrl} />
<button onClick={e => this.props.logout()}>Logout</button> <button onClick={e => this.props.logout()}>登出</button>
</li> </li>
) )
} }
@ -83,15 +83,15 @@ export default class Settings extends Component {
onChange={e => setDownloads(e.target.files[0])} onChange={e => setDownloads(e.target.files[0])}
ref="downloads" ref="downloads"
type="file" /> type="file" />
<p>Downloads</p> <p>下载目录</p>
<p onClick={e => this.choiceDownloadDir()}>{downloads}</p> <p onClick={e => this.choiceDownloadDir()}>{downloads}</p>
</div> </div>
<button onClick={e => this.choiceDownloadDir()}>Change</button> <button onClick={e => this.choiceDownloadDir()}>更改</button>
</li> </li>
<li> <li>
<label htmlFor="alwaysOnTop"> <label htmlFor="alwaysOnTop">
<span>Always on Top</span> <span>窗口置顶</span>
<Switch <Switch
checked={alwaysOnTop} checked={alwaysOnTop}
id="alwaysOnTop" id="alwaysOnTop"
@ -101,7 +101,7 @@ export default class Settings extends Component {
<li> <li>
<label htmlFor="showOnTray"> <label htmlFor="showOnTray">
<span>Show on Tray</span> <span>显示托盘图标</span>
<Switch <Switch
checked={showOnTray} checked={showOnTray}
disabled={!helper.isOsx} disabled={!helper.isOsx}
@ -112,7 +112,7 @@ export default class Settings extends Component {
<li> <li>
<label htmlFor="showNotification"> <label htmlFor="showNotification">
<span>Send Desktop Notifications</span> <span>发送桌面通知</span>
<Switch <Switch
checked={showNotification} checked={showNotification}
id="showNotification" id="showNotification"
@ -122,7 +122,7 @@ export default class Settings extends Component {
<li> <li>
<label htmlFor="blockRecall"> <label htmlFor="blockRecall">
<span>Block Message Recall</span> <span>反撤回功能</span>
<Switch <Switch
checked={blockRecall} checked={blockRecall}
id="blockRecall" id="blockRecall"
@ -132,9 +132,10 @@ export default class Settings extends Component {
<li> <li>
<label htmlFor="rememberConversation"> <label htmlFor="rememberConversation">
<span>Remember the last Conversation</span> <span>记住上次的聊天内容</span>
<Switch <Switch
checked={rememberConversation} checked={rememberConversation}
disabled={true}
id="rememberConversation" id="rememberConversation"
onChange={e => setRememberConversation(e.target.checked)} /> onChange={e => setRememberConversation(e.target.checked)} />
</label> </label>
@ -142,7 +143,7 @@ export default class Settings extends Component {
<li> <li>
<label htmlFor="showRedIcon"> <label htmlFor="showRedIcon">
<span>Show the red button</span> <span>显示首页红色加号按钮</span>
<Switch <Switch
checked={showRedIcon} checked={showRedIcon}
id="showRedIcon" id="showRedIcon"
@ -152,7 +153,7 @@ export default class Settings extends Component {
<li> <li>
<label htmlFor="confirmImagePaste"> <label htmlFor="confirmImagePaste">
<span>Image paste Confirmation</span> <span>在粘贴图片时弹框确认</span>
<Switch <Switch
checked={confirmImagePaste} checked={confirmImagePaste}
id="confirmImagePaste" id="confirmImagePaste"
@ -162,7 +163,7 @@ export default class Settings extends Component {
<li> <li>
<label htmlFor="startup"> <label htmlFor="startup">
<span>Launch at startup</span> <span>开机自启动</span>
<Switch <Switch
checked={startup} checked={startup}
id="startup" id="startup"
@ -172,7 +173,18 @@ export default class Settings extends Component {
</ul> </ul>
</div> </div>
<div className={classes.column}> <div className={classes.column}>
<h2>TODO:</h2> <h2>更新记录:</h2>
<p>
v1.2.5 修复翻译;纠正反馈邮箱;禁用记住上次聊天内容此功能等待修复<br />
v1.2.4 更多的翻译;为darkmode添加过渡动画;删去不必要的代码去除自动检查更新;修改托盘图标让其更加明显<br />
v1.2.3 增添darkmode调整优化界面颜色以适应darkmode<br />
v1.2.2 添加单例运行在后台时在启动器中启动会拉到前台而不是再启动一个wewechat更多的汉化<br />
v1.2.1 汉化<br />
v1.2.0 Make weweChat great again!!! Fix uos support<br />
<hr />
<strong>Riceneeder: 本人不会React且较为业余此项目除重大bug外不再更新有能力者可提PR或联系星火的shenmo参与项目</strong>
</p>
</div> </div>
</div> </div>
); );

@ -4,7 +4,7 @@
justify-content: space-between; justify-content: space-between;
padding: 12px 17px 0; padding: 12px 17px 0;
font-family: 'Helvetica Neue'; font-family: 'Helvetica Neue';
color: #000; color: #808080;
& h2 { & h2 {
font-weight: 300; font-weight: 300;

@ -75,7 +75,7 @@ class UserInfo extends Component {
}); });
this.toggleEdit(false); this.toggleEdit(false);
} else { } else {
this.props.showMessage('Failed to set remark name.'); this.props.showMessage('设置备注失败');
} }
} }
@ -210,7 +210,7 @@ class UserInfo extends Component {
color: buttonColor, color: buttonColor,
opacity: .6, opacity: .6,
}}> }}>
{helper.isChatRoom(UserName) || isFriend ? 'Send Message' : 'Add Friend'} {helper.isChatRoom(UserName) || isFriend ? '发送消息' : '添加好友'}
</div> </div>
</div> </div>
@ -221,7 +221,7 @@ class UserInfo extends Component {
autoFocus={true} autoFocus={true}
defaultValue={RemarkName} defaultValue={RemarkName}
onKeyPress={e => this.handleEnter(e)} onKeyPress={e => this.handleEnter(e)}
placeholder="Type the remark name" placeholder="设置备注"
ref="input" ref="input"
type="text" /> type="text" />
) )

@ -12,7 +12,7 @@ import contacts from './contacts';
const CancelToken = axios.CancelToken; const CancelToken = axios.CancelToken;
const headers = { const headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
'client-version': '2.0.0', 'client-version': '2.1.5',
extspam: 'Go8FCIkFEokFCggwMDAwMDAwMRAGGvAESySibk50w5Wb3uTl2c2h64jVVrV7gNs06GFlWplHQbY/5FfiO++1yH4ykCyNPWKXmco+wfQzK5R98D3so7rJ5LmGFvBLjGceleySrc3SOf2Pc1gVehzJgODeS0lDL3/I/0S2SSE98YgKleq6Uqx6ndTy9yaL9qFxJL7eiA/R3SEfTaW1SBoSITIu+EEkXff+Pv8NHOk7N57rcGk1w0ZzRrQDkXTOXFN2iHYIzAAZPIOY45Lsh+A4slpgnDiaOvRtlQYCt97nmPLuTipOJ8Qc5pM7ZsOsAPPrCQL7nK0I7aPrFDF0q4ziUUKettzW8MrAaiVfmbD1/VkmLNVqqZVvBCtRblXb5FHmtS8FxnqCzYP4WFvz3T0TcrOqwLX1M/DQvcHaGGw0B0y4bZMs7lVScGBFxMj3vbFi2SRKbKhaitxHfYHAOAa0X7/MSS0RNAjdwoyGHeOepXOKY+h3iHeqCvgOH6LOifdHf/1aaZNwSkGotYnYScW8Yx63LnSwba7+hESrtPa/huRmB9KWvMCKbDThL/nne14hnL277EDCSocPu3rOSYjuB9gKSOdVmWsj9Dxb/iZIe+S6AiG29Esm+/eUacSba0k8wn5HhHg9d4tIcixrxveflc8vi2/wNQGVFNsGO6tB5WF0xf/plngOvQ1/ivGV/C1Qpdhzznh0ExAVJ6dwzNg7qIEBaw+BzTJTUuRcPk92Sn6QDn2Pu3mpONaEumacjW4w6ipPnPw+g2TfywJjeEcpSZaP4Q3YV5HG8D6UjWA4GSkBKculWpdCMadx0usMomsSS/74QgpYqcPkmamB4nVv1JxczYITIqItIKjD35IGKAUwAA==', extspam: 'Go8FCIkFEokFCggwMDAwMDAwMRAGGvAESySibk50w5Wb3uTl2c2h64jVVrV7gNs06GFlWplHQbY/5FfiO++1yH4ykCyNPWKXmco+wfQzK5R98D3so7rJ5LmGFvBLjGceleySrc3SOf2Pc1gVehzJgODeS0lDL3/I/0S2SSE98YgKleq6Uqx6ndTy9yaL9qFxJL7eiA/R3SEfTaW1SBoSITIu+EEkXff+Pv8NHOk7N57rcGk1w0ZzRrQDkXTOXFN2iHYIzAAZPIOY45Lsh+A4slpgnDiaOvRtlQYCt97nmPLuTipOJ8Qc5pM7ZsOsAPPrCQL7nK0I7aPrFDF0q4ziUUKettzW8MrAaiVfmbD1/VkmLNVqqZVvBCtRblXb5FHmtS8FxnqCzYP4WFvz3T0TcrOqwLX1M/DQvcHaGGw0B0y4bZMs7lVScGBFxMj3vbFi2SRKbKhaitxHfYHAOAa0X7/MSS0RNAjdwoyGHeOepXOKY+h3iHeqCvgOH6LOifdHf/1aaZNwSkGotYnYScW8Yx63LnSwba7+hESrtPa/huRmB9KWvMCKbDThL/nne14hnL277EDCSocPu3rOSYjuB9gKSOdVmWsj9Dxb/iZIe+S6AiG29Esm+/eUacSba0k8wn5HhHg9d4tIcixrxveflc8vi2/wNQGVFNsGO6tB5WF0xf/plngOvQ1/ivGV/C1Qpdhzznh0ExAVJ6dwzNg7qIEBaw+BzTJTUuRcPk92Sn6QDn2Pu3mpONaEumacjW4w6ipPnPw+g2TfywJjeEcpSZaP4Q3YV5HG8D6UjWA4GSkBKculWpdCMadx0usMomsSS/74QgpYqcPkmamB4nVv1JxczYITIqItIKjD35IGKAUwAA==',
referer: 'https://wx.qq.com/?&lang=zh_CN&target=t', referer: 'https://wx.qq.com/?&lang=zh_CN&target=t',
}; };