/* Copyright 2015 OpenMarket Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ 'use strict'; var React = require('react'); var DragSource = require('react-dnd').DragSource; var DropTarget = require('react-dnd').DropTarget; var classNames = require('classnames'); var RoomTileController = require('matrix-react-sdk/lib/controllers/molecules/RoomTile') var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg'); var sdk = require('matrix-react-sdk') /** * Specifies the drag source contract. * Only `beginDrag` function is required. */ var roomTileSource = { beginDrag: function (props) { // Return the data describing the dragged item var item = { room: props.room, originalList: props.roomSubList, originalIndex: props.roomSubList.findRoomTile(props.room).index, targetList: props.roomSubList, // at first target is same as original }; console.log("roomTile beginDrag for " + item.room.roomId); return item; }, endDrag: function (props, monitor, component) { var item = monitor.getItem(); var dropResult = monitor.getDropResult(); console.log("roomTile endDrag for " + item.room.roomId + " with didDrop=" + monitor.didDrop()); if (!monitor.didDrop() || !item.targetList.props.editable) { props.roomSubList.moveRoomTile(item.room, item.originalIndex); if (item.targetList && item.targetList !== item.originalList) { item.targetList.removeRoomTile(item.room); } return; } else { // if it's not manual ordering, we'll need to position the tile correctly here according to the right ordering // When dropped on a compatible target, actually set the right tags for the new ordering // persistNewOrder(item.room, dropResult.listId); } } }; var roomTileTarget = { canDrop: function() { return false; }, hover: function(props, monitor) { var item = monitor.getItem(); console.log("hovering on room " + props.room.roomId + ", isOver=" + monitor.isOver()); //console.log("item.targetList=" + item.targetList + ", roomSubList=" + props.roomSubList); if (item.targetList !== props.roomSubList) { // we've switched target, so remove the tile from the previous target. // n.b. the previous target might actually be the source list. item.targetList.removeRoomTile(item.room); item.targetList = props.roomSubList; } if (item.targetList.props.order === 'manual' && item.room.roomId !== props.room.roomId) { var roomTile = props.roomSubList.findRoomTile(props.room); props.roomSubList.moveRoomTile(item.room, roomTile.index); } }, }; var RoomTile = React.createClass({ displayName: 'RoomTile', mixins: [RoomTileController], propTypes: { connectDragSource: React.PropTypes.func.isRequired, connectDropTarget: React.PropTypes.func.isRequired, isDragging: React.PropTypes.bool.isRequired, room: React.PropTypes.object.isRequired, collapsed: React.PropTypes.bool.isRequired, selected: React.PropTypes.bool.isRequired, unread: React.PropTypes.bool.isRequired, highlight: React.PropTypes.bool.isRequired, isInvite: React.PropTypes.bool.isRequired, roomSubList: React.PropTypes.object.isRequired, }, getInitialState: function() { return( { hover : false }); }, onMouseEnter: function() { this.setState( { hover : true }); }, onMouseLeave: function() { this.setState( { hover : false }); }, render: function() { var myUserId = MatrixClientPeg.get().credentials.userId; var me = this.props.room.currentState.members[myUserId]; var classes = classNames({ 'mx_RoomTile': true, 'mx_RoomTile_selected': this.props.selected, 'mx_RoomTile_unread': this.props.unread, 'mx_RoomTile_highlight': this.props.highlight, 'mx_RoomTile_invited': (me && me.membership == 'invite'), }); var name; if (this.props.isInvite) { name = this.props.room.getMember(MatrixClientPeg.get().credentials.userId).events.member.getSender(); } else { name = this.props.room.name; } name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon var badge; if (this.props.highlight) { badge =
; } /* if (this.props.highlight) { badge =