"use client";
import { useTranslation } from "@/lib/i18n/client";
import { api } from "@/lib/trpc";
import { Database, HardDrive } from "lucide-react";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "../ui/card";
import { Progress } from "../ui/progress";
function formatBytes(bytes: number): string {
if (bytes === 0) return "0 B";
const k = 1024;
const sizes = ["B", "KB", "MB", "GB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + " " + sizes[i];
}
function formatNumber(num: number): string {
if (num >= 1000000) {
return (num / 1000000).toFixed(1) + "M";
}
if (num >= 1000) {
return (num / 1000).toFixed(1) + "K";
}
return num.toString();
}
interface QuotaProgressItemProps {
title: string;
icon: React.ReactNode;
used: number;
quota: number | null;
unlimited: boolean;
formatter: (value: number) => string;
description: string;
}
function QuotaProgressItem({
title,
icon,
used,
quota,
unlimited,
formatter,
description,
}: QuotaProgressItemProps) {
const { t } = useTranslation();
const percentage =
unlimited || !quota ? 0 : Math.min((used / quota) * 100, 100);
const isNearLimit = percentage > 80;
const isAtLimit = percentage >= 100;
return (
{icon}
{title}
{description}
{formatter(used)}{" "}
{unlimited
? ""
: `/ ${quota !== null && quota !== undefined ? formatter(quota) : "∞"}`}
{!unlimited && quota && (
);
}
export function QuotaProgress() {
const { t } = useTranslation();
const { data: quotaUsage, isLoading } =
api.subscriptions.getQuotaUsage.useQuery();
if (isLoading) {
return (
{t("settings.subscription.usage_quotas")}
{t("settings.subscription.loading_usage")}
);
}
if (!quotaUsage) {
return null;
}
return (
{t("settings.subscription.usage_quotas")}
{t("settings.subscription.track_usage")}
}
used={quotaUsage.bookmarks.used}
quota={quotaUsage.bookmarks.quota}
unlimited={quotaUsage.bookmarks.unlimited}
formatter={formatNumber}
description={t("settings.subscription.total_bookmarks_saved")}
/>
}
used={quotaUsage.storage.used}
quota={quotaUsage.storage.quota}
unlimited={quotaUsage.storage.unlimited}
formatter={formatBytes}
description={t("settings.subscription.assets_file_storage")}
/>
);
}