import clsx from 'clsx';
import {LandingPageContent} from './landing-page-content';
import {Button, ButtonProps} from '@common/ui/buttons/button';
import {MixedImage} from '@common/ui/images/mixed-image';
import {Footer} from '@common/ui/footer/footer';
import {Trans} from '@common/i18n/trans';
import {Link} from 'react-router-dom';
import {createSvgIconFromTree} from '@common/icons/create-svg-icon';
import {MenuItemConfig} from '@common/core/settings/settings';
import React, {Fragment, useState} from 'react';
import {DefaultMetaTags} from '@common/seo/default-meta-tags';
import {useSettings} from '@common/core/settings/use-settings';
import {PricingTable} from '@common/billing/pricing-table/pricing-table';
import {BillingCycleRadio} from '@common/billing/pricing-table/billing-cycle-radio';
import {UpsellBillingCycle} from '@common/billing/pricing-table/find-best-price';
import {useProducts} from '@common/billing/pricing-table/use-products';
import {LandingPageTrendingTitles} from '@app/landing-page/landing-page-trending-titles';
import {Navbar} from '@common/ui/navigation/navbar/navbar';
interface ContentProps {
content: LandingPageContent;
}
export function LandingPage() {
const settings = useSettings();
const appearance = settings.homepage?.appearance;
const showPricing = settings.homepage?.pricing && settings.billing.enable;
const showTrending = settings.homepage?.trending;
if (!appearance) {
return null;
}
return (
{showTrending && }
{showPricing && }
);
}
function HeroHeader({content}: ContentProps) {
const {
headerTitle,
headerSubtitle,
headerImage,
headerImageOpacity,
actions,
headerOverlayColor1,
headerOverlayColor2,
blurHeaderImage,
} = content;
let overlayBackground = undefined;
if (headerOverlayColor1 && headerOverlayColor2) {
overlayBackground = `linear-gradient(45deg, ${headerOverlayColor1} 0%, ${headerOverlayColor2} 100%)`;
} else if (headerOverlayColor1) {
overlayBackground = headerOverlayColor1;
} else if (headerOverlayColor2) {
overlayBackground = headerOverlayColor2;
}
return (
{overlayBackground && (
)}
{headerTitle && (
)}
{headerSubtitle && (
)}
);
}
interface CtaButtonProps extends ButtonProps {
item?: MenuItemConfig;
}
function CtaButton({item, ...buttonProps}: CtaButtonProps) {
if (!item?.label || !item?.action) return null;
const Icon = item.icon ? createSvgIconFromTree(item.icon) : undefined;
return (
: undefined}
{...buttonProps}
>
);
}
function PrimaryFeatures({content}: ContentProps) {
if (!content.primaryFeatures?.length) {
return null;
}
return (
{content.primaryFeatures.map((feature, index) => (
))}
);
}
function SecondaryFeatures({content}: ContentProps) {
return (
{content.secondaryFeatures.map((feature, index) => {
const isEven = index % 2 === 0;
return (
);
})}
);
}
interface PricingSectionProps {
content: LandingPageContent;
}
function PricingSection({content}: PricingSectionProps) {
const query = useProducts('landingPage');
const [selectedCycle, setSelectedCycle] =
useState('yearly');
return (
{content.pricingTitle && (
)}
{content.pricingSubtitle && (
)}
);
}
function BottomCta({
content: {footerSubtitle, footerImage, footerTitle, actions},
}: ContentProps) {
if (!footerTitle && !footerSubtitle) {
return null;
}
return (
{footerImage && (

)}
{footerTitle && (
)}
{footerSubtitle && (
)}
);
}