From a8d91ee19bc7326a43bf8ef3a474bd981edb8614 Mon Sep 17 00:00:00 2001 From: dwindown Date: Thu, 25 Dec 2025 00:53:51 +0700 Subject: [PATCH] Require login for consulting booking and add availability banner on products page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Consulting booking now requires authentication upfront (shows login prompt to non-users) - Added prominent consultation availability banner on products page when enabled - Added debug logging to Layout component for branding troubleshooting - Mobile Layout header shows responsive platform name sizing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- src/components/Layout.tsx | 109 +++++++++++++++++++++++++++++--- src/pages/ConsultingBooking.tsx | 20 ++++++ src/pages/Products.tsx | 24 ++++++- 3 files changed, 142 insertions(+), 11 deletions(-) diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 9c0b3aa..b4be7f2 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,33 +1,52 @@ -import { ReactNode } from 'react'; +import { ReactNode, useState, useEffect } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { useAuth } from '@/hooks/useAuth'; import { useCart } from '@/contexts/CartContext'; +import { useBranding } from '@/hooks/useBranding'; import { Button } from '@/components/ui/button'; -import { ShoppingCart, User, LogOut, Settings } from 'lucide-react'; +import { Sheet, SheetContent, SheetTrigger } from '@/components/ui/sheet'; +import { ShoppingCart, User, LogOut, Settings, Menu, Package } from 'lucide-react'; export function Layout({ children }: { children: ReactNode }) { const { user, isAdmin, signOut } = useAuth(); const { items } = useCart(); + const branding = useBranding(); const navigate = useNavigate(); + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); const handleSignOut = async () => { await signOut(); navigate('/'); + setMobileMenuOpen(false); }; + const brandName = branding.brand_name || 'LearnHub'; + const logoUrl = branding.brand_logo_url; + + // Debug: log branding data + useEffect(() => { + console.log('Layout - branding data:', branding); + console.log('Layout - brandName:', brandName); + }, [branding, brandName]); + return (
-
+
- - LearnHub + + {logoUrl && ( + {brandName} + )} + {brandName} + {brandName} - -
- +
{children}
); diff --git a/src/pages/ConsultingBooking.tsx b/src/pages/ConsultingBooking.tsx index d2f8e12..c893180 100644 --- a/src/pages/ConsultingBooking.tsx +++ b/src/pages/ConsultingBooking.tsx @@ -338,6 +338,26 @@ export default function ConsultingBooking() { ); } + // Require authentication to access consulting booking + if (!user) { + return ( + +
+
+
+
+
+ ); + } + if (!settings?.is_consulting_enabled) { return ( diff --git a/src/pages/Products.tsx b/src/pages/Products.tsx index 98c83cb..8154db2 100644 --- a/src/pages/Products.tsx +++ b/src/pages/Products.tsx @@ -97,7 +97,29 @@ export default function Products() {

Produk

-

Jelajahi konsultasi, webinar, dan bootcamp kami

+

Jelajahi konsultasi, webinar, dan bootcamp kami

+ + {/* Consulting Availability Banner */} + {!loading && consultingSettings?.is_consulting_enabled && ( +
+
+
+
+
+

Konsultasi Tersedia!

+

+ Booking jadwal konsultasi 1-on-1 dengan mentor • {formatIDR(consultingSettings.consulting_block_price)} / {consultingSettings.consulting_block_duration_minutes} menit +

+
+
+ + + +
+ )} {loading ? (