diff --git a/src/base/components/Navbar/Navbar.tsx b/src/base/components/Navbar/Navbar.tsx index cd236b1..9edfca3 100644 --- a/src/base/components/Navbar/Navbar.tsx +++ b/src/base/components/Navbar/Navbar.tsx @@ -14,6 +14,7 @@ import { import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { LanguageSelector } from './LanguageSelector'; +import { NowPlayingBadge } from './NowPlayingBadge'; import { PreferencesPanel } from './PreferencesPanel'; import { SITE_NAME } from '@/lib/site'; @@ -125,22 +126,28 @@ export const Navbar = () => { })} -
- - +
+ +
+ + +
- +
+ + +
diff --git a/src/base/components/Navbar/NowPlayingBadge.tsx b/src/base/components/Navbar/NowPlayingBadge.tsx new file mode 100644 index 0000000..b205570 --- /dev/null +++ b/src/base/components/Navbar/NowPlayingBadge.tsx @@ -0,0 +1,116 @@ +'use client'; + +import Image from 'next/image'; +import Link from 'next/link'; +import { useState } from 'react'; + +import useSWR from 'swr'; + +import { LastfmTrack } from '@/types/Lastfm'; + +type NowPlayingResponse = { + nowPlaying: LastfmTrack | null; +}; + +const jsonFetcher = (url: string) => fetch(url).then((r) => r.json()); + +const NowPlayingArt = ({ + track, + size, +}: { + track: LastfmTrack; + size: number; +}) => { + const [failed, setFailed] = useState(false); + + if (!track.imageUrl || failed) { + return ( +