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()}

}
} >
); }