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);