'How to dynamically change material ui icon depending on the backend response?

I have a table and in this table, there is a column named status, and in this column, three values are returned from the backend, which are "approve", "Review" and "pending". My problem is that I want when the status is "approve" to change the shape of the icon to "VerifiedUserIcon" (import VerifiedUserIcon from '@material-ui/icons/VerifiedUser';) and When the status review that changes the shape of the icon to "VisibilityIcon", just like this picture

enter image description here

How can I solve my problem?

<TableCell className="p-4 md:p-16 truncate" component="th" scope="row">
  <Chip
    style={{ fontSize: "1.2rem" }}
    icon={<FaceIcon />}
    label={n.status}
    variant="outlined"
  />
</TableCell>;


Solution 1:[1]

const statusIcon = (status) => {
  switch (status) {
    case "verified":
      return <VerifiedIcon />;
    case "review":
      return <ReviewIcon />;
    default:
      return <DefaultIcon />;
  }
};

<TableCell className="p-4 md:p-16 truncate" component="th" scope="row">
  <Chip style={{ fontSize: "1.2rem" }} icon={statusIcon(n.status)} label={n.status} variant="outlined" />
</TableCell>;

Solution 2:[2]

You can also use ternary operator to specify icons, assuming only 3 states

<TableCell className="p-4 md:p-16 truncate" component="th" scope="row">
  <Chip
    style={{ fontSize: "1.2rem" }}
    icon={
      n.status === "approve" ? (
        <VerifiedIcon />
      ) : n.status === "review" ? (
        <ReviewIcon />
      ) : (
        <PendingIcon />
      )
    }
    label={n.status}
    variant="outlined"
  />
</TableCell>;

Solution 3:[3]

You can even try Object literals for your icons by mapping status with related icons something like below.

const statusIcon = {
  verified: <VerifiedIcon />,
  review: <ReviewIcon />,
  // other icons based on your status
};

Then in your code, you can use the statusIcon object and get the icon based on the property.

<TableCell className="p-4 md:p-16 truncate" component="th" scope="row">
  <Chip
    style={{ fontSize: "1.2rem" }}
    icon={statusIcon[n.status]}
    label={n.status}
    variant="outlined"
  />
</TableCell>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 maazakn
Solution 2 Dhia Djobbi
Solution 3 mchowdam