Skip to content
Snippets Groups Projects
drawer.selectors.ts 2.79 KiB
Newer Older
import { rootSelector } from '@/redux/root/root.selectors';
import { assertNever } from '@/utils/assertNever';
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 stepTypeDrawerSelector = createSelector(
  searchDrawerStateSelector,
  state => state.stepType,
export const currentSelectedSearchElement = createSelector(
  searchDrawerStateSelector,
  state => state.selectedSearchElement,
);

export const currentStepTypeSelector = createSelector(
  searchDrawerStateSelector,
  state => state.stepType,
);

export const resultListSelector = createSelector(
  rootSelector,
  currentStepTypeSelector,
  currentSelectedSearchElement,
  (state, selectedType, currentSearchElement) => {
    const { drugs, chemicals, mirnas } = state;

    switch (selectedType) {
      case 'drugs': {
        const currentDrugs = drugs.data.find(
          ({ searchQueryElement }) => searchQueryElement === currentSearchElement,
        );

        return (currentDrugs?.data || []).map(drug => ({
          id: drug.id,
          name: drug.name,
          data: drug,
        }));
      }
      case 'chemicals': {
        const currentChemical = chemicals.data.find(
          ({ searchQueryElement }) => searchQueryElement === currentSearchElement,
        );
        return (currentChemical?.data || []).map(chemical => ({
          id: chemical.id.id,
          name: chemical.name,
          data: chemical,
        }));
      }
      case 'bioEntity':
        return undefined;
      case 'mirna': {
        const currentMirna = mirnas.data.find(
          ({ searchQueryElement }) => searchQueryElement === currentSearchElement,
        );

        return (currentMirna?.data || []).map(mirna => ({
          id: mirna.id,
          name: mirna.name,
          data: mirna,
        }));
      }
      case 'none':
        return undefined;
      default:
        return assertNever(selectedType);
    }
  },
);

export const bioEnititiesResultListSelector = createSelector(rootSelector, state => {
  return state.drawer.searchDrawerState.listOfBioEnitites;

export const reactionDrawerStateSelector = createSelector(
  drawerSelector,
  state => state.reactionDrawerState,
);

export const currentDrawerReactionIdSelector = createSelector(
  reactionDrawerStateSelector,
  state => state?.reactionId,
);