Something starting to resemble a Matrix Client

This commit is contained in:
David Baker 2015-06-12 17:34:17 +01:00
parent 2f6a123118
commit 125fa78bc6
15 changed files with 148 additions and 21 deletions

View File

@ -0,0 +1,6 @@
.mx_RoomHeader {
background-color: #eee;
font-weight: bold;
height: 1em;
padding: 5px;
}

View File

@ -5,6 +5,17 @@
margin-top: 1px; margin-top: 1px;
margin-bottom: 1px; margin-bottom: 1px;
padding: 5px; padding: 5px;
cursor: pointer;
border: 2px solid white;
transition: background-color 0.1s ease;
}
.mx_RoomTile.selected {
border: 2px inset #eee;
}
.mx_RoomTile:hover {
background-color: #aad;
} }
.mx_RoomTile_name { .mx_RoomTile_name {

View File

@ -1,3 +1,8 @@
.mx_RoomList {
display: table-row;
}
.mx_RoomList ul { .mx_RoomList ul {
padding: 0px; padding: 0px;
margin: 0px;
} }

View File

@ -0,0 +1,9 @@
.mx_RoomView {
display: table-cell;
padding-left: 5px;
width: 100%;
}
.mx_RoomView ul {
padding: 0px;
}

3
css/pages/MatrixChat.css Normal file
View File

@ -0,0 +1,3 @@
.mx_MatrixChat_leftPanel {
display: table-cell;
}

View File

@ -18,10 +18,11 @@
"start": "parallelshell 'npm run start:js' 'npm run start:css'" "start": "parallelshell 'npm run start:js' 'npm run start:css'"
}, },
"dependencies": { "dependencies": {
"react-loader": "^1.4.0", "classnames": "^2.1.2",
"flux": "^2.0.3", "flux": "^2.0.3",
"matrix-js-sdk": "0.0.4", "matrix-js-sdk": "0.0.4",
"react": "^0.13.0" "react": "^0.13.0",
"react-loader": "^1.4.0"
}, },
"devDependencies": { "devDependencies": {
"catw": "^1.0.1", "catw": "^1.0.1",

19
src/atoms/LogoutButton.js Normal file
View File

@ -0,0 +1,19 @@
var React = require('react');
var mxCliPeg = require("../MatrixClientPeg");
var dis = require("../dispatcher");
module.exports = React.createClass({
onClick: function() {
dis.dispatch({
action: 'logout'
});
},
render: function() {
return (
<button className="mx_LogoutButton" onClick={this.onClick}>Sign out</button>
);
}
});

View File

@ -0,0 +1,14 @@
var React = require('react');
var LogoutButton = require("../atoms/LogoutButton");
module.exports = React.createClass({
render: function() {
return (
<div className="mx_MatrixToolbar">
<LogoutButton />
</div>
);
}
});

View File

@ -0,0 +1,13 @@
var React = require('react');
module.exports = React.createClass({
render: function() {
//{this.props.mxEvent.getContent().body}
return (
<div className="mx_MessageTile">
{JSON.stringify(this.props.mxEvent.getContent())}
</div>
);
},
});

View File

@ -3,8 +3,8 @@ var React = require('react');
module.exports = React.createClass({ module.exports = React.createClass({
render: function() { render: function() {
return ( return (
<div> <div className="mx_RoomHeader">
{this.props.event.content.body} {this.props.room.name}
</div> </div>
); );
}, },

View File

@ -1,9 +1,23 @@
var React = require('react'); var React = require('react');
var classNames = require('classnames');
var dis = require("../dispatcher");
module.exports = React.createClass({ module.exports = React.createClass({
onClick: function() {
dis.dispatch({
action: 'view_room',
room_id: this.props.room.roomId
});
},
render: function() { render: function() {
var classes = classNames({
'mx_RoomTile': true,
'selected': this.props.selected
});
return ( return (
<div className="mx_RoomTile"> <div className={classes} onClick={this.onClick}>
<div className="mx_RoomTile_name">{this.props.room.name}</div> <div className="mx_RoomTile_name">{this.props.room.name}</div>
</div> </div>
); );

View File

@ -12,9 +12,11 @@ module.exports = React.createClass({
}, },
makeRoomTiles: function() { makeRoomTiles: function() {
var that = this;
return this.state.roomList.map(function(room) { return this.state.roomList.map(function(room) {
var selected = room.roomId == that.props.selectedRoom;
return ( return (
<RoomTile room={room} key={room.roomId} /> <RoomTile room={room} key={room.roomId} selected={selected} />
); );
}); });
}, },

View File

@ -1,23 +1,30 @@
var React = require('react'); var React = require('react');
var Message = require('../molecules/Message'); var MessageTile = require('../molecules/MessageTile');
var RoomHeader = require('../molecules/RoomHeader');
var MatrixClientPeg = require("../MatrixClientPeg");
module.exports = React.createClass({ module.exports = React.createClass({
getInitialState: function() { getInitialState: function() {
return { return {
messages: [ { foo: "bar"} ] room: MatrixClientPeg.get().getRoom(this.props.room_id)
} }
}, },
render: function() { getMessageTiles: function() {
/*var messageItems = this.state.messages.map(function(ev) { return this.state.room.timeline.map(function(mxEv) {
return ( return (
<Message ev={ev} /> <MessageTile mxEvent={mxEv} key={mxEv.getId()} />
); );
});*/ });
},
render: function() {
return ( return (
//{messageItems} <div className="mx_RoomView">
<div> <RoomHeader room={this.state.room} />
<ul className="message-list" ref="messageList"> <ul>
{this.getMessageTiles()}
</ul> </ul>
</div> </div>
); );

View File

@ -2,13 +2,14 @@ var React = require('react');
var RoomList = require('../organisms/RoomList'); var RoomList = require('../organisms/RoomList');
var RoomView = require('../organisms/RoomView'); var RoomView = require('../organisms/RoomView');
var MatrixToolbar = require('../molecules/MatrixToolbar');
var Loader = require("react-loader"); var Loader = require("react-loader");
var Login = require('../templates/Login'); var Login = require('../templates/Login');
var mxCliPeg = require("../MatrixClientPeg"); var mxCliPeg = require("../MatrixClientPeg");
//var dis = require("../dispatcher"); var dis = require("../dispatcher");
module.exports = React.createClass({ module.exports = React.createClass({
getInitialState: function() { getInitialState: function() {
@ -19,11 +20,28 @@ module.exports = React.createClass({
}, },
componentDidMount: function() { componentDidMount: function() {
this.dispatcherRef = dis.register(this.onAction);
if (this.state.logged_in) { if (this.state.logged_in) {
this.startMatrixClient(); this.startMatrixClient();
} }
}, },
componentWillUnmount: function() {
dis.unregister(this.dispatcherRef);
},
onAction: function(payload) {
switch (payload.action) {
case 'logout':
mxCliPeg.replace(null);
this.setState({
logged_in: false,
ready: false
});
break;
}
},
onLoggedIn: function() { onLoggedIn: function() {
this.setState({logged_in: true}); this.setState({logged_in: true});
this.startMatrixClient(); this.startMatrixClient();
@ -33,7 +51,11 @@ module.exports = React.createClass({
var cli = mxCliPeg.get(); var cli = mxCliPeg.get();
var that = this; var that = this;
cli.on('syncComplete', function() { cli.on('syncComplete', function() {
that.setState({ready: true}); var firstRoom = null;
if (cli.getRooms() && cli.getRooms().length) {
firstRoom = cli.getRooms()[0].roomId;
}
that.setState({ready: true, currentRoom: firstRoom});
}); });
cli.startClient(); cli.startClient();
}, },
@ -42,8 +64,11 @@ module.exports = React.createClass({
if (this.state.logged_in && this.state.ready) { if (this.state.logged_in && this.state.ready) {
return ( return (
<div> <div>
<RoomList /> <div className="mx_MatrixChat_leftPanel">
<RoomView /> <MatrixToolbar />
<RoomList selectedRoom={this.state.currentRoom} />
</div>
<RoomView room_id={this.state.currentRoom} />
</div> </div>
); );
} else if (this.state.logged_in) { } else if (this.state.logged_in) {

View File

@ -6,8 +6,6 @@ var ServerConfig = require("../molecules/ServerConfig");
var ProgressBar = require("../molecules/ProgressBar"); var ProgressBar = require("../molecules/ProgressBar");
var Loader = require("react-loader"); var Loader = require("react-loader");
//var dis = require("../dispatcher");
module.exports = React.createClass({ module.exports = React.createClass({
getInitialState: function() { getInitialState: function() {
return { return {