diff --git a/main.js b/main.js index 42136c9..441e7da 100644 --- a/main.js +++ b/main.js @@ -436,6 +436,8 @@ function updateTray(unread = 0) { tray.setContextMenu(contextmenu); }); } else { + if (!tray) return; + tray.destroy(); tray = null; } diff --git a/package.json b/package.json index ea75ff0..58fd271 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "linux": { "icon": "../resource", "category": "Chat", + "executableName": "weweChat", "target": [ "deb", "rpm", diff --git a/src/js/components/Avatar/index.js b/src/js/components/Avatar/index.js index 54e7fcf..f752a6d 100644 --- a/src/js/components/Avatar/index.js +++ b/src/js/components/Avatar/index.js @@ -29,9 +29,10 @@ export default class Avatar extends Component { this.handleError(e)} onLoad={e => this.handleLoad(e)} - src={this.props.src} /> + onError={e => this.handleError(e)} + src={this.props.src} + /> ); } } diff --git a/src/js/components/MessageInput/index.js b/src/js/components/MessageInput/index.js index 0622e4e..d40292c 100644 --- a/src/js/components/MessageInput/index.js +++ b/src/js/components/MessageInput/index.js @@ -24,12 +24,11 @@ export default class MessageInput extends Component { canisend() { var user = this.props.user; - if (this.blocking) { - return false; - } - - if (user.length === 1 - && user.slice(-1).pop().UserName === this.props.me.UserName) { + if ( + true + && user.length === 1 + && user.slice(-1).pop().UserName === this.props.me.UserName + ) { this.props.showMessage('Can\'t send message to yourself.'); return false; } @@ -37,38 +36,41 @@ export default class MessageInput extends Component { return true; } - // Prevent duplicate message - blocking = false; - async handleEnter(e) { var message = this.refs.input.value.trim(); var user = this.props.user; var batch = user.length > 1; - if (!this.canisend() + if ( + false + || !this.canisend() || !message - || e.charCode !== 13) return; - - this.blocking = true; + || e.charCode !== 13 + ) return; // You can not send message to yourself - await Promise.all( - user.filter(e => e.UserName !== this.props.me.UserName).map(async e => { - let res = await this.props.sendMessage(e, { - content: message, - type: 1, - }, true); - - this.refs.input.value = ''; - - if (!res) { - await this.props.showMessage(batch ? `Send message to ${e.NickName} is failed!` : 'Failed to send message.'); + Promise.all( + user.filter(e => e.UserName !== this.props.me.UserName).map( + async e => { + let res = await this.props.sendMessage( + e, + { + content: message, + type: 1, + }, + true + ); + + if (!res) { + await this.props.showMessage(batch ? `Send message to ${e.NickName} is failed!` : 'Failed to send message.'); + } + + return true; } - - return true; - }) + ) ); - this.blocking = false; + + this.refs.input.value = ''; } state = { @@ -76,9 +78,7 @@ export default class MessageInput extends Component { }; toggleEmoji(show = !this.state.showEmoji) { - this.setState({ - showEmoji: show, - }); + this.setState({ showEmoji: show }); } writeEmoji(emoji) { @@ -141,38 +141,66 @@ export default class MessageInput extends Component { } } + componentWillReceiveProps(nextProps) { + var input = this.refs.input; + + // When user has changed clear the input + if ( + true + && input + && input.value + && this.props.user.map(e => e.UserName).join() !== nextProps.user.map(e => e.UserName).join() + ) { + input.value = ''; + } + } + render() { var canisend = !!this.props.user.length; return ( -
+
+ className={classes.tips} + > You should choice a contact at first.
+ this.handlePaste(e)} - onKeyPress={e => this.handleEnter(e)} + ref="input" + type="text" placeholder="Type something to send..." readOnly={!canisend} - ref="input" - type="text" /> + onPaste={e => this.handlePaste(e)} + onKeyPress={e => this.handleEnter(e)} + />
canisend && this.refs.uploader.click()} /> + onClick={e => canisend && this.refs.uploader.click()} + /> + canisend && this.toggleEmoji(true)} style={{ color: 'red', - }} /> + }} + /> { @@ -183,11 +211,14 @@ export default class MessageInput extends Component { style={{ display: 'none', }} - type="file" /> + type="file" + /> + setTimeout(() => this.toggleEmoji(false), 100)} output={emoji => this.writeEmoji(emoji)} - show={this.state.showEmoji} /> + show={this.state.showEmoji} + />
); diff --git a/src/js/pages/Home/ChatContent/index.js b/src/js/pages/Home/ChatContent/index.js index dfe7b7c..fc10516 100644 --- a/src/js/pages/Home/ChatContent/index.js +++ b/src/js/pages/Home/ChatContent/index.js @@ -80,7 +80,7 @@ import { on, off } from 'utils/event'; showAddFriend: (user) => stores.addfriend.toggle(true, user), recallMessage: stores.chat.recallMessage, downloads: stores.settings.downloads, - remeberConversation: stores.settings.remeberConversation, + rememberConversation: stores.settings.rememberConversation, showConversation: stores.chat.showConversation, toggleConversation: stores.chat.toggleConversation, })) @@ -304,9 +304,13 @@ export default class ChatContent extends Component { this.props.showUserinfo(message.isme, user)} /> + onClick={ev => this.props.showUserinfo(message.isme, user)} + /> -

