diff --git a/skins/base/css/organisms/RoomView.css b/skins/base/css/organisms/RoomView.css
index 7206a6e93d..bdcf8ac7bf 100644
--- a/skins/base/css/organisms/RoomView.css
+++ b/skins/base/css/organisms/RoomView.css
@@ -40,6 +40,42 @@ limitations under the License.
flex: 0 0 88px;
}
+.mx_RoomView_fileDropTarget {
+ min-width: 0px;
+ max-width: 720px;
+ width: 100%;
+ font-size: 20px;
+ text-align: center;
+
+ pointer-events: none;
+
+ padding-left: 12px;
+ padding-right: 12px;
+ margin-left: -12px;
+
+ -webkit-border-top-left-radius: 10px;
+ -webkit-border-top-right-radius: 10px;
+ -moz-border-radius-topleft: 10px;
+ -moz-border-radius-topright: 10px;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+
+ background-color: rgba(255, 255, 255, 0.9);
+ border: 2px dashed #80cef4;
+ border-bottom: none;
+ position: absolute;
+ top: 88px;
+ bottom: 0px;
+ z-index: 3000;
+}
+
+.mx_RoomView_fileDropTargetLabel {
+ top: 50%;
+ width: 100%;
+ margin-top: -50px;
+ position: absolute;
+}
+
.mx_RoomView_auxPanel {
-webkit-box-ordinal-group: 2;
-moz-box-ordinal-group: 2;
diff --git a/skins/base/img/upload-big.png b/skins/base/img/upload-big.png
new file mode 100644
index 0000000000..7754f58717
Binary files /dev/null and b/skins/base/img/upload-big.png differ
diff --git a/skins/base/views/organisms/RoomView.js b/skins/base/views/organisms/RoomView.js
index 722a254fec..430f751f4f 100644
--- a/skins/base/views/organisms/RoomView.js
+++ b/skins/base/views/organisms/RoomView.js
@@ -155,15 +155,23 @@ module.exports = React.createClass({
}
var roomEdit = null;
-
if (this.state.editingRoomSettings) {
roomEdit = ;
}
-
if (this.state.uploadingRoomSettings) {
roomEdit = ;
}
+ var fileDropTarget = null;
+ if (this.state.draggingFile) {
+ fileDropTarget =
+
+

+ Drop File Here
+
+
;
+ }
+
return (
+ { fileDropTarget }
-
diff --git a/src/controllers/organisms/RoomView.js b/src/controllers/organisms/RoomView.js
index d41bc40210..d3feff69f6 100644
--- a/src/controllers/organisms/RoomView.js
+++ b/src/controllers/organisms/RoomView.js
@@ -52,7 +52,8 @@ module.exports = {
messageCap: INITIAL_SIZE,
editingRoomSettings: false,
uploadingRoomSettings: false,
- numUnreadMessages: 0
+ numUnreadMessages: 0,
+ draggingFile: false,
}
},
@@ -69,6 +70,8 @@ module.exports = {
var messageWrapper = this.refs.messageWrapper.getDOMNode();
messageWrapper.removeEventListener('drop', this.onDrop);
messageWrapper.removeEventListener('dragover', this.onDragOver);
+ messageWrapper.removeEventListener('dragleave', this.onDragLeaveOrEnd);
+ messageWrapper.removeEventListener('dragend', this.onDragLeaveOrEnd);
}
dis.unregister(this.dispatcherRef);
if (MatrixClientPeg.get()) {
@@ -173,6 +176,8 @@ module.exports = {
messageWrapper.addEventListener('drop', this.onDrop);
messageWrapper.addEventListener('dragover', this.onDragOver);
+ messageWrapper.addEventListener('dragleave', this.onDragLeaveOrEnd);
+ messageWrapper.addEventListener('dragend', this.onDragLeaveOrEnd);
messageWrapper.scrollTop = messageWrapper.scrollHeight;
@@ -272,6 +277,7 @@ module.exports = {
var items = ev.dataTransfer.items;
if (items.length == 1) {
if (items[0].kind == 'file') {
+ this.setState({ draggingFile : true });
ev.dataTransfer.dropEffect = 'copy';
}
}
@@ -280,12 +286,19 @@ module.exports = {
onDrop: function(ev) {
ev.stopPropagation();
ev.preventDefault();
+ this.setState({ draggingFile : false });
var files = ev.dataTransfer.files;
if (files.length == 1) {
this.uploadFile(files[0]);
}
},
+ onDragLeaveOrEnd: function(ev) {
+ ev.stopPropagation();
+ ev.preventDefault();
+ this.setState({ draggingFile : false });
+ },
+
uploadFile: function(file) {
this.setState({
upload: {