Major improvements to WooNooW Page Editor system: Schema & Architecture: - Canonical section schema with unified sectionSchema.ts - Normalized feature-grid to use items (not features) - Standardized default values across all section types - Schema versioning with automatic migration on read Backend (PHP): - Enhanced PlaceholderRenderer with typed output contracts - Added fallback behavior for empty/invalid dynamic sources - Added caching support for post data resolution - New SchemaMigration class for backward compatibility - New Features class for feature flags - Enhanced PageSSR with full style support - Removed controller-level special-casing for related_posts Frontend (Admin SPA): - Updated CanvasRenderer with schema-aware transformation - Enhanced InspectorPanel with canonical schema metadata - Added new section renderers Frontend (Customer SPA): - New section components: BentoCategoryGrid, MarqueeBanner, ProductCarousel, ShoppableImage - Updated FeatureGridSection for items prop contract Testing: - Add PHP tests: SchemaMigrationTest, PlaceholderRendererTest, PageSSRTest - Add TypeScript tests: schema-integration, feature-grid-regression - Add parity tests for React vs SSR content matching - Add CI script: check-schema-drift.mjs - Add VERIFICATION_CHECKLIST.md Documentation: - RELEASE_NOTES-v1.0.md with full release notes - docs/PAGE_EDITOR_SECTION_SCHEMA_V1.md - docs/PAGE_EDITOR_SSR_COVERAGE_AUDIT.md
57 lines
1.7 KiB
TypeScript
57 lines
1.7 KiB
TypeScript
import { useState, useEffect } from 'react';
|
|
import { useLocation, Navigate } from 'react-router-dom';
|
|
import { Loader2 } from 'lucide-react';
|
|
import { Shell } from './Shell';
|
|
import { DashboardProvider } from '@/contexts/DashboardContext';
|
|
import { PageHeaderProvider } from '@/contexts/PageHeaderContext';
|
|
import { FABProvider } from '@/contexts/FABContext';
|
|
|
|
export function AuthWrapper() {
|
|
const [isAuthenticated, setIsAuthenticated] = useState(
|
|
window.WNW_CONFIG?.isAuthenticated ?? true
|
|
);
|
|
const [isChecking, setIsChecking] = useState(window.WNW_CONFIG?.standaloneMode ?? false);
|
|
const location = useLocation();
|
|
|
|
useEffect(() => {
|
|
// In standalone mode, trust the initial PHP auth check
|
|
// PHP uses wp_signon which sets proper WordPress cookies
|
|
const checkAuth = () => {
|
|
if (window.WNW_CONFIG?.standaloneMode) {
|
|
setIsAuthenticated(window.WNW_CONFIG.isAuthenticated ?? false);
|
|
setIsChecking(false);
|
|
} else {
|
|
// In wp-admin mode, always authenticated
|
|
setIsChecking(false);
|
|
}
|
|
};
|
|
checkAuth();
|
|
}, []);
|
|
|
|
if (isChecking) {
|
|
return (
|
|
<div className="flex items-center justify-center min-h-screen">
|
|
<Loader2 className="w-12 h-12 animate-spin text-primary" />
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (window.WNW_CONFIG?.standaloneMode && !isAuthenticated && location.pathname !== '/login') {
|
|
return <Navigate to="/login" replace />;
|
|
}
|
|
|
|
if (location.pathname === '/login' && isAuthenticated) {
|
|
return <Navigate to="/" replace />;
|
|
}
|
|
|
|
return (
|
|
<FABProvider>
|
|
<PageHeaderProvider>
|
|
<DashboardProvider>
|
|
<Shell />
|
|
</DashboardProvider>
|
|
</PageHeaderProvider>
|
|
</FABProvider>
|
|
);
|
|
}
|