From 90ed81d1e6f55f4f3f87653d691dfa7bab117181 Mon Sep 17 00:00:00 2001 From: Redskull-127 Date: Tue, 23 Jul 2024 18:19:35 +0530 Subject: [PATCH] refactor: optimize Spotify Component and Added Tan Stack Query React! --- app/layout.tsx | 51 +++++----- bun.lockb | Bin 420488 -> 422880 bytes components/Root-Partials/index.tsx | 30 ++++-- components/Root-Partials/spotify/Audio.tsx | 84 ++++++++++++---- .../Root-Partials/spotify/LyricsButton.tsx | 16 ++- .../spotify/SpotifyComponent.tsx | 93 +++++++++++------- components/ui/tabs.tsx | 55 +++++++++++ lib/client/providers/TanstackProvider.tsx | 17 ++++ lib/server/functions/lyrics.ts | 4 +- lib/server/functions/spotify-switch.ts | 21 ++++ lib/server/functions/spotify.ts | 82 ++++++++++++--- next.config.js | 2 +- package.json | 3 + 13 files changed, 346 insertions(+), 112 deletions(-) create mode 100644 components/ui/tabs.tsx create mode 100644 lib/client/providers/TanstackProvider.tsx create mode 100644 lib/server/functions/spotify-switch.ts diff --git a/app/layout.tsx b/app/layout.tsx index f9ca946..a9a5f4f 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -22,6 +22,7 @@ import { TailwindIndicator } from '@/lib/taillwind-indicator'; import { CSPostHogProvider } from '@/lib/client/providers/Posthog'; import { IntroDialogProvider } from '@/lib/client/providers/intro-provider'; import { siteConfig } from '@/site-config'; +import TanstackProvider from '@/lib/client/providers/TanstackProvider'; const santoshiSans = localFont({ src: './Satoshi-Variable.woff2', display: 'swap', @@ -84,28 +85,34 @@ export default function RootLayout({ children }: Children) { santoshiSans.className, )} > - - - - - - - - -
- - {children} - - -
-
- - -
-
-
-
-
+ + + + + + + + + +
+ + {children} + + +
+
+ + +
+
+
+
+
+
diff --git a/bun.lockb b/bun.lockb index 842a70b1cbc2eef02c651524988b7ae23af090c5..0290105782de684d05e6bdf804cadd74d04f0f14 100644 GIT binary patch delta 77394 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
&1G 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 iaTH~vDUse~wPyS2;`gIWMPrUP5FN^Y+8>1 diff --git a/components/Root-Partials/index.tsx b/components/Root-Partials/index.tsx index 16a480b..3f8f07c 100644 --- a/components/Root-Partials/index.tsx +++ b/components/Root-Partials/index.tsx @@ -1,17 +1,21 @@ import Link from 'next/link'; -import { SpotifySelfApi, SpotifyType } from '@/lib/server/functions/spotify'; import { Icons } from '../icons/icons'; import { Discord, GitHub, Gmail, LinkedIn, X } from '../icons/AnimatedIcons'; import SkillModel from './skill/SkillModel'; import { Settings as Controls } from '@/lib/client/functions/settings'; import { GitHubAPI, GitHubType } from '@/lib/server/functions/github'; import { ProjectLists } from './project/ProjectLists'; -import SpotifyComponent, { - SpotifyComponentError, -} from './spotify/SpotifyComponent'; +import SpotifyComponent from './spotify/SpotifyComponent'; import Avatar3D from './3D-avatar'; import { getTotalVisits } from '@/lib/server/google/apis/search-analytics'; import { siteConfig } from '@/site-config'; +import { + QueryClient, + HydrationBoundary, + dehydrate, +} from '@tanstack/react-query'; +import { SpotifySelfApi } from '@/lib/server/functions/spotify'; + export function HeroCard() { return (
@@ -69,11 +73,19 @@ export function QuickLinks() { } export async function SpotifyCard() { - const data: SpotifyType | Error | undefined = await SpotifySelfApi(); - if (data instanceof Error || data === undefined || data === null) { - return ; - } - return ; + const queryClient = new QueryClient(); + await queryClient.prefetchQuery({ + queryKey: ['spotifyData'], + queryFn: () => SpotifySelfApi('shuffle'), + }); + const dehydratedState = dehydrate(queryClient); + + return ( + + {' '} + {' '} + + ); } export function Skills() { diff --git a/components/Root-Partials/spotify/Audio.tsx b/components/Root-Partials/spotify/Audio.tsx index 22a67ec..8162ce5 100644 --- a/components/Root-Partials/spotify/Audio.tsx +++ b/components/Root-Partials/spotify/Audio.tsx @@ -2,7 +2,7 @@ import { useRef, useState, useEffect, useCallback } from 'react'; import { Icons } from '../../icons/icons'; import { toast } from 'sonner'; -import { SkipForward, Volume } from 'lucide-react'; +import { SkipForward, VolumeX, Volume1, Volume2, Settings } from 'lucide-react'; import { Slider } from '@/components/ui/slider'; import { DropdownMenu, @@ -11,7 +11,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; -import { getNewSong } from '@/lib/server/functions/spotify'; +import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { HoverCard, HoverCardContent, @@ -19,6 +19,8 @@ import { } from '@/components/ui/hover-card'; import { useCastContext } from '@/lib/client/providers/CastProvider'; import clsx from 'clsx'; +import { SwitchModes } from '@/lib/server/functions/spotify-switch'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; type AudioButtonType = { AudioSRC: string; @@ -27,6 +29,7 @@ type AudioButtonType = { image: string; disabled?: boolean; status?: 'now-playing' | 'shuffle'; + setStatus?: React.Dispatch>; }; type AudioButtonProps = 'playing' | 'paused' | 'stopped' | 'new-song'; @@ -37,6 +40,13 @@ export default function AudioButton(props: AudioButtonType) { const audioRef = useRef(null); const [audioVolume, setAudioVolume] = useState(); const [audioCurrDuration, setAudioCurrDuration] = useState(); + const queryClient = useQueryClient(); + + const getNewSong = useCallback(async () => { + await queryClient.invalidateQueries({ + queryKey: ['spotifyData'], + }); + }, [queryClient]); const handleStop = useCallback(() => { setPlaying('stopped'); @@ -45,11 +55,22 @@ export default function AudioButton(props: AudioButtonType) { action: { label: 'Play Next', onClick: async () => { - await getNewSong(); + if (props.status === 'now-playing') { + return toast.info('Meer is currently listening to this song!', { + description: 'Switch to shuffle mode to skip to the next song!', + }); + } else { + setPlaying('new-song'); + return toast.promise(getNewSong(), { + loading: 'Loading next song...', + success: 'Next song loaded!', + error: 'Error loading next song!', + }); + } }, }, }); - }, [props.name]); + }, [getNewSong, props.name, props.status]); const handlePlay = useCallback(() => { const ref = audioRef.current; @@ -168,21 +189,50 @@ export default function AudioButton(props: AudioButtonType) {
- + - - Audio controls + + Settings - { - window.localStorage.setItem('audioVolume', e[0].toString()); - setAudioVolume(e[0]); + { + toast.promise( + SwitchModes(e as 'shuffle' | 'now-playing', props.setStatus!), + { + loading: 'Switching modes...', + success: `Switched to ${e} mode!`, + error: + e === 'shuffle' + ? 'Error switching to shuffle mode!' + : 'Ah snap! Meer is not playing currently :(', + }, + ); }} - defaultValue={[audioVolume!]} - max={100} - step={1} - /> + defaultValue={props.status ?? 'shuffle'} + > + + Shuffle + Now Playing + + +
+ {audioVolume === 0 ? ( + + ) : audioVolume! < 50 ? ( + + ) : ( + + )} + { + window.localStorage.setItem('audioVolume', e[0].toString()); + setAudioVolume(e[0]); + }} + defaultValue={[audioVolume!]} + max={100} + step={1} + /> +
@@ -249,7 +299,7 @@ export default function AudioButton(props: AudioButtonType) { 'Meer is currently listening to this song!', { description: - 'Implementing the mode switching in next update.', + 'Switch to shuffle mode to skip to the next song!', }, ); } else { diff --git a/components/Root-Partials/spotify/LyricsButton.tsx b/components/Root-Partials/spotify/LyricsButton.tsx index 3a2b85a..2e41798 100644 --- a/components/Root-Partials/spotify/LyricsButton.tsx +++ b/components/Root-Partials/spotify/LyricsButton.tsx @@ -30,16 +30,12 @@ export default function LyricsButton({ {song} - {name}
- {lyrics && lyrics !== '' ? ( - -

- - ) : ( -

No lyrics found. :(

- )} + +

+

diff --git a/components/Root-Partials/spotify/SpotifyComponent.tsx b/components/Root-Partials/spotify/SpotifyComponent.tsx index cca6a4c..ce672dc 100644 --- a/components/Root-Partials/spotify/SpotifyComponent.tsx +++ b/components/Root-Partials/spotify/SpotifyComponent.tsx @@ -1,50 +1,67 @@ -import { SpotifyType } from '@/lib/server/functions/spotify'; +'use client'; +import { SpotifySelfApi, SpotifyType } from '@/lib/server/functions/spotify'; import AudioButton from './Audio'; import SpotifyImage from './Spotify-image'; import { Icons } from '../../icons/icons'; import Link from 'next/link'; import LyricsButton from './LyricsButton'; -import getLyrics from '@/lib/server/functions/lyrics'; import MarqueeText from './MarqueeText'; import { SocialMediaLinks } from '@/site-config'; +import { useQuery } from '@tanstack/react-query'; +import { useState } from 'react'; -export default async function SpotifyComponent(props: SpotifyType) { - const lyrics = await getLyrics(props.name, props.artist); - return ( -
-
- - Spotify - - -
-
- -
- +export default function SpotifyComponent() { + const [status, setStatus] = useState<'shuffle' | 'now-playing'>('shuffle'); + + const { data, error, isLoading } = useQuery({ + queryKey: ['spotifyData', status], + queryFn: () => SpotifySelfApi(status), + refetchOnWindowFocus: false, + }); + + if (isLoading || error) return ; + if (data) { + return ( +
+
+ + Spotify + + +
+
+ +
+ +
+
+
+
-
- -
-
- ); + ); + } } -export function SpotifyComponentError() { +export function SpotifyComponentError(error: any) { return (
- +
diff --git a/components/ui/tabs.tsx b/components/ui/tabs.tsx new file mode 100644 index 0000000..d1fb058 --- /dev/null +++ b/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +'use client'; + +import * as React from 'react'; +import * as TabsPrimitive from '@radix-ui/react-tabs'; + +import { cn } from '@/lib/utils'; + +const Tabs = TabsPrimitive.Root; + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsList.displayName = TabsPrimitive.List.displayName; + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName; + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +TabsContent.displayName = TabsPrimitive.Content.displayName; + +export { Tabs, TabsList, TabsTrigger, TabsContent }; diff --git a/lib/client/providers/TanstackProvider.tsx b/lib/client/providers/TanstackProvider.tsx new file mode 100644 index 0000000..429d597 --- /dev/null +++ b/lib/client/providers/TanstackProvider.tsx @@ -0,0 +1,17 @@ +'use client'; + +import { Children } from '@/lib/types/children'; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import { useState } from 'react'; + +export default function TanstackProvider({ children }: Children) { + const [queryClient] = useState(() => new QueryClient()); + + return ( + + + {children} + + ); +} diff --git a/lib/server/functions/lyrics.ts b/lib/server/functions/lyrics.ts index 4ae3cd5..50f278d 100644 --- a/lib/server/functions/lyrics.ts +++ b/lib/server/functions/lyrics.ts @@ -13,7 +13,5 @@ export default async function getLyrics(song: string, artist: string) { try { const data = await GetLyric(options); return data as typeof data; - } catch (error: AxiosError | any) { - console.error(error.message); - } + } catch (error: AxiosError | any) {} } diff --git a/lib/server/functions/spotify-switch.ts b/lib/server/functions/spotify-switch.ts new file mode 100644 index 0000000..2d99142 --- /dev/null +++ b/lib/server/functions/spotify-switch.ts @@ -0,0 +1,21 @@ +import { getNowPlaying, getRecentlyPlayed } from './spotify'; + +export async function SwitchModes( + mode: 'shuffle' | 'now-playing', + setStatus: React.Dispatch>, +) { + if (mode === 'shuffle') { + const data = await getRecentlyPlayed(); + if (data instanceof Error) { + return Error('Something went wrong!'); + } + return setStatus('shuffle'); + } + if (mode === 'now-playing') { + const data = await getNowPlaying(); + if (data instanceof Error) { + return Error('Sorry, Meer is not playing currently :('); + } + return setStatus('now-playing'); + } +} diff --git a/lib/server/functions/spotify.ts b/lib/server/functions/spotify.ts index 4062a1b..af71164 100644 --- a/lib/server/functions/spotify.ts +++ b/lib/server/functions/spotify.ts @@ -3,6 +3,9 @@ import { revalidateTag } from 'next/cache'; import { unstable_cache } from 'next/cache'; import { DeepScarpSong } from './deep-song-scrap'; +// @ts-ignore +import { getLyrics as GetLyric } from 'genius-lyrics-api'; +import { AxiosError } from 'axios'; export type SpotifyType = { images: { @@ -13,6 +16,7 @@ export type SpotifyType = { preview_url: string; uri?: string; status: 'now-playing' | 'shuffle'; + lyrics: string; }; const SPOTIFY_CLIENT_ID = process.env['SPOTIFY_CLIENT_ID']; @@ -87,9 +91,21 @@ export const makeRequest = async (url: string, config = {}): Promise => { } }; -export async function getNewSong() { - return revalidateTag('spotifyAPI'); -} +export const getLyrics = async (song: string, artist: string) => { + const options = { + apiKey: process.env['GENIUS_ACCESS_TOKEN'] as string, + title: song, + artist: artist, + optimizeQuery: true, + }; + + try { + const data = await GetLyric(options); + return data; + } catch (error: AxiosError | any) { + return 'Error fetching lyrics'; + } +}; export const getDeepScrapedSong = async (song: string) => { const data = await DeepScarpSong(song); @@ -110,6 +126,7 @@ export const getNowPlaying = async () => { artist: data.item.artists[0].name, preview_url: preview, uri: data.item.uri, + lyrics: await getLyrics(data.item.name, data.item.artists[0].name), } as unknown as SpotifyType; } return { @@ -119,9 +136,10 @@ export const getNowPlaying = async () => { artist: data.item.artists[0].name, preview_url: data.item.preview_url, uri: data.item.uri, + lyrics: await getLyrics(data.item.name, data.item.artists[0].name), } as unknown as SpotifyType; } else { - return Error('Not Playing'); + return Error('Sorry, Meer is not playing currently :('); } }; @@ -140,6 +158,10 @@ export const getRecentlyPlayed = async () => { artist: data.items[random].track.artists[0].name, preview_url: preview, uri: data.items[random].track.uri, + lyrics: await getLyrics( + data.items[random].track.name, + data.items[random].track.artists[0].name, + ), } as unknown as SpotifyType; } return { @@ -149,27 +171,59 @@ export const getRecentlyPlayed = async () => { artist: data.items[random].track.artists[0].name, preview_url: data.items[random].track.preview_url, uri: data.items[random].track.uri, + lyrics: await getLyrics( + data.items[random].track.name, + data.items[random].track.artists[0].name, + ), } as unknown as SpotifyType; - } else { - return Error('Not Playing'); } }; -export const SpotifySelfApi = unstable_cache( +export const SpotifySelfApi = async (status: 'shuffle' | 'now-playing') => { + if (status === 'shuffle') { + try { + return (await getRecentlyPlayed()) as SpotifyType; + } catch (error: any) { + console.log(error); + Error(error); + } + } + if (status === 'now-playing') { + try { + return (await getNowPlaying()) as SpotifyType; + } catch (error: any) { + console.log(error); + Error(error); + } + } +}; // This can be used when you want to get the currently playing song or the recently played song from the user's Spotify account + +export const SpotifyNowPlaying = unstable_cache( async () => { try { return await getNowPlaying(); } catch (error) { - try { - return await getRecentlyPlayed(); - } catch (innerError) { - console.log(innerError); - } + console.log(error); + } + }, + ['spotifyNowPlaying'], + { + tags: ['spotifyNowPlaying'], + revalidate: 1, + }, +); + +export const SpotifyRecentlyPlayed = unstable_cache( + async () => { + try { + return await getRecentlyPlayed(); + } catch (error) { + console.log(error); } }, - ['spotifyAPI'], + ['spotifyRecentlyPlayed'], { - tags: ['spotifyAPI'], + tags: ['spotifyRecentlyPlayed'], revalidate: 1, }, ); diff --git a/next.config.js b/next.config.js index 46c3af7..6900582 100644 --- a/next.config.js +++ b/next.config.js @@ -19,7 +19,7 @@ const withPWA = require('@ducanh2912/next-pwa').default({ reloadOnOnline: true, disable: process.env.NODE_ENV === 'development', workboxOptions: { - disableDevLogs: true, + disableDevLogs: process.env.NODE_ENV === 'development' ? false : true, }, }); diff --git a/package.json b/package.json index 015bfac..54b1b26 100644 --- a/package.json +++ b/package.json @@ -29,10 +29,13 @@ "@radix-ui/react-slider": "^1.1.2", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-switch": "^1.0.3", + "@radix-ui/react-tabs": "^1.1.0", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "^1.0.7", "@splinetool/react-spline": "^2.2.6", "@splinetool/runtime": "^1.2.4", + "@tanstack/react-query": "^5.51.11", + "@tanstack/react-query-devtools": "^5.51.11", "@types/chromecast-caf-sender": "^1.0.9", "@types/dompurify": "^3.0.5", "@vercel/analytics": "^1.2.2",