'use client'; import React, { ReactNode, useCallback } from 'react'; import { Logo } from '@gitroom/frontend/components/new-layout/logo'; import { Plus_Jakarta_Sans } from 'next/font/google'; const ModeComponent = dynamic( () => import('@gitroom/frontend/components/layout/mode.component'), { ssr: false, } ); import clsx from 'clsx'; import dynamic from 'next/dynamic'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { useVariables } from '@gitroom/react/helpers/variable.context'; import { useSearchParams } from 'next/navigation'; import useSWR from 'swr'; import { CheckPayment } from '@gitroom/frontend/components/layout/check.payment'; import { ToolTip } from '@gitroom/frontend/components/layout/top.tip'; import { ShowMediaBoxModal } from '@gitroom/frontend/components/media/media.component'; import { ShowLinkedinCompany } from '@gitroom/frontend/components/launches/helpers/linkedin.component'; import { MediaSettingsLayout } from '@gitroom/frontend/components/launches/helpers/media.settings.component'; import { Toaster } from '@gitroom/react/toaster/toaster'; import { ShowPostSelector } from '@gitroom/frontend/components/post-url-selector/post.url.selector'; import { NewSubscription } from '@gitroom/frontend/components/layout/new.subscription'; import { Support } from '@gitroom/frontend/components/layout/support'; import { ContinueProvider } from '@gitroom/frontend/components/layout/continue.provider'; import { ContextWrapper } from '@gitroom/frontend/components/layout/user.context'; import { CopilotKit } from '@copilotkit/react-core'; import { MantineWrapper } from '@gitroom/react/helpers/mantine.wrapper'; import { Impersonate } from '@gitroom/frontend/components/layout/impersonate'; import { AnnouncementBanner } from '@gitroom/frontend/components/layout/announcement.banner'; import { Title } from '@gitroom/frontend/components/layout/title'; import { TopMenu } from '@gitroom/frontend/components/layout/top.menu'; import { LanguageComponent } from '@gitroom/frontend/components/layout/language.component'; import { ChromeExtensionComponent } from '@gitroom/frontend/components/layout/chrome.extension.component'; import NotificationComponent from '@gitroom/frontend/components/notifications/notification.component'; import { OrganizationSelector } from '@gitroom/frontend/components/layout/organization.selector'; import { StreakComponent } from '@gitroom/frontend/components/layout/streak.component'; import { PreConditionComponent } from '@gitroom/frontend/components/layout/pre-condition.component'; import { AttachToFeedbackIcon } from '@gitroom/frontend/components/new-layout/sentry.feedback.component'; import { FirstBillingComponent } from '@gitroom/frontend/components/billing/first.billing.component'; import { TrialTracker } from '@gitroom/frontend/components/layout/gtm.component'; const jakartaSans = Plus_Jakarta_Sans({ weight: ['600', '500', '700'], style: ['normal', 'italic'], subsets: ['latin'], }); export const LayoutComponent = ({ children }: { children: ReactNode }) => { const fetch = useFetch(); const { backendUrl, billingEnabled, isGeneral } = useVariables(); // Feedback icon component attaches Sentry feedback to a top-bar icon when DSN is present const searchParams = useSearchParams(); const load = useCallback(async (path: string) => { return await (await fetch(path)).json(); }, []); const { data: user, mutate } = useSWR('/user/self', load, { revalidateOnFocus: false, revalidateOnReconnect: false, revalidateIfStale: false, refreshWhenOffline: false, refreshWhenHidden: false, }); if (!user) return null; return (
{user?.admin ? :
}
{user.tier === 'FREE' && isGeneral && billingEnabled ? ( ) : ( <>
</div> <div className="flex gap-[20px] text-textItemBlur"> <StreakComponent /> <div className="w-[1px] h-[20px] bg-blockSeparator" /> <OrganizationSelector /> <div className="hover:text-newTextColor"> <ModeComponent /> </div> <div className="w-[1px] h-[20px] bg-blockSeparator" /> <LanguageComponent /> <ChromeExtensionComponent /> <div className="w-[1px] h-[20px] bg-blockSeparator" /> <AttachToFeedbackIcon /> <NotificationComponent /> </div> </div> <div className="flex flex-1 gap-[1px]">{children}</div> </div> </div> </> )} </div> </CheckPayment> </MantineWrapper> </CopilotKit> </ContextWrapper> ); };