🚧 copy handleGlobalKeydown to MobileIDEView

This commit is contained in:
ghalestrilo 2020-08-13 18:29:39 -03:00
parent 53a5198e02
commit fac3f96072
3 changed files with 99 additions and 7 deletions

View file

@ -77,8 +77,9 @@ const Header = ({
</HeaderDiv> </HeaderDiv>
); );
Header.propTypes = { Header.propTypes = {
title: PropTypes.string, title: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),
subtitle: PropTypes.string, subtitle: PropTypes.string,
leftButton: PropTypes.element, leftButton: PropTypes.element,
children: PropTypes.oneOfType([PropTypes.element, PropTypes.arrayOf(PropTypes.element)]), children: PropTypes.oneOfType([PropTypes.element, PropTypes.arrayOf(PropTypes.element)]),

View file

@ -11,6 +11,8 @@ import { bindActionCreators } from 'redux';
import * as IDEActions from '../actions/ide'; import * as IDEActions from '../actions/ide';
import * as ProjectActions from '../actions/project'; import * as ProjectActions from '../actions/project';
import * as ConsoleActions from '../actions/console'; import * as ConsoleActions from '../actions/console';
import * as PreferencesActions from '../actions/preferences';
// Local Imports // Local Imports
import Editor from '../components/Editor'; import Editor from '../components/Editor';
@ -30,7 +32,9 @@ import useAsModal from '../../../components/useAsModal';
import { PreferencesIcon } from '../../../common/icons'; import { PreferencesIcon } from '../../../common/icons';
import Dropdown from '../../../components/Dropdown'; import Dropdown from '../../../components/Dropdown';
import { useEffectWithComparison } from '../../../utils/custom-hooks'; import { useEffectWithComparison, useEventListener } from '../../../utils/custom-hooks';
import * as device from '../../../utils/device';
const withChangeDot = (title, unsavedChanges = false) => ( const withChangeDot = (title, unsavedChanges = false) => (
<span> <span>
@ -69,6 +73,69 @@ const getNatOptions = (username = undefined) =>
const isUserOwner = ({ project, user }) => const isUserOwner = ({ project, user }) =>
project && project.owner && project.owner.id === user.id; project && project.owner && project.owner.id === user.id;
// TODO: This could go into <Editor />
const handleGlobalKeydown = (props, cmController) => (e) => {
alert('haha');
const {
user, project, ide,
setAllAccessibleOutput,
saveProject, cloneProject, showErrorModal, startSketch, stopSketch,
expandSidebar, collapseSidebar, expandConsole, collapseConsole,
closeNewFolderModal, closeUploadFileModal, closeNewFileModal
} = props;
const isMac = device.isMac();
// const ctrlDown = (e.metaKey && this.isMac) || (e.ctrlKey && !this.isMac);
const ctrlDown = (isMac ? e.metaKey : e.ctrlKey);
if (ctrlDown) {
if (e.shiftKey) {
if (e.keyCode === 13) {
e.preventDefault();
e.stopPropagation();
stopSketch();
} else if (e.keyCode === 13) {
e.preventDefault();
e.stopPropagation();
startSketch();
// 50 === 2
} else if (e.keyCode === 50
) {
e.preventDefault();
setAllAccessibleOutput(false);
// 49 === 1
} else if (e.keyCode === 49) {
e.preventDefault();
setAllAccessibleOutput(true);
}
} else if (e.keyCode === 83) {
// 83 === s
e.preventDefault();
e.stopPropagation();
if (isUserOwner(props) || (user.authenticated && !project.owner)) saveProject(cmController.getContent());
else if (user.authenticated) cloneProject();
else showErrorModal('forceAuthentication');
// 13 === enter
} else if (e.keyCode === 66) {
e.preventDefault();
if (!ide.sidebarIsExpanded) expandSidebar();
else collapseSidebar();
}
} else if (e.keyCode === 192 && e.ctrlKey) {
e.preventDefault();
if (ide.consoleIsExpanded) collapseConsole();
else expandConsole();
} else if (e.keyCode === 27) {
if (ide.newFolderModalVisible) closeNewFolderModal();
else if (ide.uploadFileModalVisible) closeUploadFileModal();
else if (ide.modalIsVisible) closeNewFileModal();
}
};
const autosave = (autosaveInterval, setAutosaveInterval) => (props, prevProps) => { const autosave = (autosaveInterval, setAutosaveInterval) => (props, prevProps) => {
const { const {
autosaveProject, preferences, ide, selectedFile: file, project autosaveProject, preferences, ide, selectedFile: file, project
@ -95,14 +162,14 @@ const autosave = (autosaveInterval, setAutosaveInterval) => (props, prevProps) =
} }
}; };
const MobileIDEView = (props) => { const MobileIDEView = (props) => {
const { const {
ide, preferences, project, selectedFile, user, params, unsavedChanges, collapseConsole, ide, preferences, project, selectedFile, user, params, unsavedChanges, collapseConsole,
stopSketch, startSketch, getProject, clearPersistedState, autosaveProject stopSketch, startSketch, getProject, clearPersistedState, autosaveProject
} = props; } = props;
const [tmController, setTmController] = useState(null); // eslint-disable-line
const [cmController, setCmController] = useState(null); // eslint-disable-line
const { username } = user; const { username } = user;
const { consoleIsExpanded } = ide; const { consoleIsExpanded } = ide;
@ -139,6 +206,10 @@ const MobileIDEView = (props) => {
autosaveProject, preferences, ide, selectedFile autosaveProject, preferences, ide, selectedFile
}); });
// useEventListener('keydown', () => alert('haha'));
useEventListener('keydown', handleGlobalKeydown(props, cmController));
return ( return (
<Screen fullscreen> <Screen fullscreen>
<Header <Header
@ -159,7 +230,7 @@ const MobileIDEView = (props) => {
</Header> </Header>
<IDEWrapper> <IDEWrapper>
<Editor provideController={setTmController} /> <Editor provideController={setCmController} />
</IDEWrapper> </IDEWrapper>
<Footer> <Footer>
@ -174,6 +245,22 @@ const MobileIDEView = (props) => {
); );
}; };
const handleGlobalKeydownProps = {
expandConsole: PropTypes.func.isRequired,
collapseConsole: PropTypes.func.isRequired,
expandSidebar: PropTypes.func.isRequired,
collapseSidebar: PropTypes.func.isRequired,
setAllAccessibleOutput: PropTypes.func.isRequired,
saveProject: PropTypes.func.isRequired,
cloneProject: PropTypes.func.isRequired,
showErrorModal: PropTypes.func.isRequired,
closeNewFolderModal: PropTypes.func.isRequired,
closeUploadFileModal: PropTypes.func.isRequired,
closeNewFileModal: PropTypes.func.isRequired,
};
MobileIDEView.propTypes = { MobileIDEView.propTypes = {
ide: PropTypes.shape({ ide: PropTypes.shape({
consoleIsExpanded: PropTypes.bool.isRequired, consoleIsExpanded: PropTypes.bool.isRequired,
@ -215,8 +302,10 @@ MobileIDEView.propTypes = {
stopSketch: PropTypes.func.isRequired, stopSketch: PropTypes.func.isRequired,
getProject: PropTypes.func.isRequired, getProject: PropTypes.func.isRequired,
clearPersistedState: PropTypes.func.isRequired, clearPersistedState: PropTypes.func.isRequired,
collapseConsole: PropTypes.func.isRequired,
autosaveProject: PropTypes.func.isRequired, autosaveProject: PropTypes.func.isRequired,
...handleGlobalKeydownProps
}; };
function mapStateToProps(state) { function mapStateToProps(state) {
@ -238,7 +327,8 @@ function mapStateToProps(state) {
const mapDispatchToProps = dispatch => bindActionCreators({ const mapDispatchToProps = dispatch => bindActionCreators({
...ProjectActions, ...ProjectActions,
...IDEActions, ...IDEActions,
...ConsoleActions ...ConsoleActions,
...PreferencesActions
}, dispatch); }, dispatch);
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(MobileIDEView)); export default withRouter(connect(mapStateToProps, mapDispatchToProps)(MobileIDEView));

1
client/utils/device.js Normal file
View file

@ -0,0 +1 @@
export const isMac = () => navigator.userAgent.toLowerCase().indexOf('mac') !== -1; // eslint-disable-line