fix(dashboard-v2): fix current usage graph on portals without Stripe configured

This commit is contained in:
Michał Leszczyk 2022-04-14 18:29:07 +02:00
parent c1d07083fb
commit 1e713c61c9
No known key found for this signature in database
GPG Key ID: FA123CA8BAA2FBF4
5 changed files with 26 additions and 8 deletions

View File

@ -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>{" "}

View File

@ -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>

View File

@ -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;
`; `;

View File

@ -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]);

View File

@ -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]);