1- 'use client' ;
2-
31import PlayerManager from '@/components/PlayerManager' ;
42import SongsColumn from '@/components/SongsColumn' ;
53import RelistenAPI from '@/lib/RelistenAPI' ;
64import { createShowDate } from '@/lib/utils' ;
75import { RawParams } from '@/types/params' ;
86import { notFound } from 'next/navigation' ;
97import { playImmediatelySearchParamsLoader } from '@/lib/searchParams/playImmediatelySearchParam' ;
10- import { useEffect , useState } from 'react' ;
118
12- export default function EmbedSongPage ( props : { params : Promise < RawParams > } ) {
13- const [ params , setParams ] = useState < RawParams | null > ( null ) ;
14- const [ show , setShow ] = useState ( null ) ;
15- const [ { playImmediately } ] = playImmediatelySearchParamsLoader . useQueryStates ( ) ;
9+ interface EmbedSongPageProps {
10+ params : Promise < RawParams > ;
11+ searchParams : Promise < { [ key : string ] : string | string [ ] | undefined } > ;
12+ }
13+
14+ export default async function EmbedSongPage ( { params, searchParams } : EmbedSongPageProps ) {
15+ const resolvedParams = await params ;
16+ const { artistSlug, year, month, day } = resolvedParams ;
1617
17- useEffect ( ( ) => {
18- async function loadData ( ) {
19- const resolvedParams = await props . params ;
20- setParams ( resolvedParams ) ;
21-
22- const { artistSlug, year, month, day } = resolvedParams ;
23- if ( ! year || ! month || ! day ) return ;
24-
25- const showData = await RelistenAPI . fetchShow ( artistSlug , year , createShowDate ( year , month , day ) ) ;
26- setShow ( showData ) ;
27- }
28- loadData ( ) ;
29- } , [ props . params ] ) ;
18+ if ( ! year || ! month || ! day ) return notFound ( ) ;
3019
31- if ( ! params || ! show ) {
32- return < div > Loading...</ div > ;
20+ const show = await RelistenAPI . fetchShow ( artistSlug , year , createShowDate ( year , month , day ) ) ;
21+
22+ if ( ! show ) {
23+ notFound ( ) ;
3324 }
3425
35- const { artistSlug, year, month, day } = params ;
26+ // Parse search params on server
27+ const parsedSearchParams = await playImmediatelySearchParamsLoader . parseAndValidate ( searchParams ) ;
28+ const playImmediately = parsedSearchParams . playImmediately ?? true ;
3629
3730 return (
3831 < div className = "flex h-full" >
@@ -46,12 +39,17 @@ export default function EmbedSongPage(props: { params: Promise<RawParams> }) {
4639 routePrefix = "/embed"
4740 />
4841 </ div >
49- < PlayerManager { ...params } show = { show } routePrefix = "/embed" playImmediately = { playImmediately } />
42+ < PlayerManager
43+ { ...resolvedParams }
44+ show = { show }
45+ routePrefix = "/embed"
46+ playImmediately = { playImmediately }
47+ />
5048 </ div >
5149 ) ;
5250}
5351
54- export const generateMetadata = async ( props ) => {
52+ export async function generateMetadata ( props ) {
5553 const [ params , artists ] = await Promise . all ( [ props . params , RelistenAPI . fetchArtists ( ) ] ) ;
5654 const { artistSlug, year, month, day, songSlug } = params ;
5755
@@ -79,4 +77,4 @@ export const generateMetadata = async (props) => {
7977 ] ,
8078 } ,
8179 } ;
82- } ;
80+ }
0 commit comments