mirror of
https://github.com/scratchfoundation/scratch-www.git
synced 2024-11-28 18:17:12 -05:00
87 lines
3.7 KiB
JavaScript
87 lines
3.7 KiB
JavaScript
const connect = require('react-redux').connect;
|
|
|
|
const previewActions = require('../../redux/preview.js');
|
|
const AddToStudioModal = require('../../components/modal/addtostudio/container.jsx');
|
|
|
|
// user can add project to studio if studio is open to all, or user is a curator of studio
|
|
const canAdd = (studio, userIsCurator) => (
|
|
studio.open_to_all || userIsCurator
|
|
);
|
|
|
|
// user can remove project from studio if user owns project or is admin or user is a curator of studio
|
|
const canRemove = (userOwnsProject, isAdmin, userIsCurator) => (
|
|
userOwnsProject || isAdmin || userIsCurator
|
|
);
|
|
|
|
// include a given studio in the list to show in add to studio modal.
|
|
// only include it if user has the ability to remove the project from this studio.
|
|
const showStudio = (studio, currentStudioIds, userIsCurator, userOwnsProject, isAdmin) => {
|
|
const includesProject = (currentStudioIds.indexOf(studio.id) !== -1);
|
|
const canAddToThisStudio = canAdd(studio, userIsCurator);
|
|
const canRemoveFromThisStudio = canRemove(userOwnsProject, isAdmin, userIsCurator);
|
|
if (canRemoveFromThisStudio) { // power to remove matches set of studios we want to show
|
|
// include the current status of whether the project is in the studio,
|
|
// and what privileges the user has to change that.
|
|
const consolidatedStudio = Object.assign({}, studio, {
|
|
includesProject: includesProject,
|
|
canAdd: canAddToThisStudio,
|
|
canRemove: canRemoveFromThisStudio
|
|
});
|
|
return consolidatedStudio;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
// Build consolidated curatedStudios object from all studio info.
|
|
// We add flags to indicate whether the project is currently in the studio,
|
|
// and the status of requests to join/leave studios.
|
|
const consolidateStudiosInfo = (userOwnsProject, isAdmin, curatedStudios, projectStudios,
|
|
currentStudioIds, studioRequests) => {
|
|
|
|
const consolidatedStudios = [];
|
|
|
|
// for each studio the project is in, include it if user can add or remove project from it.
|
|
projectStudios.forEach(projectStudio => {
|
|
const userIsCurator = curatedStudios.some(curatedStudio => (curatedStudio.id === projectStudio.id));
|
|
const studioToShow = showStudio(projectStudio, currentStudioIds, userIsCurator, userOwnsProject, isAdmin);
|
|
if (studioToShow) {
|
|
consolidatedStudios.push(studioToShow);
|
|
}
|
|
});
|
|
|
|
// for each curated studio, if it was not already added to consolidatedStudios above, add it now.
|
|
curatedStudios.forEach(curatedStudio => {
|
|
if (!projectStudios.some(projectStudio => (projectStudio.id === curatedStudio.id))) {
|
|
const studioToShow = showStudio(curatedStudio, currentStudioIds, true, userOwnsProject, isAdmin);
|
|
if (studioToShow) {
|
|
consolidatedStudios.push(studioToShow);
|
|
}
|
|
}
|
|
});
|
|
|
|
// set studio state to hasRequestOutstanding==true if it's being fetched,
|
|
// false if it's not
|
|
consolidatedStudios.forEach(consolidatedStudio => {
|
|
const id = consolidatedStudio.id;
|
|
consolidatedStudio.hasRequestOutstanding =
|
|
((id in studioRequests) &&
|
|
(studioRequests[id] === previewActions.Status.FETCHING));
|
|
});
|
|
|
|
return consolidatedStudios;
|
|
};
|
|
|
|
const mapStateToProps = (state, ownProps) => ({
|
|
studios: consolidateStudiosInfo(ownProps.userOwnsProject, ownProps.isAdmin,
|
|
state.preview.curatedStudios, state.preview.projectStudios,
|
|
state.preview.currentStudioIds, state.preview.status.studioRequests)
|
|
});
|
|
|
|
const mapDispatchToProps = () => ({});
|
|
|
|
const ConnectedAddToStudioModal = connect(
|
|
mapStateToProps,
|
|
mapDispatchToProps
|
|
)(AddToStudioModal);
|
|
|
|
module.exports = ConnectedAddToStudioModal;
|