diff --git a/src/CallHandler.js b/src/CallHandler.js index 8331d579df..a9539d40e1 100644 --- a/src/CallHandler.js +++ b/src/CallHandler.js @@ -63,23 +63,22 @@ import dis from './dispatcher'; global.mxCalls = { //room_id: MatrixCall }; -var calls = global.mxCalls; -var ConferenceHandler = null; +const calls = global.mxCalls; +let ConferenceHandler = null; -var audioPromises = {}; +const audioPromises = {}; function play(audioId) { // TODO: Attach an invisible element for this instead // which listens? - var audio = document.getElementById(audioId); + const audio = document.getElementById(audioId); if (audio) { if (audioPromises[audioId]) { audioPromises[audioId] = audioPromises[audioId].then(()=>{ audio.load(); return audio.play(); }); - } - else { + } else { audioPromises[audioId] = audio.play(); } } @@ -88,12 +87,11 @@ function play(audioId) { function pause(audioId) { // TODO: Attach an invisible element for this instead // which listens? - var audio = document.getElementById(audioId); + const audio = document.getElementById(audioId); if (audio) { if (audioPromises[audioId]) { audioPromises[audioId] = audioPromises[audioId].then(()=>audio.pause()); - } - else { + } else { // pause doesn't actually return a promise, but might as well do this for symmetry with play(); audioPromises[audioId] = audio.pause(); } @@ -125,38 +123,32 @@ function _setCallListeners(call) { if (newState === "ringing") { _setCallState(call, call.roomId, "ringing"); pause("ringbackAudio"); - } - else if (newState === "invite_sent") { + } else if (newState === "invite_sent") { _setCallState(call, call.roomId, "ringback"); play("ringbackAudio"); - } - else if (newState === "ended" && oldState === "connected") { + } else if (newState === "ended" && oldState === "connected") { _setCallState(undefined, call.roomId, "ended"); pause("ringbackAudio"); play("callendAudio"); - } - else if (newState === "ended" && oldState === "invite_sent" && + } else if (newState === "ended" && oldState === "invite_sent" && (call.hangupParty === "remote" || (call.hangupParty === "local" && call.hangupReason === "invite_timeout") )) { _setCallState(call, call.roomId, "busy"); pause("ringbackAudio"); play("busyAudio"); - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Call Handler', 'Call Timeout', ErrorDialog, { title: _t('Call Timeout'), description: _t('The remote side failed to pick up') + '.', }); - } - else if (oldState === "invite_sent") { + } else if (oldState === "invite_sent") { _setCallState(call, call.roomId, "stop_ringback"); pause("ringbackAudio"); - } - else if (oldState === "ringing") { + } else if (oldState === "ringing") { _setCallState(call, call.roomId, "stop_ringing"); pause("ringbackAudio"); - } - else if (newState === "connected") { + } else if (newState === "connected") { _setCallState(call, call.roomId, "connected"); pause("ringbackAudio"); } @@ -165,14 +157,13 @@ function _setCallListeners(call) { function _setCallState(call, roomId, status) { console.log( - "Call state in %s changed to %s (%s)", roomId, status, (call ? call.call_state : "-") + "Call state in %s changed to %s (%s)", roomId, status, (call ? call.call_state : "-"), ); calls[roomId] = call; if (status === "ringing") { play("ringAudio"); - } - else if (call && call.call_state === "ringing") { + } else if (call && call.call_state === "ringing") { pause("ringAudio"); } @@ -192,14 +183,12 @@ function _onAction(payload) { _setCallState(newCall, newCall.roomId, "ringback"); if (payload.type === 'voice') { newCall.placeVoiceCall(); - } - else if (payload.type === 'video') { + } else if (payload.type === 'video') { newCall.placeVideoCall( payload.remote_element, - payload.local_element + payload.local_element, ); - } - else if (payload.type === 'screensharing') { + } else if (payload.type === 'screensharing') { const screenCapErrorString = PlatformPeg.get().screenCaptureErrorString(); if (screenCapErrorString) { _setCallState(undefined, newCall.roomId, "ended"); @@ -213,10 +202,9 @@ function _onAction(payload) { } newCall.placeScreenSharingCall( payload.remote_element, - payload.local_element + payload.local_element, ); - } - else { + } else { console.error("Unknown conf call type: %s", payload.type); } } @@ -255,21 +243,19 @@ function _onAction(payload) { description: _t('You cannot place a call with yourself.'), }); return; - } - else if (members.length === 2) { + } else if (members.length === 2) { console.log("Place %s call in %s", payload.type, payload.room_id); const call = Matrix.createNewMatrixCall(MatrixClientPeg.get(), payload.room_id, { forceTURN: UserSettingsStore.getLocalSetting('webRtcForceTURN', false), }); placeCall(call); - } - else { // > 2 + } else { // > 2 dis.dispatch({ action: "place_conference_call", room_id: payload.room_id, type: payload.type, remote_element: payload.remote_element, - local_element: payload.local_element + local_element: payload.local_element, }); } break; @@ -280,15 +266,13 @@ function _onAction(payload) { Modal.createTrackedDialog('Call Handler', 'Conference call unsupported client', ErrorDialog, { description: _t('Conference calls are not supported in this client'), }); - } - else if (!MatrixClientPeg.get().supportsVoip()) { + } else if (!MatrixClientPeg.get().supportsVoip()) { const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Call Handler', 'VoIP is unsupported', ErrorDialog, { title: _t('VoIP is unsupported'), description: _t('You cannot place VoIP calls in this browser.'), }); - } - else if (MatrixClientPeg.get().isRoomEncrypted(payload.room_id)) { + } else if (MatrixClientPeg.get().isRoomEncrypted(payload.room_id)) { // Conference calls are implemented by sending the media to central // server which combines the audio from all the participants together // into a single stream. This is incompatible with end-to-end encryption @@ -299,16 +283,15 @@ function _onAction(payload) { Modal.createTrackedDialog('Call Handler', 'Conference calls unsupported e2e', ErrorDialog, { description: _t('Conference calls are not supported in encrypted rooms'), }); - } - else { - var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + } else { + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); Modal.createTrackedDialog('Call Handler', 'Conference calling in development', QuestionDialog, { title: _t('Warning!'), description: _t('Conference calling is in development and may not be reliable.'), - onFinished: confirm=>{ + onFinished: (confirm)=>{ if (confirm) { ConferenceHandler.createNewMatrixCall( - MatrixClientPeg.get(), payload.room_id + MatrixClientPeg.get(), payload.room_id, ).done(function(call) { placeCall(call); }, function(err) { @@ -357,7 +340,7 @@ function _onAction(payload) { _setCallState(calls[payload.room_id], payload.room_id, "connected"); dis.dispatch({ action: "view_room", - room_id: payload.room_id + room_id: payload.room_id, }); break; } @@ -368,9 +351,9 @@ if (!global.mxCallHandler) { dis.register(_onAction); } -var callHandler = { +const callHandler = { getCallForRoom: function(roomId) { - var call = module.exports.getCall(roomId); + let call = module.exports.getCall(roomId); if (call) return call; if (ConferenceHandler) { @@ -386,8 +369,8 @@ var callHandler = { }, getAnyActiveCall: function() { - var roomsWithCalls = Object.keys(calls); - for (var i = 0; i < roomsWithCalls.length; i++) { + const roomsWithCalls = Object.keys(calls); + for (let i = 0; i < roomsWithCalls.length; i++) { if (calls[roomsWithCalls[i]] && calls[roomsWithCalls[i]].call_state !== "ended") { return calls[roomsWithCalls[i]]; @@ -402,7 +385,7 @@ var callHandler = { getConferenceHandler: function() { return ConferenceHandler; - } + }, }; // Only things in here which actually need to be global are the // calls list (done separately) and making sure we only register diff --git a/src/ContentMessages.js b/src/ContentMessages.js index 93057fafed..00728061a2 100644 --- a/src/ContentMessages.js +++ b/src/ContentMessages.js @@ -17,14 +17,14 @@ limitations under the License. 'use strict'; import Promise from 'bluebird'; -var extend = require('./extend'); -var dis = require('./dispatcher'); -var MatrixClientPeg = require('./MatrixClientPeg'); -var sdk = require('./index'); +const extend = require('./extend'); +const dis = require('./dispatcher'); +const MatrixClientPeg = require('./MatrixClientPeg'); +const sdk = require('./index'); import { _t } from './languageHandler'; -var Modal = require('./Modal'); +const Modal = require('./Modal'); -var encrypt = require("browser-encrypt-attachment"); +const encrypt = require("browser-encrypt-attachment"); // Polyfill for Canvas.toBlob API using Canvas.toDataURL require("blueimp-canvas-to-blob"); @@ -54,8 +54,8 @@ const MAX_HEIGHT = 600; function createThumbnail(element, inputWidth, inputHeight, mimeType) { const deferred = Promise.defer(); - var targetWidth = inputWidth; - var targetHeight = inputHeight; + let targetWidth = inputWidth; + let targetHeight = inputHeight; if (targetHeight > MAX_HEIGHT) { targetWidth = Math.floor(targetWidth * (MAX_HEIGHT / targetHeight)); targetHeight = MAX_HEIGHT; @@ -81,7 +81,7 @@ function createThumbnail(element, inputWidth, inputHeight, mimeType) { w: inputWidth, h: inputHeight, }, - thumbnail: thumbnail + thumbnail: thumbnail, }); }, mimeType); @@ -129,12 +129,12 @@ function loadImageElement(imageFile) { * @return {Promise} A promise that resolves with the attachment info. */ function infoForImageFile(matrixClient, roomId, imageFile) { - var thumbnailType = "image/png"; + let thumbnailType = "image/png"; if (imageFile.type == "image/jpeg") { thumbnailType = "image/jpeg"; } - var imageInfo; + let imageInfo; return loadImageElement(imageFile).then(function(img) { return createThumbnail(img, img.width, img.height, thumbnailType); }).then(function(result) { @@ -191,7 +191,7 @@ function loadVideoElement(videoFile) { function infoForVideoFile(matrixClient, roomId, videoFile) { const thumbnailType = "image/jpeg"; - var videoInfo; + let videoInfo; return loadVideoElement(videoFile).then(function(video) { return createThumbnail(video, video.videoWidth, video.videoHeight, thumbnailType); }).then(function(result) { @@ -286,7 +286,7 @@ class ContentMessages { body: file.name || 'Attachment', info: { size: file.size, - } + }, }; // if we have a mime type for the file, add it to the message metadata @@ -297,10 +297,10 @@ class ContentMessages { const def = Promise.defer(); if (file.type.indexOf('image/') == 0) { content.msgtype = 'm.image'; - infoForImageFile(matrixClient, roomId, file).then(imageInfo=>{ + infoForImageFile(matrixClient, roomId, file).then((imageInfo)=>{ extend(content.info, imageInfo); def.resolve(); - }, error=>{ + }, (error)=>{ console.error(error); content.msgtype = 'm.file'; def.resolve(); @@ -310,10 +310,10 @@ class ContentMessages { def.resolve(); } else if (file.type.indexOf('video/') == 0) { content.msgtype = 'm.video'; - infoForVideoFile(matrixClient, roomId, file).then(videoInfo=>{ + infoForVideoFile(matrixClient, roomId, file).then((videoInfo)=>{ extend(content.info, videoInfo); def.resolve(); - }, error=>{ + }, (error)=>{ content.msgtype = 'm.file'; def.resolve(); }); @@ -331,7 +331,7 @@ class ContentMessages { this.inprogress.push(upload); dis.dispatch({action: 'upload_started'}); - var error; + let error; function onProgress(ev) { upload.total = ev.total; @@ -355,11 +355,11 @@ class ContentMessages { }, function(err) { error = err; if (!upload.canceled) { - var desc = _t('The file \'%(fileName)s\' failed to upload', {fileName: upload.fileName}) + '.'; + let desc = _t('The file \'%(fileName)s\' failed to upload', {fileName: upload.fileName}) + '.'; if (err.http_status == 413) { desc = _t('The file \'%(fileName)s\' exceeds this home server\'s size limit for uploads', {fileName: upload.fileName}); } - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Upload failed', '', ErrorDialog, { title: _t('Upload Failed'), description: desc, @@ -367,8 +367,8 @@ class ContentMessages { } }).finally(() => { const inprogressKeys = Object.keys(this.inprogress); - for (var i = 0; i < this.inprogress.length; ++i) { - var k = inprogressKeys[i]; + for (let i = 0; i < this.inprogress.length; ++i) { + const k = inprogressKeys[i]; if (this.inprogress[k].promise === upload.promise) { this.inprogress.splice(k, 1); break; @@ -376,8 +376,7 @@ class ContentMessages { } if (error) { dis.dispatch({action: 'upload_failed', upload: upload}); - } - else { + } else { dis.dispatch({action: 'upload_finished', upload: upload}); } }); @@ -389,9 +388,9 @@ class ContentMessages { cancelUpload(promise) { const inprogressKeys = Object.keys(this.inprogress); - var upload; - for (var i = 0; i < this.inprogress.length; ++i) { - var k = inprogressKeys[i]; + let upload; + for (let i = 0; i < this.inprogress.length; ++i) { + const k = inprogressKeys[i]; if (this.inprogress[k].promise === promise) { upload = this.inprogress[k]; break; diff --git a/src/HtmlUtils.js b/src/HtmlUtils.js index ee2bcd2b0f..5620bc06df 100644 --- a/src/HtmlUtils.js +++ b/src/HtmlUtils.js @@ -17,10 +17,10 @@ limitations under the License. 'use strict'; -var React = require('react'); -var sanitizeHtml = require('sanitize-html'); -var highlight = require('highlight.js'); -var linkifyMatrix = require('./linkify-matrix'); +const React = require('react'); +const sanitizeHtml = require('sanitize-html'); +const highlight = require('highlight.js'); +const linkifyMatrix = require('./linkify-matrix'); import escape from 'lodash/escape'; import emojione from 'emojione'; import classNames from 'classnames'; @@ -66,8 +66,7 @@ function unicodeToImage(str) { if ( (typeof unicodeChar === 'undefined') || (unicodeChar === '') || (!(unicodeChar in emojione.jsEscapeMap)) ) { // if the unicodeChar doesnt exist just return the entire match return unicodeChar; - } - else { + } else { // get the unicode codepoint from the actual char unicode = emojione.jsEscapeMap[unicodeChar]; @@ -183,21 +182,19 @@ const sanitizeHtmlParams = { if (attribs.href) { attribs.target = '_blank'; // by default - var m; + let m; // FIXME: horrible duplication with linkify-matrix m = attribs.href.match(linkifyMatrix.VECTOR_URL_PATTERN); if (m) { attribs.href = m[1]; delete attribs.target; - } - else { + } else { m = attribs.href.match(linkifyMatrix.MATRIXTO_URL_PATTERN); if (m) { - var entity = m[1]; + const entity = m[1]; if (entity[0] === '@') { attribs.href = '#/user/' + entity; - } - else if (entity[0] === '#' || entity[0] === '!') { + } else if (entity[0] === '#' || entity[0] === '!') { attribs.href = '#/room/' + entity; } delete attribs.target; @@ -205,7 +202,7 @@ const sanitizeHtmlParams = { } } attribs.rel = 'noopener'; // https://mathiasbynens.github.io/rel-noopener/ - return { tagName: tagName, attribs : attribs }; + return { tagName: tagName, attribs: attribs }; }, 'img': function(tagName, attribs) { // Strip out imgs that aren't `mxc` here instead of using allowedSchemesByTag @@ -224,7 +221,7 @@ const sanitizeHtmlParams = { 'code': function(tagName, attribs) { if (typeof attribs.class !== 'undefined') { // Filter out all classes other than ones starting with language- for syntax highlighting. - let classes = attribs.class.split(/\s+/).filter(function(cl) { + const classes = attribs.class.split(/\s+/).filter(function(cl) { return cl.startsWith('language-'); }); attribs.class = classes.join(' '); @@ -287,11 +284,11 @@ class BaseHighlighter { * TextHighlighter). */ applyHighlights(safeSnippet, safeHighlights) { - var lastOffset = 0; - var offset; - var nodes = []; + let lastOffset = 0; + let offset; + let nodes = []; - var safeHighlight = safeHighlights[0]; + const safeHighlight = safeHighlights[0]; while ((offset = safeSnippet.toLowerCase().indexOf(safeHighlight.toLowerCase(), lastOffset)) >= 0) { // handle preamble if (offset > lastOffset) { @@ -301,7 +298,7 @@ class BaseHighlighter { // do highlight. use the original string rather than safeHighlight // to preserve the original casing. - var endOffset = offset + safeHighlight.length; + const endOffset = offset + safeHighlight.length; nodes.push(this._processSnippet(safeSnippet.substring(offset, endOffset), true)); lastOffset = endOffset; @@ -319,8 +316,7 @@ class BaseHighlighter { if (safeHighlights[1]) { // recurse into this range to check for the next set of highlight matches return this.applyHighlights(safeSnippet, safeHighlights.slice(1)); - } - else { + } else { // no more highlights to be found, just return the unhighlighted string return [this._processSnippet(safeSnippet, false)]; } @@ -341,7 +337,7 @@ class HtmlHighlighter extends BaseHighlighter { return snippet; } - var span = "<span class=\""+this.highlightClass+"\">" + let span = "<span class=\""+this.highlightClass+"\">" + snippet + "</span>"; if (this.highlightLink) { @@ -366,15 +362,15 @@ class TextHighlighter extends BaseHighlighter { * returns a React node */ _processSnippet(snippet, highlight) { - var key = this._key++; + const key = this._key++; - var node = - <span key={key} className={highlight ? this.highlightClass : null }> + let node = + <span key={key} className={highlight ? this.highlightClass : null}> { snippet } </span>; if (highlight && this.highlightLink) { - node = <a key={key} href={this.highlightLink}>{node}</a>; + node = <a key={key} href={this.highlightLink}>{ node }</a>; } return node; @@ -393,20 +389,20 @@ class TextHighlighter extends BaseHighlighter { export function bodyToHtml(content, highlights, opts) { opts = opts || {}; - var isHtml = (content.format === "org.matrix.custom.html"); - let body = isHtml ? content.formatted_body : escape(content.body); + const isHtml = (content.format === "org.matrix.custom.html"); + const body = isHtml ? content.formatted_body : escape(content.body); let bodyHasEmoji = false; - var safeBody; + let safeBody; // XXX: We sanitize the HTML whilst also highlighting its text nodes, to avoid accidentally trying // to highlight HTML tags themselves. However, this does mean that we don't highlight textnodes which // are interrupted by HTML tags (not that we did before) - e.g. foo<span/>bar won't get highlighted // by an attempt to search for 'foobar'. Then again, the search query probably wouldn't work either try { if (highlights && highlights.length > 0) { - var highlighter = new HtmlHighlighter("mx_EventTile_searchHighlight", opts.highlightLink); - var safeHighlights = highlights.map(function(highlight) { + const highlighter = new HtmlHighlighter("mx_EventTile_searchHighlight", opts.highlightLink); + const safeHighlights = highlights.map(function(highlight) { return sanitizeHtml(highlight, sanitizeHtmlParams); }); // XXX: hacky bodge to temporarily apply a textFilter to the sanitizeHtmlParams structure. @@ -417,16 +413,15 @@ export function bodyToHtml(content, highlights, opts) { safeBody = sanitizeHtml(body, sanitizeHtmlParams); bodyHasEmoji = containsEmoji(body); if (bodyHasEmoji) safeBody = unicodeToImage(safeBody); - } - finally { + } finally { delete sanitizeHtmlParams.textFilter; } let emojiBody = false; if (bodyHasEmoji) { EMOJI_REGEX.lastIndex = 0; - let contentBodyTrimmed = content.body !== undefined ? content.body.trim() : ''; - let match = EMOJI_REGEX.exec(contentBodyTrimmed); + const contentBodyTrimmed = content.body !== undefined ? content.body.trim() : ''; + const match = EMOJI_REGEX.exec(contentBodyTrimmed); emojiBody = match && match[0] && match[0].length === contentBodyTrimmed.length; } diff --git a/src/ImageUtils.js b/src/ImageUtils.js index 3744241874..a83d94a633 100644 --- a/src/ImageUtils.js +++ b/src/ImageUtils.js @@ -42,13 +42,12 @@ module.exports = { // no scaling needs to be applied return fullHeight; } - var widthMulti = thumbWidth / fullWidth; - var heightMulti = thumbHeight / fullHeight; + const widthMulti = thumbWidth / fullWidth; + const heightMulti = thumbHeight / fullHeight; if (widthMulti < heightMulti) { // width is the dominant dimension so scaling will be fixed on that return Math.floor(widthMulti * fullHeight); - } - else { + } else { // height is the dominant dimension so scaling will be fixed on that return Math.floor(heightMulti * fullHeight); } diff --git a/src/Login.js b/src/Login.js index 049b79c2f4..0eff94ce60 100644 --- a/src/Login.js +++ b/src/Login.js @@ -59,8 +59,8 @@ export default class Login { } getFlows() { - var self = this; - var client = this._createTemporaryClient(); + const self = this; + const client = this._createTemporaryClient(); return client.loginFlows().then(function(result) { self._flows = result.flows; self._currentFlowIndex = 0; @@ -77,12 +77,12 @@ export default class Login { getCurrentFlowStep() { // technically the flow can have multiple steps, but no one does this // for login so we can ignore it. - var flowStep = this._flows[this._currentFlowIndex]; + const flowStep = this._flows[this._currentFlowIndex]; return flowStep ? flowStep.type : null; } loginAsGuest() { - var client = this._createTemporaryClient(); + const client = this._createTemporaryClient(); return client.registerGuest({ body: { initial_device_display_name: this._defaultDeviceDisplayName, @@ -94,7 +94,7 @@ export default class Login { accessToken: creds.access_token, homeserverUrl: this._hsUrl, identityServerUrl: this._isUrl, - guest: true + guest: true, }; }, (error) => { throw error; @@ -149,12 +149,12 @@ export default class Login { identityServerUrl: self._isUrl, userId: data.user_id, deviceId: data.device_id, - accessToken: data.access_token + accessToken: data.access_token, }); }, function(error) { if (error.httpStatus === 403) { if (self._fallbackHsUrl) { - var fbClient = Matrix.createClient({ + const fbClient = Matrix.createClient({ baseUrl: self._fallbackHsUrl, idBaseUrl: this._isUrl, }); @@ -165,7 +165,7 @@ export default class Login { identityServerUrl: self._isUrl, userId: data.user_id, deviceId: data.device_id, - accessToken: data.access_token + accessToken: data.access_token, }); }, function(fallback_error) { // throw the original error diff --git a/src/Markdown.js b/src/Markdown.js index 455d5e95bd..e05f163ba5 100644 --- a/src/Markdown.js +++ b/src/Markdown.js @@ -48,7 +48,7 @@ function html_if_tag_allowed(node) { * or false if it is only a single line. */ function is_multi_line(node) { - var par = node; + let par = node; while (par.parent) { par = par.parent; } @@ -143,7 +143,7 @@ export default class Markdown { if (isMultiLine) this.cr(); html_if_tag_allowed.call(this, node); if (isMultiLine) this.cr(); - } + }; return renderer.render(this.parsed); } @@ -178,7 +178,7 @@ export default class Markdown { renderer.html_block = function(node) { this.lit(node.literal); if (is_multi_line(node) && node.next) this.lit('\n\n'); - } + }; return renderer.render(this.parsed); } diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js index 4264828c7b..0c3d5b3775 100644 --- a/src/MatrixClientPeg.js +++ b/src/MatrixClientPeg.js @@ -95,7 +95,7 @@ class MatrixClientPeg { opts.pendingEventOrdering = "detached"; try { - let promise = this.matrixClient.store.startup(); + const promise = this.matrixClient.store.startup(); console.log(`MatrixClientPeg: waiting for MatrixClient store to initialise`); await promise; } catch(err) { @@ -136,7 +136,7 @@ class MatrixClientPeg { } _createClient(creds: MatrixClientCreds) { - var opts = { + const opts = { baseUrl: creds.homeserverUrl, idBaseUrl: creds.identityServerUrl, accessToken: creds.accessToken, @@ -153,8 +153,8 @@ class MatrixClientPeg { this.matrixClient.setGuest(Boolean(creds.guest)); - var notifTimelineSet = new EventTimelineSet(null, { - timelineSupport: true + const notifTimelineSet = new EventTimelineSet(null, { + timelineSupport: true, }); // XXX: what is our initial pagination token?! it somehow needs to be synchronised with /sync. notifTimelineSet.getLiveTimeline().setPaginationToken("", EventTimeline.BACKWARDS); diff --git a/src/Modal.js b/src/Modal.js index 056b6d8bf2..68d75d1ff1 100644 --- a/src/Modal.js +++ b/src/Modal.js @@ -17,8 +17,8 @@ limitations under the License. 'use strict'; -var React = require('react'); -var ReactDOM = require('react-dom'); +const React = require('react'); +const ReactDOM = require('react-dom'); import Analytics from './Analytics'; import sdk from './index'; @@ -137,15 +137,15 @@ class ModalManager { * @param {String} className CSS class to apply to the modal wrapper */ createDialogAsync(loader, props, className) { - var self = this; + const self = this; const modal = {}; // never call this from onFinished() otherwise it will loop // // nb explicit function() rather than arrow function, to get `arguments` - var closeDialog = function() { + const closeDialog = function() { if (props && props.onFinished) props.onFinished.apply(null, arguments); - var i = self._modals.indexOf(modal); + const i = self._modals.indexOf(modal); if (i >= 0) { self._modals.splice(i, 1); } @@ -160,7 +160,7 @@ class ModalManager { // property set here so you can't close the dialog from a button click! modal.elem = ( <AsyncWrapper key={modalCount} loader={loader} {...props} - onFinished={closeDialog}/> + onFinished={closeDialog} /> ); modal.onFinished = props ? props.onFinished : null; modal.className = className; @@ -191,13 +191,13 @@ class ModalManager { return; } - var modal = this._modals[0]; - var dialog = ( - <div className={"mx_Dialog_wrapper " + (modal.className ? modal.className : '') }> + const modal = this._modals[0]; + const dialog = ( + <div className={"mx_Dialog_wrapper " + (modal.className ? modal.className : '')}> <div className="mx_Dialog"> - {modal.elem} + { modal.elem } </div> - <div className="mx_Dialog_background" onClick={ this.closeAll }></div> + <div className="mx_Dialog_background" onClick={this.closeAll}></div> </div> ); diff --git a/src/Notifier.js b/src/Notifier.js index 155564dcdf..a2e80353e1 100644 --- a/src/Notifier.js +++ b/src/Notifier.js @@ -81,7 +81,7 @@ const Notifier = { } const avatarUrl = ev.sender ? Avatar.avatarUrlForMember( - ev.sender, 40, 40, 'crop' + ev.sender, 40, 40, 'crop', ) : null; const notif = plaf.displayNotification(title, msg, avatarUrl, room); @@ -303,7 +303,7 @@ const Notifier = { this._playAudioNotification(ev, room); } } - } + }, }; if (!global.mxNotifier) { diff --git a/src/Presence.js b/src/Presence.js index c45d571217..fab518e1cb 100644 --- a/src/Presence.js +++ b/src/Presence.js @@ -14,12 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -var MatrixClientPeg = require("./MatrixClientPeg"); -var dis = require("./dispatcher"); +const MatrixClientPeg = require("./MatrixClientPeg"); +const dis = require("./dispatcher"); // Time in ms after that a user is considered as unavailable/away -var UNAVAILABLE_TIME_MS = 3 * 60 * 1000; // 3 mins -var PRESENCE_STATES = ["online", "offline", "unavailable"]; +const UNAVAILABLE_TIME_MS = 3 * 60 * 1000; // 3 mins +const PRESENCE_STATES = ["online", "offline", "unavailable"]; class Presence { @@ -71,14 +71,14 @@ class Presence { if (!this.running) { return; } - var old_state = this.state; + const old_state = this.state; this.state = newState; if (MatrixClientPeg.get().isGuest()) { return; // don't try to set presence when a guest; it won't work. } - var self = this; + const self = this; MatrixClientPeg.get().setPresence(this.state).done(function() { console.log("Presence: %s", newState); }, function(err) { @@ -104,7 +104,7 @@ class Presence { * @private */ _resetTimer() { - var self = this; + const self = this; this.setState("online"); // Re-arm the timer clearTimeout(this.timer); diff --git a/src/RichText.js b/src/RichText.js index cbd3b9ae18..4bc3815d25 100644 --- a/src/RichText.js +++ b/src/RichText.js @@ -44,9 +44,9 @@ export const contentStateToHTML = (contentState: ContentState) => { return stateToHTML(contentState, { inlineStyles: { UNDERLINE: { - element: 'u' - } - } + element: 'u', + }, + }, }); }; @@ -59,7 +59,7 @@ function unicodeToEmojiUri(str) { let replaceWith, unicode, alt; if ((!emojione.unicodeAlt) || (emojione.sprites)) { // if we are using the shortname as the alt tag then we need a reversed array to map unicode code point to shortnames - let mappedUnicode = emojione.mapUnicodeToShort(); + const mappedUnicode = emojione.mapUnicodeToShort(); } str = str.replace(emojione.regUnicode, function(unicodeChar) { @@ -90,14 +90,14 @@ function findWithRegex(regex, contentBlock: ContentBlock, callback: (start: numb } // Workaround for https://github.com/facebook/draft-js/issues/414 -let emojiDecorator = { +const emojiDecorator = { strategy: (contentState, contentBlock, callback) => { findWithRegex(EMOJI_REGEX, contentBlock, callback); }, component: (props) => { - let uri = unicodeToEmojiUri(props.children[0].props.text); - let shortname = emojione.toShort(props.children[0].props.text); - let style = { + const uri = unicodeToEmojiUri(props.children[0].props.text); + const shortname = emojione.toShort(props.children[0].props.text); + const style = { display: 'inline-block', width: '1em', maxHeight: '1em', @@ -106,7 +106,7 @@ let emojiDecorator = { backgroundPosition: 'center center', overflow: 'hidden', }; - return (<span title={shortname} style={style}><span style={{opacity: 0}}>{props.children}</span></span>); + return (<span title={shortname} style={style}><span style={{opacity: 0}}>{ props.children }</span></span>); }, }; @@ -118,16 +118,16 @@ export function getScopedRTDecorators(scope: any): CompositeDecorator { } export function getScopedMDDecorators(scope: any): CompositeDecorator { - let markdownDecorators = ['HR', 'BOLD', 'ITALIC', 'CODE', 'STRIKETHROUGH'].map( + const markdownDecorators = ['HR', 'BOLD', 'ITALIC', 'CODE', 'STRIKETHROUGH'].map( (style) => ({ strategy: (contentState, contentBlock, callback) => { return findWithRegex(MARKDOWN_REGEX[style], contentBlock, callback); }, component: (props) => ( <span className={"mx_MarkdownElement mx_Markdown_" + style}> - {props.children} + { props.children } </span> - ) + ), })); markdownDecorators.push({ @@ -136,9 +136,9 @@ export function getScopedMDDecorators(scope: any): CompositeDecorator { }, component: (props) => ( <a href="#" className="mx_MarkdownElement mx_Markdown_LINK"> - {props.children} + { props.children } </a> - ) + ), }); // markdownDecorators.push(emojiDecorator); // TODO Consider renabling "syntax highlighting" when we can do it properly @@ -161,7 +161,7 @@ export function modifyText(contentState: ContentState, rangeToReplace: Selection for (let currentKey = startKey; currentKey && currentKey !== endKey; currentKey = contentState.getKeyAfter(currentKey)) { - let blockText = getText(currentKey); + const blockText = getText(currentKey); text += blockText.substring(startOffset, blockText.length); // from now on, we'll take whole blocks @@ -182,7 +182,7 @@ export function modifyText(contentState: ContentState, rangeToReplace: Selection export function selectionStateToTextOffsets(selectionState: SelectionState, contentBlocks: Array<ContentBlock>): {start: number, end: number} { let offset = 0, start = 0, end = 0; - for (let block of contentBlocks) { + for (const block of contentBlocks) { if (selectionState.getStartKey() === block.getKey()) { start = offset + selectionState.getStartOffset(); } @@ -259,7 +259,7 @@ export function attachImmutableEntitiesToEmoji(editorState: EditorState): Editor .set('focusOffset', end); const emojiText = plainText.substring(start, end); newContentState = newContentState.createEntity( - 'emoji', 'IMMUTABLE', { emojiUnicode: emojiText } + 'emoji', 'IMMUTABLE', { emojiUnicode: emojiText }, ); const entityKey = newContentState.getLastCreatedEntityKey(); newContentState = Modifier.replaceText( diff --git a/src/Rooms.js b/src/Rooms.js index 2e3f4457f0..6cc2d867a6 100644 --- a/src/Rooms.js +++ b/src/Rooms.js @@ -62,8 +62,7 @@ export function isConfCallRoom(room, me, conferenceHandler) { export function looksLikeDirectMessageRoom(room, me) { if (me.membership == "join" || me.membership === "ban" || - (me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) - { + (me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) { // Used to split rooms via tags const tagNames = Object.keys(room.tags); // Used for 1:1 direct chats diff --git a/src/ScalarAuthClient.js b/src/ScalarAuthClient.js index 0b753cf3ab..c9d056f88e 100644 --- a/src/ScalarAuthClient.js +++ b/src/ScalarAuthClient.js @@ -15,10 +15,10 @@ limitations under the License. */ import Promise from 'bluebird'; -var request = require('browser-request'); +const request = require('browser-request'); -var SdkConfig = require('./SdkConfig'); -var MatrixClientPeg = require('./MatrixClientPeg'); +const SdkConfig = require('./SdkConfig'); +const MatrixClientPeg = require('./MatrixClientPeg'); class ScalarAuthClient { @@ -38,7 +38,7 @@ class ScalarAuthClient { // Returns a scalar_token string getScalarToken() { - var tok = window.localStorage.getItem("mx_scalar_token"); + const tok = window.localStorage.getItem("mx_scalar_token"); if (tok) return Promise.resolve(tok); // No saved token, so do the dance to get one. First, we @@ -53,9 +53,9 @@ class ScalarAuthClient { } exchangeForScalarToken(openid_token_object) { - var defer = Promise.defer(); + const defer = Promise.defer(); - var scalar_rest_url = SdkConfig.get().integrations_rest_url; + const scalar_rest_url = SdkConfig.get().integrations_rest_url; request({ method: 'POST', uri: scalar_rest_url+'/register', @@ -77,7 +77,7 @@ class ScalarAuthClient { } getScalarInterfaceUrlForRoom(roomId, screen, id) { - var url = SdkConfig.get().integrations_ui_url; + let url = SdkConfig.get().integrations_ui_url; url += "?scalar_token=" + encodeURIComponent(this.scalarToken); url += "&room_id=" + encodeURIComponent(roomId); if (id) { diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index d14d439d66..7698829647 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -356,12 +356,12 @@ function getWidgets(event, roomId) { } const stateEvents = room.currentState.getStateEvents("im.vector.modular.widgets"); // Only return widgets which have required fields - let widgetStateEvents = []; + const widgetStateEvents = []; stateEvents.forEach((ev) => { if (ev.getContent().type && ev.getContent().url) { widgetStateEvents.push(ev.event); // return the raw event } - }) + }); sendResponse(event, widgetStateEvents); } @@ -376,7 +376,7 @@ function setPlumbingState(event, roomId, status) { sendError(event, _t('You need to be logged in.')); return; } - client.sendStateEvent(roomId, "m.room.plumbing", { status : status }).done(() => { + client.sendStateEvent(roomId, "m.room.plumbing", { status: status }).done(() => { sendResponse(event, { success: true, }); @@ -415,11 +415,11 @@ function setBotPower(event, roomId, userId, level) { } client.getStateEvent(roomId, "m.room.power_levels", "").then((powerLevels) => { - let powerEvent = new MatrixEvent( + const powerEvent = new MatrixEvent( { type: "m.room.power_levels", content: powerLevels, - } + }, ); client.setPowerLevel(roomId, userId, level, powerEvent).done(() => { @@ -485,8 +485,7 @@ function canSendEvent(event, roomId) { let canSend = false; if (isState) { canSend = room.currentState.maySendStateEvent(evType, me); - } - else { + } else { canSend = room.currentState.maySendEvent(evType, me); } @@ -517,8 +516,8 @@ function returnStateEvent(event, roomId, eventType, stateKey) { sendResponse(event, stateEvent.getContent()); } -var currentRoomId = null; -var currentRoomAlias = null; +let currentRoomId = null; +let currentRoomAlias = null; // Listen for when a room is viewed dis.register(onAction); @@ -542,7 +541,7 @@ const onMessage = function(event) { // // All strings start with the empty string, so for sanity return if the length // of the event origin is 0. - let url = SdkConfig.get().integrations_ui_url; + const url = SdkConfig.get().integrations_ui_url; if (event.origin.length === 0 || !url.startsWith(event.origin) || !event.data.action) { return; // don't log this - debugging APIs like to spam postMessage which floods the log otherwise } @@ -647,7 +646,7 @@ module.exports = { // Make an error so we get a stack trace const e = new Error( "ScalarMessaging: mismatched startListening / stopListening detected." + - " Negative count" + " Negative count", ); console.error(e); } diff --git a/src/Tinter.js b/src/Tinter.js index 5bf13e6d4a..6b23df8c9b 100644 --- a/src/Tinter.js +++ b/src/Tinter.js @@ -18,10 +18,10 @@ limitations under the License. // module.exports otherwise this will break when included by both // react-sdk and apps layered on top. -var DEBUG = 0; +const DEBUG = 0; // The colour keys to be replaced as referred to in CSS -var keyRgb = [ +const keyRgb = [ "rgb(118, 207, 166)", // Vector Green "rgb(234, 245, 240)", // Vector Light Green "rgb(211, 239, 225)", // BottomLeftMenu overlay (20% Vector Green) @@ -35,7 +35,7 @@ var keyRgb = [ // x = (255 - 234) / (255 - 118) = 0.16 // The colour keys to be replaced as referred to in SVGs -var keyHex = [ +const keyHex = [ "#76CFA6", // Vector Green "#EAF5F0", // Vector Light Green "#D3EFE1", // BottomLeftMenu overlay (20% Vector Green overlaid on Vector Light Green) @@ -44,14 +44,14 @@ var keyHex = [ // cache of our replacement colours // defaults to our keys. -var colors = [ +const colors = [ keyHex[0], keyHex[1], keyHex[2], keyHex[3], ]; -var cssFixups = [ +const cssFixups = [ // { // style: a style object that should be fixed up taken from a stylesheet // attr: name of the attribute to be clobbered, e.g. 'color' @@ -60,7 +60,7 @@ var cssFixups = [ ]; // CSS attributes to be fixed up -var cssAttrs = [ +const cssAttrs = [ "color", "backgroundColor", "borderColor", @@ -69,17 +69,17 @@ var cssAttrs = [ "borderLeftColor", ]; -var svgAttrs = [ +const svgAttrs = [ "fill", "stroke", ]; -var cached = false; +let cached = false; function calcCssFixups() { if (DEBUG) console.log("calcSvgFixups start"); - for (var i = 0; i < document.styleSheets.length; i++) { - var ss = document.styleSheets[i]; + for (let i = 0; i < document.styleSheets.length; i++) { + const ss = document.styleSheets[i]; if (!ss) continue; // well done safari >:( // Chromium apparently sometimes returns null here; unsure why. // see $14534907369972FRXBx:matrix.org in HQ @@ -104,12 +104,12 @@ function calcCssFixups() { if (ss.href && !ss.href.match(/\/bundle.*\.css$/)) continue; if (!ss.cssRules) continue; - for (var j = 0; j < ss.cssRules.length; j++) { - var rule = ss.cssRules[j]; + for (let j = 0; j < ss.cssRules.length; j++) { + const rule = ss.cssRules[j]; if (!rule.style) continue; - for (var k = 0; k < cssAttrs.length; k++) { - var attr = cssAttrs[k]; - for (var l = 0; l < keyRgb.length; l++) { + for (let k = 0; k < cssAttrs.length; k++) { + const attr = cssAttrs[k]; + for (let l = 0; l < keyRgb.length; l++) { if (rule.style[attr] === keyRgb[l]) { cssFixups.push({ style: rule.style, @@ -126,8 +126,8 @@ function calcCssFixups() { function applyCssFixups() { if (DEBUG) console.log("applyCssFixups start"); - for (var i = 0; i < cssFixups.length; i++) { - var cssFixup = cssFixups[i]; + for (let i = 0; i < cssFixups.length; i++) { + const cssFixup = cssFixups[i]; cssFixup.style[cssFixup.attr] = colors[cssFixup.index]; } if (DEBUG) console.log("applyCssFixups end"); @@ -140,15 +140,15 @@ function hexToRgb(color) { color[1] + color[1] + color[2] + color[2]; } - var val = parseInt(color, 16); - var r = (val >> 16) & 255; - var g = (val >> 8) & 255; - var b = val & 255; + const val = parseInt(color, 16); + const r = (val >> 16) & 255; + const g = (val >> 8) & 255; + const b = val & 255; return [r, g, b]; } function rgbToHex(rgb) { - var val = (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + const val = (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; return '#' + (0x1000000 + val).toString(16).slice(1); } @@ -167,12 +167,11 @@ module.exports = { * * @param {Function} tintable Function to call when the tint changes. */ - registerTintable : function(tintable) { + registerTintable: function(tintable) { tintables.push(tintable); }, tint: function(primaryColor, secondaryColor, tertiaryColor) { - if (!cached) { calcCssFixups(); cached = true; @@ -185,7 +184,7 @@ module.exports = { if (!secondaryColor) { const x = 0.16; // average weighting factor calculated from vector green & light green - var rgb = hexToRgb(primaryColor); + const rgb = hexToRgb(primaryColor); rgb[0] = x * rgb[0] + (1 - x) * 255; rgb[1] = x * rgb[1] + (1 - x) * 255; rgb[2] = x * rgb[2] + (1 - x) * 255; @@ -194,8 +193,8 @@ module.exports = { if (!tertiaryColor) { const x = 0.19; - var rgb1 = hexToRgb(primaryColor); - var rgb2 = hexToRgb(secondaryColor); + const rgb1 = hexToRgb(primaryColor); + const rgb2 = hexToRgb(secondaryColor); rgb1[0] = x * rgb1[0] + (1 - x) * rgb2[0]; rgb1[1] = x * rgb1[1] + (1 - x) * rgb2[1]; rgb1[2] = x * rgb1[2] + (1 - x) * rgb2[2]; @@ -204,8 +203,7 @@ module.exports = { if (colors[0] === primaryColor && colors[1] === secondaryColor && - colors[2] === tertiaryColor) - { + colors[2] === tertiaryColor) { return; } @@ -248,14 +246,13 @@ module.exports = { // key colour; cache the element and apply. if (DEBUG) console.log("calcSvgFixups start for " + svgs); - var fixups = []; - for (var i = 0; i < svgs.length; i++) { + const fixups = []; + for (let i = 0; i < svgs.length; i++) { var svgDoc; try { svgDoc = svgs[i].contentDocument; - } - catch(e) { - var msg = 'Failed to get svg.contentDocument of ' + svgs[i].toString(); + } catch(e) { + let msg = 'Failed to get svg.contentDocument of ' + svgs[i].toString(); if (e.message) { msg += e.message; } @@ -265,12 +262,12 @@ module.exports = { console.error(e); } if (!svgDoc) continue; - var tags = svgDoc.getElementsByTagName("*"); - for (var j = 0; j < tags.length; j++) { - var tag = tags[j]; - for (var k = 0; k < svgAttrs.length; k++) { - var attr = svgAttrs[k]; - for (var l = 0; l < keyHex.length; l++) { + const tags = svgDoc.getElementsByTagName("*"); + for (let j = 0; j < tags.length; j++) { + const tag = tags[j]; + for (let k = 0; k < svgAttrs.length; k++) { + const attr = svgAttrs[k]; + for (let l = 0; l < keyHex.length; l++) { if (tag.getAttribute(attr) && tag.getAttribute(attr).toUpperCase() === keyHex[l]) { fixups.push({ node: tag, @@ -289,10 +286,10 @@ module.exports = { applySvgFixups: function(fixups) { if (DEBUG) console.log("applySvgFixups start for " + fixups); - for (var i = 0; i < fixups.length; i++) { - var svgFixup = fixups[i]; + for (let i = 0; i < fixups.length; i++) { + const svgFixup = fixups[i]; svgFixup.node.setAttribute(svgFixup.attr, colors[svgFixup.index]); } if (DEBUG) console.log("applySvgFixups end"); - } + }, }; diff --git a/src/Unread.js b/src/Unread.js index 8fffc2a429..20e876ad88 100644 --- a/src/Unread.js +++ b/src/Unread.js @@ -14,10 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -var MatrixClientPeg = require('./MatrixClientPeg'); +const MatrixClientPeg = require('./MatrixClientPeg'); import UserSettingsStore from './UserSettingsStore'; import shouldHideEvent from './shouldHideEvent'; -var sdk = require('./index'); +const sdk = require('./index'); module.exports = { /** @@ -34,17 +34,17 @@ module.exports = { } else if (ev.getType == 'm.room.message' && ev.getContent().msgtype == 'm.notify') { return false; } - var EventTile = sdk.getComponent('rooms.EventTile'); + const EventTile = sdk.getComponent('rooms.EventTile'); return EventTile.haveTileForEvent(ev); }, doesRoomHaveUnreadMessages: function(room) { - var myUserId = MatrixClientPeg.get().credentials.userId; + const myUserId = MatrixClientPeg.get().credentials.userId; // get the most recent read receipt sent by our account. // N.B. this is NOT a read marker (RM, aka "read up to marker"), // despite the name of the method :(( - var readUpToId = room.getEventReadUpTo(myUserId); + const readUpToId = room.getEventReadUpTo(myUserId); // as we don't send RRs for our own messages, make sure we special case that // if *we* sent the last message into the room, we consider it not unread! @@ -54,8 +54,7 @@ module.exports = { // https://github.com/vector-im/riot-web/issues/3363 if (room.timeline.length && room.timeline[room.timeline.length - 1].sender && - room.timeline[room.timeline.length - 1].sender.userId === myUserId) - { + room.timeline[room.timeline.length - 1].sender.userId === myUserId) { return false; } @@ -67,8 +66,8 @@ module.exports = { const syncedSettings = UserSettingsStore.getSyncedSettings(); // Loop through messages, starting with the most recent... - for (var i = room.timeline.length - 1; i >= 0; --i) { - var ev = room.timeline[i]; + for (let i = room.timeline.length - 1; i >= 0; --i) { + const ev = room.timeline[i]; if (ev.getId() == readUpToId) { // If we've read up to this event, there's nothing more recents @@ -86,5 +85,5 @@ module.exports = { // is unread on the theory that false positives are better than // false negatives here. return true; - } + }, }; diff --git a/src/Velociraptor.js b/src/Velociraptor.js index 9c85bafca0..9a674d4f09 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -1,6 +1,6 @@ -var React = require('react'); -var ReactDom = require('react-dom'); -var Velocity = require('velocity-vector'); +const React = require('react'); +const ReactDom = require('react-dom'); +const Velocity = require('velocity-vector'); /** * The Velociraptor contains components and animates transitions with velocity. @@ -46,13 +46,13 @@ module.exports = React.createClass({ * update `this.children` according to the new list of children given */ _updateChildren: function(newChildren) { - var self = this; - var oldChildren = this.children || {}; + const self = this; + const oldChildren = this.children || {}; this.children = {}; React.Children.toArray(newChildren).forEach(function(c) { if (oldChildren[c.key]) { - var old = oldChildren[c.key]; - var oldNode = ReactDom.findDOMNode(self.nodes[old.key]); + const old = oldChildren[c.key]; + const oldNode = ReactDom.findDOMNode(self.nodes[old.key]); if (oldNode && oldNode.style.left != c.props.style.left) { Velocity(oldNode, { left: c.props.style.left }, self.props.transition).then(function() { @@ -71,18 +71,18 @@ module.exports = React.createClass({ } else { // new element. If we have a startStyle, use that as the style and go through // the enter animations - var newProps = {}; - var restingStyle = c.props.style; + const newProps = {}; + const restingStyle = c.props.style; - var startStyles = self.props.startStyles; + const startStyles = self.props.startStyles; if (startStyles.length > 0) { - var startStyle = startStyles[0]; + const startStyle = startStyles[0]; newProps.style = startStyle; // console.log("mounted@startstyle0: "+JSON.stringify(startStyle)); } - newProps.ref = (n => self._collectNode( - c.key, n, restingStyle + newProps.ref = ((n) => self._collectNode( + c.key, n, restingStyle, )); self.children[c.key] = React.cloneElement(c, newProps); @@ -103,8 +103,8 @@ module.exports = React.createClass({ this.nodes[k] === undefined && this.props.startStyles.length > 0 ) { - var startStyles = this.props.startStyles; - var transitionOpts = this.props.enterTransitionOpts; + const startStyles = this.props.startStyles; + const transitionOpts = this.props.enterTransitionOpts; const domNode = ReactDom.findDOMNode(node); // start from startStyle 1: 0 is the one we gave it // to start with, so now we animate 1 etc. @@ -154,7 +154,7 @@ module.exports = React.createClass({ render: function() { return ( <span> - {Object.values(this.children)} + { Object.values(this.children) } </span> ); }, diff --git a/src/VelocityBounce.js b/src/VelocityBounce.js index 3ad7d207a9..2141b05325 100644 --- a/src/VelocityBounce.js +++ b/src/VelocityBounce.js @@ -1,9 +1,9 @@ -var Velocity = require('velocity-vector'); +const Velocity = require('velocity-vector'); // courtesy of https://github.com/julianshapiro/velocity/issues/283 // We only use easeOutBounce (easeInBounce is just sort of nonsensical) function bounce( p ) { - var pow2, + let pow2, bounce = 4; while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) { diff --git a/src/WhoIsTyping.js b/src/WhoIsTyping.js index 2a12703a27..6bea2cbb92 100644 --- a/src/WhoIsTyping.js +++ b/src/WhoIsTyping.js @@ -14,19 +14,19 @@ See the License for the specific language governing permissions and limitations under the License. */ -var MatrixClientPeg = require("./MatrixClientPeg"); +const MatrixClientPeg = require("./MatrixClientPeg"); import { _t } from './languageHandler'; module.exports = { usersTypingApartFromMeAndIgnored: function(room) { return this.usersTyping( - room, [MatrixClientPeg.get().credentials.userId].concat(MatrixClientPeg.get().getIgnoredUsers()) + room, [MatrixClientPeg.get().credentials.userId].concat(MatrixClientPeg.get().getIgnoredUsers()), ); }, usersTypingApartFromMe: function(room) { return this.usersTyping( - room, [MatrixClientPeg.get().credentials.userId] + room, [MatrixClientPeg.get().credentials.userId], ); }, @@ -35,15 +35,15 @@ module.exports = { * to exclude, return a list of user objects who are typing. */ usersTyping: function(room, exclude) { - var whoIsTyping = []; + const whoIsTyping = []; if (exclude === undefined) { exclude = []; } - var memberKeys = Object.keys(room.currentState.members); - for (var i = 0; i < memberKeys.length; ++i) { - var userId = memberKeys[i]; + const memberKeys = Object.keys(room.currentState.members); + for (let i = 0; i < memberKeys.length; ++i) { + const userId = memberKeys[i]; if (room.currentState.members[userId].typing) { if (exclude.indexOf(userId) == -1) { @@ -76,5 +76,5 @@ module.exports = { const lastPerson = names.pop(); return _t('%(names)s and %(lastPerson)s are typing', {names: names.join(', '), lastPerson: lastPerson}); } - } + }, }; diff --git a/src/async-components/views/dialogs/EncryptedEventDialog.js b/src/async-components/views/dialogs/EncryptedEventDialog.js index cec2f05de2..a8f588d39a 100644 --- a/src/async-components/views/dialogs/EncryptedEventDialog.js +++ b/src/async-components/views/dialogs/EncryptedEventDialog.js @@ -14,10 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require("react"); +const React = require("react"); import { _t } from '../../../languageHandler'; -var sdk = require('../../../index'); -var MatrixClientPeg = require("../../../MatrixClientPeg"); +const sdk = require('../../../index'); +const MatrixClientPeg = require("../../../MatrixClientPeg"); module.exports = React.createClass({ displayName: 'EncryptedEventDialog', @@ -33,7 +33,7 @@ module.exports = React.createClass({ componentWillMount: function() { this._unmounted = false; - var client = MatrixClientPeg.get(); + const client = MatrixClientPeg.get(); // first try to load the device from our store. // @@ -60,7 +60,7 @@ module.exports = React.createClass({ componentWillUnmount: function() { this._unmounted = true; - var client = MatrixClientPeg.get(); + const client = MatrixClientPeg.get(); if (client) { client.removeListener("deviceVerificationChanged", this.onDeviceVerificationChanged); } @@ -89,12 +89,12 @@ module.exports = React.createClass({ }, _renderDeviceInfo: function() { - var device = this.state.device; + const device = this.state.device; if (!device) { return (<i>{ _t('unknown device') }</i>); } - var verificationStatus = (<b>{ _t('NOT verified') }</b>); + let verificationStatus = (<b>{ _t('NOT verified') }</b>); if (device.isBlocked()) { verificationStatus = (<b>{ _t('Blacklisted') }</b>); } else if (device.isVerified()) { @@ -118,7 +118,7 @@ module.exports = React.createClass({ </tr> <tr> <td>{ _t('Ed25519 fingerprint') }</td> - <td><code>{device.getFingerprint()}</code></td> + <td><code>{ device.getFingerprint() }</code></td> </tr> </tbody> </table> @@ -126,7 +126,7 @@ module.exports = React.createClass({ }, _renderEventInfo: function() { - var event = this.props.event; + const event = this.props.event; return ( <table> @@ -165,36 +165,36 @@ module.exports = React.createClass({ }, render: function() { - var DeviceVerifyButtons = sdk.getComponent('elements.DeviceVerifyButtons'); + const DeviceVerifyButtons = sdk.getComponent('elements.DeviceVerifyButtons'); - var buttons = null; + let buttons = null; if (this.state.device) { buttons = ( - <DeviceVerifyButtons device={ this.state.device } - userId={ this.props.event.getSender() } + <DeviceVerifyButtons device={this.state.device} + userId={this.props.event.getSender()} /> ); } return ( - <div className="mx_EncryptedEventDialog" onKeyDown={ this.onKeyDown }> + <div className="mx_EncryptedEventDialog" onKeyDown={this.onKeyDown}> <div className="mx_Dialog_title"> { _t('End-to-end encryption information') } </div> <div className="mx_Dialog_content"> <h4>{ _t('Event information') }</h4> - {this._renderEventInfo()} + { this._renderEventInfo() } <h4>{ _t('Sender device information') }</h4> - {this._renderDeviceInfo()} + { this._renderDeviceInfo() } </div> <div className="mx_Dialog_buttons"> - <button className="mx_Dialog_primary" onClick={ this.props.onFinished } autoFocus={ true }> + <button className="mx_Dialog_primary" onClick={this.props.onFinished} autoFocus={true}> { _t('OK') } </button> - {buttons} + { buttons } </div> </div> ); - } + }, }); diff --git a/src/autocomplete/Autocompleter.js b/src/autocomplete/Autocompleter.js index 7a64fb154c..5b10110f04 100644 --- a/src/autocomplete/Autocompleter.js +++ b/src/autocomplete/Autocompleter.js @@ -45,7 +45,7 @@ const PROVIDERS = [ EmojiProvider, CommandProvider, DuckDuckGoProvider, -].map(completer => completer.getInstance()); +].map((completer) => completer.getInstance()); // Providers will get rejected if they take longer than this. const PROVIDER_COMPLETION_TIMEOUT = 3000; diff --git a/src/autocomplete/Components.js b/src/autocomplete/Components.js index 0f0399cf7d..a27533f7c2 100644 --- a/src/autocomplete/Components.js +++ b/src/autocomplete/Components.js @@ -30,13 +30,13 @@ export class TextualCompletion extends React.Component { subtitle, description, className, - ...restProps, + ...restProps } = this.props; return ( <div className={classNames('mx_Autocomplete_Completion_block', className)} {...restProps}> - <span className="mx_Autocomplete_Completion_title">{title}</span> - <span className="mx_Autocomplete_Completion_subtitle">{subtitle}</span> - <span className="mx_Autocomplete_Completion_description">{description}</span> + <span className="mx_Autocomplete_Completion_title">{ title }</span> + <span className="mx_Autocomplete_Completion_subtitle">{ subtitle }</span> + <span className="mx_Autocomplete_Completion_description">{ description }</span> </div> ); } @@ -56,14 +56,14 @@ export class PillCompletion extends React.Component { description, initialComponent, className, - ...restProps, + ...restProps } = this.props; return ( <div className={classNames('mx_Autocomplete_Completion_pill', className)} {...restProps}> - {initialComponent} - <span className="mx_Autocomplete_Completion_title">{title}</span> - <span className="mx_Autocomplete_Completion_subtitle">{subtitle}</span> - <span className="mx_Autocomplete_Completion_description">{description}</span> + { initialComponent } + <span className="mx_Autocomplete_Completion_title">{ title }</span> + <span className="mx_Autocomplete_Completion_subtitle">{ subtitle }</span> + <span className="mx_Autocomplete_Completion_description">{ description }</span> </div> ); } diff --git a/src/autocomplete/DuckDuckGoProvider.js b/src/autocomplete/DuckDuckGoProvider.js index 9c996bb1cc..b2e85c4668 100644 --- a/src/autocomplete/DuckDuckGoProvider.js +++ b/src/autocomplete/DuckDuckGoProvider.js @@ -38,7 +38,7 @@ export default class DuckDuckGoProvider extends AutocompleteProvider { } async getCompletions(query: string, selection: {start: number, end: number}) { - let {command, range} = this.getCurrentCommand(query, selection); + const {command, range} = this.getCurrentCommand(query, selection); if (!query || !command) { return []; } @@ -47,7 +47,7 @@ export default class DuckDuckGoProvider extends AutocompleteProvider { method: 'GET', }); const json = await response.json(); - let results = json.Results.map(result => { + const results = json.Results.map((result) => { return { completion: result.Text, component: ( @@ -105,7 +105,7 @@ export default class DuckDuckGoProvider extends AutocompleteProvider { renderCompletions(completions: [React.Component]): ?React.Component { return <div className="mx_Autocomplete_Completion_container_block"> - {completions} + { completions } </div>; } } diff --git a/src/autocomplete/EmojiProvider.js b/src/autocomplete/EmojiProvider.js index 35a2ee6b53..a5b80e3b0e 100644 --- a/src/autocomplete/EmojiProvider.js +++ b/src/autocomplete/EmojiProvider.js @@ -138,7 +138,7 @@ export default class EmojiProvider extends AutocompleteProvider { return { completion: unicode, component: ( - <PillCompletion title={shortname} initialComponent={<EmojiText style={{maxWidth: '1em'}}>{unicode}</EmojiText>} /> + <PillCompletion title={shortname} initialComponent={<EmojiText style={{maxWidth: '1em'}}>{ unicode }</EmojiText>} /> ), range, }; @@ -152,14 +152,13 @@ export default class EmojiProvider extends AutocompleteProvider { } static getInstance() { - if (instance == null) - {instance = new EmojiProvider();} + if (instance == null) {instance = new EmojiProvider();} return instance; } renderCompletions(completions: [React.Component]): ?React.Component { return <div className="mx_Autocomplete_Completion_container_pill"> - {completions} + { completions } </div>; } } diff --git a/src/autocomplete/UserProvider.js b/src/autocomplete/UserProvider.js index 26b30a3d27..296399c06c 100644 --- a/src/autocomplete/UserProvider.js +++ b/src/autocomplete/UserProvider.js @@ -59,7 +59,7 @@ export default class UserProvider extends AutocompleteProvider { if (this.users === null) this._makeUsers(); let completions = []; - let {command, range} = this.getCurrentCommand(query, selection, force); + const {command, range} = this.getCurrentCommand(query, selection, force); if (command) { completions = this.matcher.match(command[0]).map((user) => { const displayName = (user.name || user.userId || '').replace(' (IRC)', ''); // FIXME when groups are done @@ -71,7 +71,7 @@ export default class UserProvider extends AutocompleteProvider { href: 'https://matrix.to/#/' + user.userId, component: ( <PillCompletion - initialComponent={<MemberAvatar member={user} width={24} height={24}/>} + initialComponent={<MemberAvatar member={user} width={24} height={24} />} title={displayName} description={user.userId} /> ), @@ -132,7 +132,7 @@ export default class UserProvider extends AutocompleteProvider { renderCompletions(completions: [React.Component]): ?React.Component { return <div className="mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate"> - {completions} + { completions } </div>; } diff --git a/src/components/structures/ContextualMenu.js b/src/components/structures/ContextualMenu.js index e5a62b8345..c3ad7f9cd1 100644 --- a/src/components/structures/ContextualMenu.js +++ b/src/components/structures/ContextualMenu.js @@ -17,9 +17,9 @@ limitations under the License. 'use strict'; -var classNames = require('classnames'); -var React = require('react'); -var ReactDOM = require('react-dom'); +const classNames = require('classnames'); +const React = require('react'); +const ReactDOM = require('react-dom'); // Shamelessly ripped off Modal.js. There's probably a better way // of doing reusable widgets like dialog boxes & menus where we go and @@ -36,7 +36,7 @@ module.exports = { }, getOrCreateContainer: function() { - var container = document.getElementById(this.ContextualMenuContainerId); + let container = document.getElementById(this.ContextualMenuContainerId); if (!container) { container = document.createElement("div"); @@ -48,9 +48,9 @@ module.exports = { }, createMenu: function(Element, props) { - var self = this; + const self = this; - var closeMenu = function() { + const closeMenu = function() { ReactDOM.unmountComponentAtNode(self.getOrCreateContainer()); if (props && props.onFinished) { @@ -58,17 +58,17 @@ module.exports = { } }; - var position = { + const position = { top: props.top, }; - var chevronOffset = {}; + const chevronOffset = {}; if (props.chevronOffset) { chevronOffset.top = props.chevronOffset; } // To override the default chevron colour, if it's been set - var chevronCSS = ""; + let chevronCSS = ""; if (props.menuColour) { chevronCSS = ` .mx_ContextualMenu_chevron_left:after { @@ -81,7 +81,7 @@ module.exports = { `; } - var chevron = null; + let chevron = null; if (props.left) { chevron = <div style={chevronOffset} className="mx_ContextualMenu_chevron_left"></div>; position.left = props.left; @@ -90,15 +90,15 @@ module.exports = { position.right = props.right; } - var className = 'mx_ContextualMenu_wrapper'; + const className = 'mx_ContextualMenu_wrapper'; - var menuClasses = classNames({ + const menuClasses = classNames({ 'mx_ContextualMenu': true, 'mx_ContextualMenu_left': props.left, 'mx_ContextualMenu_right': !props.left, }); - var menuStyle = {}; + const menuStyle = {}; if (props.menuWidth) { menuStyle.width = props.menuWidth; } @@ -113,14 +113,14 @@ module.exports = { // FIXME: If a menu uses getDefaultProps it clobbers the onFinished // property set here so you can't close the menu from a button click! - var menu = ( + const menu = ( <div className={className} style={position}> <div className={menuClasses} style={menuStyle}> - {chevron} - <Element {...props} onFinished={closeMenu}/> + { chevron } + <Element {...props} onFinished={closeMenu} /> </div> <div className="mx_ContextualMenu_background" onClick={closeMenu}></div> - <style>{chevronCSS}</style> + <style>{ chevronCSS }</style> </div> ); diff --git a/src/components/structures/CreateRoom.js b/src/components/structures/CreateRoom.js index 7ecc315ba7..26454c5ea6 100644 --- a/src/components/structures/CreateRoom.js +++ b/src/components/structures/CreateRoom.js @@ -61,7 +61,7 @@ module.exports = React.createClass({ }, onCreateRoom: function() { - var options = {}; + const options = {}; if (this.state.room_name) { options.name = this.state.room_name; @@ -79,14 +79,14 @@ module.exports = React.createClass({ { type: "m.room.join_rules", content: { - "join_rule": this.state.is_private ? "invite" : "public" - } + "join_rule": this.state.is_private ? "invite" : "public", + }, }, { type: "m.room.history_visibility", content: { - "history_visibility": this.state.share_history ? "shared" : "invited" - } + "history_visibility": this.state.share_history ? "shared" : "invited", + }, }, ]; } @@ -94,19 +94,19 @@ module.exports = React.createClass({ options.invite = this.state.invited_users; - var alias = this.getAliasLocalpart(); + const alias = this.getAliasLocalpart(); if (alias) { options.room_alias_name = alias; } - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); if (!cli) { // TODO: Error. console.error("Cannot create room: No matrix client."); return; } - var deferred = cli.createRoom(options); + const deferred = cli.createRoom(options); if (this.state.encrypt) { // TODO @@ -116,7 +116,7 @@ module.exports = React.createClass({ phase: this.phases.CREATING, }); - var self = this; + const self = this; deferred.then(function(resp) { self.setState({ @@ -209,7 +209,7 @@ module.exports = React.createClass({ onAliasChanged: function(alias) { this.setState({ - alias: alias + alias: alias, }); }, @@ -220,64 +220,64 @@ module.exports = React.createClass({ }, render: function() { - var curr_phase = this.state.phase; + const curr_phase = this.state.phase; if (curr_phase == this.phases.CREATING) { - var Loader = sdk.getComponent("elements.Spinner"); + const Loader = sdk.getComponent("elements.Spinner"); return ( - <Loader/> + <Loader /> ); } else { - var error_box = ""; + let error_box = ""; if (curr_phase == this.phases.ERROR) { error_box = ( <div className="mx_Error"> - {_t('An error occurred: %(error_string)s', {error_string: this.state.error_string})} + { _t('An error occurred: %(error_string)s', {error_string: this.state.error_string}) } </div> ); } - var CreateRoomButton = sdk.getComponent("create_room.CreateRoomButton"); - var RoomAlias = sdk.getComponent("create_room.RoomAlias"); - var Presets = sdk.getComponent("create_room.Presets"); - var UserSelector = sdk.getComponent("elements.UserSelector"); - var SimpleRoomHeader = sdk.getComponent("rooms.SimpleRoomHeader"); + const CreateRoomButton = sdk.getComponent("create_room.CreateRoomButton"); + const RoomAlias = sdk.getComponent("create_room.RoomAlias"); + const Presets = sdk.getComponent("create_room.Presets"); + const UserSelector = sdk.getComponent("elements.UserSelector"); + const SimpleRoomHeader = sdk.getComponent("rooms.SimpleRoomHeader"); - var domain = MatrixClientPeg.get().getDomain(); + const domain = MatrixClientPeg.get().getDomain(); return ( <div className="mx_CreateRoom"> - <SimpleRoomHeader title={_t("Create Room")} collapsedRhs={ this.props.collapsedRhs }/> + <SimpleRoomHeader title={_t("Create Room")} collapsedRhs={this.props.collapsedRhs} /> <div className="mx_CreateRoom_body"> - <input type="text" ref="room_name" value={this.state.room_name} onChange={this.onNameChange} placeholder={_t('Name')}/> <br /> - <textarea className="mx_CreateRoom_description" ref="topic" value={this.state.topic} onChange={this.onTopicChange} placeholder={_t('Topic')}/> <br /> - <RoomAlias ref="alias" alias={this.state.alias} homeserver={ domain } onChange={this.onAliasChanged}/> <br /> - <UserSelector ref="user_selector" selected_users={this.state.invited_users} onChange={this.onInviteChanged}/> <br /> - <Presets ref="presets" onChange={this.onPresetChanged} preset={this.state.preset}/> <br /> + <input type="text" ref="room_name" value={this.state.room_name} onChange={this.onNameChange} placeholder={_t('Name')} /> <br /> + <textarea className="mx_CreateRoom_description" ref="topic" value={this.state.topic} onChange={this.onTopicChange} placeholder={_t('Topic')} /> <br /> + <RoomAlias ref="alias" alias={this.state.alias} homeserver={domain} onChange={this.onAliasChanged} /> <br /> + <UserSelector ref="user_selector" selected_users={this.state.invited_users} onChange={this.onInviteChanged} /> <br /> + <Presets ref="presets" onChange={this.onPresetChanged} preset={this.state.preset} /> <br /> <div> <label> - <input type="checkbox" ref="is_private" checked={this.state.is_private} onChange={this.onPrivateChanged}/> - {_t('Make this room private')} + <input type="checkbox" ref="is_private" checked={this.state.is_private} onChange={this.onPrivateChanged} /> + { _t('Make this room private') } </label> </div> <div> <label> - <input type="checkbox" ref="share_history" checked={this.state.share_history} onChange={this.onShareHistoryChanged}/> - {_t('Share message history with new users')} + <input type="checkbox" ref="share_history" checked={this.state.share_history} onChange={this.onShareHistoryChanged} /> + { _t('Share message history with new users') } </label> </div> <div className="mx_CreateRoom_encrypt"> <label> - <input type="checkbox" ref="encrypt" checked={this.state.encrypt} onChange={this.onEncryptChanged}/> - {_t('Encrypt room')} + <input type="checkbox" ref="encrypt" checked={this.state.encrypt} onChange={this.onEncryptChanged} /> + { _t('Encrypt room') } </label> </div> <div> <CreateRoomButton onCreateRoom={this.onCreateRoom} /> <br /> </div> - {error_box} + { error_box } </div> </div> ); } - } + }, }); diff --git a/src/components/structures/FilePanel.js b/src/components/structures/FilePanel.js index 152d5115f6..6696f3cc0f 100644 --- a/src/components/structures/FilePanel.js +++ b/src/components/structures/FilePanel.js @@ -24,7 +24,7 @@ import { _t, _tJsx } from '../../languageHandler'; /* * Component which shows the filtered file using a TimelinePanel */ -var FilePanel = React.createClass({ +const FilePanel = React.createClass({ displayName: 'FilePanel', propTypes: { @@ -55,33 +55,33 @@ var FilePanel = React.createClass({ }, updateTimelineSet: function(roomId) { - var client = MatrixClientPeg.get(); - var room = client.getRoom(roomId); + const client = MatrixClientPeg.get(); + const room = client.getRoom(roomId); this.noRoom = !room; if (room) { - var filter = new Matrix.Filter(client.credentials.userId); + const filter = new Matrix.Filter(client.credentials.userId); filter.setDefinition( { "room": { "timeline": { - "contains_url": true + "contains_url": true, }, - } - } + }, + }, ); // FIXME: we shouldn't be doing this every time we change room - see comment above. client.getOrCreateFilter("FILTER_FILES_" + client.credentials.userId, filter).then( (filterId)=>{ filter.filterId = filterId; - var timelineSet = room.getOrCreateFilteredTimelineSet(filter); + const timelineSet = room.getOrCreateFilteredTimelineSet(filter); this.setState({ timelineSet: timelineSet }); }, (error)=>{ console.error("Failed to get or create file panel filter", error); - } + }, ); } else { console.error("Failed to add filtered timelineSet for FilePanel as no room!"); @@ -92,18 +92,18 @@ var FilePanel = React.createClass({ if (MatrixClientPeg.get().isGuest()) { return <div className="mx_FilePanel mx_RoomView_messageListWrapper"> <div className="mx_RoomView_empty"> - {_tJsx("You must <a>register</a> to use this functionality", /<a>(.*?)<\/a>/, (sub) => <a href="#/register" key="sub">{sub}</a>)} + { _tJsx("You must <a>register</a> to use this functionality", /<a>(.*?)<\/a>/, (sub) => <a href="#/register" key="sub">{ sub }</a>) } </div> </div>; } else if (this.noRoom) { return <div className="mx_FilePanel mx_RoomView_messageListWrapper"> - <div className="mx_RoomView_empty">{_t("You must join the room to see its files")}</div> + <div className="mx_RoomView_empty">{ _t("You must join the room to see its files") }</div> </div>; } // wrap a TimelinePanel with the jump-to-event bits turned off. - var TimelinePanel = sdk.getComponent("structures.TimelinePanel"); - var Loader = sdk.getComponent("elements.Spinner"); + const TimelinePanel = sdk.getComponent("structures.TimelinePanel"); + const Loader = sdk.getComponent("elements.Spinner"); if (this.state.timelineSet) { // console.log("rendering TimelinePanel for timelineSet " + this.state.timelineSet.room.roomId + " " + @@ -114,17 +114,16 @@ var FilePanel = React.createClass({ manageReadReceipts={false} manageReadMarkers={false} timelineSet={this.state.timelineSet} - showUrlPreview = { false } + showUrlPreview = {false} tileShape="file_grid" - opacity={ this.props.opacity } + opacity={this.props.opacity} empty={_t('There are no visible files in this room')} /> ); - } - else { + } else { return ( <div className="mx_FilePanel"> - <Loader/> + <Loader /> </div> ); } diff --git a/src/components/structures/InteractiveAuth.js b/src/components/structures/InteractiveAuth.js index dee8400a08..8a2c1b8c79 100644 --- a/src/components/structures/InteractiveAuth.js +++ b/src/components/structures/InteractiveAuth.js @@ -107,7 +107,7 @@ export default React.createClass({ const msg = error.message || error.toString(); this.setState({ - errorText: msg + errorText: msg, }); }).done(); @@ -207,7 +207,7 @@ export default React.createClass({ if (this.state.errorText) { error = ( <div className="error"> - {this.state.errorText} + { this.state.errorText } </div> ); } @@ -215,8 +215,8 @@ export default React.createClass({ return ( <div> <div> - {this._renderCurrentStage()} - {error} + { this._renderCurrentStage() } + { error } </div> </div> ); diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index c6ac8e58cd..49522747cd 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -164,7 +164,7 @@ export default React.createClass({ case KeyCode.UP: case KeyCode.DOWN: if (ev.altKey && !ev.shiftKey && !ev.ctrlKey && !ev.metaKey) { - let action = ev.keyCode == KeyCode.UP ? + const action = ev.keyCode == KeyCode.UP ? 'view_prev_room' : 'view_next_room'; dis.dispatch({action: action}); handled = true; @@ -206,8 +206,7 @@ export default React.createClass({ _onScrollKeyPressed: function(ev) { if (this.refs.roomView) { this.refs.roomView.handleScrollKey(ev); - } - else if (this.refs.roomDirectory) { + } else if (this.refs.roomDirectory) { this.refs.roomDirectory.handleScrollKey(ev); } }, @@ -255,7 +254,7 @@ export default React.createClass({ referralBaseUrl={this.props.config.referralBaseUrl} teamToken={this.props.teamToken} />; - if (!this.props.collapseRhs) right_panel = <RightPanel opacity={this.props.rightOpacity}/>; + if (!this.props.collapseRhs) right_panel = <RightPanel opacity={this.props.rightOpacity} />; break; case PageTypes.MyGroups: @@ -267,7 +266,7 @@ export default React.createClass({ onRoomCreated={this.props.onRoomCreated} collapsedRhs={this.props.collapseRhs} />; - if (!this.props.collapseRhs) right_panel = <RightPanel opacity={this.props.rightOpacity}/>; + if (!this.props.collapseRhs) right_panel = <RightPanel opacity={this.props.rightOpacity} />; break; case PageTypes.RoomDirectory: @@ -320,7 +319,7 @@ export default React.createClass({ topBar = <MatrixToolbar />; } - var bodyClasses = 'mx_MatrixChat'; + let bodyClasses = 'mx_MatrixChat'; if (topBar) { bodyClasses += ' mx_MatrixChat_toolbarShowing'; } @@ -330,7 +329,7 @@ export default React.createClass({ return ( <div className='mx_MatrixChat_wrapper'> - {topBar} + { topBar } <div className={bodyClasses}> <LeftPanel selectedRoom={this.props.currentRoomId} @@ -338,9 +337,9 @@ export default React.createClass({ opacity={this.props.leftOpacity} /> <main className='mx_MatrixChat_middlePanel'> - {page_element} + { page_element } </main> - {right_panel} + { right_panel } </div> </div> ); diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 49894dcaa7..5ce36b4b82 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -154,15 +154,15 @@ module.exports = React.createClass({ // 0: read marker is within the window // +1: read marker is below the window getReadMarkerPosition: function() { - var readMarker = this.refs.readMarkerNode; - var messageWrapper = this.refs.scrollPanel; + const readMarker = this.refs.readMarkerNode; + const messageWrapper = this.refs.scrollPanel; if (!readMarker || !messageWrapper) { return null; } - var wrapperRect = ReactDOM.findDOMNode(messageWrapper).getBoundingClientRect(); - var readMarkerRect = readMarker.getBoundingClientRect(); + const wrapperRect = ReactDOM.findDOMNode(messageWrapper).getBoundingClientRect(); + const readMarkerRect = readMarker.getBoundingClientRect(); // the read-marker pretends to have zero height when it is actually // two pixels high; +2 here to account for that. @@ -262,7 +262,7 @@ module.exports = React.createClass({ this.eventNodes = {}; - var i; + let i; // first figure out which is the last event in the list which we're // actually going to show; this allows us to behave slightly @@ -272,9 +272,9 @@ module.exports = React.createClass({ // a local echo, to manage the read-marker. let lastShownEvent; - var lastShownNonLocalEchoIndex = -1; + let lastShownNonLocalEchoIndex = -1; for (i = this.props.events.length-1; i >= 0; i--) { - var mxEv = this.props.events[i]; + const mxEv = this.props.events[i]; if (!this._shouldShowEvent(mxEv)) { continue; } @@ -292,12 +292,12 @@ module.exports = React.createClass({ break; } - var ret = []; + const ret = []; - var prevEvent = null; // the last event we showed + let prevEvent = null; // the last event we showed // assume there is no read marker until proven otherwise - var readMarkerVisible = false; + let readMarkerVisible = false; // if the readmarker has moved, cancel any active ghost. if (this.currentReadMarkerEventId && this.props.readMarkerEventId && @@ -309,16 +309,16 @@ module.exports = React.createClass({ const isMembershipChange = (e) => e.getType() === 'm.room.member'; for (i = 0; i < this.props.events.length; i++) { - let mxEv = this.props.events[i]; - let eventId = mxEv.getId(); - let last = (mxEv === lastShownEvent); + const mxEv = this.props.events[i]; + const eventId = mxEv.getId(); + const last = (mxEv === lastShownEvent); const wantTile = this._shouldShowEvent(mxEv); // Wrap consecutive member events in a ListSummary, ignore if redacted if (isMembershipChange(mxEv) && wantTile) { let readMarkerInMels = false; - let ts1 = mxEv.getTs(); + const ts1 = mxEv.getTs(); // Ensure that the key of the MemberEventListSummary does not change with new // member events. This will prevent it from being re-created unnecessarily, and // instead will allow new props to be provided. In turn, the shouldComponentUpdate @@ -330,7 +330,7 @@ module.exports = React.createClass({ const key = "membereventlistsummary-" + (prevEvent ? mxEv.getId() : "initial"); if (this._wantsDateSeparator(prevEvent, mxEv.getDate())) { - let dateSeparator = <li key={ts1+'~'}><DateSeparator key={ts1+'~'} ts={ts1} showTwelveHour={this.props.isTwelveHour}/></li>; + const dateSeparator = <li key={ts1+'~'}><DateSeparator key={ts1+'~'} ts={ts1} showTwelveHour={this.props.isTwelveHour} /></li>; ret.push(dateSeparator); } @@ -339,7 +339,7 @@ module.exports = React.createClass({ readMarkerInMels = true; } - let summarisedEvents = [mxEv]; + const summarisedEvents = [mxEv]; for (;i + 1 < this.props.events.length; i++) { const collapsedMxEv = this.props.events[i + 1]; @@ -390,7 +390,7 @@ module.exports = React.createClass({ onToggle={this._onWidgetLoad} // Update scroll state startExpanded={highlightInMels} > - {eventTiles} + { eventTiles } </MemberEventListSummary>); if (readMarkerInMels) { @@ -408,7 +408,7 @@ module.exports = React.createClass({ prevEvent = mxEv; } - var isVisibleReadMarker = false; + let isVisibleReadMarker = false; if (eventId == this.props.readMarkerEventId) { var visible = this.props.readMarkerVisible; @@ -448,10 +448,10 @@ module.exports = React.createClass({ _getTilesForEvent: function(prevEvent, mxEv, last) { const EventTile = sdk.getComponent('rooms.EventTile'); const DateSeparator = sdk.getComponent('messages.DateSeparator'); - var ret = []; + const ret = []; // is this a continuation of the previous message? - var continuation = false; + let continuation = false; if (prevEvent !== null && prevEvent.sender && mxEv.sender @@ -476,8 +476,8 @@ module.exports = React.createClass({ // local echoes have a fake date, which could even be yesterday. Treat them // as 'today' for the date separators. - var ts1 = mxEv.getTs(); - var eventDate = mxEv.getDate(); + let ts1 = mxEv.getTs(); + let eventDate = mxEv.getDate(); if (mxEv.status) { eventDate = new Date(); ts1 = eventDate.getTime(); @@ -485,19 +485,19 @@ module.exports = React.createClass({ // do we need a date separator since the last event? if (this._wantsDateSeparator(prevEvent, eventDate)) { - var dateSeparator = <li key={ts1}><DateSeparator key={ts1} ts={ts1} showTwelveHour={this.props.isTwelveHour}/></li>; + const dateSeparator = <li key={ts1}><DateSeparator key={ts1} ts={ts1} showTwelveHour={this.props.isTwelveHour} /></li>; ret.push(dateSeparator); continuation = false; } - var eventId = mxEv.getId(); - var highlight = (eventId == this.props.highlightedEventId); + const eventId = mxEv.getId(); + const highlight = (eventId == this.props.highlightedEventId); // we can't use local echoes as scroll tokens, because their event IDs change. // Local echos have a send "status". - var scrollToken = mxEv.status ? undefined : eventId; + const scrollToken = mxEv.status ? undefined : eventId; - var readReceipts; + let readReceipts; if (this.props.showReadReceipts) { readReceipts = this._getReadReceiptsForEvent(mxEv); } @@ -515,8 +515,8 @@ module.exports = React.createClass({ eventSendStatus={mxEv.status} tileShape={this.props.tileShape} isTwelveHour={this.props.isTwelveHour} - last={last} isSelectedEvent={highlight}/> - </li> + last={last} isSelectedEvent={highlight} /> + </li>, ); return ret; @@ -551,7 +551,7 @@ module.exports = React.createClass({ if (!room) { return null; } - let receipts = []; + const receipts = []; room.getReceiptsForEvent(event).forEach((r) => { if (!r.userId || r.type !== "m.read" || r.userId === myUserId) { return; // ignore non-read receipts and receipts from self. @@ -559,7 +559,7 @@ module.exports = React.createClass({ if (MatrixClientPeg.get().isUserIgnored(r.userId)) { return; // ignore ignored users } - let member = room.getMember(r.userId); + const member = room.getMember(r.userId); if (!member) { return; // ignore unknown user IDs } @@ -575,7 +575,7 @@ module.exports = React.createClass({ }, _getReadMarkerTile: function(visible) { - var hr; + let hr; if (visible) { hr = <hr className="mx_RoomView_myReadMarker" style={{opacity: 1, width: '99%'}} @@ -585,7 +585,7 @@ module.exports = React.createClass({ return ( <li key="_readupto" ref="readMarkerNode" className="mx_RoomView_myReadMarker_container"> - {hr} + { hr } </li> ); }, @@ -604,7 +604,7 @@ module.exports = React.createClass({ }, _getReadMarkerGhostTile: function() { - var hr = <hr className="mx_RoomView_myReadMarker" + const hr = <hr className="mx_RoomView_myReadMarker" style={{opacity: 1, width: '99%'}} ref={this._startAnimation} />; @@ -615,7 +615,7 @@ module.exports = React.createClass({ return ( <li key={"_readuptoghost_"+this.currentGhostEventId} className="mx_RoomView_myReadMarker_container"> - {hr} + { hr } </li> ); }, @@ -627,7 +627,7 @@ module.exports = React.createClass({ // once dynamic content in the events load, make the scrollPanel check the // scroll offsets. _onWidgetLoad: function() { - var scrollPanel = this.refs.scrollPanel; + const scrollPanel = this.refs.scrollPanel; if (scrollPanel) { scrollPanel.forceUpdate(); } @@ -638,9 +638,9 @@ module.exports = React.createClass({ }, render: function() { - var ScrollPanel = sdk.getComponent("structures.ScrollPanel"); - var Spinner = sdk.getComponent("elements.Spinner"); - var topSpinner, bottomSpinner; + const ScrollPanel = sdk.getComponent("structures.ScrollPanel"); + const Spinner = sdk.getComponent("elements.Spinner"); + let topSpinner, bottomSpinner; if (this.props.backPaginating) { topSpinner = <li key="_topSpinner"><Spinner /></li>; } @@ -648,25 +648,25 @@ module.exports = React.createClass({ bottomSpinner = <li key="_bottomSpinner"><Spinner /></li>; } - var style = this.props.hidden ? { display: 'none' } : {}; + const style = this.props.hidden ? { display: 'none' } : {}; style.opacity = this.props.opacity; - var className = this.props.className + " mx_fadable"; + let className = this.props.className + " mx_fadable"; if (this.props.alwaysShowTimestamps) { className += " mx_MessagePanel_alwaysShowTimestamps"; } return ( - <ScrollPanel ref="scrollPanel" className={ className } - onScroll={ this.props.onScroll } - onResize={ this.onResize } - onFillRequest={ this.props.onFillRequest } - onUnfillRequest={ this.props.onUnfillRequest } - style={ style } - stickyBottom={ this.props.stickyBottom }> - {topSpinner} - {this._getEventTiles()} - {bottomSpinner} + <ScrollPanel ref="scrollPanel" className={className} + onScroll={this.props.onScroll} + onResize={this.onResize} + onFillRequest={this.props.onFillRequest} + onUnfillRequest={this.props.onUnfillRequest} + style={style} + stickyBottom={this.props.stickyBottom}> + { topSpinner } + { this._getEventTiles() } + { bottomSpinner } </ScrollPanel> ); }, diff --git a/src/components/structures/NotificationPanel.js b/src/components/structures/NotificationPanel.js index 21eccbdff6..3c8f34fb86 100644 --- a/src/components/structures/NotificationPanel.js +++ b/src/components/structures/NotificationPanel.js @@ -14,18 +14,18 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require('react'); -var ReactDOM = require("react-dom"); +const React = require('react'); +const ReactDOM = require("react-dom"); import { _t } from '../../languageHandler'; -var Matrix = require("matrix-js-sdk"); -var sdk = require('../../index'); -var MatrixClientPeg = require("../../MatrixClientPeg"); -var dis = require("../../dispatcher"); +const Matrix = require("matrix-js-sdk"); +const sdk = require('../../index'); +const MatrixClientPeg = require("../../MatrixClientPeg"); +const dis = require("../../dispatcher"); /* * Component which shows the global notification list using a TimelinePanel */ -var NotificationPanel = React.createClass({ +const NotificationPanel = React.createClass({ displayName: 'NotificationPanel', propTypes: { @@ -33,10 +33,10 @@ var NotificationPanel = React.createClass({ render: function() { // wrap a TimelinePanel with the jump-to-event bits turned off. - var TimelinePanel = sdk.getComponent("structures.TimelinePanel"); - var Loader = sdk.getComponent("elements.Spinner"); + const TimelinePanel = sdk.getComponent("structures.TimelinePanel"); + const Loader = sdk.getComponent("elements.Spinner"); - var timelineSet = MatrixClientPeg.get().getNotifTimelineSet(); + const timelineSet = MatrixClientPeg.get().getNotifTimelineSet(); if (timelineSet) { return ( <TimelinePanel key={"NotificationPanel_" + this.props.roomId} @@ -44,18 +44,17 @@ var NotificationPanel = React.createClass({ manageReadReceipts={false} manageReadMarkers={false} timelineSet={timelineSet} - showUrlPreview = { false } - opacity={ this.props.opacity } + showUrlPreview = {false} + opacity={this.props.opacity} tileShape="notif" - empty={ _t('You have no visible notifications') } + empty={_t('You have no visible notifications')} /> ); - } - else { + } else { console.error("No notifTimelineSet available!"); return ( <div className="mx_NotificationPanel"> - <Loader/> + <Loader /> </div> ); } diff --git a/src/components/structures/RoomStatusBar.js b/src/components/structures/RoomStatusBar.js index 68b7249d3b..3a2ab33db8 100644 --- a/src/components/structures/RoomStatusBar.js +++ b/src/components/structures/RoomStatusBar.js @@ -103,7 +103,7 @@ module.exports = React.createClass({ componentWillUnmount: function() { // we may have entirely lost our client as we're logging out before clicking login on the guest bar... - var client = MatrixClientPeg.get(); + const client = MatrixClientPeg.get(); if (client) { client.removeListener("sync", this.onSyncStateChange); client.removeListener("RoomMember.typing", this.onRoomMemberTyping); @@ -115,7 +115,7 @@ module.exports = React.createClass({ return; } this.setState({ - syncState: state + syncState: state, }); }, @@ -126,7 +126,7 @@ module.exports = React.createClass({ }, // Check whether current size is greater than 0, if yes call props.onVisible - _checkSize: function () { + _checkSize: function() { if (this.props.onVisible && this._getSize()) { this.props.onVisible(); } @@ -157,9 +157,9 @@ module.exports = React.createClass({ if (this.props.numUnreadMessages) { return ( <div className="mx_RoomStatusBar_scrollDownIndicator" - onClick={ this.props.onScrollToBottomClick }> + onClick={this.props.onScrollToBottomClick}> <img src="img/newmessages.svg" width="24" height="24" - alt=""/> + alt="" /> </div> ); } @@ -167,18 +167,18 @@ module.exports = React.createClass({ if (!this.props.atEndOfLiveTimeline) { return ( <div className="mx_RoomStatusBar_scrollDownIndicator" - onClick={ this.props.onScrollToBottomClick }> + onClick={this.props.onScrollToBottomClick}> <img src="img/scrolldown.svg" width="24" height="24" - alt={ _t("Scroll to bottom of page") } - title={ _t("Scroll to bottom of page") }/> + alt={_t("Scroll to bottom of page")} + title={_t("Scroll to bottom of page")} /> </div> ); } if (this.props.hasActiveCall) { - var TintableSvg = sdk.getComponent("elements.TintableSvg"); + const TintableSvg = sdk.getComponent("elements.TintableSvg"); return ( - <TintableSvg src="img/sound-indicator.svg" width="23" height="20"/> + <TintableSvg src="img/sound-indicator.svg" width="23" height="20" /> ); } @@ -189,7 +189,7 @@ module.exports = React.createClass({ if (wantPlaceholder) { return ( <div className="mx_RoomStatusBar_typingIndicatorAvatars"> - {this._renderTypingIndicatorAvatars(this.props.whoIsTypingLimit)} + { this._renderTypingIndicatorAvatars(this.props.whoIsTypingLimit) } </div> ); } @@ -221,8 +221,8 @@ module.exports = React.createClass({ if (othersCount > 0) { avatars.push( <span className="mx_RoomStatusBar_typingIndicatorRemaining" key="others"> - +{othersCount} - </span> + +{ othersCount } + </span>, ); } @@ -240,12 +240,12 @@ module.exports = React.createClass({ if (this.state.syncState === "ERROR") { return ( <div className="mx_RoomStatusBar_connectionLostBar"> - <img src="img/warning.svg" width="24" height="23" title="/!\ " alt="/!\ "/> + <img src="img/warning.svg" width="24" height="23" title="/!\ " alt="/!\ " /> <div className="mx_RoomStatusBar_connectionLostBar_title"> - {_t('Connectivity to the server has been lost.')} + { _t('Connectivity to the server has been lost.') } </div> <div className="mx_RoomStatusBar_connectionLostBar_desc"> - {_t('Sent messages will be stored until your connection has returned.')} + { _t('Sent messages will be stored until your connection has returned.') } </div> </div> ); @@ -254,18 +254,18 @@ module.exports = React.createClass({ if (this.props.unsentMessageError) { return ( <div className="mx_RoomStatusBar_connectionLostBar"> - <img src="img/warning.svg" width="24" height="23" title="/!\ " alt="/!\ "/> + <img src="img/warning.svg" width="24" height="23" title="/!\ " alt="/!\ " /> <div className="mx_RoomStatusBar_connectionLostBar_title"> { this.props.unsentMessageError } </div> <div className="mx_RoomStatusBar_connectionLostBar_desc"> - {_tJsx("<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.", + { _tJsx("<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.", [/<a>(.*?)<\/a>/, /<a>(.*?)<\/a>/], [ - (sub) => <a className="mx_RoomStatusBar_resend_link" key="resend" onClick={ this.props.onResendAllClick }>{sub}</a>, - (sub) => <a className="mx_RoomStatusBar_resend_link" key="cancel" onClick={ this.props.onCancelAllClick }>{sub}</a>, - ] - )} + (sub) => <a className="mx_RoomStatusBar_resend_link" key="resend" onClick={this.props.onResendAllClick}>{ sub }</a>, + (sub) => <a className="mx_RoomStatusBar_resend_link" key="cancel" onClick={this.props.onCancelAllClick}>{ sub }</a>, + ], + ) } </div> </div> ); @@ -275,24 +275,24 @@ module.exports = React.createClass({ // set when you've scrolled up if (this.props.numUnreadMessages) { // MUST use var name "count" for pluralization to kick in - var unreadMsgs = _t("%(count)s new messages", {count: this.props.numUnreadMessages}); + const unreadMsgs = _t("%(count)s new messages", {count: this.props.numUnreadMessages}); return ( <div className="mx_RoomStatusBar_unreadMessagesBar" - onClick={ this.props.onScrollToBottomClick }> - {unreadMsgs} + onClick={this.props.onScrollToBottomClick}> + { unreadMsgs } </div> ); } const typingString = WhoIsTyping.whoIsTypingString( this.state.usersTyping, - this.props.whoIsTypingLimit + this.props.whoIsTypingLimit, ); if (typingString) { return ( <div className="mx_RoomStatusBar_typingBar"> - <EmojiText>{typingString}</EmojiText> + <EmojiText>{ typingString }</EmojiText> </div> ); } @@ -300,7 +300,7 @@ module.exports = React.createClass({ if (this.props.hasActiveCall) { return ( <div className="mx_RoomStatusBar_callBar"> - <b>{_t('Active call')}</b> + <b>{ _t('Active call') }</b> </div> ); } @@ -310,15 +310,15 @@ module.exports = React.createClass({ render: function() { - var content = this._getContent(); - var indicator = this._getIndicator(this.state.usersTyping.length > 0); + const content = this._getContent(); + const indicator = this._getIndicator(this.state.usersTyping.length > 0); return ( <div className="mx_RoomStatusBar"> <div className="mx_RoomStatusBar_indicator"> - {indicator} + { indicator } </div> - {content} + { content } </div> ); }, diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index e0332b1b19..04d43e1f44 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -22,25 +22,25 @@ limitations under the License. import shouldHideEvent from "../../shouldHideEvent"; -var React = require("react"); -var ReactDOM = require("react-dom"); +const React = require("react"); +const ReactDOM = require("react-dom"); import Promise from 'bluebird'; -var classNames = require("classnames"); -var Matrix = require("matrix-js-sdk"); +const classNames = require("classnames"); +const Matrix = require("matrix-js-sdk"); import { _t } from '../../languageHandler'; -var UserSettingsStore = require('../../UserSettingsStore'); -var MatrixClientPeg = require("../../MatrixClientPeg"); -var ContentMessages = require("../../ContentMessages"); -var Modal = require("../../Modal"); -var sdk = require('../../index'); -var CallHandler = require('../../CallHandler'); -var Resend = require("../../Resend"); -var dis = require("../../dispatcher"); -var Tinter = require("../../Tinter"); -var rate_limited_func = require('../../ratelimitedfunc'); -var ObjectUtils = require('../../ObjectUtils'); -var Rooms = require('../../Rooms'); +const UserSettingsStore = require('../../UserSettingsStore'); +const MatrixClientPeg = require("../../MatrixClientPeg"); +const ContentMessages = require("../../ContentMessages"); +const Modal = require("../../Modal"); +const sdk = require('../../index'); +const CallHandler = require('../../CallHandler'); +const Resend = require("../../Resend"); +const dis = require("../../dispatcher"); +const Tinter = require("../../Tinter"); +const rate_limited_func = require('../../ratelimitedfunc'); +const ObjectUtils = require('../../ObjectUtils'); +const Rooms = require('../../Rooms'); import KeyCode from '../../KeyCode'; @@ -49,7 +49,7 @@ import UserProvider from '../../autocomplete/UserProvider'; import RoomViewStore from '../../stores/RoomViewStore'; import RoomScrollStateStore from '../../stores/RoomScrollStateStore'; -let DEBUG = false; +const DEBUG = false; let debuglog = function() {}; const BROWSER_SUPPORTS_SANDBOX = 'sandbox' in document.createElement('iframe'); @@ -307,10 +307,10 @@ module.exports = React.createClass({ }, componentDidMount: function() { - var call = this._getCallForRoom(); - var callState = call ? call.call_state : "ended"; + const call = this._getCallForRoom(); + const callState = call ? call.call_state : "ended"; this.setState({ - callState: callState + callState: callState, }); this._updateConfCallNotification(); @@ -327,9 +327,8 @@ module.exports = React.createClass({ this.state.room.getJoinedMembers().length == 1 && this.state.room.getLiveTimeline() && this.state.room.getLiveTimeline().getEvents() && - this.state.room.getLiveTimeline().getEvents().length <= 6) - { - var inviteBox = document.getElementById("mx_SearchableEntityList_query"); + this.state.room.getLiveTimeline().getEvents().length <= 6) { + const inviteBox = document.getElementById("mx_SearchableEntityList_query"); setTimeout(function() { if (inviteBox) { inviteBox.focus(); @@ -345,7 +344,7 @@ module.exports = React.createClass({ componentDidUpdate: function() { if (this.refs.roomView) { - var roomView = ReactDOM.findDOMNode(this.refs.roomView); + const roomView = ReactDOM.findDOMNode(this.refs.roomView); if (!roomView.ondrop) { roomView.addEventListener('drop', this.onDrop); roomView.addEventListener('dragover', this.onDragOver); @@ -372,7 +371,7 @@ module.exports = React.createClass({ // is really just for hygiene - we're going to be // deleted anyway, so it doesn't matter if the event listeners // don't get cleaned up. - var roomView = ReactDOM.findDOMNode(this.refs.roomView); + const roomView = ReactDOM.findDOMNode(this.refs.roomView); roomView.removeEventListener('drop', this.onDrop); roomView.removeEventListener('dragover', this.onDragOver); roomView.removeEventListener('dragleave', this.onDragLeaveOrEnd); @@ -478,8 +477,7 @@ module.exports = React.createClass({ if (call) { callState = call.call_state; - } - else { + } else { callState = "ended"; } @@ -591,17 +589,17 @@ module.exports = React.createClass({ }, _calculatePeekRules: function(room) { - var guestAccessEvent = room.currentState.getStateEvents("m.room.guest_access", ""); + const guestAccessEvent = room.currentState.getStateEvents("m.room.guest_access", ""); if (guestAccessEvent && guestAccessEvent.getContent().guest_access === "can_join") { this.setState({ - guestsCanJoin: true + guestsCanJoin: true, }); } - var historyVisibility = room.currentState.getStateEvents("m.room.history_visibility", ""); + const historyVisibility = room.currentState.getStateEvents("m.room.history_visibility", ""); if (historyVisibility && historyVisibility.getContent().history_visibility === "world_readable") { this.setState({ - canPeek: true + canPeek: true, }); } }, @@ -610,35 +608,35 @@ module.exports = React.createClass({ // console.log("_updatePreviewUrlVisibility"); // check our per-room overrides - var roomPreviewUrls = room.getAccountData("org.matrix.room.preview_urls"); + const roomPreviewUrls = room.getAccountData("org.matrix.room.preview_urls"); if (roomPreviewUrls && roomPreviewUrls.getContent().disable !== undefined) { this.setState({ - showUrlPreview: !roomPreviewUrls.getContent().disable + showUrlPreview: !roomPreviewUrls.getContent().disable, }); return; } // check our global disable override - var userRoomPreviewUrls = MatrixClientPeg.get().getAccountData("org.matrix.preview_urls"); + const userRoomPreviewUrls = MatrixClientPeg.get().getAccountData("org.matrix.preview_urls"); if (userRoomPreviewUrls && userRoomPreviewUrls.getContent().disable) { this.setState({ - showUrlPreview: false + showUrlPreview: false, }); return; } // check the room state event - var roomStatePreviewUrls = room.currentState.getStateEvents('org.matrix.room.preview_urls', ''); + const roomStatePreviewUrls = room.currentState.getStateEvents('org.matrix.room.preview_urls', ''); if (roomStatePreviewUrls && roomStatePreviewUrls.getContent().disable) { this.setState({ - showUrlPreview: false + showUrlPreview: false, }); return; } // otherwise, we assume they're on. this.setState({ - showUrlPreview: true + showUrlPreview: true, }); }, @@ -654,11 +652,11 @@ module.exports = React.createClass({ }, updateTint: function() { - var room = this.state.room; + const room = this.state.room; if (!room) return; - var color_scheme_event = room.getAccountData("org.matrix.room.color_scheme"); - var color_scheme = {}; + const color_scheme_event = room.getAccountData("org.matrix.room.color_scheme"); + let color_scheme = {}; if (color_scheme_event) { color_scheme = color_scheme_event.getContent(); // XXX: we should validate the event @@ -676,12 +674,11 @@ module.exports = React.createClass({ onRoomAccountData: function(event, room) { if (room.roomId == this.state.roomId) { if (event.getType() === "org.matrix.room.color_scheme") { - var color_scheme = event.getContent(); + const color_scheme = event.getContent(); // XXX: we should validate the event console.log("Tinter.tint from onRoomAccountData"); Tinter.tint(color_scheme.primary_color, color_scheme.secondary_color); - } - else if (event.getType() === "org.matrix.room.preview_urls") { + } else if (event.getType() === "org.matrix.room.preview_urls") { this._updatePreviewUrlVisibility(room); } } @@ -720,7 +717,7 @@ module.exports = React.createClass({ // if we are now a member of the room, where we were not before, that // means we have finished joining a room we were previously peeking // into. - var me = MatrixClientPeg.get().credentials.userId; + const me = MatrixClientPeg.get().credentials.userId; if (this.state.joining && this.state.room.hasMembershipState(me, "join")) { // Having just joined a room, check to see if it looks like a DM room, and if so, // mark it as one. This is to work around the fact that some clients don't support @@ -754,18 +751,18 @@ module.exports = React.createClass({ }, _updateConfCallNotification: function() { - var room = this.state.room; + const room = this.state.room; if (!room || !this.props.ConferenceHandler) { return; } - var confMember = room.getMember( - this.props.ConferenceHandler.getConferenceUserIdForRoom(room.roomId) + const confMember = room.getMember( + this.props.ConferenceHandler.getConferenceUserIdForRoom(room.roomId), ); if (!confMember) { return; } - var confCall = this.props.ConferenceHandler.getConferenceCallForRoom(confMember.roomId); + const confCall = this.props.ConferenceHandler.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. @@ -773,7 +770,7 @@ module.exports = React.createClass({ displayConfCallNotification: ( (!confCall || confCall.call_state === "ended") && confMember.membership === "join" - ) + ), }); }, @@ -788,7 +785,7 @@ module.exports = React.createClass({ if (this.state.searchResults.next_batch) { debuglog("requesting more search results"); - var searchPromise = MatrixClientPeg.get().backPaginateRoomEventsSearch( + const searchPromise = MatrixClientPeg.get().backPaginateRoomEventsSearch( this.state.searchResults); return this._handleSearchResult(searchPromise); } else { @@ -883,8 +880,7 @@ module.exports = React.createClass({ numUnreadMessages: 0, atEndOfLiveTimeline: true, }); - } - else { + } else { this.setState({ atEndOfLiveTimeline: false, }); @@ -898,10 +894,10 @@ module.exports = React.createClass({ ev.dataTransfer.dropEffect = 'none'; - var items = ev.dataTransfer.items; + const items = ev.dataTransfer.items; if (items.length == 1) { if (items[0].kind == 'file') { - this.setState({ draggingFile : true }); + this.setState({ draggingFile: true }); ev.dataTransfer.dropEffect = 'copy'; } } @@ -910,8 +906,8 @@ module.exports = React.createClass({ onDrop: function(ev) { ev.stopPropagation(); ev.preventDefault(); - this.setState({ draggingFile : false }); - var files = ev.dataTransfer.files; + this.setState({ draggingFile: false }); + const files = ev.dataTransfer.files; if (files.length == 1) { this.uploadFile(files[0]); } @@ -920,7 +916,7 @@ module.exports = React.createClass({ onDragLeaveOrEnd: function(ev) { ev.stopPropagation(); ev.preventDefault(); - this.setState({ draggingFile : false }); + this.setState({ draggingFile: false }); }, uploadFile: function(file) { @@ -930,7 +926,7 @@ module.exports = React.createClass({ } ContentMessages.sendContentToRoom( - file, this.state.room.roomId, MatrixClientPeg.get() + file, this.state.room.roomId, MatrixClientPeg.get(), ).done(undefined, (error) => { if (error.name === "UnknownDeviceError") { dis.dispatch({ @@ -969,19 +965,19 @@ module.exports = React.createClass({ // todo: should cancel any previous search requests. this.searchId = new Date().getTime(); - var filter; + let 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.state.room.roomId - ] + this.state.room.roomId, + ], }; } debuglog("sending search request"); - var searchPromise = MatrixClientPeg.get().searchRoomEvents({ + const searchPromise = MatrixClientPeg.get().searchRoomEvents({ filter: filter, term: term, }); @@ -989,11 +985,11 @@ module.exports = React.createClass({ }, _handleSearchResult: function(searchPromise) { - var self = this; + const self = this; // keep a record of the current search id, so that if the search terms // change before we get a response, we can ignore the results. - var localSearchId = this.searchId; + const localSearchId = this.searchId; this.setState({ searchInProgress: true, @@ -1012,7 +1008,7 @@ module.exports = React.createClass({ // In either case, we want to highlight the literal search term // whether it was used by the search engine or not. - var highlights = results.highlights; + let highlights = results.highlights; if (highlights.indexOf(self.state.searchTerm) < 0) { highlights = highlights.concat(self.state.searchTerm); } @@ -1020,14 +1016,15 @@ module.exports = React.createClass({ // For overlapping highlights, // favour longer (more specific) terms first highlights = highlights.sort(function(a, b) { - return b.length - a.length; }); + return b.length - a.length; +}); self.setState({ searchHighlights: highlights, searchResults: results, }); }, function(error) { - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Search failed: " + error); Modal.createTrackedDialog('Search failed', '', ErrorDialog, { title: _t("Search failed"), @@ -1035,17 +1032,17 @@ module.exports = React.createClass({ }); }).finally(function() { self.setState({ - searchInProgress: false + searchInProgress: false, }); }); }, getSearchResultTiles: function() { - var EventTile = sdk.getComponent('rooms.EventTile'); - var SearchResultTile = sdk.getComponent('rooms.SearchResultTile'); - var Spinner = sdk.getComponent("elements.Spinner"); + const EventTile = sdk.getComponent('rooms.EventTile'); + const SearchResultTile = sdk.getComponent('rooms.SearchResultTile'); + const Spinner = sdk.getComponent("elements.Spinner"); - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); // XXX: todo: merge overlapping results somehow? // XXX: why doesn't searching on name work? @@ -1055,7 +1052,7 @@ module.exports = React.createClass({ return []; } - var ret = []; + const ret = []; if (this.state.searchInProgress) { ret.push(<li key="search-spinner"> @@ -1067,32 +1064,32 @@ module.exports = React.createClass({ if (this.state.searchResults.results.length == 0) { ret.push(<li key="search-top-marker"> <h2 className="mx_RoomView_topMarker">{ _t("No results") }</h2> - </li> + </li>, ); } else { ret.push(<li key="search-top-marker"> <h2 className="mx_RoomView_topMarker">{ _t("No more results") }</h2> - </li> + </li>, ); } } // once dynamic content in the search results load, make the scrollPanel check // the scroll offsets. - var onWidgetLoad = () => { - var scrollPanel = this.refs.searchResultsPanel; + const onWidgetLoad = () => { + const scrollPanel = this.refs.searchResultsPanel; if (scrollPanel) { scrollPanel.checkScroll(); } }; - var lastRoomId; + let lastRoomId; - for (var i = this.state.searchResults.results.length - 1; i >= 0; i--) { - var result = this.state.searchResults.results[i]; + for (let i = this.state.searchResults.results.length - 1; i >= 0; i--) { + const result = this.state.searchResults.results[i]; - var mxEv = result.context.getEvent(); - var roomId = mxEv.getRoomId(); + const mxEv = result.context.getEvent(); + const roomId = mxEv.getRoomId(); if (!EventTile.haveTileForEvent(mxEv)) { // XXX: can this ever happen? It will make the result count @@ -1102,13 +1099,13 @@ module.exports = React.createClass({ if (this.state.searchScope === 'All') { if(roomId != lastRoomId) { - var room = cli.getRoom(roomId); + const room = cli.getRoom(roomId); // XXX: if we've left the room, we might not know about // it. We should tell the js sdk to go and find out about // it. But that's not an issue currently, as synapse only // returns results for rooms we're joined to. - var roomName = room ? room.name : _t("Unknown room %(roomId)s", { roomId: roomId }); + const roomName = room ? room.name : _t("Unknown room %(roomId)s", { roomId: roomId }); ret.push(<li key={mxEv.getId() + "-room"}> <h1>{ _t("Room") }: { roomName }</h1> @@ -1117,13 +1114,13 @@ module.exports = React.createClass({ } } - var resultLink = "#/room/"+roomId+"/"+mxEv.getId(); + const resultLink = "#/room/"+roomId+"/"+mxEv.getId(); ret.push(<SearchResultTile key={mxEv.getId()} searchResult={result} searchHighlights={this.state.searchHighlights} resultLink={resultLink} - onWidgetLoad={onWidgetLoad}/>); + onWidgetLoad={onWidgetLoad} />); } return ret; }, @@ -1139,38 +1136,37 @@ module.exports = React.createClass({ uploadingRoomSettings: true, }); - var newName = this.refs.header.getEditedName(); + const newName = this.refs.header.getEditedName(); if (newName !== undefined) { this.refs.room_settings.setName(newName); } - var newTopic = this.refs.header.getEditedTopic(); + const newTopic = this.refs.header.getEditedTopic(); if (newTopic !== undefined) { this.refs.room_settings.setTopic(newTopic); } this.refs.room_settings.save().then((results) => { - var fails = results.filter(function(result) { return result.state !== "fulfilled"; }); + const fails = results.filter(function(result) { return result.state !== "fulfilled"; }); console.log("Settings saved with %s errors", fails.length); if (fails.length) { fails.forEach(function(result) { console.error(result.reason); }); - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Failed to save room settings', '', ErrorDialog, { title: _t("Failed to save settings"), description: fails.map(function(result) { return result.reason; }).join("\n"), }); // still editing room settings - } - else { + } else { this.setState({ - editingRoomSettings: false + editingRoomSettings: false, }); } }).finally(() => { this.setState({ uploadingRoomSettings: false, - editingRoomSettings: false + editingRoomSettings: false, }); }).done(); }, @@ -1201,8 +1197,8 @@ module.exports = React.createClass({ MatrixClientPeg.get().forget(this.state.room.roomId).done(function() { dis.dispatch({ action: 'view_next_room' }); }, function(err) { - var errCode = err.errcode || _t("unknown error code"); - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const errCode = err.errcode || _t("unknown error code"); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Failed to forget room', '', ErrorDialog, { title: _t("Error"), description: _t("Failed to forget room %(errCode)s", { errCode: errCode }), @@ -1211,20 +1207,20 @@ module.exports = React.createClass({ }, onRejectButtonClicked: function(ev) { - var self = this; + const self = this; this.setState({ - rejecting: true + rejecting: true, }); MatrixClientPeg.get().leave(this.state.roomId).done(function() { dis.dispatch({ action: 'view_next_room' }); self.setState({ - rejecting: false + rejecting: false, }); }, function(error) { console.error("Failed to reject invite: %s", error); - var msg = error.message ? error.message : JSON.stringify(error); - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const msg = error.message ? error.message : JSON.stringify(error); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Failed to reject invite', '', ErrorDialog, { title: _t("Failed to reject invite"), description: msg, @@ -1232,7 +1228,7 @@ module.exports = React.createClass({ self.setState({ rejecting: false, - rejectError: error + rejectError: error, }); }); }, @@ -1292,7 +1288,7 @@ module.exports = React.createClass({ // restored when we switch back to it. // _getScrollState: function() { - var messagePanel = this.refs.messagePanel; + const messagePanel = this.refs.messagePanel; if (!messagePanel) return null; // if we're following the live timeline, we want to return null; that @@ -1307,7 +1303,7 @@ module.exports = React.createClass({ return null; } - var scrollState = messagePanel.getScrollState(); + const scrollState = messagePanel.getScrollState(); if (scrollState.stuckAtBottom) { // we don't really expect to be in this state, but it will @@ -1334,7 +1330,7 @@ module.exports = React.createClass({ // a maxHeight on the underlying remote video tag. // header + footer + status + give us at least 120px of scrollback at all times. - var auxPanelMaxHeight = window.innerHeight - + let auxPanelMaxHeight = window.innerHeight - (83 + // height of RoomHeader 36 + // height of the status area 72 + // minimum height of the message compmoser @@ -1353,26 +1349,26 @@ module.exports = React.createClass({ onFullscreenClick: function() { dis.dispatch({ action: 'video_fullscreen', - fullscreen: true + fullscreen: true, }, true); }, onMuteAudioClick: function() { - var call = this._getCallForRoom(); + const call = this._getCallForRoom(); if (!call) { return; } - var newState = !call.isMicrophoneMuted(); + const newState = !call.isMicrophoneMuted(); call.setMicrophoneMuted(newState); this.forceUpdate(); // TODO: just update the voip buttons }, onMuteVideoClick: function() { - var call = this._getCallForRoom(); + const call = this._getCallForRoom(); if (!call) { return; } - var newState = !call.isLocalVideoMuted(); + const newState = !call.isLocalVideoMuted(); call.setLocalVideoMuted(newState); this.forceUpdate(); // TODO: just update the voip buttons }, @@ -1408,7 +1404,7 @@ module.exports = React.createClass({ * We pass it down to the scroll panel. */ handleScrollKey: function(ev) { - var panel; + let panel; if(this.refs.searchResultsPanel) { panel = this.refs.searchResultsPanel; } else if(this.refs.messagePanel) { @@ -1478,13 +1474,13 @@ module.exports = React.createClass({ <RoomHeader ref="header" room={this.state.room} oobData={this.props.oobData} - collapsedRhs={ this.props.collapsedRhs } + collapsedRhs={this.props.collapsedRhs} /> <div className="mx_RoomView_auxPanel"> - <RoomPreviewBar onJoinClick={ this.onJoinButtonClicked } - onForgetClick={ this.onForgetClick } - onRejectClick={ this.onRejectThreepidInviteButtonClicked } - canPreview={ false } error={ this.state.roomLoadError } + <RoomPreviewBar onJoinClick={this.onJoinButtonClicked} + onForgetClick={this.onForgetClick} + onRejectClick={this.onRejectThreepidInviteButtonClicked} + canPreview={false} error={this.state.roomLoadError} roomAlias={roomAlias} spinner={this.state.joining} inviterName={inviterName} @@ -1498,8 +1494,8 @@ module.exports = React.createClass({ } } - var myUserId = MatrixClientPeg.get().credentials.userId; - var myMember = this.state.room.getMember(myUserId); + const myUserId = MatrixClientPeg.get().credentials.userId; + const myMember = this.state.room.getMember(myUserId); if (myMember && myMember.membership == 'invite') { if (this.state.joining || this.state.rejecting) { return ( @@ -1508,7 +1504,7 @@ module.exports = React.createClass({ </div> ); } else { - var inviteEvent = myMember.events.member; + const inviteEvent = myMember.events.member; var inviterName = inviteEvent.sender ? inviteEvent.sender.name : inviteEvent.getSender(); // We deliberately don't try to peek into invites, even if we have permission to peek @@ -1521,14 +1517,14 @@ module.exports = React.createClass({ <RoomHeader ref="header" room={this.state.room} - collapsedRhs={ this.props.collapsedRhs } + collapsedRhs={this.props.collapsedRhs} /> <div className="mx_RoomView_auxPanel"> - <RoomPreviewBar onJoinClick={ this.onJoinButtonClicked } - onForgetClick={ this.onForgetClick } - onRejectClick={ this.onRejectButtonClicked } - inviterName={ inviterName } - canPreview={ false } + <RoomPreviewBar onJoinClick={this.onJoinButtonClicked} + onForgetClick={this.onForgetClick} + onRejectClick={this.onRejectButtonClicked} + inviterName={inviterName} + canPreview={false} spinner={this.state.joining} room={this.state.room} /> @@ -1542,24 +1538,24 @@ module.exports = React.createClass({ // We have successfully loaded this room, and are not previewing. // Display the "normal" room view. - var call = this._getCallForRoom(); - var inCall = false; + const call = this._getCallForRoom(); + let inCall = false; if (call && (this.state.callState !== 'ended' && this.state.callState !== 'ringing')) { inCall = true; } - var scrollheader_classes = classNames({ + const scrollheader_classes = classNames({ mx_RoomView_scrollheader: true, }); - var statusBar; + let statusBar; let isStatusAreaExpanded = true; if (ContentMessages.getCurrentUploads().length > 0) { - var UploadBar = sdk.getComponent('structures.UploadBar'); + const UploadBar = sdk.getComponent('structures.UploadBar'); statusBar = <UploadBar room={this.state.room} />; } else if (!this.state.searchResults) { - var RoomStatusBar = sdk.getComponent('structures.RoomStatusBar'); + const RoomStatusBar = sdk.getComponent('structures.RoomStatusBar'); isStatusAreaExpanded = this.state.statusBarVisible; statusBar = <RoomStatusBar room={this.state.room} @@ -1582,12 +1578,12 @@ module.exports = React.createClass({ if (this.state.editingRoomSettings) { aux = <RoomSettings ref="room_settings" onSaveClick={this.onSettingsSaveClick} onCancelClick={this.onCancelClick} room={this.state.room} />; } else if (this.state.uploadingRoomSettings) { - aux = <Loader/>; + aux = <Loader />; } else if (this.state.forwardingEvent !== null) { aux = <ForwardMessage onCancelClick={this.onCancelClick} />; } else if (this.state.searching) { hideCancel = true; // has own cancel - aux = <SearchBar ref="search_bar" searchInProgress={this.state.searchInProgress } onCancelClick={this.onCancelSearchClick} onSearch={this.onSearch}/>; + aux = <SearchBar ref="search_bar" searchInProgress={this.state.searchInProgress} onCancelClick={this.onCancelSearchClick} onSearch={this.onSearch} />; } else if (!myMember || myMember.membership !== "join") { // We do have a room object for this room, but we're not currently in it. // We may have a 3rd party invite to it. @@ -1602,7 +1598,7 @@ module.exports = React.createClass({ hideCancel = true; aux = ( <RoomPreviewBar onJoinClick={this.onJoinButtonClicked} - onForgetClick={ this.onForgetClick } + onForgetClick={this.onForgetClick} onRejectClick={this.onRejectThreepidInviteButtonClicked} spinner={this.state.joining} inviterName={inviterName} @@ -1613,7 +1609,7 @@ module.exports = React.createClass({ ); } - var auxPanel = ( + const auxPanel = ( <AuxPanel ref="auxPanel" room={this.state.room} userId={MatrixClientPeg.get().credentials.userId} conferenceHandler={this.props.ConferenceHandler} @@ -1626,8 +1622,8 @@ module.exports = React.createClass({ </AuxPanel> ); - var messageComposer, searchInfo; - var canSpeak = ( + let messageComposer, searchInfo; + const canSpeak = ( // joined and not showing search results myMember && (myMember.membership == 'join') && !this.state.searchResults ); @@ -1638,8 +1634,8 @@ module.exports = React.createClass({ onResize={this.onChildResize} uploadFile={this.uploadFile} callState={this.state.callState} - opacity={ this.props.opacity } - showApps={ this.state.showApps } + opacity={this.props.opacity} + showApps={this.state.showApps} />; } @@ -1647,19 +1643,19 @@ module.exports = React.createClass({ // in this.state if this is what RoomHeader desires? if (this.state.searchResults) { searchInfo = { - searchTerm : this.state.searchTerm, - searchScope : this.state.searchScope, - searchCount : this.state.searchResults.count, + searchTerm: this.state.searchTerm, + searchScope: this.state.searchScope, + searchCount: this.state.searchResults.count, }; } if (inCall) { - var zoomButton, voiceMuteButton, videoMuteButton; + let zoomButton, voiceMuteButton, videoMuteButton; if (call.type === "video") { zoomButton = ( - <div className="mx_RoomView_voipButton" onClick={this.onFullscreenClick} title={ _t("Fill screen") }> - <TintableSvg src="img/fullscreen.svg" width="29" height="22" style={{ marginTop: 1, marginRight: 4 }}/> + <div className="mx_RoomView_voipButton" onClick={this.onFullscreenClick} title={_t("Fill screen")}> + <TintableSvg src="img/fullscreen.svg" width="29" height="22" style={{ marginTop: 1, marginRight: 4 }} /> </div> ); @@ -1667,14 +1663,14 @@ module.exports = React.createClass({ <div className="mx_RoomView_voipButton" onClick={this.onMuteVideoClick}> <TintableSvg src={call.isLocalVideoMuted() ? "img/video-unmute.svg" : "img/video-mute.svg"} alt={call.isLocalVideoMuted() ? _t("Click to unmute video") : _t("Click to mute video")} - width="31" height="27"/> + width="31" height="27" /> </div>; } voiceMuteButton = <div className="mx_RoomView_voipButton" onClick={this.onMuteAudioClick}> <TintableSvg src={call.isMicrophoneMuted() ? "img/voice-unmute.svg" : "img/voice-mute.svg"} alt={call.isMicrophoneMuted() ? _t("Click to unmute audio") : _t("Click to mute audio")} - width="21" height="26"/> + width="21" height="26" /> </div>; // wrap the existing status bar into a 'callStatusBar' which adds more knobs. @@ -1684,25 +1680,25 @@ module.exports = React.createClass({ { videoMuteButton } { zoomButton } { statusBar } - <TintableSvg className="mx_RoomView_voipChevron" src="img/voip-chevron.svg" width="22" height="17"/> + <TintableSvg className="mx_RoomView_voipChevron" src="img/voip-chevron.svg" width="22" height="17" /> </div>; } // if we have search results, we keep the messagepanel (so that it preserves its // scroll state), but hide it. - var searchResultsPanel; - var hideMessagePanel = false; + let searchResultsPanel; + let hideMessagePanel = false; if (this.state.searchResults) { searchResultsPanel = ( <ScrollPanel ref="searchResultsPanel" className="mx_RoomView_messagePanel mx_RoomView_searchResultsPanel" - onFillRequest={ this.onSearchResultsFillRequest } - onResize={ this.onSearchResultsResize } + onFillRequest={this.onSearchResultsFillRequest} + onResize={this.onSearchResultsResize} style={{ opacity: this.props.opacity }} > <li className={scrollheader_classes}></li> - {this.getSearchResultTiles()} + { this.getSearchResultTiles() } </ScrollPanel> ); hideMessagePanel = true; @@ -1717,7 +1713,7 @@ module.exports = React.createClass({ } // console.log("ShowUrlPreview for %s is %s", this.state.room.roomId, this.state.showUrlPreview); - var messagePanel = ( + const messagePanel = ( <TimelinePanel ref={this._gatherTimelinePanelRef} timelineSet={this.state.room.getUnfilteredTimelineSet()} showReadReceipts={!UserSettingsStore.getSyncedSetting('hideReadReceipts', false)} @@ -1727,16 +1723,16 @@ module.exports = React.createClass({ highlightedEventId={highlightedEventId} eventId={this.state.initialEventId} eventPixelOffset={this.state.initialEventPixelOffset} - onScroll={ this.onMessageListScroll } - onReadMarkerUpdated={ this._updateTopUnreadMessagesBar } - showUrlPreview = { this.state.showUrlPreview } - opacity={ this.props.opacity } + onScroll={this.onMessageListScroll} + onReadMarkerUpdated={this._updateTopUnreadMessagesBar} + showUrlPreview = {this.state.showUrlPreview} + opacity={this.props.opacity} className="mx_RoomView_messagePanel" />); - var topUnreadMessagesBar = null; + let topUnreadMessagesBar = null; if (this.state.showTopUnreadMessagesBar) { - var TopUnreadMessagesBar = sdk.getComponent('rooms.TopUnreadMessagesBar'); + const TopUnreadMessagesBar = sdk.getComponent('rooms.TopUnreadMessagesBar'); topUnreadMessagesBar = ( <div className="mx_RoomView_topUnreadMessagesBar mx_fadable" style={{ opacity: this.props.opacity }}> <TopUnreadMessagesBar @@ -1752,13 +1748,13 @@ module.exports = React.createClass({ } return ( - <div className={ "mx_RoomView" + (inCall ? " mx_RoomView_inCall" : "") } ref="roomView"> + <div className={"mx_RoomView" + (inCall ? " mx_RoomView_inCall" : "")} ref="roomView"> <RoomHeader ref="header" room={this.state.room} searchInfo={searchInfo} oobData={this.props.oobData} editing={this.state.editingRoomSettings} saving={this.state.uploadingRoomSettings} inRoom={myMember && myMember.membership === 'join'} - collapsedRhs={ this.props.collapsedRhs } + collapsedRhs={this.props.collapsedRhs} onSearchClick={this.onSearchClick} onSettingsClick={this.onSettingsClick} onSaveClick={this.onSettingsSaveClick} diff --git a/src/components/structures/ScrollPanel.js b/src/components/structures/ScrollPanel.js index ae3ffe66e3..62787d8cb3 100644 --- a/src/components/structures/ScrollPanel.js +++ b/src/components/structures/ScrollPanel.js @@ -14,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require("react"); -var ReactDOM = require("react-dom"); -var GeminiScrollbar = require('react-gemini-scrollbar'); +const React = require("react"); +const ReactDOM = require("react-dom"); +const GeminiScrollbar = require('react-gemini-scrollbar'); import Promise from 'bluebird'; -var KeyCode = require('../../KeyCode'); +const KeyCode = require('../../KeyCode'); -var DEBUG_SCROLL = false; +const DEBUG_SCROLL = false; // var DEBUG_SCROLL = true; // The amount of extra scroll distance to allow prior to unfilling. @@ -178,7 +178,7 @@ module.exports = React.createClass({ }, onScroll: function(ev) { - var sn = this._getScrollNode(); + const sn = this._getScrollNode(); debuglog("Scroll event: offset now:", sn.scrollTop, "_lastSetScroll:", this._lastSetScroll); @@ -238,7 +238,7 @@ module.exports = React.createClass({ // about whether the the content is scrolled down right now, irrespective of // whether it will stay that way when the children update. isAtBottom: function() { - var sn = this._getScrollNode(); + const sn = this._getScrollNode(); // there seems to be some bug with flexbox/gemini/chrome/richvdh's // understanding of the box model, wherein the scrollNode ends up 2 @@ -281,7 +281,7 @@ module.exports = React.createClass({ // |#########| | // `---------' - _getExcessHeight: function(backwards) { - var sn = this._getScrollNode(); + const sn = this._getScrollNode(); if (backwards) { return sn.scrollTop - sn.clientHeight - UNPAGINATION_PADDING; } else { @@ -295,7 +295,7 @@ module.exports = React.createClass({ return; } - var sn = this._getScrollNode(); + const sn = this._getScrollNode(); // if there is less than a screenful of messages above or below the // viewport, try to get some more messages. @@ -377,7 +377,7 @@ module.exports = React.createClass({ // check if there is already a pending fill request. If not, set one off. _maybeFill: function(backwards) { - var dir = backwards ? 'b' : 'f'; + const dir = backwards ? 'b' : 'f'; if (this._pendingFillRequests[dir]) { debuglog("ScrollPanel: Already a "+dir+" fill in progress - not starting another"); return; @@ -470,8 +470,8 @@ module.exports = React.createClass({ * mult: -1 to page up, +1 to page down */ scrollRelative: function(mult) { - var scrollNode = this._getScrollNode(); - var delta = mult * scrollNode.clientHeight * 0.5; + const scrollNode = this._getScrollNode(); + const delta = mult * scrollNode.clientHeight * 0.5; this._setScrollTop(scrollNode.scrollTop + delta); this._saveScrollState(); }, @@ -535,7 +535,7 @@ module.exports = React.createClass({ this.scrollState = { stuckAtBottom: false, trackedScrollToken: scrollToken, - pixelOffset: pixelOffset + pixelOffset: pixelOffset, }; // ... then make it so. @@ -546,10 +546,10 @@ module.exports = React.createClass({ // given offset in the window. A helper for _restoreSavedScrollState. _scrollToToken: function(scrollToken, pixelOffset) { /* find the dom node with the right scrolltoken */ - var node; - var messages = this.refs.itemlist.children; - for (var i = messages.length-1; i >= 0; --i) { - var m = messages[i]; + let node; + const messages = this.refs.itemlist.children; + for (let i = messages.length-1; i >= 0; --i) { + const m = messages[i]; // 'data-scroll-tokens' is a DOMString of comma-separated scroll tokens // There might only be one scroll token if (m.dataset.scrollTokens && @@ -564,10 +564,10 @@ module.exports = React.createClass({ return; } - var scrollNode = this._getScrollNode(); - var wrapperRect = ReactDOM.findDOMNode(this).getBoundingClientRect(); - var boundingRect = node.getBoundingClientRect(); - var scrollDelta = boundingRect.bottom + pixelOffset - wrapperRect.bottom; + const scrollNode = this._getScrollNode(); + const wrapperRect = ReactDOM.findDOMNode(this).getBoundingClientRect(); + const boundingRect = node.getBoundingClientRect(); + const scrollDelta = boundingRect.bottom + pixelOffset - wrapperRect.bottom; debuglog("ScrollPanel: scrolling to token '" + scrollToken + "'+" + pixelOffset + " (delta: "+scrollDelta+")"); @@ -575,7 +575,6 @@ module.exports = React.createClass({ if(scrollDelta != 0) { this._setScrollTop(scrollNode.scrollTop + scrollDelta); } - }, _saveScrollState: function() { @@ -585,16 +584,16 @@ module.exports = React.createClass({ return; } - var itemlist = this.refs.itemlist; - var wrapperRect = ReactDOM.findDOMNode(this).getBoundingClientRect(); - var messages = itemlist.children; + const itemlist = this.refs.itemlist; + const wrapperRect = ReactDOM.findDOMNode(this).getBoundingClientRect(); + const messages = itemlist.children; let newScrollState = null; - for (var i = messages.length-1; i >= 0; --i) { - var node = messages[i]; + for (let i = messages.length-1; i >= 0; --i) { + const node = messages[i]; if (!node.dataset.scrollTokens) continue; - var boundingRect = node.getBoundingClientRect(); + const boundingRect = node.getBoundingClientRect(); newScrollState = { stuckAtBottom: false, trackedScrollToken: node.dataset.scrollTokens.split(',')[0], @@ -619,8 +618,8 @@ module.exports = React.createClass({ }, _restoreSavedScrollState: function() { - var scrollState = this.scrollState; - var scrollNode = this._getScrollNode(); + const scrollState = this.scrollState; + const scrollNode = this._getScrollNode(); if (scrollState.stuckAtBottom) { this._setScrollTop(Number.MAX_VALUE); @@ -631,9 +630,9 @@ module.exports = React.createClass({ }, _setScrollTop: function(scrollTop) { - var scrollNode = this._getScrollNode(); + const scrollNode = this._getScrollNode(); - var prevScroll = scrollNode.scrollTop; + const prevScroll = scrollNode.scrollTop; // FF ignores attempts to set scrollTop to very large numbers scrollNode.scrollTop = Math.min(scrollTop, scrollNode.scrollHeight); @@ -676,7 +675,7 @@ module.exports = React.createClass({ className={this.props.className} style={this.props.style}> <div className="mx_RoomView_messageListWrapper"> <ol ref="itemlist" className="mx_RoomView_MessageList" aria-live="polite"> - {this.props.children} + { this.props.children } </ol> </div> </GeminiScrollbar> diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index c4723f515d..e3b3b66f97 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -15,27 +15,27 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require('react'); -var ReactDOM = require("react-dom"); +const React = require('react'); +const ReactDOM = require("react-dom"); import Promise from 'bluebird'; -var Matrix = require("matrix-js-sdk"); -var EventTimeline = Matrix.EventTimeline; +const Matrix = require("matrix-js-sdk"); +const EventTimeline = Matrix.EventTimeline; -var sdk = require('../../index'); +const sdk = require('../../index'); import { _t } from '../../languageHandler'; -var MatrixClientPeg = require("../../MatrixClientPeg"); -var dis = require("../../dispatcher"); -var ObjectUtils = require('../../ObjectUtils'); -var Modal = require("../../Modal"); -var UserActivity = require("../../UserActivity"); -var KeyCode = require('../../KeyCode'); +const MatrixClientPeg = require("../../MatrixClientPeg"); +const dis = require("../../dispatcher"); +const ObjectUtils = require('../../ObjectUtils'); +const Modal = require("../../Modal"); +const UserActivity = require("../../UserActivity"); +const KeyCode = require('../../KeyCode'); import UserSettingsStore from '../../UserSettingsStore'; -var PAGINATE_SIZE = 20; -var INITIAL_SIZE = 20; +const PAGINATE_SIZE = 20; +const INITIAL_SIZE = 20; -var DEBUG = false; +const DEBUG = false; if (DEBUG) { // using bind means that we get to keep useful line numbers in the console @@ -260,7 +260,7 @@ var TimelinePanel = React.createClass({ dis.unregister(this.dispatcherRef); - var client = MatrixClientPeg.get(); + const client = MatrixClientPeg.get(); if (client) { client.removeListener("Room.timeline", this.onRoomTimeline); client.removeListener("Room.timelineReset", this.onRoomTimelineReset); @@ -275,20 +275,20 @@ var TimelinePanel = React.createClass({ onMessageListUnfillRequest: function(backwards, scrollToken) { // If backwards, unpaginate from the back (i.e. the start of the timeline) - let dir = backwards ? EventTimeline.BACKWARDS : EventTimeline.FORWARDS; + const dir = backwards ? EventTimeline.BACKWARDS : EventTimeline.FORWARDS; debuglog("TimelinePanel: unpaginating events in direction", dir); // All tiles are inserted by MessagePanel to have a scrollToken === eventId, and // this particular event should be the first or last to be unpaginated. - let eventId = scrollToken; + const eventId = scrollToken; - let marker = this.state.events.findIndex( + const marker = this.state.events.findIndex( (ev) => { return ev.getId() === eventId; - } + }, ); - let count = backwards ? marker + 1 : this.state.events.length - marker; + const count = backwards ? marker + 1 : this.state.events.length - marker; if (count > 0) { debuglog("TimelinePanel: Unpaginating", count, "in direction", dir); @@ -305,9 +305,9 @@ var TimelinePanel = React.createClass({ // set off a pagination request. onMessageListFillRequest: function(backwards) { - var dir = backwards ? EventTimeline.BACKWARDS : EventTimeline.FORWARDS; - var canPaginateKey = backwards ? 'canBackPaginate' : 'canForwardPaginate'; - var paginatingKey = backwards ? 'backPaginating' : 'forwardPaginating'; + const dir = backwards ? EventTimeline.BACKWARDS : EventTimeline.FORWARDS; + const canPaginateKey = backwards ? 'canBackPaginate' : 'canForwardPaginate'; + const paginatingKey = backwards ? 'backPaginating' : 'forwardPaginating'; if (!this.state[canPaginateKey]) { debuglog("TimelinePanel: have given up", dir, "paginating this timeline"); @@ -328,7 +328,7 @@ var TimelinePanel = React.createClass({ debuglog("TimelinePanel: paginate complete backwards:"+backwards+"; success:"+r); - var newState = { + const newState = { [paginatingKey]: false, [canPaginateKey]: r, events: this._getEvents(), @@ -336,8 +336,8 @@ var TimelinePanel = React.createClass({ // moving the window in this direction may mean that we can now // paginate in the other where we previously could not. - var otherDirection = backwards ? EventTimeline.FORWARDS : EventTimeline.BACKWARDS; - var canPaginateOtherWayKey = backwards ? 'canForwardPaginate' : 'canBackPaginate'; + const otherDirection = backwards ? EventTimeline.FORWARDS : EventTimeline.BACKWARDS; + const canPaginateOtherWayKey = backwards ? 'canForwardPaginate' : 'canBackPaginate'; if (!this.state[canPaginateOtherWayKey] && this._timelineWindow.canPaginate(otherDirection)) { debuglog('TimelinePanel: can now', otherDirection, 'paginate again'); @@ -420,15 +420,15 @@ var TimelinePanel = React.createClass({ this._timelineWindow.paginate(EventTimeline.FORWARDS, 1, false).done(() => { if (this.unmounted) { return; } - var events = this._timelineWindow.getEvents(); - var lastEv = events[events.length-1]; + const events = this._timelineWindow.getEvents(); + const lastEv = events[events.length-1]; // if we're at the end of the live timeline, append the pending events if (this.props.timelineSet.room && !this._timelineWindow.canPaginate(EventTimeline.FORWARDS)) { events.push(...this.props.timelineSet.room.getPendingEvents()); } - var updatedState = {events: events}; + const updatedState = {events: events}; if (this.props.manageReadMarkers) { // when a new event arrives when the user is not watching the @@ -439,8 +439,8 @@ var TimelinePanel = React.createClass({ // read-marker when a remote echo of an event we have just sent takes // more than the timeout on userCurrentlyActive. // - var myUserId = MatrixClientPeg.get().credentials.userId; - var sender = ev.sender ? ev.sender.userId : null; + const myUserId = MatrixClientPeg.get().credentials.userId; + const sender = ev.sender ? ev.sender.userId : null; var callback = null; if (sender != myUserId && !UserActivity.userCurrentlyActive()) { updatedState.readMarkerVisible = true; @@ -646,7 +646,7 @@ var TimelinePanel = React.createClass({ // and we'll get confused when their ID changes and we can't figure out // where the RM is pointing to. The read marker will be invisible for // now anyway, so this doesn't really matter. - var lastDisplayedIndex = this._getLastDisplayedEventIndex({ + const lastDisplayedIndex = this._getLastDisplayedEventIndex({ allowPartial: true, ignoreEchoes: true, }); @@ -655,7 +655,7 @@ var TimelinePanel = React.createClass({ return; } - var lastDisplayedEvent = this.state.events[lastDisplayedIndex]; + const lastDisplayedEvent = this.state.events[lastDisplayedIndex]; this._setReadMarker(lastDisplayedEvent.getId(), lastDisplayedEvent.getTs()); @@ -676,7 +676,7 @@ var TimelinePanel = React.createClass({ // we call _timelineWindow.getEvents() rather than using // this.state.events, because react batches the update to the latter, so it // may not have been updated yet. - var events = this._timelineWindow.getEvents(); + const events = this._timelineWindow.getEvents(); // first find where the current RM is for (var i = 0; i < events.length; i++) { @@ -689,7 +689,7 @@ var TimelinePanel = React.createClass({ } // now think about advancing it - var myUserId = MatrixClientPeg.get().credentials.userId; + const myUserId = MatrixClientPeg.get().credentials.userId; for (i++; i < events.length; i++) { var ev = events[i]; if (!ev.sender || ev.sender.userId != myUserId) { @@ -734,7 +734,7 @@ var TimelinePanel = React.createClass({ // // a quick way to figure out if we've loaded the relevant event is // simply to check if the messagepanel knows where the read-marker is. - var ret = this.refs.messagePanel.getReadMarkerPosition(); + const ret = this.refs.messagePanel.getReadMarkerPosition(); if (ret !== null) { // The messagepanel knows where the RM is, so we must have loaded // the relevant event. @@ -755,13 +755,13 @@ var TimelinePanel = React.createClass({ forgetReadMarker: function() { if (!this.props.manageReadMarkers) return; - var rmId = this._getCurrentReadReceipt(); + const rmId = this._getCurrentReadReceipt(); // see if we know the timestamp for the rr event - var tl = this.props.timelineSet.getTimelineForEvent(rmId); - var rmTs; + const tl = this.props.timelineSet.getTimelineForEvent(rmId); + let rmTs; if (tl) { - var event = tl.getEvents().find((e) => { return e.getId() == rmId; }); + const event = tl.getEvents().find((e) => { return e.getId() == rmId; }); if (event) { rmTs = event.getTs(); } @@ -801,7 +801,7 @@ var TimelinePanel = React.createClass({ if (!this.props.manageReadMarkers) return null; if (!this.refs.messagePanel) return null; - var ret = this.refs.messagePanel.getReadMarkerPosition(); + const ret = this.refs.messagePanel.getReadMarkerPosition(); if (ret !== null) { return ret; } @@ -844,8 +844,7 @@ var TimelinePanel = React.createClass({ // jump to the live timeline on ctrl-end, rather than the end of the // timeline window. if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey && - ev.keyCode == KeyCode.END) - { + ev.keyCode == KeyCode.END) { this.jumpToLiveTimeline(); } else { this.refs.messagePanel.handleScrollKey(ev); @@ -853,12 +852,12 @@ var TimelinePanel = React.createClass({ }, _initTimeline: function(props) { - var initialEvent = props.eventId; - var pixelOffset = props.eventPixelOffset; + const initialEvent = props.eventId; + const pixelOffset = props.eventPixelOffset; // if a pixelOffset is given, it is relative to the bottom of the // container. If not, put the event in the middle of the container. - var offsetBase = 1; + let offsetBase = 1; if (pixelOffset == null) { offsetBase = 0.5; } @@ -887,7 +886,7 @@ var TimelinePanel = React.createClass({ MatrixClientPeg.get(), this.props.timelineSet, {windowLimit: this.props.timelineCap}); - var onLoaded = () => { + const onLoaded = () => { this._reloadEvents(); // If we switched away from the room while there were pending @@ -922,15 +921,15 @@ var TimelinePanel = React.createClass({ }); }; - var onError = (error) => { + const onError = (error) => { this.setState({timelineLoading: false}); console.error( `Error loading timeline panel at ${eventId}: ${error}`, ); - var msg = error.message ? error.message : JSON.stringify(error); - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const msg = error.message ? error.message : JSON.stringify(error); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - var onFinished; + let onFinished; // if we were given an event ID, then when the user closes the // dialog, let's jump to the end of the timeline. If we weren't, @@ -945,7 +944,7 @@ var TimelinePanel = React.createClass({ }); }; } - var message = (error.errcode == 'M_FORBIDDEN') + const message = (error.errcode == 'M_FORBIDDEN') ? _t("Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.") : _t("Tried to load a specific point in this room's timeline, but was unable to find it."); Modal.createTrackedDialog('Failed to load timeline position', '', ErrorDialog, { @@ -955,7 +954,7 @@ var TimelinePanel = React.createClass({ }); }; - var prom = this._timelineWindow.load(eventId, INITIAL_SIZE); + let prom = this._timelineWindow.load(eventId, INITIAL_SIZE); // if we already have the event in question, TimelineWindow.load // returns a resolved promise. @@ -996,7 +995,7 @@ var TimelinePanel = React.createClass({ // get the list of events from the timeline window and the pending event list _getEvents: function() { - var events = this._timelineWindow.getEvents(); + const events = this._timelineWindow.getEvents(); // if we're at the end of the live timeline, append the pending events if (!this._timelineWindow.canPaginate(EventTimeline.FORWARDS)) { @@ -1007,7 +1006,7 @@ var TimelinePanel = React.createClass({ }, _indexForEventId: function(evId) { - for (var i = 0; i < this.state.events.length; ++i) { + for (let i = 0; i < this.state.events.length; ++i) { if (evId == this.state.events[i].getId()) { return i; } @@ -1017,18 +1016,18 @@ var TimelinePanel = React.createClass({ _getLastDisplayedEventIndex: function(opts) { opts = opts || {}; - var ignoreOwn = opts.ignoreOwn || false; - var ignoreEchoes = opts.ignoreEchoes || false; - var allowPartial = opts.allowPartial || false; + const ignoreOwn = opts.ignoreOwn || false; + const ignoreEchoes = opts.ignoreEchoes || false; + const allowPartial = opts.allowPartial || false; - var messagePanel = this.refs.messagePanel; + const messagePanel = this.refs.messagePanel; if (messagePanel === undefined) return null; - var wrapperRect = ReactDOM.findDOMNode(messagePanel).getBoundingClientRect(); - var myUserId = MatrixClientPeg.get().credentials.userId; + const wrapperRect = ReactDOM.findDOMNode(messagePanel).getBoundingClientRect(); + const myUserId = MatrixClientPeg.get().credentials.userId; - for (var i = this.state.events.length-1; i >= 0; --i) { - var ev = this.state.events[i]; + for (let i = this.state.events.length-1; i >= 0; --i) { + const ev = this.state.events[i]; if (ignoreOwn && ev.sender && ev.sender.userId == myUserId) { continue; @@ -1039,10 +1038,10 @@ var TimelinePanel = React.createClass({ continue; } - var node = messagePanel.getNodeForEventId(ev.getId()); + const node = messagePanel.getNodeForEventId(ev.getId()); if (!node) continue; - var boundingRect = node.getBoundingClientRect(); + const boundingRect = node.getBoundingClientRect(); if ((allowPartial && boundingRect.top < wrapperRect.bottom) || (!allowPartial && boundingRect.bottom < wrapperRect.bottom)) { return i; @@ -1060,18 +1059,18 @@ var TimelinePanel = React.createClass({ * SDK. */ _getCurrentReadReceipt: function(ignoreSynthesized) { - var client = MatrixClientPeg.get(); + const client = MatrixClientPeg.get(); // the client can be null on logout if (client == null) { return null; } - var myUserId = client.credentials.userId; + const myUserId = client.credentials.userId; return this.props.timelineSet.room.getEventReadUpTo(myUserId, ignoreSynthesized); }, _setReadMarker: function(eventId, eventTs, inhibitSetState) { - var roomId = this.props.timelineSet.room.roomId; + const roomId = this.props.timelineSet.room.roomId; // don't update the state (and cause a re-render) if there is // no change to the RM. @@ -1096,8 +1095,8 @@ var TimelinePanel = React.createClass({ }, render: function() { - var MessagePanel = sdk.getComponent("structures.MessagePanel"); - var Loader = sdk.getComponent("elements.Spinner"); + const MessagePanel = sdk.getComponent("structures.MessagePanel"); + const Loader = sdk.getComponent("elements.Spinner"); // just show a spinner while the timeline loads. // @@ -1112,7 +1111,7 @@ var TimelinePanel = React.createClass({ // exist. if (this.state.timelineLoading) { return ( - <div className={ this.props.className + " mx_RoomView_messageListWrapper" }> + <div className={this.props.className + " mx_RoomView_messageListWrapper"}> <Loader /> </div> ); @@ -1120,7 +1119,7 @@ var TimelinePanel = React.createClass({ if (this.state.events.length == 0 && !this.state.canBackPaginate && this.props.empty) { return ( - <div className={ this.props.className + " mx_RoomView_messageListWrapper" }> + <div className={this.props.className + " mx_RoomView_messageListWrapper"}> <div className="mx_RoomView_empty">{ this.props.empty }</div> </div> ); @@ -1134,7 +1133,7 @@ var TimelinePanel = React.createClass({ // forwards, otherwise if somebody hits the bottom of the loaded // events when viewing historical messages, we get stuck in a loop // of paginating our way through the entire history of the room. - var stickyBottom = !this._timelineWindow.canPaginate(EventTimeline.FORWARDS); + const stickyBottom = !this._timelineWindow.canPaginate(EventTimeline.FORWARDS); // If the state is PREPARED, we're still waiting for the js-sdk to sync with // the HS and fetch the latest events, so we are effectively forward paginating. @@ -1143,26 +1142,26 @@ var TimelinePanel = React.createClass({ ); return ( <MessagePanel ref="messagePanel" - hidden={ this.props.hidden } - backPaginating={ this.state.backPaginating } - forwardPaginating={ forwardPaginating } - events={ this.state.events } - highlightedEventId={ this.props.highlightedEventId } - readMarkerEventId={ this.state.readMarkerEventId } - readMarkerVisible={ this.state.readMarkerVisible } - suppressFirstDateSeparator={ this.state.canBackPaginate } - showUrlPreview={ this.props.showUrlPreview } - showReadReceipts={ this.props.showReadReceipts } - ourUserId={ MatrixClientPeg.get().credentials.userId } - stickyBottom={ stickyBottom } - onScroll={ this.onMessageListScroll } - onFillRequest={ this.onMessageListFillRequest } - onUnfillRequest={ this.onMessageListUnfillRequest } - opacity={ this.props.opacity } - isTwelveHour={ this.state.isTwelveHour } - alwaysShowTimestamps={ this.state.alwaysShowTimestamps } - className={ this.props.className } - tileShape={ this.props.tileShape } + hidden={this.props.hidden} + backPaginating={this.state.backPaginating} + forwardPaginating={forwardPaginating} + events={this.state.events} + highlightedEventId={this.props.highlightedEventId} + readMarkerEventId={this.state.readMarkerEventId} + readMarkerVisible={this.state.readMarkerVisible} + suppressFirstDateSeparator={this.state.canBackPaginate} + showUrlPreview={this.props.showUrlPreview} + showReadReceipts={this.props.showReadReceipts} + ourUserId={MatrixClientPeg.get().credentials.userId} + stickyBottom={stickyBottom} + onScroll={this.onMessageListScroll} + onFillRequest={this.onMessageListFillRequest} + onUnfillRequest={this.onMessageListUnfillRequest} + opacity={this.props.opacity} + isTwelveHour={this.state.isTwelveHour} + alwaysShowTimestamps={this.state.alwaysShowTimestamps} + className={this.props.className} + tileShape={this.props.tileShape} /> ); }, diff --git a/src/components/structures/UploadBar.js b/src/components/structures/UploadBar.js index efb452927d..ca566d3a64 100644 --- a/src/components/structures/UploadBar.js +++ b/src/components/structures/UploadBar.js @@ -14,15 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require('react'); -var ContentMessages = require('../../ContentMessages'); -var dis = require('../../dispatcher'); -var filesize = require('filesize'); +const React = require('react'); +const ContentMessages = require('../../ContentMessages'); +const dis = require('../../dispatcher'); +const filesize = require('filesize'); import { _t } from '../../languageHandler'; module.exports = React.createClass({displayName: 'UploadBar', propTypes: { - room: React.PropTypes.object + room: React.PropTypes.object, }, componentDidMount: function() { @@ -46,7 +46,7 @@ module.exports = React.createClass({displayName: 'UploadBar', }, render: function() { - var uploads = ContentMessages.getCurrentUploads(); + const uploads = ContentMessages.getCurrentUploads(); // for testing UI... - also fix up the ContentMessages.getCurrentUploads().length // check in RoomView @@ -62,8 +62,8 @@ module.exports = React.createClass({displayName: 'UploadBar', return <div />; } - var upload; - for (var i = 0; i < uploads.length; ++i) { + let upload; + for (let i = 0; i < uploads.length; ++i) { if (uploads[i].roomId == this.props.room.roomId) { upload = uploads[i]; break; @@ -73,32 +73,32 @@ module.exports = React.createClass({displayName: 'UploadBar', return <div />; } - var innerProgressStyle = { - width: ((upload.loaded / (upload.total || 1)) * 100) + '%' + const innerProgressStyle = { + width: ((upload.loaded / (upload.total || 1)) * 100) + '%', }; - var uploadedSize = filesize(upload.loaded); - var totalSize = filesize(upload.total); + let uploadedSize = filesize(upload.loaded); + const totalSize = filesize(upload.total); if (uploadedSize.replace(/^.* /, '') === totalSize.replace(/^.* /, '')) { uploadedSize = uploadedSize.replace(/ .*/, ''); } // MUST use var name 'count' for pluralization to kick in - var uploadText = _t("Uploading %(filename)s and %(count)s others", {filename: upload.fileName, count: (uploads.length - 1)}); + const uploadText = _t("Uploading %(filename)s and %(count)s others", {filename: upload.fileName, count: (uploads.length - 1)}); return ( <div className="mx_UploadBar"> <div className="mx_UploadBar_uploadProgressOuter"> <div className="mx_UploadBar_uploadProgressInner" style={innerProgressStyle}></div> </div> - <img className="mx_UploadBar_uploadIcon mx_filterFlipColor" src="img/fileicon.png" width="17" height="22"/> + <img className="mx_UploadBar_uploadIcon mx_filterFlipColor" src="img/fileicon.png" width="17" height="22" /> <img className="mx_UploadBar_uploadCancel mx_filterFlipColor" src="img/cancel.svg" width="18" height="18" onClick={function() { ContentMessages.cancelUpload(upload.promise); }} /> <div className="mx_UploadBar_uploadBytes"> { uploadedSize } / { totalSize } </div> - <div className="mx_UploadBar_uploadFilename">{uploadText}</div> + <div className="mx_UploadBar_uploadFilename">{ uploadText }</div> </div> ); - } + }, }); diff --git a/src/components/structures/login/ForgotPassword.js b/src/components/structures/login/ForgotPassword.js index 1b259a08fd..3e76291d20 100644 --- a/src/components/structures/login/ForgotPassword.js +++ b/src/components/structures/login/ForgotPassword.js @@ -17,13 +17,13 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); import { _t } from '../../../languageHandler'; -var sdk = require('../../../index'); -var Modal = require("../../../Modal"); -var MatrixClientPeg = require('../../../MatrixClientPeg'); +const sdk = require('../../../index'); +const Modal = require("../../../Modal"); +const MatrixClientPeg = require('../../../MatrixClientPeg'); -var PasswordReset = require("../../../PasswordReset"); +const PasswordReset = require("../../../PasswordReset"); module.exports = React.createClass({ displayName: 'ForgotPassword', @@ -35,30 +35,30 @@ module.exports = React.createClass({ customIsUrl: React.PropTypes.string, onLoginClick: React.PropTypes.func, onRegisterClick: React.PropTypes.func, - onComplete: React.PropTypes.func.isRequired + onComplete: React.PropTypes.func.isRequired, }, getInitialState: function() { return { enteredHomeserverUrl: this.props.customHsUrl || this.props.defaultHsUrl, enteredIdentityServerUrl: this.props.customIsUrl || this.props.defaultIsUrl, - progress: null + progress: null, }; }, submitPasswordReset: function(hsUrl, identityUrl, email, password) { this.setState({ - progress: "sending_email" + progress: "sending_email", }); this.reset = new PasswordReset(hsUrl, identityUrl); this.reset.resetPassword(email, password).done(() => { this.setState({ - progress: "sent_email" + progress: "sent_email", }); }, (err) => { this.showErrorDialog(_t('Failed to send email') + ": " + err.message); this.setState({ - progress: null + progress: null, }); }); }, @@ -81,15 +81,12 @@ module.exports = React.createClass({ if (!this.state.email) { this.showErrorDialog(_t('The email address linked to your account must be entered.')); - } - else if (!this.state.password || !this.state.password2) { + } else if (!this.state.password || !this.state.password2) { this.showErrorDialog(_t('A new password must be entered.')); - } - else if (this.state.password !== this.state.password2) { + } else if (this.state.password !== this.state.password2) { this.showErrorDialog(_t('New passwords must match each other.')); - } - else { - var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + } else { + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); Modal.createTrackedDialog('Forgot Password Warning', '', QuestionDialog, { title: _t('Warning!'), description: @@ -99,7 +96,7 @@ module.exports = React.createClass({ 'end-to-end encryption keys on all devices, ' + 'making encrypted chat history unreadable, ' + 'unless you first export your room keys and re-import ' + - 'them afterwards. In future this will be improved.' + 'them afterwards. In future this will be improved.', ) } </div>, button: _t('Continue'), @@ -107,13 +104,13 @@ module.exports = React.createClass({ <button className="mx_Dialog_primary" onClick={this._onExportE2eKeysClicked}> { _t('Export E2E room keys') } - </button> + </button>, ], onFinished: (confirmed) => { if (confirmed) { this.submitPasswordReset( this.state.enteredHomeserverUrl, this.state.enteredIdentityServerUrl, - this.state.email, this.state.password + this.state.email, this.state.password, ); } }, @@ -133,7 +130,7 @@ module.exports = React.createClass({ onInputChanged: function(stateKey, ev) { this.setState({ - [stateKey]: ev.target.value + [stateKey]: ev.target.value, }); }, @@ -149,7 +146,7 @@ module.exports = React.createClass({ }, showErrorDialog: function(body, title) { - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Forgot Password Error', '', ErrorDialog, { title: title, description: body, @@ -157,37 +154,34 @@ module.exports = React.createClass({ }, render: function() { - var LoginHeader = sdk.getComponent("login.LoginHeader"); - var LoginFooter = sdk.getComponent("login.LoginFooter"); - var ServerConfig = sdk.getComponent("login.ServerConfig"); - var Spinner = sdk.getComponent("elements.Spinner"); + const LoginHeader = sdk.getComponent("login.LoginHeader"); + const LoginFooter = sdk.getComponent("login.LoginFooter"); + const ServerConfig = sdk.getComponent("login.ServerConfig"); + const Spinner = sdk.getComponent("elements.Spinner"); - var resetPasswordJsx; + let resetPasswordJsx; if (this.state.progress === "sending_email") { resetPasswordJsx = <Spinner />; - } - else if (this.state.progress === "sent_email") { + } else if (this.state.progress === "sent_email") { resetPasswordJsx = ( <div> - { _t('An email has been sent to') } {this.state.email}. { _t("Once you've followed the link it contains, click below") }. + { _t('An email has been sent to') } { this.state.email }. { _t("Once you've followed the link it contains, click below") }. <br /> <input className="mx_Login_submit" type="button" onClick={this.onVerify} - value={ _t('I have verified my email address') } /> + value={_t('I have verified my email address')} /> </div> ); - } - else if (this.state.progress === "complete") { + } else if (this.state.progress === "complete") { resetPasswordJsx = ( <div> <p>{ _t('Your password has been reset') }.</p> <p>{ _t('You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device') }.</p> <input className="mx_Login_submit" type="button" onClick={this.props.onComplete} - value={ _t('Return to login screen') } /> + value={_t('Return to login screen')} /> </div> ); - } - else { + } else { resetPasswordJsx = ( <div> <div className="mx_Login_prompt"> @@ -199,21 +193,21 @@ module.exports = React.createClass({ name="reset_email" // define a name so browser's password autofill gets less confused value={this.state.email} onChange={this.onInputChanged.bind(this, "email")} - placeholder={ _t('Email address') } autoFocus /> + placeholder={_t('Email address')} autoFocus /> <br /> <input className="mx_Login_field" ref="pass" type="password" name="reset_password" value={this.state.password} onChange={this.onInputChanged.bind(this, "password")} - placeholder={ _t('New password') } /> + placeholder={_t('New password')} /> <br /> <input className="mx_Login_field" ref="pass" type="password" name="reset_password_confirm" value={this.state.password2} onChange={this.onInputChanged.bind(this, "password2")} - placeholder={ _t('Confirm your new password') } /> + placeholder={_t('Confirm your new password')} /> <br /> - <input className="mx_Login_submit" type="submit" value={ _t('Send Reset Email') } /> + <input className="mx_Login_submit" type="submit" value={_t('Send Reset Email')} /> </form> <ServerConfig ref="serverConfig" withToggleButton={true} @@ -222,11 +216,11 @@ module.exports = React.createClass({ customHsUrl={this.props.customHsUrl} customIsUrl={this.props.customIsUrl} onServerConfigChange={this.onServerConfigChange} - delayTimeMs={0}/> + delayTimeMs={0} /> <div className="mx_Login_error"> </div> <a className="mx_Login_create" onClick={this.props.onLoginClick} href="#"> - {_t('Return to login screen')} + { _t('Return to login screen') } </a> <a className="mx_Login_create" onClick={this.props.onRegisterClick} href="#"> { _t('Create an account') } @@ -242,9 +236,9 @@ module.exports = React.createClass({ <div className="mx_Login"> <div className="mx_Login_box"> <LoginHeader /> - {resetPasswordJsx} + { resetPasswordJsx } </div> </div> ); - } + }, }); diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index b88aa094dc..8ee6eafad4 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -134,7 +134,7 @@ module.exports = React.createClass({ }, _onLoginAsGuestClick: function() { - var self = this; + const self = this; self.setState({ busy: true, errorText: null, @@ -156,7 +156,7 @@ module.exports = React.createClass({ }); }).finally(function() { self.setState({ - busy: false + busy: false, }); }).done(); }, @@ -183,8 +183,8 @@ module.exports = React.createClass({ }, onServerConfigChange: function(config) { - var self = this; - let newState = { + const self = this; + const newState = { errorText: null, // reset err messages }; if (config.hsUrl !== undefined) { @@ -199,13 +199,13 @@ module.exports = React.createClass({ }, _initLoginLogic: function(hsUrl, isUrl) { - var self = this; + const self = this; hsUrl = hsUrl || this.state.enteredHomeserverUrl; isUrl = isUrl || this.state.enteredIdentityServerUrl; - var fallbackHsUrl = hsUrl == this.props.defaultHsUrl ? this.props.fallbackHsUrl : null; + const fallbackHsUrl = hsUrl == this.props.defaultHsUrl ? this.props.fallbackHsUrl : null; - var loginLogic = new Login(hsUrl, isUrl, fallbackHsUrl, { + const loginLogic = new Login(hsUrl, isUrl, fallbackHsUrl, { defaultDeviceDisplayName: this.props.defaultDeviceDisplayName, }); this._loginLogic = loginLogic; @@ -259,15 +259,15 @@ module.exports = React.createClass({ { _tJsx("Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. " + "Either use HTTPS or <a>enable unsafe scripts</a>.", /<a>(.*?)<\/a>/, - (sub) => { return <a href="https://www.google.com/search?&q=enable%20unsafe%20scripts">{ sub }</a>; } - )} + (sub) => { return <a href="https://www.google.com/search?&q=enable%20unsafe%20scripts">{ sub }</a>; }, + ) } </span>; } else { errorText = <span> { _tJsx("Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> is trusted, and that a browser extension is not blocking requests.", /<a>(.*?)<\/a>/, - (sub) => { return <a href={this.state.enteredHomeserverUrl}>{ sub }</a>; } - )} + (sub) => { return <a href={this.state.enteredHomeserverUrl}>{ sub }</a>; }, + ) } </span>; } } @@ -304,7 +304,7 @@ module.exports = React.createClass({ } return ( <div> - { _t('Sorry, this homeserver is using a login which is not recognised ')}({step}) + { _t('Sorry, this homeserver is using a login which is not recognised ') }({ step }) </div> ); } @@ -334,19 +334,19 @@ module.exports = React.createClass({ const ServerConfig = sdk.getComponent("login.ServerConfig"); const loader = this.state.busy ? <div className="mx_Login_loader"><Loader /></div> : null; - var loginAsGuestJsx; + let loginAsGuestJsx; if (this.props.enableGuest) { loginAsGuestJsx = <a className="mx_Login_create" onClick={this._onLoginAsGuestClick} href="#"> - { _t('Login as guest')} + { _t('Login as guest') } </a>; } - var returnToAppJsx; + let returnToAppJsx; if (this.props.onCancelClick) { returnToAppJsx = <a className="mx_Login_create" onClick={this.props.onCancelClick} href="#"> - { _t('Return to app')} + { _t('Return to app') } </a>; } @@ -355,7 +355,7 @@ module.exports = React.createClass({ <div className="mx_Login_box"> <LoginHeader /> <div> - <h2>{ _t('Sign in')} + <h2>{ _t('Sign in') } { loader } </h2> { this.componentForStep(this.state.currentFlow) } @@ -366,12 +366,12 @@ module.exports = React.createClass({ defaultHsUrl={this.props.defaultHsUrl} defaultIsUrl={this.props.defaultIsUrl} onServerConfigChange={this.onServerConfigChange} - delayTimeMs={1000}/> + delayTimeMs={1000} /> <div className="mx_Login_error"> { this.state.errorText } </div> <a className="mx_Login_create" onClick={this.props.onRegisterClick} href="#"> - { _t('Create an account')} + { _t('Create an account') } </a> { loginAsGuestJsx } { returnToAppJsx } @@ -381,5 +381,5 @@ module.exports = React.createClass({ </div> </div> ); - } + }, }); diff --git a/src/components/structures/login/PostRegistration.js b/src/components/structures/login/PostRegistration.js index c27eee98d4..194995150c 100644 --- a/src/components/structures/login/PostRegistration.js +++ b/src/components/structures/login/PostRegistration.js @@ -25,14 +25,14 @@ module.exports = React.createClass({ displayName: 'PostRegistration', propTypes: { - onComplete: React.PropTypes.func.isRequired + onComplete: React.PropTypes.func.isRequired, }, getInitialState: function() { return { avatarUrl: null, errorString: null, - busy: false + busy: false, }; }, @@ -40,26 +40,26 @@ module.exports = React.createClass({ // 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(); + const cli = MatrixClientPeg.get(); this.setState({busy: true}); - var self = this; + const self = this; cli.getProfileInfo(cli.credentials.userId).done(function(result) { self.setState({ avatarUrl: MatrixClientPeg.get().mxcUrlToHttp(result.avatar_url), - busy: false + busy: false, }); }, function(error) { self.setState({ errorString: _t("Failed to fetch avatar URL"), - busy: false + busy: false, }); }); }, render: function() { - var ChangeDisplayName = sdk.getComponent('settings.ChangeDisplayName'); - var ChangeAvatar = sdk.getComponent('settings.ChangeAvatar'); - var LoginHeader = sdk.getComponent('login.LoginHeader'); + const ChangeDisplayName = sdk.getComponent('settings.ChangeDisplayName'); + const ChangeAvatar = sdk.getComponent('settings.ChangeAvatar'); + const LoginHeader = sdk.getComponent('login.LoginHeader'); return ( <div className="mx_Login"> <div className="mx_Login_box"> @@ -71,10 +71,10 @@ module.exports = React.createClass({ <ChangeAvatar initialAvatarUrl={this.state.avatarUrl} /> <button onClick={this.props.onComplete}>{ _t('Continue') }</button> - {this.state.errorString} + { this.state.errorString } </div> </div> </div> ); - } + }, }); diff --git a/src/components/structures/login/Registration.js b/src/components/structures/login/Registration.js index fe05ba4cfd..db488ea237 100644 --- a/src/components/structures/login/Registration.js +++ b/src/components/structures/login/Registration.js @@ -57,7 +57,7 @@ module.exports = React.createClass({ // registration shouldn't know or care how login is done. onLoginClick: React.PropTypes.func.isRequired, - onCancelClick: React.PropTypes.func + onCancelClick: React.PropTypes.func, }, getInitialState: function() { @@ -121,7 +121,7 @@ module.exports = React.createClass({ }, onServerConfigChange: function(config) { - let newState = {}; + const newState = {}; if (config.hsUrl !== undefined) { newState.hsUrl = config.hsUrl; } @@ -195,7 +195,7 @@ module.exports = React.createClass({ this._rtsClient.getTeam(teamToken).then((team) => { console.log( - `User successfully registered with team ${team.name}` + `User successfully registered with team ${team.name}`, ); if (!team.rooms) { return; @@ -223,7 +223,7 @@ module.exports = React.createClass({ deviceId: response.device_id, homeserverUrl: this._matrixClient.getHomeserverUrl(), identityServerUrl: this._matrixClient.getIdentityServerUrl(), - accessToken: response.access_token + accessToken: response.access_token, }, teamToken); }).then((cli) => { return this._setupPushers(cli); @@ -253,7 +253,7 @@ module.exports = React.createClass({ }, onFormValidationFailed: function(errCode) { - var errMsg; + let errMsg; switch (errCode) { case "RegistrationForm.ERR_PASSWORD_MISSING": errMsg = _t('Missing password.'); @@ -282,7 +282,7 @@ module.exports = React.createClass({ break; } this.setState({ - errorText: errMsg + errorText: errMsg, }); }, @@ -316,7 +316,7 @@ module.exports = React.createClass({ emailAddress: this.state.formVals.email, phoneCountry: this.state.formVals.phoneCountry, phoneNumber: this.state.formVals.phoneNumber, - } + }; }, render: function() { @@ -346,7 +346,7 @@ module.exports = React.createClass({ } else { let errorSection; if (this.state.errorText) { - errorSection = <div className="mx_Login_error">{this.state.errorText}</div>; + errorSection = <div className="mx_Login_error">{ this.state.errorText }</div>; } registerBody = ( <div> @@ -362,7 +362,7 @@ module.exports = React.createClass({ onRegisterClick={this.onFormSubmit} onTeamSelected={this.onTeamSelected} /> - {errorSection} + { errorSection } <ServerConfig ref="serverConfig" withToggleButton={true} customHsUrl={this.props.customHsUrl} @@ -380,7 +380,7 @@ module.exports = React.createClass({ if (this.props.onCancelClick) { returnToAppJsx = ( <a className="mx_Login_create" onClick={this.props.onCancelClick} href="#"> - {_t('Return to app')} + { _t('Return to app') } </a> ); } @@ -393,15 +393,15 @@ module.exports = React.createClass({ this.state.teamSelected.domain + "/icon.png" : null} /> - <h2>{_t('Create an account')}</h2> - {registerBody} + <h2>{ _t('Create an account') }</h2> + { registerBody } <a className="mx_Login_create" onClick={this.props.onLoginClick} href="#"> - {_t('I already have an account')} + { _t('I already have an account') } </a> - {returnToAppJsx} + { returnToAppJsx } <LoginFooter /> </div> </div> ); - } + }, }); diff --git a/src/components/views/avatars/BaseAvatar.js b/src/components/views/avatars/BaseAvatar.js index e88fc869fa..addb637796 100644 --- a/src/components/views/avatars/BaseAvatar.js +++ b/src/components/views/avatars/BaseAvatar.js @@ -32,7 +32,7 @@ module.exports = React.createClass({ height: React.PropTypes.number, // XXX resizeMethod not actually used. resizeMethod: React.PropTypes.string, - defaultToInitialLetter: React.PropTypes.bool // true to add default url + defaultToInitialLetter: React.PropTypes.bool, // true to add default url }, getDefaultProps: function() { @@ -40,7 +40,7 @@ module.exports = React.createClass({ width: 40, height: 40, resizeMethod: 'crop', - defaultToInitialLetter: true + defaultToInitialLetter: true, }; }, @@ -50,15 +50,14 @@ module.exports = React.createClass({ componentWillReceiveProps: function(nextProps) { // work out if we need to call setState (if the image URLs array has changed) - var newState = this._getState(nextProps); - var newImageUrls = newState.imageUrls; - var oldImageUrls = this.state.imageUrls; + const newState = this._getState(nextProps); + const newImageUrls = newState.imageUrls; + const oldImageUrls = this.state.imageUrls; if (newImageUrls.length !== oldImageUrls.length) { this.setState(newState); // detected a new entry - } - else { + } else { // check each one to see if they are the same - for (var i = 0; i < newImageUrls.length; i++) { + for (let i = 0; i < newImageUrls.length; i++) { if (oldImageUrls[i] !== newImageUrls[i]) { this.setState(newState); // detected a diff break; @@ -71,31 +70,31 @@ module.exports = React.createClass({ // work out the full set of urls to try to load. This is formed like so: // imageUrls: [ props.url, props.urls, default image ] - var urls = props.urls || []; + const urls = props.urls || []; if (props.url) { urls.unshift(props.url); // put in urls[0] } - var defaultImageUrl = null; + let defaultImageUrl = null; if (props.defaultToInitialLetter) { defaultImageUrl = AvatarLogic.defaultAvatarUrlForString( - props.idName || props.name + props.idName || props.name, ); urls.push(defaultImageUrl); // lowest priority } return { imageUrls: urls, defaultImageUrl: defaultImageUrl, - urlsIndex: 0 + urlsIndex: 0, }; }, onError: function(ev) { - var nextIndex = this.state.urlsIndex + 1; + const nextIndex = this.state.urlsIndex + 1; if (nextIndex < this.state.imageUrls.length) { // try the next one this.setState({ - urlsIndex: nextIndex + urlsIndex: nextIndex, }); } }, @@ -109,32 +108,32 @@ module.exports = React.createClass({ return undefined; } - var idx = 0; - var initial = name[0]; + let idx = 0; + const initial = name[0]; if ((initial === '@' || initial === '#') && name[1]) { idx++; } // string.codePointAt(0) would do this, but that isn't supported by // some browsers (notably PhantomJS). - var chars = 1; - var first = name.charCodeAt(idx); + let chars = 1; + const first = name.charCodeAt(idx); // check if it’s the start of a surrogate pair if (first >= 0xD800 && first <= 0xDBFF && name[idx+1]) { - var second = name.charCodeAt(idx+1); + const second = name.charCodeAt(idx+1); if (second >= 0xDC00 && second <= 0xDFFF) { chars++; } } - var firstChar = name.substring(idx, idx+chars); + const firstChar = name.substring(idx, idx+chars); return firstChar.toUpperCase(); }, render: function() { const EmojiText = sdk.getComponent('elements.EmojiText'); - var imageUrl = this.state.imageUrls[this.state.urlsIndex]; + const imageUrl = this.state.imageUrls[this.state.urlsIndex]; const { name, idName, title, url, urls, width, height, resizeMethod, @@ -150,7 +149,7 @@ module.exports = React.createClass({ width: width + "px", lineHeight: height + "px" }} > - {initialLetter} + { initialLetter } </EmojiText> ); const imgNode = ( @@ -163,15 +162,15 @@ module.exports = React.createClass({ <AccessibleButton element='span' className="mx_BaseAvatar" onClick={onClick} {...otherProps} > - {textNode} - {imgNode} + { textNode } + { imgNode } </AccessibleButton> ); } else { return ( <span className="mx_BaseAvatar" {...otherProps}> - {textNode} - {imgNode} + { textNode } + { imgNode } </span> ); } @@ -196,5 +195,5 @@ module.exports = React.createClass({ {...otherProps} /> ); } - } + }, }); diff --git a/src/components/views/avatars/MemberAvatar.js b/src/components/views/avatars/MemberAvatar.js index 9fb522a5f1..89047cd69c 100644 --- a/src/components/views/avatars/MemberAvatar.js +++ b/src/components/views/avatars/MemberAvatar.js @@ -16,9 +16,9 @@ limitations under the License. 'use strict'; -var React = require('react'); -var Avatar = require('../../../Avatar'); -var sdk = require("../../../index"); +const React = require('react'); +const Avatar = require('../../../Avatar'); +const sdk = require("../../../index"); const dispatcher = require("../../../dispatcher"); module.exports = React.createClass({ @@ -63,14 +63,14 @@ module.exports = React.createClass({ imageUrl: Avatar.avatarUrlForMember(props.member, props.width, props.height, - props.resizeMethod) + props.resizeMethod), }; }, render: function() { - var BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); + const BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); - var {member, onClick, viewUserOnClick, ...otherProps} = this.props; + let {member, onClick, viewUserOnClick, ...otherProps} = this.props; if (viewUserOnClick) { onClick = () => { @@ -83,7 +83,7 @@ module.exports = React.createClass({ return ( <BaseAvatar {...otherProps} name={this.state.name} title={this.state.title} - idName={member.userId} url={this.state.imageUrl} onClick={onClick}/> + idName={member.userId} url={this.state.imageUrl} onClick={onClick} /> ); - } + }, }); diff --git a/src/components/views/create_room/CreateRoomButton.js b/src/components/views/create_room/CreateRoomButton.js index 8f0368d690..8a5f00d942 100644 --- a/src/components/views/create_room/CreateRoomButton.js +++ b/src/components/views/create_room/CreateRoomButton.js @@ -36,7 +36,7 @@ module.exports = React.createClass({ render: function() { return ( - <button className="mx_CreateRoomButton" onClick={this.onClick}>{_t("Create Room")}</button> + <button className="mx_CreateRoomButton" onClick={this.onClick}>{ _t("Create Room") }</button> ); - } + }, }); diff --git a/src/components/views/create_room/Presets.js b/src/components/views/create_room/Presets.js index c4d7ca0cdb..2073896d87 100644 --- a/src/components/views/create_room/Presets.js +++ b/src/components/views/create_room/Presets.js @@ -16,10 +16,10 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); import { _t } from '../../../languageHandler'; -var Presets = { +const Presets = { PrivateChat: "private_chat", PublicChat: "public_chat", Custom: "custom", @@ -29,7 +29,7 @@ module.exports = React.createClass({ displayName: 'CreateRoomPresets', propTypes: { onChange: React.PropTypes.func, - preset: React.PropTypes.string + preset: React.PropTypes.string, }, Presets: Presets, @@ -47,10 +47,10 @@ module.exports = React.createClass({ render: function() { return ( <select className="mx_Presets" onChange={this.onValueChanged} value={this.props.preset}> - <option value={this.Presets.PrivateChat}>{_t("Private Chat")}</option> - <option value={this.Presets.PublicChat}>{_t("Public Chat")}</option> - <option value={this.Presets.Custom}>{_t("Custom")}</option> + <option value={this.Presets.PrivateChat}>{ _t("Private Chat") }</option> + <option value={this.Presets.PublicChat}>{ _t("Public Chat") }</option> + <option value={this.Presets.Custom}>{ _t("Custom") }</option> </select> ); - } + }, }); diff --git a/src/components/views/create_room/RoomAlias.js b/src/components/views/create_room/RoomAlias.js index e1cb7e4094..d4228a8bca 100644 --- a/src/components/views/create_room/RoomAlias.js +++ b/src/components/views/create_room/RoomAlias.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require('react'); +const React = require('react'); import { _t } from '../../../languageHandler'; module.exports = React.createClass({ @@ -35,10 +35,10 @@ module.exports = React.createClass({ }, getAliasLocalpart: function() { - var room_alias = this.props.alias; + let room_alias = this.props.alias; if (room_alias && this.props.homeserver) { - var suffix = ":" + this.props.homeserver; + const suffix = ":" + this.props.homeserver; if (room_alias.startsWith("#") && room_alias.endsWith(suffix)) { room_alias = room_alias.slice(1, -suffix.length); } @@ -52,22 +52,22 @@ module.exports = React.createClass({ }, onFocus: function(ev) { - var target = ev.target; - var curr_val = ev.target.value; + const target = ev.target; + const curr_val = ev.target.value; if (this.props.homeserver) { if (curr_val == "") { - var self = this; + const self = this; setTimeout(function() { target.value = "#:" + self.props.homeserver; target.setSelectionRange(1, 1); }, 0); } else { - var suffix = ":" + this.props.homeserver; + const suffix = ":" + this.props.homeserver; setTimeout(function() { target.setSelectionRange( curr_val.startsWith("#") ? 1 : 0, - curr_val.endsWith(suffix) ? (target.value.length - suffix.length) : target.value.length + curr_val.endsWith(suffix) ? (target.value.length - suffix.length) : target.value.length, ); }, 0); } @@ -75,7 +75,7 @@ module.exports = React.createClass({ }, onBlur: function(ev) { - var curr_val = ev.target.value; + const curr_val = ev.target.value; if (this.props.homeserver) { if (curr_val == "#:" + this.props.homeserver) { @@ -84,8 +84,8 @@ module.exports = React.createClass({ } if (curr_val != "") { - var new_val = ev.target.value; - var suffix = ":" + this.props.homeserver; + let new_val = ev.target.value; + const suffix = ":" + this.props.homeserver; if (!curr_val.startsWith("#")) new_val = "#" + new_val; if (!curr_val.endsWith(suffix)) new_val = new_val + suffix; ev.target.value = new_val; @@ -97,7 +97,7 @@ module.exports = React.createClass({ return ( <input type="text" className="mx_RoomAlias" placeholder={_t("Alias (optional)")} onChange={this.onValueChanged} onFocus={this.onFocus} onBlur={this.onBlur} - value={this.props.alias}/> + value={this.props.alias} /> ); - } + }, }); diff --git a/src/components/views/dialogs/ChatCreateOrReuseDialog.js b/src/components/views/dialogs/ChatCreateOrReuseDialog.js index c3b0915ab4..e0578f3b53 100644 --- a/src/components/views/dialogs/ChatCreateOrReuseDialog.js +++ b/src/components/views/dialogs/ChatCreateOrReuseDialog.js @@ -155,7 +155,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { width={48} height={48} /> <div className="mx_ChatCreateOrReuseDialog_profile_name"> - {this.state.profile.displayName || this.props.userId} + { this.state.profile.displayName || this.props.userId } </div> </div>; } @@ -177,7 +177,7 @@ export default class ChatCreateOrReuseDialog extends React.Component { const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); return ( <BaseDialog className='mx_ChatCreateOrReuseDialog' - onFinished={ this.props.onFinished.bind(false) } + onFinished={this.props.onFinished.bind(false)} title={title} > { content } diff --git a/src/components/views/dialogs/DeactivateAccountDialog.js b/src/components/views/dialogs/DeactivateAccountDialog.js index 0ee264b69b..c45e072d72 100644 --- a/src/components/views/dialogs/DeactivateAccountDialog.js +++ b/src/components/views/dialogs/DeactivateAccountDialog.js @@ -83,7 +83,7 @@ export default class DeactivateAccountDialog extends React.Component { let error = null; if (this.state.errStr) { error = <div className="error"> - {this.state.errStr} + { this.state.errStr } </div>; passwordBoxClass = 'error'; } @@ -94,30 +94,30 @@ export default class DeactivateAccountDialog extends React.Component { let cancelButton = null; if (!this.state.busy) { cancelButton = <button onClick={this._onCancel} autoFocus={true}> - {_t("Cancel")} + { _t("Cancel") } </button>; } return ( <div className="mx_DeactivateAccountDialog"> <div className="mx_Dialog_title danger"> - {_t("Deactivate Account")} + { _t("Deactivate Account") } </div> <div className="mx_Dialog_content"> - <p>{_t("This will make your account permanently unusable. You will not be able to re-register the same user ID.")}</p> + <p>{ _t("This will make your account permanently unusable. You will not be able to re-register the same user ID.") }</p> - <p>{_t("This action is irreversible.")}</p> + <p>{ _t("This action is irreversible.") }</p> - <p>{_t("To continue, please enter your password.")}</p> + <p>{ _t("To continue, please enter your password.") }</p> - <p>{_t("Password")}:</p> + <p>{ _t("Password") }:</p> <input type="password" onChange={this._onPasswordFieldChange} ref={(e) => {this._passwordField = e;}} className={passwordBoxClass} /> - {error} + { error } </div> <div className="mx_Dialog_buttons"> <button @@ -125,10 +125,10 @@ export default class DeactivateAccountDialog extends React.Component { onClick={this._onOk} disabled={!okEnabled} > - {okLabel} + { okLabel } </button> - {cancelButton} + { cancelButton } </div> </div> ); diff --git a/src/components/views/dialogs/InteractiveAuthDialog.js b/src/components/views/dialogs/InteractiveAuthDialog.js index 363ce89b57..59de7c7f59 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.js +++ b/src/components/views/dialogs/InteractiveAuthDialog.js @@ -48,7 +48,7 @@ export default React.createClass({ getInitialState: function() { return { authError: null, - } + }; }, _onAuthFinished: function(success, result) { @@ -73,12 +73,12 @@ export default React.createClass({ if (this.state.authError) { content = ( <div> - <div>{this.state.authError.message || this.state.authError.toString()}</div> + <div>{ this.state.authError.message || this.state.authError.toString() }</div> <br /> <AccessibleButton onClick={this._onDismissClick} className="mx_UserSettings_button" > - {_t("Dismiss")} + { _t("Dismiss") } </AccessibleButton> </div> ); @@ -100,7 +100,7 @@ export default React.createClass({ onFinished={this.props.onFinished} title={this.state.authError ? 'Error' : (this.props.title || _t('Authentication'))} > - {content} + { content } </BaseDialog> ); }, diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js index 6ebd0c3efc..ee8f307f76 100644 --- a/src/components/views/dialogs/UnknownDeviceDialog.js +++ b/src/components/views/dialogs/UnknownDeviceDialog.js @@ -28,9 +28,9 @@ function DeviceListEntry(props) { return ( <li> - <DeviceVerifyButtons device={ device } userId={ userId } /> + <DeviceVerifyButtons device={device} userId={userId} /> { device.deviceId } - <br/> + <br /> { device.getDisplayName() } </li> ); @@ -48,13 +48,13 @@ function UserUnknownDeviceList(props) { const {userId, userDevices} = props; const deviceListEntries = Object.keys(userDevices).map((deviceId) => - <DeviceListEntry key={ deviceId } userId={ userId } - device={ userDevices[deviceId] } />, + <DeviceListEntry key={deviceId} userId={userId} + device={userDevices[deviceId]} />, ); return ( <ul className="mx_UnknownDeviceDialog_deviceList"> - {deviceListEntries} + { deviceListEntries } </ul> ); } @@ -71,13 +71,13 @@ function UnknownDeviceList(props) { const {devices} = props; const userListEntries = Object.keys(devices).map((userId) => - <li key={ userId }> + <li key={userId}> <p>{ userId }:</p> - <UserUnknownDeviceList userId={ userId } userDevices={ devices[userId] } /> + <UserUnknownDeviceList userId={userId} userDevices={devices[userId]} /> </li>, ); - return <ul>{userListEntries}</ul>; + return <ul>{ userListEntries }</ul>; } UnknownDeviceList.propTypes = { @@ -120,17 +120,17 @@ export default React.createClass({ if (blacklistUnverified) { warning = ( <h4> - {_t("You are currently blacklisting unverified devices; to send " + - "messages to these devices you must verify them.")} + { _t("You are currently blacklisting unverified devices; to send " + + "messages to these devices you must verify them.") } </h4> ); } else { warning = ( <div> <p> - {_t("We recommend you go through the verification process " + + { _t("We recommend you go through the verification process " + "for each device to confirm they belong to their legitimate owner, " + - "but you can resend the message without verifying if you prefer.")} + "but you can resend the message without verifying if you prefer.") } </p> </div> ); @@ -149,22 +149,22 @@ export default React.createClass({ > <GeminiScrollbar autoshow={false} className="mx_Dialog_content"> <h4> - {_t('"%(RoomName)s" contains devices that you haven\'t seen before.', {RoomName: this.props.room.name})} + { _t('"%(RoomName)s" contains devices that you haven\'t seen before.', {RoomName: this.props.room.name}) } </h4> { warning } - {_t("Unknown devices")}: + { _t("Unknown devices") }: <UnknownDeviceList devices={this.props.devices} /> </GeminiScrollbar> <div className="mx_Dialog_buttons"> - <button className="mx_Dialog_primary" autoFocus={ true } + <button className="mx_Dialog_primary" autoFocus={true} onClick={() => { this.props.onFinished(); Resend.resendUnsentEvents(this.props.room); }}> - {_t("Send anyway")} + { _t("Send anyway") } </button> - <button className="mx_Dialog_primary" autoFocus={ true } + <button className="mx_Dialog_primary" autoFocus={true} onClick={() => { // XXX: temporary logging to try to diagnose // https://github.com/vector-im/riot-web/issues/3148 diff --git a/src/components/views/elements/AccessibleButton.js b/src/components/views/elements/AccessibleButton.js index ce58b6d5cf..794e0a4dd7 100644 --- a/src/components/views/elements/AccessibleButton.js +++ b/src/components/views/elements/AccessibleButton.js @@ -32,7 +32,7 @@ export default function AccessibleButton(props) { }; restProps.tabIndex = restProps.tabIndex || "0"; restProps.role = "button"; - restProps.className = (restProps.className ? restProps.className + " " : "") + + restProps.className = (restProps.className ? restProps.className + " " : "") + "mx_AccessibleButton"; return React.createElement(element, restProps, children); } diff --git a/src/components/views/elements/ActionButton.js b/src/components/views/elements/ActionButton.js index b1fa71829b..cfd31fe213 100644 --- a/src/components/views/elements/ActionButton.js +++ b/src/components/views/elements/ActionButton.js @@ -79,8 +79,8 @@ export default React.createClass({ onMouseLeave={this._onMouseLeave} > <TintableSvg src={this.props.iconPath} width={this.props.size} height={this.props.size} /> - {tooltip} + { tooltip } </AccessibleButton> ); - } + }, }); diff --git a/src/components/views/elements/AddressSelector.js b/src/components/views/elements/AddressSelector.js index 75fe650600..9a8cd34867 100644 --- a/src/components/views/elements/AddressSelector.js +++ b/src/components/views/elements/AddressSelector.js @@ -46,8 +46,8 @@ export default React.createClass({ componentWillReceiveProps: function(props) { // Make sure the selected item isn't outside the list bounds - var selected = this.state.selected; - var maxSelected = this._maxSelected(props.addressList); + const selected = this.state.selected; + const maxSelected = this._maxSelected(props.addressList); if (selected > maxSelected) { this.setState({ selected: maxSelected }); } @@ -57,7 +57,7 @@ export default React.createClass({ // As the user scrolls with the arrow keys keep the selected item // at the top of the window. if (this.scrollElement && this.props.addressList.length > 0 && !this.state.hover) { - var elementHeight = this.addressListElement.getBoundingClientRect().height; + const elementHeight = this.addressListElement.getBoundingClientRect().height; this.scrollElement.scrollTop = (this.state.selected * elementHeight) - elementHeight; } }, @@ -75,7 +75,7 @@ export default React.createClass({ if (this.state.selected > 0) { this.setState({ selected: this.state.selected - 1, - hover : false, + hover: false, }); } }, @@ -84,7 +84,7 @@ export default React.createClass({ if (this.state.selected < this._maxSelected(this.props.addressList)) { this.setState({ selected: this.state.selected + 1, - hover : false, + hover: false, }); } }, @@ -105,7 +105,7 @@ export default React.createClass({ }, onMouseLeave: function() { - this.setState({ hover : false }); + this.setState({ hover: false }); }, selectAddress: function(index) { @@ -117,15 +117,15 @@ export default React.createClass({ }, createAddressListTiles: function() { - var self = this; - var AddressTile = sdk.getComponent("elements.AddressTile"); - var maxSelected = this._maxSelected(this.props.addressList); - var addressList = []; + const self = this; + const AddressTile = sdk.getComponent("elements.AddressTile"); + const maxSelected = this._maxSelected(this.props.addressList); + const addressList = []; // Only create the address elements if there are address if (this.props.addressList.length > 0) { - for (var i = 0; i <= maxSelected; i++) { - var classes = classNames({ + for (let i = 0; i <= maxSelected; i++) { + const classes = classNames({ "mx_AddressSelector_addressListElement": true, "mx_AddressSelector_selected": this.state.selected === i, }); @@ -143,7 +143,7 @@ export default React.createClass({ ref={(ref) => { this.addressListElement = ref; }} > <AddressTile address={this.props.addressList[i]} justified={true} networkName="vector" networkUrl="img/search-icon-vector.svg" /> - </div> + </div>, ); } } @@ -151,13 +151,13 @@ export default React.createClass({ }, _maxSelected: function(list) { - var listSize = list.length === 0 ? 0 : list.length - 1; - var maxSelected = listSize > (this.props.truncateAt - 1) ? (this.props.truncateAt - 1) : listSize; + const listSize = list.length === 0 ? 0 : list.length - 1; + const maxSelected = listSize > (this.props.truncateAt - 1) ? (this.props.truncateAt - 1) : listSize; return maxSelected; }, render: function() { - var classes = classNames({ + const classes = classNames({ "mx_AddressSelector": true, "mx_AddressSelector_empty": this.props.addressList.length === 0, }); @@ -168,5 +168,5 @@ export default React.createClass({ { this.createAddressListTiles() } </div> ); - } + }, }); diff --git a/src/components/views/elements/AddressTile.js b/src/components/views/elements/AddressTile.js index 612f2956eb..a61cbbc794 100644 --- a/src/components/views/elements/AddressTile.js +++ b/src/components/views/elements/AddressTile.js @@ -107,24 +107,24 @@ export default React.createClass({ let nameNode = null; if (address.displayName) { - nameNode = <div className={nameClasses}>{ address.displayName }</div> + nameNode = <div className={nameClasses}>{ address.displayName }</div>; } info = ( <div className="mx_AddressTile_mx"> <div className={emailClasses}>{ address.address }</div> - {nameNode} + { nameNode } </div> ); } else { error = true; - var unknownClasses = classNames({ + const unknownClasses = classNames({ "mx_AddressTile_unknown": true, "mx_AddressTile_justified": this.props.justified, }); info = ( - <div className={unknownClasses}>{_t("Unknown Address")}</div> + <div className={unknownClasses}>{ _t("Unknown Address") }</div> ); } @@ -151,5 +151,5 @@ export default React.createClass({ { dismiss } </div> ); - } + }, }); diff --git a/src/components/views/elements/CreateRoomButton.js b/src/components/views/elements/CreateRoomButton.js index 22d222c6f1..177d033c75 100644 --- a/src/components/views/elements/CreateRoomButton.js +++ b/src/components/views/elements/CreateRoomButton.js @@ -24,7 +24,7 @@ const CreateRoomButton = function(props) { return ( <ActionButton action="view_create_room" mouseOverAction={props.callout ? "callout_create_room" : null} - label={ _t("Create new room") } + label={_t("Create new room")} iconPath="img/icons-create-room.svg" size={props.size} tooltip={props.tooltip} diff --git a/src/components/views/elements/DeviceVerifyButtons.js b/src/components/views/elements/DeviceVerifyButtons.js index bfe45905a1..bb89efaa30 100644 --- a/src/components/views/elements/DeviceVerifyButtons.js +++ b/src/components/views/elements/DeviceVerifyButtons.js @@ -30,7 +30,7 @@ export default React.createClass({ getInitialState: function() { return { - device: this.props.device + device: this.props.device, }; }, @@ -60,37 +60,37 @@ export default React.createClass({ onUnverifyClick: function() { MatrixClientPeg.get().setDeviceVerified( - this.props.userId, this.state.device.deviceId, false + this.props.userId, this.state.device.deviceId, false, ); }, onBlacklistClick: function() { MatrixClientPeg.get().setDeviceBlocked( - this.props.userId, this.state.device.deviceId, true + this.props.userId, this.state.device.deviceId, true, ); }, onUnblacklistClick: function() { MatrixClientPeg.get().setDeviceBlocked( - this.props.userId, this.state.device.deviceId, false + this.props.userId, this.state.device.deviceId, false, ); }, render: function() { - var blacklistButton = null, verifyButton = null; + let blacklistButton = null, verifyButton = null; if (this.state.device.isBlocked()) { blacklistButton = ( <button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unblacklist" onClick={this.onUnblacklistClick}> - {_t("Unblacklist")} + { _t("Unblacklist") } </button> ); } else { blacklistButton = ( <button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_blacklist" onClick={this.onBlacklistClick}> - {_t("Blacklist")} + { _t("Blacklist") } </button> ); } @@ -99,14 +99,14 @@ export default React.createClass({ verifyButton = ( <button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unverify" onClick={this.onUnverifyClick}> - {_t("Unverify")} + { _t("Unverify") } </button> ); } else { verifyButton = ( <button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_verify" onClick={this.onVerifyClick}> - {_t("Verify...")} + { _t("Verify...") } </button> ); } diff --git a/src/components/views/elements/DirectorySearchBox.js b/src/components/views/elements/DirectorySearchBox.js index eaa6ee34ba..7132162d5c 100644 --- a/src/components/views/elements/DirectorySearchBox.js +++ b/src/components/views/elements/DirectorySearchBox.js @@ -95,7 +95,7 @@ export default class DirectorySearchBox extends React.Component { onChange={this._onChange} onKeyUp={this._onKeyUp} placeholder={this.props.placeholder} autoFocus /> - {join_button} + { join_button } <span className="mx_DirectorySearchBox_clear_wrapper"> <span className="mx_DirectorySearchBox_clear" onClick={this._onClearClick} /> </span> diff --git a/src/components/views/elements/Dropdown.js b/src/components/views/elements/Dropdown.js index 0fb5a37414..3787523a56 100644 --- a/src/components/views/elements/Dropdown.js +++ b/src/components/views/elements/Dropdown.js @@ -29,7 +29,7 @@ class MenuOption extends React.Component { getDefaultProps() { return { disabled: false, - } + }; } _onMouseEnter() { @@ -52,15 +52,15 @@ class MenuOption extends React.Component { onClick={this._onClick} onKeyPress={this._onKeyPress} onMouseEnter={this._onMouseEnter} > - {this.props.children} - </div> + { this.props.children } + </div>; } -}; +} MenuOption.propTypes = { children: React.PropTypes.oneOfType([ React.PropTypes.arrayOf(React.PropTypes.node), - React.PropTypes.node + React.PropTypes.node, ]), highlighted: React.PropTypes.bool, dropdownKey: React.PropTypes.string, @@ -258,13 +258,13 @@ export default class Dropdown extends React.Component { onMouseEnter={this._setHighlightedOption} onClick={this._onMenuOptionClick} > - {child} + { child } </MenuOption> ); }); if (options.length === 0) { return [<div key="0" className="mx_Dropdown_option"> - {_t("No results")} + { _t("No results") } </div>]; } return options; @@ -287,7 +287,7 @@ export default class Dropdown extends React.Component { />; } menu = <div className="mx_Dropdown_menu" style={menuStyle}> - {this._getMenuOptions()} + { this._getMenuOptions() } </div>; } @@ -296,8 +296,8 @@ export default class Dropdown extends React.Component { this.props.getShortOption(this.props.value) : this.childrenByKey[this.props.value]; currentValue = <div className="mx_Dropdown_option"> - {selectedChild} - </div> + { selectedChild } + </div>; } const dropdownClasses = { @@ -312,9 +312,9 @@ export default class Dropdown extends React.Component { // to the input, but overflows below it. The root contains both. return <div className={classnames(dropdownClasses)} ref={this._collectRoot}> <AccessibleButton className="mx_Dropdown_input" onClick={this._onInputClick}> - {currentValue} + { currentValue } <span className="mx_Dropdown_arrow"></span> - {menu} + { menu } </AccessibleButton> </div>; } @@ -340,4 +340,4 @@ Dropdown.propTypes = { value: React.PropTypes.string, // negative for consistency with HTML disabled: React.PropTypes.bool, -} +}; diff --git a/src/components/views/elements/EditableText.js b/src/components/views/elements/EditableText.js index b6a0ec1d5c..ac8821a0c2 100644 --- a/src/components/views/elements/EditableText.js +++ b/src/components/views/elements/EditableText.js @@ -16,7 +16,7 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); const KEY_TAB = 9; const KEY_SHIFT = 16; @@ -95,8 +95,7 @@ module.exports = React.createClass({ this.refs.editable_div.setAttribute("class", this.props.className + " " + this.props.placeholderClassName); this.placeholder = true; this.value = ''; - } - else { + } else { this.refs.editable_div.textContent = this.value; this.refs.editable_div.setAttribute("class", this.props.className); this.placeholder = false; @@ -152,8 +151,7 @@ module.exports = React.createClass({ if (!ev.target.textContent) { this.showPlaceholder(true); - } - else if (!this.placeholder) { + } else if (!this.placeholder) { this.value = ev.target.textContent; } @@ -177,21 +175,21 @@ module.exports = React.createClass({ onFocus: function(ev) { //ev.target.setSelectionRange(0, ev.target.textContent.length); - var node = ev.target.childNodes[0]; + const node = ev.target.childNodes[0]; if (node) { - var range = document.createRange(); + const range = document.createRange(); range.setStart(node, 0); range.setEnd(node, node.length); - var sel = window.getSelection(); + const sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } }, onFinish: function(ev, shouldSubmit) { - var self = this; - var submit = (ev.key === "Enter") || shouldSubmit; + const self = this; + const submit = (ev.key === "Enter") || shouldSubmit; this.setState({ phase: this.Phases.Display, }, function() { @@ -202,19 +200,16 @@ module.exports = React.createClass({ }, onBlur: function(ev) { - var sel = window.getSelection(); + const sel = window.getSelection(); sel.removeAllRanges(); - if (this.props.blurToCancel) - {this.cancelEdit();} - else - {this.onFinish(ev, this.props.blurToSubmit);} + if (this.props.blurToCancel) {this.cancelEdit();} else {this.onFinish(ev, this.props.blurToSubmit);} this.showPlaceholder(!this.value); }, render: function() { - var editable_el; + let editable_el; if (!this.props.editable || (this.state.phase == this.Phases.Display && (this.props.label || this.props.labelClassName) && !this.value)) { // show the label @@ -226,5 +221,5 @@ module.exports = React.createClass({ } return editable_el; - } + }, }); diff --git a/src/components/views/elements/EditableTextContainer.js b/src/components/views/elements/EditableTextContainer.js index aeb32c07ec..0025862967 100644 --- a/src/components/views/elements/EditableTextContainer.js +++ b/src/components/views/elements/EditableTextContainer.js @@ -64,7 +64,7 @@ export default class EditableTextContainer extends React.Component { errorString: error.toString(), busy: false, }); - } + }, ); } @@ -96,22 +96,22 @@ export default class EditableTextContainer extends React.Component { errorString: error.toString(), busy: false, }); - } + }, ); } render() { if (this.state.busy) { - var Loader = sdk.getComponent("elements.Spinner"); + const Loader = sdk.getComponent("elements.Spinner"); return ( <Loader /> ); } else if (this.state.errorString) { return ( - <div className="error">{this.state.errorString}</div> + <div className="error">{ this.state.errorString }</div> ); } else { - var EditableText = sdk.getComponent('elements.EditableText'); + const EditableText = sdk.getComponent('elements.EditableText'); return ( <EditableText initialValue={this.state.value} placeholder={this.props.placeholder} diff --git a/src/components/views/elements/HomeButton.js b/src/components/views/elements/HomeButton.js index 4877f5dd43..05e21487eb 100644 --- a/src/components/views/elements/HomeButton.js +++ b/src/components/views/elements/HomeButton.js @@ -23,7 +23,7 @@ const HomeButton = function(props) { const ActionButton = sdk.getComponent('elements.ActionButton'); return ( <ActionButton action="view_home_page" - label={ _t("Home") } + label={_t("Home")} iconPath="img/icons-home.svg" size={props.size} tooltip={props.tooltip} diff --git a/src/components/views/elements/LanguageDropdown.js b/src/components/views/elements/LanguageDropdown.js index c5ed1f8942..6e3f73f7d5 100644 --- a/src/components/views/elements/LanguageDropdown.js +++ b/src/components/views/elements/LanguageDropdown.js @@ -35,12 +35,12 @@ export default class LanguageDropdown extends React.Component { this.state = { searchQuery: '', langs: null, - } + }; } componentWillMount() { languageHandler.getAllLanguagesFromJson().then((langs) => { - langs.sort(function(a, b){ + langs.sort(function(a, b) { if(a.label < b.label) return -1; if(a.label > b.label) return 1; return 0; @@ -89,7 +89,7 @@ export default class LanguageDropdown extends React.Component { const options = displayedLanguages.map((language) => { return <div key={language.value}> - {language.label} + { language.label } </div>; }); @@ -108,8 +108,8 @@ export default class LanguageDropdown extends React.Component { onOptionChange={this.props.onOptionChange} onSearchChange={this._onSearchChange} searchEnabled={true} value={value} > - {options} - </Dropdown> + { options } + </Dropdown>; } } diff --git a/src/components/views/elements/MemberEventListSummary.js b/src/components/views/elements/MemberEventListSummary.js index 689599da0b..596838febe 100644 --- a/src/components/views/elements/MemberEventListSummary.js +++ b/src/components/views/elements/MemberEventListSummary.js @@ -96,12 +96,12 @@ module.exports = React.createClass({ // Transform into consecutive repetitions of the same transition (like 5 // consecutive 'joined_and_left's) const coalescedTransitions = this._coalesceRepeatedTransitions( - canonicalTransitions + canonicalTransitions, ); const descs = coalescedTransitions.map((t) => { return this._getDescriptionForTransition( - t.transitionType, plural, t.repeats + t.transitionType, plural, t.repeats, ); }); @@ -119,7 +119,7 @@ module.exports = React.createClass({ return ( <span className="mx_TextualEvent mx_MemberEventListSummary_summary"> <EmojiText> - {summaries.join(", ")} + { summaries.join(", ") } </EmojiText> </span> ); @@ -370,7 +370,7 @@ module.exports = React.createClass({ */ _renderCommaSeparatedList(items, itemLimit) { const remaining = itemLimit === undefined ? 0 : Math.max( - items.length - itemLimit, 0 + items.length - itemLimit, 0, ); if (items.length === 0) { return ""; @@ -394,8 +394,8 @@ module.exports = React.createClass({ ); }); return ( - <span className="mx_MemberEventListSummary_avatars" onClick={ this._toggleSummary }> - {avatars} + <span className="mx_MemberEventListSummary_avatars" onClick={this._toggleSummary}> + { avatars } </span> ); }, @@ -419,19 +419,15 @@ module.exports = React.createClass({ case 'join': if (e.mxEvent.getPrevContent().membership === 'join') { if (e.mxEvent.getContent().displayname !== - e.mxEvent.getPrevContent().displayname) - { + e.mxEvent.getPrevContent().displayname) { return 'changed_name'; - } - else if (e.mxEvent.getContent().avatar_url !== - e.mxEvent.getPrevContent().avatar_url) - { + } else if (e.mxEvent.getContent().avatar_url !== + e.mxEvent.getPrevContent().avatar_url) { return 'changed_avatar'; } // console.log("MELS ignoring duplicate membership join event"); return null; - } - else { + } else { return 'joined'; } case 'leave': @@ -483,7 +479,7 @@ module.exports = React.createClass({ firstEvent.index < aggregateIndices[seq]) { aggregateIndices[seq] = firstEvent.index; } - } + }, ); return { @@ -494,7 +490,7 @@ module.exports = React.createClass({ render: function() { const eventsToRender = this.props.events; - const eventIds = eventsToRender.map(e => e.getId()).join(','); + const eventIds = eventsToRender.map((e) => e.getId()).join(','); const fewEvents = eventsToRender.length < this.props.threshold; const expanded = this.state.expanded || fewEvents; @@ -506,7 +502,7 @@ module.exports = React.createClass({ if (fewEvents) { return ( <div className="mx_MemberEventListSummary" data-scroll-tokens={eventIds}> - {expandedEvents} + { expandedEvents } </div> ); } @@ -542,7 +538,7 @@ module.exports = React.createClass({ // Sort types by order of lowest event index within sequence const orderedTransitionSequences = Object.keys(aggregate.names).sort( - (seq1, seq2) => aggregate.indices[seq1] > aggregate.indices[seq2] + (seq1, seq2) => aggregate.indices[seq1] > aggregate.indices[seq2], ); let summaryContainer = null; @@ -550,24 +546,24 @@ module.exports = React.createClass({ summaryContainer = ( <div className="mx_EventTile_line"> <div className="mx_EventTile_info"> - {this._renderAvatars(avatarMembers)} - {this._renderSummary(aggregate.names, orderedTransitionSequences)} + { this._renderAvatars(avatarMembers) } + { this._renderSummary(aggregate.names, orderedTransitionSequences) } </div> </div> ); } const toggleButton = ( <div className={"mx_MemberEventListSummary_toggle"} onClick={this._toggleSummary}> - {expanded ? 'collapse' : 'expand'} + { expanded ? 'collapse' : 'expand' } </div> ); return ( <div className="mx_MemberEventListSummary" data-scroll-tokens={eventIds}> - {toggleButton} - {summaryContainer} - {expanded ? <div className="mx_MemberEventListSummary_line"> </div> : null} - {expandedEvents} + { toggleButton } + { summaryContainer } + { expanded ? <div className="mx_MemberEventListSummary_line"> </div> : null } + { expandedEvents } </div> ); }, diff --git a/src/components/views/elements/PowerSelector.js b/src/components/views/elements/PowerSelector.js index efeb81fe2d..a0aaa12ff1 100644 --- a/src/components/views/elements/PowerSelector.js +++ b/src/components/views/elements/PowerSelector.js @@ -20,8 +20,8 @@ import React from 'react'; import * as Roles from '../../../Roles'; import { _t } from '../../../languageHandler'; -var LEVEL_ROLE_MAP = {}; -var reverseRoles = {}; +let LEVEL_ROLE_MAP = {}; +const reverseRoles = {}; module.exports = React.createClass({ displayName: 'PowerSelector', @@ -46,7 +46,7 @@ module.exports = React.createClass({ custom: (LEVEL_ROLE_MAP[this.props.value] === undefined), }; }, - + componentWillMount: function() { LEVEL_ROLE_MAP = Roles.levelRoleMap(); Object.keys(LEVEL_ROLE_MAP).forEach(function(key) { @@ -72,7 +72,7 @@ module.exports = React.createClass({ }, getValue: function() { - var value; + let value; if (this.refs.select) { value = reverseRoles[this.refs.select.value]; if (this.refs.custom) { @@ -83,30 +83,27 @@ module.exports = React.createClass({ }, render: function() { - var customPicker; + let customPicker; if (this.state.custom) { - var input; + let input; if (this.props.disabled) { input = <span>{ this.props.value }</span>; - } - else { - input = <input ref="custom" type="text" size="3" defaultValue={ this.props.value } onBlur={ this.onCustomBlur } onKeyDown={ this.onCustomKeyDown }/>; + } else { + input = <input ref="custom" type="text" size="3" defaultValue={this.props.value} onBlur={this.onCustomBlur} onKeyDown={this.onCustomKeyDown} />; } customPicker = <span> of { input }</span>; } - var selectValue; + let selectValue; if (this.state.custom) { selectValue = "Custom"; - } - else { + } else { selectValue = LEVEL_ROLE_MAP[this.props.value] || "Custom"; } - var select; + let select; if (this.props.disabled) { select = <span>{ selectValue }</span>; - } - else { + } else { // Each level must have a definition in LEVEL_ROLE_MAP const levels = [0, 50, 100]; let options = levels.map((level) => { @@ -115,18 +112,18 @@ module.exports = React.createClass({ // Give a userDefault (users_default in the power event) of 0 but // because level !== undefined, this should never be used. text: Roles.textualPowerLevel(level, 0), - } + }; }); options.push({ value: "Custom", text: _t("Custom level") }); options = options.map((op) => { - return <option value={op.value} key={op.value}>{op.text}</option>; + return <option value={op.value} key={op.value}>{ op.text }</option>; }); select = <select ref="select" - value={ this.props.controlled ? selectValue : undefined } - defaultValue={ !this.props.controlled ? selectValue : undefined } - onChange={ this.onSelectChange }> + value={this.props.controlled ? selectValue : undefined} + defaultValue={!this.props.controlled ? selectValue : undefined} + onChange={this.onSelectChange}> { options } </select>; } @@ -137,5 +134,5 @@ module.exports = React.createClass({ { customPicker } </span> ); - } + }, }); diff --git a/src/components/views/elements/ProgressBar.js b/src/components/views/elements/ProgressBar.js index a39e8e48f9..861bfb1335 100644 --- a/src/components/views/elements/ProgressBar.js +++ b/src/components/views/elements/ProgressBar.js @@ -16,23 +16,23 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); module.exports = React.createClass({ displayName: 'ProgressBar', propTypes: { value: React.PropTypes.number, - max: React.PropTypes.number + max: React.PropTypes.number, }, render: function() { // Would use an HTML5 progress tag but if that doesn't animate if you // use the HTML attributes rather than styles - var progressStyle = { - width: ((this.props.value / this.props.max) * 100)+"%" + const progressStyle = { + width: ((this.props.value / this.props.max) * 100)+"%", }; return ( <div className="mx_ProgressBar"><div className="mx_ProgressBar_fill" style={progressStyle}></div></div> ); - } + }, }); diff --git a/src/components/views/elements/RoomDirectoryButton.js b/src/components/views/elements/RoomDirectoryButton.js index d964d9e5bc..d8f88034e3 100644 --- a/src/components/views/elements/RoomDirectoryButton.js +++ b/src/components/views/elements/RoomDirectoryButton.js @@ -24,7 +24,7 @@ const RoomDirectoryButton = function(props) { return ( <ActionButton action="view_room_directory" mouseOverAction={props.callout ? "callout_room_directory" : null} - label={ _t("Room directory") } + label={_t("Room directory")} iconPath="img/icons-directory.svg" size={props.size} tooltip={props.tooltip} diff --git a/src/components/views/elements/SettingsButton.js b/src/components/views/elements/SettingsButton.js index ad09971689..215d757e6c 100644 --- a/src/components/views/elements/SettingsButton.js +++ b/src/components/views/elements/SettingsButton.js @@ -23,7 +23,7 @@ const SettingsButton = function(props) { const ActionButton = sdk.getComponent('elements.ActionButton'); return ( <ActionButton action="view_user_settings" - label={ _t("Settings") } + label={_t("Settings")} iconPath="img/icons-settings.svg" size={props.size} tooltip={props.tooltip} diff --git a/src/components/views/elements/StartChatButton.js b/src/components/views/elements/StartChatButton.js index 05a7db0b9c..199c5e44a6 100644 --- a/src/components/views/elements/StartChatButton.js +++ b/src/components/views/elements/StartChatButton.js @@ -24,7 +24,7 @@ const StartChatButton = function(props) { return ( <ActionButton action="view_create_chat" mouseOverAction={props.callout ? "callout_start_chat" : null} - label={ _t("Start chat") } + label={_t("Start chat")} iconPath="img/icons-people.svg" size={props.size} tooltip={props.tooltip} diff --git a/src/components/views/elements/TintableSvg.js b/src/components/views/elements/TintableSvg.js index 401a11c1cb..3649cbccdb 100644 --- a/src/components/views/elements/TintableSvg.js +++ b/src/components/views/elements/TintableSvg.js @@ -16,9 +16,9 @@ limitations under the License. 'use strict'; -var React = require('react'); -var ReactDOM = require("react-dom"); -var Tinter = require("../../../Tinter"); +const React = require('react'); +const ReactDOM = require("react-dom"); +const Tinter = require("../../../Tinter"); var TintableSvg = React.createClass({ displayName: 'TintableSvg', @@ -63,16 +63,16 @@ var TintableSvg = React.createClass({ render: function() { return ( - <object className={ "mx_TintableSvg " + (this.props.className ? this.props.className : "") } + <object className={"mx_TintableSvg " + (this.props.className ? this.props.className : "")} type="image/svg+xml" - data={ this.props.src } - width={ this.props.width } - height={ this.props.height } - onLoad={ this.onLoad } + data={this.props.src} + width={this.props.width} + height={this.props.height} + onLoad={this.onLoad} tabIndex="-1" /> ); - } + }, }); // Register with the Tinter so that we will be told if the tint changes diff --git a/src/components/views/elements/UserSelector.js b/src/components/views/elements/UserSelector.js index 955903aac0..a523c57d9f 100644 --- a/src/components/views/elements/UserSelector.js +++ b/src/components/views/elements/UserSelector.js @@ -52,19 +52,19 @@ module.exports = React.createClass({ }, render: function() { - var self = this; + const self = this; return ( <div> <ul className="mx_UserSelector_UserIdList" ref="list"> - {this.props.selected_users.map(function(user_id, i) { - return <li key={user_id}>{user_id} - <span onClick={function() {self.removeUser(user_id);}}>X</span></li>; - })} + { this.props.selected_users.map(function(user_id, i) { + return <li key={user_id}>{ user_id } - <span onClick={function() {self.removeUser(user_id);}}>X</span></li>; + }) } </ul> - <input type="text" ref="user_id_input" defaultValue="" className="mx_UserSelector_userIdInput" placeholder={_t("ex. @bob:example.com")}/> + <input type="text" ref="user_id_input" defaultValue="" className="mx_UserSelector_userIdInput" placeholder={_t("ex. @bob:example.com")} /> <button onClick={this.onAddUserId} className="mx_UserSelector_AddUserId"> - {_t("Add User")} + { _t("Add User") } </button> </div> ); - } + }, }); diff --git a/src/components/views/login/CaptchaForm.js b/src/components/views/login/CaptchaForm.js index d24990f94d..cf814b0a6e 100644 --- a/src/components/views/login/CaptchaForm.js +++ b/src/components/views/login/CaptchaForm.js @@ -20,7 +20,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { _t, _tJsx } from '../../../languageHandler'; -var DIV_ID = 'mx_recaptcha'; +const DIV_ID = 'mx_recaptcha'; /** * A pure UI component which displays a captcha form. @@ -60,9 +60,9 @@ module.exports = React.createClass({ } else { console.log("Loading recaptcha script..."); window.mx_on_recaptcha_loaded = () => {this._onCaptchaLoaded();}; - var protocol = global.location.protocol; + const protocol = global.location.protocol; if (protocol === "file:") { - var warning = document.createElement('div'); + const warning = document.createElement('div'); // XXX: fix hardcoded app URL. Better solutions include: // * jumping straight to a hosted captcha page (but we don't support that yet) // * embedding the captcha in an iframe (if that works) @@ -72,11 +72,10 @@ module.exports = React.createClass({ /<a>(.*?)<\/a>/, (sub) => { return <a href='https://riot.im/app'>{ sub }</a>; }), warning); this.refs.recaptchaContainer.appendChild(warning); - } - else { - var scriptTag = document.createElement('script'); + } else { + const scriptTag = document.createElement('script'); scriptTag.setAttribute( - 'src', protocol+"//www.google.com/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit" + 'src', protocol+"//www.google.com/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit", ); this.refs.recaptchaContainer.appendChild(scriptTag); } @@ -93,7 +92,7 @@ module.exports = React.createClass({ throw new Error("Recaptcha did not load successfully"); } - var publicKey = this.props.sitePublicKey; + const publicKey = this.props.sitePublicKey; if (!publicKey) { console.error("No public key for recaptcha!"); throw new Error( @@ -130,18 +129,18 @@ module.exports = React.createClass({ if (this.state.errorText) { error = ( <div className="error"> - {this.state.errorText} + { this.state.errorText } </div> ); } return ( <div ref="recaptchaContainer"> - {_t("This Home Server would like to make sure you are not a robot")} - <br/> + { _t("This Home Server would like to make sure you are not a robot") } + <br /> <div id={DIV_ID}></div> - {error} + { error } </div> ); - } + }, }); diff --git a/src/components/views/login/CasLogin.js b/src/components/views/login/CasLogin.js index 96e37875be..49d121687d 100644 --- a/src/components/views/login/CasLogin.js +++ b/src/components/views/login/CasLogin.js @@ -29,9 +29,9 @@ module.exports = React.createClass({ render: function() { return ( <div> - <button onClick={this.props.onSubmit}>{_t("Sign in with CAS")}</button> + <button onClick={this.props.onSubmit}>{ _t("Sign in with CAS") }</button> </div> ); - } + }, }); diff --git a/src/components/views/login/CountryDropdown.js b/src/components/views/login/CountryDropdown.js index 56ab962d98..d8695bb1c1 100644 --- a/src/components/views/login/CountryDropdown.js +++ b/src/components/views/login/CountryDropdown.js @@ -69,7 +69,7 @@ export default class CountryDropdown extends React.Component { } _flagImgForIso2(iso2) { - return <img src={`flags/${iso2}.png`}/>; + return <img src={`flags/${iso2}.png`} />; } _getShortOption(iso2) { @@ -111,8 +111,8 @@ export default class CountryDropdown extends React.Component { const options = displayedCountries.map((country) => { return <div key={country.iso2}> - {this._flagImgForIso2(country.iso2)} - {country.name} <span>(+{country.prefix})</span> + { this._flagImgForIso2(country.iso2) } + { country.name } <span>(+{ country.prefix })</span> </div>; }); @@ -125,7 +125,7 @@ export default class CountryDropdown extends React.Component { menuWidth={298} getShortOption={this._getShortOption} value={value} searchEnabled={true} disabled={this.props.disabled} > - {options} + { options } </Dropdown>; } } diff --git a/src/components/views/login/CustomServerDialog.js b/src/components/views/login/CustomServerDialog.js index f5c5c84e63..474a4097d1 100644 --- a/src/components/views/login/CustomServerDialog.js +++ b/src/components/views/login/CustomServerDialog.js @@ -24,27 +24,27 @@ module.exports = React.createClass({ return ( <div className="mx_ErrorDialog"> <div className="mx_Dialog_title"> - {_t("Custom Server Options")} + { _t("Custom Server Options") } </div> <div className="mx_Dialog_content"> <span> - {_t("You can use the custom server options to sign into other Matrix " + - "servers by specifying a different Home server URL.")} - <br/> - {_t("This allows you to use this app with an existing Matrix account on " + - "a different home server.")} - <br/> - <br/> - {_t("You can also set a custom identity server but this will typically prevent " + - "interaction with users based on email address.")} + { _t("You can use the custom server options to sign into other Matrix " + + "servers by specifying a different Home server URL.") } + <br /> + { _t("This allows you to use this app with an existing Matrix account on " + + "a different home server.") } + <br /> + <br /> + { _t("You can also set a custom identity server but this will typically prevent " + + "interaction with users based on email address.") } </span> </div> <div className="mx_Dialog_buttons"> <button onClick={this.props.onFinished} autoFocus={true}> - {_t("Dismiss")} + { _t("Dismiss") } </button> </div> </div> ); - } + }, }); diff --git a/src/components/views/login/InteractiveAuthEntryComponents.js b/src/components/views/login/InteractiveAuthEntryComponents.js index ae8a087fdd..4c53c23f76 100644 --- a/src/components/views/login/InteractiveAuthEntryComponents.js +++ b/src/components/views/login/InteractiveAuthEntryComponents.js @@ -129,8 +129,8 @@ export const PasswordAuthEntry = React.createClass({ return ( <div> - <p>{_t("To continue, please enter your password.")}</p> - <p>{_t("Password:")}</p> + <p>{ _t("To continue, please enter your password.") }</p> + <p>{ _t("Password:") }</p> <form onSubmit={this._onSubmit}> <input ref="passwordField" @@ -139,11 +139,11 @@ export const PasswordAuthEntry = React.createClass({ type="password" /> <div className="mx_button_row"> - {submitButtonOrSpinner} + { submitButtonOrSpinner } </div> </form> <div className="error"> - {this.props.errorText} + { this.props.errorText } </div> </div> ); @@ -178,14 +178,14 @@ export const RecaptchaAuthEntry = React.createClass({ } const CaptchaForm = sdk.getComponent("views.login.CaptchaForm"); - var sitePublicKey = this.props.stageParams.public_key; + const sitePublicKey = this.props.stageParams.public_key; return ( <div> <CaptchaForm sitePublicKey={sitePublicKey} onCaptchaResponse={this._onCaptchaResponse} /> <div className="error"> - {this.props.errorText} + { this.props.errorText } </div> </div> ); @@ -256,8 +256,8 @@ export const EmailIdentityAuthEntry = React.createClass({ } else { return ( <div> - <p>{_t("An email has been sent to")} <i>{this.props.inputs.emailAddress}</i></p> - <p>{_t("Please check your email to continue registration.")}</p> + <p>{ _t("An email has been sent to") } <i>{ this.props.inputs.emailAddress }</i></p> + <p>{ _t("Please check your email to continue registration.") }</p> </div> ); } @@ -333,12 +333,12 @@ export const MsisdnAuthEntry = React.createClass({ }); this.props.matrixClient.submitMsisdnToken( - this._sid, this.props.clientSecret, this.state.token + this._sid, this.props.clientSecret, this.state.token, ).then((result) => { if (result.success) { const idServerParsedUrl = url.parse( this.props.matrixClient.getIdentityServerUrl(), - ) + ); this.props.submitAuthDict({ type: MsisdnAuthEntry.LOGIN_TYPE, threepid_creds: { @@ -370,8 +370,8 @@ export const MsisdnAuthEntry = React.createClass({ }); return ( <div> - <p>{_t("A text message has been sent to")} +<i>{this._msisdn}</i></p> - <p>{_t("Please enter the code it contains:")}</p> + <p>{ _t("A text message has been sent to") } +<i>{ this._msisdn }</i></p> + <p>{ _t("Please enter the code it contains:") }</p> <div className="mx_InteractiveAuthEntryComponents_msisdnWrapper"> <form onSubmit={this._onFormSubmit}> <input type="text" @@ -386,7 +386,7 @@ export const MsisdnAuthEntry = React.createClass({ /> </form> <div className="error"> - {this.state.errorText} + { this.state.errorText } </div> </div> </div> @@ -421,9 +421,9 @@ export const FallbackAuthEntry = React.createClass({ }, _onShowFallbackClick: function() { - var url = this.props.matrixClient.getFallbackAuthUrl( + const url = this.props.matrixClient.getFallbackAuthUrl( this.props.loginType, - this.props.authSessionId + this.props.authSessionId, ); this._popupWindow = window.open(url); }, @@ -440,9 +440,9 @@ export const FallbackAuthEntry = React.createClass({ render: function() { return ( <div> - <a onClick={this._onShowFallbackClick}>{_t("Start authentication")}</a> + <a onClick={this._onShowFallbackClick}>{ _t("Start authentication") }</a> <div className="error"> - {this.props.errorText} + { this.props.errorText } </div> </div> ); @@ -457,7 +457,7 @@ const AuthEntryComponents = [ ]; export function getEntryComponentForLoginType(loginType) { - for (var c of AuthEntryComponents) { + for (const c of AuthEntryComponents) { if (c.LOGIN_TYPE == loginType) { return c; } diff --git a/src/components/views/login/LoginHeader.js b/src/components/views/login/LoginHeader.js index 3ee3cbea2e..cd1f9c6a28 100644 --- a/src/components/views/login/LoginHeader.js +++ b/src/components/views/login/LoginHeader.js @@ -16,7 +16,7 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); module.exports = React.createClass({ displayName: 'LoginHeader', @@ -27,5 +27,5 @@ module.exports = React.createClass({ Matrix </div> ); - } + }, }); diff --git a/src/components/views/login/PasswordLogin.js b/src/components/views/login/PasswordLogin.js index d532c400bc..484ee01f4e 100644 --- a/src/components/views/login/PasswordLogin.js +++ b/src/components/views/login/PasswordLogin.js @@ -94,7 +94,7 @@ class PasswordLogin extends React.Component { onLoginTypeChange(loginType) { this.setState({ loginType: loginType, - username: "" // Reset because email and username use the same state + username: "", // Reset because email and username use the same state }); } @@ -180,7 +180,7 @@ class PasswordLogin extends React.Component { } render() { - var forgotPasswordJsx; + let forgotPasswordJsx; if (this.props.onForgotPasswordClick) { forgotPasswordJsx = ( @@ -220,21 +220,21 @@ class PasswordLogin extends React.Component { value={this.state.loginType} disabled={matrixIdText === ''} onOptionChange={this.onLoginTypeChange}> - <span key={PasswordLogin.LOGIN_FIELD_MXID}>{matrixIdText}</span> + <span key={PasswordLogin.LOGIN_FIELD_MXID}>{ matrixIdText }</span> <span key={PasswordLogin.LOGIN_FIELD_EMAIL}>{ _t('Email address') }</span> <span key={PasswordLogin.LOGIN_FIELD_PHONE}>{ _t('Phone') }</span> </Dropdown> </div> - {loginField} + { loginField } <input className={pwFieldClass} ref={(e) => {this._passwordField = e;}} type="password" name="password" value={this.state.password} onChange={this.onPasswordChanged} - placeholder={ _t('Password') } + placeholder={_t('Password')} disabled={matrixIdText === ''} /> <br /> - {forgotPasswordJsx} - <input className="mx_Login_submit" type="submit" value={ _t('Sign in') } disabled={matrixIdText === ''} /> + { forgotPasswordJsx } + <input className="mx_Login_submit" type="submit" value={_t('Sign in')} disabled={matrixIdText === ''} /> </form> </div> ); diff --git a/src/components/views/login/RegistrationForm.js b/src/components/views/login/RegistrationForm.js index d5b7bcf46a..9c7c75b125 100644 --- a/src/components/views/login/RegistrationForm.js +++ b/src/components/views/login/RegistrationForm.js @@ -64,7 +64,7 @@ module.exports = React.createClass({ minPasswordLength: 6, onError: function(e) { console.error(e); - } + }, }; }, @@ -91,16 +91,16 @@ module.exports = React.createClass({ this.validateField(FIELD_PHONE_NUMBER); this.validateField(FIELD_EMAIL); - var self = this; + const self = this; if (this.allFieldsValid()) { if (this.refs.email.value == '') { - var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); Modal.createTrackedDialog('If you don\'t specify an email address...', '', QuestionDialog, { title: _t("Warning!"), description: <div> - {_t("If you don't specify an email address, you won't be able to reset your password. " + - "Are you sure?")} + { _t("If you don't specify an email address, you won't be able to reset your password. " + + "Are you sure?") } </div>, button: _t("Continue"), onFinished: function(confirmed) { @@ -116,8 +116,8 @@ module.exports = React.createClass({ }, _doSubmit: function(ev) { - let email = this.refs.email.value.trim(); - var promise = this.props.onRegisterClick({ + const email = this.refs.email.value.trim(); + const promise = this.props.onRegisterClick({ username: this.refs.username.value.trim(), password: this.refs.password.value.trim(), email: email, @@ -138,8 +138,8 @@ module.exports = React.createClass({ * they were validated. */ allFieldsValid: function() { - var keys = Object.keys(this.state.fieldValid); - for (var i = 0; i < keys.length; ++i) { + const keys = Object.keys(this.state.fieldValid); + for (let i = 0; i < keys.length; ++i) { if (this.state.fieldValid[keys[i]] == false) { return false; } @@ -152,8 +152,8 @@ module.exports = React.createClass({ }, validateField: function(field_id) { - var pwd1 = this.refs.password.value.trim(); - var pwd2 = this.refs.passwordConfirm.value.trim(); + const pwd1 = this.refs.password.value.trim(); + const pwd2 = this.refs.passwordConfirm.value.trim(); switch (field_id) { case FIELD_EMAIL: @@ -162,7 +162,7 @@ module.exports = React.createClass({ const matchingTeam = this.props.teamsConfig.teams.find( (team) => { return email.split('@').pop() === team.domain; - } + }, ) || null; this.setState({ selectedTeam: matchingTeam, @@ -191,13 +191,13 @@ module.exports = React.createClass({ this.markFieldValid( field_id, false, - "RegistrationForm.ERR_USERNAME_INVALID" + "RegistrationForm.ERR_USERNAME_INVALID", ); } else if (username == '') { this.markFieldValid( field_id, false, - "RegistrationForm.ERR_USERNAME_BLANK" + "RegistrationForm.ERR_USERNAME_BLANK", ); } else { this.markFieldValid(field_id, true); @@ -208,13 +208,13 @@ module.exports = React.createClass({ this.markFieldValid( field_id, false, - "RegistrationForm.ERR_PASSWORD_MISSING" + "RegistrationForm.ERR_PASSWORD_MISSING", ); } else if (pwd1.length < this.props.minPasswordLength) { this.markFieldValid( field_id, false, - "RegistrationForm.ERR_PASSWORD_LENGTH" + "RegistrationForm.ERR_PASSWORD_LENGTH", ); } else { this.markFieldValid(field_id, true); @@ -223,14 +223,14 @@ module.exports = React.createClass({ case FIELD_PASSWORD_CONFIRM: this.markFieldValid( field_id, pwd1 == pwd2, - "RegistrationForm.ERR_PASSWORD_MISMATCH" + "RegistrationForm.ERR_PASSWORD_MISMATCH", ); break; } }, markFieldValid: function(field_id, val, error_code) { - var fieldValid = this.state.fieldValid; + const fieldValid = this.state.fieldValid; fieldValid[field_id] = val; this.setState({fieldValid: fieldValid}); if (!val) { @@ -271,7 +271,7 @@ module.exports = React.createClass({ }, render: function() { - var self = this; + const self = this; const emailSection = ( <div> @@ -280,7 +280,7 @@ module.exports = React.createClass({ defaultValue={this.props.defaultEmail} className={this._classForField(FIELD_EMAIL, 'mx_Login_field')} onBlur={function() {self.validateField(FIELD_EMAIL);}} - value={self.state.email}/> + value={self.state.email} /> </div> ); let belowEmailSection; @@ -291,7 +291,7 @@ module.exports = React.createClass({ Sorry, but your university is not registered with us just yet. Email us on <a href={"mailto:" + this.props.teamsConfig.supportEmail}> - {this.props.teamsConfig.supportEmail} + { this.props.teamsConfig.supportEmail } </a> to get your university signed up. Or continue to register with Riot to enjoy our open source platform. </p> @@ -299,7 +299,7 @@ module.exports = React.createClass({ } else if (this.state.selectedTeam) { belowEmailSection = ( <p className="mx_Login_support"> - {_t("You are registering with %(SelectedTeamName)s", {SelectedTeamName: this.state.selectedTeam.name})} + { _t("You are registering with %(SelectedTeamName)s", {SelectedTeamName: this.state.selectedTeam.name}) } </p> ); } @@ -321,7 +321,7 @@ module.exports = React.createClass({ FIELD_PHONE_NUMBER, 'mx_Login_phoneNumberField', 'mx_Login_field', - 'mx_Login_field_has_prefix' + 'mx_Login_field_has_prefix', )} onBlur={function() {self.validateField(FIELD_PHONE_NUMBER);}} value={self.state.phoneNumber} @@ -333,16 +333,16 @@ module.exports = React.createClass({ <input className="mx_Login_submit" type="submit" value={_t("Register")} /> ); - let placeholderUserName = _t("User name"); + const placeholderUserName = _t("User name"); return ( <div> <form onSubmit={this.onSubmit}> - {emailSection} - {belowEmailSection} - {phoneSection} + { emailSection } + { belowEmailSection } + { phoneSection } <input type="text" ref="username" - placeholder={ placeholderUserName } defaultValue={this.props.defaultUsername} + placeholder={placeholderUserName} defaultValue={this.props.defaultUsername} className={this._classForField(FIELD_USERNAME, 'mx_Login_field')} onBlur={function() {self.validateField(FIELD_USERNAME);}} /> <br /> @@ -357,9 +357,9 @@ module.exports = React.createClass({ onBlur={function() {self.validateField(FIELD_PASSWORD_CONFIRM);}} defaultValue={this.props.defaultPassword} /> <br /> - {registerButton} + { registerButton } </form> </div> ); - } + }, }); diff --git a/src/components/views/login/ServerConfig.js b/src/components/views/login/ServerConfig.js index 0042ab5e9f..d53c7238b1 100644 --- a/src/components/views/login/ServerConfig.js +++ b/src/components/views/login/ServerConfig.js @@ -16,9 +16,9 @@ limitations under the License. 'use strict'; -var React = require('react'); -var Modal = require('../../../Modal'); -var sdk = require('../../../index'); +const React = require('react'); +const Modal = require('../../../Modal'); +const sdk = require('../../../index'); import { _t } from '../../../languageHandler'; /** @@ -45,7 +45,7 @@ module.exports = React.createClass({ customIsUrl: React.PropTypes.string, withToggleButton: React.PropTypes.bool, - delayTimeMs: React.PropTypes.number // time to wait before invoking onChanged + delayTimeMs: React.PropTypes.number, // time to wait before invoking onChanged }, getDefaultProps: function() { @@ -54,7 +54,7 @@ module.exports = React.createClass({ customHsUrl: "", customIsUrl: "", withToggleButton: false, - delayTimeMs: 0 + delayTimeMs: 0, }; }, @@ -65,18 +65,18 @@ module.exports = React.createClass({ // if withToggleButton is false, then show the config all the time given we have no way otherwise of making it visible configVisible: !this.props.withToggleButton || (this.props.customHsUrl !== this.props.defaultHsUrl) || - (this.props.customIsUrl !== this.props.defaultIsUrl) + (this.props.customIsUrl !== this.props.defaultIsUrl), }; }, onHomeserverChanged: function(ev) { this.setState({hs_url: ev.target.value}, function() { this._hsTimeoutId = this._waitThenInvoke(this._hsTimeoutId, function() { - var hsUrl = this.state.hs_url.trim().replace(/\/$/, ""); + let hsUrl = this.state.hs_url.trim().replace(/\/$/, ""); if (hsUrl === "") hsUrl = this.props.defaultHsUrl; this.props.onServerConfigChange({ - hsUrl : this.state.hs_url, - isUrl : this.state.is_url, + hsUrl: this.state.hs_url, + isUrl: this.state.is_url, }); }); }); @@ -85,11 +85,11 @@ module.exports = React.createClass({ onIdentityServerChanged: function(ev) { this.setState({is_url: ev.target.value}, function() { this._isTimeoutId = this._waitThenInvoke(this._isTimeoutId, function() { - var isUrl = this.state.is_url.trim().replace(/\/$/, ""); + let isUrl = this.state.is_url.trim().replace(/\/$/, ""); if (isUrl === "") isUrl = this.props.defaultIsUrl; this.props.onServerConfigChange({ - hsUrl : this.state.hs_url, - isUrl : this.state.is_url, + hsUrl: this.state.hs_url, + isUrl: this.state.is_url, }); }); }); @@ -104,32 +104,31 @@ module.exports = React.createClass({ onServerConfigVisibleChange: function(visible, ev) { this.setState({ - configVisible: visible + configVisible: visible, }); if (!visible) { this.props.onServerConfigChange({ - hsUrl : this.props.defaultHsUrl, - isUrl : this.props.defaultIsUrl, + hsUrl: this.props.defaultHsUrl, + isUrl: this.props.defaultIsUrl, }); - } - else { + } else { this.props.onServerConfigChange({ - hsUrl : this.state.hs_url, - isUrl : this.state.is_url, + hsUrl: this.state.hs_url, + isUrl: this.state.is_url, }); } }, showHelpPopup: function() { - var CustomServerDialog = sdk.getComponent('login.CustomServerDialog'); + const CustomServerDialog = sdk.getComponent('login.CustomServerDialog'); Modal.createTrackedDialog('Custom Server Dialog', '', CustomServerDialog); }, render: function() { - var serverConfigStyle = {}; + const serverConfigStyle = {}; serverConfigStyle.display = this.state.configVisible ? 'block' : 'none'; - var toggleButton; + let toggleButton; if (this.props.withToggleButton) { toggleButton = ( <div className="mx_ServerConfig_selector"> @@ -137,14 +136,14 @@ module.exports = React.createClass({ checked={!this.state.configVisible} onChange={this.onServerConfigVisibleChange.bind(this, false)} /> <label className="mx_Login_label" htmlFor="basic"> - {_t("Default server")} + { _t("Default server") } </label> <input className="mx_Login_radio" id="advanced" name="configVisible" type="radio" checked={this.state.configVisible} onChange={this.onServerConfigVisibleChange.bind(this, true)} /> <label className="mx_Login_label" htmlFor="advanced"> - {_t("Custom server")} + { _t("Custom server") } </label> </div> ); @@ -152,11 +151,11 @@ module.exports = React.createClass({ return ( <div> - {toggleButton} + { toggleButton } <div style={serverConfigStyle}> <div className="mx_ServerConfig"> <label className="mx_Login_label mx_ServerConfig_hslabel" htmlFor="hsurl"> - {_t("Home server URL")} + { _t("Home server URL") } </label> <input className="mx_Login_field" id="hsurl" type="text" placeholder={this.props.defaultHsUrl} @@ -164,7 +163,7 @@ module.exports = React.createClass({ value={this.state.hs_url} onChange={this.onHomeserverChanged} /> <label className="mx_Login_label mx_ServerConfig_islabel" htmlFor="isurl"> - {_t("Identity server URL")} + { _t("Identity server URL") } </label> <input className="mx_Login_field" id="isurl" type="text" placeholder={this.props.defaultIsUrl} @@ -172,11 +171,11 @@ module.exports = React.createClass({ value={this.state.is_url} onChange={this.onIdentityServerChanged} /> <a className="mx_ServerConfig_help" href="#" onClick={this.showHelpPopup}> - {_t("What does this mean?")} + { _t("What does this mean?") } </a> </div> </div> </div> ); - } + }, }); diff --git a/src/components/views/messages/MAudioBody.js b/src/components/views/messages/MAudioBody.js index 52c1341e60..ab53918987 100644 --- a/src/components/views/messages/MAudioBody.js +++ b/src/components/views/messages/MAudioBody.js @@ -35,7 +35,7 @@ export default class MAudioBody extends React.Component { } onPlayToggle() { this.setState({ - playing: !this.state.playing + playing: !this.state.playing, }); } @@ -49,9 +49,9 @@ export default class MAudioBody extends React.Component { } componentDidMount() { - var content = this.props.mxEvent.getContent(); + const content = this.props.mxEvent.getContent(); if (content.file !== undefined && this.state.decryptedUrl === null) { - var decryptedBlob; + let decryptedBlob; decryptFile(content.file).then(function(blob) { decryptedBlob = blob; return readBlobAsDataUri(decryptedBlob); @@ -70,14 +70,13 @@ export default class MAudioBody extends React.Component { } render() { - const content = this.props.mxEvent.getContent(); if (this.state.error !== null) { return ( <span className="mx_MAudioBody" ref="body"> - <img src="img/warning.svg" width="16" height="16"/> - {_t("Error decrypting audio")} + <img src="img/warning.svg" width="16" height="16" /> + { _t("Error decrypting audio") } </span> ); } @@ -89,7 +88,7 @@ export default class MAudioBody extends React.Component { // Not sure how tall the audio player is so not sure how tall it should actually be. return ( <span className="mx_MAudioBody"> - <img src="img/spinner.gif" alt={content.body} width="16" height="16"/> + <img src="img/spinner.gif" alt={content.body} width="16" height="16" /> </span> ); } diff --git a/src/components/views/messages/MFileBody.js b/src/components/views/messages/MFileBody.js index 53c36f234c..8eedf4e1fe 100644 --- a/src/components/views/messages/MFileBody.js +++ b/src/components/views/messages/MFileBody.js @@ -28,10 +28,10 @@ import Modal from '../../../Modal'; // A cached tinted copy of "img/download.svg" -var tintedDownloadImageURL; +let tintedDownloadImageURL; // Track a list of mounted MFileBody instances so that we can update // the "img/download.svg" when the tint changes. -var nextMountId = 0; +let nextMountId = 0; const mounts = {}; /** @@ -169,11 +169,11 @@ function computedStyle(element) { return ""; } const style = window.getComputedStyle(element, null); - var cssText = style.cssText; + let cssText = style.cssText; if (cssText == "") { // Firefox doesn't implement ".cssText" for computed styles. // https://bugzilla.mozilla.org/show_bug.cgi?id=137687 - for (var i = 0; i < style.length; i++) { + for (let i = 0; i < style.length; i++) { cssText += style[i] + ":"; cssText += style.getPropertyValue(style[i]) + ";"; } @@ -202,7 +202,7 @@ module.exports = React.createClass({ * @return {string} the human readable link text for the attachment. */ presentableTextForFile: function(content) { - var linkText = _t("Attachment"); + let linkText = _t("Attachment"); if (content.body && content.body.length > 0) { // The content body should be the name of the file including a // file extension. @@ -270,7 +270,7 @@ module.exports = React.createClass({ // Need to decrypt the attachment // Wait for the user to click on the link before downloading // and decrypting the attachment. - var decrypting = false; + let decrypting = false; const decrypt = () => { if (decrypting) { return false; @@ -328,14 +328,14 @@ module.exports = React.createClass({ <span className="mx_MFileBody"> <div className="mx_MImageBody_download"> <div style={{display: "none"}}> - {/* + { /* * Add dummy copy of the "a" tag * We'll use it to learn how the download link * would have been styled if it was rendered inline. - */} - <a ref="dummyLink"/> + */ } + <a ref="dummyLink" /> </div> - <iframe src={renderer_url} onLoad={onIframeLoad} ref="iframe"/> + <iframe src={renderer_url} onLoad={onIframeLoad} ref="iframe" /> </div> </span> ); @@ -356,13 +356,12 @@ module.exports = React.createClass({ </div> </span> ); - } - else { + } else { return ( <span className="mx_MFileBody"> <div className="mx_MImageBody_download"> <a href={contentUrl} download={fileName} target="_blank" rel="noopener"> - <img src={tintedDownloadImageURL} width="12" height="14" ref="downloadImage"/> + <img src={tintedDownloadImageURL} width="12" height="14" ref="downloadImage" /> { _t("Download %(text)s", { text: text }) } </a> </div> @@ -370,7 +369,7 @@ module.exports = React.createClass({ ); } } else { - var extra = text ? (': ' + text) : ''; + const extra = text ? (': ' + text) : ''; return <span className="mx_MFileBody"> { _t("Invalid file%(extra)s", { extra: extra }) } </span>; diff --git a/src/components/views/messages/MImageBody.js b/src/components/views/messages/MImageBody.js index dcc073c80e..255f562fcd 100644 --- a/src/components/views/messages/MImageBody.js +++ b/src/components/views/messages/MImageBody.js @@ -191,8 +191,8 @@ module.exports = React.createClass({ if (this.state.error !== null) { return ( <span className="mx_MImageBody" ref="body"> - <img src="img/warning.svg" width="16" height="16"/> - {_t("Error decrypting image")} + <img src="img/warning.svg" width="16" height="16" /> + { _t("Error decrypting image") } </span> ); } @@ -210,7 +210,7 @@ module.exports = React.createClass({ }}> <img src="img/spinner.gif" alt={content.body} width="32" height="32" style={{ "margin": "auto", - }}/> + }} /> </div> </span> ); @@ -227,7 +227,7 @@ module.exports = React.createClass({ if (thumbUrl) { return ( <span className="mx_MImageBody" ref="body"> - <a href={contentUrl} onClick={ this.onClick }> + <a href={contentUrl} onClick={this.onClick}> <img className="mx_MImageBody_thumbnail" src={thumbUrl} ref="image" alt={content.body} onMouseEnter={this.onImageEnter} @@ -239,13 +239,13 @@ module.exports = React.createClass({ } else if (content.body) { return ( <span className="mx_MImageBody"> - {_t("Image '%(Body)s' cannot be displayed.", {Body: content.body})} + { _t("Image '%(Body)s' cannot be displayed.", {Body: content.body}) } </span> ); } else { return ( <span className="mx_MImageBody"> - {_t("This image cannot be displayed.")} + { _t("This image cannot be displayed.") } </span> ); } diff --git a/src/components/views/messages/MVideoBody.js b/src/components/views/messages/MVideoBody.js index 06c233e012..d2205f5c78 100644 --- a/src/components/views/messages/MVideoBody.js +++ b/src/components/views/messages/MVideoBody.js @@ -54,13 +54,12 @@ module.exports = React.createClass({ // no scaling needs to be applied return 1; } - var widthMulti = thumbWidth / fullWidth; - var heightMulti = thumbHeight / fullHeight; + const widthMulti = thumbWidth / fullWidth; + const heightMulti = thumbHeight / fullHeight; if (widthMulti < heightMulti) { // width is the dominant dimension so scaling will be fixed on that return widthMulti; - } - else { + } else { // height is the dominant dimension so scaling will be fixed on that return heightMulti; } @@ -89,15 +88,15 @@ module.exports = React.createClass({ componentDidMount: function() { const content = this.props.mxEvent.getContent(); if (content.file !== undefined && this.state.decryptedUrl === null) { - var thumbnailPromise = Promise.resolve(null); + let thumbnailPromise = Promise.resolve(null); if (content.info.thumbnail_file) { thumbnailPromise = decryptFile( - content.info.thumbnail_file + content.info.thumbnail_file, ).then(function(blob) { return readBlobAsDataUri(blob); }); } - var decryptedBlob; + let decryptedBlob; thumbnailPromise.then((thumbnailUrl) => { return decryptFile(content.file).then(function(blob) { decryptedBlob = blob; @@ -126,8 +125,8 @@ module.exports = React.createClass({ if (this.state.error !== null) { return ( <span className="mx_MVideoBody" ref="body"> - <img src="img/warning.svg" width="16" height="16"/> - {_t("Error decrypting video")} + <img src="img/warning.svg" width="16" height="16" /> + { _t("Error decrypting video") } </span> ); } @@ -144,7 +143,7 @@ module.exports = React.createClass({ "justify-items": "center", "width": "100%", }}> - <img src="img/spinner.gif" alt={content.body} width="16" height="16"/> + <img src="img/spinner.gif" alt={content.body} width="16" height="16" /> </div> </span> ); diff --git a/src/components/views/messages/MessageEvent.js b/src/components/views/messages/MessageEvent.js index 4ac0c0dabb..deda1d8d20 100644 --- a/src/components/views/messages/MessageEvent.js +++ b/src/components/views/messages/MessageEvent.js @@ -16,8 +16,8 @@ limitations under the License. 'use strict'; -var React = require('react'); -var sdk = require('../../../index'); +const React = require('react'); +const sdk = require('../../../index'); module.exports = React.createClass({ displayName: 'MessageEvent', @@ -47,21 +47,21 @@ module.exports = React.createClass({ }, render: function() { - var UnknownBody = sdk.getComponent('messages.UnknownBody'); + const UnknownBody = sdk.getComponent('messages.UnknownBody'); - var bodyTypes = { + const bodyTypes = { 'm.text': sdk.getComponent('messages.TextualBody'), 'm.notice': sdk.getComponent('messages.TextualBody'), 'm.emote': sdk.getComponent('messages.TextualBody'), 'm.image': sdk.getComponent('messages.MImageBody'), 'm.file': sdk.getComponent('messages.MFileBody'), 'm.audio': sdk.getComponent('messages.MAudioBody'), - 'm.video': sdk.getComponent('messages.MVideoBody') + 'm.video': sdk.getComponent('messages.MVideoBody'), }; - var content = this.props.mxEvent.getContent(); - var msgtype = content.msgtype; - var BodyType = UnknownBody; + const content = this.props.mxEvent.getContent(); + const msgtype = content.msgtype; + let BodyType = UnknownBody; if (msgtype && bodyTypes[msgtype]) { BodyType = bodyTypes[msgtype]; } else if (content.url) { diff --git a/src/components/views/messages/RoomAvatarEvent.js b/src/components/views/messages/RoomAvatarEvent.js index ed790953dc..453394249f 100644 --- a/src/components/views/messages/RoomAvatarEvent.js +++ b/src/components/views/messages/RoomAvatarEvent.js @@ -31,9 +31,9 @@ module.exports = React.createClass({ }, onAvatarClick: function(name) { - var httpUrl = MatrixClientPeg.get().mxcUrlToHttp(this.props.mxEvent.getContent().url); - var ImageView = sdk.getComponent("elements.ImageView"); - var params = { + const httpUrl = MatrixClientPeg.get().mxcUrlToHttp(this.props.mxEvent.getContent().url); + const ImageView = sdk.getComponent("elements.ImageView"); + const params = { src: httpUrl, name: name, }; @@ -41,12 +41,12 @@ module.exports = React.createClass({ }, render: function() { - var ev = this.props.mxEvent; - var senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); - var BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); + const ev = this.props.mxEvent; + const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); + const BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); - var room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId()); - var name = _t('%(senderDisplayName)s changed the avatar for %(roomName)s', { + const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId()); + const name = _t('%(senderDisplayName)s changed the avatar for %(roomName)s', { senderDisplayName: senderDisplayName, roomName: room ? room.name : '', }); @@ -59,12 +59,12 @@ module.exports = React.createClass({ ); } - var url = ContentRepo.getHttpUriForMxc( + const url = ContentRepo.getHttpUriForMxc( MatrixClientPeg.get().getHomeserverUrl(), ev.getContent().url, Math.ceil(14 * window.devicePixelRatio), Math.ceil(14 * window.devicePixelRatio), - 'crop' + 'crop', ); // it sucks that _tJsx doesn't support normal _t substitutions :(( @@ -79,11 +79,11 @@ module.exports = React.createClass({ (sub) => senderDisplayName, (sub) => <AccessibleButton key="avatar" className="mx_RoomAvatarEvent_avatar" - onClick={ this.onAvatarClick.bind(this, name) }> - <BaseAvatar width={14} height={14} url={ url } - name={ name } /> + onClick={this.onAvatarClick.bind(this, name)}> + <BaseAvatar width={14} height={14} url={url} + name={name} /> </AccessibleButton>, - ] + ], ) } </div> diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index aae46d343c..c0468c38c2 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -104,10 +104,10 @@ module.exports = React.createClass({ if (this._unmounted) return; for (let i = 0; i < blocks.length; i++) { if (UserSettingsStore.getSyncedSetting("enableSyntaxHighlightLanguageDetection", false)) { - highlight.highlightBlock(blocks[i]) + highlight.highlightBlock(blocks[i]); } else { // Only syntax highlight if there's a class starting with language- - let classes = blocks[i].className.split(/\s+/).filter(function (cl) { + const classes = blocks[i].className.split(/\s+/).filter(function(cl) { return cl.startsWith('language-'); }); @@ -146,7 +146,7 @@ module.exports = React.createClass({ //console.log("calculateUrlPreview: ShowUrlPreview for %s is %s", this.props.mxEvent.getId(), this.props.showUrlPreview); if (this.props.showUrlPreview && !this.state.links.length) { - var links = this.findLinks(this.refs.content.children); + let links = this.findLinks(this.refs.content.children); if (links.length) { // de-dup the links (but preserve ordering) const seen = new Set(); @@ -160,7 +160,7 @@ module.exports = React.createClass({ // lazy-load the hidden state of the preview widget from localstorage if (global.localStorage) { - var hidden = global.localStorage.getItem("hide_preview_" + this.props.mxEvent.getId()); + const hidden = global.localStorage.getItem("hide_preview_" + this.props.mxEvent.getId()); this.setState({ widgetHidden: hidden }); } } @@ -197,21 +197,18 @@ module.exports = React.createClass({ }, findLinks: function(nodes) { - var links = []; + let links = []; - for (var i = 0; i < nodes.length; i++) { - var node = nodes[i]; - if (node.tagName === "A" && node.getAttribute("href")) - { + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (node.tagName === "A" && node.getAttribute("href")) { if (this.isLinkPreviewable(node)) { links.push(node.getAttribute("href")); } - } - else if (node.tagName === "PRE" || node.tagName === "CODE" || + } else if (node.tagName === "PRE" || node.tagName === "CODE" || node.tagName === "BLOCKQUOTE") { continue; - } - else if (node.children && node.children.length) { + } else if (node.children && node.children.length) { links = links.concat(this.findLinks(node.children)); } } @@ -221,8 +218,7 @@ module.exports = React.createClass({ isLinkPreviewable: function(node) { // don't try to preview relative links if (!node.getAttribute("href").startsWith("http://") && - !node.getAttribute("href").startsWith("https://")) - { + !node.getAttribute("href").startsWith("https://")) { return false; } @@ -231,13 +227,11 @@ module.exports = React.createClass({ // or from a full foo.bar/baz style schemeless URL) - or be a markdown-style // link, in which case we check the target text differs from the link value. // TODO: make this configurable? - if (node.textContent.indexOf("/") > -1) - { + if (node.textContent.indexOf("/") > -1) { return true; - } - else { - var url = node.getAttribute("href"); - var host = url.match(/^https?:\/\/(.*?)(\/|$)/)[1]; + } else { + const url = node.getAttribute("href"); + const host = url.match(/^https?:\/\/(.*?)(\/|$)/)[1]; // never preview matrix.to links (if anything we should give a smart // preview of the room/user they point to: nobody needs to be reminded @@ -247,8 +241,7 @@ module.exports = React.createClass({ if (node.textContent.toLowerCase().trim().startsWith(host.toLowerCase())) { // it's a "foo.pl" style link return false; - } - else { + } else { // it's a [foo bar](http://foo.com) style link return true; } @@ -263,7 +256,7 @@ module.exports = React.createClass({ button.onclick = (e) => { const copyCode = button.parentNode.getElementsByTagName("code")[0]; const successful = this.copyToClipboard(copyCode.textContent); - + const GenericTextContextMenu = sdk.getComponent('context_menus.GenericTextContextMenu'); const buttonRect = e.target.getBoundingClientRect(); @@ -314,7 +307,7 @@ module.exports = React.createClass({ getInnerText: () => { return this.refs.content.innerText; - } + }, }; }, @@ -328,28 +321,28 @@ module.exports = React.createClass({ // the window.open command occurs in the same stack frame as the onClick callback. // Go fetch a scalar token - let scalarClient = new ScalarAuthClient(); + const scalarClient = new ScalarAuthClient(); scalarClient.connect().then(() => { - let completeUrl = scalarClient.getStarterLink(starterLink); - let QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - let integrationsUrl = SdkConfig.get().integrations_ui_url; + const completeUrl = scalarClient.getStarterLink(starterLink); + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + const integrationsUrl = SdkConfig.get().integrations_ui_url; Modal.createTrackedDialog('Add an integration', '', QuestionDialog, { title: _t("Add an Integration"), description: <div> - {_t("You are about to be taken to a third-party site so you can " + + { _t("You are about to be taken to a third-party site so you can " + "authenticate your account for use with %(integrationsUrl)s. " + - "Do you wish to continue?", { integrationsUrl: integrationsUrl })} + "Do you wish to continue?", { integrationsUrl: integrationsUrl }) } </div>, button: _t("Continue"), onFinished: function(confirmed) { if (!confirmed) { return; } - let width = window.screen.width > 1024 ? 1024 : window.screen.width; - let height = window.screen.height > 800 ? 800 : window.screen.height; - let left = (window.screen.width - width) / 2; - let top = (window.screen.height - height) / 2; + const width = window.screen.width > 1024 ? 1024 : window.screen.width; + const height = window.screen.height > 800 ? 800 : window.screen.height; + const left = (window.screen.width - width) / 2; + const top = (window.screen.height - height) / 2; window.open(completeUrl, '_blank', `height=${height}, width=${width}, top=${top}, left=${left},`); }, }); @@ -358,28 +351,27 @@ module.exports = React.createClass({ render: function() { const EmojiText = sdk.getComponent('elements.EmojiText'); - var mxEvent = this.props.mxEvent; - var content = mxEvent.getContent(); + const mxEvent = this.props.mxEvent; + const content = mxEvent.getContent(); - var body = HtmlUtils.bodyToHtml(content, this.props.highlights, {}); + let body = HtmlUtils.bodyToHtml(content, this.props.highlights, {}); if (this.props.highlightLink) { - body = <a href={ this.props.highlightLink }>{ body }</a>; - } - else if (content.data && typeof content.data["org.matrix.neb.starter_link"] === "string") { - body = <a href="#" onClick={ this.onStarterLinkClick.bind(this, content.data["org.matrix.neb.starter_link"]) }>{ body }</a>; + body = <a href={this.props.highlightLink}>{ body }</a>; + } else if (content.data && typeof content.data["org.matrix.neb.starter_link"] === "string") { + body = <a href="#" onClick={this.onStarterLinkClick.bind(this, content.data["org.matrix.neb.starter_link"])}>{ body }</a>; } - var widgets; + let widgets; if (this.state.links.length && !this.state.widgetHidden && this.props.showUrlPreview) { - var LinkPreviewWidget = sdk.getComponent('rooms.LinkPreviewWidget'); + const LinkPreviewWidget = sdk.getComponent('rooms.LinkPreviewWidget'); widgets = this.state.links.map((link)=>{ return <LinkPreviewWidget - key={ link } - link={ link } - mxEvent={ this.props.mxEvent } - onCancelClick={ this.onCancelClick } - onWidgetLoad={ this.props.onWidgetLoad }/>; + key={link} + link={link} + mxEvent={this.props.mxEvent} + onCancelClick={this.onCancelClick} + onWidgetLoad={this.props.onWidgetLoad} />; }); } @@ -393,7 +385,7 @@ module.exports = React.createClass({ className="mx_MEmoteBody_sender" onClick={this.onEmoteSenderClick} > - {name} + { name } </EmojiText> { body } diff --git a/src/components/views/messages/TextualEvent.js b/src/components/views/messages/TextualEvent.js index 088f7cbbc6..be0962a868 100644 --- a/src/components/views/messages/TextualEvent.js +++ b/src/components/views/messages/TextualEvent.js @@ -16,9 +16,9 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); -var TextForEvent = require('../../../TextForEvent'); +const TextForEvent = require('../../../TextForEvent'); import sdk from '../../../index'; module.exports = React.createClass({ @@ -28,13 +28,13 @@ module.exports = React.createClass({ /* the MatrixEvent to show */ mxEvent: React.PropTypes.object.isRequired, }, - + render: function() { const EmojiText = sdk.getComponent('elements.EmojiText'); - var text = TextForEvent.textForEvent(this.props.mxEvent); + const text = TextForEvent.textForEvent(this.props.mxEvent); if (text == null || text.length === 0) return null; return ( - <EmojiText element="div" className="mx_TextualEvent">{text}</EmojiText> + <EmojiText element="div" className="mx_TextualEvent">{ text }</EmojiText> ); }, }); diff --git a/src/components/views/room_settings/AliasSettings.js b/src/components/views/room_settings/AliasSettings.js index 94301c432d..c64e876dbe 100644 --- a/src/components/views/room_settings/AliasSettings.js +++ b/src/components/views/room_settings/AliasSettings.js @@ -15,12 +15,12 @@ limitations under the License. */ import Promise from 'bluebird'; -var React = require('react'); -var ObjectUtils = require("../../../ObjectUtils"); -var MatrixClientPeg = require('../../../MatrixClientPeg'); -var sdk = require("../../../index"); +const React = require('react'); +const ObjectUtils = require("../../../ObjectUtils"); +const MatrixClientPeg = require('../../../MatrixClientPeg'); +const sdk = require("../../../index"); import { _t } from '../../../languageHandler'; -var Modal = require("../../../Modal"); +const Modal = require("../../../Modal"); module.exports = React.createClass({ displayName: 'AliasSettings', @@ -30,14 +30,14 @@ module.exports = React.createClass({ canSetCanonicalAlias: React.PropTypes.bool.isRequired, canSetAliases: React.PropTypes.bool.isRequired, aliasEvents: React.PropTypes.array, // [MatrixEvent] - canonicalAliasEvent: React.PropTypes.object // MatrixEvent + canonicalAliasEvent: React.PropTypes.object, // MatrixEvent }, getDefaultProps: function() { return { canSetAliases: false, canSetCanonicalAlias: false, - aliasEvents: [] + aliasEvents: [], }; }, @@ -48,12 +48,12 @@ module.exports = React.createClass({ recalculateState: function(aliasEvents, canonicalAliasEvent) { aliasEvents = aliasEvents || []; - var state = { + const state = { domainToAliases: {}, // { domain.com => [#alias1:domain.com, #alias2:domain.com] } remoteDomains: [], // [ domain.com, foobar.com ] - canonicalAlias: null // #canonical:domain.com + canonicalAlias: null, // #canonical:domain.com }; - var localDomain = MatrixClientPeg.get().getDomain(); + const localDomain = MatrixClientPeg.get().getDomain(); state.domainToAliases = this.aliasEventsToDictionary(aliasEvents); @@ -69,26 +69,26 @@ module.exports = React.createClass({ }, saveSettings: function() { - var promises = []; + let promises = []; // save new aliases for m.room.aliases - var aliasOperations = this.getAliasOperations(); - for (var i = 0; i < aliasOperations.length; i++) { - var alias_operation = aliasOperations[i]; + const aliasOperations = this.getAliasOperations(); + for (let i = 0; i < aliasOperations.length; i++) { + const alias_operation = aliasOperations[i]; console.log("alias %s %s", alias_operation.place, alias_operation.val); switch (alias_operation.place) { case 'add': promises.push( MatrixClientPeg.get().createAlias( - alias_operation.val, this.props.roomId - ) + alias_operation.val, this.props.roomId, + ), ); break; case 'del': promises.push( MatrixClientPeg.get().deleteAlias( - alias_operation.val - ) + alias_operation.val, + ), ); break; default: @@ -98,7 +98,7 @@ module.exports = React.createClass({ // save new canonical alias - var oldCanonicalAlias = null; + let oldCanonicalAlias = null; if (this.props.canonicalAliasEvent) { oldCanonicalAlias = this.props.canonicalAliasEvent.getContent().alias; } @@ -107,9 +107,9 @@ module.exports = React.createClass({ promises = [Promise.all(promises).then( MatrixClientPeg.get().sendStateEvent( this.props.roomId, "m.room.canonical_alias", { - alias: this.state.canonicalAlias - }, "" - ) + alias: this.state.canonicalAlias, + }, "", + ), )]; } @@ -117,7 +117,7 @@ module.exports = React.createClass({ }, aliasEventsToDictionary: function(aliasEvents) { // m.room.alias events - var dict = {}; + const dict = {}; aliasEvents.forEach((event) => { dict[event.getStateKey()] = ( (event.getContent().aliases || []).slice() // shallow-copy @@ -132,7 +132,7 @@ module.exports = React.createClass({ }, getAliasOperations: function() { - var oldAliases = this.aliasEventsToDictionary(this.props.aliasEvents); + const oldAliases = this.aliasEventsToDictionary(this.props.aliasEvents); return ObjectUtils.getKeyValueArrayDiffs(oldAliases, this.state.domainToAliases); }, @@ -191,26 +191,26 @@ module.exports = React.createClass({ onCanonicalAliasChange: function(event) { this.setState({ - canonicalAlias: event.target.value + canonicalAlias: event.target.value, }); }, render: function() { - var self = this; - var EditableText = sdk.getComponent("elements.EditableText"); - var EditableItemList = sdk.getComponent("elements.EditableItemList"); - var localDomain = MatrixClientPeg.get().getDomain(); + const self = this; + const EditableText = sdk.getComponent("elements.EditableText"); + const EditableItemList = sdk.getComponent("elements.EditableItemList"); + const localDomain = MatrixClientPeg.get().getDomain(); - var canonical_alias_section; + let canonical_alias_section; if (this.props.canSetCanonicalAlias) { canonical_alias_section = ( - <select onChange={this.onCanonicalAliasChange} defaultValue={ this.state.canonicalAlias }> + <select onChange={this.onCanonicalAliasChange} defaultValue={this.state.canonicalAlias}> <option value="" key="unset">{ _t('not specified') }</option> { Object.keys(self.state.domainToAliases).map(function(domain, i) { return self.state.domainToAliases[domain].map(function(alias, j) { return ( - <option value={ alias } key={ i + "_" + j }> + <option value={alias} key={i + "_" + j}> { alias } </option> ); @@ -219,34 +219,33 @@ module.exports = React.createClass({ } </select> ); - } - else { + } else { canonical_alias_section = ( <b>{ this.state.canonicalAlias || _t('not set') }</b> ); } - var remote_aliases_section; + let remote_aliases_section; if (this.state.remoteDomains.length) { remote_aliases_section = ( <div> <div className="mx_RoomSettings_aliasLabel"> - {_t("Remote addresses for this room:")} + { _t("Remote addresses for this room:") } </div> <div className="mx_RoomSettings_aliasesTable"> { this.state.remoteDomains.map((domain, i) => { return this.state.domainToAliases[domain].map(function(alias, j) { return ( - <div className="mx_RoomSettings_aliasesTableRow" key={ i + "_" + j }> + <div className="mx_RoomSettings_aliasesTableRow" key={i + "_" + j}> <EditableText className="mx_RoomSettings_alias mx_RoomSettings_editable" - blurToCancel={ false } - editable={ false } - initialValue={ alias } /> + blurToCancel={false} + editable={false} + initialValue={alias} /> </div> ); }); - })} + }) } </div> </div> ); diff --git a/src/components/views/room_settings/ColorSettings.js b/src/components/views/room_settings/ColorSettings.js index b37802d304..d914390bd8 100644 --- a/src/components/views/room_settings/ColorSettings.js +++ b/src/components/views/room_settings/ColorSettings.js @@ -14,16 +14,16 @@ See the License for the specific language governing permissions and limitations under the License. */ import Promise from 'bluebird'; -var React = require('react'); +const React = require('react'); -var sdk = require('../../../index'); -var Tinter = require('../../../Tinter'); -var MatrixClientPeg = require("../../../MatrixClientPeg"); -var Modal = require("../../../Modal"); +const sdk = require('../../../index'); +const Tinter = require('../../../Tinter'); +const MatrixClientPeg = require("../../../MatrixClientPeg"); +const Modal = require("../../../Modal"); import dis from '../../../dispatcher'; -var ROOM_COLORS = [ +const ROOM_COLORS = [ // magic room default values courtesy of Ribot ["#76cfa6", "#eaf5f0"], ["#81bddb", "#eaf1f4"], @@ -41,21 +41,21 @@ module.exports = React.createClass({ displayName: 'ColorSettings', propTypes: { - room: React.PropTypes.object.isRequired + room: React.PropTypes.object.isRequired, }, getInitialState: function() { - var data = { + const data = { index: 0, primary_color: ROOM_COLORS[0].primary_color, secondary_color: ROOM_COLORS[0].secondary_color, - hasChanged: false + hasChanged: false, }; - var event = this.props.room.getAccountData("org.matrix.room.color_scheme"); + const event = this.props.room.getAccountData("org.matrix.room.color_scheme"); if (!event) { return data; } - var scheme = event.getContent(); + const scheme = event.getContent(); data.primary_color = scheme.primary_color; data.secondary_color = scheme.secondary_color; data.index = this._getColorIndex(data); @@ -64,7 +64,7 @@ module.exports = React.createClass({ // append the unrecognised colours to our palette data.index = ROOM_COLORS.length; ROOM_COLORS.push([ - scheme.primary_color, scheme.secondary_color + scheme.primary_color, scheme.secondary_color, ]); } return data; @@ -74,7 +74,7 @@ module.exports = React.createClass({ if (!this.state.hasChanged) { return Promise.resolve(); // They didn't explicitly give a color to save. } - var originalState = this.getInitialState(); + const originalState = this.getInitialState(); if (originalState.primary_color !== this.state.primary_color || originalState.secondary_color !== this.state.secondary_color) { console.log("ColorSettings: Saving new color"); @@ -84,8 +84,8 @@ module.exports = React.createClass({ return MatrixClientPeg.get().setRoomAccountData( this.props.room.roomId, "org.matrix.room.color_scheme", { primary_color: this.state.primary_color, - secondary_color: this.state.secondary_color - } + secondary_color: this.state.secondary_color, + }, ).catch(function(err) { if (err.errcode == 'M_GUEST_ACCESS_FORBIDDEN') { dis.dispatch({action: 'view_set_mxid'}); @@ -100,8 +100,8 @@ module.exports = React.createClass({ return -1; } // XXX: we should validate these values - for (var i = 0; i < ROOM_COLORS.length; i++) { - var room_color = ROOM_COLORS[i]; + for (let i = 0; i < ROOM_COLORS.length; i++) { + const room_color = ROOM_COLORS[i]; if (room_color[0] === String(scheme.primary_color).toLowerCase() && room_color[1] === String(scheme.secondary_color).toLowerCase()) { return i; @@ -117,34 +117,34 @@ module.exports = React.createClass({ index: index, primary_color: ROOM_COLORS[index][0], secondary_color: ROOM_COLORS[index][1], - hasChanged: true + hasChanged: true, }); }, render: function() { return ( <div className="mx_RoomSettings_roomColors"> - {ROOM_COLORS.map((room_color, i) => { - var selected; + { ROOM_COLORS.map((room_color, i) => { + let selected; if (i === this.state.index) { selected = ( <div className="mx_RoomSettings_roomColor_selected"> - <img src="img/tick.svg" width="17" height="14" alt="./"/> + <img src="img/tick.svg" width="17" height="14" alt="./" /> </div> ); } - var boundClick = this._onColorSchemeChanged.bind(this, i); + const boundClick = this._onColorSchemeChanged.bind(this, i); return ( <div className="mx_RoomSettings_roomColor" - key={ "room_color_" + i } + key={"room_color_" + i} style={{ backgroundColor: room_color[1] }} - onClick={ boundClick }> + onClick={boundClick}> { selected } <div className="mx_RoomSettings_roomColorPrimary" style={{ backgroundColor: room_color[0] }}></div> </div> ); - })} + }) } </div> ); - } + }, }); diff --git a/src/components/views/room_settings/UrlPreviewSettings.js b/src/components/views/room_settings/UrlPreviewSettings.js index 5ee18badaa..56ae24e2f8 100644 --- a/src/components/views/room_settings/UrlPreviewSettings.js +++ b/src/components/views/room_settings/UrlPreviewSettings.js @@ -15,11 +15,11 @@ limitations under the License. */ import Promise from 'bluebird'; -var React = require('react'); -var MatrixClientPeg = require('../../../MatrixClientPeg'); -var sdk = require("../../../index"); -var Modal = require("../../../Modal"); -var UserSettingsStore = require('../../../UserSettingsStore'); +const React = require('react'); +const MatrixClientPeg = require('../../../MatrixClientPeg'); +const sdk = require("../../../index"); +const Modal = require("../../../Modal"); +const UserSettingsStore = require('../../../UserSettingsStore'); import { _t, _tJsx } from '../../../languageHandler'; @@ -31,11 +31,11 @@ module.exports = React.createClass({ }, getInitialState: function() { - var cli = MatrixClientPeg.get(); - var roomState = this.props.room.currentState; + const cli = MatrixClientPeg.get(); + const roomState = this.props.room.currentState; - var roomPreviewUrls = this.props.room.currentState.getStateEvents('org.matrix.room.preview_urls', ''); - var userPreviewUrls = this.props.room.getAccountData("org.matrix.room.preview_urls"); + const roomPreviewUrls = this.props.room.currentState.getStateEvents('org.matrix.room.preview_urls', ''); + const userPreviewUrls = this.props.room.getAccountData("org.matrix.room.preview_urls"); return { globalDisableUrlPreview: (roomPreviewUrls && roomPreviewUrls.getContent().disable) || false, @@ -49,37 +49,37 @@ module.exports = React.createClass({ }, saveSettings: function() { - var promises = []; + const promises = []; if (this.state.globalDisableUrlPreview !== this.originalState.globalDisableUrlPreview) { console.log("UrlPreviewSettings: Updating room's preview_urls state event"); promises.push( MatrixClientPeg.get().sendStateEvent( this.props.room.roomId, "org.matrix.room.preview_urls", { - disable: this.state.globalDisableUrlPreview - }, "" - ) + disable: this.state.globalDisableUrlPreview, + }, "", + ), ); } - var content = undefined; + let content = undefined; if (this.state.userDisableUrlPreview !== this.originalState.userDisableUrlPreview) { console.log("UrlPreviewSettings: Disabling user's per-room preview_urls"); - content = this.state.userDisableUrlPreview ? { disable : true } : {}; + content = this.state.userDisableUrlPreview ? { disable: true } : {}; } if (this.state.userEnableUrlPreview !== this.originalState.userEnableUrlPreview) { console.log("UrlPreviewSettings: Enabling user's per-room preview_urls"); if (!content || content.disable === undefined) { - content = this.state.userEnableUrlPreview ? { disable : false } : {}; + content = this.state.userEnableUrlPreview ? { disable: false } : {}; } } if (content) { promises.push( MatrixClientPeg.get().setRoomAccountData( - this.props.room.roomId, "org.matrix.room.preview_urls", content - ) + this.props.room.roomId, "org.matrix.room.preview_urls", content, + ), ); } @@ -109,62 +109,59 @@ module.exports = React.createClass({ }, render: function() { - var self = this; - var roomState = this.props.room.currentState; - var cli = MatrixClientPeg.get(); + const self = this; + const roomState = this.props.room.currentState; + const cli = MatrixClientPeg.get(); - var maySetRoomPreviewUrls = roomState.mayClientSendStateEvent('org.matrix.room.preview_urls', cli); - var disableRoomPreviewUrls; + const maySetRoomPreviewUrls = roomState.mayClientSendStateEvent('org.matrix.room.preview_urls', cli); + let disableRoomPreviewUrls; if (maySetRoomPreviewUrls) { disableRoomPreviewUrls = <label> <input type="checkbox" ref="globalDisableUrlPreview" - onChange={ this.onGlobalDisableUrlPreviewChange } - checked={ this.state.globalDisableUrlPreview } /> - {_t("Disable URL previews by default for participants in this room")} + onChange={this.onGlobalDisableUrlPreviewChange} + checked={this.state.globalDisableUrlPreview} /> + { _t("Disable URL previews by default for participants in this room") } </label>; - } - else { + } else { disableRoomPreviewUrls = <label> - {_t("URL previews are %(globalDisableUrlPreview)s by default for participants in this room.", {globalDisableUrlPreview: this.state.globalDisableUrlPreview ? _t("disabled") : _t("enabled")})} + { _t("URL previews are %(globalDisableUrlPreview)s by default for participants in this room.", {globalDisableUrlPreview: this.state.globalDisableUrlPreview ? _t("disabled") : _t("enabled")}) } </label>; } let urlPreviewText = null; if (UserSettingsStore.getUrlPreviewsDisabled()) { urlPreviewText = ( - _tJsx("You have <a>disabled</a> URL previews by default.", /<a>(.*?)<\/a>/, (sub)=><a href="#/settings">{sub}</a>) + _tJsx("You have <a>disabled</a> URL previews by default.", /<a>(.*?)<\/a>/, (sub)=><a href="#/settings">{ sub }</a>) ); - } - else { + } else { urlPreviewText = ( - _tJsx("You have <a>enabled</a> URL previews by default.", /<a>(.*?)<\/a>/, (sub)=><a href="#/settings">{sub}</a>) + _tJsx("You have <a>enabled</a> URL previews by default.", /<a>(.*?)<\/a>/, (sub)=><a href="#/settings">{ sub }</a>) ); } return ( <div className="mx_RoomSettings_toggles"> - <h3>{_t("URL Previews")}</h3> + <h3>{ _t("URL Previews") }</h3> <label> - {urlPreviewText} + { urlPreviewText } </label> { disableRoomPreviewUrls } <label> <input type="checkbox" ref="userEnableUrlPreview" - onChange={ this.onUserEnableUrlPreviewChange } - checked={ this.state.userEnableUrlPreview } /> - {_t("Enable URL previews for this room (affects only you)")} + onChange={this.onUserEnableUrlPreviewChange} + checked={this.state.userEnableUrlPreview} /> + { _t("Enable URL previews for this room (affects only you)") } </label> <label> <input type="checkbox" ref="userDisableUrlPreview" - onChange={ this.onUserDisableUrlPreviewChange } - checked={ this.state.userDisableUrlPreview } /> - {_t("Disable URL previews for this room (affects only you)")} + onChange={this.onUserDisableUrlPreviewChange} + checked={this.state.userDisableUrlPreview} /> + { _t("Disable URL previews for this room (affects only you)") } </label> </div> ); - - } + }, }); diff --git a/src/components/views/rooms/Autocomplete.js b/src/components/views/rooms/Autocomplete.js index 7706cc7ebd..beeecf5430 100644 --- a/src/components/views/rooms/Autocomplete.js +++ b/src/components/views/rooms/Autocomplete.js @@ -251,15 +251,15 @@ export default class Autocomplete extends React.Component { return completions.length > 0 ? ( <div key={i} className="mx_Autocomplete_ProviderSection"> - <EmojiText element="div" className="mx_Autocomplete_provider_name">{completionResult.provider.getName()}</EmojiText> - {completionResult.provider.renderCompletions(completions)} + <EmojiText element="div" className="mx_Autocomplete_provider_name">{ completionResult.provider.getName() }</EmojiText> + { completionResult.provider.renderCompletions(completions) } </div> ) : null; }).filter((completion) => !!completion); return !this.state.hide && renderedCompletions.length > 0 ? ( <div className="mx_Autocomplete" ref={(e) => this.container = e}> - {renderedCompletions} + { renderedCompletions } </div> ) : null; } diff --git a/src/components/views/rooms/AuxPanel.js b/src/components/views/rooms/AuxPanel.js index 65dedad61d..726ec7ff1d 100644 --- a/src/components/views/rooms/AuxPanel.js +++ b/src/components/views/rooms/AuxPanel.js @@ -83,9 +83,9 @@ module.exports = React.createClass({ <div className="mx_RoomView_fileDropTarget"> <div className="mx_RoomView_fileDropTargetLabel" title={_t("Drop File Here")}> - <TintableSvg src="img/upload-big.svg" width="45" height="59"/> - <br/> - {_t("Drop file here to upload")} + <TintableSvg src="img/upload-big.svg" width="45" height="59" /> + <br /> + { _t("Drop file here to upload") } </div> </div> ); @@ -99,23 +99,23 @@ module.exports = React.createClass({ supportedText = _t(" (unsupported)"); } else { joinNode = (<span> - {_tJsx( + { _tJsx( "Join as <voiceText>voice</voiceText> or <videoText>video</videoText>.", [/<voiceText>(.*?)<\/voiceText>/, /<videoText>(.*?)<\/videoText>/], [ - (sub) => <a onClick={(event)=>{ this.onConferenceNotificationClick(event, 'voice');}} href="#">{sub}</a>, - (sub) => <a onClick={(event)=>{ this.onConferenceNotificationClick(event, 'video');}} href="#">{sub}</a>, - ] - )} + (sub) => <a onClick={(event)=>{ this.onConferenceNotificationClick(event, 'voice');}} href="#">{ sub }</a>, + (sub) => <a onClick={(event)=>{ this.onConferenceNotificationClick(event, 'video');}} href="#">{ sub }</a>, + ], + ) } </span>); } // XXX: the translation here isn't great: appending ' (unsupported)' is likely to not make sense in many languages, // but there are translations for this in the languages we do have so I'm leaving it for now. conferenceCallNotification = ( <div className="mx_RoomView_ongoingConfCallNotification"> - {_t("Ongoing conference call%(supportedText)s.", {supportedText: supportedText})} + { _t("Ongoing conference call%(supportedText)s.", {supportedText: supportedText}) } - {joinNode} + { joinNode } </div> ); } diff --git a/src/components/views/rooms/EntityTile.js b/src/components/views/rooms/EntityTile.js index 7002e45c3b..64934f3cca 100644 --- a/src/components/views/rooms/EntityTile.js +++ b/src/components/views/rooms/EntityTile.js @@ -16,18 +16,18 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); -var MatrixClientPeg = require('../../../MatrixClientPeg'); -var sdk = require('../../../index'); +const MatrixClientPeg = require('../../../MatrixClientPeg'); +const sdk = require('../../../index'); import AccessibleButton from '../elements/AccessibleButton'; import { _t } from '../../../languageHandler'; -var PRESENCE_CLASS = { +const PRESENCE_CLASS = { "offline": "mx_EntityTile_offline", "online": "mx_EntityTile_online", - "unavailable": "mx_EntityTile_unavailable" + "unavailable": "mx_EntityTile_unavailable", }; @@ -62,7 +62,7 @@ module.exports = React.createClass({ showInviteButton: React.PropTypes.bool, shouldComponentUpdate: React.PropTypes.func, onClick: React.PropTypes.func, - suppressOnHover: React.PropTypes.bool + suppressOnHover: React.PropTypes.bool, }, getDefaultProps: function() { @@ -73,13 +73,13 @@ module.exports = React.createClass({ presenceLastActiveAgo: 0, presenceLastTs: 0, showInviteButton: false, - suppressOnHover: false + suppressOnHover: false, }; }, getInitialState: function() { return { - hover: false + hover: false, }; }, @@ -98,38 +98,37 @@ module.exports = React.createClass({ render: function() { const presenceClass = presenceClassForMember( - this.props.presenceState, this.props.presenceLastActiveAgo + this.props.presenceState, this.props.presenceLastActiveAgo, ); - var mainClassName = "mx_EntityTile "; + let mainClassName = "mx_EntityTile "; mainClassName += presenceClass + (this.props.className ? (" " + this.props.className) : ""); - var nameEl; + let nameEl; const {name} = this.props; const EmojiText = sdk.getComponent('elements.EmojiText'); if (this.state.hover && !this.props.suppressOnHover) { - var activeAgo = this.props.presenceLastActiveAgo ? + const activeAgo = this.props.presenceLastActiveAgo ? (Date.now() - (this.props.presenceLastTs - this.props.presenceLastActiveAgo)) : -1; mainClassName += " mx_EntityTile_hover"; - var PresenceLabel = sdk.getComponent("rooms.PresenceLabel"); + const PresenceLabel = sdk.getComponent("rooms.PresenceLabel"); nameEl = ( <div className="mx_EntityTile_details"> - <img className="mx_EntityTile_chevron" src="img/member_chevron.png" width="8" height="12"/> - <EmojiText element="div" className="mx_EntityTile_name_hover" dir="auto">{name}</EmojiText> - <PresenceLabel activeAgo={ activeAgo } + <img className="mx_EntityTile_chevron" src="img/member_chevron.png" width="8" height="12" /> + <EmojiText element="div" className="mx_EntityTile_name_hover" dir="auto">{ name }</EmojiText> + <PresenceLabel activeAgo={activeAgo} currentlyActive={this.props.presenceCurrentlyActive} presenceState={this.props.presenceState} /> </div> ); - } - else { + } else { nameEl = ( - <EmojiText element="div" className="mx_EntityTile_name" dir="auto">{name}</EmojiText> + <EmojiText element="div" className="mx_EntityTile_name" dir="auto">{ name }</EmojiText> ); } - var inviteButton; + let inviteButton; if (this.props.showInviteButton) { inviteButton = ( <div className="mx_EntityTile_invite"> @@ -138,25 +137,25 @@ module.exports = React.createClass({ ); } - var power; - var powerLevel = this.props.powerLevel; + let power; + const powerLevel = this.props.powerLevel; if (powerLevel >= 50 && powerLevel < 99) { - power = <img src="img/mod.svg" className="mx_EntityTile_power" width="16" height="17" alt={_t("Moderator")}/>; + power = <img src="img/mod.svg" className="mx_EntityTile_power" width="16" height="17" alt={_t("Moderator")} />; } if (powerLevel >= 99) { - power = <img src="img/admin.svg" className="mx_EntityTile_power" width="16" height="17" alt={_t("Admin")}/>; + power = <img src="img/admin.svg" className="mx_EntityTile_power" width="16" height="17" alt={_t("Admin")} />; } - var MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); - var BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); + const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); + const BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); - var av = this.props.avatarJsx || <BaseAvatar name={this.props.name} width={36} height={36} />; + const av = this.props.avatarJsx || <BaseAvatar name={this.props.name} width={36} height={36} />; return ( - <AccessibleButton className={mainClassName} title={ this.props.title } - onClick={ this.props.onClick } onMouseEnter={ this.mouseEnter } - onMouseLeave={ this.mouseLeave }> + <AccessibleButton className={mainClassName} title={this.props.title} + onClick={this.props.onClick} onMouseEnter={this.mouseEnter} + onMouseLeave={this.mouseLeave}> <div className="mx_EntityTile_avatar"> { av } { power } @@ -165,5 +164,5 @@ module.exports = React.createClass({ { inviteButton } </AccessibleButton> ); - } + }, }); diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 7328cfe0b6..f92dc0b97a 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -17,38 +17,38 @@ limitations under the License. 'use strict'; -var React = require('react'); -var classNames = require("classnames"); +const React = require('react'); +const classNames = require("classnames"); import { _t } from '../../../languageHandler'; -var Modal = require('../../../Modal'); +const Modal = require('../../../Modal'); -var sdk = require('../../../index'); -var TextForEvent = require('../../../TextForEvent'); +const sdk = require('../../../index'); +const TextForEvent = require('../../../TextForEvent'); import withMatrixClient from '../../../wrappers/withMatrixClient'; -var ContextualMenu = require('../../structures/ContextualMenu'); +const ContextualMenu = require('../../structures/ContextualMenu'); import dis from '../../../dispatcher'; -var ObjectUtils = require('../../../ObjectUtils'); +const ObjectUtils = require('../../../ObjectUtils'); -var eventTileTypes = { +const eventTileTypes = { 'm.room.message': 'messages.MessageEvent', - 'm.room.member' : 'messages.TextualEvent', - 'm.call.invite' : 'messages.TextualEvent', - 'm.call.answer' : 'messages.TextualEvent', - 'm.call.hangup' : 'messages.TextualEvent', - 'm.room.name' : 'messages.TextualEvent', - 'm.room.avatar' : 'messages.RoomAvatarEvent', - 'm.room.topic' : 'messages.TextualEvent', - 'm.room.third_party_invite' : 'messages.TextualEvent', - 'm.room.history_visibility' : 'messages.TextualEvent', - 'm.room.encryption' : 'messages.TextualEvent', - 'm.room.power_levels' : 'messages.TextualEvent', + 'm.room.member': 'messages.TextualEvent', + 'm.call.invite': 'messages.TextualEvent', + 'm.call.answer': 'messages.TextualEvent', + 'm.call.hangup': 'messages.TextualEvent', + 'm.room.name': 'messages.TextualEvent', + 'm.room.avatar': 'messages.RoomAvatarEvent', + 'm.room.topic': 'messages.TextualEvent', + 'm.room.third_party_invite': 'messages.TextualEvent', + 'm.room.history_visibility': 'messages.TextualEvent', + 'm.room.encryption': 'messages.TextualEvent', + 'm.room.power_levels': 'messages.TextualEvent', 'im.vector.modular.widgets': 'messages.TextualEvent', }; -var MAX_READ_AVATARS = 5; +const MAX_READ_AVATARS = 5; // Our component structure for EventTiles on the timeline is: // @@ -177,7 +177,7 @@ module.exports = withMatrixClient(React.createClass({ }, componentWillUnmount: function() { - var client = this.props.matrixClient; + const client = this.props.matrixClient; client.removeListener("deviceVerificationChanged", this.onDeviceVerificationChanged); this.props.mxEvent.removeListener("Event.decrypted", this._onDecrypted); @@ -204,20 +204,20 @@ module.exports = withMatrixClient(React.createClass({ const verified = await this.props.matrixClient.isEventSenderVerified(mxEvent); this.setState({ - verified: verified + verified: verified, }); }, _propsEqual: function(objA, objB) { - var keysA = Object.keys(objA); - var keysB = Object.keys(objB); + const keysA = Object.keys(objA); + const keysB = Object.keys(objB); if (keysA.length !== keysB.length) { return false; } - for (var i = 0; i < keysA.length; i++) { - var key = keysA[i]; + for (let i = 0; i < keysA.length; i++) { + const key = keysA[i]; if (!objB.hasOwnProperty(key)) { return false; @@ -225,8 +225,8 @@ module.exports = withMatrixClient(React.createClass({ // need to deep-compare readReceipts if (key == 'readReceipts') { - var rA = objA[key]; - var rB = objB[key]; + const rA = objA[key]; + const rB = objB[key]; if (rA === rB) { continue; } @@ -238,7 +238,7 @@ module.exports = withMatrixClient(React.createClass({ if (rA.length !== rB.length) { return false; } - for (var j = 0; j < rA.length; j++) { + for (let j = 0; j < rA.length; j++) { if (rA[j].roomMember.userId !== rB[j].roomMember.userId) { return false; } @@ -253,12 +253,11 @@ module.exports = withMatrixClient(React.createClass({ }, shouldHighlight: function() { - var actions = this.props.matrixClient.getPushActionsForEvent(this.props.mxEvent); + const actions = this.props.matrixClient.getPushActionsForEvent(this.props.mxEvent); if (!actions || !actions.tweaks) { return false; } // don't show self-highlights from another of our clients - if (this.props.mxEvent.getSender() === this.props.matrixClient.credentials.userId) - { + if (this.props.mxEvent.getSender() === this.props.matrixClient.credentials.userId) { return false; } @@ -266,13 +265,13 @@ module.exports = withMatrixClient(React.createClass({ }, onEditClicked: function(e) { - var MessageContextMenu = sdk.getComponent('context_menus.MessageContextMenu'); - var buttonRect = e.target.getBoundingClientRect(); + const MessageContextMenu = sdk.getComponent('context_menus.MessageContextMenu'); + const buttonRect = e.target.getBoundingClientRect(); // The window X and Y offsets are to adjust position when zoomed in to page - var x = buttonRect.right + window.pageXOffset; - var y = (buttonRect.top + (buttonRect.height / 2) + window.pageYOffset) - 19; - var self = this; + const x = buttonRect.right + window.pageXOffset; + const y = (buttonRect.top + (buttonRect.height / 2) + window.pageYOffset) - 19; + const self = this; ContextualMenu.createMenu(MessageContextMenu, { chevronOffset: 10, mxEvent: this.props.mxEvent, @@ -281,19 +280,18 @@ module.exports = withMatrixClient(React.createClass({ eventTileOps: this.refs.tile && this.refs.tile.getEventTileOps ? this.refs.tile.getEventTileOps() : undefined, onFinished: function() { self.setState({menu: false}); - } + }, }); this.setState({menu: true}); }, toggleAllReadAvatars: function() { this.setState({ - allReadAvatars: !this.state.allReadAvatars + allReadAvatars: !this.state.allReadAvatars, }); }, getReadAvatars: function() { - // return early if there are no read receipts if (!this.props.readReceipts || this.props.readReceipts.length === 0) { return (<span className="mx_EventTile_readAvatars"></span>); @@ -304,11 +302,11 @@ module.exports = withMatrixClient(React.createClass({ const receiptOffset = 15; let left = 0; - var receipts = this.props.readReceipts || []; - for (var i = 0; i < receipts.length; ++i) { - var receipt = receipts[i]; + const receipts = this.props.readReceipts || []; + for (let i = 0; i < receipts.length; ++i) { + const receipt = receipts[i]; - var hidden = true; + let hidden = true; if ((i < MAX_READ_AVATARS) || this.state.allReadAvatars) { hidden = false; } @@ -319,7 +317,7 @@ module.exports = withMatrixClient(React.createClass({ // else set it proportional to index left = (hidden ? MAX_READ_AVATARS - 1 : i) * -receiptOffset; - var userId = receipt.roomMember.userId; + const userId = receipt.roomMember.userId; var readReceiptInfo; if (this.props.readReceiptMap) { @@ -340,12 +338,12 @@ module.exports = withMatrixClient(React.createClass({ onClick={this.toggleAllReadAvatars} timestamp={receipt.ts} showTwelveHour={this.props.isTwelveHour} - /> + />, ); } - var remText; + let remText; if (!this.state.allReadAvatars) { - var remainder = receipts.length - MAX_READ_AVATARS; + const remainder = receipts.length - MAX_READ_AVATARS; if (remainder > 0) { remText = <span className="mx_EventTile_readAvatarRemainder" onClick={this.toggleAllReadAvatars} @@ -369,7 +367,7 @@ module.exports = withMatrixClient(React.createClass({ }, onCryptoClicked: function(e) { - var event = this.props.mxEvent; + const event = this.props.mxEvent; Modal.createTrackedDialogAsync('Encrypted Event Dialog', '', (cb) => { require(['../../../async-components/views/dialogs/EncryptedEventDialog'], cb); @@ -396,12 +394,12 @@ module.exports = withMatrixClient(React.createClass({ if (ev.getContent().msgtype === 'm.bad.encrypted') { - return <E2ePadlockUndecryptable {...props}/>; + return <E2ePadlockUndecryptable {...props} />; } else if (ev.isEncrypted()) { if (this.state.verified) { - return <E2ePadlockVerified {...props}/>; + return <E2ePadlockVerified {...props} />; } else { - return <E2ePadlockUnverified {...props}/>; + return <E2ePadlockUnverified {...props} />; } } else { // XXX: if the event is being encrypted (ie eventSendStatus === @@ -412,7 +410,7 @@ module.exports = withMatrixClient(React.createClass({ // open padlock const e2eEnabled = this.props.matrixClient.isRoomEncrypted(ev.getRoomId()); if (e2eEnabled) { - return <E2ePadlockUnencrypted {...props}/>; + return <E2ePadlockUnencrypted {...props} />; } } @@ -421,27 +419,27 @@ module.exports = withMatrixClient(React.createClass({ }, render: function() { - var MessageTimestamp = sdk.getComponent('messages.MessageTimestamp'); - var SenderProfile = sdk.getComponent('messages.SenderProfile'); - var MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); + const MessageTimestamp = sdk.getComponent('messages.MessageTimestamp'); + const SenderProfile = sdk.getComponent('messages.SenderProfile'); + const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); //console.log("EventTile showUrlPreview for %s is %s", this.props.mxEvent.getId(), this.props.showUrlPreview); - var content = this.props.mxEvent.getContent(); - var msgtype = content.msgtype; - var eventType = this.props.mxEvent.getType(); + const content = this.props.mxEvent.getContent(); + const msgtype = content.msgtype; + const eventType = this.props.mxEvent.getType(); // Info messages are basically information about commands processed on a room - var isInfoMessage = (eventType !== 'm.room.message'); + const isInfoMessage = (eventType !== 'm.room.message'); - var EventTileType = sdk.getComponent(eventTileTypes[eventType]); + const EventTileType = sdk.getComponent(eventTileTypes[eventType]); // This shouldn't happen: the caller should check we support this type // before trying to instantiate us if (!EventTileType) { throw new Error("Event type not supported"); } - var isSending = (['sending', 'queued', 'encrypting'].indexOf(this.props.eventSendStatus) !== -1); + const isSending = (['sending', 'queued', 'encrypting'].indexOf(this.props.eventSendStatus) !== -1); const isRedacted = (eventType === 'm.room.message') && this.props.isRedacted; const classes = classNames({ @@ -468,9 +466,9 @@ module.exports = withMatrixClient(React.createClass({ this.props.mxEvent.getRoomId() + "/" + this.props.mxEvent.getId(); - var readAvatars = this.getReadAvatars(); + const readAvatars = this.getReadAvatars(); - var avatar, sender; + let avatar, sender; let avatarSize; let needsSenderProfile; @@ -508,15 +506,14 @@ module.exports = withMatrixClient(React.createClass({ if (msgtype === 'm.image') aux = _t('sent an image'); else if (msgtype === 'm.video') aux = _t('sent a video'); else if (msgtype === 'm.file') aux = _t('uploaded a file'); - sender = <SenderProfile onClick={ this.onSenderProfileClick } mxEvent={this.props.mxEvent} enableFlair={!aux} aux={aux} />; - } - else { + sender = <SenderProfile onClick={this.onSenderProfileClick} mxEvent={this.props.mxEvent} enableFlair={!aux} aux={aux} />; + } else { sender = <SenderProfile mxEvent={this.props.mxEvent} enableFlair={true} />; } } const editButton = ( - <span className="mx_EventTile_editButton" title={ _t("Options") } onClick={this.onEditClicked} /> + <span className="mx_EventTile_editButton" title={_t("Options")} onClick={this.onEditClicked} /> ); const timestamp = this.props.mxEvent.getTs() ? @@ -527,13 +524,13 @@ module.exports = withMatrixClient(React.createClass({ return ( <div className={classes}> <div className="mx_EventTile_roomName"> - <a href={ permalink } onClick={this.onPermalinkClicked}> + <a href={permalink} onClick={this.onPermalinkClicked}> { room ? room.name : '' } </a> </div> <div className="mx_EventTile_senderDetails"> { avatar } - <a href={ permalink } onClick={this.onPermalinkClicked}> + <a href={permalink} onClick={this.onPermalinkClicked}> { sender } { timestamp } </a> @@ -548,8 +545,7 @@ module.exports = withMatrixClient(React.createClass({ </div> </div> ); - } - else if (this.props.tileShape === "file_grid") { + } else if (this.props.tileShape === "file_grid") { return ( <div className={classes}> <div className="mx_EventTile_line" > @@ -563,7 +559,7 @@ module.exports = withMatrixClient(React.createClass({ </div> <a className="mx_EventTile_senderDetailsLink" - href={ permalink } + href={permalink} onClick={this.onPermalinkClicked} > <div className="mx_EventTile_senderDetails"> @@ -573,8 +569,7 @@ module.exports = withMatrixClient(React.createClass({ </a> </div> ); - } - else { + } else { return ( <div className={classes}> <div className="mx_EventTile_msgOption"> @@ -583,7 +578,7 @@ module.exports = withMatrixClient(React.createClass({ { avatar } { sender } <div className="mx_EventTile_line"> - <a href={ permalink } onClick={this.onPermalinkClicked}> + <a href={permalink} onClick={this.onPermalinkClicked}> { timestamp } </a> { this._renderE2EPadlock() } diff --git a/src/components/views/rooms/LinkPreviewWidget.js b/src/components/views/rooms/LinkPreviewWidget.js index 35e6d28b1f..10c809e0f1 100644 --- a/src/components/views/rooms/LinkPreviewWidget.js +++ b/src/components/views/rooms/LinkPreviewWidget.js @@ -16,16 +16,16 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); -var sdk = require('../../../index'); -var MatrixClientPeg = require('../../../MatrixClientPeg'); -var ImageUtils = require('../../../ImageUtils'); -var Modal = require('../../../Modal'); +const sdk = require('../../../index'); +const MatrixClientPeg = require('../../../MatrixClientPeg'); +const ImageUtils = require('../../../ImageUtils'); +const Modal = require('../../../Modal'); -var linkify = require('linkifyjs'); -var linkifyElement = require('linkifyjs/element'); -var linkifyMatrix = require('../../../linkify-matrix'); +const linkify = require('linkifyjs'); +const linkifyElement = require('linkifyjs/element'); +const linkifyMatrix = require('../../../linkify-matrix'); linkifyMatrix(linkify); module.exports = React.createClass({ @@ -40,7 +40,7 @@ module.exports = React.createClass({ getInitialState: function() { return { - preview: null + preview: null, }; }, @@ -52,7 +52,7 @@ module.exports = React.createClass({ } this.setState( { preview: res }, - this.props.onWidgetLoad + this.props.onWidgetLoad, ); }, (error)=>{ console.error("Failed to get preview for " + this.props.link + " " + error); @@ -76,17 +76,17 @@ module.exports = React.createClass({ }, onImageClick: function(ev) { - var p = this.state.preview; + const p = this.state.preview; if (ev.button != 0 || ev.metaKey) return; ev.preventDefault(); - var ImageView = sdk.getComponent("elements.ImageView"); + const ImageView = sdk.getComponent("elements.ImageView"); - var src = p["og:image"]; + let src = p["og:image"]; if (src && src.startsWith("mxc://")) { src = MatrixClientPeg.get().mxcUrlToHttp(src); } - var params = { + const params = { src: src, width: p["og:image:width"], height: p["og:image:height"], @@ -99,27 +99,27 @@ module.exports = React.createClass({ }, render: function() { - var p = this.state.preview; + const p = this.state.preview; if (!p || Object.keys(p).length === 0) { - return <div/>; + return <div />; } // FIXME: do we want to factor out all image displaying between this and MImageBody - especially for lightboxing? - var image = p["og:image"]; - var imageMaxWidth = 100, imageMaxHeight = 100; + let image = p["og:image"]; + let imageMaxWidth = 100, imageMaxHeight = 100; if (image && image.startsWith("mxc://")) { image = MatrixClientPeg.get().mxcUrlToHttp(image, imageMaxWidth, imageMaxHeight); } - var thumbHeight = imageMaxHeight; + let thumbHeight = imageMaxHeight; if (p["og:image:width"] && p["og:image:height"]) { thumbHeight = ImageUtils.thumbHeight(p["og:image:width"], p["og:image:height"], imageMaxWidth, imageMaxHeight); } - var img; + let img; if (image) { img = <div className="mx_LinkPreviewWidget_image" style={{ height: thumbHeight }}> - <img style={{ maxWidth: imageMaxWidth, maxHeight: imageMaxHeight }} src={ image } onClick={ this.onImageClick }/> + <img style={{ maxWidth: imageMaxWidth, maxHeight: imageMaxHeight }} src={image} onClick={this.onImageClick} /> </div>; } @@ -127,15 +127,15 @@ module.exports = React.createClass({ <div className="mx_LinkPreviewWidget" > { img } <div className="mx_LinkPreviewWidget_caption"> - <div className="mx_LinkPreviewWidget_title"><a href={ this.props.link } target="_blank" rel="noopener">{ p["og:title"] }</a></div> + <div className="mx_LinkPreviewWidget_title"><a href={this.props.link} target="_blank" rel="noopener">{ p["og:title"] }</a></div> <div className="mx_LinkPreviewWidget_siteName">{ p["og:site_name"] ? (" - " + p["og:site_name"]) : null }</div> <div className="mx_LinkPreviewWidget_description" ref="description"> { p["og:description"] } </div> </div> <img className="mx_LinkPreviewWidget_cancel" src="img/cancel.svg" width="18" height="18" - onClick={ this.props.onCancelClick }/> + onClick={this.props.onCancelClick} /> </div> ); - } + }, }); diff --git a/src/components/views/rooms/MemberDeviceInfo.js b/src/components/views/rooms/MemberDeviceInfo.js index 33b919835c..6e284fc886 100644 --- a/src/components/views/rooms/MemberDeviceInfo.js +++ b/src/components/views/rooms/MemberDeviceInfo.js @@ -20,30 +20,30 @@ import { _t } from '../../../languageHandler'; export default class MemberDeviceInfo extends React.Component { render() { - var indicator = null; - var DeviceVerifyButtons = sdk.getComponent('elements.DeviceVerifyButtons'); + let indicator = null; + const DeviceVerifyButtons = sdk.getComponent('elements.DeviceVerifyButtons'); if (this.props.device.isBlocked()) { indicator = ( <div className="mx_MemberDeviceInfo_blacklisted"> - <img src="img/e2e-blocked.svg" width="12" height="12" style={{ marginLeft: "-1px" }} alt={_t("Blacklisted")}/> + <img src="img/e2e-blocked.svg" width="12" height="12" style={{ marginLeft: "-1px" }} alt={_t("Blacklisted")} /> </div> ); } else if (this.props.device.isVerified()) { indicator = ( <div className="mx_MemberDeviceInfo_verified"> - <img src="img/e2e-verified.svg" width="10" height="12" alt={_t("Verified")}/> + <img src="img/e2e-verified.svg" width="10" height="12" alt={_t("Verified")} /> </div> ); } else { indicator = ( <div className="mx_MemberDeviceInfo_unverified"> - <img src="img/e2e-warning.svg" width="15" height="12" style={{ marginLeft: "-2px" }} alt={_t("Unverified")}/> + <img src="img/e2e-warning.svg" width="15" height="12" style={{ marginLeft: "-2px" }} alt={_t("Unverified")} /> </div> ); } - var deviceName = this.props.device.ambiguous ? + const deviceName = this.props.device.ambiguous ? (this.props.device.getDisplayName() ? this.props.device.getDisplayName() : "") + " (" + this.props.device.deviceId + ")" : this.props.device.getDisplayName(); @@ -53,8 +53,8 @@ export default class MemberDeviceInfo extends React.Component { title={_t("device id: ") + this.props.device.deviceId} > <div className="mx_MemberDeviceInfo_deviceInfo"> <div className="mx_MemberDeviceInfo_deviceId"> - {deviceName} - {indicator} + { deviceName } + { indicator } </div> </div> <DeviceVerifyButtons userId={this.props.userId} device={this.props.device} /> diff --git a/src/components/views/rooms/MemberInfo.js b/src/components/views/rooms/MemberInfo.js index f705cf97d2..856d3ebad4 100644 --- a/src/components/views/rooms/MemberInfo.js +++ b/src/components/views/rooms/MemberInfo.js @@ -55,7 +55,7 @@ module.exports = withMatrixClient(React.createClass({ kick: false, ban: false, mute: false, - modifyLevel: false + modifyLevel: false, }, muted: false, isTargetMod: false, @@ -97,7 +97,7 @@ module.exports = withMatrixClient(React.createClass({ }, componentWillUnmount: function() { - var client = this.props.matrixClient; + const client = this.props.matrixClient; if (client) { client.removeListener("deviceVerificationChanged", this.onDeviceVerificationChanged); client.removeListener("Room", this.onRoom); @@ -120,10 +120,10 @@ module.exports = withMatrixClient(React.createClass({ }, _disambiguateDevices: function(devices) { - var names = Object.create(null); - for (var i = 0; i < devices.length; i++) { + const names = Object.create(null); + for (let i = 0; i < devices.length; i++) { var name = devices[i].getDisplayName(); - var indexList = names[name] || []; + const indexList = names[name] || []; indexList.push(i); names[name] = indexList; } @@ -193,7 +193,7 @@ module.exports = withMatrixClient(React.createClass({ }, _updateStateForNewMember: function(member) { - var newState = this._calculateOpsPermissions(member); + const newState = this._calculateOpsPermissions(member); newState.devicesLoading = true; newState.devices = null; this.setState(newState); @@ -211,11 +211,11 @@ module.exports = withMatrixClient(React.createClass({ return; } - var cancelled = false; + let cancelled = false; this._cancelDeviceList = function() { cancelled = true; }; - var client = this.props.matrixClient; - var self = this; + const client = this.props.matrixClient; + const self = this; client.downloadKeys([member.userId], true).then(() => { return client.getStoredDevicesForUser(member.userId); }).finally(function() { @@ -260,7 +260,7 @@ module.exports = withMatrixClient(React.createClass({ this.setState({ updating: this.state.updating + 1 }); this.props.matrixClient.kick( this.props.member.roomId, this.props.member.userId, - reason || undefined + reason || undefined, ).then(function() { // NO-OP; rely on the m.room.member event coming down else we could // get out of sync if we force setState here! @@ -272,11 +272,11 @@ module.exports = withMatrixClient(React.createClass({ title: _t("Failed to kick"), description: ((err && err.message) ? err.message : "Operation failed"), }); - } + }, ).finally(()=>{ this.setState({ updating: this.state.updating - 1 }); }); - } + }, }); }, @@ -299,7 +299,7 @@ module.exports = withMatrixClient(React.createClass({ } else { promise = this.props.matrixClient.ban( this.props.member.roomId, this.props.member.userId, - reason || undefined + reason || undefined, ); } promise.then( @@ -314,7 +314,7 @@ module.exports = withMatrixClient(React.createClass({ title: _t("Error"), description: _t("Failed to ban user"), }); - } + }, ).finally(()=>{ this.setState({ updating: this.state.updating - 1 }); }); @@ -323,30 +323,29 @@ module.exports = withMatrixClient(React.createClass({ }, onMuteToggle: function() { - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - var roomId = this.props.member.roomId; - var target = this.props.member.userId; - var room = this.props.matrixClient.getRoom(roomId); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const roomId = this.props.member.roomId; + const target = this.props.member.userId; + const room = this.props.matrixClient.getRoom(roomId); if (!room) { return; } - var powerLevelEvent = room.currentState.getStateEvents( - "m.room.power_levels", "" + const powerLevelEvent = room.currentState.getStateEvents( + "m.room.power_levels", "", ); if (!powerLevelEvent) { return; } - var isMuted = this.state.muted; - var powerLevels = powerLevelEvent.getContent(); - var levelToSend = ( + const isMuted = this.state.muted; + const powerLevels = powerLevelEvent.getContent(); + const levelToSend = ( (powerLevels.events ? powerLevels.events["m.room.message"] : null) || powerLevels.events_default ); - var level; + let level; if (isMuted) { // unmute level = levelToSend; - } - else { // mute + } else { // mute level = levelToSend - 1; } level = parseInt(level); @@ -364,7 +363,7 @@ module.exports = withMatrixClient(React.createClass({ title: _t("Error"), description: _t("Failed to mute user"), }); - } + }, ).finally(()=>{ this.setState({ updating: this.state.updating - 1 }); }); @@ -372,28 +371,28 @@ module.exports = withMatrixClient(React.createClass({ }, onModToggle: function() { - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - var roomId = this.props.member.roomId; - var target = this.props.member.userId; - var room = this.props.matrixClient.getRoom(roomId); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const roomId = this.props.member.roomId; + const target = this.props.member.userId; + const room = this.props.matrixClient.getRoom(roomId); if (!room) { return; } - var powerLevelEvent = room.currentState.getStateEvents( - "m.room.power_levels", "" + const powerLevelEvent = room.currentState.getStateEvents( + "m.room.power_levels", "", ); if (!powerLevelEvent) { return; } - var me = room.getMember(this.props.matrixClient.credentials.userId); + const me = room.getMember(this.props.matrixClient.credentials.userId); if (!me) { return; } - var defaultLevel = powerLevelEvent.getContent().users_default; - var modLevel = me.powerLevel - 1; + const defaultLevel = powerLevelEvent.getContent().users_default; + let modLevel = me.powerLevel - 1; if (modLevel > 50 && defaultLevel < 50) modLevel = 50; // try to stick with the vector level defaults // toggle the level - var newLevel = this.state.isTargetMod ? defaultLevel : modLevel; + const newLevel = this.state.isTargetMod ? defaultLevel : modLevel; this.setState({ updating: this.state.updating + 1 }); this.props.matrixClient.setPowerLevel(roomId, target, parseInt(newLevel), powerLevelEvent).then( function() { @@ -410,7 +409,7 @@ module.exports = withMatrixClient(React.createClass({ description: _t("Failed to toggle moderator status"), }); } - } + }, ).finally(()=>{ this.setState({ updating: this.state.updating - 1 }); }); @@ -430,36 +429,36 @@ module.exports = withMatrixClient(React.createClass({ title: _t("Error"), description: _t("Failed to change power level"), }); - } + }, ).finally(()=>{ this.setState({ updating: this.state.updating - 1 }); }).done(); }, onPowerChange: function(powerLevel) { - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - var roomId = this.props.member.roomId; - var target = this.props.member.userId; - var room = this.props.matrixClient.getRoom(roomId); - var self = this; + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const roomId = this.props.member.roomId; + const target = this.props.member.userId; + const room = this.props.matrixClient.getRoom(roomId); + const self = this; if (!room) { return; } - var powerLevelEvent = room.currentState.getStateEvents( - "m.room.power_levels", "" + const powerLevelEvent = room.currentState.getStateEvents( + "m.room.power_levels", "", ); if (!powerLevelEvent) { return; } if (powerLevelEvent.getContent().users) { - var myPower = powerLevelEvent.getContent().users[this.props.matrixClient.credentials.userId]; + const myPower = powerLevelEvent.getContent().users[this.props.matrixClient.credentials.userId]; if (parseInt(myPower) === parseInt(powerLevel)) { - var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); Modal.createTrackedDialog('Promote to PL100 Warning', '', QuestionDialog, { title: _t("Warning!"), description: <div> - { _t("You will not be able to undo this change as you are promoting the user to have the same power level as yourself.") }<br/> + { _t("You will not be able to undo this change as you are promoting the user to have the same power level as yourself.") }<br /> { _t("Are you sure?") } </div>, button: _t("Continue"), @@ -469,12 +468,10 @@ module.exports = withMatrixClient(React.createClass({ } }, }); - } - else { + } else { this._applyPowerChange(roomId, target, powerLevel, powerLevelEvent); } - } - else { + } else { this._applyPowerChange(roomId, target, powerLevel, powerLevelEvent); } }, @@ -497,14 +494,14 @@ module.exports = withMatrixClient(React.createClass({ const defaultPerms = { can: {}, muted: false, - modifyLevel: false + modifyLevel: false, }; const room = this.props.matrixClient.getRoom(member.roomId); if (!room) { return defaultPerms; } const powerLevels = room.currentState.getStateEvents( - "m.room.power_levels", "" + "m.room.power_levels", "", ); if (!powerLevels) { return defaultPerms; @@ -516,10 +513,10 @@ module.exports = withMatrixClient(React.createClass({ const them = member; return { can: this._calculateCanPermissions( - me, them, powerLevels.getContent() + me, them, powerLevels.getContent(), ), muted: this._isMuted(them, powerLevels.getContent()), - isTargetMod: them.powerLevel > powerLevels.getContent().users_default + isTargetMod: them.powerLevel > powerLevels.getContent().users_default, }; }, @@ -528,7 +525,7 @@ module.exports = withMatrixClient(React.createClass({ kick: false, ban: false, mute: false, - modifyLevel: false + modifyLevel: false, }; const canAffectUser = them.powerLevel < me.powerLevel; if (!canAffectUser) { @@ -556,7 +553,7 @@ module.exports = withMatrixClient(React.createClass({ if (!powerLevelContent || !member) { return false; } - var levelToSend = ( + const levelToSend = ( (powerLevelContent.events ? powerLevelContent.events["m.room.message"] : null) || powerLevelContent.events_default ); @@ -566,19 +563,19 @@ module.exports = withMatrixClient(React.createClass({ onCancel: function(e) { dis.dispatch({ action: "view_user", - member: null + member: null, }); }, onMemberAvatarClick: function() { - var avatarUrl = this.props.member.user ? this.props.member.user.avatarUrl : this.props.member.events.member.getContent().avatar_url; + const avatarUrl = this.props.member.user ? this.props.member.user.avatarUrl : this.props.member.events.member.getContent().avatar_url; if(!avatarUrl) return; - var httpUrl = this.props.matrixClient.mxcUrlToHttp(avatarUrl); - var ImageView = sdk.getComponent("elements.ImageView"); - var params = { + const httpUrl = this.props.matrixClient.mxcUrlToHttp(avatarUrl); + const ImageView = sdk.getComponent("elements.ImageView"); + const params = { src: httpUrl, - name: this.props.member.name + name: this.props.member.name, }; Modal.createDialog(ImageView, params, "mx_Dialog_lightbox"); @@ -596,11 +593,11 @@ module.exports = withMatrixClient(React.createClass({ return null; } - var devices = this.state.devices; - var MemberDeviceInfo = sdk.getComponent('rooms.MemberDeviceInfo'); - var Spinner = sdk.getComponent("elements.Spinner"); + const devices = this.state.devices; + const MemberDeviceInfo = sdk.getComponent('rooms.MemberDeviceInfo'); + const Spinner = sdk.getComponent("elements.Spinner"); - var devComponents; + let devComponents; if (this.state.devicesLoading) { // still loading devComponents = <Spinner />; @@ -610,10 +607,10 @@ module.exports = withMatrixClient(React.createClass({ devComponents = _t("No devices with registered encryption keys"); } else { devComponents = []; - for (var i = 0; i < devices.length; i++) { + for (let i = 0; i < devices.length; i++) { devComponents.push(<MemberDeviceInfo key={i} userId={this.props.member.userId} - device={devices[i]}/>); + device={devices[i]} />); } } @@ -621,7 +618,7 @@ module.exports = withMatrixClient(React.createClass({ <div> <h3>{ _t("Devices") }</h3> <div className="mx_MemberInfo_devices"> - {devComponents} + { devComponents } </div> </div> ); @@ -633,7 +630,7 @@ module.exports = withMatrixClient(React.createClass({ if (this.props.member.userId !== this.props.matrixClient.getUserId()) { ignoreButton = ( <AccessibleButton onClick={this.onIgnoreToggle} className="mx_MemberInfo_field"> - {this.state.isIgnoring ? _t("Unignore") : _t("Ignore")} + { this.state.isIgnoring ? _t("Unignore") : _t("Ignore") } </AccessibleButton> ); } @@ -644,14 +641,14 @@ module.exports = withMatrixClient(React.createClass({ <div> <h3>{ _t("User Options") }</h3> <div className="mx_MemberInfo_buttons"> - {ignoreButton} + { ignoreButton } </div> </div> ); }, render: function() { - var startChat, kickButton, banButton, muteButton, giveModButton, spinner; + let startChat, kickButton, banButton, muteButton, giveModButton, spinner; if (this.props.member.userId !== this.props.matrixClient.credentials.userId) { const dmRoomMap = new DMRoomMap(this.props.matrixClient); const dmRooms = dmRoomMap.getDMRoomsForUserId(this.props.member.userId); @@ -675,7 +672,7 @@ module.exports = withMatrixClient(React.createClass({ highlight={highlight} isInvite={me.membership == "invite"} onClick={this.onRoomTileClick} - /> + />, ); } } @@ -696,14 +693,14 @@ module.exports = withMatrixClient(React.createClass({ startChat = <div> <h3>{ _t("Direct chats") }</h3> - {tiles} - {startNewChat} + { tiles } + { startNewChat } </div>; } if (this.state.updating) { - var Loader = sdk.getComponent("elements.Spinner"); - spinner = <Loader imgClassName="mx_ContextualMenu_spinner"/>; + const Loader = sdk.getComponent("elements.Spinner"); + spinner = <Loader imgClassName="mx_ContextualMenu_spinner" />; } if (this.state.can.kick) { @@ -712,7 +709,7 @@ module.exports = withMatrixClient(React.createClass({ kickButton = ( <AccessibleButton className="mx_MemberInfo_field" onClick={this.onKick}> - {kickLabel} + { kickLabel } </AccessibleButton> ); } @@ -724,7 +721,7 @@ module.exports = withMatrixClient(React.createClass({ banButton = ( <AccessibleButton className="mx_MemberInfo_field" onClick={this.onBanOrUnban}> - {label} + { label } </AccessibleButton> ); } @@ -733,31 +730,31 @@ module.exports = withMatrixClient(React.createClass({ muteButton = ( <AccessibleButton className="mx_MemberInfo_field" onClick={this.onMuteToggle}> - {muteLabel} + { muteLabel } </AccessibleButton> ); } if (this.state.can.toggleMod) { - var giveOpLabel = this.state.isTargetMod ? _t("Revoke Moderator") : _t("Make Moderator"); + const giveOpLabel = this.state.isTargetMod ? _t("Revoke Moderator") : _t("Make Moderator"); giveModButton = <AccessibleButton className="mx_MemberInfo_field" onClick={this.onModToggle}> - {giveOpLabel} + { giveOpLabel } </AccessibleButton>; } // TODO: we should have an invite button if this MemberInfo is showing a user who isn't actually in the current room yet // e.g. clicking on a linkified userid in a room - var adminTools; + let adminTools; if (kickButton || banButton || muteButton || giveModButton) { adminTools = <div> - <h3>{_t("Admin Tools")}</h3> + <h3>{ _t("Admin Tools") }</h3> <div className="mx_MemberInfo_buttons"> - {muteButton} - {kickButton} - {banButton} - {giveModButton} + { muteButton } + { kickButton } + { banButton } + { giveModButton } </div> </div>; } @@ -767,35 +764,35 @@ module.exports = withMatrixClient(React.createClass({ if (this.props.member.user) { var presenceState = this.props.member.user.presence; var presenceLastActiveAgo = this.props.member.user.lastActiveAgo; - var presenceLastTs = this.props.member.user.lastPresenceTs; + const presenceLastTs = this.props.member.user.lastPresenceTs; var presenceCurrentlyActive = this.props.member.user.currentlyActive; } - var MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); - var PowerSelector = sdk.getComponent('elements.PowerSelector'); - var PresenceLabel = sdk.getComponent('rooms.PresenceLabel'); + const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); + const PowerSelector = sdk.getComponent('elements.PowerSelector'); + const PresenceLabel = sdk.getComponent('rooms.PresenceLabel'); const EmojiText = sdk.getComponent('elements.EmojiText'); return ( <div className="mx_MemberInfo"> <GeminiScrollbar autoshow={true}> - <AccessibleButton className="mx_MemberInfo_cancel" onClick={this.onCancel}> <img src="img/cancel.svg" width="18" height="18"/></AccessibleButton> + <AccessibleButton className="mx_MemberInfo_cancel" onClick={this.onCancel}> <img src="img/cancel.svg" width="18" height="18" /></AccessibleButton> <div className="mx_MemberInfo_avatar"> <MemberAvatar onClick={this.onMemberAvatarClick} member={this.props.member} width={48} height={48} /> </div> - <EmojiText element="h2">{memberName}</EmojiText> + <EmojiText element="h2">{ memberName }</EmojiText> <div className="mx_MemberInfo_profile"> <div className="mx_MemberInfo_profileField"> { this.props.member.userId } </div> <div className="mx_MemberInfo_profileField"> - { _t("Level:") } <b><PowerSelector controlled={true} value={ parseInt(this.props.member.powerLevel) } disabled={ !this.state.can.modifyLevel } onChange={ this.onPowerChange }/></b> + { _t("Level:") } <b><PowerSelector controlled={true} value={parseInt(this.props.member.powerLevel)} disabled={!this.state.can.modifyLevel} onChange={this.onPowerChange} /></b> </div> <div className="mx_MemberInfo_profileField"> - <PresenceLabel activeAgo={ presenceLastActiveAgo } - currentlyActive={ presenceCurrentlyActive } - presenceState={ presenceState } /> + <PresenceLabel activeAgo={presenceLastActiveAgo} + currentlyActive={presenceCurrentlyActive} + presenceState={presenceState} /> </div> </div> @@ -811,5 +808,5 @@ module.exports = withMatrixClient(React.createClass({ </GeminiScrollbar> </div> ); - } + }, })); diff --git a/src/components/views/rooms/MemberList.js b/src/components/views/rooms/MemberList.js index d1b456025f..0713a4ae8a 100644 --- a/src/components/views/rooms/MemberList.js +++ b/src/components/views/rooms/MemberList.js @@ -18,11 +18,11 @@ limitations under the License. import React from 'react'; import { _t } from '../../../languageHandler'; -var MatrixClientPeg = require("../../../MatrixClientPeg"); -var sdk = require('../../../index'); -var GeminiScrollbar = require('react-gemini-scrollbar'); -var rate_limited_func = require('../../../ratelimitedfunc'); -var CallHandler = require("../../../CallHandler"); +const MatrixClientPeg = require("../../../MatrixClientPeg"); +const sdk = require('../../../index'); +const GeminiScrollbar = require('react-gemini-scrollbar'); +const rate_limited_func = require('../../../ratelimitedfunc'); +const CallHandler = require("../../../CallHandler"); const INITIAL_LOAD_NUM_MEMBERS = 30; const INITIAL_LOAD_NUM_INVITED = 5; @@ -49,7 +49,7 @@ module.exports = React.createClass({ }, componentWillMount: function() { - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); cli.on("RoomState.members", this.onRoomStateMember); cli.on("RoomMember.name", this.onRoomMemberName); cli.on("RoomState.events", this.onRoomStateEvent); @@ -62,7 +62,7 @@ module.exports = React.createClass({ }, componentWillUnmount: function() { - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); if (cli) { cli.removeListener("RoomState.members", this.onRoomStateMember); cli.removeListener("RoomMember.name", this.onRoomMemberName); @@ -109,7 +109,7 @@ module.exports = React.createClass({ // member tile and re-render it. This is more efficient than every tile // evar attaching their own listener. // console.log("explicit presence from " + user.userId); - var tile = this.refs[user.userId]; + const tile = this.refs[user.userId]; if (tile) { this._updateList(); // reorder the membership list } @@ -153,11 +153,11 @@ module.exports = React.createClass({ getMemberDict: function() { if (!this.props.roomId) return {}; - var cli = MatrixClientPeg.get(); - var room = cli.getRoom(this.props.roomId); + const cli = MatrixClientPeg.get(); + const room = cli.getRoom(this.props.roomId); if (!room) return {}; - var all_members = room.currentState.members; + const all_members = room.currentState.members; Object.keys(all_members).map(function(userId) { // work around a race where you might have a room member object @@ -175,17 +175,17 @@ module.exports = React.createClass({ }, roomMembers: function() { - var all_members = this.memberDict || {}; - var all_user_ids = Object.keys(all_members); - var ConferenceHandler = CallHandler.getConferenceHandler(); + const all_members = this.memberDict || {}; + const all_user_ids = Object.keys(all_members); + const ConferenceHandler = CallHandler.getConferenceHandler(); all_user_ids.sort(this.memberSort); - var to_display = []; - var count = 0; - for (var i = 0; i < all_user_ids.length; ++i) { - var user_id = all_user_ids[i]; - var m = all_members[user_id]; + const to_display = []; + let count = 0; + for (let i = 0; i < all_user_ids.length; ++i) { + const user_id = all_user_ids[i]; + const m = all_members[user_id]; if (m.membership == 'join' || m.membership == 'invite') { if ((ConferenceHandler && !ConferenceHandler.isConferenceUser(user_id)) || !ConferenceHandler) { @@ -233,8 +233,7 @@ module.exports = React.createClass({ memberString: function(member) { if (!member) { return "(null)"; - } - else { + } else { return "(" + member.name + ", " + member.powerLevel + ", " + member.user.lastActiveAgo + ", " + member.user.currentlyActive + ")"; } }, @@ -248,10 +247,10 @@ module.exports = React.createClass({ // ...and then alphabetically. // We could tiebreak instead by "last recently spoken in this room" if we wanted to. - var memberA = this.memberDict[userIdA]; - var memberB = this.memberDict[userIdB]; - var userA = memberA.user; - var userB = memberB.user; + const memberA = this.memberDict[userIdA]; + const memberB = this.memberDict[userIdB]; + const userA = memberA.user; + const userB = memberB.user; // if (!userA || !userB) { // console.log("comparing " + memberA.name + " user=" + memberA.user + " with " + memberB.name + " user=" + memberB.user); @@ -269,15 +268,13 @@ module.exports = React.createClass({ // console.log(memberA + " and " + memberB + " have same power level"); if (memberA.name && memberB.name) { // console.log("comparing names: " + memberA.name + " and " + memberB.name); - var nameA = memberA.name[0] === '@' ? memberA.name.substr(1) : memberA.name; - var nameB = memberB.name[0] === '@' ? memberB.name.substr(1) : memberB.name; + const nameA = memberA.name[0] === '@' ? memberA.name.substr(1) : memberA.name; + const nameB = memberB.name[0] === '@' ? memberB.name.substr(1) : memberB.name; return nameA.localeCompare(nameB); - } - else { + } else { return 0; } - } - else { + } else { // console.log("comparing power: " + memberA.powerLevel + " and " + memberB.powerLevel); return memberB.powerLevel - memberA.powerLevel; } @@ -336,25 +333,25 @@ module.exports = React.createClass({ // The HS may have already converted these into m.room.member invites so // we shouldn't add them if the 3pid invite state key (token) is in the // member invite (content.third_party_invite.signed.token) - var room = MatrixClientPeg.get().getRoom(this.props.roomId); - var EntityTile = sdk.getComponent("rooms.EntityTile"); + const room = MatrixClientPeg.get().getRoom(this.props.roomId); + const EntityTile = sdk.getComponent("rooms.EntityTile"); if (room) { room.currentState.getStateEvents("m.room.third_party_invite").forEach( function(e) { // any events without these keys are not valid 3pid invites, so we ignore them - var required_keys = ['key_validity_url', 'public_key', 'display_name']; - for (var i = 0; i < required_keys.length; ++i) { + const required_keys = ['key_validity_url', 'public_key', 'display_name']; + for (let i = 0; i < required_keys.length; ++i) { if (e.getContent()[required_keys[i]] === undefined) return; } // discard all invites which have a m.room.member event since we've // already added them. - var memberEvent = room.currentState.getInviteForThreePidToken(e.getStateKey()); + const memberEvent = room.currentState.getInviteForThreePidToken(e.getStateKey()); if (memberEvent) { return; } memberList.push( - <EntityTile key={e.getStateKey()} name={e.getContent().display_name} suppressOnHover={true} /> + <EntityTile key={e.getStateKey()} name={e.getContent().display_name} suppressOnHover={true} />, ); }); } @@ -402,7 +399,7 @@ module.exports = React.createClass({ <form autoComplete="off"> <input className="mx_MemberList_query" id="mx_MemberList_query" type="text" onChange={this.onSearchQueryChanged} value={this.state.searchQuery} - placeholder={ _t('Filter room members') } /> + placeholder={_t('Filter room members')} /> </form> ); @@ -415,9 +412,9 @@ module.exports = React.createClass({ getChildren={this._getChildrenJoined} getChildCount={this._getChildCountJoined} /> - {invitedSection} + { invitedSection } </GeminiScrollbar> </div> ); - } + }, }); diff --git a/src/components/views/rooms/MemberTile.js b/src/components/views/rooms/MemberTile.js index d7e6b4a1ec..e21f7c91f4 100644 --- a/src/components/views/rooms/MemberTile.js +++ b/src/components/views/rooms/MemberTile.js @@ -16,12 +16,12 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); -var MatrixClientPeg = require('../../../MatrixClientPeg'); -var sdk = require('../../../index'); -var dis = require('../../../dispatcher'); -var Modal = require("../../../Modal"); +const MatrixClientPeg = require('../../../MatrixClientPeg'); +const sdk = require('../../../index'); +const dis = require('../../../dispatcher'); +const Modal = require("../../../Modal"); import { _t } from '../../../languageHandler'; module.exports = React.createClass({ @@ -68,16 +68,16 @@ module.exports = React.createClass({ }, render: function() { - var MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); - var BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); - var EntityTile = sdk.getComponent('rooms.EntityTile'); + const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); + const BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); + const EntityTile = sdk.getComponent('rooms.EntityTile'); - var member = this.props.member; - var name = this._getDisplayName(); - var active = -1; - var presenceState = member.user ? member.user.presence : null; + const member = this.props.member; + const name = this._getDisplayName(); + const active = -1; + const presenceState = member.user ? member.user.presence : null; - var av = ( + const av = ( <MemberAvatar member={member} width={36} height={36} /> ); @@ -88,11 +88,11 @@ module.exports = React.createClass({ return ( <EntityTile {...this.props} presenceState={presenceState} - presenceLastActiveAgo={ member.user ? member.user.lastActiveAgo : 0 } - presenceLastTs={ member.user ? member.user.lastPresenceTs : 0 } - presenceCurrentlyActive={ member.user ? member.user.currentlyActive : false } + presenceLastActiveAgo={member.user ? member.user.lastActiveAgo : 0} + presenceLastTs={member.user ? member.user.lastPresenceTs : 0} + presenceCurrentlyActive={member.user ? member.user.currentlyActive : false} avatarJsx={av} title={this.getPowerLabel()} onClick={this.onClick} name={name} powerLevel={this.props.member.powerLevel} /> ); - } + }, }); diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index fd8c73eb80..00659520c3 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -89,13 +89,13 @@ export default class MessageComposer extends React.Component { } uploadFiles(files) { - let QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - let TintableSvg = sdk.getComponent("elements.TintableSvg"); + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + const TintableSvg = sdk.getComponent("elements.TintableSvg"); - let fileList = []; + const fileList = []; for (let i=0; i<files.length; i++) { fileList.push(<li key={i}> - <TintableSvg key={i} src="img/files.svg" width="16" height="16" /> {files[i].name || _t('Attachment')} + <TintableSvg key={i} src="img/files.svg" width="16" height="16" /> { files[i].name || _t('Attachment') } </li>); } @@ -105,7 +105,7 @@ export default class MessageComposer extends React.Component { <div> <p>{ _t('Are you sure you want to upload the following files?') }</p> <ul style={{listStyle: 'none', textAlign: 'left'}}> - {fileList} + { fileList } </ul> </div> ), @@ -271,16 +271,16 @@ export default class MessageComposer extends React.Component { if (this.props.callState && this.props.callState !== 'ended') { hangupButton = <div key="controls_hangup" className="mx_MessageComposer_hangup" onClick={this.onHangupClick}> - <img src="img/hangup.svg" alt={ _t('Hangup') } title={ _t('Hangup') } width="25" height="26"/> + <img src="img/hangup.svg" alt={_t('Hangup')} title={_t('Hangup')} width="25" height="26" /> </div>; } else { callButton = - <div key="controls_call" className="mx_MessageComposer_voicecall" onClick={this.onVoiceCallClick} title={ _t('Voice call') }> - <TintableSvg src="img/icon-call.svg" width="35" height="35"/> + <div key="controls_call" className="mx_MessageComposer_voicecall" onClick={this.onVoiceCallClick} title={_t('Voice call')}> + <TintableSvg src="img/icon-call.svg" width="35" height="35" /> </div>; videoCallButton = - <div key="controls_videocall" className="mx_MessageComposer_videocall" onClick={this.onCallClick} title={ _t('Video call') }> - <TintableSvg src="img/icons-video.svg" width="35" height="35"/> + <div key="controls_videocall" className="mx_MessageComposer_videocall" onClick={this.onCallClick} title={_t('Video call')}> + <TintableSvg src="img/icons-video.svg" width="35" height="35" /> </div>; } @@ -289,12 +289,12 @@ export default class MessageComposer extends React.Component { if (this.props.showApps) { hideAppsButton = <div key="controls_hide_apps" className="mx_MessageComposer_apps" onClick={this.onHideAppsClick} title={_t("Hide Apps")}> - <TintableSvg src="img/icons-hide-apps.svg" width="35" height="35"/> + <TintableSvg src="img/icons-hide-apps.svg" width="35" height="35" /> </div>; } else { showAppsButton = <div key="show_apps" className="mx_MessageComposer_apps" onClick={this.onShowAppsClick} title={_t("Show Apps")}> - <TintableSvg src="img/icons-show-apps.svg" width="35" height="35"/> + <TintableSvg src="img/icons-show-apps.svg" width="35" height="35" /> </div>; } } @@ -308,8 +308,8 @@ export default class MessageComposer extends React.Component { // complex because of conference calls. const uploadButton = ( <div key="controls_upload" className="mx_MessageComposer_upload" - onClick={this.onUploadClick} title={ _t('Upload file') }> - <TintableSvg src="img/icons-upload.svg" width="35" height="35"/> + onClick={this.onUploadClick} title={_t('Upload file')}> + <TintableSvg src="img/icons-upload.svg" width="35" height="35" /> <input ref="uploadInput" type="file" style={uploadInputStyle} multiple @@ -363,7 +363,7 @@ export default class MessageComposer extends React.Component { const onFormatButtonClicked = this.onFormatButtonClicked.bind(this, name); const className = 'mx_MessageComposer_format_button mx_filterFlipColor'; return <img className={className} - title={ _t(name) } + title={_t(name)} onMouseDown={onFormatButtonClicked} key={name} src={`img/button-text-${name}${suffix}.svg`} @@ -375,18 +375,18 @@ export default class MessageComposer extends React.Component { <div className="mx_MessageComposer mx_fadable" style={{ opacity: this.props.opacity }}> <div className="mx_MessageComposer_wrapper"> <div className="mx_MessageComposer_row"> - {controls} + { controls } </div> </div> <div className="mx_MessageComposer_formatbar_wrapper"> <div className="mx_MessageComposer_formatbar" style={this.state.showFormatting ? {} : {display: 'none'}}> - {formatButtons} + { formatButtons } <div style={{flex: 1}}></div> - <img title={ this.state.inputState.isRichtextEnabled ? _t("Turn Markdown on") : _t("Turn Markdown off") } + <img title={this.state.inputState.isRichtextEnabled ? _t("Turn Markdown on") : _t("Turn Markdown off")} onMouseDown={this.onToggleMarkdownClicked} className="mx_MessageComposer_formatbar_markdown mx_filterFlipColor" src={`img/button-md-${!this.state.inputState.isRichtextEnabled}.png`} /> - <img title={ _t("Hide Text Formatting Toolbar") } + <img title={_t("Hide Text Formatting Toolbar")} onClick={this.onToggleFormattingClicked} className="mx_MessageComposer_formatbar_cancel mx_filterFlipColor" src="img/icon-text-cancel.svg" /> diff --git a/src/components/views/rooms/MessageComposerInput.js b/src/components/views/rooms/MessageComposerInput.js index 39666c94a4..4850428621 100644 --- a/src/components/views/rooms/MessageComposerInput.js +++ b/src/components/views/rooms/MessageComposerInput.js @@ -224,7 +224,7 @@ export default class MessageComposerInput extends React.Component { return ( <a href={url} data-offset-key={entityProps.offsetKey}> - {entityProps.children} + { entityProps.children } </a> ); }, @@ -286,7 +286,7 @@ export default class MessageComposerInput extends React.Component { /// XXX: Not doing rich-text quoting from formatted-body because draft-js /// has regressed such that when links are quoted, errors are thrown. See /// https://github.com/vector-im/riot-web/issues/4756. - let body = escape(payload.text); + const body = escape(payload.text); if (body) { let content = RichText.htmlToContentState(`<blockquote>${body}</blockquote>`); if (!this.state.isRichtextEnabled) { @@ -464,7 +464,7 @@ export default class MessageComposerInput extends React.Component { // autocomplete will probably have different completions to show. if ( !state.editorState.getSelection().equals( - this.state.editorState.getSelection() + this.state.editorState.getSelection(), ) && state.editorState.getCurrentContent().getPlainText() === this.state.editorState.getCurrentContent().getPlainText() @@ -974,7 +974,6 @@ export default class MessageComposerInput extends React.Component { editorState = EditorState.forceSelection(editorState, editorState.getSelection()); this.setState({editorState}); - } return false; } @@ -1134,12 +1133,12 @@ export default class MessageComposerInput extends React.Component { onConfirm={this.setDisplayedCompletion} onSelectionChange={this.setDisplayedCompletion} query={this.getAutocompleteQuery(content)} - selection={selection}/> + selection={selection} /> </div> <div className={className}> <img className="mx_MessageComposer_input_markdownIndicator mx_filterFlipColor" onMouseDown={this.onMarkdownToggleClicked} - title={ this.state.isRichtextEnabled ? _t("Markdown is disabled") : _t("Markdown is enabled")} + title={this.state.isRichtextEnabled ? _t("Markdown is disabled") : _t("Markdown is enabled")} src={`img/button-md-${!this.state.isRichtextEnabled}.png`} /> <Editor ref="editor" dir="auto" @@ -1157,7 +1156,7 @@ export default class MessageComposerInput extends React.Component { onUpArrow={this.onUpArrow} onDownArrow={this.onDownArrow} onEscape={this.onEscape} - spellCheck={true}/> + spellCheck={true} /> </div> </div> ); diff --git a/src/components/views/rooms/PresenceLabel.js b/src/components/views/rooms/PresenceLabel.js index 87b218e2e2..69ba7c39c3 100644 --- a/src/components/views/rooms/PresenceLabel.js +++ b/src/components/views/rooms/PresenceLabel.js @@ -34,23 +34,23 @@ module.exports = React.createClass({ currentlyActive: React.PropTypes.bool, // offline, online, etc - presenceState: React.PropTypes.string + presenceState: React.PropTypes.string, }, getDefaultProps: function() { return { ago: -1, - presenceState: null + presenceState: null, }; }, getDuration: function(time) { if (!time) return; - var t = parseInt(time / 1000); - var s = t % 60; - var m = parseInt(t / 60) % 60; - var h = parseInt(t / (60 * 60)) % 24; - var d = parseInt(t / (60 * 60 * 24)); + const t = parseInt(time / 1000); + const s = t % 60; + const m = parseInt(t / 60) % 60; + const h = parseInt(t / (60 * 60)) % 24; + const d = parseInt(t / (60 * 60 * 24)); if (t < 60) { if (t < 0) { return _t("for %(amount)ss", {amount: 0}); @@ -58,12 +58,12 @@ module.exports = React.createClass({ return _t("for %(amount)ss", {amount: s}); } if (t < 60 * 60) { - return _t("for %(amount)sm", {amount: m}); + return _t("for %(amount)sm", {amount: m}); } if (t < 24 * 60 * 60) { - return _t("for %(amount)sh", {amount: h}); + return _t("for %(amount)sh", {amount: h}); } - return _t("for %(amount)sd", {amount: d}); + return _t("for %(amount)sd", {amount: d}); }, getPrettyPresence: function(presence) { @@ -75,20 +75,19 @@ module.exports = React.createClass({ render: function() { if (this.props.activeAgo >= 0) { - let duration = this.getDuration(this.props.activeAgo); - let ago = this.props.currentlyActive || !duration ? "" : duration; + const duration = this.getDuration(this.props.activeAgo); + const ago = this.props.currentlyActive || !duration ? "" : duration; return ( <div className="mx_PresenceLabel"> { this.getPrettyPresence(this.props.presenceState) } { ago } </div> ); - } - else { + } else { return ( <div className="mx_PresenceLabel"> { this.getPrettyPresence(this.props.presenceState) } </div> ); } - } + }, }); diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.js index 44d1e651d7..69ea81cdfa 100644 --- a/src/components/views/rooms/ReadReceiptMarker.js +++ b/src/components/views/rooms/ReadReceiptMarker.js @@ -16,18 +16,18 @@ limitations under the License. 'use strict'; -var React = require('react'); -var ReactDOM = require('react-dom'); +const React = require('react'); +const ReactDOM = require('react-dom'); -var sdk = require('../../../index'); +const sdk = require('../../../index'); -var Velociraptor = require('../../../Velociraptor'); +const Velociraptor = require('../../../Velociraptor'); require('../../../VelocityBounce'); import { _t } from '../../../languageHandler'; import DateUtils from '../../../DateUtils'; -var bounce = false; +let bounce = false; try { if (global.localStorage) { bounce = global.localStorage.getItem('avatar_bounce') == 'true'; @@ -90,7 +90,7 @@ module.exports = React.createClass({ componentWillUnmount: function() { // before we remove the rr, store its location in the map, so that if // it reappears, it can be animated from the right place. - var rrInfo = this.props.readReceiptInfo; + const rrInfo = this.props.readReceiptInfo; if (!rrInfo) { return; } @@ -102,7 +102,7 @@ module.exports = React.createClass({ return; } - var avatarNode = ReactDOM.findDOMNode(this); + const avatarNode = ReactDOM.findDOMNode(this); rrInfo.top = avatarNode.offsetTop; rrInfo.left = avatarNode.offsetLeft; rrInfo.parent = avatarNode.offsetParent; @@ -115,14 +115,14 @@ module.exports = React.createClass({ } // treat new RRs as though they were off the top of the screen - var oldTop = -15; + let oldTop = -15; - var oldInfo = this.props.readReceiptInfo; + const oldInfo = this.props.readReceiptInfo; if (oldInfo && oldInfo.parent) { oldTop = oldInfo.top + oldInfo.parent.getBoundingClientRect().top; } - var newElement = ReactDOM.findDOMNode(this); + const newElement = ReactDOM.findDOMNode(this); let startTopOffset; if (!newElement.offsetParent) { // this seems to happen sometimes for reasons I don't understand @@ -137,8 +137,8 @@ module.exports = React.createClass({ startTopOffset = oldTop - newElement.offsetParent.getBoundingClientRect().top; } - var startStyles = []; - var enterTransitionOpts = []; + const startStyles = []; + const enterTransitionOpts = []; if (oldInfo && oldInfo.left) { // start at the old height and in the old h pos @@ -146,7 +146,7 @@ module.exports = React.createClass({ startStyles.push({ top: startTopOffset+"px", left: oldInfo.left+"px" }); - var reorderTransitionOpts = { + const reorderTransitionOpts = { duration: 100, easing: 'easeOut', }; @@ -171,12 +171,12 @@ module.exports = React.createClass({ render: function() { - var MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); + const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); if (this.state.suppressDisplay) { - return <div/>; + return <div />; } - var style = { + const style = { left: this.props.leftOffset+'px', top: '0px', visibility: this.props.hidden ? 'hidden' : 'visible', diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index a6d34f9b08..da77174dff 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -16,20 +16,20 @@ limitations under the License. */ 'use strict'; -var React = require("react"); -var ReactDOM = require("react-dom"); +const React = require("react"); +const ReactDOM = require("react-dom"); import { _t, _tJsx } from '../../../languageHandler'; -var GeminiScrollbar = require('react-gemini-scrollbar'); -var MatrixClientPeg = require("../../../MatrixClientPeg"); -var CallHandler = require('../../../CallHandler'); -var RoomListSorter = require("../../../RoomListSorter"); -var Unread = require('../../../Unread'); -var dis = require("../../../dispatcher"); -var sdk = require('../../../index'); -var rate_limited_func = require('../../../ratelimitedfunc'); -var Rooms = require('../../../Rooms'); +const GeminiScrollbar = require('react-gemini-scrollbar'); +const MatrixClientPeg = require("../../../MatrixClientPeg"); +const CallHandler = require('../../../CallHandler'); +const RoomListSorter = require("../../../RoomListSorter"); +const Unread = require('../../../Unread'); +const dis = require("../../../dispatcher"); +const sdk = require('../../../index'); +const rate_limited_func = require('../../../ratelimitedfunc'); +const Rooms = require('../../../Rooms'); import DMRoomMap from '../../../utils/DMRoomMap'; -var Receipt = require('../../../utils/Receipt'); +const Receipt = require('../../../utils/Receipt'); const HIDE_CONFERENCE_CHANS = true; @@ -55,7 +55,7 @@ function phraseForSection(section) { return _t('Drop here to tag %(section)s', {section: section}); } return _t('Drop here %(toAction)s', {toAction: verb}); -}; +} module.exports = React.createClass({ displayName: 'RoomList', @@ -78,7 +78,7 @@ module.exports = React.createClass({ componentWillMount: function() { this.mounted = false; - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); cli.on("Room", this.onRoom); cli.on("deleteRoom", this.onDeleteRoom); cli.on("Room.timeline", this.onRoomTimeline); @@ -98,7 +98,7 @@ module.exports = React.createClass({ // loop count to stop a stack overflow if the user keeps waggling the // mouse for >30s in a row, or if running under mocha - this._delayedRefreshRoomListLoopCount = 0 + this._delayedRefreshRoomListLoopCount = 0; }, componentDidMount: function() { @@ -124,13 +124,12 @@ module.exports = React.createClass({ var call = CallHandler.getCall(payload.room_id); if (call && call.call_state === 'ringing') { this.setState({ - incomingCall: call + incomingCall: call, }); this._repositionIncomingCallBox(undefined, true); - } - else { + } else { this.setState({ - incomingCall: null + incomingCall: null, }); } break; @@ -174,7 +173,7 @@ module.exports = React.createClass({ onArchivedHeaderClick: function(isHidden, scrollToPosition) { if (!isHidden) { - var self = this; + const self = this; this.setState({ isLoadingLeftRooms: true }); // Try scrolling to position @@ -265,7 +264,7 @@ module.exports = React.createClass({ }, getRoomLists: function() { - var self = this; + const self = this; const lists = {}; lists["im.vector.fake.invite"] = []; @@ -288,35 +287,28 @@ module.exports = React.createClass({ if (me.membership == "invite") { lists["im.vector.fake.invite"].push(room); - } - else if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(room, me, self.props.ConferenceHandler)) { + } else if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(room, me, self.props.ConferenceHandler)) { // skip past this room & don't put it in any lists - } - else if (me.membership == "join" || me.membership === "ban" || - (me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) - { + } else if (me.membership == "join" || me.membership === "ban" || + (me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) { // Used to split rooms via tags - var tagNames = Object.keys(room.tags); + const tagNames = Object.keys(room.tags); if (tagNames.length) { - for (var i = 0; i < tagNames.length; i++) { - var tagName = tagNames[i]; + for (let i = 0; i < tagNames.length; i++) { + const tagName = tagNames[i]; lists[tagName] = lists[tagName] || []; lists[tagName].push(room); } - } - else if (dmRoomMap.getUserIdForRoomId(room.roomId)) { + } else if (dmRoomMap.getUserIdForRoomId(room.roomId)) { // "Direct Message" rooms (that we're still in and that aren't otherwise tagged) lists["im.vector.fake.direct"].push(room); - } - else { + } else { lists["im.vector.fake.recent"].push(room); } - } - else if (me.membership === "leave") { + } else if (me.membership === "leave") { lists["im.vector.fake.archived"].push(room); - } - else { + } else { console.error("unrecognised membership: " + me.membership + " - this should never happen"); } }); @@ -343,7 +335,7 @@ module.exports = React.createClass({ _getScrollNode: function() { if (!this.mounted) return null; - var panel = ReactDOM.findDOMNode(this); + const panel = ReactDOM.findDOMNode(this); if (!panel) return null; if (panel.classList.contains('gm-prevented')) { @@ -367,22 +359,22 @@ module.exports = React.createClass({ }, _repositionIncomingCallBox: function(e, firstTime) { - var incomingCallBox = document.getElementById("incomingCallBox"); + const incomingCallBox = document.getElementById("incomingCallBox"); if (incomingCallBox && incomingCallBox.parentElement) { - var scrollArea = this._getScrollNode(); + const scrollArea = this._getScrollNode(); if (!scrollArea) return; // Use the offset of the top of the scroll area from the window // as this is used to calculate the CSS fixed top position for the stickies - var scrollAreaOffset = scrollArea.getBoundingClientRect().top + window.pageYOffset; + const scrollAreaOffset = scrollArea.getBoundingClientRect().top + window.pageYOffset; // Use the offset of the top of the component from the window // as this is used to calculate the CSS fixed top position for the stickies - var scrollAreaHeight = ReactDOM.findDOMNode(this).getBoundingClientRect().height; + const scrollAreaHeight = ReactDOM.findDOMNode(this).getBoundingClientRect().height; - var top = (incomingCallBox.parentElement.getBoundingClientRect().top + window.pageYOffset); + let top = (incomingCallBox.parentElement.getBoundingClientRect().top + window.pageYOffset); // Make sure we don't go too far up, if the headers aren't sticky top = (top < scrollAreaOffset) ? scrollAreaOffset : top; // make sure we don't go too far down, if the headers aren't sticky - var bottomMargin = scrollAreaOffset + (scrollAreaHeight - 45); + const bottomMargin = scrollAreaOffset + (scrollAreaHeight - 45); top = (top > bottomMargin) ? bottomMargin : top; incomingCallBox.style.top = top + "px"; @@ -393,14 +385,14 @@ module.exports = React.createClass({ // Doing the sticky headers as raw DOM, for speed, as it gets very stuttery if done // properly through React _initAndPositionStickyHeaders: function(initialise, scrollToPosition) { - var scrollArea = this._getScrollNode(); + const scrollArea = this._getScrollNode(); if (!scrollArea) return; // Use the offset of the top of the scroll area from the window // as this is used to calculate the CSS fixed top position for the stickies - var scrollAreaOffset = scrollArea.getBoundingClientRect().top + window.pageYOffset; + const scrollAreaOffset = scrollArea.getBoundingClientRect().top + window.pageYOffset; // Use the offset of the top of the componet from the window // as this is used to calculate the CSS fixed top position for the stickies - var scrollAreaHeight = ReactDOM.findDOMNode(this).getBoundingClientRect().height; + const scrollAreaHeight = ReactDOM.findDOMNode(this).getBoundingClientRect().height; if (initialise) { // Get a collection of sticky header containers references @@ -420,7 +412,7 @@ module.exports = React.createClass({ sticky.dataset.originalPosition = sticky.offsetTop - scrollArea.offsetTop; // Save and set the sticky heights - var originalHeight = sticky.getBoundingClientRect().height; + const originalHeight = sticky.getBoundingClientRect().height; sticky.dataset.originalHeight = originalHeight; sticky.style.height = originalHeight; @@ -429,8 +421,8 @@ module.exports = React.createClass({ } } - var self = this; - var scrollStuckOffset = 0; + const self = this; + let scrollStuckOffset = 0; // Scroll to the passed in position, i.e. a header was clicked and in a scroll to state // rather than a collapsable one (see RoomSubList.isCollapsableOnClick method for details) if (scrollToPosition !== undefined) { @@ -438,11 +430,11 @@ module.exports = React.createClass({ } // Stick headers to top and bottom, or free them Array.prototype.forEach.call(this.stickies, function(sticky, i, stickyWrappers) { - var stickyPosition = sticky.dataset.originalPosition; - var stickyHeight = sticky.dataset.originalHeight; - var stickyHeader = sticky.childNodes[0]; - var topStuckHeight = stickyHeight * i; - var bottomStuckHeight = stickyHeight * (stickyWrappers.length - i); + const stickyPosition = sticky.dataset.originalPosition; + const stickyHeight = sticky.dataset.originalHeight; + const stickyHeader = sticky.childNodes[0]; + const topStuckHeight = stickyHeight * i; + const bottomStuckHeight = stickyHeight * (stickyWrappers.length - i); if (self.scrollAreaSufficient && stickyPosition < (scrollArea.scrollTop + topStuckHeight)) { // Top stickies @@ -472,7 +464,7 @@ module.exports = React.createClass({ }, _updateStickyHeaders: function(initialise, scrollToPosition) { - var self = this; + const self = this; if (initialise) { // Useing setTimeout to ensure that the code is run after the painting @@ -507,25 +499,25 @@ module.exports = React.createClass({ switch (section) { case 'im.vector.fake.direct': return <div className="mx_RoomList_emptySubListTip"> - {_tJsx( + { _tJsx( "Press <StartChatButton> to start a chat with someone", [/<StartChatButton>/], [ - (sub) => <StartChatButton size="16" callout={true}/> - ] - )} + (sub) => <StartChatButton size="16" callout={true} />, + ], + ) } </div>; case 'im.vector.fake.recent': return <div className="mx_RoomList_emptySubListTip"> - {_tJsx( + { _tJsx( "You're not in any rooms yet! Press <CreateRoomButton> to make a room or"+ " <RoomDirectoryButton> to browse the directory", [/<CreateRoomButton>/, /<RoomDirectoryButton>/], [ - (sub) => <CreateRoomButton size="16" callout={true}/>, - (sub) => <RoomDirectoryButton size="16" callout={true}/> - ] - )} + (sub) => <CreateRoomButton size="16" callout={true} />, + (sub) => <RoomDirectoryButton size="16" callout={true} />, + ], + ) } </div>; } @@ -574,113 +566,112 @@ module.exports = React.createClass({ const inviteSectionExtraTiles = this._makeGroupInviteTiles(); - var self = this; + const self = this; return ( <GeminiScrollbar className="mx_RoomList_scrollbar" - autoshow={true} onScroll={ self._whenScrolling } ref="gemscroll"> + autoshow={true} onScroll={self._whenScrolling} ref="gemscroll"> <div className="mx_RoomList"> - <RoomSubList list={ self.state.lists['im.vector.fake.invite'] } - label={ _t('Invites') } - editable={ false } + <RoomSubList list={self.state.lists['im.vector.fake.invite']} + label={_t('Invites')} + editable={false} order="recent" isInvite={true} - selectedRoom={ self.props.selectedRoom } - incomingCall={ self.state.incomingCall } - collapsed={ self.props.collapsed } - searchFilter={ self.props.searchFilter } - onHeaderClick={ self.onSubListHeaderClick } - onShowMoreRooms={ self.onShowMoreRooms } - extraTiles={ inviteSectionExtraTiles } + selectedRoom={self.props.selectedRoom} + incomingCall={self.state.incomingCall} + collapsed={self.props.collapsed} + searchFilter={self.props.searchFilter} + onHeaderClick={self.onSubListHeaderClick} + onShowMoreRooms={self.onShowMoreRooms} + extraTiles={inviteSectionExtraTiles} /> - <RoomSubList list={ self.state.lists['m.favourite'] } - label={ _t('Favourites') } + <RoomSubList list={self.state.lists['m.favourite']} + label={_t('Favourites')} tagName="m.favourite" emptyContent={this._getEmptyContent('m.favourite')} - editable={ true } + editable={true} order="manual" - selectedRoom={ self.props.selectedRoom } - incomingCall={ self.state.incomingCall } - collapsed={ self.props.collapsed } - searchFilter={ self.props.searchFilter } - onHeaderClick={ self.onSubListHeaderClick } - onShowMoreRooms={ self.onShowMoreRooms } /> + selectedRoom={self.props.selectedRoom} + incomingCall={self.state.incomingCall} + collapsed={self.props.collapsed} + searchFilter={self.props.searchFilter} + onHeaderClick={self.onSubListHeaderClick} + onShowMoreRooms={self.onShowMoreRooms} /> - <RoomSubList list={ self.state.lists['im.vector.fake.direct'] } - label={ _t('People') } + <RoomSubList list={self.state.lists['im.vector.fake.direct']} + label={_t('People')} tagName="im.vector.fake.direct" emptyContent={this._getEmptyContent('im.vector.fake.direct')} headerItems={this._getHeaderItems('im.vector.fake.direct')} - editable={ true } + editable={true} order="recent" - selectedRoom={ self.props.selectedRoom } - incomingCall={ self.state.incomingCall } - collapsed={ self.props.collapsed } - alwaysShowHeader={ true } - searchFilter={ self.props.searchFilter } - onHeaderClick={ self.onSubListHeaderClick } - onShowMoreRooms={ self.onShowMoreRooms } /> + selectedRoom={self.props.selectedRoom} + incomingCall={self.state.incomingCall} + collapsed={self.props.collapsed} + alwaysShowHeader={true} + searchFilter={self.props.searchFilter} + onHeaderClick={self.onSubListHeaderClick} + onShowMoreRooms={self.onShowMoreRooms} /> - <RoomSubList list={ self.state.lists['im.vector.fake.recent'] } - label={ _t('Rooms') } - editable={ true } + <RoomSubList list={self.state.lists['im.vector.fake.recent']} + label={_t('Rooms')} + editable={true} emptyContent={this._getEmptyContent('im.vector.fake.recent')} headerItems={this._getHeaderItems('im.vector.fake.recent')} order="recent" - selectedRoom={ self.props.selectedRoom } - incomingCall={ self.state.incomingCall } - collapsed={ self.props.collapsed } - searchFilter={ self.props.searchFilter } - onHeaderClick={ self.onSubListHeaderClick } - onShowMoreRooms={ self.onShowMoreRooms } /> + selectedRoom={self.props.selectedRoom} + incomingCall={self.state.incomingCall} + collapsed={self.props.collapsed} + searchFilter={self.props.searchFilter} + onHeaderClick={self.onSubListHeaderClick} + onShowMoreRooms={self.onShowMoreRooms} /> { Object.keys(self.state.lists).map((tagName) => { if (!tagName.match(/^(m\.(favourite|lowpriority)|im\.vector\.fake\.(invite|recent|direct|archived))$/)) { - return <RoomSubList list={ self.state.lists[tagName] } - key={ tagName } - label={ tagName } - tagName={ tagName } + return <RoomSubList list={self.state.lists[tagName]} + key={tagName} + label={tagName} + tagName={tagName} emptyContent={this._getEmptyContent(tagName)} - editable={ true } + editable={true} order="manual" - selectedRoom={ self.props.selectedRoom } - incomingCall={ self.state.incomingCall } - collapsed={ self.props.collapsed } - searchFilter={ self.props.searchFilter } - onHeaderClick={ self.onSubListHeaderClick } - onShowMoreRooms={ self.onShowMoreRooms } />; - + selectedRoom={self.props.selectedRoom} + incomingCall={self.state.incomingCall} + collapsed={self.props.collapsed} + searchFilter={self.props.searchFilter} + onHeaderClick={self.onSubListHeaderClick} + onShowMoreRooms={self.onShowMoreRooms} />; } }) } - <RoomSubList list={ self.state.lists['m.lowpriority'] } - label={ _t('Low priority') } + <RoomSubList list={self.state.lists['m.lowpriority']} + label={_t('Low priority')} tagName="m.lowpriority" emptyContent={this._getEmptyContent('m.lowpriority')} - editable={ true } + editable={true} order="recent" - selectedRoom={ self.props.selectedRoom } - incomingCall={ self.state.incomingCall } - collapsed={ self.props.collapsed } - searchFilter={ self.props.searchFilter } - onHeaderClick={ self.onSubListHeaderClick } - onShowMoreRooms={ self.onShowMoreRooms } /> + selectedRoom={self.props.selectedRoom} + incomingCall={self.state.incomingCall} + collapsed={self.props.collapsed} + searchFilter={self.props.searchFilter} + onHeaderClick={self.onSubListHeaderClick} + onShowMoreRooms={self.onShowMoreRooms} /> - <RoomSubList list={ self.state.lists['im.vector.fake.archived'] } - label={ _t('Historical') } - editable={ false } + <RoomSubList list={self.state.lists['im.vector.fake.archived']} + label={_t('Historical')} + editable={false} order="recent" - selectedRoom={ self.props.selectedRoom } - collapsed={ self.props.collapsed } - alwaysShowHeader={ true } - startAsHidden={ true } - showSpinner={ self.state.isLoadingLeftRooms } - onHeaderClick= { self.onArchivedHeaderClick } - incomingCall={ self.state.incomingCall } - searchFilter={ self.props.searchFilter } - onShowMoreRooms={ self.onShowMoreRooms } /> + selectedRoom={self.props.selectedRoom} + collapsed={self.props.collapsed} + alwaysShowHeader={true} + startAsHidden={true} + showSpinner={self.state.isLoadingLeftRooms} + onHeaderClick= {self.onArchivedHeaderClick} + incomingCall={self.state.incomingCall} + searchFilter={self.props.searchFilter} + onShowMoreRooms={self.onShowMoreRooms} /> </div> </GeminiScrollbar> ); - } + }, }); diff --git a/src/components/views/rooms/RoomNameEditor.js b/src/components/views/rooms/RoomNameEditor.js index c21e155933..c6ebea864e 100644 --- a/src/components/views/rooms/RoomNameEditor.js +++ b/src/components/views/rooms/RoomNameEditor.js @@ -16,9 +16,9 @@ limitations under the License. 'use strict'; -var React = require('react'); -var sdk = require('../../../index'); -var MatrixClientPeg = require('../../../MatrixClientPeg'); +const React = require('react'); +const sdk = require('../../../index'); +const MatrixClientPeg = require('../../../MatrixClientPeg'); import { _t } from '../../../languageHandler'; module.exports = React.createClass({ @@ -29,10 +29,10 @@ module.exports = React.createClass({ }, componentWillMount: function() { - var room = this.props.room; - var name = room.currentState.getStateEvents('m.room.name', ''); - var myId = MatrixClientPeg.get().credentials.userId; - var defaultName = room.getDefaultRoomName(myId); + const room = this.props.room; + const name = room.currentState.getStateEvents('m.room.name', ''); + const myId = MatrixClientPeg.get().credentials.userId; + const defaultName = room.getDefaultRoomName(myId); this._initialName = name ? name.getContent().name : ''; @@ -47,16 +47,16 @@ module.exports = React.createClass({ }, render: function() { - var EditableText = sdk.getComponent("elements.EditableText"); + const EditableText = sdk.getComponent("elements.EditableText"); return ( <div className="mx_RoomHeader_name"> <EditableText ref="editor" className="mx_RoomHeader_nametext mx_RoomHeader_editable" placeholderClassName="mx_RoomHeader_placeholder" - placeholder={ this._placeholderName } - blurToCancel={ false } - initialValue={ this._initialName } + placeholder={this._placeholderName} + blurToCancel={false} + initialValue={this._initialName} dir="auto" /> </div> ); diff --git a/src/components/views/rooms/RoomPreviewBar.js b/src/components/views/rooms/RoomPreviewBar.js index 34166452cb..368d81e606 100644 --- a/src/components/views/rooms/RoomPreviewBar.js +++ b/src/components/views/rooms/RoomPreviewBar.js @@ -17,9 +17,9 @@ limitations under the License. 'use strict'; -var React = require('react'); -var sdk = require('../../../index'); -var MatrixClientPeg = require('../../../MatrixClientPeg'); +const React = require('react'); +const sdk = require('../../../index'); +const MatrixClientPeg = require('../../../MatrixClientPeg'); import { _t, _tJsx } from '../../../languageHandler'; @@ -61,7 +61,7 @@ module.exports = React.createClass({ getInitialState: function() { return { - busy: false + busy: false, }; }, @@ -72,7 +72,7 @@ module.exports = React.createClass({ if (this.props.inviterName && this.props.invitedEmail) { this.setState({busy: true}); MatrixClientPeg.get().lookupThreePid( - 'email', this.props.invitedEmail + 'email', this.props.invitedEmail, ).finally(() => { this.setState({busy: false}); }).done((result) => { @@ -90,10 +90,10 @@ module.exports = React.createClass({ }, render: function() { - var joinBlock, previewBlock; + let joinBlock, previewBlock; if (this.props.spinner || this.state.busy) { - var Spinner = sdk.getComponent("elements.Spinner"); + const Spinner = sdk.getComponent("elements.Spinner"); return (<div className="mx_RoomPreviewBar"> <Spinner /> </div>); @@ -110,11 +110,11 @@ module.exports = React.createClass({ const banned = myMember && myMember.membership == 'ban'; if (this.props.inviterName) { - var emailMatchBlock; + let emailMatchBlock; if (this.props.invitedEmail) { if (this.state.threePidFetchError) { emailMatchBlock = <div className="error"> - {_t("Unable to ascertain that the address this invite was sent to matches one associated with your account.")} + { _t("Unable to ascertain that the address this invite was sent to matches one associated with your account.") } </div>; } else if (this.state.invitedEmailMxid != MatrixClientPeg.get().credentials.userId) { emailMatchBlock = @@ -123,10 +123,10 @@ module.exports = React.createClass({ <img src="img/warning.svg" width="24" height="23" title= "/!\\" alt="/!\\" /> </div> <div className="mx_RoomPreviewBar_warningText"> - {_t("This invitation was sent to an email address which is not associated with this account:")} - <b><span className="email">{this.props.invitedEmail}</span></b> - <br/> - {_t("You may wish to login with a different account, or add this email to this account.")} + { _t("This invitation was sent to an email address which is not associated with this account:") } + <b><span className="email">{ this.props.invitedEmail }</span></b> + <br /> + { _t("You may wish to login with a different account, or add this email to this account.") } </div> </div>; } @@ -141,53 +141,51 @@ module.exports = React.createClass({ 'Would you like to <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?', [/<acceptText>(.*?)<\/acceptText>/, /<declineText>(.*?)<\/declineText>/], [ - (sub) => <a onClick={ this.props.onJoinClick }>{sub}</a>, - (sub) => <a onClick={ this.props.onRejectClick }>{sub}</a> - ] - )} + (sub) => <a onClick={this.props.onJoinClick}>{ sub }</a>, + (sub) => <a onClick={this.props.onRejectClick}>{ sub }</a>, + ], + ) } </div> - {emailMatchBlock} + { emailMatchBlock } </div> ); - } else if (kicked || banned) { const roomName = this._roomNameElement(_t('This room')); const kickerMember = this.props.room.currentState.getMember( - myMember.events.member.getSender() + myMember.events.member.getSender(), ); const kickerName = kickerMember ? kickerMember.name : myMember.events.member.getSender(); let reason; if (myMember.events.member.getContent().reason) { - reason = <div>{_t("Reason: %(reasonText)s", {reasonText: myMember.events.member.getContent().reason})}</div> + reason = <div>{ _t("Reason: %(reasonText)s", {reasonText: myMember.events.member.getContent().reason}) }</div>; } let rejoinBlock; if (!banned) { - rejoinBlock = <div><a onClick={ this.props.onJoinClick }><b>{_t("Rejoin")}</b></a></div>; + rejoinBlock = <div><a onClick={this.props.onJoinClick}><b>{ _t("Rejoin") }</b></a></div>; } let actionText; if (kicked) { actionText = _t("You have been kicked from %(roomName)s by %(userName)s.", {roomName: roomName, userName: kickerName}); - } - else if (banned) { + } else if (banned) { actionText = _t("You have been banned from %(roomName)s by %(userName)s.", {roomName: roomName, userName: kickerName}); } // no other options possible due to the kicked || banned check above. joinBlock = ( <div> <div className="mx_RoomPreviewBar_join_text"> - {actionText} + { actionText } <br /> - {reason} - {rejoinBlock} - <a onClick={ this.props.onForgetClick }><b>{_t("Forget room")}</b></a> + { reason } + { rejoinBlock } + <a onClick={this.props.onForgetClick}><b>{ _t("Forget room") }</b></a> </div> </div> ); } else if (this.props.error) { - var name = this.props.roomAlias || _t("This room"); - var error; + const name = this.props.roomAlias || _t("This room"); + let error; if (this.props.error.errcode == 'M_NOT_FOUND') { error = _t("%(roomName)s does not exist.", {roomName: name}); } else { @@ -206,11 +204,11 @@ module.exports = React.createClass({ <div> <div className="mx_RoomPreviewBar_join_text"> { _t('You are trying to access %(roomName)s.', {roomName: name}) } - <br/> + <br /> { _tJsx("<a>Click here</a> to join the discussion!", /<a>(.*?)<\/a>/, - (sub) => <a onClick={ this.props.onJoinClick }><b>{sub}</b></a> - )} + (sub) => <a onClick={this.props.onJoinClick}><b>{ sub }</b></a>, + ) } </div> </div> ); @@ -232,5 +230,5 @@ module.exports = React.createClass({ </div> </div> ); - } + }, }); diff --git a/src/components/views/rooms/RoomSettings.js b/src/components/views/rooms/RoomSettings.js index 8739254966..9934456597 100644 --- a/src/components/views/rooms/RoomSettings.js +++ b/src/components/views/rooms/RoomSettings.js @@ -31,7 +31,7 @@ import AccessibleButton from '../elements/AccessibleButton'; // parse a string as an integer; if the input is undefined, or cannot be parsed // as an integer, return a default. function parseIntWithDefault(val, def) { - var res = parseInt(val); + const res = parseInt(val); return isNaN(res) ? def : res; } @@ -57,7 +57,7 @@ const plEventsToShow = { "m.room.topic": {isState: true}, "im.vector.modular.widgets": {isState: true}, -} +}; const BannedUser = React.createClass({ propTypes: { @@ -103,8 +103,8 @@ const BannedUser = React.createClass({ <li> { unbanButton } <span title={_t("Banned by %(displayName)s", {displayName: this.props.by})}> - <strong>{this.props.member.name}</strong> {this.props.member.userId} - {this.props.reason ? " " +_t('Reason') + ": " + this.props.reason : ""} + <strong>{ this.props.member.name }</strong> { this.props.member.userId } + { this.props.reason ? " " +_t('Reason') + ": " + this.props.reason : "" } </span> </li> ); @@ -120,7 +120,7 @@ module.exports = React.createClass({ }, getInitialState: function() { - var tags = {}; + const tags = {}; Object.keys(this.props.room.tags).forEach(function(tagName) { tags[tagName] = ['yep']; }); @@ -149,7 +149,7 @@ module.exports = React.createClass({ MatrixClientPeg.get().on("RoomMember.membership", this._onRoomMemberMembership); MatrixClientPeg.get().getRoomDirectoryVisibility( - this.props.room.roomId + this.props.room.roomId, ).done((result) => { this.setState({ isRoomPublished: result.visibility === "public" }); this._originalIsRoomPublished = result.visibility === "public"; @@ -179,13 +179,13 @@ module.exports = React.createClass({ setName: function(name) { this.setState({ - name: name + name: name, }); }, setTopic: function(topic) { this.setState({ - topic: topic + topic: topic, }); }, @@ -196,7 +196,7 @@ module.exports = React.createClass({ * `{ state: "fulfilled", value: v }` or `{ state: "rejected", reason: r }`. */ save: function() { - var stateWasSetDefer = Promise.defer(); + const stateWasSetDefer = Promise.defer(); // the caller may have JUST called setState on stuff, so we need to re-render before saving // else we won't use the latest values of things. // We can be a bit cheeky here and set a loading flag, and listen for the callback on that @@ -223,8 +223,8 @@ module.exports = React.createClass({ _calcSavePromises: function() { const roomId = this.props.room.roomId; - var promises = this.saveAliases(); // returns Promise[] - var originalState = this.getInitialState(); + const promises = this.saveAliases(); // returns Promise[] + const originalState = this.getInitialState(); // diff between original state and this.state to work out what has been changed console.log("Original: %s", JSON.stringify(originalState)); @@ -242,14 +242,14 @@ module.exports = React.createClass({ promises.push(MatrixClientPeg.get().sendStateEvent( roomId, "m.room.history_visibility", { history_visibility: this.state.history_visibility }, - "" + "", )); } if (this.state.isRoomPublished !== originalState.isRoomPublished) { promises.push(MatrixClientPeg.get().setRoomDirectoryVisibility( roomId, - this.state.isRoomPublished ? "public" : "private" + this.state.isRoomPublished ? "public" : "private", )); } @@ -257,7 +257,7 @@ module.exports = React.createClass({ promises.push(MatrixClientPeg.get().sendStateEvent( roomId, "m.room.join_rules", { join_rule: this.state.join_rule }, - "" + "", )); } @@ -265,33 +265,33 @@ module.exports = React.createClass({ promises.push(MatrixClientPeg.get().sendStateEvent( roomId, "m.room.guest_access", { guest_access: this.state.guest_access }, - "" + "", )); } // power levels - var powerLevels = this._getPowerLevels(); + const powerLevels = this._getPowerLevels(); if (powerLevels) { promises.push(MatrixClientPeg.get().sendStateEvent( - roomId, "m.room.power_levels", powerLevels, "" + roomId, "m.room.power_levels", powerLevels, "", )); } // tags if (this.state.tags_changed) { - var tagDiffs = ObjectUtils.getKeyValueArrayDiffs(originalState.tags, this.state.tags); + const tagDiffs = ObjectUtils.getKeyValueArrayDiffs(originalState.tags, this.state.tags); // [ {place: add, key: "m.favourite", val: ["yep"]} ] tagDiffs.forEach(function(diff) { switch (diff.place) { case "add": promises.push( - MatrixClientPeg.get().setRoomTag(roomId, diff.key, {}) + MatrixClientPeg.get().setRoomTag(roomId, diff.key, {}), ); break; case "del": promises.push( - MatrixClientPeg.get().deleteRoomTag(roomId, diff.key) + MatrixClientPeg.get().deleteRoomTag(roomId, diff.key), ); break; default: @@ -302,14 +302,14 @@ module.exports = React.createClass({ } // color scheme - var p; + let p; p = this.saveColor(); if (!p.isFulfilled()) { promises.push(p); } // url preview settings - var ps = this.saveUrlPreviewSettings(); + const ps = this.saveUrlPreviewSettings(); if (ps.length > 0) { promises.push(ps); } @@ -352,13 +352,13 @@ module.exports = React.createClass({ saveEnableEncryption: function() { if (!this.refs.encrypt) { return Promise.resolve(); } - var encrypt = this.refs.encrypt.checked; + const encrypt = this.refs.encrypt.checked; if (!encrypt) { return Promise.resolve(); } - var roomId = this.props.room.roomId; + const roomId = this.props.room.roomId; return MatrixClientPeg.get().sendStateEvent( roomId, "m.room.encryption", - { algorithm: "m.megolm.v1.aes-sha2" } + { algorithm: "m.megolm.v1.aes-sha2" }, ); }, @@ -370,7 +370,7 @@ module.exports = React.createClass({ }, _isRoomBlacklistUnverified: function() { - var blacklistUnverifiedDevicesPerRoom = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevicesPerRoom; + const blacklistUnverifiedDevicesPerRoom = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevicesPerRoom; if (blacklistUnverifiedDevicesPerRoom) { return blacklistUnverifiedDevicesPerRoom[this.props.room.roomId]; } @@ -378,7 +378,7 @@ module.exports = React.createClass({ }, _setRoomBlacklistUnverified: function(value) { - var blacklistUnverifiedDevicesPerRoom = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevicesPerRoom || {}; + const blacklistUnverifiedDevicesPerRoom = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevicesPerRoom || {}; blacklistUnverifiedDevicesPerRoom[this.props.room.roomId] = value; UserSettingsStore.setLocalSetting('blacklistUnverifiedDevicesPerRoom', blacklistUnverifiedDevicesPerRoom); @@ -396,15 +396,15 @@ module.exports = React.createClass({ _getPowerLevels: function() { if (!this.state.power_levels_changed) return undefined; - var powerLevels = this.props.room.currentState.getStateEvents('m.room.power_levels', ''); + let powerLevels = this.props.room.currentState.getStateEvents('m.room.power_levels', ''); powerLevels = powerLevels ? powerLevels.getContent() : {}; - for (let key of Object.keys(this.refs).filter(k => k.startsWith("event_levels_"))) { + for (const key of Object.keys(this.refs).filter((k) => k.startsWith("event_levels_"))) { const eventType = key.substring("event_levels_".length); powerLevels.events[eventType] = parseInt(this.refs[key].getValue()); } - var newPowerLevels = { + const newPowerLevels = { ban: parseInt(this.refs.ban.getValue()), kick: parseInt(this.refs.kick.getValue()), redact: parseInt(this.refs.redact.getValue()), @@ -421,7 +421,7 @@ module.exports = React.createClass({ onPowerLevelsChanged: function() { this.setState({ - power_levels_changed: true + power_levels_changed: true, }); }, @@ -436,25 +436,25 @@ module.exports = React.createClass({ }, _onHistoryRadioToggle: function(ev) { - var self = this; - var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + const self = this; + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); // cancel the click unless the user confirms it ev.preventDefault(); - var value = ev.target.value; + const value = ev.target.value; Modal.createTrackedDialog('Privacy warning', '', QuestionDialog, { title: _t('Privacy warning'), description: <div> - { _t('Changes to who can read history will only apply to future messages in this room') }.<br/> + { _t('Changes to who can read history will only apply to future messages in this room') }.<br /> { _t('The visibility of existing history will be unchanged') }. </div>, button: _t('Continue'), onFinished: function(confirmed) { if (confirmed) { self.setState({ - history_visibility: value + history_visibility: value, }); } }, @@ -462,7 +462,6 @@ module.exports = React.createClass({ }, _onRoomAccessRadioToggle: function(ev) { - // join_rule // INVITE | PUBLIC // ----------------------+---------------- @@ -500,7 +499,7 @@ module.exports = React.createClass({ _onToggle: function(keyName, checkedValue, uncheckedValue, ev) { console.log("Checkbox toggle: %s %s", keyName, ev.target.checked); - var state = {}; + const state = {}; state[keyName] = ev.target.checked ? checkedValue : uncheckedValue; this.setState(state); }, @@ -509,26 +508,24 @@ module.exports = React.createClass({ if (event.target.checked) { if (tagName === 'm.favourite') { delete this.state.tags['m.lowpriority']; - } - else if (tagName === 'm.lowpriority') { + } else if (tagName === 'm.lowpriority') { delete this.state.tags['m.favourite']; } this.state.tags[tagName] = this.state.tags[tagName] || ["yep"]; - } - else { + } else { delete this.state.tags[tagName]; } this.setState({ tags: this.state.tags, - tags_changed: true + tags_changed: true, }); }, mayChangeRoomAccess: function() { - var cli = MatrixClientPeg.get(); - var roomState = this.props.room.currentState; + const cli = MatrixClientPeg.get(); + const roomState = this.props.room.currentState; return (roomState.mayClientSendStateEvent("m.room.join_rules", cli) && roomState.mayClientSendStateEvent("m.room.guest_access", cli)); }, @@ -545,8 +542,8 @@ module.exports = React.createClass({ MatrixClientPeg.get().forget(this.props.room.roomId).done(function() { dis.dispatch({ action: 'view_next_room' }); }, function(err) { - var errCode = err.errcode || _t('unknown error code'); - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + const errCode = err.errcode || _t('unknown error code'); + const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); Modal.createTrackedDialog('Failed to forget room', '', ErrorDialog, { title: _t('Error'), description: _t("Failed to forget room %(errCode)s", { errCode: errCode }), @@ -557,7 +554,7 @@ module.exports = React.createClass({ onEnableEncryptionClick() { if (!this.refs.encrypt.checked) return; - var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); Modal.createTrackedDialog('E2E Enable Warning', '', QuestionDialog, { title: _t('Warning!'), description: ( @@ -569,7 +566,7 @@ module.exports = React.createClass({ <p>{ _t('Encrypted messages will not be visible on clients that do not yet implement encryption') }.</p> </div> ), - onFinished: confirm=>{ + onFinished: (confirm)=>{ if (!confirm) { this.refs.encrypt.checked = false; } @@ -583,7 +580,7 @@ module.exports = React.createClass({ }, _populateDefaultPlEvents: function(eventsSection, stateLevel, eventsLevel) { - for (let desiredEvent of Object.keys(plEventsToShow)) { + for (const desiredEvent of Object.keys(plEventsToShow)) { if (!(desiredEvent in eventsSection)) { eventsSection[desiredEvent] = (plEventsToShow[desiredEvent].isState ? stateLevel : eventsLevel); } @@ -591,17 +588,17 @@ module.exports = React.createClass({ }, _renderEncryptionSection: function() { - var cli = MatrixClientPeg.get(); - var roomState = this.props.room.currentState; - var isEncrypted = cli.isRoomEncrypted(this.props.room.roomId); - var isGlobalBlacklistUnverified = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevices; - var isRoomBlacklistUnverified = this._isRoomBlacklistUnverified(); + const cli = MatrixClientPeg.get(); + const roomState = this.props.room.currentState; + const isEncrypted = cli.isRoomEncrypted(this.props.room.roomId); + const isGlobalBlacklistUnverified = UserSettingsStore.getLocalSettings().blacklistUnverifiedDevices; + const isRoomBlacklistUnverified = this._isRoomBlacklistUnverified(); - var settings = + const settings = <label> <input type="checkbox" ref="blacklistUnverified" - defaultChecked={ isGlobalBlacklistUnverified || isRoomBlacklistUnverified } - disabled={ isGlobalBlacklistUnverified || (this.refs.encrypt && !this.refs.encrypt.checked) }/> + defaultChecked={isGlobalBlacklistUnverified || isRoomBlacklistUnverified} + disabled={isGlobalBlacklistUnverified || (this.refs.encrypt && !this.refs.encrypt.checked)} /> { _t('Never send encrypted messages to unverified devices in this room from this device') }. </label>; @@ -609,7 +606,7 @@ module.exports = React.createClass({ return ( <div> <label> - <input type="checkbox" ref="encrypt" onClick={ this.onEnableEncryptionClick }/> + <input type="checkbox" ref="encrypt" onClick={this.onEnableEncryptionClick} /> <img className="mx_RoomSettings_e2eIcon mx_filterFlipColor" src="img/e2e-unencrypted.svg" width="12" height="12" /> { _t('Enable encryption') } { _t('(warning: cannot be disabled again!)') } </label> @@ -636,43 +633,43 @@ module.exports = React.createClass({ // TODO: go through greying out things you don't have permission to change // (or turning them into informative stuff) - var AliasSettings = sdk.getComponent("room_settings.AliasSettings"); - var ColorSettings = sdk.getComponent("room_settings.ColorSettings"); - var UrlPreviewSettings = sdk.getComponent("room_settings.UrlPreviewSettings"); - var RelatedGroupSettings = sdk.getComponent("room_settings.RelatedGroupSettings"); - var EditableText = sdk.getComponent('elements.EditableText'); - var PowerSelector = sdk.getComponent('elements.PowerSelector'); - var Loader = sdk.getComponent("elements.Spinner"); + const AliasSettings = sdk.getComponent("room_settings.AliasSettings"); + const ColorSettings = sdk.getComponent("room_settings.ColorSettings"); + const UrlPreviewSettings = sdk.getComponent("room_settings.UrlPreviewSettings"); + const RelatedGroupSettings = sdk.getComponent("room_settings.RelatedGroupSettings"); + const EditableText = sdk.getComponent('elements.EditableText'); + const PowerSelector = sdk.getComponent('elements.PowerSelector'); + const Loader = sdk.getComponent("elements.Spinner"); - var cli = MatrixClientPeg.get(); - var roomState = this.props.room.currentState; - var user_id = cli.credentials.userId; + const cli = MatrixClientPeg.get(); + const roomState = this.props.room.currentState; + const user_id = cli.credentials.userId; - var power_level_event = roomState.getStateEvents('m.room.power_levels', ''); - var power_levels = power_level_event ? power_level_event.getContent() : {}; - var events_levels = power_levels.events || {}; - var user_levels = power_levels.users || {}; + const power_level_event = roomState.getStateEvents('m.room.power_levels', ''); + const power_levels = power_level_event ? power_level_event.getContent() : {}; + const events_levels = power_levels.events || {}; + const user_levels = power_levels.users || {}; - var ban_level = parseIntWithDefault(power_levels.ban, 50); - var kick_level = parseIntWithDefault(power_levels.kick, 50); - var redact_level = parseIntWithDefault(power_levels.redact, 50); - var invite_level = parseIntWithDefault(power_levels.invite, 50); - var send_level = parseIntWithDefault(power_levels.events_default, 0); - var state_level = power_level_event ? parseIntWithDefault(power_levels.state_default, 50) : 0; - var default_user_level = parseIntWithDefault(power_levels.users_default, 0); + const ban_level = parseIntWithDefault(power_levels.ban, 50); + const kick_level = parseIntWithDefault(power_levels.kick, 50); + const redact_level = parseIntWithDefault(power_levels.redact, 50); + const invite_level = parseIntWithDefault(power_levels.invite, 50); + const send_level = parseIntWithDefault(power_levels.events_default, 0); + const state_level = power_level_event ? parseIntWithDefault(power_levels.state_default, 50) : 0; + const default_user_level = parseIntWithDefault(power_levels.users_default, 0); this._populateDefaultPlEvents(events_levels, state_level, send_level); - var current_user_level = user_levels[user_id]; + let current_user_level = user_levels[user_id]; if (current_user_level === undefined) { current_user_level = default_user_level; } - var can_change_levels = roomState.mayClientSendStateEvent("m.room.power_levels", cli); + const can_change_levels = roomState.mayClientSendStateEvent("m.room.power_levels", cli); - var canSetTag = !cli.isGuest(); + const canSetTag = !cli.isGuest(); - var self = this; + const self = this; let relatedGroupsSection; if (UserSettingsStore.isFeatureEnabled('feature_groups')) { @@ -682,23 +679,22 @@ module.exports = React.createClass({ relatedGroupsEvent={this.props.room.currentState.getStateEvents('m.room.related_groups', '')} />; } - var userLevelsSection; + let userLevelsSection; if (Object.keys(user_levels).length) { userLevelsSection = <div> <h3>{ _t('Privileged Users') }</h3> <ul className="mx_RoomSettings_userLevels"> - {Object.keys(user_levels).map(function(user, i) { + { Object.keys(user_levels).map(function(user, i) { return ( <li className="mx_RoomSettings_userLevel" key={user}> - { _t("%(user)s is a", {user: user}) } <PowerSelector value={ user_levels[user] } disabled={true}/> + { _t("%(user)s is a", {user: user}) } <PowerSelector value={user_levels[user]} disabled={true} /> </li> ); - })} + }) } </ul> </div>; - } - else { + } else { userLevelsSection = <div>{ _t('No users have specific privileges in this room') }.</div>; } @@ -710,7 +706,7 @@ module.exports = React.createClass({ <div> <h3>{ _t('Banned users') }</h3> <ul className="mx_RoomSettings_banned"> - {banned.map(function(member) { + { banned.map(function(member) { const banEvent = member.events.member.getContent(); const sender = self.props.room.getMember(member.events.member.getSender()); let bannedBy = member.events.member.getSender(); // start by falling back to mxid @@ -718,12 +714,12 @@ module.exports = React.createClass({ return ( <BannedUser key={member.userId} canUnban={canBanUsers} member={member} reason={banEvent.reason} by={bannedBy} /> ); - })} + }) } </ul> </div>; } - var unfederatableSection; + let unfederatableSection; if (this._yankValueFromEvent("m.room.create", "m.federate", true) === false) { unfederatableSection = ( <div className="mx_RoomSettings_powerLevel"> @@ -732,19 +728,18 @@ module.exports = React.createClass({ ); } - var leaveButton = null; - var myMember = this.props.room.getMember(user_id); + let leaveButton = null; + const myMember = this.props.room.getMember(user_id); if (myMember) { if (myMember.membership === "join") { leaveButton = ( - <AccessibleButton className="mx_RoomSettings_leaveButton" onClick={ this.onLeaveClick }> + <AccessibleButton className="mx_RoomSettings_leaveButton" onClick={this.onLeaveClick}> { _t('Leave room') } </AccessibleButton> ); - } - else if (myMember.membership === "leave") { + } else if (myMember.membership === "leave") { leaveButton = ( - <AccessibleButton className="mx_RoomSettings_leaveButton" onClick={ this.onForgetClick }> + <AccessibleButton className="mx_RoomSettings_leaveButton" onClick={this.onForgetClick}> { _t('Forget room') } </AccessibleButton> ); @@ -754,7 +749,7 @@ module.exports = React.createClass({ // TODO: support editing custom events_levels // TODO: support editing custom user_levels - var tags = [ + const tags = [ { name: "m.favourite", label: _t('Favourite'), ref: "tag_favourite" }, { name: "m.lowpriority", label: _t('Low priority'), ref: "tag_lowpriority" }, ]; @@ -769,13 +764,13 @@ module.exports = React.createClass({ if (canSetTag || self.state.tags) { var tagsSection = <div className="mx_RoomSettings_tags"> - {_t("Tagged as: ")}{ canSetTag ? + { _t("Tagged as: ") }{ canSetTag ? (tags.map(function(tag, i) { - return (<label key={ i }> + return (<label key={i}> <input type="checkbox" - ref={ tag.ref } - checked={ tag.name in self.state.tags } - onChange={ self._onTagChange.bind(self, tag.name) }/> + ref={tag.ref} + checked={tag.name in self.state.tags} + onChange={self._onTagChange.bind(self, tag.name)} /> { tag.label } </label>); })) : (self.state.tags && self.state.tags.join) ? self.state.tags.join(", ") : "" @@ -785,11 +780,11 @@ module.exports = React.createClass({ // If there is no history_visibility, it is assumed to be 'shared'. // http://matrix.org/docs/spec/r0.0.0/client_server.html#id31 - var historyVisibility = this.state.history_visibility || "shared"; + const historyVisibility = this.state.history_visibility || "shared"; - var addressWarning; - var aliasEvents = this.props.room.currentState.getStateEvents('m.room.aliases') || []; - var aliasCount = 0; + let addressWarning; + const aliasEvents = this.props.room.currentState.getStateEvents('m.room.aliases') || []; + let aliasCount = 0; aliasEvents.forEach((event) => { aliasCount += event.getContent().aliases.length; }); @@ -800,16 +795,16 @@ module.exports = React.createClass({ { _tJsx( 'To link to a room it must have <a>an address</a>.', /<a>(.*?)<\/a>/, - (sub) => <a href="#addresses">{sub}</a> - )} + (sub) => <a href="#addresses">{ sub }</a>, + ) } </div>; } - var inviteGuestWarning; + let inviteGuestWarning; if (this.state.join_rule !== "public" && this.state.guest_access === "forbidden") { inviteGuestWarning = <div className="mx_RoomSettings_warning"> - { _t('Guests cannot join this room even if explicitly invited.') } <a href="#" onClick={ (e) => { + { _t('Guests cannot join this room even if explicitly invited.') } <a href="#" onClick={(e) => { this.setState({ join_rule: "invite", guest_access: "can_join" }); e.preventDefault(); }}>{ _t('Click here to fix') }</a>. @@ -829,61 +824,61 @@ module.exports = React.createClass({ { inviteGuestWarning } <label> <input type="radio" name="roomVis" value="invite_only" - disabled={ !this.mayChangeRoomAccess() } + disabled={!this.mayChangeRoomAccess()} onChange={this._onRoomAccessRadioToggle} - checked={this.state.join_rule !== "public"}/> + checked={this.state.join_rule !== "public"} /> { _t('Only people who have been invited') } </label> <label> <input type="radio" name="roomVis" value="public_no_guests" - disabled={ !this.mayChangeRoomAccess() } + disabled={!this.mayChangeRoomAccess()} onChange={this._onRoomAccessRadioToggle} - checked={this.state.join_rule === "public" && this.state.guest_access !== "can_join"}/> + checked={this.state.join_rule === "public" && this.state.guest_access !== "can_join"} /> { _t('Anyone who knows the room\'s link, apart from guests') } </label> <label> <input type="radio" name="roomVis" value="public_with_guests" - disabled={ !this.mayChangeRoomAccess() } + disabled={!this.mayChangeRoomAccess()} onChange={this._onRoomAccessRadioToggle} - checked={this.state.join_rule === "public" && this.state.guest_access === "can_join"}/> + checked={this.state.join_rule === "public" && this.state.guest_access === "can_join"} /> { _t('Anyone who knows the room\'s link, including guests') } </label> { addressWarning } - <br/> + <br /> { this._renderEncryptionSection() } <label> - <input type="checkbox" disabled={ !roomState.mayClientSendStateEvent("m.room.aliases", cli) } - onChange={ this._onToggle.bind(this, "isRoomPublished", true, false)} - checked={this.state.isRoomPublished}/> - {_t("Publish this room to the public in %(domain)s's room directory?", { domain: MatrixClientPeg.get().getDomain() })} + <input type="checkbox" disabled={!roomState.mayClientSendStateEvent("m.room.aliases", cli)} + onChange={this._onToggle.bind(this, "isRoomPublished", true, false)} + checked={this.state.isRoomPublished} /> + { _t("Publish this room to the public in %(domain)s's room directory?", { domain: MatrixClientPeg.get().getDomain() }) } </label> </div> <div className="mx_RoomSettings_settings"> <h3>{ _t('Who can read history?') }</h3> <label> <input type="radio" name="historyVis" value="world_readable" - disabled={ !roomState.mayClientSendStateEvent("m.room.history_visibility", cli) } + disabled={!roomState.mayClientSendStateEvent("m.room.history_visibility", cli)} checked={historyVisibility === "world_readable"} onChange={this._onHistoryRadioToggle} /> - {_t("Anyone")} + { _t("Anyone") } </label> <label> <input type="radio" name="historyVis" value="shared" - disabled={ !roomState.mayClientSendStateEvent("m.room.history_visibility", cli) } + disabled={!roomState.mayClientSendStateEvent("m.room.history_visibility", cli)} checked={historyVisibility === "shared"} onChange={this._onHistoryRadioToggle} /> { _t('Members only') } ({ _t('since the point in time of selecting this option') }) </label> <label> <input type="radio" name="historyVis" value="invited" - disabled={ !roomState.mayClientSendStateEvent("m.room.history_visibility", cli) } + disabled={!roomState.mayClientSendStateEvent("m.room.history_visibility", cli)} checked={historyVisibility === "invited"} onChange={this._onHistoryRadioToggle} /> { _t('Members only') } ({ _t('since they were invited') }) </label> <label > <input type="radio" name="historyVis" value="joined" - disabled={ !roomState.mayClientSendStateEvent("m.room.history_visibility", cli) } + disabled={!roomState.mayClientSendStateEvent("m.room.history_visibility", cli)} checked={historyVisibility === "joined"} onChange={this._onHistoryRadioToggle} /> { _t('Members only') } ({ _t('since they joined') }) @@ -897,11 +892,11 @@ module.exports = React.createClass({ <ColorSettings ref="color_settings" room={this.props.room} /> </div> - <a id="addresses"/> + <a id="addresses" /> <AliasSettings ref="alias_settings" roomId={this.props.room.roomId} - canSetCanonicalAlias={ roomState.mayClientSendStateEvent("m.room.canonical_alias", cli) } + canSetCanonicalAlias={roomState.mayClientSendStateEvent("m.room.canonical_alias", cli)} canSetAliases={ true /* Originally, we arbitrarily restricted creating aliases to room admins: roomState.mayClientSendStateEvent("m.room.aliases", cli) */ @@ -917,45 +912,45 @@ module.exports = React.createClass({ <div className="mx_RoomSettings_powerLevels mx_RoomSettings_settings"> <div className="mx_RoomSettings_powerLevel"> <span className="mx_RoomSettings_powerLevelKey">{ _t('The default role for new room members is') } </span> - <PowerSelector ref="users_default" value={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < default_user_level} onChange={this.onPowerLevelsChanged}/> + <PowerSelector ref="users_default" value={default_user_level} controlled={false} disabled={!can_change_levels || current_user_level < default_user_level} onChange={this.onPowerLevelsChanged} /> </div> <div className="mx_RoomSettings_powerLevel"> <span className="mx_RoomSettings_powerLevelKey">{ _t('To send messages, you must be a') } </span> - <PowerSelector ref="events_default" value={send_level} controlled={false} disabled={!can_change_levels || current_user_level < send_level} onChange={this.onPowerLevelsChanged}/> + <PowerSelector ref="events_default" value={send_level} controlled={false} disabled={!can_change_levels || current_user_level < send_level} onChange={this.onPowerLevelsChanged} /> </div> <div className="mx_RoomSettings_powerLevel"> <span className="mx_RoomSettings_powerLevelKey">{ _t('To invite users into the room, you must be a') } </span> - <PowerSelector ref="invite" value={invite_level} controlled={false} disabled={!can_change_levels || current_user_level < invite_level} onChange={this.onPowerLevelsChanged}/> + <PowerSelector ref="invite" value={invite_level} controlled={false} disabled={!can_change_levels || current_user_level < invite_level} onChange={this.onPowerLevelsChanged} /> </div> <div className="mx_RoomSettings_powerLevel"> <span className="mx_RoomSettings_powerLevelKey">{ _t('To configure the room, you must be a') } </span> - <PowerSelector ref="state_default" value={state_level} controlled={false} disabled={!can_change_levels || current_user_level < state_level} onChange={this.onPowerLevelsChanged}/> + <PowerSelector ref="state_default" value={state_level} controlled={false} disabled={!can_change_levels || current_user_level < state_level} onChange={this.onPowerLevelsChanged} /> </div> <div className="mx_RoomSettings_powerLevel"> <span className="mx_RoomSettings_powerLevelKey">{ _t('To kick users, you must be a') } </span> - <PowerSelector ref="kick" value={kick_level} controlled={false} disabled={!can_change_levels || current_user_level < kick_level} onChange={this.onPowerLevelsChanged}/> + <PowerSelector ref="kick" value={kick_level} controlled={false} disabled={!can_change_levels || current_user_level < kick_level} onChange={this.onPowerLevelsChanged} /> </div> <div className="mx_RoomSettings_powerLevel"> <span className="mx_RoomSettings_powerLevelKey">{ _t('To ban users, you must be a') } </span> - <PowerSelector ref="ban" value={ban_level} controlled={false} disabled={!can_change_levels || current_user_level < ban_level} onChange={this.onPowerLevelsChanged}/> + <PowerSelector ref="ban" value={ban_level} controlled={false} disabled={!can_change_levels || current_user_level < ban_level} onChange={this.onPowerLevelsChanged} /> </div> <div className="mx_RoomSettings_powerLevel"> <span className="mx_RoomSettings_powerLevelKey">{ _t('To remove other users\' messages, you must be a') } </span> - <PowerSelector ref="redact" value={redact_level} controlled={false} disabled={!can_change_levels || current_user_level < redact_level} onChange={this.onPowerLevelsChanged}/> + <PowerSelector ref="redact" value={redact_level} controlled={false} disabled={!can_change_levels || current_user_level < redact_level} onChange={this.onPowerLevelsChanged} /> </div> - {Object.keys(events_levels).map(function(event_type, i) { + { Object.keys(events_levels).map(function(event_type, i) { let label = plEventsToLabels[event_type]; if (label) label = _t(label); else label = _tJsx("To send events of type <eventType/>, you must be a", /<eventType\/>/, () => <code>{ event_type }</code>); return ( <div className="mx_RoomSettings_powerLevel" key={event_type}> <span className="mx_RoomSettings_powerLevelKey">{ label } </span> - <PowerSelector ref={"event_levels_"+event_type} value={ events_levels[event_type] } onChange={self.onPowerLevelsChanged} + <PowerSelector ref={"event_levels_"+event_type} value={events_levels[event_type]} onChange={self.onPowerLevelsChanged} controlled={false} disabled={!can_change_levels || current_user_level < events_levels[event_type]} /> </div> ); - })} + }) } { unfederatableSection } </div> @@ -970,5 +965,5 @@ module.exports = React.createClass({ </div> </div> ); - } + }, }); diff --git a/src/components/views/rooms/RoomTile.js b/src/components/views/rooms/RoomTile.js index a6065d8e92..90a763b6f1 100644 --- a/src/components/views/rooms/RoomTile.js +++ b/src/components/views/rooms/RoomTile.js @@ -17,17 +17,17 @@ limitations under the License. 'use strict'; -var React = require('react'); -var ReactDOM = require("react-dom"); -var classNames = require('classnames'); -var MatrixClientPeg = require('../../../MatrixClientPeg'); +const React = require('react'); +const ReactDOM = require("react-dom"); +const classNames = require('classnames'); +const MatrixClientPeg = require('../../../MatrixClientPeg'); import DMRoomMap from '../../../utils/DMRoomMap'; -var sdk = require('../../../index'); -var ContextualMenu = require('../../structures/ContextualMenu'); -var RoomNotifs = require('../../../RoomNotifs'); -var FormattingUtils = require('../../../utils/FormattingUtils'); +const sdk = require('../../../index'); +const ContextualMenu = require('../../structures/ContextualMenu'); +const RoomNotifs = require('../../../RoomNotifs'); +const FormattingUtils = require('../../../utils/FormattingUtils'); import AccessibleButton from '../elements/AccessibleButton'; -var UserSettingsStore = require('../../../UserSettingsStore'); +const UserSettingsStore = require('../../../UserSettingsStore'); import ActiveRoomObserver from '../../../ActiveRoomObserver'; import RoomViewStore from '../../../stores/RoomViewStore'; @@ -56,8 +56,8 @@ module.exports = React.createClass({ getInitialState: function() { return({ - hover : false, - badgeHover : false, + hover: false, + badgeHover: false, menuDisplayed: false, notifState: RoomNotifs.getRoomNotifsState(this.props.room.roomId), selected: this.props.room.roomId === RoomViewStore.getRoomId(), @@ -74,7 +74,7 @@ module.exports = React.createClass({ }, _isDirectMessageRoom: function(roomId) { - var dmRooms = DMRoomMap.shared().getUserIdForRoomId(roomId); + const dmRooms = DMRoomMap.shared().getUserIdForRoomId(roomId); if (dmRooms) { return true; } else { @@ -102,7 +102,7 @@ module.exports = React.createClass({ }, componentWillUnmount: function() { - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); if (cli) { MatrixClientPeg.get().removeListener("accountData", this.onAccountData); } @@ -116,12 +116,12 @@ module.exports = React.createClass({ }, onMouseEnter: function() { - this.setState( { hover : true }); + this.setState( { hover: true }); this.badgeOnMouseEnter(); }, onMouseLeave: function() { - this.setState( { hover : false }); + this.setState( { hover: false }); this.badgeOnMouseLeave(); }, @@ -129,25 +129,24 @@ module.exports = React.createClass({ // Only allow non-guests to access the context menu // and only change it if it needs to change if (!MatrixClientPeg.get().isGuest() && !this.state.badgeHover) { - this.setState( { badgeHover : true } ); + this.setState( { badgeHover: true } ); } }, badgeOnMouseLeave: function() { - this.setState( { badgeHover : false } ); + this.setState( { badgeHover: false } ); }, onBadgeClicked: function(e) { // Only allow none guests to access the context menu if (!MatrixClientPeg.get().isGuest()) { - // If the badge is clicked, then no longer show tooltip if (this.props.collapsed) { this.setState({ hover: false }); } - var RoomTileContextMenu = sdk.getComponent('context_menus.RoomTileContextMenu'); - var elementRect = e.target.getBoundingClientRect(); + const RoomTileContextMenu = sdk.getComponent('context_menus.RoomTileContextMenu'); + const elementRect = e.target.getBoundingClientRect(); // The window X and Y offsets are to adjust position when zoomed in to page const x = elementRect.right + window.pageXOffset + 3; @@ -155,7 +154,7 @@ module.exports = React.createClass({ let y = (elementRect.top + (elementRect.height / 2) + window.pageYOffset); y = y - (chevronOffset + 8); // where 8 is half the height of the chevron - var self = this; + const self = this; ContextualMenu.createMenu(RoomTileContextMenu, { chevronOffset: chevronOffset, left: x, @@ -164,7 +163,7 @@ module.exports = React.createClass({ onFinished: function() { self.setState({ menuDisplayed: false }); self.props.refreshSubList(); - } + }, }); this.setState({ menuDisplayed: true }); } @@ -173,17 +172,17 @@ module.exports = React.createClass({ }, render: function() { - var myUserId = MatrixClientPeg.get().credentials.userId; - var me = this.props.room.currentState.members[myUserId]; + const myUserId = MatrixClientPeg.get().credentials.userId; + const me = this.props.room.currentState.members[myUserId]; - var notificationCount = this.props.room.getUnreadNotificationCount(); + const notificationCount = this.props.room.getUnreadNotificationCount(); // var highlightCount = this.props.room.getUnreadNotificationCount("highlight"); const notifBadges = notificationCount > 0 && this._shouldShowNotifBadge(); const mentionBadges = this.props.highlight && this._shouldShowMentionBadge(); const badges = notifBadges || mentionBadges; - var classes = classNames({ + const classes = classNames({ 'mx_RoomTile': true, 'mx_RoomTile_selected': this.state.selected, 'mx_RoomTile_unread': this.props.unread, @@ -194,53 +193,53 @@ module.exports = React.createClass({ 'mx_RoomTile_noBadges': !badges, }); - var avatarClasses = classNames({ + const avatarClasses = classNames({ 'mx_RoomTile_avatar': true, }); - var badgeClasses = classNames({ + const badgeClasses = classNames({ 'mx_RoomTile_badge': true, 'mx_RoomTile_badgeButton': this.state.badgeHover || this.state.menuDisplayed, }); // XXX: We should never display raw room IDs, but sometimes the // room name js sdk gives is undefined (cannot repro this -- k) - var name = this.props.room.name || this.props.room.roomId; + let name = this.props.room.name || this.props.room.roomId; name = name.replace(":", ":\u200b"); // add a zero-width space to allow linewrapping after the colon - var badge; - var badgeContent; + let badge; + let badgeContent; if (this.state.badgeHover || this.state.menuDisplayed) { badgeContent = "\u00B7\u00B7\u00B7"; } else if (badges) { - var limitedCount = FormattingUtils.formatCount(notificationCount); + const limitedCount = FormattingUtils.formatCount(notificationCount); badgeContent = notificationCount ? limitedCount : '!'; } else { badgeContent = '\u200B'; } - badge = <div className={ badgeClasses } onClick={this.onBadgeClicked}>{ badgeContent }</div>; + badge = <div className={badgeClasses} onClick={this.onBadgeClicked}>{ badgeContent }</div>; const EmojiText = sdk.getComponent('elements.EmojiText'); - var label; - var tooltip; + let label; + let tooltip; if (!this.props.collapsed) { - var nameClasses = classNames({ + const nameClasses = classNames({ 'mx_RoomTile_name': true, 'mx_RoomTile_invite': this.props.isInvite, 'mx_RoomTile_badgeShown': badges || this.state.badgeHover || this.state.menuDisplayed, }); if (this.state.selected) { - let nameSelected = <EmojiText>{name}</EmojiText>; + const nameSelected = <EmojiText>{ name }</EmojiText>; - label = <div title={ name } className={ nameClasses } dir="auto">{ nameSelected }</div>; + label = <div title={name} className={nameClasses} dir="auto">{ nameSelected }</div>; } else { - label = <EmojiText element="div" title={ name } className={ nameClasses } dir="auto">{name}</EmojiText>; + label = <EmojiText element="div" title={name} className={nameClasses} dir="auto">{ name }</EmojiText>; } } else if (this.state.hover) { - var RoomTooltip = sdk.getComponent("rooms.RoomTooltip"); + const RoomTooltip = sdk.getComponent("rooms.RoomTooltip"); tooltip = <RoomTooltip className="mx_RoomTile_tooltip" room={this.props.room} dir="auto" />; } @@ -250,34 +249,34 @@ module.exports = React.createClass({ // incomingCallBox = <IncomingCallBox incomingCall={ this.props.incomingCall }/>; //} - var RoomAvatar = sdk.getComponent('avatars.RoomAvatar'); + const RoomAvatar = sdk.getComponent('avatars.RoomAvatar'); - var directMessageIndicator; + let directMessageIndicator; if (this._isDirectMessageRoom(this.props.room.roomId)) { - directMessageIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm"/>; + directMessageIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm" />; } // These props are injected by React DnD, // as defined by your `collect` function above: - var isDragging = this.props.isDragging; - var connectDragSource = this.props.connectDragSource; - var connectDropTarget = this.props.connectDropTarget; + const isDragging = this.props.isDragging; + const connectDragSource = this.props.connectDragSource; + const connectDropTarget = this.props.connectDropTarget; let ret = ( - <div> { /* Only native elements can be wrapped in a DnD object. */} + <div> { /* Only native elements can be wrapped in a DnD object. */ } <AccessibleButton className={classes} tabIndex="0" onClick={this.onClick} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}> <div className={avatarClasses}> <div className="mx_RoomTile_avatar_container"> <RoomAvatar room={this.props.room} width={24} height={24} /> - {directMessageIndicator} + { directMessageIndicator } </div> </div> <div className="mx_RoomTile_nameContainer"> { label } { badge } </div> - {/* { incomingCallBox } */} + { /* { incomingCallBox } */ } { tooltip } </AccessibleButton> </div> @@ -287,5 +286,5 @@ module.exports = React.createClass({ if (connectDragSource) ret = connectDragSource(ret); return ret; - } + }, }); diff --git a/src/components/views/rooms/RoomTopicEditor.js b/src/components/views/rooms/RoomTopicEditor.js index 9305381b6c..320730f341 100644 --- a/src/components/views/rooms/RoomTopicEditor.js +++ b/src/components/views/rooms/RoomTopicEditor.js @@ -16,8 +16,8 @@ limitations under the License. 'use strict'; -var React = require('react'); -var sdk = require('../../../index'); +const React = require('react'); +const sdk = require('../../../index'); import { _t } from "../../../languageHandler"; module.exports = React.createClass({ @@ -28,8 +28,8 @@ module.exports = React.createClass({ }, componentWillMount: function() { - var room = this.props.room; - var topic = room.currentState.getStateEvents('m.room.topic', ''); + const room = this.props.room; + const topic = room.currentState.getStateEvents('m.room.topic', ''); this._initialTopic = topic ? topic.getContent().topic : ''; }, @@ -38,15 +38,15 @@ module.exports = React.createClass({ }, render: function() { - var EditableText = sdk.getComponent("elements.EditableText"); + const EditableText = sdk.getComponent("elements.EditableText"); return ( <EditableText ref="editor" className="mx_RoomHeader_topic mx_RoomHeader_editable" placeholderClassName="mx_RoomHeader_placeholder" placeholder={_t("Add a topic")} - blurToCancel={ false } - initialValue={ this._initialTopic } + blurToCancel={false} + initialValue={this._initialTopic} dir="auto" /> ); }, diff --git a/src/components/views/rooms/SearchResultTile.js b/src/components/views/rooms/SearchResultTile.js index 1aba7c9196..1c5cc175ae 100644 --- a/src/components/views/rooms/SearchResultTile.js +++ b/src/components/views/rooms/SearchResultTile.js @@ -16,8 +16,8 @@ limitations under the License. 'use strict'; -var React = require('react'); -var sdk = require('../../../index'); +const React = require('react'); +const sdk = require('../../../index'); module.exports = React.createClass({ displayName: 'SearchResult', @@ -36,20 +36,20 @@ module.exports = React.createClass({ }, render: function() { - var DateSeparator = sdk.getComponent('messages.DateSeparator'); - var EventTile = sdk.getComponent('rooms.EventTile'); - var result = this.props.searchResult; - var mxEv = result.context.getEvent(); - var eventId = mxEv.getId(); + const DateSeparator = sdk.getComponent('messages.DateSeparator'); + const EventTile = sdk.getComponent('rooms.EventTile'); + const result = this.props.searchResult; + const mxEv = result.context.getEvent(); + const eventId = mxEv.getId(); - var ts1 = mxEv.getTs(); - var ret = [<DateSeparator key={ts1 + "-search"} ts={ts1}/>]; + const ts1 = mxEv.getTs(); + const ret = [<DateSeparator key={ts1 + "-search"} ts={ts1} />]; - var timeline = result.context.getTimeline(); + const timeline = result.context.getTimeline(); for (var j = 0; j < timeline.length; j++) { - var ev = timeline[j]; + const ev = timeline[j]; var highlights; - var contextual = (j != result.context.getOurEventIndex()); + const contextual = (j != result.context.getOurEventIndex()); if (!contextual) { highlights = this.props.searchHighlights; } @@ -61,7 +61,7 @@ module.exports = React.createClass({ } return ( <li data-scroll-tokens={eventId+"+"+j}> - {ret} + { ret } </li>); }, }); diff --git a/src/components/views/rooms/SearchableEntityList.js b/src/components/views/rooms/SearchableEntityList.js index 45ad2c6b9e..c71acdb454 100644 --- a/src/components/views/rooms/SearchableEntityList.js +++ b/src/components/views/rooms/SearchableEntityList.js @@ -13,16 +13,16 @@ 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 React = require('react'); -var MatrixClientPeg = require("../../../MatrixClientPeg"); -var Modal = require("../../../Modal"); -var sdk = require("../../../index"); +const React = require('react'); +const MatrixClientPeg = require("../../../MatrixClientPeg"); +const Modal = require("../../../Modal"); +const sdk = require("../../../index"); import { _t } from '../../../languageHandler'; -var GeminiScrollbar = require('react-gemini-scrollbar'); +const GeminiScrollbar = require('react-gemini-scrollbar'); // A list capable of displaying entities which conform to the SearchableEntity // interface which is an object containing getJsx(): Jsx and matches(query: string): boolean -var SearchableEntityList = React.createClass({ +const SearchableEntityList = React.createClass({ displayName: 'SearchableEntityList', propTypes: { @@ -31,7 +31,7 @@ var SearchableEntityList = React.createClass({ onQueryChanged: React.PropTypes.func, // fn(inputText) onSubmit: React.PropTypes.func, // fn(inputText) entities: React.PropTypes.array, - truncateAt: React.PropTypes.number + truncateAt: React.PropTypes.number, }, getDefaultProps: function() { @@ -40,7 +40,7 @@ var SearchableEntityList = React.createClass({ entities: [], emptyQueryShowsAll: false, onSubmit: function() {}, - onQueryChanged: function(input) {} + onQueryChanged: function(input) {}, }; }, @@ -49,14 +49,14 @@ var SearchableEntityList = React.createClass({ query: "", focused: false, truncateAt: this.props.truncateAt, - results: this.getSearchResults("", this.props.entities) + results: this.getSearchResults("", this.props.entities), }; }, componentWillReceiveProps: function(newProps) { // recalculate the search results in case we got new entities this.setState({ - results: this.getSearchResults(this.state.query, newProps.entities) + results: this.getSearchResults(this.state.query, newProps.entities), }); }, @@ -73,17 +73,17 @@ var SearchableEntityList = React.createClass({ setQuery: function(input) { this.setState({ query: input, - results: this.getSearchResults(input, this.props.entities) + results: this.getSearchResults(input, this.props.entities), }); }, onQueryChanged: function(ev) { - var q = ev.target.value; + const q = ev.target.value; this.setState({ query: q, // reset truncation if they back out the entire text truncateAt: (q.length === 0 ? this.props.truncateAt : this.state.truncateAt), - results: this.getSearchResults(q, this.props.entities) + results: this.getSearchResults(q, this.props.entities), }, () => { // invoke the callback AFTER we've flushed the new state. We need to // do this because onQueryChanged can result in new props being passed @@ -110,13 +110,13 @@ var SearchableEntityList = React.createClass({ _showAll: function() { this.setState({ - truncateAt: -1 + truncateAt: -1, }); }, _createOverflowEntity: function(overflowCount, totalCount) { - var EntityTile = sdk.getComponent("rooms.EntityTile"); - var BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); + const EntityTile = sdk.getComponent("rooms.EntityTile"); + const BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); const text = _t("and %(count)s others...", { count: overflowCount }); return ( <EntityTile className="mx_EntityTile_ellipsis" avatarJsx={ @@ -127,7 +127,7 @@ var SearchableEntityList = React.createClass({ }, render: function() { - var inputBox; + let inputBox; if (this.props.showInputBox) { inputBox = ( @@ -136,31 +136,30 @@ var SearchableEntityList = React.createClass({ onChange={this.onQueryChanged} value={this.state.query} onFocus= {() => { this.setState({ focused: true }); }} onBlur= {() => { this.setState({ focused: false }); }} - placeholder={ _t("Search") } /> + placeholder={_t("Search")} /> </form> ); } - var list; + let list; if (this.state.results.length > 1 || this.state.focused) { if (this.props.truncateAt) { // caller wants list truncated - var TruncatedList = sdk.getComponent("elements.TruncatedList"); + const TruncatedList = sdk.getComponent("elements.TruncatedList"); list = ( <TruncatedList className="mx_SearchableEntityList_list" truncateAt={this.state.truncateAt} // use state truncation as it may be expanded createOverflowElement={this._createOverflowEntity}> - {this.state.results.map((entity) => { + { this.state.results.map((entity) => { return entity.getJsx(); - })} + }) } </TruncatedList> ); - } - else { + } else { list = ( <div className="mx_SearchableEntityList_list"> - {this.state.results.map((entity) => { + { this.state.results.map((entity) => { return entity.getJsx(); - })} + }) } </div> ); } @@ -173,13 +172,13 @@ var SearchableEntityList = React.createClass({ } return ( - <div className={ "mx_SearchableEntityList " + (list ? "mx_SearchableEntityList_expanded" : "") }> + <div className={"mx_SearchableEntityList " + (list ? "mx_SearchableEntityList_expanded" : "")}> { inputBox } { list } - { list ? <div className="mx_SearchableEntityList_hrWrapper"><hr/></div> : '' } + { list ? <div className="mx_SearchableEntityList_hrWrapper"><hr /></div> : '' } </div> ); - } + }, }); module.exports = SearchableEntityList; diff --git a/src/components/views/rooms/TopUnreadMessagesBar.js b/src/components/views/rooms/TopUnreadMessagesBar.js index aa1f86483e..c32777abad 100644 --- a/src/components/views/rooms/TopUnreadMessagesBar.js +++ b/src/components/views/rooms/TopUnreadMessagesBar.js @@ -17,9 +17,9 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); import { _t } from '../../../languageHandler'; -var sdk = require('../../../index'); +const sdk = require('../../../index'); module.exports = React.createClass({ displayName: 'TopUnreadMessagesBar', @@ -35,8 +35,8 @@ module.exports = React.createClass({ <div className="mx_TopUnreadMessagesBar_scrollUp" onClick={this.props.onScrollUpClick}> <img src="img/scrollto.svg" width="24" height="24" - alt={ _t('Scroll to unread messages') } - title={ _t('Scroll to unread messages') }/> + alt={_t('Scroll to unread messages')} + title={_t('Scroll to unread messages')} /> { _t("Jump to first unread message.") } </div> <img className="mx_TopUnreadMessagesBar_close mx_filterFlipColor" diff --git a/src/components/views/rooms/UserTile.js b/src/components/views/rooms/UserTile.js index 66d736f3bb..0acc71cf48 100644 --- a/src/components/views/rooms/UserTile.js +++ b/src/components/views/rooms/UserTile.js @@ -16,41 +16,41 @@ limitations under the License. 'use strict'; -var React = require('react'); +const React = require('react'); -var Avatar = require("../../../Avatar"); -var MatrixClientPeg = require('../../../MatrixClientPeg'); -var sdk = require('../../../index'); -var dis = require('../../../dispatcher'); -var Modal = require("../../../Modal"); +const Avatar = require("../../../Avatar"); +const MatrixClientPeg = require('../../../MatrixClientPeg'); +const sdk = require('../../../index'); +const dis = require('../../../dispatcher'); +const Modal = require("../../../Modal"); module.exports = React.createClass({ displayName: 'UserTile', propTypes: { - user: React.PropTypes.any.isRequired // User + user: React.PropTypes.any.isRequired, // User }, render: function() { - var EntityTile = sdk.getComponent("rooms.EntityTile"); - var user = this.props.user; - var name = user.displayName || user.userId; - var active = -1; + const EntityTile = sdk.getComponent("rooms.EntityTile"); + const user = this.props.user; + const name = user.displayName || user.userId; + let active = -1; // FIXME: make presence data update whenever User.presence changes... active = user.lastActiveAgo ? (Date.now() - (user.lastPresenceTs - user.lastActiveAgo)) : -1; - var BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); - var avatarJsx = ( + const BaseAvatar = sdk.getComponent('avatars.BaseAvatar'); + const avatarJsx = ( <BaseAvatar width={36} height={36} name={name} idName={user.userId} - url={ Avatar.avatarUrlForUser(user, 36, 36, "crop") } /> + url={Avatar.avatarUrlForUser(user, 36, 36, "crop")} /> ); return ( <EntityTile {...this.props} presenceState={user.presence} presenceActiveAgo={active} - presenceCurrentlyActive={ user.currentlyActive } + presenceCurrentlyActive={user.currentlyActive} name={name} title={user.userId} avatarJsx={avatarJsx} /> ); - } + }, }); diff --git a/src/components/views/settings/AddPhoneNumber.js b/src/components/views/settings/AddPhoneNumber.js index 16e768a23f..10264c0d75 100644 --- a/src/components/views/settings/AddPhoneNumber.js +++ b/src/components/views/settings/AddPhoneNumber.js @@ -81,7 +81,7 @@ export default withMatrixClient(React.createClass({ this._promptForMsisdnVerificationCode(resp.msisdn); }).catch((err) => { console.error("Unable to add phone number: " + err); - let msg = err.message; + const msg = err.message; Modal.createTrackedDialog('Add Phone Number Error', '', ErrorDialog, { title: _t("Error"), description: msg, @@ -94,22 +94,22 @@ export default withMatrixClient(React.createClass({ this.setState({msisdn_add_pending: true}); }, - _promptForMsisdnVerificationCode:function (msisdn, err) { + _promptForMsisdnVerificationCode: function(msisdn, err) { if (this._unmounted) return; const TextInputDialog = sdk.getComponent("dialogs.TextInputDialog"); - let msgElements = [ - <div key="_static" >{ _t("A text message has been sent to +%(msisdn)s. Please enter the verification code it contains", { msisdn: msisdn} ) }</div> + const msgElements = [ + <div key="_static" >{ _t("A text message has been sent to +%(msisdn)s. Please enter the verification code it contains", { msisdn: msisdn} ) }</div>, ]; if (err) { let msg = err.error; if (err.errcode == 'M_THREEPID_AUTH_FAILED') { msg = _t("Incorrect verification code"); } - msgElements.push(<div key="_error" className="error">{msg}</div>); + msgElements.push(<div key="_error" className="error">{ msg }</div>); } Modal.createTrackedDialog('Prompt for MSISDN Verification Code', '', TextInputDialog, { title: _t("Enter Code"), - description: <div>{msgElements}</div>, + description: <div>{ msgElements }</div>, button: _t("Submit"), onFinished: (should_verify, token) => { if (!should_verify) { @@ -128,7 +128,7 @@ export default withMatrixClient(React.createClass({ if (this._unmounted) return; this.setState({msisdn_add_pending: false}); }).done(); - } + }, }); }, @@ -146,7 +146,7 @@ export default withMatrixClient(React.createClass({ return ( <form className="mx_UserSettings_profileTableRow" onSubmit={this._onAddMsisdnSubmit}> <div className="mx_UserSettings_profileLabelCell"> - <label>{_t('Phone')}</label> + <label>{ _t('Phone') }</label> </div> <div className="mx_UserSettings_profileInputCell"> <div className="mx_UserSettings_phoneSection"> @@ -158,7 +158,7 @@ export default withMatrixClient(React.createClass({ <input type="text" ref={this._collectAddMsisdnInput} className="mx_UserSettings_phoneNumberField" - placeholder={ _t('Add phone number') } + placeholder={_t('Add phone number')} value={this.state.phoneNumber} onChange={this._onPhoneNumberChange} /> @@ -169,5 +169,5 @@ export default withMatrixClient(React.createClass({ </div> </form> ); - } -})) + }, +})); diff --git a/src/components/views/settings/ChangeAvatar.js b/src/components/views/settings/ChangeAvatar.js index ae6f1957b8..b3204ab86e 100644 --- a/src/components/views/settings/ChangeAvatar.js +++ b/src/components/views/settings/ChangeAvatar.js @@ -14,9 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require('react'); -var MatrixClientPeg = require("../../../MatrixClientPeg"); -var sdk = require('../../../index'); +const React = require('react'); +const MatrixClientPeg = require("../../../MatrixClientPeg"); +const sdk = require('../../../index'); import { _t } from '../../../languageHandler'; module.exports = React.createClass({ @@ -28,7 +28,7 @@ module.exports = React.createClass({ showUploadSection: React.PropTypes.bool, width: React.PropTypes.number, height: React.PropTypes.number, - className: React.PropTypes.string + className: React.PropTypes.string, }, Phases: { @@ -59,25 +59,25 @@ module.exports = React.createClass({ return; } this.setState({ - avatarUrl: newProps.initialAvatarUrl + avatarUrl: newProps.initialAvatarUrl, }); }, setAvatarFromFile: function(file) { - var newUrl = null; + let newUrl = null; this.setState({ - phase: this.Phases.Uploading + phase: this.Phases.Uploading, }); - var self = this; - var httpPromise = MatrixClientPeg.get().uploadContent(file).then(function(url) { + const self = this; + const httpPromise = MatrixClientPeg.get().uploadContent(file).then(function(url) { newUrl = url; if (self.props.room) { return MatrixClientPeg.get().sendStateEvent( self.props.room.roomId, 'm.room.avatar', {url: url}, - '' + '', ); } else { return MatrixClientPeg.get().setAvatarUrl(url); @@ -87,11 +87,11 @@ module.exports = React.createClass({ httpPromise.done(function() { self.setState({ phase: self.Phases.Display, - avatarUrl: MatrixClientPeg.get().mxcUrlToHttp(newUrl) + avatarUrl: MatrixClientPeg.get().mxcUrlToHttp(newUrl), }); }, function(error) { self.setState({ - phase: self.Phases.Error + phase: self.Phases.Error, }); self.onError(error); }); @@ -106,31 +106,31 @@ module.exports = React.createClass({ onError: function(error) { this.setState({ - errorText: _t("Failed to upload profile picture!") + errorText: _t("Failed to upload profile picture!"), }); }, render: function() { - var avatarImg; + let avatarImg; // Having just set an avatar we just display that since it will take a little // time to propagate through to the RoomAvatar. if (this.props.room && !this.avatarSet) { - var RoomAvatar = sdk.getComponent('avatars.RoomAvatar'); - avatarImg = <RoomAvatar room={this.props.room} width={ this.props.width } height={ this.props.height } resizeMethod='crop' />; + const RoomAvatar = sdk.getComponent('avatars.RoomAvatar'); + avatarImg = <RoomAvatar room={this.props.room} width={this.props.width} height={this.props.height} resizeMethod='crop' />; } else { - var BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); + const BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); // XXX: FIXME: once we track in the JS what our own displayname is(!) then use it here rather than ? avatarImg = <BaseAvatar width={this.props.width} height={this.props.height} resizeMethod='crop' - name='?' idName={ MatrixClientPeg.get().getUserIdLocalpart() } url={this.state.avatarUrl} />; + name='?' idName={MatrixClientPeg.get().getUserIdLocalpart()} url={this.state.avatarUrl} />; } - var uploadSection; + let uploadSection; if (this.props.showUploadSection) { uploadSection = ( <div className={this.props.className}> - {_t("Upload new:")} - <input type="file" accept="image/*" onChange={this.onFileSelected}/> - {this.state.errorText} + { _t("Upload new:") } + <input type="file" accept="image/*" onChange={this.onFileSelected} /> + { this.state.errorText } </div> ); } @@ -141,9 +141,9 @@ module.exports = React.createClass({ return ( <div> <div className={this.props.className}> - {avatarImg} + { avatarImg } </div> - {uploadSection} + { uploadSection } </div> ); case this.Phases.Uploading: @@ -152,5 +152,5 @@ module.exports = React.createClass({ <Loader /> ); } - } + }, }); diff --git a/src/components/views/settings/ChangeDisplayName.js b/src/components/views/settings/ChangeDisplayName.js index 36865c37b0..a74e223349 100644 --- a/src/components/views/settings/ChangeDisplayName.js +++ b/src/components/views/settings/ChangeDisplayName.js @@ -15,23 +15,22 @@ limitations under the License. */ 'use strict'; -var React = require('react'); -var sdk = require('../../../index'); -var MatrixClientPeg = require("../../../MatrixClientPeg"); +const React = require('react'); +const sdk = require('../../../index'); +const MatrixClientPeg = require("../../../MatrixClientPeg"); import { _t } from '../../../languageHandler'; module.exports = React.createClass({ displayName: 'ChangeDisplayName', _getDisplayName: function() { - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); return cli.getProfileInfo(cli.credentials.userId).then(function(result) { - var displayname = result.displayname; + let displayname = result.displayname; if (!displayname) { if (MatrixClientPeg.get().isGuest()) { displayname = "Guest " + MatrixClientPeg.get().getUserIdLocalpart(); - } - else { + } else { displayname = MatrixClientPeg.get().getUserIdLocalpart(); } } @@ -42,14 +41,14 @@ module.exports = React.createClass({ }, _changeDisplayName: function(new_displayname) { - var cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.get(); return cli.setDisplayName(new_displayname).catch(function(e) { throw new Error("Failed to set display name"); }); }, render: function() { - var EditableTextContainer = sdk.getComponent('elements.EditableTextContainer'); + const EditableTextContainer = sdk.getComponent('elements.EditableTextContainer'); return ( <EditableTextContainer getInitialValue={this._getDisplayName} @@ -57,5 +56,5 @@ module.exports = React.createClass({ blurToSubmit={true} onSubmit={this._changeDisplayName} /> ); - } + }, }); diff --git a/src/components/views/settings/ChangePassword.js b/src/components/views/settings/ChangePassword.js index 4fbae4b263..cb49048a3b 100644 --- a/src/components/views/settings/ChangePassword.js +++ b/src/components/views/settings/ChangePassword.js @@ -16,10 +16,10 @@ limitations under the License. 'use strict'; -var React = require('react'); -var MatrixClientPeg = require("../../../MatrixClientPeg"); -var Modal = require("../../../Modal"); -var sdk = require("../../../index"); +const React = require('react'); +const MatrixClientPeg = require("../../../MatrixClientPeg"); +const Modal = require("../../../Modal"); +const sdk = require("../../../index"); import Promise from 'bluebird'; import AccessibleButton from '../elements/AccessibleButton'; @@ -45,7 +45,7 @@ module.exports = React.createClass({ Phases: { Edit: "edit", Uploading: "uploading", - Error: "error" + Error: "error", }, getDefaultProps: function() { @@ -55,11 +55,11 @@ module.exports = React.createClass({ onCheckPassword: function(oldPass, newPass, confirmPass) { if (newPass !== confirmPass) { return { - error: _t("New passwords don't match") + error: _t("New passwords don't match"), }; } else if (!newPass || newPass.length === 0) { return { - error: _t("Passwords can't be empty") + error: _t("Passwords can't be empty"), }; } }, @@ -112,7 +112,7 @@ module.exports = React.createClass({ 'Changing password will currently reset any end-to-end encryption keys on all devices, ' + 'making encrypted chat history unreadable, unless you first export your room keys ' + 'and re-import them afterwards. ' + - 'In future this will be improved.' + 'In future this will be improved.', ) } (<a href="https://github.com/vector-im/riot-web/issues/2671">https://github.com/vector-im/riot-web/issues/2671</a>) </div>, button: _t("Continue"), @@ -120,7 +120,7 @@ module.exports = React.createClass({ <button className="mx_Dialog_primary" onClick={this._onExportE2eKeysClicked}> { _t('Export E2E room keys') } - </button> + </button>, ], onFinished: (confirmed) => { if (confirmed) { @@ -254,5 +254,5 @@ module.exports = React.createClass({ </div> ); } - } + }, }); diff --git a/src/components/views/settings/DevicesPanel.js b/src/components/views/settings/DevicesPanel.js index d10f17a40e..1484dd98ba 100644 --- a/src/components/views/settings/DevicesPanel.js +++ b/src/components/views/settings/DevicesPanel.js @@ -52,7 +52,7 @@ export default class DevicesPanel extends React.Component { }, (error) => { if (this._unmounted) { return; } - var errtxt; + let errtxt; if (error.httpStatus == 404) { // 404 probably means the HS doesn't yet support the API. errtxt = _t("Your home server does not support device management."); @@ -61,7 +61,7 @@ export default class DevicesPanel extends React.Component { errtxt = _t("Unable to load device list"); } this.setState({deviceLoadError: errtxt}); - } + }, ); } @@ -89,14 +89,14 @@ export default class DevicesPanel extends React.Component { const removed_id = device.device_id; this.setState((state, props) => { const newDevices = state.devices.filter( - d => { return d.device_id != removed_id; } + (d) => { return d.device_id != removed_id; }, ); return { devices: newDevices }; }); } _renderDevice(device) { - var DevicesPanelEntry = sdk.getComponent('settings.DevicesPanelEntry'); + const DevicesPanelEntry = sdk.getComponent('settings.DevicesPanelEntry'); return ( <DevicesPanelEntry key={device.device_id} device={device} onDeleted={()=>{this._onDeviceDeleted(device);}} /> @@ -110,7 +110,7 @@ export default class DevicesPanel extends React.Component { const classes = classNames(this.props.className, "error"); return ( <div className={classes}> - {this.state.deviceLoadError} + { this.state.deviceLoadError } </div> ); } @@ -119,7 +119,7 @@ export default class DevicesPanel extends React.Component { if (devices === undefined) { // still loading const classes = this.props.className; - return <Spinner className={classes}/>; + return <Spinner className={classes} />; } devices.sort(this._deviceCompare); @@ -128,12 +128,12 @@ export default class DevicesPanel extends React.Component { return ( <div className={classes}> <div className="mx_DevicesPanel_header"> - <div className="mx_DevicesPanel_deviceId">{_t("Device ID")}</div> - <div className="mx_DevicesPanel_deviceName">{_t("Device Name")}</div> - <div className="mx_DevicesPanel_deviceLastSeen">{_t("Last seen")}</div> + <div className="mx_DevicesPanel_deviceId">{ _t("Device ID") }</div> + <div className="mx_DevicesPanel_deviceName">{ _t("Device Name") }</div> + <div className="mx_DevicesPanel_deviceLastSeen">{ _t("Last seen") }</div> <div className="mx_DevicesPanel_deviceButtons"></div> </div> - {devices.map(this._renderDevice)} + { devices.map(this._renderDevice) } </div> ); } diff --git a/src/components/views/settings/DevicesPanelEntry.js b/src/components/views/settings/DevicesPanelEntry.js index aa5a4f88a3..b8bef2649e 100644 --- a/src/components/views/settings/DevicesPanelEntry.js +++ b/src/components/views/settings/DevicesPanelEntry.js @@ -69,7 +69,7 @@ export default class DevicesPanelEntry extends React.Component { } // pop up an interactive auth dialog - var InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); + const InteractiveAuthDialog = sdk.getComponent("dialogs.InteractiveAuthDialog"); Modal.createTrackedDialog('Delete Device Dialog', '', InteractiveAuthDialog, { title: _t("Authentication"), @@ -101,7 +101,7 @@ export default class DevicesPanelEntry extends React.Component { this.props.onDeleted(); if (this._unmounted) { return; } this.setState({ deleting: false }); - } + }, ); } @@ -129,7 +129,7 @@ export default class DevicesPanelEntry extends React.Component { let deleteButton; if (this.state.deleteError) { - deleteButton = <div className="error">{this.state.deleteError}</div>; + deleteButton = <div className="error">{ this.state.deleteError }</div>; } else { deleteButton = ( <div className="mx_textButton" @@ -139,15 +139,15 @@ export default class DevicesPanelEntry extends React.Component { ); } - var myDeviceClass = ''; + let myDeviceClass = ''; if (device.device_id === MatrixClientPeg.get().getDeviceId()) { myDeviceClass = " mx_DevicesPanel_myDevice"; } return ( - <div className={ "mx_DevicesPanel_device" + myDeviceClass }> + <div className={"mx_DevicesPanel_device" + myDeviceClass}> <div className="mx_DevicesPanel_deviceId"> - {device.device_id} + { device.device_id } </div> <div className="mx_DevicesPanel_deviceName"> <EditableTextContainer initialValue={device.display_name} @@ -156,10 +156,10 @@ export default class DevicesPanelEntry extends React.Component { /> </div> <div className="mx_DevicesPanel_lastSeen"> - {lastSeen} + { lastSeen } </div> <div className="mx_DevicesPanel_deviceButtons"> - {deleteButton} + { deleteButton } </div> </div> ); diff --git a/src/components/views/settings/EnableNotificationsButton.js b/src/components/views/settings/EnableNotificationsButton.js index f1b1f12c2a..c2f801b60a 100644 --- a/src/components/views/settings/EnableNotificationsButton.js +++ b/src/components/views/settings/EnableNotificationsButton.js @@ -15,9 +15,9 @@ limitations under the License. */ 'use strict'; -var React = require("react"); -var Notifier = require("../../../Notifier"); -var dis = require("../../../dispatcher"); +const React = require("react"); +const Notifier = require("../../../Notifier"); +const dis = require("../../../dispatcher"); import { _t } from '../../../languageHandler'; module.exports = React.createClass({ @@ -43,7 +43,7 @@ module.exports = React.createClass({ }, onClick: function() { - var self = this; + const self = this; if (!Notifier.supportsDesktopNotifications()) { return; } @@ -61,15 +61,15 @@ module.exports = React.createClass({ if (this.enabled()) { return ( <button className="mx_EnableNotificationsButton" onClick={this.onClick}> - {_t("Disable Notifications")} + { _t("Disable Notifications") } </button> ); } else { return ( <button className="mx_EnableNotificationsButton" onClick={this.onClick}> - {_t("Enable Notifications")} + { _t("Enable Notifications") } </button> ); } - } + }, }); diff --git a/src/languageHandler.js b/src/languageHandler.js index 12242a2e15..b2fc65c46d 100644 --- a/src/languageHandler.js +++ b/src/languageHandler.js @@ -100,26 +100,26 @@ export function _tJsx(jsxText, patterns, subs) { throw new Error(`_tJsx: programmer error. expected number of RegExps == number of Functions: ${subs.length} != ${patterns.length}`); } for (let i = 0; i < subs.length; i++) { - if (!patterns[i] instanceof RegExp) { + if (!(patterns[i] instanceof RegExp)) { throw new Error(`_tJsx: programmer error. expected RegExp for text: ${jsxText}`); } - if (!subs[i] instanceof Function) { + if (!(subs[i] instanceof Function)) { throw new Error(`_tJsx: programmer error. expected Function for text: ${jsxText}`); } } // The translation returns text so there's no XSS vector here (no unsafe HTML, no code execution) const tJsxText = _t(jsxText); - let output = [tJsxText]; + const output = [tJsxText]; for (let i = 0; i < patterns.length; i++) { // convert the last element in 'output' into 3 elements (pre-text, sub function, post-text). // Rinse and repeat for other patterns (using post-text). - let inputText = output.pop(); - let match = inputText.match(patterns[i]); + const inputText = output.pop(); + const match = inputText.match(patterns[i]); if (!match) { throw new Error(`_tJsx: translator error. expected translation to match regexp: ${patterns[i]}`); } - let capturedGroups = match.slice(1); + const capturedGroups = match.slice(1); // Return the raw translation before the *match* followed by the return value of sub() followed // by the raw translation after the *match* (not captured group). @@ -159,7 +159,7 @@ export function setLanguage(preferredLangs) { } if (!langToUse) { // Fallback to en_EN if none is found - langToUse = 'en' + langToUse = 'en'; console.error("Unable to find an appropriate language"); } @@ -177,16 +177,16 @@ export function setLanguage(preferredLangs) { }).then((langData) => { if (langData) counterpart.registerTranslations('en', langData); }); -}; +} export function getAllLanguagesFromJson() { return getLangsJson().then((langsObject) => { - var langs = []; - for (var langKey in langsObject) { + const langs = []; + for (const langKey in langsObject) { if (langsObject.hasOwnProperty(langKey)) { langs.push({ 'value': langKey, - 'label': langsObject[langKey].label + 'label': langsObject[langKey].label, }); } } @@ -222,15 +222,15 @@ export function getNormalizedLanguageKeys(language) { } } return languageKeys; -}; +} /** * Returns a language string with underscores replaced with * hyphens, and lowercased. */ export function normalizeLanguageKey(language) { - return language.toLowerCase().replace("_","-"); -}; + return language.toLowerCase().replace("_", "-"); +} export function getCurrentLanguage() { return counterpart.getLocale(); @@ -246,7 +246,7 @@ function getLangsJson() { return; } resolve(JSON.parse(body)); - } + }, ); }); } @@ -261,7 +261,7 @@ function getLanguage(langPath) { return; } resolve(JSON.parse(body)); - } + }, ); }); } diff --git a/src/linkify-matrix.js b/src/linkify-matrix.js index e395b7986e..74489a09ea 100644 --- a/src/linkify-matrix.js +++ b/src/linkify-matrix.js @@ -16,31 +16,31 @@ limitations under the License. function matrixLinkify(linkify) { // Text tokens - var TT = linkify.scanner.TOKENS; + const TT = linkify.scanner.TOKENS; // Multi tokens - var MT = linkify.parser.TOKENS; - var MultiToken = MT.Base; - var S_START = linkify.parser.start; + const MT = linkify.parser.TOKENS; + const MultiToken = MT.Base; + const S_START = linkify.parser.start; if (TT.UNDERSCORE === undefined) { throw new Error("linkify-matrix requires linkifyjs 2.1.1: this version is too old."); } - var ROOMALIAS = function(value) { + const ROOMALIAS = function(value) { MultiToken.call(this, value); this.type = 'roomalias'; this.isLink = true; }; ROOMALIAS.prototype = new MultiToken(); - var S_HASH = new linkify.parser.State(); - var S_HASH_NAME = new linkify.parser.State(); - var S_HASH_NAME_COLON = new linkify.parser.State(); - var S_HASH_NAME_COLON_DOMAIN = new linkify.parser.State(); - var S_HASH_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); - var S_ROOMALIAS = new linkify.parser.State(ROOMALIAS); + const S_HASH = new linkify.parser.State(); + const S_HASH_NAME = new linkify.parser.State(); + const S_HASH_NAME_COLON = new linkify.parser.State(); + const S_HASH_NAME_COLON_DOMAIN = new linkify.parser.State(); + const S_HASH_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); + const S_ROOMALIAS = new linkify.parser.State(ROOMALIAS); - var roomname_tokens = [ + const roomname_tokens = [ TT.DOT, TT.PLUS, TT.NUM, @@ -69,21 +69,21 @@ function matrixLinkify(linkify) { S_HASH_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_ROOMALIAS); - var USERID = function(value) { + const USERID = function(value) { MultiToken.call(this, value); this.type = 'userid'; this.isLink = true; }; USERID.prototype = new MultiToken(); - var S_AT = new linkify.parser.State(); - var S_AT_NAME = new linkify.parser.State(); - var S_AT_NAME_COLON = new linkify.parser.State(); - var S_AT_NAME_COLON_DOMAIN = new linkify.parser.State(); - var S_AT_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); - var S_USERID = new linkify.parser.State(USERID); + const S_AT = new linkify.parser.State(); + const S_AT_NAME = new linkify.parser.State(); + const S_AT_NAME_COLON = new linkify.parser.State(); + const S_AT_NAME_COLON_DOMAIN = new linkify.parser.State(); + const S_AT_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); + const S_USERID = new linkify.parser.State(USERID); - var username_tokens = [ + const username_tokens = [ TT.DOT, TT.UNDERSCORE, TT.PLUS, @@ -110,21 +110,21 @@ function matrixLinkify(linkify) { S_AT_NAME_COLON_DOMAIN_DOT.on(TT.TLD, S_USERID); - var GROUPID = function(value) { + const GROUPID = function(value) { MultiToken.call(this, value); this.type = 'groupid'; this.isLink = true; }; GROUPID.prototype = new MultiToken(); - var S_PLUS = new linkify.parser.State(); - var S_PLUS_NAME = new linkify.parser.State(); - var S_PLUS_NAME_COLON = new linkify.parser.State(); - var S_PLUS_NAME_COLON_DOMAIN = new linkify.parser.State(); - var S_PLUS_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); - var S_GROUPID = new linkify.parser.State(GROUPID); + const S_PLUS = new linkify.parser.State(); + const S_PLUS_NAME = new linkify.parser.State(); + const S_PLUS_NAME_COLON = new linkify.parser.State(); + const S_PLUS_NAME_COLON_DOMAIN = new linkify.parser.State(); + const S_PLUS_NAME_COLON_DOMAIN_DOT = new linkify.parser.State(); + const S_GROUPID = new linkify.parser.State(GROUPID); - var groupid_tokens = [ + const groupid_tokens = [ TT.DOT, TT.UNDERSCORE, TT.PLUS, @@ -156,7 +156,7 @@ matrixLinkify.onUserClick = function(e, userId) { e.preventDefault(); }; matrixLinkify.onAliasClick = function(e, roomAlias) { e.preventDefault(); }; matrixLinkify.onGroupClick = function(e, groupId) { e.preventDefault(); }; -var escapeRegExp = function(string) { +const escapeRegExp = function(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); }; @@ -179,19 +179,19 @@ matrixLinkify.options = { return { click: function(e) { matrixLinkify.onUserClick(e, href); - } + }, }; case "roomalias": return { click: function(e) { matrixLinkify.onAliasClick(e, href); - } + }, }; case "groupid": return { click: function(e) { matrixLinkify.onGroupClick(e, href); - } + }, }; } }, @@ -211,11 +211,10 @@ matrixLinkify.options = { } m = href.match(matrixLinkify.MATRIXTO_URL_PATTERN); if (m) { - var entity = m[1]; + const entity = m[1]; if (entity[0] === '@') { return '#/user/' + entity; - } - else if (entity[0] === '#' || entity[0] === '!') { + } else if (entity[0] === '#' || entity[0] === '!') { return '#/room/' + entity; } } @@ -231,11 +230,9 @@ matrixLinkify.options = { target: function(href, type) { if (type === 'url') { if (href.match(matrixLinkify.VECTOR_URL_PATTERN) || - href.match(matrixLinkify.MATRIXTO_URL_PATTERN)) - { + href.match(matrixLinkify.MATRIXTO_URL_PATTERN)) { return null; - } - else { + } else { return '_blank'; } } diff --git a/src/ratelimitedfunc.js b/src/ratelimitedfunc.js index a9e8a4cab2..d8c30f5d03 100644 --- a/src/ratelimitedfunc.js +++ b/src/ratelimitedfunc.js @@ -29,9 +29,9 @@ module.exports = function(f, minIntervalMs) { this.lastCall = 0; this.scheduledCall = undefined; - var self = this; - var wrapper = function() { - var now = Date.now(); + const self = this; + const wrapper = function() { + const now = Date.now(); if (self.lastCall < now - minIntervalMs) { f.apply(this); @@ -43,7 +43,7 @@ module.exports = function(f, minIntervalMs) { f.apply(this); self.lastCall = now; }, - (self.lastCall + minIntervalMs) - now + (self.lastCall + minIntervalMs) - now, ); } }; @@ -58,9 +58,9 @@ module.exports = function(f, minIntervalMs) { // make sure that cancelPendingCall is copied when react rebinds the // wrapper - var _bind = wrapper.bind; + const _bind = wrapper.bind; wrapper.bind = function() { - var rebound = _bind.apply(this, arguments); + const rebound = _bind.apply(this, arguments); rebound.cancelPendingCall = wrapper.cancelPendingCall; return rebound; }; diff --git a/src/utils/DecryptFile.js b/src/utils/DecryptFile.js index 04496e4204..cb5e407407 100644 --- a/src/utils/DecryptFile.js +++ b/src/utils/DecryptFile.js @@ -28,8 +28,8 @@ import Promise from 'bluebird'; * @return {Promise} A promise that resolves with the data:// URI. */ export function readBlobAsDataUri(file) { - var deferred = Promise.defer(); - var reader = new FileReader(); + const deferred = Promise.defer(); + const reader = new FileReader(); reader.onload = function(e) { deferred.resolve(e.target.result); }; @@ -61,7 +61,7 @@ export function decryptFile(file) { return encrypt.decryptAttachment(responseData, file); }).then(function(dataArray) { // Turn the array into a Blob and give it the correct MIME-type. - var blob = new Blob([dataArray], {type: file.mimetype}); + const blob = new Blob([dataArray], {type: file.mimetype}); return blob; }); } diff --git a/src/utils/Receipt.js b/src/utils/Receipt.js index 549a0fd8b3..04bd4a4d8f 100644 --- a/src/utils/Receipt.js +++ b/src/utils/Receipt.js @@ -20,9 +20,9 @@ limitations under the License. * receipt exists. */ export function findReadReceiptFromUserId(receiptEvent, userId) { - var receiptKeys = Object.keys(receiptEvent.getContent()); - for (var i = 0; i < receiptKeys.length; ++i) { - var rcpt = receiptEvent.getContent()[receiptKeys[i]]; + const receiptKeys = Object.keys(receiptEvent.getContent()); + for (let i = 0; i < receiptKeys.length; ++i) { + const rcpt = receiptEvent.getContent()[receiptKeys[i]]; if (rcpt['m.read'] && rcpt['m.read'][userId]) { return rcpt; } diff --git a/test/all-tests.js b/test/all-tests.js index 6e604f84ad..1d4d36ebfd 100644 --- a/test/all-tests.js +++ b/test/all-tests.js @@ -3,5 +3,5 @@ // Our master test file: uses the webpack require API to find our test files // and run them -var context = require.context('.', true, /-test\.jsx?$/); +const context = require.context('.', true, /-test\.jsx?$/); context.keys().forEach(context); diff --git a/test/components/structures/MessagePanel-test.js b/test/components/structures/MessagePanel-test.js index 8254dd4126..4de3b7626d 100644 --- a/test/components/structures/MessagePanel-test.js +++ b/test/components/structures/MessagePanel-test.js @@ -14,22 +14,22 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require('react'); -var ReactDOM = require("react-dom"); -var TestUtils = require('react-addons-test-utils'); -var expect = require('expect'); +const React = require('react'); +const ReactDOM = require("react-dom"); +const TestUtils = require('react-addons-test-utils'); +const expect = require('expect'); import sinon from 'sinon'; -var sdk = require('matrix-react-sdk'); +const sdk = require('matrix-react-sdk'); -var MessagePanel = sdk.getComponent('structures.MessagePanel'); +const MessagePanel = sdk.getComponent('structures.MessagePanel'); import UserSettingsStore from '../../../src/UserSettingsStore'; import MatrixClientPeg from '../../../src/MatrixClientPeg'; -var test_utils = require('test-utils'); -var mockclock = require('mock-clock'); +const test_utils = require('test-utils'); +const mockclock = require('mock-clock'); -var client; +let client; // wrap MessagePanel with a component which provides the MatrixClient in the context. const WrappedMessagePanel = React.createClass({ @@ -48,11 +48,11 @@ const WrappedMessagePanel = React.createClass({ }, }); -describe('MessagePanel', function () { - var clock = mockclock.clock(); - var realSetTimeout = window.setTimeout; - var events = mkEvents(); - var sandbox = null; +describe('MessagePanel', function() { + const clock = mockclock.clock(); + const realSetTimeout = window.setTimeout; + const events = mkEvents(); + let sandbox = null; beforeEach(function() { test_utils.beforeEach(this); @@ -68,9 +68,9 @@ describe('MessagePanel', function () { }); function mkEvents() { - var events = []; - var ts0 = Date.now(); - for (var i = 0; i < 10; i++) { + const events = []; + const ts0 = Date.now(); + for (let i = 0; i < 10; i++) { events.push(test_utils.mkMessage( { event: true, room: "!room:id", user: "@user:id", @@ -81,30 +81,30 @@ describe('MessagePanel', function () { } it('should show the events', function() { - var res = TestUtils.renderIntoDocument( - <WrappedMessagePanel className="cls" events={events} /> + const res = TestUtils.renderIntoDocument( + <WrappedMessagePanel className="cls" events={events} />, ); // just check we have the right number of tiles for now - var tiles = TestUtils.scryRenderedComponentsWithType( + const tiles = TestUtils.scryRenderedComponentsWithType( res, sdk.getComponent('rooms.EventTile')); expect(tiles.length).toEqual(10); }); it('should show the read-marker in the right place', function() { - var res = TestUtils.renderIntoDocument( + const res = TestUtils.renderIntoDocument( <WrappedMessagePanel className="cls" events={events} readMarkerEventId={events[4].getId()} - readMarkerVisible={true} /> + readMarkerVisible={true} />, ); - var tiles = TestUtils.scryRenderedComponentsWithType( + const tiles = TestUtils.scryRenderedComponentsWithType( res, sdk.getComponent('rooms.EventTile')); // find the <li> which wraps the read marker - var rm = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_RoomView_myReadMarker_container'); + const rm = TestUtils.findRenderedDOMComponentWithClass(res, 'mx_RoomView_myReadMarker_container'); // it should follow the <li> which wraps the event tile for event 4 - var eventContainer = ReactDOM.findDOMNode(tiles[4]).parentNode; + const eventContainer = ReactDOM.findDOMNode(tiles[4]).parentNode; expect(rm.previousSibling).toEqual(eventContainer); }); @@ -113,22 +113,22 @@ describe('MessagePanel', function () { clock.install(); clock.mockDate(); - var parentDiv = document.createElement('div'); + const parentDiv = document.createElement('div'); // first render with the RM in one place - var mp = ReactDOM.render( + let mp = ReactDOM.render( <WrappedMessagePanel className="cls" events={events} readMarkerEventId={events[4].getId()} readMarkerVisible={true} />, parentDiv); - var tiles = TestUtils.scryRenderedComponentsWithType( + const tiles = TestUtils.scryRenderedComponentsWithType( mp, sdk.getComponent('rooms.EventTile')); - var tileContainers = tiles.map(function (t) { + const tileContainers = tiles.map(function(t) { return ReactDOM.findDOMNode(t).parentNode; }); // find the <li> which wraps the read marker - var rm = TestUtils.findRenderedDOMComponentWithClass(mp, 'mx_RoomView_myReadMarker_container'); + const rm = TestUtils.findRenderedDOMComponentWithClass(mp, 'mx_RoomView_myReadMarker_container'); expect(rm.previousSibling).toEqual(tileContainers[4]); // now move the RM @@ -138,12 +138,12 @@ describe('MessagePanel', function () { />, parentDiv); // now there should be two RM containers - var found = TestUtils.scryRenderedDOMComponentsWithClass(mp, 'mx_RoomView_myReadMarker_container'); + const found = TestUtils.scryRenderedDOMComponentsWithClass(mp, 'mx_RoomView_myReadMarker_container'); expect(found.length).toEqual(2); // the first should be the ghost expect(found[0].previousSibling).toEqual(tileContainers[4]); - var hr = found[0].children[0]; + const hr = found[0].children[0]; // the second should be the real thing expect(found[1].previousSibling).toEqual(tileContainers[6]); @@ -164,17 +164,17 @@ describe('MessagePanel', function () { }); it('shows only one ghost when the RM moves twice', function() { - var parentDiv = document.createElement('div'); + const parentDiv = document.createElement('div'); // first render with the RM in one place - var mp = ReactDOM.render( + let mp = ReactDOM.render( <WrappedMessagePanel className="cls" events={events} readMarkerEventId={events[4].getId()} readMarkerVisible={true} />, parentDiv); - var tiles = TestUtils.scryRenderedComponentsWithType( + const tiles = TestUtils.scryRenderedComponentsWithType( mp, sdk.getComponent('rooms.EventTile')); - var tileContainers = tiles.map(function (t) { + const tileContainers = tiles.map(function(t) { return ReactDOM.findDOMNode(t).parentNode; }); @@ -185,7 +185,7 @@ describe('MessagePanel', function () { />, parentDiv); // now there should be two RM containers - var found = TestUtils.scryRenderedDOMComponentsWithClass(mp, 'mx_RoomView_myReadMarker_container'); + let found = TestUtils.scryRenderedDOMComponentsWithClass(mp, 'mx_RoomView_myReadMarker_container'); expect(found.length).toEqual(2); // the first should be the ghost diff --git a/test/components/structures/ScrollPanel-test.js b/test/components/structures/ScrollPanel-test.js index e7d3d7b0e6..0e091cdddf 100644 --- a/test/components/structures/ScrollPanel-test.js +++ b/test/components/structures/ScrollPanel-test.js @@ -14,18 +14,18 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require('react'); -var ReactDOM = require("react-dom"); -var ReactTestUtils = require('react-addons-test-utils'); -var expect = require('expect'); +const React = require('react'); +const ReactDOM = require("react-dom"); +const ReactTestUtils = require('react-addons-test-utils'); +const expect = require('expect'); import Promise from 'bluebird'; -var sdk = require('matrix-react-sdk'); +const sdk = require('matrix-react-sdk'); -var ScrollPanel = sdk.getComponent('structures.ScrollPanel'); -var test_utils = require('test-utils'); +const ScrollPanel = sdk.getComponent('structures.ScrollPanel'); +const test_utils = require('test-utils'); -var Tester = React.createClass({ +const Tester = React.createClass({ getInitialState: function() { return { tileKeys: [], @@ -43,18 +43,18 @@ var Tester = React.createClass({ }, _onFillRequest: function(back) { - var dir = back ? 'b': 'f'; + const dir = back ? 'b': 'f'; console.log("FillRequest: " + dir); this.fillCounts[dir]++; - var handler = this._fillHandlers[dir]; - var defer = this._fillDefers[dir]; + const handler = this._fillHandlers[dir]; + const defer = this._fillDefers[dir]; // don't use the same handler twice this._fillHandlers[dir] = null; this._fillDefers[dir] = null; - var res; + let res; if (handler) { res = handler(); } else { @@ -74,17 +74,17 @@ var Tester = React.createClass({ /* returns a promise which will resolve when the fill happens */ awaitFill: function(dir) { console.log("ScrollPanel Tester: awaiting " + dir + " fill"); - var defer = Promise.defer(); + const defer = Promise.defer(); this._fillDefers[dir] = defer; return defer.promise; }, _onScroll: function(ev) { - var st = ev.target.scrollTop; + const st = ev.target.scrollTop; console.log("ScrollPanel Tester: scroll event; scrollTop: " + st); this.lastScrollEvent = st; - var d = this._scrollDefer; + const d = this._scrollDefer; if (d) { this._scrollDefer = null; d.resolve(); @@ -118,29 +118,29 @@ var Tester = React.createClass({ <li key={key} data-scroll-tokens={key}> <div style={{height: '98px', margin: '50px', border: '1px solid black', backgroundColor: '#fff8dc' }}> - {key} + { key } </div> </li> ); }, render: function() { - var tiles = this.state.tileKeys.map(this._mkTile); + const tiles = this.state.tileKeys.map(this._mkTile); console.log("rendering with " + tiles.length + " tiles"); return ( <ScrollPanel ref="sp" - onScroll={ this._onScroll } - onFillRequest={ this._onFillRequest }> - {tiles} + onScroll={this._onScroll} + onFillRequest={this._onFillRequest}> + { tiles } </ScrollPanel> ); }, }); describe('ScrollPanel', function() { - var parentDiv; - var tester; - var scrollingDiv; + let parentDiv; + let tester; + let scrollingDiv; beforeEach(function(done) { test_utils.beforeEach(this); @@ -153,7 +153,7 @@ describe('ScrollPanel', function() { parentDiv.style.overflow = 'hidden'; document.body.appendChild(parentDiv); - tester = ReactDOM.render(<Tester/>, parentDiv); + tester = ReactDOM.render(<Tester />, parentDiv); expect(tester.fillCounts.b).toEqual(1); expect(tester.fillCounts.f).toEqual(1); @@ -226,10 +226,10 @@ describe('ScrollPanel', function() { }); it('should not get stuck in #528 workaround', function(done) { - var events = []; + let events = []; Promise.resolve().then(() => { // initialise with a bunch of events - for (var i = 0; i < 40; i++) { + for (let i = 0; i < 40; i++) { events.push(i); } tester.setTileKeys(events); @@ -259,7 +259,7 @@ describe('ScrollPanel', function() { }).then(() => { // Now, simulate hitting "scroll to bottom". events = []; - for (var i = 100; i < 120; i++) { + for (let i = 100; i < 120; i++) { events.push(i); } tester.setTileKeys(events); diff --git a/test/components/structures/TimelinePanel-test.js b/test/components/structures/TimelinePanel-test.js index 98ec65b8e8..74037d2926 100644 --- a/test/components/structures/TimelinePanel-test.js +++ b/test/components/structures/TimelinePanel-test.js @@ -14,24 +14,24 @@ See the License for the specific language governing permissions and limitations under the License. */ -var React = require('react'); -var ReactDOM = require('react-dom'); -var ReactTestUtils = require('react-addons-test-utils'); -var expect = require('expect'); +const React = require('react'); +const ReactDOM = require('react-dom'); +const ReactTestUtils = require('react-addons-test-utils'); +const expect = require('expect'); import Promise from 'bluebird'; -var sinon = require('sinon'); +const sinon = require('sinon'); -var jssdk = require('matrix-js-sdk'); -var EventTimeline = jssdk.EventTimeline; +const jssdk = require('matrix-js-sdk'); +const EventTimeline = jssdk.EventTimeline; -var sdk = require('matrix-react-sdk'); -var TimelinePanel = sdk.getComponent('structures.TimelinePanel'); -var peg = require('../../../src/MatrixClientPeg'); +const sdk = require('matrix-react-sdk'); +const TimelinePanel = sdk.getComponent('structures.TimelinePanel'); +const peg = require('../../../src/MatrixClientPeg'); -var test_utils = require('test-utils'); +const test_utils = require('test-utils'); -var ROOM_ID = '!room:localhost'; -var USER_ID = '@me:localhost'; +const ROOM_ID = '!room:localhost'; +const USER_ID = '@me:localhost'; // wrap TimelinePanel with a component which provides the MatrixClient in the context. const WrappedTimelinePanel = React.createClass({ @@ -52,12 +52,12 @@ const WrappedTimelinePanel = React.createClass({ describe('TimelinePanel', function() { - var sandbox; - var timelineSet; - var room; - var client; - var timeline; - var parentDiv; + let sandbox; + let timelineSet; + let room; + let client; + let timeline; + let parentDiv; // make a dummy message. eventNum is put in the message text to help // identification during debugging, and also in the timestamp so that we @@ -68,14 +68,14 @@ describe('TimelinePanel', function() { event: true, room: ROOM_ID, user: USER_ID, ts: Date.now() + eventNum, msg: "Event " + eventNum, - ... opts, + ...opts, }); } function scryEventTiles(panel) { return ReactTestUtils.scryRenderedComponentsWithType( panel, sdk.getComponent('rooms.EventTile')); - }; + } beforeEach(function() { test_utils.beforeEach(this); @@ -121,8 +121,8 @@ describe('TimelinePanel', function() { // this is https://github.com/vector-im/vector-web/issues/1367 // enough events to allow us to scroll back - var N_EVENTS = 30; - for (var i = 0; i < N_EVENTS; i++) { + const N_EVENTS = 30; + for (let i = 0; i < N_EVENTS; i++) { timeline.addEvent(mkMessage(i)); } @@ -133,26 +133,23 @@ describe('TimelinePanel', function() { scrollDefer.resolve(); } }; - var rendered = ReactDOM.render( + const rendered = ReactDOM.render( <WrappedTimelinePanel timelineSet={timelineSet} onScroll={onScroll} />, parentDiv, ); - var panel = rendered.refs.panel; - var scrollingDiv = ReactTestUtils.findRenderedDOMComponentWithClass( + const panel = rendered.refs.panel; + const scrollingDiv = ReactTestUtils.findRenderedDOMComponentWithClass( panel, "gm-scroll-view"); // helper function which will return a promise which resolves when the // panel isn't paginating var awaitPaginationCompletion = function() { - if(!panel.state.forwardPaginating) - return Promise.resolve(); - else - return Promise.delay(0).then(awaitPaginationCompletion); + if(!panel.state.forwardPaginating) {return Promise.resolve();} else {return Promise.delay(0).then(awaitPaginationCompletion);} }; // helper function which will return a promise which resolves when // the TimelinePanel fires a scroll event - var awaitScroll = function() { + const awaitScroll = function() { scrollDefer = Promise.defer(); return scrollDefer.promise; }; @@ -181,7 +178,7 @@ describe('TimelinePanel', function() { console.log("adding event"); // a new event! - var ev = mkMessage(N_EVENTS+1); + const ev = mkMessage(N_EVENTS+1); timeline.addEvent(ev); panel.onRoomTimeline(ev, room, false, false, { liveEvent: true, @@ -204,8 +201,8 @@ describe('TimelinePanel', function() { it('should not paginate forever if there are no events', function(done) { // start with a handful of events in the timeline, as would happen when // joining a room - var d = Date.now(); - for (var i = 0; i < 3; i++) { + const d = Date.now(); + for (let i = 0; i < 3; i++) { timeline.addEvent(mkMessage(i)); } timeline.setPaginationToken('tok', EventTimeline.BACKWARDS); @@ -217,13 +214,13 @@ describe('TimelinePanel', function() { return Promise.resolve(true); }); - var rendered = ReactDOM.render( - <WrappedTimelinePanel timelineSet={timelineSet}/>, - parentDiv + const rendered = ReactDOM.render( + <WrappedTimelinePanel timelineSet={timelineSet} />, + parentDiv, ); - var panel = rendered.refs.panel; + const panel = rendered.refs.panel; - var messagePanel = ReactTestUtils.findRenderedComponentWithType( + const messagePanel = ReactTestUtils.findRenderedComponentWithType( panel, sdk.getComponent('structures.MessagePanel')); expect(messagePanel.props.backPaginating).toBe(true); @@ -249,7 +246,7 @@ describe('TimelinePanel', function() { }); it("should let you scroll down to the bottom after you've scrolled up", function(done) { - var N_EVENTS = 120; // the number of events to simulate being added to the timeline + const N_EVENTS = 120; // the number of events to simulate being added to the timeline // sadly, loading all those events takes a while this.timeout(N_EVENTS * 50); @@ -259,26 +256,26 @@ describe('TimelinePanel', function() { client.getRoom = function(id) { return null; }; // fill the timeline with lots of events - for (var i = 0; i < N_EVENTS; i++) { + for (let i = 0; i < N_EVENTS; i++) { timeline.addEvent(mkMessage(i)); } console.log("added events to timeline"); - var scrollDefer; - var rendered = ReactDOM.render( - <WrappedTimelinePanel timelineSet={timelineSet} onScroll={() => {scrollDefer.resolve()}}/>, - parentDiv + let scrollDefer; + const rendered = ReactDOM.render( + <WrappedTimelinePanel timelineSet={timelineSet} onScroll={() => {scrollDefer.resolve();}} />, + parentDiv, ); console.log("TimelinePanel rendered"); - var panel = rendered.refs.panel; - var messagePanel = ReactTestUtils.findRenderedComponentWithType( + const panel = rendered.refs.panel; + const messagePanel = ReactTestUtils.findRenderedComponentWithType( panel, sdk.getComponent('structures.MessagePanel')); - var scrollingDiv = ReactTestUtils.findRenderedDOMComponentWithClass( + const scrollingDiv = ReactTestUtils.findRenderedDOMComponentWithClass( panel, "gm-scroll-view"); // helper function which will return a promise which resolves when // the TimelinePanel fires a scroll event - var awaitScroll = function() { + const awaitScroll = function() { scrollDefer = Promise.defer(); return scrollDefer.promise.then(() => { @@ -299,8 +296,8 @@ describe('TimelinePanel', function() { console.log("back paginating..."); setScrollTop(0); return awaitScroll().then(() => { - let eventTiles = scryEventTiles(panel); - let firstEvent = eventTiles[0].props.mxEvent; + const eventTiles = scryEventTiles(panel); + const firstEvent = eventTiles[0].props.mxEvent; console.log("TimelinePanel contains " + eventTiles.length + " events; first is " + @@ -319,12 +316,11 @@ describe('TimelinePanel', function() { setScrollTop(scrollingDiv.scrollHeight - scrollingDiv.clientHeight); console.log("scrolling down... " + scrollingDiv.scrollTop); return awaitScroll().delay(0).then(() => { + const eventTiles = scryEventTiles(panel); + const events = timeline.getEvents(); - let eventTiles = scryEventTiles(panel); - let events = timeline.getEvents(); - - let lastEventInPanel = eventTiles[eventTiles.length - 1].props.mxEvent; - let lastEventInTimeline = events[events.length - 1]; + const lastEventInPanel = eventTiles[eventTiles.length - 1].props.mxEvent; + const lastEventInTimeline = events[events.length - 1]; // Scroll until the last event in the panel = the last event in the timeline if(lastEventInPanel.getId() !== lastEventInTimeline.getId()) { @@ -348,7 +344,7 @@ describe('TimelinePanel', function() { expect(messagePanel.props.backPaginating).toBe(false); expect(messagePanel.props.suppressFirstDateSeparator).toBe(false); - var events = scryEventTiles(panel); + const events = scryEventTiles(panel); expect(events[0].props.mxEvent).toBe(timeline.getEvents()[0]); // At this point, we make no assumption that unpagination has happened. This doesn't @@ -361,11 +357,11 @@ describe('TimelinePanel', function() { expect(messagePanel.props.backPaginating).toBe(false); expect(messagePanel.props.forwardPaginating).toBe(false); - var events = scryEventTiles(panel); + const events = scryEventTiles(panel); // Expect to be able to see the most recent event - var lastEventInPanel = events[events.length - 1].props.mxEvent; - var lastEventInTimeline = timeline.getEvents()[timeline.getEvents().length - 1]; + const lastEventInPanel = events[events.length - 1].props.mxEvent; + const lastEventInTimeline = timeline.getEvents()[timeline.getEvents().length - 1]; expect(lastEventInPanel.getContent()).toBe(lastEventInTimeline.getContent()); console.log("done"); diff --git a/test/components/stub-component.js b/test/components/stub-component.js index ba37850ec6..308b183719 100644 --- a/test/components/stub-component.js +++ b/test/components/stub-component.js @@ -2,7 +2,7 @@ */ 'use strict'; -var React = require('react'); +const React = require('react'); module.exports = function(opts) { opts = opts || {}; @@ -12,8 +12,8 @@ module.exports = function(opts) { if (!opts.render) { opts.render = function() { - return <div>{this.displayName}</div>; - } + return <div>{ this.displayName }</div>; + }; } return React.createClass(opts); diff --git a/test/components/views/dialogs/InteractiveAuthDialog-test.js b/test/components/views/dialogs/InteractiveAuthDialog-test.js index f606793132..36894fbd21 100644 --- a/test/components/views/dialogs/InteractiveAuthDialog-test.js +++ b/test/components/views/dialogs/InteractiveAuthDialog-test.js @@ -28,12 +28,12 @@ import MatrixClientPeg from '../../../../src/MatrixClientPeg'; import * as test_utils from '../../../test-utils'; const InteractiveAuthDialog = sdk.getComponent( - 'views.dialogs.InteractiveAuthDialog' + 'views.dialogs.InteractiveAuthDialog', ); -describe('InteractiveAuthDialog', function () { - var parentDiv; - var sandbox; +describe('InteractiveAuthDialog', function() { + let parentDiv; + let sandbox; beforeEach(function() { test_utils.beforeEach(this); @@ -50,10 +50,10 @@ describe('InteractiveAuthDialog', function () { it('Should successfully complete a password flow', function() { const onFinished = sinon.spy(); - const doRequest = sinon.stub().returns(Promise.resolve({a:1})); + const doRequest = sinon.stub().returns(Promise.resolve({a: 1})); // tell the stub matrixclient to return a real userid - var client = MatrixClientPeg.get(); + const client = MatrixClientPeg.get(); client.credentials = {userId: "@user:id"}; const dlg = ReactDOM.render( @@ -62,8 +62,8 @@ describe('InteractiveAuthDialog', function () { authData={{ session: "sess", flows: [ - {"stages":["m.login.password"]} - ] + {"stages": ["m.login.password"]}, + ], }} makeRequest={doRequest} onFinished={onFinished} @@ -72,7 +72,7 @@ describe('InteractiveAuthDialog', function () { // wait for a password box and a submit button return MatrixReactTestUtils.waitForRenderedDOMComponentWithTag(dlg, "form", 2).then((formNode) => { const inputNodes = ReactTestUtils.scryRenderedDOMComponentsWithTag( - dlg, "input" + dlg, "input", ); let passwordNode; let submitNode; @@ -113,7 +113,7 @@ describe('InteractiveAuthDialog', function () { return Promise.delay(1); }).then(() => { expect(onFinished.callCount).toEqual(1); - expect(onFinished.calledWithExactly(true, {a:1})).toBe(true); + expect(onFinished.calledWithExactly(true, {a: 1})).toBe(true); }); }); }); diff --git a/test/components/views/elements/MemberEventListSummary-test.js b/test/components/views/elements/MemberEventListSummary-test.js index a93e38b50c..1618fe4cfe 100644 --- a/test/components/views/elements/MemberEventListSummary-test.js +++ b/test/components/views/elements/MemberEventListSummary-test.js @@ -155,10 +155,10 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; @@ -191,10 +191,10 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; @@ -239,15 +239,15 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( - "user_1 was unbanned, joined and left 7 times and was invited" + "user_1 was unbanned, joined and left 7 times and was invited", ); }); @@ -292,16 +292,16 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( "user_1 was unbanned, joined and left 2 times, was banned, " + - "joined and left 3 times and was invited" + "joined and left 3 times and was invited", ); }); @@ -351,15 +351,15 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( - "user_1 and one other were unbanned, joined and left 2 times and were banned" + "user_1 and one other were unbanned, joined and left 2 times and were banned", ); }); @@ -389,15 +389,15 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( - "user_0 and 19 others were unbanned, joined and left 2 times and were banned" + "user_0 and 19 others were unbanned, joined and left 2 times and were banned", ); }); @@ -440,16 +440,16 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( "user_2 was unbanned and joined and left 2 times, user_1 was unbanned, " + - "joined and left 2 times and was banned" + "joined and left 2 times and was banned", ); }); @@ -507,16 +507,16 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( "user_1 was invited, was banned, joined, rejected their invitation, left, " + - "had their invitation withdrawn, was unbanned, was kicked and left" + "had their invitation withdrawn, was unbanned, was kicked and left", ); }); @@ -554,16 +554,16 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( "user_1 and one other rejected their invitations and " + - "had their invitations withdrawn" + "had their invitations withdrawn", ); }); @@ -590,15 +590,15 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( - "user_1 rejected their invitation 2 times" + "user_1 rejected their invitation 2 times", ); }); @@ -618,15 +618,15 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( - "user_1 and user_2 joined 2 times" + "user_1 and user_2 joined 2 times", ); }); @@ -645,15 +645,15 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( - "user_1, user_2 and one other joined" + "user_1, user_2 and one other joined", ); }); @@ -670,15 +670,15 @@ describe('MemberEventListSummary', function() { }; const instance = ReactTestUtils.renderIntoDocument( - <MemberEventListSummary {...props} /> + <MemberEventListSummary {...props} />, ); const summary = ReactTestUtils.findRenderedDOMComponentWithClass( - instance, "mx_MemberEventListSummary_summary" + instance, "mx_MemberEventListSummary_summary", ); const summaryText = summary.innerText; expect(summaryText).toBe( - "user_0, user_1 and 18 others joined" + "user_0, user_1 and 18 others joined", ); }); }); diff --git a/test/components/views/rooms/MessageComposerInput-test.js b/test/components/views/rooms/MessageComposerInput-test.js index e5d98e26c6..faf3f0f804 100644 --- a/test/components/views/rooms/MessageComposerInput-test.js +++ b/test/components/views/rooms/MessageComposerInput-test.js @@ -57,7 +57,7 @@ describe('MessageComposerInput', () => { } sandbox.restore(); done(); - }) + }); }); // XXX this fails diff --git a/test/mock-clock.js b/test/mock-clock.js index a99b01a0fb..103e186c1f 100644 --- a/test/mock-clock.js +++ b/test/mock-clock.js @@ -37,28 +37,28 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * mock_clock.uninstall(); * - * + * * The reason for C&Ping jasmine's clock here is that jasmine itself is * difficult to webpack, and we don't really want all of it. Sinon also has a * mock-clock implementation, but again, it is difficult to webpack. */ -var j$ = {}; +const j$ = {}; -j$.Clock = function () { +j$.Clock = function() { function Clock(global, delayedFunctionSchedulerFactory, mockDate) { - var self = this, + let self = this, realTimingFunctions = { setTimeout: global.setTimeout, clearTimeout: global.clearTimeout, setInterval: global.setInterval, - clearInterval: global.clearInterval + clearInterval: global.clearInterval, }, fakeTimingFunctions = { setTimeout: setTimeout, clearTimeout: clearTimeout, setInterval: setInterval, - clearInterval: clearInterval + clearInterval: clearInterval, }, installed = false, delayedFunctionScheduler, @@ -151,7 +151,7 @@ j$.Clock = function () { } function replace(dest, source) { - for (var prop in source) { + for (const prop in source) { dest[prop] = source[prop]; } } @@ -183,22 +183,22 @@ j$.Clock = function () { j$.DelayedFunctionScheduler = function() { function DelayedFunctionScheduler() { - var self = this; - var scheduledLookup = []; - var scheduledFunctions = {}; - var currentTime = 0; - var delayedFnCount = 0; + const self = this; + const scheduledLookup = []; + const scheduledFunctions = {}; + let currentTime = 0; + let delayedFnCount = 0; self.tick = function(millis) { millis = millis || 0; - var endTime = currentTime + millis; + const endTime = currentTime + millis; runScheduledFunctions(endTime); currentTime = endTime; }; self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) { - var f; + let f; if (typeof(funcToCall) === 'string') { /* jshint evil: true */ f = function() { return eval(funcToCall); }; @@ -211,13 +211,13 @@ j$.DelayedFunctionScheduler = function() { timeoutKey = timeoutKey || ++delayedFnCount; runAtMillis = runAtMillis || (currentTime + millis); - var funcToSchedule = { + const funcToSchedule = { runAtMillis: runAtMillis, funcToCall: f, recurring: recurring, params: params, timeoutKey: timeoutKey, - millis: millis + millis: millis, }; if (runAtMillis in scheduledFunctions) { @@ -225,7 +225,7 @@ j$.DelayedFunctionScheduler = function() { } else { scheduledFunctions[runAtMillis] = [funcToSchedule]; scheduledLookup.push(runAtMillis); - scheduledLookup.sort(function (a, b) { + scheduledLookup.sort(function(a, b) { return a - b; }); } @@ -234,9 +234,9 @@ j$.DelayedFunctionScheduler = function() { }; self.removeFunctionWithId = function(timeoutKey) { - for (var runAtMillis in scheduledFunctions) { - var funcs = scheduledFunctions[runAtMillis]; - var i = indexOfFirstToPass(funcs, function (func) { + for (const runAtMillis in scheduledFunctions) { + const funcs = scheduledFunctions[runAtMillis]; + const i = indexOfFirstToPass(funcs, function(func) { return func.timeoutKey === timeoutKey; }); @@ -258,9 +258,9 @@ j$.DelayedFunctionScheduler = function() { return self; function indexOfFirstToPass(array, testFn) { - var index = -1; + let index = -1; - for (var i = 0; i < array.length; ++i) { + for (let i = 0; i < array.length; ++i) { if (testFn(array[i])) { index = i; break; @@ -271,8 +271,8 @@ j$.DelayedFunctionScheduler = function() { } function deleteFromLookup(key) { - var value = Number(key); - var i = indexOfFirstToPass(scheduledLookup, function (millis) { + const value = Number(key); + const i = indexOfFirstToPass(scheduledLookup, function(millis) { return millis === value; }); @@ -291,7 +291,7 @@ j$.DelayedFunctionScheduler = function() { } function forEachFunction(funcsToRun, callback) { - for (var i = 0; i < funcsToRun.length; ++i) { + for (let i = 0; i < funcsToRun.length; ++i) { callback(funcsToRun[i]); } } @@ -304,7 +304,7 @@ j$.DelayedFunctionScheduler = function() { do { currentTime = scheduledLookup.shift(); - var funcsToRun = scheduledFunctions[currentTime]; + const funcsToRun = scheduledFunctions[currentTime]; delete scheduledFunctions[currentTime]; forEachFunction(funcsToRun, function(funcToRun) { @@ -319,7 +319,7 @@ j$.DelayedFunctionScheduler = function() { } while (scheduledLookup.length > 0 && // checking first if we're out of time prevents setTimeout(0) // scheduled in a funcToRun from forcing an extra iteration - currentTime !== endTime && + currentTime !== endTime && scheduledLookup[0] <= endTime); } } @@ -330,8 +330,8 @@ j$.DelayedFunctionScheduler = function() { j$.MockDate = function() { function MockDate(global) { - var self = this; - var currentTime = 0; + const self = this; + let currentTime = 0; if (!global || !global.Date) { self.install = function() {}; @@ -340,7 +340,7 @@ j$.MockDate = function() { return self; } - var GlobalDate = global.Date; + const GlobalDate = global.Date; self.install = function(mockDate) { if (mockDate instanceof GlobalDate) { @@ -411,10 +411,10 @@ j$.MockDate = function() { return MockDate; }(); -var clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global)); +const clock = new j$.Clock(global, function() { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global)); module.exports.clock = function() { return clock; -} +}; diff --git a/test/skinned-sdk.js b/test/skinned-sdk.js index d4e178ef2c..1ad361d59d 100644 --- a/test/skinned-sdk.js +++ b/test/skinned-sdk.js @@ -13,12 +13,12 @@ // default require('babel-polyfill'); -var sdk = require("../src/index"); +const sdk = require("../src/index"); -var skin = require('../src/component-index.js'); -var stubComponent = require('./components/stub-component.js'); +const skin = require('../src/component-index.js'); +const stubComponent = require('./components/stub-component.js'); -var components = skin.components; +const components = skin.components; components['structures.LeftPanel'] = stubComponent(); components['structures.RightPanel'] = stubComponent(); components['structures.RoomDirectory'] = stubComponent(); diff --git a/test/test-utils.js b/test/test-utils.js index 06d3c03c49..0b536f5766 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -14,7 +14,7 @@ const MatrixEvent = jssdk.MatrixEvent; * @param {Mocha.Context} context The test context */ export function beforeEach(context) { - var desc = context.currentTest.fullTitle(); + const desc = context.currentTest.fullTitle(); console.log(); @@ -26,7 +26,7 @@ export function beforeEach(context) { console.log(desc); console.log(new Array(1 + desc.length).join("=")); -}; +} /** @@ -40,16 +40,16 @@ export function beforeEach(context) { * @returns {sinon.Sandbox}; remember to call sandbox.restore afterwards. */ export function stubClient() { - var sandbox = sinon.sandbox.create(); + const sandbox = sinon.sandbox.create(); - var client = createTestClient(); + const client = createTestClient(); // stub out the methods in MatrixClientPeg // // 'sandbox.restore()' doesn't work correctly on inherited methods, // so we do this for each method - var methods = ['get', 'unset', 'replaceUsingCreds']; - for (var i = 0; i < methods.length; i++) { + const methods = ['get', 'unset', 'replaceUsingCreds']; + for (let i = 0; i < methods.length; i++) { sandbox.stub(peg, methods[i]); } // MatrixClientPeg.get() is called a /lot/, so implement it with our own @@ -128,7 +128,7 @@ export function mkEvent(opts) { if (!opts.type || !opts.content) { throw new Error("Missing .type or .content =>" + JSON.stringify(opts)); } - var event = { + const event = { type: opts.type, room_id: opts.room, sender: opts.user, @@ -139,14 +139,13 @@ export function mkEvent(opts) { }; if (opts.skey) { event.state_key = opts.skey; - } - else if (["m.room.name", "m.room.topic", "m.room.create", "m.room.join_rules", + } else if (["m.room.name", "m.room.topic", "m.room.create", "m.room.join_rules", "m.room.power_levels", "m.room.topic", "com.example.state"].indexOf(opts.type) !== -1) { event.state_key = ""; } return opts.event ? new MatrixEvent(event) : event; -}; +} /** * Create an m.presence event. @@ -157,7 +156,7 @@ export function mkPresence(opts) { if (!opts.user) { throw new Error("Missing user"); } - var event = { + const event = { event_id: "$" + Math.random() + "-" + Math.random(), type: "m.presence", sender: opts.user, @@ -165,11 +164,11 @@ export function mkPresence(opts) { avatar_url: opts.url, displayname: opts.name, last_active_ago: opts.ago, - presence: opts.presence || "offline" - } + presence: opts.presence || "offline", + }, }; return opts.event ? new MatrixEvent(event) : event; -}; +} /** * Create an m.room.member event. @@ -195,19 +194,19 @@ export function mkMembership(opts) { throw new Error("Missing .mship => " + JSON.stringify(opts)); } opts.content = { - membership: opts.mship + membership: opts.mship, }; if (opts.prevMship) { opts.prev_content = { membership: opts.prevMship }; } if (opts.name) { opts.content.displayname = opts.name; } if (opts.url) { opts.content.avatar_url = opts.url; } - let e = mkEvent(opts); + const e = mkEvent(opts); if (opts.target) { e.target = opts.target; } return e; -}; +} /** * Create an m.room.message event. @@ -228,13 +227,13 @@ export function mkMessage(opts) { } opts.content = { msgtype: "m.text", - body: opts.msg + body: opts.msg, }; return mkEvent(opts); } export function mkStubRoom(roomId = null) { - var stubTimeline = { getEvents: () => [] }; + const stubTimeline = { getEvents: () => [] }; return { roomId, getReceiptsForEvent: sinon.stub().returns([]),