UNPKG

glide-design-system

Version:

Glide design system is an open-source React component library. It offers numerous benefits that make them essential tools for design and development teams.

183 lines (172 loc) 5.42 kB
import React, { useState, useRef, useEffect } from "react"; import classes from "./FullName.module.css"; const FullName = ({ onChange, value, width, height, style, firstNameLabel, lastNameLabel, firstNamePlaceholder, lastNamePlaceholder, label, conatinerStyle, required, disabled, ...props }) => { const firstNameRef = useRef(); const lastNameRef = useRef(); const [values, setValues] = useState(value ? value : ""); const [name1, name2] = values?.split(" "); const [firstNameFocused, setFirstNameFocused] = useState(false); const [lastNameFocused, setLastNameFocused] = useState(false); const [firstName, setFirstName] = useState(name1 ? name1 : ""); const [lastName, setLastName] = useState(name2 ? name2 : ""); const handleFocusFirstName = () => { setFirstNameFocused(true); }; const handleFocusLastName = () => { setLastNameFocused(true); }; useEffect(() => { const handleClickOutside = (event) => { if ( firstNameRef.current && !firstNameRef?.current?.contains(event.target) ) { setFirstNameFocused(false); } if (lastNameRef.current && !lastNameRef.current.contains(event.target)) { setLastNameFocused(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); const firstNameHandler = (e) => { setFirstName(e.target.value); getFullName(e.target.value, lastName); }; const lastNameHandler = (e) => { setLastName(e.target.value); getFullName(firstName, e.target.value); }; const getFullName = (fistNames, lastNames) => { const name1 = fistNames; const name2 = lastNames; const fullName = `${name1} ${name2}`; onChange(fullName); }; const combinedStyle = { width: width ? width : "350px", height: height ? height : "40px", backgroundColor: disabled ? "#f5f5f5" : "", ...style, }; const containerStyles = { ...conatinerStyle, }; useEffect(() => { const values = value ? value : ""; const [name1, name2] = values?.split(" "); const fullName = `${name1} ${name2}`; setFirstName(name1 ? name1 : ""); setLastName(value === null ? "" : name2 ? name2 : ""); onChange(fullName ? fullName : ""); }, [value]); return ( <div> <p className={classes.headers2}> {label ? label : ""} {required && label && <span className={classes.required}>*</span>} </p> <div className={classes.parentContainer}> <div style={containerStyles} className={classes.fledContainer}> <div ref={firstNameRef} style={{ width: width ? width : combinedStyle?.width ? combinedStyle?.width : "350px", }} > <p className={classes.headers}> {firstNameLabel ? firstNameLabel : ""} {required && !label && ( <span className={classes.required}>*</span> )} </p> <div style={combinedStyle} onFocus={handleFocusFirstName} className={`${classes.inputFieldContainer} ${ firstNameFocused && classes.focused }`} > <input disabled={disabled} style={{ backgroundColor: disabled ? "#f5f5f5" : "" }} className={classes.inputField} placeholder={ firstNamePlaceholder ? firstNamePlaceholder : "First Name" } onFocus={(e) => (e.target.style.border = "none")} onBlur={(e) => (e.target.style.borderBottom = "none")} type="text" onChange={firstNameHandler} value={firstName} {...props} /> </div> </div> <div ref={lastNameRef} style={{ width: width ? width : combinedStyle?.width ? combinedStyle?.width : "350px", }} > <p className={classes.headers}> {lastNameLabel ? lastNameLabel : ""} {required && !label && ( <span className={classes.required}>*</span> )} </p> <div style={combinedStyle} onFocus={handleFocusLastName} className={`${classes.inputFieldContainer} ${ lastNameFocused && classes.focused }`} > <input style={{ backgroundColor: disabled ? "#f5f5f5" : "" }} className={classes.inputField} placeholder={ lastNamePlaceholder ? lastNamePlaceholder : "Last Name" } disabled={disabled} onFocus={(e) => (e.target.style.border = "none")} onBlur={(e) => (e.target.style.borderBottom = "none")} type="text" onChange={lastNameHandler} value={lastName} {...props} /> </div> </div> </div> </div> </div> ); }; export default FullName;