import useSWR from 'swr' import fetcher from '@/lib/fetcher' import Image from 'next/future/image' import Link from 'next/link' import clsx from 'clsx' import {useEffect} from 'react' import {animate} from 'motion' function AnimatedBars() { useEffect(() => { animate( '#bar1', { transform: [ 'scaleY(1.0) translateY(0rem)', 'scaleY(1.5) translateY(-0.082rem)', 'scaleY(1.0) translateY(0rem)' ] }, { duration: 1.0, repeat: Infinity, easing: ['ease-in-out'] } ); animate( '#bar2', { transform: [ 'scaleY(1.0) translateY(0rem)', 'scaleY(3) translateY(-0.083rem)', 'scaleY(1.0) translateY(0rem)' ] }, { delay: 0.2, duration: 1.5, repeat: Infinity, easing: ['ease-in-out'] } ); animate( '#bar3', { transform: [ 'scaleY(1.0) translateY(0rem)', 'scaleY(0.5) translateY(0.37rem)', 'scaleY(1.0) translateY(0rem)' ] }, { delay: 0.3, duration: 1.5, repeat: Infinity, easing: ['ease-in-out'] } ); }, []) return (
) } function usePlayerState(path, options) { const {data, error, isLoading} = useSWR(`/api/spotify/${path}`, fetcher, options) return { song: data, isLoading, isError: error } } function Song({as: Component = 'div', artist, title, songUrl, album, albumImageUrl, isPlaying}) { return ( {isPlaying && }
) } Song.Album = function SongAlbum({album, albumImageUrl}) { return ( {album} ) } Song.Title = function SongTitle({as: Component = 'h2', title, songUrl, className}) { return ( {title} ) } Song.Artist = function SongArtist({as: Component = 'p', artist}) { return ( {artist} ) } Song.Skeleton = function SongSkeleton({as: Component = 'div'}) { return (

) } function LastPlayed() { const {song, isLoading, isError} = usePlayerState('last-played') if (isError) return return ( <> {isLoading ? : song?.title && } ) } export function SpotifyPlayer() { const {song, isLoading, isError} = usePlayerState('currently-playing', {refreshInterval: 30000}) if (isError) return return (
{isLoading ? : song?.isPlaying ? : }
) }