);
@@ -760,9 +805,6 @@ module.exports = withMatrixClient(React.createClass({
;
}
- // 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
-
let adminTools;
if (kickButton || banButton || muteButton || giveModButton) {
adminTools =
@@ -790,9 +832,29 @@ module.exports = withMatrixClient(React.createClass({
presenceCurrentlyActive = this.props.member.user.currentlyActive;
}
+ let roomMemberDetails = null;
+
+ if (this.props.member.roomId) { // is in room
+ const PowerSelector = sdk.getComponent('elements.PowerSelector');
+ const PresenceLabel = sdk.getComponent('rooms.PresenceLabel');
+ roomMemberDetails =
);
diff --git a/src/components/views/voip/VideoView.js b/src/components/views/voip/VideoView.js
index 8f062d27ae..748673f1a5 100644
--- a/src/components/views/voip/VideoView.js
+++ b/src/components/views/voip/VideoView.js
@@ -18,10 +18,13 @@ limitations under the License.
import React from 'react';
import ReactDOM from 'react-dom';
+import classNames from 'classnames';
import sdk from '../../../index';
import dis from '../../../dispatcher';
+import UserSettingsStore from '../../../UserSettingsStore';
+
module.exports = React.createClass({
displayName: 'VideoView',
@@ -108,14 +111,18 @@ module.exports = React.createClass({
document.mozFullScreenElement ||
document.webkitFullscreenElement);
const maxVideoHeight = fullscreenElement ? null : this.props.maxHeight;
-
+ const localVideoFeedClasses = classNames("mx_VideoView_localVideoFeed",
+ { "mx_VideoView_localVideoFeed_flipped":
+ UserSettingsStore.getSyncedSetting('VideoView.flipVideoHorizontally', false),
+ },
+ );
return (
-
+
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 94b9e7bfc3..6fd82757f0 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -152,6 +152,7 @@
"%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s",
"Communities": "Communities",
"Message Pinning": "Message Pinning",
+ "Mention": "Mention",
"%(displayName)s is typing": "%(displayName)s is typing",
"%(names)s and %(count)s others are typing|other": "%(names)s and %(count)s others are typing",
"%(names)s and %(count)s others are typing|one": "%(names)s and one other is typing",
@@ -200,8 +201,6 @@
"Authentication": "Authentication",
"Failed to delete device": "Failed to delete device",
"Delete": "Delete",
- "Delete Widget": "Delete Widget",
- "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?",
"Disable Notifications": "Disable Notifications",
"Enable Notifications": "Enable Notifications",
"Cannot add any more widgets": "Cannot add any more widgets",
@@ -245,6 +244,7 @@
"Unignore": "Unignore",
"Ignore": "Ignore",
"Jump to read receipt": "Jump to read receipt",
+ "Invite": "Invite",
"User Options": "User Options",
"Direct chats": "Direct chats",
"Unmute": "Unmute",
@@ -456,6 +456,7 @@
"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?": "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?",
"Removed or unknown message type": "Removed or unknown message type",
"Message removed by %(userId)s": "Message removed by %(userId)s",
+ "Message removed": "Message removed",
"Robot check is currently unavailable on desktop - please use a web browser": "Robot check is currently unavailable on desktop - please use a web browser",
"This Home Server would like to make sure you are not a robot": "This Home Server would like to make sure you are not a robot",
"Sign in with CAS": "Sign in with CAS",
@@ -500,10 +501,13 @@
"Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Are you sure you want to remove '%(roomName)s' from %(groupId)s?",
"Removing a room from the community will also remove it from the community page.": "Removing a room from the community will also remove it from the community page.",
"Remove": "Remove",
+ "Remove this room from the community": "Remove this room from the community",
"Unknown Address": "Unknown Address",
"NOTE: Apps are not end-to-end encrypted": "NOTE: Apps are not end-to-end encrypted",
"Do you want to load widget from URL:": "Do you want to load widget from URL:",
"Allow": "Allow",
+ "Delete Widget": "Delete Widget",
+ "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?",
"Delete widget": "Delete widget",
"Revoke widget access": "Revoke widget access",
"Edit": "Edit",
@@ -688,8 +692,8 @@
"Featured Rooms:": "Featured Rooms:",
"Featured Users:": "Featured Users:",
"%(inviter)s has invited you to join this community": "%(inviter)s has invited you to join this community",
- "You are a member of this community": "You are a member of this community",
"You are an administrator of this community": "You are an administrator of this community",
+ "You are a member of this community": "You are a member of this community",
"Community Member Settings": "Community Member Settings",
"Publish this community on your profile": "Publish this community on your profile",
"Long Description (HTML)": "Long Description (HTML)",
@@ -759,6 +763,7 @@
"Disable Emoji suggestions while typing": "Disable Emoji suggestions while typing",
"Hide avatars in user and room mentions": "Hide avatars in user and room mentions",
"Disable big emoji in chat": "Disable big emoji in chat",
+ "Mirror local video feed": "Mirror local video feed",
"Opt out of analytics": "Opt out of analytics",
"Disable Peer-to-Peer for 1:1 calls": "Disable Peer-to-Peer for 1:1 calls",
"Never send encrypted messages to unverified devices from this device": "Never send encrypted messages to unverified devices from this device",
diff --git a/src/stores/GroupStore.js b/src/stores/GroupStore.js
index 1da1c35a2b..66bc293b44 100644
--- a/src/stores/GroupStore.js
+++ b/src/stores/GroupStore.js
@@ -29,9 +29,10 @@ export default class GroupStore extends EventEmitter {
this._matrixClient = matrixClient;
this._summary = {};
this._rooms = [];
- this._fetchSummary();
- this._fetchRooms();
- this._fetchMembers();
+
+ this.on('error', (err) => {
+ console.error(`GroupStore for ${this.groupId} encountered error`, err);
+ });
}
_fetchMembers() {
@@ -51,6 +52,10 @@ export default class GroupStore extends EventEmitter {
});
this._notifyListeners();
}).catch((err) => {
+ // Invited users not visible to non-members
+ if (err.httpStatus === 403) {
+ return;
+ }
console.error("Failed to get group invited member list: " + err);
this.emit('error', err);
});
@@ -80,6 +85,17 @@ export default class GroupStore extends EventEmitter {
this.emit('update');
}
+ registerListener(fn) {
+ this.on('update', fn);
+ this._fetchSummary();
+ this._fetchRooms();
+ this._fetchMembers();
+ }
+
+ unregisterListener(fn) {
+ this.removeListener('update', fn);
+ }
+
getSummary() {
return this._summary;
}
diff --git a/test/components/views/elements/MemberEventListSummary-test.js b/test/components/views/elements/MemberEventListSummary-test.js
index 1618fe4cfe..436133c717 100644
--- a/test/components/views/elements/MemberEventListSummary-test.js
+++ b/test/components/views/elements/MemberEventListSummary-test.js
@@ -88,6 +88,9 @@ describe('MemberEventListSummary', function() {
sandbox = testUtils.stubClient();
languageHandler.setLanguage('en').done(done);
+ languageHandler.setMissingEntryGenerator(function(key) {
+ return key.split('|', 2)[1];
+ });
});
afterEach(function() {