'use client' import { FormEvent, MouseEvent, useState, useEffect } from 'react'; import { useParams } from 'next/navigation' import { Album } from '@/entities/album.entity'; import { Song } from '@/entities/song.entity'; import { TimeUtils } from '@/utils/time.util'; import { StringUtils } from '@/utils/string.util'; import { createSong, deleteSong, getAlbum, getSong, updateSong } from '@/app/actions'; import Button from 'react-bootstrap/Button'; import Modal from 'react-bootstrap/Modal'; import { IconButton } from '@mui/material'; import { AddCircleOutline, Delete, Edit } from '@mui/icons-material'; export default function Page() { const [album, setAlbum] = useState(); const [show, setShow] = useState(false); const handleClose = () => setShow(false); const handleShow = () => setShow(true); const [formAlbumId, setFormAlbumId] = useState(""); const [formSongId, setFormSongId] = useState(""); const [formSongTitle, setFormSongTitle] = useState(""); const [formSongDuration, setFormSongDuration] = useState(""); const [formSongTrackNumber, setFormSongTrackNumber] = useState(""); const [formModalTitle, setFormModalTitle] = useState("Add Song"); const [formModalButtonLabel, setFormModalButtonLabel] = useState("Add"); const params = useParams<{ id: string }>(); const albumId = params.id; useEffect(() => { async function fetchAlbum(albumId: string) { try { const data = await getAlbum(parseInt(albumId)); setAlbum(data); } catch (error) { console.error(`Error getting album with id ${albumId}`, error); } } fetchAlbum(albumId); }, [albumId]); const handleSubmit = async (event: FormEvent) => { event.preventDefault(); handleClose(); const formData = new FormData(event.currentTarget); try { if (StringUtils.isBlank(formData.get('id'))) { const data = await createSong(formData); console.log(data); } else { const data = await updateSong(formData); console.log(data); } } catch (error) { console.error("Error creating Song: ", error); } } const handleCreate = async () => { setFormModalTitle("Add Song"); setFormModalButtonLabel("Add"); setFormAlbumId(albumId); setFormSongId(""); setFormSongTitle(""); setFormSongDuration(""); setFormSongTrackNumber(""); handleShow(); } const handleEdit = async (event: MouseEvent) => { const songId = event.currentTarget.getAttribute('song-id'); if (songId) { try { const data = await getSong(parseInt(songId)); setFormModalTitle("Edit Song"); setFormModalButtonLabel("Save"); setFormSongId(data.id) setFormAlbumId(albumId); setFormSongTitle(data.title); setFormSongDuration(data.duration); setFormSongTrackNumber(data.trackNumber); handleShow(); } catch (error) { console.error(`Error getting song with ID ${songId}:`, error); } } else { console.error("Couldn't get ID of clicked element"); } } const handleDelete = async (event: MouseEvent) => { const songId = event.currentTarget.getAttribute('song-id'); if (songId) { try { await deleteSong(parseInt(songId)); } catch (error) { console.error(`Error deleting song with ID ${songId}:`, error); } } else { console.error("Couldn't get ID of clicked element"); } } if (!album) return
Loading...
return ( <>
{album.title} by {album.artist} ({album.genre})
{album.songs.map((song: Song) => ( ))}
# Title Duration Controls
{song.trackNumber} {song.title} {TimeUtils.fancyTimeFormat(song.duration)}
{formModalTitle}
); }