Browse Source

ログイン後に対象のURLへ遷移するように修正

develop
sosuke.iwabuchi 2 years ago
parent
commit
cc62fe93e5
4 changed files with 44 additions and 12 deletions
  1. +2
    -2
      src/components/LoadingScreen.tsx
  2. +29
    -0
      src/guards/AuthGuard.tsx
  3. +5
    -1
      src/pages/auth/login.tsx
  4. +8
    -9
      src/routes/sub/dashboard.tsx

+ 2
- 2
src/components/LoadingScreen.tsx View File

@@ -3,14 +3,14 @@ import useBackDrop from "hooks/useBackDrop";
import { useEffect } from "react";

export default function LoadingScreen() {
const { setShowBackDrop } = useBackDrop();
const { setShowBackDrop, showBackDrop } = useBackDrop();

useEffect(() => {
setShowBackDrop(true);
return () => {
setShowBackDrop(false);
};
}, []);
}, [showBackDrop]);

return <Box>Loading...</Box>;
}

+ 29
- 0
src/guards/AuthGuard.tsx View File

@@ -0,0 +1,29 @@
import { HasChildren } from "@types";
import useAuth from "hooks/useAuth";
import Login from "pages/auth/login";
import { useState } from "react";
import { Navigate, useLocation } from "react-router-dom";

export default function AuthGuard({ children }: HasChildren) {
const { authenticated } = useAuth();

const { pathname } = useLocation();

const [requestedLocation, setRequestedLocation] = useState<string | null>(
null
);

if (!authenticated) {
if (pathname !== requestedLocation) {
setRequestedLocation(pathname);
}
return <Login />;
}

if (requestedLocation && pathname !== requestedLocation) {
setRequestedLocation(null);
return <Navigate to={requestedLocation} />;
}

return <>{children}</>;
}

+ 5
- 1
src/pages/auth/login.tsx View File

@@ -9,6 +9,7 @@ import useSnackbarCustom from "hooks/useSnackbarCustom";
import { PageID } from "pages";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { useLocation } from "react-router-dom";
import { getPath } from "routes/path";
import * as Yup from "yup";

@@ -24,6 +25,7 @@ const LoginSchema = Yup.object().shape({

export default function Login() {
const { success, error } = useSnackbarCustom();
const { pathname } = useLocation();

const [message, setMessage] = useState("");
const [sending, setSending] = useState(false);
@@ -49,7 +51,9 @@ export default function Login() {

if (ret) {
success("ログイン成功");
navigateWhenChanged(getPath(PageID.DASHBOARD_OVERVIEW));
if (pathname === getPath(PageID.LOGIN)) {
navigateWhenChanged(getPath(PageID.DASHBOARD_OVERVIEW));
}
} else {
error("ログイン失敗");
setMessage("入力情報を確認してください");


+ 8
- 9
src/routes/sub/dashboard.tsx View File

@@ -1,4 +1,5 @@
import { SeasonTicketContractContextProvider } from "contexts/dashboard/SeasonTicketContractContext";
import AuthGuard from "guards/AuthGuard";
import useAuth from "hooks/useAuth";
import DashboardLayout from "layouts/dashbord";
import { PageID } from "pages";
@@ -8,11 +9,7 @@ import { Loadable } from "routes";
import { getRoute } from "routes/path";

export default function DashboardRoutes(): RouteObject[] {
const { authenticated } = useAuth();

const children: RouteObject[] = useMemo(() => {
if (!authenticated) return [];

const Dashboard = Loadable(lazy(() => import("pages/dashboard")));
const ContractEntry = Loadable(
lazy(() => import("pages/dashboard/contract/entry"))
@@ -74,11 +71,9 @@ export default function DashboardRoutes(): RouteObject[] {
...others,
path: getRoute(pageId),
}));
}, [authenticated]);
}, []);

const seasonTicketContractChildren: RouteObject[] = useMemo(() => {
if (!authenticated) return [];

const ContractList = Loadable(
lazy(() => import("pages/dashboard/contract/list"))
);
@@ -163,11 +158,15 @@ export default function DashboardRoutes(): RouteObject[] {
...others,
path: getRoute(pageId),
}));
}, [authenticated]);
}, []);

return [
{
element: <DashboardLayout />,
element: (
<AuthGuard>
<DashboardLayout />
</AuthGuard>
),
children: children,
},
{


Loading…
Cancel
Save