From 763fc89b2983471d4133837e3c59faae38fd0602 Mon Sep 17 00:00:00 2001 From: lloydzhou Date: Thu, 25 Jul 2024 15:10:17 +0800 Subject: [PATCH] add fullscreen button on artifact component --- app/components/markdown.tsx | 22 ++++++++++---------- app/components/ui-lib.tsx | 40 ++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/app/components/markdown.tsx b/app/components/markdown.tsx index fa8d12c40..0918e7c5b 100644 --- a/app/components/markdown.tsx +++ b/app/components/markdown.tsx @@ -6,13 +6,13 @@ import RehypeKatex from "rehype-katex"; import RemarkGfm from "remark-gfm"; import RehypeHighlight from "rehype-highlight"; import { useRef, useState, RefObject, useEffect, useMemo } from "react"; -import { copyToClipboard } from "../utils"; +import { copyToClipboard, useWindowSize } from "../utils"; import mermaid from "mermaid"; import LoadingIcon from "../icons/three-dots.svg"; import React from "react"; import { useDebouncedCallback } from "use-debounce"; -import { showImageModal } from "./ui-lib"; +import { showImageModal, FullScreen } from "./ui-lib"; import { ArtifactShareButton, HTMLPreview } from "./artifact"; export function Mermaid(props: { code: string }) { @@ -66,6 +66,7 @@ export function PreCode(props: { children: any }) { const refText = ref.current?.innerText; const [mermaidCode, setMermaidCode] = useState(""); const [htmlCode, setHtmlCode] = useState(""); + const { height } = useWindowSize(); const renderArtifacts = useDebouncedCallback(() => { if (!ref.current) return; @@ -104,20 +105,17 @@ export function PreCode(props: { children: any }) { )} {htmlCode.length > 0 && ( -
e.stopPropagation()} - > + htmlCode} /> - -
+ + )} ); diff --git a/app/components/ui-lib.tsx b/app/components/ui-lib.tsx index 8ac0f8e9d..77223f5db 100644 --- a/app/components/ui-lib.tsx +++ b/app/components/ui-lib.tsx @@ -13,7 +13,13 @@ import MinIcon from "../icons/min.svg"; import Locale from "../locales"; import { createRoot } from "react-dom/client"; -import React, { HTMLProps, useEffect, useState } from "react"; +import React, { + HTMLProps, + useEffect, + useState, + useCallback, + useRef, +} from "react"; import { IconButton } from "./button"; export function Popover(props: { @@ -488,3 +494,35 @@ export function Selector(props: { ); } + +export function FullScreen(props: any) { + const { children, right = 10, top = 10, ...rest } = props; + const ref = useRef(); + const [fullScreen, setFullScreen] = useState(false); + const toggleFullscreen = useCallback(() => { + if (!document.fullscreenElement) { + ref.current?.requestFullscreen(); + } else { + document.exitFullscreen(); + } + }, []); + useEffect(() => { + document.addEventListener("fullscreenchange", (e) => { + if (e.target === ref.current) { + setFullScreen(!!document.fullscreenElement); + } + }); + }, []); + return ( +
+
+ : } + onClick={toggleFullscreen} + bordered + /> +
+ {children} +
+ ); +}