From b23aa7263d5000ed07026b82cb4dbb6d57bf2c89 Mon Sep 17 00:00:00 2001 From: developomp Date: Tue, 10 Aug 2021 12:45:43 +0900 Subject: [PATCH] made toc collapsable --- source/package.json | 1 + source/src/pages/Page.tsx | 77 +++++++++++++++++++++++++++++++-------- source/yarn.lock | 5 +++ 3 files changed, 68 insertions(+), 15 deletions(-) diff --git a/source/package.json b/source/package.json index c097de7..80b07ba 100644 --- a/source/package.json +++ b/source/package.json @@ -35,6 +35,7 @@ "marked": "^2.1.3", "query-string": "^7.0.1", "react": "^17.0.2", + "react-collapse": "^5.1.0", "react-date-range": "^1.3.0", "react-device-detect": "^1.17.0", "react-dom": "^17.0.2", diff --git a/source/src/pages/Page.tsx b/source/src/pages/Page.tsx index 362ea69..5433ce7 100644 --- a/source/src/pages/Page.tsx +++ b/source/src/pages/Page.tsx @@ -3,6 +3,8 @@ import marked from "marked" import { Helmet } from "react-helmet-async" import { Link } from "react-router-dom" import styled from "styled-components" +import { Collapse } from "react-collapse" +import storage from "local-storage-fallback" import theming from "../theming" @@ -16,6 +18,8 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" import { faBook, faCalendar, + faCaretDown, + faCaretUp, faHourglass, } from "@fortawesome/free-solid-svg-icons" @@ -69,6 +73,22 @@ const StyledDisabledLink = styled.div` user-select: none; ` +const StyledTocToggleButton = styled.button` + border: none; + background-color: rgba(0, 0, 0, 0); + color: ${(props) => + theming.theme(props.theme.currentTheme, { + light: "black", + dark: "white", + })}; +` + +const StyledCollapseContainer = styled.div` + * { + transition: height 200ms ease-out; + } +` + interface PageProps {} interface PageState { @@ -81,6 +101,7 @@ interface PageState { prev: string | null next: string | null } | null + isTocOpened: boolean loading: boolean } @@ -111,15 +132,23 @@ class NextPrev extends React.Component { export default class Page extends React.Component { constructor(props) { super(props) + this.state = { fetchedPage: undefined, isUnsearchable: false, isSeries: false, seriesData: null, + isTocOpened: storage.getItem("isTocOpened") == "true", loading: true, } } + componentDidUpdate(_, prevState) { + if (this.state.isTocOpened !== prevState.isTocOpened) { + storage.setItem("isTocOpened", this.state.isTocOpened.toString()) + } + } + async componentDidMount() { let _isUnsearchable = false let _isSeries = false @@ -265,26 +294,44 @@ export default class Page extends React.Component { )} {/* Horizontal Separator */} +
+ + Table of Content + { + this.setState({ + isTocOpened: !this.state.isTocOpened, + }) + }} + > + {this.state.isTocOpened ? ( + + ) : ( + + )} + { - // add toc if it exists + // add table of contents if it exists this.state.fetchedPage.toc && ( - <> -
- Table of Content: -
-
-
- + + +
+
+
+
+
) } +