2016-06-27 22:14:26 +02:00
|
|
|
import React, { PropTypes } from 'react';
|
2016-06-24 00:29:55 +02:00
|
|
|
import { Link } from 'react-router';
|
|
|
|
|
2016-06-27 22:14:26 +02:00
|
|
|
function Nav(props) {
|
|
|
|
return (
|
2016-07-14 23:20:44 +02:00
|
|
|
<nav className="nav" role="navigation" title="main-navigation">
|
2016-07-13 17:59:47 +02:00
|
|
|
<ul className="nav__items-left" title="project-menu">
|
2016-06-27 22:14:26 +02:00
|
|
|
<li className="nav__item">
|
2016-07-12 18:25:48 +02:00
|
|
|
<a
|
2016-06-27 22:14:26 +02:00
|
|
|
className="nav__new"
|
2017-01-05 21:27:57 +01:00
|
|
|
onClick={() => {
|
2017-01-08 22:42:20 +01:00
|
|
|
if (!props.unsavedChanges) {
|
|
|
|
props.newProject();
|
|
|
|
} else if (props.warnIfUnsavedChanges()) {
|
2017-01-05 21:27:57 +01:00
|
|
|
props.newProject();
|
|
|
|
}
|
|
|
|
}}
|
2016-06-27 22:14:26 +02:00
|
|
|
>
|
|
|
|
New
|
2016-07-12 18:25:48 +02:00
|
|
|
</a>
|
2016-06-27 22:14:26 +02:00
|
|
|
</li>
|
2016-09-07 21:21:22 +02:00
|
|
|
{(() => { // eslint-disable-line
|
|
|
|
if (!props.project.owner || props.project.owner && props.project.owner.id === props.user.id) {
|
|
|
|
return (
|
|
|
|
<li className="nav__item">
|
|
|
|
<a
|
|
|
|
className="nav__save"
|
2016-11-29 21:51:16 +01:00
|
|
|
onClick={() => {
|
|
|
|
if (props.user.authenticated) {
|
|
|
|
props.saveProject();
|
|
|
|
} else {
|
2017-01-24 21:29:25 +01:00
|
|
|
props.showErrorModal('forceAuthentication');
|
2016-11-29 21:51:16 +01:00
|
|
|
}
|
|
|
|
}}
|
2016-09-07 21:21:22 +02:00
|
|
|
>
|
|
|
|
Save
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
})()}
|
2016-08-18 01:00:05 +02:00
|
|
|
{(() => { // eslint-disable-line
|
2017-01-17 19:20:42 +01:00
|
|
|
if (props.project.id && props.user.authenticated) {
|
2016-08-18 01:00:05 +02:00
|
|
|
return (
|
|
|
|
<li className="nav__item">
|
|
|
|
<a className="nav__clone" onClick={props.cloneProject}>
|
|
|
|
Duplicate
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
})()}
|
|
|
|
{(() => { // eslint-disable-line
|
|
|
|
if (props.project.id) {
|
|
|
|
return (
|
|
|
|
<li className="nav__item">
|
2016-11-02 19:08:53 +01:00
|
|
|
<a className="nav__export" onClick={() => props.exportProjectAsZip(props.project.id)}>
|
2016-08-18 01:00:05 +02:00
|
|
|
Download
|
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
})()}
|
|
|
|
{(() => { // eslint-disable-line
|
|
|
|
if (props.project.id) {
|
|
|
|
return (
|
|
|
|
<li className="nav__item">
|
2016-09-07 04:37:29 +02:00
|
|
|
<a onClick={props.showShareModal}>
|
|
|
|
Share
|
|
|
|
</a>
|
2016-08-18 01:00:05 +02:00
|
|
|
</li>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
})()}
|
|
|
|
{(() => { // eslint-disable-line
|
|
|
|
if (props.user.authenticated) {
|
|
|
|
return (
|
|
|
|
<li className="nav__item">
|
|
|
|
<p className="nav__open">
|
2016-08-28 03:52:00 +02:00
|
|
|
<Link
|
2017-01-24 22:14:07 +01:00
|
|
|
to={`/${props.user.username}/sketches`}
|
2016-08-28 03:52:00 +02:00
|
|
|
onClick={props.stopSketch}
|
|
|
|
>
|
2016-08-18 01:00:05 +02:00
|
|
|
Open
|
|
|
|
</Link>
|
|
|
|
</p>
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
})()}
|
2016-12-02 00:57:50 +01:00
|
|
|
<li className="nav__item">
|
|
|
|
<p className="nav__open">
|
|
|
|
<Link to="/p5/sketches">
|
|
|
|
Examples
|
|
|
|
</Link>
|
|
|
|
</p>
|
|
|
|
</li>
|
2016-10-07 17:26:49 +02:00
|
|
|
<li className="nav__item">
|
|
|
|
<p className="nav__reference">
|
|
|
|
<a
|
|
|
|
href="https://p5js.org/reference/"
|
|
|
|
target="_blank"
|
|
|
|
>Reference</a>
|
|
|
|
</p>
|
|
|
|
</li>
|
2016-08-22 18:35:59 +02:00
|
|
|
<li className="nav__item">
|
|
|
|
<p className="nav__about">
|
|
|
|
<Link to="/about">
|
|
|
|
About
|
|
|
|
</Link>
|
|
|
|
</p>
|
|
|
|
</li>
|
2016-06-27 22:14:26 +02:00
|
|
|
</ul>
|
2016-07-13 17:59:47 +02:00
|
|
|
<ul className="nav__items-right" title="user-menu">
|
2016-08-28 02:46:20 +02:00
|
|
|
{(() => {
|
|
|
|
if (!props.user.authenticated) {
|
|
|
|
return (
|
2016-12-19 23:56:39 +01:00
|
|
|
<li className="nav__item">
|
2016-08-28 02:46:20 +02:00
|
|
|
<p>
|
2016-12-20 06:21:04 +01:00
|
|
|
<Link to="/login">Log in</Link> <span className="nav__item-spacer">or</span> <Link to="/signup">Sign up</Link>
|
2016-08-28 02:46:20 +02:00
|
|
|
</p>
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return (
|
|
|
|
<li className="nav__item">
|
|
|
|
<a>Hello, {props.user.username}!</a>
|
|
|
|
<ul className="nav__dropdown">
|
2016-12-20 06:21:04 +01:00
|
|
|
<li className="nav__dropdown-heading">
|
|
|
|
<a>Hello, {props.user.username}!</a>
|
|
|
|
</li>
|
2016-08-28 02:46:20 +02:00
|
|
|
<li>
|
2017-01-24 22:14:07 +01:00
|
|
|
<Link to={`/${props.user.username}/sketches`}>
|
2016-12-20 06:21:04 +01:00
|
|
|
My sketches
|
2016-08-28 02:46:20 +02:00
|
|
|
</Link>
|
|
|
|
</li>
|
|
|
|
<li>
|
|
|
|
<a onClick={props.logoutUser} >
|
2016-12-20 06:21:04 +01:00
|
|
|
Log out
|
2016-08-28 02:46:20 +02:00
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
})()}
|
2016-06-27 22:14:26 +02:00
|
|
|
</ul>
|
2017-01-06 21:13:46 +01:00
|
|
|
<div className="nav__announce">This is a preview version of the editor, that has not yet been officially released. It is in development, you can report bugs <a href="https://github.com/processing/p5.js-web-editor/issues" target="_blank">here</a>. Please use with caution.</div>
|
2016-06-27 22:14:26 +02:00
|
|
|
</nav>
|
|
|
|
);
|
2016-06-24 00:29:55 +02:00
|
|
|
}
|
|
|
|
|
2016-06-27 22:14:26 +02:00
|
|
|
Nav.propTypes = {
|
2016-08-12 18:45:26 +02:00
|
|
|
newProject: PropTypes.func.isRequired,
|
2016-06-27 22:14:26 +02:00
|
|
|
saveProject: PropTypes.func.isRequired,
|
2016-07-15 19:11:50 +02:00
|
|
|
exportProjectAsZip: PropTypes.func.isRequired,
|
2016-07-15 19:36:33 +02:00
|
|
|
cloneProject: PropTypes.func.isRequired,
|
2016-06-27 22:14:26 +02:00
|
|
|
user: PropTypes.shape({
|
|
|
|
authenticated: PropTypes.bool.isRequired,
|
2016-09-07 21:21:22 +02:00
|
|
|
username: PropTypes.string,
|
|
|
|
id: PropTypes.string
|
2016-08-18 00:35:15 +02:00
|
|
|
}).isRequired,
|
|
|
|
project: PropTypes.shape({
|
2016-09-07 21:21:22 +02:00
|
|
|
id: PropTypes.string,
|
|
|
|
owner: PropTypes.shape({
|
|
|
|
id: PropTypes.string
|
|
|
|
})
|
2016-08-28 02:46:20 +02:00
|
|
|
}),
|
2016-08-28 03:52:00 +02:00
|
|
|
logoutUser: PropTypes.func.isRequired,
|
2016-09-07 04:37:29 +02:00
|
|
|
stopSketch: PropTypes.func.isRequired,
|
2016-11-29 21:51:16 +01:00
|
|
|
showShareModal: PropTypes.func.isRequired,
|
2017-01-24 21:29:25 +01:00
|
|
|
showErrorModal: PropTypes.func.isRequired
|
2016-06-27 22:14:26 +02:00
|
|
|
};
|
|
|
|
|
2016-06-24 00:29:55 +02:00
|
|
|
export default Nav;
|