diff --git a/e2e-tests/playwright/support/server/default_config.ts b/e2e-tests/playwright/support/server/default_config.ts index 4e7c589644..2d8cb12c58 100644 --- a/e2e-tests/playwright/support/server/default_config.ts +++ b/e2e-tests/playwright/support/server/default_config.ts @@ -532,6 +532,7 @@ const defaultServerConfig: AdminConfig = { EnableRemoteClusterService: false, EnableAppBar: false, PatchPluginsReactDOM: false, + DisableRefetchingOnBrowserFocus: false, }, AnalyticsSettings: { MaxUsersForStatistics: 2500, diff --git a/server/config/client.go b/server/config/client.go index 50bb37cccd..0de8694999 100644 --- a/server/config/client.go +++ b/server/config/client.go @@ -94,6 +94,8 @@ func GenerateClientConfig(c *model.Config, telemetryID string, license *model.Li props["CWSURL"] = *c.CloudSettings.CWSURL + props["DisableRefetchingOnBrowserFocus"] = strconv.FormatBool(*c.ExperimentalSettings.DisableRefetchingOnBrowserFocus) + // Set default values for all options that require a license. props["ExperimentalEnableAuthenticationTransfer"] = "true" props["LdapNicknameAttributeSet"] = "false" diff --git a/server/model/config.go b/server/model/config.go index 89a7a6da62..f278c97cdf 100644 --- a/server/model/config.go +++ b/server/model/config.go @@ -979,6 +979,7 @@ type ExperimentalSettings struct { EnableRemoteClusterService *bool `access:"experimental_features"` EnableAppBar *bool `access:"experimental_features"` PatchPluginsReactDOM *bool `access:"experimental_features"` + DisableRefetchingOnBrowserFocus *bool `access:"experimental_features"` } func (s *ExperimentalSettings) SetDefaults() { @@ -1017,6 +1018,10 @@ func (s *ExperimentalSettings) SetDefaults() { if s.PatchPluginsReactDOM == nil { s.PatchPluginsReactDOM = NewBool(false) } + + if s.DisableRefetchingOnBrowserFocus == nil { + s.DisableRefetchingOnBrowserFocus = NewBool(false) + } } type AnalyticsSettings struct { diff --git a/server/platform/services/telemetry/telemetry.go b/server/platform/services/telemetry/telemetry.go index 7f33181bd3..d4da4770bc 100644 --- a/server/platform/services/telemetry/telemetry.go +++ b/server/platform/services/telemetry/telemetry.go @@ -750,15 +750,16 @@ func (ts *TelemetryService) trackConfig() { }) ts.SendTelemetry(TrackConfigExperimental, map[string]any{ - "client_side_cert_enable": *cfg.ExperimentalSettings.ClientSideCertEnable, - "isdefault_client_side_cert_check": isDefault(*cfg.ExperimentalSettings.ClientSideCertCheck, model.ClientSideCertCheckPrimaryAuth), - "link_metadata_timeout_milliseconds": *cfg.ExperimentalSettings.LinkMetadataTimeoutMilliseconds, - "restrict_system_admin": *cfg.ExperimentalSettings.RestrictSystemAdmin, - "use_new_saml_library": *cfg.ExperimentalSettings.UseNewSAMLLibrary, - "enable_shared_channels": *cfg.ExperimentalSettings.EnableSharedChannels, - "enable_remote_cluster_service": *cfg.ExperimentalSettings.EnableRemoteClusterService && cfg.FeatureFlags.EnableRemoteClusterService, - "enable_app_bar": *cfg.ExperimentalSettings.EnableAppBar, - "patch_plugins_react_dom": *cfg.ExperimentalSettings.PatchPluginsReactDOM, + "client_side_cert_enable": *cfg.ExperimentalSettings.ClientSideCertEnable, + "isdefault_client_side_cert_check": isDefault(*cfg.ExperimentalSettings.ClientSideCertCheck, model.ClientSideCertCheckPrimaryAuth), + "link_metadata_timeout_milliseconds": *cfg.ExperimentalSettings.LinkMetadataTimeoutMilliseconds, + "restrict_system_admin": *cfg.ExperimentalSettings.RestrictSystemAdmin, + "use_new_saml_library": *cfg.ExperimentalSettings.UseNewSAMLLibrary, + "enable_shared_channels": *cfg.ExperimentalSettings.EnableSharedChannels, + "enable_remote_cluster_service": *cfg.ExperimentalSettings.EnableRemoteClusterService && cfg.FeatureFlags.EnableRemoteClusterService, + "enable_app_bar": *cfg.ExperimentalSettings.EnableAppBar, + "patch_plugins_react_dom": *cfg.ExperimentalSettings.PatchPluginsReactDOM, + "disable_refetching_on_browser_focus": *cfg.ExperimentalSettings.DisableRefetchingOnBrowserFocus, }) ts.SendTelemetry(TrackConfigAnalytics, map[string]any{ diff --git a/webapp/channels/src/components/admin_console/admin_definition.jsx b/webapp/channels/src/components/admin_console/admin_definition.jsx index 1801037c3f..abab875ec2 100644 --- a/webapp/channels/src/components/admin_console/admin_definition.jsx +++ b/webapp/channels/src/components/admin_console/admin_definition.jsx @@ -6887,6 +6887,15 @@ const AdminDefinition = { isHidden: it.licensedForFeature('Cloud'), isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)), }, + { + type: Constants.SettingsTypes.TYPE_BOOL, + key: 'ExperimentalSettings.DisableRefetchingOnBrowserFocus', + label: t('admin.experimental.disableRefetchingOnBrowserFocus.title'), + label_default: 'Disable data refetching on browser refocus:', + help_text: t('admin.experimental.disableRefetchingOnBrowserFocus.desc'), + help_text_default: 'When true, Mattermost will not refetch channels and channel members when the browser regains focus. This may result in improved performance for users with many channels and channel members.', + isDisabled: it.not(it.userHasWritePermissionOnResource(RESOURCE_KEYS.EXPERIMENTAL.FEATURES)), + }, ], }, }, diff --git a/webapp/channels/src/components/team_controller/index.ts b/webapp/channels/src/components/team_controller/index.ts index 693a5d5433..a76a2f9b90 100644 --- a/webapp/channels/src/components/team_controller/index.ts +++ b/webapp/channels/src/components/team_controller/index.ts @@ -36,6 +36,7 @@ function mapStateToProps(state: GlobalState, ownProps: OwnProps) { const currentUser = getCurrentUser(state); const plugins = state.plugins.components.NeedsTeamComponent; const graphQLEnabled = isGraphQLEnabled(state); + const disableRefetchingOnBrowserFocus = config.DisableRefetchingOnBrowserFocus === 'true'; return { currentUser, @@ -46,6 +47,7 @@ function mapStateToProps(state: GlobalState, ownProps: OwnProps) { selectedThreadId: getSelectedThreadIdInCurrentTeam(state), mfaRequired: checkIfMFARequired(currentUser, license, config, ownProps.match.url), graphQLEnabled, + disableRefetchingOnBrowserFocus, }; } diff --git a/webapp/channels/src/components/team_controller/team_controller.tsx b/webapp/channels/src/components/team_controller/team_controller.tsx index a520697214..60dbc84758 100644 --- a/webapp/channels/src/components/team_controller/team_controller.tsx +++ b/webapp/channels/src/components/team_controller/team_controller.tsx @@ -70,7 +70,7 @@ function TeamController(props: Props) { const wakeUpIntervalId = setInterval(() => { const currentTime = Date.now(); if ((currentTime - lastTime.current) > WAKEUP_THRESHOLD) { - console.log('computer woke up - fetching latest'); //eslint-disable-line no-console + console.log('computer woke up - reconnecting'); //eslint-disable-line no-console reconnect(); } lastTime.current = currentTime; @@ -92,12 +92,15 @@ function TeamController(props: Props) { props.markChannelAsReadOnFocus(props.currentChannelId); } - const currentTime = Date.now(); - if ((currentTime - blurTime.current) > UNREAD_CHECK_TIME_MILLISECONDS && props.currentTeamId) { - if (props.graphQLEnabled) { - props.fetchChannelsAndMembers(props.currentTeamId); - } else { - props.fetchMyChannelsAndMembersREST(props.currentTeamId); + // Temporary flag to disable refetching of channel members on browser focus + if (!props.disableRefetchingOnBrowserFocus) { + const currentTime = Date.now(); + if ((currentTime - blurTime.current) > UNREAD_CHECK_TIME_MILLISECONDS && props.currentTeamId) { + if (props.graphQLEnabled) { + props.fetchChannelsAndMembers(props.currentTeamId); + } else { + props.fetchMyChannelsAndMembersREST(props.currentTeamId); + } } } } diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json index 792ca8cf0d..21b4595f82 100644 --- a/webapp/channels/src/i18n/en.json +++ b/webapp/channels/src/i18n/en.json @@ -895,6 +895,8 @@ "admin.experimental.collapsedThreads.title": "Collapsed Reply Threads", "admin.experimental.defaultTheme.desc": "Set a default theme that applies to all new users on the system.", "admin.experimental.defaultTheme.title": "Default Theme:", + "admin.experimental.disableRefetchingOnBrowserFocus.desc": "When true, Mattermost will not refetch channels and channel members when the browser regains focus. This may result in improved performance for users with many channels and channel members.", + "admin.experimental.disableRefetchingOnBrowserFocus.title": "Disable data refetching on browser refocus:", "admin.experimental.emailBatchingBufferSize.desc": "Specify the maximum number of notifications batched into a single email.", "admin.experimental.emailBatchingBufferSize.example": "E.g.: \"256\"", "admin.experimental.emailBatchingBufferSize.title": "Email Batching Buffer Size:", diff --git a/webapp/platform/types/src/config.ts b/webapp/platform/types/src/config.ts index 83914d070d..e8d3d6aa7f 100644 --- a/webapp/platform/types/src/config.ts +++ b/webapp/platform/types/src/config.ts @@ -38,6 +38,7 @@ export type ClientConfig = { DefaultTheme: string; DiagnosticId: string; DiagnosticsEnabled: string; + DisableRefetchingOnBrowserFocus: string; EmailLoginButtonBorderColor: string; EmailLoginButtonColor: string; EmailLoginButtonTextColor: string; @@ -729,6 +730,7 @@ export type ExperimentalSettings = { EnableRemoteClusterService: boolean; EnableAppBar: boolean; PatchPluginsReactDOM: boolean; + DisableRefetchingOnBrowserFocus: boolean; }; export type AnalyticsSettings = {