Merge pull request #3493 from benjiwheeler/storage-remix-copy

send params in storage request body, so that remixing and saving as copy create links to original projects
This commit is contained in:
Benjamin Wheeler authored and GitHub committed 2018-10-30 20:30:54 -04:00
commit 92b438b7b7
3 files changed
+127 -24

No files matched your search

+52 -10
View File
@@ -9,7 +9,9 @@ import {
createProject,
doneCreatingProject,
doneUpdatingProject,
getIsCreating,
getIsCreatingCopy,
getIsCreatingNew,
getIsRemixing,
getIsShowingProject,
getIsShowingWithoutId,
getIsUpdating,
@@ -41,16 +43,41 @@ const ProjectSaverHOC = function (WrappedComponent) {
});
}
// TODO: distinguish between creating new, remixing, and saving as a copy
if (this.props.isCreating && !prevProps.isCreating) {
this.storeProject()
if (this.props.isCreatingNew && !prevProps.isCreatingNew) {
this.storeProject(null)
.then(response => {
this.props.onCreatedProject(response.id.toString(), this.props.loadingState);
})
.catch(err => {
// NOTE: should throw up a notice for user
this.props.onProjectError(`Creating a new project failed with error: ${err}`);
});
}
if (this.props.isCreatingCopy && !prevProps.isCreatingCopy) {
this.storeProject(null, {
original_id: this.props.reduxProjectId,
is_copy: 1,
title: this.props.reduxProjectTitle
})
.then(response => {
this.props.onCreatedProject(response.id.toString(), this.props.loadingState);
})
.catch(err => {
this.props.onProjectError(`Creating a project copy failed with error: ${err}`);
});
}
if (this.props.isRemixing && !prevProps.isRemixing) {
this.storeProject(null, {
original_id: this.props.reduxProjectId,
is_remix: 1,
title: this.props.reduxProjectTitle
})
.then(response => {
this.props.onCreatedProject(response.id.toString(), this.props.loadingState);
})
.catch(err => {
this.props.onProjectError(`Remixing a project failed with error: ${err}`);
});
}
// check if the project state, and user capabilities, have changed so as to indicate
// that we should create or update project
@@ -71,16 +98,22 @@ const ProjectSaverHOC = function (WrappedComponent) {
}
/**
* storeProject:
* @param {number|string|undefined} projectId defined value causes PUT/update; undefined causes POST/create
* @return {Promise} resolves with json object containing project's existing or new id
* @param {number|string|undefined} projectId - defined value will PUT/update; undefined/null will POST/create
* @return {Promise} - resolves with json object containing project's existing or new id
* @param {?object} requestParams - object of params to add to request body
*/
storeProject (projectId) {
storeProject (projectId, requestParams) {
return this.props.vm.saveProjectSb3()
.then(content => {
const assetType = storage.AssetType.Project;
const dataFormat = storage.DataFormat.SB3;
const body = new FormData();
body.append('sb3_file', content, 'sb3_file');
if (requestParams) {
for (const key in requestParams) {
body.append(key, requestParams[key]);
}
}
// when id is undefined or null, storage.store as we have
// configured it will create a new project with id
return storage.store(
@@ -94,7 +127,9 @@ const ProjectSaverHOC = function (WrappedComponent) {
render () {
const {
/* eslint-disable no-unused-vars */
isCreating: isCreatingProp,
isCreatingCopy: isCreatingCopyProp,
isCreatingNew: isCreatingNewProp,
isRemixing: isRemixingProp,
isShowingWithId: isShowingWithIdProp,
isShowingWithoutId: isShowingWithoutIdProp,
isUpdating: isUpdatingProp,
@@ -105,6 +140,7 @@ const ProjectSaverHOC = function (WrappedComponent) {
onUpdatedProject: onUpdatedProjectProp,
onUpdateProject: onUpdateProjectProp,
reduxProjectId,
reduxProjectTitle,
/* eslint-enable no-unused-vars */
...componentProps
} = this.props;
@@ -118,7 +154,9 @@ const ProjectSaverHOC = function (WrappedComponent) {
ProjectSaverComponent.propTypes = {
canCreateNew: PropTypes.bool,
canSave: PropTypes.bool,
isCreating: PropTypes.bool,
isCreatingCopy: PropTypes.bool,
isCreatingNew: PropTypes.bool,
isRemixing: PropTypes.bool,
isShowingWithId: PropTypes.bool,
isShowingWithoutId: PropTypes.bool,
isUpdating: PropTypes.bool,
@@ -129,17 +167,21 @@ const ProjectSaverHOC = function (WrappedComponent) {
onUpdateProject: PropTypes.func,
onUpdatedProject: PropTypes.func,
reduxProjectId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
reduxProjectTitle: PropTypes.string,
vm: PropTypes.instanceOf(VM).isRequired
};
const mapStateToProps = state => {
const loadingState = state.scratchGui.projectState.loadingState;
return {
isCreating: getIsCreating(loadingState),
isCreatingCopy: getIsCreatingCopy(loadingState),
isCreatingNew: getIsCreatingNew(loadingState),
isRemixing: getIsRemixing(loadingState),
isShowingWithId: getIsShowingProject(loadingState),
isShowingWithoutId: getIsShowingWithoutId(loadingState),
isUpdating: getIsUpdating(loadingState),
loadingState: loadingState,
reduxProjectId: state.scratchGui.projectState.projectId,
reduxProjectTitle: state.scratchGui.projectTitle,
vm: state.scratchGui.vm
};
};
+10 -4
View File
@@ -54,11 +54,15 @@ const getIsLoadingWithId = loadingState => (
loadingState === LoadingState.LOADING_VM_WITH_ID ||
loadingState === LoadingState.LOADING_VM_NEW_DEFAULT
);
const getIsCreating = loadingState => (
loadingState === LoadingState.CREATING_NEW ||
loadingState === LoadingState.REMIXING ||
const getIsCreatingNew = loadingState => (
loadingState === LoadingState.CREATING_NEW
);
const getIsCreatingCopy = loadingState => (
loadingState === LoadingState.CREATING_COPY
);
const getIsRemixing = loadingState => (
loadingState === LoadingState.REMIXING
);
const getIsUpdating = loadingState => (
loadingState === LoadingState.UPDATING ||
loadingState === LoadingState.UPDATING_BEFORE_NEW
@@ -405,11 +409,13 @@ export {
defaultProjectId,
doneCreatingProject,
doneUpdatingProject,
getIsCreating,
getIsCreatingCopy,
getIsCreatingNew,
getIsError,
getIsFetchingWithId,
getIsFetchingWithoutId,
getIsLoadingWithId,
getIsRemixing,
getIsShowingProject,
getIsShowingWithId,
getIsShowingWithoutId,
+65 -10
View File
@@ -30,7 +30,7 @@ describe('projectSaverHOC', () => {
<WrappedComponent
isShowingWithId
canSave={false}
isCreating={false}
isCreatingNew={false}
isShowingWithoutId={false}
isUpdating={false}
loadingState={LoadingState.SHOWING_WITH_ID}
@@ -52,7 +52,7 @@ describe('projectSaverHOC', () => {
const mounted = mount(
<WrappedComponent
canSave
isCreating={false}
isCreatingNew={false}
isShowingWithId={false}
isShowingWithoutId={false}
isUpdating={false}
@@ -78,7 +78,7 @@ describe('projectSaverHOC', () => {
<WrappedComponent
isShowingWithoutId
canSave={false}
isCreating={false}
isCreatingNew={false}
isShowingWithId={false}
isUpdating={false}
loadingState={LoadingState.LOADING_VM_NEW_DEFAULT}
@@ -102,7 +102,7 @@ describe('projectSaverHOC', () => {
<WrappedComponent
isShowingWithoutId
canCreateNew={false}
isCreating={false}
isCreatingNew={false}
isShowingWithId={false}
isUpdating={false}
loadingState={LoadingState.SHOWING_WITHOUT_ID}
@@ -124,7 +124,7 @@ describe('projectSaverHOC', () => {
const mounted = mount(
<WrappedComponent
canCreateNew
isCreating={false}
isCreatingNew={false}
isShowingWithId={false}
isShowingWithoutId={false}
isUpdating={false}
@@ -141,14 +141,16 @@ describe('projectSaverHOC', () => {
expect(mockedCreateProject).toHaveBeenCalled();
});
test('if we enter creating state, vm project should be requested', () => {
test('if we enter creating new state, vm project should be requested', () => {
vm.saveProjectSb3 = jest.fn(() => Promise.resolve());
const Component = () => <div />;
const WrappedComponent = projectSaverHOC(Component);
const mounted = mount(
<WrappedComponent
canSave
isCreating={false}
isCreatingCopy={false}
isCreatingNew={false}
isRemixing={false}
isShowingWithId={false}
isShowingWithoutId={false}
isUpdating={false}
@@ -159,12 +161,65 @@ describe('projectSaverHOC', () => {
/>
);
mounted.setProps({
isCreating: true,
isCreatingNew: true,
loadingState: LoadingState.CREATING_NEW
});
expect(vm.saveProjectSb3).toHaveBeenCalled();
});
test('if we enter remixing state, vm project should be requested', () => {
vm.saveProjectSb3 = jest.fn(() => Promise.resolve());
const Component = () => <div />;
const WrappedComponent = projectSaverHOC(Component);
const mounted = mount(
<WrappedComponent
canSave
isCreatingCopy={false}
isCreatingNew={false}
isRemixing={false}
isShowingWithId={false}
isShowingWithoutId={false}
isUpdating={false}
loadingState={LoadingState.SHOWING_WITH_ID}
reduxProjectId={'100'}
store={store}
vm={vm}
/>
);
mounted.setProps({
isRemixing: true,
loadingState: LoadingState.REMIXING
});
expect(vm.saveProjectSb3).toHaveBeenCalled();
});
test('if we enter creating copy state, vm project should be requested', () => {
vm.saveProjectSb3 = jest.fn(() => Promise.resolve());
const Component = () => <div />;
const WrappedComponent = projectSaverHOC(Component);
const mounted = mount(
<WrappedComponent
canSave
isCreatingCopy={false}
isCreatingNew={false}
isRemixing={false}
isShowingWithId={false}
isShowingWithoutId={false}
isUpdating={false}
loadingState={LoadingState.SHOWING_WITH_ID}
reduxProjectId={'100'}
store={store}
vm={vm}
/>
);
mounted.setProps({
isCreatingCopy: true,
loadingState: LoadingState.CREATING_COPY
});
expect(vm.saveProjectSb3).toHaveBeenCalled();
});
test('if we enter updating/saving state, vm project shold be requested', () => {
vm.saveProjectSb3 = jest.fn(() => Promise.resolve());
const Component = () => <div />;
@@ -172,7 +227,7 @@ describe('projectSaverHOC', () => {
const mounted = mount(
<WrappedComponent
canSave
isCreating={false}
isCreatingNew={false}
isShowingWithId={false}
isShowingWithoutId={false}
isUpdating={false}
@@ -197,7 +252,7 @@ describe('projectSaverHOC', () => {
<WrappedComponent
canSave
isUpdating
isCreating={false}
isCreatingNew={false}
isShowingWithId={false}
isShowingWithoutId={false}
loadingState={LoadingState.UPDATING}