Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/utils/EventUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@ export function canEditContent(matrixClient: MatrixClient, mxEvent: MatrixEvent)

if (
!isCancellable ||
mxEvent.status === EventStatus.CANCELLED ||
// Editing local echos is not supported(results in send a message that references the local ID).
// We need to ensure the event is not local, and therefore has no send status.
mxEvent.status !== null ||
mxEvent.isRedacted() ||
mxEvent.isRelation(RelationType.Replace) ||
mxEvent.getSender() !== matrixClient.getUserId()
Expand Down
9 changes: 9 additions & 0 deletions src/utils/PinningUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ export default class PinningUtils {
const room = matrixClient.getRoom(mxEvent.getRoomId());
if (!room) return false;

// Should have a non-local event id
if (mxEvent.status !== null) return false;

return PinningUtils.userHasPinOrUnpinPermission(matrixClient, room) && PinningUtils.isPinnable(mxEvent);
}

Expand All @@ -94,6 +97,9 @@ export default class PinningUtils {
const room = matrixClient.getRoom(mxEvent.getRoomId());
if (!room) return false;

// Should have a non-local event id
if (mxEvent.status !== null) return false;

return PinningUtils.userHasPinOrUnpinPermission(matrixClient, room) && PinningUtils.isUnpinnable(mxEvent);
}

Expand Down Expand Up @@ -123,6 +129,9 @@ export default class PinningUtils {
const eventId = mxEvent.getId();
if (!eventId) return;

// Should have a non-local event id
if (mxEvent.status !== null) return;

// Get the current pinned events of the room
const pinnedIds: Array<string> =
room
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -748,7 +748,8 @@ function createMenu(
// @ts-ignore illegally set private prop
room.currentState.beacons = beacons;

mxEvent.setStatus(EventStatus.SENT);
// The base case is that we have received the remote echo and have an eventId. No sending status.
mxEvent.setStatus(null);

client.getUserId = jest.fn().mockReturnValue("@user:example.com");
client.getRoom = jest.fn().mockReturnValue(room);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,8 @@ describe("<MessageActionBar />", () => {

beforeEach(() => {
jest.clearAllMocks();
alicesMessageEvent.setStatus(EventStatus.SENT);
// The base case is that we have received the remote echo and have an eventId. No sending status.
alicesMessageEvent.setStatus(null);
jest.spyOn(SettingsStore, "getValue").mockReturnValue(false);
jest.spyOn(SettingsStore, "setValue").mockResolvedValue(undefined);
});
Expand Down Expand Up @@ -376,6 +377,25 @@ describe("<MessageActionBar />", () => {
expect(queryByLabelText("Delete")).toBeTruthy();
});

it("only shows retry and delete buttons when event could not be sent", () => {
// Enable pin and other features
jest.spyOn(SettingsStore, "getValue").mockReturnValue(true);

alicesMessageEvent.setStatus(EventStatus.NOT_SENT);
const { queryByLabelText } = getComponent({ mxEvent: alicesMessageEvent });

// Should show retry and cancel buttons
expect(queryByLabelText("Retry")).toBeTruthy();
expect(queryByLabelText("Delete")).toBeTruthy();

// Should NOT show edit, pin, react, reply buttons
expect(queryByLabelText("Edit")).toBeFalsy();
expect(queryByLabelText("Pin")).toBeFalsy();
expect(queryByLabelText("React")).toBeFalsy();
expect(queryByLabelText("Reply")).toBeFalsy();
expect(queryByLabelText("Reply in thread")).toBeFalsy();
});

it.todo("unsends event on cancel click");
it.todo("retrys event on retry click");
});
Expand Down
Loading