* refactor: apply biome formatting to apps/web (batch 1) Formats apps/web non-modules directories: - apps/web/app - apps/web/lib - apps/web/pages - apps/web/styles - apps/web/server - apps/web/test - Root-level .ts and .mjs files Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: apply biome formatting to apps/web/modules (batch 2) Formats smaller apps/web/modules directories: - onboarding, data-table, users, apps, auth - integration-attribute-sync, shell, availability - feature-flags, team, webhooks, getting-started - feature-opt-in, troubleshooter, schedules, notifications - signup-view.tsx Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: apply biome formatting to apps/web/modules (batch 3) Formats medium apps/web/modules directories: - bookings - event-types - insights - embed Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: apply biome formatting to apps/web/modules/ee (batch 4) Formats apps/web/modules/ee directory. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: apply biome formatting to apps/web (batch 5) Formats remaining apps/web directories: - apps/web/modules/settings - apps/web/modules/booking-audit - apps/web/playwright Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: apply biome formatting to apps/web/components (batch 6) Formats remaining apps/web/components files. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: apply biome formatting to new apps/web files from main Formats newly added/modified files from main merge: - WorkflowStepContainer.tsx (resolved merge conflicts) - Newly moved files (blocklist, form-builder, schedules, etc.) - Other files modified in main Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * refactor: apply biome formatting to new apps/web files from main Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
84 lines
2.6 KiB
TypeScript
84 lines
2.6 KiB
TypeScript
"use client";
|
|
|
|
import { useSession } from "next-auth/react";
|
|
import type { AriaRole, ComponentType } from "react";
|
|
import React, { Fragment, useEffect } from "react";
|
|
|
|
import { WEBAPP_URL } from "@calcom/lib/constants";
|
|
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
|
import { Alert } from "@calcom/ui/components/alert";
|
|
import { Button } from "@calcom/ui/components/button";
|
|
import { EmptyScreen } from "@calcom/ui/components/empty-screen";
|
|
|
|
type LicenseRequiredProps = {
|
|
as?: keyof JSX.IntrinsicElements | "";
|
|
className?: string;
|
|
role?: AriaRole | undefined;
|
|
children: React.ReactNode;
|
|
};
|
|
|
|
const LicenseRequired = ({ children, as = "", ...rest }: LicenseRequiredProps) => {
|
|
const session = useSession();
|
|
const { t } = useLocale();
|
|
const Component = as || Fragment;
|
|
const hasValidLicense = session.data ? session.data.hasValidLicense : null;
|
|
|
|
useEffect(() => {
|
|
if (process.env.NODE_ENV === "development" && hasValidLicense === false) {
|
|
// Very few people will see this, so we don't need to translate it
|
|
console.info(
|
|
`You're using a feature that requires a valid license. Please go to ${WEBAPP_URL}/auth/setup to enter a license key.`
|
|
);
|
|
}
|
|
}, []);
|
|
|
|
return (
|
|
<Component {...rest}>
|
|
{hasValidLicense === null || hasValidLicense ? (
|
|
children
|
|
) : process.env.NODE_ENV === "development" ? (
|
|
/** We only show a warning in development mode, but allow the feature to be displayed for development/testing purposes */
|
|
<>
|
|
<Alert
|
|
className="mb-4"
|
|
severity="warning"
|
|
title={
|
|
<>
|
|
{t("enterprise_license_locally")} {t("enterprise_license_sales")}{" "}
|
|
<a className="underline" href="https://go.cal.com/get-license">
|
|
{t("contact_sales")}
|
|
</a>
|
|
</>
|
|
}
|
|
/>
|
|
{children}
|
|
</>
|
|
) : (
|
|
<EmptyScreen
|
|
Icon="triangle-alert"
|
|
headline={t("enterprise_license")}
|
|
buttonRaw={
|
|
<Button color="secondary" href="https://go.cal.com/get-license">
|
|
{t(`contact_sales`)}
|
|
</Button>
|
|
}
|
|
description={t("enterprise_license_sales")}
|
|
/>
|
|
)}
|
|
</Component>
|
|
);
|
|
};
|
|
|
|
export const withLicenseRequired =
|
|
<T extends JSX.IntrinsicAttributes>(Component: ComponentType<T>) =>
|
|
// eslint-disable-next-line react/display-name
|
|
(hocProps: T) => (
|
|
<div>
|
|
<LicenseRequired>
|
|
<Component {...hocProps} />
|
|
</LicenseRequired>
|
|
</div>
|
|
);
|
|
|
|
export default LicenseRequired;
|