feat(core): add use guard hook (#11180)

Previously, we used `useLiveData(guardService.can$())` to get the guard result, but `guardService.can$()` will request the server to revalidate the permission when calling it, will cause additional network requests when re-render.

This pr make a new hook `useGuard` to fix this problem.

And the side effect in `can$` is moved to `revalidateCan()` to make that the subscribe method is pure
This commit is contained in:
EYHN
2025-03-25 14:15:29 +00:00
parent a10acf304b
commit 3df51a217d
28 changed files with 154 additions and 163 deletions

View File

@@ -8,12 +8,12 @@ import {
Tooltip,
useConfirmModal,
} from '@affine/component';
import { useGuard } from '@affine/core/components/guard';
import { useAsyncCallback } from '@affine/core/components/hooks/affine-async-hooks';
import { DocService } from '@affine/core/modules/doc';
import {
DocGrantedUsersService,
type GrantedUser,
GuardService,
WorkspacePermissionService,
} from '@affine/core/modules/permissions';
import { UserFriendlyError } from '@affine/error';
@@ -131,7 +131,6 @@ const Options = ({
const t = useI18n();
const docGrantedUsersService = useService(DocGrantedUsersService);
const docService = useService(DocService);
const guardService = useService(GuardService);
const workspacePermissionService = useService(WorkspacePermissionService);
const isWorkspaceOwner = useLiveData(
workspacePermissionService.permission.isOwner$
@@ -140,11 +139,8 @@ const Options = ({
const { openConfirmModal } = useConfirmModal();
const canTransferOwner =
useLiveData(guardService.can$('Doc_TransferOwner', docService.doc.id)) &&
!!isWorkspaceOwner;
const canManageUsers = useLiveData(
guardService.can$('Doc_Users_Manage', docService.doc.id)
);
useGuard('Doc_TransferOwner', docService.doc.id) && !!isWorkspaceOwner;
const canManageUsers = useGuard('Doc_Users_Manage', docService.doc.id);
const updateUserRole = useCallback(
async (userId: string, role: DocRole) => {

View File

@@ -1,9 +1,9 @@
import { Skeleton } from '@affine/component';
import { useGuard } from '@affine/core/components/guard';
import { DocService } from '@affine/core/modules/doc';
import {
DocGrantedUsersService,
type GrantedUser,
GuardService,
} from '@affine/core/modules/permissions';
import { useI18n } from '@affine/i18n';
import { ArrowLeftBigIcon } from '@blocksuite/icons/rc';
@@ -33,11 +33,8 @@ export const MemberManagement = ({
docGrantedUsersService.grantedUserCount$
);
const docService = useService(DocService);
const guardService = useService(GuardService);
const canManageUsers = useLiveData(
guardService.can$('Doc_Users_Manage', docService.doc.id)
);
const canManageUsers = useGuard('Doc_Users_Manage', docService.doc.id);
const t = useI18n();

View File

@@ -1,8 +1,8 @@
import { Divider, Skeleton } from '@affine/component';
import { Button } from '@affine/component/ui/button';
import { useGuard } from '@affine/core/components/guard';
import { ServerService } from '@affine/core/modules/cloud';
import { DocService } from '@affine/core/modules/doc';
import { GuardService } from '@affine/core/modules/permissions';
import { ShareInfoService } from '@affine/core/modules/share-doc';
import { useI18n } from '@affine/i18n';
import { useLiveData, useService } from '@toeverything/infra';
@@ -64,15 +64,10 @@ export const AFFiNESharePage = (
const shareInfoService = useService(ShareInfoService);
const serverService = useService(ServerService);
const docService = useService(DocService);
const guardService = useService(GuardService);
const canManageUsers = useLiveData(
guardService.can$('Doc_Users_Manage', docService.doc.id)
);
const canManageUsers = useGuard('Doc_Users_Manage', docService.doc.id);
const canPublish = useLiveData(
guardService.can$('Doc_Publish', docService.doc.id)
);
const canPublish = useGuard('Doc_Publish', docService.doc.id);
useEffect(() => {
shareInfoService.shareInfo.revalidate();