StorageBucketsLayout.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { IS_PLATFORM, useParams } from 'common'
  2. import Link from 'next/link'
  3. import { usePathname } from 'next/navigation'
  4. import { PropsWithChildren } from 'react'
  5. import { NavMenu, NavMenuItem } from 'ui'
  6. import {
  7. PageHeader,
  8. PageHeaderAside,
  9. PageHeaderDescription,
  10. PageHeaderMeta,
  11. PageHeaderNavigationTabs,
  12. PageHeaderSummary,
  13. PageHeaderTitle,
  14. } from 'ui-patterns/PageHeader'
  15. import { BUCKET_TYPES } from '@/components/interfaces/Storage/Storage.constants'
  16. import { useStorageV2Page } from '@/components/interfaces/Storage/Storage.utils'
  17. import { DocsButton } from '@/components/ui/DocsButton'
  18. export const StorageBucketsLayout = ({
  19. title,
  20. hideSubtitle = false,
  21. children,
  22. }: PropsWithChildren<{ title?: string; hideSubtitle?: boolean }>) => {
  23. const { ref } = useParams()
  24. const pathname = usePathname()
  25. const page = useStorageV2Page()
  26. const config = !!page && page !== 's3' ? BUCKET_TYPES[page] : undefined
  27. const navigationItems =
  28. page === 'files'
  29. ? [
  30. {
  31. label: 'Buckets',
  32. href: `/project/${ref}/storage/files`,
  33. },
  34. ...(IS_PLATFORM
  35. ? [
  36. {
  37. label: 'Settings',
  38. href: `/project/${ref}/storage/files/settings`,
  39. },
  40. ]
  41. : []),
  42. {
  43. label: 'Policies',
  44. href: `/project/${ref}/storage/files/policies`,
  45. },
  46. ]
  47. : []
  48. return (
  49. <>
  50. <PageHeader>
  51. <PageHeaderMeta>
  52. <PageHeaderSummary>
  53. <PageHeaderTitle>{title || (config?.displayName ?? 'Storage')}</PageHeaderTitle>
  54. {!hideSubtitle && (
  55. <PageHeaderDescription>
  56. {config?.description || 'Manage your storage buckets and files.'}
  57. </PageHeaderDescription>
  58. )}
  59. </PageHeaderSummary>
  60. <PageHeaderAside>
  61. {config?.docsUrl && <DocsButton key="docs" href={config.docsUrl} />}
  62. </PageHeaderAside>
  63. </PageHeaderMeta>
  64. {navigationItems.length > 0 && (
  65. <PageHeaderNavigationTabs>
  66. <NavMenu>
  67. {navigationItems.map((item) => (
  68. <NavMenuItem key={item.label} active={pathname === item.href}>
  69. <Link href={item.href}>{item.label}</Link>
  70. </NavMenuItem>
  71. ))}
  72. </NavMenu>
  73. </PageHeaderNavigationTabs>
  74. )}
  75. </PageHeader>
  76. {children}
  77. </>
  78. )
  79. }