feat(core): adjust guard service support loading state (#10989)

This commit is contained in:
EYHN
2025-03-20 10:53:41 +08:00
committed by GitHub
parent b88e7f0e35
commit 55cb4dc5e7
4 changed files with 11 additions and 9 deletions

View File

@@ -75,7 +75,7 @@ const PropertyItem = ({
() => ({ () => ({
canDrop(data) { canDrop(data) {
return ( return (
canEditPropertyInfo && !!canEditPropertyInfo &&
data.source.data.entity?.type === 'custom-property' && data.source.data.entity?.type === 'custom-property' &&
data.source.data.from?.at === 'doc-property:manager' && data.source.data.from?.at === 'doc-property:manager' &&
data.source.data.from?.workspaceId === data.source.data.from?.workspaceId ===

View File

@@ -12,7 +12,7 @@ export const DocPermissionGuard = ({
}: { }: {
docId: string; docId: string;
permission: DocPermissionActions; permission: DocPermissionActions;
children: (can: boolean) => React.ReactNode; children: (can: boolean | undefined) => React.ReactNode;
}) => { }) => {
const guardService = useService(GuardService); const guardService = useService(GuardService);
const can = useLiveData(guardService.can$(permission, docId)); const can = useLiveData(guardService.can$(permission, docId));

View File

@@ -56,11 +56,13 @@ export class GuardService extends Service {
* guardService.can$('Workspace_Properties_Update'); * guardService.can$('Workspace_Properties_Update');
* guardService.can$('Doc_Update', docId); * guardService.can$('Doc_Update', docId);
* ``` * ```
*
* @returns LiveData<boolean | undefined> the value is undefined if the permission is loading
*/ */
can$<T extends WorkspacePermissionActions | DocPermissionActions>( can$<T extends WorkspacePermissionActions | DocPermissionActions>(
action: T, action: T,
...args: T extends DocPermissionActions ? [string] : [] ...args: T extends DocPermissionActions ? [string] : []
): LiveData<boolean> { ): LiveData<boolean | undefined> {
const docId = args[0]; const docId = args[0];
return LiveData.from( return LiveData.from(
new Observable(subscriber => { new Observable(subscriber => {
@@ -75,14 +77,14 @@ export class GuardService extends Service {
this.workspacePermissionService.permission.revalidate(); this.workspacePermissionService.permission.revalidate();
} }
let prev = false; let prev: boolean | undefined = undefined;
const subscription = combineLatest([ const subscription = combineLatest([
(docId (docId
? this.docPermissions$.pipe( ? this.docPermissions$.pipe(
map(permissions => permissions[docId] ?? false) map(permissions => permissions[docId] ?? {})
) )
: this.workspacePermissions$) as Observable< : this.workspacePermissions$.asObservable()) as Observable<
Record<string, boolean> Record<string, boolean>
>, >,
this.isAdmin$, this.isAdmin$,
@@ -90,7 +92,7 @@ export class GuardService extends Service {
if (isAdmin) { if (isAdmin) {
return subscriber.next(true); return subscriber.next(true);
} }
const current = permissions[action] ?? false; const current = permissions[action] ?? undefined;
if (current !== prev) { if (current !== prev) {
prev = current; prev = current;
subscriber.next(current); subscriber.next(current);
@@ -101,7 +103,7 @@ export class GuardService extends Service {
subscription.unsubscribe(); subscription.unsubscribe();
}; };
}), }),
false undefined
); );
} }

View File

@@ -66,7 +66,7 @@ export const MemberManagement = ({
grantedUserList={grantedUserList} grantedUserList={grantedUserList}
grantedUserCount={grantedUserCount} grantedUserCount={grantedUserCount}
loadMore={loadMore} loadMore={loadMore}
canManageUsers={canManageUsers} canManageUsers={!!canManageUsers}
/> />
) : ( ) : (
<Skeleton className={styles.scrollableRootStyle} /> <Skeleton className={styles.scrollableRootStyle} />