// Songs Context import { useLocalStorage } from '@uidotdev/usehooks'; import { createContext, useEffect, useState } from 'react'; import { PlayMode } from '@/const/enum'; import key from '@/const/key'; import AudioPlayer from '@/components/audio_player'; import { get163MusicListSongs, getNextMusic } from '@/utils/music'; import type { FinalMusic } from '@/types/music'; export interface MusicContextProps { setListId: (id: string) => void listId: string onNext: () => void onPrevious: () => void } export interface MusicProviderProps { children: React.ReactNode } export const AudioContext = createContext({ setListId: () => {}, listId: '5438670983', onNext: () => {}, onPrevious: () => {}, }); const AudioProvider: React.FC = ({ children }) => { const [listId, setListId] = useLocalStorage(key.musicID, '5438670983'); const [musicList, setMusicList] = useState([]); const [musicId, setMusicId] = useState(0); const [playMode, setPlayMode] = useState(PlayMode.Loop); const music = musicList.find((music) => music.id === musicId); const [token] = useLocalStorage(key.token, ''); const onNext = () => { const nextID = getNextMusic(musicList, musicId, playMode); setMusicId(nextID); }; const onPrevious = () => { const index = musicList.findIndex((music) => music.id === musicId); if (index === 0) { setMusicId(musicList[musicList.length - 1].id); } else { setMusicId(musicList[index - 1].id); } }; const onPlayEnd = () => { const nextID = getNextMusic(musicList, musicId, playMode); setMusicId(nextID); }; const changeMode = (mode: PlayMode) => { setPlayMode(mode); }; const fetchMusicList = async (id: string) => { const res = await get163MusicListSongs(id); setMusicList(res); setMusicId(res[0].id); }; useEffect(() => { if (listId && token) fetchMusicList(listId); }, [listId, token]); return ( {children} ); }; export default AudioProvider;