@@ -12,6 +12,7 @@ import {
1212 ModalFooter ,
1313} from 'reactstrap' ;
1414import PhoneInput from 'react-phone-input-2' ;
15+ import { parsePhoneNumberFromString } from 'libphonenumber-js/max' ;
1516import { toast } from 'react-toastify' ;
1617import { useDispatch , useSelector } from 'react-redux' ;
1718import Joi from 'joi-browser' ;
@@ -47,6 +48,7 @@ export default function AddMaterialForm() {
4748 const [ formData , setFormData ] = useState ( initialFormState ) ;
4849 const [ areaCode , setAreaCode ] = useState ( '1' ) ;
4950 const [ phoneNumber , setPhoneNumber ] = useState ( '' ) ;
51+ const [ phoneValid , setPhoneValid ] = useState ( true ) ;
5052 const [ uploadedFiles , setUploadedFiles ] = useState ( [ ] ) ; // log here for correct state snapshot (will show each render)
5153 const [ errors , setErrors ] = useState ( { } ) ;
5254 const history = useHistory ( ) ;
@@ -59,6 +61,7 @@ export default function AddMaterialForm() {
5961 const [ showTextbox , setShowTextbox ] = useState ( false ) ;
6062 const [ selectedUnit , setSelectedUnit ] = useState ( '' ) ;
6163 const [ newUnit , setNewUnit ] = useState ( '' ) ;
64+ const [ dateError , setDateError ] = useState ( null ) ;
6265 const units = useSelector ( state => state . bmInvUnits . list ) ;
6366 // console.log(materialTypes);
6467 // console.log(units)
@@ -139,10 +142,27 @@ export default function AddMaterialForm() {
139142 } ;
140143
141144 const handleInputChange = ( name , value ) => {
142- setFormData ( prevData => ( {
143- ...prevData ,
144- [ name ] : value ,
145- } ) ) ;
145+ if ( name === 'purchaseDate' ) {
146+ const today = new Date ( ) . toLocaleDateString ( 'en-CA' ) ;
147+ if ( value && value > today ) {
148+ setDateError ( "Purchase date should be equal or earlier to today's date" ) ;
149+ setFormData ( prevData => ( {
150+ ...prevData ,
151+ [ name ] : '' ,
152+ } ) ) ;
153+ } else {
154+ setDateError ( null ) ;
155+ setFormData ( prevData => ( {
156+ ...prevData ,
157+ [ name ] : value ,
158+ } ) ) ;
159+ }
160+ } else {
161+ setFormData ( prevData => ( {
162+ ...prevData ,
163+ [ name ] : value ,
164+ } ) ) ;
165+ }
146166 } ;
147167
148168 const { unitPrice, quantity, taxes, shippingFee } = formData ;
@@ -154,16 +174,73 @@ export default function AddMaterialForm() {
154174 const totalTax = calculateTotalTax ( Number ( taxes ) , totalPrice ) ;
155175 const totalPriceWithShipping = ( totalPrice + totalTax + Number ( shippingFee ) ) . toFixed ( 2 ) ;
156176
157- const phoneChange = ( name , phone ) => {
177+ const phoneChange = ( name , phone , countryData ) => {
178+ const dialCode = countryData . dialCode ;
179+ const countryCode = countryData . countryCode . toUpperCase ( ) ;
180+
181+ // Get the national number (remove dial code from beginning)
182+ let nationalNumber = '' ;
183+ if ( phone && phone . startsWith ( dialCode ) ) {
184+ nationalNumber = phone . slice ( dialCode . length ) ;
185+ } else if ( phone ) {
186+ nationalNumber = phone ;
187+ }
188+
189+ // Check if country changed (dial code in formData is different from current)
190+ const previousDialCode = formData . areaCode ? formData . areaCode . replace ( '+' , '' ) : '1' ;
191+ const countryChanged = previousDialCode !== dialCode ;
192+
193+ // If country changed, reset to just the dial code
194+ if ( countryChanged && formData . phoneNumber ) {
195+ setFormData ( prevData => ( {
196+ ...prevData ,
197+ [ name ] : dialCode ,
198+ areaCode : `+${ dialCode } ` ,
199+ } ) ) ;
200+ setPhoneValid ( true ) ;
201+ return ;
202+ }
203+
158204 setFormData ( prevData => ( {
159205 ...prevData ,
160206 [ name ] : phone ,
207+ areaCode : `+${ dialCode } ` ,
161208 } ) ) ;
209+
210+ // If no national number entered, consider it valid (optional field)
211+ if ( ! nationalNumber ) {
212+ setPhoneValid ( true ) ;
213+ return ;
214+ }
215+
216+ // Validate phone number
217+ try {
218+ const fullNumber = `+${ dialCode } ${ nationalNumber } ` ;
219+ const phoneNumberObj = parsePhoneNumberFromString ( fullNumber , countryCode ) ;
220+
221+ if ( phoneNumberObj ) {
222+ const isValidFormat = phoneNumberObj . isValid ( ) ;
223+ const numberType = phoneNumberObj . getType ( ) ;
224+
225+ // Number must be valid AND must have a recognized type (MOBILE, FIXED_LINE, etc.)
226+ const hasValidType = numberType !== undefined ;
227+ setPhoneValid ( isValidFormat && hasValidType ) ;
228+ } else {
229+ setPhoneValid ( false ) ;
230+ }
231+ } catch ( error ) {
232+ setPhoneValid ( false ) ;
233+ }
162234 } ;
163235
164236 const handleSubmit = async event => {
165237 event . preventDefault ( ) ;
166238 const validationErrors = validate ( formData ) ;
239+ if ( ! phoneValid ) {
240+ toast . error ( 'Invalid phone number for the selected country' ) ;
241+ return ;
242+ }
243+
167244 setErrors ( validationErrors || { } ) ;
168245
169246 if ( validationErrors ) {
@@ -405,7 +482,7 @@ export default function AddMaterialForm() {
405482 < Input
406483 id = "purchase-date"
407484 type = "date"
408- name = "purchase-date "
485+ name = "purchaseDate "
409486 value = { formData . purchaseDate }
410487 onChange = { event => handleInputChange ( 'purchaseDate' , event . target . value ) }
411488 />
@@ -414,6 +491,9 @@ export default function AddMaterialForm() {
414491 Enter Date
415492 </ Label >
416493 ) }
494+ < Label for = "purchaseDateErr" sm = { 12 } className = { `${ styles . materialFormError } ` } >
495+ { dateError }
496+ </ Label >
417497 </ FormGroup >
418498 </ div >
419499 < div className = { `${ styles . addMaterialFlexGroup } ` } >
@@ -440,15 +520,23 @@ export default function AddMaterialForm() {
440520 />
441521 </ FormGroup >
442522 </ div >
443-
444- < PhoneInput
445- country = "US"
446- regions = { [ 'america' , 'europe' , 'asia' , 'oceania' , 'africa' ] }
447- limitMaxLength = "true"
448- value = { formData . phoneNumber }
449- onChange = { phone => phoneChange ( 'phoneNumber' , phone ) }
450- inputStyle = { { height : 'auto' , width : '40%' , fontSize : 'inherit' } }
451- />
523+ < FormGroup >
524+ < Label for = "Phone Number" > Phone Number</ Label >
525+ < div >
526+ < PhoneInput
527+ country = "us"
528+ value = { formData . phoneNumber }
529+ onChange = { ( phone , countryData ) => phoneChange ( 'phoneNumber' , phone , countryData ) }
530+ enableLongNumbers = { false }
531+ inputStyle = { { height : 'auto' , width : '40%' , fontSize : 'inherit' } }
532+ />
533+ { ! phoneValid && formData . phoneNumber && (
534+ < Label className = { `${ styles . materialFormError } ` } >
535+ Invalid phone number for the selected country
536+ </ Label >
537+ ) }
538+ </ div >
539+ </ FormGroup >
452540 < FormGroup >
453541 < Label for = "imageUpload" > Upload Material Picture</ Label >
454542 < DragAndDrop
0 commit comments