From b456feee635797d1d8cb98452d6a92a104fbe5da Mon Sep 17 00:00:00 2001 From: JimmFly Date: Wed, 19 Feb 2025 17:10:12 +0800 Subject: [PATCH] fix(core): unexpected redirect to expired page after accepting invitation (#10257) Co-authored-by: EYHN --- .../components/member-components/expired.tsx | 18 ++++++++++++ .../components/member-components/index.tsx | 1 + .../core/src/desktop/pages/expired/index.tsx | 16 ++--------- .../core/src/desktop/pages/invite/index.tsx | 28 +++++++++++-------- .../modules/cloud/services/accept-invite.ts | 2 ++ 5 files changed, 40 insertions(+), 25 deletions(-) create mode 100644 packages/frontend/component/src/components/member-components/expired.tsx diff --git a/packages/frontend/component/src/components/member-components/expired.tsx b/packages/frontend/component/src/components/member-components/expired.tsx new file mode 100644 index 0000000000..e2687570da --- /dev/null +++ b/packages/frontend/component/src/components/member-components/expired.tsx @@ -0,0 +1,18 @@ +import { useI18n } from '@affine/i18n'; + +import { Button } from '../../ui/button'; +import { AuthPageContainer } from '../auth-components'; + +export const ExpiredPage = ({ onOpenAffine }: { onOpenAffine: () => void }) => { + const t = useI18n(); + return ( + + + + ); +}; diff --git a/packages/frontend/component/src/components/member-components/index.tsx b/packages/frontend/component/src/components/member-components/index.tsx index 7011190f43..23d2f8531a 100644 --- a/packages/frontend/component/src/components/member-components/index.tsx +++ b/packages/frontend/component/src/components/member-components/index.tsx @@ -1,4 +1,5 @@ export * from './accept-invite-page'; +export * from './expired'; export * from './invite-modal'; export * from './invite-team-modal'; export * from './join-failed-page'; diff --git a/packages/frontend/core/src/desktop/pages/expired/index.tsx b/packages/frontend/core/src/desktop/pages/expired/index.tsx index 45d5ab4d76..d259159fc1 100644 --- a/packages/frontend/core/src/desktop/pages/expired/index.tsx +++ b/packages/frontend/core/src/desktop/pages/expired/index.tsx @@ -1,6 +1,4 @@ -import { AuthPageContainer } from '@affine/component/auth-components'; -import { Button } from '@affine/component/ui/button'; -import { useI18n } from '@affine/i18n'; +import { ExpiredPage } from '@affine/component/member-components'; import { useCallback } from 'react'; import { @@ -14,20 +12,10 @@ import { * only on web */ export const Component = () => { - const t = useI18n(); const { jumpToIndex } = useNavigateHelper(); const onOpenAffine = useCallback(() => { jumpToIndex(RouteLogic.REPLACE); }, [jumpToIndex]); - return ( - - - - ); + return ; }; diff --git a/packages/frontend/core/src/desktop/pages/invite/index.tsx b/packages/frontend/core/src/desktop/pages/invite/index.tsx index bf6abbd36a..7064a2775b 100644 --- a/packages/frontend/core/src/desktop/pages/invite/index.tsx +++ b/packages/frontend/core/src/desktop/pages/invite/index.tsx @@ -1,5 +1,6 @@ import { AcceptInvitePage, + ExpiredPage, JoinFailedPage, } from '@affine/component/member-components'; import { ErrorNames, UserFriendlyError } from '@affine/graphql'; @@ -13,10 +14,11 @@ import { } from '../../../components/hooks/use-navigate-helper'; import { AcceptInviteService, AuthService } from '../../../modules/cloud'; -const AcceptInvite = ({ inviteId }: { inviteId: string }) => { +const AcceptInvite = ({ inviteId: targetInviteId }: { inviteId: string }) => { const { jumpToPage } = useNavigateHelper(); const acceptInviteService = useService(AcceptInviteService); const error = useLiveData(acceptInviteService.error$); + const inviteId = useLiveData(acceptInviteService.inviteId$); const inviteInfo = useLiveData(acceptInviteService.inviteInfo$); const accepted = useLiveData(acceptInviteService.accepted$); const loading = useLiveData(acceptInviteService.loading$); @@ -29,28 +31,32 @@ const AcceptInvite = ({ inviteId }: { inviteId: string }) => { jumpToPage(inviteInfo.workspace.id, 'all', RouteLogic.REPLACE); }, [jumpToPage, inviteInfo]); - useEffect(() => { - acceptInviteService.revalidate({ - inviteId, - }); - }, [acceptInviteService, inviteId]); + const onOpenAffine = useCallback(() => { + navigateHelper.jumpToIndex(); + }, [navigateHelper]); useEffect(() => { - if (error) { + acceptInviteService.revalidate({ + inviteId: targetInviteId, + }); + }, [acceptInviteService, targetInviteId]); + + useEffect(() => { + if (error && inviteId === targetInviteId) { const err = UserFriendlyError.fromAnyError(error); if (err.name === ErrorNames.ALREADY_IN_SPACE) { return navigateHelper.jumpToIndex(); } } - }, [error, navigateHelper]); + }, [error, inviteId, navigateHelper, targetInviteId]); - if (loading) { + if (loading || inviteId !== targetInviteId) { return null; } if (!inviteInfo) { // if invite is expired - return ; + return ; } if (error) { @@ -66,7 +72,7 @@ const AcceptInvite = ({ inviteId }: { inviteId: string }) => { ); } else { // invite is expired - return ; + return ; } }; diff --git a/packages/frontend/core/src/modules/cloud/services/accept-invite.ts b/packages/frontend/core/src/modules/cloud/services/accept-invite.ts index 5fbb3a9170..66013bc1ff 100644 --- a/packages/frontend/core/src/modules/cloud/services/accept-invite.ts +++ b/packages/frontend/core/src/modules/cloud/services/accept-invite.ts @@ -24,6 +24,7 @@ export class AcceptInviteService extends Service { ) { super(); } + inviteId$ = new LiveData(undefined); inviteInfo$ = new LiveData(undefined); accepted$ = new LiveData(false); loading$ = new LiveData(false); @@ -61,6 +62,7 @@ export class AcceptInviteService extends Service { }), catchErrorInto(this.error$), onStart(() => { + this.inviteId$.setValue(inviteId); this.loading$.setValue(true); this.inviteInfo$.setValue(undefined); this.accepted$.setValue(false);