{"version":3,"sources":["containers/BrowseCollectionPage/CollectionInfo.js","containers/BrowseCollectionPage/Breadcrumb.js","containers/BrowseCollectionPage/index.js","actions/pageMetaAction.js","styles/svg-components/Twitter.js","styles/svg-components/Facebook.js","styles/svg-components/Email.js"],"names":["heroStyle","collection","header_image","backgroundImage","image_aws_url","backgroundPosition","backgroundSize","CollectionInfo","props","follow","bind","share","collectionId","this","id","url","API","authKey","sessionStorage","getItem","fetch","method","headers","credentials","then","response","ok","json","Error","data","status","setState","followingCollection","catch","error","$","find","body","show","hide","toggleClass","is","addFollow","addUnFollow","windowLocation","window","location","href","className","style","name","description","React","Component","Breadcrumb","A","to","slug","text","length","BrowseCollectionPage","componentId","requestManager","generateComponentId","state","params","fetchCollection","onLoadEditData","type","router","push","err","loadData","onSetAppliedFilters","query","onClaimTracksOwnership","addEventListener","onSetNotFiltered","nextProps","onFetchCollectionTracks","onClearEditData","onCancelRequestsByComponent","onUnregisterComponent","onReleaseTracksOwnership","energy","vocal","sort","duration","styleFilters","page","onClearTracksState","breadcrumb","hero","pageMetaTitle","getPageTitle","meta_title","pageMetaDesc","getPageDesc","meta_description","desc","short_description","Object","keys","content","rel","getCanonicalUrl","Browse","browseType","defaultSort","hideCollection","contextTypes","PropTypes","object","mapStateToProps","createStructuredSelector","connect","dispatch","fetchAllTracks","locationQuery","setAppliedFilters","setNotFiltered","editData","loadEditData","clearEditData","cancelRequestsByComponent","unregisterComponent","ownerType","claimTracksOwnership","releaseTracksOwnership","clearTracksState","title","fallback","start","middle","undefined","metaDesc","subtitle","path","origin","clean","split","charAt","replace","getTrackPageTitle","trackName","artistName","pageTitle","getGeneralPageTitle","is404","getTrackPageDesc","styles","getTags","moods","artist","track","includes","allTags","max","checkPrev","tags","newTag","tag","subtag","Twitter","src","Facebook","Email"],"mappings":"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","file":"static/js/43.chunk.js?hash=8773bcdf","sourcesContent":["import React from 'react';\nimport { Link } from 'react-router';\nimport Facebook from 'styles/svg-components/Facebook';\nimport Twitter from 'styles/svg-components/Twitter';\nimport Email from 'styles/svg-components/Email';\nimport {\n FacebookShareButton,\n TwitterShareButton,\n EmailShareButton,\n FacebookIcon,\n TwitterIcon,\n EmailIcon,\n} from 'react-share';\nimport fetch from \"isomorphic-fetch\";\nimport {API} from \"../../constants\";\n\nclass CollectionInfo extends React.Component {\n constructor(props) {\n super(props);\n\n this.follow = this.follow.bind(this);\n this.share = this.share.bind(this);\n }\n\n addFollow() {\n const collectionId = this.props.collection.id;\n // let collectionId = this.state.collection.id;\n\n const that = this;\n const url = `${API}collection/${collectionId}/follow`;\n\n const authKey = sessionStorage.getItem('auth_token');\n if (authKey) {\n fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Auth-Token': authKey,\n },\n credentials: 'same-origin',\n })\n .then((response) => {\n if (response.ok) {\n return response.json();\n }\n throw new Error('Something went wrong ...');\n })\n .then((data) => {\n if (data.status == 'success') {\n this.setState({\n followingCollection: true,\n });\n } else {\n this.setState({\n followingCollection: false,\n });\n }\n })\n .catch((error) => this.setState({\n followingCollection: false,\n }));\n }\n }\n\n addUnFollow() {\n const collectionId = this.props.collection.id;\n // let collectionId = this.state.collection.id;\n\n const that = this;\n const url = `${API}collection/${collectionId}/unfollow`;\n const authKey = sessionStorage.getItem('auth_token');\n if (authKey) {\n fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Auth-Token': authKey,\n },\n credentials: 'same-origin',\n })\n .then((response) => {\n if (response.ok) {\n return response.json();\n }\n throw new Error('Something went wrong ...');\n })\n .then((data) => {\n if (data.status == 'success') {\n this.setState({\n followingCollection: false,\n });\n } else {\n this.setState({\n followingCollection: true,\n });\n }\n })\n .catch((error) => this.setState({\n followingCollection: true,\n }));\n }\n }\n \n follow() {\n const follow = $('.hero__share-btn').find('button');\n const body = $('body');\n\n $('.hero__unfollow').show();\n $('.hero__follow').hide();\n body.toggleClass('social-following');\n\n if (body.is('.social-following')) {\n $('.hero__follow').hide();\n $('.hero__unfollow').show();\n this.addFollow();\n } else {\n $('.hero__unfollow').hide();\n $('.hero__follow').show();\n this.addUnFollow();\n }\n }\n share() {\n $('.hero__icons').find('.hero__icons--block').toggleClass('active');\n }\n render() {\n const windowLocation = window.location.href;\n const shareUrl = `${windowLocation}`;\n return (\n
\n
\n
\n
\n
Collection
\n

{this.props.collection.name}

\n\n {/* Share icons */}\n {/* DR - Commented out until following collections is implemented.*/}\n {/* Share icons work but just looked weird by themselves. */}\n \n {/*
\n
\n
\n \n
\n \n
\n
\n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n \n
\n \"\"\n
\n
\n
\n
\n \n
\n Get notified when we add tracks to this collection.\n
\n
\n
*/}\n\n

{this.props.collection.description}

\n

Curated by Music Vine

\n
\n
\n
\n
\n
\n
\n
\n
\n );\n }\n}\n\nfunction heroStyle(collection) {\n if (collection.header_image) {\n return { backgroundImage: `url(${collection.header_image.image_aws_url})`, backgroundPosition: 'center', backgroundSize: 'cover' };\n }\n return null;\n}\n\nexport default CollectionInfo;\n","import React from 'react';\nimport A from 'components/A';\nimport EllipsisText from 'react-ellipsis-text';\n\nconst Breadcrumb = ({ collection }) => (\n \n Collections\n \n \n);\n\nexport default Breadcrumb;\n","import React from \"react\";\nimport { withRouter } from \"react-router\";\nimport { connect } from \"react-redux\";\nimport Helmet from \"react-helmet\";\nimport PropTypes from \"prop-types\";\nimport { createStructuredSelector } from \"reselect\";\nimport { fetchCollection } from \"actions/collectionAction\";\nimport {\n fetchAllTracks,\n cancelRequestsByComponent,\n clearTracksState,\n unregisterComponent,\n claimTracksOwnership,\n releaseTracksOwnership,\n} from \"actions/trackAction\";\nimport requestManager from \"../../utils/requestManager\";\nimport Browse from \"containers/Browse\";\nimport CollectionInfo from \"./CollectionInfo\";\nimport Breadcrumb from \"./Breadcrumb\";\nimport { setAppliedFilters, setNotFiltered } from \"actions/browseAction\";\nimport { getPageTitle, getPageDesc, getCanonicalUrl } from \"../../actions/pageMetaAction\";\nimport { loadEditData, clearEditData } from \"../../actions/adminAction\";\n\nclass BrowseCollectionPage extends React.Component {\n constructor(props) {\n super(props);\n this.componentId = requestManager.generateComponentId();\n this.state = {\n collectionId: this.props.params.collectionId,\n collection: {},\n };\n fetchCollection(this.props.params.collectionId)\n .then((data) => {\n if (data) {\n this.setState({ collection: data });\n\n this.props.onLoadEditData({\n type: \"collection\",\n id: data.id,\n name: data.name,\n });\n\n if (this.props.params.collectionId != data.slug && data.slug) {\n // Change url\n this.props.router.push(`/browse/collection/${data.slug}`);\n }\n } else {\n window.location.href = \"/collections\";\n }\n })\n .catch((err) => err);\n\n this.loadData = this.loadData.bind(this);\n }\n\n componentWillMount() {\n this.props.onSetAppliedFilters(this.props.location.query);\n this.props.onClaimTracksOwnership(this.componentId, \"collection-page\");\n }\n componentDidMount() {\n window.addEventListener(\n \"popstate\",\n () => {\n this.props.onSetAppliedFilters(this.props.location.query);\n this.props.onSetNotFiltered();\n },\n false\n );\n }\n\n componentWillReceiveProps(nextProps) {\n const { params } = this.props;\n const { collectionId } = params;\n if (collectionId !== nextProps.params.collectionId) {\n fetchCollection(nextProps.params.collectionId)\n .then((data) => {\n this.setState({ collection: data });\n this.setState({ collectionId: data.slug });\n })\n .catch((err) => err);\n this.props.onFetchCollectionTracks(\n nextProps.params.collectionId,\n 0,\n 0,\n \"As Curated\",\n 0,\n [],\n 1,\n this.componentId\n );\n this.props.onSetAppliedFilters(this.props.location.query);\n this.props.onSetNotFiltered();\n }\n }\n\n componentWillUnmount() {\n this.props.onClearEditData();\n this.props.onCancelRequestsByComponent(this.componentId);\n this.props.onUnregisterComponent(this.componentId);\n this.props.onReleaseTracksOwnership(this.componentId);\n }\n\n loadData(energy, vocal, sort, duration, styleFilters, page) {\n // Cancel any in-flight requests from this component before starting new ones\n this.props.onCancelRequestsByComponent(this.componentId);\n // Clear tracks state to show loading indicator\n this.props.onClearTracksState();\n this.props.onFetchCollectionTracks(\n this.props.params.collectionId,\n energy,\n vocal,\n sort,\n duration,\n styleFilters,\n page,\n this.componentId\n );\n }\n\n render() {\n let breadcrumb = null;\n let hero = null;\n\n // Helmet component params.\n const pageMetaTitle = getPageTitle(\n this.state.collection.meta_title,\n this.state.collection.name,\n \"collection\"\n );\n const pageMetaDesc = getPageDesc(\n this.state.collection.meta_description,\n {\n name: this.state.collection.name,\n desc: this.state.collection.short_description,\n },\n \"collection\"\n );\n\n if (Object.keys(this.state.collection).length != 0) {\n hero = (\n \n );\n breadcrumb = ;\n }\n\n return (\n
\n \n {pageMetaTitle}\n \n \n \n {this.state.collection.name ? (\n

{this.state.collection.name}

\n ) : null}\n \n
\n );\n }\n}\n\nBrowseCollectionPage.contextTypes = {\n router: PropTypes.object,\n};\nBrowseCollectionPage.propTypes = {\n params: PropTypes.object,\n};\n\nconst mapDispatchToProps = (dispatch) => ({\n onFetchCollectionTracks: (\n collectionId,\n energy,\n vocal,\n sort,\n duration,\n styleFilters,\n page,\n componentId\n ) => {\n dispatch(\n fetchAllTracks(\n \"collection\",\n collectionId,\n energy,\n vocal,\n sort,\n duration,\n styleFilters,\n page,\n [],\n -1,\n false,\n componentId\n )\n );\n },\n onSetAppliedFilters: (locationQuery) => {\n dispatch(setAppliedFilters(locationQuery));\n },\n onSetNotFiltered: () => {\n dispatch(setNotFiltered());\n },\n onLoadEditData: (editData) => {\n dispatch(loadEditData(editData));\n },\n onClearEditData: () => {\n dispatch(clearEditData());\n },\n onCancelRequestsByComponent: (componentId) => {\n dispatch(cancelRequestsByComponent(componentId));\n },\n onUnregisterComponent: (componentId) => {\n dispatch(unregisterComponent(componentId));\n },\n onClaimTracksOwnership: (componentId, ownerType) => {\n dispatch(claimTracksOwnership(componentId, ownerType));\n },\n onReleaseTracksOwnership: (componentId) => {\n dispatch(releaseTracksOwnership(componentId));\n },\n onClearTracksState: () => {\n dispatch(clearTracksState());\n },\n});\n\nconst mapStateToProps = createStructuredSelector({});\n\n// Wrap the component to inject dispatch and state into it\nexport default connect(\n mapStateToProps,\n mapDispatchToProps\n)(BrowseCollectionPage);\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 React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass Twitter extends React.Component {\n render() {\n const assetTwitter = `\n \n `;\n\n return (\n \n );\n }\n}\n\nexport default Twitter;\n","import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass Facebook extends React.Component {\n render() {\n const assetFacebook = `\n`;\n return (\n \n );\n }\n}\n\nexport default Facebook;\n","import React from \"react\";\nimport InlineSVG from 'svg-inline-react';\n\nclass Email extends React.Component {\n render() {\n const assetEmail = ``;\n return (\n \n );\n }\n}\n\nexport default Email;\n"],"sourceRoot":""}