Commit 941f5c8b authored by tom's avatar tom

mobile view

parent d1c93682
...@@ -7,6 +7,7 @@ import React from 'react'; ...@@ -7,6 +7,7 @@ import React from 'react';
import type { File, Monaco } from './types'; import type { File, Monaco } from './types';
import useClientRect from 'lib/hooks/useClientRect'; import useClientRect from 'lib/hooks/useClientRect';
import useIsMobile from 'lib/hooks/useIsMobile';
import CodeEditorBreadcrumbs from './CodeEditorBreadcrumbs'; import CodeEditorBreadcrumbs from './CodeEditorBreadcrumbs';
import CodeEditorLoading from './CodeEditorLoading'; import CodeEditorLoading from './CodeEditorLoading';
...@@ -40,7 +41,9 @@ const CodeEditor = ({ data }: Props) => { ...@@ -40,7 +41,9 @@ const CodeEditor = ({ data }: Props) => {
const [ containerRect, containerNodeRef ] = useClientRect<HTMLDivElement>(); const [ containerRect, containerNodeRef ] = useClientRect<HTMLDivElement>();
const { colorMode } = useColorMode(); const { colorMode } = useColorMode();
const editorWidth = containerRect ? containerRect.width - SIDE_BAR_WIDTH : 0; const isMobile = useIsMobile();
const editorWidth = containerRect ? containerRect.width - (isMobile ? 0 : SIDE_BAR_WIDTH) : 0;
React.useEffect(() => { React.useEffect(() => {
instance?.editor.setTheme(colorMode === 'light' ? 'blockscout-light' : 'blockscout-dark'); instance?.editor.setTheme(colorMode === 'light' ? 'blockscout-light' : 'blockscout-dark');
......
import type { HTMLChakraProps } from '@chakra-ui/react'; import type { HTMLChakraProps } from '@chakra-ui/react';
import { Box, Tab, TabList, TabPanel, TabPanels, Tabs } from '@chakra-ui/react'; import { Box, Tab, TabList, TabPanel, TabPanels, Tabs, useBoolean } from '@chakra-ui/react';
import _throttle from 'lodash/throttle'; import _throttle from 'lodash/throttle';
import React from 'react'; import React from 'react';
...@@ -16,9 +16,12 @@ interface Props { ...@@ -16,9 +16,12 @@ interface Props {
selectedFile: string; selectedFile: string;
} }
const CONTAINER_WIDTH = 250;
const CodeEditorSideBar = ({ onFileSelect, data, monaco, selectedFile }: Props) => { const CodeEditorSideBar = ({ onFileSelect, data, monaco, selectedFile }: Props) => {
const [ isStuck, setIsStuck ] = React.useState(false); const [ isStuck, setIsStuck ] = React.useState(false);
const [ isDrawerOpen, setIsDrawerOpen ] = useBoolean(false);
const themeColors = useThemeColors(); const themeColors = useThemeColors();
...@@ -40,42 +43,85 @@ const CodeEditorSideBar = ({ onFileSelect, data, monaco, selectedFile }: Props) ...@@ -40,42 +43,85 @@ const CodeEditorSideBar = ({ onFileSelect, data, monaco, selectedFile }: Props)
setIsStuck((event.target as HTMLDivElement).scrollTop > 0); setIsStuck((event.target as HTMLDivElement).scrollTop > 0);
}, 100)); }, 100));
const handleFileSelect = React.useCallback((index: number, lineNumber?: number) => {
isDrawerOpen && setIsDrawerOpen.off();
onFileSelect(index, lineNumber);
}, [ isDrawerOpen, onFileSelect, setIsDrawerOpen ]);
return ( return (
<Box <>
w="250px" <Box
flexShrink={ 0 } w={ `${ CONTAINER_WIDTH }px` }
bgColor={ themeColors['sideBar.background'] } flexShrink={ 0 }
fontSize="13px" bgColor={ themeColors['sideBar.background'] }
overflowY="scroll" fontSize="13px"
onScroll={ handleScrollThrottled.current } overflowY="scroll"
pb="22px" onScroll={ handleScrollThrottled.current }
> position={{ base: 'absolute', lg: 'static' }}
<Tabs isLazy lazyBehavior="keepMounted" variant="unstyled" size="13px"> right={{ base: isDrawerOpen ? '0' : `-${ CONTAINER_WIDTH }px`, lg: undefined }}
<TabList top={{ base: 0, lg: undefined }}
columnGap={ 3 } h="100%"
position="sticky" pb="22px"
top={ 0 } boxShadow={{ base: isDrawerOpen ? 'md' : 'none', lg: 'none' }}
left={ 0 } zIndex={{ base: '2', lg: undefined }}
bgColor={ themeColors['sideBar.background'] } transitionProperty="right"
zIndex="1" transitionDuration="normal"
px={ 2 } transitionTimingFunction="ease-in-out"
boxShadow={ isStuck ? 'md' : 'none' } borderTopRightRadius="md"
borderTopRightRadius="md" borderBottomRightRadius="md"
> >
<Tab { ...tabProps }>Explorer</Tab> <Tabs isLazy lazyBehavior="keepMounted" variant="unstyled" size="13px">
<Tab { ...tabProps }>Search</Tab> <TabList
</TabList> columnGap={ 3 }
position="sticky"
top={ 0 }
left={ 0 }
bgColor={ themeColors['sideBar.background'] }
zIndex="1"
px={ 2 }
boxShadow={ isStuck ? 'md' : 'none' }
borderTopRightRadius="md"
>
<Tab { ...tabProps }>Explorer</Tab>
<Tab { ...tabProps }>Search</Tab>
</TabList>
<TabPanels> <TabPanels>
<TabPanel p={ 0 }> <TabPanel p={ 0 }>
<CodeEditorFileExplorer data={ data } onFileSelect={ onFileSelect } selectedFile={ selectedFile }/> <CodeEditorFileExplorer data={ data } onFileSelect={ handleFileSelect } selectedFile={ selectedFile }/>
</TabPanel> </TabPanel>
<TabPanel p={ 0 }> <TabPanel p={ 0 }>
<CodeEditorSearch data={ data } onFileSelect={ onFileSelect } monaco={ monaco } isInputStuck={ isStuck }/> <CodeEditorSearch data={ data } onFileSelect={ handleFileSelect } monaco={ monaco } isInputStuck={ isStuck }/>
</TabPanel> </TabPanel>
</TabPanels> </TabPanels>
</Tabs> </Tabs>
</Box> </Box>
<Box
boxSize="24px"
p="4px"
position="absolute"
display={{ base: 'block', lg: 'none' }}
right={ isDrawerOpen ? `${ CONTAINER_WIDTH - 1 }px` : '0' }
top="calc(50% - 12px)"
backgroundColor={ themeColors['sideBar.background'] }
borderTopLeftRadius="4px"
borderBottomLeftRadius="4px"
boxShadow="md"
onClick={ setIsDrawerOpen.toggle }
zIndex="1"
transitionProperty="right"
transitionDuration="normal"
transitionTimingFunction="ease-in-out"
title={ isDrawerOpen ? 'Open sidebar' : 'Close sidebar' }
aria-label={ isDrawerOpen ? 'Open sidebar' : 'Close sidebar' }
>
<Box
className="codicon codicon-tree-item-expanded"
transform={ isDrawerOpen ? 'rotate(-90deg)' : 'rotate(+90deg)' }
boxSize="16px"
/>
</Box>
</>
); );
}; };
......
...@@ -67,7 +67,7 @@ const CodeEditorTab = ({ isActive, path, onClick, onClose, isCloseDisabled, tabs ...@@ -67,7 +67,7 @@ const CodeEditorTab = ({ isActive, path, onClick, onClose, isCloseDisabled, tabs
onClick={ handleClose } onClick={ handleClose }
borderRadius="sm" borderRadius="sm"
opacity={ isCloseDisabled ? 0.3 : 1 } opacity={ isCloseDisabled ? 0.3 : 1 }
visibility={ isActive ? 'visible' : 'hidden' } visibility={{ base: 'visible', lg: isActive ? 'visible' : 'hidden' }}
color={ themeColors['icon.foreground'] } color={ themeColors['icon.foreground'] }
_hover={{ bgColor: isCloseDisabled ? 'transparent' : themeColors['custom.inputOption.hoverBackground'] }} _hover={{ bgColor: isCloseDisabled ? 'transparent' : themeColors['custom.inputOption.hoverBackground'] }}
/> />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment