diff --git a/src/components/views/dialogs/SeshatResetDialog.js b/src/components/views/dialogs/SeshatResetDialog.js
new file mode 100644
index 0000000000..751af72383
--- /dev/null
+++ b/src/components/views/dialogs/SeshatResetDialog.js
@@ -0,0 +1,55 @@
+/*
+Copyright 2020 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.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import {_t} from "../../../languageHandler";
+import * as sdk from "../../../index";
+import {replaceableComponent} from "../../../utils/replaceableComponent";
+
+@replaceableComponent("views.dialogs.SeshatResetDialog")
+export default class SeshatResetDialog extends React.Component {
+ static propTypes = {
+ onFinished: PropTypes.func.isRequired,
+ };
+ render() {
+ const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
+ const DialogButtons = sdk.getComponent('views.elements.DialogButtons');
+
+ return (
+
+
+
+ {_t(
+ "Your event store appears corrupted. " +
+ "This action will restart this application.",
+ )}
+
+
+
+
+ );
+ }
+}
diff --git a/src/components/views/settings/EventIndexPanel.js b/src/components/views/settings/EventIndexPanel.js
index a48583b61d..773f687524 100644
--- a/src/components/views/settings/EventIndexPanel.js
+++ b/src/components/views/settings/EventIndexPanel.js
@@ -26,6 +26,7 @@ import {formatBytes, formatCountLong} from "../../../utils/FormattingUtils";
import EventIndexPeg from "../../../indexing/EventIndexPeg";
import {SettingLevel} from "../../../settings/SettingLevel";
import {replaceableComponent} from "../../../utils/replaceableComponent";
+import SeshatResetDialog from '../dialogs/SeshatResetDialog';
@replaceableComponent("views.settings.EventIndexPanel")
export default class EventIndexPanel extends React.Component {
@@ -122,6 +123,16 @@ export default class EventIndexPanel extends React.Component {
await this.updateState();
}
+ _confirmEventStoreReset() {
+ Modal.createDialog(SeshatResetDialog, {
+ onFinished: (success) => {
+ if (success) {
+ EventIndexPeg.resetEventStore();
+ }
+ },
+ });
+ }
+
render() {
let eventIndexingSettings = null;
const InlineSpinner = sdk.getComponent('elements.InlineSpinner');
@@ -220,6 +231,11 @@ export default class EventIndexPanel extends React.Component {
{EventIndexPeg.error.message}
+
+
+ {_t("Reset")}
+
+
)}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index b5edf31d01..9c72f1c1c5 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -2300,6 +2300,9 @@
"Use your preferred Matrix homeserver if you have one, or host your own.": "Use your preferred Matrix homeserver if you have one, or host your own.",
"Learn more": "Learn more",
"About homeservers": "About homeservers",
+ "Reset event index store?": "Reset event index store?",
+ "Your event store appears corrupted. This action will restart this application.": "Your event store appears corrupted. This action will restart this application.",
+ "Reset event store": "Reset event store",
"Sign out and remove encryption keys?": "Sign out and remove encryption keys?",
"Clear Storage and Sign Out": "Clear Storage and Sign Out",
"Send Logs": "Send Logs",
diff --git a/src/indexing/BaseEventIndexManager.ts b/src/indexing/BaseEventIndexManager.ts
index 2474406618..2ae47c6d86 100644
--- a/src/indexing/BaseEventIndexManager.ts
+++ b/src/indexing/BaseEventIndexManager.ts
@@ -309,4 +309,14 @@ export default abstract class BaseEventIndexManager {
async deleteEventIndex(): Promise {
throw new Error("Unimplemented");
}
+
+ /**
+ * Reset a potentially corrupted event store
+ *
+ * @return {Promise} A promise that will resolve once the event store has
+ * been deleted.
+ */
+ async resetEventStore(): Promise {
+ throw new Error("Unimplemented");
+ }
}
diff --git a/src/indexing/EventIndexPeg.js b/src/indexing/EventIndexPeg.js
index 7004efc554..c339ca4209 100644
--- a/src/indexing/EventIndexPeg.js
+++ b/src/indexing/EventIndexPeg.js
@@ -179,6 +179,11 @@ class EventIndexPeg {
await indexManager.deleteEventIndex();
}
}
+
+ resetEventStore() {
+ const indexManager = PlatformPeg.get().getEventIndexingManager();
+ return indexManager.resetEventStore();
+ }
}
if (!global.mxEventIndexPeg) {