From 33dda9bf87c2e06acfc3422fc01d24977c4bfa7c Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 6 Dec 2023 23:03:24 +0800 Subject: [PATCH] chore: fix auth status checks --- api/v2/auth_service.go | 3 +++ web/src/pages/DailyReview.tsx | 4 +-- web/src/pages/MemoDetail.tsx | 4 +-- web/src/router/AuthStatusProvider.tsx | 27 +++++++++++++++++++ web/src/router/index.tsx | 37 ++++++++++++++++++++++----- 5 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 web/src/router/AuthStatusProvider.tsx diff --git a/api/v2/auth_service.go b/api/v2/auth_service.go index 4f9cb441..65341f5d 100644 --- a/api/v2/auth_service.go +++ b/api/v2/auth_service.go @@ -14,6 +14,9 @@ func (s *APIV2Service) GetAuthStatus(ctx context.Context, _ *apiv2pb.GetAuthStat if err != nil { return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err) } + if user == nil { + return nil, status.Errorf(codes.Unauthenticated, "user not found") + } return &apiv2pb.GetAuthStatusResponse{ User: convertUserFromStore(user), }, nil diff --git a/web/src/pages/DailyReview.tsx b/web/src/pages/DailyReview.tsx index 7f5d4873..009c7cc4 100644 --- a/web/src/pages/DailyReview.tsx +++ b/web/src/pages/DailyReview.tsx @@ -21,7 +21,7 @@ import { useTranslate } from "@/utils/i18n"; const DailyReview = () => { const t = useTranslate(); const memoStore = useMemoStore(); - const user = useCurrentUser(); + const currentUser = useCurrentUser(); const currentDateStamp = getDateStampByDate(getNormalizedDateString()) as number; const [selectedDateStamp, setSelectedDateStamp] = useState(currentDateStamp as number); const [showDatePicker, toggleShowDatePicker] = useToggle(false); @@ -31,7 +31,7 @@ const DailyReview = () => { const selectedDateStampWithOffset = selectedDateStamp; return ( m.rowStatus === "NORMAL" && - m.creatorUsername === extractUsernameFromName(user.name) && + m.creatorUsername === extractUsernameFromName(currentUser.name) && displayTimestamp >= selectedDateStampWithOffset && displayTimestamp < selectedDateStampWithOffset + DAILY_TIMESTAMP ); diff --git a/web/src/pages/MemoDetail.tsx b/web/src/pages/MemoDetail.tsx index 4139945f..e06261d1 100644 --- a/web/src/pages/MemoDetail.tsx +++ b/web/src/pages/MemoDetail.tsx @@ -27,10 +27,10 @@ const MemoDetail = () => { const t = useTranslate(); const params = useParams(); const navigateTo = useNavigateTo(); + const currentUser = useCurrentUser(); const globalStore = useGlobalStore(); const memoStore = useMemoStore(); const userV1Store = useUserV1Store(); - const currentUser = useCurrentUser(); const [creator, setCreator] = useState(); const { systemStatus } = globalStore.state; const memoId = Number(params.memoId); @@ -101,7 +101,7 @@ const MemoDetail = () => { }; const disableOption = (v: string) => { - const isAdminOrHost = currentUser.role === User_Role.ADMIN || currentUser.role === User_Role.HOST; + const isAdminOrHost = currentUser?.role === User_Role.ADMIN || currentUser?.role === User_Role.HOST; if (v === "PUBLIC" && !isAdminOrHost) { return systemStatus.disablePublicMemos; diff --git a/web/src/router/AuthStatusProvider.tsx b/web/src/router/AuthStatusProvider.tsx new file mode 100644 index 00000000..a3c73846 --- /dev/null +++ b/web/src/router/AuthStatusProvider.tsx @@ -0,0 +1,27 @@ +import { useEffect } from "react"; +import useCurrentUser from "@/hooks/useCurrentUser"; +import useNavigateTo from "@/hooks/useNavigateTo"; + +interface Props { + children: React.ReactNode; +} + +const AuthStatusProvider = (props: Props) => { + const navigateTo = useNavigateTo(); + const currentUser = useCurrentUser(); + + useEffect(() => { + if (!currentUser) { + // If not logged in, redirect to explore page by default. + navigateTo("/explore"); + } + }, []); + + if (!currentUser) { + return null; + } + + return <>{props.children}; +}; + +export default AuthStatusProvider; diff --git a/web/src/router/index.tsx b/web/src/router/index.tsx index 7ec5a537..9f612639 100644 --- a/web/src/router/index.tsx +++ b/web/src/router/index.tsx @@ -2,6 +2,7 @@ import { lazy } from "react"; import { createBrowserRouter } from "react-router-dom"; import App from "@/App"; import { initialGlobalState } from "@/store/module"; +import AuthStatusProvider from "./AuthStatusProvider"; const Root = lazy(() => import("@/layouts/Root")); const SignIn = lazy(() => import("@/pages/SignIn")); @@ -52,27 +53,51 @@ const router = createBrowserRouter([ children: [ { path: "", - element: , + element: ( + + + + ), }, { path: "review", - element: , + element: ( + + + + ), }, { path: "resources", - element: , + element: ( + + + + ), }, { path: "inbox", - element: , + element: ( + + + + ), }, { path: "archived", - element: , + element: ( + + + + ), }, { path: "setting", - element: , + element: ( + + + + ), }, { path: "explore",