From 49bdb85088774e6f9adc851d5605b092f4c77925 Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Fri, 24 Apr 2026 14:04:24 +0530 Subject: [PATCH] refactored ProgressCard to component --- .../ProgressCard/ProgressCard.models.ts | 7 +++ src/components/ProgressCard/ProgressCard.tsx | 23 ++++++++ .../ProgressCard/ProgressCard.utils.ts | 19 +++++++ .../ProgressCard.view.tsx} | 56 ++++++++++--------- src/components/ProgressCard/index.ts | 2 + 5 files changed, 82 insertions(+), 25 deletions(-) create mode 100644 src/components/ProgressCard/ProgressCard.models.ts create mode 100644 src/components/ProgressCard/ProgressCard.tsx create mode 100644 src/components/ProgressCard/ProgressCard.utils.ts rename src/components/{ProgressCard.tsx => ProgressCard/ProgressCard.view.tsx} (56%) create mode 100644 src/components/ProgressCard/index.ts diff --git a/src/components/ProgressCard/ProgressCard.models.ts b/src/components/ProgressCard/ProgressCard.models.ts new file mode 100644 index 0000000..0d37939 --- /dev/null +++ b/src/components/ProgressCard/ProgressCard.models.ts @@ -0,0 +1,7 @@ +export interface ProgressCardProps { + header: string; + summary?: string; + progressAmount: number; + totalAmount: number; + colorTheme?: "primary" | "secondary" | "error" | "info" | "success" | "warning"; +} diff --git a/src/components/ProgressCard/ProgressCard.tsx b/src/components/ProgressCard/ProgressCard.tsx new file mode 100644 index 0000000..ac82e41 --- /dev/null +++ b/src/components/ProgressCard/ProgressCard.tsx @@ -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 ( + + ); +} diff --git a/src/components/ProgressCard/ProgressCard.utils.ts b/src/components/ProgressCard/ProgressCard.utils.ts new file mode 100644 index 0000000..6f126cd --- /dev/null +++ b/src/components/ProgressCard/ProgressCard.utils.ts @@ -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 }; +}; diff --git a/src/components/ProgressCard.tsx b/src/components/ProgressCard/ProgressCard.view.tsx similarity index 56% rename from src/components/ProgressCard.tsx rename to src/components/ProgressCard/ProgressCard.view.tsx index 74c66d3..94454e8 100644 --- a/src/components/ProgressCard.tsx +++ b/src/components/ProgressCard/ProgressCard.view.tsx @@ -1,29 +1,26 @@ 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 { - header: string; - summary?: string; - progressAmount: number; - totalAmount: number; - colorTheme?: "primary" | "secondary" | "error" | "info" | "success" | "warning"; +interface ViewProps extends ProgressCardProps { + percentage: number; + prefixAmount: string; + suffixString: string; } -export default function ProgressCard({ +export default function ProgressCardView({ header, - summary, - progressAmount, - totalAmount, colorTheme = "info", -}: ProgressCardProps) { - const percentage = Math.min(100, Math.max(0, (progressAmount / totalAmount) * 100)) || 0; - - 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()}` : ''; - + percentage, + prefixAmount, + suffixString, +}: ViewProps) { return ( `0 12px 24px -10px ${theme.palette.mode === 'dark' ? '#000' : theme.palette[colorTheme].main}`, + position: "relative", + overflow: "hidden", + boxShadow: (theme) => + `0 12px 24px -10px ${ + theme.palette.mode === "dark" + ? "#000" + : theme.palette[colorTheme].main + }`, }} > @@ -52,7 +54,11 @@ export default function ProgressCard({ {prefixAmount}{" "} {suffixString && ( - + {suffixString} )} @@ -70,7 +76,7 @@ export default function ProgressCard({ }, [`& .${linearProgressClasses.bar}`]: { borderRadius: 5, - backgroundColor: "#fff", + backgroundColor: "#fff", }, }} /> diff --git a/src/components/ProgressCard/index.ts b/src/components/ProgressCard/index.ts new file mode 100644 index 0000000..2847eeb --- /dev/null +++ b/src/components/ProgressCard/index.ts @@ -0,0 +1,2 @@ +export { default } from "./LatestItems"; +export * from "./LatestItems.models";