project-list-root.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { ReactNode, useEffect } from 'react'
  2. import {
  3. ProjectListProvider,
  4. useProjectListContext,
  5. } from '../context/project-list-context'
  6. import { SplitTestProvider } from '@/shared/context/split-test-context'
  7. import { ColorPickerProvider } from '../context/color-picker-context'
  8. import * as eventTracking from '../../../infrastructure/event-tracking'
  9. import { useTranslation } from 'react-i18next'
  10. import useWaitForI18n from '../../../shared/hooks/use-wait-for-i18n'
  11. import LoadingBranded from '../../../shared/components/loading-branded'
  12. import SystemMessages from '../../../shared/components/system-messages'
  13. import withErrorBoundary from '../../../infrastructure/error-boundary'
  14. import { GenericErrorBoundaryFallback } from '@/shared/components/generic-error-boundary-fallback'
  15. import getMeta from '@/utils/meta'
  16. import DefaultNavbar from '@/features/ui/components/bootstrap-5/navbar/default-navbar'
  17. import Footer from '@/features/ui/components/bootstrap-5/footer/footer'
  18. import WelcomePageContent from '@/features/project-list/components/welcome-page-content'
  19. import { ProjectListDsNav } from '@/features/project-list/components/project-list-ds-nav'
  20. import { DsNavStyleProvider } from '@/features/project-list/components/use-is-ds-nav'
  21. function ProjectListRoot() {
  22. const { isReady } = useWaitForI18n()
  23. if (!isReady) {
  24. return null
  25. }
  26. return <ProjectListRootInner />
  27. }
  28. export function ProjectListRootInner() {
  29. return (
  30. <ProjectListProvider>
  31. <ColorPickerProvider>
  32. <SplitTestProvider>
  33. <ProjectListPageContent />
  34. </SplitTestProvider>
  35. </ColorPickerProvider>
  36. </ProjectListProvider>
  37. )
  38. }
  39. function DefaultNavbarAndFooter({ children }: { children: ReactNode }) {
  40. const navbarProps = getMeta('ol-navbar')
  41. const footerProps = getMeta('ol-footer')
  42. return (
  43. <>
  44. <DefaultNavbar {...navbarProps} />
  45. <main
  46. id="main-content"
  47. className="content content-alt project-list-react"
  48. >
  49. {children}
  50. </main>
  51. <Footer {...footerProps} />
  52. </>
  53. )
  54. }
  55. function DefaultPageContentWrapper({ children }: { children: ReactNode }) {
  56. return (
  57. <DefaultNavbarAndFooter>
  58. <SystemMessages />
  59. <div className="project-list-wrapper">{children}</div>
  60. </DefaultNavbarAndFooter>
  61. )
  62. }
  63. function ProjectListPageContent() {
  64. const { totalProjectsCount, isLoading, loadProgress } =
  65. useProjectListContext()
  66. useEffect(() => {
  67. eventTracking.sendMB('loads_v2_dash', {})
  68. }, [])
  69. const { t } = useTranslation()
  70. if (isLoading) {
  71. const loadingComponent = (
  72. <LoadingBranded loadProgress={loadProgress} label={t('loading')} />
  73. )
  74. return loadingComponent
  75. }
  76. if (totalProjectsCount === 0) {
  77. return (
  78. <DefaultPageContentWrapper>
  79. <WelcomePageContent />
  80. </DefaultPageContentWrapper>
  81. )
  82. }
  83. return (
  84. <DsNavStyleProvider>
  85. <ProjectListDsNav />
  86. </DsNavStyleProvider>
  87. )
  88. }
  89. export default withErrorBoundary(ProjectListRoot, GenericErrorBoundaryFallback)