TableEditorLayout.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { PermissionAction } from '@supabase/shared-types/out/constants'
  2. import { LOCAL_STORAGE_KEYS, useParams } from 'common'
  3. import { PropsWithChildren, useEffect } from 'react'
  4. import { ProjectLayoutWithAuth } from '../ProjectLayout'
  5. import { SaveQueueActionBar } from '@/components/grid/components/footer/operations/SaveQueueActionBar'
  6. import { useIsQueueOperationsEnabled } from '@/components/interfaces/Account/Preferences/useDashboardSettings'
  7. import { BannerTableEditorQueueOperations } from '@/components/ui/BannerStack/Banners/BannerTableEditorQueueOperations'
  8. import { useBannerStack } from '@/components/ui/BannerStack/BannerStackProvider'
  9. import NoPermission from '@/components/ui/NoPermission'
  10. import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
  11. import { useLocalStorageQuery } from '@/hooks/misc/useLocalStorage'
  12. export const TableEditorLayout = ({ children }: PropsWithChildren<{}>) => {
  13. const { ref } = useParams()
  14. const { addBanner, dismissBanner } = useBannerStack()
  15. const isTableQueueOperationsEnabled = useIsQueueOperationsEnabled()
  16. const [isTableEditorQueueOperationsBannerDismissed] = useLocalStorageQuery(
  17. LOCAL_STORAGE_KEYS.TABLE_EDITOR_QUEUE_OPERATIONS_BANNER_DISMISSED(ref ?? ''),
  18. false
  19. )
  20. const { can: canReadTables, isSuccess: isPermissionsLoaded } = useAsyncCheckPermissions(
  21. PermissionAction.TENANT_SQL_ADMIN_READ,
  22. 'tables'
  23. )
  24. const { can: canWriteTables } = useAsyncCheckPermissions(
  25. PermissionAction.TENANT_SQL_ADMIN_WRITE,
  26. 'tables'
  27. )
  28. useEffect(() => {
  29. if (!isPermissionsLoaded) return
  30. if (
  31. canWriteTables &&
  32. !isTableEditorQueueOperationsBannerDismissed &&
  33. !isTableQueueOperationsEnabled
  34. ) {
  35. addBanner({
  36. id: 'table-editor-queue-operations-banner',
  37. priority: 2,
  38. isDismissed: false,
  39. content: <BannerTableEditorQueueOperations />,
  40. })
  41. } else {
  42. dismissBanner('table-editor-queue-operations-banner')
  43. }
  44. return () => {
  45. dismissBanner('table-editor-queue-operations-banner')
  46. }
  47. }, [
  48. addBanner,
  49. dismissBanner,
  50. isPermissionsLoaded,
  51. canWriteTables,
  52. isTableEditorQueueOperationsBannerDismissed,
  53. isTableQueueOperationsEnabled,
  54. ])
  55. if (isPermissionsLoaded && !canReadTables) {
  56. return (
  57. <ProjectLayoutWithAuth isBlocking={false}>
  58. <NoPermission isFullPage resourceText="view tables from this project" />
  59. </ProjectLayoutWithAuth>
  60. )
  61. }
  62. return (
  63. <>
  64. {children}
  65. <SaveQueueActionBar />
  66. </>
  67. )
  68. }