Merge branch 'main' of github.com:atimapreandrew/infisical

This commit is contained in:
Andrew Atimapre
2023-07-04 17:49:08 +01:00
7 changed files with 89 additions and 20 deletions

View File

@@ -1,21 +1,44 @@
{ {
"parser": "@typescript-eslint/parser", "parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint", "unused-imports"], "plugins": [
"@typescript-eslint",
"unused-imports"
],
"extends": [ "extends": [
"eslint:recommended", "eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended" "plugin:@typescript-eslint/recommended"
], ],
"rules": { "rules": {
"@typescript-eslint/no-empty-function": "off",
"no-console": 2, "no-console": 2,
"quotes": ["error", "double", { "avoidEscape": true }], "quotes": [
"comma-dangle": ["error", "only-multiline"], "error",
"double",
{
"avoidEscape": true
}
],
"comma-dangle": [
"error",
"only-multiline"
],
"@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-unused-vars": "off",
"unused-imports/no-unused-imports": "error", "unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [ "unused-imports/no-unused-vars": [
"warn", "warn",
{ "vars": "all", "varsIgnorePattern": "^_", "args": "after-used", "argsIgnorePattern": "^_" } {
"vars": "all",
"varsIgnorePattern": "^_",
"args": "after-used",
"argsIgnorePattern": "^_"
}
], ],
"sort-imports": ["error", { "ignoreDeclarationSort": true }] "sort-imports": [
"error",
{
"ignoreDeclarationSort": true
}
]
} }
} }

View File

