diff --git a/CHANGELOG.md b/CHANGELOG.md
index 22049b6af6..8bc4bbcfce 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+Changes in [0.9.7](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.7) (2017-06-22)
+===================================================================================================
+[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.6...v0.9.7)
+
+ * Fix ability to invite users with caps in their user IDs
+ [\#1128](https://github.com/matrix-org/matrix-react-sdk/pull/1128)
+ * Fix another race with first-sync
+ [\#1131](https://github.com/matrix-org/matrix-react-sdk/pull/1131)
+ * Make the indexeddb worker script work again
+ [\#1132](https://github.com/matrix-org/matrix-react-sdk/pull/1132)
+ * Use the web worker when clearing js-sdk stores
+ [\#1133](https://github.com/matrix-org/matrix-react-sdk/pull/1133)
+
Changes in [0.9.6](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.9.6) (2017-06-20)
===================================================================================================
[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.9.5...v0.9.6)
diff --git a/package.json b/package.json
index f49fc04661..cbc06c9771 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "matrix-react-sdk",
- "version": "0.9.6",
+ "version": "0.9.7",
"description": "SDK for matrix.org using React",
"author": "matrix.org",
"repository": {
@@ -64,7 +64,7 @@
"isomorphic-fetch": "^2.2.1",
"linkifyjs": "^2.1.3",
"lodash": "^4.13.1",
- "matrix-js-sdk": "0.7.12",
+ "matrix-js-sdk": "0.7.13",
"optimist": "^0.6.1",
"prop-types": "^15.5.8",
"q": "^1.4.1",
diff --git a/src/BasePlatform.js b/src/BasePlatform.js
index d0d8e0c74e..a920479823 100644
--- a/src/BasePlatform.js
+++ b/src/BasePlatform.js
@@ -17,6 +17,8 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
+import dis from './dispatcher';
+
/**
* Base class for classes that provide platform-specific functionality
* eg. Setting an application badge or displaying notifications
@@ -27,6 +29,16 @@ export default class BasePlatform {
constructor() {
this.notificationCount = 0;
this.errorDidOccur = false;
+
+ dis.register(this._onAction.bind(this));
+ }
+
+ _onAction(payload: Object) {
+ switch (payload.action) {
+ case 'on_logged_out':
+ this.setNotificationCount(0);
+ break;
+ }
}
// Used primarily for Analytics
diff --git a/src/DateUtils.js b/src/DateUtils.js
index 0bce7c8a16..545d92dd3b 100644
--- a/src/DateUtils.js
+++ b/src/DateUtils.js
@@ -60,7 +60,7 @@ function twelveHourTime(date) {
}
module.exports = {
- formatDate: function(date) {
+ formatDate: function(date, showTwelveHour=false) {
var now = new Date();
const days = getDaysArray();
const months = getMonthsArray();
@@ -69,7 +69,7 @@ module.exports = {
}
else if (now.getTime() - date.getTime() < 6 * 24 * 60 * 60 * 1000) {
// TODO: use standard date localize function provided in counterpart
- return _t('%(weekDayName)s %(time)s', {weekDayName: days[date.getDay()], time: this.formatTime(date)});
+ return _t('%(weekDayName)s %(time)s', {weekDayName: days[date.getDay()], time: this.formatTime(date, showTwelveHour)});
}
else if (now.getFullYear() === date.getFullYear()) {
// TODO: use standard date localize function provided in counterpart
@@ -80,7 +80,7 @@ module.exports = {
time: this.formatTime(date),
});
}
- return this.formatFullDate(date);
+ return this.formatFullDate(date, showTwelveHour);
},
formatFullDate: function(date, showTwelveHour=false) {
diff --git a/src/Lifecycle.js b/src/Lifecycle.js
index 59580e7cb6..06f5d9ef00 100644
--- a/src/Lifecycle.js
+++ b/src/Lifecycle.js
@@ -29,7 +29,6 @@ import DMRoomMap from './utils/DMRoomMap';
import RtsClient from './RtsClient';
import Modal from './Modal';
import sdk from './index';
-import { _t } from './languageHandler';
/**
* Called at startup, to attempt to build a logged-in Matrix session. It tries
@@ -156,7 +155,7 @@ export function attemptTokenLogin(queryParams, defaultDeviceDisplayName) {
}
function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) {
- console.log("Doing guest login on %s", hsUrl);
+ console.log(`Doing guest login on ${hsUrl}`);
// TODO: we should probably de-duplicate this and Login.loginAsGuest.
// Not really sure where the right home for it is.
@@ -171,7 +170,7 @@ function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) {
initial_device_display_name: defaultDeviceDisplayName,
},
}).then((creds) => {
- console.log("Registered as guest: %s", creds.user_id);
+ console.log(`Registered as guest: ${creds.user_id}`);
return _doSetLoggedIn({
userId: creds.user_id,
deviceId: creds.device_id,
@@ -215,7 +214,7 @@ function _restoreFromLocalStorage() {
}
if (accessToken && userId && hsUrl) {
- console.log("Restoring session for %s", userId);
+ console.log(`Restoring session for ${userId}`);
try {
return _doSetLoggedIn({
userId: userId,
@@ -237,27 +236,12 @@ function _restoreFromLocalStorage() {
function _handleRestoreFailure(e) {
console.log("Unable to restore session", e);
- let msg = e.message;
- if (msg == "OLM.BAD_LEGACY_ACCOUNT_PICKLE") {
- msg = _t(
- 'You need to log back in to generate end-to-end encryption keys'
- + ' for this device and submit the public key to your homeserver.'
- + ' This is a once off; sorry for the inconvenience.',
- );
-
- _clearStorage();
-
- return q.reject(new Error(
- _t('Unable to restore previous session') + ': ' + msg,
- ));
- }
-
const def = q.defer();
const SessionRestoreErrorDialog =
sdk.getComponent('views.dialogs.SessionRestoreErrorDialog');
Modal.createDialog(SessionRestoreErrorDialog, {
- error: msg,
+ error: e.message,
onFinished: (success) => {
def.resolve(success);
},
@@ -315,10 +299,10 @@ async function _doSetLoggedIn(credentials, clearStorage) {
credentials.guest = Boolean(credentials.guest);
console.log(
- "setLoggedIn: mxid:", credentials.userId,
- "deviceId:", credentials.deviceId,
- "guest:", credentials.guest,
- "hs:", credentials.homeserverUrl,
+ "setLoggedIn: mxid: " + credentials.userId +
+ " deviceId: " + credentials.deviceId +
+ " guest: " + credentials.guest +
+ " hs: " + credentials.homeserverUrl,
);
// This is dispatched to indicate that the user is still in the process of logging in
@@ -395,7 +379,7 @@ function _persistCredentialsToLocalStorage(credentials) {
localStorage.setItem("mx_device_id", credentials.deviceId);
}
- console.log("Session persisted for %s", credentials.userId);
+ console.log(`Session persisted for ${credentials.userId}`);
}
/**
diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js
index 47370e2142..0676e4600f 100644
--- a/src/MatrixClientPeg.js
+++ b/src/MatrixClientPeg.js
@@ -1,5 +1,6 @@
/*
Copyright 2015, 2016 OpenMarket Ltd
+Copyright 2017 Vector Creations Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -47,7 +48,6 @@ class MatrixClientPeg {
this.opts = {
initialSyncLimit: 20,
};
- this.indexedDbWorkerScript = null;
}
/**
@@ -58,7 +58,7 @@ class MatrixClientPeg {
* @param {string} script href to the script to be passed to the web worker
*/
setIndexedDbWorkerScript(script) {
- this.indexedDbWorkerScript = script;
+ createMatrixClient.indexedDbWorkerScript = script;
}
get(): MatrixClient {
@@ -84,7 +84,9 @@ class MatrixClientPeg {
let promise = this.matrixClient.store.startup();
// log any errors when starting up the database (if one exists)
- promise.catch((err) => { console.error(err); });
+ promise.catch((err) => {
+ console.error(`Error starting matrixclient store: ${err}`);
+ });
// regardless of errors, start the client. If we did error out, we'll
// just end up doing a full initial /sync.
@@ -127,7 +129,7 @@ class MatrixClientPeg {
timelineSupport: true,
};
- this.matrixClient = createMatrixClient(opts);
+ this.matrixClient = createMatrixClient(opts, this.indexedDbWorkerScript);
// we're going to add eventlisteners for each matrix event tile, so the
// potential number of event listeners is quite high.
diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js
index 8b0bcaad68..051e49acda 100644
--- a/src/components/structures/LoggedInView.js
+++ b/src/components/structures/LoggedInView.js
@@ -212,6 +212,7 @@ export default React.createClass({
const HomePage = sdk.getComponent('structures.HomePage');
const MatrixToolbar = sdk.getComponent('globals.MatrixToolbar');
const NewVersionBar = sdk.getComponent('globals.NewVersionBar');
+ const UpdateCheckBar = sdk.getComponent('globals.UpdateCheckBar');
const PasswordNagBar = sdk.getComponent('globals.PasswordNagBar');
let page_element;
@@ -281,12 +282,14 @@ export default React.createClass({
break;
}
+ let topBar;
const isGuest = this.props.matrixClient.isGuest();
- var topBar;
if (this.props.hasNewVersion) {
topBar = ;
+ } else if (this.props.checkingForUpdate) {
+ topBar = ;
} else if (this.state.userHasGeneratedPassword) {
topBar = ;
} else if (!isGuest && Notifier.supportsDesktopNotifications() && !Notifier.isEnabled() && !Notifier.isToolbarHidden()) {
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index 97a0962741..0992d486f6 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -157,6 +157,7 @@ module.exports = React.createClass({
newVersion: null,
hasNewVersion: false,
newVersionReleaseNotes: null,
+ checkingForUpdate: null,
// Parameters used in the registration dance with the IS
register_client_secret: null,
@@ -330,7 +331,7 @@ module.exports = React.createClass({
defaultDeviceDisplayName: this.props.defaultDeviceDisplayName,
});
}).catch((e) => {
- console.error("Unable to load session", e);
+ console.error(`Error attempting to load session: ${e}`);
return false;
}).then((loadedSession) => {
if (!loadedSession) {
@@ -555,6 +556,9 @@ module.exports = React.createClass({
payload.releaseNotes,
);
break;
+ case 'check_updates':
+ this.setState({ checkingForUpdate: payload.value });
+ break;
case 'send_event':
this.onSendEvent(payload.room_id, payload.event);
break;
@@ -942,10 +946,6 @@ module.exports = React.createClass({
dis.dispatch({action: 'view_home_page'});
} else if (this._is_registered) {
this._is_registered = false;
- // reset the 'have completed first sync' flag,
- // since we've just logged in and will be about to sync
- this.firstSyncComplete = false;
- this.firstSyncPromise = q.defer();
// Set the display name = user ID localpart
MatrixClientPeg.get().setDisplayName(
@@ -1003,6 +1003,7 @@ module.exports = React.createClass({
page_type: PageTypes.RoomDirectory,
});
this._teamToken = null;
+ this._setPageSubtitle();
},
/**
@@ -1015,6 +1016,12 @@ module.exports = React.createClass({
// Set ready to false now, then it'll be set to true when the sync
// listener we set below fires.
this.setState({ready: false});
+
+ // reset the 'have completed first sync' flag,
+ // since we're about to start the client and therefore about
+ // to do the first sync
+ this.firstSyncComplete = false;
+ this.firstSyncPromise = q.defer();
const cli = MatrixClientPeg.get();
// Allow the JS SDK to reap timeline events. This reduces the amount of
@@ -1297,6 +1304,7 @@ module.exports = React.createClass({
newVersion: latest,
hasNewVersion: current !== latest,
newVersionReleaseNotes: releaseNotes,
+ checkingForUpdate: null,
});
},
@@ -1321,6 +1329,10 @@ module.exports = React.createClass({
});
},
+ _setPageSubtitle: function(subtitle='') {
+ document.title = `Riot ${subtitle}`;
+ },
+
updateStatusIndicator: function(state, prevState) {
let notifCount = 0;
@@ -1341,15 +1353,15 @@ module.exports = React.createClass({
PlatformPeg.get().setNotificationCount(notifCount);
}
- let title = "Riot ";
+ let subtitle = '';
if (state === "ERROR") {
- title += `[${_t("Offline")}] `;
+ subtitle += `[${_t("Offline")}] `;
}
if (notifCount > 0) {
- title += `[${notifCount}]`;
+ subtitle += `[${notifCount}]`;
}
- document.title = title;
+ this._setPageSubtitle(subtitle);
},
onUserSettingsClose: function() {
diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js
index 686e63cd75..9a5eb07cde 100644
--- a/src/components/structures/UserSettings.js
+++ b/src/components/structures/UserSettings.js
@@ -276,6 +276,16 @@ module.exports = React.createClass({
}
},
+ // `UserSettings` assumes that the client peg will not be null, so give it some
+ // sort of assurance here by only allowing a re-render if the client is truthy.
+ //
+ // This is required because `UserSettings` maintains its own state and if this state
+ // updates (e.g. during _setStateFromSessionStore) after the client peg has been made
+ // null (during logout), then it will attempt to re-render and throw errors.
+ shouldComponentUpdate: function() {
+ return Boolean(MatrixClientPeg.get());
+ },
+
_setStateFromSessionStore: function() {
this.setState({
userHasGeneratedPassword: Boolean(this._sessionStore.getCachedPassword()),
@@ -874,6 +884,21 @@ module.exports = React.createClass({
;
},
+ _renderCheckUpdate: function() {
+ const platform = PlatformPeg.get();
+ if ('canSelfUpdate' in platform && platform.canSelfUpdate() && 'startUpdateCheck' in platform) {
+ return
+
{_t('Updates')}
+
+
+ {_t('Check for update')}
+
+
+
;
+ }
+ return ;
+ },
+
_renderBulkOptions: function() {
const invitedRooms = MatrixClientPeg.get().getRooms().filter((r) => {
return r.hasMembershipState(this._me, "invite");
@@ -1275,6 +1300,8 @@ module.exports = React.createClass({
+ {this._renderCheckUpdate()}
+
{this._renderClearCache()}
{this._renderDeactivateAccount()}
diff --git a/src/components/views/dialogs/ChatInviteDialog.js b/src/components/views/dialogs/ChatInviteDialog.js
index 9a14cb91d3..a85efadef7 100644
--- a/src/components/views/dialogs/ChatInviteDialog.js
+++ b/src/components/views/dialogs/ChatInviteDialog.js
@@ -178,7 +178,7 @@ module.exports = React.createClass({
},
onQueryChanged: function(ev) {
- const query = ev.target.value.toLowerCase();
+ const query = ev.target.value;
if (this.queryChangedDebouncer) {
clearTimeout(this.queryChangedDebouncer);
}
@@ -271,10 +271,11 @@ module.exports = React.createClass({
query,
searchError: null,
});
+ const queryLowercase = query.toLowerCase();
const results = [];
MatrixClientPeg.get().getUsers().forEach((user) => {
- if (user.userId.toLowerCase().indexOf(query) === -1 &&
- user.displayName.toLowerCase().indexOf(query) === -1
+ if (user.userId.toLowerCase().indexOf(queryLowercase) === -1 &&
+ user.displayName.toLowerCase().indexOf(queryLowercase) === -1
) {
return;
}
diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js
index 5c970a0966..170925999d 100644
--- a/src/components/views/rooms/EventTile.js
+++ b/src/components/views/rooms/EventTile.js
@@ -336,6 +336,7 @@ module.exports = WithMatrixClient(React.createClass({
suppressAnimation={this._suppressReadReceiptAnimation}
onClick={this.toggleAllReadAvatars}
timestamp={receipt.ts}
+ showTwelveHour={this.props.isTwelveHour}
/>
);
}
diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.js
index 7565b0741d..64b54fe1e1 100644
--- a/src/components/views/rooms/ReadReceiptMarker.js
+++ b/src/components/views/rooms/ReadReceiptMarker.js
@@ -66,6 +66,9 @@ module.exports = React.createClass({
// Timestamp when the receipt was read
timestamp: React.PropTypes.number,
+
+ // True to show twelve hour format, false otherwise
+ showTwelveHour: React.PropTypes.bool,
},
getDefaultProps: function() {
@@ -172,7 +175,7 @@ module.exports = React.createClass({
if (this.props.timestamp) {
title = _t(
"Seen by %(userName)s at %(dateTime)s",
- {userName: this.props.member.userId, dateTime: DateUtils.formatDate(new Date(this.props.timestamp))}
+ {userName: this.props.member.userId, dateTime: DateUtils.formatDate(new Date(this.props.timestamp), this.props.showTwelveHour)}
);
}
diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json
index 9dadc611d1..8231040a45 100644
--- a/src/i18n/strings/de_DE.json
+++ b/src/i18n/strings/de_DE.json
@@ -305,7 +305,6 @@
"You are already in a call.": "Du bist bereits in einem Gespräch.",
"You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.",
"You cannot place VoIP calls in this browser.": "VoIP-Gespräche werden von diesem Browser nicht unterstützt.",
- "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Du musst dich erneut anmelden, um Ende-zu-Ende-Verschlüsselungs-Schlüssel für dieses Gerät zu generieren und um den öffentlichen Schlüssel auf deinem Homeserver zu hinterlegen. Dies muss nur einmal durchgeführt werden, bitte entschuldige die Unannehmlichkeiten.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Heimserver verbunden zu sein.",
"Sun": "So",
"Mon": "Mo",
diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json
index d5b31baaf5..f776d50ee3 100644
--- a/src/i18n/strings/el.json
+++ b/src/i18n/strings/el.json
@@ -861,7 +861,6 @@
"since the point in time of selecting this option": "από το χρονικό σημείο επιλογής αυτής της ρύθμισης",
"The signing key you provided matches the signing key you received from %(userId)s's device %(deviceId)s. Device marked as verified.": "Το κλειδί υπογραφής που δώσατε αντιστοιχεί στο κλειδί υπογραφής που λάβατε από τη συσκευή %(userId)s %(deviceId)s. Η συσκευή έχει επισημανθεί ως επιβεβαιωμένη.",
"To link to a room it must have an address.": "Για να συνδεθείτε σε ένα δωμάτιο πρέπει να έχετε μια διεύθυνση.",
- "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Πρέπει να συνδεθείτε ξανά για να δημιουργήσετε τα κλειδιά κρυπτογράφησης από άκρο σε άκρο για αυτήν τη συσκευή και να υποβάλετε το δημόσιο κλειδί στον διακομιστή σας. Αυτό θα χρειαστεί να γίνει μόνο μια φορά.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Η διεύθυνση ηλεκτρονικής αλληλογραφίας σας δεν φαίνεται να συσχετίζεται με Matrix ID σε αυτόν τον διακομιστή.",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς. Δεν θα λάβετε ειδοποιήσεις push σε άλλες συσκευές μέχρι να συνδεθείτε ξανά σε αυτές",
"You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Δεν θα μπορέσετε να αναιρέσετε αυτήν την αλλαγή καθώς προωθείτε τον χρήστη να έχει το ίδιο επίπεδο δύναμης με τον εαυτό σας.",
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 6334c797e8..a4dcb2873f 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -668,7 +668,6 @@
"You need to be able to invite users to do that.": "You need to be able to invite users to do that.",
"You need to be logged in.": "You need to be logged in.",
"You need to enter a user name.": "You need to enter a user name.",
- "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.",
"Your password has been reset": "Your password has been reset",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them",
@@ -895,6 +894,8 @@
"Online": "Online",
"Idle": "Idle",
"Offline": "Offline",
+ "Updates": "Updates",
+ "Check for update": "Check for update",
"Start chatting": "Start chatting",
"Start Chatting": "Start Chatting",
"Click on the button below to start chatting!": "Click on the button below to start chatting!",
diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json
index 5233111065..e060add84f 100644
--- a/src/i18n/strings/en_US.json
+++ b/src/i18n/strings/en_US.json
@@ -601,7 +601,6 @@
"You need to be able to invite users to do that.": "You need to be able to invite users to do that.",
"You need to be logged in.": "You need to be logged in.",
"You need to enter a user name.": "You need to enter a user name.",
- "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a one-off; sorry for the inconvenience.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Your email address does not appear to be associated with a Matrix ID on this Homeserver.",
"Your password has been reset": "Your password has been reset",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them",
diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json
index 94977071a7..92cc8b66ff 100644
--- a/src/i18n/strings/hu.json
+++ b/src/i18n/strings/hu.json
@@ -675,7 +675,6 @@
"You need to be able to invite users to do that.": "Hogy ezt csinálhasd meg kell tudnod hívni felhasználókat.",
"You need to be logged in.": "Be kell jelentkezz.",
"You need to enter a user name.": "Be kell írnod a felhasználói nevet.",
- "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Ahhoz, hogy kulcsot tudjál készíteni a végponttól végpontig való titkosításhoz ehhez az eszközhöz és elküld a kulcsot a egyéni szerverhez vissza kell jelentkezned. Ez egyszeri alkalom, elnézést a kellemetlenségér.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ez az e-mail cím, úgy néz ki, nincs összekötve a Matrix azonosítóval ezen az egyedi szerveren.",
"Your password has been reset": "A jelszavad visszaállítottuk",
"Your password was successfully changed. You will not receive push notifications on other devices until you log back in to them": "A jelszavadat sikeresen megváltoztattuk. Nem kapsz \"push\" értesítéseket amíg a többi eszközön vissza nem jelentkezel",
diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json
index a8dd8758d4..d48f1a914f 100644
--- a/src/i18n/strings/pt.json
+++ b/src/i18n/strings/pt.json
@@ -404,7 +404,6 @@
"You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.",
"You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.",
"You need to be logged in.": "Você tem que estar logado.",
- "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor.",
"Set a display name:": "Defina um nome público para você:",
"Upload an avatar:": "Envie uma imagem de perfil para identificar você:",
diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json
index 1b5ba0fa71..844a8322b3 100644
--- a/src/i18n/strings/pt_BR.json
+++ b/src/i18n/strings/pt_BR.json
@@ -405,7 +405,6 @@
"You cannot place VoIP calls in this browser.": "Você não pode fazer chamadas de voz neste navegador.",
"You need to be able to invite users to do that.": "Para fazer isso, você tem que ter permissão para convidar outras pessoas.",
"You need to be logged in.": "Você tem que estar logado.",
- "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "É necessário que você faça login novamente para poder gerar as chaves de criptografia ponta-a-ponta para este dispositivo e então enviar sua chave pública para o servidor. Pedimos desculpas pela inconveniência, é preciso fazer isso apenas única uma vez.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "O seu endereço de email não parece estar associado a uma conta de usuária/o Matrix neste servidor.",
"Set a display name:": "Defina um nome público para você:",
"Upload an avatar:": "Envie uma imagem de perfil para identificar você:",
diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json
index a23eff43fd..a666de60aa 100644
--- a/src/i18n/strings/ru.json
+++ b/src/i18n/strings/ru.json
@@ -385,7 +385,6 @@
"Thu": "Чт",
"Fri": "Пя",
"Sat": "Сб",
- "You need to log back in to generate end-to-end encryption keys for this device and submit the public key to your homeserver. This is a once off; sorry for the inconvenience.": "Вам необходимо снова войти в генерировать сквозное шифрование (е2е) ключей для этого устройства и предоставить публичный ключ Вашему домашнему серверу. Это после выключения; приносим извинения за причиненные неудобства.",
"Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Ваш адрес электронной почты, кажется, не связан с Matrix ID на этом Homeserver.",
"to start a chat with someone": "Начать чат с кем-то",
"to tag direct chat": "отметить прямой чат",
diff --git a/src/utils/createMatrixClient.js b/src/utils/createMatrixClient.js
index 5effd63f2a..2d294e262b 100644
--- a/src/utils/createMatrixClient.js
+++ b/src/utils/createMatrixClient.js
@@ -18,6 +18,13 @@ import Matrix from 'matrix-js-sdk';
const localStorage = window.localStorage;
+// just *accessing* indexedDB throws an exception in firefox with
+// indexeddb disabled.
+let indexedDB;
+try {
+ indexedDB = window.indexedDB;
+} catch(e) {}
+
/**
* Create a new matrix client, with the persistent stores set up appropriately
* (using localstorage/indexeddb, etc)
@@ -25,27 +32,28 @@ const localStorage = window.localStorage;
* @param {Object} opts options to pass to Matrix.createClient. This will be
* extended with `sessionStore` and `store` members.
*
- * @param {string} indexedDbWorkerScript Optional URL for a web worker script
- * for IndexedDB store operations. If not given, indexeddb ops are done on
+ * @property {string} indexedDbWorkerScript Optional URL for a web worker script
+ * for IndexedDB store operations. By default, indexeddb ops are done on
* the main thread.
*
* @returns {MatrixClient} the newly-created MatrixClient
*/
-export default function createMatrixClient(opts, indexedDbWorkerScript) {
+export default function createMatrixClient(opts) {
const storeOpts = {};
if (localStorage) {
storeOpts.sessionStore = new Matrix.WebStorageSessionStore(localStorage);
}
- if (window.indexedDB && localStorage) {
+
+ if (indexedDB && localStorage) {
// FIXME: bodge to remove old database. Remove this after a few weeks.
- window.indexedDB.deleteDatabase("matrix-js-sdk:default");
+ indexedDB.deleteDatabase("matrix-js-sdk:default");
storeOpts.store = new Matrix.IndexedDBStore({
- indexedDB: window.indexedDB,
+ indexedDB: indexedDB,
dbName: "riot-web-sync",
localStorage: localStorage,
- workerScript: indexedDbWorkerScript,
+ workerScript: createMatrixClient.indexedDbWorkerScript,
});
}
@@ -53,3 +61,5 @@ export default function createMatrixClient(opts, indexedDbWorkerScript) {
return Matrix.createClient(opts);
}
+
+createMatrixClient.indexedDbWorkerScript = null;