Changeset 79a0317 for imaps-frontend/src/components/Profile
- Timestamp:
- 01/21/25 03:08:24 (2 weeks ago)
- Branches:
- main
- Parents:
- 0c6b92a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
imaps-frontend/src/components/Profile/Profile.jsx
r0c6b92a r79a0317 1 import React, { useState, useRef, useEffect, useContext } from "react"; 2 import { useNavigate, Link } from "react-router-dom"; 1 import React, { useState, useRef, useEffect } from "react"; 2 import ReactDOM from "react-dom"; 3 import { useNavigate } from "react-router-dom"; 3 4 import profile from "../../assets/person_icon.png"; 4 5 import styles from "./Profile.module.css"; … … 8 9 const { username, isAuthenticated } = useAppContext(); 9 10 const [open, setOpen] = useState(false); 10 const menuRef = useRef(null);11 const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 }); 11 12 const imgRef = useRef(null); 12 13 const navigate = useNavigate(); … … 16 17 useEffect(() => { 17 18 const handleClickOutside = (e) => { 18 if (menuRef.current && imgRef.current) { 19 if (!menuRef.current.contains(e.target) && !imgRef.current.contains(e.target)) { 20 setOpen(false); 21 } 19 if (imgRef.current && !imgRef.current.contains(e.target)) { 20 setOpen(false); 22 21 } 23 22 }; … … 30 29 }, []); 31 30 31 const toggleMenu = () => { 32 if (imgRef.current) { 33 const rect = imgRef.current.getBoundingClientRect(); 34 setMenuPosition({ 35 top: rect.bottom + window.scrollY, 36 left: rect.left + window.scrollX, 37 }); 38 } 39 setOpen(!open); 40 }; 41 32 42 const handleMenuClick = (menu) => { 33 43 if (menu === "My Maps") { … … 36 46 localStorage.removeItem("token"); 37 47 window.location.reload(); 48 } else if (menu === "Login") { 49 navigate("/Login"); 38 50 } 39 51 setOpen(false); 40 52 }; 41 53 54 const renderDropdown = () => { 55 if (!open) return null; 56 57 return ReactDOM.createPortal( 58 <div 59 className={styles.dropdownMenu} 60 style={{ 61 position: "absolute", 62 top: menuPosition.top, 63 left: menuPosition.left, 64 }} 65 > 66 {isAuthenticated && <div className={styles.username}>{username}</div>} 67 <ul className={styles.menuList}> 68 {menus.map((menu) => ( 69 <li 70 key={menu} 71 className={styles.menuItem} 72 onClick={() => handleMenuClick(menu)} 73 > 74 {menu} 75 </li> 76 ))} 77 </ul> 78 </div>, 79 document.body 80 ); 81 }; 82 42 83 return ( 43 <div className={position === "fixed" ? styles.fixedProfileContainer : styles.inlineProfileContainer}> 84 <div 85 className={ 86 position === "fixed" ? styles.fixedProfileContainer : styles.inlineProfileContainer 87 } 88 > 44 89 <div className={styles.profileWrapper}> 45 <div className={styles.profileIconContainer} onClick={() => setOpen(!open)}> 46 <img src={profile} alt="profile" className={styles.profileImage} ref={imgRef} /> 90 <div 91 className={styles.profileIconContainer} 92 onClick={toggleMenu} 93 ref={imgRef} 94 > 95 <img src={profile} alt="profile" className={styles.profileImage} /> 47 96 </div> 48 {open && ( 49 <div ref={menuRef} className={styles.dropdownMenu}> 50 {isAuthenticated && <div className={styles.username}>{username}</div>} 51 <ul className={styles.menuList}> 52 {menus.map((menu) => 53 menu === "Login" ? ( 54 <li key={menu} className={styles.menuItem}> 55 <Link to="/login" className={styles.linkStyle}>{menu}</Link> 56 </li> 57 ) : ( 58 <li key={menu} onClick={() => handleMenuClick(menu)} className={styles.menuItem}> 59 {menu} 60 </li> 61 ) 62 )} 63 </ul> 64 </div> 65 )} 97 {renderDropdown()} 66 98 </div> 67 99 </div>
Note:
See TracChangeset
for help on using the changeset viewer.