feat: add LogoutPage

This commit is contained in:
Paul Pan 2024-02-22 19:37:25 +08:00
parent 7788160267
commit 263e9a68bc
4 changed files with 50 additions and 15 deletions

View File

@ -16,7 +16,7 @@ export const authSlice = createSlice({
reducers: {
load: (_state) => {
const token = localStorage.getItem("token");
return { ...initialState, token: token };
return { token: token };
},
},
extraReducers: (builder) => {
@ -26,18 +26,18 @@ export const authSlice = createSlice({
console.log(action);
const { token } = action.payload.body;
localStorage.setItem("token", token);
return { profile: null, token: token };
return { token: token };
})
.addMatcher(userApi.endpoints.logout.matchFulfilled, (_state, _action) => {
// Logout Success
localStorage.removeItem("token");
return initialState;
return { token: null };
})
.addMatcher(userApi.endpoints.login.matchRejected, (_state, action) => {
// Login Failed
console.error("Login Failed", action.payload);
localStorage.removeItem("token");
return initialState;
return { token: null };
});
},
});

View File

@ -1,13 +1,9 @@
import { Heading, Link } from "@chakra-ui/react";
import { Link as ReactRouterLink } from "react-router-dom";
import { Heading } from "@chakra-ui/react";
export default function HomePage() {
return (
<>
<Heading>Hello World!</Heading>
<Link as={ReactRouterLink} to="/test/protected">
test protected middleware
</Link>
</>
);
}

29
src/pages/LogoutPage.tsx Normal file
View File

@ -0,0 +1,29 @@
import { useEffect } from "react";
import { useNavigate } from "react-router-dom";
import { Box, Heading, Text } from "@chakra-ui/react";
import { RepeatClockIcon } from "@chakra-ui/icons";
import { useLogoutMutation } from "../app/services/user";
export default function LogoutPage() {
const navigate = useNavigate();
const [logout, { isUninitialized, isLoading }] = useLogoutMutation();
useEffect(() => void logout(), [logout]);
useEffect(() => {
if (isUninitialized || isLoading) return;
const timer = setTimeout(() => {
navigate("/");
}, 1500);
return () => clearTimeout(timer);
}, [isLoading, isUninitialized, navigate]);
return (
<Box textAlign="center" py={10} px={6}>
<RepeatClockIcon boxSize={"50px"} color={"green"} />
<Heading as="h2" size="lg" mt={6} mb={2}>
Success
</Heading>
<Text color={"gray.500"}>See you next time! You will be redirected to the home page in a few seconds.</Text>
</Box>
);
}

View File

@ -3,10 +3,11 @@ import type { RouteObject } from "react-router-dom";
import { Root } from "./pages/Root";
import { ErrorPage } from "./pages/ErrorPage";
import { RequireAuth } from "./components/RequireAuth";
// import { RequireAuth } from "./components/RequireAuth";
const HomePage = lazy(() => import("./pages/HomePage"));
const LoginPage = lazy(() => import("./pages/LoginPage"));
const LogoutPage = lazy(() => import("./pages/LogoutPage"));
export const router: RouteObject[] = [
{
@ -14,12 +15,21 @@ export const router: RouteObject[] = [
element: <Root />,
errorElement: <ErrorPage />,
children: [
{ index: true, element: <HomePage /> },
{ path: "home", element: <HomePage /> },
{ path: "login", element: <LoginPage /> },
{
path: "/test",
children: [{ path: "protected", element: <RequireAuth>Protected</RequireAuth> }],
index: true,
element: <HomePage />,
},
{
path: "home",
element: <HomePage />,
},
{
path: "login",
element: <LoginPage />,
},
{
path: "logout",
element: <LogoutPage />,
},
],
},