DatabaseMenu.utils.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import { useParams } from 'common'
  2. import { ArrowUpRight } from 'lucide-react'
  3. import { useIsColumnLevelPrivilegesEnabled } from '@/components/interfaces/App/FeaturePreview/FeaturePreviewContext'
  4. import { useIsETLPrivateAlpha } from '@/components/interfaces/Database/Replication/useIsETLPrivateAlpha'
  5. import type {
  6. ProductMenuGroup,
  7. ProductMenuGroupItem,
  8. } from '@/components/ui/ProductMenu/ProductMenu.types'
  9. import { useDatabaseExtensionsQuery } from '@/data/database-extensions/database-extensions-query'
  10. import { useProjectAddonsQuery } from '@/data/subscriptions/project-addons-query'
  11. import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
  12. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  13. import { IS_PLATFORM } from '@/lib/constants'
  14. import { SHORTCUT_IDS } from '@/state/shortcuts/registry'
  15. const ExternalLinkIcon = <ArrowUpRight strokeWidth={1} className="h-4 w-4" />
  16. export const useGenerateDatabaseMenu = (): ProductMenuGroup[] => {
  17. const { ref } = useParams()
  18. const { data: project } = useSelectedProjectQuery()
  19. const {
  20. databaseReplication: showPgReplicate,
  21. databaseRoles: showRoles,
  22. integrationsWrappers: showWrappers,
  23. } = useIsFeatureEnabled(['database:replication', 'database:roles', 'integrations:wrappers'])
  24. const { data } = useDatabaseExtensionsQuery({
  25. projectRef: project?.ref,
  26. connectionString: project?.connectionString,
  27. })
  28. const { data: addons } = useProjectAddonsQuery({ projectRef: project?.ref })
  29. const pgNetExtensionExists = (data ?? []).some((ext) => ext.name === 'pg_net')
  30. const pitrEnabled = addons?.selected_addons.some((addon) => addon.type === 'pitr') ?? false
  31. const columnLevelPrivileges = useIsColumnLevelPrivilegesEnabled()
  32. const enablePgReplicate = useIsETLPrivateAlpha()
  33. const getDatabaseURL = (path: string) => `/project/${ref}/database/${path}`
  34. return [
  35. {
  36. title: 'Database Management',
  37. items: [
  38. {
  39. name: 'Schema Visualizer',
  40. key: 'schemas',
  41. url: getDatabaseURL('schemas'),
  42. shortcutId: SHORTCUT_IDS.NAV_DATABASE_SCHEMA_VISUALIZER,
  43. },
  44. {
  45. name: 'Tables',
  46. key: 'tables',
  47. url: getDatabaseURL('tables'),
  48. shortcutId: SHORTCUT_IDS.NAV_DATABASE_TABLES,
  49. },
  50. {
  51. name: 'Functions',
  52. key: 'functions',
  53. url: getDatabaseURL('functions'),
  54. shortcutId: SHORTCUT_IDS.NAV_DATABASE_FUNCTIONS,
  55. },
  56. {
  57. name: 'Triggers',
  58. key: 'triggers',
  59. url: getDatabaseURL('triggers/data'),
  60. shortcutId: SHORTCUT_IDS.NAV_DATABASE_TRIGGERS,
  61. },
  62. {
  63. name: 'Enumerated Types',
  64. key: 'types',
  65. url: getDatabaseURL('types'),
  66. shortcutId: SHORTCUT_IDS.NAV_DATABASE_TYPES,
  67. },
  68. {
  69. name: 'Extensions',
  70. key: 'extensions',
  71. url: getDatabaseURL('extensions'),
  72. shortcutId: SHORTCUT_IDS.NAV_DATABASE_EXTENSIONS,
  73. },
  74. {
  75. name: 'Indexes',
  76. key: 'indexes',
  77. url: getDatabaseURL('indexes'),
  78. shortcutId: SHORTCUT_IDS.NAV_DATABASE_INDEXES,
  79. },
  80. {
  81. name: 'Publications',
  82. key: 'publications',
  83. url: getDatabaseURL('publications'),
  84. shortcutId: SHORTCUT_IDS.NAV_DATABASE_PUBLICATIONS,
  85. },
  86. ],
  87. },
  88. {
  89. title: 'Configuration',
  90. items: [
  91. showRoles && {
  92. name: 'Roles',
  93. key: 'roles',
  94. url: getDatabaseURL('roles'),
  95. shortcutId: SHORTCUT_IDS.NAV_DATABASE_ROLES,
  96. },
  97. columnLevelPrivileges && {
  98. name: 'Column Privileges',
  99. key: 'column-privileges',
  100. url: getDatabaseURL('column-privileges'),
  101. shortcutId: SHORTCUT_IDS.NAV_DATABASE_COLUMN_PRIVILEGES,
  102. },
  103. {
  104. name: 'Policies',
  105. key: 'policies',
  106. url: `/project/${ref}/auth/policies`,
  107. rightIcon: ExternalLinkIcon,
  108. },
  109. {
  110. name: 'Settings',
  111. key: 'settings',
  112. url: getDatabaseURL('settings'),
  113. shortcutId: SHORTCUT_IDS.NAV_DATABASE_SETTINGS,
  114. },
  115. ].filter(Boolean) as ProductMenuGroupItem[],
  116. },
  117. {
  118. title: 'Platform',
  119. items: [
  120. IS_PLATFORM &&
  121. showPgReplicate && {
  122. name: 'Replication',
  123. key: 'replication',
  124. url: getDatabaseURL('replication'),
  125. label: enablePgReplicate ? 'New' : undefined,
  126. shortcutId: SHORTCUT_IDS.NAV_DATABASE_REPLICATION,
  127. },
  128. IS_PLATFORM && {
  129. name: 'Backups',
  130. key: 'backups',
  131. url: pitrEnabled ? getDatabaseURL('backups/pitr') : getDatabaseURL('backups/scheduled'),
  132. shortcutId: SHORTCUT_IDS.NAV_DATABASE_BACKUPS,
  133. },
  134. {
  135. name: 'Migrations',
  136. key: 'migrations',
  137. url: getDatabaseURL('migrations'),
  138. shortcutId: SHORTCUT_IDS.NAV_DATABASE_MIGRATIONS,
  139. },
  140. showWrappers && {
  141. name: 'Wrappers',
  142. key: 'wrappers',
  143. url: `/project/${ref}/integrations?category=wrapper`,
  144. rightIcon: ExternalLinkIcon,
  145. },
  146. pgNetExtensionExists && {
  147. name: 'Database Webhooks',
  148. key: 'hooks',
  149. url: `/project/${ref}/integrations/webhooks/overview`,
  150. rightIcon: ExternalLinkIcon,
  151. },
  152. ].filter(Boolean) as ProductMenuGroupItem[],
  153. },
  154. {
  155. title: 'Tools',
  156. items: [
  157. {
  158. name: 'Security Advisor',
  159. key: 'security-advisor',
  160. url: `/project/${ref}/advisors/security`,
  161. rightIcon: ExternalLinkIcon,
  162. },
  163. {
  164. name: 'Performance Advisor',
  165. key: 'performance-advisor',
  166. url: `/project/${ref}/advisors/performance`,
  167. rightIcon: ExternalLinkIcon,
  168. },
  169. {
  170. name: 'Query Performance',
  171. key: 'query-performance',
  172. url: `/project/${ref}/observability/query-performance`,
  173. rightIcon: ExternalLinkIcon,
  174. },
  175. ],
  176. },
  177. ]
  178. }