diff --git a/src/app/organisms/channel/ChannelViewContent.jsx b/src/app/organisms/channel/ChannelViewContent.jsx index 737cbaa..7a8a2a3 100644 --- a/src/app/organisms/channel/ChannelViewContent.jsx +++ b/src/app/organisms/channel/ChannelViewContent.jsx @@ -7,6 +7,7 @@ import dateFormat from 'dateformat'; import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; +import { redact } from '../../../client/action/room'; import { getUsername, doesRoomHaveUnread } from '../../../util/matrixUtil'; import colorMXID from '../../../util/colorMXID'; import { diffMinutes, isNotInSameDay } from '../../../util/common'; @@ -223,6 +224,9 @@ function ChannelViewContent({ && prevMEvent.getSender() === mEvent.getSender() ); + const myPowerlevel = roomTimeline.room.getMember(mx.getUserId()).powerLevel; + const canIRedact = roomTimeline.room.currentState.hasSufficientPowerLevelFor('redact', myPowerlevel); + let content = mEvent.getContent().body; if (typeof content === 'undefined') return null; let reply = null; @@ -293,12 +297,12 @@ function ChannelViewContent({ }); } - const userMXIDColor = colorMXID(mEvent.sender.userId); + const senderMXIDColor = colorMXID(mEvent.sender.userId); const userAvatar = isContentOnly ? null : ( ); @@ -306,7 +310,7 @@ function ChannelViewContent({ ); @@ -350,7 +354,18 @@ function ChannelViewContent({ size="extra-small" tooltip="Reply" /> - + {(canIRedact || mEvent.getSender() === mx.getUserId()) && ( + { + if (window.confirm('Are you sure you want to delete this event')) { + redact(roomId, mEvent.getId()); + } + }} + src={BinIC} + size="extra-small" + tooltip="Delete" + /> + )} ); diff --git a/src/client/action/room.js b/src/client/action/room.js index e18f197..5bd6777 100644 --- a/src/client/action/room.js +++ b/src/client/action/room.js @@ -189,6 +189,19 @@ async function invite(roomId, userId) { } } +async function redact(roomId, eventId, reason) { + const mx = initMatrix.matrixClient; + + try { + await mx.redactEvent(roomId, eventId, undefined, typeof reason === 'undefined' ? undefined : { reason }); + return true; + } catch (e) { + throw new Error(e); + } +} + export { - join, leave, create, invite, + join, leave, + create, invite, + redact, }; diff --git a/src/client/state/RoomTimeline.js b/src/client/state/RoomTimeline.js index edb19c4..1337454 100644 --- a/src/client/state/RoomTimeline.js +++ b/src/client/state/RoomTimeline.js @@ -35,6 +35,11 @@ class RoomTimeline extends EventEmitter { this.emit(cons.events.roomTimeline.EVENT); }; + this._listenRedaction = (event, room) => { + if (room.roomId !== this.roomId) return; + this.emit(cons.events.roomTimeline.EVENT); + }; + this._listenDecryptEvent = (event) => { if (event.getRoomId() !== this.roomId) return; @@ -67,6 +72,7 @@ class RoomTimeline extends EventEmitter { }; this.matrixClient.on('Room.timeline', this._listenRoomTimeline); + this.matrixClient.on('Room.redaction', this._listenRedaction); this.matrixClient.on('Event.decrypted', this._listenDecryptEvent); this.matrixClient.on('RoomMember.typing', this._listenTypingEvent); this.matrixClient.on('Room.receipt', this._listenReciptEvent); @@ -152,6 +158,7 @@ class RoomTimeline extends EventEmitter { removeInternalListeners() { this.matrixClient.removeListener('Room.timeline', this._listenRoomTimeline); + this.matrixClient.removeListener('Room.redaction', this._listenRedaction); this.matrixClient.removeListener('Event.decrypted', this._listenDecryptEvent); this.matrixClient.removeListener('RoomMember.typing', this._listenTypingEvent); this.matrixClient.removeListener('Room.receipt', this._listenReciptEvent);