diff --git a/x-pack/solutions/security/plugins/security_solution/public/app/app.tsx b/x-pack/solutions/security/plugins/security_solution/public/app/app.tsx index 2c8dbf8467bef..4adaeb8b17dd4 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/app/app.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/app/app.tsx @@ -32,6 +32,7 @@ import { UserPrivilegesProvider } from '../common/components/user_privileges/use import { ReactQueryClientProvider } from '../common/containers/query_client/query_client_provider'; import { DiscoverInTimelineContextProvider } from '../common/components/discover_in_timeline/provider'; import { AssistantProvider } from '../assistant/provider'; +import { DefaultDataViewProvider } from '../data_view_manager/containers/data_view_provider'; interface StartAppComponent { children: React.ReactNode; @@ -55,27 +56,29 @@ const StartAppComponent: FC = ({ children, history, store, th - - - - - - - - - - {children} - - - - - - - - - + + + + + + + + + + + {children} + + + + + + + + + + diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/mock/test_providers.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/mock/test_providers.tsx index 006bf80de8ef3..7c26b0526d86c 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/common/mock/test_providers.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/common/mock/test_providers.tsx @@ -40,6 +40,9 @@ import { UserPrivilegesProvider } from '../components/user_privileges/user_privi import { MockDiscoverInTimelineContext } from '../components/discover_in_timeline/mocks/discover_in_timeline_provider'; import { createMockStore } from './create_store'; import type { StartServices } from '../../types'; +import { TestDefaultDataViewProvider } from '../../data_view_manager/containers/test_default_data_views_provider'; + +jest.mock('../../data_view_manager/containers/data_view_provider'); interface Props { children?: React.ReactNode; @@ -84,23 +87,25 @@ export const TestProvidersComponent = ({ ({ eui: euiDarkVars, darkMode: true })}> - - - - - - Promise.resolve(cellActions)} - > - - {children} - - - - - - - + + + + + + + Promise.resolve(cellActions)} + > + + {children} + + + + + + + + diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/constants.ts b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/constants.ts new file mode 100644 index 0000000000000..0e707cb4ce93a --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/constants.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { DataView } from '@kbn/data-views-plugin/public'; + +import type { DefaultDataViewsContextValue } from './context'; + +export const fallbackDataView = { + id: '', + title: '', + toSpec: () => ({ id: '', title: '' }), +} as unknown as DataView; + +export const fallbackDataViews = { + defaultDataView: fallbackDataView, + alertDataView: fallbackDataView, +} as unknown as DefaultDataViewsContextValue; diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/context.ts b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/context.ts new file mode 100644 index 0000000000000..6d10adbe2f2cf --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/context.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createContext } from 'react'; + +import type { DataView } from '@kbn/data-views-plugin/public'; + +export interface DefaultDataViewsContextValue { + defaultDataView: DataView; + alertDataView: DataView; +} + +export const DefaultDataViewContext = createContext( + undefined +); diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/data_view_provider.tsx b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/data_view_provider.tsx new file mode 100644 index 0000000000000..17d8ea7801d02 --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/data_view_provider.tsx @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FC, PropsWithChildren } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; +import { useKibana } from '../../common/lib/kibana'; +import { createDefaultDataView } from '../utils/create_default_data_view'; +import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; +import { fallbackDataViews } from './constants'; +import { DefaultDataViewContext, type DefaultDataViewsContextValue } from './context'; + +/** + * Internal-only hook to fetch default data view in given space, during init + */ +export const useDefaultDataViews = () => { + const newDataViewPickerEnabled = useIsExperimentalFeatureEnabled('newDataViewPickerEnabled'); + const defaultDataViews = useContext(DefaultDataViewContext); + + if (!newDataViewPickerEnabled) { + return fallbackDataViews; + } + + if (!defaultDataViews) { + throw new Error('Could not fetch default data view'); + } + + return defaultDataViews; +}; + +/** + * Blocks security solution rendering until we have the initial data view instance ready + */ +export const DefaultDataViewProvider: FC = ({ children }) => { + const { dataViews, uiSettings, spaces, application, http } = useKibana().services; + + const [defaultDataViews, setDefaultDataViews] = useState(); + + const newDataViewPickerEnabled = useIsExperimentalFeatureEnabled('newDataViewPickerEnabled'); + + useEffect(() => { + (async () => { + // NOTE: being defensive + if (defaultDataViews || !newDataViewPickerEnabled) { + return; + } + + const { defaultDataView: defaultDataViewMetadata, alertDataView: alertDataViewSpec } = + await createDefaultDataView({ + dataViewService: dataViews, + uiSettings, + spaces, + application, + http, + }); + + const [dataView, alertDataView] = await Promise.all([ + dataViews?.get(defaultDataViewMetadata.id), + dataViews?.get(alertDataViewSpec.id), + ]); + + setDefaultDataViews({ defaultDataView: dataView, alertDataView }); + })(); + }, [ + application, + dataViews, + defaultDataViews, + http, + newDataViewPickerEnabled, + spaces, + uiSettings, + ]); + + return ( + + {defaultDataViews || !newDataViewPickerEnabled ? children : null} + + ); +}; diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/test_default_data_views_provider.tsx b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/test_default_data_views_provider.tsx new file mode 100644 index 0000000000000..7eb54a93962ad --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/containers/test_default_data_views_provider.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { type FC, type PropsWithChildren } from 'react'; +import { fallbackDataViews } from './constants'; +import { DefaultDataViewContext } from './context'; + +/** + * Test-specific provider, should not be used in the real app + */ +export const TestDefaultDataViewProvider: FC = ({ children }) => ( + + {children} + +); diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_data_view.test.ts b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_data_view.test.ts index f488b465b7cb9..b9e829a494148 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_data_view.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_data_view.test.ts @@ -14,6 +14,12 @@ import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experime import { useSelector } from 'react-redux'; jest.mock('../../common/hooks/use_experimental_features'); +jest.mock('../containers/data_view_provider', () => ({ + useDefaultDataViews: jest.fn().mockReturnValue({ + defaultDataView: { id: '', title: '' }, + alertDataView: { id: '', title: '' }, + }), +})); jest.mock('react-redux', () => ({ ...jest.requireActual('react-redux'), @@ -28,24 +34,12 @@ describe('useDataView', () => { .mockReturnValue({ dataViewId: DEFAULT_SECURITY_SOLUTION_DATA_VIEW_ID, status: 'ready' }); }); - describe('when data view is available', () => { - it('should return DataView instance', async () => { - const wrapper = renderHook(() => useDataView(DataViewManagerScopeName.default), { - wrapper: TestProviders, - }); - - await act(async () => wrapper.rerender(DataViewManagerScopeName.default)); - expect(wrapper.result.current.dataView).toBeTruthy(); + it('should return DataView instance', async () => { + const wrapper = renderHook(() => useDataView(DataViewManagerScopeName.default), { + wrapper: TestProviders, }); - }); - describe('when data view fields are not available', () => { - it('should return undefined', () => { - const wrapper = renderHook(() => useDataView(DataViewManagerScopeName.default), { - wrapper: TestProviders, - }); - - expect(wrapper.result.current.dataView).toBeUndefined(); - }); + await act(async () => wrapper.rerender(DataViewManagerScopeName.default)); + expect(wrapper.result.current.dataView).toBeTruthy(); }); }); diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_data_view.ts b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_data_view.ts index 92b01544b2504..df8d97a7856bf 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_data_view.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_data_view.ts @@ -6,7 +6,7 @@ */ import { useEffect, useMemo, useState } from 'react'; -import { type DataView } from '@kbn/data-views-plugin/public'; +import type { DataView } from '@kbn/data-views-plugin/public'; import { useSelector } from 'react-redux'; import { useKibana } from '../../common/lib/kibana'; @@ -14,6 +14,12 @@ import { DataViewManagerScopeName } from '../constants'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import { sourcererAdapterSelector } from '../redux/selectors'; import type { SharedDataViewSelectionState } from '../redux/types'; +import { useDefaultDataViews } from '../containers/data_view_provider'; + +export interface UseDataViewValue { + dataView: DataView; + status: SharedDataViewSelectionState['status']; +} /* * This hook should be used whenever we need the actual DataView and not just the spec for the @@ -21,46 +27,56 @@ import type { SharedDataViewSelectionState } from '../redux/types'; */ export const useDataView = ( dataViewManagerScope: DataViewManagerScopeName = DataViewManagerScopeName.default -): { dataView: DataView | undefined; status: SharedDataViewSelectionState['status'] } => { +): UseDataViewValue => { const { services: { dataViews }, notifications, } = useKibana(); + const defaultDataViews = useDefaultDataViews(); const { dataViewId, status: internalStatus } = useSelector( sourcererAdapterSelector(dataViewManagerScope) ); const newDataViewPickerEnabled = useIsExperimentalFeatureEnabled('newDataViewPickerEnabled'); - const [retrievedDataView, setRetrievedDataView] = useState(); + + const [retrievedDataView, setRetrievedDataView] = useState(() => + dataViewManagerScope === DataViewManagerScopeName.default + ? defaultDataViews.defaultDataView + : defaultDataViews.alertDataView + ); + const [localStatus, setLocalStatus] = useState('loading'); useEffect(() => { (async () => { + if (!newDataViewPickerEnabled) { + return; + } + if (!dataViewId || internalStatus !== 'ready') { - return setRetrievedDataView(undefined); + return; } + setLocalStatus('loading'); + try { // TODO: remove conditional .get call when new data view picker is stabilized // this is due to the fact that many of our tests mock kibana hook and do not provide proper // double for dataViews service const currDv = await dataViews?.get(dataViewId); setRetrievedDataView(currDv); + setLocalStatus('ready'); } catch (error) { - setRetrievedDataView(undefined); // TODO: (remove conditional call when feature flag is on (mocks are broken for some tests)) notifications?.toasts?.danger({ title: 'Error retrieving data view', body: `Error: ${error?.message ?? 'unknown'}`, }); + setLocalStatus('error'); } })(); - }, [dataViews, dataViewId, internalStatus, notifications]); + }, [dataViews, dataViewId, internalStatus, notifications, newDataViewPickerEnabled]); return useMemo(() => { - if (!newDataViewPickerEnabled) { - return { dataView: undefined, status: internalStatus }; - } - - return { dataView: retrievedDataView, status: retrievedDataView ? internalStatus : 'loading' }; - }, [newDataViewPickerEnabled, retrievedDataView, internalStatus]); + return { dataView: retrievedDataView, status: localStatus }; + }, [retrievedDataView, localStatus]); }; diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_init_data_view_manager.test.ts b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_init_data_view_manager.test.ts index c9eb2dd9c822a..e1abf4d2065e2 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_init_data_view_manager.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_init_data_view_manager.test.ts @@ -15,6 +15,13 @@ jest.mock('../../common/hooks/use_experimental_features', () => ({ useIsExperimentalFeatureEnabled: () => true, })); +jest.mock('../containers/data_view_provider', () => ({ + useDefaultDataViews: jest.fn().mockReturnValue({ + defaultDataView: { id: '', title: '' }, + alertDataView: { id: '', title: '' }, + }), +})); + jest.mock('react-redux', () => { const dispatch = jest.fn(); diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_init_data_view_manager.ts b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_init_data_view_manager.ts index 8caa8238c8263..e3fa3bb9e8902 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_init_data_view_manager.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/hooks/use_init_data_view_manager.ts @@ -21,6 +21,7 @@ import { type SelectDataViewAsyncPayload } from '../redux/actions'; import { DataViewManagerScopeName } from '../constants'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import { useUserInfo } from '../../detections/components/user_info'; +import { useDefaultDataViews } from '../containers/data_view_provider'; type OriginalListener = Parameters[0]; @@ -35,6 +36,9 @@ const addListener = (listener: Listener) => const removeListener = (listener: Listener) => originalRemoveListener(listener as unknown as OriginalListener); +// TODO: remove this when old sourcerer code is purged +/* eslint-disable react-hooks/rules-of-hooks */ + /** * Should only be used once in the application, on the top level of the rendering tree */ @@ -43,6 +47,10 @@ export const useInitDataViewManager = () => { const services = useKibana().services; const newDataViewPickerEnabled = useIsExperimentalFeatureEnabled('newDataViewPickerEnabled'); + if (!newDataViewPickerEnabled) { + return () => {}; + } + const { loading: loadingSignalIndex, signalIndexName, @@ -73,6 +81,8 @@ export const useInitDataViewManager = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [signalIndexName]); + const defaultDataViews = useDefaultDataViews(); + useEffect(() => { // TODO: (new data view picker) remove this in cleanup phase https://github.com/elastic/security-team/issues/12665 if (!newDataViewPickerEnabled) { @@ -82,10 +92,7 @@ export const useInitDataViewManager = () => { // NOTE: init listener contains logic that preloads default security solution data view const dataViewsLoadingListener = createInitListener({ dataViews: services.dataViews, - http: services.http, - uiSettings: services.uiSettings, - application: services.application, - spaces: services.spaces, + defaultDataViews, }); dispatch(addListener(dataViewsLoadingListener)); @@ -115,15 +122,7 @@ export const useInitDataViewManager = () => { dispatch(removeListener(dataViewSelectedListener)); }); }; - }, [ - dispatch, - newDataViewPickerEnabled, - services.application, - services.dataViews, - services.http, - services.spaces, - services.uiSettings, - ]); + }, [defaultDataViews, dispatch, newDataViewPickerEnabled, services.dataViews]); return useCallback( (initialSelection: SelectDataViewAsyncPayload[]) => { diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/redux/listeners/init_listener.test.ts b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/redux/listeners/init_listener.test.ts index 39ac956e100a9..8f0eedacad5f0 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/redux/listeners/init_listener.test.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/redux/listeners/init_listener.test.ts @@ -8,19 +8,12 @@ import type { AnyAction, Dispatch, ListenerEffectAPI } from '@reduxjs/toolkit'; import { mockDataViewManagerState } from '../mock'; import { createInitListener } from './init_listener'; -import type { DataViewsServicePublic } from '@kbn/data-views-plugin/public'; +import type { DataViewsServicePublic, DataView } from '@kbn/data-views-plugin/public'; import type { RootState } from '../reducer'; import { sharedDataViewManagerSlice } from '../slices'; import { DEFAULT_SECURITY_SOLUTION_DATA_VIEW_ID, DataViewManagerScopeName } from '../../constants'; import { DEFAULT_ALERT_DATA_VIEW_ID } from '../../../../common/constants'; import { selectDataViewAsync } from '../actions'; -import type { CoreStart } from '@kbn/core/public'; -import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; -import { createDefaultDataView } from '../../utils/create_default_data_view'; - -jest.mock('../../utils/create_default_data_view', () => ({ - createDefaultDataView: jest.fn(), -})); const mockDataViewsService = { get: jest.fn(), @@ -32,11 +25,6 @@ const mockDataViewsService = { getAllDataViewLazy: jest.fn().mockReturnValue([]), } as unknown as DataViewsServicePublic; -const http = {} as unknown as CoreStart['http']; -const application = {} as unknown as CoreStart['application']; -const uiSettings = {} as unknown as CoreStart['uiSettings']; -const spaces = {} as unknown as SpacesPluginStart; - const mockDispatch = jest.fn(); const mockGetState = jest.fn(() => { const state = structuredClone(mockDataViewManagerState); @@ -61,24 +49,16 @@ describe('createInitListener', () => { jest.clearAllMocks(); listener = createInitListener({ dataViews: mockDataViewsService, - http, - application, - uiSettings, - spaces, + defaultDataViews: { + defaultDataView: { id: DEFAULT_SECURITY_SOLUTION_DATA_VIEW_ID } as DataView, + alertDataView: { id: DEFAULT_ALERT_DATA_VIEW_ID } as DataView, + }, }); - - jest.mocked(createDefaultDataView).mockResolvedValue({ - defaultDataView: { id: DEFAULT_SECURITY_SOLUTION_DATA_VIEW_ID }, - alertDataView: { id: DEFAULT_ALERT_DATA_VIEW_ID }, - kibanaDataViews: [], - } as unknown as Awaited>); }); it('should load the data views and dispatch further actions', async () => { await listener.effect(sharedDataViewManagerSlice.actions.init([]), mockListenerApi); - expect(jest.mocked(createDefaultDataView)).toHaveBeenCalled(); - expect(jest.mocked(mockDataViewsService.getAllDataViewLazy)).toHaveBeenCalled(); expect(jest.mocked(mockListenerApi.dispatch)).toBeCalledWith( diff --git a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/redux/listeners/init_listener.ts b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/redux/listeners/init_listener.ts index 8b2ebe22e4c4e..cb21a65c08a01 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/redux/listeners/init_listener.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/data_view_manager/redux/listeners/init_listener.ts @@ -7,13 +7,11 @@ import type { AnyAction, Dispatch, ListenerEffectAPI } from '@reduxjs/toolkit'; import type { DataViewsServicePublic } from '@kbn/data-views-plugin/public'; -import type { CoreStart } from '@kbn/core/public'; -import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import type { RootState } from '../reducer'; import { sharedDataViewManagerSlice } from '../slices'; import { DataViewManagerScopeName } from '../../constants'; import { selectDataViewAsync } from '../actions'; -import { createDefaultDataView } from '../../utils/create_default_data_view'; +import type { DefaultDataViewsContextValue } from '../../containers/context'; /** * Creates a Redux listener for initializing the Data View Manager state. @@ -33,11 +31,8 @@ import { createDefaultDataView } from '../../utils/create_default_data_view'; * @returns An object with the actionCreator and effect for Redux listener middleware. */ export const createInitListener = (dependencies: { - http: CoreStart['http']; - application: CoreStart['application']; - uiSettings: CoreStart['uiSettings']; dataViews: DataViewsServicePublic; - spaces: SpacesPluginStart; + defaultDataViews: DefaultDataViewsContextValue; }) => { return { actionCreator: sharedDataViewManagerSlice.actions.init, @@ -46,29 +41,21 @@ export const createInitListener = (dependencies: { listenerApi: ListenerEffectAPI> ) => { try { - // Initialize default security data view first - // Note: this is subject to change, as we might want to add specific data view just for alerts - - const { defaultDataView, alertDataView } = await createDefaultDataView({ - dataViewService: dependencies.dataViews, - uiSettings: dependencies.uiSettings, - spaces: dependencies.spaces, - application: dependencies.application, - http: dependencies.http, - }); - // NOTE: This is later used in the data view manager drop-down selector const dataViews = await dependencies.dataViews.getAllDataViewLazy(); const dataViewSpecs = await Promise.all(dataViews.map((dataView) => dataView.toSpec())); listenerApi.dispatch(sharedDataViewManagerSlice.actions.setDataViews(dataViewSpecs)); + const defaultDataViewId = dependencies.defaultDataViews.defaultDataView.id as string; + const alertDataViewId = dependencies.defaultDataViews.alertDataView.id as string; + // NOTE: save default dataview id for the given space in the store. // this is used to identify the default selection in pickers across Kibana Space listenerApi.dispatch( sharedDataViewManagerSlice.actions.setDataViewId({ - defaultDataViewId: defaultDataView.id, - alertDataViewId: alertDataView.id, + defaultDataViewId, + alertDataViewId, }) ); @@ -88,14 +75,14 @@ export const createInitListener = (dependencies: { if (scope === DataViewManagerScopeName.detections) { listenerApi.dispatch( selectDataViewAsync({ - id: alertDataView.id, + id: alertDataViewId, scope, }) ); } else { listenerApi.dispatch( selectDataViewAsync({ - id: defaultDataView.id, + id: defaultDataViewId, scope, }) ); diff --git a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/use_signal_helpers.tsx b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/use_signal_helpers.tsx index 49c1dc2d1c969..9c4fc2a18579a 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/use_signal_helpers.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/sourcerer/containers/use_signal_helpers.tsx @@ -49,7 +49,7 @@ export const useSignalHelpers = (): { ? experimentalSignalIndexName : signalIndexNameSourcerer; - const { dataView: experimentalDefaultDataView } = useDataView(SourcererScopeName.default); + const { dataView: experimentalDefaultDataView } = useDataView(SourcererScopeName.detections); const dataViewId = newDataViewPickerEnabled ? experimentalDefaultDataView?.id ?? null : oldDataViewId; diff --git a/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.tsx b/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.tsx index a52aa638359e2..800ee9c9280bd 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/timelines/pages/timelines_page.tsx @@ -32,8 +32,7 @@ export const TimelinesPage = React.memo(() => { const { indicesExist: oldIndicesExist } = useSourcererDataView(); const { dataView } = useDataView(DataViewManagerScopeName.default); - // NOTE: there should be a Suspense / some kind of loader here as this value is not settled immediately - const experimentalIndicesExist = !!dataView?.matchedIndices?.length; + const experimentalIndicesExist = !!dataView.matchedIndices?.length; const indicesExist = newDataViewPickerEnabled ? experimentalIndicesExist : oldIndicesExist;