import React, { useState, useEffect } from 'react'; import { Box, Button } from '@material-ui/core'; import * as serverApi from './api'; import SongTable, { Entry as SongEntry } from './components/SongTable'; import ArtistTable, { Entry as ArtistEntry } from './components/ArtistTable'; import EditSongDialog, { SongProperties } from './components/EditSongDialog'; import EditArtistDialog, { ArtistProperties } from './components/EditArtistDialog'; function App() { const [songs, setSongs] = useState([]); const [artists, setArtists] = useState([]); const [editSongDialogOpen, setEditSongDialogOpen] = useState(false); const [songDialogProperties, setSongDialogProperties] = useState({ title: "", artistId: -1, }); const [editArtistDialogOpen, setEditArtistDialogOpen] = useState(false); const [artistDialogProperties, setArtistDialogProperties] = useState({ name: "" }); const updateSongs = () => { return fetch(serverApi.ListSongsEndpoint) .then((response: any) => response.json()) .then((result: serverApi.ListSongsResponse) => { setSongs(result.map((item: serverApi.ListSongsResponseItem) => { return { title: item.title, artistName: item.artistName }; })); }); } const fetchArtists = () => { return fetch(serverApi.ListArtistsEndpoint) .then((response: any) => response.json()) .then((result: serverApi.ListArtistsResponse) => { return result.map((item: serverApi.ListArtistsResponseItem) => { return { name: item.name, id: item.id, }; }); }); } const updateArtists = () => { return fetchArtists() .then((artists: any[]) => { setArtists(artists); }); } const createSong = (p:SongProperties) => { if(!p.artistId) { throw "Undefined artist ID for song to be created."; } const request:serverApi.CreateSongRequest = { title: p.title, artistId: p.artistId, } const requestOpts = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(request) }; return fetch(serverApi.CreateSongEndpoint, requestOpts) } const createArtist = (p:ArtistProperties) => { const request:serverApi.CreateArtistRequest = { name: p.name, } const requestOpts = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(request) }; return fetch(serverApi.CreateArtistEndpoint, requestOpts) } const openCreateSongDialog = () => { setSongDialogProperties({ title: "", artistId: -1, }); setEditSongDialogOpen(true); } const onSubmitCreateSongDialog = () => { createSong(songDialogProperties) .then(updateSongs) .then(() => { setEditSongDialogOpen(false); }) } const openCreateArtistDialog = () => { setArtistDialogProperties({ name: "", }); setEditArtistDialogOpen(true); } const onSubmitCreateArtistDialog = () => { createArtist(artistDialogProperties) .then(updateArtists) .then(() => { setEditArtistDialogOpen(false); }) } useEffect(() => { updateSongs(); }, []); useEffect(() => { updateArtists(); }, []); return (
{ setEditSongDialogOpen(false); }} onChangeSongProperties={(props:SongProperties) => setSongDialogProperties(props)} songProperties={songDialogProperties} onSubmit={onSubmitCreateSongDialog} artists={artists} /> { setEditArtistDialogOpen(false); }} onChangeArtistProperties={(props:ArtistProperties) => setArtistDialogProperties(props)} artistProperties={artistDialogProperties} onSubmit={onSubmitCreateArtistDialog} />
); } export default App;