App.tsx 3.3 KB

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