+

+ src={e.HeadImgUrl} + onError={e => (e.target.src = 'assets/images/user-fallback.png')} + />

diff --git a/src/js/pages/Settings/index.js b/src/js/pages/Settings/index.js index 358a4d2..76c07ca 100644 --- a/src/js/pages/Settings/index.js +++ b/src/js/pages/Settings/index.js @@ -22,8 +22,8 @@ import helper from 'utils/helper'; setConfirmImagePaste: stores.settings.setConfirmImagePaste, blockRecall: stores.settings.blockRecall, setBlockRecall: stores.settings.setBlockRecall, - remeberConversation: stores.settings.remeberConversation, - setRemeberConversation: stores.settings.setRemeberConversation, + rememberConversation: stores.settings.rememberConversation, + setRememberConversation: stores.settings.setRememberConversation, showRedIcon: stores.settings.showRedIcon, setShowRedIcon: stores.settings.setShowRedIcon, @@ -56,8 +56,8 @@ export default class Settings extends Component { setConfirmImagePaste, blockRecall, setBlockRecall, - remeberConversation, - setRemeberConversation, + rememberConversation, + setRememberConversation, showRedIcon, setShowRedIcon, user, @@ -131,12 +131,12 @@ export default class Settings extends Component {
  • -
  • diff --git a/src/js/stores/settings.js b/src/js/stores/settings.js index 00f7e0e..1730e2a 100644 --- a/src/js/stores/settings.js +++ b/src/js/stores/settings.js @@ -12,7 +12,7 @@ class Settings { @observable confirmImagePaste = true; @observable startup = false; @observable blockRecall = false; - @observable remeberConversation = false; + @observable rememberConversation = false; @observable showRedIcon = true; @observable downloads = ''; @@ -26,8 +26,8 @@ class Settings { self.save(); } - @action setRemeberConversation(remeberConversation) { - self.remeberConversation = remeberConversation; + @action setRememberConversation(rememberConversation) { + self.rememberConversation = rememberConversation; self.save(); } @@ -63,7 +63,7 @@ class Settings { @action async init() { var settings = await storage.get('settings'); - var { alwaysOnTop, showOnTray, showNotification, blockRecall, remeberConversation, showRedIcon, startup, downloads } = self; + var { alwaysOnTop, showOnTray, showNotification, blockRecall, rememberConversation, showRedIcon, startup, downloads } = self; if (settings && Object.keys(settings).length) { // Use !! force convert to a bool value @@ -73,7 +73,7 @@ class Settings { self.confirmImagePaste = !!settings.confirmImagePaste; self.startup = !!settings.startup; self.blockRecall = !!settings.blockRecall; - self.remeberConversation = !!settings.remeberConversation; + self.rememberConversation = !!settings.rememberConversation; self.showRedIcon = !!settings.showRedIcon; self.downloads = settings.downloads; } else { @@ -84,7 +84,7 @@ class Settings { startup, downloads, blockRecall, - remeberConversation, + rememberConversation, showRedIcon, }); } @@ -104,7 +104,7 @@ class Settings { } save() { - var { alwaysOnTop, showOnTray, showNotification, confirmImagePaste, blockRecall, remeberConversation, showRedIcon, startup, downloads } = self; + var { alwaysOnTop, showOnTray, showNotification, confirmImagePaste, blockRecall, rememberConversation, showRedIcon, startup, downloads } = self; storage.set('settings', { alwaysOnTop, @@ -114,7 +114,7 @@ class Settings { startup, downloads, blockRecall, - remeberConversation, + rememberConversation, showRedIcon, }); @@ -127,7 +127,7 @@ class Settings { startup, downloads, blockRecall, - remeberConversation, + rememberConversation, showRedIcon, } });