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:
3 files changed
+127
-24
No files matched your search
@@ -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
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in new issue
Block a user