fix(core): incorrect permissions displayed in member management (#10269)

This commit is contained in:
JimmFly
2025-02-19 16:58:06 +08:00
committed by GitHub
parent 5b768d9091
commit 487158b9ca
4 changed files with 50 additions and 27 deletions

View File

@@ -1,8 +1,14 @@
import { Menu, MenuItem, MenuTrigger, Tooltip } from '@affine/component';
import {
Menu,
MenuItem,
MenuTrigger,
notify,
Tooltip,
} from '@affine/component';
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
import { DocGrantedUsersService } from '@affine/core/modules/permissions';
import { ShareInfoService } from '@affine/core/modules/share-doc';
import { DocRole } from '@affine/graphql';
import { DocRole, UserFriendlyError } from '@affine/graphql';
import { useI18n } from '@affine/i18n';
import { track } from '@affine/track';
import { InformationIcon } from '@blocksuite/icons/rc';
@@ -47,33 +53,41 @@ export const MembersPermission = ({
);
const showTips =
docDefaultRole === DocRole.Reader || docDefaultRole === DocRole.Editor;
const changePermission = useCallback(
const changePermission = useAsyncCallback(
async (docRole: DocRole) => {
track.$.sharePanel.$.modifyDocDefaultRole();
await docGrantedUsersService.updateDocDefaultRole(docRole);
shareInfoService.shareInfo.revalidate();
try {
track.$.sharePanel.$.modifyDocDefaultRole();
await docGrantedUsersService.updateDocDefaultRole(docRole);
shareInfoService.shareInfo.revalidate();
} catch (error) {
const err = UserFriendlyError.fromAnyError(error);
notify.error({
title: err.name,
message: err.message,
});
}
},
[docGrantedUsersService, shareInfoService.shareInfo]
);
const selectManage = useAsyncCallback(async () => {
await changePermission(DocRole.Manager);
const selectManage = useCallback(() => {
changePermission(DocRole.Manager);
}, [changePermission]);
const selectEdit = useAsyncCallback(async () => {
const selectEdit = useCallback(() => {
if (hittingPaywall) {
openPaywallModal?.();
return;
}
await changePermission(DocRole.Editor);
changePermission(DocRole.Editor);
}, [changePermission, hittingPaywall, openPaywallModal]);
const selectRead = useAsyncCallback(async () => {
const selectRead = useCallback(() => {
if (hittingPaywall) {
openPaywallModal?.();
return;
}
await changePermission(DocRole.Reader);
changePermission(DocRole.Reader);
}, [changePermission, hittingPaywall, openPaywallModal]);
return (

View File

@@ -121,15 +121,21 @@ export const MembersRow = ({ onClick }: { onClick: () => void }) => {
className={clsx(styles.rowContainerStyle, 'clickable')}
onClick={onClick}
>
<div className={styles.memberContainerStyle}>
<Avatar
url={docOwner?.user.avatarUrl || ''}
name={docOwner?.user.name}
size={24}
/>
<span>{docOwner?.user.name}</span>
</div>
<div className={styles.OwnerStyle}>{t['Owner']()}</div>
{docOwner ? (
<>
<div className={styles.memberContainerStyle}>
<Avatar
url={docOwner.user.avatarUrl || ''}
name={docOwner.user.name}
size={24}
/>
<span>{docOwner.user.name}</span>
</div>
<div className={styles.OwnerStyle}>{t['Owner']()}</div>
</>
) : (
<div>{t['com.affine.share-menu.invite-editor.manage-members']()}</div>
)}
<div className={styles.IconButtonStyle}>
<ArrowRightSmallIcon />
</div>

View File

@@ -9,7 +9,6 @@ import {
useConfirmModal,
} from '@affine/component';
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
import { AuthService } from '@affine/core/modules/cloud';
import { DocService } from '@affine/core/modules/doc';
import {
DocGrantedUsersService,
@@ -31,16 +30,15 @@ export const MemberItem = ({
openPaywallModal,
hittingPaywall,
grantedUser,
canManageUsers,
}: {
grantedUser: GrantedUser;
hittingPaywall: boolean;
canManageUsers: boolean;
openPaywallModal: () => void;
}) => {
const user = grantedUser.user;
const session = useService(AuthService).session;
const account = useLiveData(session.account$);
const disableManage =
account?.id === user.id || grantedUser.role === DocRole.Owner;
const disableManage = grantedUser.role === DocRole.Owner || !canManageUsers;
const role = useMemo(() => {
switch (grantedUser.role) {

View File

@@ -66,6 +66,7 @@ export const MemberManagement = ({
grantedUserList={grantedUserList}
grantedUserCount={grantedUserCount}
loadMore={loadMore}
canManageUsers={canManageUsers}
/>
) : (
<Skeleton className={styles.scrollableRootStyle} />
@@ -90,8 +91,10 @@ const MemberList = ({
grantedUserList,
grantedUserCount,
loadMore,
canManageUsers,
}: {
hittingPaywall: boolean;
canManageUsers: boolean;
grantedUserList: GrantedUser[];
grantedUserCount?: number;
openPaywallModal: () => void;
@@ -105,10 +108,11 @@ const MemberList = ({
grantedUser={data}
openPaywallModal={openPaywallModal}
hittingPaywall={hittingPaywall}
canManageUsers={canManageUsers}
/>
);
},
[hittingPaywall, openPaywallModal]
[canManageUsers, hittingPaywall, openPaywallModal]
);
return (
<div className={styles.memberListStyle}>
@@ -119,6 +123,7 @@ const MemberList = ({
grantedUser={item}
openPaywallModal={openPaywallModal}
hittingPaywall={hittingPaywall}
canManageUsers={canManageUsers}
/>
))
) : (