11
22import { useState } from "react" ;
3- import { Eye , EyeOff , User , Mail , Lock , GraduationCap , ArrowRight } from "lucide-react" ;
3+ import { Eye , EyeOff , User , Mail , Lock , GraduationCap , ArrowRight , ChevronDown } from "lucide-react" ;
44import { useMembers } from "@/hooks/useMember" ;
55import { globalToast } from "@/utils/toast" ;
66import { useNavigate } from "react-router-dom" ;
@@ -17,6 +17,15 @@ const SignupForm = ({ setIsLogin }) => {
1717 const [ isLoading , setIsLoading ] = useState ( false ) ;
1818 const { createNewMember } = useMembers ( ) ;
1919 const navigate = useNavigate ( ) ;
20+ const [ isOpen , setIsOpen ] = useState ( false ) ;
21+
22+ const currentYear = new Date ( ) . getFullYear ( ) ;
23+ const years = Array . from ( { length : 9 } , ( _ , i ) => currentYear - 4 + i ) ;
24+
25+ const handleYearSelect = ( year ) => {
26+ setFormData ( { ...formData , passoutYear : year . toString ( ) } ) ;
27+ setIsOpen ( false ) ;
28+ } ;
2029
2130 const passwordsMatch = formData . password === confirmPassword ;
2231
@@ -149,28 +158,47 @@ const SignupForm = ({ setIsLogin }) => {
149158 </ div >
150159 </ div >
151160
152- < div className = "space-y-2" >
161+ < div className = "w-full max-w-md space-y-2" >
153162 < label className = "text-xs font-bold tracking-wider text-[#2C1810] dark:text-[#F5E6D3]" >
154163 PASSOUT YEAR
155164 </ label >
156165 < div className = "relative" >
157166 < GraduationCap className = "pointer-events-none absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[#C1502E] z-10" />
158- < input
159- type = "number"
160- placeholder = "eg. 2027"
161- value = { formData . passoutYear }
162- onChange = { ( e ) => {
163- const year = parseInt ( e . target . value ) ;
164- const currentYear = new Date ( ) . getFullYear ( ) ;
165- if ( year >= currentYear - 4 && year <= currentYear + 4 ) {
166- setFormData ( { ...formData , passoutYear : e . target . value } ) ;
167- }
168- } }
169- min = { new Date ( ) . getFullYear ( ) - 4 }
170- max = { new Date ( ) . getFullYear ( ) + 4 }
171- className = "h-12 w-full border-4 border-[#2C1810] dark:border-[#F5E6D3] bg-[#F5E6D3] dark:bg-[#2C1810] pl-12 pr-4 text-sm text-[#2C1810] dark:text-[#F5E6D3] placeholder:text-[#2C1810]/40 dark:placeholder:text-[#F5E6D3]/40 focus:outline-none focus:ring-0 focus:translate-x-1 focus:translate-y-1 transition-transform"
172- required
173- />
167+ < button
168+ type = "button"
169+ onClick = { ( ) => setIsOpen ( ! isOpen ) }
170+ className = "h-12 w-full border-4 border-[#2C1810] dark:border-[#F5E6D3] bg-[#F5E6D3] dark:bg-[#2C1810] pl-12 pr-10 text-sm text-[#2C1810] dark:text-[#F5E6D3] text-left focus:outline-none focus:ring-0 focus:translate-x-1 focus:translate-y-1 transition-transform relative"
171+ >
172+ < span className = { formData . passoutYear ? '' : 'text-[#2C1810]/40 dark:text-[#F5E6D3]/40' } >
173+ { formData . passoutYear || 'eg. 2027' }
174+ </ span >
175+ < ChevronDown className = { `absolute right-3 top-1/2 h-5 w-5 -translate-y-1/2 text-[#C1502E] transition-transform ${ isOpen ? 'rotate-180' : '' } ` } />
176+ </ button >
177+
178+ { isOpen && (
179+ < >
180+ < div
181+ className = "fixed inset-0 z-20"
182+ onClick = { ( ) => setIsOpen ( false ) }
183+ />
184+ < div className = "absolute z-30 mt-2 w-full border-4 border-[#2C1810] dark:border-[#F5E6D3] bg-[#F5E6D3] dark:bg-[#2C1810] max-h-60 overflow-y-auto" >
185+ { years . map ( ( year ) => (
186+ < button
187+ key = { year }
188+ type = "button"
189+ onClick = { ( ) => handleYearSelect ( year ) }
190+ className = { `w-full px-4 py-3 text-left text-sm hover:bg-[#C1502E]/10 transition-colors ${
191+ formData . passoutYear === year . toString ( )
192+ ? 'bg-[#C1502E]/20 text-[#C1502E] font-bold'
193+ : 'text-[#2C1810] dark:text-[#F5E6D3]'
194+ } `}
195+ >
196+ { year }
197+ </ button >
198+ ) ) }
199+ </ div >
200+ </ >
201+ ) }
174202 </ div >
175203 </ div >
176204
0 commit comments