[autofix.ci] apply automated fixes

This commit is contained in:
autofix-ci[bot]
2026-01-12 02:22:33 +00:00
committed by GitHub
parent f303962319
commit 2acaaede37

View File

@@ -128,235 +128,235 @@ export const ShowBilling = () => {
</nav> </nav>
<div className="flex flex-col gap-4 w-full mt-6"> <div className="flex flex-col gap-4 w-full mt-6">
<Tabs <Tabs
defaultValue="monthly" defaultValue="monthly"
value={isAnnual ? "annual" : "monthly"} value={isAnnual ? "annual" : "monthly"}
className="w-full" className="w-full"
onValueChange={(e) => setIsAnnual(e === "annual")} onValueChange={(e) => setIsAnnual(e === "annual")}
> >
<TabsList> <TabsList>
<TabsTrigger value="monthly">Monthly</TabsTrigger> <TabsTrigger value="monthly">Monthly</TabsTrigger>
<TabsTrigger value="annual">Annual</TabsTrigger> <TabsTrigger value="annual">Annual</TabsTrigger>
</TabsList> </TabsList>
</Tabs> </Tabs>
{admin?.user.stripeSubscriptionId && ( {admin?.user.stripeSubscriptionId && (
<div className="space-y-2 flex flex-col"> <div className="space-y-2 flex flex-col">
<h3 className="text-lg font-medium">Servers Plan</h3> <h3 className="text-lg font-medium">Servers Plan</h3>
<p className="text-sm text-muted-foreground"> <p className="text-sm text-muted-foreground">
You have {servers} server on your plan of{" "} You have {servers} server on your plan of{" "}
{admin?.user.serversQuantity} servers {admin?.user.serversQuantity} servers
</p> </p>
<div> <div>
<Progress value={safePercentage} className="max-w-lg" /> <Progress value={safePercentage} className="max-w-lg" />
</div> </div>
{admin && admin.user.serversQuantity! <= (servers ?? 0) && ( {admin && admin.user.serversQuantity! <= (servers ?? 0) && (
<div className="flex flex-row gap-4 p-2 bg-yellow-50 dark:bg-yellow-950 rounded-lg items-center"> <div className="flex flex-row gap-4 p-2 bg-yellow-50 dark:bg-yellow-950 rounded-lg items-center">
<AlertTriangle className="text-yellow-600 dark:text-yellow-400" /> <AlertTriangle className="text-yellow-600 dark:text-yellow-400" />
<span className="text-sm text-yellow-600 dark:text-yellow-400"> <span className="text-sm text-yellow-600 dark:text-yellow-400">
You have reached the maximum number of servers you can You have reached the maximum number of servers you can
create, please upgrade your plan to add more servers. create, please upgrade your plan to add more servers.
</span> </span>
</div>
)}
</div> </div>
)} )}
<div className="flex flex-col gap-1.5 mt-4"> </div>
<span className="text-base text-primary"> )}
Need Help? We are here to help you. <div className="flex flex-col gap-1.5 mt-4">
</span> <span className="text-base text-primary">
<span className="text-sm text-muted-foreground"> Need Help? We are here to help you.
Join to our Discord server and we will help you. </span>
</span> <span className="text-sm text-muted-foreground">
<Button className="rounded-full bg-[#5965F2] hover:bg-[#4A55E0] w-fit"> Join to our Discord server and we will help you.
<Link </span>
href="https://discord.gg/2tBnJ3jDJc" <Button className="rounded-full bg-[#5965F2] hover:bg-[#4A55E0] w-fit">
aria-label="Dokploy on GitHub" <Link
target="_blank" href="https://discord.gg/2tBnJ3jDJc"
className="flex flex-row items-center gap-2 text-white" aria-label="Dokploy on GitHub"
> target="_blank"
<svg className="flex flex-row items-center gap-2 text-white"
role="img" >
className="h-6 w-6 fill-white" <svg
viewBox="0 0 24 24" role="img"
xmlns="http://www.w3.org/2000/svg" className="h-6 w-6 fill-white"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z" />
</svg>
Join Discord
</Link>
</Button>
</div>
{isLoading ? (
<span className="text-base text-muted-foreground flex flex-row gap-3 items-center justify-center min-h-[10vh]">
Loading...
<Loader2 className="animate-spin" />
</span>
) : (
<>
{products?.map((product) => {
const featured = true;
return (
<div key={product.id}>
<section
className={clsx(
"flex flex-col rounded-3xl border-dashed border-2 px-4 max-w-sm",
featured
? "order-first border py-8 lg:order-none"
: "lg:py-8",
)}
> >
<path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z" /> {isAnnual && (
</svg> <div className="mb-4 flex flex-row items-center gap-2">
Join Discord <Badge>Recommended 🚀</Badge>
</Link> </div>
</Button> )}
</div> {isAnnual ? (
{isLoading ? ( <div className="flex flex-row gap-2 items-center">
<span className="text-base text-muted-foreground flex flex-row gap-3 items-center justify-center min-h-[10vh]"> <p className="text-2xl font-semibold tracking-tight text-primary ">
Loading... ${" "}
<Loader2 className="animate-spin" /> {calculatePrice(
</span> serverQuantity,
) : ( isAnnual,
<> ).toFixed(2)}{" "}
{products?.map((product) => { USD
const featured = true; </p>
return ( |
<div key={product.id}> <p className="text-base font-semibold tracking-tight text-muted-foreground">
<section ${" "}
className={clsx( {(
"flex flex-col rounded-3xl border-dashed border-2 px-4 max-w-sm", calculatePrice(serverQuantity, isAnnual) / 12
featured ).toFixed(2)}{" "}
? "order-first border py-8 lg:order-none" / Month USD
: "lg:py-8", </p>
</div>
) : (
<p className="text-2xl font-semibold tracking-tight text-primary ">
${" "}
{calculatePrice(serverQuantity, isAnnual).toFixed(
2,
)}{" "}
USD
</p>
)}
<h3 className="mt-5 font-medium text-lg text-primary">
{product.name}
</h3>
<p
className={clsx(
"text-sm",
featured ? "text-white" : "text-slate-400",
)}
>
{product.description}
</p>
<ul
className={clsx(
" mt-4 flex flex-col gap-y-2 text-sm",
featured ? "text-white" : "text-slate-200",
)}
>
{[
"All the features of Dokploy",
"Unlimited deployments",
"Self-hosted on your own infrastructure",
"Full access to all deployment features",
"Dokploy integration",
"Backups",
"All Incoming features",
].map((feature) => (
<li
key={feature}
className="flex text-muted-foreground"
>
<CheckIcon />
<span className="ml-4">{feature}</span>
</li>
))}
</ul>
<div className="flex flex-col gap-2 mt-4">
<div className="flex items-center gap-2 justify-center">
<span className="text-sm text-muted-foreground">
{serverQuantity} Servers
</span>
</div>
<div className="flex items-center space-x-2">
<Button
disabled={serverQuantity <= 1}
variant="outline"
onClick={() => {
if (serverQuantity <= 1) return;
setServerQuantity(serverQuantity - 1);
}}
>
<MinusIcon className="h-4 w-4" />
</Button>
<NumberInput
value={serverQuantity}
onChange={(e) => {
setServerQuantity(
e.target.value as unknown as number,
);
}}
/>
<Button
variant="outline"
onClick={() => {
setServerQuantity(serverQuantity + 1);
}}
>
<PlusIcon className="h-4 w-4" />
</Button>
</div>
<div
className={cn(
data?.subscriptions &&
data?.subscriptions?.length > 0
? "justify-between"
: "justify-end",
"flex flex-row items-center gap-2 mt-4",
)} )}
> >
{isAnnual && ( {admin?.user.stripeCustomerId && (
<div className="mb-4 flex flex-row items-center gap-2"> <Button
<Badge>Recommended 🚀</Badge> variant="secondary"
</div> className="w-full"
)} onClick={async () => {
{isAnnual ? ( const session =
<div className="flex flex-row gap-2 items-center"> await createCustomerPortalSession();
<p className="text-2xl font-semibold tracking-tight text-primary ">
${" "}
{calculatePrice(
serverQuantity,
isAnnual,
).toFixed(2)}{" "}
USD
</p>
|
<p className="text-base font-semibold tracking-tight text-muted-foreground">
${" "}
{(
calculatePrice(serverQuantity, isAnnual) / 12
).toFixed(2)}{" "}
/ Month USD
</p>
</div>
) : (
<p className="text-2xl font-semibold tracking-tight text-primary ">
${" "}
{calculatePrice(serverQuantity, isAnnual).toFixed(
2,
)}{" "}
USD
</p>
)}
<h3 className="mt-5 font-medium text-lg text-primary">
{product.name}
</h3>
<p
className={clsx(
"text-sm",
featured ? "text-white" : "text-slate-400",
)}
>
{product.description}
</p>
<ul window.open(session.url);
className={clsx( }}
" mt-4 flex flex-col gap-y-2 text-sm",
featured ? "text-white" : "text-slate-200",
)}
>
{[
"All the features of Dokploy",
"Unlimited deployments",
"Self-hosted on your own infrastructure",
"Full access to all deployment features",
"Dokploy integration",
"Backups",
"All Incoming features",
].map((feature) => (
<li
key={feature}
className="flex text-muted-foreground"
>
<CheckIcon />
<span className="ml-4">{feature}</span>
</li>
))}
</ul>
<div className="flex flex-col gap-2 mt-4">
<div className="flex items-center gap-2 justify-center">
<span className="text-sm text-muted-foreground">
{serverQuantity} Servers
</span>
</div>
<div className="flex items-center space-x-2">
<Button
disabled={serverQuantity <= 1}
variant="outline"
onClick={() => {
if (serverQuantity <= 1) return;
setServerQuantity(serverQuantity - 1);
}}
>
<MinusIcon className="h-4 w-4" />
</Button>
<NumberInput
value={serverQuantity}
onChange={(e) => {
setServerQuantity(
e.target.value as unknown as number,
);
}}
/>
<Button
variant="outline"
onClick={() => {
setServerQuantity(serverQuantity + 1);
}}
>
<PlusIcon className="h-4 w-4" />
</Button>
</div>
<div
className={cn(
data?.subscriptions &&
data?.subscriptions?.length > 0
? "justify-between"
: "justify-end",
"flex flex-row items-center gap-2 mt-4",
)}
> >
{admin?.user.stripeCustomerId && ( Manage Subscription
<Button </Button>
variant="secondary" )}
className="w-full"
onClick={async () => {
const session =
await createCustomerPortalSession();
window.open(session.url); {data?.subscriptions?.length === 0 && (
}} <div className="justify-end w-full">
> <Button
Manage Subscription className="w-full"
</Button> onClick={async () => {
)} handleCheckout(product.id);
}}
{data?.subscriptions?.length === 0 && ( disabled={serverQuantity < 1}
<div className="justify-end w-full"> >
<Button Subscribe
className="w-full" </Button>
onClick={async () => {
handleCheckout(product.id);
}}
disabled={serverQuantity < 1}
>
Subscribe
</Button>
</div>
)}
</div> </div>
</div> )}
</section> </div>
</div> </div>
); </section>
})} </div>
</> );
)} })}
</div> </>
)}
</div>
</CardContent> </CardContent>
</div> </div>
</Card> </Card>