fix(dashboard-v2): fix current usage graph on portals without Stripe configured
This commit is contained in:
parent
c1d07083fb
commit
1e713c61c9
|
@ -1,6 +1,7 @@
|
||||||
import { useEffect, useMemo, useState } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
import fileSize from "pretty-bytes";
|
import fileSize from "pretty-bytes";
|
||||||
import { Link } from "gatsby";
|
import { Link } from "gatsby";
|
||||||
|
import cn from "classnames";
|
||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
|
|
||||||
import { useUser } from "../../contexts/user";
|
import { useUser } from "../../contexts/user";
|
||||||
|
@ -62,7 +63,9 @@ const ErrorMessage = () => (
|
||||||
);
|
);
|
||||||
|
|
||||||
export default function CurrentUsage() {
|
export default function CurrentUsage() {
|
||||||
|
const { activePlan, plans } = useActivePlan();
|
||||||
const { usage, error, loading } = useUsageData();
|
const { usage, error, loading } = useUsageData();
|
||||||
|
const nextPlan = useMemo(() => plans.find(({ tier }) => tier > activePlan?.tier), [plans, activePlan]);
|
||||||
const storageUsage = size(usage.storageUsed);
|
const storageUsage = size(usage.storageUsed);
|
||||||
const storageLimit = size(usage.storageLimit);
|
const storageLimit = size(usage.storageLimit);
|
||||||
const filesUsedLabel = useMemo(() => ({ value: usage.filesUsed, unit: "files" }), [usage.filesUsed]);
|
const filesUsedLabel = useMemo(() => ({ value: usage.filesUsed, unit: "files" }), [usage.filesUsed]);
|
||||||
|
@ -89,7 +92,7 @@ export default function CurrentUsage() {
|
||||||
<span>{storageLimit.text}</span>
|
<span>{storageLimit.text}</span>
|
||||||
</div>
|
</div>
|
||||||
<UsageGraph>
|
<UsageGraph>
|
||||||
<GraphBar value={usage.storageUsed} limit={usage.storageLimit} label={storageUsage} />
|
<GraphBar value={usage.storageUsed} limit={usage.storageLimit} label={storageUsage} className="normal-case" />
|
||||||
<GraphBar value={usage.filesUsed} limit={usage.filesLimit} label={filesUsedLabel} />
|
<GraphBar value={usage.filesUsed} limit={usage.filesLimit} label={filesUsedLabel} />
|
||||||
</UsageGraph>
|
</UsageGraph>
|
||||||
<div className="flex place-content-between">
|
<div className="flex place-content-between">
|
||||||
|
@ -97,7 +100,10 @@ export default function CurrentUsage() {
|
||||||
<span className="inline-flex place-content-between w-[37%]">
|
<span className="inline-flex place-content-between w-[37%]">
|
||||||
<Link
|
<Link
|
||||||
to="/upgrade"
|
to="/upgrade"
|
||||||
className="text-primary underline-offset-3 decoration-dotted hover:text-primary-light hover:underline"
|
className={cn(
|
||||||
|
"text-primary underline-offset-3 decoration-dotted hover:text-primary-light hover:underline",
|
||||||
|
{ invisible: !nextPlan }
|
||||||
|
)}
|
||||||
>
|
>
|
||||||
UPGRADE
|
UPGRADE
|
||||||
</Link>{" "}
|
</Link>{" "}
|
||||||
|
|
|
@ -21,11 +21,11 @@ const BarLabel = styled.span.attrs({
|
||||||
`}
|
`}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const GraphBar = ({ value, limit, label }) => {
|
export const GraphBar = ({ value, limit, label, className }) => {
|
||||||
const percentage = typeof limit !== "number" || limit === 0 ? 0 : (value / limit) * 100;
|
const percentage = typeof limit !== "number" || limit === 0 ? 0 : (value / limit) * 100;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="relative flex items-center">
|
<div className={`relative flex items-center ${className}`}>
|
||||||
<Bar $percentage={percentage}>
|
<Bar $percentage={percentage}>
|
||||||
<BarTip />
|
<BarTip />
|
||||||
</Bar>
|
</Bar>
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
|
|
||||||
|
import usageGraphBg from "../../../static/images/usage-graph-bg.svg";
|
||||||
|
|
||||||
export const UsageGraph = styled.div.attrs({
|
export const UsageGraph = styled.div.attrs({
|
||||||
className: "w-full my-3 grid grid-flow-row grid-rows-2",
|
className: "w-full my-3 grid grid-flow-row grid-rows-2",
|
||||||
})`
|
})`
|
||||||
height: 146px;
|
height: 146px;
|
||||||
background: url(/images/usage-graph-bg.svg) no-repeat;
|
background: url(${usageGraphBg}) no-repeat;
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
`;
|
`;
|
||||||
|
|
|
@ -19,7 +19,14 @@ const aggregatePlansAndLimits = (plans, limits, { includeFreePlan }) => {
|
||||||
|
|
||||||
// Decorate each plan with its corresponding limits data, if available.
|
// Decorate each plan with its corresponding limits data, if available.
|
||||||
if (limits?.length) {
|
if (limits?.length) {
|
||||||
return sortedPlans.map((plan) => ({ ...plan, limits: limits[plan.tier] || null }));
|
return limits.map((limitsDescriptor, index) => {
|
||||||
|
const asssociatedPlan = sortedPlans.find((plan) => plan.tier === index) || {};
|
||||||
|
|
||||||
|
return {
|
||||||
|
...asssociatedPlan,
|
||||||
|
limits: limitsDescriptor || null,
|
||||||
|
};
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we don't have the limits data yet, set just return the plans.
|
// If we don't have the limits data yet, set just return the plans.
|
||||||
|
@ -40,10 +47,12 @@ export const PlansProvider = ({ children }) => {
|
||||||
if (plansError || limitsError) {
|
if (plansError || limitsError) {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
setError(plansError || limitsError);
|
setError(plansError || limitsError);
|
||||||
} else if (rawPlans) {
|
} else if (rawPlans || limits) {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
setPlans(
|
setPlans(
|
||||||
aggregatePlansAndLimits(rawPlans, limits?.userLimits, { includeFreePlan: !settings.isSubscriptionRequired })
|
aggregatePlansAndLimits(rawPlans || [], limits?.userLimits, {
|
||||||
|
includeFreePlan: !settings.isSubscriptionRequired,
|
||||||
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}, [rawPlans, limits, plansError, limitsError, settings.isSubscriptionRequired]);
|
}, [rawPlans, limits, plansError, limitsError, settings.isSubscriptionRequired]);
|
||||||
|
|
|
@ -10,6 +10,7 @@ export default function useActivePlan(user) {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (user) {
|
if (user) {
|
||||||
|
console.log("setActivePlan");
|
||||||
setActivePlan(plans.find((plan) => plan.tier === user.tier));
|
setActivePlan(plans.find((plan) => plan.tier === user.tier));
|
||||||
}
|
}
|
||||||
}, [plans, user]);
|
}, [plans, user]);
|
||||||
|
|
Reference in New Issue