From be892e2ccaabf7f61e8e7223b89ec8234bceef17 Mon Sep 17 00:00:00 2001 From: Aofei Sheng Date: Fri, 18 Oct 2024 09:29:34 +0800 Subject: [PATCH] feat(auth): introduce sign-in guard - Add `withSignInGuard` HOF to prompt users to sign in before executing protected actions. - Add similar protection for specific routes using navigation guards. Fixes #974 Signed-off-by: Aofei Sheng --- .../community/user/FollowButton.vue | 6 ++--- .../navbar/NavbarNewProjectItem.vue | 6 ++--- .../navbar/NavbarOpenProjectItem.vue | 4 +-- .../src/components/navbar/NavbarProfile.vue | 9 ++++--- spx-gui/src/pages/community/explore.vue | 19 +++++++++----- spx-gui/src/pages/community/user/projects.vue | 6 ++--- spx-gui/src/pages/editor/index.vue | 7 ------ spx-gui/src/router.ts | 14 ++++++++--- spx-gui/src/stores/user.ts | 2 +- spx-gui/src/utils/exception.ts | 25 ++++++++++++++++++- 10 files changed, 65 insertions(+), 33 deletions(-) diff --git a/spx-gui/src/components/community/user/FollowButton.vue b/spx-gui/src/components/community/user/FollowButton.vue index aff43d6d1..eb430c9c8 100644 --- a/spx-gui/src/components/community/user/FollowButton.vue +++ b/spx-gui/src/components/community/user/FollowButton.vue @@ -3,7 +3,7 @@ import { computed, ref, watch } from 'vue' import { useUserStore } from '@/stores' import { follow, isFollowing, unfollow } from '@/apis/user' import { UIButton } from '@/components/ui' -import { useMessageHandle } from '@/utils/exception' +import { useMessageHandle, withSignInGuard } from '@/utils/exception' const props = defineProps<{ /** Name of user to follow */ @@ -24,10 +24,10 @@ watch( ) const handleClick = useMessageHandle( - async () => { + withSignInGuard(async () => { await (following.value ? unfollow(props.name) : follow(props.name)) following.value = !following.value - }, + }), { en: 'Failed to operate', zh: '操作失败' } ) diff --git a/spx-gui/src/components/navbar/NavbarNewProjectItem.vue b/spx-gui/src/components/navbar/NavbarNewProjectItem.vue index ef9940021..214e7b45a 100644 --- a/spx-gui/src/components/navbar/NavbarNewProjectItem.vue +++ b/spx-gui/src/components/navbar/NavbarNewProjectItem.vue @@ -9,17 +9,17 @@ import { useRouter } from 'vue-router' import { getProjectEditorRoute } from '@/router' import { UIMenuItem } from '@/components/ui' -import { useMessageHandle } from '@/utils/exception' +import { useMessageHandle, withSignInGuard } from '@/utils/exception' import { useCreateProject } from '@/components/project' import newSvg from './icons/new.svg' const router = useRouter() const createProject = useCreateProject() const handleNewProject = useMessageHandle( - async () => { + withSignInGuard(async () => { const { name } = await createProject() router.push(getProjectEditorRoute(name)) - }, + }), { en: 'Failed to create new project', zh: '新建项目失败' } ).fn diff --git a/spx-gui/src/components/navbar/NavbarOpenProjectItem.vue b/spx-gui/src/components/navbar/NavbarOpenProjectItem.vue index 3722dc09d..fea1a1fba 100644 --- a/spx-gui/src/components/navbar/NavbarOpenProjectItem.vue +++ b/spx-gui/src/components/navbar/NavbarOpenProjectItem.vue @@ -7,12 +7,12 @@