Skip to content
Snippets Groups Projects
Commit eb7e04a9 authored by danieldeng2's avatar danieldeng2
Browse files

Refactor icon click to use react states

parent 540ddb36
No related branches found
No related tags found
No related merge requests found
...@@ -13,35 +13,53 @@ import { ...@@ -13,35 +13,53 @@ import {
} from "@fortawesome/free-solid-svg-icons"; } from "@fortawesome/free-solid-svg-icons";
import LeftBar from "./organisms/LeftBar"; import LeftBar from "./organisms/LeftBar";
const App: React.FC = () => { type MyState = {
const horizontalBarPages = [ isToggled: boolean;
{ name: "Courses", path: "/courses", icon: faChalkboardTeacher },
{ name: "Timetable", path: "/timetable", icon: faCalendarWeek },
{ name: "Exams", path: "/exams", icon: faBookOpen },
{ name: "Other", path: "/other", icon: faEllipsisH },
];
const topBarRoutes = horizontalBarPages.map(({ name, path }) => (
<Route path={path} key={name}>
<ExamplePage name={name} />
</Route>
));
return (
<>
<TopBar pages={horizontalBarPages} />
<div id="wrapper">
<LeftBar/>
<Switch>
<Route exact path="/" render={() => <Redirect to="/courses" />} />
{topBarRoutes}
</Switch>
</div>
<BottomBar pages={horizontalBarPages} />
</>
);
}; };
class App extends React.Component<{}, MyState> {
constructor(props: {}) {
super(props);
this.state = {isToggled: false};
}
handleIconClick(e: React.MouseEvent<HTMLImageElement>) {
e.preventDefault();
this.setState(state => ({
isToggled: !state.isToggled
}));
}
render() {
const horizontalBarPages = [
{ name: "Courses", path: "/courses", icon: faChalkboardTeacher },
{ name: "Timetable", path: "/timetable", icon: faCalendarWeek },
{ name: "Exams", path: "/exams", icon: faBookOpen },
{ name: "Other", path: "/other", icon: faEllipsisH },
];
const topBarRoutes = horizontalBarPages.map(({ name, path }) => (
<Route path={path} key={name}>
<ExamplePage name={name} />
</Route>
));
return (
<>
<TopBar pages={horizontalBarPages} onIconClick={e => this.handleIconClick(e)}/>
<div id="wrapper" className={this.state.isToggled ? "toggled" : ""}>
<LeftBar />
<Switch>
<Route exact path="/" render={() => <Redirect to="/courses" />} />
{topBarRoutes}
</Switch>
</div>
<BottomBar pages={horizontalBarPages} />
</>
);
}
}
export default App; export default App;
import React from "react";
import Button from "react-bootstrap/Button";
const LeftBarTabGroup: React.FC = () => {
return (
<>
<h1 className="exam-outline-heading">Sort</h1>
<div
className="btn-group-vertical"
role="group"
id="exam-outline-button-group"
>
<Button className="exam-outline-button">Progress</Button>
<Button className="exam-outline-button-a active" type="button">
Course Title
</Button>
<Button className="exam-outline-button">Course Code</Button>
<Button className="exam-outline-button">Term</Button>
</div>
</>
);
};
export default LeftBarTabGroup;
...@@ -3,31 +3,27 @@ import Navbar from "react-bootstrap/Navbar"; ...@@ -3,31 +3,27 @@ import Navbar from "react-bootstrap/Navbar";
import logo from "images/logo.svg"; import logo from "images/logo.svg";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
const NavBarBrand: React.FC = () => { interface NavBarBrandProps {
onClick: (event: React.MouseEvent<HTMLImageElement>) => void;
}
const NavBarBrand: React.FC<NavBarBrandProps> = ({
onClick,
}: NavBarBrandProps) => {
return ( return (
<Navbar.Brand className="brand-container"> <Navbar.Brand className="brand-container">
<img <img
src={logo} src={logo}
width="30" width="30"
height="30" height="30"
className="d-inline-block align-center brand-image" className="d-inline-block align-center brand-image"
alt="React Bootstrap logo" alt="React Bootstrap logo"
onClick={(e) => { onClick={(e) => onClick(e)}
// TODO: change to using react states />{" "}
e.preventDefault(); <Link to="/" style={{ textDecoration: "none" }}>
const wrapper = document.querySelector("#wrapper") || document.createElement("div"); Scientia
if (wrapper.classList.contains("toggled")) { </Link>
wrapper.classList.remove("toggled"); </Navbar.Brand>
} else {
wrapper.classList.add("toggled");
}
}}
/>{" "}
<Link to="/" style={{ textDecoration: "none" }}>
Scientia
</Link>
</Navbar.Brand>
); );
}; };
......
import React from "react"; import React from "react";
import Button from "react-bootstrap/Button"; import LeftBarTabGroup from "components/molecules/LeftBarTabGroup";
const LeftBar: React.FC = () => { const LeftBar: React.FC = () => {
return ( return (
<div id="sidebar-wrapper"> <div id="sidebar-wrapper">
<div> <p className="sidebar-status">1 UPDATE</p>
<p className="sidebar-status">1 UPDATE</p>
<h1 className="exam-outline-heading">Sort</h1> <LeftBarTabGroup />
</div>
<div
className="btn-group-vertical"
role="group"
id="exam-outline-button-group"
>
<Button className="exam-outline-button">
Progress
</Button>
<Button
className="exam-outline-button-a active"
type="button"
>
Course Title
</Button>
<Button className="exam-outline-button">
Course Code
</Button>
<Button className="exam-outline-button">
Term
</Button>
</div>
</div> </div>
); );
}; };
......
...@@ -9,16 +9,17 @@ export interface TopBarProps { ...@@ -9,16 +9,17 @@ export interface TopBarProps {
pages: { pages: {
name: string; name: string;
path: string; path: string;
}[]; }[];
onIconClick: (event: React.MouseEvent<HTMLImageElement>) => void;
} }
const TopBar: React.FC<TopBarProps> = ({ pages }: TopBarProps) => { const TopBar: React.FC<TopBarProps> = ({ pages, onIconClick}: TopBarProps) => {
return ( return (
<Navbar className="top-bar" sticky="top" expand="lg" variant="light"> <Navbar className="top-bar" sticky="top" expand="lg" variant="light">
<Container fluid> <Container fluid>
<NavBarBrand/> <NavBarBrand onClick={onIconClick}/>
<NavBarTabGroup pages={pages}/> <NavBarTabGroup pages={pages}/>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment