| 1 | "use client"; |
| 2 | |
| 3 | import { useSearchParams } from "next/navigation"; |
| 4 | import { useLogger } from "@/lib/logger"; |
| 5 | import { useEffect, useState } from "react"; |
| 6 | import { invoke } from "@tauri-apps/api/tauri"; |
| 7 | import { TAURI_CONTENT_SONG_BRIDGE_DETAIL } from "@/lib/tauri-handler"; |
| 8 | import { SongProvider } from "@/models/song-response"; |
| 9 | import SongVotes from "./_components/song-votes"; |
| 10 | import { SongBridgeResponse } from "@/models/content"; |
| 11 | import { SongProviderVote } from "@/models/song-votes-detail-response"; |
| 12 | |
| 13 | export default function Page() { |
| 14 | const log = useLogger("Play"); |
| 15 | const searchParams = useSearchParams(); |
| 16 | const songProviderId = searchParams.get("songProviderId"); |
| 17 | const [songProvider, setSongProvider] = useState<SongProvider | null>(null); |
| 18 | const [votes, setVotes] = useState<SongProviderVote[]>([]); |
| 19 | |
| 20 | useEffect(() => { |
| 21 | log.debug("Play page loaded."); |
| 22 | async function fetchData() { |
| 23 | try { |
| 24 | const rest: SongBridgeResponse = await invoke( |
| 25 | TAURI_CONTENT_SONG_BRIDGE_DETAIL, |
| 26 | { songProviderId } |
| 27 | ); |
| 28 | setSongProvider(rest.song_provider); |
| 29 | setVotes(rest.votes); |
| 30 | log.debug("PreparePlayerResponse", rest); |
| 31 | } catch (error) { |
| 32 | log.error(error); |
| 33 | } |
| 34 | } |
| 35 | fetchData(); |
| 36 | // eslint-disable-next-line react-hooks/exhaustive-deps |
| 37 | }, []); |
| 38 | |
| 39 | // Sanity check |
| 40 | if (!songProvider) { |
| 41 | log.error("No songProvider context"); |
| 42 | return <div>No songProvider context</div>; |
| 43 | } |
| 44 | |
| 45 | return ( |
| 46 | <div className="prose prose-sm prose-invert max-w-none"> |
| 47 | <SongVotes songProvider={songProvider} votes={votes} /> |
| 48 | </div> |
| 49 | ); |
| 50 | } |