From 5686fdfb0a4ac9426e9b961f264e9ce487e4d740 Mon Sep 17 00:00:00 2001 From: Johnny Date: Sun, 16 Feb 2025 22:17:48 +0800 Subject: [PATCH] chore: handle redirect --- web/src/components/MemoContent/Link.tsx | 6 +----- web/src/components/MemoEditor/index.tsx | 6 +----- web/src/components/MemoView.tsx | 6 +----- web/src/components/ReactionSelector.tsx | 6 +----- web/src/components/Settings/MemoRelatedSettings.tsx | 4 +--- web/src/layouts/RootLayout.tsx | 12 +++++++++--- web/src/pages/MemoDetail.tsx | 5 +---- web/src/store/v2/workspace.ts | 9 ++++++++- 8 files changed, 23 insertions(+), 31 deletions(-) diff --git a/web/src/components/MemoContent/Link.tsx b/web/src/components/MemoContent/Link.tsx index d5a48d04..97a9e427 100644 --- a/web/src/components/MemoContent/Link.tsx +++ b/web/src/components/MemoContent/Link.tsx @@ -3,8 +3,6 @@ import { useState } from "react"; import { markdownServiceClient } from "@/grpcweb"; import { workspaceStore } from "@/store/v2"; import { LinkMetadata } from "@/types/proto/api/v1/markdown_service"; -import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; -import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; interface Props { url: string; @@ -21,9 +19,7 @@ const getFaviconWithGoogleS2 = (url: string) => { }; const Link: React.FC = ({ text, url }: Props) => { - const workspaceMemoRelatedSetting = - workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED).memoRelatedSetting || - WorkspaceMemoRelatedSetting.fromPartial({}); + const workspaceMemoRelatedSetting = workspaceStore.state.memoRelatedSetting; const [initialized, setInitialized] = useState(false); const [showTooltip, setShowTooltip] = useState(false); const [linkMetadata, setLinkMetadata] = useState(); diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx index 4d47bec0..2e0bd384 100644 --- a/web/src/components/MemoEditor/index.tsx +++ b/web/src/components/MemoEditor/index.tsx @@ -20,8 +20,6 @@ import { MemoRelation, MemoRelation_Type } from "@/types/proto/api/v1/memo_relat import { Location, Memo, Visibility } from "@/types/proto/api/v1/memo_service"; import { Resource } from "@/types/proto/api/v1/resource_service"; import { UserSetting } from "@/types/proto/api/v1/user_service"; -import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; -import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { useTranslate } from "@/utils/i18n"; import { convertVisibilityFromString, convertVisibilityToString } from "@/utils/memo"; import VisibilityIcon from "../VisibilityIcon"; @@ -87,9 +85,7 @@ const MemoEditor = observer((props: Props) => { relation.memo?.name === memoName && relation.relatedMemo?.name !== memoName && relation.type === MemoRelation_Type.REFERENCE, ) : state.relationList.filter((relation) => relation.type === MemoRelation_Type.REFERENCE); - const workspaceMemoRelatedSetting = - workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || - WorkspaceMemoRelatedSetting.fromPartial({}); + const workspaceMemoRelatedSetting = workspaceStore.state.memoRelatedSetting; useEffect(() => { editorRef.current?.setContent(contentCache || ""); diff --git a/web/src/components/MemoView.tsx b/web/src/components/MemoView.tsx index 262fdd1d..51060101 100644 --- a/web/src/components/MemoView.tsx +++ b/web/src/components/MemoView.tsx @@ -10,8 +10,6 @@ import { userStore, workspaceStore } from "@/store/v2"; import { State } from "@/types/proto/api/v1/common"; import { MemoRelation_Type } from "@/types/proto/api/v1/memo_relation_service"; import { Memo, Visibility } from "@/types/proto/api/v1/memo_service"; -import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; -import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { cn } from "@/utils"; import { useTranslate } from "@/utils/i18n"; import { convertVisibilityToString } from "@/utils/memo"; @@ -50,9 +48,7 @@ const MemoView: React.FC = (props: Props) => { const [showEditor, setShowEditor] = useState(false); const [creator, setCreator] = useState(userStore.getUserByName(memo.creator)); const memoContainerRef = useRef(null); - const workspaceMemoRelatedSetting = - workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED).memoRelatedSetting || - WorkspaceMemoRelatedSetting.fromPartial({}); + const workspaceMemoRelatedSetting = workspaceStore.state.memoRelatedSetting; const referencedMemos = memo.relations.filter((relation) => relation.type === MemoRelation_Type.REFERENCE); const commentAmount = memo.relations.filter( (relation) => relation.type === MemoRelation_Type.COMMENT && relation.relatedMemo?.name === memo.name, diff --git a/web/src/components/ReactionSelector.tsx b/web/src/components/ReactionSelector.tsx index 3b1b2741..2a6ed256 100644 --- a/web/src/components/ReactionSelector.tsx +++ b/web/src/components/ReactionSelector.tsx @@ -7,8 +7,6 @@ import useCurrentUser from "@/hooks/useCurrentUser"; import { useMemoStore } from "@/store/v1"; import { workspaceStore } from "@/store/v2"; import { Memo } from "@/types/proto/api/v1/memo_service"; -import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; -import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { cn } from "@/utils"; interface Props { @@ -22,9 +20,7 @@ const ReactionSelector = (props: Props) => { const memoStore = useMemoStore(); const [open, setOpen] = useState(false); const containerRef = useRef(null); - const workspaceMemoRelatedSetting = - workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || - WorkspaceMemoRelatedSetting.fromPartial({}); + const workspaceMemoRelatedSetting = workspaceStore.state.memoRelatedSetting; useClickAway(containerRef, () => { setOpen(false); diff --git a/web/src/components/Settings/MemoRelatedSettings.tsx b/web/src/components/Settings/MemoRelatedSettings.tsx index 0efe1091..d067a7d9 100644 --- a/web/src/components/Settings/MemoRelatedSettings.tsx +++ b/web/src/components/Settings/MemoRelatedSettings.tsx @@ -12,9 +12,7 @@ import { useTranslate } from "@/utils/i18n"; const MemoRelatedSettings = () => { const t = useTranslate(); - const originalSetting = WorkspaceMemoRelatedSetting.fromPartial( - workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || {}, - ); + const originalSetting = workspaceStore.state.memoRelatedSetting; const [memoRelatedSetting, setMemoRelatedSetting] = useState(originalSetting); const [editingReaction, setEditingReaction] = useState(""); diff --git a/web/src/layouts/RootLayout.tsx b/web/src/layouts/RootLayout.tsx index 0c0e5276..1b5b800b 100644 --- a/web/src/layouts/RootLayout.tsx +++ b/web/src/layouts/RootLayout.tsx @@ -1,3 +1,4 @@ +import { observer } from "mobx-react-lite"; import { Suspense, useEffect, useMemo, useState } from "react"; import { Outlet, useLocation, useSearchParams } from "react-router-dom"; import usePrevious from "react-use/lib/usePrevious"; @@ -7,9 +8,10 @@ import useResponsiveWidth from "@/hooks/useResponsiveWidth"; import Loading from "@/pages/Loading"; import { Routes } from "@/router"; import { useMemoFilterStore } from "@/store/v1"; +import { workspaceStore } from "@/store/v2"; import { cn } from "@/utils"; -const RootLayout = () => { +const RootLayout = observer(() => { const location = useLocation(); const [searchParams] = useSearchParams(); const { sm } = useResponsiveWidth(); @@ -21,7 +23,11 @@ const RootLayout = () => { useEffect(() => { if (!currentUser) { - if (([Routes.ROOT, Routes.RESOURCES, Routes.INBOX, Routes.ARCHIVED, Routes.SETTING] as string[]).includes(location.pathname)) { + // If disallowPublicVisibility is enabled, redirect to the login page if the user is not logged in. + if (workspaceStore.state.memoRelatedSetting.disallowPublicVisibility) { + window.location.href = Routes.AUTH; + return; + } else if (([Routes.ROOT, Routes.RESOURCES, Routes.INBOX, Routes.ARCHIVED, Routes.SETTING] as string[]).includes(location.pathname)) { window.location.href = Routes.EXPLORE; return; } @@ -59,6 +65,6 @@ const RootLayout = () => { ); -}; +}); export default RootLayout; diff --git a/web/src/pages/MemoDetail.tsx b/web/src/pages/MemoDetail.tsx index f68801cd..36a23bc9 100644 --- a/web/src/pages/MemoDetail.tsx +++ b/web/src/pages/MemoDetail.tsx @@ -15,7 +15,6 @@ import { memoNamePrefix, useMemoStore } from "@/store/v1"; import { workspaceStore } from "@/store/v2"; import { MemoRelation_Type } from "@/types/proto/api/v1/memo_relation_service"; import { Memo } from "@/types/proto/api/v1/memo_service"; -import { WorkspaceMemoRelatedSetting, WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { cn } from "@/utils"; import { useTranslate } from "@/utils/i18n"; @@ -30,9 +29,7 @@ const MemoDetail = () => { const uid = params.uid; const memoName = `${memoNamePrefix}${uid}`; const memo = memoStore.getMemoByName(memoName); - const workspaceMemoRelatedSetting = WorkspaceMemoRelatedSetting.fromPartial( - workspaceStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || {}, - ); + const workspaceMemoRelatedSetting = workspaceStore.state.memoRelatedSetting; const [parentMemo, setParentMemo] = useState(undefined); const [showCommentEditor, setShowCommentEditor] = useState(false); const commentRelations = diff --git a/web/src/store/v2/workspace.ts b/web/src/store/v2/workspace.ts index ca593747..9636e781 100644 --- a/web/src/store/v2/workspace.ts +++ b/web/src/store/v2/workspace.ts @@ -2,7 +2,7 @@ import { uniqBy } from "lodash-es"; import { makeAutoObservable } from "mobx"; import { workspaceServiceClient, workspaceSettingServiceClient } from "@/grpcweb"; import { WorkspaceProfile } from "@/types/proto/api/v1/workspace_service"; -import { WorkspaceGeneralSetting, WorkspaceSetting } from "@/types/proto/api/v1/workspace_setting_service"; +import { WorkspaceGeneralSetting, WorkspaceMemoRelatedSetting, WorkspaceSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { isValidateLocale } from "@/utils/i18n"; import { workspaceSettingNamePrefix } from "../v1"; @@ -20,6 +20,13 @@ class LocalState { ); } + get memoRelatedSetting() { + return ( + this.settings.find((setting) => setting.name === `${workspaceSettingNamePrefix}${WorkspaceSettingKey.MEMO_RELATED}`) + ?.memoRelatedSetting || WorkspaceMemoRelatedSetting.fromPartial({}) + ); + } + constructor() { makeAutoObservable(this); }