"use client"; import React, { useEffect, useState } from "react"; import classNames from "classnames"; import styles from "./PlanMetricsWidget.module.css"; import { ISubscriptionInfo } from "@core/Models/Subscription.Model"; import StorefrontOutlinedIcon from "@mui/icons-material/StorefrontOutlined"; import PeopleOutlineOutlinedIcon from "@mui/icons-material/PeopleOutlineOutlined"; import CalendarTodayOutlinedIcon from "@mui/icons-material/CalendarTodayOutlined"; import AssignmentIndOutlinedIcon from "@mui/icons-material/AssignmentIndOutlined"; import RepeatOutlinedIcon from "@mui/icons-material/RepeatOutlined"; import Button from "@core/app/components/Button/Button"; import { MP_SUBS_STATUS } from "@core/Models/Subscription.Model"; import dayjs from "dayjs"; export interface PlanMetricsWidgetProps { subscription: ISubscriptionInfo; metrics: { organizationsCount: number; employeesCount: number; clientsCount: number; appointmentsCount: number; servicesCount: number; repeatsCount: number; }; onUpgrade: () => void; onRenew?: () => void; onCancel: () => void; isOwner?: boolean; } const MetricRow = ({ icon, title, value, maxValue, }: { icon: React.ReactNode; title: string; value: number; maxValue: number; }) => { const [animatedWidth, setAnimatedWidth] = useState(0); const isInfinite = maxValue === -1; const formattedMax = isInfinite ? "∞" : maxValue; const percentage = isInfinite ? 100 : Math.min(100, (value / maxValue) * 100); let statusClass = styles.safe; if (isInfinite) { statusClass = styles.infinite; } else { if (percentage >= 100) { statusClass = styles.danger; } else if (percentage >= 80) { statusClass = styles.warning; } } useEffect(() => { const timer = setTimeout(() => { setAnimatedWidth(percentage); }, 100); return () => clearTimeout(timer); }, [percentage]); return (
{icon} {title}
{value} / {formattedMax}
); }; export default function PlanMetricsWidget({ subscription, metrics, onUpgrade, onCancel, isOwner = true, }: PlanMetricsWidgetProps) { const isCancelled = subscription.mpStatus === MP_SUBS_STATUS.CANCELLED; return (

Métricas del Plan {subscription.plan.name}

Uso actual de tu suscripción
} title="Organizaciones" value={metrics.organizationsCount} maxValue={subscription.plan.limitOrganizations} /> } title="Clientes" value={metrics.clientsCount} maxValue={subscription.plan.limitClients} /> } title="Turnos" value={metrics.appointmentsCount} maxValue={subscription.plan.limitAppointments} /> } title="Colaboradores" value={metrics.employeesCount} maxValue={subscription.plan.limitEmployees} /> } title="Repeticiones" value={metrics.repeatsCount || 0} maxValue={subscription.plan.limitRepeats} />
{isOwner && (
)}
); }