Reputation: 446
Hello I am quite a beginner in reactjs.
My current use case is very simple, I have an input field that is to accept a phone number and format it as the user is typing.Unfortunately it turns out that the input fields freezes and refuses to accept further inputs as I start formatting
Here is my code
import { parsePhoneNumberFromString } from 'libphonenumber-js';
export default function UpdatePhoneDetails() {
const [phoneNumber, setPhoneNumber] = useState('');
const updatePhoneNumber = (value) => {
const newPhoneNumber = parsePhoneNumberFromString(value, 'NG');
if (newPhoneNumber) {
const formattedNumber = newPhoneNumber.number;
const valid = newPhoneNumber.isValid();
if (valid) {
setPhoneNumber(formattedNumber); //The input field seems to be freezing here
}
}
};
return (
<TextField
variant="outlined"
required
fullWidth
id="phonenumber"
label="Phone Number"
name="phonenumber"
autoFocus
value={phoneNumber}
defaultValue={phoneNumber}
disabled={updating}
autoComplete="phonenumber"
onChange={(event) => updatePhoneNumber(event.target.value)}
/>
);
}
Thanks for your anticipated help.
Upvotes: 2
Views: 5250
Reputation: 11305
updatePhoneNumber
function only updates value if phone number is valid so when the user is still typing it won't let you do any changes.
You can set error if phone number is invalid and replace text with newPhoneNumber.number
otherwise
const { TextField } = window.MaterialUI;
const { useState, useEffect } = React;
const { parsePhoneNumberFromString } = libphonenumber;
//console.log(Object.keys(libphonenumber));
const App = () => {
const [text, setText] = useState('');
const [error, setError] = useState(null);
const onChange = ({target: {value}}) => {
let valid = true;
const newPhoneNumber = parsePhoneNumberFromString(value, "NG");
if (newPhoneNumber) {
valid = newPhoneNumber.isValid();
if(valid) {
value = newPhoneNumber.number;
}
}
setError(!valid);
setText(value);
}
return <div>
<TextField
variant="outlined"
required
fullWidth
id="phonenumber"
label="Phone Number"
name="phonenumber"
error={!!error}
helperText={error && 'Invalid phone number'}
autoFocus
value={text}
onChange={onChange}>
</TextField>
</div>
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
<script src="https://unpkg.com/react/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/libphonenumber-js/1.7.52/libphonenumber-js.min.js"></script>
<script src="https://unpkg.com/@material-ui/core@latest/umd/material-ui.development.js"></script>
<script src="https://unpkg.com/[email protected]/material-ui-lab.development.js"></script>
<div id="root"></div>
Upvotes: 1