1
0
Fork 0
This repository has been archived on 2024-09-27. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
bearlypassing/frontend/src/App.tsx
2024-09-27 11:17:53 +01:00

66 lines
No EOL
2.5 KiB
TypeScript

import React, {ReactNode} from 'react';
import {useState} from 'react';
import {PowerSchoolData, Section, Page} from "./interfaces";
import {Container} from "react-bootstrap";
import TeacherInterface from "./views/Teachers";
import Header from "./components/navigation/Header";
import Footer from "./components/navigation/Footer";
import LoginInterface from "./views/Login";
import SectionsInterface from "./views/Sections";
import DashboardInterface from "./views/Dashboard";
import ScheduleInterface from "./views/Schedule";
import GradesInterface from "./views/Grades";
import {globalContext} from "./contexts";
export const App = () => {
// State holding the PowerSchool data object. This has everything that needs to be displayed
const [psData, setPsData] = useState<PowerSchoolData | null>(null);
// States for page routing
const [currentPage, setCurrentPage] = useState<Page>(Page.login);
const [selectedSection, setSelectedSection] = useState<Section>();
// Set page to login if no data is loaded
if (psData === null && currentPage !== Page.login) {
setCurrentPage(Page.login)
}
// Redirect from login to dashboard if data has been loaded
if (psData !== null && currentPage === Page.login) {
setCurrentPage(Page.dashboard)
}
// If the grads page has been selected but no section has been defined, redirect to the sections page to avoid an error
if (currentPage === Page.sectionGrades && selectedSection === undefined) {
setCurrentPage(Page.sections)
}
// Mapping the page enum to page components
const router: { [K in Page]: ReactNode } = {
[Page.login]: <LoginInterface setPsData={setPsData}/>,
[Page.dashboard]: <DashboardInterface/>,
[Page.sections]: <SectionsInterface/>,
// @ts-ignore
[Page.sectionGrades]: <GradesInterface section={selectedSection}/>,
[Page.schedule]: <ScheduleInterface/>,
[Page.teachers]: <TeacherInterface/>
};
return (
<>
{/* @ts-ignore */}
<globalContext.Provider value={{psData: psData, currentPage: currentPage, setCurrentPage: setCurrentPage, setCurrentSection: setSelectedSection}}>
<Header signOutFunction={() => {
setPsData(null);
setCurrentPage(Page.login);
}}/>
<Container className="App mb-4 flex-shrink-0">
{router[currentPage]}
</Container>
<Footer/>
</globalContext.Provider>
</>
);
};
export default App;