diff --git a/apps/app/src/client/components/PageControls/PageControls.tsx b/apps/app/src/client/components/PageControls/PageControls.tsx index 2920697147c..b6f27e1d290 100644 --- a/apps/app/src/client/components/PageControls/PageControls.tsx +++ b/apps/app/src/client/components/PageControls/PageControls.tsx @@ -8,6 +8,7 @@ import type { import { isIPageInfoForEntity, isIPageInfoForOperation, } from '@growi/core'; +import { pagePathUtils } from '@growi/core/dist/utils'; import { useRect } from '@growi/ui/dist/utils'; import { useTranslation } from 'next-i18next'; import { DropdownItem } from 'reactstrap'; @@ -17,7 +18,9 @@ import { } from '~/client/services/page-operation'; import { toastError } from '~/client/util/toastr'; import OpenDefaultAiAssistantButton from '~/features/openai/client/components/AiAssistant/OpenDefaultAiAssistantButton'; -import { useIsGuestUser, useIsReadOnlyUser, useIsSearchPage } from '~/stores-universal/context'; +import { + useIsGuestUser, useIsReadOnlyUser, useIsSearchPage, useIsUsersHomepageDeletionEnabled, +} from '~/stores-universal/context'; import { EditorMode, useEditorMode, } from '~/stores-universal/ui'; @@ -27,7 +30,7 @@ import { } from '~/stores/ui'; import loggerFactory from '~/utils/logger'; -import { useSWRxPageInfo, useSWRxTagsInfo } from '../../../stores/page'; +import { useSWRxPageInfo, useSWRxTagsInfo, useCurrentPagePath } from '../../../stores/page'; import { useSWRxUsersList } from '../../../stores/user'; import type { AdditionalMenuItemsRendererProps, ForceHideMenuItems } from '../Common/Dropdown/PageItemControl'; import { @@ -134,6 +137,10 @@ const PageControlsSubstance = (props: PageControlsSubstanceProps): JSX.Element = const { data: editorMode } = useEditorMode(); const { data: isDeviceLargerThanMd } = useIsDeviceLargerThanMd(); const { data: isSearchPage } = useIsSearchPage(); + const { data: isUsersHomepageDeletionEnabled } = useIsUsersHomepageDeletionEnabled(); + const { data: currentPagePath } = useCurrentPagePath(); + + const isUsersHomepage = currentPagePath == null ? false : pagePathUtils.isUsersHomepage(currentPagePath); const { mutate: mutatePageInfo } = useSWRxPageInfo(pageId, shareLinkId); @@ -249,6 +256,22 @@ const PageControlsSubstance = (props: PageControlsSubstanceProps): JSX.Element = } }, [expandContentWidth, isGuestUser, isReadOnlyUser, onClickSwitchContentWidth, pageId, pageInfo]); + const isEnableActions = useMemo(() => { + if (isGuestUser) { + return false; + } + + if (currentPagePath == null) { + return false; + } + + if (isUsersHomepage && !isUsersHomepageDeletionEnabled) { + return false; + } + + return true; + }, [isGuestUser, isUsersHomepage, isUsersHomepageDeletionEnabled]); + const additionalMenuItemOnTopRenderer = useMemo(() => { if (!isIPageInfoForEntity(pageInfo)) { return undefined; @@ -332,7 +355,7 @@ const PageControlsSubstance = (props: PageControlsSubstanceProps): JSX.Element = = (props: Props) => { @@ -258,6 +259,9 @@ const Page: NextPageWithLayout = (props: Props) => { useIsAiEnabled(props.aiEnabled); useLimitLearnablePageCountPerAssistant(props.limitLearnablePageCountPerAssistant); + useIsUsersHomepageDeletionEnabled(props.isUsersHomepageDeletionEnabled); + + const { pageWithMeta } = props; const pageId = pageWithMeta?.data._id; @@ -576,7 +580,7 @@ function injectServerConfigurations(context: GetServerSidePropsContext, props: P props.aiEnabled = configManager.getConfig('app:aiEnabled'); props.limitLearnablePageCountPerAssistant = configManager.getConfig('openai:limitLearnablePageCountPerAssistant'); - + props.isUsersHomepageDeletionEnabled = configManager.getConfig('security:user-homepage-deletion:isEnabled'); props.isSearchServiceConfigured = searchService.isConfigured; props.isSearchServiceReachable = searchService.isReachable; props.isSearchScopeChildrenAsDefault = configManager.getConfig('customize:isSearchScopeChildrenAsDefault'); diff --git a/apps/app/src/stores-universal/context.tsx b/apps/app/src/stores-universal/context.tsx index af9b84b3853..0ac730a153d 100644 --- a/apps/app/src/stores-universal/context.tsx +++ b/apps/app/src/stores-universal/context.tsx @@ -224,8 +224,14 @@ export const useLimitLearnablePageCountPerAssistant = (initialData?: number): SW return useContextSWR('limitLearnablePageCountPerAssistant', initialData); }; + +export const useIsUsersHomepageDeletionEnabled = (initialData?: boolean): SWRResponse => { + return useContextSWR('isUsersHomepageDeletionEnabled', initialData); +}; + export const useIsEnableUnifiedMergeView = (initialData?: boolean): SWRResponse => { return useSWRStatic('isEnableUnifiedMergeView', initialData, { fallbackData: false }); + }; /** **********************************************************