diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/index.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/index.tsx
index c646de436..bebc4677a 100644
--- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/index.tsx
+++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/index.tsx
@@ -11,7 +11,6 @@ import { ArrowRightSmallIcon } from '@blocksuite/icons/rc';
import { FrameworkScope } from '@toeverything/infra';
import { useCallback } from 'react';
-import { AiSetting } from './ai';
import { DeleteLeaveWorkspace } from './delete-leave-workspace';
import { EnableCloudPanel } from './enable-cloud';
import { DesktopExportPanel } from './export';
@@ -73,7 +72,6 @@ export const WorkspaceSettingDetail = ({
-
{BUILD_CONFIG.isElectron && (
diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/cloud-members-panel.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/cloud-members-panel.tsx
index 4b1bd8f56..ccd555cef 100644
--- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/cloud-members-panel.tsx
+++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/cloud-members-panel.tsx
@@ -8,7 +8,10 @@ import { SettingRow } from '@affine/component/setting-components';
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
import { Upload } from '@affine/core/components/pure/file-upload';
import { ServerService, SubscriptionService } from '@affine/core/modules/cloud';
-import { WorkspacePermissionService } from '@affine/core/modules/permissions';
+import {
+ WorkspaceMembersService,
+ WorkspacePermissionService,
+} from '@affine/core/modules/permissions';
import { WorkspaceQuotaService } from '@affine/core/modules/quota';
import { copyTextToClipboard } from '@affine/core/utils/clipboard';
import { emailRegex } from '@affine/core/utils/email-regex';
@@ -50,6 +53,7 @@ export const CloudWorkspaceMembersPanel = ({
const hasPaymentFeature = useLiveData(
serverService.server.features$.map(f => f?.payment)
);
+ const membersService = useService(WorkspaceMembersService);
const permissionService = useService(WorkspacePermissionService);
const isOwner = useLiveData(permissionService.permission.isOwner$);
const isAdmin = useLiveData(permissionService.permission.isAdmin$);
@@ -111,10 +115,11 @@ export const CloudWorkspaceMembersPanel = ({
message: t['Invitation sent hint'](),
});
setOpen(false);
+ membersService.members.revalidate();
}
setIsMutating(false);
},
- [permissionService.permission, t]
+ [membersService.members, permissionService.permission, t]
);
const onImportCSV = useAsyncCallback(
diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-list.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-list.tsx
index b89fc485d..84d6c0450 100644
--- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-list.tsx
+++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-list.tsx
@@ -116,6 +116,7 @@ const MemberItem = ({
const t = useI18n();
const [open, setOpen] = useState(false);
const [inputValue, setInputValue] = useState('');
+ const membersService = useService(WorkspaceMembersService);
const workspace = useService(WorkspaceService).workspace;
const workspaceName = useLiveData(workspace.name$);
const permission = useService(WorkspacePermissionService).permission;
@@ -139,6 +140,7 @@ const MemberItem = ({
name: member.name || member.email || member.id,
}),
});
+ membersService.members.revalidate();
}
})
.catch(error => {
@@ -147,7 +149,7 @@ const MemberItem = ({
message: error.message,
});
});
- }, [permission, member, t]);
+ }, [permission, member, t, membersService]);
const memberStatus = useMemo(() => getMemberStatus(member), [member]);
diff --git a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-option.tsx b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-option.tsx
index 19109c5dd..eb1306b1f 100644
--- a/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-option.tsx
+++ b/packages/frontend/core/src/desktop/dialogs/setting/workspace-setting/new-workspace-setting-detail/members/member-option.tsx
@@ -1,6 +1,7 @@
import { MenuItem, notify, useConfirmModal } from '@affine/component';
import {
type Member,
+ WorkspaceMembersService,
WorkspacePermissionService,
} from '@affine/core/modules/permissions';
import { Permission, WorkspaceMemberStatus } from '@affine/graphql';
@@ -20,6 +21,7 @@ export const MemberOptions = ({
openAssignModal: () => void;
}) => {
const t = useI18n();
+ const membersService = useService(WorkspaceMembersService);
const permission = useService(WorkspacePermissionService).permission;
const { openConfirmModal } = useConfirmModal();
@@ -44,6 +46,7 @@ export const MemberOptions = ({
title: successNotify.title,
message: successNotify.message,
});
+ membersService.members.revalidate();
}
})
.catch(error => {
@@ -54,7 +57,7 @@ export const MemberOptions = ({
}),
});
},
- [member.id, openConfirmModal, permission, t]
+ [member, membersService, openConfirmModal, permission, t]
);
const handleAssignOwner = useCallback(() => {
@@ -83,6 +86,7 @@ export const MemberOptions = ({
}
),
});
+ membersService.members.revalidate();
}
})
.catch(error => {
@@ -91,7 +95,7 @@ export const MemberOptions = ({
message: error.message,
});
});
- }, [member, permission, t]);
+ }, [member, membersService, permission, t]);
const handleDecline = useCallback(() => {
openRemoveConfirmModal({
@@ -124,6 +128,7 @@ export const MemberOptions = ({
name: member.name || member.email || member.id,
}),
});
+ membersService.members.revalidate();
}
})
.catch(error => {
@@ -132,7 +137,7 @@ export const MemberOptions = ({
message: error.message,
});
});
- }, [member, permission, t]);
+ }, [member, membersService, permission, t]);
const handleChangeToCollaborator = useCallback(() => {
permission
.adjustMemberPermission(member.id, Permission.Write)
@@ -146,6 +151,7 @@ export const MemberOptions = ({
name: member.name || member.email || member.id,
}),
});
+ membersService.members.revalidate();
}
})
.catch(error => {
@@ -154,7 +160,7 @@ export const MemberOptions = ({
message: error.message,
});
});
- }, [member, permission, t]);
+ }, [member, membersService, permission, t]);
const operationButtonInfo = useMemo(() => {
return [
diff --git a/packages/frontend/core/src/modules/permissions/entities/members.ts b/packages/frontend/core/src/modules/permissions/entities/members.ts
index 966cb7144..e0cf37df8 100644
--- a/packages/frontend/core/src/modules/permissions/entities/members.ts
+++ b/packages/frontend/core/src/modules/permissions/entities/members.ts
@@ -5,13 +5,12 @@ import {
catchErrorInto,
effect,
Entity,
- exhaustMapSwitchUntilChanged,
fromPromise,
LiveData,
onComplete,
onStart,
} from '@toeverything/infra';
-import { EMPTY, map, mergeMap } from 'rxjs';
+import { EMPTY, map, mergeMap, switchMap } from 'rxjs';
import { isBackendError, isNetworkError } from '../../cloud';
import type { WorkspaceMembersStore } from '../stores/members';
@@ -38,38 +37,35 @@ export class WorkspaceMembers extends Entity {
readonly revalidate = effect(
map(() => this.pageNum$.value),
- exhaustMapSwitchUntilChanged(
- (a, b) => a === b,
- pageNum => {
- return fromPromise(async signal => {
- return this.store.fetchMembers(
- this.workspaceService.workspace.id,
- pageNum * this.PAGE_SIZE,
- this.PAGE_SIZE,
- signal
- );
- }).pipe(
- mergeMap(data => {
- this.memberCount$.setValue(data.memberCount);
- this.pageMembers$.setValue(data.members);
- return EMPTY;
- }),
- backoffRetry({
- when: isNetworkError,
- count: Infinity,
- }),
- backoffRetry({
- when: isBackendError,
- }),
- catchErrorInto(this.error$),
- onStart(() => {
- this.pageMembers$.setValue(undefined);
- this.isLoading$.setValue(true);
- }),
- onComplete(() => this.isLoading$.setValue(false))
+ switchMap(pageNum => {
+ return fromPromise(async signal => {
+ return this.store.fetchMembers(
+ this.workspaceService.workspace.id,
+ pageNum * this.PAGE_SIZE,
+ this.PAGE_SIZE,
+ signal
);
- }
- )
+ }).pipe(
+ mergeMap(data => {
+ this.memberCount$.setValue(data.memberCount);
+ this.pageMembers$.setValue(data.members);
+ return EMPTY;
+ }),
+ backoffRetry({
+ when: isNetworkError,
+ count: Infinity,
+ }),
+ backoffRetry({
+ when: isBackendError,
+ }),
+ catchErrorInto(this.error$),
+ onStart(() => {
+ this.pageMembers$.setValue(undefined);
+ this.isLoading$.setValue(true);
+ }),
+ onComplete(() => this.isLoading$.setValue(false))
+ );
+ })
);
setPageNum(pageNum: number) {