From 1b359aef5a1ba69f9614be3b299a317fca088b2d Mon Sep 17 00:00:00 2001 From: R Midhun Suresh Date: Mon, 23 Dec 2024 01:36:02 +0530 Subject: [PATCH] Add more tests --- .../viewmodels/MemberListViewModel.tsx | 15 ++- .../views/rooms/MemberListHeaderView.tsx | 101 ++++++++++++------ src/components/views/rooms/MemberListView.tsx | 1 - .../memberlist/MemberListHeaderView-test.tsx | 31 ++++-- .../views/rooms/memberlist/common.tsx | 10 +- 5 files changed, 108 insertions(+), 50 deletions(-) diff --git a/src/components/viewmodels/MemberListViewModel.tsx b/src/components/viewmodels/MemberListViewModel.tsx index d2b594f98b..0c740aa877 100644 --- a/src/components/viewmodels/MemberListViewModel.tsx +++ b/src/components/viewmodels/MemberListViewModel.tsx @@ -115,6 +115,7 @@ export interface MemberListViewState { search: (searchQuery: string) => void; isPresenceEnabled: boolean; shouldShowInvite: boolean; + shouldShowSearch: boolean; isLoading: boolean; canInvite: boolean; onInviteButtonClick: (ev: ButtonEvent) => void; @@ -178,13 +179,16 @@ export function useMemberListViewModel(roomId: string): MemberListViewState { [sdkContext.memberListStore], ); + // Determines whether the rendered invite button is enabled or disabled const getCanUserInviteToThisRoom = useCallback((): boolean => !!room && canInviteTo(room), [room]); - const [canInvite, setCanInvite] = useState(getCanUserInviteToThisRoom()); - const shouldShowInvite = useMemo(() => { - return room?.getMyMembership() == KnownMembership.Join && shouldShowComponent(UIComponent.InviteUsers); - }, [room]); + // Determines whether the invite button should be shown or not. + const getShouldShowInvite = useCallback( + (): boolean => room?.getMyMembership() === KnownMembership.Join && shouldShowComponent(UIComponent.InviteUsers), + [room], + ); + const [shouldShowInvite, setShouldShowInvite] = useState(getShouldShowInvite()); const onInviteButtonClick = (ev: ButtonEvent): void => { PosthogTrackers.trackInteraction("WebRightPanelMemberListInviteButton", ev); @@ -219,6 +223,8 @@ export function useMemberListViewModel(roomId: string): MemberListViewState { if (membership === KnownMembership.Join && oldMembership !== KnownMembership.Join) { // we just joined the room, load the member list loadMembers(); + const newShouldShowInvite = getShouldShowInvite(); + setShouldShowInvite(newShouldShowInvite); } }); @@ -251,6 +257,7 @@ export function useMemberListViewModel(roomId: string): MemberListViewState { isPresenceEnabled, isLoading, onInviteButtonClick, + shouldShowSearch: memberCount >= 20, canInvite, }; } diff --git a/src/components/views/rooms/MemberListHeaderView.tsx b/src/components/views/rooms/MemberListHeaderView.tsx index 09901f2f93..c8ff436a00 100644 --- a/src/components/views/rooms/MemberListHeaderView.tsx +++ b/src/components/views/rooms/MemberListHeaderView.tsx @@ -37,6 +37,51 @@ const OptionalTooltip: React.FC = ({ canInvite, children }) => { return {children}; }; +const InviteButton: React.FC = ({ vm }) => { + const shouldShowInvite = vm.shouldShowInvite; + const shouldShowSearch = vm.shouldShowSearch; + const disabled = !vm.canInvite; + + if (!shouldShowInvite) { + // In this case, invite button should not be rendered. + return null; + } + + if (shouldShowSearch) { + /// When rendered alongside a search box, the invite button is just an icon. + return ( + + + + ); +}; + /** * This should be: * A loading text with spinner while the memberlist loads. @@ -67,49 +112,37 @@ function getHeaderLabelJSX(vm: MemberListViewState): React.ReactNode { */ const MemberListHeaderView: React.FC = (props: Props) => { const vm = props.vm; - const memberCount = vm.memberCount; - const contentJSX = - memberCount < 20 ? ( - - - - ) : ( - <> + + let contentJSX: React.ReactNode; + + if (vm.shouldShowSearch) { + // When we need to show the search box + contentJSX = ( + vm.search((e as React.ChangeEvent).target.value)} /> - -