@@ -7,10 +7,12 @@ import { Footer } from '@/components/layout/Footer';
77import { NexusPrime } from '@/components/layout/NexusPrime' ;
88import { EscrowProvider } from '@/contexts/EscrowContext' ;
99import { WalletProvider } from '@/contexts/WalletContext' ;
10+ import { AuthProvider } from '@/contexts/AuthContext' ;
1011import { Providers } from '@/components/Providers' ;
1112import { TransactionProvider } from '@/contexts/TransactionContext' ;
1213import { ToastProvider } from '@/contexts/ToastContext' ;
1314import { useGlobalWallet } from '@/contexts/WalletContext' ;
15+ import { useAuth } from '@/contexts/AuthContext' ;
1416import { HelloMilestoneDemo } from '@/components/demos/HelloMilestoneDemo' ;
1517import { MilestoneVotingDemo } from '@/components/demos/MilestoneVotingDemo' ;
1618import { DisputeResolutionDemo } from '@/components/demos/DisputeResolutionDemo' ;
@@ -19,6 +21,9 @@ import { OnboardingOverlay } from '@/components/OnboardingOverlay';
1921import { ImmersiveDemoModal } from '@/components/ui/ImmersiveDemoModal' ;
2022import { TechTreeModal } from '@/components/ui/TechTreeModal' ;
2123import { ToastContainer } from '@/components/ui/Toast' ;
24+ import { AuthBanner } from '@/components/ui/AuthBanner' ;
25+ import { AuthModal } from '@/components/ui/AuthModal' ;
26+ import { UserProfile } from '@/components/ui/UserProfile' ;
2227import Image from 'next/image' ;
2328import { nexusCodex } from '@/lib/newsData' ;
2429
@@ -36,10 +41,12 @@ const DemoSelector = ({
3641 activeDemo,
3742 setActiveDemo,
3843 setShowImmersiveDemo,
44+ isConnected,
3945} : {
4046 activeDemo : string ;
4147 setActiveDemo : ( demo : string ) => void ;
4248 setShowImmersiveDemo : ( show : boolean ) => void ;
49+ isConnected : boolean ;
4350} ) => {
4451 // Clap system with localStorage persistence
4552 const [ demoClaps , setDemoClaps ] = useState < Record < string , number > > ( ( ) => {
@@ -335,20 +342,33 @@ const DemoSelector = ({
335342 < button
336343 onClick = { e => {
337344 e . stopPropagation ( ) ;
338- setShowImmersiveDemo ( true ) ;
345+ if ( isConnected ) {
346+ setShowImmersiveDemo ( true ) ;
347+ }
339348 } }
340- className = 'relative px-8 py-4 font-bold rounded-xl transition-all duration-500 transform hover:scale-110 hover:rotate-1 shadow-2xl hover:shadow-brand-500/50 border-2 bg-gradient-to-r from-brand-500 via-accent-500 to-brand-400 hover:from-brand-600 hover:via-accent-600 hover:to-brand-500 text-white border-white/30 hover:border-white/60 text-lg'
349+ disabled = { ! isConnected }
350+ className = { `relative px-8 py-4 font-bold rounded-xl transition-all duration-500 transform shadow-2xl border-2 text-lg ${
351+ isConnected
352+ ? 'hover:scale-110 hover:rotate-1 hover:shadow-brand-500/50 bg-gradient-to-r from-brand-500 via-accent-500 to-brand-400 hover:from-brand-600 hover:via-accent-600 hover:to-brand-500 text-white border-white/30 hover:border-white/60'
353+ : 'bg-gradient-to-r from-gray-600 via-gray-700 to-gray-600 text-gray-400 border-gray-600 cursor-not-allowed blur-sm opacity-60'
354+ } `}
341355 >
342356 { /* Button Content */ }
343357 < div className = 'flex items-center' >
344358 < div className = 'flex flex-col' >
345- < span className = 'text-lg font-bold' > LAUNCH DEMO</ span >
346- < span className = 'text-xs opacity-80' > Prepare for AWESOMENESS!</ span >
359+ < span className = 'text-lg font-bold' >
360+ { isConnected ? 'LAUNCH DEMO' : 'CONNECT WALLET' }
361+ </ span >
362+ < span className = 'text-xs opacity-80' >
363+ { isConnected ? 'Prepare for AWESOMENESS!' : 'Required to launch demo' }
364+ </ span >
347365 </ div >
348366 </ div >
349367
350- { /* Hover Effects */ }
351- < div className = 'absolute inset-0 bg-gradient-to-r from-white/0 via-white/10 to-white/0 rounded-xl opacity-0 group-hover:opacity-100 transition-opacity duration-300' > </ div >
368+ { /* Hover Effects - Only show when connected */ }
369+ { isConnected && (
370+ < div className = 'absolute inset-0 bg-gradient-to-r from-white/0 via-white/10 to-white/0 rounded-xl opacity-0 group-hover:opacity-100 transition-opacity duration-300' > </ div >
371+ ) }
352372 </ button >
353373
354374 { /* Rotating Nexus Logo */ }
@@ -383,6 +403,7 @@ const DemoSelector = ({
383403
384404function DemosPageContent ( ) {
385405 const { isConnected } = useGlobalWallet ( ) ;
406+ const { isAuthenticated, user } = useAuth ( ) ;
386407 const [ activeDemo , setActiveDemo ] = useState ( 'hello-milestone' ) ;
387408 const [ walletSidebarOpen , setWalletSidebarOpen ] = useState ( false ) ;
388409 const [ walletExpanded , setWalletExpanded ] = useState ( false ) ;
@@ -399,6 +420,11 @@ function DemosPageContent() {
399420 const [ loadingProgress , setLoadingProgress ] = useState ( 0 ) ;
400421 const [ showImmersiveDemo , setShowImmersiveDemo ] = useState ( false ) ;
401422 const [ showTechTree , setShowTechTree ] = useState ( false ) ;
423+
424+ // Authentication modals
425+ const [ showAuthModal , setShowAuthModal ] = useState ( false ) ;
426+ const [ authModalMode , setAuthModalMode ] = useState < 'signup' | 'signin' > ( 'signup' ) ;
427+ const [ showUserProfile , setShowUserProfile ] = useState ( false ) ;
402428
403429 // Preloader effect - only on first load
404430 useEffect ( ( ) => {
@@ -444,18 +470,45 @@ function DemosPageContent() {
444470 }
445471 } ;
446472
473+ const handleOpenUserProfile = ( ) => {
474+ setShowUserProfile ( true ) ;
475+ } ;
476+
447477 window . addEventListener ( 'walletSidebarToggle' , handleWalletSidebarToggle as EventListener ) ;
478+ window . addEventListener ( 'openUserProfile' , handleOpenUserProfile ) ;
448479 return ( ) => {
449480 window . removeEventListener ( 'walletSidebarToggle' , handleWalletSidebarToggle as EventListener ) ;
481+ window . removeEventListener ( 'openUserProfile' , handleOpenUserProfile ) ;
450482 } ;
451483 } , [ ] ) ;
452484
485+ // Authentication handlers
486+ const handleSignUpClick = ( ) => {
487+ setAuthModalMode ( 'signup' ) ;
488+ setShowAuthModal ( true ) ;
489+ } ;
490+
491+ const handleSignInClick = ( ) => {
492+ setAuthModalMode ( 'signin' ) ;
493+ setShowAuthModal ( true ) ;
494+ } ;
495+
496+ const handleUserProfileClick = ( ) => {
497+ setShowUserProfile ( true ) ;
498+ } ;
499+
453500 return (
454501 < EscrowProvider >
455502 < div className = 'min-h-screen bg-gradient-to-br from-neutral-900 via-brand-900 to-neutral-900 relative overflow-hidden' >
456503 { /* Header */ }
457504 < Header />
458505
506+ { /* Authentication Banner */ }
507+ < AuthBanner
508+ onSignUpClick = { handleSignUpClick }
509+ onSignInClick = { handleSignInClick }
510+ />
511+
459512 { /* Animated background elements */ }
460513 < div className = 'absolute inset-0 opacity-20 bg-gradient-to-r from-brand-500/10 via-transparent to-accent-500/10' > </ div >
461514
@@ -630,7 +683,7 @@ function DemosPageContent() {
630683 < br />
631684
632685 < p className = 'text-xl text-white/80 max-w-3xl mx-auto mb-6' >
633- Master the art of trustless work with our hilarious demo suite on Stellar
686+ Master the art of trustless work with our demo suite on Stellar
634687 blockchain
635688 </ p >
636689
@@ -654,12 +707,46 @@ function DemosPageContent() {
654707 </ button >
655708
656709 < button
657- onClick = { ( ) => setShowTechTree ( true ) }
658- className = 'px-8 py-4 bg-gradient-to-r from-brand-500/20 to-accent-500/20 hover:from-brand-800/50 hover:to-accent-800/50 text-white font-bold rounded-xl transition-all duration-300 transform hover:scale-105 shadow-lg hover:shadow-xl border-2 border-white/20 hover:border-white/40 flex items-center space-x-3'
710+ onClick = { ( ) => isConnected && setShowTechTree ( true ) }
711+ disabled = { ! isConnected }
712+ className = { `px-8 py-4 font-bold rounded-xl transition-all duration-300 flex items-center space-x-3 ${
713+ isConnected
714+ ? 'bg-gradient-to-r from-brand-500/20 to-accent-500/20 hover:from-brand-800/50 hover:to-accent-800/50 text-white transform hover:scale-105 shadow-lg hover:shadow-xl border-2 border-white/20 hover:border-white/40'
715+ : 'bg-gradient-to-r from-gray-600/20 to-gray-700/20 text-gray-400 border-gray-600/30 cursor-not-allowed blur-[0.5px] opacity-70'
716+ } `}
717+ title = { ! isConnected ? 'Connect wallet to explore the tech tree' : '' }
659718 >
660- < span > Tech Tree Explorer</ span >
661- < span className = 'text-xl' > 🌳</ span >
719+ < span > Trustless Work Tech Tree</ span >
720+ < span className = 'text-xl' >
721+ < Image src = '/images/icons/demos.png' alt = 'Trustless Work Tech Tree' width = { 50 } height = { 20 } />
722+ </ span >
723+ { ! isConnected && (
724+ < span className = 'absolute -top-1 -right-1 text-xs bg-gray-600 text-gray-300 px-1 rounded-full' >
725+ 🔒
726+ </ span >
727+ ) }
662728 </ button >
729+
730+ < a
731+ href = { isConnected ? '/mini-games' : '#' }
732+ onClick = { ( e ) => ! isConnected && e . preventDefault ( ) }
733+ className = { `px-8 py-4 font-bold rounded-xl transition-all duration-300 flex items-center space-x-3 relative ${
734+ isConnected
735+ ? 'bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white transform hover:scale-105 shadow-lg hover:shadow-xl border-2 border-white/20 hover:border-white/40'
736+ : 'bg-gradient-to-r from-gray-600/20 to-gray-700/20 text-gray-400 border-gray-600/30 cursor-not-allowed blur-[0.5px] opacity-70'
737+ } `}
738+ title = { ! isConnected ? 'Connect wallet to access the Web3 playground' : '' }
739+ >
740+ < span > Nexus Web3 Playground</ span >
741+ < span className = 'text-xl' >
742+ < Image src = '/images/icons/console.png' alt = 'Nexus Web3 Playground' width = { 50 } height = { 20 } />
743+ </ span >
744+ { ! isConnected && (
745+ < span className = 'absolute -top-1 -right-1 text-xs bg-gray-600 text-gray-300 px-1 rounded-full' >
746+ 🔒
747+ </ span >
748+ ) }
749+ </ a >
663750 </ div >
664751 </ div >
665752
@@ -940,6 +1027,7 @@ function DemosPageContent() {
9401027 activeDemo = { activeDemo }
9411028 setActiveDemo = { setActiveDemo }
9421029 setShowImmersiveDemo = { setShowImmersiveDemo }
1030+ isConnected = { isConnected }
9431031 />
9441032 </ div >
9451033 </ section >
@@ -1169,19 +1257,34 @@ function DemosPageContent() {
11691257
11701258 { /* Tech Tree Modal */ }
11711259 < TechTreeModal isOpen = { showTechTree } onClose = { ( ) => setShowTechTree ( false ) } />
1260+
1261+ { /* Authentication Modal */ }
1262+ < AuthModal
1263+ isOpen = { showAuthModal }
1264+ onClose = { ( ) => setShowAuthModal ( false ) }
1265+ mode = { authModalMode }
1266+ />
1267+
1268+ { /* User Profile Modal */ }
1269+ < UserProfile
1270+ isOpen = { showUserProfile }
1271+ onClose = { ( ) => setShowUserProfile ( false ) }
1272+ />
11721273 </ EscrowProvider >
11731274 ) ;
11741275}
11751276
11761277export default function DemosPage ( ) {
11771278 return (
11781279 < WalletProvider >
1179- < ToastProvider >
1180- < TransactionProvider >
1181- < DemosPageContent />
1182- < ToastContainer />
1183- </ TransactionProvider >
1184- </ ToastProvider >
1280+ < AuthProvider >
1281+ < ToastProvider >
1282+ < TransactionProvider >
1283+ < DemosPageContent />
1284+ < ToastContainer />
1285+ </ TransactionProvider >
1286+ </ ToastProvider >
1287+ </ AuthProvider >
11851288 </ WalletProvider >
11861289 ) ;
11871290}
0 commit comments