import { TooltipContent } from '@radix-ui/react-tooltip'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { MoreVertical, TrashIcon } from 'lucide-react'
import { useState } from 'react'
import { toast } from 'sonner'
import { useParams } from 'common'
import { useIsProjectActive } from 'components/layouts/ProjectLayout/ProjectContext'
import Table from 'components/to-be-cleaned/Table'
import CopyButton from 'components/ui/CopyButton'
import { FormHeader } from 'components/ui/Forms/FormHeader'
import NoPermission from 'components/ui/NoPermission'
import { ProjectPausedAlert } from 'components/ui/ProjectPausedAlert'
import { useCreateWarehouseAccessToken } from 'data/analytics/warehouse-access-tokens-create-mutation'
import { useDeleteWarehouseAccessToken } from 'data/analytics/warehouse-access-tokens-delete-mutation'
import { useWarehouseAccessTokensQuery } from 'data/analytics/warehouse-access-tokens-query'
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
import {
Button,
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
Input,
TooltipTrigger_Shadcn_,
Tooltip_Shadcn_,
cn,
} from 'ui'
import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
import CreateWarehouseAccessToken from './CreateWarehouseAccessToken'
const AccessTokenItem = ({
token,
id,
description,
onDeleteClick,
inserted_at,
}: {
token: string
id: number
description: string
inserted_at: string
onDeleteClick: (id: number) => void
}) => {
const formattedInsertedAt = new Date(inserted_at).toLocaleString()
const canDeleteAccessTokens = useCheckPermissions(PermissionAction.ANALYTICS_WRITE, 'logflare')
return (
{description}
{formattedInsertedAt}
{
if (canDeleteAccessTokens) {
e.preventDefault()
onDeleteClick(id)
}
}}
>
Revoke token
{!canDeleteAccessTokens && (
You need additional permissions to delete access tokens
)}
)
}
export const WarehouseAccessTokens = () => {
const isProjectActive = useIsProjectActive()
const params = useParams()
const projectRef = params.ref as string
const [open, setOpen] = useState(false)
const canReadAccessTokens = useCheckPermissions(PermissionAction.ANALYTICS_WRITE, 'logflare')
const accessTokensQuery = useWarehouseAccessTokensQuery(
{ projectRef },
{ enabled: canReadAccessTokens }
)
const hasAccessTokens = accessTokensQuery.isSuccess && accessTokensQuery.data.data.length > 0
const [tokenToDelete, setTokenToDelete] = useState(null)
const [showDeleteDialog, setShowDeleteDialog] = useState(false)
const { mutate: deleteWarehouseAccessToken, isLoading: deleteLoading } =
useDeleteWarehouseAccessToken({
onSuccess: () => {
toast.success('Access token revoked')
},
onError: () => {
toast.error('Failed to revoke access token')
},
})
const { mutate: createWarehouseAccessToken, isLoading: createLoading } =
useCreateWarehouseAccessToken({
onSuccess: () => {
toast.success('Access token created')
setOpen(false)
},
})
const isLoading = deleteLoading || createLoading
return (
{
createWarehouseAccessToken({
ref: projectRef,
description: description,
})
}}
/>
}
/>
{!canReadAccessTokens ? (
) : (
{!isProjectActive ? (
) : (
<>
{accessTokensQuery.isLoading ? (
) : (
Description,
Created at,
Token,
,
]}
body={
hasAccessTokens ? (
accessTokensQuery.data.data.map((accessToken) => (
{
setShowDeleteDialog(true)
setTokenToDelete(accessToken.token)
}}
/>
))
) : (
No access tokens created
There are no access tokens associated with your project yet
)
}
/>
)}
>
)}
)}
)
}
export default WarehouseAccessTokens