=> {
const TestComponent = (): JSX.Element => {
const vm = useMockedViewModel(
@@ -242,6 +229,20 @@ describe("", () => {
expect(mockCallbacks.onCreateSection).toHaveBeenCalled();
});
+ it("should call onRemoveFromSection when Remove from section is clicked", async () => {
+ const user = userEvent.setup();
+ const TestComponent = (): JSX.Element => {
+ const vm = useMockedViewModel({ ...defaultSnapshot, isInSection: true }, mockCallbacks);
+ return ;
+ };
+ render();
+
+ const removeFromSection = screen.getByRole("menuitem", { name: "Remove from section" });
+ await user.click(removeFromSection);
+
+ expect(mockCallbacks.onRemoveFromSection).toHaveBeenCalled();
+ });
+
it("should render section items in move to section submenu", () => {
const sections = [
{ tag: "m.favourite", name: "Favourites", isSelected: false },
diff --git a/packages/shared-components/src/room-list/VirtualizedRoomListView/RoomListItemWrapper/RoomListItemView/RoomListItemMoreOptionsMenu.tsx b/packages/shared-components/src/room-list/VirtualizedRoomListView/RoomListItemWrapper/RoomListItemView/RoomListItemMoreOptionsMenu.tsx
index 00690a445b..9208f41b03 100644
--- a/packages/shared-components/src/room-list/VirtualizedRoomListView/RoomListItemWrapper/RoomListItemView/RoomListItemMoreOptionsMenu.tsx
+++ b/packages/shared-components/src/room-list/VirtualizedRoomListView/RoomListItemWrapper/RoomListItemView/RoomListItemMoreOptionsMenu.tsx
@@ -5,7 +5,7 @@
* Please see LICENSE files in the repository root for full details.
*/
-import React, { useState, type JSX } from "react";
+import React, { useMemo, useState, type JSX } from "react";
import { IconButton, Menu, MenuItem, Separator, SubMenu, ToggleMenuItem } from "@vector-im/compound-web";
import {
MarkAsReadIcon,
@@ -18,11 +18,13 @@ import {
OverflowHorizontalIcon,
ArrowRightIcon,
CheckIcon,
+ MinusIcon,
} from "@vector-im/compound-design-tokens/assets/web/icons";
import { _t } from "../../../../core/i18n/i18n";
import { useViewModel, type ViewModel } from "../../../../core/viewmodel";
import type { RoomListItemViewSnapshot, RoomListItemViewActions } from "./RoomListItemView";
+import styles from "./RoomListItemMoreOptionsMenu.module.css";
/**
* View model type for room list item
@@ -73,6 +75,8 @@ interface MoreOptionContentProps {
export function MoreOptionContent({ vm }: MoreOptionContentProps): JSX.Element {
const snapshot = useViewModel(vm);
+ const hasSections = snapshot.sections.length > 0;
+ const isInSection = useMemo(() => snapshot.sections.some((section) => section.isSelected), [snapshot.sections]);
return (
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
e.stopPropagation()}>
@@ -141,6 +145,7 @@ export function MoreOptionContent({ vm }: MoreOptionContentProps): JSX.Element {
))}
-
+ {hasSections && }
)}
+ {isInSection && (
+