{"version":3,"file":"460.6dcd3153c314bcfc16cf.js","mappings":"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","sources":["webpack://data-library-mf-app/./src/pages/Screener/Screener.tsx","webpack://data-library-mf-app/./src/assets/icons/close-dark.svg","webpack://data-library-mf-app/./src/assets/icons/filter.svg","webpack://data-library-mf-app/./src/pages/Auth/Login.tsx","webpack://data-library-mf-app/./src/components/common/OtpCounter/OtpCounter.tsx","webpack://data-library-mf-app/./src/pages/Auth/OTP.tsx","webpack://data-library-mf-app/./src/AppRoutes.tsx","webpack://data-library-mf-app/./src/pages/NotFound/NotFound.tsx","webpack://data-library-mf-app/./src/shared/customHooks/useAuth.ts","webpack://data-library-mf-app/./src/shared/context/AuthProvider.tsx","webpack://data-library-mf-app/./src/components/common/ProtectedRoute/ProtectedRoute.tsx","webpack://data-library-mf-app/./src/shared/customHooks/useAxiosAuth.ts","webpack://data-library-mf-app/./src/shared/constant/themeConfig.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, {\n  useContext,\n  useState,\n  useEffect,\n  useCallback,\n  useRef,\n  BaseSyntheticEvent,\n  useLayoutEffect,\n  memo,\n} from 'react';\nimport { Tooltip } from 'react-tooltip';\nimport { ThemeContext } from '@newwealth/component-library';\nimport classNames from 'classnames';\nimport ReactLoading from 'react-loading';\nimport { useIntl } from 'react-intl';\n// import { setRestClientToken } from 'shared/services/rest.svc';\nimport { useNavigate, useLocation, useSearchParams } from 'react-router-dom';\nimport { useContextSelector, useContext as useContextFl } from 'use-context-selector';\nimport { FlContext } from 'shared/context';\nimport { IScreenerConfigProps, ISharedProps } from 'shared/interfaces';\nimport { LayoutScreener } from 'layouts';\nimport { searchWithFacetsMulti } from 'shared/utils/typesense.util';\nimport { useWindowSize, useQuery } from 'shared/customHooks';\nimport {\n  getIsTypesenseConfigRendered,\n  getTypesenseConfig,\n  getSelectedScreener,\n  getCurrentScreenerType,\n  getCurrentScreenerTab,\n  getSavedSearches,\n  getUserPreferences,\n  getCurrentSavedSearch,\n  getDividendPayingFund,\n  getSearchKeyword,\n  getAuthToken,\n  getIsAuthTokenValid,\n  getTemporaryUID,\n  getIsComingFromOtherPage,\n  getTempSelectedParams,\n  getDictionary,\n  getManualPagination,\n} from 'shared/context/selectors';\nimport {\n  initializeConfig,\n  saveSearchKeyword,\n  getFilterList,\n  savePageNo,\n  saveFilter,\n  clearFilter,\n  saveCurrentDisplayTemplate,\n  saveToggleSort,\n  saveSelectedFund,\n  clearSelectedFunds,\n  initLanguage,\n  // generateAuthToken,\n  // validateAuthToken,\n  getTypesenseConfigFromAPI,\n  // validateTokenAccess,\n  // storeIsTokenValid,\n  onBulkSearchUpload,\n  // onSaveSearch,\n  // onGetSavedSearch,\n  onApplySavedSearch,\n  onRemoveSavedSearch,\n  onClearParamsQ,\n  storeTempUid,\n  onSingleFilterFn,\n  onSwitchDividendPayingFund,\n  onSearchFilterContent,\n  onClearFilterSearch,\n  // onGetUserPreferences,\n  saveIsComingFromOtherPage,\n  onSaveMultiParams,\n  // onSaveFilterCount,\n  // onSaveFilterList,\n  // saveIsAuthTokenValid,\n  onSwitchManualPagination,\n} from 'shared/context/actions';\nimport { get, isEmpty, orderBy } from 'lodash';\nimport { formatNumberWithComma } from 'shared/utils/format.util';\nimport {\n  convertArrOfObjIntoArrOfArr,\n  getRiskLevelByCode,\n  getRiskLevelDescByCode,\n} from 'shared/utils/helper.util';\n// import { screenerConfig as config } from 'shared/constant/config';\nimport { Button, Typography, Chip } from '@newwealth/component-library';\n\nimport {\n  FilterList,\n  FilterListSubLevel,\n  // ViewSwitcher,\n  DisplayTemplateButton,\n  DataTable,\n  DataTableMP,\n  CardView,\n  CardViewMP,\n  MobileView,\n  ScreenerAction,\n  // SaveSearch,\n  SavedSearchButton,\n  NoResult,\n  SingleFilterButton,\n  ViewOption,\n} from 'components/screeners';\nimport {\n  SearchInput,\n  Accordion,\n  DragDropFile,\n  MyPopover,\n  Disclaimer,\n  Switcher,\n  ErrorBoundary,\n} from 'components/common';\nimport { toast, ToastContainer } from 'react-toastify';\nimport { useUniqueID } from 'shared/utils/useUniqueID';\n\nimport CloseIcon from 'assets/icons/close-dark.svg';\nimport Filter from 'assets/icons/filter.svg';\nimport RebateIcon from 'assets/icons/rebate_eligible.svg';\nimport ReadyToTradeIcon from 'assets/icons/ready_to_trade.svg';\n// import './Screener.scss';\nimport 'react-toastify/dist/ReactToastify.css';\nimport { icons } from 'shared/constant';\n// import { themeConfig } from 'shared/constant/themeConfig';\n\nexport type IScreenerProps = {\n  // endpoint?: string;\n  // headerOptions?: AxiosRequestConfig<never> | undefined;\n  // withCompare?: boolean;\n  // withDetail?: boolean;\n  screenerConfig?: Array<IScreenerConfigProps>;\n  userId: string;\n  // compareMax?: number;\n};\n\nfunction Screener({\n  screenerConfig,\n  userId,\n  appInitConfig,\n  ...props\n}: IScreenerProps & ISharedProps) {\n  const themeConfig = useContext(ThemeContext);\n  const [searchParams] = useSearchParams();\n  const pageQuery = parseInt(searchParams.get('page') || '1', 10);\n\n  const intl = useIntl();\n  const parentRef = useRef(null);\n  const filterShowRef = useRef(null);\n  const filterHideRef = useRef(null);\n  const filterMobileShowRef = useRef(null);\n  const generateUID = useUniqueID();\n  const navigate = useNavigate();\n  const location = useLocation();\n  const windowSize = useWindowSize();\n  const searchQuery = useQuery();\n  const accessToken = searchQuery.get('token');\n  const [wrapperSize, setWrapperSize] = useState('');\n  const [showFilter, setShowFilter] = useState(true);\n  const [viewType, setViewType] = useState<string>('listView');\n  const [currentSort, setCurrentSort] = useState('');\n  const [hits, setHits]: any[] = useState([]);\n  const [totalFound, setTotalFound] = useState(0);\n  const [isLastPage, setIsLastPage] = useState(false);\n  const [isInitDone, setIsInitDone] = useState(false);\n  const [isSyncDone, setIsSyncDone] = useState(false); // @Todo check if we can remove this\n\n  const [bulkSearchResult, setBulkSearchResult] = useState(null);\n  const [bulkSearchKeywords, setBulkSearchKeywords] = useState('');\n  const [isBulkSearchProcesing, setIsBulkSearchProcesing] = useState(false);\n\n  const { state, dispatch } = useContextFl(FlContext);\n  const search_keyword = useContextSelector(FlContext, (state: any) => getSearchKeyword(state));\n  const selectedFunds: string[] | any = get(state.screenerReducer, 'selectedFunds', []);\n  const filterOptions = get(state?.screenerReducer?.distribution, 'filter_list', []);\n  const iconSize = windowSize.width < 667 ? 20 : 16;\n  const isMobile = windowSize.width <= 600;\n  const isTablet = windowSize.width > 600 && windowSize.width <= 768;\n  const currentScreenerType = useContextSelector(FlContext, (state: any) =>\n    getCurrentScreenerType(state)\n  );\n  const currentScreenerParams = useContextSelector(FlContext, (state: any) =>\n    getSelectedScreener(state)\n  );\n  const currentTemplateTab = useContextSelector(FlContext, (state: any) =>\n    getCurrentScreenerTab(state)\n  );\n  const typesenseDictionary = useContextSelector(FlContext, (state: any) => getDictionary(state));\n  const userPreferences = useContextSelector(FlContext, (state: any) => getUserPreferences(state));\n  const savedSearches = useContextSelector(FlContext, (state: any) => getSavedSearches(state));\n  const currentSavedSearch = useContextSelector(FlContext, (state: any) =>\n    getCurrentSavedSearch(state)\n  );\n  const dividendPayingFund = useContextSelector(FlContext, (state: any) =>\n    getDividendPayingFund(state)\n  );\n\n  // const isAccessTokenValid = get(state.commonReducer, 'isAuthenticated', false);\n  const tempUID = useContextSelector(FlContext, (state: any) => getTemporaryUID(state));\n  const generatedAuthToken = useContextSelector(FlContext, (state: any) => getAuthToken(state));\n  const isTypesenseConfigReady = useContextSelector(FlContext, (state: any) =>\n    getIsTypesenseConfigRendered(state)\n  );\n  const typesenseConfig = useContextSelector(FlContext, (state: any) => getTypesenseConfig(state));\n  const isAuthTokenValid = useContextSelector(FlContext, (state: any) =>\n    getIsAuthTokenValid(state)\n  );\n  const isComingFromOtherPage = useContextSelector(FlContext, (state: any) =>\n    getIsComingFromOtherPage(state)\n  );\n  const tempSelectedParams = useContextSelector(FlContext, (state: any) =>\n    getTempSelectedParams(state)\n  );\n  const isWithBulkSearch = get(props, 'withBulkSearch', false);\n  const isWithSingleFilterButton = get(props, 'withSingleFilterButton', false);\n  const isManualPagination = useContextSelector(FlContext, (state: any) =>\n    getManualPagination(state)\n  );\n\n  const config = Array.from(screenerConfig).find(\n    (item: any) => item.screenerType.id === currentScreenerType\n  );\n  const withDividendPayingFilter = get(config, 'withDividendPayingFilter', false);\n\n  const screenerClasses = classNames({\n    'hsbc-screener': true,\n    'hsbc-screener--withSpacing': props?.includeRouterRoot,\n    'hsbc-screener--leftSidebar': props?.sidebarPosition === 'left',\n    'hsbc-screener--rightSidebar': props?.sidebarPosition === 'right',\n  });\n\n  useEffect(() => {\n    document.title = 'Overview | ILP Fund Center';\n  }, []);\n\n  // Store temporary userid for demo app\n  useEffect(() => {\n    const isForDemo = props.includeRouterRoot;\n    if (isForDemo && tempUID === undefined) {\n      storeTempUid(generateUID)(dispatch);\n    }\n  }, [props.includeRouterRoot, tempUID, generateUID]);\n\n  // Check window size to manage sidebar filter\n  useLayoutEffect(() => {\n    if (windowSize.width < 667) {\n      setShowFilter(false);\n    }\n  }, [windowSize.width]);\n\n  // Manage token for demo purposes\n  // useEffect(() => {\n  //   if (accessToken) {\n  //     validateTokenAccess(accessToken)(dispatch);\n  //   } else {\n  //     storeIsTokenValid(props?.isAuthenticated)(dispatch);\n  //   }\n  // }, [props?.isAuthenticated]);\n\n  // manage access of the personal data\n  // useEffect(() => {\n  //   const isForDemo = !!props.includeRouterRoot;\n  //   if (props?.isAuthenticated && userId) {\n  //     if (isEmpty(generatedAuthToken)) {\n  //       // generate token based on userId\n  //       generateAuthToken(userId)(dispatch);\n  //     } else {\n  //       setRestClientToken();\n  //       // validate token\n  //       validateAuthToken()(dispatch).then((res) => {\n  //         if (!res) {\n  //           // if false, generate token again\n  //           generateAuthToken(userId)(dispatch);\n  //         }\n  //       });\n  //     }\n  //   } else if (isForDemo) {\n  //     // Manage demo access\n  //     // generate a userId then use it to generate a token\n  //     if (isEmpty(generatedAuthToken)) {\n  //       // generate token based on userId\n  //       if (tempUID !== undefined) generateAuthToken(tempUID)(dispatch);\n  //     } else {\n  //       setRestClientToken();\n  //       // validate token\n  //       validateAuthToken()(dispatch).then((res) => {\n  //         if (!res) {\n  //           // if false, generate token again\n  //           generateAuthToken(tempUID)(dispatch);\n  //         }\n  //       });\n  //     }\n  //   } else {\n  //     // show popup error saying no userId found\n  //     // toast.error(\"The system didn't find a valid user id so 'Save Search' feature is hidden.\");\n  //     console.log('no user id found');\n  //   }\n  // }, [userId, props?.isAuthenticated, generatedAuthToken, props.includeRouterRoot, tempUID]);\n\n  // Get typesense config if no config found\n  useEffect(() => {\n    if (isEmpty(typesenseConfig)) {\n      // generatedAuthToken &&\n      getTypesenseConfigFromAPI()(dispatch);\n    }\n  }, [generatedAuthToken, typesenseConfig]);\n\n  // initialize app's table content and initial filters\n  useEffect(() => {\n    if (isTypesenseConfigReady) {\n      // populate display template and table columns\n      initializeConfig()(dispatch);\n\n      // getting master data\n      getFilterList(typesenseConfig, pageQuery)(state, dispatch).then((obj: any) => {\n        setTotalFound(obj.total);\n        setHits(obj.hits);\n        setIsLastPage(!obj.hits.length);\n        setIsInitDone(true);\n      });\n    }\n  }, [isTypesenseConfigReady, typesenseConfig]);\n\n  // on load, check local states for filter and sort value then apply in the current params + invoke typesense\n  useEffect(() => {\n    if (\n      isInitDone &&\n      isTypesenseConfigReady &&\n      tempSelectedParams &&\n      Object.keys(tempSelectedParams).length\n    ) {\n      if (tempSelectedParams?.filter_by?.length || tempSelectedParams?.sort_by?.length) {\n        const filter_by = tempSelectedParams?.filter_by || [];\n        const sort_by = tempSelectedParams?.sort_by || [];\n        onSaveMultiParams(\n          filter_by,\n          sort_by\n        )(dispatch).then((res) => {\n          if (res) {\n            setIsSyncDone(true);\n            typeSenseSearchReq(\n              Object.assign(currentScreenerParams, {\n                filter_by: tempSelectedParams?.filter_by || currentScreenerParams?.filter_by,\n                sort_by: tempSelectedParams?.sort_by || currentScreenerParams?.sort_by,\n                q: search_keyword || '', // @note this is to manage the issue when coming back to screener, the results is not displaying correctly\n                page: pageQuery,\n              })\n            );\n          }\n        });\n      }\n    }\n  }, [isTypesenseConfigReady, isInitDone, search_keyword]);\n\n  // for Search Input changes\n  useEffect(() => {\n    // const pattern = /^[a-zA-Z0-9,]*$/g;\n    if (\n      // isSyncDone &&\n      isTypesenseConfigReady &&\n      !isEmpty(search_keyword)\n      // search_keyword.match(pattern)\n    ) {\n      const getDictionaryKeys = Object.keys(typesenseDictionary);\n      const manageSearchKeyword = getDictionaryKeys.includes(search_keyword)\n        ? typesenseDictionary[search_keyword]\n        : search_keyword;\n      const search_params = Object.assign(currentScreenerParams, {\n        q: manageSearchKeyword,\n        page: 1, // to make sure it start with 1st page\n      });\n      typeSenseSearchReq(search_params);\n    }\n  }, [search_keyword, isTypesenseConfigReady, typesenseDictionary, currentScreenerParams?.q]);\n\n  // Manage sorting changes\n  useEffect(() => {\n    if (isTypesenseConfigReady && currentScreenerParams?.sort_by[0]?.field_name === currentSort) {\n      const search_params = Object.assign(currentScreenerParams || {}, {\n        page: pageQuery || 1,\n      });\n      typeSenseSearchReq(search_params);\n    }\n  }, [currentScreenerParams?.sort_by, currentSort, isTypesenseConfigReady]);\n\n  // for page param\n  useEffect(() => {\n    if (isTypesenseConfigReady && currentScreenerParams?.page > 1 && !isManualPagination) {\n      if (totalFound !== hits.length) {\n        // const modifiedParams = isComingFromOtherPage\n        //   ? Object.assign(currentScreenerParams, {\n        //       page: 1,\n        //     })\n        //   : currentScreenerParams;\n        searchWithFacetsMulti([currentScreenerParams], typesenseConfig).then((value) => {\n          const hitResults: any = get(value.results[0], 'hits');\n          setTotalFound(get(value.results[0], 'found'));\n          setHits((prevState: any) => [...prevState, ...hitResults]);\n          saveIsComingFromOtherPage(false)(dispatch);\n        });\n      }\n      setIsLastPage(totalFound <= hits.length);\n    }\n  }, [\n    currentScreenerParams?.page,\n    isTypesenseConfigReady,\n    typesenseConfig,\n    isComingFromOtherPage,\n    isManualPagination,\n    // isSyncDone,\n    // tempSelectedParams,\n  ]);\n\n  // Listen to window height changes then update wrapper size for responsive height\n  useLayoutEffect(() => {\n    const mainWrapperElement = document.getElementById('main-screener');\n    // console.log('mainWrapperElement ', mainWrapperElement?.clientHeight, mainWrapperElement);\n    setWrapperSize(`${mainWrapperElement?.clientHeight}px`);\n  }, [windowSize.height]);\n\n  // initialise language\n  useEffect(() => {\n    if (props?.language) {\n      initLanguage(props?.language)(dispatch);\n    }\n  }, [props?.language]);\n\n  // Typesense search func\n  const typeSenseSearchReq = useCallback(\n    (params: any) => {\n      if (isTypesenseConfigReady) {\n        searchWithFacetsMulti([params], typesenseConfig).then((value) => {\n          const hitResults: any = get(value.results[0], 'hits');\n          // const facetResults: any = get(value.results[0], 'facet_counts');\n          // onSaveFilterList(currentScreenerType, facetResults)(dispatch);\n          // onSaveFilterCount(facetResults)(filterOptions, dispatch);\n          setTotalFound(get(value.results[0], 'found'));\n          setHits(hitResults);\n          setIsLastPage(!hitResults?.length);\n        });\n      }\n    },\n    [isTypesenseConfigReady, typesenseConfig]\n  );\n\n  /** @note uncomment + update api to make user preference feature work */\n  // Get saved search if user/tempuid ix exist\n  // useEffect(() => {\n  //   if (isTypesenseConfigReady && userId && generatedAuthToken)\n  //     onGetUserPreferences(userId)(dispatch);\n  //   if (isTypesenseConfigReady && props.includeRouterRoot && tempUID && generatedAuthToken) {\n  //     // validateAuthToken()(dispatch);\n  //     onGetUserPreferences(tempUID)(dispatch);\n  //   }\n  // }, [userId, props.includeRouterRoot, tempUID, generatedAuthToken, isTypesenseConfigReady]);\n\n  /** @note manual pagination */\n  const onNextPage = (num: number) => {\n    const modifiedParams = Object.assign(currentScreenerParams, {\n      page: num,\n    });\n    searchWithFacetsMulti([modifiedParams], typesenseConfig).then((value) => {\n      const hitResults: any = get(value.results[0], 'hits');\n      setTotalFound(get(value.results[0], 'found'));\n      setHits([...hitResults]);\n      // setHits((prevState: any) => [...prevState, ...hitResults]);\n      // saveIsComingFromOtherPage(false)(dispatch);\n    });\n  };\n\n  /** Update pagination */\n  const onLoadMore = () => {\n    savePageNo(currentScreenerParams.page + 1)(dispatch);\n  };\n  // console.log('HITS ', hits);\n  /** Show / Hide Sidebar filters */\n  const toggleFilter = () => {\n    setShowFilter(!showFilter);\n  };\n\n  const onKeyDownToggleFilter = (e: (BaseSyntheticEvent & KeyboardEvent) | any) => {\n    // console.log('e.key', e.key);\n    if (e.key === 'Enter' || e.code === 'Enter') {\n      setShowFilter(!showFilter);\n      if (filterShowRef.current && filterShowRef.current !== undefined) {\n        filterShowRef.current.focus();\n      }\n    }\n  };\n\n  /**\n   * Handle Filter change\n   * to change context state\n   * if the return promise is empty, call typesense util to get result\n   */\n  const onFilter = useCallback(\n    (field_name: string, values: string[]) => {\n      const stateFilterBy = currentScreenerParams?.filter_by;\n      const query = isEmpty(bulkSearchKeywords) ? currentScreenerParams.q : '';\n      // const query = isEmpty(bulkSearchKeywords) ? search_keyword : '';\n\n      // on every filter change, make sure page is no. 1\n      savePageNo(1)(dispatch);\n\n      saveFilter(field_name, values)(stateFilterBy, dispatch).then((filter_by) => {\n        // if (filter_by.length) {\n        const search_params = Object.assign(currentScreenerParams, {\n          // page: 1,\n          filter_by,\n          q: query,\n        });\n        typeSenseSearchReq(search_params);\n        // }\n      });\n    },\n    [currentScreenerParams?.filter_by, bulkSearchKeywords]\n  );\n\n  // Sidebar function for populating the selected saved filter\n  const onApplySavedSearchFilter = useCallback(\n    (name: string) => {\n      onApplySavedSearch(name)(savedSearches, dispatch).then((params) => {\n        typeSenseSearchReq(Object.assign(params));\n      });\n    },\n    [savedSearches]\n  );\n\n  // Sidebar function for rebate eligible and ready to trade\n  const onApplySingleFilter = useCallback(\n    (id: string) => {\n      const stateFilterBy = currentScreenerParams?.filter_by;\n      onSingleFilterFn(id)(stateFilterBy, dispatch).then((params) => {\n        const search_params = Object.assign(currentScreenerParams, {\n          page: 1,\n          filter_by: params,\n        });\n        typeSenseSearchReq(search_params);\n      });\n    },\n    [currentScreenerParams?.filter_by]\n  );\n\n  /**\n   * @note this is specifically for Income Distribution filter for \"inc\" or \"Dividend paying fund\"\n   */\n  const onApplySwitchFilter = useCallback(() => {\n    const field_name = 'IncomeDistribution';\n    onSwitchDividendPayingFund()(dispatch);\n\n    if (!dividendPayingFund) {\n      const values = ['inc'];\n      onFilter(field_name, values);\n    } else {\n      onFilter(field_name, []);\n    }\n  }, [currentScreenerParams?.filter_by, dividendPayingFund]);\n\n  const onSearchWithinFilter = useCallback(\n    (field_name: string, values: string[]) => {\n      onSearchFilterContent(field_name, values)(currentScreenerParams, dispatch);\n    },\n    [currentScreenerParams]\n  );\n\n  const isSearchResultEmpty = React.useMemo(() => {\n    if ((currentScreenerParams?.filter_by?.length || search_keyword?.length) && !hits.length) {\n      return true;\n    }\n    return false;\n  }, [currentScreenerParams?.filter_by, search_keyword, hits]);\n\n  /** Clear Filters */\n  const onClearFilters = useCallback(() => {\n    clearFilter()(dispatch);\n    const search_params = Object.assign(currentScreenerParams, {\n      filter_by: [],\n    });\n    typeSenseSearchReq(search_params);\n  }, [currentScreenerParams]);\n\n  /** Clear Search */\n  const onClearSearch = useCallback(() => {\n    onClearParamsQ()(dispatch);\n    const search_params = Object.assign(currentScreenerParams, {\n      q: '',\n    });\n    typeSenseSearchReq(search_params);\n  }, [currentScreenerParams, search_keyword]);\n\n  /** Manage display of Chips from Advanced Filter selections */\n  const getAdvFilterChips = React.useMemo(() => {\n    let stateFilterBy: Array<any> = [];\n    if (currentScreenerParams?.filter_by?.length) {\n      stateFilterBy = [...currentScreenerParams?.filter_by].filter(\n        (item) => item.field_name === 'AmcId' || item.field_name === 'ShareClassType'\n      );\n      stateFilterBy = stateFilterBy.map((item) => {\n        const result = hits.filter(\n          (hitItem: any) => hitItem.document.AmcId === item.values.toString()\n        );\n        return {\n          id: item.field_name,\n          label:\n            item.field_name === 'ShareClassType'\n              ? item.values.toString()\n              : result[0].document.BrandingCompanyName,\n        };\n      });\n    }\n    return stateFilterBy;\n  }, [currentScreenerParams?.filter_by]);\n\n  /**\n   * Render Display Template Button\n   */\n  const renderTemplateButton = useCallback(() => {\n    const appConfig = Array.from(screenerConfig);\n    return (\n      appConfig?.length &&\n      appConfig\n        .filter((item: any) => item.screenerType.id === currentScreenerType)\n        .map((item: any) => {\n          const withTranslation = item.withTranslation;\n          return item.templateData.map((template: any, idx: number) => (\n            <DisplayTemplateButton\n              key={`template-button-${idx}`}\n              name={get(template.displayTemplate, 'id')}\n              aria-controls={get(template.displayTemplate, 'id')}\n              id={`tab-${get(template.displayTemplate, 'id')}`}\n              isCurrent={get(template.displayTemplate, 'id') === currentTemplateTab}\n              onClick={({ target }: BaseSyntheticEvent) => {\n                saveCurrentDisplayTemplate(target?.name)(dispatch);\n                if (target?.name !== 'overview') setViewType('listView');\n              }}\n            >\n              {withTranslation\n                ? intl.formatMessage({ id: get(template.displayTemplate, 'id') })\n                : get(template.displayTemplate, 'label')}\n            </DisplayTemplateButton>\n          ));\n        })\n    );\n  }, [currentScreenerType, currentTemplateTab, intl]);\n\n  // Handle Upload results display\n  const isContainingRecognizedAndUnRecognizedResults =\n    get(bulkSearchResult, 'recognized_isin_codes.total', 0) >= 1 &&\n    get(bulkSearchResult, 'unrecognized_isin_codes.total', 0) >= 1;\n  const isContainingUnrecognizedResultsOnly =\n    get(bulkSearchResult, 'recognized_isin_codes.total', 0) < 1 &&\n    get(bulkSearchResult, 'unrecognized_isin_codes.total', 0) >= 1;\n  const isContainingNoIsins =\n    get(bulkSearchResult, 'recognized_isin_codes.total', 0) === 0 &&\n    get(bulkSearchResult, 'unrecognized_isin_codes.total', 0) === 0;\n\n  // Handle when to show Save search button\n  // const isShowSaveSearchBtn = () => {\n  //   const manageId = props.includeRouterRoot ? tempUID : userId;\n  //   const isShow =\n  //     isAuthTokenValid &&\n  //     (manageId !== undefined || manageId !== '') && //manageId.toString() && !isEmpty(manageId)\n  //     (currentScreenerParams?.filter_by?.length >= 1 ||\n  //       (!isEmpty(currentScreenerParams.q) && currentScreenerParams.q !== '*'));\n\n  //   return isShow;\n  // };\n\n  // Sidebar Single Filter buttons\n  const singleFilterList = [\n    {\n      id: 'RebateEligibility',\n      label: intl.formatMessage({ id: 'rebateEligible' }),\n      icon: RebateIcon,\n    },\n    {\n      id: 'ReadyToTrade',\n      label: intl.formatMessage({ id: 'readyToTrade' }),\n      icon: ReadyToTradeIcon,\n    },\n  ];\n\n  // Manage when to show search in the filter\n  const showFilterSearchFn = (fieldNamme: string) => {\n    const data = get(screenerConfig[0], 'filterWithSearch', []);\n    return !!data.includes(fieldNamme);\n  };\n\n  // Count the no. of cards per row based on screen size\n  const manageCardCount = React.useMemo(() => {\n    let count = 3;\n    // if (windowSize.width >= 762 && windowSize.width <= 1024) {\n    //   count = 2;\n    // } else\n    if (windowSize.width !== undefined) {\n      if (windowSize.width >= 768 && windowSize.width <= 1638) {\n        count = 3;\n      } else if (windowSize.width >= 1638 && windowSize.width <= 1934) {\n        count = 4;\n      } else {\n        count = 5;\n      }\n      // console.log(count, windowSize.width);\n    }\n\n    return count;\n  }, [windowSize.width]);\n\n  // Show this if restricted (invalid token) or auth token is invalid\n  // if (!isAccessTokenValid)\n  //   return <div style={{ padding: '20px' }}>{intl.formatMessage({ id: 'app.restrictedMsg' })}</div>;\n\n  // @todo manage what to display when validating auth token\n  // if (!isAuthTokenValid) return <PageLoader />;\n\n  return (\n    <ErrorBoundary errorMessage=\"Oops, something went wrong!\">\n      <div\n        // className={`hsbc-screener ${props?.includeRouterRoot ? 'hsbc-screener--withSpacing' : ''}`}\n        className={screenerClasses}\n        ref={parentRef}\n        style={{\n          // maxHeight: props?.includeRouterRoot ? 'calc(100vh - 40px)' : wrapperSize,\n          // minHeight: props?.includeRouterRoot ? 'calc(100vh - 40px)' : wrapperSize,\n          // margin: props?.includeRouterRoot ? '20px 0px 20px 20px' : 0,\n          paddingTop: '20px',\n          position: 'relative',\n          height: '100%',\n          maxWidth: '87.5rem', //'1400px',\n          margin: '0 auto',\n        }}\n      >\n        <aside\n          className={`hsbc-screener__sidebar ${showFilter ? 'show' : 'hide'}`}\n          aria-hidden={showFilter ? false : true}\n        >\n          <div className=\"sidebar\">\n            <div\n              className=\"sidebar__header\"\n              style={{ backgroundColor: themeConfig?.tertiaryColor }}\n            >\n              <div className=\"sidebar__header__filter\">\n                <Typography type=\"h2\" value={intl.formatMessage({ id: 'filters' })} />\n              </div>\n\n              <div>\n                {currentScreenerParams?.filter_by?.length ? (\n                  <button\n                    type=\"button\"\n                    className=\"nw-btn\"\n                    onClick={onClearFilters}\n                    style={{\n                      color: themeConfig?.linkColor,\n                      appearance: 'none',\n                      backgroundColor: 'unset',\n                      border: 'unset',\n                    }}\n                  >\n                    {intl.formatMessage({ id: 'reset' })}\n                    <span className=\"sr-only\">Reset filters</span>\n                  </button>\n                ) : null}\n                <button\n                  className=\"nw-btn\"\n                  ref={filterHideRef}\n                  type=\"button\"\n                  onClick={() => {\n                    toggleFilter();\n                    if (filterShowRef.current && filterShowRef.current !== undefined) {\n                      setTimeout(() => {\n                        filterShowRef.current.focus();\n                        // isMobile\n                        //   ? filterMobileShowRef.current.focus()\n                        //   : filterShowRef.current.focus();\n                      }, 0);\n                    }\n                    if (filterMobileShowRef.current && filterMobileShowRef.current !== null) {\n                      setTimeout(() => {\n                        filterMobileShowRef.current.focus();\n                      }, 0);\n                    }\n                  }}\n                  style={{ appearance: 'none', border: 'unset', backgroundColor: 'unset' }}\n                  // onKeyDown={onKeyDownToggleFilter}\n                >\n                  {isMobile ? (\n                    <img\n                      // src=\"https://nw-component-ui.s3.ap-southeast-1.amazonaws.com/arrow-left-dark.svg\"\n                      src={CloseIcon}\n                      width={18}\n                      height={18}\n                      alt=\"Hide filter\"\n                    />\n                  ) : (\n                    <img\n                      // src=\"https://nw-component-ui.s3.ap-southeast-1.amazonaws.com/arrow-left-dark.svg\"\n                      src={icons.filterIcon}\n                      width={20}\n                      height={20}\n                      alt=\"Hide filter\"\n                      style={{ position: 'relative', top: '2px' }}\n                    />\n                  )}\n                </button>\n              </div>\n            </div>\n            <fieldset\n              className=\"sidebar__content\"\n              // style={{\n              //   maxHeight: props?.includeRouterRoot\n              //     ? 'calc(100vh - 94px)'\n              //     : `calc(${wrapperSize} - 56px)`,\n              // }}\n            >\n              <ol className=\"advanced-filter-list\">\n                {withDividendPayingFilter ? (\n                  <li>\n                    <Switcher\n                      themeConfig={themeConfig}\n                      label=\"Dividend paying\"\n                      isEnabled={dividendPayingFund}\n                      onSwitch={onApplySwitchFilter}\n                    />\n                  </li>\n                ) : null}\n                {isWithSingleFilterButton\n                  ? singleFilterList.map((item: any) => (\n                      <li key={item.id}>\n                        <SingleFilterButton\n                          id={item.id}\n                          name={item.label}\n                          icon={item.icon}\n                          isCurrent={item.id === currentSavedSearch}\n                          onApply={onApplySingleFilter}\n                        />\n                      </li>\n                    ))\n                  : null}\n                {savedSearches?.length\n                  ? savedSearches.map((item: any, idx: number) => (\n                      <li key={`ss-${idx}`}>\n                        <SavedSearchButton\n                          name={item.name}\n                          isCurrent={item.name === currentSavedSearch}\n                          // onApply={(name) => onApplySavedSearch(name)(savedSearches, dispatch)}\n                          onApply={onApplySavedSearchFilter}\n                          onDelete={(name) => {\n                            const manageId = props.includeRouterRoot ? tempUID : userId;\n                            onRemoveSavedSearch(name, manageId)(userPreferences, dispatch);\n                          }}\n                        />\n                      </li>\n                    ))\n                  : null}\n              </ol>\n              {/* {console.log('filterOptions, ', filterOptions)} */}\n              {filterOptions.map((filter: any, idx: number) => {\n                const fieldName = get(filter, 'field_name');\n                return (\n                  <Accordion\n                    key={`filter-${idx}`}\n                    title={intl.formatMessage({ id: fieldName })}\n                    isAccordion\n                    isActive={idx === 0 || idx === 1} // get(filter, 'counts').length ||\n                    isDisabled={!get(filter, 'counts').length}\n                  >\n                    {showFilterSearchFn(fieldName) ? (\n                      <SearchInput\n                        forFilter\n                        onClick={(val) => onSearchWithinFilter(fieldName, Array(val))}\n                        name={fieldName}\n                        placeholder={intl.formatMessage({ id: `searchFor.${fieldName}` })}\n                        onClear={() => onClearFilterSearch()(currentScreenerParams, dispatch)}\n                      />\n                    ) : null}\n\n                    {fieldName === 'RiskLevel' ? (\n                      <FilterList\n                        name={fieldName}\n                        options={orderBy(\n                          get(filter, 'counts')\n                            .filter((item: any) => item.value !== '')\n                            .map((item: any) => ({\n                              count: formatNumberWithComma(item.count),\n                              value: item.value,\n                              prefix:\n                                fieldName === 'RiskLevel' ? getRiskLevelDescByCode(item.value) : '',\n                              // prefix: fieldName === 'EsgClassification' ? `Article` : '',\n                            })),\n                          'value',\n                          'desc'\n                        )}\n                        onSelect={(field_name, values) => onFilter(field_name, values)}\n                        selected={currentScreenerParams.filter_by}\n                      />\n                    ) : (\n                      // : fieldName === 'ProductRange' ? (\n                      //   <FilterListSubLevel\n                      //     name={fieldName}\n                      //     options={get(filter, 'counts').map((item: any) => ({\n                      //       count: formatNumberWithComma(item.count),\n                      //       value: item.value,\n                      //     }))}\n                      //     onSelect={(field_name, values) => onFilter(field_name, values)}\n                      //     selected={currentScreenerParams.filter_by}\n                      //   />\n                      // )\n                      <FilterList\n                        name={fieldName}\n                        options={get(filter, 'counts').map((item: any) => ({\n                          count: formatNumberWithComma(item.count),\n                          value: item.value,\n                          prefix: fieldName === 'RiskLevel' ? getRiskLevelByCode(item.value) : '',\n                          // prefix: fieldName === 'EsgClassification' ? `Article` : '',\n                        }))}\n                        onSelect={(field_name, values) => onFilter(field_name, values)}\n                        selected={currentScreenerParams.filter_by}\n                      />\n                    )}\n                  </Accordion>\n                );\n              })}\n            </fieldset>\n            <footer className=\"sidebar__footer\">\n              <Button\n                variant=\"primary\"\n                isOutline\n                // size=\"small\"\n                onClick={onClearFilters}\n                // style={{ color: themeConfig?.linkColor }}\n                // tabIndex={0}\n              >\n                Reset\n              </Button>\n              <Button\n                variant=\"primary\"\n                // size=\"small\"\n                // tabIndex={0}\n                onClick={toggleFilter}\n                aria-expanded=\"true\"\n              >\n                Apply\n              </Button>\n            </footer>\n          </div>\n        </aside>\n\n        {/* {showFilter ? ( */}\n        {/* {!showFilter && !isMobile ? ( */}\n        {!isTablet && !isMobile ? (\n          <button\n            ref={filterShowRef}\n            type=\"button\"\n            // variant=\"secondary\"\n            // size=\"large\"\n            // isOutline\n            className=\"nw-btn\"\n            tabIndex={0}\n            onClick={() => {\n              toggleFilter();\n              if (filterHideRef.current && filterHideRef.current !== undefined) {\n                setTimeout(() => {\n                  filterHideRef.current.focus();\n                }, 100);\n              }\n            }}\n            // onKeyDown={onKeyDownToggleFilter}\n            // aria-pressed={showFilter}\n            style={{\n              display: !showFilter && !isMobile ? 'flex' : 'none',\n              alignItems: 'center',\n              justifyContent: 'center',\n              marginRight: '16px',\n              position: 'sticky',\n              top: '0px',\n              border: `1px solid ${themeConfig?.secondaryColor}`,\n              maxHeight: '48px',\n              minWidth: '48px',\n            }}\n            // aria-expanded=\"showFilter\"\n          >\n            <img\n              // src=\"https://nw-component-ui.s3.ap-southeast-1.amazonaws.com/arrow-right-white.svg\"\n              src={icons.filterIcon}\n              width={18}\n              height={18}\n              alt=\"Show filter\"\n            />\n          </button>\n        ) : null}\n\n        <section className=\"hsbc-screener__content\">\n          {/* SEARCH FEATURE */}\n          <header className=\"hsbc-screener__content__header\">\n            <div className=\"search\">\n              <SearchInput\n                isMobile={isMobile}\n                recentViews={get(userPreferences, 'recentViews')}\n                isForDemo={props.includeRouterRoot}\n                defaultValue={bulkSearchKeywords || search_keyword}\n                placeholder={intl.formatMessage({ id: 'search.placeholder' })}\n                onClick={(keyword: string) => {\n                  /** @note manage page query when manual pagination */\n                  if (isManualPagination) navigate(`/?page=1`);\n                  if (keyword.indexOf(',') > -1 || keyword.indexOf(', ') > -1) {\n                    saveSearchKeyword('')(dispatch); // clear single search keyword\n                    setBulkSearchKeywords(keyword);\n\n                    const arrayValues = keyword.split(',');\n                    onFilter('ISIN', arrayValues);\n                  } else {\n                    saveSearchKeyword(keyword)(dispatch);\n                    setBulkSearchKeywords('');\n                  }\n                }}\n                onClear={() => {\n                  onClearSearch();\n                  onFilter('ISIN', []);\n                  // if (bulkSearchKeywords.indexOf(',') > -1) {\n                  //   onFilter('ISIN', []);\n                  // }\n                }}\n                // onBlur={() => {\n                //   if (filterHideRef) filterHideRef.current.focus();\n                // }}\n              />\n            </div>\n\n            {(isMobile || isTablet) && !showFilter ? (\n              <button\n                // variant=\"default\"\n                // size=\"small\"\n                // isIcon\n                className=\"filter-btn-mobile\"\n                ref={filterMobileShowRef}\n                onClick={() => {\n                  toggleFilter();\n                  setTimeout(() => {\n                    if (\n                      filterHideRef &&\n                      filterHideRef.current &&\n                      filterHideRef.current !== undefined\n                    ) {\n                      /** focus on the filter close button */\n                      filterHideRef.current.focus();\n                    }\n                  }, 100);\n                }}\n              >\n                <img\n                  // src=\"https://nw-component-ui.s3.ap-southeast-1.amazonaws.com/arrow-left-dark.svg\"\n                  src={icons.filterIcon}\n                  width={20}\n                  height={20}\n                  alt=\"Show filter\"\n                  style={{ position: 'relative', top: '2px' }}\n                />\n              </button>\n            ) : null}\n\n            {props.sidebarPosition === 'left' ? null : (\n              <Button variant=\"default\" onClick={toggleFilter} onKeyDown={onKeyDownToggleFilter}>\n                <img src={Filter} width={iconSize} height={iconSize} alt=\"filter\" />\n                <span>{`${\n                  showFilter\n                    ? intl.formatMessage({ id: 'hideFilters' })\n                    : intl.formatMessage({ id: 'showFilters' })\n                }`}</span>\n              </Button>\n            )}\n          </header>\n\n          {/* BULK SEARCK FOR FUNDS */}\n          {isWithBulkSearch ? (\n            <div className=\"hsbc-screener__content__bulkSearch\">\n              <DragDropFile\n                message={\n                  !isBulkSearchProcesing ? (\n                    <>\n                      {isContainingRecognizedAndUnRecognizedResults ? (\n                        <>\n                          <span>{`${intl.formatMessage({ id: 'search.has' })}`}</span>\n                          <strong>\n                            {intl.formatMessage(\n                              { id: 'search.recognizedResult' },\n                              { number: get(bulkSearchResult, 'recognized_isin_codes.total') }\n                            )}\n                          </strong>\n                          <span>{` ${intl.formatMessage({ id: 'search.and' })}`}</span>\n                          <MyPopover\n                            title={intl.formatMessage(\n                              { id: 'search.unrecognizedResult.title' },\n                              { number: get(bulkSearchResult, 'unrecognized_isin_codes.total') }\n                            )}\n                            button={intl.formatMessage(\n                              { id: 'search.unrecognizedResult' },\n                              { number: get(bulkSearchResult, 'unrecognized_isin_codes.total') }\n                            )}\n                            data={get(bulkSearchResult, 'unrecognized_isin_codes.isin_code', [])}\n                          />\n                        </>\n                      ) : isContainingUnrecognizedResultsOnly ? (\n                        <>\n                          <span>{intl.formatMessage({ id: 'search.hasNoResult' })}</span>\n                        </>\n                      ) : isContainingNoIsins ? (\n                        <span>{intl.formatMessage({ id: 'search.hasNoResult' })}</span>\n                      ) : (\n                        <>\n                          <span>{`${intl.formatMessage({ id: 'search.has' })} `}</span>\n                          <strong>\n                            {intl.formatMessage(\n                              { id: 'search.recognizedResult' },\n                              { number: get(bulkSearchResult, 'recognized_isin_codes.total') }\n                            )}\n                          </strong>\n                        </>\n                      )}\n                    </>\n                  ) : (\n                    <div style={{ marginLeft: '10px', display: 'inline-block' }}>\n                      <ReactLoading height=\"18px\" width=\"18px\" color=\"#743169\" type=\"spin\" />\n                    </div>\n                  )\n                }\n                onUpload={(e) => {\n                  setIsBulkSearchProcesing(true);\n                  onBulkSearchUpload(e)().then((item: any) => {\n                    setBulkSearchResult(item);\n                    const isThereIsins = get(item, 'recognized_isin_codes.total') >= 1;\n                    const isinsList = get(item, 'recognized_isin_codes.isin_code');\n\n                    if (isThereIsins) {\n                      const keywordList = isinsList.toString().split(',').join(', ');\n                      // console.log('............', keywordList, isinsList);\n                      setBulkSearchKeywords(keywordList);\n                      onFilter('ISIN', isinsList);\n                    }\n                    setIsBulkSearchProcesing(false);\n                  });\n                }}\n              />\n            </div>\n          ) : null}\n\n          {/* CURRENT FILTER SELECTION */}\n          {getAdvFilterChips?.length ? (\n            <div className=\"hsbc-screener__content__advFilterList\">\n              <Chip\n                list={getAdvFilterChips}\n                onClose={(obj) => onFilter(obj.id, [])}\n                variant=\"primary\"\n                size=\"small\"\n              />\n            </div>\n          ) : null}\n\n          <div className=\"hsbc-screener__content__actions\">\n            <section\n              aria-hidden={showFilter && isMobile ? true : false}\n              className=\"hsbc-screener__content__actions__aside\"\n            >\n              {/* <Typography\n                type=\"span\"\n                role=\"status\"\n                aria-live=\"assertive\"\n                aria-atomic=\"true\"\n                value={`${totalFound !== 0 ? formatNumberWithComma(totalFound) : 0} ${\n                  totalFound > 1\n                    ? intl.formatMessage({ id: 'dataTable.entries' })\n                    : intl.formatMessage({ id: 'dataTable.entry' })\n                }`}\n              /> */}\n              <span role=\"status\" aria-live=\"assertive\" aria-atomic=\"true\">\n                {`${totalFound !== 0 ? formatNumberWithComma(totalFound) : 0} ${\n                  totalFound > 1\n                    ? intl.formatMessage({ id: 'dataTable.entries' })\n                    : intl.formatMessage({ id: 'dataTable.entry' })\n                }`}\n              </span>\n              <div>\n                <Switcher\n                  themeConfig={themeConfig}\n                  label=\"Pagination\"\n                  isEnabled={isManualPagination}\n                  onSwitch={() => {\n                    onSwitchManualPagination()(dispatch);\n                    if (isManualPagination) navigate('/');\n\n                    /** @note temporary fix for making pagination load initial data based on selection */\n                    window.location.reload();\n                  }}\n                />\n              </div>\n            </section>\n\n            <div style={{ marginBottom: viewType === 'cardView' ? '10px' : '0px' }}>\n              {currentTemplateTab === 'overview' ? (\n                <ViewOption selected={viewType} onChange={(selected) => setViewType(selected)} />\n              ) : null}\n\n              {/* {viewType === 'listView' ? renderTemplateButton() : null} */}\n              <div role=\"tablist\">{renderTemplateButton()}</div>\n\n              {/* @note hide SAVE SEARCH FEATURE BUTTON */}\n              {/* {isShowSaveSearchBtn() ? (\n                <SaveSearch\n                  currentList={savedSearches}\n                  onSave={(searchName) => {\n                    const manageId = props.includeRouterRoot ? tempUID : userId;\n                    onSaveSearch(\n                      searchName,\n                      manageId,\n                      currentScreenerParams\n                    )(userPreferences, dispatch);\n                  }}\n                />\n              ) : null} */}\n            </div>\n          </div>\n\n          {windowSize.width < 667 ? (\n            <div\n              className=\"hsbc-screener__content__results\"\n              aria-hidden={showFilter && isMobile ? true : false}\n            >\n              {screenerConfig\n                .filter((item: any) => item.screenerType.id === currentScreenerType)\n                .map((item: any, idx: number) => {\n                  return !isManualPagination ? (\n                    <MobileView\n                      key={`mobile-${idx}`}\n                      parentRef={parentRef}\n                      data={hits}\n                      fundData={item.fundData}\n                      totalResult={totalFound}\n                      isLastPage={isLastPage}\n                      showMore={onLoadMore}\n                      onSelectFund={(payload: string[] | any) =>\n                        saveSelectedFund(payload)(dispatch)\n                      }\n                      selected={selectedFunds}\n                      onMenuSelect={(arg1: string, arg2: string) => {\n                        onFilter(arg1, Array.from([arg2]));\n                      }}\n                      includeRouterRoot={props.includeRouterRoot}\n                      withDynamicMenu={get(props, 'withDynamicMenu', false)}\n                      appConfig={appInitConfig}\n                    />\n                  ) : (\n                    <CardViewMP\n                      key={`mobile-t-${idx}`}\n                      parentRef={parentRef}\n                      data={hits}\n                      fundData={item.fundData}\n                      cardCount={manageCardCount}\n                      totalResult={totalFound}\n                      isLastPage={isLastPage}\n                      showMore={onLoadMore}\n                      onSelectFund={(payload: string[] | any) =>\n                        saveSelectedFund(payload)(dispatch)\n                      }\n                      selected={selectedFunds}\n                      onMenuSelect={(arg1: string, arg2: string) =>\n                        onFilter(arg1, Array.from([arg2]))\n                      }\n                      includeRouterRoot={props.includeRouterRoot}\n                      withDynamicMenu={get(props, 'withDynamicMenu', false)}\n                      appConfig={appInitConfig}\n                      totalItems={totalFound}\n                      onPageClick={onNextPage}\n                    />\n                  );\n                })}\n            </div>\n          ) : (\n            <div className=\"hsbc-screener__content__results\">\n              {viewType === 'listView'\n                ? screenerConfig\n                    .filter((item: any) => item.screenerType.id === currentScreenerType)\n                    .map((item: any, idx: number) => {\n                      return isManualPagination ? (\n                        <DataTableMP\n                          key={`t-${idx}`}\n                          parentRef={parentRef}\n                          data={hits}\n                          // tableDetails={item.templateData[idx]?.displayTemplate}\n                          currentTab={currentTemplateTab}\n                          columns={get(\n                            item.templateData.filter(\n                              (item: any) => item.displayTemplate.id === currentTemplateTab\n                            )[0],\n                            'columns'\n                          )}\n                          fundData={item.fundData}\n                          withTranslation={item.withTranslation}\n                          totalResult={totalFound}\n                          isLastPage={isLastPage}\n                          showMore={onLoadMore}\n                          onSort={(field_name, order) => {\n                            // console.log('tempSelectedParams', tempSelectedParams);\n                            saveToggleSort(field_name, order)(dispatch);\n                            setCurrentSort(order === 'default' ? 'FundName' : field_name);\n                          }}\n                          onSelectFund={(payload: string[] | any) =>\n                            saveSelectedFund(payload)(dispatch)\n                          }\n                          selected={selectedFunds}\n                          onMenuSelect={(arg1: string, arg2: string) => {\n                            onFilter(arg1, Array.from([arg2]));\n                          }}\n                          includeRouterRoot={props.includeRouterRoot}\n                          withDynamicMenu={get(props, 'withDynamicMenu', false)}\n                          appConfig={appInitConfig}\n                          totalItems={totalFound}\n                          onPageClick={onNextPage}\n                          current={pageQuery}\n                          // current={1} // @todo make dynamic based on search query\n                        />\n                      ) : (\n                        <DataTable\n                          key={`t-${idx}`}\n                          parentRef={parentRef}\n                          data={hits}\n                          // tableDetails={item.templateData[idx]?.displayTemplate}\n                          currentTab={currentTemplateTab}\n                          columns={get(\n                            item.templateData.filter(\n                              (item: any) => item.displayTemplate.id === currentTemplateTab\n                            )[0],\n                            'columns'\n                          )}\n                          fundData={item.fundData}\n                          withTranslation={item.withTranslation}\n                          totalResult={totalFound}\n                          isLastPage={isLastPage}\n                          showMore={onLoadMore}\n                          onSort={(field_name, order) => {\n                            // console.log('tempSelectedParams', tempSelectedParams);\n                            saveToggleSort(field_name, order)(dispatch);\n                            setCurrentSort(order === 'default' ? 'FundName' : field_name);\n                          }}\n                          onSelectFund={(payload: string[] | any) =>\n                            saveSelectedFund(payload)(dispatch)\n                          }\n                          selected={selectedFunds}\n                          onMenuSelect={(arg1: string, arg2: string) => {\n                            onFilter(arg1, Array.from([arg2]));\n                          }}\n                          includeRouterRoot={props.includeRouterRoot}\n                          withDynamicMenu={get(props, 'withDynamicMenu', false)}\n                          appConfig={appInitConfig}\n                        />\n                      );\n                    })\n                : screenerConfig\n                    .filter((item: any) => item.screenerType.id === currentScreenerType)\n                    .map((item: any, idx: number) => {\n                      return isManualPagination ? (\n                        <CardViewMP\n                          key={`ct-${idx}`}\n                          parentRef={parentRef}\n                          // data={hits}\n                          data={hits}\n                          fundData={item.fundData}\n                          cardCount={manageCardCount}\n                          // withTranslation={item.withTranslation}\n                          totalResult={totalFound}\n                          isLastPage={isLastPage}\n                          showMore={onLoadMore}\n                          onSelectFund={(payload: string[] | any) =>\n                            saveSelectedFund(payload)(dispatch)\n                          }\n                          selected={selectedFunds}\n                          onMenuSelect={(arg1: string, arg2: string) =>\n                            onFilter(arg1, Array.from([arg2]))\n                          }\n                          includeRouterRoot={props.includeRouterRoot}\n                          withDynamicMenu={get(props, 'withDynamicMenu', false)}\n                          appConfig={appInitConfig}\n                          totalItems={totalFound}\n                          onPageClick={onNextPage}\n                        />\n                      ) : (\n                        <CardView\n                          key={`t-${idx}`}\n                          parentRef={parentRef}\n                          // data={hits}\n                          data={convertArrOfObjIntoArrOfArr(hits, manageCardCount)}\n                          fundData={item.fundData}\n                          cardCount={manageCardCount}\n                          // withTranslation={item.withTranslation}\n                          totalResult={totalFound}\n                          isLastPage={isLastPage}\n                          showMore={onLoadMore}\n                          onSelectFund={(payload: string[] | any) =>\n                            saveSelectedFund(payload)(dispatch)\n                          }\n                          selected={selectedFunds}\n                          onMenuSelect={(arg1: string, arg2: string) =>\n                            onFilter(arg1, Array.from([arg2]))\n                          }\n                          includeRouterRoot={props.includeRouterRoot}\n                          withDynamicMenu={get(props, 'withDynamicMenu', false)}\n                          appConfig={appInitConfig}\n                        />\n                      );\n                    })}\n\n              {isSearchResultEmpty ? <NoResult /> : null}\n            </div>\n          )}\n\n          {selectedFunds.length ? (\n            <ScreenerAction\n              // url={`/fund-universe/compare?ids=${selectedFunds}`}\n              isRelative={(isManualPagination && isMobile) || !isMobile}\n              onCompare={() => {\n                const linkUrl = props.includeRouterRoot\n                  ? `/compare?ids=${selectedFunds}&page=${pageQuery}`\n                  : `${location.pathname}/compare?ids=${selectedFunds}`;\n                navigate(linkUrl);\n              }}\n              onReset={() => clearSelectedFunds()(dispatch)}\n              currentNumber={selectedFunds.length}\n            />\n          ) : null}\n\n          <footer\n            className=\"hsbc-screener__footer\"\n            aria-hidden={showFilter && isMobile ? true : false}\n          >\n            <Disclaimer content={appInitConfig?.disclaimer} />\n          </footer>\n        </section>\n\n        {/* ) : null} */}\n\n        {/* ) : null} */}\n\n        {/* {!isManualPagination && selectedFunds.length ? (\n          <ScreenerAction\n            // url={`/fund-universe/compare?ids=${selectedFunds}`}\n            onCompare={() => {\n              const linkUrl = props.includeRouterRoot\n                ? `/compare?ids=${selectedFunds}&token=${accessToken}`\n                : `${location.pathname}/compare?ids=${selectedFunds}`;\n              navigate(linkUrl);\n            }}\n            onReset={() => clearSelectedFunds()(dispatch)}\n            currentNumber={selectedFunds.length}\n          />\n        ) : null} */}\n        <ToastContainer />\n        <Tooltip id=\"app-tooltips\" />\n      </div>\n    </ErrorBoundary>\n  );\n}\n\nexport default LayoutScreener(memo(Screener));\n","export default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTExLjg1MzYgMC4xNDYzOTZDMTEuNzU5OCAwLjA1MjY1ODYgMTEuNjMyNyAwIDExLjUwMDEgMEMxMS4zNjc1IDAgMTEuMjQwNCAwLjA1MjY1ODYgMTEuMTQ2NiAwLjE0NjM5Nkw2IDUuMjkyOTlMMC44NTM0MDggMC4xNDYzOTZDMC43NTk2NDMgMC4wNTI2NTg2IDAuNjMyNDg3IDAgMC40OTk5MDIgMEMwLjM2NzMxOCAwIDAuMjQwMTYxIDAuMDUyNjU4NiAwLjE0NjM5NiAwLjE0NjM5NkMwLjA1MjY1ODYgMC4yNDAxNjEgMCAwLjM2NzMxOCAwIDAuNDk5OTAyQzAgMC42MzI0ODcgMC4wNTI2NTg2IDAuNzU5NjQzIDAuMTQ2Mzk2IDAuODUzNDA4TDUuMjkyOTkgNkwwLjE0NjM5NiAxMS4xNDY2QzAuMDUyNjU4NiAxMS4yNDA0IDAgMTEuMzY3NSAwIDExLjUwMDFDMCAxMS42MzI3IDAuMDUyNjU4NiAxMS43NTk4IDAuMTQ2Mzk2IDExLjg1MzZDMC4yNDAxNjEgMTEuOTQ3MyAwLjM2NzMxOCAxMiAwLjQ5OTkwMiAxMkMwLjYzMjQ4NyAxMiAwLjc1OTY0MyAxMS45NDczIDAuODUzNDA4IDExLjg1MzZMNiA2LjcwNzAxTDExLjE0NjYgMTEuODUzNkMxMS4yNDA0IDExLjk0NzMgMTEuMzY3NSAxMiAxMS41MDAxIDEyQzExLjYzMjcgMTIgMTEuNzU5OCAxMS45NDczIDExLjg1MzYgMTEuODUzNkMxMS45NDczIDExLjc1OTggMTIgMTEuNjMyNyAxMiAxMS41MDAxQzEyIDExLjM2NzUgMTEuOTQ3MyAxMS4yNDA0IDExLjg1MzYgMTEuMTQ2Nkw2LjcwNzAxIDZMMTEuODUzNiAwLjg1MzQwOEMxMS45NDczIDAuNzU5NjQzIDEyIDAuNjMyNDg3IDEyIDAuNDk5OTAyQzEyIDAuMzY3MzE4IDExLjk0NzMgMC4yNDAxNjEgMTEuODUzNiAwLjE0NjM5NloiIGZpbGw9IiMzNzQyNDciLz4KPC9zdmc+Cg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTExLjY2NjcgMjBDMTEuNDg2NCAyMCAxMS4zMTEgMTkuOTQxNSAxMS4xNjY3IDE5LjgzMzNMNy44MzM0IDE3LjMzMzNDNy43Mjk5IDE3LjI1NTcgNy42NDU5IDE3LjE1NTEgNy41ODgwNCAxNy4wMzkzQzcuNTMwMTkgMTYuOTIzNiA3LjUwMDA2IDE2Ljc5NiA3LjUwMDA2IDE2LjY2NjdWMTEuOTgzM0wxLjY1MzQgNS40MDU4M0MxLjIzODE3IDQuOTM3MzkgMC45NjcwNDggNC4zNTkwMSAwLjg3MjYzMiAzLjc0MDE5QzAuNzc4MjE2IDMuMTIxMzcgMC44NjQ1MTkgMi40ODg0NSAxLjEyMTE3IDEuOTE3NUMxLjM3NzgyIDEuMzQ2NTYgMS43OTM4OSAwLjg2MTg3NSAyLjMxOTM4IDAuNTIxNzE0QzIuODQ0ODcgMC4xODE1NTMgMy40NTc0MiAwLjAwMDM4NzcyIDQuMDgzNCAtNy42MjkzOWUtMDZMMTUuOTE2NyAtNy42MjkzOWUtMDZDMTYuNTQyNyAwLjAwMDcyNjU4IDE3LjE1NTEgMC4xODIxOTIgMTcuNjgwMyAwLjUyMjU4MUMxOC4yMDU2IDAuODYyOTcxIDE4LjYyMTQgMS4zNDc4IDE4Ljg3NzggMS45MTg4MUMxOS4xMzQyIDIuNDg5ODIgMTkuMjIwMiAzLjEyMjcyIDE5LjEyNTUgMy43NDE0NUMxOS4wMzA5IDQuMzYwMTggMTguNzU5NiA0LjkzODQxIDE4LjM0NDIgNS40MDY2NkwxMi41MDAxIDExLjk4MzNWMTkuMTY2N0MxMi41MDAxIDE5LjM4NzcgMTIuNDEyMyAxOS41OTk2IDEyLjI1NiAxOS43NTU5QzEyLjA5OTcgMTkuOTEyMiAxMS44ODc3IDIwIDExLjY2NjcgMjBaTTkuMTY2NzMgMTYuMjVMMTAuODMzNCAxNy41VjExLjY2NjdDMTAuODMzNiAxMS40NjI2IDEwLjkwODYgMTEuMjY1NyAxMS4wNDQyIDExLjExMzNMMTcuMTAwOSA0LjI5OTE2QzE3LjMwMjkgNC4wNzA4OSAxNy40MzQ2IDMuNzg5MTkgMTcuNDgwNCAzLjQ4Nzg3QzE3LjUyNjIgMy4xODY1NSAxNy40ODQxIDIuODc4NDEgMTcuMzU5IDIuNjAwNDZDMTcuMjM0IDIuMzIyNSAxNy4wMzE0IDIuMDg2NTQgMTYuNzc1NiAxLjkyMDlDMTYuNTE5NyAxLjc1NTI2IDE2LjIyMTUgMS42NjY5OCAxNS45MTY3IDEuNjY2NjZINC4wODM0QzMuNzc4NzcgMS42NjcxMiAzLjQ4MDc1IDEuNzU1NDUgMy4yMjUwNyAxLjkyMTA1QzIuOTY5MzkgMi4wODY2NSAyLjc2NjkgMi4zMjI0OSAyLjY0MTkgMi42MDAyOEMyLjUxNjkgMi44NzgwOCAyLjQ3NDY5IDMuMTg2MDQgMi41MjAzNCAzLjQ4NzIzQzIuNTY1OTggMy43ODg0MSAyLjY5NzU0IDQuMDcwMDQgMi44OTkyMyA0LjI5ODMzTDguOTU2NzMgMTEuMTEzM0M5LjA5MjA4IDExLjI2NTkgOS4xNjY3OSAxMS40NjI3IDkuMTY2NzMgMTEuNjY2N1YxNi4yNVoiIGZpbGw9IiMzNzQyNDciLz4KPC9zdmc+Cg==\"","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { BaseSyntheticEvent, useState, useEffect } from 'react';\nimport { LayoutAuth } from 'layouts';\nimport { useNavigate } from 'react-router-dom';\nimport { FormField, Button } from '@newwealth/component-library';\nimport useAuth from 'shared/customHooks/useAuth';\nimport RestClient from 'shared/services/rest.svc';\nimport {\n  GoogleReCaptchaProvider,\n  GoogleReCaptcha,\n  // useGoogleReCaptcha\n} from 'react-google-recaptcha-v3';\nimport { toast } from 'react-toastify';\nimport ReactLoading from 'react-loading';\n\nconst captchaKey = process.env.REACT_APP_RECAPTCHA_KEY;\nconst endpoint = process.env.REACT_APP_AUTH;\nlet interval: any = null;\n\nfunction LoginPage() {\n  const navigate = useNavigate();\n  const { auth } = useAuth();\n  const [tokenCaptcha, setTokenCaptcha] = useState('');\n  const [refreshReCaptcha, setRefreshReCaptcha] = useState(false);\n  const [timer, setTimer] = useState(120);\n  const [email, setEmail] = useState('');\n  const [isProcessing, setIsProcessing] = useState(false);\n\n  useEffect(() => {\n    if (auth) navigate('/');\n  }, [auth]);\n\n  const resendCodeDuration = () => {\n    interval = setInterval(() => {\n      setTimer((prevState) => prevState - 1);\n    }, 1000);\n  };\n\n  // Get new google token after 2 mins\n  useEffect(() => {\n    resendCodeDuration();\n\n    if (timer === 0) {\n      setRefreshReCaptcha((r) => !r);\n      clearInterval(interval);\n      setTimer(120);\n    }\n\n    return () => {\n      clearInterval(interval);\n    };\n  }, [timer]);\n\n  const isValidEmail = (email: string) => {\n    return /\\S+@\\S+\\.\\S+/.test(email);\n  };\n\n  const onHandleSubmit = async (e: BaseSyntheticEvent) => {\n    e.preventDefault();\n\n    if (!isValidEmail(email)) {\n      toast.error('Invalid email address!');\n      return;\n    }\n    try {\n      setIsProcessing(true);\n      const res = await RestClient.post(\n        `${endpoint}/auth/otp?email=${email}&g-recaptcha-response=${tokenCaptcha}`\n      );\n      // console.log('res :: ', res, res.data);\n      if (res.data) {\n        navigate('/otp', { state: { email, session: res.data } });\n      }\n    } catch (err) {\n      console.log(err);\n      toast.error('Unauthorised email address!');\n    } finally {\n      setIsProcessing(false);\n    }\n  };\n\n  const handleVerify = React.useCallback((tokenArg: any) => {\n    // console.log('google captcha ', tokenArg);\n    setTokenCaptcha(tokenArg);\n  }, []);\n\n  return (\n    <GoogleReCaptchaProvider\n      reCaptchaKey={captchaKey}\n      useRecaptchaNet\n      scriptProps={{ async: true, defer: true, appendTo: 'body' }}\n    >\n      <form onSubmit={onHandleSubmit} className=\"form-login\">\n        <div className=\"form-login__element\">\n          <FormField>\n            <FormField.Label>Email Address</FormField.Label>\n            <FormField.Input\n              name=\"email\"\n              autoComplete=\"off\"\n              required\n              onChange={(e: BaseSyntheticEvent) => setEmail(e.target.value)}\n            />\n          </FormField>\n        </div>\n\n        <div className=\"form-login__element form-login__element--action\">\n          <Button type=\"submit\" variant=\"primary\" disabled={isProcessing || !isValidEmail(email)}>\n            {isProcessing ? <ReactLoading type=\"spin\" height=\"18px\" width=\"18px\" /> : 'Log in'}\n          </Button>\n          {/* <Link to={PATH.REQ_RESET}>Forgot password?</Link> */}\n        </div>\n        <GoogleReCaptcha onVerify={handleVerify} refreshReCaptcha={refreshReCaptcha} />\n      </form>\n    </GoogleReCaptchaProvider>\n  );\n}\n\nexport default LayoutAuth(LoginPage);\n","import React, { useEffect, useState } from 'react';\nimport { Typography } from '@newwealth/component-library';\n\ntype Props = {\n  onHandleResendOTP: () => void;\n};\n\nexport default function OtpCounter({ onHandleResendOTP }: Props) {\n  const [counter, setCounter] = useState(60);\n\n  useEffect(() => {\n    if (counter === 0) return;\n    setTimeout(() => {\n      setCounter(counter - 1);\n    }, 1000);\n  }, [counter]);\n\n  const onResend = () => {\n    onHandleResendOTP();\n    setCounter(60);\n  };\n\n  return (\n    <Typography\n      type=\"paragraph\"\n      textAlign=\"center\"\n      value={\n        <>\n          <span>Didn’t receive it? </span>\n          {counter > 0 ? (\n            <span style={{ cursor: 'unset' }}>\n              Resend new code in {counter === 60 ? 1 : 0}:\n              {counter === 60 ? '00' : counter > 9 ? counter : `0${counter}`}\n            </span>\n          ) : (\n            <strong className=\"button-link\" onClick={onResend}>\n              Resend new code\n            </strong>\n          )}\n        </>\n      }\n    />\n  );\n}\n","import React, { useEffect, useState } from 'react';\nimport { LayoutAuth } from 'layouts';\nimport { FormField, Typography } from '@newwealth/component-library';\nimport { useLocation, Navigate, useNavigate } from 'react-router-dom';\nimport { toast } from 'react-toastify';\nimport OtpCounter from 'components/common/OtpCounter/OtpCounter';\nimport useAuth from 'shared/customHooks/useAuth';\nimport RestClient from 'shared/services/rest.svc';\n\nconst endpoint = process.env.REACT_APP_AUTH;\n\nfunction Otp() {\n  const navigate = useNavigate();\n  const location = useLocation();\n  const { auth, setAuth } = useAuth();\n  const [session, setSession] = useState(location.state?.session);\n  const [isResendOtp, setResendOtp] = useState(false);\n\n  useEffect(() => {\n    // if (auth.authState?.accessToken) navigate('/home');\n    if (auth) navigate('/');\n  }, [auth]);\n\n  const onSubmit = async (val: string) => {\n    try {\n      const res = await RestClient.post(`${endpoint}/auth/2-factor?otp=${val}&session=${session}`);\n      if (res) {\n        const token = res.data;\n        setAuth(token);\n        navigate('/');\n      }\n    } catch (err) {\n      console.log('err', err);\n      if (isResendOtp) navigate('/');\n      toast.error('Invalid OTP');\n    }\n  };\n\n  const onHandleResendOTP = async () => {\n    try {\n      const res = await RestClient.post(`${endpoint}/auth/otp/resend?session=${session}`);\n      if (res.data === null) navigate('/');\n      const sessionToken = res.data?.session;\n      setResendOtp(true);\n      if (sessionToken) setSession(sessionToken);\n    } catch (err) {\n      console.error(err);\n      if (err?.status === 401) {\n        toast.error('Unauthorised access!');\n        navigate('/');\n      } else toast.error('Oops, something went wrong. Please try again later.');\n    }\n  };\n\n  if (location.state === null) {\n    return <Navigate to=\"/login\" replace />;\n  }\n\n  return (\n    <form className=\"form-login\">\n      <div className=\"form-login__element\">\n        <Typography\n          type=\"paragraph\"\n          value={\n            <>\n              <span>Enter OTP code sent to your email address:</span>\n              <strong style={{ display: 'block' }}>{location?.state?.email}</strong>\n            </>\n          }\n          textAlign=\"center\"\n        />\n      </div>\n\n      <div className=\"form-login__element form-login__element--otp\">\n        <FormField>\n          <FormField.OTP elSize=\"large\" onSubmit={onSubmit} />\n        </FormField>\n      </div>\n\n      <div className=\"form-login__element\">\n        <OtpCounter onHandleResendOTP={onHandleResendOTP} />\n        {/* <Typography\n          type=\"paragraph\"\n          value={\n            <>\n              <span>Didn’t receive it? </span>\n              <strong className=\"button-link\">Resend new code</strong>\n            </>\n          }\n          textAlign=\"center\"\n        /> */}\n      </div>\n    </form>\n  );\n}\n\nexport default LayoutAuth(Otp);\n","// import { lazy } from 'react';\n\nimport Screener from 'pages/Screener';\nimport Detail from 'pages/Detail';\nimport Compare from 'pages/Compare';\nimport Login from 'pages/Auth/Login';\nimport OTP from 'pages/Auth/OTP';\n\n// const ScreenerPage = lazy(() => import('pages/Screener'));\n// const DetailPage = lazy(() => import('pages/Detail'));\n// const ComparePage = lazy(() => import('pages/Compare'));\n\nconst AppRoutes = [\n  {\n    path: '/login',\n    element: Login,\n    isPublic: true,\n  },\n  {\n    path: '/otp',\n    element: OTP,\n    isPublic: true,\n  },\n  {\n    path: '/',\n    element: Screener,\n    isPublic: false,\n  },\n  {\n    path: '/detail',\n    // search: `?ids=`,\n    element: Detail,\n    isPublic: false,\n  },\n  {\n    path: '/compare',\n    element: Compare,\n    isPublic: false,\n  },\n];\n\nexport default AppRoutes;\n","import React from 'react';\nimport { Link } from 'react-router-dom';\n\nconst NotFound = () => {\n  return (\n    <article style={{ padding: '100px' }}>\n      <h1>Oops!</h1>\n      <p>Page Not Found</p>\n      <h3>THIS PAGE IS STILL UNDER CONSTRUCTION!</h3>\n      <div>\n        <Link to=\"/\">Visit Our Homepage</Link>\n      </div>\n    </article>\n  );\n};\n\nexport default NotFound;\n","import { useContext } from 'react';\nimport AuthContext from 'shared/context/AuthProvider';\n\nconst useAuth = () => {\n  return useContext(AuthContext);\n};\n\nexport default useAuth;\n","/* eslint-disable @typescript-eslint/no-empty-function */\nimport React, { createContext, useState, ReactNode, useEffect } from 'react';\nimport { loadAuthState, saveAuthState } from 'shared/services/local.svc';\n\n// export type ResponseAuthType = {\n//   user: string;\n//   email: string;\n//   roles: string[];\n//   accessToken: string | undefined;\n// };\n\nexport type ResponseAuthType = string | undefined;\n\ntype IProviderProps = { children: ReactNode };\ntype AuthType = {\n  auth: ResponseAuthType;\n  setAuth: (arg: any) => void | unknown | any;\n};\n\nconst initialAuthState = '';\n\nconst getInitialState = () => {\n  const state = loadAuthState();\n  return state ? state : initialAuthState;\n};\n\nconst AuthContext = createContext<AuthType>({\n  auth: initialAuthState,\n  setAuth: () => {},\n});\n\nexport const AuthProvider = ({ children }: IProviderProps) => {\n  const [auth, setAuth] = useState(getInitialState);\n\n  useEffect(() => {\n    saveAuthState(auth);\n  }, [auth]);\n\n  return <AuthContext.Provider value={{ auth, setAuth }}>{children}</AuthContext.Provider>;\n};\n\nexport default AuthContext;\n","import React, { memo, useEffect } from 'react';\nimport { Navigate, useLocation } from 'react-router-dom';\nimport useAuth from 'shared/customHooks/useAuth';\nimport { decodeTokenFn } from 'shared/utils/helper.util';\nimport useAxiosAuth from 'shared/customHooks/useAxiosAuth';\nimport { toast } from 'react-toastify';\n\ninterface IProtectedRoute {\n  allowedRoles: string[];\n  children: React.ReactNode;\n}\n\nconst endpoint = process.env.REACT_APP_AUTH;\nconst env = process.env.REACT_APP_ENV_NAME;\n\nfunction ProtectedRoute({ children, allowedRoles }: IProtectedRoute) {\n  const isUat = env === 'uat' || env === 'staging';\n  const axiosAuth = useAxiosAuth();\n  const location = useLocation();\n  const { auth } = useAuth();\n  // const navigate = useNavigate();\n  // console.log('isUat ::: ', isUat);\n  const validateToken = async () => {\n    try {\n      await axiosAuth({\n        method: 'GET',\n        headers: { Authorization: `Bearer ${auth}` },\n        url: `${endpoint}/authenticated`,\n      });\n      // console.log('validity ', res, res.status);\n    } catch (err) {\n      toast.error('Your session has expired!');\n    }\n  };\n\n  useEffect(() => {\n    if (isUat) validateToken();\n  }, [isUat]);\n  if (isUat && (!auth || auth === '' || auth === undefined))\n    return <Navigate to=\"/login\" replace />;\n\n  const { roles } = isUat && decodeTokenFn(auth as string);\n  // return roles.find((role: string) => allowedRoles?.includes(role)) ? (\n  //   children\n  // ) : isUat ? (\n  //   <Navigate to=\"/login\" state={{ from: location }} replace />\n  // ) : (\n  //   children\n  // );\n\n  if (roles && roles.find((role: string) => allowedRoles?.includes(role))) {\n    return children;\n  }\n\n  if (isUat) {\n    return <Navigate to=\"/login\" state={{ from: location }} replace />;\n  }\n\n  return children;\n}\n\nexport default memo(ProtectedRoute);\n","import { useEffect } from 'react';\nimport RestClient from 'shared/services/rest.svc';\nimport useAuth from 'shared/customHooks/useAuth';\nimport { LOCAL_STORAGE_AUTH_KEY } from 'shared/services/local.svc';\n\nconst useAxiosAuth = () => {\n  const { auth } = useAuth();\n\n  useEffect(() => {\n    const requestIntercept = RestClient.interceptors.request.use(\n      (config) => {\n        if (!config.headers['Authorization']) {\n          config.headers['Authorization'] = `Bearer ${auth}`;\n        }\n        return config;\n      },\n      (error) => Promise.reject(error)\n    );\n\n    const responseIntercept = RestClient.interceptors.response.use(\n      (response) => response,\n      async (error) => {\n        const prevRequest = error?.config;\n        console.log('error?.response?.status ', error?.response?.status, prevRequest?.sent);\n        if (error?.response?.status === 401 && !prevRequest?.sent) {\n          // prevRequest.sent = true;\n          // prevRequest.headers['Authorization'] = `Bearer ${auth}`;\n          // return authRestClient(prevRequest);\n          localStorage.removeItem(LOCAL_STORAGE_AUTH_KEY);\n          window.location.replace('/login');\n        }\n        return Promise.reject(error);\n      }\n    );\n\n    return () => {\n      RestClient.interceptors.request.eject(requestIntercept);\n      RestClient.interceptors.response.eject(responseIntercept);\n    };\n  }, [auth]);\n\n  return RestClient;\n};\n\nexport default useAxiosAuth;\n","/** Add the THEME config here */\nexport const themeConfig = {\n  primaryColor: '#DB0011', // '#743169',\n  primaryTextColor: 'white',\n  secondaryColor: '#000000',\n  secondaryTextColor: '#FFFFFF',\n  tertiaryColor: '#FFFFFF',\n  tertiaryTextColor: '#000000',\n  textColor: '#333333',\n  textInvertedColor: '#FFFFFF',\n  linkColor: '#DB0011',\n  bgGreyLightColor: '#F4F4F4',\n  bgGreyLighterColor: '#FFFFFF',\n  tableHeaderBg: '#D8D8D8',\n  tableHeaderTextColor: '#FFFFFF',\n\n  textSubColor: '#5D6669',\n  textHeadingColor: '#1E2125',\n  borderColor: '#DDDDDD',\n\n  // Typography\n  fontFamily: 'UniversNextforHSBC, Helvetica Neue, Helvetica, Segoe UI, Roboto, Oxygen, sans-serif',\n  fontH1Size: '2.0625rem', //'33px',\n  fontH2Size: '1.4375rem', //'23px',\n  fontH3Size: '1.1875rem', //'19px',\n  fontH4Size: '1.125rem', //'18px',\n  fontH5Size: '1rem', //'16px',\n  fontH6Size: '0.875rem', //'14px',\n  fontH1LineHeight: 1.2, //'40px',\n  fontH2LineHeight: 1.3, //'36px',\n  fontH3LineHeight: 1.4, //'30px',\n  fontH4LineHeight: 1.4, //'27px',\n  fontH5LineHeight: 1.5, //'24px',\n  fontH6LineHeight: 1.5, //'20px',\n\n  fontSmallSize: '0.875rem', //'14px',\n  fontMediumSize: '0.9375rem', //'15px',\n  fontMediumLineHeight: '148%',\n  // fontLargeSize: '',\n\n  /** Spacing */\n  veryLargeSpacing: '44px',\n  baseSpacing: '16px',\n  mediumRadius: '12px',\n  baseRadius: '4px',\n\n  radiusSmall: '0px',\n\n  elementLargeHeight: '48px',\n  elementMediumHeight: '44px',\n\n  compare1: '#8DC52E',\n  compare2: '#00A499',\n  compare3: '#173A64',\n\n  positiveReturn: '#00A546',\n  negativeReturn: '#D0021B',\n\n  textWhiteColor: '#FFFFFF',\n\n  filterButtonColor: '#00A499',\n  filterButtonBgColor: '#CCEDEB',\n  filterButtonBorderColor: '#00A499',\n\n  containerBg: '#FAFAFA',\n\n  formFieldBorderColor: '#767676',\n  textLabelColor: '#333333',\n};\n"],"names":["Screener","_ref","screenerConfig","userId","appInitConfig","props","themeConfig","useContext","ThemeContext","searchParams","useSearchParams","pageQuery","parseInt","get","intl","useIntl","parentRef","useRef","filterShowRef","filterHideRef","filterMobileShowRef","generateUID","useUniqueID","navigate","useNavigate","location","useLocation","windowSize","useWindowSize","wrapperSize","setWrapperSize","useQuery","useState","showFilter","setShowFilter","viewType","setViewType","currentSort","setCurrentSort","hits","setHits","totalFound","setTotalFound","isLastPage","setIsLastPage","isInitDone","setIsInitDone","isSyncDone","setIsSyncDone","bulkSearchResult","setBulkSearchResult","bulkSearchKeywords","setBulkSearchKeywords","isBulkSearchProcesing","setIsBulkSearchProcesing","state","dispatch","useContextFl","FlContext","search_keyword","useContextSelector","getSearchKeyword","selectedFunds","screenerReducer","filterOptions","distribution","iconSize","width","isMobile","isTablet","currentScreenerType","getCurrentScreenerType","currentScreenerParams","getSelectedScreener","currentTemplateTab","getCurrentScreenerTab","typesenseDictionary","getDictionary","userPreferences","getUserPreferences","savedSearches","getSavedSearches","currentSavedSearch","getCurrentSavedSearch","dividendPayingFund","getDividendPayingFund","tempUID","getTemporaryUID","generatedAuthToken","getAuthToken","isTypesenseConfigReady","getIsTypesenseConfigRendered","typesenseConfig","getTypesenseConfig","isComingFromOtherPage","getIsAuthTokenValid","getIsComingFromOtherPage","tempSelectedParams","getTempSelectedParams","isWithBulkSearch","isWithSingleFilterButton","isManualPagination","getManualPagination","config","Array","from","find","item","screenerType","id","withDividendPayingFilter","screenerClasses","classNames","includeRouterRoot","sidebarPosition","useEffect","document","title","undefined","storeTempUid","useLayoutEffect","isEmpty","getTypesenseConfigFromAPI","initializeConfig","getFilterList","then","obj","total","length","Object","keys","filter_by","sort_by","onSaveMultiParams","res","typeSenseSearchReq","assign","q","page","manageSearchKeyword","includes","search_params","field_name","searchWithFacetsMulti","value","hitResults","results","prevState","saveIsComingFromOtherPage","mainWrapperElement","getElementById","clientHeight","height","language","initLanguage","useCallback","params","onNextPage","num","modifiedParams","onLoadMore","savePageNo","toggleFilter","onFilter","values","stateFilterBy","query","saveFilter","onApplySavedSearchFilter","name","onApplySavedSearch","onApplySingleFilter","onSingleFilterFn","onApplySwitchFilter","onSwitchDividendPayingFund","onSearchWithinFilter","onSearchFilterContent","isSearchResultEmpty","React","onClearFilters","clearFilter","onClearSearch","onClearParamsQ","getAdvFilterChips","filter","map","result","hitItem","AmcId","toString","label","BrandingCompanyName","renderTemplateButton","appConfig","withTranslation","templateData","template","idx","DisplayTemplateButton","key","displayTemplate","isCurrent","onClick","_ref2","target","saveCurrentDisplayTemplate","formatMessage","isContainingRecognizedAndUnRecognizedResults","isContainingUnrecognizedResultsOnly","isContainingNoIsins","singleFilterList","icon","RebateIcon","ReadyToTradeIcon","manageCardCount","count","ErrorBoundary","errorMessage","className","ref","style","paddingTop","position","maxWidth","margin","backgroundColor","tertiaryColor","Typography","type","color","linkColor","appearance","border","current","setTimeout","focus","src","alt","icons","filterIcon","top","Switcher","isEnabled","onSwitch","SingleFilterButton","onApply","SavedSearchButton","onDelete","manageId","onRemoveSavedSearch","fieldName","Accordion","isAccordion","isActive","isDisabled","fieldNamme","SearchInput","forFilter","val","placeholder","onClear","onClearFilterSearch","FilterList","options","orderBy","formatNumberWithComma","prefix","getRiskLevelDescByCode","onSelect","selected","getRiskLevelByCode","Button","variant","isOutline","tabIndex","display","alignItems","justifyContent","marginRight","secondaryColor","maxHeight","minWidth","recentViews","isForDemo","defaultValue","keyword","indexOf","saveSearchKeyword","arrayValues","split","onKeyDown","e","code","DragDropFile","message","marginLeft","ReactLoading","number","MyPopover","button","data","onUpload","onBulkSearchUpload","isThereIsins","isinsList","keywordList","join","Chip","list","onClose","size","role","onSwitchManualPagination","window","reload","marginBottom","ViewOption","onChange","CardViewMP","fundData","cardCount","totalResult","showMore","onSelectFund","payload","saveSelectedFund","onMenuSelect","arg1","arg2","withDynamicMenu","totalItems","onPageClick","MobileView","DataTableMP","currentTab","columns","onSort","order","saveToggleSort","DataTable","CardView","convertArrOfObjIntoArrOfArr","NoResult","ScreenerAction","isRelative","onCompare","linkUrl","pathname","onReset","clearSelectedFunds","currentNumber","Disclaimer","content","disclaimer","ToastContainer","Tooltip","LayoutScreener","memo","interval","LayoutAuth","auth","useAuth","tokenCaptcha","setTokenCaptcha","refreshReCaptcha","setRefreshReCaptcha","timer","setTimer","email","setEmail","isProcessing","setIsProcessing","setInterval","r","clearInterval","isValidEmail","test","handleVerify","tokenArg","GoogleReCaptchaProvider","reCaptchaKey","process","useRecaptchaNet","scriptProps","async","defer","appendTo","onSubmit","preventDefault","RestClient","post","session","err","console","log","toast","error","FormField","Label","Input","autoComplete","required","disabled","GoogleReCaptcha","onVerify","OtpCounter","onHandleResendOTP","counter","setCounter","textAlign","cursor","onResend","endpoint","path","element","Login","isPublic","setAuth","setSession","isResendOtp","setResendOtp","Navigate","to","replace","OTP","elSize","token","sessionToken","status","Detail","Compare","NotFound","padding","Link","AuthContext","getInitialState","loadAuthState","createContext","AuthProvider","children","saveAuthState","Provider","ProtectedRoute","allowedRoles","isUat","env","useAxiosAuth","requestIntercept","interceptors","request","use","headers","Promise","reject","responseIntercept","response","prevRequest","sent","localStorage","removeItem","LOCAL_STORAGE_AUTH_KEY","eject","roles","primaryColor","primaryTextColor","secondaryTextColor","tertiaryTextColor","textColor","textInvertedColor","bgGreyLightColor","bgGreyLighterColor","tableHeaderBg","tableHeaderTextColor","textSubColor","textHeadingColor","borderColor","fontFamily","fontH1Size","fontH2Size","fontH3Size","fontH4Size","fontH5Size","fontH6Size","fontH1LineHeight","fontH2LineHeight","fontH3LineHeight","fontH4LineHeight","fontH5LineHeight","fontH6LineHeight","fontSmallSize","fontMediumSize","fontMediumLineHeight","veryLargeSpacing","baseSpacing","mediumRadius","baseRadius","radiusSmall","elementLargeHeight","elementMediumHeight","compare1","compare2","compare3","positiveReturn","negativeReturn","textWhiteColor","filterButtonColor","filterButtonBgColor","filterButtonBorderColor","containerBg","formFieldBorderColor","textLabelColor"],"sourceRoot":""}