'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 { createSong, deleteSong, getAlbum, getSong, updateSong, revalidateAlbum } from '@/app/actions'; import Button from 'react-bootstrap/Button'; import Modal from 'react-bootstrap/Modal'; import { Alert, Snackbar, IconButton } from '@mui/material'; import { AddCircleOutline, Delete, Edit } from '@mui/icons-material'; export default function Page() { const params = useParams<{ id: string }>(); const albumId = params.id; const [album, setAlbum] = useState(); const [show, setShow] = useState(false); const handleClose = () => setShow(false); const handleShow = () => setShow(true); const [formAlbumId, setFormAlbumId] = useState(albumId); 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 [showSnackbar, setShowSnackbar] = useState(false); const handleCloseSnackbar = () => setShowSnackbar(false); const handleOpenSnackbar = () => setShowSnackbar(true); const [snackbarSuccess, setSnackbarSuccess] = useState(true); const [snackbarMessage, setSnackbarMessage] = useState(""); useEffect(() => { async function fetchAlbum(albumId: string) { try { revalidateAlbum(); 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 (formData.get('id') == "") { await createSong(formData).then(response => { if (response.ok) { handleSnackbar(`Successfully created Song with ID ${formData.get("id")}: ${JSON.stringify(response)}`, true); } handleSnackbar(`Failed to create Song with ID ${formData.get("id")}: ${JSON.stringify(response)}`, false); }) .catch(error => {handleSnackbar(`Failed to create Song with ID ${formData.get("id")}: ${JSON.stringify(error)}`, false);}); } else { await updateSong(formData).then(response => { if (response.ok) { handleSnackbar(`Successfully created Song with ID ${formData.get("id")}: ${JSON.stringify(response)}`, true); } handleSnackbar(`Failed to create Song with ID ${formData.get("id")}: ${JSON.stringify(response)}`, false); }) .catch(error => {handleSnackbar(`Failed to create Song with ID ${formData.get("id")}: ${JSON.stringify(error)}`, false);}); } revalidateAlbum(); const data = await getAlbum(parseInt(albumId)); setAlbum(data); } catch (error) { handleSnackbar(`Error creating Song: ${JSON.stringify(error)}`, false); } } 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(songId); setFormAlbumId(albumId); setFormSongTitle(data.title); setFormSongDuration(data.duration); setFormSongTrackNumber(data.trackNumber); handleShow(); } catch (error) { handleSnackbar(`Error getting song with ID ${songId}: ${JSON.stringify(error)}`, false); } } else { handleSnackbar(`Couldn't get ID of clicked element`, false); 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) { handleSnackbar(`Error deleting song with ID ${songId}: ${JSON.stringify(error)}`, false); } revalidateAlbum(); const data = await getAlbum(parseInt(albumId)); setAlbum(data); } else { handleSnackbar(`Couldn't get ID of clicked element`, false); } } const handleSnackbar = async (message: string, severity: boolean) => { setSnackbarMessage(message); setSnackbarSuccess(severity); handleOpenSnackbar(); } if (!album) return
Loading...
return ( <>

{album.title}

{album.artist}

({album.genre})
{album.songs.map((song: Song) => ( ))}
# Title Duration Controls
{song.trackNumber} {song.title} {TimeUtils.fancyTimeFormat(song.duration)}
{formModalTitle}
{snackbarMessage} ); }