Skip to content
This repository was archived by the owner on Oct 22, 2024. It is now read-only.

Commit 5985277

Browse files
authored
Unlabs feature pinning (#22)
1 parent 74885c9 commit 5985277

18 files changed

+166
-99
lines changed

src/TextForEvent.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,6 @@ const onPinnedMessagesClick = (): void => {
561561
};
562562

563563
function textForPinnedEvent(event: MatrixEvent, client: MatrixClient, allowJSX: boolean): (() => Renderable) | null {
564-
if (!SettingsStore.getValue("feature_pinning")) return null;
565564
const senderName = getSenderName(event);
566565
const roomId = event.getRoomId()!;
567566

src/components/structures/RightPanel.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import RightPanelStore from "../../stores/right-panel/RightPanelStore";
1717
import MatrixClientContext from "../../contexts/MatrixClientContext";
1818
import RoomSummaryCard from "../views/right_panel/RoomSummaryCard";
1919
import WidgetCard from "../views/right_panel/WidgetCard";
20-
import SettingsStore from "../../settings/SettingsStore";
2120
import MemberList from "../views/rooms/MemberList";
2221
import UserInfo from "../views/right_panel/UserInfo";
2322
import ThirdPartyMemberInfo from "../views/rooms/ThirdPartyMemberInfo";
@@ -220,7 +219,7 @@ export default class RightPanel extends React.Component<Props, IState> {
220219
break;
221220

222221
case RightPanelPhases.PinnedMessages:
223-
if (!!this.props.room && SettingsStore.getValue("feature_pinning")) {
222+
if (!!this.props.room) {
224223
card = (
225224
<PinnedMessagesCard
226225
room={this.props.room}

src/components/structures/RoomView.tsx

+3-7
Original file line numberDiff line numberDiff line change
@@ -2408,13 +2408,9 @@ export class RoomView extends React.Component<IRoomProps, IRoomState> {
24082408
</AuxPanel>
24092409
);
24102410

2411-
const isPinningEnabled = SettingsStore.getValue<boolean>("feature_pinning");
2412-
let pinnedMessageBanner;
2413-
if (isPinningEnabled) {
2414-
pinnedMessageBanner = (
2415-
<PinnedMessageBanner room={this.state.room} permalinkCreator={this.permalinkCreator} />
2416-
);
2417-
}
2411+
const pinnedMessageBanner = (
2412+
<PinnedMessageBanner room={this.state.room} permalinkCreator={this.permalinkCreator} />
2413+
);
24182414

24192415
let messageComposer;
24202416
const showComposer =

src/components/structures/grouper/MainGrouper.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import DateSeparator from "../../views/messages/DateSeparator";
1818
import HistoryTile from "../../views/rooms/HistoryTile";
1919
import EventListSummary from "../../views/elements/EventListSummary";
2020
import { SeparatorKind } from "../../views/messages/TimelineSeparator";
21-
import SettingsStore from "../../../settings/SettingsStore";
2221

2322
const groupedStateEvents = [
2423
EventType.RoomMember,
@@ -91,7 +90,7 @@ export class MainGrouper extends BaseGrouper {
9190
return;
9291
}
9392

94-
if (ev.getType() === EventType.RoomPinnedEvents && !SettingsStore.getValue("feature_pinning")) {
93+
if (ev.getType() === EventType.RoomPinnedEvents) {
9594
// If pinned messages are disabled, don't show the summary
9695
return;
9796
}

src/components/views/context_menus/RoomContextMenu.tsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import { EchoChamber } from "../../../stores/local-echo/EchoChamber";
2626
import { RoomNotifState } from "../../../RoomNotifs";
2727
import Modal from "../../../Modal";
2828
import ExportDialog from "../dialogs/ExportDialog";
29-
import { useFeatureEnabled } from "../../../hooks/useSettings";
3029
import { RightPanelPhases } from "../../../stores/right-panel/RightPanelStorePhases";
3130
import { RoomSettingsTab } from "../dialogs/RoomSettingsDialog";
3231
import { useEventEmitterState } from "../../../hooks/useEventEmitter";
@@ -261,11 +260,10 @@ const RoomContextMenu: React.FC<IProps> = ({ room, onFinished, ...props }) => {
261260
);
262261
}
263262

264-
const pinningEnabled = useFeatureEnabled("feature_pinning");
265-
const pinCount = usePinnedEvents(pinningEnabled ? room : undefined)?.length;
263+
const pinCount = usePinnedEvents(room).length;
266264

267265
let pinsOption: JSX.Element | undefined;
268-
if (pinningEnabled && !isVideoRoom) {
266+
if (!isVideoRoom) {
269267
pinsOption = (
270268
<IconizedContextMenuOption
271269
onClick={(ev: ButtonEvent) => {

src/components/views/right_panel/LegacyRoomHeaderButtons.tsx

+10-12
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import { RightPanelPhases } from "../../../stores/right-panel/RightPanelStorePha
2121
import { ActionPayload } from "../../../dispatcher/payloads";
2222
import RightPanelStore from "../../../stores/right-panel/RightPanelStore";
2323
import { showThreadPanel } from "../../../dispatcher/dispatch-actions/threads";
24-
import SettingsStore from "../../../settings/SettingsStore";
2524
import {
2625
RoomNotificationStateStore,
2726
UPDATE_STATUS_INDICATOR,
@@ -245,17 +244,16 @@ export default class LegacyRoomHeaderButtons extends HeaderButtons<IProps> {
245244

246245
const rightPanelPhaseButtons: Map<RightPanelPhases, any> = new Map();
247246

248-
if (SettingsStore.getValue("feature_pinning")) {
249-
rightPanelPhaseButtons.set(
250-
RightPanelPhases.PinnedMessages,
251-
<PinnedMessagesHeaderButton
252-
key="pinnedMessagesButton"
253-
room={this.props.room}
254-
isHighlighted={this.isPhase(RightPanelPhases.PinnedMessages)}
255-
onClick={this.onPinnedMessagesClicked}
256-
/>,
257-
);
258-
}
247+
rightPanelPhaseButtons.set(
248+
RightPanelPhases.PinnedMessages,
249+
<PinnedMessagesHeaderButton
250+
key="pinnedMessagesButton"
251+
room={this.props.room}
252+
isHighlighted={this.isPhase(RightPanelPhases.PinnedMessages)}
253+
onClick={this.onPinnedMessagesClicked}
254+
/>,
255+
);
256+
259257
rightPanelPhaseButtons.set(
260258
RightPanelPhases.Timeline,
261259
<TimelineCardHeaderButton

src/components/views/right_panel/RoomSummaryCard.tsx

+11-14
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ import { useEventEmitterState } from "../../../hooks/useEventEmitter";
4949
import { E2EStatus } from "../../../utils/ShieldUtils";
5050
import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks";
5151
import RoomContext, { TimelineRenderingType } from "../../../contexts/RoomContext";
52-
import { useFeatureEnabled } from "../../../hooks/useSettings";
5352
import RoomName from "../elements/RoomName";
5453
import ExportDialog from "../dialogs/ExportDialog";
5554
import RightPanelStore from "../../../stores/right-panel/RightPanelStore";
@@ -314,8 +313,7 @@ const RoomSummaryCard: React.FC<IProps> = ({
314313
</header>
315314
);
316315

317-
const pinningEnabled = useFeatureEnabled("feature_pinning");
318-
const pinCount = usePinnedEvents(pinningEnabled ? room : undefined)?.length;
316+
const pinCount = usePinnedEvents(room).length;
319317

320318
const roomTags = useEventEmitterState(RoomListStore.instance, LISTS_UPDATE_EVENT, () =>
321319
RoomListStore.instance.getTagsForRoom(room),
@@ -382,17 +380,16 @@ const RoomSummaryCard: React.FC<IProps> = ({
382380

383381
{!isVideoRoom && (
384382
<>
385-
{pinningEnabled && (
386-
<MenuItem
387-
Icon={PinIcon}
388-
label={_t("right_panel|pinned_messages_button")}
389-
onSelect={onRoomPinsClick}
390-
>
391-
<Text as="span" size="sm">
392-
{pinCount}
393-
</Text>
394-
</MenuItem>
395-
)}
383+
<MenuItem
384+
Icon={PinIcon}
385+
label={_t("right_panel|pinned_messages_button")}
386+
onSelect={onRoomPinsClick}
387+
>
388+
<Text as="span" size="sm">
389+
{pinCount}
390+
</Text>
391+
</MenuItem>
392+
396393
<MenuItem Icon={FilesIcon} label={_t("right_panel|files_button")} onSelect={onRoomFilesClick} />
397394
</>
398395
)}

src/components/views/settings/tabs/room/RolesRoomSettingsTab.tsx

+1-3
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,13 @@ export default class RolesRoomSettingsTab extends React.Component<IProps> {
267267
[EventType.RoomServerAcl]: _td("room_settings|permissions|m.room.server_acl"),
268268
[EventType.Reaction]: _td("room_settings|permissions|m.reaction"),
269269
[EventType.RoomRedaction]: _td("room_settings|permissions|m.room.redaction"),
270+
[EventType.RoomPinnedEvents]: _td("room_settings|permissions|m.room.pinned_events"),
270271

271272
// TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111)
272273
"im.vector.modular.widgets": isSpaceRoom ? null : _td("room_settings|permissions|m.widget"),
273274
[VoiceBroadcastInfoEventType]: _td("room_settings|permissions|io.element.voice_broadcast_info"),
274275
};
275276

276-
if (SettingsStore.getValue("feature_pinning")) {
277-
plEventsToLabels[EventType.RoomPinnedEvents] = _td("room_settings|permissions|m.room.pinned_events");
278-
}
279277
// MSC3401: Native Group VoIP signaling
280278
if (SettingsStore.getValue("feature_group_calls")) {
281279
plEventsToLabels[ElementCall.CALL_EVENT_TYPE.name] = _td("room_settings|permissions|m.call");

src/i18n/strings/en_EN.json

-1
Original file line numberDiff line numberDiff line change
@@ -1468,7 +1468,6 @@
14681468
"notifications": "Enable the notifications panel in the room header",
14691469
"oidc_native_flow": "OIDC native authentication",
14701470
"oidc_native_flow_description": "⚠ WARNING: Experimental. Use OIDC native authentication when supported by the server.",
1471-
"pinning": "Message Pinning",
14721471
"release_announcement": "Release announcement",
14731472
"render_reaction_images": "Render custom images in reactions",
14741473
"render_reaction_images_description": "Sometimes referred to as \"custom emojis\".",

src/settings/Settings.tsx

-8
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,6 @@ export const SETTINGS: { [setting: string]: ISetting } = {
275275
supportedLevelsAreOrdered: true,
276276
default: false,
277277
},
278-
"feature_pinning": {
279-
isFeature: true,
280-
labsGroup: LabGroup.Messaging,
281-
displayName: _td("labs|pinning"),
282-
supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG_PRIORITISED,
283-
supportedLevelsAreOrdered: true,
284-
default: true,
285-
},
286278
"feature_wysiwyg_composer": {
287279
isFeature: true,
288280
labsGroup: LabGroup.Messaging,

src/utils/PinningUtils.ts

-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ Please see LICENSE files in the repository root for full details.
99
import { MatrixEvent, EventType, M_POLL_START, MatrixClient, EventTimeline, Room } from "matrix-js-sdk/src/matrix";
1010

1111
import { isContentActionable } from "./EventUtils";
12-
import SettingsStore from "../settings/SettingsStore";
1312
import { ReadPinsEventId } from "../components/views/right_panel/types";
1413

1514
export default class PinningUtils {
@@ -70,7 +69,6 @@ export default class PinningUtils {
7069
* @private
7170
*/
7271
private static canPinOrUnpin(matrixClient: MatrixClient, mxEvent: MatrixEvent): boolean {
73-
if (!SettingsStore.getValue("feature_pinning")) return false;
7472
if (!isContentActionable(mxEvent)) return false;
7573

7674
const room = matrixClient.getRoom(mxEvent.getRoomId());

test/TextForEvent-test.ts

-5
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,6 @@ describe("TextForEvent", () => {
6565
});
6666

6767
describe("TextForPinnedEvent", () => {
68-
beforeAll(() => {
69-
// enable feature_pinning setting
70-
(SettingsStore.getValue as jest.Mock).mockImplementation((feature) => feature === "feature_pinning");
71-
});
72-
7368
it("mentions message when a single message was pinned, with no previously pinned messages", () => {
7469
const event = mockPinnedEvent(["message-1"]);
7570
const plainText = textForEvent(event, mockClient);

test/components/views/context_menus/MessageContextMenu-test.tsx

-16
Original file line numberDiff line numberDiff line change
@@ -116,22 +116,6 @@ describe("MessageContextMenu", () => {
116116
expect(screen.queryByRole("menuitem", { name: "Pin" })).toBeFalsy();
117117
});
118118

119-
it("does not show pin option when pinning feature is disabled", () => {
120-
const eventContent = createMessageEventContent("hello");
121-
const pinnableEvent = new MatrixEvent({
122-
type: EventType.RoomMessage,
123-
content: eventContent,
124-
room_id: roomId,
125-
});
126-
127-
// disable pinning feature
128-
jest.spyOn(SettingsStore, "getValue").mockReturnValue(false);
129-
130-
createMenu(pinnableEvent, { rightClick: true }, {}, undefined, room);
131-
132-
expect(screen.queryByRole("menuitem", { name: "Pin" })).toBeFalsy();
133-
});
134-
135119
it("shows pin option when pinning feature is enabled", () => {
136120
const eventContent = createMessageEventContent("hello");
137121
const pinnableEvent = new MatrixEvent({

test/components/views/right_panel/RoomSummaryCard-test.tsx

+3-9
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,7 @@ describe("<RoomSummaryCard />", () => {
259259
});
260260

261261
describe("pinning", () => {
262-
it("renders pins options when pinning feature is enabled", () => {
263-
mocked(settingsHooks.useFeatureEnabled).mockImplementation((feature) => feature === "feature_pinning");
262+
it("renders pins options", () => {
264263
const { getByText } = getComponent();
265264

266265
expect(getByText("Pinned messages")).toBeInTheDocument();
@@ -291,9 +290,7 @@ describe("<RoomSummaryCard />", () => {
291290
describe("video rooms", () => {
292291
it("does not render irrelevant options for element video room", () => {
293292
jest.spyOn(room, "isElementVideoRoom").mockReturnValue(true);
294-
mocked(settingsHooks.useFeatureEnabled).mockImplementation(
295-
(feature) => feature === "feature_video_rooms" || feature === "feature_pinning",
296-
);
293+
mocked(settingsHooks.useFeatureEnabled).mockImplementation((feature) => feature === "feature_video_rooms");
297294
const { queryByText } = getComponent();
298295

299296
// options not rendered
@@ -305,10 +302,7 @@ describe("<RoomSummaryCard />", () => {
305302
it("does not render irrelevant options for element call room", () => {
306303
jest.spyOn(room, "isCallRoom").mockReturnValue(true);
307304
mocked(settingsHooks.useFeatureEnabled).mockImplementation(
308-
(feature) =>
309-
feature === "feature_element_call_video_rooms" ||
310-
feature === "feature_video_rooms" ||
311-
feature === "feature_pinning",
305+
(feature) => feature === "feature_element_call_video_rooms" || feature === "feature_video_rooms",
312306
);
313307
const { queryByText } = getComponent();
314308

0 commit comments

Comments
 (0)