refactored ProgressCard to component

This commit is contained in:
2026-04-24 14:04:24 +05:30
parent b1509fd5ab
commit 49bdb85088
5 changed files with 82 additions and 25 deletions

View File

@@ -0,0 +1,7 @@
export interface ProgressCardProps {
header: string;
summary?: string;
progressAmount: number;
totalAmount: number;
colorTheme?: "primary" | "secondary" | "error" | "info" | "success" | "warning";
}

View File

@@ -0,0 +1,23 @@
import ProgressCardView from "./ProgressCard.view";
import { ProgressCardProps } from "./ProgressCard.models";
import { getPercentage, parseSummary } from "./ProgressCard.utils";
export default function ProgressCard(props: ProgressCardProps) {
const { progressAmount, totalAmount, summary } = props;
const percentage = getPercentage(progressAmount, totalAmount);
const { prefixAmount, suffixString } = parseSummary(
summary,
progressAmount,
totalAmount
);
return (
<ProgressCardView
{...props}
percentage={percentage}
prefixAmount={prefixAmount}
suffixString={suffixString}
/>
);
}

View File

@@ -0,0 +1,19 @@
export const getPercentage = (progressAmount: number, totalAmount: number) => {
if (!totalAmount) return 0;
return Math.min(100, Math.max(0, (progressAmount / totalAmount) * 100));
};
export const parseSummary = (
summary: string | undefined,
progressAmount: number,
totalAmount: number
) => {
const displaySummary = summary ?? `Rs ${progressAmount} / Rs ${totalAmount}`;
const parts = displaySummary.split("/");
const prefixAmount = parts[0]?.trim() || "";
const suffixString =
parts.length > 1 ? `/ ${parts.slice(1).join("/").trim()}` : "";
return { prefixAmount, suffixString };
};

View File

@@ -1,29 +1,26 @@
import * as React from "react"; import * as React from "react";
import { Box, Typography, Paper, LinearProgress, linearProgressClasses } from "@mui/material"; import {
Box,
Typography,
Paper,
LinearProgress,
linearProgressClasses
} from "@mui/material";
import { ProgressCardProps } from "./ProgressCard.models";
export interface ProgressCardProps { interface ViewProps extends ProgressCardProps {
header: string; percentage: number;
summary?: string; prefixAmount: string;
progressAmount: number; suffixString: string;
totalAmount: number;
colorTheme?: "primary" | "secondary" | "error" | "info" | "success" | "warning";
} }
export default function ProgressCard({ export default function ProgressCardView({
header, header,
summary,
progressAmount,
totalAmount,
colorTheme = "info", colorTheme = "info",
}: ProgressCardProps) { percentage,
const percentage = Math.min(100, Math.max(0, (progressAmount / totalAmount) * 100)) || 0; prefixAmount,
suffixString,
const displaySummary = summary ?? `Rs ${progressAmount} / Rs ${totalAmount}`; }: ViewProps) {
const parts = displaySummary.split('/');
const prefixAmount = parts[0]?.trim() || '';
const suffixString = parts.length > 1 ? `/ ${parts.slice(1).join('/').trim()}` : '';
return ( return (
<Paper <Paper
elevation={4} elevation={4}
@@ -40,9 +37,14 @@ export default function ProgressCard({
flexDirection: "column", flexDirection: "column",
alignItems: "center", alignItems: "center",
justifyContent: "center", justifyContent: "center",
position: 'relative', position: "relative",
overflow: 'hidden', overflow: "hidden",
boxShadow: (theme) => `0 12px 24px -10px ${theme.palette.mode === 'dark' ? '#000' : theme.palette[colorTheme].main}`, boxShadow: (theme) =>
`0 12px 24px -10px ${
theme.palette.mode === "dark"
? "#000"
: theme.palette[colorTheme].main
}`,
}} }}
> >
<Typography variant="subtitle1" fontWeight={600} sx={{ opacity: 0.9, mb: 1 }}> <Typography variant="subtitle1" fontWeight={600} sx={{ opacity: 0.9, mb: 1 }}>
@@ -52,7 +54,11 @@ export default function ProgressCard({
<Typography variant="h3" fontWeight={800} sx={{ mb: 3 }}> <Typography variant="h3" fontWeight={800} sx={{ mb: 3 }}>
{prefixAmount}{" "} {prefixAmount}{" "}
{suffixString && ( {suffixString && (
<Typography component="span" variant="subtitle1" sx={{ opacity: 0.7, fontWeight: 500 }}> <Typography
component="span"
variant="subtitle1"
sx={{ opacity: 0.7, fontWeight: 500 }}
>
{suffixString} {suffixString}
</Typography> </Typography>
)} )}
@@ -70,7 +76,7 @@ export default function ProgressCard({
}, },
[`& .${linearProgressClasses.bar}`]: { [`& .${linearProgressClasses.bar}`]: {
borderRadius: 5, borderRadius: 5,
backgroundColor: "#fff", backgroundColor: "#fff",
}, },
}} }}
/> />

View File

@@ -0,0 +1,2 @@
export { default } from "./LatestItems";
export * from "./LatestItems.models";