Skip to content

Commit 6a84b7b

Browse files
authored
Merge pull request #1617 from processing/bug/timer
[#1616] Restore isUserOwner prop to Editor
2 parents 51ee416 + 5a4b26f commit 6a84b7b

File tree

5 files changed

+37
-28
lines changed

5 files changed

+37
-28
lines changed

client/components/Nav.jsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { logoutUser } from '../modules/User/actions';
1414

1515
import getConfig from '../utils/getConfig';
1616
import { metaKeyName, } from '../utils/metaKey';
17+
import { getIsUserOwner } from '../modules/IDE/selectors/users';
1718

1819
import CaretLeftIcon from '../images/left-arrow.svg';
1920
import TriangleIcon from '../images/down-filled-triangle.svg';
@@ -215,10 +216,6 @@ class Nav extends React.PureComponent {
215216
}
216217
}
217218

218-
isUserOwner() {
219-
return this.props.project.owner && this.props.project.owner.id === this.props.user.id;
220-
}
221-
222219
handleFocus(dropdown) {
223220
this.clearHideTimeout();
224221
this.setDropdown(dropdown);
@@ -283,7 +280,7 @@ class Nav extends React.PureComponent {
283280
{this.props.t('Nav.File.New')}
284281
</button>
285282
</li>
286-
{ getConfig('LOGIN_ENABLED') && (!this.props.project.owner || this.isUserOwner()) &&
283+
{ getConfig('LOGIN_ENABLED') && (!this.props.project.owner || this.props.isUserOwner) &&
287284
<li className="nav__dropdown-item">
288285
<button
289286
onClick={this.handleSave}
@@ -797,6 +794,7 @@ Nav.propTypes = {
797794
t: PropTypes.func.isRequired,
798795
setLanguage: PropTypes.func.isRequired,
799796
language: PropTypes.string.isRequired,
797+
isUserOwner: PropTypes.bool.isRequired
800798
};
801799

802800
Nav.defaultProps = {
@@ -818,7 +816,8 @@ function mapStateToProps(state) {
818816
user: state.user,
819817
unsavedChanges: state.ide.unsavedChanges,
820818
rootFile: state.files.filter(file => file.name === 'root')[0],
821-
language: state.preferences.language
819+
language: state.preferences.language,
820+
isUserOwner: getIsUserOwner(state)
822821
};
823822
}
824823

client/modules/IDE/components/Editor.jsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import UnsavedChangesDotIcon from '../../../images/unsaved-changes-dot.svg';
4343
import RightArrowIcon from '../../../images/right-arrow.svg';
4444
import LeftArrowIcon from '../../../images/left-arrow.svg';
4545
import { getHTMLFile } from '../reducers/files';
46+
import { getIsUserOwner } from '../selectors/users';
4647

4748
import * as FileActions from '../actions/files';
4849
import * as IDEActions from '../actions/ide';
@@ -411,7 +412,7 @@ Editor.propTypes = {
411412
isExpanded: PropTypes.bool.isRequired,
412413
collapseSidebar: PropTypes.func.isRequired,
413414
expandSidebar: PropTypes.func.isRequired,
414-
isUserOwner: PropTypes.bool,
415+
isUserOwner: PropTypes.bool.isRequired,
415416
clearConsole: PropTypes.func.isRequired,
416417
showRuntimeErrorWarning: PropTypes.func.isRequired,
417418
hideRuntimeErrorWarning: PropTypes.func.isRequired,
@@ -421,7 +422,6 @@ Editor.propTypes = {
421422
};
422423

423424
Editor.defaultProps = {
424-
isUserOwner: false,
425425
consoleEvents: [],
426426
};
427427

@@ -447,7 +447,8 @@ function mapStateToProps(state) {
447447
...state.project,
448448
...state.editorAccessibility,
449449
isExpanded: state.ide.sidebarIsExpanded,
450-
projectSavedTime: state.project.updatedAt
450+
projectSavedTime: state.project.updatedAt,
451+
isUserOwner: getIsUserOwner(state)
451452
};
452453
}
453454

client/modules/IDE/pages/IDEView.jsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,14 @@ import About from '../components/About';
3434
import AddToCollectionList from '../components/AddToCollectionList';
3535
import Feedback from '../components/Feedback';
3636
import { CollectionSearchbar } from '../components/Searchbar';
37+
import { getIsUserOwner } from '../selectors/users';
3738

3839

3940
function getTitle(props) {
4041
const { id } = props.project;
4142
return id ? `p5.js Web Editor | ${props.project.name}` : 'p5.js Web Editor';
4243
}
4344

44-
function isUserOwner(props) {
45-
return props.project.owner && props.project.owner.id === props.user.id;
46-
}
47-
4845
function warnIfUnsavedChanges(props) {
4946
// eslint-disable-line
5047
const { route } = props.route;
@@ -138,7 +135,7 @@ class IDEView extends React.Component {
138135
}
139136

140137
componentDidUpdate(prevProps) {
141-
if (isUserOwner(this.props) && this.props.project.id) {
138+
if (this.props.isUserOwner && this.props.project.id) {
142139
if (
143140
this.props.preferences.autosave &&
144141
this.props.ide.unsavedChanges &&
@@ -151,7 +148,6 @@ class IDEView extends React.Component {
151148
if (this.autosaveInterval) {
152149
clearTimeout(this.autosaveInterval);
153150
}
154-
console.log('will save project in 20 seconds');
155151
this.autosaveInterval = setTimeout(this.props.autosaveProject, 20000);
156152
}
157153
} else if (this.autosaveInterval && !this.props.preferences.autosave) {
@@ -182,7 +178,7 @@ class IDEView extends React.Component {
182178
e.preventDefault();
183179
e.stopPropagation();
184180
if (
185-
isUserOwner(this.props) ||
181+
this.props.isUserOwner ||
186182
(this.props.user.authenticated && !this.props.project.owner)
187183
) {
188184
this.props.saveProject(this.cmController.getContent());
@@ -603,6 +599,7 @@ IDEView.propTypes = {
603599
openUploadFileModal: PropTypes.func.isRequired,
604600
closeUploadFileModal: PropTypes.func.isRequired,
605601
t: PropTypes.func.isRequired,
602+
isUserOwner: PropTypes.bool.isRequired
606603
};
607604

608605
function mapStateToProps(state) {
@@ -620,6 +617,7 @@ function mapStateToProps(state) {
620617
project: state.project,
621618
toast: state.toast,
622619
console: state.console,
620+
isUserOwner: getIsUserOwner(state)
623621
};
624622
}
625623

client/modules/IDE/pages/MobileIDEView.jsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { remSize } from '../../../theme';
3333
import ActionStrip from '../../../components/mobile/ActionStrip';
3434
import useAsModal from '../../../components/useAsModal';
3535
import Dropdown from '../../../components/Dropdown';
36+
import { getIsUserOwner } from '../selectors/users';
3637

3738

3839
import { useEffectWithComparison, useEventListener } from '../../../utils/custom-hooks';
@@ -76,12 +77,8 @@ const getNavOptions = (username = undefined, logoutUser = () => {}, toggleForceD
7677
]
7778
);
7879

79-
80-
const isUserOwner = ({ project, user }) =>
81-
project && project.owner && project.owner.id === user.id;
82-
83-
const canSaveProject = (project, user) =>
84-
isUserOwner({ project, user }) || (user.authenticated && !project.owner);
80+
const canSaveProject = (isUserOwner, project, user) =>
81+
isUserOwner || (user.authenticated && !project.owner);
8582

8683
// TODO: This could go into <Editor />
8784
const handleGlobalKeydown = (props, cmController) => (e) => {
@@ -90,7 +87,7 @@ const handleGlobalKeydown = (props, cmController) => (e) => {
9087
setAllAccessibleOutput,
9188
saveProject, cloneProject, showErrorModal, startSketch, stopSketch,
9289
expandSidebar, collapseSidebar, expandConsole, collapseConsole,
93-
closeNewFolderModal, closeUploadFileModal, closeNewFileModal
90+
closeNewFolderModal, closeUploadFileModal, closeNewFileModal, isUserOwner
9491
} = props;
9592

9693

@@ -123,7 +120,7 @@ const handleGlobalKeydown = (props, cmController) => (e) => {
123120
// 83 === s
124121
e.preventDefault();
125122
e.stopPropagation();
126-
if (canSaveProject(project, user)) saveProject(cmController.getContent(), false, true);
123+
if (canSaveProject(isUserOwner, project, user)) saveProject(cmController.getContent(), false, true);
127124
else if (user.authenticated) cloneProject();
128125
else showErrorModal('forceAuthentication');
129126

@@ -147,14 +144,14 @@ const handleGlobalKeydown = (props, cmController) => (e) => {
147144

148145
const autosave = (autosaveInterval, setAutosaveInterval) => (props, prevProps) => {
149146
const {
150-
autosaveProject, preferences, ide, selectedFile: file, project
147+
autosaveProject, preferences, ide, selectedFile: file, project, isUserOwner
151148
} = props;
152149

153150
const { selectedFile: oldFile } = prevProps;
154151

155152
const doAutosave = () => autosaveProject(true);
156153

157-
if (isUserOwner(props) && project.id) {
154+
if (props.isUserOwner && project.id) {
158155
if (preferences.autosave && ide.unsavedChanges && !ide.justOpenedProject) {
159156
if (file.name === oldFile.name && file.content !== oldFile.content) {
160157
if (autosaveInterval) {
@@ -189,7 +186,7 @@ const MobileIDEView = (props) => {
189186
const {
190187
ide, preferences, project, selectedFile, user, params, unsavedChanges, expandConsole, collapseConsole,
191188
stopSketch, startSketch, getProject, clearPersistedState, autosaveProject, saveProject, files,
192-
toggleForceDesktop, logoutUser, toast
189+
toggleForceDesktop, logoutUser, toast, isUserOwner
193190
} = props;
194191

195192

@@ -234,7 +231,7 @@ const MobileIDEView = (props) => {
234231
// TODO: This behavior could move to <Editor />
235232
const [autosaveInterval, setAutosaveInterval] = useState(null);
236233
useEffectWithComparison(autosave(autosaveInterval, setAutosaveInterval), {
237-
autosaveProject, preferences, ide, selectedFile, project, user
234+
autosaveProject, preferences, ide, selectedFile, project, user, isUserOwner
238235
});
239236

240237
useEventListener('keydown', handleGlobalKeydown(props, cmController), false, [props]);
@@ -299,6 +296,7 @@ const handleGlobalKeydownProps = {
299296
closeNewFolderModal: PropTypes.func.isRequired,
300297
closeUploadFileModal: PropTypes.func.isRequired,
301298
closeNewFileModal: PropTypes.func.isRequired,
299+
isUserOwner: PropTypes.bool.isRequired
302300
};
303301

304302
MobileIDEView.propTypes = {
@@ -356,6 +354,7 @@ MobileIDEView.propTypes = {
356354

357355
unsavedChanges: PropTypes.bool.isRequired,
358356
autosaveProject: PropTypes.func.isRequired,
357+
isUserOwner: PropTypes.bool.isRequired,
359358

360359

361360
...handleGlobalKeydownProps
@@ -375,6 +374,7 @@ function mapStateToProps(state) {
375374
project: state.project,
376375
toast: state.toast,
377376
console: state.console,
377+
isUserOwner: getIsUserOwner(state)
378378
};
379379
}
380380

client/modules/IDE/selectors/users.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import getConfig from '../../../utils/getConfig';
44
const getAuthenticated = state => state.user.authenticated;
55
const getTotalSize = state => state.user.totalSize;
66
const getAssetsTotalSize = state => state.assets.totalSize;
7+
const getSketchOwner = state => state.project.owner;
8+
const getUserId = state => state.user.id;
79
const limit = getConfig('UPLOAD_LIMIT') || 250000000;
810

911
export const getCanUploadMedia = createSelector(
@@ -28,3 +30,12 @@ export const getreachedTotalSizeLimit = createSelector(
2830
return false;
2931
}
3032
);
33+
34+
export const getIsUserOwner = createSelector(
35+
getSketchOwner,
36+
getUserId,
37+
(sketchOwner, userId) => {
38+
if (!sketchOwner) return false;
39+
return sketchOwner.id === userId;
40+
}
41+
);

0 commit comments

Comments
 (0)