echos-ocr/src/components/layout/app-shell.tsx
Randall Stillwell a975043670 Add onboarding wizard, email verification, integration architecture, and settings restructure
- 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
2026-04-15 01:29:13 -05:00

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>
);
}