Merge pull request #536 from matrix-org/rav/add_client_to_context

Add the MatrixClient to the react context
pull/21833/head
David Baker 2016-11-04 10:54:11 +00:00 committed by GitHub
commit 0ab46df94a
2 changed files with 54 additions and 0 deletions

View File

@ -28,6 +28,8 @@ import sdk from '../../index';
* *
* Currently it's very tightly coupled with MatrixChat. We should try to do * Currently it's very tightly coupled with MatrixChat. We should try to do
* something about that. * something about that.
*
* Components mounted below us can access the matrix client via the react context.
*/ */
export default React.createClass({ export default React.createClass({
displayName: 'LoggedInView', displayName: 'LoggedInView',
@ -42,7 +44,20 @@ export default React.createClass({
// and lots and lots of other stuff. // and lots and lots of other stuff.
}, },
childContextTypes: {
matrixClient: React.PropTypes.instanceOf(Matrix.MatrixClient),
},
getChildContext: function() {
return {
matrixClient: this._matrixClient,
};
},
componentWillMount: function() { componentWillMount: function() {
// stash the MatrixClient in case we log out before we are unmounted
this._matrixClient = this.props.matrixClient;
// _scrollStateMap is a map from room id to the scroll state returned by // _scrollStateMap is a map from room id to the scroll state returned by
// RoomView.getScrollState() // RoomView.getScrollState()
this._scrollStateMap = {}; this._scrollStateMap = {};

View File

@ -0,0 +1,39 @@
/*
Copyright 2015, 2016 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.
*/
import * as Matrix from 'matrix-js-sdk';
import React from 'react';
/**
* Wraps a react class, pulling the MatrixClient from the context and adding it
* as a 'matrixClient' property instead.
*
* This abstracts the use of the context API, so that we can use a different
* mechanism in future.
*/
export default function(WrappedComponent) {
return React.createClass({
displayName: "MatrixClient<" + WrappedComponent.displayName + ">",
contextTypes: {
matrixClient: React.PropTypes.instanceOf(Matrix.MatrixClient).isRequired,
},
render: function() {
return <WrappedComponent {...this.props} matrixClient={this.context.matrixClient} />;
},
});
};