diff --git a/packages/frontend/core/src/modules/share-menu/view/share-menu/general-access/members-permission.tsx b/packages/frontend/core/src/modules/share-menu/view/share-menu/general-access/members-permission.tsx index 922d21542..19a9cfa5b 100644 --- a/packages/frontend/core/src/modules/share-menu/view/share-menu/general-access/members-permission.tsx +++ b/packages/frontend/core/src/modules/share-menu/view/share-menu/general-access/members-permission.tsx @@ -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 ( diff --git a/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/index.tsx b/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/index.tsx index 51bf9540d..7dc14307d 100644 --- a/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/index.tsx +++ b/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/index.tsx @@ -121,15 +121,21 @@ export const MembersRow = ({ onClick }: { onClick: () => void }) => { className={clsx(styles.rowContainerStyle, 'clickable')} onClick={onClick} > -
- - {docOwner?.user.name} -
-
{t['Owner']()}
+ {docOwner ? ( + <> +
+ + {docOwner.user.name} +
+
{t['Owner']()}
+ + ) : ( +
{t['com.affine.share-menu.invite-editor.manage-members']()}
+ )}
diff --git a/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/member-item.tsx b/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/member-item.tsx index 52c0f82c6..807f6ecb8 100644 --- a/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/member-item.tsx +++ b/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/member-item.tsx @@ -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) { diff --git a/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/member-management.tsx b/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/member-management.tsx index bd49fa1f7..c6d6f8d1c 100644 --- a/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/member-management.tsx +++ b/packages/frontend/core/src/modules/share-menu/view/share-menu/member-management/member-management.tsx @@ -66,6 +66,7 @@ export const MemberManagement = ({ grantedUserList={grantedUserList} grantedUserCount={grantedUserCount} loadMore={loadMore} + canManageUsers={canManageUsers} /> ) : ( @@ -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 (
@@ -119,6 +123,7 @@ const MemberList = ({ grantedUser={item} openPaywallModal={openPaywallModal} hittingPaywall={hittingPaywall} + canManageUsers={canManageUsers} /> )) ) : (