import { useEffect, useRef, useState } from "react"; import { observer } from "mobx-react"; // plane imports import { DEFAULT_PRODUCT_BILLING_FREQUENCY, EProductSubscriptionEnum, SUBSCRIPTION_WITH_BILLING_FREQUENCY, } from "@plane/constants"; import { TBillingFrequency, TProductBillingFrequency } from "@plane/types"; import { cn } from "@plane/utils"; // components import { getSubscriptionTextColor } from "@/components/workspace/billing/subscription"; // local imports import { PlansComparison } from "./comparison/root"; export const BillingRoot = observer(() => { const [isScrolled, setIsScrolled] = useState(false); const containerRef = useRef(null); const [isCompareAllFeaturesSectionOpen, setIsCompareAllFeaturesSectionOpen] = useState(false); const [productBillingFrequency, setProductBillingFrequency] = useState( DEFAULT_PRODUCT_BILLING_FREQUENCY ); /** * Retrieves the billing frequency for a given subscription type * @param {EProductSubscriptionEnum} subscriptionType - Type of subscription to get frequency for * @returns {TBillingFrequency | undefined} - Billing frequency if subscription supports it, undefined otherwise */ const getBillingFrequency = (subscriptionType: EProductSubscriptionEnum): TBillingFrequency | undefined => SUBSCRIPTION_WITH_BILLING_FREQUENCY.includes(subscriptionType) ? productBillingFrequency[subscriptionType] : undefined; /** * Updates the billing frequency for a specific subscription type * @param {EProductSubscriptionEnum} subscriptionType - Type of subscription to update * @param {TBillingFrequency} frequency - New billing frequency to set * @returns {void} */ const setBillingFrequency = (subscriptionType: EProductSubscriptionEnum, frequency: TBillingFrequency): void => setProductBillingFrequency({ ...productBillingFrequency, [subscriptionType]: frequency }); useEffect(() => { const container = containerRef.current; if (!container) return; const handleScroll = () => { const scrollTop = container.scrollTop; const isScrolled = isCompareAllFeaturesSectionOpen ? scrollTop > 0 : false; setIsScrolled(isScrolled); }; container.addEventListener("scroll", handleScroll); return () => container.removeEventListener("scroll", handleScroll); }, [isCompareAllFeaturesSectionOpen]); return (

Billing and plans

Community

Unlimited projects, issues, cycles, modules, pages, and storage
All plans
); });