In my Dashboard Page
, I have a component I'm rendering called <DashHome />
I passed in an array of objects as a prop to it from Dashboard Page which an icon is part of each object, everything get rendered except the icon, fortunately when I console.log()
the icon, it gave me the name.
I don't know what is wrong, I'm I passing in the wrong icons? tested it with many icons tho. <IonIcon />
Dashboard.tsx
import {
IonBackButton,
IonButtons,
IonContent,
IonFab,
IonFabButton,
IonHeader,
IonIcon,
IonMenuButton,
IonPage,
IonTitle,
IonToolbar,
NavContext,
} from "@ionic/react";
import { addOutline, arrowBackOutline } from "ionicons/icons";
import { HiMenuAlt1 } from "react-icons/hi";
import React, { useContext } from "react";
import { useParams } from "react-router";
import DashHome from "../../components/DashHome/DashHome";
import "./Dashboard.css";
import DashProfile from "../../components/DashProfile/DashProfile";
import DashSettings from "../../components/DashSettings/DashSettings";
import NoOfPros from "../NoOfPros/NoOfPros";
import Edit from "../Edit/Edit";
import Draft from "../Draft/Draft";
import Converted from "../Converted/Converted";
import WorkingDays from "../WorkingDays/WorkingDays";
import Unsubmitted from "../Unsubmitted/Unsubmitted";
interface dashboard {
title: string;
amount: string;
bg: string;
link: string;
icon: string;
}
const dashboards: dashboard[] = [
{
title: "No of Prospects",
amount: "200",
bg: "first",
link: "/dashboard/Prospect",
icon: "home",
},
{
title: "No of Converted Prospect",
amount: "700",
bg: "second",
link: "/dashboard/Converted Prospect",
icon: "listOutline",
},
{
title: "Days worked in the month",
amount: "20",
bg: "third",
link: "/dashboard/Working Days",
icon: "addOutline",
},
{
title: "Unsubmitted Prospects",
amount: "10",
bg: "fourth",
link: "/dashboard/Unsubmitted Prospect",
icon: "calendarOutline",
},
];
const Dashboard: React.FC = () => {
const { name } = useParams<{ name: string }>();
const { navigate } = useContext(NavContext);
const goToProspect = () => {
navigate("/create", "forward");
};
console.log(name);
return (
<IonPage className="dashboard">
<IonHeader translucent={true} className="ion-no-border">
<IonToolbar color="primary">
<IonButtons slot="start">
{name === "Home" ? (
<IonMenuButton className="ion-menu-button">
<HiMenuAlt1 stroke="1" color="#fff" />
</IonMenuButton>
) : (
<IonBackButton
defaultHref="/dashboard/Home"
icon={arrowBackOutline}
/>
)}
</IonButtons>
<IonTitle color="#fff">
{name === "Home" ? "Hi, John Doe" : name}
</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent className="ion-padding content">
{name === "Home" ? (
<DashHome dashboards={dashboards} />
) : name === "Profile" ? (
<DashProfile />
) : name === "Prospect" ? (
<NoOfPros />
) : name === "Settings" ? (
<DashSettings />
) : name === "Edit" ? (
<Edit />
) : name === "Draft" ? (
<Draft />
) : name === "Converted Prospect" ? (
<Converted />
) : name === "Working Days" ? (
<WorkingDays />
) : name === "Unsubmitted Prospect" ? (
<Unsubmitted />
) : (
<div>The Stufff</div>
)}
</IonContent>
{name === "Home" && (
<IonFab vertical="bottom" horizontal="end" slot="fixed">
<IonFabButton onClick={() => goToProspect()}>
<IonIcon icon={addOutline} />
</IonFabButton>
</IonFab>
)}
</IonPage>
);
};
export default Dashboard;
DashHome.tsx
import React from "react";
import { IonCard, IonCol, IonGrid, IonIcon, IonRow } from "@ionic/react";
import "./DashHome.css";
interface dashboards {
title: string;
amount: string;
bg: string;
link: string;
icon: string;
}
type Props = {
dashboards: dashboards[];
};
const DashHome: React.FC<Props> = ({ dashboards }) => {
return (
<div>
<IonGrid className="dash ion-no-padding">
<IonRow className="ion-margin-top">
{dashboards.map((board, idx) => (
<IonCol size="6" className="ion-no-padding" key={idx}>
<IonCard href={board.link} className="card" color={board.bg}>
<div className="ion-margin-bottom ion-margin-top">
<IonIcon color="light" icon={board.icon} />
{console.log(board.icon)}
</div>
<h2 className="card-title">{board.title}</h2>
<p className="card-text">{board.amount}</p>
<IonIcon color="light" icon={board.icon} />
</IonCard>
</IonCol>
))}
</IonRow>
</IonGrid>
<div className="sec-color">
<p className="ml2 small">Get the most out of your performance</p>
<IonCard className="card-no-bg bordered">
<p className="sec-color l-h">5 Pending Prospect..</p>
</IonCard>
</div>
</div>
);
};
export default DashHome;
The problem is if I do <IonIcon icon={addOutline} />
for example, it will work.
Might be useful.
it seems ion-icon
does not like the icon in form of a string. I solved it by doing this:
the type icon: string,
import { addOutline } from "ionicons/icons";
{
...
icon: addOutline // just as imported instead of in string.
}