Files
supabase/apps/studio/components/interfaces/Database/Wrappers/WrappersDropdown.tsx
Joshen Lim 948a2390fe Final replacements of ui setNotification with toast (#21885)
* Final replacements of ui setNotification with toast

* Rip out UiStore

* Rip out UiStore

* Shift files under authConfigSchema to components/Auth

* Rip out use of observers
2024-03-12 12:56:56 +08:00

88 lines
2.6 KiB
TypeScript

import * as Tooltip from '@radix-ui/react-tooltip'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import Image from 'next/legacy/image'
import Link from 'next/link'
import { Fragment } from 'react'
import { useParams } from 'common'
import { useCheckPermissions } from 'hooks'
import {
Button,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
IconPlus,
} from 'ui'
import { WRAPPERS } from './Wrappers.constants'
interface WrapperDropdownProps {
buttonText?: string
align?: 'center' | 'end'
}
const WrapperDropdown = ({ buttonText = 'Add wrapper', align = 'end' }: WrapperDropdownProps) => {
const { ref } = useParams()
const canManageWrappers = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'wrappers')
if (!canManageWrappers) {
return (
<Tooltip.Root delayDuration={0}>
<Tooltip.Trigger asChild>
<Button disabled type="primary" icon={<IconPlus strokeWidth={1.5} />}>
{buttonText}
</Button>
</Tooltip.Trigger>
<Tooltip.Portal>
<Tooltip.Content side="bottom">
<Tooltip.Arrow className="radix-tooltip-arrow" />
<div
className={[
'rounded bg-alternative py-1 px-2 leading-none shadow',
'border border-background',
].join(' ')}
>
<span className="text-xs text-foreground">
You need additional permissions to add wrappers
</span>
</div>
</Tooltip.Content>
</Tooltip.Portal>
</Tooltip.Root>
)
}
return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button type="primary" icon={<IconPlus strokeWidth={1.5} />}>
{buttonText}
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent side="bottom" align={align}>
{WRAPPERS.map((wrapper, idx) => (
<Fragment key={idx}>
<DropdownMenuItem key={wrapper.name} className="space-x-2" asChild>
<Link
href={`/project/${ref}/database/wrappers/new?type=${wrapper.name.toLowerCase()}`}
>
<Image
src={wrapper.icon}
width={20}
height={20}
alt={`${wrapper.name} wrapper icon`}
/>
<p>{wrapper.label}</p>
</Link>
</DropdownMenuItem>
{idx !== WRAPPERS.length - 1 && <DropdownMenuSeparator />}
</Fragment>
))}
</DropdownMenuContent>
</DropdownMenu>
)
}
export default WrapperDropdown