1- import React , { useState } from 'react' ;
1+ // src/components/Header.tsx
2+ import React , { useState , useEffect } from 'react' ;
23import { useEntries } from '../hooks/useEntries' ;
34
45import {
@@ -18,22 +19,34 @@ import SmallCircularQuestionCounter from './ui/questionCounter/smallCircularQues
1819import LargeCircularQuestionCounter from './ui/questionCounter/LargeCircularQuestionCounter' ;
1920
2021const Header : React . FC = ( ) => {
21- // const { questions, setQuestions } = useQuestions();
2222 const { data, setData } = useEntries ( ) ;
2323 const [ isDashboardOpen , setIsDashboardOpen ] = useState ( false ) ;
24- const [ isEditingEmail , setIsEditingEmail ] = useState ( false ) ;
24+ // Combined editing state for manager details
25+ const [ isEditingContact , setIsEditingContact ] = useState ( false ) ;
2526 const [ managerEmailInput , setManagerEmailInput ] = useState (
2627 data . managerEmail || ''
2728 ) ;
29+ const [ managerNameInput , setManagerNameInput ] = useState (
30+ data . managerName || ''
31+ ) ;
2832 const [ emailError , setEmailError ] = useState ( '' ) ;
2933
30- const handleEmailSave = ( ) => {
31- if ( ! validateEmail ( managerEmailInput . trim ( ) ) ) {
34+ // Sync local inputs with context when edit mode is activated.
35+ useEffect ( ( ) => {
36+ if ( isEditingContact ) {
37+ setManagerEmailInput ( data . managerEmail || '' ) ;
38+ setManagerNameInput ( data . managerName || '' ) ;
39+ }
40+ } , [ isEditingContact , data . managerEmail , data . managerName ] ) ;
41+
42+ const handleSaveContact = ( ) => {
43+ if ( managerEmailInput . trim ( ) && ! validateEmail ( managerEmailInput . trim ( ) ) ) {
3244 setEmailError ( 'Please enter a valid email address.' ) ;
3345 return ;
3446 }
3547 setData ( { type : 'SET_MANAGER_EMAIL' , payload : managerEmailInput } ) ;
36- setIsEditingEmail ( false ) ;
48+ setData ( { type : 'SET_MANAGER_NAME' , payload : managerNameInput } ) ;
49+ setIsEditingContact ( false ) ;
3750 setEmailError ( '' ) ;
3851 } ;
3952
@@ -45,7 +58,7 @@ const Header: React.FC = () => {
4558 < img src = '/lift_logo.png' alt = 'Logo' className = 'h-10 mr-2' />
4659 < h1 className = 'text-2xl font-bold' > Beacons</ h1 >
4760 </ div >
48- { /* Right side: Clickable container with border that opens the dialog */ }
61+ { /* Right side: User info & dashboard */ }
4962 { data . username ? (
5063 < Dialog open = { isDashboardOpen } onOpenChange = { setIsDashboardOpen } >
5164 < DialogTrigger asChild >
@@ -75,26 +88,38 @@ const Header: React.FC = () => {
7588 { data . username || 'Not set' }
7689 </ div >
7790 </ div >
78- { /* Manager email section */ }
91+ { /* Manager contact section */ }
7992 < div className = 'mt-4' >
8093 < div className = 'text-sm font-semibold text-gray-700 mb-1' >
81- Your line's manager email :
94+ Your line manager 's details :
8295 </ div >
83- < div className = 'flex items-center space-x-2' >
84- { isEditingEmail ? (
85- < >
86- < Input
87- value = { managerEmailInput }
88- onChange = { ( e ) => setManagerEmailInput ( e . target . value ) }
89- placeholder = 'Enter new manager email'
90- aria-label = 'Manager Email'
91- className = 'w-full'
92- />
96+ { isEditingContact ? (
97+ < div className = 'space-y-2' >
98+ < Input
99+ value = { managerNameInput }
100+ onChange = { ( e ) => setManagerNameInput ( e . target . value ) }
101+ placeholder = "Enter manager's name (optional)"
102+ aria-label = 'Manager Name'
103+ className = 'w-full'
104+ />
105+ < Input
106+ value = { managerEmailInput }
107+ onChange = { ( e ) => setManagerEmailInput ( e . target . value ) }
108+ placeholder = "Enter manager's email (optional)"
109+ aria-label = 'Manager Email'
110+ className = 'w-full'
111+ />
112+ { emailError && (
113+ < div className = 'text-red-500 text-xs mt-1' >
114+ { emailError }
115+ </ div >
116+ ) }
117+ < div className = 'flex space-x-2' >
93118 < Button
94- onClick = { handleEmailSave }
119+ onClick = { handleSaveContact }
95120 variant = 'outline'
96121 size = 'sm'
97- aria-label = 'Save Email '
122+ aria-label = 'Save Contact '
98123 disabled = {
99124 managerEmailInput . trim ( ) !== '' &&
100125 ! validateEmail ( managerEmailInput . trim ( ) )
@@ -104,8 +129,9 @@ const Header: React.FC = () => {
104129 </ Button >
105130 < Button
106131 onClick = { ( ) => {
107- setIsEditingEmail ( false ) ;
132+ setIsEditingContact ( false ) ;
108133 setManagerEmailInput ( data . managerEmail || '' ) ;
134+ setManagerNameInput ( data . managerName || '' ) ;
109135 setEmailError ( '' ) ;
110136 } }
111137 variant = 'outline'
@@ -114,36 +140,34 @@ const Header: React.FC = () => {
114140 >
115141 < X size = { 16 } />
116142 </ Button >
117- </ >
118- ) : (
119- < >
120- < span className = 'text-sm text-gray-800' >
121- { data . managerEmail || 'Not set' }
122- </ span >
123- < Tooltip >
124- < TooltipTrigger asChild >
125- < button
126- className = 'flex items-center justify-center rounded-full bg-white p-2 text-brand-pink'
127- aria-label = "Edit your line's manager email"
128- onClick = { ( ) => setIsEditingEmail ( true ) }
129- >
130- < Edit2 size = { 16 } />
131- </ button >
132- </ TooltipTrigger >
133- < TooltipContent >
134- Edit your line's manager email
135- </ TooltipContent >
136- </ Tooltip >
137- </ >
138- ) }
139- </ div >
140- { emailError && (
141- < div className = 'text-red-500 text-xs mt-1' >
142- { emailError }
143+ </ div >
144+ </ div >
145+ ) : (
146+ < div className = 'flex items-center space-x-2' >
147+ < div className = 'text-sm text-gray-800' >
148+ { data . managerName ? data . managerName : 'Name not set' } |{ ' ' }
149+ { data . managerEmail
150+ ? data . managerEmail
151+ : 'Email not set' }
152+ </ div >
153+ < Tooltip >
154+ < TooltipTrigger asChild >
155+ < button
156+ className = 'flex items-center justify-center rounded-full bg-white p-2 text-brand-pink'
157+ aria-label = "Edit your line manager's details"
158+ onClick = { ( ) => setIsEditingContact ( true ) }
159+ >
160+ < Edit2 size = { 16 } />
161+ </ button >
162+ </ TooltipTrigger >
163+ < TooltipContent >
164+ Edit your line manager's details
165+ </ TooltipContent >
166+ </ Tooltip >
143167 </ div >
144168 ) }
145169 </ div >
146- { /* Question counter */ }
170+ { /* Progress section */ }
147171 < div >
148172 < div className = 'text-sm font-semibold text-gray-700 mb-1' >
149173 Your progress:
@@ -165,7 +189,6 @@ const Header: React.FC = () => {
165189 </ DialogContent >
166190 </ Dialog >
167191 ) : (
168- // Change: Render non-clickable container if there is no username.
169192 < div className = 'flex items-center border-2 border-white rounded-full px-4 py-2 cursor-default' >
170193 < span className = 'mr-2' > Not logged</ span >
171194 < SmallCircularQuestionCounter />
0 commit comments