Skip to content
Snippets Groups Projects
init.thunks.ts 2.35 KiB
Newer Older
import { openSearchDrawerWithSelectedTab } from '@/redux/drawer/drawer.slice';
import { createAsyncThunk } from '@reduxjs/toolkit';
import { PROJECT_ID } from '@/constants';
import { AppDispatch } from '@/redux/store';
import { QueryData } from '@/types/query';
import { getDefaultSearchTab } from '@/components/FunctionalArea/TopBar/SearchBar/SearchBar.utils';
import { getAllBackgroundsByProjectId } from '../backgrounds/backgrounds.thunks';
import { getAllPublicOverlaysByProjectId } from '../overlays/overlays.thunks';
import { getModels } from '../models/models.thunks';
import { getProjectById } from '../project/project.thunks';
import {
  initMapBackground,
  initMapPosition,
  initMapSizeAndModelId,
  initOpenedMaps,
} from '../map/map.thunks';
import { getSearchData } from '../search/search.thunks';
import { setPerfectMatch } from '../search/search.slice';
import { getSessionValid } from '../user/user.thunks';
import { getConfigurationOptions } from '../configuration/configuration.thunks';

interface InitializeAppParams {
  queryData: QueryData;
}

export const fetchInitialAppData = createAsyncThunk<
  void,
  InitializeAppParams,
  { dispatch: AppDispatch }
>('appInit/fetchInitialAppData', async ({ queryData }, { dispatch }): Promise<void> => {
  /** Fetch all data required for renderin map */
  await Promise.all([
    dispatch(getConfigurationOptions()),
    dispatch(getProjectById(PROJECT_ID)),
    dispatch(getAllBackgroundsByProjectId(PROJECT_ID)),
    dispatch(getAllPublicOverlaysByProjectId(PROJECT_ID)),
    dispatch(getModels()),
  ]);
  /**  Set map properties to allow rendering. If map params (modelId,backgroundId,position) are not provided in query -> it will be set to map default */
  await Promise.all([
    dispatch(initMapSizeAndModelId({ queryData })),
    dispatch(initMapPosition({ queryData })),
    dispatch(initMapBackground({ queryData })),
  ]);
  /** Create tabs for maps / submaps */
  dispatch(initOpenedMaps({ queryData }));
  // Check if auth token is valid
  dispatch(getSessionValid());

  /** Trigger search */
  if (queryData.searchValue) {
    dispatch(setPerfectMatch(queryData.perfectMatch));
    dispatch(
      getSearchData({
        searchQueries: queryData.searchValue,
        isPerfectMatch: queryData.perfectMatch,
      }),
    );
    dispatch(openSearchDrawerWithSelectedTab(getDefaultSearchTab(queryData.searchValue)));