Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/components/deck/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ const Deck = ({
}

const filteredChildren = React.Children.map(children, mapMarkdownIntoSlides)
.flat(1)
.reduce((acc, slide) => acc.concat(slide), [])
.filter(child => isComponentType(child, 'Slide'));

const numberOfSlides = filteredChildren.length;
Expand Down Expand Up @@ -157,7 +157,12 @@ const Deck = ({
[sendMessage, isController]
);

const { navigateToNext, navigateToPrevious, goToSlide } = useUrlRouting({
const {
navigateToNext,
navigateToPrevious,
toggleMode,
goToSlide
} = useUrlRouting({
dispatch,
currentSlide: state.currentSlide,
currentSlideElement: state.currentSlideElement,
Expand All @@ -171,7 +176,8 @@ const Deck = ({
useKeyboardControls({
keyboardControls,
navigateToNext,
navigateToPrevious
navigateToPrevious,
toggleMode
});

const { runTransition } = React.useContext(TransitionPipeContext);
Expand Down
14 changes: 4 additions & 10 deletions src/components/fullscreen.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,16 @@ import * as React from 'react';
import propTypes from 'prop-types';
import styled from 'styled-components';

const FullScreen = props => {
const toggleFullScreen = React.useCallback(() => {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
} else {
if ('exitFullscreen' in document) {
document.exitFullscreen();
}
}
}, []);
import { useToggleFullScreen } from '../hooks/use-full-screen';

const FullScreen = props => {
const Container = styled('div')`
@media print {
display: none;
}
`;

const toggleFullScreen = useToggleFullScreen();
return (
<Container
className="spectacle-fullscreen-button"
Expand Down
3 changes: 3 additions & 0 deletions src/hooks/use-deck.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ function useDeck(initialState) {
}
};
}
case 'TOGGLE_MODE': {
return { ...state, [action.payload.mode]: !state[action.payload.mode] };
}
default:
return { ...state };
}
Expand Down
12 changes: 12 additions & 0 deletions src/hooks/use-full-screen.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import React from 'react';

export const useToggleFullScreen = () =>
React.useCallback(() => {
if (!document.fullscreenElement) {
document.documentElement.requestFullscreen();
} else {
if ('exitFullscreen' in document) {
document.exitFullscreen();
}
}
}, []);
43 changes: 41 additions & 2 deletions src/hooks/use-keyboard-controls.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import React from 'react';
import debounce from '../utils/debounce';
import { useToggleFullScreen } from './use-full-screen';
import { isWindows, isMacOS } from '../utils/detect-platform';

const useKeyboardControls = ({
keyboardControls = 'arrows',
navigateToNext,
navigateToPrevious
navigateToPrevious,
toggleMode
}) => {
const keyPressCount = React.useRef(0);
const toggleFullScreen = useToggleFullScreen();
React.useEffect(
function() {
// Keep track of the number of next slide presses for debounce
Expand All @@ -33,14 +37,49 @@ const useKeyboardControls = ({
e.preventDefault();
}
}
if (!!e.altKey && isMacOS()) {
switch (e.key) {
case 'ø':
toggleMode('overviewMode');
break;
case 'π':
toggleMode('presenterMode');
break;
case 'ƒ':
toggleFullScreen();
break;
default:
null;
}
} else if (!!e.altKey && !!e.shiftKey && isWindows()) {
switch (e.key) {
case 'O':
toggleMode('overviewMode');
break;
case 'P':
toggleMode('presenterMode');
break;
case 'F':
toggleFullScreen();
break;
default:
null;
}
}
}

window.addEventListener('keydown', handleKeyDown);
return () => {
window.removeEventListener('keydown', handleKeyDown);
};
},
[keyboardControls, navigateToNext, navigateToPrevious]
[
keyboardControls,
navigateToNext,
navigateToPrevious,
toggleFullScreen,
toggleMode
]
);
};

Expand Down
6 changes: 6 additions & 0 deletions src/hooks/use-url-routing.js
Original file line number Diff line number Diff line change
Expand Up @@ -304,9 +304,15 @@ export default function useUrlRouting(options) {
[]
);

const toggleMode = React.useCallback(
s => dispatch({ type: 'TOGGLE_MODE', payload: { mode: s } }),
[dispatch]
);

return {
navigateToNext,
navigateToPrevious,
toggleMode,
goToSlide
};
}
5 changes: 5 additions & 0 deletions src/utils/detect-platform.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const isWindows = () =>
navigator.platform.toLowerCase().includes('win32');

export const isMacOS = () =>
navigator.platform.toLowerCase().includes('macintel');