11import user from "./user.json" ;
22import css from "./UserCard.module.css" ;
33import { MdOutlineStars } from "react-icons/md" ;
4+ import { BsThreeDots } from "react-icons/bs" ;
5+ import { useMediaQuery } from "react-responsive" ;
6+ import { useEffect , useRef , useState } from "react" ;
7+ import { LuPencil } from "react-icons/lu" ;
8+ import { RiLockPasswordLine } from "react-icons/ri" ;
9+ import iconClose from "../../../assets/icons/iconClose.svg" ;
10+ import { TbUserStar } from "react-icons/tb" ;
11+ import { FiTrash2 } from "react-icons/fi" ;
12+ import { IoBan } from "react-icons/io5" ;
13+
14+ export default function UserCard ( { isMyPage, isAdmin } ) {
15+ const isDesktop = useMediaQuery ( { minWidth : "1440px" } ) ;
16+ const isMobile = useMediaQuery ( { maxWidth : "768px" } ) ;
17+
18+ const [ isOpen , setIsOpen ] = useState ( false ) ;
19+
20+ const modalRef = useRef ( null ) ;
21+ const buttonRef = useRef ( null ) ;
22+
23+ useEffect ( ( ) => {
24+ const handleClickOutside = ( event ) => {
25+ if (
26+ modalRef . current &&
27+ ! modalRef . current . contains ( event . target ) &&
28+ buttonRef . current &&
29+ ! buttonRef . current . contains ( event . target )
30+ ) {
31+ setIsOpen ( false ) ;
32+ }
33+ } ;
34+
35+ document . addEventListener ( "mousedown" , handleClickOutside ) ;
36+
37+ return ( ) => {
38+ document . removeEventListener ( "mousedown" , handleClickOutside ) ;
39+ } ;
40+ } , [ buttonRef ] ) ;
441
5- export default function UserCard ( ) {
642 return (
743 < div className = { css . cardWrapper } >
844 < div >
@@ -18,10 +54,60 @@ export default function UserCard() {
1854 height = { 74 }
1955 />
2056 < div className = { css . textWrapper } >
57+ { ( isAdmin || isMyPage ) && ! isDesktop && (
58+ < BsThreeDots
59+ className = { css . dotsIcon }
60+ ref = { buttonRef }
61+ onClick = { ( ) => setIsOpen ( ! isOpen ) }
62+ />
63+ ) }
64+ { isOpen && (
65+ < div className = { css . settings } ref = { modalRef } >
66+ { isMobile && (
67+ < div className = { css . closeIconWrapper } >
68+ < img
69+ src = { iconClose }
70+ alt = "Close"
71+ className = { css . closeIcon }
72+ onClick = { ( ) => setIsOpen ( false ) }
73+ />
74+ </ div >
75+ ) }
76+ { ! isAdmin ? (
77+ < div className = { css . icons } >
78+ < p className = { css . settingsParagraph } >
79+ < LuPencil className = { css . settingsIcon } />
80+ Редагувати свій профіль
81+ </ p >
82+ < p className = { css . settingsParagraph } >
83+ < RiLockPasswordLine className = { css . settingsIcon } />
84+ Змінити пароль
85+ </ p >
86+ </ div >
87+ ) : (
88+ < div className = { css . icons } >
89+ < p className = { css . settingsParagraph } >
90+ < TbUserStar className = { css . settingsIcon } />
91+ Змінити Роль
92+ </ p >
93+ < p className = { css . settingsParagraph } >
94+ < FiTrash2 className = { css . settingsIcon } />
95+ Видалити Профіль
96+ </ p >
97+ < p className = { css . settingsParagraph } >
98+ < IoBan className = { css . settingsIcon } />
99+ Забанити Користувача
100+ </ p >
101+ </ div >
102+ ) }
103+ </ div >
104+ ) }
105+
21106 < div className = { css . column } >
22107 < p className = { css . registerDate } >
23108 Дата реєстрації < span > { user . createdAt } </ span >
24109 </ p >
110+
25111 < div className = { css . nameWrapper } >
26112 < div className = { css . column } >
27113 < p className = { css . name } > { user . name } </ p >
@@ -33,6 +119,33 @@ export default function UserCard() {
33119 </ p >
34120 < p className = { css . deskRegisterDate } >
35121 Дата реєстрації < span > { user . createdAt } </ span >
122+ { ! isAdmin ? (
123+ < div className = { css . deskIcons } >
124+ < p className = { css . settingsParagraph } >
125+ < LuPencil className = { css . settingsIcon } />
126+ Редагувати свій профіль
127+ </ p >
128+ < p className = { css . settingsParagraph } >
129+ < RiLockPasswordLine className = { css . settingsIcon } />
130+ Змінити пароль
131+ </ p >
132+ </ div >
133+ ) : isDesktop ? (
134+ < div className = { css . deskIcons } >
135+ < p className = { css . settingsParagraph } >
136+ < TbUserStar className = { css . settingsIcon } />
137+ Змінити Роль
138+ </ p >
139+ < p className = { css . settingsParagraph } >
140+ < FiTrash2 className = { css . settingsIcon } />
141+ Видалити Профіль
142+ </ p >
143+ < p className = { css . settingsParagraph } >
144+ < IoBan className = { css . settingsIcon } />
145+ Забанити Користувача
146+ </ p >
147+ </ div >
148+ ) : null }
36149 </ p >
37150 </ div >
38151 </ div >
0 commit comments