1
0
Fork 0
mirror of https://github.com/lidarr/Lidarr synced 2025-02-27 08:12:48 +00:00
Lidarr/frontend/src/EpisodeFile/Editor/EpisodeFileEditorModalContentConnector.js
2017-09-05 23:00:26 -04:00

162 lines
4.5 KiB
JavaScript

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';
import { deleteEpisodeFiles, updateEpisodeFiles } from 'Store/Actions/episodeFileActions';
import { fetchLanguageProfileSchema, fetchQualityProfileSchema } from 'Store/Actions/settingsActions';
import EpisodeFileEditorModalContent from './EpisodeFileEditorModalContent';
function createMapStateToProps() {
return createSelector(
(state, { seasonNumber }) => seasonNumber,
(state) => state.episodes,
(state) => state.episodeFiles,
(state) => state.settings.languageProfiles.schema,
(state) => state.settings.qualityProfiles.schema,
createArtistSelector(),
(
seasonNumber,
episodes,
episodeFiles,
languageProfilesSchema,
qualityProfileSchema,
series
) => {
const filtered = _.filter(episodes.items, (episode) => {
if (seasonNumber >= 0 && episode.seasonNumber !== seasonNumber) {
return false;
}
if (!episode.episodeFileId) {
return false;
}
return _.some(episodeFiles.items, { id: episode.episodeFileId });
});
const sorted = _.orderBy(filtered, ['seasonNumber', 'episodeNumber'], ['desc', 'desc']);
const items = _.map(sorted, (episode) => {
const episodeFile = _.find(episodeFiles.items, { id: episode.episodeFileId });
return {
relativePath: episodeFile.relativePath,
language: episodeFile.language,
quality: episodeFile.quality,
...episode
};
});
const languages = _.map(languageProfilesSchema.languages, 'language');
const qualities = _.map(qualityProfileSchema.items, 'quality');
return {
items,
seriesType: series.seriesType,
isDeleting: episodeFiles.isDeleting,
isSaving: episodeFiles.isSaving,
languages,
qualities
};
}
);
}
function createMapDispatchToProps(dispatch, props) {
return {
dispatchFetchLanguageProfileSchema(name, path) {
dispatch(fetchLanguageProfileSchema());
},
dispatchFetchQualityProfileSchema(name, path) {
dispatch(fetchQualityProfileSchema());
},
dispatchUpdateEpisodeFiles(updateProps) {
dispatch(updateEpisodeFiles(updateProps));
},
onDeletePress(episodeFileIds) {
dispatch(deleteEpisodeFiles({ episodeFileIds }));
},
onQualityChange(episodeFileIds, qualityId) {
const quality = {
quality: _.find(this.props.qualities, { id: qualityId }),
revision: {
version: 1,
real: 0
}
};
dispatch(updateEpisodeFiles({ episodeFileIds, quality }));
}
};
}
class EpisodeFileEditorModalContentConnector extends Component {
//
// Lifecycle
componentDidMount() {
this.props.dispatchFetchLanguageProfileSchema();
this.props.dispatchFetchQualityProfileSchema();
}
//
// Render
//
// Listeners
onLanguageChange = (episodeFileIds, languageId) => {
const language = _.find(this.props.languages, { id: languageId });
this.props.dispatchUpdateEpisodeFiles({ episodeFileIds, language });
}
onQualityChange = (episodeFileIds, qualityId) => {
const quality = {
quality: _.find(this.props.qualities, { id: qualityId }),
revision: {
version: 1,
real: 0
}
};
this.props.dispatchUpdateEpisodeFiles({ episodeFileIds, quality });
}
render() {
const {
dispatchFetchLanguageProfileSchema,
dispatchFetchQualityProfileSchema,
dispatchUpdateEpisodeFiles,
...otherProps
} = this.props;
return (
<EpisodeFileEditorModalContent
{...otherProps}
onLanguageChange={this.onLanguageChange}
onQualityChange={this.onQualityChange}
/>
);
}
}
EpisodeFileEditorModalContentConnector.propTypes = {
artistId: PropTypes.number.isRequired,
seasonNumber: PropTypes.number,
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
qualities: PropTypes.arrayOf(PropTypes.object).isRequired,
dispatchFetchLanguageProfileSchema: PropTypes.func.isRequired,
dispatchFetchQualityProfileSchema: PropTypes.func.isRequired,
dispatchUpdateEpisodeFiles: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, createMapDispatchToProps)(EpisodeFileEditorModalContentConnector);