Merge pull request #228 from nickago/MM-1547
MM-1547 Added local cache storing of drafts for comments
Этот коммит содержится в:
@@ -5,6 +5,7 @@ var client = require('../utils/client.jsx');
|
|||||||
var AsyncClient =require('../utils/async_client.jsx');
|
var AsyncClient =require('../utils/async_client.jsx');
|
||||||
var SocketStore = require('../stores/socket_store.jsx');
|
var SocketStore = require('../stores/socket_store.jsx');
|
||||||
var ChannelStore = require('../stores/channel_store.jsx');
|
var ChannelStore = require('../stores/channel_store.jsx');
|
||||||
|
var PostStore = require('../stores/post_store.jsx');
|
||||||
var Textbox = require('./textbox.jsx');
|
var Textbox = require('./textbox.jsx');
|
||||||
var MsgTyping = require('./msg_typing.jsx');
|
var MsgTyping = require('./msg_typing.jsx');
|
||||||
var FileUpload = require('./file_upload.jsx');
|
var FileUpload = require('./file_upload.jsx');
|
||||||
@@ -43,6 +44,7 @@ module.exports = React.createClass({
|
|||||||
|
|
||||||
client.createPost(post, ChannelStore.getCurrent(),
|
client.createPost(post, ChannelStore.getCurrent(),
|
||||||
function(data) {
|
function(data) {
|
||||||
|
PostStore.storeCommentDraft(this.props.rootId, null);
|
||||||
this.setState({ messageText: '', submitting: false, post_error: null, server_error: null });
|
this.setState({ messageText: '', submitting: false, post_error: null, server_error: null });
|
||||||
this.clearPreviews();
|
this.clearPreviews();
|
||||||
AsyncClient.getPosts(true, this.props.channelId);
|
AsyncClient.getPosts(true, this.props.channelId);
|
||||||
@@ -82,16 +84,33 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleUserInput: function(messageText) {
|
handleUserInput: function(messageText) {
|
||||||
|
var draft = PostStore.getCommentDraft(this.props.rootId);
|
||||||
|
if (!draft) {
|
||||||
|
draft = { previews: [], uploadsInProgress: 0};
|
||||||
|
}
|
||||||
|
draft.message = messageText;
|
||||||
|
PostStore.storeCommentDraft(this.props.rootId, draft);
|
||||||
|
|
||||||
$(".post-right__scroll").scrollTop($(".post-right__scroll")[0].scrollHeight);
|
$(".post-right__scroll").scrollTop($(".post-right__scroll")[0].scrollHeight);
|
||||||
$(".post-right__scroll").perfectScrollbar('update');
|
$(".post-right__scroll").perfectScrollbar('update');
|
||||||
this.setState({messageText: messageText});
|
this.setState({messageText: messageText});
|
||||||
},
|
},
|
||||||
handleFileUpload: function(newPreviews) {
|
handleFileUpload: function(newPreviews) {
|
||||||
|
var draft = PostStore.getCommentDraft(this.props.rootId);
|
||||||
|
if (!draft) {
|
||||||
|
draft = { message: '', uploadsInProgress: 0, previews: []}
|
||||||
|
}
|
||||||
|
|
||||||
$(".post-right__scroll").scrollTop($(".post-right__scroll")[0].scrollHeight);
|
$(".post-right__scroll").scrollTop($(".post-right__scroll")[0].scrollHeight);
|
||||||
$(".post-right__scroll").perfectScrollbar('update');
|
$(".post-right__scroll").perfectScrollbar('update');
|
||||||
var oldPreviews = this.state.previews;
|
var previews = this.state.previews.concat(newPreviews);
|
||||||
var num = this.state.uploadsInProgress;
|
var num = this.state.uploadsInProgress;
|
||||||
this.setState({previews: oldPreviews.concat(newPreviews), uploadsInProgress:num-1});
|
|
||||||
|
draft.previews = previews;
|
||||||
|
draft.uploadsInProgress = num-1;
|
||||||
|
PostStore.storeCommentDraft(this.props.rootId, draft);
|
||||||
|
|
||||||
|
this.setState({previews: previews, uploadsInProgress: num-1});
|
||||||
},
|
},
|
||||||
handleUploadError: function(err) {
|
handleUploadError: function(err) {
|
||||||
this.setState({ server_error: err });
|
this.setState({ server_error: err });
|
||||||
@@ -107,10 +126,43 @@ module.exports = React.createClass({
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var draft = PostStore.getCommentDraft();
|
||||||
|
if (!draft) {
|
||||||
|
draft = { message: '', uploadsInProgress: 0};
|
||||||
|
}
|
||||||
|
draft.previews = previews;
|
||||||
|
PostStore.storeCommentDraft(draft);
|
||||||
|
|
||||||
this.setState({previews: previews});
|
this.setState({previews: previews});
|
||||||
},
|
},
|
||||||
getInitialState: function() {
|
getInitialState: function() {
|
||||||
return { messageText: '', uploadsInProgress: 0, previews: [], submitting: false };
|
PostStore.clearCommentDraftUploads();
|
||||||
|
|
||||||
|
var draft = PostStore.getCommentDraft(this.props.rootId);
|
||||||
|
messageText = '';
|
||||||
|
uploadsInProgress = 0;
|
||||||
|
previews = [];
|
||||||
|
if (draft) {
|
||||||
|
messageText = draft.message;
|
||||||
|
uploadsInProgress = draft.uploadsInProgress;
|
||||||
|
previews = draft.previews
|
||||||
|
}
|
||||||
|
return { messageText: messageText, uploadsInProgress: uploadsInProgress, previews: previews, submitting: false };
|
||||||
|
},
|
||||||
|
componentWillReceiveProps: function(newProps) {
|
||||||
|
if(newProps.rootId !== this.props.rootId) {
|
||||||
|
var draft = PostStore.getCommentDraft(newProps.rootId);
|
||||||
|
messageText = '';
|
||||||
|
uploadsInProgress = 0;
|
||||||
|
previews = [];
|
||||||
|
if (draft) {
|
||||||
|
messageText = draft.message;
|
||||||
|
uploadsInProgress = draft.uploadsInProgress;
|
||||||
|
previews = draft.previews
|
||||||
|
}
|
||||||
|
this.setState({ messageText: messageText, uploadsInProgress: uploadsInProgress, previews: previews });
|
||||||
|
}
|
||||||
},
|
},
|
||||||
setUploads: function(val) {
|
setUploads: function(val) {
|
||||||
var oldInProgress = this.state.uploadsInProgress
|
var oldInProgress = this.state.uploadsInProgress
|
||||||
@@ -126,6 +178,13 @@ module.exports = React.createClass({
|
|||||||
var numToUpload = newInProgress - oldInProgress;
|
var numToUpload = newInProgress - oldInProgress;
|
||||||
if (numToUpload <= 0) return 0;
|
if (numToUpload <= 0) return 0;
|
||||||
|
|
||||||
|
var draft = PostStore.getCommentDraft(this.props.rootId);
|
||||||
|
if (!draft) {
|
||||||
|
draft = { message: '', previews: []};
|
||||||
|
}
|
||||||
|
draft.uploadsInProgress = newInProgress;
|
||||||
|
PostStore.storeCommentDraft(this.props.rootId, draft);
|
||||||
|
|
||||||
this.setState({uploadsInProgress: newInProgress});
|
this.setState({uploadsInProgress: newInProgress});
|
||||||
|
|
||||||
return numToUpload;
|
return numToUpload;
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ module.exports = React.createClass({
|
|||||||
post.message,
|
post.message,
|
||||||
false,
|
false,
|
||||||
function(data) {
|
function(data) {
|
||||||
PostStore.storeDraft(data.channel_id, user_id, null);
|
PostStore.storeDraft(data.channel_id, null);
|
||||||
this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null, limit_error: null });
|
this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null, limit_error: null });
|
||||||
|
|
||||||
if (data.goto_location.length > 0) {
|
if (data.goto_location.length > 0) {
|
||||||
@@ -78,7 +78,7 @@ module.exports = React.createClass({
|
|||||||
|
|
||||||
client.createPost(post, ChannelStore.getCurrent(),
|
client.createPost(post, ChannelStore.getCurrent(),
|
||||||
function(data) {
|
function(data) {
|
||||||
PostStore.storeDraft(data.channel_id, data.user_id, null);
|
PostStore.storeDraft(data.channel_id, null);
|
||||||
this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null, limit_error: null });
|
this.setState({ messageText: '', submitting: false, post_error: null, previews: [], server_error: null, limit_error: null });
|
||||||
this.resizePostHolder();
|
this.resizePostHolder();
|
||||||
AsyncClient.getPosts(true);
|
AsyncClient.getPosts(true);
|
||||||
@@ -209,7 +209,7 @@ module.exports = React.createClass({
|
|||||||
$(window).trigger('resize');
|
$(window).trigger('resize');
|
||||||
},
|
},
|
||||||
handleFileUpload: function(newPreviews, channel_id) {
|
handleFileUpload: function(newPreviews, channel_id) {
|
||||||
var draft = PostStore.getDraft(channel_id, UserStore.getCurrentId());
|
var draft = PostStore.getDraft(channel_id);
|
||||||
if (!draft) {
|
if (!draft) {
|
||||||
draft = {}
|
draft = {}
|
||||||
draft['message'] = '';
|
draft['message'] = '';
|
||||||
@@ -230,7 +230,7 @@ module.exports = React.createClass({
|
|||||||
} else {
|
} else {
|
||||||
draft['previews'] = draft['previews'].concat(newPreviews);
|
draft['previews'] = draft['previews'].concat(newPreviews);
|
||||||
draft['uploadsInProgress'] = draft['uploadsInProgress'] > 0 ? draft['uploadsInProgress'] - 1 : 0;
|
draft['uploadsInProgress'] = draft['uploadsInProgress'] > 0 ? draft['uploadsInProgress'] - 1 : 0;
|
||||||
PostStore.storeDraft(channel_id, UserStore.getCurrentId(), draft);
|
PostStore.storeDraft(channel_id, draft);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleUploadError: function(err) {
|
handleUploadError: function(err) {
|
||||||
|
|||||||
@@ -149,19 +149,23 @@ var PostStore = assign({}, EventEmitter.prototype, {
|
|||||||
},
|
},
|
||||||
storeCurrentDraft: function(draft) {
|
storeCurrentDraft: function(draft) {
|
||||||
var channel_id = ChannelStore.getCurrentId();
|
var channel_id = ChannelStore.getCurrentId();
|
||||||
var user_id = UserStore.getCurrentId();
|
BrowserStore.setItem("draft_" + channel_id, draft);
|
||||||
BrowserStore.setItem("draft_" + channel_id + "_" + user_id, draft);
|
|
||||||
},
|
},
|
||||||
getCurrentDraft: function() {
|
getCurrentDraft: function() {
|
||||||
var channel_id = ChannelStore.getCurrentId();
|
var channel_id = ChannelStore.getCurrentId();
|
||||||
var user_id = UserStore.getCurrentId();
|
return BrowserStore.getItem("draft_" + channel_id);
|
||||||
return BrowserStore.getItem("draft_" + channel_id + "_" + user_id);
|
|
||||||
},
|
},
|
||||||
storeDraft: function(channel_id, user_id, draft) {
|
storeDraft: function(channel_id, draft) {
|
||||||
BrowserStore.setItem("draft_" + channel_id + "_" + user_id, draft);
|
BrowserStore.setItem("draft_" + channel_id, draft);
|
||||||
},
|
},
|
||||||
getDraft: function(channel_id, user_id) {
|
getDraft: function(channel_id) {
|
||||||
return BrowserStore.getItem("draft_" + channel_id + "_" + user_id);
|
return BrowserStore.getItem("draft_" + channel_id);
|
||||||
|
},
|
||||||
|
storeCommentDraft: function(parent_post_id, draft) {
|
||||||
|
BrowserStore.setItem("comment_draft_" + parent_post_id, draft);
|
||||||
|
},
|
||||||
|
getCommentDraft: function(parent_post_id) {
|
||||||
|
return BrowserStore.getItem("comment_draft_" + parent_post_id);
|
||||||
},
|
},
|
||||||
clearDraftUploads: function() {
|
clearDraftUploads: function() {
|
||||||
BrowserStore.actionOnItemsWithPrefix("draft_", function (key, value) {
|
BrowserStore.actionOnItemsWithPrefix("draft_", function (key, value) {
|
||||||
@@ -170,6 +174,14 @@ var PostStore = assign({}, EventEmitter.prototype, {
|
|||||||
BrowserStore.setItem(key, value);
|
BrowserStore.setItem(key, value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
clearCommentDraftUploads: function() {
|
||||||
|
BrowserStore.actionOnItemsWithPrefix("comment_draft_", function (key, value) {
|
||||||
|
if (value) {
|
||||||
|
value.uploadsInProgress = 0;
|
||||||
|
BrowserStore.setItem(key, value);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user