From 988f5b64d66b72463a1149c2933a4898e356ffda Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Tue, 8 Sep 2026 01:26:41 -0600 Subject: [PATCH] feat(trial-banner): add trial banner component to display trial status in sidebar --- .../dashboard/billing/trial-banner.tsx | 34 +++++++++++++++++++ apps/dokploy/components/layouts/side.tsx | 2 ++ 2 files changed, 36 insertions(+) create mode 100644 apps/dokploy/components/dashboard/billing/trial-banner.tsx diff --git a/apps/dokploy/components/dashboard/billing/trial-banner.tsx b/apps/dokploy/components/dashboard/billing/trial-banner.tsx new file mode 100644 index 000000000..0c5bfdffb --- /dev/null +++ b/apps/dokploy/components/dashboard/billing/trial-banner.tsx @@ -0,0 +1,34 @@ +import { Rocket } from "lucide-react"; +import { useRouter } from "next/router"; +import { Button } from "@/components/ui/button"; +import { api } from "@/utils/api"; + +export const TrialBanner = () => { + const router = useRouter(); + const { data: billingStatus } = api.stripe.getBillingStatus.useQuery(); + + if (!billingStatus?.isOnTrial) { + return null; + } + + const daysRemaining = billingStatus.trialDaysRemaining ?? 0; + + return ( +
+ + + {daysRemaining > 0 + ? `You have ${daysRemaining} day${daysRemaining === 1 ? "" : "s"} left in your free trial.` + : "Your free trial ends today."} + + +
+ ); +}; diff --git a/apps/dokploy/components/layouts/side.tsx b/apps/dokploy/components/layouts/side.tsx index 97e0706ba..1e20a0fbe 100644 --- a/apps/dokploy/components/layouts/side.tsx +++ b/apps/dokploy/components/layouts/side.tsx @@ -101,6 +101,7 @@ import { authClient } from "@/lib/auth-client"; import { cn } from "@/lib/utils"; import type { AppRouter } from "@/server/api/root"; import { api } from "@/utils/api"; +import { TrialBanner } from "../dashboard/billing/trial-banner"; import { AddOrganization } from "../dashboard/organization/handle-organization"; import { DialogAction } from "../shared/dialog-action"; import { Logo } from "../shared/logo"; @@ -1229,6 +1230,7 @@ export default function Page({ children }: Props) { + {isCloud === true && } {!includesProjects && (