'use client' import { useMusic } from '@/app/context/MusicContext'; import { ActionIcon, Avatar, Badge, Box, Card, Flex, Grid, Group, Paper, ScrollArea, Slider, Stack, Text, TextInput } from '@mantine/core'; import { IconArrowsShuffle, IconPlayerPauseFilled, IconPlayerPlayFilled, IconPlayerSkipBackFilled, IconPlayerSkipForwardFilled, IconRepeat, IconRepeatOff, IconSearch, IconVolume, IconVolumeOff, IconX } from '@tabler/icons-react'; import { useEffect, useMemo, useState } from 'react'; import BackButton from '../../desa/layanan/_com/BackButto'; const MusicPlayer = () => { const { isPlaying, currentSong, currentTime, duration, volume, isMuted, isRepeat, isShuffle, isLoading, musikData, playSong, togglePlayPause, playNext, playPrev, seek, setVolume, toggleMute, toggleRepeat, toggleShuffle, } = useMusic(); const [search, setSearch] = useState(''); // Fetch musik data from global state const { loadMusikData } = useMusic(); useEffect(() => { loadMusikData(); }, [loadMusikData]); // Filter musik based on search - gunakan useMemo untuk mencegah re-calculate setiap render const filteredMusik = useMemo(() => { return musikData.filter(musik => musik.judul.toLowerCase().includes(search.toLowerCase()) || musik.artis.toLowerCase().includes(search.toLowerCase()) || (musik.genre && musik.genre.toLowerCase().includes(search.toLowerCase())) ); }, [musikData, search]); // Format time helper const formatTime = (seconds: number) => { const mins = Math.floor(seconds / 60); const secs = Math.floor(seconds % 60); return `${mins}:${secs.toString().padStart(2, '0')}`; }; const handleVolumeChange = (value: number) => { setVolume(value); }; const toggleMuteHandler = () => { toggleMute(); }; const togglePlayPauseHandler = () => { togglePlayPause(); }; const skipBack = () => { playPrev(); }; const skipForward = () => { playNext(); }; const toggleShuffleHandler = () => { toggleShuffle(); }; const toggleRepeatHandler = () => { toggleRepeat(); }; if (isLoading) { return ( Memuat data musik... ); } return (
Selamat Datang Kembali Temukan musik favorit Anda hari ini
} radius="xl" w={280} value={search} onChange={(e) => setSearch(e.target.value)} styles={{ input: { backgroundColor: '#fff' } }} />
Sedang Diputar {currentSong ? (
{currentSong.judul} {currentSong.artis} {currentSong.genre && ( {currentSong.genre} )}
{formatTime(currentTime)} seek(v)} color="#0B4F78" size="sm" style={{ flex: 1 }} styles={{ thumb: { borderWidth: 2 } }} /> {formatTime(duration || 0)}
) : ( Pilih lagu untuk diputar )}
Daftar Putar {filteredMusik.length === 0 ? ( Tidak ada musik yang ditemukan ) : ( {filteredMusik.map((song) => ( playSong(song)} > {song.judul} {song.artis} {song.durasi} {currentSong?.id === song.id && isPlaying && ( Memutar )} ))} )}
{currentSong ? ( <> {currentSong.judul} {currentSong.artis} ) : ( Tidak ada lagu )}
{isShuffle ? : } {isPlaying ? : } {isRepeat ? : } {formatTime(currentTime)} seek(v)} color="#0B4F78" size="xs" style={{ flex: 1 }} /> {formatTime(duration || 0)} {isMuted || volume === 0 ? : } {isMuted ? 0 : volume}%
); }; export default MusicPlayer;