ObservabilityLayout.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { IS_PLATFORM, LOCAL_STORAGE_KEYS, useParams } from 'common'
  2. import { usePathname } from 'next/navigation'
  3. import { PropsWithChildren, useEffect, useRef } from 'react'
  4. import { ProjectLayout } from '../ProjectLayout'
  5. import ObservabilityMenu from './ObservabilityMenu'
  6. import { useIndexAdvisorStatus } from '@/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus'
  7. import { BannerIndexAdvisor } from '@/components/ui/BannerStack/Banners/BannerIndexAdvisor'
  8. import { BannerMetricsAPI } from '@/components/ui/BannerStack/Banners/BannerMetricsAPI'
  9. import { useBannerStack } from '@/components/ui/BannerStack/BannerStackProvider'
  10. import { UnknownInterface } from '@/components/ui/UnknownInterface'
  11. import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
  12. import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage'
  13. import { withAuth } from '@/hooks/misc/withAuth'
  14. interface ObservabilityLayoutProps {
  15. title: string
  16. }
  17. const ObservabilityLayoutContent = ({
  18. title,
  19. children,
  20. }: PropsWithChildren<ObservabilityLayoutProps>) => {
  21. const { ref } = useParams()
  22. const pathname = usePathname()
  23. const { addBanner, dismissBanner } = useBannerStack()
  24. const { isIndexAdvisorAvailable, isIndexAdvisorEnabled } = useIndexAdvisorStatus()
  25. const [isMetricsBannerDismissed] = useLocalStorageQuery(
  26. LOCAL_STORAGE_KEYS.OBSERVABILITY_BANNER_DISMISSED(ref ?? ''),
  27. false
  28. )
  29. const [isIndexAdvisorBannerDismissed] = useLocalStorageQuery(
  30. LOCAL_STORAGE_KEYS.INDEX_ADVISOR_NOTICE_DISMISSED(ref ?? ''),
  31. false
  32. )
  33. useEffect(() => {
  34. if (!isMetricsBannerDismissed && IS_PLATFORM) {
  35. addBanner({
  36. id: 'metrics-api-banner',
  37. isDismissed: false,
  38. content: <BannerMetricsAPI />,
  39. priority: 1,
  40. })
  41. } else {
  42. dismissBanner('metrics-api-banner')
  43. }
  44. }, [isMetricsBannerDismissed, addBanner, dismissBanner])
  45. const prevPathnameRef = useRef(pathname)
  46. useEffect(() => {
  47. const isQueryPerformancePage = pathname?.includes('/query-performance')
  48. if (
  49. isQueryPerformancePage &&
  50. isIndexAdvisorAvailable &&
  51. !isIndexAdvisorEnabled &&
  52. !isIndexAdvisorBannerDismissed
  53. ) {
  54. addBanner({
  55. id: 'index-advisor-banner',
  56. isDismissed: false,
  57. content: <BannerIndexAdvisor />,
  58. priority: 3,
  59. })
  60. } else if (isIndexAdvisorBannerDismissed || !isQueryPerformancePage || isIndexAdvisorEnabled) {
  61. dismissBanner('index-advisor-banner')
  62. }
  63. prevPathnameRef.current = pathname
  64. }, [
  65. pathname,
  66. isIndexAdvisorAvailable,
  67. isIndexAdvisorEnabled,
  68. isIndexAdvisorBannerDismissed,
  69. addBanner,
  70. dismissBanner,
  71. ])
  72. const { reportsAll } = useIsFeatureEnabled(['reports:all'])
  73. if (reportsAll) {
  74. return (
  75. <ProjectLayout
  76. product="Observability"
  77. browserTitle={{ section: title }}
  78. productMenu={<ObservabilityMenu />}
  79. isBlocking={false}
  80. >
  81. {children}
  82. </ProjectLayout>
  83. )
  84. } else {
  85. return <UnknownInterface urlBack={`/project/${ref}`} />
  86. }
  87. }
  88. const ObservabilityLayout = (props: PropsWithChildren<ObservabilityLayoutProps>) => {
  89. const { ref } = useParams()
  90. const { reportsAll } = useIsFeatureEnabled(['reports:all'])
  91. if (reportsAll) {
  92. return <ObservabilityLayoutContent {...props} />
  93. } else {
  94. return <UnknownInterface urlBack={`/project/${ref}`} />
  95. }
  96. }
  97. export default withAuth(ObservabilityLayout)