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:
@@ -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) => {
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user