diff --git a/src/components/EntityList.jsx b/src/components/EntityList.jsx index e3ad5da..fa266da 100644 --- a/src/components/EntityList.jsx +++ b/src/components/EntityList.jsx @@ -18,7 +18,7 @@ const EntityPlaceholder = (props) => { const EntityItem = (props) => { return ( -
  • +
  • {props.cover &&
    @@ -43,8 +43,9 @@ export const EntityList = (props) => { entities.push() } }else{ - entities = props.items.map(item => ); + entities = props.items.map(item => ); } const className = props.grid ? "grid" : "column"; diff --git a/src/components/EntityList.scss b/src/components/EntityList.scss index 959536e..6afff34 100644 --- a/src/components/EntityList.scss +++ b/src/components/EntityList.scss @@ -105,7 +105,7 @@ width: 0; } - &:hover { + &:hover, &.selected{ &:after{ width: 100%; } @@ -130,7 +130,7 @@ transition: all 300ms ease-in-out; } - &:hover { + &:hover, &.selected { .cover { outline: 6px var(--accent) solid; outline-offset: -6px; diff --git a/src/index.jsx b/src/index.jsx index 4ebf589..31163f0 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -11,6 +11,7 @@ import {SearchBar} from "./components/SearchBar"; import {Search} from './views/Search'; import {ArtistView} from "./views/Artist"; import {DiscView} from "./views/Disc"; +import {ReleaseView} from "./views/Release"; const Main = (props) => { const navigate = (query) => props.history.push(`/search?query=${query}`); @@ -40,6 +41,7 @@ const App = () => ( + diff --git a/src/services/entity_service.js b/src/services/entity_service.js index cc50743..965bc64 100644 --- a/src/services/entity_service.js +++ b/src/services/entity_service.js @@ -26,13 +26,13 @@ export async function getDiscVersions(mbid, page = 1, per_page = 10) { return response.data } -export async function getVersion(mbid) { +export async function getRelease(mbid) { const url = `${baseUrl}/release/${mbid}`; const response = await axios.get(url); return response.data } -export async function getReleaseSongs(mbid, page = 1, per_page = 50) { +export async function getReleaseSongs(mbid) { const url = `${baseUrl}/release/${mbid}/recordings`; const response = await axios.get(url); return response.data diff --git a/src/views/Release.jsx b/src/views/Release.jsx new file mode 100644 index 0000000..82bec1a --- /dev/null +++ b/src/views/Release.jsx @@ -0,0 +1,87 @@ +import React, {Fragment, useEffect, useState} from 'react'; + +import {getRelease, getReleaseSongs} from "../services/entity_service"; + +import {CoverArt} from "../components/CoverArt"; +import {Entity} from "../components/Entity"; +import {EntityList} from "../components/EntityList"; + +const capitalize = (string) => { + return string.charAt(0).toUpperCase() + string.slice(1); +} + +const Recordings = (props) => { + const recordings = props.recordings ? props.recordings : null; + + let recordingsComponent = ; + if(recordings) { + const items = recordings.map((recording) => ({ + 'id': recording.id, + 'link': props.makeLink(recording.id), + 'title': recording.title, + 'subtitle': ( +
    {recording.length}
    +
    {capitalize(recording.disambiguation)}
    +
    ), + 'selected': props.selected === recording.id + + })); + recordingsComponent = + } + + return ( + +

    Canciones

    + {recordingsComponent} +
    + ) +} + +const Release = (props) => { + const release = props.release; + if (release){ + return }/> + }else { + return + } +} + +export const ReleaseView = (props) => { + const mbid = props.match.params.mbid; + + const [release, setRelease] = useState(null); + const [recordings, setRecordings] = useState(null); + const currentRecording = props.location.hash ? props.location.hash.slice(1) : null + + useEffect(() => { + if (mbid) { + getRelease(mbid).then((result) => setRelease(result)); + getReleaseSongs(mbid).then((result) => { + setRecordings(result.medias[0].recordings); + }); + } + }, [mbid]) + + const makeLink = (recordingID) => { + return `/release/${mbid}#${recordingID}`; + } + + const handleNavigateToRecording= (recording) => { + props.history.push(makeLink(recording.id)) + } + + return ( + + + {release && + + } + + ) +}