mirror of
https://github.com/OneUptime/oneuptime.git
synced 2026-04-06 00:32:12 +02:00
190 lines
7.0 KiB
TypeScript
190 lines
7.0 KiB
TypeScript
import Modal, { ModalWidth } from "../Modal/Modal";
|
|
import Icon, { IconType, SizeProp } from "../Icon/Icon";
|
|
import IconProp from "../../../Types/Icon/IconProp";
|
|
import React, {
|
|
FunctionComponent,
|
|
ReactElement,
|
|
useMemo,
|
|
useState,
|
|
} from "react";
|
|
import { BILLING_ENABLED, IS_ENTERPRISE_EDITION } from "../../Config";
|
|
|
|
export interface ComponentProps {
|
|
className?: string | undefined;
|
|
}
|
|
|
|
const ENTERPRISE_URL: string = "https://oneuptime.com/enterprise/demo";
|
|
|
|
const EditionLabel: FunctionComponent<ComponentProps> = (
|
|
props: ComponentProps,
|
|
): ReactElement => {
|
|
const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);
|
|
|
|
if (BILLING_ENABLED) {
|
|
return <></>;
|
|
}
|
|
|
|
const editionName: string = IS_ENTERPRISE_EDITION
|
|
? "Enterprise Edition"
|
|
: "Community Edition";
|
|
|
|
const indicatorColor: string = IS_ENTERPRISE_EDITION
|
|
? "bg-emerald-500"
|
|
: "bg-indigo-400";
|
|
|
|
const ctaLabel: string = IS_ENTERPRISE_EDITION ? "View benefits" : "Learn more";
|
|
|
|
const communityFeatures: Array<string> = useMemo(() => {
|
|
return [
|
|
"Full OneUptime platform with incident response, status pages, and workflow automation.",
|
|
"Community support, documentation, and tutorials to help teams get started quickly.",
|
|
"Regular updates, bug fixes, and open-source extensibility.",
|
|
"Integrations with popular DevOps tools through community-maintained connectors.",
|
|
];
|
|
}, []);
|
|
|
|
const enterpriseFeatures: Array<string> = useMemo(() => {
|
|
return [
|
|
"Enterprise (hardened and secure) Docker images.",
|
|
"Dedicated enterprise support phone number available 24/7/365.",
|
|
"Priority chat and email support.",
|
|
"Dedicated engineer who can build custom features to integrate OneUptime with your ecosystem.",
|
|
"Compliance reports (ISO, SOC, GDPR, HIPAA).",
|
|
"Legal indemnification.",
|
|
"Audit logs.",
|
|
];
|
|
}, []);
|
|
|
|
const openDialog: () => void = () => {
|
|
setIsDialogOpen(true);
|
|
};
|
|
|
|
const closeDialog: () => void = () => {
|
|
setIsDialogOpen(false);
|
|
};
|
|
|
|
const handlePrimaryAction: () => void = () => {
|
|
if (typeof window !== "undefined") {
|
|
window.open(ENTERPRISE_URL, "_blank", "noopener,noreferrer");
|
|
}
|
|
|
|
closeDialog();
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<button
|
|
type="button"
|
|
onClick={openDialog}
|
|
className={`group inline-flex items-center gap-2 rounded-full border border-indigo-100 bg-white px-3 py-1 text-xs font-medium text-indigo-700 shadow-sm transition hover:border-indigo-300 hover:bg-indigo-50 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400 ${
|
|
props.className ? props.className : ""
|
|
}`}
|
|
aria-label={`${editionName} details`}
|
|
>
|
|
<span
|
|
className={`h-2 w-2 rounded-full transition group-hover:scale-110 ${indicatorColor}`}
|
|
></span>
|
|
<span className="tracking-wide">{editionName}</span>
|
|
<span className="text-[11px] text-indigo-500 group-hover:text-indigo-600">
|
|
{ctaLabel}
|
|
</span>
|
|
</button>
|
|
|
|
{isDialogOpen && (
|
|
<Modal
|
|
title={editionName}
|
|
submitButtonText={IS_ENTERPRISE_EDITION ? "Learn More" : "Talk to Sales"}
|
|
closeButtonText="Close"
|
|
onClose={closeDialog}
|
|
onSubmit={handlePrimaryAction}
|
|
modalWidth={ModalWidth.Large}
|
|
>
|
|
<div className="space-y-3 text-sm text-gray-600">
|
|
{IS_ENTERPRISE_EDITION ? (
|
|
<>
|
|
<p>
|
|
You are running the Enterprise Edition of OneUptime. This
|
|
includes premium capabilities such as enterprise-grade
|
|
support, governance controls, and unlimited project scale.
|
|
</p>
|
|
<p>
|
|
Reach out to our team if you need help enabling additional
|
|
enterprise features or onboarding new teams.
|
|
</p>
|
|
</>
|
|
) : (
|
|
<>
|
|
<p>
|
|
You are running the Community Edition of OneUptime. Here is a
|
|
quick comparison to help you decide if Enterprise is the right
|
|
fit for your team.
|
|
</p>
|
|
<div className="grid gap-4 md:grid-cols-2">
|
|
<div className="rounded-lg border border-gray-200 bg-white p-4 shadow-sm">
|
|
<h3 className="text-sm font-semibold text-gray-900">
|
|
Community Edition
|
|
</h3>
|
|
<ul className="mt-3 space-y-2 text-sm text-gray-600">
|
|
{communityFeatures.map(
|
|
(feature: string, index: number) => {
|
|
return (
|
|
<li key={index} className="flex items-start gap-2">
|
|
<Icon
|
|
icon={IconProp.Check}
|
|
size={SizeProp.Small}
|
|
className="mt-0.5 text-gray-400"
|
|
/>
|
|
<span className="leading-snug">{feature}</span>
|
|
</li>
|
|
);
|
|
},
|
|
)}
|
|
</ul>
|
|
<p className="mt-3 text-xs text-gray-500">
|
|
Best for small teams experimenting with reliability
|
|
workflows.
|
|
</p>
|
|
</div>
|
|
<div className="rounded-lg border border-indigo-200 bg-indigo-50 p-4 shadow-sm">
|
|
<h3 className="text-sm font-semibold text-indigo-900">
|
|
Enterprise Edition
|
|
</h3>
|
|
<ul className="mt-3 space-y-2 text-sm text-indigo-900">
|
|
{enterpriseFeatures.map(
|
|
(feature: string, index: number) => {
|
|
return (
|
|
<li key={index} className="flex items-start gap-2">
|
|
<Icon
|
|
icon={IconProp.Check}
|
|
type={IconType.Success}
|
|
size={SizeProp.Small}
|
|
className="mt-0.5"
|
|
/>
|
|
<span className="leading-snug">{feature}</span>
|
|
</li>
|
|
);
|
|
},
|
|
)}
|
|
</ul>
|
|
<p className="mt-3 text-xs text-indigo-700">
|
|
Everything in Community plus white-glove onboarding,
|
|
enterprise SLAs, and a partner dedicated to your
|
|
reliability goals.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
<p className="text-xs text-gray-500">
|
|
Ready to unlock enterprise capabilities? Click “Talk to Sales”
|
|
to start the conversation.
|
|
</p>
|
|
</>
|
|
)}
|
|
</div>
|
|
</Modal>
|
|
)}
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default EditionLabel;
|