Adding toast notifications
All checks were successful
Music Collection CI Workflow / test (./backend) (push) Successful in 34s
Music Collection CI Workflow / test (./frontend) (push) Successful in 38s
Music Collection CI Workflow / build-and-push-images (./backend/Dockerfile, git.anatid.net/tabris/music-collection-backend, ./backend) (push) Successful in 51s
Music Collection CI Workflow / build-and-push-images (./frontend/Dockerfile, git.anatid.net/tabris/music-collection-frontend, ./frontend) (push) Successful in 1m48s
Music Collection CI Workflow / deploy (push) Successful in 23s
All checks were successful
Music Collection CI Workflow / test (./backend) (push) Successful in 34s
Music Collection CI Workflow / test (./frontend) (push) Successful in 38s
Music Collection CI Workflow / build-and-push-images (./backend/Dockerfile, git.anatid.net/tabris/music-collection-backend, ./backend) (push) Successful in 51s
Music Collection CI Workflow / build-and-push-images (./frontend/Dockerfile, git.anatid.net/tabris/music-collection-frontend, ./frontend) (push) Successful in 1m48s
Music Collection CI Workflow / deploy (push) Successful in 23s
This commit is contained in:
parent
8299929e71
commit
13f8cbb3ec
@ -8,7 +8,7 @@ import { TimeUtils } from '@/utils/time.util';
|
|||||||
import { createSong, deleteSong, getAlbum, getSong, updateSong, revalidateAlbum } from '@/app/actions';
|
import { createSong, deleteSong, getAlbum, getSong, updateSong, revalidateAlbum } from '@/app/actions';
|
||||||
import Button from 'react-bootstrap/Button';
|
import Button from 'react-bootstrap/Button';
|
||||||
import Modal from 'react-bootstrap/Modal';
|
import Modal from 'react-bootstrap/Modal';
|
||||||
import { IconButton } from '@mui/material';
|
import { Alert, Snackbar, IconButton } from '@mui/material';
|
||||||
import { AddCircleOutline, Delete, Edit } from '@mui/icons-material';
|
import { AddCircleOutline, Delete, Edit } from '@mui/icons-material';
|
||||||
|
|
||||||
export default function Page() {
|
export default function Page() {
|
||||||
@ -25,6 +25,11 @@ export default function Page() {
|
|||||||
const [formSongTrackNumber, setFormSongTrackNumber] = useState("");
|
const [formSongTrackNumber, setFormSongTrackNumber] = useState("");
|
||||||
const [formModalTitle, setFormModalTitle] = useState("Add Song");
|
const [formModalTitle, setFormModalTitle] = useState("Add Song");
|
||||||
const [formModalButtonLabel, setFormModalButtonLabel] = useState("Add");
|
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(() => {
|
useEffect(() => {
|
||||||
async function fetchAlbum(albumId: string) {
|
async function fetchAlbum(albumId: string) {
|
||||||
@ -33,7 +38,7 @@ export default function Page() {
|
|||||||
const data = await getAlbum(parseInt(albumId));
|
const data = await getAlbum(parseInt(albumId));
|
||||||
setAlbum(data);
|
setAlbum(data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error getting album with id ${albumId}`, error);
|
console.error(`Error getting album with id ${albumId}:`, error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fetchAlbum(albumId);
|
fetchAlbum(albumId);
|
||||||
@ -47,14 +52,16 @@ export default function Page() {
|
|||||||
try {
|
try {
|
||||||
if (formData.get('id') == "") {
|
if (formData.get('id') == "") {
|
||||||
await createSong(formData);
|
await createSong(formData);
|
||||||
|
handleSnackbar(`Successfully created Song with ID ${formData.get("id")}`, true);
|
||||||
} else {
|
} else {
|
||||||
await updateSong(formData);
|
await updateSong(formData);
|
||||||
|
handleSnackbar(`Successfully updated Song with ID ${formData.get("id")}`, true);
|
||||||
}
|
}
|
||||||
revalidateAlbum();
|
revalidateAlbum();
|
||||||
const data = await getAlbum(parseInt(albumId));
|
const data = await getAlbum(parseInt(albumId));
|
||||||
setAlbum(data);
|
setAlbum(data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error creating Song: ", error);
|
handleSnackbar(`Error creating Song: ${error}`, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,12 +90,10 @@ export default function Page() {
|
|||||||
setFormSongTrackNumber(data.trackNumber);
|
setFormSongTrackNumber(data.trackNumber);
|
||||||
handleShow();
|
handleShow();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error getting song with ID ${songId}:`, error);
|
handleSnackbar(`Error getting song with ID ${songId}: ${error}`, false);
|
||||||
}
|
}
|
||||||
revalidateAlbum();
|
|
||||||
const data = await getAlbum(parseInt(albumId));
|
|
||||||
setAlbum(data);
|
|
||||||
} else {
|
} else {
|
||||||
|
handleSnackbar(`Couldn't get ID of clicked element`, false);
|
||||||
console.error("Couldn't get ID of clicked element");
|
console.error("Couldn't get ID of clicked element");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -99,16 +104,22 @@ export default function Page() {
|
|||||||
try {
|
try {
|
||||||
await deleteSong(parseInt(songId));
|
await deleteSong(parseInt(songId));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error deleting song with ID ${songId}:`, error);
|
handleSnackbar(`Error deleting song with ID ${songId}: ${error}`, false);
|
||||||
}
|
}
|
||||||
revalidateAlbum();
|
revalidateAlbum();
|
||||||
const data = await getAlbum(parseInt(albumId));
|
const data = await getAlbum(parseInt(albumId));
|
||||||
setAlbum(data);
|
setAlbum(data);
|
||||||
} else {
|
} else {
|
||||||
console.error("Couldn't get ID of clicked element");
|
handleSnackbar(`Couldn't get ID of clicked element`, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleSnackbar = async (message: string, severity: boolean) => {
|
||||||
|
setSnackbarMessage(message);
|
||||||
|
setSnackbarSuccess(severity);
|
||||||
|
handleOpenSnackbar();
|
||||||
|
}
|
||||||
|
|
||||||
if (!album) return <div>Loading...</div>
|
if (!album) return <div>Loading...</div>
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -188,6 +199,18 @@ export default function Page() {
|
|||||||
</Button>
|
</Button>
|
||||||
</Modal.Footer>
|
</Modal.Footer>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
|
<Snackbar open={showSnackbar} autoHideDuration={6000} onClose={handleCloseSnackbar}>
|
||||||
|
<Alert
|
||||||
|
onClose={handleCloseSnackbar}
|
||||||
|
severity={snackbarSuccess ? 'success' : 'warning'}
|
||||||
|
variant="filled"
|
||||||
|
sx={{ width: '100%' }}
|
||||||
|
>
|
||||||
|
{snackbarMessage}
|
||||||
|
</Alert>
|
||||||
|
</Snackbar>
|
||||||
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@ import { Album } from '@/entities/album.entity';
|
|||||||
import { createAlbum, deleteAlbum, getAlbum, getAlbums, updateAlbum, revalidateAlbums } from '@/app/actions';
|
import { createAlbum, deleteAlbum, getAlbum, getAlbums, updateAlbum, revalidateAlbums } from '@/app/actions';
|
||||||
import Button from 'react-bootstrap/Button';
|
import Button from 'react-bootstrap/Button';
|
||||||
import Modal from 'react-bootstrap/Modal';
|
import Modal from 'react-bootstrap/Modal';
|
||||||
import { IconButton } from '@mui/material';
|
import { Alert, Snackbar, IconButton } from '@mui/material';
|
||||||
import { AddCircleOutline, Delete, Edit } from '@mui/icons-material';
|
import { AddCircleOutline, Delete, Edit } from '@mui/icons-material';
|
||||||
|
|
||||||
export default function Page() {
|
export default function Page() {
|
||||||
@ -20,6 +20,11 @@ export default function Page() {
|
|||||||
const [formAlbumGenre, setFormAlbumGenre] = useState("");
|
const [formAlbumGenre, setFormAlbumGenre] = useState("");
|
||||||
const [formModalTitle, setFormModalTitle] = useState("Add Album");
|
const [formModalTitle, setFormModalTitle] = useState("Add Album");
|
||||||
const [formModalButtonLabel, setFormModalButtonLabel] = useState("Add");
|
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(() => {
|
useEffect(() => {
|
||||||
async function fetchAlbums() {
|
async function fetchAlbums() {
|
||||||
@ -28,7 +33,7 @@ export default function Page() {
|
|||||||
const data = await getAlbums();
|
const data = await getAlbums();
|
||||||
setAlbums(data);
|
setAlbums(data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error getting albums: ", error);
|
handleSnackbar(`Error getting albums: ${error}`, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fetchAlbums();
|
fetchAlbums();
|
||||||
@ -42,14 +47,16 @@ export default function Page() {
|
|||||||
try {
|
try {
|
||||||
if (formData.get('id') == "") {
|
if (formData.get('id') == "") {
|
||||||
await createAlbum(formData);
|
await createAlbum(formData);
|
||||||
|
handleSnackbar(`Successfully created Album with ID ${formData.get("id")}`, true);
|
||||||
} else {
|
} else {
|
||||||
await updateAlbum(formData);
|
await updateAlbum(formData);
|
||||||
|
handleSnackbar(`Successfully updated Album with ID ${formData.get("id")}`, true);
|
||||||
}
|
}
|
||||||
revalidateAlbums();
|
revalidateAlbums();
|
||||||
const data = await getAlbums();
|
const data = await getAlbums();
|
||||||
setAlbums(data);
|
setAlbums(data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error creating Album: ", error);
|
handleSnackbar(`Error creating Album: ${error}`, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,13 +83,10 @@ export default function Page() {
|
|||||||
setFormAlbumGenre(data.genre);
|
setFormAlbumGenre(data.genre);
|
||||||
handleShow();
|
handleShow();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error getting album with ID ${id}:`, error);
|
handleSnackbar(`Error getting Album with ID ${id}: ${error}`, false);
|
||||||
}
|
}
|
||||||
revalidateAlbums();
|
|
||||||
const data = await getAlbums();
|
|
||||||
setAlbums(data);
|
|
||||||
} else {
|
} else {
|
||||||
console.error("Couldn't get ID of clicked element");
|
handleSnackbar(`Couldn't get ID of clicked element`, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,17 +95,25 @@ export default function Page() {
|
|||||||
if (id) {
|
if (id) {
|
||||||
try {
|
try {
|
||||||
await deleteAlbum(parseInt(id));
|
await deleteAlbum(parseInt(id));
|
||||||
|
handleSnackbar(`Successfully deleted Album with ID ${id}`, true);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error deleting album with ID ${id}:`, error);
|
handleSnackbar(`Error deleting Album with ID ${id}: ${error}`, false);
|
||||||
}
|
}
|
||||||
revalidateAlbums();
|
revalidateAlbums();
|
||||||
const data = await getAlbums();
|
const data = await getAlbums();
|
||||||
setAlbums(data);
|
setAlbums(data);
|
||||||
} else {
|
} else {
|
||||||
console.error("Couldn't get ID of clicked element");
|
handleSnackbar(`Couldn't get ID of clicked element`, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleSnackbar = async (message: string, severity: boolean) => {
|
||||||
|
setSnackbarMessage(message);
|
||||||
|
setSnackbarSuccess(severity);
|
||||||
|
handleOpenSnackbar();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (!albums) return <div>Loading...</div>
|
if (!albums) return <div>Loading...</div>
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -185,6 +197,18 @@ export default function Page() {
|
|||||||
</Button>
|
</Button>
|
||||||
</Modal.Footer>
|
</Modal.Footer>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|
||||||
|
<Snackbar open={showSnackbar} autoHideDuration={6000} onClose={handleCloseSnackbar}>
|
||||||
|
<Alert
|
||||||
|
onClose={handleCloseSnackbar}
|
||||||
|
severity={snackbarSuccess ? 'success' : 'warning'}
|
||||||
|
variant="filled"
|
||||||
|
sx={{ width: '100%' }}
|
||||||
|
>
|
||||||
|
{snackbarMessage}
|
||||||
|
</Alert>
|
||||||
|
</Snackbar>
|
||||||
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user