diff --git a/src/components/structures/ViewSource.js b/src/components/structures/ViewSource.js
index ca6c0d4226..7fe862cff5 100644
--- a/src/components/structures/ViewSource.js
+++ b/src/components/structures/ViewSource.js
@@ -16,12 +16,13 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-import React from 'react';
-import PropTypes from 'prop-types';
-import SyntaxHighlight from '../views/elements/SyntaxHighlight';
-import {_t} from "../../languageHandler";
+import React from "react";
+import PropTypes from "prop-types";
+import SyntaxHighlight from "../views/elements/SyntaxHighlight";
+import { _t } from "../../languageHandler";
import * as sdk from "../../index";
-
+import MatrixClientContext from "../../contexts/MatrixClientContext";
+import { SendCustomEvent } from "../views/dialogs/DevtoolsDialog";
export default class ViewSource extends React.Component {
static propTypes = {
@@ -31,48 +32,157 @@ export default class ViewSource extends React.Component {
eventId: PropTypes.string.isRequired,
isEncrypted: PropTypes.bool.isRequired,
decryptedContent: PropTypes.object,
+ event: PropTypes.object.isRequired, // the MatrixEvent associated with the context menu
};
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ editComponent: null,
+ };
+ }
+
+ onBack() {
+ this.setState({ editComponent: null });
+ }
+
+ editEvent() {
+ const isStateEvent = this.props.event.isState();
+ console.log("isStateEvent", isStateEvent);
+ if (isStateEvent) {
+ this.setState({
+ editComponent: (
+
+ {(cli) => (
+ this.onBack()}
+ inputs={{
+ eventType: this.props.event.getType(),
+ evContent: JSON.stringify(
+ this.props.event.getContent(),
+ null,
+ "\t"
+ ),
+ stateKey: this.props.event.getStateKey(),
+ }}
+ />
+ )}
+
+ ),
+ });
+ } else {
+ // send an edit-message event
+ // prefill the "m.new_content" field
+ const originalContent = this.props.event.getContent();
+ const originalEventId = this.props.eventId;
+ const content = {
+ ...originalContent,
+ "m.new_content": originalContent,
+ "m.relates_to": {
+ rel_type: "m.replace",
+ event_id: originalEventId,
+ },
+ };
+ this.setState({
+ editComponent: (
+
+ {(cli) => (
+ this.onBack()}
+ inputs={{
+ eventType: this.props.event.getType(),
+ evContent: JSON.stringify(
+ content,
+ null,
+ "\t"
+ ),
+ }}
+ />
+ )}
+
+ ),
+ });
+ }
+ }
+
render() {
- const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
+ const BaseDialog = sdk.getComponent("views.dialogs.BaseDialog");
let content;
if (this.props.isEncrypted) {
- content = <>
-
-
- {_t("Decrypted event source")}
-
-
- { JSON.stringify(this.props.decryptedContent, null, 2) }
-
-
-
-
- {_t("Original event source")}
-
-
- { JSON.stringify(this.props.content, null, 2) }
-
-
- >;
+ content = (
+ <>
+
+
+
+ {_t("Decrypted event source")}
+
+
+
+ {JSON.stringify(
+ this.props.decryptedContent,
+ null,
+ 2
+ )}
+
+
+
+
+
+ {_t("Original event source")}
+
+
+
+ {JSON.stringify(this.props.content, null, 2)}
+
+
+ >
+ );
} else {
- content = <>
-
{_t("Original event source")}
-
- { JSON.stringify(this.props.content, null, 2) }
-
- >;
+ content = (
+ <>
+
+ {_t("Original event source")}
+
+
+ {JSON.stringify(this.props.content, null, 2)}
+
+ >
+ );
}
+ const isEditing = this.state.editComponent !== null;
+ console.log(isEditing);
+
return (
-
-
-
Room ID: { this.props.roomId }
-
Event ID: { this.props.eventId }
+
+
+
+ Room ID: {this.props.roomId}
+
+
+ Event ID: {this.props.eventId}
+
- { content }
+ {isEditing ? this.state.editComponent : content}
+ {!isEditing && (
+
+
+
+ )}
);
}
diff --git a/src/components/views/context_menus/MessageContextMenu.js b/src/components/views/context_menus/MessageContextMenu.js
index b002d1ec62..a1c111b19c 100644
--- a/src/components/views/context_menus/MessageContextMenu.js
+++ b/src/components/views/context_menus/MessageContextMenu.js
@@ -130,20 +130,10 @@ export default class MessageContextMenu extends React.Component {
roomId: ev.getRoomId(),
eventId: ev.getId(),
content: ev.event,
+ event: ev,
isEncrypted: this.props.mxEvent.getType() !== this.props.mxEvent.getWireType(),
- decryptedContent: ev._clearEvent,
- }, 'mx_Dialog_viewsource');
- this.closeMenu();
- };
-
- onViewClearSourceClick = () => {
- const ev = this.props.mxEvent.replacingEvent() || this.props.mxEvent;
- const ViewSource = sdk.getComponent('structures.ViewSource');
- Modal.createTrackedDialog('View Clear Event Source', '', ViewSource, {
- roomId: ev.getRoomId(),
- eventId: ev.getId(),
// FIXME: _clearEvent is private
- content: ev._clearEvent,
+ decryptedContent: ev._clearEvent,
}, 'mx_Dialog_viewsource');
this.closeMenu();
};
diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js
index 814378bb51..5d571461fc 100644
--- a/src/components/views/dialogs/DevtoolsDialog.js
+++ b/src/components/views/dialogs/DevtoolsDialog.js
@@ -73,13 +73,14 @@ class GenericEditor extends React.PureComponent {
}
}
-class SendCustomEvent extends GenericEditor {
+export class SendCustomEvent extends GenericEditor {
static getLabel() { return _t('Send Custom Event'); }
static propTypes = {
onBack: PropTypes.func.isRequired,
room: PropTypes.instanceOf(Room).isRequired,
forceStateEvent: PropTypes.bool,
+ forceGeneralEvent: PropTypes.bool,
inputs: PropTypes.object,
};
@@ -140,6 +141,8 @@ class SendCustomEvent extends GenericEditor {
;
}
+ const showTglFlip = !this.state.message && !this.props.forceStateEvent && !this.props.forceGeneralEvent;
+
return
@@ -155,7 +158,7 @@ class SendCustomEvent extends GenericEditor {
{ !this.state.message &&
}
- { !this.state.message && !this.props.forceStateEvent &&