fix: replace all window.location.href with Next.js router for proper navigation

- Replace window.location.href with useRouter().push() across all components
- Prevents page reloads that break fullscreen state and React context
- Enables proper client-side navigation as intended by Next.js
- Fixes fullscreen persistence issue when navigating between pages
- Improves performance by eliminating unnecessary page reloads

Files updated:
- GameCard.tsx: Main game navigation from arena
- AppNavBar.tsx: Exit arcade button navigation
- ResultsPhase.tsx: Back to games button
- Games page: Game launcher navigation
- Arcade page: Exit arcade navigation
- FullscreenGameLayout.tsx: Exit game navigation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Thomas Hallock
2025-09-28 07:24:52 -05:00
parent 7b947f2617
commit 2a84687fec
6 changed files with 36 additions and 42 deletions

View File

@@ -1,11 +1,13 @@
'use client'
import { useEffect, useRef } from 'react'
import { useRouter } from 'next/navigation'
import { css } from '../../../styled-system/css'
import { EnhancedChampionArena } from '../../components/EnhancedChampionArena'
import { FullscreenProvider, useFullscreen } from '../../contexts/FullscreenContext'
function ArcadeContent() {
const router = useRouter()
const { isFullscreen, enterFullscreen, exitFullscreen, setFullscreenElement } = useFullscreen()
const arcadeRef = useRef<HTMLDivElement>(null)
@@ -16,19 +18,13 @@ function ArcadeContent() {
}
}, [setFullscreenElement])
useEffect(() => {
// Check if we should enter fullscreen (from games page navigation)
const shouldEnterFullscreen = sessionStorage.getItem('enterArcadeFullscreen')
if (shouldEnterFullscreen === 'true') {
sessionStorage.removeItem('enterArcadeFullscreen')
enterFullscreen()
}
}, [enterFullscreen])
// Note: Automatic fullscreen entry removed - users must manually enter fullscreen
// Client-side navigation now preserves fullscreen state without needing auto-entry
const handleExitArcade = async () => {
await exitFullscreen()
// Navigate back to games page
window.location.href = '/games'
const handleExitArcade = () => {
console.log('🔄 ArcadePage: Navigating to games with Next.js router (no page reload)')
// Navigate back to games page using client-side routing
router.push('/games')
}
return (

View File

@@ -1,11 +1,13 @@
'use client'
import { useRouter } from 'next/navigation'
import { useMemoryPairs } from '../context/MemoryPairsContext'
import { useGameMode } from '../../../../contexts/GameModeContext'
import { formatGameTime, getMultiplayerWinner, getPerformanceAnalysis } from '../utils/gameScoring'
import { css } from '../../../../../styled-system/css'
export function ResultsPhase() {
const router = useRouter()
const { state, resetGame, activePlayers } = useMemoryPairs()
const { players } = useGameMode()
@@ -314,7 +316,10 @@ export function ResultsPhase() {
boxShadow: '0 8px 25px rgba(167, 139, 250, 0.6)'
}
})}
onClick={() => window.location.href = '/games'}
onClick={() => {
console.log('🔄 ResultsPhase: Navigating to games with Next.js router (no page reload)')
router.push('/games')
}}
>
🏠 Back to Games
</button>

View File

@@ -16,11 +16,12 @@ function GamesPageContent() {
const router = useRouter()
const handleGameClick = (gameType: string) => {
// Navigate directly to games using the centralized game mode
// Navigate directly to games using the centralized game mode with Next.js router
console.log('🔄 GamesPage: Navigating with Next.js router (no page reload)')
if (gameType === 'memory-lightning') {
window.location.href = '/games/memory-quiz'
router.push('/games/memory-quiz')
} else if (gameType === 'battle-arena') {
window.location.href = '/games/matching'
router.push('/games/matching')
}
}

View File

@@ -1,7 +1,7 @@
'use client'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { usePathname, useRouter } from 'next/navigation'
import { css } from '../../styled-system/css'
import { container, hstack } from '../../styled-system/patterns'
import { AbacusDisplayDropdown } from './AbacusDisplayDropdown'
@@ -13,6 +13,7 @@ interface AppNavBarProps {
export function AppNavBar({ variant = 'full' }: AppNavBarProps) {
const pathname = usePathname()
const router = useRouter()
const isGamePage = pathname?.startsWith('/games')
const isArcadePage = pathname?.startsWith('/arcade')
const { isFullscreen, toggleFullscreen, exitFullscreen } = useFullscreen()
@@ -160,9 +161,9 @@ export function AppNavBar({ variant = 'full' }: AppNavBarProps) {
{isArcadePage && (
<button
onClick={async () => {
await exitFullscreen()
window.location.href = '/games'
onClick={() => {
console.log('🔄 AppNavBar: Navigating to games with Next.js router (no page reload)')
router.push('/games')
}}
title="Exit Arcade"
className={css({

View File

@@ -1,6 +1,7 @@
'use client'
import { useEffect, ReactNode } from 'react'
import { useRouter } from 'next/navigation'
import { css } from '../../styled-system/css'
import { FullscreenProvider, useFullscreen } from '../contexts/FullscreenContext'
@@ -10,22 +11,16 @@ interface FullscreenGameLayoutProps {
}
function FullscreenGameContent({ children, title }: FullscreenGameLayoutProps) {
const router = useRouter()
const { isFullscreen, enterFullscreen, exitFullscreen } = useFullscreen()
useEffect(() => {
// Check if we should be in fullscreen mode
const urlParams = new URLSearchParams(window.location.search)
const shouldBeFullscreen = urlParams.get('fullscreen') === 'true'
// Note: Automatic fullscreen entry removed - users must manually enter fullscreen
// Client-side navigation now preserves fullscreen state without needing auto-entry
if (shouldBeFullscreen && !isFullscreen) {
enterFullscreen()
}
}, [enterFullscreen, isFullscreen])
const handleExitGame = async () => {
await exitFullscreen()
// Navigate back to arcade if we came from there
window.location.href = '/arcade'
const handleExitGame = () => {
console.log('🔄 FullscreenGameLayout: Navigating to arcade with Next.js router (no page reload)')
// Navigate back to arcade using client-side routing
router.push('/arcade')
}
return (

View File

@@ -1,5 +1,6 @@
'use client'
import { useRouter } from 'next/navigation'
import { css } from '../../styled-system/css'
import { useGameMode } from '../contexts/GameModeContext'
import { GAMES_CONFIG, GameType } from './GameSelector'
@@ -18,6 +19,7 @@ export function GameCard({
className
}: GameCardProps) {
const { activePlayerCount } = useGameMode()
const router = useRouter()
// Check if a game is available based on active player count
const isGameAvailable = () => {
@@ -26,15 +28,9 @@ export function GameCard({
const handleGameClick = () => {
if (isGameAvailable() && config.available !== false) {
// Check if we're in fullscreen arcade mode
const isInArcade = window.location.pathname.includes('/arcade')
if (isInArcade) {
// Stay in fullscreen when navigating from arcade
window.location.href = config.url + '?fullscreen=true'
} else {
window.location.href = config.url
}
console.log('🔄 GameCard: Navigating with Next.js router (no page reload)')
// Use Next.js router for client-side navigation - this preserves fullscreen!
router.push(config.url)
}
}