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
This commit is contained in:
@@ -11,7 +11,6 @@ import { ArrowRightSmallIcon } from '@blocksuite/icons/rc';
|
|||||||
import { FrameworkScope } from '@toeverything/infra';
|
import { FrameworkScope } from '@toeverything/infra';
|
||||||
import { useCallback } from 'react';
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
import { AiSetting } from './ai';
|
|
||||||
import { DeleteLeaveWorkspace } from './delete-leave-workspace';
|
import { DeleteLeaveWorkspace } from './delete-leave-workspace';
|
||||||
import { EnableCloudPanel } from './enable-cloud';
|
import { EnableCloudPanel } from './enable-cloud';
|
||||||
import { DesktopExportPanel } from './export';
|
import { DesktopExportPanel } from './export';
|
||||||
@@ -73,7 +72,6 @@ export const WorkspaceSettingDetail = ({
|
|||||||
<WorkspaceQuotaPanel />
|
<WorkspaceQuotaPanel />
|
||||||
<MembersPanel onChangeSettingState={onChangeSettingState} />
|
<MembersPanel onChangeSettingState={onChangeSettingState} />
|
||||||
</SettingWrapper>
|
</SettingWrapper>
|
||||||
<AiSetting />
|
|
||||||
<SharingPanel />
|
<SharingPanel />
|
||||||
{BUILD_CONFIG.isElectron && (
|
{BUILD_CONFIG.isElectron && (
|
||||||
<SettingWrapper title={t['Storage and Export']()}>
|
<SettingWrapper title={t['Storage and Export']()}>
|
||||||
|
|||||||
@@ -8,7 +8,10 @@ import { SettingRow } from '@affine/component/setting-components';
|
|||||||
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
|
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
|
||||||
import { Upload } from '@affine/core/components/pure/file-upload';
|
import { Upload } from '@affine/core/components/pure/file-upload';
|
||||||
import { ServerService, SubscriptionService } from '@affine/core/modules/cloud';
|
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 { WorkspaceQuotaService } from '@affine/core/modules/quota';
|
||||||
import { copyTextToClipboard } from '@affine/core/utils/clipboard';
|
import { copyTextToClipboard } from '@affine/core/utils/clipboard';
|
||||||
import { emailRegex } from '@affine/core/utils/email-regex';
|
import { emailRegex } from '@affine/core/utils/email-regex';
|
||||||
@@ -50,6 +53,7 @@ export const CloudWorkspaceMembersPanel = ({
|
|||||||
const hasPaymentFeature = useLiveData(
|
const hasPaymentFeature = useLiveData(
|
||||||
serverService.server.features$.map(f => f?.payment)
|
serverService.server.features$.map(f => f?.payment)
|
||||||
);
|
);
|
||||||
|
const membersService = useService(WorkspaceMembersService);
|
||||||
const permissionService = useService(WorkspacePermissionService);
|
const permissionService = useService(WorkspacePermissionService);
|
||||||
const isOwner = useLiveData(permissionService.permission.isOwner$);
|
const isOwner = useLiveData(permissionService.permission.isOwner$);
|
||||||
const isAdmin = useLiveData(permissionService.permission.isAdmin$);
|
const isAdmin = useLiveData(permissionService.permission.isAdmin$);
|
||||||
@@ -111,10 +115,11 @@ export const CloudWorkspaceMembersPanel = ({
|
|||||||
message: t['Invitation sent hint'](),
|
message: t['Invitation sent hint'](),
|
||||||
});
|
});
|
||||||
setOpen(false);
|
setOpen(false);
|
||||||
|
membersService.members.revalidate();
|
||||||
}
|
}
|
||||||
setIsMutating(false);
|
setIsMutating(false);
|
||||||
},
|
},
|
||||||
[permissionService.permission, t]
|
[membersService.members, permissionService.permission, t]
|
||||||
);
|
);
|
||||||
|
|
||||||
const onImportCSV = useAsyncCallback(
|
const onImportCSV = useAsyncCallback(
|
||||||
|
|||||||
@@ -116,6 +116,7 @@ const MemberItem = ({
|
|||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
const [inputValue, setInputValue] = useState('');
|
const [inputValue, setInputValue] = useState('');
|
||||||
|
const membersService = useService(WorkspaceMembersService);
|
||||||
const workspace = useService(WorkspaceService).workspace;
|
const workspace = useService(WorkspaceService).workspace;
|
||||||
const workspaceName = useLiveData(workspace.name$);
|
const workspaceName = useLiveData(workspace.name$);
|
||||||
const permission = useService(WorkspacePermissionService).permission;
|
const permission = useService(WorkspacePermissionService).permission;
|
||||||
@@ -139,6 +140,7 @@ const MemberItem = ({
|
|||||||
name: member.name || member.email || member.id,
|
name: member.name || member.email || member.id,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
membersService.members.revalidate();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
@@ -147,7 +149,7 @@ const MemberItem = ({
|
|||||||
message: error.message,
|
message: error.message,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}, [permission, member, t]);
|
}, [permission, member, t, membersService]);
|
||||||
|
|
||||||
const memberStatus = useMemo(() => getMemberStatus(member), [member]);
|
const memberStatus = useMemo(() => getMemberStatus(member), [member]);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { MenuItem, notify, useConfirmModal } from '@affine/component';
|
import { MenuItem, notify, useConfirmModal } from '@affine/component';
|
||||||
import {
|
import {
|
||||||
type Member,
|
type Member,
|
||||||
|
WorkspaceMembersService,
|
||||||
WorkspacePermissionService,
|
WorkspacePermissionService,
|
||||||
} from '@affine/core/modules/permissions';
|
} from '@affine/core/modules/permissions';
|
||||||
import { Permission, WorkspaceMemberStatus } from '@affine/graphql';
|
import { Permission, WorkspaceMemberStatus } from '@affine/graphql';
|
||||||
@@ -20,6 +21,7 @@ export const MemberOptions = ({
|
|||||||
openAssignModal: () => void;
|
openAssignModal: () => void;
|
||||||
}) => {
|
}) => {
|
||||||
const t = useI18n();
|
const t = useI18n();
|
||||||
|
const membersService = useService(WorkspaceMembersService);
|
||||||
const permission = useService(WorkspacePermissionService).permission;
|
const permission = useService(WorkspacePermissionService).permission;
|
||||||
const { openConfirmModal } = useConfirmModal();
|
const { openConfirmModal } = useConfirmModal();
|
||||||
|
|
||||||
@@ -44,6 +46,7 @@ export const MemberOptions = ({
|
|||||||
title: successNotify.title,
|
title: successNotify.title,
|
||||||
message: successNotify.message,
|
message: successNotify.message,
|
||||||
});
|
});
|
||||||
|
membersService.members.revalidate();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
@@ -54,7 +57,7 @@ export const MemberOptions = ({
|
|||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[member.id, openConfirmModal, permission, t]
|
[member, membersService, openConfirmModal, permission, t]
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleAssignOwner = useCallback(() => {
|
const handleAssignOwner = useCallback(() => {
|
||||||
@@ -83,6 +86,7 @@ export const MemberOptions = ({
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
membersService.members.revalidate();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
@@ -91,7 +95,7 @@ export const MemberOptions = ({
|
|||||||
message: error.message,
|
message: error.message,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}, [member, permission, t]);
|
}, [member, membersService, permission, t]);
|
||||||
|
|
||||||
const handleDecline = useCallback(() => {
|
const handleDecline = useCallback(() => {
|
||||||
openRemoveConfirmModal({
|
openRemoveConfirmModal({
|
||||||
@@ -124,6 +128,7 @@ export const MemberOptions = ({
|
|||||||
name: member.name || member.email || member.id,
|
name: member.name || member.email || member.id,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
membersService.members.revalidate();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
@@ -132,7 +137,7 @@ export const MemberOptions = ({
|
|||||||
message: error.message,
|
message: error.message,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}, [member, permission, t]);
|
}, [member, membersService, permission, t]);
|
||||||
const handleChangeToCollaborator = useCallback(() => {
|
const handleChangeToCollaborator = useCallback(() => {
|
||||||
permission
|
permission
|
||||||
.adjustMemberPermission(member.id, Permission.Write)
|
.adjustMemberPermission(member.id, Permission.Write)
|
||||||
@@ -146,6 +151,7 @@ export const MemberOptions = ({
|
|||||||
name: member.name || member.email || member.id,
|
name: member.name || member.email || member.id,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
membersService.members.revalidate();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
@@ -154,7 +160,7 @@ export const MemberOptions = ({
|
|||||||
message: error.message,
|
message: error.message,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}, [member, permission, t]);
|
}, [member, membersService, permission, t]);
|
||||||
|
|
||||||
const operationButtonInfo = useMemo(() => {
|
const operationButtonInfo = useMemo(() => {
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -5,13 +5,12 @@ import {
|
|||||||
catchErrorInto,
|
catchErrorInto,
|
||||||
effect,
|
effect,
|
||||||
Entity,
|
Entity,
|
||||||
exhaustMapSwitchUntilChanged,
|
|
||||||
fromPromise,
|
fromPromise,
|
||||||
LiveData,
|
LiveData,
|
||||||
onComplete,
|
onComplete,
|
||||||
onStart,
|
onStart,
|
||||||
} from '@toeverything/infra';
|
} from '@toeverything/infra';
|
||||||
import { EMPTY, map, mergeMap } from 'rxjs';
|
import { EMPTY, map, mergeMap, switchMap } from 'rxjs';
|
||||||
|
|
||||||
import { isBackendError, isNetworkError } from '../../cloud';
|
import { isBackendError, isNetworkError } from '../../cloud';
|
||||||
import type { WorkspaceMembersStore } from '../stores/members';
|
import type { WorkspaceMembersStore } from '../stores/members';
|
||||||
@@ -38,38 +37,35 @@ export class WorkspaceMembers extends Entity {
|
|||||||
|
|
||||||
readonly revalidate = effect(
|
readonly revalidate = effect(
|
||||||
map(() => this.pageNum$.value),
|
map(() => this.pageNum$.value),
|
||||||
exhaustMapSwitchUntilChanged(
|
switchMap(pageNum => {
|
||||||
(a, b) => a === b,
|
return fromPromise(async signal => {
|
||||||
pageNum => {
|
return this.store.fetchMembers(
|
||||||
return fromPromise(async signal => {
|
this.workspaceService.workspace.id,
|
||||||
return this.store.fetchMembers(
|
pageNum * this.PAGE_SIZE,
|
||||||
this.workspaceService.workspace.id,
|
this.PAGE_SIZE,
|
||||||
pageNum * this.PAGE_SIZE,
|
signal
|
||||||
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))
|
|
||||||
);
|
);
|
||||||
}
|
}).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) {
|
setPageNum(pageNum: number) {
|
||||||
|
|||||||
Reference in New Issue
Block a user