import FullPageLoadingState from '@/components/full-page-loading-state'; import { LinkButton } from '@/components/ui/button'; import { useTRPC } from '@/integrations/trpc/react'; import { cn } from '@/utils/cn'; import { FREE_PRODUCT_IDS } from '@openpanel/payments'; import { useSuspenseQuery } from '@tanstack/react-query'; import { Outlet, createFileRoute, notFound, useLocation, } from '@tanstack/react-router'; import { format } from 'date-fns'; const IGNORE_ORGANIZATION_IDS = [ '.well-known', 'robots.txt', 'sitemap.xml', 'favicon.ico', 'manifest.json', 'sw.js', 'service-worker.js', 'onboarding', ]; export const Route = createFileRoute('/_app/$organizationId')({ component: Component, beforeLoad: async ({ context, params }) => { if (IGNORE_ORGANIZATION_IDS.includes(params.organizationId)) { throw notFound(); } }, loader: async ({ context, params }) => { await context.queryClient.prefetchQuery( context.trpc.organization.get.queryOptions({ organizationId: params.organizationId, }), ); }, pendingComponent: FullPageLoadingState, }); function Alert({ title, description, children, className, }: { title: string; description: string; children: React.ReactNode; className?: string; }) { const location = useLocation(); // Hide on billing page if (location.pathname.match(/\/.+\/billing/)) { return null; } return (
{title}
{description}
{children}
); } function Component() { const { organizationId } = Route.useParams(); const trpc = useTRPC(); const { data: organization } = useSuspenseQuery( trpc.organization.get.queryOptions({ organizationId, }), ); return ( <> {organization.subscriptionEndsAt && organization.isTrial && ( Upgrade from $2.5/month )} {organization.subscriptionEndsAt && organization.isExpired && ( Reactivate )} {organization.subscriptionEndsAt && organization.isWillBeCanceled && ( Reactivate )} {organization.subscriptionCanceledAt && organization.isCanceled && ( Reactivate )} {organization.subscriptionProductId && FREE_PRODUCT_IDS.includes(organization.subscriptionProductId) && ( Upgrade )} ); }