1
1
import { User } from "domain/entities/User" ;
2
2
import { userUseCases } from "domain/usecases/UserUseCases" ;
3
- import { useEffect , useState } from "react" ;
3
+ import { useEffect , useMemo , useState } from "react" ;
4
4
import { EditOutlined , DeleteOutlined , CrownFilled , CrownOutlined } from "@ant-design/icons" ;
5
5
import styles from "./UserManagement..module.css" ;
6
6
import { Modal } from "antd" ;
7
7
import { UpdateProfileForm } from "presentation/components/UpdateProfileForm/UpdateProfileForm" ;
8
8
import { DeleteUserForm } from "presentation/components/DeleteUserForm/DeleteUserForm" ;
9
9
import { UpdateUserPrivilegeForm } from "presentation/components/UpdateUserPrivilegeForm/UpdateUserPrivilegeForm" ;
10
-
10
+ import { useAuth } from "domain/context/AuthContext" ;
11
+ import { SearchBar } from "presentation/components/SearchBar" ;
11
12
12
13
export const UserManagement : React . FC < { } > = ( ) => {
13
14
const [ users , setUsers ] = useState < User [ ] > ( [ ] ) ;
14
-
15
15
const [ editingUser , setEditingUser ] = useState < User | null > ( null ) ;
16
16
const [ deletingUser , setDeletingUser ] = useState < User | null > ( null ) ;
17
17
const [ promotingUser , setPromotingUser ] = useState < User | null > ( null ) ;
18
+ const [ searchTerm , setSearchTerm ] = useState < string > ( "" ) ;
19
+
20
+ const { user : currUser } = useAuth ( ) ;
18
21
19
22
useEffect ( ( ) => {
20
23
const getAllUsers = async ( ) => {
@@ -24,21 +27,40 @@ export const UserManagement: React.FC<{}> = () => {
24
27
getAllUsers ( ) ;
25
28
} , [ ] ) ;
26
29
27
- const sortedUsers = users . sort ( ( u1 , u2 ) => {
28
- if ( u1 . isAdmin && ! u2 . isAdmin ) {
29
- return - 1 ;
30
- } else if ( ! u1 . isAdmin && u2 . isAdmin ) {
31
- return 1 ;
32
- } else {
33
- return u1 . username . localeCompare ( u2 . username ) ;
34
- }
35
- } ) ;
30
+ const sortedUsers = useMemo (
31
+ ( ) =>
32
+ users . sort ( ( u1 , u2 ) => {
33
+ if ( u1 . _id === currUser ?. _id ) {
34
+ return - 1 ;
35
+ }
36
+
37
+ if ( u2 . _id === currUser ?. _id ) {
38
+ return 1 ;
39
+ }
40
+ if ( u1 . isAdmin && ! u2 . isAdmin ) {
41
+ return - 1 ;
42
+ }
43
+
44
+ if ( ! u1 . isAdmin && u2 . isAdmin ) {
45
+ return 1 ;
46
+ }
47
+ return u1 . username . localeCompare ( u2 . username ) ;
48
+ } ) ,
49
+ [ users ]
50
+ ) ;
51
+
52
+ const filteredUsers = useMemo (
53
+ ( ) => sortedUsers . filter ( ( user ) => user . username . toLowerCase ( ) . includes ( searchTerm . toLowerCase ( ) ) ) ,
54
+ [ sortedUsers , searchTerm ]
55
+ ) ;
36
56
37
57
const renderUser = ( user : User ) => {
38
58
return (
39
59
< div className = { styles . userRow } key = { user . _id } >
40
60
< div className = { styles . username } >
41
- < p > { user . username } </ p >
61
+ < p >
62
+ { user . username } { currUser ?. _id === user . _id && < span style = { { color : "gray" } } > (you)</ span > }
63
+ </ p >
42
64
{ user . isAdmin && < CrownFilled /> }
43
65
</ div >
44
66
@@ -84,7 +106,8 @@ export const UserManagement: React.FC<{}> = () => {
84
106
85
107
return (
86
108
< div className = { styles . container } >
87
- { sortedUsers . map ( ( user ) => renderUser ( user ) ) }
109
+ < SearchBar searchTerm = { searchTerm } onSearch = { ( s ) => setSearchTerm ( s ) } placeholder = "Search users..." />
110
+ { filteredUsers . map ( ( user ) => renderUser ( user ) ) }
88
111
{ editingUser && (
89
112
< Modal
90
113
open = { editingUser !== null }
0 commit comments