@@ -30,6 +30,8 @@ interface FeatureSet {
customRateLimits: boolean; customRateLimits: boolean;
customAlerts: boolean; customAlerts: boolean;
auditLogs: boolean; auditLogs: boolean;
status: 'incomplete' | 'incomplete_expired' | 'trialing' | 'active' | 'past_due' | 'canceled' | 'unpaid' | null;
trial_end: number | null;
} }
/** /**
@@ -60,6 +62,8 @@ class EELicenseService {
customRateLimits: true, customRateLimits: true,
customAlerts: true, customAlerts: true,
auditLogs: false, auditLogs: false,
status: null,
trial_end: null
} }
public localFeatureSet: NodeCache; public localFeatureSet: NodeCache;

View File

@@ -45,6 +45,7 @@ export const createOrganization = async ({
name, name,
customerId customerId
}).save(); }).save();
} else { } else {
organization = await new Organization({ organization = await new Organization({
name, name,

View File

@@ -70,6 +70,7 @@ module.exports = {
], ],
"@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-non-null-assertion": "off",
"simple-import-sort/exports": "warn", "simple-import-sort/exports": "warn",
"@typescript-eslint/no-empty-function": "off",
"simple-import-sort/imports": [ "simple-import-sort/imports": [
"warn", "warn",
{ {

View File

@@ -13,4 +13,6 @@ export type SubscriptionPlan = {
workspaceLimit: number; workspaceLimit: number;
workspacesUsed: number; workspacesUsed: number;
environmentLimit: number; environmentLimit: number;
status: "incomplete" | "incomplete_expired" | "trialing" | "active" | "past_due" | "canceled" | "unpaid" | null;
trial_end: number | null;
}; };

View File

@@ -64,7 +64,7 @@ export interface IUser {
export const Navbar = () => { export const Navbar = () => {
const router = useRouter(); const router = useRouter();
const { subscription } = useSubscription(); const { subscription } = useSubscription();
const { currentOrg, orgs } = useOrganization(); const { currentOrg, orgs } = useOrganization();
const { user } = useUser(); const { user } = useUser();
@@ -95,17 +95,47 @@ export const Navbar = () => {
} }
}; };
function formatPlanSlug(slug: string) {
return slug
.replace(/(\b[a-z])/g, match => match.toUpperCase())
.replace(/-/g, " ");
}
const calculateRemainingDays = (date: number) => {
const now = new Date();
const endDate = new Date(date * 1000);
const differenceInTime = endDate.getTime() - now.getTime();
const differenceInDays = Math.ceil(differenceInTime / (1000 * 3600 * 24));
return differenceInDays;
}
const formatDate = (date: number) => {
const endDate = new Date(date * 1000);
const day: number = endDate.getDate();
const month: number = endDate.getMonth() + 1;
const year: number = endDate.getFullYear();
const formattedDate: string = `${day}/${month}/${year}`;
const remainingDays: number = calculateRemainingDays(date);
return {
formattedDate,
remainingDays
};
}
return ( return (
<div className="z-[70] flex w-full flex-row justify-between border-b border-mineshaft-500 bg-mineshaft-900 text-white"> <div className="z-[70] border-b border-mineshaft-500 bg-mineshaft-900 text-white">
<div className="m-auto mx-4 flex items-center justify-start"> <div className="flex w-full justify-between px-4">
<div className="flex flex-row items-center"> <div className="flex flex-row items-center">
<div className="flex justify-center py-4"> <div className="flex justify-center py-4">
<Image src="/images/logotransparent.png" height={23} width={57} alt="logo" /> <Image src="/images/logotransparent.png" height={23} width={57} alt="logo" />
</div>
<a href="#" className="mx-2 text-2xl font-semibold text-white">
Infisical
</a>
</div> </div>
<a href="#" className="mx-2 text-2xl font-semibold text-white">
Infisical
</a>
</div> </div>
<div className="relative z-40 mx-2 flex items-center justify-start"> <div className="relative z-40 mx-2 flex items-center justify-start">
<a <a
@@ -190,7 +220,7 @@ export const Navbar = () => {
{" "} {" "}
{user?.firstName} {user?.lastName} {user?.firstName} {user?.lastName}
</p> </p>
<p className="px-2 pb-1 text-xs text-gray-400"> {user?.email}</p> <p className="px-2 pb-1 text-xs text-gray-400">{user?.email}</p>
</div> </div>
<FontAwesomeIcon <FontAwesomeIcon
icon={faGear} icon={faGear}
@@ -314,6 +344,14 @@ export const Navbar = () => {
</Transition> </Transition>
</Menu> </Menu>
</div> </div>
</div>
{subscription && subscription.status === "trialing" && subscription.trial_end && (
<div className="w-full mx-auto border-t border-mineshaft-500">
<p className="text-center py-4 text-sm">
{`You are currently trialing the ${formatPlanSlug(subscription.slug)} plan until ${formatDate(subscription.trial_end).formattedDate} when you'll be downgraded to the Starter plan - You still have ${formatDate(subscription.trial_end).remainingDays} day(s) left.`}
</p>
</div>
)}
</div> </div>
); );
}; };

View File

@@ -62,8 +62,8 @@ export const PreviewSection = () => {
<div className="flex mb-6 max-w-screen-lg"> <div className="flex mb-6 max-w-screen-lg">
<div className="p-4 bg-mineshaft-900 rounded-lg flex-1 mr-4 border border-mineshaft-600"> <div className="p-4 bg-mineshaft-900 rounded-lg flex-1 mr-4 border border-mineshaft-600">
<p className="mb-2 text-gray-400">Current plan</p> <p className="mb-2 text-gray-400">Current plan</p>
<p className="text-2xl mb-8 text-mineshaft-50 font-semibold"> <p className="text-2xl text-mineshaft-50 font-semibold mb-8">
{formatPlanSlug(subscription.slug)} {`${formatPlanSlug(subscription.slug)} ${subscription.status === "trialing" ? "(Trial)" : ""}`}
</p> </p>
<button <button
type="button" type="button"
@@ -80,7 +80,7 @@ export const PreviewSection = () => {
<div className="p-4 bg-mineshaft-900 rounded-lg flex-1 border border-mineshaft-600 mr-4"> <div className="p-4 bg-mineshaft-900 rounded-lg flex-1 border border-mineshaft-600 mr-4">
<p className="mb-2 text-gray-400">Price</p> <p className="mb-2 text-gray-400">Price</p>
<p className="text-2xl mb-8 text-mineshaft-50 font-semibold"> <p className="text-2xl mb-8 text-mineshaft-50 font-semibold">
{`${formatAmount(data.amount)} / ${data.interval}`} {subscription.status === "trialing" ? "$0.00 / month" : `${formatAmount(data.amount)} / ${data.interval}`}
</p> </p>
</div> </div>
<div className="p-4 bg-mineshaft-900 rounded-lg flex-1 border border-mineshaft-600"> <div className="p-4 bg-mineshaft-900 rounded-lg flex-1 border border-mineshaft-600">