diff --git a/app/(main)/map/map.module.css b/app/(main)/map/map.module.css index 34d213c..29189b7 100644 --- a/app/(main)/map/map.module.css +++ b/app/(main)/map/map.module.css @@ -94,6 +94,30 @@ height: auto; display: block; object-fit: none; /* Don't constrain the SVG */ + position: relative; +} + +/* Force SVG elements to show properly with z-index */ +.svg-container svg * { + transform-box: fill-box; +} + +/* Ensure the clue points overlay is always on top */ +.svg-container svg .clue-points-overlay { + position: relative !important; + z-index: 9999 !important; + pointer-events: all !important; +} + +/* Make clue points very visible with stronger styling */ +.svg-container .clue-point { + fill-opacity: 1 !important; + stroke-opacity: 1 !important; + pointer-events: all !important; + cursor: pointer !important; + stroke-width: 3px !important; + r: 14px !important; + filter: drop-shadow(0px 0px 5px rgba(0, 0, 0, 0.7)) !important; } /* Remove the default map background when we have the processed SVG */ @@ -277,6 +301,26 @@ color: #68543c; } +/* Refresh map button styling */ +.refresh-map-button { + position: fixed; + bottom: 80px; + right: 20px; + background-color: rgba(104, 84, 60, 0.9); + color: white; + border: none; + border-radius: 8px; + padding: 8px 16px; + font-size: 14px; + cursor: pointer; + z-index: 1000; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); +} + +.refresh-map-button:hover { + background-color: rgba(104, 84, 60, 1); +} + /* Make sure the map is responsive */ @media (max-width: 480px) { .team-name { diff --git a/app/(main)/map/page.js b/app/(main)/map/page.js index 924f76e..d9d10cb 100644 --- a/app/(main)/map/page.js +++ b/app/(main)/map/page.js @@ -15,6 +15,7 @@ import { updateCluePointStatus, attachClueClickHandlers, } from "@/utils/map-populate"; +import { addDebugOverlay, fixCluePointsRendering } from "@/utils/map-debug"; export default function MapPage() { const { data: session, status } = useSession(); @@ -565,28 +566,73 @@ export default function MapPage() { } }, [status, fetchClues, loadAndEnhanceMap, router]); - // Modified useEffect to better handle SVG loading and enhancement + // Modified useEffect to ensure SVG elements are visible useEffect(() => { // Only try to enhance the map if both the SVG and clues are loaded if (!mapSvg || !clues.length) return; console.log("Both SVG and clues are loaded, preparing to enhance map"); - // Ensure the SVG is fully loaded in the DOM before enhancing - requestAnimationFrame(() => { - // Longer timeout to ensure the SVG is fully rendered in the DOM - setTimeout(() => { - if ( - mapContainerRef.current && - mapContainerRef.current.querySelector("svg") - ) { - console.log("SVG found in DOM, enhancing map now"); - enhanceSvgMap(); + let enhancementAttempts = 0; + const maxAttempts = 3; + + function attemptMapEnhancement() { + enhancementAttempts++; + console.log( + `Map enhancement attempt ${enhancementAttempts}/${maxAttempts}` + ); + + if ( + mapContainerRef.current && + mapContainerRef.current.querySelector("svg") + ) { + const svgElement = mapContainerRef.current.querySelector("svg"); + console.log("SVG found in DOM, enhancing map now"); + + // Try to enhance the map + enhanceSvgMap(); + + // Additional check after brief delay to ensure visibility + setTimeout(() => { + const cluePoints = svgElement.querySelectorAll(".clue-point"); + console.log( + `Found ${cluePoints.length} clue points after enhancement` + ); + + if (cluePoints.length === 0 && enhancementAttempts < maxAttempts) { + console.log( + `No clue points found, retrying (attempt ${enhancementAttempts}/${maxAttempts})` + ); + attemptMapEnhancement(); + } else if (cluePoints.length === 0) { + console.error( + `Failed to create clue points after ${maxAttempts} attempts` + ); + // Fix rendering issues as a last resort + fixCluePointsRendering(svgElement); + } else { + console.log( + "Map enhancement successful, fixing any rendering issues" + ); + fixCluePointsRendering(svgElement); + } + }, 300); + } else { + console.error("SVG not found in DOM after rendering timeout"); + + if (enhancementAttempts < maxAttempts) { + // Try again after a delay + setTimeout(attemptMapEnhancement, 500); } else { - console.error("SVG not found in DOM after rendering timeout"); setMapError(true); } - }, 500); // Increased timeout for better reliability on slower devices + } + } + + // Ensure the SVG is fully loaded in the DOM before enhancing + requestAnimationFrame(() => { + // Initial delay before first attempt + setTimeout(attemptMapEnhancement, 300); }); }, [mapSvg, clues, enhanceSvgMap]); @@ -669,6 +715,22 @@ export default function MapPage() { + {/* Add a refresh button for users if they have issues with the map */} + {mapSvg && ( + + )} + {/* Navigation bar */}