{"version":3,"sources":["styles/svg-components/AssetHeart.js","styles/svg-components/PauseVersion.js","styles/svg-components/AssetCartCircular.js","styles/svg-components/AssetCartSubscriptionLicense.js","styles/svg-components/AssetPlaybackSingle.js","styles/svg-components/AssetPreviewDownload.js","containers/TrackPage/Versions.js","containers/TrackPage/Breadcrumb.js","containers/TrackPage/Tempo.js","containers/TrackPage/SubStyles.js","containers/TrackPage/ParentStyle.js","containers/TrackPage/Styles.js","containers/TrackPage/Keywords.js","styles/svg-components/FoldDownChevron.js","containers/TrackPage/Categories.js","containers/TrackPage/index.js","actions/pageMetaAction.js","actions/styleAction.js"],"names":["AssetHeart","src","React","Component","PauseVersion","AssetCartCircular","AssetCartSubscriptionLicense","AssetPlaybackSingle","AssetPreviewDownload","mmss","time","minutes","Math","floor","seconds","toString","length","Versions","trackIndex","trackId","version","versionIndex","button","onVersionPlay","handleAddPlaylist","onDownloadVersionPreview","onToggleFavouriteTrackVerion","favorite","className","A","id","onClick","version_description","version_length","Download","AssetAddToPlaylist","Breadcrumb","artist","track","to","slug","text","name","Tempo","props","this","tempo","SubStyles","styles","Object","entries","subStyles","forEach","style","index","values","push","ParentStyle","parent","parentStyle","split","endComma","Styles","stylesLength","Keywords","keywords","keyword","trim","FoldDownChevron","Categories","state","foldOpen","isTrustedUser","sessionStorage","getItem","trustedUserName","authToken","adminBar","showRelevancy","onToggleFold","bind","onDownloadUnwatermarked","setState","fetch","API","method","headers","then","response","json","error","console","log","download_zip","window","location","track_tempo","versions","versionsFold","moods","connect","get","dispatch","toggleRelevancy","TrackPage","componentId","requestManager","generateComponentId","artistId","params","versionPlaying","versionsData","liveTrack","isAudioReady","activeVersionId","waveFormContainer","createRef","buildWave","handleVersionPlay","handleTrackPlayPause","userHasSubscription","waveSurfer","onClaimTracksOwnership","loadData","onClearEditData","onCancelSimilarTracksRequests","onUnregisterComponent","onReleaseTracksOwnership","subscriptionData","JSON","parse","isActive","isFreeTrial","search","URLSearchParams","licenseagain","parseInt","isNaN","fetchTrack","data","onAddLicense","catch","err","nextProps","isLoading","activeTrack","footerPlayer","onLoadEditData","type","router","track_version","_","orderBy","activeCurrentVersion","find","versionID","getVersionIndex","findIndex","isEmpty","version_type","buildVersionWave","fetchTrackStyles","fetchStyleMoods","flushTrackWave","onFetchSimilarTracks","wavesurfer","destroy","WaveSurfer","create","container","current","backend","mediaType","normalize","waveColor","progressColor","cursorColor","cursorWidth","height","hideScrollbar","audioPeaks","track_url","waveform_json","audioDuration","precise_duration","duration","setPeaks","drawBuffer","mainVersionID","getMainVersion","handleWaveFormSeek","addTrackPageWave","versionId","trackPage","map","newVersion","version_precise_length","addVersionTrackWave","on","pos","playerTrack","isActiveTrack","trackID","setPlayerPosition","isPlaying","playing","play","setPlaying","current_context","playActiveTrack","pause","setTrackPosition","position","currentContext","primaryTrack","setCurrentTrack","playerActive","mainVersionId","currentContextId","addActiveTrack","addPrimaryTrack","event","currentTarget","getAttribute","onAddPlaylist","contextID","onToggleFavourite","showSignUpModal","player","getVersionByID","currentTrack","setPause","pausedActiveTrack","isDestroyed","addVersionPrimaryTrack","undefined","v","Array","isArray","mainVersion","breadcrumb","avatarImage","avatarAlt","heroStyle","artistButton","artistThumb","artistLink","avatar_image","image_aws_url","header_image","backgroundImage","getImgixUrl","backgroundPosition","backgroundSize","alt","width","favouriteMainVersionId","isCurrentTrack","playButton","Pause","SpinnerIcon","favourite","favouritesData","includes","String","versionFavourite","versionFavouritesData","version_preview_uri","versionRow","handleDownloadVersionPreview","handleToggleFavorite","versionsFoldCutoff","pageMetaTitle","pageMetaDesc","getTrackPageTitle","getTrackPageDesc","content","rel","href","getCanonicalUrl","backgroundColor","marginBottom","top","textAlign","margin","transform","featuring","is_explicit_lyrics","autoclear","target","NormalisedScore","trackEngagement","current_engagement","engagementGroup","current_engagement_group","description","onDownload","addNewEngagement","ref","unlisted","TrackPlayer","url","onResultClick","onTrackPlay","contextId","fetchSimilarTracks","cancelSimilarTracksRequests","onClearTracksState","clearTracksState","unregisterComponent","ownerId","ownerType","claimTracksOwnership","releaseTracksOwnership","addPlaylist","addLicense","$","addClass","onAddNewEngagement","versionData","downloadPreviewTrackPage","downloadPreview","toggleFavouriteTrackVerion","editData","loadEditData","clearEditData","addModal","engagementInfo","destroyPreviousPlayer","addTrackPageVersionWave","getPageTitle","title","fallback","start","middle","getPageDesc","desc","metaDesc","subtitle","path","origin","clean","charAt","replace","trackName","artistName","pageTitle","getGeneralPageTitle","is404","getTags","allTags","max","checkPrev","tags","newTag","tag","subtag","fetchStyle","styleId","conditionallyGetCdnApi","res","fetchCategoryStyles","fetchPopularStyles","fetchAllStyles","receiveStyles"],"mappings":"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","file":"static/js/19.chunk.js?hash=973583d2","sourcesContent":["import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass AssetHeart extends React.Component {\n render() {\n const assetHeart = `\n \n \n \n \n \n`;\n return (\n \n );\n }\n}\n\nexport default AssetHeart;\n","import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass PauseVersion extends React.Component {\n render() {\n const PauseVersion = `\n\n\n\n \n \n \n\n\n\n`;\n return (\n \n );\n }\n}\n\nexport default PauseVersion;\n","import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass AssetCartCircular extends React.Component {\n render() {\n const assetCartCircular = ``;\n return (\n \n );\n }\n}\n\nexport default AssetCartCircular;\n","import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass AssetCartSubscriptionLicense extends React.Component {\n render() {\n const cartSubscriptionLicense = ``;\n return (\n \n );\n }\n}\n\nexport default AssetCartSubscriptionLicense;\n","import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass AssetPlaybackSingle extends React.Component {\n render() {\n const assetPlaybackSingle = `\n \n \n \n \n\n`;\n return (\n \n );\n }\n}\n\nexport default AssetPlaybackSingle;\n","import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass AssetPreviewDownload extends React.Component {\n render() {\n const assetPreviewDownload = `\n\n\n\n\n\n`;\n return (\n \n );\n }\n}\n\nexport default AssetPreviewDownload;\n","import React from 'react';\nimport AssetAddToPlaylist from 'styles/svg-components/AssetAddToPlaylist.js';\nimport AssetPlaybackSingle from 'styles/svg-components/AssetPlaybackSingle.js';\nimport AssetHeart from 'styles/svg-components/AssetHeart.js';\nimport A from 'components/A';\nimport DownloadSVG from '../../styles/svg-components/Download';\n\nconst Versions = ({ trackIndex, trackId, version, versionIndex, button, onVersionPlay, handleAddPlaylist, onDownloadVersionPreview, onToggleFavouriteTrackVerion, favorite }) => (\n
\n
\n \n \n \n {button}\n \n \n \n \n {version.version_description}\n \n \n {mmss(version.version_length)}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n);\n\nfunction mmss(time) {\n const minutes = Math.floor(time / 60);\n const seconds = time - minutes * 60;\n\n const secondsLength = seconds.toString().length;\n\n if (secondsLength === 1) {\n return `${minutes}:${0}${seconds}`;\n }\n\n return `${minutes}:${seconds}`;\n}\n\n\nexport default Versions;\n","import React from 'react';\nimport A from 'components/A';\nimport EllipsisText from 'react-ellipsis-text';\n\nconst Breadcrumb = ({ artist, track }) => (\n \n Artists\n
    \n
  • \n
  • \n
\n
\n);\n\nexport default Breadcrumb;\n","import React from 'react';\nimport { connect } from 'react-redux';\nimport $ from 'jquery';\nimport A from 'components/A';\n\nexport default class Tempo extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n
\n
\n
\n Tempo\n
\n
\n {this.props.tempo} bpm\n
\n
\n
\n );\n }\n}\n","import React, {Fragment} from 'react';\nimport { connect } from 'react-redux';\nimport $ from 'jquery';\nimport A from 'components/A';\n\nexport default class SubStyles extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const styles = [];\n\n Object.entries(this.props.subStyles).forEach((style, index) => {\n if (index + 1 < Object.values(this.props.subStyles).length) {\n styles.push({style[1][0]}, );\n } else {\n styles.push({style[1][0]});\n }\n });\n return (\n  ({styles})\n );\n }\n}\n","import React, {Fragment} from 'react';\nimport { connect } from 'react-redux';\nimport $ from 'jquery';\nimport A from 'components/A';\nimport SubStyles from './SubStyles';\n\nexport default class ParentStyle extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const parent = this.props.parentStyle[0].split('_');\n\n let endComma = null;\n if (this.props.index + 1 < this.props.length) {\n endComma = ', ';\n }\n\n let subStyles = null;\n if (this.props.parentStyle[1].length != 0) {\n subStyles = this.props.parentStyle[1];\n }\n\n return (\n \n {parent[1]}\n {subStyles && }\n {endComma}\n \n );\n }\n}\n","import React, {Fragment} from 'react';\nimport { connect } from 'react-redux';\nimport $ from 'jquery';\nimport ParentStyle from './ParentStyle';\n\nexport default class Styles extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const styles = [];\n const stylesLength = Object.values(this.props.styles).length;\n\n Object.entries(this.props.styles).forEach((style, index) => {\n styles.push();\n });\n\n return (\n
\n
\n
\n {this.props.name}\n
\n
\n {styles}\n
\n
\n
\n );\n }\n}\n","import React, {Fragment} from 'react';\nimport { connect } from 'react-redux';\nimport $ from 'jquery';\nimport A from 'components/A';\n\nexport default class Keywords extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const keywords = [];\n\n /**\n * Old code for linkng keywords to the search page - commenting out until the search page is live.\n */\n /*this.props.keywords.forEach((keyword, index) => {\n if (index + 1 < this.props.keywords.length) {\n keywords.push({keyword.name}, );\n } else {\n keywords.push({keyword.name});\n }\n });*/\n\n this.props.keywords.forEach((keyword, index) => {\n if (index + 1 < this.props.keywords.length) {\n keywords.push({keyword.name.trim()}, );\n } else {\n keywords.push({keyword.name});\n }\n });\n\n return (\n
\n
\n
\n Tags\n
\n
\n {keywords}\n
\n
\n
\n );\n }\n}\n","import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass FoldDownChevron extends React.Component {\n render() {\n const FoldDownChevron = `\n\n\t\n\n`;\n return (\n \n );\n }\n}\n\nexport default FoldDownChevron;\n","import React from 'react';\n\nimport Tempo from './Tempo';\nimport Styles from './Styles';\nimport Keywords from './Keywords';\nimport FoldDownChevron from 'styles/svg-components/FoldDownChevron.js';\nimport Download from 'styles/svg-components/Download.js';\nimport { API } from '../../constants';\nimport { connect } from 'react-redux';\n\nclass Categories extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n foldOpen: false,\n };\n\n this.isTrustedUser = sessionStorage.getItem('is_trusted') === 'true';\n this.trustedUserName = sessionStorage.getItem('trusted_name');\n this.authToken = sessionStorage.getItem('auth_token');\n\n if ( this.props.adminBar.showRelevancy ) {\n this.isTrustedUser = true;\n this.trustedUserName = 'Music Vine Plugin';\n }\n\n this.onToggleFold = this.onToggleFold.bind(this);\n this.onDownloadUnwatermarked = this.onDownloadUnwatermarked.bind(this);\n }\n\n onToggleFold() {\n\n if ( this.state.foldOpen ) {\n this.setState({\n foldOpen: false,\n });\n } else {\n this.setState({\n foldOpen: true,\n });\n }\n\n }\n\n onDownloadUnwatermarked() {\n\n // TODO: Move this to ations\n fetch(`${API}tracks/${this.props.track.id}/watermarkfree`, {\n method: 'GET',\n headers: {\n 'X-Auth-Token': this.authToken,\n },\n })\n .then(\n (response) => response.json(),\n (error) => console.log('An error occured.', error)\n )\n .then((json) => {\n if (json.download_zip) {\n window.location = json.download_zip;\n }\n });\n\n\n }\n\n render() {\n const track = this.props.track;\n\n return (\n
\n
\n
\n
\n {track.track_tempo != '' &&\n \n }\n
\n
\n
\n Versions Included\n
\n
\n {this.props.versions}\n {this.props.versionsFold.length > 0 &&\n
\n
\n {this.props.versionsFold}\n
\n {/* The fold can only show when it has more than one entry, so the plural here is safe */}\n \n
\n }\n
\n
\n
\n {this.isTrustedUser && \n
\n
\n
\n
\n
\n \n
\n
\n
\n }\n
\n
\n
\n \n \n {track.keywords &&\n \n }\n
\n {/* Leave this in!! */}\n {/* {track.composer_name && */}\n {/**/}\n {/* }*/}\n\n {/* Leave this in!! */}\n {/* {track.publisher_name &&*/}\n {/* */}\n {/* }*/}\n
\n
\n
\n
\n );\n }\n}\n\n// Map redux actions to local props.\nconst mapDispatchToProps = (dispatch) => ({\n toggleRelevancy: () => {\n dispatch(toggleRelevancy());\n },\n});\n\n// Map redux states to local props.\nconst mapStateToProps = (state) => ({\n adminBar: state.get('adminBar'),\n});\n\n// Wrap the component to inject dispatch and state into it\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(Categories);\n","import _ from 'lodash';\nimport $ from 'jquery';\nimport React from 'react';\nimport Helmet from 'react-helmet';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport WaveSurfer from 'wavesurfer.js';\n\n// Actions.\nimport { addLicense } from '../../actions/licenseAction';\nimport { getTrackPageTitle, getTrackPageDesc, getCanonicalUrl } from '../../actions/pageMetaAction';\nimport { addModal } from '../../actions/authenticationAction';\nimport { fetchStyleMoods, fetchTrackStyles } from '../../actions/styleAction';\nimport { addPlaylist, downloadPreview, downloadPreviewTrackPage } from '../../actions/playerAction';\nimport { toggleFavouriteTrackVerion, addNewEngagement } from '../../actions/favouriteAction';\nimport { fetchTrack, fetchSimilarTracks, cancelSimilarTracksRequests, clearTracksState, unregisterComponent, claimTracksOwnership, releaseTracksOwnership } from '../../actions/trackAction';\nimport requestManager from '../../utils/requestManager';\nimport {\n playerActive,\n addActiveTrack,\n addTrackPageWave,\n playActiveTrack,\n flushTrackWave,\n addPrimaryTrack,\n pausedActiveTrack,\n setPlayerPosition,\n addTrackPageVersionWave,\n addVersionPrimaryTrack,\n setTrackPosition,\n} from '../../actions/footerPlayerAction';\nimport { loadEditData, clearEditData } from '../../actions/adminAction';\n// Styles.\nimport Pause from '../../styles/svg-components/Pause';\nimport AssetHeart from '../../styles/svg-components/AssetHeart';\nimport PauseVersion from '../../styles/svg-components/PauseVersion';\nimport AssetCartCircular from '../../styles/svg-components/AssetCartCircular';\nimport AssetCartSubscriptionLicense from '../../styles/svg-components/AssetCartSubscriptionLicense';\nimport AssetAddToPlaylist from '../../styles/svg-components/AssetAddToPlaylist';\nimport AssetPlaybackSingle from '../../styles/svg-components/AssetPlaybackSingle';\nimport AssetPreviewDownload from '../../styles/svg-components/AssetPreviewDownload';\nimport AssetPlayCircleSm from '../../styles/svg-components/PlayCircleSmTransparent';\n\n\n// Page Component.\nimport Versions from './Versions';\nimport A from '../../components/A';\nimport Breadcrumb from './Breadcrumb';\nimport Categories from './Categories';\nimport TrackPlayer from '../../components/TrackPlayer';\nimport SpinnerIcon from '../../styles/svg-components/SpinnerIcon';\nimport NormalisedScore from 'components/NormalisedScore';\nimport {getImgixUrl} from \"../../utils/helpers\";\n\nclass TrackPage extends React.Component {\n constructor(props) {\n super(props);\n this.componentId = requestManager.generateComponentId();\n this.state = {\n artistId: this.props.params.artistId,\n trackId: this.props.params.trackId,\n versionPlaying: false,\n track: {},\n moods: [],\n versionsData: false,\n styles: {},\n liveTrack: 1,\n isAudioReady: false,\n activeVersionId: null,\n };\n\n // Ref.\n this.waveFormContainer = React.createRef();\n\n // Bind class method's.\n this.buildWave = this.buildWave.bind(this);\n this.handleAddPlaylist = this.handleAddPlaylist.bind(this);\n this.handleVersionPlay = this.handleVersionPlay.bind(this);\n this.handleTrackPlayPause = this.handleTrackPlayPause.bind(this);\n this.userHasSubscription = this.userHasSubscription.bind(this);\n\n // Class property.\n this.waveSurfer = null;\n }\n\n // Lifecycle method.\n componentWillMount() {\n // Set player as null.\n // this.props.destroyPreviousPlayer();\n this.props.onClaimTracksOwnership(this.componentId, 'track-page');\n this.loadData(this.props.params.artistId, this.props.params.trackId);\n }\n\n componentWillUnmount() {\n this.props.onClearEditData();\n this.props.onCancelSimilarTracksRequests();\n this.props.onUnregisterComponent(this.componentId);\n this.props.onReleaseTracksOwnership(this.componentId);\n }\n\n userHasSubscription() {\n const subscriptionData = JSON.parse(sessionStorage.getItem('subscriptionData')) || {};\n return ((subscriptionData.isActive || this.props.subscriptionData.isActive)\n || (subscriptionData.isFreeTrial || this.props.subscriptionData.isFreeTrial));\n }\n\n // Lifecycle method.\n componentDidMount() {\n // Check for \"License Again\" option\n const search = this.props.location.search;\n const params = new URLSearchParams(search);\n const licenseagain = parseInt(params.get('licenseagain'));\n\n if ( !isNaN(licenseagain) ) {\n fetchTrack(this.state.artistId, this.state.trackId).then((data) => {\n if (data !== -1 && data && data.id === licenseagain) {\n this.props.onAddLicense(data);\n }\n }).catch((err) => err);\n }\n }\n componentWillReceiveProps(nextProps) {\n if (\n this.state.artistId !== nextProps.params.artistId\n || this.state.trackId !== nextProps.params.trackId\n ) {\n this.props.onCancelSimilarTracksRequests();\n this.props.onClaimTracksOwnership(this.componentId, 'track-page');\n this.setState({\n artistId: nextProps.params.artistId,\n trackId: nextProps.params.trackId,\n isLoading: true\n });\n this.loadData(nextProps.params.artistId, nextProps.params.trackId);\n }\n }\n // Load track data.\n loadData(artistId, trackId) {\n const { activeTrack } = this.props.footerPlayer;\n // Load track data.\n fetchTrack(artistId, trackId).then((data) => {\n // If track not available.\n if (!data || (data === -1)) {\n return this.setState({\n liveTrack: data === -1 ? -1 : 0,\n });\n }\n\n this.props.onLoadEditData({\n type: 'track',\n id: data.id,\n name: data.name\n });\n\n if ( this.props.params.trackId != data.slug && data.slug ) {\n // Change url\n this.props.router.push(`/track/${data.artist.slug}/${data.slug}`);\n }\n\n if (data.track_version) {\n data.track_version = _.orderBy(data.track_version, ['version_type.id', 'version_description'], ['asc']);\n }\n\n this.setState({ track: data, liveTrack: 1 });\n const { track_version } = data;\n const activeCurrentVersion = _.find(track_version, ['id', activeTrack.versionID]);\n const getVersionIndex = _.findIndex(track_version, ['id', activeTrack.versionID]);\n if (!_.isEmpty(activeCurrentVersion)) {\n const checkedVersion = activeCurrentVersion.version_type.name === 'Main Version';\n if (checkedVersion) {\n this.buildWave(data);\n } else {\n this.buildVersionWave(activeCurrentVersion, getVersionIndex, true);\n }\n } else {\n this.buildWave(data);\n }\n\n // fetch styles.\n fetchTrackStyles(data.id).then((data) => {\n this.setState({ styles: data });\n }).catch((err) => err);\n\n // Fetch moods.\n fetchStyleMoods(data.id).then((data) => {\n this.setState({ moods: data });\n }).catch((err) => err);\n\n\n }).catch((err) => err);\n\n // No idea?\n this.props.flushTrackWave();\n this.props.onFetchSimilarTracks(artistId, trackId, this.componentId);\n }\n\n // Build waveform.\n buildWave(track) {\n // Destroy if previous wavesurfer exists.\n this.wavesurfer && this.wavesurfer.destroy();\n const wavesurfer = WaveSurfer.create({\n container: this.waveFormContainer.current,\n backend: 'MediaElement',\n mediaType: 'audio',\n normalize: true,\n waveColor: 'rgba(185,185,185,0.6)',\n progressColor: '#ffffff',\n cursorColor: '#3a7676',\n cursorWidth: 0,\n height: 180,\n hideScrollbar: true,\n });\n\n const audioPeaks = (track.track_url.waveform_json && JSON.parse(track.track_url.waveform_json)) || [];\n const audioDuration = track.precise_duration ? track.precise_duration : track.duration;\n\n wavesurfer.backend.setPeaks(audioPeaks || null, audioDuration);\n wavesurfer.drawBuffer();\n\n this.wavesurfer = wavesurfer;\n const mainVersionID = this.getMainVersion(track.track_version);\n this.handleWaveFormSeek(mainVersionID, 0);\n this.props.addTrackPageWave({\n ...track,\n trackId: track.id,\n versionId: mainVersionID,\n versionIndex: 0,\n trackPage: true,\n track_version: _.map(track.track_version, (version, versionIndex) => {\n if (versionIndex === 0) {\n return {\n ...version,\n wavesurfer,\n };\n }\n return {\n ...version,\n };\n }),\n wavesurfer,\n });\n }\n\n // Version wave.\n buildVersionWave(version, versionIndex, newVersion = false) {\n // Destroy if previous wavesurfer exists.\n const { track } = this.state;\n this.wavesurfer && this.wavesurfer.destroy();\n const wavesurfer = WaveSurfer.create({\n container: this.waveFormContainer.current,\n backend: 'MediaElement',\n mediaType: 'audio',\n normalize: true,\n waveColor: 'rgba(185,185,185,0.6)',\n progressColor: '#ffffff',\n cursorColor: '#3a7676',\n cursorWidth: 0,\n height: 180,\n hideScrollbar: true,\n });\n\n const audioPeaks = (version.waveform_json && JSON.parse(version.waveform_json)) || [];\n const audioDuration = version.version_precise_length ? version.version_precise_length : version.version_length;\n\n wavesurfer.backend.setPeaks(audioPeaks, audioDuration);\n wavesurfer.drawBuffer();\n\n this.wavesurfer = wavesurfer;\n if (newVersion) {\n this.props.addTrackPageWave({\n ...track,\n trackId: track.id,\n versionId: version.id,\n versionIndex: 0,\n trackPage: true,\n track_version: _.map(track.track_version, (values) => {\n if (values.id === version.id) {\n return {\n ...values,\n wavesurfer,\n };\n }\n return {\n ...values,\n };\n }),\n wavesurfer,\n });\n } else {\n this.props.addVersionTrackWave({\n ...version,\n trackId: track.id,\n versionId: version.id,\n versionIndex,\n trackIndex: 0,\n trackPage: true,\n wavesurfer: this.wavesurfer,\n });\n }\n this.handleWaveFormSeek(version.id, versionIndex);\n }\n\n handleWaveFormSeek(versionId, versionIndex) {\n const { track } = this.state;\n if (this.wavesurfer === null) {\n return;\n }\n this.wavesurfer.on('seek', (pos) => {\n const { activeTrack, isAudioReady, playerTrack } = this.props.footerPlayer;\n const isActiveTrack = activeTrack;\n if (!isAudioReady) {\n if (_.isEmpty(isActiveTrack)) {\n // this.props.setPlayerPosition(pos);\n // this.setActiveTrackPosition(track, track.id, versionId, track.current_context.id, 0, versionIndex, pos);\n this.props.setTrackPosition({\n position: pos,\n activeTrack: {\n trackID: track.id,\n versionID: versionId,\n currentContext: track.current_context.id,\n isAudioReady: false,\n position: pos,\n },\n primaryTrack: {\n ...track,\n trackId: track.id,\n versionId,\n trackIndex: 0,\n versionIndex,\n wavesurfer: this.waveSurfer,\n },\n });\n this.props.setCurrentTrack({\n trackID: track.id,\n versionID: versionId,\n });\n this.props.setPlaying(track.id, track.current_context.id, versionId);\n this.props.playActiveTrack();\n this.props.playerActive();\n } else if (isActiveTrack.trackID === track.id && isActiveTrack.versionID === versionId) {\n this.props.setPlayerPosition(pos);\n }\n } else if (!_.isEmpty(isActiveTrack)) {\n if (isActiveTrack.isAudioReady && isActiveTrack.trackID === track.id && isActiveTrack.versionID === versionId) {\n this.props.setPlayerPosition(pos);\n const { wavesurfer } = playerTrack;\n if (!_.isEmpty(wavesurfer)) {\n if (!wavesurfer.isPlaying() && !isActiveTrack.playing) {\n wavesurfer.play();\n this.props.setPlaying(track.id, track.current_context.id, versionId);\n this.props.playActiveTrack();\n }\n }\n } else if (isActiveTrack.isAudioReady && isActiveTrack.trackID !== track.id && isActiveTrack.versionID !== versionId) {\n const { wavesurfer } = playerTrack;\n if (!_.isEmpty(wavesurfer)) {\n wavesurfer.pause();\n }\n this.props.setTrackPosition({\n position: pos,\n activeTrack: {\n trackID: track.id,\n versionID: versionId,\n currentContext: track.current_context.id,\n isAudioReady: false,\n position: pos,\n },\n primaryTrack: {\n ...track,\n trackId: track.id,\n versionId,\n trackIndex: 0,\n versionIndex,\n wavesurfer: this.waveSurfer,\n },\n });\n this.props.setCurrentTrack({\n trackID: track.id,\n versionID: versionId,\n });\n if (!isActiveTrack.playing) {\n this.props.setPlaying(track.id, track.current_context.id, versionId);\n this.props.playActiveTrack();\n }\n }\n }\n });\n }\n setActiveTrackPosition(track, trackId, mainVersionId, currentContextId, trackIndex, versionIndex, position) {\n this.props.setCurrentTrack({\n trackID: trackId,\n versionID: mainVersionId,\n });\n this.props.addActiveTrack({\n trackID: trackId,\n versionID: mainVersionId,\n currentContext: currentContextId,\n isAudioReady: false,\n position,\n });\n this.props.addPrimaryTrack({\n ...track,\n trackId,\n versionId: mainVersionId,\n trackIndex,\n versionIndex,\n wavesurfer: this.waveSurfer,\n });\n }\n handleAddPlaylist(event) {\n let versionId = event.currentTarget.getAttribute('data-version');\n\n versionId = parseInt(versionId);\n\n if ( isNaN(versionId) ) {\n versionId = false;\n }\n\n this.props.onAddPlaylist(this.state.track, versionId);\n }\n\n handleToggleFavorite(versionID, contextID) {\n if (!sessionStorage.getItem('auth_token')) {\n return this.props.showSignUpModal();\n }\n // Favorite action.\n this.props.onToggleFavourite(versionID, contextID);\n return false;\n }\n\n handleDownloadVersionPreview(index, versionId) {\n this.props.onDownloadVersionPreview(index, versionId);\n }\n\n handleVersionPlay(index, versionId) {\n const { player } = this.props;\n const { track } = this.state;\n const version = this.getVersionByID(this.state.track.track_version, versionId);\n this.setState({\n activeVersionId: versionId,\n });\n // Set status to playing.\n if (player.currentTrack.trackID === track.id && versionId === player.currentTrack.versionID) {\n const { playerTrack } = this.props.footerPlayer;\n const { wavesurfer } = playerTrack;\n if (!player.isPlaying) {\n if (!_.isEmpty(wavesurfer)) {\n if (!wavesurfer.isDestroyed) {\n wavesurfer.play();\n }\n }\n this.props.setPlaying(track.id, track.current_context.id, versionId);\n this.props.playActiveTrack();\n } else {\n if (!_.isEmpty(wavesurfer)) {\n wavesurfer.pause();\n }\n this.props.setPause();\n this.props.pausedActiveTrack();\n }\n return false;\n }\n this.buildVersionWave(version, index);\n this.props.setCurrentTrack({\n versionID: versionId,\n trackID: this.state.track.id,\n });\n this.props.addActiveTrack({\n trackID: track.id,\n versionID: versionId,\n currentContext: track.current_context.id,\n isAudioReady: false,\n });\n this.props.addVersionPrimaryTrack({\n ...track,\n trackId: track.id,\n versionId,\n trackIndex: 0,\n versionIndex: index,\n });\n\n this.props.setPlayerPosition(0);\n this.props.playActiveTrack();\n this.props.setPlaying(track.id, track.current_context.id, versionId);\n this.props.playerActive();\n return false;\n }\n\n // Play/Pause track.\n handleTrackPlayPause() {\n const { track, activeVersionId } = this.state;\n const mainVersionId = activeVersionId || this.getMainVersion(track.track_version);\n if (this.wavesurfer === null) {\n return false;\n }\n // Set status to playing.\n if (this.props.player.currentTrack.trackID === track.id && this.props.player.currentTrack.versionID === mainVersionId) {\n const { playerTrack } = this.props.footerPlayer;\n const { wavesurfer } = playerTrack;\n if (!this.props.player.isPlaying) {\n if (!_.isEmpty(wavesurfer)) {\n wavesurfer.play();\n }\n this.props.setPlaying(track.id, track.current_context.id, mainVersionId);\n this.props.playActiveTrack();\n } else {\n if (!_.isEmpty(wavesurfer)) {\n wavesurfer.pause();\n }\n this.props.setPause();\n this.props.pausedActiveTrack();\n }\n return false;\n }\n this.props.setCurrentTrack({\n trackID: track.id,\n versionID: mainVersionId,\n });\n this.props.addActiveTrack({\n trackID: track.id,\n versionID: mainVersionId,\n currentContext: track.current_context.id,\n isAudioReady: false,\n });\n this.props.addPrimaryTrack({\n ...track,\n trackId: track.id,\n versionId: mainVersionId,\n trackIndex: 0,\n versionIndex: 0,\n wavesurfer: this.waveSurfer,\n });\n this.props.setPlaying(track.id, track.current_context.id, mainVersionId);\n this.props.setPlayerPosition(0);\n this.props.playActiveTrack();\n this.props.playerActive();\n return false;\n }\n\n // If any version of this track is playing.\n isCurrentTrack() {\n const { activeTrack } = this.props.footerPlayer;\n const { track } = this.state;\n return (activeTrack.trackID === track.id);\n }\n\n // Check if current track is playing.\n isActiveTrack(versionID) {\n if (versionID === undefined) {\n versionID = this.getMainVersion(this.state.track);\n }\n const { player } = this.props;\n const { track } = this.state;\n\n return (player.currentTrack.trackID === track.id) && (player.currentTrack.versionID === versionID);\n }\n\n getVersionByID(versions, versionID) {\n let version = null;\n versions.forEach((v) => {\n if (v.id === versionID) {\n version = v;\n }\n });\n\n return version;\n }\n\n getMainVersion(versions) {\n // Return null if not array.\n if (!Array.isArray(versions)) {\n return null;\n }\n\n let mainVersion = null;\n versions.forEach((version, index) => {\n if (version.version_type && version.version_type.name === 'Main Version') {\n mainVersion = version.id;\n }\n });\n\n return mainVersion;\n }\n\n render() {\n const versions = [];\n const versionsFold = [];\n const track = this.state.track;\n const versionsFoldCutoff = 5; // The point where we start to hide versions\n const versionsFoldDisplayMinimum = 2; // The minimum number of tracks that can be hidden by a fold\n let artist = null;\n let currentContext = null;\n let breadcrumb = null;\n let avatarImage = null;\n let avatarAlt = null;\n let heroStyle = null;\n let artistButton = null;\n let artistThumb = null;\n let artistLink = null;\n\n if (this.state.track.artist) {\n artist = this.state.track.artist;\n currentContext = track.current_context.id;\n }\n\n if (artist) {\n breadcrumb = ;\n }\n\n if (artist && artist.avatar_image) {\n avatarImage = artist.avatar_image.image_aws_url;\n avatarAlt = artist.name;\n }\n\n if (artist && artist.header_image) {\n heroStyle = {\n backgroundImage: `url(${ getImgixUrl(artist.header_image.image_aws_url, \"?auto=compress\") })`,\n backgroundPosition: 'center',\n backgroundSize: 'cover'\n };\n }\n\n if (artist) {\n artistButton = Browse Artist Portfolio;\n artistThumb = {avatarAlt};\n artistLink = {artist.name};\n breadcrumb = ;\n }\n\n // Get the main version ID for favouriting functionality\n const favouriteMainVersionId = this.getMainVersion(track.track_version);\n const { activeTrack } = this.props.footerPlayer;\n const isCurrentTrack = this.isCurrentTrack();\n\n // Play Button.\n let playButton = ;\n if (isCurrentTrack && activeTrack.playing) {\n if (activeTrack.isAudioReady) {\n playButton = ;\n } else {\n playButton = ;\n }\n }\n let favourite = '';\n const favouritesData = sessionStorage.getItem('favourites_data');\n if (favouriteMainVersionId && favouritesData && favouritesData.includes(String(favouriteMainVersionId))) {\n favourite = 'js-is-favourite-version';\n }\n\n\n // Version list.\n if (this.state.track.track_version) {\n this.state.track.track_version.forEach((version, index) => {\n let button = ;\n let versionFavourite = '';\n\n const versionFavouritesData = sessionStorage.getItem('favourites_data');\n if (version.id && versionFavouritesData && versionFavouritesData.includes(String(version.id))) {\n versionFavourite = 'js-is-favourite-version';\n }\n\n // Button State.\n if (activeTrack.playing && this.isActiveTrack(version.id)) {\n button = ;\n }\n\n if (version.version_preview_uri) {\n let versionRow = this.handleVersionPlay(index, version.id)}\n onDownloadVersionPreview={() => this.handleDownloadVersionPreview(this.state.track, version)}\n onToggleFavouriteTrackVerion={() => this.handleToggleFavorite(version.id, currentContext)}\n />\n\n if (index > versionsFoldCutoff && this.state.track.track_version.length > ( versionsFoldCutoff + versionsFoldDisplayMinimum ) ) {\n versionsFold.push(versionRow);\n } else {\n versions.push(versionRow);\n }\n }\n });\n }\n\n // Helmet component params.\n let pageMetaTitle = \"\";\n let pageMetaDesc = \"\";\n\n if (track && artist) {\n pageMetaTitle = getTrackPageTitle(track.name, artist.name);\n pageMetaDesc = getTrackPageDesc({\n track: track.name,\n artist: artist.name,\n styles: this.state.styles,\n moods: this.state.moods\n });\n }\n\n return (\n
\n\n {track.name && artist &&\n \n {pageMetaTitle}\n \n \n \n }\n\n {this.state.liveTrack === 1 &&\n
\n
\n
\n
\n
\n
\n
\n
\n {breadcrumb}\n
\n
\n
\n
\n
\n
\n
\n
\n }\n\n { (this.state.liveTrack === -1 || this.state.liveTrack === 0 ) &&\n
\n
\n

Sorry, this track is no longer available.

\n

If you need any assistance, please contact us.

\n
\n
\n }\n\n {this.state.liveTrack === 1 &&\n
\n
\n
\n

\n \n {this.state.track.is_explicit_lyrics ? 'E' : ''}\n Explicit Lyrics\n \n {track.name}\n {track.autoclear &&\n \n \n {\"\"}\n \n {/* tooltip */}\n

\n {'AutoClear available'}\n ?\n

\n
\n }\n

\n { this.state.track.featuring &&\n

{ `Feat. ${this.state.track.featuring}` }

\n }\n\n {artistLink}\n\n \n\n {track.description}\n
\n
this.props.onDownload(this.state.track, this.state.activeVersionId)}>\n addNewEngagement('preview', track.id, currentContext)} />\n
\n\n {/* Big play button. */}\n \n {playButton}\n \n
this.props.onAddLicense(this.state.track)}>\n { !this.userHasSubscription() &&\n \n }\n { this.userHasSubscription() &&\n \n }\n
\n
\n\n {/* Options */}\n
\n {artistThumb}\n {artistButton}\n
\n this.handleToggleFavorite(favouriteMainVersionId, currentContext)}\n >\n \n
\n
\n \n
\n
\n
\n
\n\n {/* Big waveform container */}\n
\n
\n
\n
\n
\n
\n }\n\n {/* Track information. */}\n {this.state.liveTrack !== -1 && this.state.liveTrack !== 0 &&\n \n }\n\n {/* Similar Tracks. */}\n { (this.state.liveTrack !== 0 && track.unlisted !== 1 ) &&\n \n }\n
\n );\n }\n}\n\n// Map redux state to local props.\nconst mapStateToProps = (state) => ({\n versions: state.get('versions'),\n player: state.get('player'),\n footerPlayer: state.get('footerPlayer'),\n subscriptionData: state.get('subscriptionData'),\n});\n\n// Map redux actions to local props.\nconst mapDispatchToProps = (dispatch) => ({\n onTrackPlay: (trackIndex, trackId, contextId, versionId) => {\n const ID = parseInt(trackId);\n // dispatch(addActiveTrack({ trackIndex, trackId: ID, contextId, versionId }));\n // dispatch(addPrimaryTrack(primaryTrack));\n },\n flushTrackWave: () => dispatch(flushTrackWave()),\n onFetchSimilarTracks: (artist, track, componentId) => {\n dispatch(fetchSimilarTracks(artist, track, componentId));\n },\n\n onCancelSimilarTracksRequests: () => {\n dispatch(cancelSimilarTracksRequests());\n },\n\n onClearTracksState: () => {\n dispatch(clearTracksState());\n },\n\n onUnregisterComponent: (componentId) => {\n dispatch(unregisterComponent(componentId));\n },\n\n onClaimTracksOwnership: (ownerId, ownerType) => {\n dispatch(claimTracksOwnership(ownerId, ownerType));\n },\n\n onReleaseTracksOwnership: (ownerId) => {\n dispatch(releaseTracksOwnership(ownerId));\n },\n\n onAddPlaylist: (track, version) => {\n dispatch(addPlaylist(track, version));\n },\n\n onAddLicense: (track) => {\n dispatch(addLicense(track));\n $('.modal-overlay').addClass('active');\n },\n\n onAddNewEngagement: (type, trackId, contextId) => {\n addNewEngagement(type, trackId, contextId);\n },\n\n onDownload: (primaryTrack, versionId) => {\n\n let versionData = null;\n primaryTrack.track_version.forEach((v) => {\n if (v.id === versionId) {\n versionData = v;\n }\n });\n\n dispatch(downloadPreviewTrackPage(primaryTrack, versionData));\n $('body').addClass('modal-overlay-active');\n },\n onDownloadVersionPreview: (primaryTrack, version) => {\n dispatch(downloadPreview(primaryTrack, version));\n },\n\n onToggleFavourite: (track, version) => {\n dispatch(toggleFavouriteTrackVerion(track, version));\n },\n\n onLoadEditData: (editData) => {\n dispatch(loadEditData(editData));\n },\n\n onClearEditData: () => {\n dispatch(clearEditData());\n },\n\n showSignUpModal: () => {\n dispatch(addModal('playSignup', 'add_favourite'));\n },\n\n setPlaying: (trackId, contextId, versionId) => {\n dispatch({ type: 'PLAYER_SET_PLAYING', engagementInfo: { trackId, contextId, versionId } });\n },\n\n setPause: () => dispatch({\n type: 'PLAYER_SET_PAUSE',\n }),\n\n setCurrentTrack: (track) => dispatch({\n type: 'PLAYER_CURRENT_TRACK',\n currentTrack: track,\n }),\n\n destroyPreviousPlayer: () => dispatch({\n type: 'PLAYER_DESTROY',\n }),\n playerActive: () => dispatch(playerActive()),\n addActiveTrack: (track) => dispatch(addActiveTrack(track)),\n addPrimaryTrack: (track) => dispatch(addPrimaryTrack(track)),\n playActiveTrack: () => dispatch(playActiveTrack()),\n pausedActiveTrack: () => dispatch(pausedActiveTrack()),\n setPlayerPosition: (pos) => dispatch(setPlayerPosition(pos)),\n addTrackPageWave: (track) => dispatch(addTrackPageWave(track)),\n addVersionTrackWave: (version) => dispatch(addTrackPageVersionWave(version)),\n addVersionPrimaryTrack: (version) => dispatch(addVersionPrimaryTrack(version)),\n setTrackPosition: (track) => dispatch(setTrackPosition(track)),\n});\n\n// Wrap the component to inject dispatch and state into it\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(TrackPage);\n","export function getPageTitle(title, fallback, type) {\n let separator = \"•\";\n let start = fallback;\n let middle = \"\";\n let end = \"Music Vine\";\n\n if (title && title !== \"\") {\n return title;\n }\n\n if (fallback === undefined || fallback === \"\") {\n return \"\";\n }\n\n switch (type) {\n case 'artist':\n middle = 'Production Music Licensing';\n break;\n case 'collection':\n middle = 'Music For Video';\n break;\n case 'style':\n case 'track':\n middle = 'Music Licensing';\n break;\n case 'general':\n middle = 'Music Licensing';\n break;\n default:\n middle = 'Music Licensing For Video And Film';\n }\n\n return `${start} ${separator} ${middle} ${separator} ${end}`;\n}\n\nexport function getPageDesc(desc, fallback, type) {\n let metaDesc = \"\";\n\n if (desc && desc !== \"\") {\n return desc;\n }\n\n if (fallback === undefined || fallback === \"\") {\n return \"\";\n }\n\n switch (type) {\n case 'collection':\n if (fallback && fallback.desc && fallback.name) {\n metaDesc = `${fallback.desc} Explore '${fallback.name}' on Music Vine.`;\n } else if (fallback && fallback.name) {\n metaDesc = `Browse and license tracks from the ${fallback.name} collection — production music for film, TV and video from Music Vine.`;\n }\n break;\n case 'style':\n if (fallback && fallback.name) {\n metaDesc = `Browse and license ${fallback.name} music for film, TV and video productions — production music from Music Vine's world-class catalog.`;\n }\n break;\n case 'artist':\n if (fallback && fallback.name) {\n metaDesc = `License music from ${fallback.name} on Music Vine — production music for film, TV and video from world-class artists and composers.`;\n }\n break;\n case 'track':\n if (fallback && fallback.name) {\n metaDesc = `License ${fallback.name} on Music Vine — production music for film, TV and video.`;\n }\n break;\n case 'general':\n if (fallback.subtitle) {\n metaDesc = `${fallback.name}. ${fallback.subtitle}`;\n } else {\n metaDesc = fallback.name;\n }\n break;\n default:\n metaDesc = '';\n }\n\n return metaDesc;\n}\n\n// Canonical URLs always point at the production origin (never staging/preview),\n// and drop any query string / hash so faceted variants fold to the base path.\nexport function getCanonicalUrl(path) {\n const origin = \"https://musicvine.com\";\n if (!path || path === \"\") {\n return `${origin}/`;\n }\n let clean = path.split(\"?\")[0].split(\"#\")[0];\n if (clean.charAt(0) !== \"/\") {\n clean = `/${clean}`;\n }\n if (clean.length > 1) {\n clean = clean.replace(/\\/+$/, \"\");\n }\n return `${origin}${clean}`;\n}\n\nexport function getTrackPageTitle(trackName, artistName) {\n let pageTitle = \"\";\n if (trackName && artistName) {\n pageTitle = `${trackName} by ${artistName} • Music Licensing • Music Vine`;\n }\n return pageTitle;\n}\n\nexport function getGeneralPageTitle(start, middle, fallback, is404) {\n let pageTitle = \"\";\n\n if (is404) {\n return \"Page not found • Music Vine\";\n }\n\n if (start) {\n pageTitle = start;\n }\n if (middle) {\n pageTitle += ` • ${middle}`\n }\n if (pageTitle === \"\") {\n if (fallback && fallback !== \"\") {\n pageTitle = `${fallback} • Music Licensing`;\n } else {\n return \"\";\n }\n }\n\n pageTitle += \" • Music Vine\";\n\n return pageTitle;\n}\n\nexport function getTrackPageDesc(data) {\n let metaDesc = \"\";\n\n let styles = getTags(data.styles, 2);\n let moods = getTags(data.moods, 2, styles);\n\n // Listen to this [Mood 1] and [Mood 2] track from [Artist] that's perfect for [Style 1] and [Style 2] productions. License [Track Name] now.\n \n metaDesc = `Listen to this ${moods[0]} and ${moods[1]} track from ${data.artist} that's perfect for ${styles[0]} and ${styles[1]} productions. License ${data.track} now.`;\n\n // If any tag/field came back undefined, fall back to a simpler description\n // rather than shipping an empty meta description.\n if (metaDesc.includes(\"undefined\")) {\n if (data.track && data.artist) {\n metaDesc = `License '${data.track}' by ${data.artist} on Music Vine — production music for film, TV and video.`;\n } else {\n metaDesc = \"\";\n }\n }\n\n return metaDesc;\n}\n\nfunction getTags(allTags, max, checkPrev){\n let tags = [];\n let newTag = false;\n\n for (var tag in allTags) {\n for (var subtag in allTags[tag]) {\n newTag = allTags[tag][subtag][0];\n\n if (checkPrev) {\n if (!checkPrev.includes(newTag)) {\n tags.push(newTag);\n }\n } else {\n tags.push(newTag);\n }\n\n if (tags.length >= max) {\n break;\n }\n }\n\n if (tags.length >= max) {\n break;\n }\n }\n\n return tags;\n}","import fetch from 'isomorphic-fetch';\nimport Config, {\n API,\n} from '../constants';\nimport {conditionallyGetCdnApi} from \"./generalAction\";\n\nexport function fetchStyle(styleId) {\n return fetch(`${conditionallyGetCdnApi()}styles/${styleId}`, {\n method: 'GET',\n // mode: 'CORS',\n }).then((res) => res.json())\n .catch((err) => err);\n}\n\nexport function fetchCategoryStyles(id) {\n return fetch(`${conditionallyGetCdnApi()}styles/${id}/category`, {\n method: 'GET',\n // mode: 'CORS',\n }).then((res) => res.json())\n .catch((err) => err);\n}\n\nexport function fetchTrackStyles(trackId) {\n return fetch(`${conditionallyGetCdnApi()}styles/${trackId}/track`, {\n method: 'GET',\n }).then((res) => res.json())\n .catch((err) => err);\n}\n\nexport function fetchPopularStyles() {\n return fetch(`${conditionallyGetCdnApi()}styles/1/popular`, {\n method: 'GET',\n // mode: 'CORS',\n }).then((res) => res.json())\n .catch((err) => err);\n}\n\nexport function fetchStyleMoods(trackId) {\n return fetch(`${conditionallyGetCdnApi()}styles/${trackId}/moods`, {\n method: 'GET',\n // mode: 'CORS',\n }).then((res) => res.json())\n .catch((err) => err);\n}\n\nexport function fetchAllStyles() {\n return function (dispatch) {\n return fetch(`${conditionallyGetCdnApi()}styles`, {\n method: 'GET',\n // mode: 'CORS',\n })\n .then(\n (response) => response.json(),\n (error) => console.log('An error occured.', error)\n )\n .then((json) => {\n dispatch(receiveStyles(json));\n }\n );\n };\n}\n\nfunction receiveStyles(styles) {\n if (styles) {\n return { type: 'ADD_STYLES', styles };\n }\n}\n\n"],"sourceRoot":""}