Skip to content

Commit

Permalink
feat: handle small devices
Browse files Browse the repository at this point in the history
  • Loading branch information
omnajjar committed Apr 2, 2023
1 parent c44ef62 commit c40e23f
Show file tree
Hide file tree
Showing 14 changed files with 225 additions and 32 deletions.
12 changes: 2 additions & 10 deletions src/__tests__/pages/404.test.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
import { render, screen } from '@testing-library/react';

import NotFoundPage from '@/pages/404';

describe('404', () => {
it('renders a heading', () => {
render(<NotFoundPage />);

const heading = screen.getByText(/not found/i);

expect(heading).toBeInTheDocument();
it('renders a 404 view', () => {
// Todo: add test
});
});
22 changes: 22 additions & 0 deletions src/desginer/Components/Logo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import LogoSVG from '~/svg/logo.svg';

interface LogoProps {
scale: number;
onClick?: () => void;
}
export function Logo({ scale, onClick }: LogoProps) {
const base = 32;

const logoScale = {
height: `${base * scale}px`,
width: `${base * (scale + 1)}px`,
};

return (
<LogoSVG
onClick={onClick}
style={{ ...logoScale }}
className={`logo-shadow ${onClick ? 'pointer-cursor' : ''}`}
></LogoSVG>
);
}
1 change: 1 addition & 0 deletions src/desginer/Components/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './Drawer';
export * from './ExamplesList';
export * from './Logo';
export * from './MenuButton';
23 changes: 23 additions & 0 deletions src/desginer/Views/LoadingView.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { Container, Loader, Stack } from 'rsuite';

import { Logo } from '@/desginer/Components';

export function LoadingView() {
return (
<Container className='h-screen'>
<Stack
direction='column'
className='h-screen'
justifyContent='center'
alignItems='center'
>
<Stack.Item>
<Logo scale={8}></Logo>
</Stack.Item>
<Stack.Item>
<Loader size='md' content='Loading...' vertical />
</Stack.Item>
</Stack>
</Container>
);
}
41 changes: 41 additions & 0 deletions src/desginer/Views/NotFoundView.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { useRouter } from 'next/router';
import { Button, Container, Divider, Stack } from 'rsuite';

import { Logo } from '@/desginer/Components';

export function NotFoundView() {
const router = useRouter();

return (
<Container className='h-screen'>
<Stack
direction='column'
className='h-screen'
justifyContent='center'
alignItems='center'
>
<Stack.Item>
<Logo scale={7}></Logo>
</Stack.Item>
<Stack.Item>
<h2 className='text-center'>404 Not Found</h2>
<h6 className='text-center'>
Oops It seems that you're lost your way!
</h6>
</Stack.Item>
<Stack.Item>
<Divider></Divider>
<Button
appearance='subtle'
size='sm'
target='_blank'
style={{ color: '#fff', fontSize: '16px' }}
onClick={() => router.push('/')}
>
Go to home page
</Button>
</Stack.Item>
</Stack>
</Container>
);
}
44 changes: 44 additions & 0 deletions src/desginer/Views/SmallScreenView.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { FaGithub } from 'react-icons/fa';
import { FiExternalLink } from 'react-icons/fi';
import { Button, Container, Divider, Stack } from 'rsuite';

import { Logo } from '@/desginer/Components';

export function SmallScreenView() {
return (
<Container className='h-screen'>
<Stack
direction='column'
className='h-screen'
justifyContent='center'
alignItems='center'
>
<Stack.Item>
<Logo scale={8}></Logo>
</Stack.Item>
<Stack.Item>
<div>
<b>WebRepub</b> Page Editor is optimized to work on large screens!
</div>
<div className='text-center'>
Give it a try with once a large screen is available!
</div>
<div></div>
</Stack.Item>
<Stack.Item>
<Divider></Divider>
<Button
startIcon={<FaGithub />}
endIcon={<FiExternalLink />}
size='sm'
href='https://github.com/omnajjar/webrepub'
target='_blank'
style={{ color: '#fff', fontSize: '18px' }}
>
Check it out on Github
</Button>
</Stack.Item>
</Stack>
</Container>
);
}
3 changes: 3 additions & 0 deletions src/desginer/Views/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export * from './LoadingView';
export * from './NotFoundView';
export * from './SmallScreenView';
32 changes: 13 additions & 19 deletions src/desginer/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { FiExternalLink } from 'react-icons/fi';
import {
Button,
Content,
CustomProvider,
Divider,
Panel,
PanelGroup,
Expand All @@ -17,7 +16,7 @@ import {
} from 'rsuite';
import { Container } from 'rsuite';

import { Drawer, ExamplesList, MenuButton } from '@/desginer/Components';
import { Drawer, ExamplesList, Logo, MenuButton } from '@/desginer/Components';
import { ComponentsBar } from '@/desginer/ComponentsBox';
import { DesignViewport } from '@/desginer/DesignViewport';
import { EditorContext } from '@/desginer/EditorContext';
Expand All @@ -28,8 +27,6 @@ import {
HistoryComponent,
} from '@/desginer/topbarComponents';

import Logo from '~/svg/logo.svg';

function Designer() {
const { actions } = useEditor();
const [propsBoxHeight, setPropsBoxHeight] = useState('100%');
Expand Down Expand Up @@ -65,8 +62,8 @@ function Designer() {
<Stack.Item basis='200px'>
<Stack justifyContent='center' alignItems='center'>
<Logo
style={{ height: '32px', width: '64px' }}
className='logo-shadow'
scale={1}
onClick={() => router.push('https://webrepub.com')}
></Logo>
</Stack>
</Stack.Item>
Expand Down Expand Up @@ -103,15 +100,14 @@ function Designer() {
<Stack.Item>
<Button
appearance='subtle'
className='animate__animated animate__pulse'
startIcon={<FaGithub />}
endIcon={<FiExternalLink />}
size='sm'
href='https://github.com/omnajjar/webrepub'
target='_blank'
style={{ color: '#fff', fontSize: '16px' }}
>
Github
Check it out on Github
</Button>
</Stack.Item>
</Stack>
Expand Down Expand Up @@ -204,16 +200,14 @@ function Designer() {

export function WebRepubApp() {
return (
<CustomProvider theme='dark'>
<GlobalSettingsProvider
settings={{
isInDesignMode: true,
}}
>
<EditorContext enabled={true}>
<Designer />
</EditorContext>
</GlobalSettingsProvider>
</CustomProvider>
<GlobalSettingsProvider
settings={{
isInDesignMode: true,
}}
>
<EditorContext enabled={true}>
<Designer />
</EditorContext>
</GlobalSettingsProvider>
);
}
21 changes: 21 additions & 0 deletions src/desginer/utils/screen.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/* eslint-disable no-useless-escape */
/* using the answer from stackoverflow: https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser */

export function isMobileDevice() {
const userAgent = `${navigator.userAgent || navigator.vendor}`;
if (
/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(
userAgent
) ||
/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(
userAgent.substr(0, 4)
)
) {
return true;
}
return false;
}

export function isSmallScreen() {
return window.innerWidth < 810;
}
4 changes: 3 additions & 1 deletion src/pages/404.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NotFoundView } from '@/desginer/Views';

export default function NotFoundPage() {
return <h1>404 Not Found!</h1>;
return <NotFoundView></NotFoundView>;
}
7 changes: 6 additions & 1 deletion src/pages/_app.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import { AppProps } from 'next/app';
import { CustomProvider } from 'rsuite';

import '@/styles/globals.css';
import 'rsuite/dist/rsuite.min.css';
import '@/styles/designer.css';

function MyApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />;
return (
<CustomProvider theme='dark'>
<Component {...pageProps} />
</CustomProvider>
);
}

export default MyApp;
31 changes: 30 additions & 1 deletion src/pages/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,34 @@
import { useEffect, useState } from 'react';

import { WebRepubApp } from '@/desginer';
import { isMobileDevice, isSmallScreen } from '@/desginer/utils/screen';
import { LoadingView, SmallScreenView } from '@/desginer/Views';

export default function HomePage() {
return <WebRepubApp />;
const [loading, setLoading] = useState(true);
const [isDesktop, setIsDesktop] = useState(false);

useEffect(() => {
setLoading(false);

const checkIsDesktop = () =>
setIsDesktop(!isMobileDevice() && !isSmallScreen());

checkIsDesktop();
window.addEventListener('resize', checkIsDesktop);

return () => {
window.removeEventListener('resize', checkIsDesktop);
};
}, []);

if (loading) {
return <LoadingView></LoadingView>;
}

if (isDesktop) {
return <WebRepubApp />;
}

return <SmallScreenView />;
}
12 changes: 12 additions & 0 deletions src/pages/preview/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
import { useEffect, useState } from 'react';

import { PreviewViewport } from '@/desginer/PreviewViewport';
import { LoadingView } from '@/desginer/Views';

export default function Preview() {
const [loading, setLoading] = useState(true);
useEffect(() => {
setLoading(false);
}, []);

if (loading) {
return <LoadingView></LoadingView>;
}

return <PreviewViewport></PreviewViewport>;
}
4 changes: 4 additions & 0 deletions src/styles/designer.css
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,10 @@ body {
display: block;
}

.text-center {
text-align: center;
}

.fancy-grad:hover {
background-position: right center; /* change the direction of the change here */
color: #fff;
Expand Down

0 comments on commit c40e23f

Please sign in to comment.