message: Move DND context to LoggedInView
  so that we can drag things from any part of the logged in app to
  another. (Specifically GroupView and TagPanel).
diff: @@ -19,6 +19,7 @@ limitations under the License.
  import * as Matrix from 'matrix-js-sdk';
  import React from 'react';
  import PropTypes from 'prop-types';
  +import { DragDropContext } from 'react-beautiful-dnd';
  import { KeyCode, isOnlyCtrlOrCmdKeyEvent } from '../../Keyboard';
  import Notifier from '../../Notifier';
  @@ -30,6 +31,9 @@ import sessionStore from '../../stores/SessionStore';
  import MatrixClientPeg from '../../MatrixClientPeg';
  import SettingsStore from "../../settings/SettingsStore";
  +import TagOrderActions from '../../actions/TagOrderActions';
  +import RoomListActions from '../../actions/RoomListActions';
  +
  /**
  * This is what our MatrixChat shows when we are logged in. The precise view is
  * determined by the page_type property.
  @@ -207,6 +211,50 @@ const LoggedInView = React.createClass({
  }
  },
  + _onDragEnd: function(result) {
  + // Dragged to an invalid destination, not onto a droppable
  + if (!result.destination) {
  + return;
  + }
  +
  + const dest = result.destination.droppableId;
  +
  + if (dest === 'tag-panel-droppable') {
  + // Could be "GroupTile +groupId:domain"
  + const draggableId = result.draggableId.split(' ').pop();
  +
  + // Dispatch synchronously so that the TagPanel receives an
  + // optimistic update from TagOrderStore before the previous
  + // state is shown.
  + dis.dispatch(TagOrderActions.moveTag(
  + this._matrixClient,
  + draggableId,
  + result.destination.index,
  + ), true);
  + } else if (dest.startsWith('room-sub-list-droppable_')) {
  + this._onRoomTileEndDrag(result);
  + }
  + },
  +
  + _onRoomTileEndDrag: function(result) {
  + let newTag = result.destination.droppableId.split('_')[1];
  + let prevTag = result.source.droppableId.split('_')[1];
  + if (newTag === 'undefined') newTag = undefined;
  + if (prevTag === 'undefined') prevTag = undefined;
  +
  + const roomId = result.draggableId.split('_')[1];
  +
  + const oldIndex = result.source.index;
  + const newIndex = result.destination.index;
  +
  + dis.dispatch(RoomListActions.tagRoom(
  + this._matrixClient,
  + this._matrixClient.getRoom(roomId),
  + prevTag, newTag,
  + oldIndex, newIndex,
  + ), true);
  + },
  +
  render: function() {
  const LeftPanel = sdk.getComponent('structures.LeftPanel');
  const RightPanel = sdk.getComponent('structures.RightPanel');
  @@ -328,6 +376,7 @@ const LoggedInView = React.createClass({
  return (
  <div className='mx_MatrixChat_wrapper'>
  { topBar }
  + <DragDropContext onDragEnd={this._onDragEnd}>
  <div className={bodyClasses}>
  <LeftPanel
  collapsed={this.props.collapseLhs || false}
  @@ -338,6 +387,7 @@ const LoggedInView = React.createClass({
  </main>
  { right_panel }
  </div>
  + </DragDropContext>
  </div>
  );
  },
  