reducers/common.js

/* eslint-disable sonarjs/cognitive-complexity */
import { createSlice } from '@reduxjs/toolkit';
import { parseRoute, getFilterUTCDate } from '../utils/common';
import { aRolesListSuccess, aSetUserList } from './admin';
import { aGetInitSuccess, aLocationChange } from './bonus';
import { aClearFilterData } from './cashier';

/**
 * @namespace reducer/commonReducer
 */
const initialState = {
  selectedMenu: '',
  selectedMenuItem: '',
  destinations: null,
  user: null,
  filterData: null,
  currency: '',
  pagination: null,
  activeModal: '',
  roles: null,
  permissions: null,
  roleCreateCallback: false,
  isLoading: true,
  isFetched: true,
  toggleMenu: false,
  errorMessage: null,
  modalData: null,
  cnt: null,
  profileInfo: null,
  isLastRecord: false,
  loginError: '',
  hasRecord: true,
  clearFilters: false,
  redirect: false,
  heading: '',
  nextNavigationLink: '',
  hasFieldDataModified: false,
  selectedTimezone: '',
  weekDays: [],
  firebaseMessagingToken: null,
  errorMessageFromApi: null,
  betStatus: [],
};

const commonSlice = createSlice({
  name: 'common',
  initialState,
  reducers: {
    aLoginError: (state, action) => {
      state.loginError = action.payload.loginError;
      state.isLoading = false;
    },
    aLogoutSuccess: (state) => {
      state.user = null;
      state.profileInfo = null;
    },
    aSetIsLoading: (state, action) => {
      state.isLoading = action.payload.isLoading;
    },
    aSetSelectedMenu: (state, action) => {
      state.selectedMenu = action.payload.menu || '';
    },
    aSetOpenModal: (state, action) => {
      state.activeModal = action.payload.modal;
      state.modalData = action.payload.modalData ? action.payload.modalData : null;
      state.errorMessage = action.payload.errorMessage;
      state.isLoading = false;
      state.isFetched = true;
      state.errorMessageFromApi = null;
    },
    aLoginSuccess: (state, action) => {
      state.user = action.payload.user;
      state.sessionId = action.payload.sessionId;
      state.errorMessage = null;
      state.loginError = '';
    },
    aSetFilters: (state, action) => {
      const filter = getFilterUTCDate(action.payload);
      // eslint-disable-next-line no-param-reassign
      action.payload.filter = filter;
      state.filterData = filter;
      state.pagination = null;
      state.isLastRecord = false;
      state.hasRecord = true;
    },
    aShowFilteredRound: (state, action) => {
      state.filterData = action.payload.filter;
      state.pagination = null;
      state.redirect = true;
    },
    aSetPaginationData: (state, action) => {
      const pagination = state.pagination;
      pagination.page = action.payload.page;
      state.pagination = pagination;
    },
    aSetIsFetched: (state, action) => {
      state.isFetched = action.payload.isFetched;
    },
    aGetProfileInfoSuccess: (state, action) => {
      state.profileInfo = action.payload.profileInfo;
    },
    aSetLastRecord: (state, action) => {
      state.isLastRecord = action.payload;
    },
    aSetHasRecord: (state, action) => {
      state.hasRecord = action.payload.hasRecord;
    },
    aSetClearFilters: (state, action) => {
      state.clearFilters = action.payload.filterState;
    },
    aSetUserData: (state, action) => {
      state.user = action.payload.user;
    },
    aSetNavigationInfo: (state, action) => {
      state.hasFieldDataModified = action.payload.hasFieldDataModified;
      state.nextNavigationLink = action.payload.nextNavigationLink;
    },
    aClearLoginError: (state) => {
      state.loginError = '';
    },
    aSetSelectedTimezone: (state, action) => {
      state.selectedTimezone = action.payload;
    },
    aSaveToken: (state, action) => {
      state.firebaseMessagingToken = action.payload.token;
    },
    aModalErrorMessageFromApi: (state, action) => {
      state.errorMessageFromApi = action.payload.message;
      state.isLoading = false;
      state.isFetched = true;
    },
    aClearErrorMessageFromApi: (state) => {
      state.errorMessageFromApi = null;
    },
  },
  extraReducers: (builder) => {
    builder.addCase(aSetUserList, (state, action) => {
      state.pagination = action.payload ? action.payload.meta : null;
    });
    builder.addCase(aRolesListSuccess, (state, action) => {
      state.pagination = action.payload ? action.payload.meta : null;
    });
    builder.addCase(aGetInitSuccess, (state, action) => {
      state.user = action.payload.user;
      state.sessionId = action.payload.sessionId;
      state.currency = action.payload.currency;
      state.cnt = action.payload.cnt;
      state.weekDays = action.payload.selects.weekDays;
      state.selectedMenu = action.payload.menu || '';
      state.selectedMenuItem = action.payload.selectedMenuItem || '';
      state.heading = action.payload.heading || '';
      state.filterData = action.payload.filters ? action.payload.filters : null;
      state.isLoading = false;
      state.betStatus = action.payload.selects.betStatus;
    });
    builder.addCase(aLocationChange, (state, action) => {
      const { selectedMenu, selectedMenuItem, heading } = parseRoute(action.payload.pathname);
      const redirect = state.redirect;
      const filterData = state.selectedMenuItem !== selectedMenuItem && !redirect ? null : state.filterData;
      const pagination = state.selectedMenuItem !== selectedMenuItem ? null : state.pagination;
      state.selectedMenu = selectedMenu || '';
      state.selectedMenuItem = selectedMenuItem || '';
      state.pagination = pagination;
      state.filterData = filterData;
      state.heading = heading || '';
      state.isLastRecord = false;
      state.hasRecord = true;
      state.redirect = false;
      state.toggleMenu = !state.toggleMenu;
    });
    builder.addCase(aClearFilterData, (state) => {
      state.filterData = null;
    });
  },
});

export default commonSlice.reducer;

export const {
  aLoginError,
  aLogoutSuccess,
  aSetIsLoading,
  aSetSelectedMenu,
  aSetOpenModal,
  aLoginSuccess,
  aSetFilters,
  aShowFilteredRound,
  aSetPaginationData,
  aSetIsFetched,
  aGetProfileInfoSuccess,
  aSetLastRecord,
  aSetHasRecord,
  aSetClearFilters,
  aSetUserData,
  aSetNavigationInfo,
  aClearLoginError,
  aSetSelectedTimezone,
  aSaveToken,
  aModalErrorMessageFromApi,
  aClearErrorMessageFromApi,
} = commonSlice.actions;