Skip to content

Commit ca4b3bc

Browse files
authored
Refactor Storage Create/Edit/Empty/Delete Modals to use Shadcn components (supabase#37517)
* Refactor `StorageMenu` modals to replace deprecated patterns * add test for `DeleteBucketModal` and update test setup Note: Because this component uses `useParams`, it's necessary to have the dynamic route segment passed to `next-router-mock`'s `createDynamicRouteParser`. In order not to have to manually list all of these as the application grows, I added a glob utility that uses the `pages/` directory to automatically generate an array of dynamic route paths in this case. * add test for `EmptyBucketModal` * add test for `EditBucketModal` and add `isNonNullable` utility function * add test for `CreateBucketModal` * implement requested changes * implement visual fixes
1 parent b6b906c commit ca4b3bc

13 files changed

+1361
-648
lines changed

apps/studio/components/interfaces/Storage/BucketRow.tsx

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
import { useState } from 'react'
12
import { PermissionAction } from '@supabase/shared-types/out/constants'
2-
import { noop } from 'lodash'
33
import { Columns3, Edit2, MoreVertical, Trash, XCircle } from 'lucide-react'
44
import Link from 'next/link'
55

66
import type { Bucket } from 'data/storage/buckets-query'
7-
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
7+
import { useAsyncCheckProjectPermissions } from 'hooks/misc/useCheckPermissions'
8+
import EditBucketModal from 'components/interfaces/Storage/EditBucketModal'
9+
import DeleteBucketModal from 'components/interfaces/Storage/DeleteBucketModal'
10+
import EmptyBucketModal from 'components/interfaces/Storage/EmptyBucketModal'
811
import {
912
Badge,
1013
Button,
@@ -23,20 +26,15 @@ export interface BucketRowProps {
2326
bucket: Bucket
2427
projectRef?: string
2528
isSelected: boolean
26-
onSelectEmptyBucket: () => void
27-
onSelectDeleteBucket: () => void
28-
onSelectEditBucket: () => void
2929
}
3030

31-
const BucketRow = ({
32-
bucket,
33-
projectRef = '',
34-
isSelected = false,
35-
onSelectEmptyBucket = noop,
36-
onSelectDeleteBucket = noop,
37-
onSelectEditBucket = noop,
38-
}: BucketRowProps) => {
39-
const canUpdateBuckets = useCheckPermissions(PermissionAction.STORAGE_WRITE, '*')
31+
const BucketRow = ({ bucket, projectRef = '', isSelected = false }: BucketRowProps) => {
32+
const { can: canUpdateBuckets } = useAsyncCheckProjectPermissions(
33+
PermissionAction.STORAGE_WRITE,
34+
'*'
35+
)
36+
const [modal, setModal] = useState<string | null>(null)
37+
const onClose = () => setModal(null)
4038

4139
return (
4240
<div
@@ -84,7 +82,7 @@ const BucketRow = ({
8482
<DropdownMenuItem
8583
key="toggle-private"
8684
className="space-x-2"
87-
onClick={() => onSelectEditBucket()}
85+
onClick={() => setModal(`edit`)}
8886
>
8987
<Edit2 size={14} />
9088
<p>Edit bucket</p>
@@ -93,7 +91,7 @@ const BucketRow = ({
9391
<DropdownMenuItem
9492
key="empty-bucket"
9593
className="space-x-2"
96-
onClick={() => onSelectEmptyBucket()}
94+
onClick={() => setModal(`empty`)}
9795
>
9896
<XCircle size={14} />
9997
<p>Empty bucket</p>
@@ -103,7 +101,7 @@ const BucketRow = ({
103101
<DropdownMenuItem
104102
key="delete-bucket"
105103
className="space-x-2"
106-
onClick={() => onSelectDeleteBucket()}
104+
onClick={() => setModal(`delete`)}
107105
>
108106
<Trash size={14} />
109107
<p>Delete bucket</p>
@@ -113,6 +111,10 @@ const BucketRow = ({
113111
) : (
114112
<div className="w-7 mr-1" />
115113
)}
114+
115+
<EditBucketModal visible={modal === `edit`} bucket={bucket} onClose={onClose} />
116+
<EmptyBucketModal visible={modal === `empty`} bucket={bucket} onClose={onClose} />
117+
<DeleteBucketModal visible={modal === `delete`} bucket={bucket} onClose={onClose} />
116118
</div>
117119
)
118120
}

0 commit comments

Comments
 (0)