diff --git a/src/components/FunctionalArea/NavBar/NavBar.component.tsx b/src/components/FunctionalArea/NavBar/NavBar.component.tsx index 14af66353e1e7f94c1b79dbf41bf5f4b6dc424bd..6783d04b7a443687caba8e69a88d753c5a865738 100644 --- a/src/components/FunctionalArea/NavBar/NavBar.component.tsx +++ b/src/components/FunctionalArea/NavBar/NavBar.component.tsx @@ -1,9 +1,9 @@ -import Image from 'next/image'; -import { IconButton } from '@/shared/IconButton'; import logoImg from '@/assets/images/logo.png'; import luxembourgLogoImg from '@/assets/images/luxembourg-logo.png'; -import { useAppDispatch } from '@/redux/hooks/useAppDispatch'; import { openDrawer } from '@/redux/drawer/drawer.slice'; +import { useAppDispatch } from '@/redux/hooks/useAppDispatch'; +import { IconButton } from '@/shared/IconButton'; +import Image from 'next/image'; export const NavBar = (): JSX.Element => { const dispatch = useAppDispatch(); diff --git a/src/components/FunctionalArea/TopBar/SearchBar/SearchBar.component.tsx b/src/components/FunctionalArea/TopBar/SearchBar/SearchBar.component.tsx index 77ec065c9809b2e9355bd9a2bdbc1ccc9d944aba..66f5fc8ff7eb8b4982c37b3a4a0aed4213f28dd2 100644 --- a/src/components/FunctionalArea/TopBar/SearchBar/SearchBar.component.tsx +++ b/src/components/FunctionalArea/TopBar/SearchBar/SearchBar.component.tsx @@ -1,6 +1,6 @@ import lensIcon from '@/assets/vectors/icons/lens.svg'; import { isDrawerOpenSelector } from '@/redux/drawer/drawer.selectors'; -import { openDrawer } from '@/redux/drawer/drawer.slice'; +import { clearSearchDrawerState, openDrawer } from '@/redux/drawer/drawer.slice'; import { useAppDispatch } from '@/redux/hooks/useAppDispatch'; import { isPendingSearchStatusSelector, @@ -25,6 +25,7 @@ export const SearchBar = (): JSX.Element => { const openSearchDrawerIfClosed = (): void => { if (!isDrawerOpen) { dispatch(openDrawer('search')); + dispatch(clearSearchDrawerState()); } }; diff --git a/src/components/Map/Drawer/Drawer.component.test.tsx b/src/components/Map/Drawer/Drawer.component.test.tsx index 20c5630bdf1f7b24cb79fdadf1686adbf3c5c7ac..1741384a561e63b950dfe8c63002fe99407033a0 100644 --- a/src/components/Map/Drawer/Drawer.component.test.tsx +++ b/src/components/Map/Drawer/Drawer.component.test.tsx @@ -1,7 +1,7 @@ -import { screen, render, act, fireEvent } from '@testing-library/react'; import { openDrawer } from '@/redux/drawer/drawer.slice'; -import { getReduxWrapperWithStore } from '@/utils/testing/getReduxWrapperWithStore'; import { StoreType } from '@/redux/store'; +import { getReduxWrapperWithStore } from '@/utils/testing/getReduxWrapperWithStore'; +import { act, fireEvent, render, screen } from '@testing-library/react'; import { Drawer } from './Drawer.component'; const renderComponent = (): { store: StoreType } => { diff --git a/src/components/Map/Drawer/Drawer.component.tsx b/src/components/Map/Drawer/Drawer.component.tsx index a08fd813d0a4d58d96ae20d5fce40d7d84212671..52f4a1d53d3d1ebe9bcbc26259494e7b3253bbca 100644 --- a/src/components/Map/Drawer/Drawer.component.tsx +++ b/src/components/Map/Drawer/Drawer.component.tsx @@ -1,8 +1,8 @@ -import dynamic from 'next/dynamic'; -import { twMerge } from 'tailwind-merge'; -import { useAppSelector } from '@/redux/hooks/useAppSelector'; import { DRAWER_ROLE } from '@/components/Map/Drawer/Drawer.constants'; import { drawerSelector } from '@/redux/drawer/drawer.selectors'; +import { useAppSelector } from '@/redux/hooks/useAppSelector'; +import dynamic from 'next/dynamic'; +import { twMerge } from 'tailwind-merge'; const SearchDrawerContent = dynamic( async () => diff --git a/src/components/Map/Drawer/SearchDrawerContent/DrugsAccordion/DrugsAccordion.component.test.tsx b/src/components/Map/Drawer/SearchDrawerContent/DrugsAccordion/DrugsAccordion.component.test.tsx index 5abedd8f8e3d8b423068b621cb4e41a9a71a4f3d..c1d1f6fe7bcb63e15e2d4b2d6f7f0b0c11e987b4 100644 --- a/src/components/Map/Drawer/SearchDrawerContent/DrugsAccordion/DrugsAccordion.component.test.tsx +++ b/src/components/Map/Drawer/SearchDrawerContent/DrugsAccordion/DrugsAccordion.component.test.tsx @@ -1,11 +1,11 @@ -import { render, screen } from '@testing-library/react'; +import { drugsFixture } from '@/models/fixtures/drugFixtures'; import { StoreType } from '@/redux/store'; +import { Accordion } from '@/shared/Accordion'; import { InitialStoreState, getReduxWrapperWithStore, } from '@/utils/testing/getReduxWrapperWithStore'; -import { drugsFixture } from '@/models/fixtures/drugFixtures'; -import { Accordion } from '@/shared/Accordion'; +import { render, screen } from '@testing-library/react'; import { DrugsAccordion } from './DrugsAccordion.component'; const renderComponent = (initialStoreState: InitialStoreState = {}): { store: StoreType } => { diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.component.test.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.component.test.tsx new file mode 100644 index 0000000000000000000000000000000000000000..19c588d71caddd0b92fbadf301ff589931ef559c --- /dev/null +++ b/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.component.test.tsx @@ -0,0 +1,116 @@ +import { SearchDrawerWrapper } from '@/components/Map/Drawer/SearchDrawerWrapper'; +import { StoreType } from '@/redux/store'; +import { + InitialStoreState, + getReduxWrapperWithStore, +} from '@/utils/testing/getReduxWrapperWithStore'; +import { render, screen } from '@testing-library/react'; + +const renderComponent = (initialStoreState: InitialStoreState = {}): { store: StoreType } => { + const { Wrapper, store } = getReduxWrapperWithStore(initialStoreState); + + return ( + render( + <Wrapper> + <SearchDrawerWrapper /> + </Wrapper>, + ), + { + store, + } + ); +}; + +describe('SearchDrawerWrapper - component', () => { + it('should display the first step for search', () => { + renderComponent({ + drawer: { + isOpen: true, + drawerName: 'search', + searchDrawerState: { + currentStep: 1, + selectedValue: { + name: '', + valueType: 'none', + }, + }, + }, + }); + + expect(screen.getByTestId('search-first-step')).toBeInTheDocument(); + }); + + it('should display the second step for value type bioEntity', () => { + renderComponent({ + drawer: { + isOpen: true, + drawerName: 'search', + searchDrawerState: { + currentStep: 2, + selectedValue: { + model: { name: 'test model bioEntity', id: 'test-id' }, + name: 'bio entity second step', + valueType: 'bioEntity', + }, + }, + }, + }); + + expect(screen.getByTestId('search-second-step')).toBeInTheDocument(); + }); + + it('should display the second step for value type chemicals', () => { + renderComponent({ + drawer: { + isOpen: true, + drawerName: 'search', + searchDrawerState: { + currentStep: 2, + selectedValue: { + name: 'chemicals second step', + valueType: 'chemicals', + }, + }, + }, + }); + + expect(screen.getByTestId('search-second-step')).toBeInTheDocument(); + }); + + it('should display the third step for value type bioEntity', () => { + renderComponent({ + drawer: { + isOpen: true, + drawerName: 'search', + searchDrawerState: { + currentStep: 3, + selectedValue: { + model: { name: 'test model bioEntity', id: 'test-id' }, + name: 'bio entity third step', + valueType: 'bioEntity', + }, + }, + }, + }); + + expect(screen.getByTestId('search-third-step')).toBeInTheDocument(); + }); + + it('should display the third step for value type chemicals', () => { + renderComponent({ + drawer: { + isOpen: true, + drawerName: 'search', + searchDrawerState: { + currentStep: 3, + selectedValue: { + name: 'chemicals third step', + valueType: 'chemicals', + }, + }, + }, + }); + + expect(screen.getByTestId('search-third-step')).toBeInTheDocument(); + }); +}); diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.component.tsx b/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9ce500cf316b75bbc4616efe6afe1246d58b87e6 --- /dev/null +++ b/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.component.tsx @@ -0,0 +1,38 @@ +import { STEP } from '@/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.constants'; +import { BIO_ENTITY, DRUGS_CHEMICALS_MIRNA } from '@/constants'; +import { + currentStepDrawerStateSelector, + valueTypeDrawerSelector, +} from '@/redux/drawer/drawer.selectors'; +import { useSelector } from 'react-redux'; + +export const SearchDrawerWrapper = (): JSX.Element => { + const currentStep = useSelector(currentStepDrawerStateSelector); + const valueType = useSelector(valueTypeDrawerSelector); + + const isBioEntityType = valueType === BIO_ENTITY; + const isChemicalsDrugsOrMirnaType = DRUGS_CHEMICALS_MIRNA.includes(valueType); + + return ( + <div> + {/* first step for displaying search results, drawers etc */} + {currentStep === STEP.FIRST && <div data-testid="search-first-step">The first step</div>} + {/* 2nd step for bioEntities aka content */} + {currentStep === STEP.SECOND && isBioEntityType && ( + <div data-testid="search-second-step">The second step</div> + )} + {/* 2nd step for drugs,chemicals,mirna */} + {currentStep === STEP.SECOND && isChemicalsDrugsOrMirnaType && ( + <div data-testid="search-second-step">The second step</div> + )} + {/* last step for bioentity */} + {currentStep === STEP.THIRD && isBioEntityType && ( + <div data-testid="search-third-step">The third step</div> + )} + {/* last step for drugs,chemicals,mirna */} + {currentStep === STEP.THIRD && isChemicalsDrugsOrMirnaType && ( + <div data-testid="search-third-step">The third step</div> + )} + </div> + ); +}; diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.constants.ts b/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc1b7da72a652c9b0b755f71034b61cd477c6ccd --- /dev/null +++ b/src/components/Map/Drawer/SearchDrawerWrapper/SearchDrawerWrapper.constants.ts @@ -0,0 +1,5 @@ +export const STEP = { + FIRST: 1, + SECOND: 2, + THIRD: 3, +}; diff --git a/src/components/Map/Drawer/SearchDrawerWrapper/index.ts b/src/components/Map/Drawer/SearchDrawerWrapper/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ee8e9189191c28b0933c04d1af693c2c22cd86a9 --- /dev/null +++ b/src/components/Map/Drawer/SearchDrawerWrapper/index.ts @@ -0,0 +1 @@ +export { SearchDrawerWrapper } from './SearchDrawerWrapper.component'; diff --git a/src/constants/index.ts b/src/constants/index.ts index 43423ae1b1478dfd342c37c5488a44cc09703006..16e892f07522e3d15e68ac4d0e802f290a406b8c 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,3 +1,5 @@ export const BASE_API_URL = process.env.NEXT_PUBLIC_BASE_API_URL || ''; export const PROJECT_ID = process.env.NEXT_PUBLIC_PROJECT_ID || ''; export const ZOD_SEED = 997; +export const BIO_ENTITY = 'bioEntity'; +export const DRUGS_CHEMICALS_MIRNA = ['drugs', 'chemicals', 'mirna']; diff --git a/src/redux/drawer/drawer.reducers.test.ts b/src/redux/drawer/drawer.reducers.test.ts index c9aa33dbd506bcedb60cb6ab56180057ac44c92e..d7bf3cedfe4bccb7fb41301f747220119f204573 100644 --- a/src/redux/drawer/drawer.reducers.test.ts +++ b/src/redux/drawer/drawer.reducers.test.ts @@ -1,12 +1,24 @@ -import { AnyAction } from '@reduxjs/toolkit'; import * as toolkitRaw from '@reduxjs/toolkit'; +import { AnyAction } from '@reduxjs/toolkit'; import type { ToolkitStore } from '@reduxjs/toolkit/dist/configureStore'; -import drawerReducer, { openDrawer, closeDrawer } from './drawer.slice'; +import drawerReducer, { + clearSearchDrawerState, + closeDrawer, + openDrawer, + setSearchDrawerState, +} from './drawer.slice'; import type { DrawerState } from './drawer.types'; const INITIAL_STATE: DrawerState = { isOpen: false, drawerName: 'none', + searchDrawerState: { + currentStep: 0, + selectedValue: { + name: '', + valueType: 'none', + }, + }, }; type SliceReducerType = ToolkitStore< @@ -54,7 +66,51 @@ describe('drawer reducer', () => { expect(drawerName).toEqual('none'); }); - it.skip('should update the store when you type in the search', async () => { - // TODO + it('should update the store when you choose from the drawer chemical`s first step', async () => { + const searchDrawerData: DrawerState['searchDrawerState'] = { + currentStep: 1, + selectedValue: { + name: 'chemicals frist step', + valueType: 'chemicals', + }, + }; + + const { type } = await store.dispatch(setSearchDrawerState(searchDrawerData)); + const { searchDrawerState } = store.getState().drawer; + const { currentStep, selectedValue } = searchDrawerState; + + const currentStepToBE = 1; + + expect(type).toBe('drawer/setSearchDrawerState'); + expect(currentStep).toBe(currentStepToBE); + expect(selectedValue).toEqual({ + name: 'chemicals frist step', + valueType: 'chemicals', + }); + }); + + it('should update the store when you clear the search drawer state', async () => { + const searchDrawerData: DrawerState['searchDrawerState'] = { + currentStep: 1, + selectedValue: { + name: 'chemicals frist step', + valueType: 'chemicals', + }, + }; + + await store.dispatch(setSearchDrawerState(searchDrawerData)); + const { type } = await store.dispatch(clearSearchDrawerState()); + + const { searchDrawerState } = store.getState().drawer; + const { currentStep, selectedValue } = searchDrawerState; + + const currentStepToBE = 0; + + expect(type).toBe('drawer/clearSearchDrawerState'); + expect(currentStep).toBe(currentStepToBE); + expect(selectedValue).toEqual({ + name: '', + valueType: 'none', + }); }); }); diff --git a/src/redux/drawer/drawer.reducers.ts b/src/redux/drawer/drawer.reducers.ts index ade3a5c12c7508f42f126f0e9d604031b6487d61..e205e9a44d2a73955b70020f07b827ac86333096 100644 --- a/src/redux/drawer/drawer.reducers.ts +++ b/src/redux/drawer/drawer.reducers.ts @@ -1,8 +1,8 @@ -import { PayloadAction } from '@reduxjs/toolkit'; -import { DrawerState } from '@/redux/drawer/drawer.types'; -import { PathName } from '@/types/pathName'; +import type { DrawerState } from '@/redux/drawer/drawer.types'; +import type { DrawerName } from '@/types/drawerName'; +import type { PayloadAction } from '@reduxjs/toolkit'; -export const openDrawerReducer = (state: DrawerState, action: PayloadAction<PathName>): void => { +export const openDrawerReducer = (state: DrawerState, action: PayloadAction<DrawerName>): void => { state.isOpen = true; state.drawerName = action.payload; }; @@ -10,3 +10,21 @@ export const openDrawerReducer = (state: DrawerState, action: PayloadAction<Path export const closeDrawerReducer = (state: DrawerState): void => { state.isOpen = false; }; + +export const setSearchDrawerStateReducer = ( + state: DrawerState, + action: PayloadAction<DrawerState['searchDrawerState']>, +): void => { + const { currentStep, selectedValue } = action.payload; + + state.searchDrawerState.currentStep = currentStep; + state.searchDrawerState.selectedValue = selectedValue; +}; + +export const clearSearchDrawerStateReducer = (state: DrawerState): void => { + state.searchDrawerState.currentStep = 0; + state.searchDrawerState.selectedValue = { + name: '', + valueType: 'none', + }; +}; diff --git a/src/redux/drawer/drawer.selectors.ts b/src/redux/drawer/drawer.selectors.ts index 0ae254bd997a14d0d3f09301f7eae2cffaff7ecc..a622a1f6146c2ffbf97b32803f618661b1b2fc9b 100644 --- a/src/redux/drawer/drawer.selectors.ts +++ b/src/redux/drawer/drawer.selectors.ts @@ -1,5 +1,26 @@ -import { createSelector } from '@reduxjs/toolkit'; import { rootSelector } from '@/redux/root/root.selectors'; +import { createSelector } from '@reduxjs/toolkit'; export const drawerSelector = createSelector(rootSelector, state => state.drawer); + export const isDrawerOpenSelector = createSelector(drawerSelector, state => state.isOpen); + +export const searchDrawerStateSelector = createSelector( + drawerSelector, + state => state.searchDrawerState, +); + +export const currentStepDrawerStateSelector = createSelector( + searchDrawerStateSelector, + state => state.currentStep, +); + +export const selectedValueDrawerSelector = createSelector( + searchDrawerStateSelector, + state => state.selectedValue, +); + +export const valueTypeDrawerSelector = createSelector( + selectedValueDrawerSelector, + state => state.valueType, +); diff --git a/src/redux/drawer/drawer.slice.ts b/src/redux/drawer/drawer.slice.ts index aa1f2e55a4265c92337f33f449e2a10be9b7df69..cbbe5a331f263507dd35c55d639846b9dd208714 100644 --- a/src/redux/drawer/drawer.slice.ts +++ b/src/redux/drawer/drawer.slice.ts @@ -1,10 +1,22 @@ -import { createSlice } from '@reduxjs/toolkit'; import { DrawerState } from '@/redux/drawer/drawer.types'; -import { openDrawerReducer, closeDrawerReducer } from './drawer.reducers'; +import { createSlice } from '@reduxjs/toolkit'; +import { + clearSearchDrawerStateReducer, + closeDrawerReducer, + openDrawerReducer, + setSearchDrawerStateReducer, +} from './drawer.reducers'; const initialState: DrawerState = { isOpen: false, drawerName: 'none', + searchDrawerState: { + currentStep: 0, + selectedValue: { + name: '', + valueType: 'none', + }, + }, }; const drawerSlice = createSlice({ @@ -13,9 +25,12 @@ const drawerSlice = createSlice({ reducers: { openDrawer: openDrawerReducer, closeDrawer: closeDrawerReducer, + setSearchDrawerState: setSearchDrawerStateReducer, + clearSearchDrawerState: clearSearchDrawerStateReducer, }, }); -export const { openDrawer, closeDrawer } = drawerSlice.actions; +export const { openDrawer, closeDrawer, setSearchDrawerState, clearSearchDrawerState } = + drawerSlice.actions; export default drawerSlice.reducer; diff --git a/src/redux/drawer/drawer.types.ts b/src/redux/drawer/drawer.types.ts index 8b4bf47a33fd92a276a2fc45e96863db6c33cdf8..404d0fc2c1c6163b21fc69e6269b2ee14d49a503 100644 --- a/src/redux/drawer/drawer.types.ts +++ b/src/redux/drawer/drawer.types.ts @@ -1,4 +1,40 @@ +import type { DrawerName } from '@/types/drawerName'; + +type DrugValue = { + name: string; + valueType: 'drugs'; +}; + +type ChemicalsValue = { + name: string; + valueType: 'chemicals'; +}; + +type MirnaValue = { + name: string; + valueType: 'mirna'; +}; + +type BioEntityValue = { + model: { name: string; id: string }; + name: string; + valueType: 'bioEntity'; +}; + +type NoneValue = { + name: string; + valueType: 'none'; +}; + +export type SelectedValue = DrugValue | ChemicalsValue | MirnaValue | BioEntityValue | NoneValue; + +export type SearchDrawerState = { + currentStep: number; + selectedValue: SelectedValue; +}; + export type DrawerState = { isOpen: boolean; - drawerName: 'none' | 'search' | 'project-info' | 'plugins' | 'export' | 'legend'; + drawerName: DrawerName; + searchDrawerState: SearchDrawerState; }; diff --git a/src/redux/store.ts b/src/redux/store.ts index 841a79b8b04c985c5b5463daf07f18bbbdd9f75f..f3e2dc5e533fd38aa7f46cb1e86d3c4430d38572 100644 --- a/src/redux/store.ts +++ b/src/redux/store.ts @@ -1,9 +1,9 @@ import bioEntityContentsReducer from '@/redux/bioEntityContents/bioEntityContents.slice'; import chemicalsReducer from '@/redux/chemicals/chemicals.slice'; import drawerReducer from '@/redux/drawer/drawer.slice'; -import modelsReducer from '@/redux/models/models.slice'; import drugsReducer from '@/redux/drugs/drugs.slice'; import mirnasReducer from '@/redux/mirnas/mirnas.slice'; +import modelsReducer from '@/redux/models/models.slice'; import projectSlice from '@/redux/project/project.slice'; import searchReducer from '@/redux/search/search.slice'; import { configureStore } from '@reduxjs/toolkit'; diff --git a/src/shared/DrawerHeadingBackwardButton/DrawerHeadingBackwardButton.component.test.tsx b/src/shared/DrawerHeadingBackwardButton/DrawerHeadingBackwardButton.component.test.tsx index 23e0ad5df6720a97c3f597c8832d95c0cc3b0be6..e35e20491cc5d1f1b2e16ed4bd12b0866ad41df0 100644 --- a/src/shared/DrawerHeadingBackwardButton/DrawerHeadingBackwardButton.component.test.tsx +++ b/src/shared/DrawerHeadingBackwardButton/DrawerHeadingBackwardButton.component.test.tsx @@ -56,7 +56,11 @@ describe('DrawerHeadingBackwardButton - component', () => { it('should call class drawer on close button click', () => { const { store } = renderComponent('Title', 'value', { - drawer: { isOpen: true, drawerName: 'search' }, + drawer: { + isOpen: true, + drawerName: 'search', + searchDrawerState: { currentStep: 0, selectedValue: { name: '', valueType: 'none' } }, + }, }); expect(store.getState().drawer.isOpen).toBe(true); diff --git a/src/types/drawerName.ts b/src/types/drawerName.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ee1478dcee864ab2339be99906cb6f583d84cf1 --- /dev/null +++ b/src/types/drawerName.ts @@ -0,0 +1 @@ +export type DrawerName = 'none' | 'search' | 'project-info' | 'plugins' | 'export' | 'legend'; diff --git a/src/types/pathName.ts b/src/types/pathName.ts deleted file mode 100644 index 2b61453e4b4469bf51cc26f440f5b49985c302b6..0000000000000000000000000000000000000000 --- a/src/types/pathName.ts +++ /dev/null @@ -1 +0,0 @@ -export type PathName = 'none' | 'search' | 'project-info' | 'plugins' | 'export' | 'legend'; diff --git a/src/utils/testing/getReduxWrapperWithStore.tsx b/src/utils/testing/getReduxWrapperWithStore.tsx index cf6097bd149b5b91d80092f10941d89ca88471e5..b698584c6db44d64dd07f29a3447cfcd8ead2de3 100644 --- a/src/utils/testing/getReduxWrapperWithStore.tsx +++ b/src/utils/testing/getReduxWrapperWithStore.tsx @@ -1,14 +1,14 @@ -import { RootState, StoreType } from '@/redux/store'; -import { configureStore } from '@reduxjs/toolkit'; -import { Provider } from 'react-redux'; import bioEntityContentsReducer from '@/redux/bioEntityContents/bioEntityContents.slice'; import chemicalsReducer from '@/redux/chemicals/chemicals.slice'; import drawerReducer from '@/redux/drawer/drawer.slice'; import drugsReducer from '@/redux/drugs/drugs.slice'; import mirnasReducer from '@/redux/mirnas/mirnas.slice'; +import modelsReducer from '@/redux/models/models.slice'; import projectReducer from '@/redux/project/project.slice'; import searchReducer from '@/redux/search/search.slice'; -import modelsReducer from '@/redux/models/models.slice'; +import { RootState, StoreType } from '@/redux/store'; +import { configureStore } from '@reduxjs/toolkit'; +import { Provider } from 'react-redux'; interface WrapperProps { children: React.ReactNode;