import { useState } from "react"; import { Link, useLoaderData, type LoaderFunctionArgs } from "react-router"; import { mergeTracks, type Album, type Track } from "api/api"; import LastPlays from "~/components/LastPlays"; import PeriodSelector from "~/components/PeriodSelector"; import MediaLayout from "./MediaLayout"; import ActivityGrid from "~/components/ActivityGrid"; import { timeListenedString } from "~/utils/utils"; export async function clientLoader({ params }: LoaderFunctionArgs) { let res = await fetch(`/apis/web/v1/track?id=${params.id}`); if (!res.ok) { throw new Response("Failed to load track", { status: res.status }); } const track: Track = await res.json(); res = await fetch(`/apis/web/v1/album?id=${track.album_id}`) if (!res.ok) { throw new Response("Failed to load album for track", { status: res.status }) } const album: Album = await res.json() return {track: track, album: album}; } export default function Track() { const { track, album } = useLoaderData(); const [period, setPeriod] = useState('week') return ( { r.albums = [] r.artists = [] for (let i = 0; i < r.tracks.length; i ++) { if (r.tracks[i].id === id) { delete r.tracks[i] } } return r }} subContent={
appears on {album.title} {track.listen_count &&

{track.listen_count} play{ track.listen_count > 1 ? 's' : ''}

} {

{timeListenedString(track.time_listened)}

} {

Listening since {new Date(track.first_listen * 1000).toLocaleDateString()}

}
} >
) }