EdgeFunctionSecret.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { PermissionAction } from '@supabase/shared-types/out/constants'
  2. import { Edit2, MoreVertical, Trash } from 'lucide-react'
  3. import { toast } from 'sonner'
  4. import {
  5. Button,
  6. copyToClipboard,
  7. DropdownMenu,
  8. DropdownMenuContent,
  9. DropdownMenuItem,
  10. DropdownMenuSeparator,
  11. DropdownMenuTrigger,
  12. TableCell,
  13. TableRow,
  14. Tooltip,
  15. TooltipContent,
  16. TooltipTrigger,
  17. } from 'ui'
  18. import { TimestampInfo } from 'ui-patterns'
  19. import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
  20. import type { ProjectSecret } from '@/data/secrets/secrets-query'
  21. import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
  22. interface EdgeFunctionSecretProps {
  23. secret: ProjectSecret
  24. onSelectDelete: () => void
  25. onSelectEdit: () => void
  26. }
  27. const EdgeFunctionSecret = ({ secret, onSelectEdit, onSelectDelete }: EdgeFunctionSecretProps) => {
  28. const { can: canUpdateSecrets } = useAsyncCheckPermissions(PermissionAction.SECRETS_WRITE, '*')
  29. return (
  30. <TableRow>
  31. <TableCell>
  32. <Tooltip>
  33. <TooltipTrigger
  34. onClick={() => {
  35. copyToClipboard(secret.name)
  36. toast.success(`Copied ${secret.name}`)
  37. }}
  38. >
  39. <p className="truncate py-1">
  40. <code className="text-code-inline">{secret.name}</code>
  41. </p>
  42. </TooltipTrigger>
  43. <TooltipContent side="bottom">Click to copy</TooltipContent>
  44. </Tooltip>
  45. </TableCell>
  46. <TableCell>
  47. <p className="max-w-96 truncate" title={secret.value}>
  48. <code className="text-code-inline text-foreground-light!">{secret.value}</code>
  49. </p>
  50. </TableCell>
  51. <TableCell>
  52. {!!secret.updated_at ? (
  53. <TimestampInfo
  54. displayAs="utc"
  55. utcTimestamp={secret.updated_at}
  56. labelFormat="DD MMM YYYY HH:mm:ss (ZZ)"
  57. className="text-sm! text-foreground-light whitespace-nowrap"
  58. />
  59. ) : (
  60. '-'
  61. )}
  62. </TableCell>
  63. <TableCell>
  64. <div className="flex items-center justify-end">
  65. <DropdownMenu>
  66. <DropdownMenuTrigger asChild>
  67. <Button
  68. aria-label="More options"
  69. type="default"
  70. className="px-1"
  71. icon={<MoreVertical />}
  72. />
  73. </DropdownMenuTrigger>
  74. <DropdownMenuContent side="bottom" align="end" className="w-52">
  75. <DropdownMenuItem asChild>
  76. <ButtonTooltip
  77. type="text"
  78. icon={<Edit2 size={14} />}
  79. className="w-full justify-start group text-inherit"
  80. disabled={!canUpdateSecrets}
  81. onClick={() => onSelectEdit()}
  82. tooltip={{
  83. content: {
  84. side: 'bottom',
  85. text: !canUpdateSecrets
  86. ? 'You need additional permissions to edit edge function secrets'
  87. : undefined,
  88. },
  89. }}
  90. >
  91. Edit secret
  92. </ButtonTooltip>
  93. </DropdownMenuItem>
  94. <DropdownMenuSeparator />
  95. <DropdownMenuItem asChild>
  96. <ButtonTooltip
  97. type="text"
  98. icon={<Trash size={14} className="group-not-disabled:text-destructive" />}
  99. className="w-full justify-start group text-inherit"
  100. disabled={!canUpdateSecrets}
  101. onClick={() => onSelectDelete()}
  102. tooltip={{
  103. content: {
  104. side: 'bottom',
  105. text: !canUpdateSecrets
  106. ? 'You need additional permissions to delete edge function secrets'
  107. : undefined,
  108. },
  109. }}
  110. >
  111. Delete secret
  112. </ButtonTooltip>
  113. </DropdownMenuItem>
  114. </DropdownMenuContent>
  115. </DropdownMenu>
  116. </div>
  117. </TableCell>
  118. </TableRow>
  119. )
  120. }
  121. export default EdgeFunctionSecret