Compare commits

..

2 Commits

Author SHA1 Message Date
monoid fbc4fb75e8 feat: fullscreen exit 2024-04-17 00:10:46 +09:00
monoid aa943d68e4 chore: ignore update 2024-04-16 23:52:08 +09:00
3 changed files with 29 additions and 12 deletions

2
.gitignore vendored
View File

@ -14,6 +14,8 @@ app/**
settings.json settings.json
comic_config.json comic_config.json
**/comic_config.json **/comic_config.json
compiled/
deploy-scripts/
.pnpm-store/** .pnpm-store/**
.env .env

View File

@ -4,7 +4,8 @@ import { Input } from "@/components/ui/input";
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover";
import { useGalleryDoc } from "@/hook/useGalleryDoc.ts"; import { useGalleryDoc } from "@/hook/useGalleryDoc.ts";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { EnterFullScreenIcon, ExitIcon } from "@radix-ui/react-icons"; import { EnterFullScreenIcon, ExitFullScreenIcon, ExitIcon } from "@radix-ui/react-icons";
import { useEventListener } from "usehooks-ts";
import type { Document } from "dbtype/api"; import type { Document } from "dbtype/api";
import { useCallback, useEffect, useRef, useState } from "react"; import { useCallback, useEffect, useRef, useState } from "react";
@ -92,12 +93,30 @@ function clip(val: number, min: number, max: number): number {
return Math.max(min, Math.min(max, val)); return Math.max(min, Math.min(max, val));
} }
function useFullScreen() {
const ref = useRef<HTMLElement>(document.documentElement);
const [isFullScreen, setIsFullScreen] = useState(false);
const toggleFullScreen = useCallback(() => {
if (isFullScreen) {
document.exitFullscreen();
} else {
document.documentElement.requestFullscreen();
}
}, [isFullScreen]);
useEventListener("fullscreenchange", () => {
setIsFullScreen(!!document.fullscreenElement);
}, ref);
return { isFullScreen, toggleFullScreen };
}
export default function ComicPage({ export default function ComicPage({
params params
}: ComicPageProps) { }: ComicPageProps) {
const { data, error, isLoading } = useGalleryDoc(params.id); const { data, error, isLoading } = useGalleryDoc(params.id);
const [curPage, setCurPage] = useState(0); const [curPage, setCurPage] = useState(0);
const { isFullScreen, toggleFullScreen } = useFullScreen();
if (isLoading) { if (isLoading) {
// TODO: Add a loading spinner // TODO: Add a loading spinner
return <div className="p-4"> return <div className="p-4">
@ -122,11 +141,8 @@ export default function ComicPage({
return ( return (
<PageNavItem items={<> <PageNavItem items={<>
<NavItem to={`/doc/${params.id}`} name="Back" icon={<ExitIcon />}/> <NavItem to={`/doc/${params.id}`} name="Back" icon={<ExitIcon />}/>
<NavItemButton name="fullscreen" icon={<EnterFullScreenIcon/>} onClick={()=>{ <NavItemButton name={isFullScreen ? "Exit Fullscreen" : "Enter Fullscreen"} icon={isFullScreen ? <ExitFullScreenIcon/> : <EnterFullScreenIcon/>} onClick={()=>{
const elem = document.documentElement; toggleFullScreen();
if (elem.requestFullscreen) {
elem.requestFullscreen();
}
}} /> }} />
<Popover> <Popover>
<PopoverTrigger> <PopoverTrigger>
@ -137,15 +153,14 @@ export default function ComicPage({
setCurPage(clip(Number.parseInt(e.target.value) - 1, setCurPage(clip(Number.parseInt(e.target.value) - 1,
0, 0,
(data.additional.page as number) - 1))} /> (data.additional.page as number) - 1))} />
<div className="flex">
</div>
</PopoverContent> </PopoverContent>
</Popover> </Popover>
</>}> </>}>
<ComicViewer <ComicViewer
curPage={curPage} curPage={curPage}
onChangePage={setCurPage} onChangePage={setCurPage}
doc={data} totalPage={data.additional.page as number} /> doc={data}
totalPage={data.additional.page as number} />
</PageNavItem> </PageNavItem>
) )
} }

View File

@ -4,9 +4,9 @@
"description": "", "description": "",
"main": "build/app.js", "main": "build/app.js",
"scripts": { "scripts": {
"compile": "swc src --out-dir dist", "compile": "swc src --out-dir compile",
"dev": "nodemon -r @swc-node/register --enable-source-maps --exec node app.ts", "dev": "nodemon -r @swc-node/register --enable-source-maps --exec node app.ts",
"start": "node dist/app.js" "start": "node compile/app.js"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",