- );
- }
-});
diff --git a/src/components/structures/login/PostRegistration.js b/src/components/structures/login/PostRegistration.js
deleted file mode 100644
index 28fab4c161..0000000000
--- a/src/components/structures/login/PostRegistration.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
-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 sdk = require('matrix-react-sdk');
-var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
-
-module.exports = React.createClass({
- displayName: 'PostRegistration',
-
- propTypes: {
- onComplete: React.PropTypes.func.isRequired
- },
-
- getInitialState: function() {
- return {
- avatarUrl: null,
- errorString: null,
- busy: false
- };
- },
-
- componentWillMount: function() {
- // There is some assymetry between ChangeDisplayName and ChangeAvatar,
- // as ChangeDisplayName will auto-get the name but ChangeAvatar expects
- // the URL to be passed to you (because it's also used for room avatars).
- var cli = MatrixClientPeg.get();
- this.setState({busy: true});
- var self = this;
- cli.getProfileInfo(cli.credentials.userId).done(function(result) {
- self.setState({
- avatarUrl: MatrixClientPeg.get().mxcUrlToHttp(result.avatar_url),
- busy: false
- });
- }, function(error) {
- self.setState({
- errorString: "Failed to fetch avatar URL",
- busy: false
- });
- });
- },
-
- render: function() {
- var ChangeDisplayName = sdk.getComponent('settings.ChangeDisplayName');
- var ChangeAvatar = sdk.getComponent('settings.ChangeAvatar');
- return (
-
-
-
-
-
-
- Set a display name:
-
- Upload an avatar:
-
-
- {this.state.errorString}
-
-
-
- );
- }
-});
diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js
deleted file mode 100644
index 0475dff9aa..0000000000
--- a/src/components/structures/login/Registration.js
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
-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 sdk = require('matrix-react-sdk');
-var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
-var dis = require('matrix-react-sdk/lib/dispatcher');
-var ServerConfig = require("../../views/login/ServerConfig");
-var RegistrationForm = require("../../views/login/RegistrationForm");
-var CaptchaForm = require("matrix-react-sdk/lib/components/views/login/CaptchaForm");
-var Signup = require("matrix-react-sdk/lib/Signup");
-var MIN_PASSWORD_LENGTH = 6;
-
-module.exports = React.createClass({
- displayName: 'Registration',
-
- propTypes: {
- onLoggedIn: React.PropTypes.func.isRequired,
- clientSecret: React.PropTypes.string,
- sessionId: React.PropTypes.string,
- registrationUrl: React.PropTypes.string,
- idSid: React.PropTypes.string,
- hsUrl: React.PropTypes.string,
- isUrl: React.PropTypes.string,
- // registration shouldn't know or care how login is done.
- onLoginClick: React.PropTypes.func.isRequired
- },
-
- getInitialState: function() {
- return {
- busy: false,
- errorText: null,
- enteredHomeserverUrl: this.props.hsUrl,
- enteredIdentityServerUrl: this.props.isUrl
- };
- },
-
- componentWillMount: function() {
- this.dispatcherRef = dis.register(this.onAction);
- // attach this to the instance rather than this.state since it isn't UI
- this.registerLogic = new Signup.Register(
- this.props.hsUrl, this.props.isUrl
- );
- this.registerLogic.setClientSecret(this.props.clientSecret);
- this.registerLogic.setSessionId(this.props.sessionId);
- this.registerLogic.setRegistrationUrl(this.props.registrationUrl);
- this.registerLogic.setIdSid(this.props.idSid);
- this.registerLogic.recheckState();
- },
-
- componentWillUnmount: function() {
- dis.unregister(this.dispatcherRef);
- },
-
- componentDidMount: function() {
- // may have already done an HTTP hit (e.g. redirect from an email) so
- // check for any pending response
- var promise = this.registerLogic.getPromise();
- if (promise) {
- this.onProcessingRegistration(promise);
- }
- },
-
- onHsUrlChanged: function(newHsUrl) {
- this.registerLogic.setHomeserverUrl(newHsUrl);
- },
-
- onIsUrlChanged: function(newIsUrl) {
- this.registerLogic.setIdentityServerUrl(newIsUrl);
- },
-
- onAction: function(payload) {
- if (payload.action !== "registration_step_update") {
- return;
- }
- this.forceUpdate(); // registration state has changed.
- },
-
- onFormSubmit: function(formVals) {
- var self = this;
- this.setState({
- errorText: "",
- busy: true
- });
- this.onProcessingRegistration(this.registerLogic.register(formVals));
- },
-
- // Promise is resolved when the registration process is FULLY COMPLETE
- onProcessingRegistration: function(promise) {
- var self = this;
- promise.done(function(response) {
- if (!response || !response.access_token) {
- console.warn(
- "FIXME: Register fulfilled without a final response, " +
- "did you break the promise chain?"
- );
- // no matter, we'll grab it direct
- response = self.registerLogic.getCredentials();
- }
- if (!response || !response.user_id || !response.access_token) {
- console.error("Final response is missing keys.");
- self.setState({
- errorText: "There was a problem processing the response."
- });
- return;
- }
- self.props.onLoggedIn({
- userId: response.user_id,
- homeserverUrl: self.registerLogic.getHomeserverUrl(),
- identityServerUrl: self.registerLogic.getIdentityServerUrl(),
- accessToken: response.access_token
- });
- self.setState({
- busy: false
- });
- }, function(err) {
- if (err.message) {
- self.setState({
- errorText: err.message
- });
- }
- self.setState({
- busy: false
- });
- console.log(err);
- });
- },
-
- onFormValidationFailed: function(errCode) {
- var errMsg;
- switch (errCode) {
- case "RegistrationForm.ERR_PASSWORD_MISSING":
- errMsg = "Missing password.";
- break;
- case "RegistrationForm.ERR_PASSWORD_MISMATCH":
- errMsg = "Passwords don't match.";
- break;
- case "RegistrationForm.ERR_PASSWORD_LENGTH":
- errMsg = `Password too short (min ${MIN_PASSWORD_LENGTH}).`;
- break;
- default:
- console.error("Unknown error code: %s", errCode);
- errMsg = "An unknown error occurred.";
- break;
- }
- this.setState({
- errorText: errMsg
- });
- },
-
- onCaptchaLoaded: function(divIdName) {
- this.registerLogic.tellStage("m.login.recaptcha", {
- divId: divIdName
- });
- this.setState({
- busy: false // requires user input
- });
- },
-
- _getRegisterContentJsx: function() {
- var currStep = this.registerLogic.getStep();
- var registerStep;
- switch (currStep) {
- case "Register.COMPLETE":
- break; // NOP
- case "Register.START":
- case "Register.STEP_m.login.dummy":
- registerStep = (
-
- );
- break;
- case "Register.STEP_m.login.email.identity":
- registerStep = (
-
- Please check your email to continue registration.
-
- );
- }
-});
diff --git a/src/components/views/elements/ImageView.js b/src/components/views/elements/ImageView.js
index f068c74e5b..2025cec291 100644
--- a/src/components/views/elements/ImageView.js
+++ b/src/components/views/elements/ImageView.js
@@ -20,7 +20,7 @@ var React = require('react');
var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
-var DateUtils = require('../../../DateUtils');
+var DateUtils = require('matrix-react-sdk/lib/DateUtils');
var filesize = require('filesize');
module.exports = React.createClass({
@@ -55,7 +55,7 @@ module.exports = React.createClass({
).done(function() {
if (self.props.onFinished) self.props.onFinished();
}, function(e) {
- var ErrorDialog = sdk.getComponent("organisms.ErrorDialog");
+ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
// display error message stating you couldn't delete this.
var code = e.errcode || e.statusCode;
Modal.createDialog(ErrorDialog, {
diff --git a/src/components/views/login/RegistrationForm.js b/src/components/views/login/RegistrationForm.js
deleted file mode 100644
index 3f9fb6ae12..0000000000
--- a/src/components/views/login/RegistrationForm.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
-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 sdk = require('matrix-react-sdk')
-
-/**
- * A pure UI component which displays a registration form.
- */
-module.exports = React.createClass({
- displayName: 'RegistrationForm',
-
- propTypes: {
- defaultEmail: React.PropTypes.string,
- defaultUsername: React.PropTypes.string,
- showEmail: React.PropTypes.bool,
- minPasswordLength: React.PropTypes.number,
- onError: React.PropTypes.func,
- onRegisterClick: React.PropTypes.func // onRegisterClick(Object) => ?Promise
- },
-
- getDefaultProps: function() {
- return {
- showEmail: false,
- minPasswordLength: 6,
- onError: function(e) {
- console.error(e);
- }
- };
- },
-
- getInitialState: function() {
- return {
- email: this.props.defaultEmail,
- username: this.props.defaultUsername,
- password: null,
- passwordConfirm: null
- };
- },
-
- onSubmit: function(ev) {
- ev.preventDefault();
-
- var pwd1 = this.refs.password.value.trim();
- var pwd2 = this.refs.passwordConfirm.value.trim()
-
- var errCode;
- if (!pwd1 || !pwd2) {
- errCode = "RegistrationForm.ERR_PASSWORD_MISSING";
- }
- else if (pwd1 !== pwd2) {
- errCode = "RegistrationForm.ERR_PASSWORD_MISMATCH";
- }
- else if (pwd1.length < this.props.minPasswordLength) {
- errCode = "RegistrationForm.ERR_PASSWORD_LENGTH";
- }
- if (errCode) {
- this.props.onError(errCode);
- return;
- }
-
- var promise = this.props.onRegisterClick({
- username: this.refs.username.value.trim(),
- password: pwd1,
- email: this.refs.email.value.trim()
- });
-
- if (promise) {
- ev.target.disabled = true;
- promise.finally(function() {
- ev.target.disabled = false;
- });
- }
- },
-
- render: function() {
- var emailSection, registerButton;
- if (this.props.showEmail) {
- emailSection = (
-
- );
- }
- if (this.props.onRegisterClick) {
- registerButton = (
-
- );
- }
-
- return (
-
-
-
- );
- }
-});
diff --git a/src/components/views/login/ServerConfig.js b/src/components/views/login/ServerConfig.js
deleted file mode 100644
index 8f1eab3846..0000000000
--- a/src/components/views/login/ServerConfig.js
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
-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 Modal = require('matrix-react-sdk/lib/Modal');
-var sdk = require('matrix-react-sdk')
-
-/**
- * A pure UI component which displays the HS and IS to use.
- */
-module.exports = React.createClass({
- displayName: 'ServerConfig',
-
- propTypes: {
- onHsUrlChanged: React.PropTypes.func,
- onIsUrlChanged: React.PropTypes.func,
- defaultHsUrl: React.PropTypes.string,
- defaultIsUrl: React.PropTypes.string,
- withToggleButton: React.PropTypes.bool,
- delayTimeMs: React.PropTypes.number // time to wait before invoking onChanged
- },
-
- getDefaultProps: function() {
- return {
- onHsUrlChanged: function() {},
- onIsUrlChanged: function() {},
- withToggleButton: false,
- delayTimeMs: 0
- };
- },
-
- getInitialState: function() {
- return {
- hs_url: this.props.defaultHsUrl,
- is_url: this.props.defaultIsUrl,
- original_hs_url: this.props.defaultHsUrl,
- original_is_url: this.props.defaultIsUrl,
- // no toggle button = show, toggle button = hide
- configVisible: !this.props.withToggleButton
- }
- },
-
- onHomeserverChanged: function(ev) {
- this.setState({hs_url: ev.target.value}, function() {
- this._hsTimeoutId = this._waitThenInvoke(this._hsTimeoutId, function() {
- this.props.onHsUrlChanged(this.state.hs_url);
- });
- });
- },
-
- onIdentityServerChanged: function(ev) {
- this.setState({is_url: ev.target.value}, function() {
- this._isTimeoutId = this._waitThenInvoke(this._isTimeoutId, function() {
- this.props.onIsUrlChanged(this.state.is_url);
- });
- });
- },
-
- _waitThenInvoke: function(existingTimeoutId, fn) {
- if (existingTimeoutId) {
- clearTimeout(existingTimeoutId);
- }
- return setTimeout(fn.bind(this), this.props.delayTimeMs);
- },
-
- getHsUrl: function() {
- return this.state.hs_url;
- },
-
- getIsUrl: function() {
- return this.state.is_url;
- },
-
- onServerConfigVisibleChange: function(ev) {
- this.setState({
- configVisible: ev.target.checked
- });
- },
-
- showHelpPopup: function() {
- var ErrorDialog = sdk.getComponent('organisms.ErrorDialog');
- Modal.createDialog(ErrorDialog, {
- title: 'Custom Server Options',
- description:
- You can use the custom server options to log into other Matrix
- servers by specifying a different Home server URL.
-
- This allows you to use Vector with an existing Matrix account on
- a different Home server.
-
-
- You can also set a custom Identity server but this will affect
- people's ability to find you if you use a server in a group other
- than the main Matrix.org group.
- ,
- button: "Dismiss",
- focus: true
- });
- },
-
- render: function() {
- var serverConfigStyle = {};
- serverConfigStyle.display = this.state.configVisible ? 'block' : 'none';
-
- var toggleButton;
- if (this.props.withToggleButton) {
- toggleButton = (
-
- );
- }
-});
diff --git a/src/components/views/messages/MessageTimestamp.js b/src/components/views/messages/MessageTimestamp.js
index a7289ca5b8..b4b7546e50 100644
--- a/src/components/views/messages/MessageTimestamp.js
+++ b/src/components/views/messages/MessageTimestamp.js
@@ -17,7 +17,7 @@ limitations under the License.
'use strict';
var React = require('react');
-var DateUtils = require('../../../DateUtils');
+var DateUtils = require('matrix-react-sdk/lib/DateUtils');
module.exports = React.createClass({
displayName: 'MessageTimestamp',
diff --git a/src/components/views/rooms/RoomDNDView.js b/src/components/views/rooms/RoomDNDView.js
index f096723f7f..0bae6e70b5 100644
--- a/src/components/views/rooms/RoomDNDView.js
+++ b/src/components/views/rooms/RoomDNDView.js
@@ -77,7 +77,7 @@ var roomTileSource = {
MatrixClientPeg.get().deleteRoomTag(item.room.roomId, item.originalList.props.tagName).finally(function() {
//component.state.set({ spinner: component.state.spinner-- });
}).fail(function(err) {
- var ErrorDialog = sdk.getComponent("organisms.ErrorDialog");
+ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to remove tag " + item.originalList.props.tagName + " from room",
description: err.toString()
@@ -96,7 +96,7 @@ var roomTileSource = {
MatrixClientPeg.get().setRoomTag(item.room.roomId, item.targetList.props.tagName, newOrder).finally(function() {
//component.state.set({ spinner: component.state.spinner-- });
}).fail(function(err) {
- var ErrorDialog = sdk.getComponent("organisms.ErrorDialog");
+ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to add tag " + item.targetList.props.tagName + " to room",
description: err.toString()
diff --git a/src/controllers/organisms/RoomList.js b/src/controllers/organisms/RoomList.js
deleted file mode 100644
index 2a01527e78..0000000000
--- a/src/controllers/organisms/RoomList.js
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
-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 ReactDOM = require("react-dom");
-
-var MatrixClientPeg = require("matrix-react-sdk/lib/MatrixClientPeg");
-var RoomListSorter = require("matrix-react-sdk/lib/RoomListSorter");
-var dis = require("matrix-react-sdk/lib/dispatcher");
-
-var sdk = require('matrix-react-sdk');
-var VectorConferenceHandler = require("../../modules/VectorConferenceHandler");
-
-var HIDE_CONFERENCE_CHANS = true;
-
-module.exports = {
- getInitialState: function() {
- return {
- activityMap: null,
- lists: {},
- }
- },
-
- componentWillMount: function() {
- var cli = MatrixClientPeg.get();
- cli.on("Room", this.onRoom);
- cli.on("Room.timeline", this.onRoomTimeline);
- cli.on("Room.name", this.onRoomName);
- cli.on("Room.tags", this.onRoomTags);
- cli.on("RoomState.events", this.onRoomStateEvents);
- cli.on("RoomMember.name", this.onRoomMemberName);
-
- var s = this.getRoomLists();
- s.activityMap = {};
- this.setState(s);
- },
-
- componentDidMount: function() {
- this.dispatcherRef = dis.register(this.onAction);
- },
-
- onAction: function(payload) {
- switch (payload.action) {
- case 'view_tooltip':
- this.tooltip = payload.tooltip;
- this._repositionTooltip();
- if (this.tooltip) this.tooltip.style.display = 'block';
- break
- }
- },
-
- componentWillUnmount: function() {
- dis.unregister(this.dispatcherRef);
- if (MatrixClientPeg.get()) {
- MatrixClientPeg.get().removeListener("Room", this.onRoom);
- MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline);
- MatrixClientPeg.get().removeListener("Room.name", this.onRoomName);
- MatrixClientPeg.get().removeListener("RoomState.events", this.onRoomStateEvents);
- }
- },
-
- componentWillReceiveProps: function(newProps) {
- this.state.activityMap[newProps.selectedRoom] = undefined;
- this.setState({
- activityMap: this.state.activityMap
- });
- },
-
- onRoom: function(room) {
- this.refreshRoomList();
- },
-
- onRoomTimeline: function(ev, room, toStartOfTimeline) {
- if (toStartOfTimeline) return;
-
- var hl = 0;
- if (
- room.roomId != this.props.selectedRoom &&
- ev.getSender() != MatrixClientPeg.get().credentials.userId)
- {
- // don't mark rooms as unread for just member changes
- if (ev.getType() != "m.room.member") {
- hl = 1;
- }
-
- var actions = MatrixClientPeg.get().getPushActionsForEvent(ev);
- if (actions && actions.tweaks && actions.tweaks.highlight) {
- hl = 2;
- }
- }
-
- if (hl > 0) {
- var newState = this.getRoomLists();
-
- // obviously this won't deep copy but this shouldn't be necessary
- var amap = this.state.activityMap;
- amap[room.roomId] = Math.max(amap[room.roomId] || 0, hl);
-
- newState.activityMap = amap;
-
- this.setState(newState);
- }
- },
-
- onRoomName: function(room) {
- this.refreshRoomList();
- },
-
- onRoomTags: function(event, room) {
- this.refreshRoomList();
- },
-
- onRoomStateEvents: function(ev, state) {
- setTimeout(this.refreshRoomList, 0);
- },
-
- onRoomMemberName: function(ev, member) {
- setTimeout(this.refreshRoomList, 0);
- },
-
- refreshRoomList: function() {
- // TODO: rather than bluntly regenerating and re-sorting everything
- // every time we see any kind of room change from the JS SDK
- // we could do incremental updates on our copy of the state
- // based on the room which has actually changed. This would stop
- // us re-rendering all the sublists every time anything changes anywhere
- // in the state of the client.
- this.setState(this.getRoomLists());
- },
-
- getRoomLists: function() {
- var s = { lists: {} };
-
- s.lists["m.invite"] = [];
- s.lists["m.favourite"] = [];
- s.lists["m.recent"] = [];
- s.lists["m.lowpriority"] = [];
- s.lists["m.archived"] = [];
-
- MatrixClientPeg.get().getRooms().forEach(function(room) {
- var me = room.getMember(MatrixClientPeg.get().credentials.userId);
-
- if (me && me.membership == "invite") {
- s.lists["m.invite"].push(room);
- }
- else {
- var shouldShowRoom = (
- me && (me.membership == "join")
- );
-
- // hiding conf rooms only ever toggles shouldShowRoom to false
- if (shouldShowRoom && HIDE_CONFERENCE_CHANS) {
- // we want to hide the 1:1 conf<->user room and not the group chat
- var joinedMembers = room.getJoinedMembers();
- if (joinedMembers.length === 2) {
- var otherMember = joinedMembers.filter(function(m) {
- return m.userId !== me.userId
- })[0];
- if (VectorConferenceHandler.isConferenceUser(otherMember)) {
- // console.log("Hiding conference 1:1 room %s", room.roomId);
- shouldShowRoom = false;
- }
- }
- }
-
- if (shouldShowRoom) {
- var tagNames = Object.keys(room.tags);
- if (tagNames.length) {
- for (var i = 0; i < tagNames.length; i++) {
- var tagName = tagNames[i];
- s.lists[tagName] = s.lists[tagName] || [];
- s.lists[tagNames[i]].push(room);
- }
- }
- else {
- s.lists["m.recent"].push(room);
- }
- }
- }
- });
-
- //console.log("calculated new roomLists; m.recent = " + s.lists["m.recent"]);
-
- // we actually apply the sorting to this when receiving the prop in RoomSubLists.
-
- return s;
- },
-
- _repositionTooltip: function(e) {
- if (this.tooltip && this.tooltip.parentElement) {
- var scroll = ReactDOM.findDOMNode(this);
- this.tooltip.style.top = (scroll.parentElement.offsetTop + this.tooltip.parentElement.offsetTop - scroll.children[2].scrollTop) + "px";
- }
- },
-};
diff --git a/src/controllers/organisms/RoomView.js b/src/controllers/organisms/RoomView.js
deleted file mode 100644
index b091a872e8..0000000000
--- a/src/controllers/organisms/RoomView.js
+++ /dev/null
@@ -1,738 +0,0 @@
-/*
-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.
-*/
-
-var Matrix = require("matrix-js-sdk");
-var MatrixClientPeg = require("matrix-react-sdk/lib/MatrixClientPeg");
-var React = require("react");
-var ReactDOM = require("react-dom");
-var q = require("q");
-var ContentMessages = require("matrix-react-sdk/lib//ContentMessages");
-var WhoIsTyping = require("matrix-react-sdk/lib/WhoIsTyping");
-var Modal = require("matrix-react-sdk/lib/Modal");
-var sdk = require('matrix-react-sdk/lib/index');
-var CallHandler = require('matrix-react-sdk/lib/CallHandler');
-var VectorConferenceHandler = require('../../modules/VectorConferenceHandler');
-var Resend = require("../../Resend");
-
-var dis = require("matrix-react-sdk/lib/dispatcher");
-
-var PAGINATE_SIZE = 20;
-var INITIAL_SIZE = 20;
-
-module.exports = {
- getInitialState: function() {
- var room = this.props.roomId ? MatrixClientPeg.get().getRoom(this.props.roomId) : null;
- return {
- room: room,
- messageCap: INITIAL_SIZE,
- editingRoomSettings: false,
- uploadingRoomSettings: false,
- numUnreadMessages: 0,
- draggingFile: false,
- searching: false,
- searchResults: null,
- syncState: MatrixClientPeg.get().getSyncState(),
- hasUnsentMessages: this._hasUnsentMessages(room)
- }
- },
-
- componentWillMount: function() {
- this.dispatcherRef = dis.register(this.onAction);
- MatrixClientPeg.get().on("Room.timeline", this.onRoomTimeline);
- MatrixClientPeg.get().on("Room.name", this.onRoomName);
- MatrixClientPeg.get().on("Room.receipt", this.onRoomReceipt);
- MatrixClientPeg.get().on("RoomMember.typing", this.onRoomMemberTyping);
- MatrixClientPeg.get().on("RoomState.members", this.onRoomStateMember);
- MatrixClientPeg.get().on("sync", this.onSyncStateChange);
- this.atBottom = true;
- },
-
- componentWillUnmount: function() {
- if (this.refs.messagePanel) {
- var messagePanel = ReactDOM.findDOMNode(this.refs.messagePanel);
- messagePanel.removeEventListener('drop', this.onDrop);
- messagePanel.removeEventListener('dragover', this.onDragOver);
- messagePanel.removeEventListener('dragleave', this.onDragLeaveOrEnd);
- messagePanel.removeEventListener('dragend', this.onDragLeaveOrEnd);
- }
- dis.unregister(this.dispatcherRef);
- if (MatrixClientPeg.get()) {
- MatrixClientPeg.get().removeListener("Room.timeline", this.onRoomTimeline);
- MatrixClientPeg.get().removeListener("Room.name", this.onRoomName);
- MatrixClientPeg.get().removeListener("Room.receipt", this.onRoomReceipt);
- MatrixClientPeg.get().removeListener("RoomMember.typing", this.onRoomMemberTyping);
- MatrixClientPeg.get().removeListener("RoomState.members", this.onRoomStateMember);
- MatrixClientPeg.get().removeListener("sync", this.onSyncStateChange);
- }
- },
-
- onAction: function(payload) {
- switch (payload.action) {
- case 'message_send_failed':
- case 'message_sent':
- this.setState({
- hasUnsentMessages: this._hasUnsentMessages(this.state.room)
- });
- case 'message_resend_started':
- this.setState({
- room: MatrixClientPeg.get().getRoom(this.props.roomId)
- });
- this.forceUpdate();
- break;
- case 'notifier_enabled':
- this.forceUpdate();
- break;
- case 'call_state':
- if (CallHandler.getCallForRoom(this.props.roomId)) {
- // Call state has changed so we may be loading video elements
- // which will obscure the message log.
- // scroll to bottom
- var scrollNode = this._getScrollNode();
- if (scrollNode) {
- scrollNode.scrollTop = scrollNode.scrollHeight;
- }
- }
-
- // possibly remove the conf call notification if we're now in
- // the conf
- this._updateConfCallNotification();
- break;
- case 'user_activity':
- this.sendReadReceipt();
- break;
- }
- },
-
- _getScrollNode: function() {
- var panel = ReactDOM.findDOMNode(this.refs.messagePanel);
- if (!panel) return null;
-
- if (panel.classList.contains('gm-prevented')) {
- return panel;
- } else {
- return panel.children[2]; // XXX: Fragile!
- }
- },
-
- onSyncStateChange: function(state) {
- this.setState({
- syncState: state
- });
- },
-
- // MatrixRoom still showing the messages from the old room?
- // Set the key to the room_id. Sadly you can no longer get at
- // the key from inside the component, or we'd check this in code.
- /*componentWillReceiveProps: function(props) {
- },*/
-
- onRoomTimeline: function(ev, room, toStartOfTimeline) {
- if (!this.isMounted()) return;
-
- // ignore anything that comes in whilst paginating: we get one
- // event for each new matrix event so this would cause a huge
- // number of UI updates. Just update the UI when the paginate
- // call returns.
- if (this.state.paginating) return;
-
- // no point handling anything while we're waiting for the join to finish:
- // we'll only be showing a spinner.
- if (this.state.joining) return;
- if (room.roomId != this.props.roomId) return;
-
- var scrollNode = this._getScrollNode();
- if (scrollNode) {
- this.atBottom = (
- scrollNode.scrollHeight - scrollNode.scrollTop <=
- (scrollNode.clientHeight + 150) // 150?
- );
- }
-
- var currentUnread = this.state.numUnreadMessages;
- if (!toStartOfTimeline &&
- (ev.getSender() !== MatrixClientPeg.get().credentials.userId)) {
- // update unread count when scrolled up
- if (this.atBottom) {
- currentUnread = 0;
- }
- else {
- currentUnread += 1;
- }
- }
-
-
- this.setState({
- room: MatrixClientPeg.get().getRoom(this.props.roomId),
- numUnreadMessages: currentUnread
- });
-
- if (toStartOfTimeline && !this.state.paginating) {
- this.fillSpace();
- }
- },
-
- onRoomName: function(room) {
- if (room.roomId == this.props.roomId) {
- this.setState({
- room: room
- });
- }
- },
-
- onRoomReceipt: function(receiptEvent, room) {
- if (room.roomId == this.props.roomId) {
- this.forceUpdate();
- }
- },
-
- onRoomMemberTyping: function(ev, member) {
- this.forceUpdate();
- },
-
- onRoomStateMember: function(ev, state, member) {
- if (member.roomId !== this.props.roomId ||
- member.userId !== VectorConferenceHandler.getConferenceUserIdForRoom(member.roomId)) {
- return;
- }
- this._updateConfCallNotification();
- },
-
- _hasUnsentMessages: function(room) {
- return this._getUnsentMessages(room).length > 0;
- },
-
- _getUnsentMessages: function(room) {
- if (!room) { return []; }
- // TODO: It would be nice if the JS SDK provided nicer constant-time
- // constructs rather than O(N) (N=num msgs) on this.
- return room.timeline.filter(function(ev) {
- return ev.status === Matrix.EventStatus.NOT_SENT;
- });
- },
-
- _updateConfCallNotification: function() {
- var room = MatrixClientPeg.get().getRoom(this.props.roomId);
- if (!room) return;
- var confMember = room.getMember(
- VectorConferenceHandler.getConferenceUserIdForRoom(this.props.roomId)
- );
-
- if (!confMember) {
- return;
- }
- var confCall = VectorConferenceHandler.getConferenceCallForRoom(confMember.roomId);
-
- // A conf call notification should be displayed if there is an ongoing
- // conf call but this cilent isn't a part of it.
- this.setState({
- displayConfCallNotification: (
- (!confCall || confCall.call_state === "ended") &&
- confMember.membership === "join"
- )
- });
- },
-
- componentDidMount: function() {
- if (this.refs.messagePanel) {
- var messagePanel = ReactDOM.findDOMNode(this.refs.messagePanel);
-
- messagePanel.addEventListener('drop', this.onDrop);
- messagePanel.addEventListener('dragover', this.onDragOver);
- messagePanel.addEventListener('dragleave', this.onDragLeaveOrEnd);
- messagePanel.addEventListener('dragend', this.onDragLeaveOrEnd);
-
- var messageWrapperScroll = this._getScrollNode();
-
- messageWrapperScroll.scrollTop = messageWrapperScroll.scrollHeight;
-
- this.sendReadReceipt();
-
- this.fillSpace();
- }
-
- this._updateConfCallNotification();
- },
-
- componentDidUpdate: function() {
- if (!this.refs.messagePanel) return;
-
- var messageWrapperScroll = this._getScrollNode();
-
- if (this.state.paginating && !this.waiting_for_paginate) {
- var heightGained = messageWrapperScroll.scrollHeight - this.oldScrollHeight;
- messageWrapperScroll.scrollTop += heightGained;
- this.oldScrollHeight = undefined;
- if (!this.fillSpace()) {
- this.setState({paginating: false});
- }
- } else if (this.atBottom) {
- messageWrapperScroll.scrollTop = messageWrapperScroll.scrollHeight;
- if (this.state.numUnreadMessages !== 0) {
- this.setState({numUnreadMessages: 0});
- }
- }
- },
-
- fillSpace: function() {
- if (!this.refs.messagePanel) return;
- if (this.state.searchResults) return; // TODO: paginate search results
- var messageWrapperScroll = this._getScrollNode();
- if (messageWrapperScroll.scrollTop < messageWrapperScroll.clientHeight && this.state.room.oldState.paginationToken) {
- this.setState({paginating: true});
-
- this.oldScrollHeight = messageWrapperScroll.scrollHeight;
-
- if (this.state.messageCap < this.state.room.timeline.length) {
- this.waiting_for_paginate = false;
- var cap = Math.min(this.state.messageCap + PAGINATE_SIZE, this.state.room.timeline.length);
- this.setState({messageCap: cap, paginating: true});
- } else {
- this.waiting_for_paginate = true;
- var cap = this.state.messageCap + PAGINATE_SIZE;
- this.setState({messageCap: cap, paginating: true});
- var self = this;
- MatrixClientPeg.get().scrollback(this.state.room, PAGINATE_SIZE).finally(function() {
- self.waiting_for_paginate = false;
- if (self.isMounted()) {
- self.setState({
- room: MatrixClientPeg.get().getRoom(self.props.roomId)
- });
- }
- // wait and set paginating to false when the component updates
- });
- }
-
- return true;
- }
- return false;
- },
-
- onResendAllClick: function() {
- var eventsToResend = this._getUnsentMessages(this.state.room);
- eventsToResend.forEach(function(event) {
- Resend.resend(event);
- });
- },
-
- onJoinButtonClicked: function(ev) {
- var self = this;
- MatrixClientPeg.get().joinRoom(this.props.roomId).then(function() {
- self.setState({
- joining: false,
- room: MatrixClientPeg.get().getRoom(self.props.roomId)
- });
- }, function(error) {
- self.setState({
- joining: false,
- joinError: error
- });
- });
- this.setState({
- joining: true
- });
- },
-
- onMessageListScroll: function(ev) {
- if (this.refs.messagePanel) {
- var messageWrapperScroll = this._getScrollNode();
- var wasAtBottom = this.atBottom;
- this.atBottom = messageWrapperScroll.scrollHeight - messageWrapperScroll.scrollTop <= messageWrapperScroll.clientHeight + 1;
- if (this.atBottom && !wasAtBottom) {
- this.forceUpdate(); // remove unread msg count
- }
- }
- if (!this.state.paginating) this.fillSpace();
- },
-
- onDragOver: function(ev) {
- ev.stopPropagation();
- ev.preventDefault();
-
- ev.dataTransfer.dropEffect = 'none';
-
- var items = ev.dataTransfer.items;
- if (items.length == 1) {
- if (items[0].kind == 'file') {
- this.setState({ draggingFile : true });
- ev.dataTransfer.dropEffect = 'copy';
- }
- }
- },
-
- onDrop: function(ev) {
- ev.stopPropagation();
- ev.preventDefault();
- this.setState({ draggingFile : false });
- var files = ev.dataTransfer.files;
- if (files.length == 1) {
- this.uploadFile(files[0]);
- }
- },
-
- onDragLeaveOrEnd: function(ev) {
- ev.stopPropagation();
- ev.preventDefault();
- this.setState({ draggingFile : false });
- },
-
- uploadFile: function(file) {
- this.setState({
- upload: {
- fileName: file.name,
- uploadedBytes: 0,
- totalBytes: file.size
- }
- });
- var self = this;
- ContentMessages.sendContentToRoom(
- file, this.props.roomId, MatrixClientPeg.get()
- ).progress(function(ev) {
- //console.log("Upload: "+ev.loaded+" / "+ev.total);
- self.setState({
- upload: {
- fileName: file.name,
- uploadedBytes: ev.loaded,
- totalBytes: ev.total
- }
- });
- }).finally(function() {
- self.setState({
- upload: undefined
- });
- }).done(undefined, function(error) {
- var ErrorDialog = sdk.getComponent("organisms.ErrorDialog");
- Modal.createDialog(ErrorDialog, {
- title: "Failed to upload file",
- description: error.toString()
- });
- });
- },
-
- getWhoIsTypingString: function() {
- return WhoIsTyping.whoIsTypingString(this.state.room);
- },
-
- onSearch: function(term, scope) {
- var filter;
- if (scope === "Room") {
- filter = {
- // XXX: it's unintuitive that the filter for searching doesn't have the same shape as the v2 filter API :(
- rooms: [
- this.props.roomId
- ]
- };
- }
-
- var self = this;
- MatrixClientPeg.get().search({
- body: {
- search_categories: {
- room_events: {
- search_term: term,
- filter: filter,
- order_by: "recent",
- include_state: true,
- groupings: {
- group_by: [
- {
- key: "room_id"
- }
- ]
- },
- event_context: {
- before_limit: 1,
- after_limit: 1,
- include_profile: true,
- }
- }
- }
- }
- }).then(function(data) {
- // for debugging:
- // data.search_categories.room_events.highlights = ["hello", "everybody"];
-
- var highlights;
- if (data.search_categories.room_events.highlights &&
- data.search_categories.room_events.highlights.length > 0)
- {
- // postgres on synapse returns us precise details of the
- // strings which actually got matched for highlighting.
- // for overlapping highlights, favour longer (more specific) terms first
- highlights = data.search_categories.room_events.highlights
- .sort(function(a, b) { b.length - a.length });
- }
- else {
- // sqlite doesn't, so just try to highlight the literal search term
- highlights = [ term ];
- }
-
- self.setState({
- highlights: highlights,
- searchResults: data,
- searchScope: scope,
- });
- }, function(error) {
- var ErrorDialog = sdk.getComponent("organisms.ErrorDialog");
- Modal.createDialog(ErrorDialog, {
- title: "Search failed",
- description: error.toString()
- });
- });
- },
-
- getEventTiles: function() {
- var DateSeparator = sdk.getComponent('molecules.DateSeparator');
- var cli = MatrixClientPeg.get();
-
- var ret = [];
- var count = 0;
-
- var EventTile = sdk.getComponent('rooms.EventTile');
- var self = this;
-
- if (this.state.searchResults &&
- this.state.searchResults.search_categories.room_events.results &&
- this.state.searchResults.search_categories.room_events.groups)
- {
- // XXX: this dance is foul, due to the results API not directly returning sorted results
- var results = this.state.searchResults.search_categories.room_events.results;
- var roomIdGroups = this.state.searchResults.search_categories.room_events.groups.room_id;
-
- Object.keys(roomIdGroups)
- .sort(function(a, b) { roomIdGroups[a].order - roomIdGroups[b].order }) // WHY NOT RETURN AN ORDERED ARRAY?!?!?!
- .forEach(function(roomId)
- {
- // XXX: todo: merge overlapping results somehow?
- // XXX: why doesn't searching on name work?
- if (self.state.searchScope === 'All') {
- ret.push(
Room: { cli.getRoom(roomId).name }
);
- }
-
- var resultList = roomIdGroups[roomId].results.map(function(eventId) { return results[eventId]; });
- for (var i = resultList.length - 1; i >= 0; i--) {
- var ts1 = resultList[i].result.origin_server_ts;
- ret.push(
); // Rank: {resultList[i].rank}
- var mxEv = new Matrix.MatrixEvent(resultList[i].result);
- if (resultList[i].context.events_before[0]) {
- var mxEv2 = new Matrix.MatrixEvent(resultList[i].context.events_before[0]);
- if (EventTile.haveTileForEvent(mxEv2)) {
- ret.push(
);
- }
- if (resultList[i].context.events_after[0]) {
- var mxEv2 = new Matrix.MatrixEvent(resultList[i].context.events_after[0]);
- if (EventTile.haveTileForEvent(mxEv2)) {
- ret.push(
);
- }
- }
- }
- });
- return ret;
- }
-
- for (var i = this.state.room.timeline.length-1; i >= 0 && count < this.state.messageCap; --i) {
- var mxEv = this.state.room.timeline[i];
-
- if (!EventTile.haveTileForEvent(mxEv)) {
- continue;
- }
-
- var continuation = false;
- var last = false;
- var dateSeparator = null;
- if (i == this.state.room.timeline.length - 1) {
- last = true;
- }
- if (i > 0 && count < this.state.messageCap - 1) {
- if (this.state.room.timeline[i].sender &&
- this.state.room.timeline[i - 1].sender &&
- (this.state.room.timeline[i].sender.userId ===
- this.state.room.timeline[i - 1].sender.userId) &&
- (this.state.room.timeline[i].getType() ==
- this.state.room.timeline[i - 1].getType())
- )
- {
- continuation = true;
- }
-
- var ts0 = this.state.room.timeline[i - 1].getTs();
- var ts1 = this.state.room.timeline[i].getTs();
- if (new Date(ts0).toDateString() !== new Date(ts1).toDateString()) {
- dateSeparator =
;
- continuation = false;
- }
- }
-
- if (i === 1) { // n.b. 1, not 0, as the 0th event is an m.room.create and so doesn't show on the timeline
- var ts1 = this.state.room.timeline[i].getTs();
- dateSeparator =
- );
- }
- }
-});
diff --git a/src/skins/vector/views/organisms/ErrorDialog.js b/src/skins/vector/views/organisms/ErrorDialog.js
deleted file mode 100644
index 992ea05054..0000000000
--- a/src/skins/vector/views/organisms/ErrorDialog.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-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';
-
-/*
- * Usage:
- * Modal.createDialog(ErrorDialog, {
- * title: "some text", (default: "Error")
- * description: "some more text",
- * button: "Button Text",
- * onClose: someFunction,
- * focus: true|false (default: true)
- * });
- */
-
-var React = require('react');
-var ErrorDialogController = require('matrix-react-sdk/lib/controllers/organisms/ErrorDialog')
-
-module.exports = React.createClass({
- displayName: 'ErrorDialog',
- mixins: [ErrorDialogController],
-
- render: function() {
- return (
-
-
- {this.props.title}
-
-
- {this.props.description}
-
-
-
-
-
- );
- }
-});
diff --git a/src/skins/vector/views/organisms/LeftPanel.js b/src/skins/vector/views/organisms/LeftPanel.js
index c5af3c0f0d..88688ab157 100644
--- a/src/skins/vector/views/organisms/LeftPanel.js
+++ b/src/skins/vector/views/organisms/LeftPanel.js
@@ -22,7 +22,7 @@ var HTML5Backend = require('react-dnd-html5-backend');
var sdk = require('matrix-react-sdk')
var dis = require('matrix-react-sdk/lib/dispatcher');
-var VectorConferenceHandler = require('../../../../modules/VectorConferenceHandler');
+var VectorConferenceHandler = require('../../../../VectorConferenceHandler');
var CallHandler = require("matrix-react-sdk/lib/CallHandler");
var LeftPanel = React.createClass({
@@ -85,7 +85,7 @@ var LeftPanel = React.createClass({
},
render: function() {
- var RoomList = sdk.getComponent('organisms.RoomList');
+ var RoomList = sdk.getComponent('rooms.RoomList');
var BottomLeftMenu = sdk.getComponent('molecules.BottomLeftMenu');
var IncomingCallBox = sdk.getComponent('voip.IncomingCallBox');
@@ -114,7 +114,10 @@ var LeftPanel = React.createClass({
{ collapseButton }
{ callPreview }
-
+
);
diff --git a/src/skins/vector/views/organisms/LogoutPrompt.js b/src/skins/vector/views/organisms/LogoutPrompt.js
deleted file mode 100644
index 6e347a4ef7..0000000000
--- a/src/skins/vector/views/organisms/LogoutPrompt.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-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 LogoutPromptController = require('matrix-react-sdk/lib/controllers/organisms/LogoutPrompt')
-
-module.exports = React.createClass({
- displayName: 'LogoutPrompt',
- mixins: [LogoutPromptController],
-
- render: function() {
- return (
-
-
- Sign out?
-
-
-
-
-
-
- );
- },
-});
-
diff --git a/src/skins/vector/views/organisms/MemberList.js b/src/skins/vector/views/organisms/MemberList.js
deleted file mode 100644
index a51c134871..0000000000
--- a/src/skins/vector/views/organisms/MemberList.js
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
-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 classNames = require('classnames');
-
-var MemberListController = require('matrix-react-sdk/lib/controllers/organisms/MemberList')
-var GeminiScrollbar = require('react-gemini-scrollbar');
-
-var sdk = require('matrix-react-sdk')
-
-
-module.exports = React.createClass({
- displayName: 'MemberList',
- mixins: [MemberListController],
-
- getInitialState: function() {
- },
-
- memberSort: function(userIdA, userIdB) {
- var userA = this.memberDict[userIdA].user;
- var userB = this.memberDict[userIdB].user;
-
- var presenceMap = {
- online: 3,
- unavailable: 2,
- offline: 1
- };
-
- var presenceOrdA = userA ? presenceMap[userA.presence] : 0;
- var presenceOrdB = userB ? presenceMap[userB.presence] : 0;
-
- if (presenceOrdA != presenceOrdB) {
- return presenceOrdB - presenceOrdA;
- }
-
- var latA = userA ? (userA.lastPresenceTs - (userA.lastActiveAgo || userA.lastPresenceTs)) : 0;
- var latB = userB ? (userB.lastPresenceTs - (userB.lastActiveAgo || userB.lastPresenceTs)) : 0;
-
- return latB - latA;
- },
-
- makeMemberTiles: function(membership) {
- var MemberTile = sdk.getComponent("rooms.MemberTile");
-
- var self = this;
- return self.state.members.filter(function(userId) {
- var m = self.memberDict[userId];
- return m.membership == membership;
- }).map(function(userId) {
- var m = self.memberDict[userId];
- return (
-
- );
- });
- },
-
- onPopulateInvite: function(e) {
- this.onInvite(this.refs.invite.value);
- e.preventDefault();
- },
-
- inviteTile: function() {
- if (this.state.inviting) {
- var Loader = sdk.getComponent("elements.Spinner");
- return (
-
- );
- } else {
- return (
-
- );
- }
- },
-
- render: function() {
- var invitedSection = null;
- var invitedMemberTiles = this.makeMemberTiles('invite');
- if (invitedMemberTiles.length > 0) {
- invitedSection = (
-
-
Invited
-
- {invitedMemberTiles}
-
-
- );
- }
- return (
-
-
- {this.inviteTile()}
-
-
- {this.makeMemberTiles('join')}
-
-
- {invitedSection}
-
-
- );
- }
-});
-
diff --git a/src/skins/vector/views/organisms/QuestionDialog.js b/src/skins/vector/views/organisms/QuestionDialog.js
deleted file mode 100644
index 3941b1f925..0000000000
--- a/src/skins/vector/views/organisms/QuestionDialog.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-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';
-
-/*
- * Usage:
- * Modal.createDialog(ErrorDialog, {
- * title: "some text", (default: "Error")
- * description: "some more text",
- * button: "Button Text",
- * onClose: someFunction,
- * focus: true|false (default: true)
- * });
- */
-
-var React = require('react');
-var QuestionDialogController = require('matrix-react-sdk/lib/controllers/organisms/QuestionDialog')
-
-module.exports = React.createClass({
- displayName: 'QuestionDialog',
- mixins: [QuestionDialogController],
-
- onOk: function() {
- this.props.onFinished(true);
- },
-
- onCancel: function() {
- this.props.onFinished(false);
- },
-
- render: function() {
- return (
-
-
- {this.props.title}
-
-
- {this.props.description}
-
-
-
-
-
-
-
- );
- }
-});
diff --git a/src/skins/vector/views/organisms/RightPanel.js b/src/skins/vector/views/organisms/RightPanel.js
index 943624e693..67d9ab7655 100644
--- a/src/skins/vector/views/organisms/RightPanel.js
+++ b/src/skins/vector/views/organisms/RightPanel.js
@@ -94,7 +94,7 @@ module.exports = React.createClass({
},
render: function() {
- var MemberList = sdk.getComponent('organisms.MemberList');
+ var MemberList = sdk.getComponent('rooms.MemberList');
var buttonGroup;
var panel;
diff --git a/src/skins/vector/views/organisms/RoomDirectory.js b/src/skins/vector/views/organisms/RoomDirectory.js
index 91cd69b5eb..c1a29779ca 100644
--- a/src/skins/vector/views/organisms/RoomDirectory.js
+++ b/src/skins/vector/views/organisms/RoomDirectory.js
@@ -40,7 +40,7 @@ module.exports = React.createClass({
if (err) {
self.setState({ loading: false });
console.error("Failed to get publicRooms: %s", JSON.stringify(err));
- var ErrorDialog = sdk.getComponent("organisms.ErrorDialog");
+ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to get public room list",
description: err.message
@@ -67,7 +67,7 @@ module.exports = React.createClass({
});
}, function(err) {
console.error("Failed to join room: %s", JSON.stringify(err));
- var ErrorDialog = sdk.getComponent("organisms.ErrorDialog");
+ var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
Modal.createDialog(ErrorDialog, {
title: "Failed to join room",
description: err.message
diff --git a/src/skins/vector/views/organisms/RoomList.js b/src/skins/vector/views/organisms/RoomList.js
deleted file mode 100644
index 018cc9b0db..0000000000
--- a/src/skins/vector/views/organisms/RoomList.js
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
-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 sdk = require('matrix-react-sdk')
-var dis = require('matrix-react-sdk/lib/dispatcher');
-
-var GeminiScrollbar = require('react-gemini-scrollbar');
-var RoomListController = require('../../../../controllers/organisms/RoomList')
-
-module.exports = React.createClass({
- displayName: 'RoomList',
- mixins: [RoomListController],
-
- onShowClick: function() {
- dis.dispatch({
- action: 'show_left_panel',
- });
- },
-
- render: function() {
- var expandButton = this.props.collapsed ?
- :
- null;
-
- var RoomSubList = sdk.getComponent('organisms.RoomSubList');
- var self = this;
-
- return (
-
-
- );
- } else {
- var inviteEvent = this.state.room.currentState.members[myUserId].events.member.event;
- // XXX: Leaving this intentionally basic for now because invites are about to change totally
- var joinErrorText = this.state.joinError ? "Failed to join room!" : "";
- var rejectErrorText = this.state.rejectError ? "Failed to reject invite!" : "";
- return (
-
- );
- } else {
- var typingString = this.getWhoIsTypingString();
- //typingString = "Testing typing...";
- var unreadMsgs = this.getUnreadMessagesString();
- // no conn bar trumps unread count since you can't get unread messages
- // without a connection! (technically may already have some but meh)
- // It also trumps the "some not sent" msg since you can't resend without
- // a connection!
- if (this.state.syncState === "ERROR") {
- statusBar = (
-
-
-
-
- Connectivity to the server has been lost.
-
-
- Sent messages will be stored until your connection has returned.
-
- );
- }
- // unread count trumps who is typing since the unread count is only
- // set when you've scrolled up
- else if (unreadMsgs) {
- statusBar = (
-
- );
- }
- },
-});
diff --git a/src/skins/vector/views/organisms/UserSettings.js b/src/skins/vector/views/organisms/UserSettings.js
deleted file mode 100644
index 091dfd259c..0000000000
--- a/src/skins/vector/views/organisms/UserSettings.js
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
-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 sdk = require('matrix-react-sdk')
-var MatrixClientPeg = require('matrix-react-sdk/lib/MatrixClientPeg');
-
-var UserSettingsController = require('matrix-react-sdk/lib/controllers/organisms/UserSettings')
-
-var Modal = require('matrix-react-sdk/lib/Modal');
-
-module.exports = React.createClass({
- displayName: 'UserSettings',
- mixins: [UserSettingsController],
-
- editAvatar: function() {
- var url = MatrixClientPeg.get().mxcUrlToHttp(this.state.avatarUrl);
- var ChangeAvatar = sdk.getComponent('settings.ChangeAvatar');
- var avatarDialog = (
-