Building Usecase
Last updated
Last updated
Right now, you will have an empty template generated by npm run usecase:create
command
import React from "react";
const AgeCalculator: React.FC<{
data: {};}> = ({ data }: { data: { } }) => {
return <></>;
};
export default AgeCalculator;
Let's think about the components to build.
So Let's start building the UI !!!
As there is no data coming from the backend, we can remove the data prop from the template code.
import React from "react";
const AgeCalculator: React.FC = () => {
return <></>;
};
export default AgeCalculator;
Adding Components that we have discussed in the planning.
import React, { useState } from "react";
import { Button, Stack, TextField, Typography, useTheme } from "@mui/material";
import { DatePicker } from "@mui/x-date-pickers/DatePicker";
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
const AgeCalculator: React.FC<{}> = () => {
const theme = useTheme();
const [date, setDate] = useState<Dayjs | null>(dayjs());
const [age, setAge] = useState<string>("");
const [error, setError] = useState<string>("");
const handleChange = (newValue: Dayjs | null) => {
if (newValue.isAfter(dayjs())) {
setError("Date cannot be in future");
setAge("");
setDate(newValue);
return;
}
setDate(newValue);
setError("");
};
const handleClick = () => {
console.log("Button Clicked");
};
return (
<Stack spacing={3} mx={2} my={5}>
<LocalizationProvider dateAdapter={AdapterDayjs}>
<DatePicker
label="Date of Birth (DD-MMM-YYYY)"
inputFormat="DD-MMM-YYYY"
value={date}
onChange={handleChange}
disableMaskedInput={true}
renderInput={(params) => <TextField {...params} disabled={true} />}
/>
</LocalizationProvider>
<Button
sx={{ mt: 1, mr: 1, boxShadow: 2 }}
type="submit"
variant="outlined"
onClick={handleClick}
>
Calculate
</Button>
{age.length !== 0 && (
<Typography
variant="h6"
sx={{
overflow: "hidden",
textOverflow: "ellipsis",
}}
>
Your age is {age}.
</Typography>
)}
{error.length !== 0 && (
<Typography
variant="h6"
sx={{
overflow: "hidden",
textOverflow: "ellipsis",
}}
style={{ color: theme.palette.error.main }}
>
{error}
</Typography>
)}
</Stack>
);
};
export default AgeCalculator;
Now We have to write to handleClick logic.
const handleClick = () => {
if (date.isAfter(dayjs())) {
setError("Date cannot be in future");
setAge("");
return;
}
if (!date.isValid()) {
setError("Please select a valid date");
setAge("");
return;
}
let year = dayjs().diff(date, "year");
let month: number = 0,const handleClick = () => {
if (date.isAfter(dayjs())) {
setError("Date cannot be in future");
setAge("");
return;
}
if (!date.isValid()) {
setError("Please select a valid date");
setAge("");
return;
}
let year = dayjs().diff(date, "year");
let month: number = 0,
day: number = 0;
if (dayjs().month() < date.month()) {
year -= 1;
month = 12 - date.month() + dayjs().month();
} else {
month = dayjs().month() - date.month();
}
if (dayjs().date() >= date.date()) {
day = dayjs().date() - date.date();
} else {
month = month - 1;
day = 31 - date.date() + dayjs().date();
if (month === 0) {
year = year - 1;
month = 11;
}
}
setError("");
setAge(`${year} years ${month} months ${day} days`);
};
day: number = 0;
if (dayjs().month() < date.month()) {
year -= 1;
month = 12 - date.month() + dayjs().month();
} else {
month = dayjs().month() - date.month();
}
if (dayjs().date() >= date.date()) {
day = dayjs().date() - date.date();
} else {
month = month - 1;
day = 31 - date.date() + dayjs().date();
if (month === 0) {
year = year - 1;
month = 11;
}
}
setError("");
setAge(`${year} years ${month} months ${day} days`);
};