@@ -4,19 +4,20 @@ import {
4
4
Box ,
5
5
Button ,
6
6
Icon ,
7
- Sidebar ,
8
- Input ,
9
7
Popup ,
8
+ Sidebar ,
10
9
useComponentOverrides ,
11
10
useTheme ,
12
11
} from '@embeddedchat/ui-elements' ;
12
+
13
13
import RoomMemberItem from './RoomMemberItem' ;
14
14
import RCContext , { useRCContext } from '../../context/RCInstance' ;
15
15
import useInviteStore from '../../store/inviteStore' ;
16
16
import InviteMembers from './InviteMembers' ;
17
17
import { getRoomMemberStyles } from './RoomMembers.styles' ;
18
18
import LoadingIndicator from '../MessageAggregators/common/LoadingIndicator' ;
19
19
import useSetExclusiveState from '../../hooks/useSetExclusiveState' ;
20
+ import NoMessagesIndicator from '../MessageAggregators/common/NoMessageIndicator' ;
20
21
21
22
const RoomMembers = ( { members } ) => {
22
23
const { RCInstance } = useContext ( RCContext ) ;
@@ -30,17 +31,29 @@ const RoomMembers = ({ members }) => {
30
31
const [ isLoading , setIsLoading ] = useState ( true ) ;
31
32
const { variantOverrides } = useComponentOverrides ( 'RoomMember' ) ;
32
33
const viewType = variantOverrides . viewType || 'Sidebar' ;
33
-
34
34
const [ userInfo , setUserInfo ] = useState ( null ) ;
35
35
const setExclusiveState = useSetExclusiveState ( ) ;
36
-
37
36
const [ searchTerm , setSearchTerm ] = useState ( '' ) ;
37
+ const [ statusFilter , setStatusFilter ] = useState ( 'All' ) ;
38
38
const [ filteredMembers , setFilteredMembers ] = useState ( members ) ;
39
39
40
+ const filterOptions = [
41
+ { value : 'All' , label : 'All' } ,
42
+ { value : 'Online' , label : 'Online' } ,
43
+ { value : 'Offline' , label : 'Offline' } ,
44
+ ] ;
45
+ const iconName = 'Members' ;
46
+ const noMessageInfo = 'No Members Found' ;
47
+
48
+ const handleInputChange = ( e ) => {
49
+ setSearchTerm ( e . target . value ) ;
50
+ } ;
51
+
40
52
useEffect ( ( ) => {
41
53
const getUserInfo = async ( ) => {
42
54
try {
43
55
const res = await RCInstance . me ( ) ;
56
+ console . log ( 'User info:' , res ) ;
44
57
setUserInfo ( res ) ;
45
58
setIsLoading ( false ) ;
46
59
} catch ( error ) {
@@ -55,22 +68,48 @@ const RoomMembers = ({ members }) => {
55
68
setFilteredMembers (
56
69
members . filter (
57
70
( member ) =>
58
- member . name ?. toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ||
59
- member . username ?. toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) )
71
+ ( member . name ?. toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ||
72
+ member . username
73
+ ?. toLowerCase ( )
74
+ . includes ( searchTerm . toLowerCase ( ) ) ) &&
75
+ ( statusFilter === 'All' ||
76
+ ( statusFilter === 'Online' && member . status === 'online' ) ||
77
+ ( statusFilter === 'Offline' && member . status === 'offline' ) )
60
78
)
61
79
) ;
62
- } , [ searchTerm , members ] ) ;
80
+ } , [ searchTerm , statusFilter , members ] ) ;
81
+ console . log ( 'filtered' , filteredMembers ) ;
63
82
83
+ const handleFilterSelect = ( val ) => {
84
+ setStatusFilter ( val ) ;
85
+ } ;
64
86
const roles = userInfo && userInfo . roles ? userInfo . roles : [ ] ;
65
87
const isAdmin = roles . includes ( 'admin' ) ;
88
+
66
89
const ViewComponent = viewType === 'Popup' ? Popup : Sidebar ;
67
90
68
91
return (
69
92
< ViewComponent
70
93
title = "Members"
71
- iconName = "members"
94
+ iconName = { iconName }
72
95
onClose = { ( ) => setExclusiveState ( null ) }
73
- style = { { width : '400px' , zIndex : window . innerWidth <= 780 ? 1 : null } }
96
+ style = { {
97
+ width : '400px' ,
98
+ padding : 0 ,
99
+ zIndex : window . innerWidth <= 780 ? 1 : null ,
100
+ } }
101
+ filterProps = { {
102
+ isFile : false ,
103
+ options : filterOptions ,
104
+ value : statusFilter ,
105
+ handleFilterSelect,
106
+ } }
107
+ noMessageInfo = "No Files Found"
108
+ searchProps = { {
109
+ isSearch : true ,
110
+ handleInputChange,
111
+ placeholder : 'Search members' ,
112
+ } }
74
113
{ ...( viewType === 'Popup'
75
114
? {
76
115
isPopupHeader : true ,
@@ -95,28 +134,26 @@ const RoomMembers = ({ members }) => {
95
134
< Icon size = "1em" name = "link" /> Invite Link
96
135
</ Button >
97
136
) }
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 } />
106
- </ Box >
107
- < Box css = { styles . memberList } >
137
+ < Box
138
+ css = {
139
+ filteredMembers . length > 0
140
+ ? styles . memberList
141
+ : styles . noMembers
142
+ }
143
+ >
108
144
{ filteredMembers . length > 0 ? (
109
145
filteredMembers . map ( ( member ) => (
110
- < >
111
- < RoomMemberItem
112
- user = { member }
113
- host = { host }
114
- key = { member . _id }
115
- />
116
- </ >
146
+ < RoomMemberItem
147
+ user = { member }
148
+ host = { host }
149
+ key = { member . _id }
150
+ />
117
151
) )
118
152
) : (
119
- < Box css = { styles . noMembers } > No members found</ Box >
153
+ < NoMessagesIndicator
154
+ iconName = { iconName }
155
+ message = { noMessageInfo }
156
+ />
120
157
) }
121
158
</ Box >
122
159
</ >
0 commit comments