diff --git a/src/components/ResponsiveToolBar.tsx b/src/components/ResponsiveToolBar.tsx new file mode 100644 index 0000000000..846db2e551 --- /dev/null +++ b/src/components/ResponsiveToolBar.tsx @@ -0,0 +1,62 @@ +import React from 'react' +import { Flex, IconButton, useTheme } from '@chakra-ui/react' +import { HiOutlineDesktopComputer } from 'react-icons/hi' +import { MdOutlineTabletMac } from 'react-icons/md' +import { ImMobile } from 'react-icons/im' +import useDispatch from '~hooks/useDispatch' +import { getEditorWidth } from '~core/selectors/app' +import { useSelector } from 'react-redux' + +const ResponsiveToolBar = () => { + const dispatch = useDispatch() + const theme = useTheme() + const editorWidth = useSelector(getEditorWidth) + + return ( + + } + size="lg" + fontSize="30px" + color={editorWidth === '100%' ? 'teal.500' : 'black.500'} + aria-label="Desktop version" + onClick={() => dispatch.app.updateEditorWidth({ width: '100%' })} + /> + + } + size="lg" + color={editorWidth === theme.breakpoints.md ? 'teal.500' : 'black.500'} + fontSize="30px" + aria-label="Tablet version" + mx={12} + onClick={() => + dispatch.app.updateEditorWidth({ width: theme.breakpoints.md }) + } + /> + + } + size="lg" + color={editorWidth === theme.breakpoints.sm ? 'teal.500' : 'black.500'} + fontSize="30px" + aria-label="Mobile version" + onClick={() => + dispatch.app.updateEditorWidth({ width: theme.breakpoints.sm }) + } + /> + + ) +} + +export default ResponsiveToolBar diff --git a/src/core/models/app.ts b/src/core/models/app.ts index 9f6fa98590..0476bf5b3b 100644 --- a/src/core/models/app.ts +++ b/src/core/models/app.ts @@ -6,6 +6,7 @@ export type AppState = { showLayout: boolean showCode: boolean inputTextFocused: boolean + editorWidth: string overlay: undefined | Overlay } @@ -14,6 +15,7 @@ const app = createModel({ showLayout: true, showCode: false, inputTextFocused: false, + editorWidth: '100%', overlay: undefined, } as AppState, reducers: { @@ -41,6 +43,12 @@ const app = createModel({ overlay, } }, + updateEditorWidth(state: AppState, payload: { width: string }): AppState { + return { + ...state, + editorWidth: payload.width, + } + }, 'components/deleteComponent': (state: AppState): AppState => { return { ...state, diff --git a/src/core/selectors/app.ts b/src/core/selectors/app.ts index a00078d01b..26050e0ea2 100644 --- a/src/core/selectors/app.ts +++ b/src/core/selectors/app.ts @@ -10,3 +10,5 @@ export const getFocusedComponent = (id: IComponent['id']) => ( export const getInputTextFocused = (state: RootState) => state.app.inputTextFocused + +export const getEditorWidth = (state: RootState) => state.app.editorWidth diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 69f586f913..6b5c06ba09 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -11,8 +11,13 @@ import EditorErrorBoundary from '~components/errorBoundaries/EditorErrorBoundary import Editor from '~components/editor/Editor' import { InspectorProvider } from '~contexts/inspector-context' import Inspector from '~components/inspector/Inspector' +import ResponsiveToolBar from '~components/ResponsiveToolBar' +import { useSelector } from 'react-redux' +import { getEditorWidth } from '~core/selectors/app' const App = () => { + const editorWidth = useSelector(getEditorWidth) + useShortcuts() return ( @@ -28,8 +33,20 @@ const App = () => { - - + + + + +