From 34c642ce9a43c80582fa93237384fe3d5a6e40ba Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 12 Jul 2019 11:23:01 +0100 Subject: [PATCH 01/23] Upgrade JS SDK to 2.2.0-rc.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 006fb10138..05c5001210 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "linkifyjs": "^2.1.6", "lodash": "^4.17.14", "lolex": "2.3.2", - "matrix-js-sdk": "2.1.1", + "matrix-js-sdk": "2.2.0-rc.1", "optimist": "^0.6.1", "pako": "^1.0.5", "png-chunks-extract": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index ba5df5479f..937396a73c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4938,10 +4938,10 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw== -matrix-js-sdk@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-2.1.1.tgz#c4d9ed81e18e2c2fce9fff168fdf41f37c390b6a" - integrity sha512-dpVuwrQjOJn8eqtP9TRoSX6WIbdZG7+RCmqkJtfvpjB+iNgtDhodIWfrNearSBhJYezipUFu9nrt9akKfWBXxQ== +matrix-js-sdk@2.2.0-rc.1: + version "2.2.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-2.2.0-rc.1.tgz#6f1a559db2dadcb43c3c1f8a27a880ecdf4ea410" + integrity sha512-gjhe8CBM1okbhic+tGBqWhwKAEFp9hns3DoJandf6veAF01ZfBInGaQPMHtxufIRFfmJtd7CoRiV8pr9tY3S3g== dependencies: another-json "^0.2.0" babel-runtime "^6.26.0" From c071f5af8e46ba51b8d5a5cf38ba137fbe679158 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 12 Jul 2019 11:28:49 +0100 Subject: [PATCH 02/23] Prepare changelog for v1.4.0-rc.1 --- CHANGELOG.md | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3523db17b4..e8e41ec6f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,78 @@ +Changes in [1.4.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.4.0-rc.1) (2019-07-12) +============================================================================================================= +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.3.1...v1.4.0-rc.1) + + * Update from Weblate + [\#3214](https://github.com/matrix-org/matrix-react-sdk/pull/3214) + * Prevent autocomplete on paste, and verserev-ing text before and after : + [\#3210](https://github.com/matrix-org/matrix-react-sdk/pull/3210) + * Close settings after deactivating + [\#3212](https://github.com/matrix-org/matrix-react-sdk/pull/3212) + * Require an issue URL (or notes) on rageshakes + [\#3207](https://github.com/matrix-org/matrix-react-sdk/pull/3207) + * Use r0 media endpoints for group tests + [\#3202](https://github.com/matrix-org/matrix-react-sdk/pull/3202) + * Fix field styling regression + [\#3204](https://github.com/matrix-org/matrix-react-sdk/pull/3204) + * Upgrade dependencies + [\#3203](https://github.com/matrix-org/matrix-react-sdk/pull/3203) + * Show anything other than ban/invite -> leave as a kick + [\#3198](https://github.com/matrix-org/matrix-react-sdk/pull/3198) + * Run stylelint on all SCSS files + [\#3200](https://github.com/matrix-org/matrix-react-sdk/pull/3200) + * Show original event in edit history + [\#3195](https://github.com/matrix-org/matrix-react-sdk/pull/3195) + * Use the state variable for the password when deactivating + [\#3201](https://github.com/matrix-org/matrix-react-sdk/pull/3201) + * Support SSO for rehydrating a soft-logged-out session. + [\#3197](https://github.com/matrix-org/matrix-react-sdk/pull/3197) + * Change highlight colour on dark theme + [\#3196](https://github.com/matrix-org/matrix-react-sdk/pull/3196) + * Dress up the soft logout page to look like the design + [\#3190](https://github.com/matrix-org/matrix-react-sdk/pull/3190) + * Overwrite the old session if the new creds are for a different user + [\#3189](https://github.com/matrix-org/matrix-react-sdk/pull/3189) + * Fix React crash when using a non-default homeserver on soft logout + [\#3188](https://github.com/matrix-org/matrix-react-sdk/pull/3188) + * Change soft logout rehydrate text if there's pending key backups + [\#3187](https://github.com/matrix-org/matrix-react-sdk/pull/3187) + * Ask for the user's password to rehydrate their soft logged out session + [\#3182](https://github.com/matrix-org/matrix-react-sdk/pull/3182) + * Don't try to call bodyToHtml with an empty content + [\#3194](https://github.com/matrix-org/matrix-react-sdk/pull/3194) + * Take server-side aggregation into account for timestamp on (edited) tooltip + [\#3193](https://github.com/matrix-org/matrix-react-sdk/pull/3193) + * Fix some React errors + [\#3164](https://github.com/matrix-org/matrix-react-sdk/pull/3164) + * Preserve reply fallback on edit + [\#3192](https://github.com/matrix-org/matrix-react-sdk/pull/3192) + * Don't show Remove button in ImageView if can't redact, delint ImageView + [\#3191](https://github.com/matrix-org/matrix-react-sdk/pull/3191) + * Edit history actions + [\#3180](https://github.com/matrix-org/matrix-react-sdk/pull/3180) + * Don't allow editing via up-arrow when Replying + [\#3183](https://github.com/matrix-org/matrix-react-sdk/pull/3183) + * If oldContent matches newContent, skip sending the edit + [\#3103](https://github.com/matrix-org/matrix-react-sdk/pull/3103) + * Track live events in timeline and use for read receipts and read markers + [\#3184](https://github.com/matrix-org/matrix-react-sdk/pull/3184) + * Upgrade dependencies + [\#3179](https://github.com/matrix-org/matrix-react-sdk/pull/3179) + * Allow diplayed reaction values to contain anything + [\#3186](https://github.com/matrix-org/matrix-react-sdk/pull/3186) + * Fix interactive tooltip null target error + [\#3185](https://github.com/matrix-org/matrix-react-sdk/pull/3185) + * Require that users go to the soft logout page if they're soft logged out + [\#3181](https://github.com/matrix-org/matrix-react-sdk/pull/3181) + * Emojibase data includes blank variations, accept these when searching + [\#3163](https://github.com/matrix-org/matrix-react-sdk/pull/3163) + * Implement basic soft logout handling + [\#3177](https://github.com/matrix-org/matrix-react-sdk/pull/3177) + * De-lint ScalarAuthClient + [\#3178](https://github.com/matrix-org/matrix-react-sdk/pull/3178) + * show /relations error in edit history dialog + [\#3174](https://github.com/matrix-org/matrix-react-sdk/pull/3174) + Changes in [1.3.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.3.1) (2019-07-11) =================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.3.0...v1.3.1) From a0dc4db2345117fd67564b74f02ce0297b94b7c2 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 12 Jul 2019 11:28:50 +0100 Subject: [PATCH 03/23] v1.4.0-rc.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 05c5001210..31cb2dcb36 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "1.3.1", + "version": "1.4.0-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 178427c2e4315cdd29229541d14344063d5f9da9 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 11 Jul 2019 08:07:30 -0600 Subject: [PATCH 04/23] Remove misleading text about admins logging people out from soft logout --- src/components/structures/auth/SoftLogout.js | 36 -------------------- src/i18n/strings/en_EN.json | 1 - 2 files changed, 37 deletions(-) diff --git a/src/components/structures/auth/SoftLogout.js b/src/components/structures/auth/SoftLogout.js index 8bfa458c28..585b4bfe67 100644 --- a/src/components/structures/auth/SoftLogout.js +++ b/src/components/structures/auth/SoftLogout.js @@ -21,8 +21,6 @@ import sdk from '../../../index'; import dis from '../../../dispatcher'; import * as Lifecycle from '../../../Lifecycle'; import Modal from '../../../Modal'; -import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils"; -import SdkConfig from "../../../SdkConfig"; import MatrixClientPeg from "../../../MatrixClientPeg"; import {sendLoginRequest} from "../../../Login"; import url from 'url'; @@ -53,24 +51,7 @@ export default class SoftLogout extends React.Component { constructor() { super(); - const defaultServerConfig: ValidatedServerConfig = SdkConfig.get()["validated_server_config"]; - - const hsUrl = MatrixClientPeg.get().getHomeserverUrl(); - const domainName = hsUrl === defaultServerConfig.hsUrl - ? defaultServerConfig.hsName - : MatrixClientPeg.getHomeserverName(); - - const userId = MatrixClientPeg.get().getUserId(); - const user = MatrixClientPeg.get().getUser(userId); - - const displayName = user && user.displayName !== userId - ? user.displayName - : userId.substring(1).split(':')[0]; - this.state = { - domainName, - userId, - displayName, loginView: LOGIN_VIEW.LOADING, keyBackupNeeded: true, // assume we do while we figure it out (see componentWillMount) ssoUrl: null, @@ -315,23 +296,6 @@ export default class SoftLogout extends React.Component {

