App.tsx 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React, { Suspense } from 'react';
  2. import { Routes, Route, Navigate } from 'react-router-dom';
  3. import {
  4. accessErrorPage,
  5. clusterPath,
  6. errorPage,
  7. getNonExactPath,
  8. } from 'lib/paths';
  9. import PageLoader from 'components/common/PageLoader/PageLoader';
  10. import Dashboard from 'components/Dashboard/Dashboard';
  11. import ClusterPage from 'components/Cluster/Cluster';
  12. import { ThemeProvider } from 'styled-components';
  13. import theme from 'theme/theme';
  14. import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
  15. import { showServerError } from 'lib/errorHandling';
  16. import { Toaster } from 'react-hot-toast';
  17. import GlobalCSS from 'components/globalCss';
  18. import * as S from 'components/App.styled';
  19. import ConfirmationModal from './common/ConfirmationModal/ConfirmationModal';
  20. import { ConfirmContextProvider } from './contexts/ConfirmContext';
  21. import { GlobalSettingsProvider } from './contexts/GlobalSettingsContext';
  22. import ErrorPage from './ErrorPage/ErrorPage';
  23. import { UserInfoRolesAccessProvider } from './contexts/UserInfoRolesAccessContext';
  24. import PageContainer from './PageContainer/PageContainer';
  25. const queryClient = new QueryClient({
  26. defaultOptions: {
  27. queries: {
  28. suspense: true,
  29. },
  30. mutations: {
  31. onError(error) {
  32. showServerError(error as Response);
  33. },
  34. },
  35. },
  36. });
  37. const App: React.FC = () => {
  38. return (
  39. <QueryClientProvider client={queryClient}>
  40. <GlobalSettingsProvider>
  41. <ThemeProvider theme={theme}>
  42. <Suspense fallback={<PageLoader />}>
  43. <UserInfoRolesAccessProvider>
  44. <ConfirmContextProvider>
  45. <GlobalCSS />
  46. <S.Layout>
  47. <PageContainer>
  48. <Routes>
  49. {['/', '/ui', '/ui/clusters'].map((path) => (
  50. <Route
  51. key="Home" // optional: avoid full re-renders on route changes
  52. path={path}
  53. element={<Dashboard />}
  54. />
  55. ))}
  56. <Route
  57. path={getNonExactPath(clusterPath())}
  58. element={<ClusterPage />}
  59. />
  60. <Route
  61. path={accessErrorPage}
  62. element={
  63. <ErrorPage status={403} text="Access is Denied" />
  64. }
  65. />
  66. <Route path={errorPage} element={<ErrorPage />} />
  67. <Route
  68. path="*"
  69. element={<Navigate to={errorPage} replace />}
  70. />
  71. </Routes>
  72. </PageContainer>
  73. <Toaster position="bottom-right" />
  74. </S.Layout>
  75. <ConfirmationModal />
  76. </ConfirmContextProvider>
  77. </UserInfoRolesAccessProvider>
  78. </Suspense>
  79. </ThemeProvider>
  80. </GlobalSettingsProvider>
  81. </QueryClientProvider>
  82. );
  83. };
  84. export default App;