Skip to content
Snippets Groups Projects
App.tsx 4.51 KiB
Newer Older
import React from "react";
import "./App.scss";
import TopBar from "./organisms/TopBar";
import BottomBar from "./organisms/BottomBar";
danieldeng2's avatar
danieldeng2 committed
import {
  faBookOpen,
danieldeng2's avatar
danieldeng2 committed
  faCalendarWeek,
danieldeng2's avatar
danieldeng2 committed
  faChalkboardTeacher,
danieldeng2's avatar
danieldeng2 committed
} from "@fortawesome/free-solid-svg-icons";
import StandardView from "./pages/StandardView";
danieldeng2's avatar
danieldeng2 committed
import { Switch, Route } from "react-router-dom";
import SignIn from "./pages/SignIn";
danieldeng2's avatar
danieldeng2 committed
import SettingsModal from "./pages/SettingsModal";
danieldeng2's avatar
danieldeng2 committed
type AppState = {
  toggledLeft: boolean;
danieldeng2's avatar
danieldeng2 committed
  toggledRight: boolean;
  showSettings: boolean;
  fileView: string;
danieldeng2's avatar
danieldeng2 committed
class App extends React.Component<{}, AppState> {
  width = window.innerWidth;
danieldeng2's avatar
danieldeng2 committed
	isTimelineView = false;
	
  constructor(props: {}) {
    super(props);
danieldeng2's avatar
danieldeng2 committed
    this.state = {
      toggledLeft: false,
      toggledRight: false,
      showSettings: false,
danieldeng2's avatar
danieldeng2 committed
      fileView: localStorage.getItem("fileView") || "card",
danieldeng2's avatar
danieldeng2 committed
    };
danieldeng2's avatar
danieldeng2 committed
    document.documentElement.style.fontSize = `${
      localStorage.getItem("interfaceSize") || "90"
    }%`;

    const currentTheme = localStorage.getItem("theme");
    if (currentTheme === "light" || currentTheme === "dark") {
danieldeng2's avatar
danieldeng2 committed
      document.documentElement.setAttribute("data-theme", currentTheme);
    } else {
      let mq = window.matchMedia("(prefers-color-scheme: dark)");
      mq.addListener((mq) => this.setDarkTheme(mq.matches));
      this.setDarkTheme(mq.matches);

    window.addEventListener("resize", () => {
      if (window.innerWidth !== this.width) {
        this.width = window.innerWidth;
        this.showOrHideSideBars();
      }
    });
danieldeng2's avatar
danieldeng2 committed
		this.showOrHideSideBars();
  setDarkTheme(toSet: boolean) {
    document.documentElement.setAttribute(
      "data-theme",
      toSet ? "dark" : "light"
    );
  }

danieldeng2's avatar
danieldeng2 committed
  toggleLeftBar() {
    if (window.innerWidth <= 1024) {
      this.setState({
danieldeng2's avatar
danieldeng2 committed
        toggledRight: false,
danieldeng2's avatar
danieldeng2 committed
    this.setState((state) => ({
      toggledLeft: !state.toggledLeft,
danieldeng2's avatar
danieldeng2 committed
    }));
danieldeng2's avatar
danieldeng2 committed
  toggleRightBar() {
    if (window.innerWidth <= 1024) {
danieldeng2's avatar
danieldeng2 committed
      this.setState({
danieldeng2's avatar
danieldeng2 committed
        toggledLeft: false,
danieldeng2's avatar
danieldeng2 committed
    this.setState((state) => ({
      toggledRight: !state.toggledRight,
danieldeng2's avatar
danieldeng2 committed
    }));
  showOrHideSideBars() {
danieldeng2's avatar
danieldeng2 committed
    if (window.innerWidth <= 1024 || this.isTimelineView) {
      this.setState({
        toggledLeft: false,
danieldeng2's avatar
danieldeng2 committed
        toggledRight: false,
      });
    } else {
      this.setState({
        toggledLeft: true,
danieldeng2's avatar
danieldeng2 committed
        toggledRight: true,
  }

  setFileView(view: string) {
    this.setState({ fileView: view });
    localStorage.setItem("fileView", view);
  }
  render() {
    const horizontalBarPages = [
      { name: "Dashboard", path: "/dashboard", icon: faHome },
danieldeng2's avatar
danieldeng2 committed
      { name: "Modules", path: "/modules", icon: faChalkboardTeacher },
danieldeng2's avatar
danieldeng2 committed
      { name: "Timeline", path: "/timeline", icon: faCalendarWeek },
danieldeng2's avatar
danieldeng2 committed
      { name: "Exams", path: "/exams", icon: faBookOpen },
danieldeng2's avatar
danieldeng2 committed
        <SettingsModal
          show={this.state.showSettings}
          onHide={() => this.setState({ showSettings: false })}
          fileView={this.state.fileView}
          onCardViewClick={() => this.setFileView("card")}
          onListViewClick={() => this.setFileView("list")}
          setDarkTheme={(b) => this.setDarkTheme(b)}
danieldeng2's avatar
danieldeng2 committed
        <Switch>
          <Route path="/signin">
            <SignIn />
          </Route>
danieldeng2's avatar
danieldeng2 committed
          <Route path="/">
            <TopBar
              pages={horizontalBarPages}
danieldeng2's avatar
danieldeng2 committed
              onFavIconClick={(e) => {
danieldeng2's avatar
danieldeng2 committed
                e.preventDefault();
                this.toggleLeftBar();
              }}
danieldeng2's avatar
danieldeng2 committed
              onUserIconClick={(e) => {
danieldeng2's avatar
danieldeng2 committed
                e.preventDefault();
                this.toggleRightBar();
              }}
            />
danieldeng2's avatar
danieldeng2 committed
            <StandardView
danieldeng2's avatar
danieldeng2 committed
              onSettingsClick={() => this.setState({ showSettings: true })}
danieldeng2's avatar
danieldeng2 committed
              toggledLeft={this.state.toggledLeft}
              toggledRight={this.state.toggledRight}
              initTimelineSideBar={() => {
danieldeng2's avatar
danieldeng2 committed
								this.isTimelineView = true;
                this.showOrHideSideBars();
							}}
							revertTimelineSideBar={() => {
danieldeng2's avatar
danieldeng2 committed
                this.isTimelineView = false;
                this.showOrHideSideBars();
              }}
danieldeng2's avatar
danieldeng2 committed
              onOverlayClick={(e) => {
danieldeng2's avatar
danieldeng2 committed
                e.preventDefault();
                this.setState({
                  toggledLeft: false,
                  toggledRight: false,
                });
              fileView={this.state.fileView}
danieldeng2's avatar
danieldeng2 committed
            />
danieldeng2's avatar
danieldeng2 committed
            <BottomBar pages={horizontalBarPages} />
          </Route>
        </Switch>
export default App;