diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/PDFViewer.props.ts b/packages/common/components/MediaViewer/sub-components/PDFViewer/PDFViewer.props.ts index a083156317..8223ad0c09 100644 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/PDFViewer.props.ts +++ b/packages/common/components/MediaViewer/sub-components/PDFViewer/PDFViewer.props.ts @@ -17,4 +17,11 @@ interface PDFViewerProps { handleChangeVersion: (arg: string) => void; // temp } +export type BookMark = { + description: string; + level: number; + page: number; + y: number; +}; + export default PDFViewerProps; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/index.tsx b/packages/common/components/MediaViewer/sub-components/PDFViewer/index.tsx index 16778af0a5..2e133ce676 100644 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/index.tsx +++ b/packages/common/components/MediaViewer/sub-components/PDFViewer/index.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useLayoutEffect, useState, useRef } from "react"; import { loadScript, combineUrl } from "@docspace/common/utils"; -import PDFViewerProps from "./PDFViewer.props"; +import PDFViewerProps, { BookMark } from "./PDFViewer.props"; import ViewerLoader from "../ViewerLoader"; import MainPanel from "./ui/MainPanel"; import Sidebar from "./ui/Sidebar"; @@ -17,7 +17,7 @@ import { import { ToolbarActionType } from "../../helpers"; import { ToolbarItemType } from "../ImageViewerToolbar/ImageViewerToolbar.props"; -import "./lib"; +// import "./lib"; // import { isDesktop } from "react-device-detect";? const pdfViewerId = "pdf-viewer"; @@ -33,8 +33,11 @@ function PDFViewer({ setIsPDFSidebarOpen, }: PDFViewerProps) { const containerRef = useRef(null); + const pdfViewer = useRef(null); + const pdfThumbnail = useRef(null); const [file, setFile] = useState(); + const [bookmarks, setBookmarks] = useState([]); const [isError, setIsError] = useState(false); @@ -49,10 +52,8 @@ function PDFViewer({ const [isLoadingFile, setIsLoadingFile] = useState(false); const resize = () => { - //@ts-ignore - window.Viewer && window.Viewer.resize(); - //@ts-ignore - window.Thumbnails && window.Thumbnails.resize(); + pdfViewer.current?.resize(); + pdfThumbnail.current?.resize(); }; useEffect(() => { @@ -63,6 +64,31 @@ function PDFViewer({ }; }, []); + const initViewer = () => { + console.log("init PDF Viewer"); + + //@ts-ignore + pdfViewer.current = new window.AscViewer.CViewer("mainPanel", { + theme: { type: "dark" }, + }); + //@ts-ignore + pdfThumbnail.current = + //@ts-ignore + pdfViewer.current.createThumbnails("viewer-thumbnail"); + //@ts-ignore + pdfViewer.current.registerEvent( + "onStructure", + function (structure: BookMark[]) { + setBookmarks(structure); + } + ); + + console.log(pdfThumbnail.current); + console.log(pdfViewer.current); + // console.log(pdfViewer.current.navigate()); + console.log(pdfViewer.current.navigateToPage); + }; + useLayoutEffect(() => { const origin = window.location.origin; //@ts-ignore @@ -74,17 +100,7 @@ function PDFViewer({ combineUrl(origin, path), pdfViewerId, () => { - //@ts-ignore - window.Viewer = new window.AscViewer.CViewer("mainPanel", { - theme: { type: "dark" }, - }); - //@ts-ignore - window.Thumbnails = - //@ts-ignore - window.Viewer.createThumbnails("viewer-thumbnail"); - //@ts-ignore - window.Thumbnails.setZoom(0.2); - + initViewer(); setIsLoadedViewerScript(true); setIsLoadingScript(false); }, @@ -99,6 +115,7 @@ function PDFViewer({ useEffect(() => { setIsLoadingFile(true); + setFile(undefined); fetch(src) .then((value) => { return value.blob(); @@ -123,17 +140,12 @@ function PDFViewer({ if (isLoadedViewerScript && !isLoadingFile && file) { try { if (!containerRef.current?.hasChildNodes()) { - //@ts-ignore - window.Viewer = new window.AscViewer.CViewer("mainPanel", { - theme: { type: "dark" }, - }); - //@ts-ignore - window.Thumbnails = - //@ts-ignore - window.Viewer.createThumbnails("viewer-thumbnail"); + console.log(""); + initViewer(); } + console.log("open"); //@ts-ignore - window.Viewer.open(file); + pdfViewer.current?.open(file); resize(); } catch (error) { setIsError(true); @@ -157,6 +169,10 @@ function PDFViewer({ } } + function navigate(page: number) { + pdfViewer.current.navigate(page); + } + if (isError) { return ( @@ -176,7 +192,9 @@ function PDFViewer({ void; +} + +export default BookmarksProps; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/Bookmarks/index.tsx b/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/Bookmarks/index.tsx new file mode 100644 index 0000000000..ea96bd2e3f --- /dev/null +++ b/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/Bookmarks/index.tsx @@ -0,0 +1,52 @@ +import React from "react"; +import styled from "styled-components"; +import CustomScrollbarsVirtualList from "@docspace/components/scrollbar/custom-scrollbars-virtual-list"; + +import BookmarksProps from "./Bookmarks.props"; + +const List = styled.ul` + padding-left: 16px; + padding-right: 30px; + + list-style: none; + margin-top: 0px; + + display: flex; + flex-direction: column; +`; + +const Item = styled.li` + color: #ffffff; + padding: 0 16px; + font-weight: 400; + font-size: 13px; + line-height: 20px; + + cursor: pointer; + + :hover { + background: #474747; + } +`; + +const Text = styled.p` + margin: 0; + border-bottom: 1px solid #474747; + padding: 6px 0; +`; + +function Bookmarks({ bookmarks, navigate }: BookmarksProps) { + return ( + + + {bookmarks.map((item, index) => ( + + navigate(index)}>{item.description} + + ))} + + + ); +} + +export default Bookmarks; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/Sidebar.props.ts b/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/Sidebar.props.ts new file mode 100644 index 0000000000..c3cc24764d --- /dev/null +++ b/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/Sidebar.props.ts @@ -0,0 +1,11 @@ +import { Dispatch, SetStateAction } from "react"; +import { BookMark } from "../../PDFViewer.props"; + +interface SidebarProps { + isPanelOpen: boolean; + setIsPDFSidebarOpen: Dispatch>; + bookmarks: BookMark[]; + navigate: (page: number) => void; +} + +export default SidebarProps; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/Sidebar.styled.ts b/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/Sidebar.styled.ts new file mode 100644 index 0000000000..75c247186c --- /dev/null +++ b/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/Sidebar.styled.ts @@ -0,0 +1,46 @@ +import styled from "styled-components"; +import ArticleShowMenuReactSvgUrl from "PUBLIC_DIR/images/article-show-menu.react.svg"; + +export const SidebarContainer = styled.aside<{ isPanelOpen: boolean }>` + display: flex; + flex-direction: column; + + height: 100vh; + width: 100%; + + background: #333333; + + max-width: ${(props) => (props.isPanelOpen ? "306px" : "0px")}; + visibility: ${(props) => (props.isPanelOpen ? "visible" : "hidden")}; + overflow: ${(props) => (props.isPanelOpen ? "visible" : "hidden")}; +`; + +export const SidebarHeader = styled.div` + display: flex; + justify-content: space-between; + align-items: center; + padding: 30px; + + svg { + cursor: pointer; + path { + fill: rgba(255, 255, 255, 0.6); + } + } +`; + +export const Thumbnails = styled.section<{ visible: boolean }>` + height: 100%; + width: 100%; + + position: relative; + + display: ${(props) => (props.visible ? "block" : "none")}; + + visibility: ${(props) => (props.visible ? "visible" : "hidden")}; + opacity: ${(props) => (props.visible ? 1 : 0)}; +`; + +export const HideSidebarIcon = styled(ArticleShowMenuReactSvgUrl)` + transform: rotate(180deg); +`; diff --git a/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/index.tsx b/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/index.tsx index d51b82e3a3..943b7ce3f3 100644 --- a/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/index.tsx +++ b/packages/common/components/MediaViewer/sub-components/PDFViewer/ui/SideBar/index.tsx @@ -1,59 +1,28 @@ -import React, { Dispatch, SetStateAction, useState } from "react"; -import styled from "styled-components"; +import React, { useState } from "react"; +import Bookmarks from "../Bookmarks"; + +import SidebarProps from "./Sidebar.props"; +import { + HideSidebarIcon, + SidebarContainer, + SidebarHeader, + Thumbnails, +} from "./Sidebar.styled"; -import ArticleShowMenuReactSvgUrl from "PUBLIC_DIR/images/article-show-menu.react.svg"; import ViewTilesIcon from "PUBLIC_DIR/images/view-tiles.react.svg"; import ViewRowsIcon from "PUBLIC_DIR/images/view-rows.react.svg"; -type PanelProps = { - isPanelOpen: boolean; - setIsPDFSidebarOpen: Dispatch>; -}; - -const SidebarContainer = styled.aside<{ isPanelOpen: boolean }>` - display: flex; - flex-direction: column; - - height: 100vh; - width: 100%; - - background: #333333; - - max-width: ${(props) => (props.isPanelOpen ? "306px" : "0px")}; - visibility: ${(props) => (props.isPanelOpen ? "visible" : "hidden")}; -`; - -const SidebarHeader = styled.div` - display: flex; - justify-content: space-between; - align-items: center; - padding: 30px; - - svg { - cursor: pointer; - path { - fill: rgba(255, 255, 255, 0.6); - } - } -`; - -const Thumbnails = styled.section` - height: 100%; - width: 100%; - - position: relative; -`; - -const HideSidebarIcon = styled(ArticleShowMenuReactSvgUrl)` - transform: rotate(180deg); -`; - -// import ArticleShowMenuReactSvgUrl from "PUBLIC_DIR/images/article-show-menu.react.svg?url"; - -function Sidebar({ isPanelOpen, setIsPDFSidebarOpen }: PanelProps) { +function Sidebar({ + bookmarks, + isPanelOpen, + setIsPDFSidebarOpen, + navigate, +}: SidebarProps) { const [toggle, setToggle] = useState(false); - const handleToggle = () => setToggle((prev) => !prev); + const handleToggle = () => { + setToggle((prev) => !prev); + }; const closeSidebar = () => setIsPDFSidebarOpen(false); @@ -65,7 +34,8 @@ function Sidebar({ isPanelOpen, setIsPDFSidebarOpen }: PanelProps) { })} - + {toggle && } + ); }