diff --git a/web/src/app/maps/(styles)/page.scss b/web/src/app/maps/(styles)/page.scss new file mode 100644 index 0000000..052bcda --- /dev/null +++ b/web/src/app/maps/(styles)/page.scss @@ -0,0 +1,43 @@ +.maps-container { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); /* Allows 4 cards per row */ + gap: 20px; + width: 100%; + max-width: 1200px; + padding: 20px; + margin: 0 auto; +} + +.map-card { + background: #1e1e1e; + border-radius: 10px; + overflow: hidden; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); + transition: transform 0.2s ease-in-out; + + &:hover { + transform: scale(1.05); + } + + img { + width: 100%; + height: 200px; + object-fit: cover; /* Ensures the image covers the space without being cut off */ + } + + .map-info { + padding: 15px; + text-align: center; + + h2 { + font-size: 1.2rem; + font-weight: bold; + color: #ffffff; + } + + p { + font-size: 1rem; + color: #bbbbbb; + } + } +} diff --git a/web/src/app/maps/page.tsx b/web/src/app/maps/page.tsx index 1e28448..7e62df3 100644 --- a/web/src/app/maps/page.tsx +++ b/web/src/app/maps/page.tsx @@ -1,24 +1,60 @@ -"use client" +"use client"; +import Image from "next/image"; import { useState, useEffect } from "react"; import Webpage from "@/app/_components/webpage"; +import "./(styles)/page.scss"; + +interface Map { + ID: number; + DisplayName: string; + Creator: string; + GameID: number; + Date: number; +} + +// TODO: should rewrite this entire page, just wanted to get a simple page working. This was written by chatgippity + export default function MapsPage() { - const [ingameMaps, setIngameMaps] = useState(); + const [maps, setMaps] = useState([]); - useEffect(() => { - fetch("/api/maps?Page=1&Limit=10") - .then(response => response.json()) - .then(setIngameMaps); - }, []); + useEffect(() => { + const fetchMaps = async () => { + const res = await fetch("/api/maps?Page=1&Limit=100"); + const data: Map[] = await res.json(); + setMaps(data); + }; - useEffect(() => { - console.log(ingameMaps); - }, [ingameMaps]); - - return ( - -

maps

-
- ); + fetchMaps(); + }, []); + + const customLoader = ({ src }: { src: string }) => { + return src; + }; + + return ( + +
+ {maps.map((map) => ( +
+ + {map.DisplayName} +
+

{map.DisplayName}

+

By {map.Creator}

+
+
+
+ ))} +
+
+ ); } \ No newline at end of file diff --git a/web/src/app/thumbnails/asset/[assetId]/route.ts b/web/src/app/thumbnails/asset/[assetId]/route.tsx similarity index 100% rename from web/src/app/thumbnails/asset/[assetId]/route.ts rename to web/src/app/thumbnails/asset/[assetId]/route.tsx diff --git a/web/src/app/thumbnails/maps/[mapId]/route.tsx b/web/src/app/thumbnails/maps/[mapId]/route.tsx new file mode 100644 index 0000000..174feee --- /dev/null +++ b/web/src/app/thumbnails/maps/[mapId]/route.tsx @@ -0,0 +1,13 @@ +import { NextRequest, NextResponse } from "next/server"; + +export async function GET( + request: NextRequest, + context: { params: Promise<{ mapId: string }> } +): Promise { + // TODO: implement this, we need a cdn for in-game map thumbnails... + + const { mapId } = await context.params; + const baseUrl = request.nextUrl.origin; // Gets the current base URL + + return NextResponse.redirect(`${baseUrl}/thumbnails/asset/${mapId}`); +} \ No newline at end of file diff --git a/web/src/app/thumbnails/user/[userId]/route.ts b/web/src/app/thumbnails/user/[userId]/route.tsx similarity index 100% rename from web/src/app/thumbnails/user/[userId]/route.ts rename to web/src/app/thumbnails/user/[userId]/route.tsx