{_t("You're signed out")}

-
- {_t( - "Your homeserver (%(domainName)s) admin has signed you out of your " + - "account %(displayName)s (%(userId)s).", - { - domainName: this.state.domainName, - displayName: this.state.displayName, - userId: this.state.userId, - }, - { - // XXX: It's annoying that we can't just map to two things. - // https://github.com/vector-im/riot-web/issues/9086 - 'strong1': (val) => {val}, - 'strong2': (val) => {val}, - }, - )} -

{_t("Sign in")}

diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index a9225b1066..df470710c9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1596,7 +1596,6 @@ "Sign in and regain access to your account.": "Sign in and regain access to your account.", "You cannot sign in to your account. Please contact your homeserver admin for more information.": "You cannot sign in to your account. Please contact your homeserver admin for more information.", "You're signed out": "You're signed out", - "Your homeserver (%(domainName)s) admin has signed you out of your account %(displayName)s (%(userId)s).": "Your homeserver (%(domainName)s) admin has signed you out of your account %(displayName)s (%(userId)s).", "Clear personal data": "Clear personal data", "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.": "Warning: Your personal data (including encryption keys) is still stored on this device. Clear it if you're finished using this device, or want to sign in to another account.", "Commands": "Commands", From 6a6108f4962819966bc7c6eda5d22d43c3429abb Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 12 Jul 2019 17:29:36 +0100 Subject: [PATCH 05/23] Upgrade to JS SDK 2.2.0-rc.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 31cb2dcb36..411e9c4906 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "linkifyjs": "^2.1.6", "lodash": "^4.17.14", "lolex": "2.3.2", - "matrix-js-sdk": "2.2.0-rc.1", + "matrix-js-sdk": "2.2.0-rc.2", "optimist": "^0.6.1", "pako": "^1.0.5", "png-chunks-extract": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index 937396a73c..5948f8866c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4938,10 +4938,10 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw== -matrix-js-sdk@2.2.0-rc.1: - version "2.2.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-2.2.0-rc.1.tgz#6f1a559db2dadcb43c3c1f8a27a880ecdf4ea410" - integrity sha512-gjhe8CBM1okbhic+tGBqWhwKAEFp9hns3DoJandf6veAF01ZfBInGaQPMHtxufIRFfmJtd7CoRiV8pr9tY3S3g== +matrix-js-sdk@2.2.0-rc.2: + version "2.2.0-rc.2" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-2.2.0-rc.2.tgz#aeb2357c9ea69591657d0d6c0fba8fcbcf0e40c7" + integrity sha512-glT0/yV6+AypedNi7K0Xugjj0Q9bOQRVEbVfhO2O22ei+qqkCAUsGqGssCIumvfNh9QAh+OXCfn4goLFrANtew== dependencies: another-json "^0.2.0" babel-runtime "^6.26.0" From c600947cfdb872e15a3bc3445aeb2461697b3bb7 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 12 Jul 2019 17:33:21 +0100 Subject: [PATCH 06/23] Prepare changelog for v1.4.0-rc.2 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8e41ec6f2..12f569bdcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +Changes in [1.4.0-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.4.0-rc.2) (2019-07-12) +============================================================================================================= +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.4.0-rc.1...v1.4.0-rc.2) + + * Upgrade to JS SDK 2.2.0-rc.2 to fix regresion in listing devices + * Remove misleading text about admins logging people out from soft logout + [\#3215](https://github.com/matrix-org/matrix-react-sdk/pull/3215) + Changes in [1.4.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.4.0-rc.1) (2019-07-12) ============================================================================================================= [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.3.1...v1.4.0-rc.1) From f05a7b21954ec50a87d65160c5fa91b1fec9327e Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 12 Jul 2019 17:33:21 +0100 Subject: [PATCH 07/23] v1.4.0-rc.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 411e9c4906..d4c12601dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "1.4.0-rc.1", + "version": "1.4.0-rc.2", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From e66ebec083252afd7531684f43e93f80381072f1 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 12 Jul 2019 17:40:51 +0200 Subject: [PATCH 08/23] take adjacent no-tile events in combination with ignored events into account when determining the last displayed event --- src/components/structures/TimelinePanel.js | 92 +++++++++++++--------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index 354d52a6f1..379939154e 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -36,6 +36,7 @@ const Modal = require("../../Modal"); const UserActivity = require("../../UserActivity"); import { KeyCode } from '../../Keyboard'; import Timer from '../../utils/Timer'; +import shouldHideEvent from '../../shouldHideEvent'; import EditorStateTransfer from '../../utils/EditorStateTransfer'; const PAGINATE_SIZE = 20; @@ -1140,55 +1141,70 @@ const TimelinePanel = React.createClass({ const wrapperRect = ReactDOM.findDOMNode(messagePanel).getBoundingClientRect(); const myUserId = MatrixClientPeg.get().credentials.userId; - let lastDisplayedIndex = null; + const isNodeInView = (node) => { + if (node) { + const boundingRect = node.getBoundingClientRect(); + if ((allowPartial && boundingRect.top < wrapperRect.bottom) || + (!allowPartial && boundingRect.bottom < wrapperRect.bottom)) { + return true; + } + } + return false; + }; + + // if allowEventsWithoutTiles is enabled, we keep track + // of how many of the adjacent events were invisible (because no tile) + // but should have the read receipt moved past, so + // we can include those once we find the last displayed (visible) event. + // The counter is cleared when we ignore an event we don't want + // to send a read receipt for (our own events, local echos) + let adjacentInvisibleEventCount = 0; // Use `liveEvents` here because we don't want the read marker or read // receipt to advance into pending events. for (let i = this.state.liveEvents.length - 1; i >= 0; --i) { const ev = this.state.liveEvents[i]; - if (ignoreOwn && ev.sender && ev.sender.userId == myUserId) { - continue; - } - - // local echoes have a fake event ID - if (ignoreEchoes && ev.status) { - continue; - } - const node = messagePanel.getNodeForEventId(ev.getId()); - if (!node) continue; + const isInView = isNodeInView(node); - const boundingRect = node.getBoundingClientRect(); - if ((allowPartial && boundingRect.top < wrapperRect.bottom) || - (!allowPartial && boundingRect.bottom < wrapperRect.bottom)) { - lastDisplayedIndex = i; - break; - } - } - - if (lastDisplayedIndex === null) { - return null; - } - - // If events without tiles are allowed, then we walk forward from the - // the last displayed event and advance the index for any events without - // tiles that immediately follow it. - // XXX: We could track the last event without a tile after the last - // displayed event in the loop above so that we only do a single pass - // through the loop, which would be more efficient. Using two passes is - // easier to reason about, so let's start there and optimise later if - // needed. - if (allowEventsWithoutTiles) { - for (let i = lastDisplayedIndex + 1; i < this.state.liveEvents.length; i++) { - const ev = this.state.liveEvents[i]; - if (EventTile.haveTileForEvent(ev)) { - break; + // the event at i + adjacentInvisibleEventCount should + // not be ignored, and it considered the first in view (at the bottom) + // because i is the first one in view and the adjacent ones are invisible, + // so return this without further ado. + if (isInView && adjacentInvisibleEventCount !== 0) { + return i + adjacentInvisibleEventCount; + } else { + if (node && !isInView) { + // has node but not in view, so adjacent invisible events don't count + adjacentInvisibleEventCount = 0; + } + + const shouldIgnore = (ignoreEchoes && ev.status) || // local echo + (ignoreOwn && ev.sender && ev.sender.userId == myUserId); // own message + const isWithoutTile = !EventTile.haveTileForEvent(ev) || shouldHideEvent(ev); + + if (allowEventsWithoutTiles && (isWithoutTile || !node)) { + // don't start counting if the event should be ignored, + // but continue counting if we were already so the offset + // to the previous invisble event that didn't need to be ignored + // doesn't get messed up + if (!shouldIgnore || (shouldIgnore && adjacentInvisibleEventCount !== 0)) { + ++adjacentInvisibleEventCount; + } + continue; + } + + if (shouldIgnore) { + continue; + } + + if (isInView) { + return i; } - lastDisplayedIndex = i; } } - return lastDisplayedIndex; + return null; }, /** From d39a86b126ba345429449ffed3e346579538a5bb Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 15 Jul 2019 14:01:28 +0200 Subject: [PATCH 09/23] improve comments --- src/components/structures/TimelinePanel.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index 379939154e..5acc55b4d3 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -1153,11 +1153,11 @@ const TimelinePanel = React.createClass({ }; // if allowEventsWithoutTiles is enabled, we keep track - // of how many of the adjacent events were invisible (because no tile) - // but should have the read receipt moved past, so + // of how many of the adjacent events didn't have a tile + // but should have the read receipt moved past them, so // we can include those once we find the last displayed (visible) event. - // The counter is cleared when we ignore an event we don't want - // to send a read receipt for (our own events, local echos) + // The counter is not started for events we don't want + // to send a read receipt for (our own events, local echos). let adjacentInvisibleEventCount = 0; // Use `liveEvents` here because we don't want the read marker or read // receipt to advance into pending events. @@ -1167,15 +1167,14 @@ const TimelinePanel = React.createClass({ const node = messagePanel.getNodeForEventId(ev.getId()); const isInView = isNodeInView(node); - // the event at i + adjacentInvisibleEventCount should - // not be ignored, and it considered the first in view (at the bottom) - // because i is the first one in view and the adjacent ones are invisible, - // so return this without further ado. + // when we've reached the first visible event, and the previous + // events were all invisible (with the first one not being ignored), + // return the index of the first invisible event. if (isInView && adjacentInvisibleEventCount !== 0) { return i + adjacentInvisibleEventCount; } else { if (node && !isInView) { - // has node but not in view, so adjacent invisible events don't count + // has node but not in view, so reset adjacent invisible events adjacentInvisibleEventCount = 0; } From f901c8c4fec13d544718f5d69f4b47c6b14093e1 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Mon, 15 Jul 2019 14:02:41 +0200 Subject: [PATCH 10/23] remove unneeded else --- src/components/structures/TimelinePanel.js | 45 +++++++++++----------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index 5acc55b4d3..6eb1599147 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -1172,34 +1172,33 @@ const TimelinePanel = React.createClass({ // return the index of the first invisible event. if (isInView && adjacentInvisibleEventCount !== 0) { return i + adjacentInvisibleEventCount; - } else { - if (node && !isInView) { - // has node but not in view, so reset adjacent invisible events - adjacentInvisibleEventCount = 0; - } + } + if (node && !isInView) { + // has node but not in view, so reset adjacent invisible events + adjacentInvisibleEventCount = 0; + } - const shouldIgnore = (ignoreEchoes && ev.status) || // local echo - (ignoreOwn && ev.sender && ev.sender.userId == myUserId); // own message - const isWithoutTile = !EventTile.haveTileForEvent(ev) || shouldHideEvent(ev); + const shouldIgnore = (ignoreEchoes && ev.status) || // local echo + (ignoreOwn && ev.sender && ev.sender.userId == myUserId); // own message + const isWithoutTile = !EventTile.haveTileForEvent(ev) || shouldHideEvent(ev); - if (allowEventsWithoutTiles && (isWithoutTile || !node)) { - // don't start counting if the event should be ignored, - // but continue counting if we were already so the offset - // to the previous invisble event that didn't need to be ignored - // doesn't get messed up - if (!shouldIgnore || (shouldIgnore && adjacentInvisibleEventCount !== 0)) { - ++adjacentInvisibleEventCount; - } - continue; + if (allowEventsWithoutTiles && (isWithoutTile || !node)) { + // don't start counting if the event should be ignored, + // but continue counting if we were already so the offset + // to the previous invisble event that didn't need to be ignored + // doesn't get messed up + if (!shouldIgnore || (shouldIgnore && adjacentInvisibleEventCount !== 0)) { + ++adjacentInvisibleEventCount; } + continue; + } - if (shouldIgnore) { - continue; - } + if (shouldIgnore) { + continue; + } - if (isInView) { - return i; - } + if (isInView) { + return i; } } From 02ec96cff1a162d385c0e0d5e81f43c155a29753 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 12 Jul 2019 18:50:13 +0200 Subject: [PATCH 11/23] also check content and content.users before proceeding --- src/TextForEvent.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 56598c6e06..e3c249df3f 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -416,7 +416,8 @@ function textForEncryptionEvent(event) { // Currently will only display a change if a user's power level is changed function textForPowerEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); - if (!event.getPrevContent() || !event.getPrevContent().users) { + if (!event.getPrevContent() || !event.getPrevContent().users || + !event.getContent() || !event.getContent().users) { return ''; } const userDefault = event.getContent().users_default || 0; From 415f88dd9aae30c890eab0c8d526dbd538259ae8 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 15 Jul 2019 17:28:47 +0100 Subject: [PATCH 12/23] Prepare changelog for v1.4.0-rc.3 --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12f569bdcf..247da51365 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +Changes in [1.4.0-rc.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.4.0-rc.3) (2019-07-15) +============================================================================================================= +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.4.0-rc.2...v1.4.0-rc.3) + + * Check content and content.users in power levels + [\#3223](https://github.com/matrix-org/matrix-react-sdk/pull/3223) + * Take adjacent invisible events into account for read receipt, even if any + but first should be ignored. + [\#3222](https://github.com/matrix-org/matrix-react-sdk/pull/3222) + Changes in [1.4.0-rc.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.4.0-rc.2) (2019-07-12) ============================================================================================================= [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.4.0-rc.1...v1.4.0-rc.2) From 008903470a367bcdf5e7317a3d4997bd9eabb8e3 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 15 Jul 2019 17:28:48 +0100 Subject: [PATCH 13/23] v1.4.0-rc.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d4c12601dd..fe05e6ea31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "1.4.0-rc.2", + "version": "1.4.0-rc.3", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 2be9696a27ffdc62e7e5a54b61b53b42684f0c72 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 11 Jul 2019 14:44:52 +0100 Subject: [PATCH 14/23] Add a previous event safe area around action bar This adds a previous event safe area so that you can't accidentally hover the previous event while trying to mouse into the action bar or from the react button to its tooltip. Part of https://github.com/vector-im/riot-web/issues/10185 Fixes https://github.com/vector-im/riot-web/issues/9650 --- res/css/views/messages/_MessageActionBar.scss | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index b7ba2ef27d..c629ca2aaa 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -1,5 +1,6 @@ /* Copyright 2019 New Vector Ltd +Copyright 2019 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -29,6 +30,22 @@ limitations under the License. // Ensure the action bar appears above over things, like the read marker. z-index: 1; + // Adds a previous event safe area so that you can't accidentally hover the + // previous event while trying to mouse into the action bar or from the + // react button to its tooltip. + &::before { + content: ''; + position: absolute; + // tooltip overhang + action bar + action bar offset from event + width: calc(48px + 100% + 8px); + // safe area + action bar + height: calc(20px + 100%); + top: -20px; + left: -48px; + z-index: -1; + cursor: initial; + } + > * { white-space: nowrap; display: inline-block; From e3d849e9934719c8e708db7720be95f66f2e99d9 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 11 Jul 2019 17:31:05 +0100 Subject: [PATCH 15/23] Improve interactive tooltip safe mousing area This adds a more complex trapezoidal safe area between the button that triggers the tooltip and the tooltip itself. It should be easier to move from the button into the tooltip without accidentally closing it. Fixes https://github.com/vector-im/riot-web/issues/10185 --- res/css/views/messages/_MessageActionBar.scss | 7 +- .../views/elements/InteractiveTooltip.js | 141 +++++++++++++++++- 2 files changed, 138 insertions(+), 10 deletions(-) diff --git a/res/css/views/messages/_MessageActionBar.scss b/res/css/views/messages/_MessageActionBar.scss index c629ca2aaa..c032051c36 100644 --- a/res/css/views/messages/_MessageActionBar.scss +++ b/res/css/views/messages/_MessageActionBar.scss @@ -36,12 +36,13 @@ limitations under the License. &::before { content: ''; position: absolute; - // tooltip overhang + action bar + action bar offset from event - width: calc(48px + 100% + 8px); + // tooltip safe mousing area + tooltip overhang + + // action bar + action bar offset from event + width: calc(10px + 48px + 100% + 8px); // safe area + action bar height: calc(20px + 100%); top: -20px; - left: -48px; + left: -58px; z-index: -1; cursor: initial; } diff --git a/src/components/views/elements/InteractiveTooltip.js b/src/components/views/elements/InteractiveTooltip.js index 617c392f2b..90cd1a775d 100644 --- a/src/components/views/elements/InteractiveTooltip.js +++ b/src/components/views/elements/InteractiveTooltip.js @@ -37,12 +37,55 @@ function getOrCreateContainer() { return container; } -function isInRect(x, y, rect, buffer = 10) { +function isInRect(x, y, rect, { buffer = 0 } = {}) { const { top, right, bottom, left } = rect; return x >= (left - buffer) && x <= (right + buffer) && y >= (top - buffer) && y <= (bottom + buffer); } +/** + * Returns the positive slope of the diagonal of the rect. + * + * @param {DOMRect} rect + * @return {integer} + */ +function getDiagonalSlope(rect) { + const { top, right, bottom, left } = rect; + return (bottom - top) / (right - left); +} + +function isInUpperLeftHalf(x, y, rect) { + const { bottom, left } = rect; + // Negative slope because Y values grow downwards and for this case, the + // diagonal goes from larger to smaller Y values. + const diagonalSlope = getDiagonalSlope(rect) * -1; + return isInRect(x, y, rect) && (y <= bottom + diagonalSlope * (x - left)); +} + +function isInLowerRightHalf(x, y, rect) { + const { bottom, left } = rect; + // Negative slope because Y values grow downwards and for this case, the + // diagonal goes from larger to smaller Y values. + const diagonalSlope = getDiagonalSlope(rect) * -1; + return isInRect(x, y, rect) && (y >= bottom + diagonalSlope * (x - left)); +} + +function isInUpperRightHalf(x, y, rect) { + const { top, left } = rect; + // Positive slope because Y values grow downwards and for this case, the + // diagonal goes from smaller to larger Y values. + const diagonalSlope = getDiagonalSlope(rect) * 1; + return isInRect(x, y, rect) && (y <= top + diagonalSlope * (x - left)); +} + +function isInLowerLeftHalf(x, y, rect) { + const { top, left } = rect; + // Positive slope because Y values grow downwards and for this case, the + // diagonal goes from smaller to larger Y values. + const diagonalSlope = getDiagonalSlope(rect) * 1; + return isInRect(x, y, rect) && (y >= top + diagonalSlope * (x - left)); +} + /* * This style of tooltip takes a "target" element as its child and centers the * tooltip along one edge of the target. @@ -91,15 +134,99 @@ export default class InteractiveTooltip extends React.Component { this.target = element; } + canTooltipFitAboveTarget() { + const { contentRect } = this.state; + const targetRect = this.target.getBoundingClientRect(); + const targetTop = targetRect.top + window.pageYOffset; + return ( + !contentRect || + (targetTop - contentRect.height > MIN_SAFE_DISTANCE_TO_WINDOW_EDGE) + ); + } + onMouseMove = (ev) => { const { clientX: x, clientY: y } = ev; const { contentRect } = this.state; const targetRect = this.target.getBoundingClientRect(); - if (!isInRect(x, y, contentRect) && !isInRect(x, y, targetRect)) { - this.hideTooltip(); + // When moving the mouse from the target to the tooltip, we create a + // safe area that includes the tooltip, the target, and the trapezoid + // ABCD between them: + // ┌───────────┐ + // │ │ + // │ │ + // A └───E───F───┘ B + // V + // ┌─┐ + // │ │ + // C└─┘D + // + // As long as the mouse remains inside the safe area, the tooltip will + // stay open. + const buffer = 10; + if ( + isInRect(x, y, contentRect, { buffer }) || + isInRect(x, y, targetRect) + ) { return; } + if (this.canTooltipFitAboveTarget()) { + const trapezoidLeft = { + top: contentRect.bottom, + right: targetRect.left, + bottom: targetRect.bottom, + left: contentRect.left - buffer, + }; + const trapezoidCenter = { + top: contentRect.bottom, + right: targetRect.right, + bottom: targetRect.bottom, + left: targetRect.left, + }; + const trapezoidRight = { + top: contentRect.bottom, + right: contentRect.right + buffer, + bottom: targetRect.bottom, + left: targetRect.right, + }; + + if ( + isInUpperRightHalf(x, y, trapezoidLeft) || + isInRect(x, y, trapezoidCenter) || + isInUpperLeftHalf(x, y, trapezoidRight) + ) { + return; + } + } else { + const trapezoidLeft = { + top: targetRect.top, + right: targetRect.left, + bottom: contentRect.top, + left: contentRect.left - buffer, + }; + const trapezoidCenter = { + top: targetRect.top, + right: targetRect.right, + bottom: contentRect.top, + left: targetRect.left, + }; + const trapezoidRight = { + top: targetRect.top, + right: contentRect.right + buffer, + bottom: contentRect.top, + left: targetRect.right, + }; + + if ( + isInLowerRightHalf(x, y, trapezoidLeft) || + isInRect(x, y, trapezoidCenter) || + isInLowerLeftHalf(x, y, trapezoidRight) + ) { + return; + } + } + + this.hideTooltip(); } onTargetMouseOver = (ev) => { @@ -149,12 +276,12 @@ export default class InteractiveTooltip extends React.Component { // edge, flip around to below the target. const position = {}; let chevronFace = null; - if (contentRect && (targetTop - contentRect.height <= MIN_SAFE_DISTANCE_TO_WINDOW_EDGE)) { - position.top = targetBottom; - chevronFace = "top"; - } else { + if (this.canTooltipFitAboveTarget()) { position.bottom = window.innerHeight - targetTop; chevronFace = "bottom"; + } else { + position.top = targetBottom; + chevronFace = "top"; } // Center the tooltip horizontally with the target's center. From db560989da56f6b4ba20d05e12f44473dec94ceb Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 17 Jul 2019 14:47:10 +0100 Subject: [PATCH 16/23] Enable reactions and edits by default This enables reactions and edits by default, assuming you don't have any local device settings that would disable them. Fixes https://github.com/vector-im/riot-web/issues/10281 --- src/settings/Settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/settings/Settings.js b/src/settings/Settings.js index 2ce1b1aa4e..f07cf891b9 100644 --- a/src/settings/Settings.js +++ b/src/settings/Settings.js @@ -118,13 +118,13 @@ export const SETTINGS = { isFeature: true, displayName: _td("Edit messages after they have been sent (refresh to apply changes)"), supportedLevels: LEVELS_FEATURE, - default: false, + default: true, }, "feature_reactions": { isFeature: true, displayName: _td("React to messages with emoji (refresh to apply changes)"), supportedLevels: LEVELS_FEATURE, - default: false, + default: true, }, "MessageComposerInput.suggestEmoji": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, From 19b3b41ad6567a9a062e70b9ca1bb4488c2ae028 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 17 Jul 2019 14:48:14 +0100 Subject: [PATCH 17/23] Continue to next config level after device for features This ensures we continue checking further config levels for the feature setting if nothing is found when reading the device level. For example, this means the feature setting's default value can be used. --- src/settings/handlers/DeviceSettingsHandler.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/settings/handlers/DeviceSettingsHandler.js b/src/settings/handlers/DeviceSettingsHandler.js index b5c4382768..780815efd1 100644 --- a/src/settings/handlers/DeviceSettingsHandler.js +++ b/src/settings/handlers/DeviceSettingsHandler.js @@ -122,7 +122,10 @@ export default class DeviceSettingsHandler extends SettingsHandler { } const value = localStorage.getItem("mx_labs_feature_" + featureName); - return value === "true"; + if (value === "true") return true; + if (value === "false") return false; + // Try to read the next config level for the feature. + return null; } _writeFeature(featureName, enabled) { From 25351d552eeebaa7ff5423478288e067af67b56b Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 17 Jul 2019 16:56:15 +0100 Subject: [PATCH 18/23] Remove editing feature flag Part of https://github.com/vector-im/riot-web/issues/10282 --- src/MatrixClientPeg.js | 5 +---- src/components/structures/MessagePanel.js | 3 +-- src/components/views/messages/MessageActionBar.js | 6 +----- src/components/views/rooms/EventTile.js | 2 +- src/components/views/rooms/MessageComposerInput.js | 5 ++--- src/i18n/strings/en_EN.json | 1 - src/settings/Settings.js | 6 ------ src/shouldHideEvent.js | 2 +- 8 files changed, 7 insertions(+), 23 deletions(-) diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js index b2a63efd4c..d2760bc82c 100644 --- a/src/MatrixClientPeg.js +++ b/src/MatrixClientPeg.js @@ -208,9 +208,6 @@ class MatrixClientPeg { } _createClient(creds: MatrixClientCreds) { - const aggregateRelations = SettingsStore.isFeatureEnabled("feature_reactions"); - const enableEdits = SettingsStore.isFeatureEnabled("feature_message_editing"); - const opts = { baseUrl: creds.homeserverUrl, idBaseUrl: creds.identityServerUrl, @@ -220,7 +217,7 @@ class MatrixClientPeg { timelineSupport: true, forceTURN: !SettingsStore.getValue('webRtcAllowPeerToPeer', false), verificationMethods: [verificationMethods.SAS], - unstableClientRelationAggregation: aggregateRelations || enableEdits, + unstableClientRelationAggregation: true, }; this.matrixClient = createMatrixClient(opts); diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 37a8a2d4c9..1fb0d6c725 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -110,7 +110,6 @@ module.exports = React.createClass({ }, componentWillMount: function() { - this._editingEnabled = SettingsStore.isFeatureEnabled("feature_message_editing"); // the event after which we put a visible unread marker on the last // render cycle; null if readMarkerVisible was false or the RM was // suppressed (eg because it was at the end of the timeline) @@ -586,7 +585,7 @@ module.exports = React.createClass({ ; } - if (this.isEditingEnabled() && canEditContent(this.props.mxEvent)) { + if (canEditContent(this.props.mxEvent)) { editButton = Date: Wed, 17 Jul 2019 17:00:36 +0100 Subject: [PATCH 19/23] Remove reactions feature flag Fixes https://github.com/vector-im/riot-web/issues/10282 --- src/components/views/messages/MessageActionBar.js | 9 --------- src/components/views/rooms/EventTile.js | 9 ++++----- src/i18n/strings/en_EN.json | 1 - src/settings/Settings.js | 6 ------ 4 files changed, 4 insertions(+), 21 deletions(-) diff --git a/src/components/views/messages/MessageActionBar.js b/src/components/views/messages/MessageActionBar.js index 4a0d4d5b07..6f58dd7bef 100644 --- a/src/components/views/messages/MessageActionBar.js +++ b/src/components/views/messages/MessageActionBar.js @@ -22,7 +22,6 @@ import sdk from '../../../index'; import dis from '../../../dispatcher'; import Modal from '../../../Modal'; import { createMenu } from '../../structures/ContextualMenu'; -import SettingsStore from '../../../settings/SettingsStore'; import { isContentActionable, canEditContent } from '../../../utils/EventUtils'; export default class MessageActionBar extends React.PureComponent { @@ -123,15 +122,7 @@ export default class MessageActionBar extends React.PureComponent { this.onFocusChange(true); } - isReactionsEnabled() { - return SettingsStore.isFeatureEnabled("feature_reactions"); - } - renderReactButton() { - if (!this.isReactionsEnabled()) { - return null; - } - const ReactMessageAction = sdk.getComponent('messages.ReactMessageAction'); const { mxEvent, reactions } = this.props; diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index ee1147c062..ae8b1ee5d3 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -202,7 +202,7 @@ module.exports = withMatrixClient(React.createClass({ const client = this.props.matrixClient; client.on("deviceVerificationChanged", this.onDeviceVerificationChanged); this.props.mxEvent.on("Event.decrypted", this._onDecrypted); - if (this.props.showReactions && SettingsStore.isFeatureEnabled("feature_reactions")) { + if (this.props.showReactions) { this.props.mxEvent.on("Event.relationsCreated", this._onReactionsCreated); } }, @@ -227,7 +227,7 @@ module.exports = withMatrixClient(React.createClass({ const client = this.props.matrixClient; client.removeListener("deviceVerificationChanged", this.onDeviceVerificationChanged); this.props.mxEvent.removeListener("Event.decrypted", this._onDecrypted); - if (this.props.showReactions && SettingsStore.isFeatureEnabled("feature_reactions")) { + if (this.props.showReactions) { this.props.mxEvent.removeListener("Event.relationsCreated", this._onReactionsCreated); } }, @@ -490,8 +490,7 @@ module.exports = withMatrixClient(React.createClass({ getReactions() { if ( !this.props.showReactions || - !this.props.getRelationsForEvent || - !SettingsStore.isFeatureEnabled("feature_reactions") + !this.props.getRelationsForEvent ) { return null; } @@ -681,7 +680,7 @@ module.exports = withMatrixClient(React.createClass({
: null; let reactionsRow; - if (SettingsStore.isFeatureEnabled("feature_reactions") && !isRedacted) { + if (!isRedacted) { const ReactionsRow = sdk.getComponent('messages.ReactionsRow'); reactionsRow = Date: Thu, 18 Jul 2019 14:09:29 +0200 Subject: [PATCH 20/23] dont show remove button for original event in edit history --- .../views/dialogs/MessageEditHistoryDialog.js | 10 +++++++++- src/components/views/messages/EditHistoryMessage.js | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/MessageEditHistoryDialog.js b/src/components/views/dialogs/MessageEditHistoryDialog.js index 9ba570292f..56e208e464 100644 --- a/src/components/views/dialogs/MessageEditHistoryDialog.js +++ b/src/components/views/dialogs/MessageEditHistoryDialog.js @@ -107,11 +107,19 @@ export default class MessageEditHistoryDialog extends React.PureComponent { if (this.state.originalEvent && !this.state.nextBatch) { allEvents = allEvents.concat(this.state.originalEvent); } + const baseEventId = this.props.mxEvent.getId(); allEvents.forEach(e => { if (!lastEvent || wantsDateSeparator(lastEvent.getDate(), e.getDate())) { nodes.push(
  • ); } - nodes.push(); + const isBaseEvent = e.getId() === baseEventId; + nodes.push(( + )); lastEvent = e; }); return nodes; diff --git a/src/components/views/messages/EditHistoryMessage.js b/src/components/views/messages/EditHistoryMessage.js index fe8d465698..b95f57c723 100644 --- a/src/components/views/messages/EditHistoryMessage.js +++ b/src/components/views/messages/EditHistoryMessage.js @@ -94,7 +94,7 @@ export default class EditHistoryMessage extends React.PureComponent { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); // hide the button when already redacted let redactButton; - if (!this.props.mxEvent.isRedacted()) { + if (!this.props.mxEvent.isRedacted() && !this.props.isBaseEvent) { redactButton = ( {_t("Remove")} From 480061bde34aac823611d3652eca5e907731c548 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 18 Jul 2019 15:46:38 +0100 Subject: [PATCH 21/23] Upgrade JS SDK to v2.2.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index fe05e6ea31..45e01a14b1 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "linkifyjs": "^2.1.6", "lodash": "^4.17.14", "lolex": "2.3.2", - "matrix-js-sdk": "2.2.0-rc.2", + "matrix-js-sdk": "2.2.0", "optimist": "^0.6.1", "pako": "^1.0.5", "png-chunks-extract": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index 5948f8866c..2ee2604b28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4938,10 +4938,10 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.1.tgz#6dff66c99d55ecf739ca53c492e626f1d12a33cc" integrity sha512-pWB896KPGSGkp1XtyzRBftpTzwSOL0Gfk0wLvxt4f2mgzjY19o0LxJ3U25vNWTzsh7da+KTbuXQoQ3lOJZ8WHw== -matrix-js-sdk@2.2.0-rc.2: - version "2.2.0-rc.2" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-2.2.0-rc.2.tgz#aeb2357c9ea69591657d0d6c0fba8fcbcf0e40c7" - integrity sha512-glT0/yV6+AypedNi7K0Xugjj0Q9bOQRVEbVfhO2O22ei+qqkCAUsGqGssCIumvfNh9QAh+OXCfn4goLFrANtew== +matrix-js-sdk@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-2.2.0.tgz#c96a2caa4c92e5998443027579d7e76d4bcd4d21" + integrity sha512-gab7wuscgTKbXY5x136t9qSnDbOuq785ezd++NoFLEau0YjDos0YKolAm0TValUC9LY30CoVqqMfyPJ68CMezQ== dependencies: another-json "^0.2.0" babel-runtime "^6.26.0" From 8b0e36e8842a85031ef9bc1d84925f5aa510ad32 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 18 Jul 2019 15:50:45 +0100 Subject: [PATCH 22/23] Prepare changelog for v1.4.0 --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 247da51365..6a6c7979f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +Changes in [1.4.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.4.0) (2019-07-18) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.4.0-rc.3...v1.4.0) + + * Upgrade to JS SDK 2.2.0 + * Don't show remove button for original event in edit history + [\#3236](https://github.com/matrix-org/matrix-react-sdk/pull/3236) + * Remove feature flags for reactions and edits + [\#3234](https://github.com/matrix-org/matrix-react-sdk/pull/3234) + * Enable reactions and edits by default + [\#3232](https://github.com/matrix-org/matrix-react-sdk/pull/3232) + * Improve interactive tooltip safe mousing area + [\#3231](https://github.com/matrix-org/matrix-react-sdk/pull/3231) + * Add a previous event safe area around action bar + [\#3230](https://github.com/matrix-org/matrix-react-sdk/pull/3230) + Changes in [1.4.0-rc.3](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v1.4.0-rc.3) (2019-07-15) ============================================================================================================= [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v1.4.0-rc.2...v1.4.0-rc.3) From 3c0c64af8e4e3349f55984b5a0cffda3ffe2eaf3 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Thu, 18 Jul 2019 15:50:46 +0100 Subject: [PATCH 23/23] v1.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 45e01a14b1..bfee66c5fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "1.4.0-rc.3", + "version": "1.4.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": {