improvements to JamTracks pages
This commit is contained in:
parent
5673d9b21e
commit
6b66764082
|
|
@ -1,101 +0,0 @@
|
||||||
import React, { useState, useEffect, useMemo } from 'react';
|
|
||||||
import Select from 'react-select';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { Row, Col } from 'reactstrap';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { markMixdownActive } from '../../helpers/rest';
|
|
||||||
import useJamTrackAudio from '../../hooks/useJamTrackAudio';
|
|
||||||
|
|
||||||
const JKJamTrackPlayer = ({ jamTrack }) => {
|
|
||||||
const [mixes, setMixes] = useState([]);
|
|
||||||
const [options, setOptions] = useState([]);
|
|
||||||
const [selectedMix, setSelectedMix] = useState(null);
|
|
||||||
const { audioUrls, loadJamTrack } = useJamTrackAudio(jamTrack);
|
|
||||||
|
|
||||||
const handleChange = selectedOption => {
|
|
||||||
const mix = mixes.find(mix => mix.value === selectedOption.value);
|
|
||||||
setSelectedMix(mix);
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (jamTrack) {
|
|
||||||
console.log('_JamTrack_ jamTrack', jamTrack);
|
|
||||||
const _opts = jamTrack.mixdowns.map(mix => ({ value: mix.id, label: mix.name }));
|
|
||||||
_opts.unshift({ value: 'original', label: 'Original' });
|
|
||||||
setOptions(_opts);
|
|
||||||
|
|
||||||
//set the default mix to the original
|
|
||||||
const activeMix = jamTrack.mixdowns.find(mix => mix.id === jamTrack.last_mixdown_id)
|
|
||||||
|
|
||||||
console.log('_JamTrack_ activeMix', activeMix);
|
|
||||||
|
|
||||||
setSelectedMix(activeMix);
|
|
||||||
}
|
|
||||||
}, [jamTrack]);
|
|
||||||
|
|
||||||
const activateMasterTrack = async () => {
|
|
||||||
console.log('playing original');
|
|
||||||
await markMixdownActive({ id: jamTrack.id, mixdown_id: null });
|
|
||||||
await loadJamTrack();
|
|
||||||
};
|
|
||||||
|
|
||||||
const activateCustomMix = async () => {
|
|
||||||
console.log('playing mix', selectedMix.value);
|
|
||||||
try {
|
|
||||||
await markMixdownActive({ id: jamTrack.id, mixdown_id: selectedMix.value });
|
|
||||||
await loadJamTrack();
|
|
||||||
}catch(error){
|
|
||||||
console.log('Error when activating custom mix', error);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!selectedMix) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('_JamTrack_ selectedMix', selectedMix);
|
|
||||||
|
|
||||||
if (selectedMix.value === 'original') {
|
|
||||||
//console.log('_JAMTRACK_ activating master track');
|
|
||||||
activateMasterTrack().then(() => {
|
|
||||||
//TODO: commiunicate with the client back end. Following is copied from the Rails front end
|
|
||||||
//SessionActions.mixdownActive({id:null})
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
//console.log('_JAMTRACK_ activating custom mix:', selectedMix);
|
|
||||||
activateCustomMix().then(() => {
|
|
||||||
//TODO: commiunicate with the client back end. Following is copied from the Rails front end
|
|
||||||
//context.jamClient.JamTrackStopPlay();
|
|
||||||
//SessionActions.mixdownActive(mixdown)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, [selectedMix]);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Select options={mixes} placeholder="Select Mix" onChange={handleChange} value={selectedMix} />
|
|
||||||
{ JSON.stringify(audioUrls)}
|
|
||||||
<Row className='mt-2'>
|
|
||||||
<Col>
|
|
||||||
{audioUrls.length > 0 && (
|
|
||||||
<figure>
|
|
||||||
<audio controls style={{ width: '100%'}}>
|
|
||||||
{audioUrls.map((url, index) => (
|
|
||||||
<source key={index} src={url} type={`audio/${url.split('.').pop()}`} />
|
|
||||||
))}
|
|
||||||
</audio>
|
|
||||||
</figure>
|
|
||||||
)}
|
|
||||||
</Col>
|
|
||||||
</Row>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
JKJamTrackPlayer.propTypes = {
|
|
||||||
jamTrack: PropTypes.object.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
export default JKJamTrackPlayer;
|
|
||||||
|
|
@ -1,117 +0,0 @@
|
||||||
import React, { useState, useEffect, useMemo } from 'react';
|
|
||||||
import Select from 'react-select';
|
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
||||||
import { Row, Col, Progress } from 'reactstrap';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { markMixdownActive } from '../../helpers/rest';
|
|
||||||
import useBrowserMedia from '../../hooks/useBrowserMedia';
|
|
||||||
import JKProgressSlider from './JKProgressSlider';
|
|
||||||
|
|
||||||
const JKJamTrackPlayer = ({ jamTrack }) => {
|
|
||||||
const [mixes, setMixes] = useState([]);
|
|
||||||
const [selectedMix, setSelectedMix] = useState(null);
|
|
||||||
const { play, stop, pause, loading, loaded, playing, paused, loadError, playPosition } = useBrowserMedia(jamTrack);
|
|
||||||
|
|
||||||
const handleChange = selectedOption => {
|
|
||||||
//console.log('selectedOption', selectedOption);
|
|
||||||
setSelectedMix(selectedOption);
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (jamTrack) {
|
|
||||||
const mixes = jamTrack.mixdowns.map(mix => ({ value: mix.id, label: mix.name, mix }));
|
|
||||||
mixes.unshift({ value: 'original', label: 'Original', jamTrack });
|
|
||||||
setMixes(mixes);
|
|
||||||
}
|
|
||||||
}, [jamTrack]);
|
|
||||||
|
|
||||||
const trackDuration = useMemo(() => {
|
|
||||||
if (jamTrack && jamTrack.duration) {
|
|
||||||
return (jamTrack.duration/60).toFixed(2);
|
|
||||||
}
|
|
||||||
}, [jamTrack]);
|
|
||||||
|
|
||||||
const trackCurrentTime = useMemo(() => {
|
|
||||||
if (playPosition) {
|
|
||||||
return (playPosition/60).toFixed(2);
|
|
||||||
}else{
|
|
||||||
return '0.00';
|
|
||||||
}
|
|
||||||
}, [playPosition]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if(!selectedMix) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const handlePlayOriginal = async () => {
|
|
||||||
console.log('playing original');
|
|
||||||
await markMixdownActive({id: selectedMix.jamTrack.id, mixdown_id: null});
|
|
||||||
}
|
|
||||||
|
|
||||||
const handlePlayMix = async () => {
|
|
||||||
console.log('playing mix', selectedMix.value);
|
|
||||||
await markMixdownActive({id: selectedMix.jamTrack.id, mixdown_id: selectedMix.value});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(selectedMix.value === 'original') {
|
|
||||||
console.log('playing original');
|
|
||||||
handlePlayOriginal();
|
|
||||||
} else {
|
|
||||||
console.log('playing mix', selectedMix.value);
|
|
||||||
handlePlayMix();
|
|
||||||
}
|
|
||||||
}, [selectedMix]);
|
|
||||||
|
|
||||||
const playAudio = () => {
|
|
||||||
console.log('playing');
|
|
||||||
play();
|
|
||||||
}
|
|
||||||
|
|
||||||
const stopAudio = () => {
|
|
||||||
console.log('stopping');
|
|
||||||
stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
const pauseAudio = () => {
|
|
||||||
console.log('pausing');
|
|
||||||
pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Select options={mixes} placeholder="Select Mix" onChange={handleChange} />
|
|
||||||
{/* <Row className="mt-2 align-items-center">
|
|
||||||
<Col className="col-md-2">
|
|
||||||
<div className="d-flex">
|
|
||||||
{ playing && <FontAwesomeIcon icon="pause-circle" size="2x" onClick={pauseAudio} /> }
|
|
||||||
{ !playing && <FontAwesomeIcon icon="play-circle" size="2x" onClick={playAudio} /> }
|
|
||||||
<FontAwesomeIcon icon="stop-circle" size="2x" onClick={stopAudio} />
|
|
||||||
</div>
|
|
||||||
</Col>
|
|
||||||
<Col>
|
|
||||||
<div className='d-flex'>
|
|
||||||
<span>{trackCurrentTime}</span>
|
|
||||||
<JKProgressSlider />
|
|
||||||
<span>{trackDuration}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</Col>
|
|
||||||
</Row> */}
|
|
||||||
<Row>
|
|
||||||
<Col>
|
|
||||||
|
|
||||||
</Col>
|
|
||||||
</Row>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
JKJamTrackPlayer.propTypes = {
|
|
||||||
jamTrack: PropTypes.object.isRequired,
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
export default JKJamTrackPlayer;
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import React, { Fragment, useState } from 'react';
|
import React, { Fragment, useState } from 'react';
|
||||||
import { Row, Col, Container } from 'reactstrap';
|
import { Row, Col } from 'reactstrap';
|
||||||
import JKJamTrackTrack from './JKJamTrackTrack';
|
import JKJamTrackTrack from './JKJamTrackTrack';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { useResponsive } from '@farfetch/react-context-responsive';
|
import { useResponsive } from '@farfetch/react-context-responsive';
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
const JKJamTrackResourceLinks = ({jamTrack}) => {
|
const JKJamTrackResourceLinks = ({jamTrack}) => {
|
||||||
const { t } = useTranslation('jamtracks');
|
const { t } = useTranslation('jamtracks');
|
||||||
|
|
@ -23,7 +24,7 @@ const JKJamTrackResourceLinks = ({jamTrack}) => {
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<div>
|
<div>
|
||||||
<a target="_blank" href="https://www.jamkazam.com/client#/jamtrack">
|
<a target="_blank" href="https://jamkazam.com/jamtracks">
|
||||||
{t('jamtrack.help_resources.jamtracks_home.title')}
|
{t('jamtrack.help_resources.jamtracks_home.title')}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -31,14 +32,17 @@ const JKJamTrackResourceLinks = ({jamTrack}) => {
|
||||||
</div>
|
</div>
|
||||||
<div className="mb-3">
|
<div className="mb-3">
|
||||||
<div>
|
<div>
|
||||||
<a
|
{/* <a
|
||||||
target="_blank"
|
target="_blank"
|
||||||
href={`https://www.jamkazam.com/client?artist=${encodeURIComponent(
|
href={`https://www.jamkazam.com/client?artist=${encodeURIComponent(
|
||||||
jamTrack.original_artist
|
jamTrack.original_artist
|
||||||
)}#/jamtrack/search`}
|
)}#/jamtrack/search`}
|
||||||
>
|
>
|
||||||
{t('jamtrack.help_resources.see_more.title')}
|
{t('jamtrack.help_resources.see_more.title')}
|
||||||
</a>
|
</a> */}
|
||||||
|
<Link to={`/jamtracks?artist=${encodeURIComponent(jamTrack.original_artist)}`}>
|
||||||
|
{t('jamtrack.help_resources.see_more.title')}
|
||||||
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
{t('jamtrack.help_resources.see_more.description')}
|
{t('jamtrack.help_resources.see_more.description')}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
import { useBrowserQuery } from '../../context/BrowserQuery';
|
||||||
import { Card, CardBody, Row, Col } from 'reactstrap';
|
import { Card, CardBody, Row, Col } from 'reactstrap';
|
||||||
import FalconCardHeader from '../common/FalconCardHeader';
|
import FalconCardHeader from '../common/FalconCardHeader';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
@ -24,6 +25,9 @@ const JKJamTracksFilter = () => {
|
||||||
const PER_PAGE = 10;
|
const PER_PAGE = 10;
|
||||||
const { shoppingCart } = useShoppingCart();
|
const { shoppingCart } = useShoppingCart();
|
||||||
const { greaterThan } = useResponsive();
|
const { greaterThan } = useResponsive();
|
||||||
|
const queryString = useBrowserQuery();
|
||||||
|
const query = queryString.get('query');
|
||||||
|
const artist = queryString.get('artist');
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (selected) {
|
if (selected) {
|
||||||
|
|
@ -31,6 +35,17 @@ const JKJamTracksFilter = () => {
|
||||||
}
|
}
|
||||||
}, [selected]);
|
}, [selected]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if(query && !artist) {
|
||||||
|
//setAutoCompleteInputValue(query);
|
||||||
|
handleOnEnter(query);
|
||||||
|
}
|
||||||
|
if(artist && !query) {
|
||||||
|
//setAutoCompleteInputValue(artist);
|
||||||
|
handleOnEnter(artist);
|
||||||
|
}
|
||||||
|
}, [query]);
|
||||||
|
|
||||||
const queryOptions = selected => {
|
const queryOptions = selected => {
|
||||||
const options = {
|
const options = {
|
||||||
per_page: PER_PAGE,
|
per_page: PER_PAGE,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue