1- import React , { useState , useEffect } from 'react' ;
1+ import React , { useState , useEffect , useCallback , useMemo } from 'react' ;
22import { Row , Col , Container } from 'reactstrap' ;
3+ import { useParams } from 'react-router-dom' ;
34import { connect , useSelector , useDispatch } from 'react-redux' ;
45import { cantUpdateDevAdminDetails } from '~/utils/permissions' ;
56import {
@@ -10,7 +11,6 @@ import {
1011import { updateSummaryBarData } from '~/actions/dashboardActions' ;
1112import Leaderboard from '../LeaderBoard' ;
1213import WeeklySummary from '../WeeklySummary/WeeklySummary' ;
13- import Badge from '../Badge' ;
1414import Timelog from '../Timelog/Timelog' ;
1515import SummaryBar from '../SummaryBar/SummaryBar' ;
1616import styles from './Dashboard.module.css' ;
@@ -19,22 +19,37 @@ import TimeOffRequestDetailModal from './TimeOffRequestDetailModal';
1919import FeedbackModal from '../FeedbackModal/FeedbackModal' ;
2020import { toast } from 'react-toastify' ;
2121
22- export function Dashboard ( props ) {
22+ function Dashboard ( ) {
23+ const dispatch = useDispatch ( ) ;
24+
25+ // Use hooks instead of connect to access Redux state
26+ const authUser = useSelector ( state => state . auth . user ) ;
27+ const displayUserProfile = useSelector ( state => state . userProfile ) ;
28+ const darkMode = useSelector ( state => state . theme . darkMode ) ;
29+
30+ // Get userId from URL params
31+ const { userId : urlUserId } = useParams ( ) ;
32+
33+ // Component state
2334 const [ popup , setPopup ] = useState ( false ) ;
2435 const [ filteredUserTeamIds , setFilteredUserTeamIds ] = useState ( [ ] ) ;
2536 const [ summaryBarData , setSummaryBarData ] = useState ( null ) ;
26- const { match, authUser } = props ;
27- const checkSessionStorage = ( ) => JSON . parse ( sessionStorage . getItem ( 'viewingUser' ) ) ?? false ;
28- const [ viewingUser , setViewingUser ] = useState ( checkSessionStorage ) ;
37+
38+ // Memoize this function to avoid recreating it on every render
39+ const checkSessionStorage = useCallback ( ( ) => {
40+ return JSON . parse ( sessionStorage . getItem ( 'viewingUser' ) ) ?? false ;
41+ } , [ ] ) ;
42+
43+ // State for viewing user
44+ const [ viewingUser , setViewingUser ] = useState ( checkSessionStorage ( ) ) ;
2945 const [ displayUserId , setDisplayUserId ] = useState (
30- match . params . userId || viewingUser ?. userId || authUser . userid ,
46+ urlUserId || viewingUser ?. userId || authUser . userid ,
3147 ) ;
32- const isNotAllowedToEdit = cantUpdateDevAdminDetails ( viewingUser ?. email , authUser . email ) ;
33- const darkMode = useSelector ( state => state . theme . darkMode ) ;
3448
35- const dispatch = useDispatch ( ) ;
49+ const isNotAllowedToEdit = cantUpdateDevAdminDetails ( viewingUser ?. email , authUser . email ) ;
3650
37- const toggle = ( ) => {
51+ // Toggle popup with memoization to prevent recreation
52+ const toggle = useCallback ( ( ) => {
3853 if ( isNotAllowedToEdit ) {
3954 const warningMessage =
4055 viewingUser ?. email === DEV_ADMIN_ACCOUNT_EMAIL_DEV_ENV_ONLY
@@ -52,28 +67,37 @@ export function Dashboard(props) {
5267 elem . scrollIntoView ( ) ;
5368 }
5469 } , 150 ) ;
55- } ;
70+ } , [ isNotAllowedToEdit , popup , viewingUser ?. email ] ) ;
5671
57- const handleStorageEvent = ( ) => {
72+ // Memoize storage event handler
73+ const handleStorageEvent = useCallback ( ( ) => {
5874 const sessionStorageData = checkSessionStorage ( ) ;
5975 setViewingUser ( sessionStorageData || false ) ;
6076 setDisplayUserId ( sessionStorageData ? sessionStorageData . userId : authUser . userid ) ;
61- } ;
77+ } , [ authUser . userid , checkSessionStorage ] ) ;
78+
79+ // Memoize summary bar update handler
80+ const handleSummaryBarDataUpdate = useCallback ( data => {
81+ setSummaryBarData ( data ) ;
82+ } , [ ] ) ;
83+
84+ // Update Redux store when summaryBarData changes
85+ useEffect ( ( ) => {
86+ if ( summaryBarData ) {
87+ dispatch ( updateSummaryBarData ( { summaryBarData } ) ) ;
88+ }
89+ } , [ dispatch , summaryBarData ] ) ;
6290
91+ // Add storage event listener
6392 useEffect ( ( ) => {
6493 window . addEventListener ( 'storage' , handleStorageEvent ) ;
6594 return ( ) => {
6695 window . removeEventListener ( 'storage' , handleStorageEvent ) ;
6796 } ;
68- } , [ ] ) ;
69-
70- useEffect ( ( ) => {
71- dispatch ( updateSummaryBarData ( { summaryBarData } ) ) ;
72- } , [ summaryBarData ] ) ;
97+ } , [ handleStorageEvent ] ) ;
7398
7499 return (
75100 < Container fluid className = { darkMode ? 'bg-oxford-blue' : '' } >
76- { /* <FeedbackModal /> */ }
77101 < SummaryBar
78102 displayUserId = { displayUserId }
79103 toggleSubmitForm = { toggle }
@@ -129,7 +153,7 @@ export function Dashboard(props) {
129153 < div className = "my-2" id = "wsummary" >
130154 < Timelog
131155 isDashboard
132- passSummaryBarData = { setSummaryBarData }
156+ passSummaryBarData = { handleSummaryBarDataUpdate }
133157 isNotAllowedToEdit = { isNotAllowedToEdit }
134158 filteredUserTeamIds = { filteredUserTeamIds }
135159 />
@@ -141,9 +165,4 @@ export function Dashboard(props) {
141165 ) ;
142166}
143167
144- const mapStateToProps = state => ( {
145- authUser : state . auth . user ,
146- displayUserProfile : state . userProfile ,
147- } ) ;
148-
149- export default connect ( mapStateToProps ) ( Dashboard ) ;
168+ export default Dashboard ;
0 commit comments