diff --git a/client/components/Dropdown.jsx b/client/components/Dropdown.jsx
index bd2169b8..48bed0cb 100644
--- a/client/components/Dropdown.jsx
+++ b/client/components/Dropdown.jsx
@@ -25,7 +25,7 @@ const DropdownWrapper = styled.ul`
display: flex;
flex-direction: column;
height: auto;
- z-index: 9999;
+ z-index: 2;
border-radius: ${remSize(6)};
& li:first-child { border-radius: ${remSize(5)} ${remSize(5)} 0 0; }
diff --git a/client/components/Sidebar.jsx b/client/components/Sidebar.jsx
new file mode 100644
index 00000000..93bba04d
--- /dev/null
+++ b/client/components/Sidebar.jsx
@@ -0,0 +1,43 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { Link } from 'react-router';
+import styled from 'styled-components';
+import { remSize, prop, common } from '../theme';
+import Header from './mobile/Header';
+import IconButton from './mobile/IconButton';
+import { ExitIcon } from '../common/icons';
+
+
+const SidebarWrapper = styled.div`
+ height: 100%;
+ width: ${remSize(180)};
+
+ position: absolute;
+ z-index: 2;
+ left: 0;
+
+ background: white;
+ box-shadow: 0 6px 6px 0 rgba(0,0,0,0.10);
+`;
+
+const Sidebar = ({ title, onPressClose }) => (
+
+ {title &&
+ }
+
+);
+
+Sidebar.propTypes = {
+ title: PropTypes.string,
+ onPressClose: PropTypes.func.isRequired,
+};
+
+Sidebar.defaultProps = {
+ title: null,
+ // onPressClose: PropTypes.func.isRequired,
+};
+
+
+export default Sidebar;
diff --git a/client/components/useAsModal.jsx b/client/components/useAsModal.jsx
index 1afa0d30..5dbeb82a 100644
--- a/client/components/useAsModal.jsx
+++ b/client/components/useAsModal.jsx
@@ -1,6 +1,7 @@
import React from 'react';
import { useModalBehavior } from '../utils/custom-hooks';
+
export default (component) => {
const [visible, trigger, setRef] = useModalBehavior();
diff --git a/client/modules/IDE/pages/MobileIDEView.jsx b/client/modules/IDE/pages/MobileIDEView.jsx
index c33c6cda..3d48f7f9 100644
--- a/client/modules/IDE/pages/MobileIDEView.jsx
+++ b/client/modules/IDE/pages/MobileIDEView.jsx
@@ -34,6 +34,7 @@ import ActionStrip from '../../../components/mobile/ActionStrip';
import useAsModal from '../../../components/useAsModal';
import { PreferencesIcon } from '../../../common/icons';
import Dropdown from '../../../components/Dropdown';
+import Sidebar from '../../../components/Sidebar';
const isUserOwner = ({ project, user }) =>
project.owner && project.owner.id === user.id;
@@ -67,18 +68,13 @@ const MobileIDEView = (props) => {
selectedFile, updateFileContent, files, user, params,
closeEditorOptions, showEditorOptions,
startRefreshSketch, stopSketch, expandSidebar, collapseSidebar, clearConsole, console,
- showRuntimeErrorWarning, hideRuntimeErrorWarning, startSketch, getProject, clearPersistedState
+ showRuntimeErrorWarning, hideRuntimeErrorWarning, startSketch, getProject, clearPersistedState, setUnsavedChanges
} = props;
const [tmController, setTmController] = useState(null); // eslint-disable-line
const { username } = user;
- const [triggerNavDropdown, NavDropDown] = useAsModal();
-
// Force state reset
useEffect(clearPersistedState, []);
useEffect(stopSketch, []);
@@ -95,16 +91,34 @@ const MobileIDEView = (props) => {
setCurrentProjectID(params.project_id);
}, [params, project, username]);
+ const [toggleNavDropdown, NavDropDown] = useAsModal();
+
+ const [toggleExplorer, Explorer] = useAsModal( {}}
+ />);
+
+ // toggle sidebar starting opened
+ useEffect(toggleExplorer, []);
return (
+
+
@@ -147,6 +161,7 @@ const MobileIDEView = (props) => {
hideRuntimeErrorWarning={hideRuntimeErrorWarning}
runtimeErrorWarningVisible={ide.runtimeErrorWarningVisible}
provideController={setTmController}
+ setUnsavedChanges={setUnsavedChanges}
/>
@@ -267,6 +282,7 @@ MobileIDEView.propTypes = {
username: PropTypes.string,
}).isRequired,
+ setUnsavedChanges: PropTypes.func.isRequired,
getProject: PropTypes.func.isRequired,
clearPersistedState: PropTypes.func.isRequired,
params: PropTypes.shape({