postiz/apps/frontend/src/components/new-layout/layout.component.tsx

132 lines
5.7 KiB
TypeScript

'use client';
import { ReactNode, useCallback } from 'react';
import { Logo } from '@gitroom/frontend/components/new-layout/logo';
import { MenuItem } from '@gitroom/frontend/components/new-layout/menu-item';
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 { useT } from '@gitroom/react/translation/get.transation.service.client';
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 { Onboarding } from '@gitroom/frontend/components/onboarding/onboarding';
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 { 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 { BillingAfter } from '@gitroom/frontend/components/new-layout/billing.after';
const jakartaSans = Plus_Jakarta_Sans({
weight: ['600', '500'],
style: ['normal', 'italic'],
subsets: ['latin'],
});
export const LayoutComponent = ({ children }: { children: ReactNode }) => {
const fetch = useFetch();
const { backendUrl, billingEnabled, isGeneral } = useVariables();
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 (
<ContextWrapper user={user}>
<CopilotKit
credentials="include"
runtimeUrl={backendUrl + '/copilot/chat'}
>
<MantineWrapper>
{user.tier === 'FREE' && searchParams.get('check') && (
<CheckPayment check={searchParams.get('check')!} mutate={mutate} />
)}
<ToolTip />
<ShowMediaBoxModal />
<ShowLinkedinCompany />
<MediaSettingsLayout />
<Toaster />
<ShowPostSelector />
<NewSubscription />
{user.tier !== 'FREE' && <Onboarding />}
<Support />
<ContinueProvider />
<div
className={clsx(
'flex flex-col min-h-screen min-w-screen text-newTextColor p-[12px]',
jakartaSans.className
)}
>
<div>{user?.admin ? <Impersonate /> : <div />}</div>
{user.tier === 'FREE' && isGeneral && billingEnabled ? (
<BillingAfter />
) : (
<div className="flex-1 flex gap-[8px]">
<div className="flex flex-col bg-newBgColorInner w-[80px] rounded-[12px]">
<div className={clsx("fixed h-full w-[64px] start-[17px] flex flex-1 top-0", user?.admin && 'pt-[60px]')}>
<div className="flex flex-col h-full gap-[32px] flex-1 py-[12px]">
<Logo />
<TopMenu />
</div>
</div>
</div>
<div className="flex-1 bg-newBgLineColor rounded-[12px] overflow-hidden flex flex-col gap-[1px]">
<div className="flex bg-newBgColorInner h-[80px] px-[20px] items-center">
<div className="text-[24px] font-[600] flex flex-1">
<Title />
</div>
<div className="flex gap-[20px] text-textItemBlur">
<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" />
<NotificationComponent />
</div>
</div>
<div className="flex flex-1 gap-[1px]">{children}</div>
</div>
</div>
)}
</div>
</MantineWrapper>
</CopilotKit>
</ContextWrapper>
);
};