- Auto-sign-in after registration instead of redirect to login - Email verification system with token generation, send/confirm API routes, and persistent banner - 7-step onboarding wizard (org, location, services, upload source, AI, integrations, complete) - Middleware redirects owners with incomplete onboarding to /onboarding - Integration provider plugin architecture with registry and 6 providers (Planning Center, Monday.com, Airtable, Google Sheets, Webhook, CSV Export) - Full integration CRUD API with test, sync, fields, and OAuth authorize/callback routes - Refactored fireIntegrationEvent to use Integration model with legacy AppSettings fallback - Migration script for existing Monday.com/webhook config to Integration rows - Settings page restructured from monolithic 1290-line file into focused sub-routes with section navigation - Integration hub UI with provider tiles, connect flow, and individual config pages - Post-onboarding contextual guidance cards on dashboard with dismissible hints - Schema: Integration model, onboardingComplete/onboardingStep on Organization, dismissedHints on OrgMember Made-with: Cursor
37 lines
1 KiB
TypeScript
37 lines
1 KiB
TypeScript
"use client";
|
|
|
|
import { cn } from "@/lib/utils";
|
|
import { TopBar } from "@/components/layout/top-bar";
|
|
import { Sidebar, SidebarProvider, useSidebar } from "@/components/layout/sidebar";
|
|
import { EmailVerificationBanner } from "@/components/layout/email-verification-banner";
|
|
|
|
function ShellContent({ children }: { children: React.ReactNode }) {
|
|
const { collapsed } = useSidebar();
|
|
|
|
return (
|
|
<div className="relative min-h-screen">
|
|
<div className="gradient-mesh pointer-events-none fixed inset-0 z-0" />
|
|
<TopBar />
|
|
<Sidebar />
|
|
<main
|
|
className={cn(
|
|
"relative z-0 pt-16 transition-[margin-left] duration-200 ease-in-out",
|
|
collapsed ? "ml-16" : "ml-60"
|
|
)}
|
|
>
|
|
<div className="p-4 sm:p-6 lg:p-8">
|
|
<EmailVerificationBanner />
|
|
{children}
|
|
</div>
|
|
</main>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export function AppShell({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<SidebarProvider>
|
|
<ShellContent>{children}</ShellContent>
|
|
</SidebarProvider>
|
|
);
|
|
}
|