From 01b6e43c1f73ddaefc8179f4b18f8150f1ba9e89 Mon Sep 17 00:00:00 2001 From: JimmFly Date: Thu, 12 Dec 2024 06:33:10 +0000 Subject: [PATCH] fix(core): the member list is not refreshed after operating the member status (#9115) close AF-1939 AF-1938 fix(core): the member list is not refreshed after operating the member status chore: temporarily remove the workspace AI switch --- .../new-workspace-setting-detail/index.tsx | 2 - .../members/cloud-members-panel.tsx | 9 ++- .../members/member-list.tsx | 4 +- .../members/member-option.tsx | 14 +++-- .../modules/permissions/entities/members.ts | 62 +++++++++---------- 5 files changed, 49 insertions(+), 42 deletions(-) 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 c646de4367..bebc4677a1 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 4b1bd8f569..ccd555ceff 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 b89fc485d2..84d6c04505 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 19109c5dd9..eb1306b1fe 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 966cb71446..e0cf37df89 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) {