user-row.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import moment from 'moment'
  2. import { useCallback } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import { User } from '../../../../../types/group-management/user'
  5. import OLFormCheckbox from '@/shared/components/ol/ol-form-checkbox'
  6. import MaterialIcon from '@/shared/components/material-icon'
  7. type GroupMemberRowProps = {
  8. user: User
  9. selectUser: (user: User) => void
  10. unselectUser: (user: User) => void
  11. selected: boolean
  12. hasWriteAccess: boolean
  13. }
  14. export default function UserRow({
  15. user,
  16. selectUser,
  17. unselectUser,
  18. selected,
  19. hasWriteAccess,
  20. }: GroupMemberRowProps) {
  21. const { t } = useTranslation()
  22. const handleSelectUser = useCallback(
  23. (event: React.ChangeEvent<HTMLInputElement>, user: User) => {
  24. if (event.target.checked) {
  25. selectUser(user)
  26. } else {
  27. unselectUser(user)
  28. }
  29. },
  30. [selectUser, unselectUser]
  31. )
  32. return (
  33. <tr key={`user-${user.email}`} className="managed-entity-row">
  34. <td className="cell-checkbox">
  35. {hasWriteAccess && (
  36. <OLFormCheckbox
  37. autoComplete="off"
  38. checked={selected}
  39. onChange={e => handleSelectUser(e, user)}
  40. aria-label={t('select_user')}
  41. data-testid="select-single-checkbox"
  42. />
  43. )}
  44. </td>
  45. <td>{user.email}</td>
  46. <td className="cell-name">
  47. {user.first_name} {user.last_name}
  48. </td>
  49. <td className="cell-last-active">
  50. {user.last_active_at
  51. ? moment(user.last_active_at).format('Do MMM YYYY')
  52. : 'N/A'}
  53. </td>
  54. <td className="cell-accepted-invite">
  55. {user.invite ? (
  56. <MaterialIcon
  57. type="clear"
  58. accessibilityLabel={t('invite_not_accepted')}
  59. />
  60. ) : (
  61. <MaterialIcon
  62. type="check"
  63. className="text-success"
  64. accessibilityLabel={t('accepted_invite')}
  65. />
  66. )}
  67. </td>
  68. </tr>
  69. )
  70. }