|
1 | 1 | import fs from 'fs';
|
2 | 2 | import path from 'path';
|
3 |
| -import SunParams from '@/app/ui/sunparameters'; |
4 |
| -import FogParams from '@/app/ui/fogparameters'; |
5 |
| -import MapList from '@/app/ui/maplist'; |
6 |
| -import DownloadButton from '@/app/ui/downloadbutton'; |
7 |
| -import TechnicalDetails from '@/app/ui/technical-details'; |
| 3 | +import SkyboxClient from './skybox-client'; |
8 | 4 |
|
| 5 | +// This function runs at build time to generate all possible paths |
9 | 6 | export async function generateStaticParams() {
|
10 | 7 | const allPath = path.join(process.cwd(), 'public', 'data', 'index.json');
|
11 | 8 | const allData = JSON.parse(fs.readFileSync(allPath, 'utf8'));
|
12 |
| - return Object.keys(allData).map((slug) => ({ slug })); |
| 9 | + return Object.keys(allData).map((slug) => ({ |
| 10 | + slug: slug.toString() |
| 11 | + })); |
13 | 12 | }
|
14 | 13 |
|
15 |
| -export default function SkyboxPage({ |
| 14 | +async function getSkyboxData(slug: string) { |
| 15 | + const dataPath = path.join(process.cwd(), 'public', 'data', `${slug}.json`); |
| 16 | + const fileContents = await fs.promises.readFile(dataPath, 'utf8'); |
| 17 | + return JSON.parse(fileContents); |
| 18 | +} |
| 19 | + |
| 20 | +export default async function Page({ |
16 | 21 | params,
|
17 |
| - searchParams, |
18 | 22 | }: {
|
19 | 23 | params: { slug: string };
|
20 |
| - searchParams?: Record<string, string | string[] | undefined>; |
21 | 24 | }) {
|
22 |
| - const dataPath = path.join(process.cwd(), 'public', 'data', `${params.slug}.json`); |
23 |
| - const skyboxData = JSON.parse(fs.readFileSync(dataPath, 'utf8')); |
| 25 | + const { slug } = params; |
| 26 | + const skyboxData = await getSkyboxData(slug); |
24 | 27 |
|
25 |
| - |
26 |
| - const imgBase = `/Source_Skyboxes_NextJS/skyboxes/${params.slug}/images`; |
27 |
| - |
28 |
| - return ( |
29 |
| - <article className="max-w-4xl mx-auto"> |
30 |
| - <div className="bg-neutral-900 rounded-lg shadow-xl ring-1 ring-neutral-700/60 overflow-hidden"> |
31 |
| - {/* Header */} |
32 |
| - <div className="p-4"> |
33 |
| - <div className="flex flex-wrap sm:flex-nowrap items-start sm:items-center justify-between gap-4"> |
34 |
| - <div className="flex flex-col"> |
35 |
| - <h1 className="text-2xl font-bold leading-tight">{params.slug}</h1> |
36 |
| - {skyboxData.author && ( |
37 |
| - <span className="text-sm text-neutral-400">By {skyboxData.author}</span> |
38 |
| - )} |
39 |
| - </div> |
40 |
| - <DownloadButton |
41 |
| - href={`/Source_Skyboxes_NextJS/skyboxes/${params.slug}/downloads/${params.slug}.7z`} |
42 |
| - download |
43 |
| - size={skyboxData.fileSize} |
44 |
| - className="flex-shrink-0" |
45 |
| - /> |
46 |
| - </div> |
47 |
| - </div> |
48 |
| - |
49 |
| - {/* Preview */} |
50 |
| - <div className="p-4 relative w-full aspect-[16/9]"> |
51 |
| - <img |
52 |
| - src={`${imgBase}/previews/1.webp`} |
53 |
| - alt={`${params.slug} preview`} |
54 |
| - className="w-full h-full object-cover rounded-md" |
55 |
| - /> |
56 |
| - </div> |
57 |
| - |
58 |
| - {/* Content Grid */} |
59 |
| - <div className="p-4 space-y-8"> |
60 |
| - {/* Description */} |
61 |
| - <div className="bg-neutral-800/50 p-4 rounded-md"> |
62 |
| - <h3 className="text-lg font-medium mb-3">Description</h3> |
63 |
| - <p className="text-neutral-300">{skyboxData.description || 'A high-quality HDR skybox for Source Engine games.'}</p> |
64 |
| - </div> |
65 |
| - |
66 |
| - {/* Environment Parameters */} |
67 |
| - <div> |
68 |
| - <h3 className="text-lg font-medium mb-4">Environment Parameters</h3> |
69 |
| - <div className="grid md:grid-cols-2 gap-6"> |
70 |
| - <div className="bg-neutral-800/50 p-4 rounded-md"> |
71 |
| - <h4 className="text-sm font-medium text-neutral-400 mb-3">Sun Parameters</h4> |
72 |
| - <SunParams {...skyboxData.sunParameters} /> |
73 |
| - </div> |
74 |
| - <div className="bg-neutral-800/50 p-4 rounded-md"> |
75 |
| - <h4 className="text-sm font-medium text-neutral-400 mb-3">Fog Parameters</h4> |
76 |
| - <FogParams {...skyboxData.fogParameters} /> |
77 |
| - </div> |
78 |
| - </div> |
79 |
| - </div> |
80 |
| - |
81 |
| - {/* Community Maps */} |
82 |
| - <div> |
83 |
| - <h3 className="text-lg font-medium mb-4">Community Maps</h3> |
84 |
| - <div className="bg-neutral-800/50 p-4 rounded-md"> |
85 |
| - <MapList maps={skyboxData.steamMaps} /> |
86 |
| - </div> |
87 |
| - </div> |
88 |
| - |
89 |
| - {/* Technical Details */} |
90 |
| - <TechnicalDetails |
91 |
| - resolution={skyboxData.resolution} |
92 |
| - fileSize={skyboxData.fileSize} |
93 |
| - compatibility={skyboxData.compatibility} |
94 |
| - /> |
95 |
| - </div> |
96 |
| - </div> |
97 |
| - |
98 |
| - {/* Categories Section */} |
99 |
| - <div className="p-6 border-t border-neutral-800 mt-8"> |
100 |
| - <h3 className="text-lg font-medium text-neutral-100 mb-4">Categories</h3> |
101 |
| - <div className="flex flex-wrap gap-2"> |
102 |
| - {skyboxData.categories?.map((category: string) => ( |
103 |
| - <span key={category} className="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-neutral-800 text-neutral-300"> |
104 |
| - {category} |
105 |
| - </span> |
106 |
| - ))} |
107 |
| - </div> |
108 |
| - </div> |
109 |
| - </article> |
110 |
| - ); |
| 28 | + if (!skyboxData) { |
| 29 | + return <div>Skybox not found</div>; |
| 30 | + } |
| 31 | + |
| 32 | + return <SkyboxClient slug={slug} skyboxData={skyboxData} />; |
111 | 33 | }
|
0 commit comments