import React, { ReactNode, useState, useEffect } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { LayoutDashboard, ShoppingBag, Download, MapPin, Heart, User, LogOut, Key, Repeat } from 'lucide-react'; import { useModules } from '@/hooks/useModules'; import { api } from '@/lib/api/client'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@/components/ui/alert-dialog'; interface AccountLayoutProps { children: ReactNode; } export function AccountLayout({ children }: AccountLayoutProps) { const location = useLocation(); const user = (window as any).woonoowCustomer?.user; const { isEnabled } = useModules(); const wishlistEnabled = (window as any).woonoowCustomer?.settings?.wishlist_enabled !== false; const [isLoggingOut, setIsLoggingOut] = useState(false); const [avatarUrl, setAvatarUrl] = useState(null); // Fetch avatar settings useEffect(() => { const fetchAvatar = async () => { try { const data = await api.get<{ current_avatar: string | null; gravatar_url: string }>('/account/avatar-settings'); setAvatarUrl(data.current_avatar || data.gravatar_url); } catch (error) { console.error('Failed to fetch avatar:', error); } }; fetchAvatar(); // Listen for avatar updates const handleAvatarUpdate = (e: CustomEvent) => { setAvatarUrl(e.detail?.avatar_url || null); }; window.addEventListener('woonoow:avatar-updated' as any, handleAvatarUpdate); return () => window.removeEventListener('woonoow:avatar-updated' as any, handleAvatarUpdate); }, []); const allMenuItems = [ { id: 'dashboard', label: 'Dashboard', path: '/my-account', icon: LayoutDashboard }, { id: 'orders', label: 'Orders', path: '/my-account/orders', icon: ShoppingBag }, { id: 'subscriptions', label: 'Subscriptions', path: '/my-account/subscriptions', icon: Repeat }, { id: 'licenses', label: 'Licenses', path: '/my-account/licenses', icon: Key }, { id: 'downloads', label: 'Downloads', path: '/my-account/downloads', icon: Download }, { id: 'addresses', label: 'Addresses', path: '/my-account/addresses', icon: MapPin }, { id: 'account-details', label: 'Account Details', path: '/my-account/account-details', icon: User }, { id: 'wishlist', label: 'Wishlist', path: '/my-account/wishlist', icon: Heart }, ]; // Filter out wishlist if module disabled or settings disabled, licenses if licensing disabled const menuItems = allMenuItems.filter(item => { if (item.id === 'wishlist') return isEnabled('wishlist') && wishlistEnabled; if (item.id === 'licenses') return isEnabled('licensing'); if (item.id === 'subscriptions') return isEnabled('subscription'); return true; }); const handleLogout = async () => { setIsLoggingOut(true); try { const apiRoot = (window as any).woonoowCustomer?.apiRoot || '/wp-json/woonoow/v1'; const nonce = (window as any).woonoowCustomer?.nonce || ''; await fetch(`${apiRoot}/auth/logout`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': nonce, }, credentials: 'include', }); // Full page reload to clear cookies and refresh state const basePath = (window as any).woonoowCustomer?.basePath || '/store'; window.location.href = window.location.origin + basePath + '/'; } catch (error) { // Even on error, try to redirect and let server handle session const basePath = (window as any).woonoowCustomer?.basePath || '/store'; window.location.href = window.location.origin + basePath + '/'; } }; const isActive = (path: string) => { if (path === '/my-account') { return location.pathname === '/my-account'; } return location.pathname.startsWith(path); }; // Logout Button with AlertDialog const LogoutButton = () => ( Log out? Are you sure you want to log out of your account? You'll need to sign in again to access your orders and account details. Cancel Log Out ); // Sidebar Navigation const SidebarNav = () => ( ); // Tab Navigation (Mobile) const TabNav = () => (
); // Responsive layout: Tabs on mobile, Sidebar on desktop return (
{/* Mobile: Tab Navigation */} {/* Desktop: Sidebar + Content */}
{children}
); }