diff --git a/src/middleware.tsx b/src/middleware.tsx index 7d16ca3..1bb00b0 100644 --- a/src/middleware.tsx +++ b/src/middleware.tsx @@ -1,10 +1,11 @@ import { Middleware, route } from "@/routing"; import { useSelector } from "react-redux"; -import { isReady } from "@/state/reducer"; +import { AppState, isReady } from "@/state/reducer"; import { Redirect } from "react-router-dom"; import React from "react"; +import { UserState } from "@/state/reducer/user"; -export const isReadyMiddleware: Middleware<any, any> = next => { +export const isReadyMiddleware: Middleware<any, any> = next => isLoggedInMiddleware(() => { const ready = useSelector(isReady); if (ready) { @@ -12,4 +13,14 @@ export const isReadyMiddleware: Middleware<any, any> = next => { } return <Redirect to={ route("edition_pick") } />; +}) + +export const isLoggedInMiddleware: Middleware<any, any> = next => { + const user = useSelector<AppState>(state => state.user) as UserState; + + if (user.loggedIn) { + return next(); + } + + return <Redirect to={ route("login") } />; } diff --git a/src/routing.tsx b/src/routing.tsx index f9ef81f..2a5eddd 100644 --- a/src/routing.tsx +++ b/src/routing.tsx @@ -7,7 +7,7 @@ import SubmitPlanPage from "@/pages/internship/plan"; import { UserLoginPage } from "@/pages/user/login"; import { RegisterEditionPage } from "@/pages/edition/register"; import PickEditionPage from "@/pages/edition/pick"; -import { isReadyMiddleware } from "@/middleware"; +import { isLoggedInMiddleware, isReadyMiddleware } from "@/middleware"; type Route = { name?: string; @@ -30,16 +30,16 @@ export function processMiddlewares<TArgs extends any[]>(middleware: Middleware<a } export const routes: Route[] = [ - { name: "home", path: "/", exact: true, content: () => <MainPage/>, middlewares: [ isReadyMiddleware ] }, + { name: "home", path: "/", exact: true, content: () => <MainPage/>, middlewares: [ isLoggedInMiddleware ] }, // edition - { name: "edition_register", path: "/edition/register", exact: true, content: () => <RegisterEditionPage/> }, - { name: "edition_pick", path: "/edition/pick", exact: true, content: () => <PickEditionPage/> }, + { name: "edition_register", path: "/edition/register", exact: true, content: () => <RegisterEditionPage/>, middlewares: [ isLoggedInMiddleware ] }, + { name: "edition_pick", path: "/edition/pick", exact: true, content: () => <PickEditionPage/>, middlewares: [ isLoggedInMiddleware ] }, // internship { name: "internship_proposal", path: "/internship/proposal", exact: true, content: () => <InternshipProposalFormPage/>, middlewares: [ isReadyMiddleware ] }, { name: "internship_proposal_preview", path: "/internship/preview/proposal", exact: true, content: () => <InternshipProposalPreviewPage/>, middlewares: [ isReadyMiddleware ] }, - { name: "internship_plan", path: "/internship/plan", exact: true, content: () => <SubmitPlanPage/> }, + { name: "internship_plan", path: "/internship/plan", exact: true, content: () => <SubmitPlanPage/>, middlewares: [ isReadyMiddleware ] }, // user { name: "user_login", path: "/user/login", content: () => <UserLoginPage/> }, diff --git a/src/state/reducer/user.ts b/src/state/reducer/user.ts index ae868a6..1757986 100644 --- a/src/state/reducer/user.ts +++ b/src/state/reducer/user.ts @@ -1,4 +1,3 @@ -import { Reducer } from "react"; import { UserAction, UserActions } from "@/state/actions/user"; export type UserState = { @@ -10,7 +9,7 @@ const initialUserState: UserState = { loggedIn: false, } -const userReducer: Reducer<UserState, UserAction> = (state = initialUserState, action) => { +const userReducer = (state: UserState = initialUserState, action: UserAction): UserState => { switch (action.type) { case UserActions.Login: return {