import { PermissionAction } from '@supabase/shared-types/out/constants' import { useLocalStorage } from '@uidotdev/usehooks' import { ArrowUpRight, Edit } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useState } from 'react' import { useParams } from 'common' import CreateBucketModal from 'components/interfaces/Storage/CreateBucketModal' import EditBucketModal from 'components/interfaces/Storage/EditBucketModal' import type { StorageBucket } from 'components/interfaces/Storage/Storage.types' import { DeleteBucketModal } from 'components/to-be-cleaned/Storage' import { EmptyBucketModal } from 'components/to-be-cleaned/Storage/EmptyBucketModal' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import ShimmeringLoader from 'components/ui/ShimmeringLoader' import { useBucketsQuery } from 'data/storage/buckets-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedProject } from 'hooks/misc/useSelectedProject' import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Menu } from 'ui' import { InnerSideBarEmptyPanel, InnerSideBarFilters, InnerSideBarFilterSearchInput, InnerSideBarFilterSortDropdown, InnerSideBarFilterSortDropdownItem, } from 'ui-patterns/InnerSideMenu' import BucketRow from './BucketRow' const StorageMenu = () => { const router = useRouter() const { ref, bucketId } = useParams() const projectDetails = useSelectedProject() const isBranch = projectDetails?.parent_project_ref !== undefined const [searchText, setSearchText] = useState('') const [showCreateBucketModal, setShowCreateBucketModal] = useState(false) const [selectedBucketToEdit, setSelectedBucketToEdit] = useState() const [selectedBucketToEmpty, setSelectedBucketToEmpty] = useState() const [selectedBucketToDelete, setSelectedBucketToDelete] = useState() const canCreateBuckets = useCheckPermissions(PermissionAction.STORAGE_WRITE, '*') const [sort, setSort] = useLocalStorage<'alphabetical' | 'created-at'>( 'storage-explorer-sort', 'created-at' ) const page = router.pathname.split('/')[4] as | undefined | 'policies' | 'settings' | 'usage' | 'logs' const { data: buckets = [], error, isLoading, isError, isSuccess, } = useBucketsQuery({ projectRef: ref }) const sortedBuckets = sort === 'alphabetical' ? buckets.sort((a, b) => a.name.toLowerCase().trim().localeCompare(b.name.toLowerCase().trim()) ) : buckets.sort((a, b) => (new Date(b.created_at) > new Date(a.created_at) ? -1 : 1)) const filteredBuckets = searchText.length > 1 ? sortedBuckets.filter((bucket) => bucket.name.includes(searchText.trim())) : sortedBuckets const tempNotSupported = error?.message.includes('Tenant config') && isBranch return ( <>
} disabled={!canCreateBuckets} style={{ justifyContent: 'start' }} onClick={() => setShowCreateBucketModal(true)} tooltip={{ content: { side: 'bottom', text: !canCreateBuckets ? 'You need additional permissions to create buckets' : undefined, }, }} > New bucket { setSearchText(e.target.value) }} > setSort(value)} > Alphabetical Created at
All buckets} /> {isLoading && (
)} {isError && (
{tempNotSupported ? 'Storage is not available on preview branches for now' : 'Failed to fetch buckets'} {tempNotSupported ? "We're actively looking into making this available on preview branches" : 'Please refresh to try again'}
)} {isSuccess && ( <> {buckets.length === 0 && ( )} {searchText.length > 0 && filteredBuckets.length === 0 && ( )} {filteredBuckets.map((bucket, idx: number) => { const isSelected = bucketId === bucket.id return ( setSelectedBucketToEmpty(bucket)} onSelectDeleteBucket={() => setSelectedBucketToDelete(bucket)} onSelectEditBucket={() => setSelectedBucketToEdit(bucket)} /> ) })} )}
Configuration} />

Policies

Settings

setShowCreateBucketModal(false)} /> setSelectedBucketToEdit(undefined)} /> setSelectedBucketToEmpty(undefined)} /> setSelectedBucketToDelete(undefined)} /> ) } export default StorageMenu