/***
even though an input element attribute has date type, it always returns a string value,
So, inside your Form component, you must first convert the entered input string date to this date format 'Sun Dec 05 1999 00:00:00 GMT+0530 (India Standard Time)'.
Reason : in some DateComponent, that input value is considered as date and you have applied Date object's related method. ex: [inputDate.toLocaleString("en-US", { month: "long" })]
**/
/form component**/
const defaultUserInput = {
title: "",
amount: "",
date: "",
};
const ExpenseForm = ({ onSaveExpenseData }) => {
const [userInput, setUserInput] = useState(defaultUserInput);
const { title, date, amount } = userInput;
const changeHandler = (event) => {
const { value, name } = event.target;
setUserInput((prevState) => {
if (name === "date") {
const [y, m, d] = value.split("-").map((s) => parseInt(s, 10));
return { ...prevState, [name]: new Date(y, m - 1, d) };
}
return { ...prevState, [name]: value };
});
};
const SubmitHandler = (event) => {
event.preventDefault();
onSaveExpenseData(userInput);
setUserInput(defaultUserInput);
};
return (
<form onSubmit={SubmitHandler}>
<div className="new-expense__controls">
<div className="new-expense__control">
<label>Title</label>
<input
type="text"
onChange={changeHandler}
name="title"
value={title}
/>
</div>
<div className="new-expense__control">
<label>Amount</label>
<input
type="number"
min="0.01"
step="0.01"
onChange={changeHandler}
name="amount"
value={amount}
/>
</div>
<div className="new-expense__control">
<label>Amount</label>
<input
type="date"
min="2019-01-01"
max="2022-01-01"
onChange={changeHandler}
name="date"
value={date}
/>
</div>
</div>
<div className="new-expense__actions">
<button type="submit">Add Expense</button>
</div>
</form>
);
};
export default ExpenseForm;
/date component**/
const ExpenseDate = ({ date }) => {
const month = date.toLocaleString("en-US", { month: "long" });
const Itemdate = date.toLocaleString("en-US", { day: "2-digit" });
const year = date.getFullYear();
return (
<div className="expense-date">
<div className="expense-date__month">{month}</div>
<div className="expense-date__day">{Itemdate}</div>
<div className="expense-date__year">{year}</div>
</div>
);
};
export default ExpenseDate;