import React, { useState } from 'react'; import { Outlet } from 'react-router-dom'; import Sidebar from './Sidebar'; import PricingModal from './PricingModal'; import { motion, AnimatePresence } from 'framer-motion'; import { useQuery } from '@tanstack/react-query'; import { useAuth } from '@clerk/clerk-react'; import { getProject } from '../../api/client'; import { useMe } from '../../hooks/useMe'; import { AlertTriangle, ArrowRight, ShieldAlert, PanelLeftClose, PanelLeftOpen } from 'lucide-react'; import { useLocation } from 'react-router-dom'; import { OnboardingWelcomeModal } from './OnboardingWelcomeModal'; const Layout: React.FC = () => { const [showPricing, setShowPricing] = useState(false); const [, setWelcomeComplete] = useState(false); const [isSidebarOpen, setIsSidebarOpen] = useState(true); const { isLoaded, isSignedIn } = useAuth(); const location = useLocation(); const projectId = location.pathname.split('/projects/')[1]?.split('/')[0]; // Shared gated /api/me — no request until Clerk signed in const { data: sub } = useMe(); useQuery({ queryKey: ['project', projectId], queryFn: () => getProject(projectId as string), enabled: Boolean(projectId && isLoaded && isSignedIn), refetchInterval: 10000 }); // Only show limit banner from real API data — never fabricate usage stats const activeSub = sub && typeof sub === 'object' && sub.limits ? sub : null; const iterPercent = activeSub ? (activeSub.wizard_iterations_today / activeSub.limits.max_wizard_iterations) * 100 : 0; const showLimitBanner = !!activeSub && activeSub.tier !== 'business' && iterPercent > 80; const isCriticalLimit = iterPercent > 90; return (
{/* Kolumna 1: Lewy Panel Nawigacyjny */} {/* Kolumna 2: Główna Treść + Outlet */}
{showLimitBanner && (
{isCriticalLimit ? : } {isCriticalLimit ? `KRYTYCZNY LIMIT: Pozostało tylko ${Math.max(0, (activeSub?.limits.max_wizard_iterations ?? 0) - (activeSub?.wizard_iterations_today ?? 0))} iteracji! Wykup wyższy plan by nie stracić dostępu do AI.` : `Uwaga: Wykorzystałeś ${iterPercent.toFixed(0)}% dziennych iteracji Kreatora. Twój plan zaraz zablokuje działanie AI.` }
setShowPricing(true)} > {isCriticalLimit ? 'Upgrade Natychmiastowy' : 'Odblokuj Limity'}
)}
{showPricing && setShowPricing(false)} />} setWelcomeComplete(true)} />
); }; export default Layout;