/* * SPDX-License-Identifier: Apache-2.0 * * The OpenSearch Contributors require contributions made to * this file be licensed under the Apache-2.0 license or a * compatible open source license. * * Any modifications Copyright OpenSearch Contributors. See * GitHub history for details. */ /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import React, { Component, Fragment } from 'react'; import { EuiCallOut, EuiPanel, EuiForm, EuiFlexGroup, EuiFlexItem, EuiLink, EuiSpacer, EuiText, } from '@elastic/eui'; import { FormattedMessage } from '@osd/i18n/react'; import { i18n } from '@osd/i18n'; import { TelemetryPluginSetup } from 'src/plugins/telemetry/public'; import { PRIVACY_STATEMENT_URL } from '../../../telemetry/common/constants'; import { OptInExampleFlyout } from './opt_in_example_flyout'; import { OptInSecurityExampleFlyout } from './opt_in_security_example_flyout'; import { LazyField } from '../../../advanced_settings/public'; import { ToastsStart } from '../../../../core/public'; type TelemetryService = TelemetryPluginSetup['telemetryService']; const SEARCH_TERMS = ['telemetry', 'usage', 'data', 'usage data']; interface Props { telemetryService: TelemetryService; onQueryMatchChange: (searchTermMatches: boolean) => void; isSecurityExampleEnabled: () => boolean; showAppliesSettingMessage: boolean; enableSaving: boolean; query?: any; toasts: ToastsStart; } interface State { processing: boolean; showExample: boolean; showSecurityExample: boolean; queryMatches: boolean | null; enabled: boolean; } export class TelemetryManagementSection extends Component { state: State = { processing: false, showExample: false, showSecurityExample: false, queryMatches: null, enabled: this.props.telemetryService.getIsOptedIn() || false, }; UNSAFE_componentWillReceiveProps(nextProps: Props) { const { query } = nextProps; const searchTerm = (query.text || '').toLowerCase(); const searchTermMatches = this.props.telemetryService.getCanChangeOptInStatus() && SEARCH_TERMS.some((term) => term.indexOf(searchTerm) >= 0); if (searchTermMatches !== this.state.queryMatches) { this.setState( { queryMatches: searchTermMatches, }, () => { this.props.onQueryMatchChange(searchTermMatches); } ); } } render() { const { telemetryService, isSecurityExampleEnabled } = this.props; const { showExample, showSecurityExample, queryMatches, enabled, processing } = this.state; const securityExampleEnabled = isSecurityExampleEnabled(); if (!telemetryService.getCanChangeOptInStatus()) { return null; } if (queryMatches !== null && !queryMatches) { return null; } return ( {showExample && ( )} {showSecurityExample && securityExampleEnabled && ( )}

{this.maybeGetAppliesSettingMessage()}
); } maybeGetAppliesSettingMessage = () => { if (!this.props.showAppliesSettingMessage) { return null; } return ( ), }} />

} /> ); }; renderDescription = () => { const { isSecurityExampleEnabled } = this.props; const securityExampleEnabled = isSecurityExampleEnabled(); const clusterDataLink = ( ); const endpointSecurityDataLink = ( ); return (

), }} />

{securityExampleEnabled ? ( ) : ( )}

); }; toggleOptIn = async (): Promise => { const { telemetryService, toasts } = this.props; const newOptInValue = !this.state.enabled; return new Promise((resolve, reject) => { this.setState( { processing: true, enabled: newOptInValue, }, async () => { try { await telemetryService.setOptIn(newOptInValue); this.setState({ processing: false }); toasts.addSuccess( newOptInValue ? i18n.translate('telemetry.optInSuccessOn', { defaultMessage: 'Usage data collection turned on.', }) : i18n.translate('telemetry.optInSuccessOff', { defaultMessage: 'Usage data collection turned off.', }) ); resolve(true); } catch (err) { this.setState({ processing: false }); reject(err); } } ); }); }; toggleExample = () => { this.setState({ showExample: !this.state.showExample, }); }; toggleSecurityExample = () => { const { isSecurityExampleEnabled } = this.props; const securityExampleEnabled = isSecurityExampleEnabled(); if (!securityExampleEnabled) return; this.setState({ showSecurityExample: !this.state.showSecurityExample, }); }; } // required for lazy loading // eslint-disable-next-line import/no-default-export export default TelemetryManagementSection;