TokenPermissionSection.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { ChevronDown, ChevronRight } from 'lucide-react'
  2. import { useState } from 'react'
  3. import { Button, Collapsible, CollapsibleContent, CollapsibleTrigger } from 'ui'
  4. import { PermissionsList } from './PermissionList'
  5. const PERMISSIONS_COLLAPSE_THRESHOLD = 5
  6. interface TokenPermissionsSectionProps {
  7. groupedPermissions: Record<string, string[]>
  8. totalCount: number
  9. }
  10. export const TokenPermissionsSection = ({
  11. groupedPermissions,
  12. totalCount,
  13. }: TokenPermissionsSectionProps) => {
  14. const [permissionsOpen, setPermissionsOpen] = useState(false)
  15. const shouldCollapse = totalCount > PERMISSIONS_COLLAPSE_THRESHOLD
  16. if (totalCount === 0) return null
  17. return (
  18. <div className="pt-4 border-t border-default">
  19. {shouldCollapse ? (
  20. <Collapsible open={permissionsOpen} onOpenChange={setPermissionsOpen}>
  21. <CollapsibleTrigger asChild>
  22. <Button
  23. type="text"
  24. size="tiny"
  25. className="w-full justify-start px-0.5 h-auto text-sm font-medium text-foreground-light hover:text-foreground"
  26. >
  27. <div className="flex items-center gap-1.5">
  28. {permissionsOpen ? <ChevronDown size={14} /> : <ChevronRight size={14} />}
  29. <span>Permissions assigned to this token ({totalCount})</span>
  30. </div>
  31. </Button>
  32. </CollapsibleTrigger>
  33. <CollapsibleContent className="pt-3 transition-all data-closed:animate-collapsible-up data-open:animate-collapsible-down">
  34. <PermissionsList groupedPermissions={groupedPermissions} />
  35. </CollapsibleContent>
  36. </Collapsible>
  37. ) : (
  38. <>
  39. <h3 className="text-sm font-medium mb-3">Permissions assigned to this token:</h3>
  40. <PermissionsList groupedPermissions={groupedPermissions} />
  41. </>
  42. )}
  43. </div>
  44. )
  45. }