From 55cb4dc5e7c3cceead4149830e1e22d6f5fc0dad Mon Sep 17 00:00:00 2001 From: EYHN Date: Thu, 20 Mar 2025 10:53:41 +0800 Subject: [PATCH] feat(core): adjust guard service support loading state (#10989) --- .../components/doc-properties/manager/index.tsx | 2 +- .../core/src/components/guard/doc-guard.tsx | 2 +- .../core/src/modules/permissions/services/guard.ts | 14 ++++++++------ .../member-management/member-management.tsx | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/frontend/core/src/components/doc-properties/manager/index.tsx b/packages/frontend/core/src/components/doc-properties/manager/index.tsx index 2398269ddb..9a164d6ce6 100644 --- a/packages/frontend/core/src/components/doc-properties/manager/index.tsx +++ b/packages/frontend/core/src/components/doc-properties/manager/index.tsx @@ -75,7 +75,7 @@ const PropertyItem = ({ () => ({ canDrop(data) { return ( - canEditPropertyInfo && + !!canEditPropertyInfo && data.source.data.entity?.type === 'custom-property' && data.source.data.from?.at === 'doc-property:manager' && data.source.data.from?.workspaceId === diff --git a/packages/frontend/core/src/components/guard/doc-guard.tsx b/packages/frontend/core/src/components/guard/doc-guard.tsx index 649d151972..2cb3345148 100644 --- a/packages/frontend/core/src/components/guard/doc-guard.tsx +++ b/packages/frontend/core/src/components/guard/doc-guard.tsx @@ -12,7 +12,7 @@ export const DocPermissionGuard = ({ }: { docId: string; permission: DocPermissionActions; - children: (can: boolean) => React.ReactNode; + children: (can: boolean | undefined) => React.ReactNode; }) => { const guardService = useService(GuardService); const can = useLiveData(guardService.can$(permission, docId)); diff --git a/packages/frontend/core/src/modules/permissions/services/guard.ts b/packages/frontend/core/src/modules/permissions/services/guard.ts index a4bccdce15..18f377dfe7 100644 --- a/packages/frontend/core/src/modules/permissions/services/guard.ts +++ b/packages/frontend/core/src/modules/permissions/services/guard.ts @@ -56,11 +56,13 @@ export class GuardService extends Service { * guardService.can$('Workspace_Properties_Update'); * guardService.can$('Doc_Update', docId); * ``` + * + * @returns LiveData the value is undefined if the permission is loading */ can$( action: T, ...args: T extends DocPermissionActions ? [string] : [] - ): LiveData { + ): LiveData { const docId = args[0]; return LiveData.from( new Observable(subscriber => { @@ -75,14 +77,14 @@ export class GuardService extends Service { this.workspacePermissionService.permission.revalidate(); } - let prev = false; + let prev: boolean | undefined = undefined; const subscription = combineLatest([ (docId ? this.docPermissions$.pipe( - map(permissions => permissions[docId] ?? false) + map(permissions => permissions[docId] ?? {}) ) - : this.workspacePermissions$) as Observable< + : this.workspacePermissions$.asObservable()) as Observable< Record >, this.isAdmin$, @@ -90,7 +92,7 @@ export class GuardService extends Service { if (isAdmin) { return subscriber.next(true); } - const current = permissions[action] ?? false; + const current = permissions[action] ?? undefined; if (current !== prev) { prev = current; subscriber.next(current); @@ -101,7 +103,7 @@ export class GuardService extends Service { subscription.unsubscribe(); }; }), - false + undefined ); } 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 c6d6f8d1c7..232dc69435 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,7 +66,7 @@ export const MemberManagement = ({ grantedUserList={grantedUserList} grantedUserCount={grantedUserCount} loadMore={loadMore} - canManageUsers={canManageUsers} + canManageUsers={!!canManageUsers} /> ) : (