Skip to content

Commit

Permalink
feat: full screen mode in manga reader
Browse files Browse the repository at this point in the history
  • Loading branch information
mrakesh0608 committed Jun 23, 2024
1 parent b662697 commit 9511009
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 49 deletions.
2 changes: 1 addition & 1 deletion src/components/AnimeCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export function AnimeCard({ data, onClick }: { data: any; onClick?: () => void }
<SearchResultCard
onClick={onClick || detailsClickHandler}
data={{
...(data as any),
...data,
episodes,
title: data.title ?? data.jp_name,
}}
Expand Down
14 changes: 4 additions & 10 deletions src/components/MangaCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,10 @@ export function MangaCard({ data }: { data: TManga }) {
return (
<SearchResultCard
onClick={exploreCardHandler}
data={
{
poster: data.poster,
title: data.title,
episodes,
type: data.type,
rank: data.rank,
score: data.score,
} as any
}
data={{
...data,
episodes,
}}
/>
);
}
38 changes: 38 additions & 0 deletions src/hooks/useFullScreenMode.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { useCallback, useEffect, useRef, useState } from 'react';

export function useFullScreenMode() {
const ref = useRef<HTMLDivElement | null>(null);

const [isFullScreen, setIsFullScreen] = useState(false);

const handleFullScreen = useCallback(async () => {
if (document.fullscreenElement) document.exitFullscreen();
else ref.current?.requestFullscreen();
}, [ref]);

const handleFullscreenchange = useCallback(
(e: Event) => {
console.log('full-screen-change-event', e);
setIsFullScreen(!isFullScreen);
},
[setIsFullScreen, isFullScreen],
);
const handleKeyDown = useCallback(
(event: KeyboardEvent) => {
if (['f', 'F'].includes(event.key)) handleFullScreen();
},
[handleFullScreen],
);

useEffect(() => {
ref.current?.addEventListener('fullscreenchange', handleFullscreenchange);
return () => ref.current?.removeEventListener('fullscreenchange', handleFullscreenchange);
}, [ref, handleFullscreenchange]);

useEffect(() => {
window?.addEventListener('keydown', handleKeyDown);
return () => window?.removeEventListener('keydown', handleKeyDown);
}, [handleKeyDown]);

return { fullScreenRef: ref, handleFullScreen, isFullScreen };
}
43 changes: 21 additions & 22 deletions src/screens/mangaDetailsScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -204,18 +204,20 @@ export function MangaDetailsScreen() {
{volTxt}
</Text>
<Stack align={'center'} justify={'center'} direction={'row'} mt={6}>
<Badge
px={2}
py={1}
fontWeight={'400'}
sx={{
display: 'flex',
justifyContent: 'content',
alignItems: 'center',
}}>
<Icon as={FiMonitor} />
<Text ml="1">{data?.type}</Text>
</Badge>
{data?.type ? (
<Badge
px={2}
py={1}
fontWeight={'400'}
sx={{
display: 'flex',
justifyContent: 'content',
alignItems: 'center',
}}>
<Icon as={FiMonitor} />
<Text ml="1">{data?.type}</Text>
</Badge>
) : null}
{data?.status && (
<Badge px={2} py={1} fontWeight={'400'}>
{data?.status}
Expand Down Expand Up @@ -247,18 +249,15 @@ export function MangaDetailsScreen() {

{data.genres?.length ? (
<div>
<Text fontWeight={600} color={'gray.500'} size="sm" mt={4}>
<Text fontWeight={600} color={'gray.500'} size="sm" my={2}>
Genre
</Text>
<Box>
{data.genres &&
data.genres.map((item, index) => {
return (
<Tag key={index} mr={2}>
{item}
</Tag>
);
})}
{data.genres?.map((item, index) => (
<Tag key={index} mr={2}>
{item}
</Tag>
))}
</Box>
</div>
) : null}
Expand All @@ -269,7 +268,7 @@ export function MangaDetailsScreen() {
alignItems: 'flex-end',
}}>
{isLoading ? (
<Skeleton p={2} m={2} width={'48px'} height={'48px'}></Skeleton>
<Skeleton p={2} m={2} width={'48px'} height={'48px'} />
) : (
<Button onClick={handleRead}>Read</Button>
)}
Expand Down
69 changes: 53 additions & 16 deletions src/screens/mangaReaderScreen.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { Box, Center, Flex, Heading, Image, Skeleton, Text } from '@chakra-ui/react';
import { Box, Center, Flex, Heading, Icon, Image, Skeleton, Text, Tooltip } from '@chakra-ui/react';
import { useQuery } from '@tanstack/react-query';
import { useEffect, useMemo, useState } from 'react';
import { GoScreenFull, GoScreenNormal } from 'react-icons/go';
import { useSearchParams } from 'react-router-dom';
import { GoBackBtn } from 'src/components/GoBackBtn';
import { localImagesPath } from 'src/constants/images';
import server from 'src/utils/axios';

import { TMangaChapters, getMangaDetails } from './getMangaDetails';
import { useFullScreenMode } from '../hooks/useFullScreenMode';

export function MangaReaderScreen() {
const [searchParams] = useSearchParams();
Expand Down Expand Up @@ -93,8 +95,11 @@ function MangaReader({ chapters, isLoading }: { chapters: TMangaChapters; isLoad
}
}, [chapters]);

const { isFullScreen, fullScreenRef, handleFullScreen } = useFullScreenMode();

return (
<div
ref={fullScreenRef}
style={{
display: 'flex',
flexGrow: 1,
Expand All @@ -110,7 +115,7 @@ function MangaReader({ chapters, isLoading }: { chapters: TMangaChapters; isLoad
flexGrow: 1,
flexDirection: 'column',
}}>
<Text p={2} fontSize="large" fontWeight={'bold'} position={'sticky'}>
<Text p={2} fontSize="large" fontWeight={'bold'}>
Chapters
</Text>

Expand Down Expand Up @@ -142,24 +147,50 @@ function MangaReader({ chapters, isLoading }: { chapters: TMangaChapters; isLoad
/>
</Flex>
</div>
<Box
sx={{
<div
style={{
width: '100%',
display: 'flex',
flexGrow: 1,

overflowY: 'auto',
'&::-webkit-scrollbar': {
width: '8px',
borderRadius: '8px',
backgroundColor: `rgba(255, 255, 255, 0.2)`,
},
'&::-webkit-scrollbar-thumb': {
backgroundColor: `rgba(255, 255, 255, 0.2)`,
},
flexDirection: 'column',
rowGap: 10,
}}>
<MangaChapterImages currentChapter={currentChapter} />
</Box>
<div
style={{
display: 'flex',
justifyContent: 'flex-end',
}}>
<Tooltip
label={isFullScreen ? 'Exit Full Screen' : 'Full Screen'}
placement="top">
<Box
style={{
cursor: 'pointer',
}}
onClick={handleFullScreen}>
<Icon as={isFullScreen ? GoScreenNormal : GoScreenFull} w={8} h={8} />
</Box>
</Tooltip>
</div>
<Box
sx={{
width: '100%',
display: 'flex',
flexGrow: 1,

overflowY: 'auto',
'&::-webkit-scrollbar': {
width: '8px',
borderRadius: '8px',
backgroundColor: `rgba(255, 255, 255, 0.2)`,
},
'&::-webkit-scrollbar-thumb': {
backgroundColor: `rgba(255, 255, 255, 0.2)`,
},
}}>
<MangaChapterImages currentChapter={currentChapter} />
</Box>
</div>
</div>
);
}
Expand Down Expand Up @@ -307,6 +338,12 @@ function MangaChapterImages({
alt={`manga-chapter-${idx}-image`}
width={'65%'}
style={{
userSelect: 'none',
msUserSelect: 'none',
MozUserSelect: 'none',
WebkitUserSelect: 'none',
msTouchSelect: 'none',
pointerEvents: 'none',
borderRadius: 20,
objectFit: 'contain',
}}
Expand Down

0 comments on commit 9511009

Please sign in to comment.