From 8f5f71ec801d18981bf220fa11e7cb956d2455ac Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Mon, 30 Nov 2015 18:10:09 +0000 Subject: [PATCH] Move MatrixChat to react-sdk. Move all login stuff to react SDK. Removed Modulator stuff. --- src/DateUtils.js | 45 ---- src/{modules => }/VectorConferenceHandler.js | 0 src/components/structures/login/Login.js | 199 -------------- .../structures/login/PostRegistration.js | 81 ------ .../structures/login/Registration.js | 247 ------------------ src/components/views/elements/ImageView.js | 2 +- .../views/login/RegistrationForm.js | 126 --------- src/components/views/login/ServerConfig.js | 161 ------------ .../views/messages/MessageTimestamp.js | 2 +- src/skins/vector/skindex.js | 4 +- src/skins/vector/views/organisms/LeftPanel.js | 2 +- src/skins/vector/views/pages/MatrixChat.js | 229 ---------------- src/vector/index.js | 14 +- 13 files changed, 16 insertions(+), 1096 deletions(-) delete mode 100644 src/DateUtils.js rename src/{modules => }/VectorConferenceHandler.js (100%) delete mode 100644 src/components/structures/login/Login.js delete mode 100644 src/components/structures/login/PostRegistration.js delete mode 100644 src/components/structures/login/Registration.js delete mode 100644 src/components/views/login/RegistrationForm.js delete mode 100644 src/components/views/login/ServerConfig.js delete mode 100644 src/skins/vector/views/pages/MatrixChat.js diff --git a/src/DateUtils.js b/src/DateUtils.js deleted file mode 100644 index fe363586..00000000 --- a/src/DateUtils.js +++ /dev/null @@ -1,45 +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 days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; -var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - -module.exports = { - formatDate: function(date) { - // date.toLocaleTimeString is completely system dependent. - // just go 24h for now - function pad(n) { - return (n < 10 ? '0' : '') + n; - } - - var now = new Date(); - if (date.toDateString() === now.toDateString()) { - return pad(date.getHours()) + ':' + pad(date.getMinutes()); - } - else if (now.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) { - return days[date.getDay()] + " " + pad(date.getHours()) + ':' + pad(date.getMinutes()); - } - else if (now.getFullYear() === date.getFullYear()) { - return days[date.getDay()] + ", " + months[date.getMonth()] + " " + (date.getDay()+1) + " " + pad(date.getHours()) + ':' + pad(date.getMinutes()); - } - else { - return days[date.getDay()] + ", " + months[date.getMonth()] + " " + (date.getDay()+1) + " " + date.getFullYear() + " " + pad(date.getHours()) + ':' + pad(date.getMinutes()); - } - } -} - diff --git a/src/modules/VectorConferenceHandler.js b/src/VectorConferenceHandler.js similarity index 100% rename from src/modules/VectorConferenceHandler.js rename to src/VectorConferenceHandler.js diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js deleted file mode 100644 index bcf0656f..00000000 --- a/src/components/structures/login/Login.js +++ /dev/null @@ -1,199 +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 sdk = require('matrix-react-sdk'); -var Signup = require("matrix-react-sdk/lib/Signup"); -var PasswordLogin = require("matrix-react-sdk/lib/components/views/login/PasswordLogin"); -var CasLogin = require("matrix-react-sdk/lib/components/views/login/CasLogin"); -var ServerConfig = require("../../views/login/ServerConfig"); - -/** - * A wire component which glues together login UI components and Signup logic - */ -module.exports = React.createClass({displayName: 'Login', - propTypes: { - onLoggedIn: React.PropTypes.func.isRequired, - homeserverUrl: React.PropTypes.string, - identityServerUrl: React.PropTypes.string, - // login shouldn't know or care how registration is done. - onRegisterClick: React.PropTypes.func.isRequired - }, - - getDefaultProps: function() { - return { - homeserverUrl: 'https://matrix.org/', - identityServerUrl: 'https://vector.im' - }; - }, - - getInitialState: function() { - return { - busy: false, - errorText: null, - enteredHomeserverUrl: this.props.homeserverUrl, - enteredIdentityServerUrl: this.props.identityServerUrl - }; - }, - - componentWillMount: function() { - this._initLoginLogic(); - }, - - onPasswordLogin: function(username, password) { - var self = this; - self.setState({ - busy: true - }); - - this._loginLogic.loginViaPassword(username, password).then(function(data) { - self.props.onLoggedIn(data); - }, function(error) { - self._setErrorTextFromError(error); - }).finally(function() { - self.setState({ - busy: false - }); - }); - }, - - onHsUrlChanged: function(newHsUrl) { - this._initLoginLogic(newHsUrl); - }, - - onIsUrlChanged: function(newIsUrl) { - this._initLoginLogic(null, newIsUrl); - }, - - _initLoginLogic: function(hsUrl, isUrl) { - var self = this; - hsUrl = hsUrl || this.state.enteredHomeserverUrl; - isUrl = isUrl || this.state.enteredIdentityServerUrl; - - var loginLogic = new Signup.Login(hsUrl, isUrl); - this._loginLogic = loginLogic; - - loginLogic.getFlows().then(function(flows) { - // old behaviour was to always use the first flow without presenting - // options. This works in most cases (we don't have a UI for multiple - // logins so let's skip that for now). - loginLogic.chooseFlow(0); - }, function(err) { - self._setErrorTextFromError(err); - }).finally(function() { - self.setState({ - busy: false - }); - }); - - this.setState({ - enteredHomeserverUrl: hsUrl, - enteredIdentityServerUrl: isUrl, - busy: true, - errorText: null // reset err messages - }); - }, - - _getCurrentFlowStep: function() { - return this._loginLogic ? this._loginLogic.getCurrentFlowStep() : null - }, - - _setErrorTextFromError: function(err) { - if (err.friendlyText) { - this.setState({ - errorText: err.friendlyText - }); - return; - } - - var errCode = err.errcode; - if (!errCode && err.httpStatus) { - errCode = "HTTP " + err.httpStatus; - } - this.setState({ - errorText: ( - "Error: Problem communicating with the given homeserver " + - (errCode ? "(" + errCode + ")" : "") - ) - }); - }, - - componentForStep: function(step) { - switch (step) { - case 'm.login.password': - return ( - - ); - case 'm.login.cas': - return ( - - ); - default: - if (!step) { - return; - } - return ( -
- Sorry, this homeserver is using a login which is not - recognised by Vector ({step}) -
- ); - } - }, - - render: function() { - var Loader = sdk.getComponent("elements.Spinner"); - var loader = this.state.busy ?
: null; - - return ( -
-
-
- vector -
-
-

Sign in

- { this.componentForStep(this._getCurrentFlowStep()) } - -
- { loader } - { this.state.errorText } -
- - Create a new account - -
-
- blog  ·   - twitter  ·   - github  ·   - powered by Matrix -
-
-
-
- ); - } -}); diff --git a/src/components/structures/login/PostRegistration.js b/src/components/structures/login/PostRegistration.js deleted file mode 100644 index 28fab4c1..00000000 --- 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 ( -
-
-
- vector -
-
- 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 0475dff9..00000000 --- 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. -
- ); - break; - case "Register.STEP_m.login.recaptcha": - registerStep = ( - - ); - break; - default: - console.error("Unknown register state: %s", currStep); - break; - } - var busySpinner; - if (this.state.busy) { - var Spinner = sdk.getComponent("elements.Spinner"); - busySpinner = ( - - ); - } - return ( -
-

Create an account

- {registerStep} -
{this.state.errorText}
- {busySpinner} - - - I already have an account - -
- ); - }, - - render: function() { - return ( -
-
-
- vector -
- {this._getRegisterContentJsx()} -
-
- ); - } -}); diff --git a/src/components/views/elements/ImageView.js b/src/components/views/elements/ImageView.js index ab427de0..2025cec2 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({ diff --git a/src/components/views/login/RegistrationForm.js b/src/components/views/login/RegistrationForm.js deleted file mode 100644 index 3f9fb6ae..00000000 --- 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 ( -
-
- {emailSection} -
- -
- -
- -
- {registerButton} -
-
- ); - } -}); diff --git a/src/components/views/login/ServerConfig.js b/src/components/views/login/ServerConfig.js deleted file mode 100644 index 2efed6b4..00000000 --- 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('dialogs.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 = ( -
- - -
- ); - } - - return ( -
- {toggleButton} -
-
- - - - - - What does this mean? - -
-
-
- ); - } -}); diff --git a/src/components/views/messages/MessageTimestamp.js b/src/components/views/messages/MessageTimestamp.js index a7289ca5..b4b7546e 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/skins/vector/skindex.js b/src/skins/vector/skindex.js index cba3b2f7..53e94ebc 100644 --- a/src/skins/vector/skindex.js +++ b/src/skins/vector/skindex.js @@ -76,8 +76,9 @@ skin['dialogs.LogoutPrompt'] = require('matrix-react-sdk/lib/components/views/di skin['structures.CreateRoom'] = require('matrix-react-sdk/lib/components/structures/CreateRoom'); skin['structures.UserSettings'] = require('matrix-react-sdk/lib/components/structures/UserSettings'); skin['structures.RoomView'] = require('matrix-react-sdk/lib/components/structures/RoomView'); +skin['structures.MatrixChat'] = require('matrix-react-sdk/lib/components/structures/MatrixChat'); -// Old style stuff +// Old style stuff - this stuff only exists in VECTOR skin['molecules.BottomLeftMenu'] = require('./views/molecules/BottomLeftMenu'); skin['molecules.BottomLeftMenuTile'] = require('./views/molecules/BottomLeftMenuTile'); skin['molecules.DateSeparator'] = require('./views/molecules/DateSeparator'); @@ -94,6 +95,5 @@ skin['organisms.RoomDirectory'] = require('./views/organisms/RoomDirectory'); skin['organisms.RoomSubList'] = require('./views/organisms/RoomSubList'); skin['organisms.ViewSource'] = require('./views/organisms/ViewSource'); skin['pages.CompatibilityPage'] = require('./views/pages/CompatibilityPage'); -skin['pages.MatrixChat'] = require('./views/pages/MatrixChat'); module.exports = skin; diff --git a/src/skins/vector/views/organisms/LeftPanel.js b/src/skins/vector/views/organisms/LeftPanel.js index 2d4f8571..88688ab1 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({ diff --git a/src/skins/vector/views/pages/MatrixChat.js b/src/skins/vector/views/pages/MatrixChat.js deleted file mode 100644 index 6526a83a..00000000 --- a/src/skins/vector/views/pages/MatrixChat.js +++ /dev/null @@ -1,229 +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 VectorConferenceHandler = require('../../../../modules/VectorConferenceHandler'); -var MatrixChatController = require('matrix-react-sdk/lib/controllers/pages/MatrixChat') - -var dis = require('matrix-react-sdk/lib/dispatcher'); -var Matrix = require("matrix-js-sdk"); - -var Notifier = require("matrix-react-sdk/lib/Notifier"); -var ContextualMenu = require("matrix-react-sdk/lib/ContextualMenu"); -var Login = require("../../../../components/structures/login/Login"); -var Registration = require("../../../../components/structures/login/Registration"); -var PostRegistration = require("../../../../components/structures/login/PostRegistration"); -var config = require("../../../../../config.json"); - -module.exports = React.createClass({ - displayName: 'MatrixChat', - mixins: [MatrixChatController], - - getInitialState: function() { - return { - width: 10000, - } - }, - - componentDidMount: function() { - window.addEventListener('resize', this.handleResize); - this.handleResize(); - }, - - componentWillUnmount: function() { - window.removeEventListener('resize', this.handleResize); - }, - - onAliasClick: function(event, alias) { - event.preventDefault(); - dis.dispatch({action: 'view_room_alias', room_alias: alias}); - }, - - onUserClick: function(event, userId) { - event.preventDefault(); - var MemberInfo = sdk.getComponent('rooms.MemberInfo'); - var member = new Matrix.RoomMember(null, userId); - ContextualMenu.createMenu(MemberInfo, { - member: member, - right: window.innerWidth - event.pageX, - top: event.pageY - }); - }, - - onLogoutClick: function(event) { - dis.dispatch({ - action: 'logout' - }); - event.stopPropagation(); - event.preventDefault(); - }, - - handleResize: function(e) { - var hideLhsThreshold = 1000; - var showLhsThreshold = 1000; - var hideRhsThreshold = 820; - var showRhsThreshold = 820; - - if (this.state.width > hideLhsThreshold && window.innerWidth <= hideLhsThreshold) { - dis.dispatch({ action: 'hide_left_panel' }); - } - if (this.state.width <= showLhsThreshold && window.innerWidth > showLhsThreshold) { - dis.dispatch({ action: 'show_left_panel' }); - } - if (this.state.width > hideRhsThreshold && window.innerWidth <= hideRhsThreshold) { - dis.dispatch({ action: 'hide_right_panel' }); - } - if (this.state.width <= showRhsThreshold && window.innerWidth > showRhsThreshold) { - dis.dispatch({ action: 'show_right_panel' }); - } - - this.setState({width: window.innerWidth}); - }, - - onRoomCreated: function(room_id) { - dis.dispatch({ - action: "view_room", - room_id: room_id, - }); - }, - - onRegisterClick: function() { - this.showScreen("register"); - }, - - onLoginClick: function() { - this.showScreen("login"); - }, - - onRegistered: function(credentials) { - this.onLoggedIn(credentials); - // do post-registration stuff - this.showScreen("post_registration"); - }, - - onFinishPostRegistration: function() { - // Don't confuse this with "PageType" which is the middle window to show - this.setState({ - screen: undefined - }); - this.showScreen("settings"); - }, - - render: function() { - var LeftPanel = sdk.getComponent('organisms.LeftPanel'); - var RoomView = sdk.getComponent('structures.RoomView'); - var RightPanel = sdk.getComponent('organisms.RightPanel'); - var UserSettings = sdk.getComponent('structures.UserSettings'); - var CreateRoom = sdk.getComponent('structures.CreateRoom'); - var RoomDirectory = sdk.getComponent('organisms.RoomDirectory'); - var MatrixToolbar = sdk.getComponent('molecules.MatrixToolbar'); - - // needs to be before normal PageTypes as you are logged in technically - if (this.state.screen == 'post_registration') { - return ( - - ); - } - else if (this.state.logged_in && this.state.ready) { - var page_element; - var right_panel = ""; - - switch (this.state.page_type) { - case this.PageTypes.RoomView: - page_element = ( - - ); - right_panel = - break; - case this.PageTypes.UserSettings: - page_element = - right_panel = - break; - case this.PageTypes.CreateRoom: - page_element = - right_panel = - break; - case this.PageTypes.RoomDirectory: - page_element = - right_panel = - break; - } - - // TODO: Fix duplication here and do conditionals like we do above - if (Notifier.supportsDesktopNotifications() && !Notifier.isEnabled() && !Notifier.isToolbarHidden()) { - return ( -
- -
- -
- {page_element} -
- {right_panel} -
-
- ); - } - else { - return ( -
- -
- {page_element} -
- {right_panel} -
- ); - } - } else if (this.state.logged_in) { - var Spinner = sdk.getComponent('elements.Spinner'); - return ( -
- - Logout -
- ); - } else if (this.state.screen == 'register') { - return ( - - ); - } else { - return ( - - ); - } - } -}); \ No newline at end of file diff --git a/src/vector/index.js b/src/vector/index.js index 87cbd0b6..082c5e11 100644 --- a/src/vector/index.js +++ b/src/vector/index.js @@ -21,12 +21,16 @@ var React = require("react"); var ReactDOM = require("react-dom"); var sdk = require("matrix-react-sdk"); sdk.loadSkin(require('../skins/vector/skindex')); -sdk.loadModule(require('../modules/VectorConferenceHandler')); +var VectorConferenceHandler = require('../VectorConferenceHandler'); +var configJson = require("../../config.json"); var qs = require("querystring"); var lastLocationHashSet = null; +var CallHandler = require("matrix-react-sdk/lib/CallHandler"); +CallHandler.setConferenceHandler(VectorConferenceHandler); + function checkBrowserFeatures(featureList) { if (!window.Modernizr) { console.error("Cannot check features - Modernizr global is missing."); @@ -136,9 +140,13 @@ window.onload = function() { function loadApp() { if (validBrowser) { - var MatrixChat = sdk.getComponent('pages.MatrixChat'); + var MatrixChat = sdk.getComponent('structures.MatrixChat'); window.matrixChat = ReactDOM.render( - , + , document.getElementById('matrixchat') ); }