p5.js-web-editor/client/components/Nav.jsx

228 lines
7.2 KiB
React
Raw Normal View History

import React, { PropTypes } from 'react';
2016-06-23 22:29:55 +00:00
import { Link } from 'react-router';
2017-07-17 21:09:46 +00:00
import InlineSVG from 'react-inlinesvg';
const triangleUrl = require('../images/down-filled-triangle.svg');
const logoUrl = require('../images/p5js-logo-small.svg');
2016-06-23 22:29:55 +00:00
class Nav extends React.PureComponent {
2017-07-19 21:35:25 +00:00
isUserOwner() {
return this.props.project.owner && this.props.project.owner.id === this.props.user.id;
}
render() {
return (
<nav className="nav" role="navigation" title="main-navigation">
<ul className="nav__items-left" title="project-menu">
2017-07-17 21:09:46 +00:00
<li>
<InlineSVG src={logoUrl} alt="p5.js logo" />
</li>
<li className="nav__item">
<button>
File
<InlineSVG src={triangleUrl} />
</button>
<ul className="nav__dropdown">
2017-07-19 21:35:25 +00:00
<li className="nav__dropdown-item">
2017-07-17 21:09:46 +00:00
<button
onClick={() => {
if (!this.props.unsavedChanges) {
this.props.newProject();
} else if (this.props.warnIfUnsavedChanges()) {
this.props.newProject();
}
}}
>
New
</button>
</li>
2017-07-19 21:35:25 +00:00
{ (!this.props.project.owner || this.isUserOwner()) &&
<li className="nav__dropdown-item">
<button
onClick={() => {
if (this.props.user.authenticated) {
this.props.saveProject();
} else {
this.props.showErrorModal('forceAuthentication');
}
}}
>
2017-07-17 21:09:46 +00:00
Save
</button>
2017-07-19 21:35:25 +00:00
</li> }
{ this.props.project.id && this.props.user.authenticated &&
<li className="nav__dropdown-item">
<button onClick={this.props.cloneProject}>
2017-07-17 21:09:46 +00:00
Duplicate
</button>
2017-07-19 21:35:25 +00:00
</li> }
{ this.props.project.id &&
<li className="nav__dropdown-item">
<button onClick={this.props.showShareModal}>
Share
2017-07-17 21:09:46 +00:00
</button>
2017-07-19 21:35:25 +00:00
</li> }
{ this.props.project.id &&
<li className="nav__dropdown-item">
<button onClick={() => this.props.exportProjectAsZip(this.props.project.id)}>
2017-07-17 21:09:46 +00:00
Download
</button>
2017-07-19 21:35:25 +00:00
</li> }
{ this.props.user.authenticated &&
<li className="nav__dropdown-item">
<Link to={`/${this.props.user.username}/sketches`}>
Open
</Link>
</li> }
<li className="nav__dropdown-item">
<Link
to="/p5/sketches"
>
Examples
</Link>
2017-07-17 21:09:46 +00:00
</li>
</ul>
</li>
<li className="nav__item">
<button>
Edit
<InlineSVG src={triangleUrl} />
</button>
<ul className="nav__dropdown">
2017-07-19 21:35:25 +00:00
<li className="nav__dropdown-item">
2017-07-17 21:09:46 +00:00
Tidy Code
</li>
2017-07-19 21:35:25 +00:00
<li cclassName="nav__dropdown-item">
2017-07-17 21:09:46 +00:00
Find
</li>
</ul>
</li>
<li className="nav__item">
<button>
Sketch
<InlineSVG src={triangleUrl} />
</button>
<ul className="nav__dropdown">
2017-07-19 21:35:25 +00:00
<li className="nav__dropdown-item">
2017-07-17 21:09:46 +00:00
Run
</li>
2017-07-19 21:35:25 +00:00
<li className="nav__dropdown-item">
2017-07-17 21:09:46 +00:00
Stop
</li>
</ul>
</li>
<li className="nav__item">
<button>
Help
<InlineSVG src={triangleUrl} />
</button>
<ul className="nav__dropdown">
2017-07-19 21:35:25 +00:00
<li className="nav__dropdown-item">
2017-07-17 21:09:46 +00:00
Keyboard Shortcuts
</li>
2017-07-19 21:35:25 +00:00
<li className="nav__dropdown-item">
<a
href="https://p5js.org/reference/"
target="_blank"
rel="noopener noreferrer"
>Reference</a>
2017-07-17 21:09:46 +00:00
</li>
2017-07-19 21:35:25 +00:00
<li className="nav__dropdown-item">
<Link to="/about">
About
</Link>
2017-07-17 21:09:46 +00:00
</li>
</ul>
</li>
</ul>
<ul className="nav__items-right" title="user-menu">
{(() => {
if (!this.props.user.authenticated) {
return (
<li className="nav__item">
<p>
2017-06-06 02:33:32 +00:00
<Link to="/login">Log in</Link>
<span className="nav__item-spacer">or</span>
<Link to="/signup">Sign up</Link>
</p>
</li>
);
}
2016-08-28 00:46:20 +00:00
return (
2016-12-19 22:56:39 +00:00
<li className="nav__item">
<a>Hello, {this.props.user.username}!</a>
<ul className="nav__dropdown">
<li className="nav__dropdown-heading">
<a>Hello, {this.props.user.username}!</a>
</li>
<li>
<Link to={`/${this.props.user.username}/sketches`}>
My sketches
</Link>
</li>
<li>
<Link to={`/${this.props.user.username}/assets`}>
My assets
</Link>
</li>
<li>
<Link to={`/${this.props.user.username}/account`}>
My account
</Link>
</li>
<li>
<button onClick={this.props.logoutUser} >
Log out
</button>
</li>
</ul>
2016-08-28 00:46:20 +00:00
</li>
);
})()}
</ul>
<div className="nav__announce">
This is a preview version of the editor, that has not yet been officially released.
2017-06-06 02:33:32 +00:00
It is in development, you can report bugs <a
href="https://github.com/processing/p5.js-web-editor/issues"
target="_blank"
rel="noopener noreferrer"
>here</a>.
Please use with caution.
</div>
</nav>
);
}
2016-06-23 22:29:55 +00:00
}
Nav.propTypes = {
newProject: PropTypes.func.isRequired,
saveProject: PropTypes.func.isRequired,
2016-07-15 17:11:50 +00:00
exportProjectAsZip: PropTypes.func.isRequired,
2016-07-15 17:36:33 +00:00
cloneProject: PropTypes.func.isRequired,
user: PropTypes.shape({
authenticated: PropTypes.bool.isRequired,
username: PropTypes.string,
id: PropTypes.string
2016-08-17 22:35:15 +00:00
}).isRequired,
project: PropTypes.shape({
id: PropTypes.string,
owner: PropTypes.shape({
id: PropTypes.string
})
2016-08-28 00:46:20 +00:00
}),
2016-08-28 01:52:00 +00:00
logoutUser: PropTypes.func.isRequired,
showShareModal: PropTypes.func.isRequired,
showErrorModal: PropTypes.func.isRequired,
unsavedChanges: PropTypes.bool.isRequired,
warnIfUnsavedChanges: PropTypes.func.isRequired
};
Nav.defaultProps = {
project: {
id: undefined,
owner: undefined
}
};
2016-06-23 22:29:55 +00:00
export default Nav;