Teal.fm frontend powered by slices.network tealfm-slices.wisp.place
tealfm slices
at main 1.8 kB view raw
1import { graphql, useLazyLoadQuery } from "react-relay"; 2import { useParams } from "react-router-dom"; 3import type { ProfileTopTracksQuery } from "./__generated__/ProfileTopTracksQuery.graphql"; 4import TopTrackItem from "./TopTrackItem"; 5import { useDateRangeFilter } from "./useDateRangeFilter"; 6import { useMemo } from "react"; 7 8export default function ProfileTopTracks() { 9 const { handle, period } = useParams<{ handle: string; period?: string }>(); 10 const dateRangeVariables = useDateRangeFilter(period); 11 12 const queryVariables = useMemo(() => { 13 return { 14 where: { 15 ...dateRangeVariables.where, 16 actorHandle: { eq: handle }, 17 }, 18 }; 19 }, [handle, dateRangeVariables]); 20 21 const data = useLazyLoadQuery<ProfileTopTracksQuery>( 22 graphql` 23 query ProfileTopTracksQuery($where: FmTealAlphaFeedPlayWhereInput) { 24 fmTealAlphaFeedPlaysAggregated( 25 groupBy: [{ field: trackName }, { field: releaseMbId }, { field: artists }] 26 orderBy: { count: desc } 27 limit: 10 28 where: $where 29 ) { 30 trackName 31 releaseMbId 32 artists 33 count 34 } 35 } 36 `, 37 queryVariables, 38 { fetchKey: `${handle}-${period || "all"}`, fetchPolicy: "store-or-network" } 39 ); 40 41 const tracks = data.fmTealAlphaFeedPlaysAggregated || []; 42 const maxCount = tracks.length > 0 ? tracks[0].count : 0; 43 44 return ( 45 <div className="space-y-1"> 46 {tracks.map((track, index) => ( 47 <TopTrackItem 48 key={`${track.trackName}-${index}`} 49 trackName={track.trackName || "Unknown Track"} 50 releaseMbId={track.releaseMbId} 51 artists={track.artists || "Unknown Artist"} 52 count={track.count} 53 rank={index + 1} 54 maxCount={maxCount} 55 /> 56 ))} 57 </div> 58 ); 59}