diff --git a/explorer-nextjs/src/app/nym-node/[id]/page.tsx b/explorer-nextjs/src/app/nym-node/[id]/page.tsx
index c0e878491c..d94f7e28f3 100644
--- a/explorer-nextjs/src/app/nym-node/[id]/page.tsx
+++ b/explorer-nextjs/src/app/nym-node/[id]/page.tsx
@@ -8,6 +8,7 @@ import { BasicInfoCard } from "@/components/nymNodePageComponents/BasicInfoCard"
import { NodeMetricsCard } from "@/components/nymNodePageComponents/NodeMetricsCard";
import { NodeProfileCard } from "@/components/nymNodePageComponents/NodeProfileCard";
import { NodeRewardsCard } from "@/components/nymNodePageComponents/NodeRewardsCard";
+import { QualityIndicatorsCard } from "@/components/nymNodePageComponents/QualityIndicatorsCard";
import { StarRating } from "@/components/starRating";
import ExplorerButtonGroup from "@/components/toggleButton/ToggleButton";
import { Box, Grid2 } from "@mui/material";
@@ -84,27 +85,7 @@ export default async function NymNode({
/>
-
-
- }
- />
- }
- />
- }
- />
-
+
diff --git a/explorer-nextjs/src/components/nymNodePageComponents/NodeMetricsCard.tsx b/explorer-nextjs/src/components/nymNodePageComponents/NodeMetricsCard.tsx
index eb584cca8f..b8f5d40a26 100644
--- a/explorer-nextjs/src/components/nymNodePageComponents/NodeMetricsCard.tsx
+++ b/explorer-nextjs/src/components/nymNodePageComponents/NodeMetricsCard.tsx
@@ -22,7 +22,12 @@ export const NodeMetricsCard = (props: INodeMetricsCardProps) => {
label="Host"
value={nodeDescription.description.host_information.ip_address.toString()}
/>
-
+
);
diff --git a/explorer-nextjs/src/components/nymNodePageComponents/QualityIndicatorsCard.tsx b/explorer-nextjs/src/components/nymNodePageComponents/QualityIndicatorsCard.tsx
new file mode 100644
index 0000000000..bc13407d0b
--- /dev/null
+++ b/explorer-nextjs/src/components/nymNodePageComponents/QualityIndicatorsCard.tsx
@@ -0,0 +1,67 @@
+import type { INodeDescription } from "@/app/api";
+import ExplorerCard from "../cards/ExplorerCard";
+import ExplorerListItem from "../list/ListItem";
+import StarRating from "../starRating/StarRating";
+
+interface IQualityIndicatorsCardProps {
+ nodeDescription: INodeDescription;
+}
+
+interface IDeclaredRoles {
+ declared_role: {
+ entry: boolean;
+ exit_ipr: boolean;
+ exit_nr: boolean;
+ mixnode: boolean;
+ };
+}
+
+function getNodeRoles(rolesObject: IDeclaredRoles): string {
+ const roleMapping: { [key: string]: string } = {
+ entry: "Entry Node",
+ exit_ipr: "Exit IPR Node",
+ exit_nr: "Exit NR Node",
+ mixnode: "Mix Node",
+ };
+
+ const { declared_role } = rolesObject;
+
+ const activeRoles = Object.entries(declared_role)
+ .filter(([_, value]) => value) // Filter keys where value is true
+ .map(([key]) => roleMapping[key]) // Map keys to their corresponding strings
+ .join(", "); // Join with commas
+
+ return activeRoles;
+}
+
+export const QualityIndicatorsCard = (props: IQualityIndicatorsCardProps) => {
+ const { nodeDescription } = props;
+
+ const nodeRoles = getNodeRoles({
+ declared_role: nodeDescription.description.declared_role,
+ });
+
+ return (
+
+
+ }
+ />
+ }
+ />
+ }
+ />
+
+ );
+};