mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-10 09:28:36 +00:00
121 lines
4.4 KiB
JavaScript
121 lines
4.4 KiB
JavaScript
import { useEffect, useState } from "react";
|
|
import Head from "next/head";
|
|
import { useTranslation } from "next-i18next";
|
|
|
|
import Plan from "~/components/billing/Plan";
|
|
import NavHeader from "~/components/navigation/NavHeader";
|
|
import { STRIPE_PRODUCT_PRO, STRIPE_PRODUCT_STARTER } from "~/utilities/config";
|
|
import { getTranslatedServerSideProps } from "~/utilities/withTranslateProps";
|
|
|
|
import getOrganizationSubscriptions from "../../api/organization/GetOrgSubscription";
|
|
import getOrganizationUsers from "../../api/organization/GetOrgUsers";
|
|
|
|
export default function SettingsBilling() {
|
|
let [currentPlan, setCurrentPlan] = useState("");
|
|
let [numUsers, setNumUsers] = useState("");
|
|
|
|
const { t } = useTranslation();
|
|
|
|
const plans = [
|
|
{
|
|
key: 1,
|
|
name: t("billing:starter.name"),
|
|
price: t("billing:free"),
|
|
priceExplanation: t("billing:starter.price-explanation"),
|
|
text: t("billing:starter.text"),
|
|
subtext: t("billing:starter.subtext"),
|
|
buttonTextMain: t("billing:downgrade"),
|
|
buttonTextSecondary: t("billing:learn-more"),
|
|
current: currentPlan == STRIPE_PRODUCT_STARTER,
|
|
},
|
|
{
|
|
key: 2,
|
|
name: t("billing:professional.name"),
|
|
price: "$9",
|
|
priceExplanation: t("billing:professional.price-explanation"),
|
|
subtext: t("billing:professional.subtext"),
|
|
text: t("billing:professional.text"),
|
|
buttonTextMain: t("billing:upgrade"),
|
|
buttonTextSecondary: t("billing:learn-more"),
|
|
current: currentPlan == STRIPE_PRODUCT_PRO,
|
|
},
|
|
{
|
|
key: 3,
|
|
name: t("billing:enterprise.name"),
|
|
price: t("billing:custom-pricing"),
|
|
text: t("billing:enterprise.text"),
|
|
buttonTextMain: t("billing:schedule-demo"),
|
|
buttonTextSecondary: t("billing:learn-more"),
|
|
current: false,
|
|
},
|
|
];
|
|
|
|
useEffect(async () => {
|
|
const subscriptions = await getOrganizationSubscriptions({
|
|
orgId: localStorage.getItem("orgData.id"),
|
|
});
|
|
|
|
setCurrentPlan(subscriptions.data[0].plan.id);
|
|
const orgUsers = await getOrganizationUsers({
|
|
orgId: localStorage.getItem("orgData.id"),
|
|
});
|
|
setNumUsers(orgUsers.length);
|
|
}, []);
|
|
|
|
return (
|
|
<div className="bg-bunker-800 max-h-screen flex flex-col justify-between text-white">
|
|
<Head>
|
|
<title>{t("common:head-title", { title: t("billing:title") })}</title>
|
|
<link rel="icon" href="/infisical.ico" />
|
|
</Head>
|
|
<div className="flex flex-row">
|
|
<div className="w-full max-h-screen pb-2 overflow-y-auto">
|
|
<NavHeader pageName={t("billing:title")} />
|
|
<div className="flex flex-row justify-between items-center ml-6 my-8 text-xl max-w-5xl">
|
|
<div className="flex flex-col justify-start items-start text-3xl">
|
|
<p className="font-semibold mr-4 text-gray-200">
|
|
{t("billing:title")}
|
|
</p>
|
|
<p className="font-normal mr-4 text-gray-400 text-base">
|
|
{t("billing:description")}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<div className="flex flex-col ml-6 text-mineshaft-50">
|
|
<p className="text-xl font-semibold">{t("billing:subscription")}</p>
|
|
<div className="flex flex-row mt-4 overflow-x-auto">
|
|
{plans.map((plan) => (
|
|
<Plan key={plan.name} plan={plan} />
|
|
))}
|
|
</div>
|
|
<p className="text-xl font-bold mt-12">
|
|
{t("billing:current-usage")}
|
|
</p>
|
|
<div className="flex flex-row">
|
|
<div className="mr-4 mt-8 text-gray-300 w-60 pt-6 pb-10 rounded-md bg-white/5 flex justify-center items-center flex flex-col">
|
|
<p className="text-6xl font-bold">{numUsers}</p>
|
|
<p className="text-gray-300">
|
|
{numUsers > 1
|
|
? "Organization members"
|
|
: "Organization member"}
|
|
</p>
|
|
</div>
|
|
{/* <div className="mr-4 mt-8 text-gray-300 w-60 pt-6 pb-10 rounded-md bg-white/5 flex justify-center items-center flex flex-col">
|
|
<p className="text-6xl font-bold">1 </p>
|
|
<p className="text-gray-300">Organization projects</p>
|
|
</div> */}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
SettingsBilling.requireAuth = true;
|
|
|
|
export const getServerSideProps = getTranslatedServerSideProps([
|
|
"settings",
|
|
"billing",
|
|
]);
|