Files
wehub-resource-sync 221778fa98
rowboat / apps/x Vitest suites (push) Has been cancelled
rowboat / apps/x Electron package smoke test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:33:34 +08:00

75 lines
2.3 KiB
TypeScript

'use client';
import { ReactNode, useEffect, useState } from 'react';
import Sidebar from './sidebar';
import { usePathname } from 'next/navigation';
import { getCustomer } from '../../../actions/billing.actions';
import { Button } from '@heroui/react';
import { useRouter } from 'next/navigation';
interface AppLayoutProps {
children: ReactNode;
useAuth?: boolean;
useBilling?: boolean;
}
export default function AppLayout({ children, useAuth = false, useBilling = false }: AppLayoutProps) {
const router = useRouter();
const [sidebarCollapsed, setSidebarCollapsed] = useState(true);
const [billingPastDue, setBillingPastDue] = useState(false);
const pathname = usePathname();
let projectId: string | null = null;
if (pathname.startsWith('/projects')) {
projectId = pathname.split('/')[2];
}
useEffect(() => {
async function checkBillingPastDue() {
const billingCustomer = await getCustomer();
if (billingCustomer.subscriptionStatus === "past_due") {
setBillingPastDue(true);
}
}
if (!useBilling) {
return;
}
checkBillingPastDue();
}, [useBilling]);
// Layout with sidebar for all routes
return (
<div className="h-screen flex gap-5 p-5 bg-zinc-50 dark:bg-zinc-900">
{/* Sidebar with improved shadow and blur */}
<div className="h-full overflow-hidden rounded-xl bg-white/70 dark:bg-zinc-800/70 shadow-sm backdrop-blur-sm">
<Sidebar
projectId={projectId ?? undefined}
useAuth={useAuth}
collapsed={sidebarCollapsed}
onToggleCollapse={() => setSidebarCollapsed(!sidebarCollapsed)}
useBilling={useBilling}
/>
</div>
{/* Main content area */}
<main className="flex-1 h-full overflow-auto">
{billingPastDue && <div className="shrink-0 mb-2">
<div className="bg-red-50 text-red-500 px-2 py-1 text-sm rounded-md flex items-center gap-2">
<span>Your subscription is past due. Please update your payment information to avoid losing access to your projects.</span>
<Button
variant="flat"
color="danger"
size="sm"
onPress={() => {
router.push('/billing');
}}>
Resolve
</Button>
</div>
</div>}
{children}
</main>
</div>
);
}