Lidarr/frontend/src/TrackFile/Editor/TrackFileEditorModalContent...

184 lines
4.9 KiB
JavaScript
Raw Normal View History

2017-10-07 06:21:06 +00:00
/* eslint max-params: 0 */
2017-09-04 02:20:56 +00:00
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createArtistSelector from 'Store/Selectors/createArtistSelector';
2017-09-25 02:58:13 +00:00
import { deleteTrackFiles, updateTrackFiles } from 'Store/Actions/trackFileActions';
import { fetchTracks, clearTracks } from 'Store/Actions/trackActions';
2017-09-04 02:20:56 +00:00
import { fetchLanguageProfileSchema, fetchQualityProfileSchema } from 'Store/Actions/settingsActions';
2017-09-25 02:58:13 +00:00
import TrackFileEditorModalContent from './TrackFileEditorModalContent';
2017-09-04 02:20:56 +00:00
function createMapStateToProps() {
return createSelector(
2017-09-25 02:58:13 +00:00
(state, { albumId }) => albumId,
(state) => state.tracks,
(state) => state.trackFiles,
2017-09-04 02:20:56 +00:00
(state) => state.settings.languageProfiles.schema,
(state) => state.settings.qualityProfiles.schema,
createArtistSelector(),
(
2017-09-25 02:58:13 +00:00
albumId,
tracks,
trackFiles,
2017-09-04 02:20:56 +00:00
languageProfilesSchema,
qualityProfileSchema,
series
) => {
2017-09-25 02:58:13 +00:00
const filtered = _.filter(tracks.items, (track) => {
if (albumId >= 0 && track.albumId !== albumId) {
2017-09-04 02:20:56 +00:00
return false;
}
2017-09-25 02:58:13 +00:00
if (!track.trackFileId) {
2017-09-04 02:20:56 +00:00
return false;
}
2017-09-25 02:58:13 +00:00
return _.some(trackFiles.items, { id: track.trackFileId });
2017-09-04 02:20:56 +00:00
});
2017-09-25 02:58:13 +00:00
const sorted = _.orderBy(filtered, ['albumId', 'trackNumber'], ['desc', 'asc']);
2017-09-04 02:20:56 +00:00
2017-09-25 02:58:13 +00:00
const items = _.map(sorted, (track) => {
const trackFile = _.find(trackFiles.items, { id: track.trackFileId });
2017-09-04 02:20:56 +00:00
return {
2017-09-25 02:58:13 +00:00
relativePath: trackFile.relativePath,
language: trackFile.language,
quality: trackFile.quality,
...track
2017-09-04 02:20:56 +00:00
};
});
const languages = _.map(languageProfilesSchema.languages, 'language');
const qualities = _.map(qualityProfileSchema.items, 'quality');
return {
items,
seriesType: series.seriesType,
2017-09-25 02:58:13 +00:00
isDeleting: trackFiles.isDeleting,
isSaving: trackFiles.isSaving,
2017-09-04 02:20:56 +00:00
languages,
qualities
};
}
);
}
function createMapDispatchToProps(dispatch, props) {
return {
2017-09-25 02:58:13 +00:00
dispatchClearTracks() {
dispatch(clearTracks());
},
dispatchFetchTracks(updateProps) {
dispatch(fetchTracks(updateProps));
},
2017-09-04 02:20:56 +00:00
dispatchFetchLanguageProfileSchema(name, path) {
dispatch(fetchLanguageProfileSchema());
},
dispatchFetchQualityProfileSchema(name, path) {
dispatch(fetchQualityProfileSchema());
},
2017-09-25 02:58:13 +00:00
dispatchUpdateTrackFiles(updateProps) {
dispatch(updateTrackFiles(updateProps));
2017-09-04 02:20:56 +00:00
},
2017-09-25 02:58:13 +00:00
onDeletePress(trackFileIds) {
dispatch(deleteTrackFiles({ trackFileIds }));
2017-09-04 02:20:56 +00:00
},
2017-09-25 02:58:13 +00:00
onQualityChange(trackFileIds, qualityId) {
2017-09-04 02:20:56 +00:00
const quality = {
quality: _.find(this.props.qualities, { id: qualityId }),
revision: {
version: 1,
real: 0
}
};
2017-09-25 02:58:13 +00:00
dispatch(updateTrackFiles({ trackFileIds, quality }));
2017-09-04 02:20:56 +00:00
}
};
}
2017-09-25 02:58:13 +00:00
class TrackFileEditorModalContentConnector extends Component {
2017-09-04 02:20:56 +00:00
//
// Lifecycle
componentDidMount() {
2017-09-25 02:58:13 +00:00
const artistId = this.props.artistId;
this.props.dispatchFetchTracks({ artistId });
2017-09-04 02:20:56 +00:00
this.props.dispatchFetchLanguageProfileSchema();
this.props.dispatchFetchQualityProfileSchema();
}
2017-09-25 02:58:13 +00:00
componentWillUnmount() {
this.props.dispatchClearTracks();
}
2017-09-04 02:20:56 +00:00
//
// Render
//
// Listeners
2017-09-25 02:58:13 +00:00
onLanguageChange = (trackFileIds, languageId) => {
2017-09-04 02:20:56 +00:00
const language = _.find(this.props.languages, { id: languageId });
2017-09-25 02:58:13 +00:00
this.props.dispatchUpdateTrackFiles({ trackFileIds, language });
2017-09-04 02:20:56 +00:00
}
2017-09-25 02:58:13 +00:00
onQualityChange = (trackFileIds, qualityId) => {
2017-09-04 02:20:56 +00:00
const quality = {
quality: _.find(this.props.qualities, { id: qualityId }),
revision: {
version: 1,
real: 0
}
};
2017-09-25 02:58:13 +00:00
this.props.dispatchUpdateTrackFiles({ trackFileIds, quality });
2017-09-04 02:20:56 +00:00
}
render() {
const {
dispatchFetchLanguageProfileSchema,
dispatchFetchQualityProfileSchema,
2017-09-25 02:58:13 +00:00
dispatchUpdateTrackFiles,
dispatchFetchTracks,
dispatchClearTracks,
2017-09-04 02:20:56 +00:00
...otherProps
} = this.props;
return (
2017-09-25 02:58:13 +00:00
<TrackFileEditorModalContent
2017-09-04 02:20:56 +00:00
{...otherProps}
onLanguageChange={this.onLanguageChange}
onQualityChange={this.onQualityChange}
/>
);
}
}
2017-09-25 02:58:13 +00:00
TrackFileEditorModalContentConnector.propTypes = {
2017-09-04 02:20:56 +00:00
artistId: PropTypes.number.isRequired,
2017-09-25 02:58:13 +00:00
albumId: PropTypes.number,
2017-09-04 02:20:56 +00:00
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
qualities: PropTypes.arrayOf(PropTypes.object).isRequired,
2017-09-25 02:58:13 +00:00
dispatchFetchTracks: PropTypes.func.isRequired,
dispatchClearTracks: PropTypes.func.isRequired,
2017-09-04 02:20:56 +00:00
dispatchFetchLanguageProfileSchema: PropTypes.func.isRequired,
dispatchFetchQualityProfileSchema: PropTypes.func.isRequired,
2017-09-25 02:58:13 +00:00
dispatchUpdateTrackFiles: PropTypes.func.isRequired
2017-09-04 02:20:56 +00:00
};
2017-09-25 02:58:13 +00:00
export default connect(createMapStateToProps, createMapDispatchToProps)(TrackFileEditorModalContentConnector);