diff --git a/src/components/ProjectComponents/RecentListens.tsx b/src/components/ProjectComponents/RecentListens.tsx index ca07001..ce2b3e0 100644 --- a/src/components/ProjectComponents/RecentListens.tsx +++ b/src/components/ProjectComponents/RecentListens.tsx @@ -1,31 +1,6 @@ import { useState, useEffect } from 'react'; import ProjectComponent from '../ProjectComponent'; - -type MusicAPIResponse = { - data: { - tracks: MusicData[] - } -} - -type MusicData = { - artist: { - mbid: string, - "#text": string - }, - mbid: string, - album: { - mbid: string, - "#text": string, - }, - name: string, - url: string, - image: MusicImage[] -} - -type MusicImage = { - size: string, - "#text": string -} +import type { MusicData, MusicAPIResponse } from '../../utils/types'; export default function RecentListens() { const [ data, setData ] = useState(); diff --git a/src/main.tsx b/src/main.tsx index 6b9f9e7..e97300a 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -8,6 +8,7 @@ import './assets/main.css' // pages import MainPage from './pages/index'; import PrivacyPage from './pages/privacy'; +import MusicWidget from './pages/music'; const router = createBrowserRouter([ { @@ -17,6 +18,10 @@ const router = createBrowserRouter([ { path: '/privacy', element: + }, + { + path: '/music', + element: } ]) diff --git a/src/pages/music.tsx b/src/pages/music.tsx new file mode 100644 index 0000000..b76c54e --- /dev/null +++ b/src/pages/music.tsx @@ -0,0 +1,45 @@ +import { useEffect, useState } from 'react'; +import type { MusicAPIResponse, MusicData } from '../utils/types'; + +export default function MusicWidget() { + const [ data, setData ] = useState(null); + + const fetchMusicData = () => { + fetch("https://api.alexav.gg/v4/social/music", { + method: 'get' + }) + .then(async (res) => { + if (res.ok) { + const data = await res.json() as MusicAPIResponse; + setData(data.data.tracks[0]); + } else { + console.error("Failed to get music data!", res.status); + } + }) + } + + useEffect(() => { + fetchMusicData() + setInterval(() => { + fetchMusicData(); + }, 60000) + }, []) + + if (data) { + return ( +
+
+ v.size === "large")[0]['#text']} /> +

{data.name}

+

{data.artist['#text']}

+
+
+ ) + } else { + return ( +
+

Loading..

+
+ ) + } +} \ No newline at end of file diff --git a/src/utils/types.ts b/src/utils/types.ts new file mode 100644 index 0000000..618c63f --- /dev/null +++ b/src/utils/types.ts @@ -0,0 +1,30 @@ +type MusicAPIResponse = { + data: { + tracks: MusicData[] + } +} + +type MusicData = { + artist: { + mbid: string, + "#text": string + }, + mbid: string, + album: { + mbid: string, + "#text": string, + }, + name: string, + url: string, + image: MusicImage[] +} + +type MusicImage = { + size: string, + "#text": string +} + +export type { + MusicAPIResponse, + MusicData +} \ No newline at end of file