From 93e4f21bf225c8fc6830f05ddcfb40f9fc20a506 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 26 Nov 2021 13:58:22 +0000 Subject: [PATCH 1/3] Fix Manage Restricted Join Rule Dialog for Spaces --- .../ManageRestrictedJoinRuleDialog.tsx | 21 ++++++++++++------- src/i18n/strings/en_EN.json | 1 + 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx b/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx index e4b01526fcf..86176c0009c 100644 --- a/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx +++ b/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx @@ -66,6 +66,10 @@ const Entry = ({ room, checked, onChange }) => { ; }; +const getAllParents = (roomId: string): string[] => { + return [...SpaceStore.instance.getKnownParents(roomId)].flatMap(parentId => [parentId, ...getAllParents(parentId)]); +}; + const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], onFinished }) => { const cli = room.client; const [newSelected, setNewSelected] = useState(new Set(selected)); @@ -73,9 +77,8 @@ const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], const lcQuery = query.toLowerCase().trim(); const [spacesContainingRoom, otherEntries] = useMemo(() => { - const spaces = cli.getVisibleRooms().filter(r => r.getMyMembership() === "join" && r.isSpaceRoom()); return [ - spaces.filter(r => SpaceStore.instance.getSpaceFilteredRoomIds(r.roomId).has(room.roomId)), + Array.from(new Set(getAllParents(room.roomId))).map(roomId => cli.getRoom(roomId)), selected.map(roomId => { const room = cli.getRoom(roomId); if (!room) { @@ -88,7 +91,7 @@ const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], ]; }, [cli, selected, room.roomId]); - const [filteredSpacesContainingRooms, filteredOtherEntries] = useMemo(() => [ + const [filteredSpacesContainingRoom, filteredOtherEntries] = useMemo(() => [ spacesContainingRoom.filter(r => r.name.toLowerCase().includes(lcQuery)), otherEntries.filter(r => r.name.toLowerCase().includes(lcQuery)), ], [spacesContainingRoom, otherEntries, lcQuery]); @@ -129,10 +132,14 @@ const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], autoFocus={true} /> - { filteredSpacesContainingRooms.length > 0 ? ( + { filteredSpacesContainingRoom.length > 0 ? (
-

{ _t("Spaces you know that contain this room") }

- { filteredSpacesContainingRooms.map(space => { +

+ { room.isSpaceRoom() + ? _t("Spaces you know that contain this space") + : _t("Spaces you know that contain this room") } +

+ { filteredSpacesContainingRoom.map(space => { return = ({ room, selected = [],
) : null } - { filteredSpacesContainingRooms.length + filteredOtherEntries.length < 1 + { filteredSpacesContainingRoom.length + filteredOtherEntries.length < 1 ? { _t("No results") } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 1bacfa9e6c0..7649bbc6f68 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2567,6 +2567,7 @@ "Select spaces": "Select spaces", "Decide which spaces can access this room. If a space is selected, its members can find and join .": "Decide which spaces can access this room. If a space is selected, its members can find and join .", "Search spaces": "Search spaces", + "Spaces you know that contain this space": "Spaces you know that contain this space", "Spaces you know that contain this room": "Spaces you know that contain this room", "Other spaces or rooms you might not know": "Other spaces or rooms you might not know", "These are likely ones other room admins are a part of.": "These are likely ones other room admins are a part of.", From db70791fab92605131fc3f2b7c79b1967723bc54 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 26 Nov 2021 14:01:55 +0000 Subject: [PATCH 2/3] Prevent infinite recursion --- .../dialogs/ManageRestrictedJoinRuleDialog.tsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx b/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx index 86176c0009c..251fcf199fb 100644 --- a/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx +++ b/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx @@ -66,8 +66,15 @@ const Entry = ({ room, checked, onChange }) => { ; }; -const getAllParents = (roomId: string): string[] => { - return [...SpaceStore.instance.getKnownParents(roomId)].flatMap(parentId => [parentId, ...getAllParents(parentId)]); +const addAllParents = (set: Set, room: Room): void => { + const cli = room.client; + const parents = Array.from(SpaceStore.instance.getKnownParents(room.roomId)).map(parentId => cli.getRoom(parentId)); + + parents.forEach(parent => { + if (set.has(parent)) return; + set.add(parent); + addAllParents(set, parent); + }); }; const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], onFinished }) => { @@ -77,8 +84,10 @@ const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], const lcQuery = query.toLowerCase().trim(); const [spacesContainingRoom, otherEntries] = useMemo(() => { + const parents = new Set(); + addAllParents(parents, room); return [ - Array.from(new Set(getAllParents(room.roomId))).map(roomId => cli.getRoom(roomId)), + Array.from(parents), selected.map(roomId => { const room = cli.getRoom(roomId); if (!room) { From 97d1c84215048aa746dea923fef33e2f9ddf134f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 29 Nov 2021 09:16:56 +0000 Subject: [PATCH 3/3] delint --- src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx b/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx index 251fcf199fb..b80f7741235 100644 --- a/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx +++ b/src/components/views/dialogs/ManageRestrictedJoinRuleDialog.tsx @@ -98,7 +98,7 @@ const ManageRestrictedJoinRuleDialog: React.FC = ({ room, selected = [], } }).filter(Boolean), ]; - }, [cli, selected, room.roomId]); + }, [cli, selected, room]); const [filteredSpacesContainingRoom, filteredOtherEntries] = useMemo(() => [ spacesContainingRoom.filter(r => r.name.toLowerCase().includes(lcQuery)),