diff --git a/CHANGELOG.md b/CHANGELOG.md
index a74351aa69..1196b05599 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,16 @@
+Changes in [0.12.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.2) (2018-04-12)
+=====================================================================================================
+[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.1...v0.12.2)
+
+ * Null check stylesheet href
+ [\#1835](https://github.com/matrix-org/matrix-react-sdk/pull/1835)
+ * Remove the presence management labs feature
+
Changes in [0.12.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.1) (2018-04-11)
=====================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.12.0...v0.12.1)
+ * Use correct js-sdk version
Changes in [0.12.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.12.0) (2018-04-11)
=====================================================================================================
diff --git a/package.json b/package.json
index 211fbb52c6..9ca8a293cd 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "matrix-react-sdk",
- "version": "0.12.1",
+ "version": "0.12.2",
"description": "SDK for matrix.org using React",
"author": "matrix.org",
"repository": {
@@ -72,7 +72,7 @@
"isomorphic-fetch": "^2.2.1",
"linkifyjs": "^2.1.3",
"lodash": "^4.13.1",
- "matrix-js-sdk": "0.10.0",
+ "matrix-js-sdk": "0.10.1",
"optimist": "^0.6.1",
"prop-types": "^15.5.8",
"querystring": "^0.2.0",
diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js
index 99841c986e..9d86a62de4 100644
--- a/src/MatrixClientPeg.js
+++ b/src/MatrixClientPeg.js
@@ -98,7 +98,6 @@ class MatrixClientPeg {
const opts = utils.deepCopy(this.opts);
// the react sdk doesn't work without this, so don't allow
opts.pendingEventOrdering = "detached";
- opts.disablePresence = true; // we do this manually
try {
const promise = this.matrixClient.store.startup();
diff --git a/src/Presence.js b/src/Presence.js
index fd9bcf516d..9367fe35cd 100644
--- a/src/Presence.js
+++ b/src/Presence.js
@@ -57,27 +57,13 @@ class Presence {
return this.state;
}
- /**
- * Get the current status message.
- * @returns {String} the status message, may be null
- */
- getStatusMessage() {
- return this.statusMessage;
- }
-
/**
* Set the presence state.
* If the state has changed, the Home Server will be notified.
* @param {string} newState the new presence state (see PRESENCE enum)
- * @param {String} statusMessage an optional status message for the presence
- * @param {boolean} maintain true to have this status maintained by this tracker
*/
- setState(newState, statusMessage=null, maintain=false) {
- if (this.maintain) {
- // Don't update presence if we're maintaining a particular status
- return;
- }
- if (newState === this.state && statusMessage === this.statusMessage) {
+ setState(newState) {
+ if (newState === this.state) {
return;
}
if (PRESENCE_STATES.indexOf(newState) === -1) {
@@ -87,37 +73,21 @@ class Presence {
return;
}
const old_state = this.state;
- const old_message = this.statusMessage;
this.state = newState;
- this.statusMessage = statusMessage;
- this.maintain = maintain;
if (MatrixClientPeg.get().isGuest()) {
return; // don't try to set presence when a guest; it won't work.
}
- const updateContent = {
- presence: this.state,
- status_msg: this.statusMessage ? this.statusMessage : '',
- };
-
const self = this;
- MatrixClientPeg.get().setPresence(updateContent).done(function() {
+ MatrixClientPeg.get().setPresence(this.state).done(function() {
console.log("Presence: %s", newState);
-
- // We have to dispatch because the js-sdk is unreliable at telling us about our own presence
- dis.dispatch({action: "self_presence_updated", statusInfo: updateContent});
}, function(err) {
console.error("Failed to set presence: %s", err);
self.state = old_state;
- self.statusMessage = old_message;
});
}
- stopMaintainingStatus() {
- this.maintain = false;
- }
-
/**
* Callback called when the user made no action on the page for UNAVAILABLE_TIME ms.
* @private
diff --git a/src/Velociraptor.js b/src/Velociraptor.js
index af4e6dcb60..6a4666305c 100644
--- a/src/Velociraptor.js
+++ b/src/Velociraptor.js
@@ -147,7 +147,7 @@ module.exports = React.createClass({
// creating/destroying large numbers of elements"
// (https://github.com/julianshapiro/velocity/issues/47)
const domNode = ReactDom.findDOMNode(this.nodes[k]);
- Velocity.Utilities.removeData(domNode);
+ if (domNode) Velocity.Utilities.removeData(domNode);
}
this.nodes[k] = node;
},
diff --git a/src/components/views/avatars/MemberPresenceAvatar.js b/src/components/views/avatars/MemberPresenceAvatar.js
deleted file mode 100644
index aa6def00ae..0000000000
--- a/src/components/views/avatars/MemberPresenceAvatar.js
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- Copyright 2017 Travis Ralston
-
- 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';
-
-import React from "react";
-import PropTypes from 'prop-types';
-import * as sdk from "../../../index";
-import MatrixClientPeg from "../../../MatrixClientPeg";
-import AccessibleButton from '../elements/AccessibleButton';
-import Presence from "../../../Presence";
-import dispatcher from "../../../dispatcher";
-import * as ContextualMenu from "../../structures/ContextualMenu";
-import SettingsStore from "../../../settings/SettingsStore";
-
-// This is an avatar with presence information and controls on it.
-module.exports = React.createClass({
- displayName: 'MemberPresenceAvatar',
-
- propTypes: {
- member: PropTypes.object.isRequired,
- width: PropTypes.number,
- height: PropTypes.number,
- resizeMethod: PropTypes.string,
- },
-
- getDefaultProps: function() {
- return {
- width: 40,
- height: 40,
- resizeMethod: 'crop',
- };
- },
-
- getInitialState: function() {
- let presenceState = null;
- let presenceMessage = null;
-
- // RoomMembers do not necessarily have a user.
- if (this.props.member.user) {
- presenceState = this.props.member.user.presence;
- presenceMessage = this.props.member.user.presenceStatusMsg;
- }
-
- return {
- status: presenceState,
- message: presenceMessage,
- };
- },
-
- componentWillMount: function() {
- MatrixClientPeg.get().on("User.presence", this.onUserPresence);
- this.dispatcherRef = dispatcher.register(this.onAction);
- },
-
- componentWillUnmount: function() {
- if (MatrixClientPeg.get()) {
- MatrixClientPeg.get().removeListener("User.presence", this.onUserPresence);
- }
- dispatcher.unregister(this.dispatcherRef);
- },
-
- onAction: function(payload) {
- if (payload.action !== "self_presence_updated") return;
- if (this.props.member.userId !== MatrixClientPeg.get().getUserId()) return;
- this.setState({
- status: payload.statusInfo.presence,
- message: payload.statusInfo.status_msg,
- });
- },
-
- onUserPresence: function(event, user) {
- if (user.userId !== MatrixClientPeg.get().getUserId()) return;
- this.setState({
- status: user.presence,
- message: user.presenceStatusMsg,
- });
- },
-
- onStatusChange: function(newStatus) {
- Presence.stopMaintainingStatus();
- if (newStatus === "online") {
- Presence.setState(newStatus);
- } else Presence.setState(newStatus, null, true);
- },
-
- onClick: function(e) {
- const PresenceContextMenu = sdk.getComponent('context_menus.PresenceContextMenu');
- const elementRect = e.target.getBoundingClientRect();
-
- // The window X and Y offsets are to adjust position when zoomed in to page
- const x = (elementRect.left + window.pageXOffset) - (elementRect.width / 2) + 3;
- const chevronOffset = 12;
- let y = elementRect.top + (elementRect.height / 2) + window.pageYOffset;
- y = y - (chevronOffset + 4); // where 4 is 1/4 the height of the chevron
-
- ContextualMenu.createMenu(PresenceContextMenu, {
- chevronOffset: chevronOffset,
- chevronFace: 'bottom',
- left: x,
- top: y,
- menuWidth: 125,
- currentStatus: this.state.status,
- onChange: this.onStatusChange,
- });
-
- e.stopPropagation();
-
- // XXX NB the following assumes that user is non-null, which is not valid
- // const presenceState = this.props.member.user.presence;
- // const presenceLastActiveAgo = this.props.member.user.lastActiveAgo;
- // const presenceLastTs = this.props.member.user.lastPresenceTs;
- // const presenceCurrentlyActive = this.props.member.user.currentlyActive;
- // const presenceMessage = this.props.member.user.presenceStatusMsg;
- },
-
- render: function() {
- const MemberAvatar = sdk.getComponent("avatars.MemberAvatar");
-
- let onClickFn = null;
- if (this.props.member.userId === MatrixClientPeg.get().getUserId()) {
- onClickFn = this.onClick;
- }
-
- const avatarNode = (
-