Skip to content

Commit adfd0ee

Browse files
Feat: Added 'Online User Status' Filter to Members List (#782)
* Feat: Add 'Online User Status' Filter to Members List * Added space between InviteButton and search bar-user status filter * fixed lint import error * Added Divider along with Display count and total count of members * Updated count logic with RC * Removed API Call to fetch status of user --------- Co-authored-by: Zishan Ahmad <zishan.barun@gmail.com>
1 parent 7a241ab commit adfd0ee

3 files changed

Lines changed: 87 additions & 38 deletions

File tree

packages/react/src/views/RoomMembers/RoomMember.js

Lines changed: 78 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import {
77
Sidebar,
88
Input,
99
Popup,
10+
StaticSelect,
11+
Divider,
1012
useComponentOverrides,
1113
useTheme,
1214
} from '@embeddedchat/ui-elements';
15+
import { css } from '@emotion/react';
1316
import RoomMemberItem from './RoomMemberItem';
1417
import RCContext, { useRCContext } from '../../context/RCInstance';
1518
import useInviteStore from '../../store/inviteStore';
@@ -37,6 +40,8 @@ const RoomMembers = ({ members }) => {
3740
const [searchTerm, setSearchTerm] = useState('');
3841
const [filteredMembers, setFilteredMembers] = useState(members);
3942

43+
const [viewStatus, setViewStatus] = useState('All');
44+
4045
useEffect(() => {
4146
const getUserInfo = async () => {
4247
try {
@@ -52,19 +57,32 @@ const RoomMembers = ({ members }) => {
5257
}, [RCInstance]);
5358

5459
useEffect(() => {
60+
const filtered = members.filter((member) => {
61+
if (viewStatus === 'Online') {
62+
return member.status === 'online';
63+
}
64+
return true;
65+
});
66+
5567
setFilteredMembers(
56-
members.filter(
68+
filtered.filter(
5769
(member) =>
5870
member.name?.toLowerCase().includes(searchTerm.toLowerCase()) ||
5971
member.username?.toLowerCase().includes(searchTerm.toLowerCase())
6072
)
6173
);
62-
}, [searchTerm, members]);
74+
}, [viewStatus, searchTerm, members]);
6375

6476
const roles = userInfo && userInfo.roles ? userInfo.roles : [];
6577
const isAdmin = roles.includes('admin');
6678
const ViewComponent = viewType === 'Popup' ? Popup : Sidebar;
6779

80+
const handleSelect = (value) => {
81+
setViewStatus(value);
82+
};
83+
84+
const displayedMembers = filteredMembers.length;
85+
6886
return (
6987
<ViewComponent
7088
title="Members"
@@ -87,33 +105,75 @@ const RoomMembers = ({ members }) => {
87105
<>
88106
{isAdmin && (
89107
<Button
90-
style={{ marginTop: '10px', width: '100%' }}
108+
style={{
109+
marginTop: '10px',
110+
marginBottom: '10px',
111+
width: '100%',
112+
}}
91113
onClick={async () => {
92114
toggleInviteView();
93115
}}
94116
>
95117
<Icon size="1em" name="link" /> Invite Link
96118
</Button>
97119
)}
98-
<Box css={styles.searchContainer}>
99-
<Input
100-
css={styles.textInput}
101-
value={searchTerm}
102-
onChange={(e) => setSearchTerm(e.target.value)}
103-
placeholder="Search members"
104-
/>
105-
<Icon name="magnifier" size="1.5rem" css={styles.searchIcon} />
120+
<Box
121+
css={css`
122+
display: flex;
123+
`}
124+
>
125+
<Box css={styles.searchContainer}>
126+
<Input
127+
css={styles.textInput}
128+
value={searchTerm}
129+
onChange={(e) => setSearchTerm(e.target.value)}
130+
placeholder="Search members"
131+
/>
132+
<Icon
133+
name="magnifier"
134+
size="1.5rem"
135+
css={styles.searchIcon}
136+
/>
137+
</Box>
138+
<Box css={styles.filterContainer}>
139+
<Box
140+
css={css`
141+
position: absolute;
142+
z-index: 10;
143+
`}
144+
>
145+
<StaticSelect
146+
options={[
147+
{ value: 'All', label: 'All' },
148+
{ value: 'Online', label: 'Online' },
149+
]}
150+
value={viewStatus}
151+
onSelect={handleSelect}
152+
placeholder={viewStatus}
153+
/>
154+
</Box>
155+
</Box>
156+
</Box>
157+
<Box
158+
css={css`
159+
margin-top: 1rem;
160+
margin-bottom: 1rem;
161+
`}
162+
>
163+
<Divider />
164+
</Box>
165+
<Box>
166+
Showing {displayedMembers} of {displayedMembers}
106167
</Box>
107168
<Box css={styles.memberList}>
108169
{filteredMembers.length > 0 ? (
109170
filteredMembers.map((member) => (
110-
<>
111-
<RoomMemberItem
112-
user={member}
113-
host={host}
114-
key={member._id}
115-
/>
116-
</>
171+
<RoomMemberItem
172+
user={member}
173+
host={host}
174+
userStatus={member.status}
175+
key={member._id}
176+
/>
117177
))
118178
) : (
119179
<Box css={styles.noMembers}>No members found</Box>

packages/react/src/views/RoomMembers/RoomMemberItem.js

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,17 @@
1-
import React, { useContext, useEffect, useState } from 'react';
1+
import React from 'react';
22
import PropTypes from 'prop-types';
33
import { css } from '@emotion/react';
44
import { Box, Icon, Avatar, useTheme } from '@embeddedchat/ui-elements';
5-
import RCContext from '../../context/RCInstance';
65
import { RoomMemberItemStyles } from './RoomMembers.styles';
76
import useSetExclusiveState from '../../hooks/useSetExclusiveState';
87
import { useUserStore } from '../../store';
98

10-
const RoomMemberItem = ({ user, host }) => {
11-
const { RCInstance } = useContext(RCContext);
12-
const [userStatus, setUserStatus] = useState('');
9+
const RoomMemberItem = ({ user, host, userStatus }) => {
1310
const avatarUrl = new URL(`avatar/${user.username}`, host).toString();
1411
const { theme } = useTheme();
1512
const { mode } = useTheme();
1613
const styles = RoomMemberItemStyles(theme, mode);
1714

18-
useEffect(() => {
19-
const getStatus = async () => {
20-
try {
21-
const res = await RCInstance.getUserStatus(user._id);
22-
if (res.success) {
23-
setUserStatus(res.status);
24-
}
25-
} catch (err) {
26-
console.error('Error fetching user status:', err);
27-
}
28-
};
29-
30-
getStatus();
31-
}, [RCInstance]);
3215
const setExclusiveState = useSetExclusiveState();
3316
const { setShowCurrentUserInfo, setCurrentUser } = useUserStore((state) => ({
3417
setShowCurrentUserInfo: state.setShowCurrentUserInfo,

packages/react/src/views/RoomMembers/RoomMembers.styles.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ export const getRoomMemberStyles = (theme) => {
1919
padding: 0 0.5rem;
2020
border-radius: ${theme.radius};
2121
position: relative;
22-
margin-top: 1rem;
22+
width: 60%;
23+
`,
24+
filterContainer: css`
25+
width: 40%;
26+
margin-left: 0.5rem;
27+
border-radius: ${theme.radius};
28+
position: relative;
2329
`,
2430
textInput: css`
2531
flex: 1;

0 commit comments

Comments
 (0)