diff --git a/apps/meteor/client/views/admin/EditableSettingsContext.ts b/apps/meteor/client/views/admin/EditableSettingsContext.ts index 24c09cde2f3..ed149669b8c 100644 --- a/apps/meteor/client/views/admin/EditableSettingsContext.ts +++ b/apps/meteor/client/views/admin/EditableSettingsContext.ts @@ -28,7 +28,6 @@ export type EditableSettingsContextValue = { _id: ISetting['_id'], ) => [subscribe: (onStoreChange: () => void) => () => void, getSnapshot: () => ISetting['_id'][]]; readonly dispatch: (changes: Partial[]) => void; - readonly isEnterprise: boolean; }; export const EditableSettingsContext = createContext({ @@ -37,11 +36,8 @@ export const EditableSettingsContext = createContext [(): (() => void) => (): void => undefined, (): string[] => []], queryGroupTabs: () => [(): (() => void) => (): void => undefined, (): ISetting['_id'][] => []], dispatch: () => undefined, - isEnterprise: false, }); -export const useIsEnterprise = (): boolean => useContext(EditableSettingsContext).isEnterprise; - export const useEditableSetting = (_id: ISetting['_id']): EditableSetting | undefined => { const { queryEditableSetting } = useContext(EditableSettingsContext); diff --git a/apps/meteor/client/views/admin/settings/EditableSettingsProvider.tsx b/apps/meteor/client/views/admin/settings/EditableSettingsProvider.tsx index be33c4617bf..b6ea33fa030 100644 --- a/apps/meteor/client/views/admin/settings/EditableSettingsProvider.tsx +++ b/apps/meteor/client/views/admin/settings/EditableSettingsProvider.tsx @@ -8,7 +8,6 @@ import type { FilterOperators } from 'mongodb'; import type { MutableRefObject, ReactNode } from 'react'; import React, { useEffect, useMemo, useRef } from 'react'; -import { useIsEnterprise } from '../../../hooks/useIsEnterprise'; import { createReactiveSubscriptionFactory } from '../../../lib/createReactiveSubscriptionFactory'; import type { EditableSetting, EditableSettingsContextValue } from '../EditableSettingsContext'; import { EditableSettingsContext } from '../EditableSettingsContext'; @@ -193,10 +192,6 @@ const EditableSettingsProvider = ({ children, query = defaultQuery, omit = defau Tracker.flush(); }); - const { data } = useIsEnterprise(); - - const isEnterprise = data?.isEnterprise ?? false; - const contextValue = useMemo( () => ({ queryEditableSetting, @@ -204,9 +199,8 @@ const EditableSettingsProvider = ({ children, query = defaultQuery, omit = defau queryGroupSections, queryGroupTabs, dispatch, - isEnterprise, }), - [queryEditableSetting, queryEditableSettings, queryGroupSections, queryGroupTabs, dispatch, isEnterprise], + [queryEditableSetting, queryEditableSettings, queryGroupSections, queryGroupTabs, dispatch], ); return ; diff --git a/apps/meteor/client/views/admin/settings/Setting/Setting.tsx b/apps/meteor/client/views/admin/settings/Setting/Setting.tsx index 9e74f2e36b7..0fe1d671669 100644 --- a/apps/meteor/client/views/admin/settings/Setting/Setting.tsx +++ b/apps/meteor/client/views/admin/settings/Setting/Setting.tsx @@ -9,7 +9,8 @@ import { useTranslation } from 'react-i18next'; import MemoizedSetting from './MemoizedSetting'; import MarkdownText from '../../../../components/MarkdownText'; -import { useEditableSetting, useEditableSettingsDispatch, useIsEnterprise } from '../../EditableSettingsContext'; +import { useEditableSetting, useEditableSettingsDispatch } from '../../EditableSettingsContext'; +import { useHasSettingModule } from '../hooks/useHasSettingModule'; type SettingProps = { className?: string; @@ -20,7 +21,7 @@ type SettingProps = { function Setting({ className = undefined, settingId, sectionChanged }: SettingProps): ReactElement { const setting = useEditableSetting(settingId); const persistedSetting = useSettingStructure(settingId); - const isEnterprise = useIsEnterprise(); + const hasSettingModule = useHasSettingModule(setting); if (!setting || !persistedSetting) { throw new Error(`Setting ${settingId} not found`); @@ -105,12 +106,13 @@ function Setting({ className = undefined, settingId, sectionChanged }: SettingPr ) : undefined, [i18n, i18nDescription, t], ); + const callout = useMemo( () => alert && , [alert, i18n, t], ); - const shouldDisableEnterprise = setting.enterprise && !isEnterprise; + const shouldDisableEnterprise = setting.enterprise && !hasSettingModule; const PRICING_URL = 'https://go.rocket.chat/i/see-paid-plan-customize-homepage'; diff --git a/apps/meteor/client/views/admin/settings/hooks/useHasSettingModule.ts b/apps/meteor/client/views/admin/settings/hooks/useHasSettingModule.ts new file mode 100644 index 00000000000..589c26cb13a --- /dev/null +++ b/apps/meteor/client/views/admin/settings/hooks/useHasSettingModule.ts @@ -0,0 +1,26 @@ +import type { ISetting, LicenseModule } from '@rocket.chat/core-typings'; +import { useMemo } from 'react'; + +import { useLicenseBase } from '../../../../hooks/useLicense'; + +export const useHasSettingModule = (setting?: ISetting) => { + const { data } = useLicenseBase({ + select: (data) => ({ isEnterprise: Boolean(data?.license.license), activeModules: data?.license.activeModules }), + }); + + const isEnterprise = data?.isEnterprise ?? false; + + const hasSettingModule = useMemo(() => { + if (!setting?.modules || setting?.modules.length === 0) { + return false; + } + + return setting.modules.every((module) => data?.activeModules.includes(module as LicenseModule)); + }, [data?.activeModules, setting?.modules]); + + if (!setting) { + throw new Error('No setting provided'); + } + + return isEnterprise && hasSettingModule; +};