Skip to content
Draft
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
2 changes: 1 addition & 1 deletion src/components/views/auth/CaptchaForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export default class CaptchaForm extends React.Component<ICaptchaFormProps, ICap
// TODO: Remove this when the "mobile_register" page is retired.
const iframes = document.querySelectorAll("iframe");
for (const iframe of iframes) {
if (iframe.src.includes("https://www.recaptcha.net/recaptcha/api2/bframe")) {
if (iframe.src.startsWith("https://www.recaptcha.net/recaptcha/api2/bframe")) {
let parentBeforeBody: HTMLElement | null = iframe;
do {
parentBeforeBody = parentBeforeBody.parentElement;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,9 @@ Please see LICENSE files in the repository root for full details.
*/

import React, { type JSX } from "react";
import {
EventType,
type RoomMember,
type RoomState,
RoomStateEvent,
type Room,
type IContent,
} from "matrix-js-sdk/src/matrix";
import { EventType, type RoomMember, type RoomState, RoomStateEvent, type Room } from "matrix-js-sdk/src/matrix";
import { logger } from "matrix-js-sdk/src/logger";
import { throttle, get } from "lodash";
import { throttle, get, set } from "lodash";
import { KnownMembership, type RoomPowerLevelsEventContent } from "matrix-js-sdk/src/types";

import { _t, _td, type TranslationKey } from "../../../../../languageHandler";
Expand Down Expand Up @@ -137,6 +130,8 @@ interface RolesRoomSettingsTabState {
isReady: boolean;
}

const EVENTS_LEVEL_PREFIX = "event_levels_";

export default class RolesRoomSettingsTab extends React.Component<IProps, RolesRoomSettingsTabState> {
public static contextType = MatrixClientContext;
declare public context: React.ContextType<typeof MatrixClientContext>;
Expand Down Expand Up @@ -199,24 +194,10 @@ export default class RolesRoomSettingsTab extends React.Component<IProps, RolesR
// Clone the power levels just in case
plContent = Object.assign({}, plContent);

const eventsLevelPrefix = "event_levels_";

if (powerLevelKey.startsWith(eventsLevelPrefix)) {
// deep copy "events" object, Object.assign itself won't deep copy
plContent["events"] = Object.assign({}, plContent["events"] || {});
plContent["events"][powerLevelKey.slice(eventsLevelPrefix.length)] = value;
if (powerLevelKey.startsWith(EVENTS_LEVEL_PREFIX)) {
set(plContent, ["events", powerLevelKey.slice(EVENTS_LEVEL_PREFIX.length)], value);
} else {
const keyPath = powerLevelKey.split(".");
let parentObj: IContent = {};
let currentObj: IContent = plContent;
for (const key of keyPath) {
if (!currentObj[key]) {
currentObj[key] = {};
}
parentObj = currentObj;
currentObj = currentObj[key];
}
parentObj[keyPath[keyPath.length - 1]] = value;
set(plContent, powerLevelKey.split("."), value);
}

try {
Expand Down Expand Up @@ -462,7 +443,7 @@ export default class RolesRoomSettingsTab extends React.Component<IProps, RolesR
value={eventsLevels[eventType]}
usersDefault={defaultUserLevel}
disabled={!canChangeLevels || currentUserLevel < eventsLevels[eventType]}
powerLevelKey={"event_levels_" + eventType}
powerLevelKey={EVENTS_LEVEL_PREFIX + eventType}
onChange={this.onPowerLevelsChanged}
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,4 +247,42 @@ describe("RolesRoomSettingsTab", () => {
deferred.reject("Error");
await waitFor(() => expect(selector).toHaveValue("100"));
});

it("should allow changing events power levels", async () => {
mocked(cli.sendStateEvent).mockResolvedValue({ event_id: "$eventId" });
mocked(cli.getRoom).mockReturnValue(room);
mocked(room.currentState.mayClientSendStateEvent).mockReturnValue(true);
const { container } = await renderTab();

const selector = container.querySelector(`[placeholder="Change topic"]`)!;
fireEvent.change(selector, { target: { value: "0" } });

expect(cli.sendStateEvent).toHaveBeenCalledWith(
room.roomId,
"m.room.power_levels",
expect.objectContaining({
events: expect.objectContaining({
"m.room.topic": 0,
}),
}),
);
});

it("should allow changing top level power levels", async () => {
mocked(cli.sendStateEvent).mockResolvedValue({ event_id: "$eventId" });
mocked(cli.getRoom).mockReturnValue(room);
mocked(room.currentState.mayClientSendStateEvent).mockReturnValue(true);
const { container } = await renderTab();

const selector = container.querySelector(`[placeholder="Remove users"]`)!;
fireEvent.change(selector, { target: { value: "0" } });

expect(cli.sendStateEvent).toHaveBeenCalledWith(
room.roomId,
"m.room.power_levels",
expect.objectContaining({
kick: 0,
}),
);
});
});
Loading