'use client'; import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import useSWR from 'swr'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { useVariables } from '@gitroom/react/helpers/variable.context'; import { loadStripe, Stripe } from '@stripe/stripe-js'; import { OrganizationSelector } from '@gitroom/frontend/components/layout/organization.selector'; import { LanguageComponent } from '@gitroom/frontend/components/layout/language.component'; import { AttachToFeedbackIcon } from '@gitroom/frontend/components/new-layout/sentry.feedback.component'; import NotificationComponent from '@gitroom/frontend/components/notifications/notification.component'; import dynamic from 'next/dynamic'; import { LogoTextComponent } from '@gitroom/frontend/components/ui/logo-text.component'; import { pricing } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/pricing'; import { capitalize } from 'lodash'; import clsx from 'clsx'; import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; import { CheckIconComponent } from '@gitroom/frontend/components/ui/check.icon.component'; import { FAQComponent, FAQSection, } from '@gitroom/frontend/components/billing/faq.component'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { useDubClickId } from '@gitroom/frontend/components/layout/dubAnalytics'; import SafeImage from '@gitroom/react/helpers/safe.image'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; import useCookie from 'react-use-cookie'; import { LogoutComponent } from '@gitroom/frontend/components/layout/logout.component'; import { DeveloperIconComponent } from '@gitroom/frontend/components/developer/developer.icon.component'; const ModeComponent = dynamic( () => import('@gitroom/frontend/components/layout/mode.component'), { ssr: false, } ); const EmbeddedBilling = dynamic( () => import('@gitroom/frontend/components/billing/embedded.billing').then( (mod) => mod.EmbeddedBilling ), { ssr: false, } ); export const FirstBillingComponent = () => { const { stripeClient } = useVariables(); const user = useUser(); const dub = useDubClickId(); const [stripe, setStripe] = useState>(null); const [tier, setTier] = useState('STANDARD'); const [period, setPeriod] = useState('MONTHLY'); const fetch = useFetch(); const modals = useModals(); const t = useT(); const [datafast_visitor_id] = useCookie('datafast_visitor_id', ''); const [datafast_session_id] = useCookie('datafast_session_id', ''); useEffect(() => { setStripe(loadStripe(stripeClient)); }, []); const loadCheckout = useCallback(async () => { return ( await fetch('/billing/embedded', { method: 'POST', body: JSON.stringify({ billing: tier, period: period, ...(datafast_visitor_id && datafast_session_id ? { datafast_visitor_id, datafast_session_id } : {}), ...(dub ? { dub } : {}), }), }) ).json(); }, [tier, period]); const showYouTube = () => { modals.openModal({ title: 'Grow Fast With Postiz (Play the video)', children: (